我有三样东西:一个文件、一个签名文件和一个 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。
我在做一些根本错误的事情吗?