Я работаю над библиотекой oauth для iOS, и от 10% до 15% моих запросов терпят неудачу, потому что oauth_signature
, сгенерированный моей библиотекой, неверен. Я проследил проблему до CCHmac()
, возвращая неожиданные результаты. Подпись терпит неудачу, когда hmac hash имеет неправильную длину. Чтобы проверить эту проблему, я побежал этот код:CCHmac с kCCHmacAlgSHA1 имеет несогласованную длину вывода
NSString *key = @"25f108b539761bd43b6c66b64fb191c8";
for (int i = 0; i < 25; i++) {
unsigned int chunks[4] = {
arc4random() % ((int) pow(256, 4)),
arc4random() % ((int) pow(256, 4)),
arc4random() % ((int) pow(256, 4)),
arc4random() % ((int) pow(256, 4))
};
// Generate a random input string of 32 hex chars
NSString *input = [NSString stringWithFormat:@"%08x%08x%08x%08x", chunks[0], chunks[1], chunks[2], chunks[3]];
unsigned char output[CC_SHA1_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA1, key.UTF8String, key.length, input.UTF8String, input.length, output);
NSLog(@"HMAC Hash Length: %02lu", strlen(output));
}
... и получил этот результат:
2013-12-06 16:05:24.596 ODB[98281:70b] HMAC Hash Length: 40
2013-12-06 16:05:24.596 ODB[98281:70b] HMAC Hash Length: 20
2013-12-06 16:05:24.596 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.596 ODB[98281:70b] HMAC Hash Length: 35
2013-12-06 16:05:24.596 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.597 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.597 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.597 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.597 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.597 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.597 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.597 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.598 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.598 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.598 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.598 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.795 ODB[98281:70b] HMAC Hash Length: 20
2013-12-06 16:05:24.795 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.795 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.795 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.796 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.796 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.796 ODB[98281:70b] HMAC Hash Length: 41
2013-12-06 16:05:24.796 ODB[98281:70b] HMAC Hash Length: 24
2013-12-06 16:05:24.797 ODB[98281:70b] HMAC Hash Length: 41
Этот метод HMAC хеширования, кажется, довольно общепризнанной, поэтому я бы ожидать, что в соответствии выходная длина. Что мне не хватает?