I need to hash a NSData input with HMAC-SHA1. I used this code:
- (NSString *)HMACSHA1:(NSData *)data {
NSParameterAssert(data);
const char *cKey = [@"SampleSecretKey012345678" cStringUsingEncoding:NSUTF8StringEncoding];
const void *cData = [data bytes];
unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];\
/* Returns hexadecimal string of NSData. Empty string if data is empty. */
const unsigned char *dataBuffer = (const unsigned char *)[HMAC bytes];
if (!dataBuffer) {
return [NSString string];
}
NSUInteger dataLength = [HMAC length];
NSMutableString *hexString = [NSMutableString stringWithCapacity:(dataLength * 2)];
for (int i = 0; i < dataLength; ++i) {
[hexString appendFormat:@"%02x", (unsigned int)dataBuffer[i]];
}
return [NSString stringWithString:hexString];
}
but the hex string output is always wrong (checked from server). I think the problem is this line:
const void *cData = [data bytes];
because if convert data (sample "test" string) in the same way as key:
const void *cData = [@"test" cStringUsingEncoding:NSUTF8StringEncoding];
then check the result using this page: HMAC crypt, the result is matched.
If I hash a NSString then I can use cStringUsingEncoding:
but I can't figure out convert NSData to const void*
. Anyone can help me? Thanks!