【发布时间】:2019-10-08 05:02:20
【问题描述】:
我正在尝试使用 OpenSSL 的 CMS_encrypt 方法,但遇到了崩溃
EXC_BAD_ACCESS(代码=1,地址=0xaa0003f4aa0203fe)
根据OpenSSL docs:
#include <openssl/cms.h>
CMS_ContentInfo *CMS_encrypt(STACK_OF(X509) *certs, BIO *in,
const EVP_CIPHER *cipher, unsigned int flags);
CMS_encrypt() 创建并返回一个 CMS EnvelopedData 结构。 certs 是收件人证书的列表。 in 是要加密的内容。 cipher 是要使用的对称密码。 flags 是一组可选的标志。
我已经仔细检查了我放入 dataToEncrpytBIO 的数据实际上是否正确写入 BIO。
我尝试过使用各种密码和标志,但似乎没有任何组合有效,所以我暂时将其保留为CMS_Text。 (传入0也失败)
有趣的是它正在崩溃。这告诉我我的输入之一必须是无效的。根据文档,如果它未能加密它应该返回NULL。如果成功,它应该返回一个CMS_ContentInfo
CMS_encrypt() 返回一个 CMS_ContentInfo 结构,如果发生错误,则返回 NULL。可以从 ERR_get_error(3) 获得错误。
我猜我的证书堆栈有问题。虽然它成功创建,并且当我查看堆栈时它说我有 1 个证书,但我认为围绕收件人信息可能需要额外的代码,或者堆栈可能是错误的?我不知道。我希望得到任何反馈。谢谢。
func cmsEncryptionTest(){
//Set Algorithms
addAlgorithms()
//Prepare data to encrypt
let testEncryptionString = "String to Encrypt"
let testEncryptionData = testEncryptionString.data(using: .utf8)!
let dataToEncryptBIO = BIO_new(BIO_s_mem())
BIO_write(dataToEncryptBIO, (testEncryptionData as NSData).bytes, Int32(testEncryptionData.count))
//Prepare Certificate Stack
let deviceCert = "MIIDXXXXXXXXXXXXXXXXXX="
guard let base64Data = Data(base64Encoded: deviceCert, options: Data.Base64DecodingOptions.ignoreUnknownCharacters) else {
throw TestError.failedToDecodeBase64
}
let certBIO = BIO_new(BIO_s_mem())
BIO_write(certBIO, (base64Data as NSData).bytes, Int32(base64Data.count))
guard let x509Cert: UnsafeMutablePointer<X509> = d2i_X509_bio(certBIO, nil) else{
throw TestError.failedToLoadCertificate
}
let certStack = generateX509Stack(x509Cert.pointee)
//Perform Encryption
var flags:UInt32 = UInt32(CMS_TEXT)
//Crashes
let cms = CMS_encrypt(certs, dataToEncrypt, EVP_aes_256_gcm(), flags)
....
}
//Objective-C Helper Method to put a cert on an x509Stack
struct stack_st_X509 * generateX509Stack(X509 cert){
struct stack_st_X509 sk = *sk_X509_new_null();
sk_X509_push(&sk, &cert);
return &sk;
}
//Objective-C Helper Method to add algorithms
void addAlgorithms(){
OpenSSL_add_all_algorithms();
}
【问题讨论】:
标签: ios swift encryption openssl x509