SecKeyRawVerify验证在Mac上,但失败,并-9809 iOS上(SecKeyRawVe

2019-10-23 08:38发布

我需要在Mac上进行数字签名的一些数据,然后验证它在iOS。 于是,我产生RSA密钥和证书与开放SSL DER格式的公共密钥(与SecKeyGeneratePair试图一代,但随后这是很难导入公钥iOS和SecKeyRawVerify仍然不具有相同的结果工作),并签署我的数据Mac应用程序。 然后,如果我确认此数据在iOS上验证失败,-9809错误代码,但如果在Mac上验证成功执行相同的代码。

这里是我的验证码:

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和iOS在数字签名验证一些区别? 我没能找到有关它的苹果文档中任何事情。

Answer 1:

一些带符号/验证试验后,好了,我已经发现,从kSecPaddingPKCS1SHA1改变填充协议SecKeyRawVerify / SecKeyRawSign到kSecPaddingPKCS1,解决了我的问题。 不知道为什么它不与kSecPaddingPKCS1SHA1工作,没有苹果的文档中描述弃用。 我也没有尝试在iOS 8.3不同的代码,所以也许这是iOs8.3问题。



文章来源: SecKeyRawVerify verifies on mac but fails with -9809 on iOS