| Index: openssl/ssl/ssl_ciph.c
|
| diff --git a/openssl/ssl/ssl_ciph.c b/openssl/ssl/ssl_ciph.c
|
| index e8794d4b07c8d5e9cc62e6132c97c7324b2e7c47..db85b29bedb15dcbd99cf8ab9200fb10887a1250 100644
|
| --- a/openssl/ssl/ssl_ciph.c
|
| +++ b/openssl/ssl/ssl_ciph.c
|
| @@ -298,6 +298,7 @@ static const SSL_CIPHER cipher_aliases[]={
|
| {0,SSL_TXT_CAMELLIA128,0,0,0,SSL_CAMELLIA128,0,0,0,0,0,0},
|
| {0,SSL_TXT_CAMELLIA256,0,0,0,SSL_CAMELLIA256,0,0,0,0,0,0},
|
| {0,SSL_TXT_CAMELLIA ,0,0,0,SSL_CAMELLIA128|SSL_CAMELLIA256,0,0,0,0,0,0},
|
| + {0,SSL_TXT_CHACHA20 ,0,0,0,SSL_CHACHA20POLY1305,0,0,0,0,0,0},
|
|
|
| /* MAC aliases */
|
| {0,SSL_TXT_MD5,0, 0,0,0,SSL_MD5, 0,0,0,0,0},
|
| @@ -484,32 +485,72 @@ static void load_builtin_compressions(void)
|
| }
|
| #endif
|
|
|
| +/* ssl_cipher_get_comp sets |comp| to the correct SSL_COMP for the given
|
| + * session and returns 1. On error it returns 0. */
|
| +int ssl_cipher_get_comp(const SSL_SESSION *s, SSL_COMP **comp)
|
| + {
|
| + int i;
|
| +
|
| + SSL_COMP ctmp;
|
| +#ifndef OPENSSL_NO_COMP
|
| + load_builtin_compressions();
|
| +#endif
|
| +
|
| + *comp=NULL;
|
| + ctmp.id=s->compress_meth;
|
| + if (ssl_comp_methods != NULL)
|
| + {
|
| + i=sk_SSL_COMP_find(ssl_comp_methods,&ctmp);
|
| + if (i >= 0)
|
| + *comp=sk_SSL_COMP_value(ssl_comp_methods,i);
|
| + else
|
| + *comp=NULL;
|
| + }
|
| +
|
| + return 1;
|
| + }
|
| +
|
| +/* ssl_cipher_get_evp_aead sets |*aead| to point to the correct EVP_AEAD object
|
| + * for |s->cipher|. It returns 1 on success and 0 on error. */
|
| +int ssl_cipher_get_evp_aead(const SSL_SESSION *s, const EVP_AEAD **aead)
|
| + {
|
| + const SSL_CIPHER *c = s->cipher;
|
| +
|
| + *aead = NULL;
|
| +
|
| + if (c == NULL)
|
| + return 0;
|
| + if ((c->algorithm2 & SSL_CIPHER_ALGORITHM2_AEAD) == 0)
|
| + return 0;
|
| +
|
| +#ifndef OPENSSL_NO_AES
|
| + switch (c->algorithm_enc)
|
| + {
|
| + case SSL_AES128GCM:
|
| + *aead = EVP_aead_aes_128_gcm();
|
| + return 1;
|
| + case SSL_CHACHA20POLY1305:
|
| + *aead = EVP_aead_chacha20_poly1305();
|
| + return 1;
|
| + }
|
| +#endif
|
| +
|
| + return 0;
|
| + }
|
| +
|
| int ssl_cipher_get_evp(const SSL_SESSION *s, const EVP_CIPHER **enc,
|
| - const EVP_MD **md, int *mac_pkey_type, int *mac_secret_size,SSL_COMP **comp)
|
| + const EVP_MD **md, int *mac_pkey_type, int *mac_secret_size)
|
| {
|
| int i;
|
| const SSL_CIPHER *c;
|
|
|
| c=s->cipher;
|
| if (c == NULL) return(0);
|
| - if (comp != NULL)
|
| - {
|
| - SSL_COMP ctmp;
|
| -#ifndef OPENSSL_NO_COMP
|
| - load_builtin_compressions();
|
| -#endif
|
|
|
| - *comp=NULL;
|
| - ctmp.id=s->compress_meth;
|
| - if (ssl_comp_methods != NULL)
|
| - {
|
| - i=sk_SSL_COMP_find(ssl_comp_methods,&ctmp);
|
| - if (i >= 0)
|
| - *comp=sk_SSL_COMP_value(ssl_comp_methods,i);
|
| - else
|
| - *comp=NULL;
|
| - }
|
| - }
|
| + /* This function doesn't deal with EVP_AEAD. See
|
| + * |ssl_cipher_get_aead_evp|. */
|
| + if (c->algorithm2 & SSL_CIPHER_ALGORITHM2_AEAD)
|
| + return(0);
|
|
|
| if ((enc == NULL) || (md == NULL)) return(0);
|
|
|
| @@ -1675,6 +1716,9 @@ char *SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len)
|
| case SSL_SEED:
|
| enc="SEED(128)";
|
| break;
|
| + case SSL_CHACHA20POLY1305:
|
| + enc="ChaCha20-Poly1305";
|
| + break;
|
| default:
|
| enc="unknown";
|
| break;
|
|
|