1
0
mirror of https://github.com/openbsd/src.git synced 2025-01-10 06:47:55 -08:00

Implement the IETF ChaCha20-Poly1305 cipher suites.

Rename the existing ChaCha20-Poly1305 cipher suites with an "-OLD" suffix,
effectively replaces the original Google implementation. We continue to
support both the IETF and Google versions, however the existing names
now refer to the ciphers from draft-ietf-tls-chacha20-poly1305-04.

Feedback from doug@
This commit is contained in:
jsing 2016-04-28 16:39:45 +00:00
parent 2dbc8ef5f3
commit f43d4a20f8
10 changed files with 340 additions and 96 deletions

View File

@ -1,4 +1,4 @@
/* $OpenBSD: s3_lib.c,v 1.107 2016/01/27 02:06:16 beck Exp $ */
/* $OpenBSD: s3_lib.c,v 1.108 2016/04/28 16:39:45 jsing Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
@ -1810,11 +1810,11 @@ SSL_CIPHER ssl3_ciphers[] = {
/* Cipher CC13 */
{
.valid = 1,
.name = TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305,
.id = TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305,
.name = TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305_OLD,
.id = TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305_OLD,
.algorithm_mkey = SSL_kECDHE,
.algorithm_auth = SSL_aRSA,
.algorithm_enc = SSL_CHACHA20POLY1305,
.algorithm_enc = SSL_CHACHA20POLY1305_OLD,
.algorithm_mac = SSL_AEAD,
.algorithm_ssl = SSL_TLSV1_2,
.algo_strength = SSL_HIGH,
@ -1827,11 +1827,11 @@ SSL_CIPHER ssl3_ciphers[] = {
/* Cipher CC14 */
{
.valid = 1,
.name = TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
.id = TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305,
.name = TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_OLD,
.id = TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305_OLD,
.algorithm_mkey = SSL_kECDHE,
.algorithm_auth = SSL_aECDSA,
.algorithm_enc = SSL_CHACHA20POLY1305,
.algorithm_enc = SSL_CHACHA20POLY1305_OLD,
.algorithm_mac = SSL_AEAD,
.algorithm_ssl = SSL_TLSV1_2,
.algo_strength = SSL_HIGH,
@ -1842,6 +1842,57 @@ SSL_CIPHER ssl3_ciphers[] = {
},
/* Cipher CC15 */
{
.valid = 1,
.name = TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305_OLD,
.id = TLS1_CK_DHE_RSA_CHACHA20_POLY1305_OLD,
.algorithm_mkey = SSL_kDHE,
.algorithm_auth = SSL_aRSA,
.algorithm_enc = SSL_CHACHA20POLY1305_OLD,
.algorithm_mac = SSL_AEAD,
.algorithm_ssl = SSL_TLSV1_2,
.algo_strength = SSL_HIGH,
.algorithm2 = SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|
SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(0),
.strength_bits = 256,
.alg_bits = 256,
},
/* Cipher CCA8 */
{
.valid = 1,
.name = TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305,
.id = TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305,
.algorithm_mkey = SSL_kECDHE,
.algorithm_auth = SSL_aRSA,
.algorithm_enc = SSL_CHACHA20POLY1305,
.algorithm_mac = SSL_AEAD,
.algorithm_ssl = SSL_TLSV1_2,
.algo_strength = SSL_HIGH,
.algorithm2 = SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|
SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(12),
.strength_bits = 256,
.alg_bits = 256,
},
/* Cipher CCA9 */
{
.valid = 1,
.name = TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
.id = TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305,
.algorithm_mkey = SSL_kECDHE,
.algorithm_auth = SSL_aECDSA,
.algorithm_enc = SSL_CHACHA20POLY1305,
.algorithm_mac = SSL_AEAD,
.algorithm_ssl = SSL_TLSV1_2,
.algo_strength = SSL_HIGH,
.algorithm2 = SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|
SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(12),
.strength_bits = 256,
.alg_bits = 256,
},
/* Cipher CCAA */
{
.valid = 1,
.name = TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305,
@ -1853,7 +1904,7 @@ SSL_CIPHER ssl3_ciphers[] = {
.algorithm_ssl = SSL_TLSV1_2,
.algo_strength = SSL_HIGH,
.algorithm2 = SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|
SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(0),
SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(12),
.strength_bits = 256,
.alg_bits = 256,
},

View File

@ -1,4 +1,4 @@
/* $OpenBSD: s3_lib.c,v 1.107 2016/01/27 02:06:16 beck Exp $ */
/* $OpenBSD: s3_lib.c,v 1.108 2016/04/28 16:39:45 jsing Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
@ -1810,11 +1810,11 @@ SSL_CIPHER ssl3_ciphers[] = {
/* Cipher CC13 */
{
.valid = 1,
.name = TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305,
.id = TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305,
.name = TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305_OLD,
.id = TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305_OLD,
.algorithm_mkey = SSL_kECDHE,
.algorithm_auth = SSL_aRSA,
.algorithm_enc = SSL_CHACHA20POLY1305,
.algorithm_enc = SSL_CHACHA20POLY1305_OLD,
.algorithm_mac = SSL_AEAD,
.algorithm_ssl = SSL_TLSV1_2,
.algo_strength = SSL_HIGH,
@ -1827,11 +1827,11 @@ SSL_CIPHER ssl3_ciphers[] = {
/* Cipher CC14 */
{
.valid = 1,
.name = TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
.id = TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305,
.name = TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_OLD,
.id = TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305_OLD,
.algorithm_mkey = SSL_kECDHE,
.algorithm_auth = SSL_aECDSA,
.algorithm_enc = SSL_CHACHA20POLY1305,
.algorithm_enc = SSL_CHACHA20POLY1305_OLD,
.algorithm_mac = SSL_AEAD,
.algorithm_ssl = SSL_TLSV1_2,
.algo_strength = SSL_HIGH,
@ -1842,6 +1842,57 @@ SSL_CIPHER ssl3_ciphers[] = {
},
/* Cipher CC15 */
{
.valid = 1,
.name = TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305_OLD,
.id = TLS1_CK_DHE_RSA_CHACHA20_POLY1305_OLD,
.algorithm_mkey = SSL_kDHE,
.algorithm_auth = SSL_aRSA,
.algorithm_enc = SSL_CHACHA20POLY1305_OLD,
.algorithm_mac = SSL_AEAD,
.algorithm_ssl = SSL_TLSV1_2,
.algo_strength = SSL_HIGH,
.algorithm2 = SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|
SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(0),
.strength_bits = 256,
.alg_bits = 256,
},
/* Cipher CCA8 */
{
.valid = 1,
.name = TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305,
.id = TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305,
.algorithm_mkey = SSL_kECDHE,
.algorithm_auth = SSL_aRSA,
.algorithm_enc = SSL_CHACHA20POLY1305,
.algorithm_mac = SSL_AEAD,
.algorithm_ssl = SSL_TLSV1_2,
.algo_strength = SSL_HIGH,
.algorithm2 = SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|
SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(12),
.strength_bits = 256,
.alg_bits = 256,
},
/* Cipher CCA9 */
{
.valid = 1,
.name = TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
.id = TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305,
.algorithm_mkey = SSL_kECDHE,
.algorithm_auth = SSL_aECDSA,
.algorithm_enc = SSL_CHACHA20POLY1305,
.algorithm_mac = SSL_AEAD,
.algorithm_ssl = SSL_TLSV1_2,
.algo_strength = SSL_HIGH,
.algorithm2 = SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|
SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(12),
.strength_bits = 256,
.alg_bits = 256,
},
/* Cipher CCAA */
{
.valid = 1,
.name = TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305,
@ -1853,7 +1904,7 @@ SSL_CIPHER ssl3_ciphers[] = {
.algorithm_ssl = SSL_TLSV1_2,
.algo_strength = SSL_HIGH,
.algorithm2 = SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|
SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(0),
SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(12),
.strength_bits = 256,
.alg_bits = 256,
},

View File

@ -1,4 +1,4 @@
/* $OpenBSD: ssl_ciph.c,v 1.85 2016/04/28 16:06:53 jsing Exp $ */
/* $OpenBSD: ssl_ciph.c,v 1.86 2016/04/28 16:39:45 jsing Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
@ -414,7 +414,7 @@ static const SSL_CIPHER cipher_aliases[] = {
},
{
.name = SSL_TXT_CHACHA20,
.algorithm_enc = SSL_CHACHA20POLY1305,
.algorithm_enc = SSL_CHACHA20POLY1305|SSL_CHACHA20POLY1305_OLD,
},
/* MAC aliases */
@ -731,6 +731,9 @@ ssl_cipher_get_evp_aead(const SSL_SESSION *s, const EVP_AEAD **aead)
#endif
#if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
case SSL_CHACHA20POLY1305:
*aead = EVP_aead_chacha20_poly1305();
return 1;
case SSL_CHACHA20POLY1305_OLD:
*aead = EVP_aead_chacha20_poly1305_old();
return 1;
#endif
@ -1423,15 +1426,19 @@ ssl_create_cipher_list(const SSL_METHOD *ssl_method,
*/
ssl_cipher_apply_rule(0, 0, 0, SSL_AES, 0, 0, 0,
CIPHER_ADD, -1, &head, &tail);
ssl_cipher_apply_rule(0, 0, 0, SSL_CHACHA20POLY1305, 0, 0, 0,
CIPHER_ADD, -1, &head, &tail);
ssl_cipher_apply_rule(0, 0, 0, SSL_CHACHA20POLY1305,
0, 0, 0, CIPHER_ADD, -1, &head, &tail);
ssl_cipher_apply_rule(0, 0, 0, SSL_CHACHA20POLY1305_OLD,
0, 0, 0, CIPHER_ADD, -1, &head, &tail);
} else {
/*
* CHACHA20 is fast and safe on all hardware and is thus our
* preferred symmetric cipher, with AES second.
*/
ssl_cipher_apply_rule(0, 0, 0, SSL_CHACHA20POLY1305, 0, 0, 0,
CIPHER_ADD, -1, &head, &tail);
ssl_cipher_apply_rule(0, 0, 0, SSL_CHACHA20POLY1305,
0, 0, 0, CIPHER_ADD, -1, &head, &tail);
ssl_cipher_apply_rule(0, 0, 0, SSL_CHACHA20POLY1305_OLD,
0, 0, 0, CIPHER_ADD, -1, &head, &tail);
ssl_cipher_apply_rule(0, 0, 0, SSL_AES, 0, 0, 0,
CIPHER_ADD, -1, &head, &tail);
}
@ -1667,6 +1674,9 @@ SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len)
case SSL_CHACHA20POLY1305:
enc = "ChaCha20-Poly1305";
break;
case SSL_CHACHA20POLY1305_OLD:
enc = "ChaCha20-Poly1305-Old";
break;
case SSL_eGOST2814789CNT:
enc = "GOST-28178-89-CNT";
break;

View File

@ -1,4 +1,4 @@
/* $OpenBSD: ssl_locl.h,v 1.128 2015/09/12 15:08:54 jsing Exp $ */
/* $OpenBSD: ssl_locl.h,v 1.129 2016/04/28 16:39:45 jsing Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
@ -283,6 +283,7 @@
#define SSL_AES128GCM 0x00000400L
#define SSL_AES256GCM 0x00000800L
#define SSL_CHACHA20POLY1305 0x00001000L
#define SSL_CHACHA20POLY1305_OLD 0x00002000L
#define SSL_AES (SSL_AES128|SSL_AES256|SSL_AES128GCM|SSL_AES256GCM)
#define SSL_CAMELLIA (SSL_CAMELLIA128|SSL_CAMELLIA256)
@ -529,9 +530,10 @@ struct ssl_aead_ctx_st {
* fixed_nonce contains any bytes of the nonce that are fixed for all
* records.
*/
unsigned char fixed_nonce[8];
unsigned char fixed_nonce[12];
unsigned char fixed_nonce_len;
unsigned char variable_nonce_len;
unsigned char xor_fixed_nonce;
unsigned char tag_len;
/*
* variable_nonce_in_record is non-zero if the variable nonce

View File

@ -1,4 +1,4 @@
/* $OpenBSD: t1_enc.c,v 1.84 2016/03/06 14:52:15 beck Exp $ */
/* $OpenBSD: t1_enc.c,v 1.85 2016/04/28 16:39:45 jsing Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
@ -471,14 +471,26 @@ tls1_change_cipher_state_aead(SSL *s, char is_read, const unsigned char *key,
aead_ctx->variable_nonce_in_record =
(s->s3->tmp.new_cipher->algorithm2 &
SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_IN_RECORD) != 0;
if (aead_ctx->variable_nonce_len + aead_ctx->fixed_nonce_len !=
EVP_AEAD_nonce_length(aead)) {
SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE_AEAD,
ERR_R_INTERNAL_ERROR);
return (0);
}
aead_ctx->xor_fixed_nonce =
s->s3->tmp.new_cipher->algorithm_enc == SSL_CHACHA20POLY1305;
aead_ctx->tag_len = EVP_AEAD_max_overhead(aead);
if (aead_ctx->xor_fixed_nonce) {
if (aead_ctx->fixed_nonce_len != EVP_AEAD_nonce_length(aead) ||
aead_ctx->variable_nonce_len > EVP_AEAD_nonce_length(aead)) {
SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE_AEAD,
ERR_R_INTERNAL_ERROR);
return (0);
}
} else {
if (aead_ctx->variable_nonce_len + aead_ctx->fixed_nonce_len !=
EVP_AEAD_nonce_length(aead)) {
SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE_AEAD,
ERR_R_INTERNAL_ERROR);
return (0);
}
}
return (1);
}
@ -819,8 +831,8 @@ tls1_enc(SSL *s, int send)
if (aead) {
unsigned char ad[13], *in, *out, nonce[16];
unsigned nonce_used;
size_t out_len;
size_t out_len, pad_len = 0;
unsigned int nonce_used;
if (SSL_IS_DTLS(s)) {
dtls1_build_sequence_number(ad, seq,
@ -834,13 +846,20 @@ tls1_enc(SSL *s, int send)
ad[9] = (unsigned char)(s->version >> 8);
ad[10] = (unsigned char)(s->version);
if (aead->fixed_nonce_len +
aead->variable_nonce_len > sizeof(nonce) ||
aead->variable_nonce_len > 8)
return -1; /* internal error - should never happen. */
if (aead->variable_nonce_len > 8 ||
aead->variable_nonce_len > sizeof(nonce))
return -1;
memcpy(nonce, aead->fixed_nonce, aead->fixed_nonce_len);
nonce_used = aead->fixed_nonce_len;
if (aead->xor_fixed_nonce) {
if (aead->fixed_nonce_len > sizeof(nonce) ||
aead->variable_nonce_len > aead->fixed_nonce_len)
return -1; /* Should never happen. */
pad_len = aead->fixed_nonce_len - aead->variable_nonce_len;
} else {
if (aead->fixed_nonce_len +
aead->variable_nonce_len > sizeof(nonce))
return -1; /* Should never happen. */
}
if (send) {
size_t len = rec->length;
@ -848,15 +867,30 @@ tls1_enc(SSL *s, int send)
in = rec->input;
out = rec->data;
/*
* When sending we use the sequence number as the
* variable part of the nonce.
*/
if (aead->variable_nonce_len > 8)
return -1;
memcpy(nonce + nonce_used, ad,
aead->variable_nonce_len);
nonce_used += aead->variable_nonce_len;
if (aead->xor_fixed_nonce) {
/*
* The sequence number is left zero
* padded, then xored with the fixed
* nonce.
*/
memset(nonce, 0, pad_len);
memcpy(nonce + pad_len, ad,
aead->variable_nonce_len);
for (i = 0; i < aead->fixed_nonce_len; i++)
nonce[i] ^= aead->fixed_nonce[i];
nonce_used = aead->fixed_nonce_len;
} else {
/*
* When sending we use the sequence number as
* the variable part of the nonce.
*/
memcpy(nonce, aead->fixed_nonce,
aead->fixed_nonce_len);
nonce_used = aead->fixed_nonce_len;
memcpy(nonce + nonce_used, ad,
aead->variable_nonce_len);
nonce_used += aead->variable_nonce_len;
}
/*
* In do_ssl3_write, rec->input is moved forward by
@ -890,10 +924,29 @@ tls1_enc(SSL *s, int send)
if (len < aead->variable_nonce_len)
return 0;
memcpy(nonce + nonce_used,
aead->variable_nonce_in_record ? in : ad,
aead->variable_nonce_len);
nonce_used += aead->variable_nonce_len;
if (aead->xor_fixed_nonce) {
/*
* The sequence number is left zero
* padded, then xored with the fixed
* nonce.
*/
memset(nonce, 0, pad_len);
memcpy(nonce + pad_len, ad,
aead->variable_nonce_len);
for (i = 0; i < aead->fixed_nonce_len; i++)
nonce[i] ^= aead->fixed_nonce[i];
nonce_used = aead->fixed_nonce_len;
} else {
memcpy(nonce, aead->fixed_nonce,
aead->fixed_nonce_len);
nonce_used = aead->fixed_nonce_len;
memcpy(nonce + nonce_used,
aead->variable_nonce_in_record ? in : ad,
aead->variable_nonce_len);
nonce_used += aead->variable_nonce_len;
}
if (aead->variable_nonce_in_record) {
in += aead->variable_nonce_len;

View File

@ -1,4 +1,4 @@
/* $OpenBSD: tls1.h,v 1.27 2016/03/07 19:33:26 mmcc Exp $ */
/* $OpenBSD: tls1.h,v 1.28 2016/04/28 16:39:45 jsing Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
@ -537,9 +537,12 @@ SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB,(void (*)(void))cb)
#define TLS1_CK_ECDH_RSA_WITH_AES_256_GCM_SHA384 0x0300C032
/* ChaCha20-Poly1305 based ciphersuites. */
#define TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305 0x0300CC13
#define TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305 0x0300CC14
#define TLS1_CK_DHE_RSA_CHACHA20_POLY1305 0x0300CC15
#define TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305_OLD 0x0300CC13
#define TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305_OLD 0x0300CC14
#define TLS1_CK_DHE_RSA_CHACHA20_POLY1305_OLD 0x0300CC15
#define TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305 0x0300CCA8
#define TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305 0x0300CCA9
#define TLS1_CK_DHE_RSA_CHACHA20_POLY1305 0x0300CCAA
#define TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_MD5 "EXP1024-RC4-MD5"
#define TLS1_TXT_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 "EXP1024-RC2-CBC-MD5"
@ -701,6 +704,9 @@ SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB,(void (*)(void))cb)
#define TLS1_TXT_ECDH_RSA_WITH_AES_256_GCM_SHA384 "ECDH-RSA-AES256-GCM-SHA384"
/* ChaCha20-Poly1305 based ciphersuites. */
#define TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305_OLD "ECDHE-RSA-CHACHA20-POLY1305-OLD"
#define TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_OLD "ECDHE-ECDSA-CHACHA20-POLY1305-OLD"
#define TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305_OLD "DHE-RSA-CHACHA20-POLY1305-OLD"
#define TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305 "ECDHE-RSA-CHACHA20-POLY1305"
#define TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 "ECDHE-ECDSA-CHACHA20-POLY1305"
#define TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305 "DHE-RSA-CHACHA20-POLY1305"

View File

@ -1,4 +1,4 @@
/* $OpenBSD: ssl_ciph.c,v 1.85 2016/04/28 16:06:53 jsing Exp $ */
/* $OpenBSD: ssl_ciph.c,v 1.86 2016/04/28 16:39:45 jsing Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
@ -414,7 +414,7 @@ static const SSL_CIPHER cipher_aliases[] = {
},
{
.name = SSL_TXT_CHACHA20,
.algorithm_enc = SSL_CHACHA20POLY1305,
.algorithm_enc = SSL_CHACHA20POLY1305|SSL_CHACHA20POLY1305_OLD,
},
/* MAC aliases */
@ -731,6 +731,9 @@ ssl_cipher_get_evp_aead(const SSL_SESSION *s, const EVP_AEAD **aead)
#endif
#if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
case SSL_CHACHA20POLY1305:
*aead = EVP_aead_chacha20_poly1305();
return 1;
case SSL_CHACHA20POLY1305_OLD:
*aead = EVP_aead_chacha20_poly1305_old();
return 1;
#endif
@ -1423,15 +1426,19 @@ ssl_create_cipher_list(const SSL_METHOD *ssl_method,
*/
ssl_cipher_apply_rule(0, 0, 0, SSL_AES, 0, 0, 0,
CIPHER_ADD, -1, &head, &tail);
ssl_cipher_apply_rule(0, 0, 0, SSL_CHACHA20POLY1305, 0, 0, 0,
CIPHER_ADD, -1, &head, &tail);
ssl_cipher_apply_rule(0, 0, 0, SSL_CHACHA20POLY1305,
0, 0, 0, CIPHER_ADD, -1, &head, &tail);
ssl_cipher_apply_rule(0, 0, 0, SSL_CHACHA20POLY1305_OLD,
0, 0, 0, CIPHER_ADD, -1, &head, &tail);
} else {
/*
* CHACHA20 is fast and safe on all hardware and is thus our
* preferred symmetric cipher, with AES second.
*/
ssl_cipher_apply_rule(0, 0, 0, SSL_CHACHA20POLY1305, 0, 0, 0,
CIPHER_ADD, -1, &head, &tail);
ssl_cipher_apply_rule(0, 0, 0, SSL_CHACHA20POLY1305,
0, 0, 0, CIPHER_ADD, -1, &head, &tail);
ssl_cipher_apply_rule(0, 0, 0, SSL_CHACHA20POLY1305_OLD,
0, 0, 0, CIPHER_ADD, -1, &head, &tail);
ssl_cipher_apply_rule(0, 0, 0, SSL_AES, 0, 0, 0,
CIPHER_ADD, -1, &head, &tail);
}
@ -1667,6 +1674,9 @@ SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len)
case SSL_CHACHA20POLY1305:
enc = "ChaCha20-Poly1305";
break;
case SSL_CHACHA20POLY1305_OLD:
enc = "ChaCha20-Poly1305-Old";
break;
case SSL_eGOST2814789CNT:
enc = "GOST-28178-89-CNT";
break;

View File

@ -1,4 +1,4 @@
/* $OpenBSD: ssl_locl.h,v 1.128 2015/09/12 15:08:54 jsing Exp $ */
/* $OpenBSD: ssl_locl.h,v 1.129 2016/04/28 16:39:45 jsing Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
@ -283,6 +283,7 @@
#define SSL_AES128GCM 0x00000400L
#define SSL_AES256GCM 0x00000800L
#define SSL_CHACHA20POLY1305 0x00001000L
#define SSL_CHACHA20POLY1305_OLD 0x00002000L
#define SSL_AES (SSL_AES128|SSL_AES256|SSL_AES128GCM|SSL_AES256GCM)
#define SSL_CAMELLIA (SSL_CAMELLIA128|SSL_CAMELLIA256)
@ -529,9 +530,10 @@ struct ssl_aead_ctx_st {
* fixed_nonce contains any bytes of the nonce that are fixed for all
* records.
*/
unsigned char fixed_nonce[8];
unsigned char fixed_nonce[12];
unsigned char fixed_nonce_len;
unsigned char variable_nonce_len;
unsigned char xor_fixed_nonce;
unsigned char tag_len;
/*
* variable_nonce_in_record is non-zero if the variable nonce

View File

@ -1,4 +1,4 @@
/* $OpenBSD: t1_enc.c,v 1.84 2016/03/06 14:52:15 beck Exp $ */
/* $OpenBSD: t1_enc.c,v 1.85 2016/04/28 16:39:45 jsing Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
@ -471,14 +471,26 @@ tls1_change_cipher_state_aead(SSL *s, char is_read, const unsigned char *key,
aead_ctx->variable_nonce_in_record =
(s->s3->tmp.new_cipher->algorithm2 &
SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_IN_RECORD) != 0;
if (aead_ctx->variable_nonce_len + aead_ctx->fixed_nonce_len !=
EVP_AEAD_nonce_length(aead)) {
SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE_AEAD,
ERR_R_INTERNAL_ERROR);
return (0);
}
aead_ctx->xor_fixed_nonce =
s->s3->tmp.new_cipher->algorithm_enc == SSL_CHACHA20POLY1305;
aead_ctx->tag_len = EVP_AEAD_max_overhead(aead);
if (aead_ctx->xor_fixed_nonce) {
if (aead_ctx->fixed_nonce_len != EVP_AEAD_nonce_length(aead) ||
aead_ctx->variable_nonce_len > EVP_AEAD_nonce_length(aead)) {
SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE_AEAD,
ERR_R_INTERNAL_ERROR);
return (0);
}
} else {
if (aead_ctx->variable_nonce_len + aead_ctx->fixed_nonce_len !=
EVP_AEAD_nonce_length(aead)) {
SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE_AEAD,
ERR_R_INTERNAL_ERROR);
return (0);
}
}
return (1);
}
@ -819,8 +831,8 @@ tls1_enc(SSL *s, int send)
if (aead) {
unsigned char ad[13], *in, *out, nonce[16];
unsigned nonce_used;
size_t out_len;
size_t out_len, pad_len = 0;
unsigned int nonce_used;
if (SSL_IS_DTLS(s)) {
dtls1_build_sequence_number(ad, seq,
@ -834,13 +846,20 @@ tls1_enc(SSL *s, int send)
ad[9] = (unsigned char)(s->version >> 8);
ad[10] = (unsigned char)(s->version);
if (aead->fixed_nonce_len +
aead->variable_nonce_len > sizeof(nonce) ||
aead->variable_nonce_len > 8)
return -1; /* internal error - should never happen. */
if (aead->variable_nonce_len > 8 ||
aead->variable_nonce_len > sizeof(nonce))
return -1;
memcpy(nonce, aead->fixed_nonce, aead->fixed_nonce_len);
nonce_used = aead->fixed_nonce_len;
if (aead->xor_fixed_nonce) {
if (aead->fixed_nonce_len > sizeof(nonce) ||
aead->variable_nonce_len > aead->fixed_nonce_len)
return -1; /* Should never happen. */
pad_len = aead->fixed_nonce_len - aead->variable_nonce_len;
} else {
if (aead->fixed_nonce_len +
aead->variable_nonce_len > sizeof(nonce))
return -1; /* Should never happen. */
}
if (send) {
size_t len = rec->length;
@ -848,15 +867,30 @@ tls1_enc(SSL *s, int send)
in = rec->input;
out = rec->data;
/*
* When sending we use the sequence number as the
* variable part of the nonce.
*/
if (aead->variable_nonce_len > 8)
return -1;
memcpy(nonce + nonce_used, ad,
aead->variable_nonce_len);
nonce_used += aead->variable_nonce_len;
if (aead->xor_fixed_nonce) {
/*
* The sequence number is left zero
* padded, then xored with the fixed
* nonce.
*/
memset(nonce, 0, pad_len);
memcpy(nonce + pad_len, ad,
aead->variable_nonce_len);
for (i = 0; i < aead->fixed_nonce_len; i++)
nonce[i] ^= aead->fixed_nonce[i];
nonce_used = aead->fixed_nonce_len;
} else {
/*
* When sending we use the sequence number as
* the variable part of the nonce.
*/
memcpy(nonce, aead->fixed_nonce,
aead->fixed_nonce_len);
nonce_used = aead->fixed_nonce_len;
memcpy(nonce + nonce_used, ad,
aead->variable_nonce_len);
nonce_used += aead->variable_nonce_len;
}
/*
* In do_ssl3_write, rec->input is moved forward by
@ -890,10 +924,29 @@ tls1_enc(SSL *s, int send)
if (len < aead->variable_nonce_len)
return 0;
memcpy(nonce + nonce_used,
aead->variable_nonce_in_record ? in : ad,
aead->variable_nonce_len);
nonce_used += aead->variable_nonce_len;
if (aead->xor_fixed_nonce) {
/*
* The sequence number is left zero
* padded, then xored with the fixed
* nonce.
*/
memset(nonce, 0, pad_len);
memcpy(nonce + pad_len, ad,
aead->variable_nonce_len);
for (i = 0; i < aead->fixed_nonce_len; i++)
nonce[i] ^= aead->fixed_nonce[i];
nonce_used = aead->fixed_nonce_len;
} else {
memcpy(nonce, aead->fixed_nonce,
aead->fixed_nonce_len);
nonce_used = aead->fixed_nonce_len;
memcpy(nonce + nonce_used,
aead->variable_nonce_in_record ? in : ad,
aead->variable_nonce_len);
nonce_used += aead->variable_nonce_len;
}
if (aead->variable_nonce_in_record) {
in += aead->variable_nonce_len;

View File

@ -1,4 +1,4 @@
/* $OpenBSD: tls1.h,v 1.27 2016/03/07 19:33:26 mmcc Exp $ */
/* $OpenBSD: tls1.h,v 1.28 2016/04/28 16:39:45 jsing Exp $ */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
@ -537,9 +537,12 @@ SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB,(void (*)(void))cb)
#define TLS1_CK_ECDH_RSA_WITH_AES_256_GCM_SHA384 0x0300C032
/* ChaCha20-Poly1305 based ciphersuites. */
#define TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305 0x0300CC13
#define TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305 0x0300CC14
#define TLS1_CK_DHE_RSA_CHACHA20_POLY1305 0x0300CC15
#define TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305_OLD 0x0300CC13
#define TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305_OLD 0x0300CC14
#define TLS1_CK_DHE_RSA_CHACHA20_POLY1305_OLD 0x0300CC15
#define TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305 0x0300CCA8
#define TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305 0x0300CCA9
#define TLS1_CK_DHE_RSA_CHACHA20_POLY1305 0x0300CCAA
#define TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_MD5 "EXP1024-RC4-MD5"
#define TLS1_TXT_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 "EXP1024-RC2-CBC-MD5"
@ -701,6 +704,9 @@ SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB,(void (*)(void))cb)
#define TLS1_TXT_ECDH_RSA_WITH_AES_256_GCM_SHA384 "ECDH-RSA-AES256-GCM-SHA384"
/* ChaCha20-Poly1305 based ciphersuites. */
#define TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305_OLD "ECDHE-RSA-CHACHA20-POLY1305-OLD"
#define TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_OLD "ECDHE-ECDSA-CHACHA20-POLY1305-OLD"
#define TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305_OLD "DHE-RSA-CHACHA20-POLY1305-OLD"
#define TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305 "ECDHE-RSA-CHACHA20-POLY1305"
#define TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 "ECDHE-ECDSA-CHACHA20-POLY1305"
#define TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305 "DHE-RSA-CHACHA20-POLY1305"