Я пытаюсь использовать метод OpenSSL CMS_encrypt, но получаю сбой
EXC_BAD_ACCESS (код = 1, адрес = 0xaa0003f4aa0203fe)
Согласно документам OpenSSL :
#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 - это список сертификатов получателей. в это содержимое для шифрования. шифр - это симметричный шифр для использования. 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();
}