All,
I am facing a strange issue with iPhone 5s. I am doing a HMAC-SHA1
encrypting in my app using a third party library. The library uses memcpy
, which am not aware what it is, as I am not into too much of memory level programming in C
. The encryption works perfectly fine in all iphones except the 64 bit 5s
. Below is the code where it crashes (5th line)
.
void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len)
{
unsigned int i, j;
j = (context->count[0] >> 3) & 63;
if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++;
context->count[1] += (len >> 29);
if ((j + len) > 63) {
memcpy(&context->buffer[j], data, (i = 64-j));
SHA1Transform(context->state, context->buffer);
for ( ; i + 63 < len; i += 64) {
SHA1Transform(context->state, &data[i]);
}
j = 0;
}
else i = 0;
memcpy(&context->buffer[j], &data[i], len - i);
}
Below is the crash details
Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Subtype: KERN_INVALID_ADDRESS at 0x001a9c799cbfdcf9 Triggered by Thread: 0
Thread 0 Crashed: 0 libsystem_platform.dylib 0x0000000191c34dc8 _platform_memmove + 40 1 Anyvan 0x00000001001fc6a8 SHA1Update (sha1.c:128) 2 Anyvan 0x00000001000c7efc hmac_sha1 (hmac.c:73) 3 Anyvan 0x00000001000fe7cc -[LoginViewController callAuth:] (LoginViewController.m:360)
Any help will be highly appreciated.
This is crashing because you are using int
not because of memcpy
. Try replacing the int
with NSInteger
and it should work. You can find more information here.
The iPhone5S uses a 64bit architecture while the others use 32bit. One of the core differences between the two is how the system handles integers as explained in the doc. Your code is using unsigned int
which does not mean the same thing on 32bit and on 64bit and that results in a crash. You should change your int
called i
and j
to NSIntegers
and I believe your code will work. Or come to think of it you can try to simply replace the word int
by long
.