返回可变大小的字节数组并释放内存

时间:2018-01-13 08:50:41

标签: objective-c c openssl pass-by-reference

我正在编写一个代理.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;
}

1 个答案:

答案 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