ฉันกำลังพยายามแทนที่การใช้ OpenSSL ซึ่งเลิกใช้มานานแล้วและถูกลบออกจาก 10.11 SDK ด้วย Security Transform API การใช้ OpenSSL ของฉันมีไว้เพื่อการตรวจสอบคีย์ใบอนุญาตเท่านั้น ปัญหาที่ฉันพบคือรหัสลิขสิทธิ์ถูกสร้างขึ้น (ฝั่งเซิร์ฟเวอร์) โดยใช้ฟังก์ชัน rsa_private_encrypt()
ของ OpenSSL แทนที่จะเป็น (อาจเหมาะสมกว่า) 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()
ของ OpenSSL ใน Security.framework อาจสามารถใช้ SecVerifyTransform
ได้ (ฉันไม่สามารถใช้งานสิ่งนี้ได้ แต่ก็เป็นเช่นนั้นกับ RSA_sign()
ของ OpenSSL เช่นกัน) ฉันยินดีอย่างยิ่งที่จะใช้ API ระบบอื่น (เช่น CDSA/CSSM) หากจะช่วยให้ฉันสามารถทำเช่นนี้ได้
ขออภัย เนื่องจากรหัสนี้จำเป็นต้องยืนยันรหัสใบอนุญาตที่มีอยู่ ฉันจึงไม่สามารถเปลี่ยนรหัสการสร้างใบอนุญาตของฉันให้ใช้ RSA_sign()
หรือที่คล้ายกันแทนได้