我正在尝试使用安全转换 API 替换我对 OpenSSL 的使用,它很久以前就被弃用并已从 10.11 SDK 中删除。我使用 OpenSSL 只是为了验证许可证密钥。我遇到的问题是许可证密钥是使用 OpenSSL 的rsa_private_encrypt()
功能生成的(服务器端),而不是(可能更合适)rsa_sign()
。在当前的 OpenSSL 代码中,我使用rsa_public_decrypt()
如下方式验证它们:
int decryptedSize = RSA_public_decrypt([signature length], [signature bytes], checkDigest, rsaKey, RSA_PKCS1_PADDING);
BOOL success = [[NSData dataWithBytes:checkDigest length:decryptedSize] isEqualToData:[digest sha1Hash]])
不幸的是,我无法使用 SecTransform API 来复制它。我有以下内容:
SecTransformRef decryptor = CFAutorelease(SecDecryptTransformCreate(pubKey, &error));
if (error) { showSecError(error); return NO; }
SecTransformSetAttribute(decryptor, kSecTransformInputAttributeName, (CFDataRef)signatureData, &error);
if (error) { showSecError(error); return NO; }
CFDataRef result = SecTransformExecute(decryptor, &error);
if (error) { showSecError(error); return NO; }
return CFEqual(result, (CFDataRef)[digest sha1Hash]);
调用SecTransformExecute()
失败并出现CSSMERR_CSP_INVALID_KEY_CLASS
错误。
我是否遗漏了什么,或者RSA_public_decrypt()
Security.framework 中没有与 OpenSSL 等效的东西?也许SecVerifyTransform
可以使用 a (我也无法让它工作,但 OpenSSL 也是如此RSA_sign()
)。如果它能让我做到这一点,我当然愿意使用另一个系统 API(例如 CDSA/CSSM)。
不幸的是,由于此代码需要验证现有的许可证代码,我不能简单地将我的许可证生成代码更改为使用RSA_sign()
或类似代码。