我正在编写一个代理.c文件,用于使用OpenSSL
库进行RSA加密。可用于iPhone。由于Objective C中的调用类不知道加密的数据大小,因此容器未初始化,我希望保持动态。 char数组和接收的大小通过引用调用。它的内存在ssl_encrypt_public_rsa
中动态分配,调用者必须释放它。我不喜欢把这个责任交给来电者。
您可以建议其他强大的方法吗?
在.c中实现 openssl
(后来编译为静态lib .a文件)
// calling function must free cipherText memory
void ssl_encrypt_public_rsa(RSA *rsaKey, int plainLength, unsigned char *plainText,
int *cipherLength, unsigned char **cipherText)
{
int enc_len = RSA_size(rsaKey);
unsigned char *enc_bytes = malloc(enc_len * sizeof(char));
int encSize = RSA_public_encrypt(plainLength, plainText, enc_bytes, rsaKey, RSA_PKCS1_PADDING);
*cipherText = enc_bytes;
*cipherLength = encSize;
}
void ssl_encrypt_mips(int plainLength, unsigned char *plainText,
int *cipherLength, unsigned char **cipherText)
{
// rsaKeyMips is defined and initialized earlier
ssl_encrypt_public_rsa(rsaKeyMips, plainLength, plainText, cipherLength, cipherText);
}
调用函数Objective C .m文件
-(NSData *) encryptMips:(NSData *)inData
{
int encSize = 0;
unsigned char *cipherBytes;
ssl_encrypt_mips((int)inData.length, (unsigned char *)inData.bytes, &encSize, &cipherBytes);
if (encSize == -1 ) return nil;
NSData * d = [NSData dataWithBytes:cipherBytes length:encSize];
free(cipherBytes);
return d;
}
答案 0 :(得分:0)
目前还不清楚你在问什么,因为你已经将C调用包装在一个负责free()
的包装器中。如果您希望从包装中删除free()
,并且偶然避免副本,您可以更改:
NSData *d = [NSData dataWithBytes:cipherBytes length:encSize];
free(cipherBytes);
为:
NSData *d = [NSData dataWithBytesNoCopy:cipherBytes length:encSize free:YES];
将malloc()
块的所有权交给NSData
实例,以后free()
将不再需要它。
HTH