Saya mencoba mengganti penggunaan OpenSSL saya, yang sudah lama tidak digunakan lagi dan telah dihapus dari SDK 10.11 dengan Security Transform API. Penggunaan OpenSSL saya hanya untuk verifikasi kunci lisensi. Masalah yang saya hadapi adalah kunci lisensi dibuat (sisi server) menggunakan fungsi rsa_private_encrypt()
OpenSSL, bukan (mungkin lebih tepat) rsa_sign()
. Dalam kode OpenSSL saat ini, saya memverifikasinya menggunakan rsa_public_decrypt()
seperti:
int decryptedSize = RSA_public_decrypt([signature length], [signature bytes], checkDigest, rsaKey, RSA_PKCS1_PADDING);
BOOL success = [[NSData dataWithBytes:checkDigest length:decryptedSize] isEqualToData:[digest sha1Hash]])
Sayangnya, saya tidak dapat mereplikasi ini menggunakan API SecTransform. Saya punya yang berikut ini:
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]);
Panggilan ke SecTransformExecute()
gagal dengan kesalahan CSSMERR_CSP_INVALID_KEY_CLASS
.
Apakah saya melewatkan sesuatu, atau tidak ada yang setara dengan RSA_public_decrypt()
OpenSSL di Security.framework? Mungkin SecVerifyTransform
dapat digunakan (Saya juga tidak dapat menjalankannya, tetapi hal yang sama juga berlaku untuk RSA_sign()
OpenSSL). Saya tentu saja bersedia menggunakan API sistem lain (misalnya CDSA/CSSM) jika itu memungkinkan saya melakukan ini.
Sayangnya, karena kode ini perlu memverifikasi kode lisensi yang ada, saya tidak bisa begitu saja mengubah kode pembuatan lisensi untuk menggunakan RSA_sign()
atau yang serupa.