gpt4 book ai didi

iOS:使用证书和签名验证文件 - 公钥错误,验证失败

转载 作者:可可西里 更新时间:2023-11-01 05:09:31 30 4
gpt4 key购买 nike

我有三个东西:一个文件、一个签名文件和一个 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上好像没有直接复制公钥的方法,所以先创建一个trust。

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。

我做错了什么吗?

最佳答案

我在 a hint from Apple Dev Forums 的帮助下解决了这个问题.

问题与钥匙串(keychain)无关。但是我向验证函数传递了错误的参数。它需要数据的摘要(散列),而不是直接的数据。

NSData* fileData = [NSData dataWithContentsOfFile:(...)];
NSData* signatureData = [NSData dataWithContentsOfFile:(...)];
NSData* certificateData = [NSData dataWithContentsOfFile:(...)];

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);

uint8_t sha1HashDigest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1([fileData bytes], [fileData 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");

关于iOS:使用证书和签名验证文件 - 公钥错误,验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15438257/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com