Я пытаюсь заменить использование OpenSSL, который давно устарел и был удален из SDK 10.11, на API преобразования безопасности. Я использую 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
.
Я что-то упустил, или нет эквивалента OpenSSL RSA_public_decrypt()
в Security.framework? Возможно, можно использовать SecVerifyTransform
(мне тоже не удалось заставить это работать, но то же самое верно и для OpenSSL RSA_sign()
). Я, безусловно, готов использовать другой системный API (например, CDSA/CSSM), если это позволит мне это сделать.
К сожалению, поскольку этот код должен проверять существующие коды лицензий, я не могу просто изменить свой код генерации лицензий, чтобы вместо этого использовать RSA_sign()
или аналогичный.