/* */ #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(); OSSL_PARAM params[] = { OSSL_PARAM_construct_size_t(OSSL_CIPHER_PARAM_KEYLEN, &keyLength), 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