#import <objc/objc.h>
#import <objc/Object.h>
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonCrypto.h>
@implementation TestObj
int main()
{
NSLog(@"%@",[self hmac:@"20100508" withKey: @"INBLUEwJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY"]);
return 0;
}
- (NSString *)hmac:(NSString *)plaintext withKey:(NSString *)key
{
const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [plaintext cStringUsingEncoding:NSASCIIStringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac
(kCCHmacAlgSHA256
, cKey
, strlen(cKey
), cData
, strlen(cData
), cHMAC
); NSData *HMACData = [NSData dataWithBytes:cHMAC length:sizeof(cHMAC)];
const unsigned char *buffer = (const unsigned char *)[HMACData bytes];
NSMutableString *HMAC = [NSMutableString stringWithCapacity:HMACData.length * 2];
for (int i = 0; i < HMACData.length; ++i){
[HMAC appendFormat:@"%02x", buffer[i]];
}
return HMAC;
}
@end
I2ltcG9ydCA8b2JqYy9vYmpjLmg+CiNpbXBvcnQgPG9iamMvT2JqZWN0Lmg+CiNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgojaW1wb3J0IDxDb21tb25DcnlwdG8vQ29tbW9uQ3J5cHRvLmg+CgpAaW1wbGVtZW50YXRpb24gVGVzdE9iagppbnQgbWFpbigpCnsKCQoJTlNMb2coQCIlQCIsW3NlbGYgaG1hYzpAIjIwMTAwNTA4IiB3aXRoS2V5OiBAIklOQkxVRXdKYWxyWFV0bkZFTUkvSzdNREVORytiUHhSZmlDWUVYQU1QTEVLRVkiXSk7CglyZXR1cm4gMDsKfQoKCi0gKE5TU3RyaW5nICopaG1hYzooTlNTdHJpbmcgKilwbGFpbnRleHQgd2l0aEtleTooTlNTdHJpbmcgKilrZXkKewogICAgY29uc3QgY2hhciAqY0tleSAgPSBba2V5IGNTdHJpbmdVc2luZ0VuY29kaW5nOk5TQVNDSUlTdHJpbmdFbmNvZGluZ107CiAgICBjb25zdCBjaGFyICpjRGF0YSA9IFtwbGFpbnRleHQgY1N0cmluZ1VzaW5nRW5jb2Rpbmc6TlNBU0NJSVN0cmluZ0VuY29kaW5nXTsKICAgIHVuc2lnbmVkIGNoYXIgY0hNQUNbQ0NfU0hBMjU2X0RJR0VTVF9MRU5HVEhdOwogICAgQ0NIbWFjKGtDQ0htYWNBbGdTSEEyNTYsIGNLZXksIHN0cmxlbihjS2V5KSwgY0RhdGEsIHN0cmxlbihjRGF0YSksIGNITUFDKTsKICAgIE5TRGF0YSAqSE1BQ0RhdGEgPSBbTlNEYXRhIGRhdGFXaXRoQnl0ZXM6Y0hNQUMgbGVuZ3RoOnNpemVvZihjSE1BQyldOwogICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZmVyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilbSE1BQ0RhdGEgYnl0ZXNdOwogICAgTlNNdXRhYmxlU3RyaW5nICpITUFDID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoQ2FwYWNpdHk6SE1BQ0RhdGEubGVuZ3RoICogMl07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IEhNQUNEYXRhLmxlbmd0aDsgKytpKXsKICAgICAgICBbSE1BQyBhcHBlbmRGb3JtYXQ6QCIlMDJ4IiwgYnVmZmVyW2ldXTsKICAgIH0KCiAgICByZXR1cm4gSE1BQzsKfQpAZW5k