diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2021-10-28 15:45:35 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2021-10-29 21:05:57 +0900 |
| commit | 869aae82648cfe9f4a7dac2bd912240a71dfdc70 (patch) | |
| tree | 26e6615c29d8ccbaffd8033495d2a3041b23eda3 /src/LibsslARC4Encryptor.cc | |
| parent | 21f476588c5deedbfef87073d3860b78abed3991 (diff) | |
Build with OpenSSL 3.0.0
Diffstat (limited to 'src/LibsslARC4Encryptor.cc')
| -rw-r--r-- | src/LibsslARC4Encryptor.cc | 53 |
1 files changed, 53 insertions, 0 deletions
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 <cassert> + +# include <openssl/core_names.h> + +# 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<size_t>(outlen) == len); +#else // !(OPENSSL_VERSION_NUMBER >= 0x30000000L) RC4(&key_, len, in, out); +#endif // !(OPENSSL_VERSION_NUMBER >= 0x30000000L) } } // namespace aria2 |
