Я пытаюсь вычислить ключ для подписи SOAP, используя P_SHA-1, определенный WS-Trust. В спецификации WS-Trust сказано, что
key = P_SHA1 (EntropyFromRequest, EntropyFromResponse)
и спецификация TLS гласит, что P_SHA-1 равен
P_SHA-1(secret, seed) =
HMAC_SHA-1(secret, A(1) + seed) +
HMAC_SHA-1(secret, A(2) + seed) +
HMAC_SHA-1(secret, A(3) + seed) + ...
Where + indicates concatenation.
A() is defined as:
A(0) = seed
A(i) = HMAC_SHA-1(secret, A(i-1))
Мой алгоритм выглядит так:
- (NSData*) psha1WithSize:(int)bytes;
{
int numberOfIterations = bytes/16;
NSData *label;
NSData *secret;
NSMutableData *seed;
NSData *reqEntropy = [NSData dataWithBase64EncodedString:requestEntropy];
NSData *resEntropy = [NSData dataWithBase64EncodedString:responseEntropy];
secret = reqEntropy;
seed = resEntropy;
NSData *aIMinusOne = seed;
NSData *aI = nil;
NSMutableData *currentData = [[NSMutableData alloc] init];
for( int i=1; i <= numberOfIterations; i++ )
{
aI = [self hmacSha1Data:aIMinusOne withKey:secret];
NSMutableData *aIPlusSeed = [NSMutableData dataWithData:aI];
[aIPlusSeed appendData:seed];
[currentData appendData:[self hmacSha1Data:aIPlusSeed withKey:secret]];
aIMinusOne = aI;
aI = nil;
}
return currentData;
}
Мой HMAC выглядит следующим образом: Кодировка iPhone и HMAC-SHA-1
Кажется, это не работает, и я не могу понять, что не так с моим алгоритмом. У меня была мысль, что сервис реализован в .NET WCF, и чтобы он принял хешированный пароль, мне пришлось использовать NSUTF16LittleEndianStringEncoding, поэтому, возможно, энтропия ответа находится в той же кодировке (до кодировки base64)?
Любая помощь очень ценится, спасибо.