Friday 6 April 2012

HMac with SHA256

+(NSString*)getHMAC_SHA256WithBase64Encoding:(NSString*)stringToSign
{
    NSString *key = kSecrectKey;
    NSString *data = stringToSign;
   
    const char *cKey  = [key cStringUsingEncoding:NSUTF8StringEncoding];
    const char *cData = [stringToSign cStringUsingEncoding:NSUTF8StringEncoding];
   
    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
   
    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
   
    //1
//    const unsigned int hex_len = CC_SHA256_DIGEST_LENGTH*2+2;
//        char hex[hex_len];
//        for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
//            snprintf(&hex[i*2], hex_len-i*2, "%02x", cHMAC[i]);
//        }
//    NSData *HMAC = [[NSData alloc] initWithBytes:hex length:strlen(hex)];
//    NSString *hash = [Base64 encode:HMAC];
   
   
    //2.
    NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
    NSString *hash = [HMAC base64Encoding];
   
   
   
    //3.
//    NSString *hash;
//   
//    NSMutableString* output = [NSMutableString   stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
//   
//    for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++)
//        [output appendFormat:@"%02x", cHMAC[i]];
//    hash = output;
//   
   
    //4. amazaon
//    CCHmacContext context;
//    const char    *keyCString = [key cStringUsingEncoding:NSASCIIStringEncoding];
//    NSData *d = [data dataUsingEncoding:NSASCIIStringEncoding];
//    CCHmacInit(&context, kCCHmacAlgSHA256, keyCString, strlen(keyCString));
//    CCHmacUpdate(&context, [d bytes], [d length]);
//   
//    // Both SHA1 and SHA256 will fit in here
//    unsigned char digestRaw[CC_SHA256_DIGEST_LENGTH];
//    int digestLength = CC_SHA256_DIGEST_LENGTH;   
//    CCHmacFinal(&context, digestRaw);
//   
//    NSData *digestData = [NSData dataWithBytes:digestRaw length:digestLength];
//   
//   NSString *hash = [digestData base64Encoding];

    //5. amazon
//    CCHmacContext context;
//    const char    *keyCString = [key cStringUsingEncoding:NSASCIIStringEncoding];
//    NSData *d = [data dataUsingEncoding:NSASCIIStringEncoding];
//    CCHmacInit(&context, kCCHmacAlgSHA256, keyCString, strlen(keyCString));
//    CCHmacUpdate(&context, [d bytes], [d length]);
//   
//    unsigned char digestRaw[CC_SHA256_DIGEST_LENGTH];
//    int           digestLength = CC_SHA256_DIGEST_LENGTH;
//   
//    CCHmacFinal(&context, digestRaw);
//   
//    NSData *HMAC = [[NSData alloc] initWithBytes:digestRaw length:digestLength];
//    NSString *hash = [HMAC base64Encoding];
   
   
    //6.
//    const unsigned int blockSize = CC_SHA256_BLOCK_BYTES;
//    char ipad[blockSize], opad[blockSize], keypad[blockSize];
//    unsigned int keyLen = strlen(cKey);
//    CC_SHA256_CTX ctxt;
//    if(keyLen > blockSize) {
//       
//        CC_SHA256_Init(&ctxt);
//        CC_SHA256_Update(&ctxt, cKey, keyLen);
//        CC_SHA256_Final((unsigned char *)keypad, &ctxt);
//        keyLen = CC_SHA256_DIGEST_LENGTH;
//    } else {
//        memcpy(keypad, cKey, keyLen);
//    }
//    memset(ipad, 0x36, blockSize);
//    memset(opad, 0x5c, blockSize);
//   
//    int i;
//    for(i = 0; i < keyLen; i++) {
//        ipad[i] ^= keypad[i];
//        opad[i] ^= keypad[i];
//    }
//   
//    CC_SHA256_Init(&ctxt);
//    CC_SHA256_Update(&ctxt, ipad, blockSize);
//    CC_SHA256_Update(&ctxt, cData, strlen(cData));
//    unsigned char sha256[CC_SHA256_DIGEST_LENGTH];
//    CC_SHA256_Final(sha256, &ctxt);
//   
//    CC_SHA256_Init(&ctxt);
//    CC_SHA256_Update(&ctxt, opad, blockSize);
//    CC_SHA256_Update(&ctxt, sha256, CC_SHA256_DIGEST_LENGTH);
//    CC_SHA256_Final(sha256, &ctxt);
//   
//    const unsigned int hex_len = CC_SHA256_DIGEST_LENGTH*2+2;
//    char hex[hex_len];
//    for(i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
//        snprintf(&hex[i*2], hex_len-i*2, "%02x", sha256[i]);
//    }
//   
//    NSData *HMAC = [[NSData alloc] initWithBytes:hex length:strlen(hex)];
//    NSString *hash = [Base64 encode:HMAC];
//    [HMAC release];
   
    return hash;
   
}