2015-06-12 3 views
1

Мне нужно выполнить цифровую подпись на Mac, а затем проверить его на iOS. Таким образом, я создал пару ключей RSA и сертификат для открытого ключа в формате DER с открытым ssl (попробованное поколение с SecKeyGeneratePair, но тогда сложнее импортировать открытый ключ в iOS, а SecKeyRawVerify по-прежнему не работает с тем же результатом) и подписал мои данные на Приложение для Mac. Затем, если я проверю эти данные по проверке iOS с кодом ошибки -9809, но если выполнить тот же код при проверке подлинности Mac, это будет успешным.SecKeyRawVerify проверяет макрос, но не работает с -9809 на iOS

Вот мой код для проверки:

NSString* certPath = [[NSBundle mainBundle] pathForResource: @"Public" ofType:@"der"]; 
NSData* certificateData = [NSData dataWithContentsOfFile: certPath]; 

SecCertificateRef certificateFromFile = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificateData); // load the certificate 

SecPolicyRef secPolicy = SecPolicyCreateBasicX509(); 

SecTrustRef trust; 
OSStatus statusTrust = SecTrustCreateWithCertificates(certificateFromFile, secPolicy, &trust); 
SecTrustResultType resultType; 
OSStatus statusTrustEval = SecTrustEvaluate(trust, &resultType); 
SecKeyRef publicKey = SecTrustCopyPublicKey(trust); 

NSString* licensingPolicyString = @"ZKL3YXtqtFcIeWRqSekNuCmtu/nvy3ApsbJ+8xad6cO/E8smLHGfDrTQ3h/38d0IMJcUThsVMyX8qtqILmPeTnBpZgJetBjb8kAfuPznzxOrIcYd27/50ThWv6guLqZL7j1apnfRZHAdMiozvEYH62sma1Q9qTl+W7qxEAxWs2AXDTQcF7nGciEM6MEohs8u879VNIE1VcPW8ahMoe25wf8pvBvrzE0z0MR4UFE3ZSWIeeQsiaUPYFwHbfQAOifaw/qIisjL5Su6WURoaSupWTMdQh3ZNyqZuYJaT70u8S7NgF3BzG8uBiYOUYsf6UayvkABmF0UuMdcvhPQefyhuXsiYWxsb3dFeGNoYW5nZSI6dHJ1ZSwiYWxsb3dTaGFmZXIiOnRydWUsInBvbGljeSBuYW1lIjp0cnVlfQ=="; 

size_t signedHashBytesSize = SecKeyGetBlockSize(publicKey); 

NSData* messageData = [[NSData alloc] initWithBase64EncodedData:[licensingPolicyString dataUsingEncoding: NSUTF8StringEncoding] options:0]; 

NSData* signatureData = [messageData subdataWithRange:NSMakeRange(0, signedHashBytesSize)]; 
NSData* rawMessageData = [messageData subdataWithRange: NSMakeRange(signedHashBytesSize, messageData.length - signedHashBytesSize)]; 


uint8_t sha1HashDigest[CC_SHA1_DIGEST_LENGTH]; 
CC_SHA1([rawMessageData bytes], (CC_LONG)[rawMessageData length], sha1HashDigest); 

OSStatus verficationResult = SecKeyRawVerify(publicKey, kSecPaddingPKCS1SHA1, sha1HashDigest, CC_SHA1_DIGEST_LENGTH, [signatureData bytes], [signatureData length]); 
CFRelease(publicKey); 
CFRelease(trust); 
CFRelease(secPolicy); 
CFRelease(certificateFromFile); 
if (verficationResult == errSecSuccess) NSLog(@"Verified"); 

Есть ли какая-то разница в цифровой проверке подписи для Mac и прошивки? Мне ничего не удалось найти в документации Apple.

ответ

0

Ну, после некоторых экспериментов со знаком/проверкой, я обнаружил, что изменение соглашения о дополнении к SecKeyRawVerify/SecKeyRawSign от kSecPaddingPKCS1SHA1 до kSecPaddingPKCS1 решает мою проблему. Не знаю, почему он не работает с kSecPaddingPKCS1SHA1, в документации Apple нет устареваний. Также я не пробовал этот код на iOS, отличный от 8.3, поэтому, возможно, это проблема iOS8.3.

+2

У меня такая же проблема, даже с изменением прокладки. Как вы подписали данные на OS X? Вы явно задали заполнение с помощью преобразования? 'SecTransformSetAttribute (подписчик, kSecPaddingKey, kSecPaddingPKCS1Key, & ошибка);' – Maurizio

+0

Я установил заполнение непосредственно в 'SecKeyRawSign (privateKeyRef, kSecPaddingPKCS1, (Const uint8_t *) [[самоуправления getHashBytes: PLAINTEXT] байт], CC_SHA1_DIGEST_LENGTH , (uint8_t *) signedHashBytes, & signedHashBytesSize ); 'и то же самое в' SecKeyRawVerify' –

 Смежные вопросы

  • Нет связанных вопросов^_^