static int aead_from_name(const EVP_AEAD **aead, const char *name) { *aead = NULL; if (strcmp(name, "aes-128-gcm") == 0) { #ifndef OPENSSL_NO_AES *aead = EVP_aead_aes_128_gcm(); #else fprintf(stderr, "No AES support.\n"); #endif } else if (strcmp(name, "aes-256-gcm") == 0) { #ifndef OPENSSL_NO_AES *aead = EVP_aead_aes_256_gcm(); #else fprintf(stderr, "No AES support.\n"); #endif } else if (strcmp(name, "chacha20-poly1305") == 0) { #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305) *aead = EVP_aead_chacha20_poly1305(); #else fprintf(stderr, "No chacha20-poly1305 support.\n"); #endif } else { fprintf(stderr, "Unknown AEAD: %s\n", name); return -1; } if (aead == NULL) return 0; return 1; }
int ssl_cipher_get_evp_aead(const EVP_AEAD **out_aead, size_t *out_mac_secret_len, size_t *out_fixed_iv_len, const SSL_CIPHER *cipher, uint16_t version) { *out_aead = NULL; *out_mac_secret_len = 0; *out_fixed_iv_len = 0; switch (cipher->algorithm_enc) { case SSL_AES128GCM: *out_aead = EVP_aead_aes_128_gcm(); *out_fixed_iv_len = 4; return 1; case SSL_AES256GCM: *out_aead = EVP_aead_aes_256_gcm(); *out_fixed_iv_len = 4; return 1; case SSL_CHACHA20POLY1305: *out_aead = EVP_aead_chacha20_poly1305(); *out_fixed_iv_len = 0; return 1; case SSL_RC4: switch (cipher->algorithm_mac) { case SSL_MD5: if (version == SSL3_VERSION) { *out_aead = EVP_aead_rc4_md5_ssl3(); } else { *out_aead = EVP_aead_rc4_md5_tls(); } *out_mac_secret_len = MD5_DIGEST_LENGTH; return 1; case SSL_SHA1: if (version == SSL3_VERSION) { *out_aead = EVP_aead_rc4_sha1_ssl3(); } else { *out_aead = EVP_aead_rc4_sha1_tls(); } *out_mac_secret_len = SHA_DIGEST_LENGTH; return 1; default: return 0; } case SSL_AES128: switch (cipher->algorithm_mac) { case SSL_SHA1: if (version == SSL3_VERSION) { *out_aead = EVP_aead_aes_128_cbc_sha1_ssl3(); *out_fixed_iv_len = 16; } else if (version == TLS1_VERSION) { *out_aead = EVP_aead_aes_128_cbc_sha1_tls_implicit_iv(); *out_fixed_iv_len = 16; } else { *out_aead = EVP_aead_aes_128_cbc_sha1_tls(); } *out_mac_secret_len = SHA_DIGEST_LENGTH; return 1; case SSL_SHA256: *out_aead = EVP_aead_aes_128_cbc_sha256_tls(); *out_mac_secret_len = SHA256_DIGEST_LENGTH; return 1; default: return 0; } case SSL_AES256: switch (cipher->algorithm_mac) { case SSL_SHA1: if (version == SSL3_VERSION) { *out_aead = EVP_aead_aes_256_cbc_sha1_ssl3(); *out_fixed_iv_len = 16; } else if (version == TLS1_VERSION) { *out_aead = EVP_aead_aes_256_cbc_sha1_tls_implicit_iv(); *out_fixed_iv_len = 16; } else { *out_aead = EVP_aead_aes_256_cbc_sha1_tls(); } *out_mac_secret_len = SHA_DIGEST_LENGTH; return 1; case SSL_SHA256: *out_aead = EVP_aead_aes_256_cbc_sha256_tls(); *out_mac_secret_len = SHA256_DIGEST_LENGTH; return 1; case SSL_SHA384: *out_aead = EVP_aead_aes_256_cbc_sha384_tls(); *out_mac_secret_len = SHA384_DIGEST_LENGTH; return 1; default: return 0; } case SSL_3DES: switch (cipher->algorithm_mac) { case SSL_SHA1: if (version == SSL3_VERSION) { *out_aead = EVP_aead_des_ede3_cbc_sha1_ssl3(); *out_fixed_iv_len = 8; } else if (version == TLS1_VERSION) { *out_aead = EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv(); *out_fixed_iv_len = 8; } else { *out_aead = EVP_aead_des_ede3_cbc_sha1_tls(); } *out_mac_secret_len = SHA_DIGEST_LENGTH; return 1; default: return 0; } default: return 0; } }
const EVP_AEAD *EVP_aead_chacha20_poly1305_rfc7539(void) { return EVP_aead_chacha20_poly1305(); }