From 869aae82648cfe9f4a7dac2bd912240a71dfdc70 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Thu, 28 Oct 2021 15:45:35 +0900 Subject: Build with OpenSSL 3.0.0 --- src/LibsslARC4Encryptor.cc | 53 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) (limited to 'src/LibsslARC4Encryptor.cc') diff --git a/src/LibsslARC4Encryptor.cc b/src/LibsslARC4Encryptor.cc index e1a46aae..656242e2 100644 --- a/src/LibsslARC4Encryptor.cc +++ b/src/LibsslARC4Encryptor.cc @@ -34,21 +34,74 @@ /* copyright --> */ #include "LibsslARC4Encryptor.h" +#if OPENSSL_VERSION_NUMBER >= 0x30000000L +# include + +# include + +# include "DlAbortEx.h" +#endif // OPENSSL_VERSION_NUMBER >= 0x30000000L + namespace aria2 { +#if OPENSSL_VERSION_NUMBER >= 0x30000000L +ARC4Encryptor::ARC4Encryptor() : ctx_{nullptr} {} + +ARC4Encryptor::~ARC4Encryptor() +{ + if (ctx_) { + EVP_CIPHER_CTX_free(ctx_); + } +} + +#else // !(OPENSSL_VERSION_NUMBER >= 0x30000000L) ARC4Encryptor::ARC4Encryptor() {} ARC4Encryptor::~ARC4Encryptor() = default; +#endif // !(OPENSSL_VERSION_NUMBER >= 0x30000000L) void ARC4Encryptor::init(const unsigned char* key, size_t keyLength) { +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + if (ctx_) { + EVP_CIPHER_CTX_free(ctx_); + } + + ctx_ = EVP_CIPHER_CTX_new(); + + unsigned int keylen = keyLength; + + OSSL_PARAM params[] = { + OSSL_PARAM_construct_uint(OSSL_CIPHER_PARAM_KEYLEN, &keylen), + OSSL_PARAM_construct_end(), + }; + + if (EVP_EncryptInit_ex2(ctx_, EVP_rc4(), nullptr, nullptr, params) != 1) { + throw DL_ABORT_EX("Failed to initialize RC4 cipher"); + } + + if (EVP_EncryptInit_ex2(ctx_, nullptr, key, nullptr, nullptr) != 1) { + throw DL_ABORT_EX("Failed to set key to RC4 cipher"); + } +#else // !(OPENSSL_VERSION_NUMBER >= 0x30000000L) RC4_set_key(&key_, keyLength, key); +#endif // !(OPENSSL_VERSION_NUMBER >= 0x30000000L) } void ARC4Encryptor::encrypt(size_t len, unsigned char* out, const unsigned char* in) { +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + int outlen; + + if (EVP_EncryptUpdate(ctx_, out, &outlen, in, len) != 1) { + throw DL_ABORT_EX("Failed to encrypt data with RC4 cipher"); + } + + assert(static_cast(outlen) == len); +#else // !(OPENSSL_VERSION_NUMBER >= 0x30000000L) RC4(&key_, len, in, out); +#endif // !(OPENSSL_VERSION_NUMBER >= 0x30000000L) } } // namespace aria2 -- cgit