我有三样东西:一个文件、一个签名文件和一个 X509 证书文件 .cer。必须使用证书和签名文件中的公钥来验证该文件。我想使用 Security.h/CommonCrypto 来完成此操作。
到目前为止我尝试过的:
// load all the files
NSData* fileData = [NSData dataWithContentsOfFile:(...)];
NSData* signatureData = [NSData dataWithContentsOfFile:(...)];
NSData* certificateData = [NSData dataWithContentsOfFile:(...)];
SecCertificateRef certificate = SecCertificateCreateWithData(NULL, CFBridgingRetain(certificateData)); // load the certificate
证书加载得很好。可以使用它来检查它的名称
CFStringRef certificateDescription = SecCertificateCopySubjectSummary(certificate);
这有效。
由于iOS上似乎没有直接复制公钥的方法,所以我首先创建一个信任。
SecTrustRef trust;
OSStatus statusTrust = SecTrustCreateWithCertificates( certificate, secPolicy, &trust);
SecTrustResultType resultType;
OSStatus statusTrustEval = SecTrustEvaluate(trust, &resultType);
这一切都可以正常工作并得到 errSecSuccess 结果。
现在我尝试获取公钥。
SecKeyRef publicKey;
publicKey = SecTrustCopyPublicKey(trust);
size_t keysize = SecKeyGetBlockSize(publicKey);
但是publicKey的内容
NSData* keyData = [NSData dataWithBytes:publicKey length:keysize];
与打开 .cer 文件时看到的公钥不同。所以这是第一个问题。
然后我尝试验证签名,即使我知道公钥是错误的。填充是正确的。
OSStatus verficationResult = SecKeyRawVerify(publicKey, kSecPaddingPKCS1, [fileData bytes], [fileData length], [signatureData bytes], [signatureData length]);
此操作失败,OSStatus 为 -9809(操作无法完成)。我预计它是 –25293 errSecAuthFailed。
我是否在做一些根本性错误的事情?