Home | History | Annotate | Download | only in patches
      1 diff -pu a/nss/lib/ssl/ssl3con.c b/nss/lib/ssl/ssl3con.c
      2 --- a/nss/lib/ssl/ssl3con.c	2014-01-17 18:06:41.659713513 -0800
      3 +++ b/nss/lib/ssl/ssl3con.c	2014-01-17 18:07:10.270188062 -0800
      4 @@ -40,6 +40,21 @@
      5  #define CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256 (CKM_NSS + 24)
      6  #endif
      7  
      8 +/* This is a bodge to allow this code to be compiled against older NSS
      9 + * headers. */
     10 +#ifndef CKM_NSS_CHACHA20_POLY1305
     11 +#define CKM_NSS_CHACHA20_POLY1305               (CKM_NSS + 26)
     12 +
     13 +typedef struct CK_NSS_AEAD_PARAMS {
     14 +    CK_BYTE_PTR  pIv;  /* This is the nonce. */
     15 +    CK_ULONG     ulIvLen;
     16 +    CK_BYTE_PTR  pAAD;
     17 +    CK_ULONG     ulAADLen;
     18 +    CK_ULONG     ulTagLen;
     19 +} CK_NSS_AEAD_PARAMS;
     20 +
     21 +#endif
     22 +
     23  #include <stdio.h>
     24  #ifdef NSS_ENABLE_ZLIB
     25  #include "zlib.h"
     26 @@ -104,6 +119,8 @@ static ssl3CipherSuiteCfg cipherSuites[s
     27     /*      cipher_suite                     policy       enabled   isPresent */
     28  
     29  #ifdef NSS_ENABLE_ECC
     30 + { TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,  SSL_ALLOWED, PR_FALSE, PR_FALSE},
     31 + { TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,    SSL_ALLOWED, PR_FALSE, PR_FALSE},
     32   { TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, SSL_ALLOWED, PR_FALSE, PR_FALSE},
     33   { TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,   SSL_ALLOWED, PR_FALSE, PR_FALSE},
     34     /* TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA is out of order to work around
     35 @@ -292,6 +309,7 @@ static const ssl3BulkCipherDef bulk_ciph
     36      {cipher_camellia_256, calg_camellia,    32,32, type_block, 16,16, 0, 0},
     37      {cipher_seed,         calg_seed,        16,16, type_block, 16,16, 0, 0},
     38      {cipher_aes_128_gcm,  calg_aes_gcm,     16,16, type_aead,   4, 0,16, 8},
     39 +    {cipher_chacha20,     calg_chacha20,    32,32, type_aead,   0, 0,16, 0},
     40      {cipher_missing,      calg_null,         0, 0, type_stream, 0, 0, 0, 0},
     41  };
     42  
     43 @@ -418,6 +436,8 @@ static const ssl3CipherSuiteDef cipher_s
     44      {TLS_RSA_WITH_AES_128_GCM_SHA256, cipher_aes_128_gcm, mac_aead, kea_rsa},
     45      {TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, cipher_aes_128_gcm, mac_aead, kea_ecdhe_rsa},
     46      {TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, cipher_aes_128_gcm, mac_aead, kea_ecdhe_ecdsa},
     47 +    {TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, cipher_chacha20, mac_aead, kea_ecdhe_rsa},
     48 +    {TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, cipher_chacha20, mac_aead, kea_ecdhe_ecdsa},
     49  
     50  #ifdef NSS_ENABLE_ECC
     51      {TLS_ECDH_ECDSA_WITH_NULL_SHA,        cipher_null, mac_sha, kea_ecdh_ecdsa},
     52 @@ -483,6 +503,7 @@ static const SSLCipher2Mech alg2Mech[] =
     53      { calg_camellia , CKM_CAMELLIA_CBC			},
     54      { calg_seed     , CKM_SEED_CBC			},
     55      { calg_aes_gcm  , CKM_AES_GCM			},
     56 +    { calg_chacha20 , CKM_NSS_CHACHA20_POLY1305		},
     57  /*  { calg_init     , (CK_MECHANISM_TYPE)0x7fffffffL    }  */
     58  };
     59  
     60 @@ -647,6 +668,8 @@ ssl3_CipherSuiteAllowedForVersionRange(
     61       *   SSL_DH_ANON_EXPORT_WITH_DES40_CBC_SHA:  never implemented
     62       */
     63  	return vrange->min <= SSL_LIBRARY_VERSION_TLS_1_0;
     64 +    case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305:
     65 +    case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305:
     66      case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
     67      case TLS_RSA_WITH_AES_256_CBC_SHA256:
     68      case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
     69 @@ -2043,6 +2066,46 @@ ssl3_AESGCMBypass(ssl3KeyMaterial *keys,
     70  }
     71  #endif
     72  
     73 +static SECStatus
     74 +ssl3_ChaCha20Poly1305(
     75 +	ssl3KeyMaterial *keys,
     76 +	PRBool doDecrypt,
     77 +	unsigned char *out,
     78 +	int *outlen,
     79 +	int maxout,
     80 +	const unsigned char *in,
     81 +	int inlen,
     82 +	const unsigned char *additionalData,
     83 +	int additionalDataLen)
     84 +{
     85 +    SECItem            param;
     86 +    SECStatus          rv = SECFailure;
     87 +    unsigned int       uOutLen;
     88 +    CK_NSS_AEAD_PARAMS aeadParams;
     89 +    static const int   tagSize = 16;
     90 +
     91 +    param.type = siBuffer;
     92 +    param.len = sizeof(aeadParams);
     93 +    param.data = (unsigned char *) &aeadParams;
     94 +    memset(&aeadParams, 0, sizeof(aeadParams));
     95 +    aeadParams.pIv = (unsigned char *) additionalData;
     96 +    aeadParams.ulIvLen = 8;
     97 +    aeadParams.pAAD = (unsigned char *) additionalData;
     98 +    aeadParams.ulAADLen = additionalDataLen;
     99 +    aeadParams.ulTagLen = tagSize;
    100 +
    101 +    if (doDecrypt) {
    102 +	rv = pk11_decrypt(keys->write_key, CKM_NSS_CHACHA20_POLY1305, &param,
    103 +			  out, &uOutLen, maxout, in, inlen);
    104 +    } else {
    105 +	rv = pk11_encrypt(keys->write_key, CKM_NSS_CHACHA20_POLY1305, &param,
    106 +			  out, &uOutLen, maxout, in, inlen);
    107 +    }
    108 +    *outlen = (int) uOutLen;
    109 +
    110 +    return rv;
    111 +}
    112 +
    113  /* Initialize encryption and MAC contexts for pending spec.
    114   * Master Secret already is derived.
    115   * Caller holds Spec write lock.
    116 @@ -2076,13 +2139,17 @@ ssl3_InitPendingContextsPKCS11(sslSocket
    117      pwSpec->client.write_mac_context = NULL;
    118      pwSpec->server.write_mac_context = NULL;
    119  
    120 -    if (calg == calg_aes_gcm) {
    121 +    if (calg == calg_aes_gcm || calg == calg_chacha20) {
    122  	pwSpec->encode = NULL;
    123  	pwSpec->decode = NULL;
    124  	pwSpec->destroy = NULL;
    125  	pwSpec->encodeContext = NULL;
    126  	pwSpec->decodeContext = NULL;
    127 -	pwSpec->aead = ssl3_AESGCM;
    128 +	if (calg == calg_aes_gcm) {
    129 +	    pwSpec->aead = ssl3_AESGCM;
    130 +	} else {
    131 +	    pwSpec->aead = ssl3_ChaCha20Poly1305;
    132 +	}
    133  	return SECSuccess;
    134      }
    135  
    136 diff -pu a/nss/lib/ssl/ssl3ecc.c b/nss/lib/ssl/ssl3ecc.c
    137 --- a/nss/lib/ssl/ssl3ecc.c	2014-01-17 18:04:43.127747463 -0800
    138 +++ b/nss/lib/ssl/ssl3ecc.c	2014-01-17 18:07:10.270188062 -0800
    139 @@ -904,6 +904,7 @@ static const ssl3CipherSuite ecdhe_ecdsa
    140      TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
    141      TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
    142      TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
    143 +    TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
    144      TLS_ECDHE_ECDSA_WITH_NULL_SHA,
    145      TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
    146      0 /* end of list marker */
    147 @@ -915,6 +916,7 @@ static const ssl3CipherSuite ecdhe_rsa_s
    148      TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
    149      TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
    150      TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
    151 +    TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
    152      TLS_ECDHE_RSA_WITH_NULL_SHA,
    153      TLS_ECDHE_RSA_WITH_RC4_128_SHA,
    154      0 /* end of list marker */
    155 @@ -927,6 +929,7 @@ static const ssl3CipherSuite ecSuites[]
    156      TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
    157      TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
    158      TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
    159 +    TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
    160      TLS_ECDHE_ECDSA_WITH_NULL_SHA,
    161      TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
    162      TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
    163 @@ -934,6 +937,7 @@ static const ssl3CipherSuite ecSuites[]
    164      TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
    165      TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
    166      TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
    167 +    TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
    168      TLS_ECDHE_RSA_WITH_NULL_SHA,
    169      TLS_ECDHE_RSA_WITH_RC4_128_SHA,
    170      TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,
    171 diff -pu a/nss/lib/ssl/sslenum.c b/nss/lib/ssl/sslenum.c
    172 --- a/nss/lib/ssl/sslenum.c	2014-01-17 17:49:26.072517368 -0800
    173 +++ b/nss/lib/ssl/sslenum.c	2014-01-17 18:08:43.791739267 -0800
    174 @@ -37,17 +37,21 @@
    175   *
    176   * Exception: Because some servers ignore the high-order byte of the cipher
    177   * suite ID, we must be careful about adding cipher suites with IDs larger
    178 - * than 0x00ff; see bug 946147. For these broken servers, the first four cipher
    179 + * than 0x00ff; see bug 946147. For these broken servers, the first six cipher
    180   * suites, with the MSB zeroed, look like:
    181 + *      TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA { 0x00,0x14 }
    182 + *      TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA { 0x00,0x13 }
    183   *      TLS_KRB5_EXPORT_WITH_RC4_40_MD5 { 0x00,0x2B }
    184   *      TLS_RSA_WITH_AES_128_CBC_SHA { 0x00,0x2F }
    185   *      TLS_RSA_WITH_3DES_EDE_CBC_SHA { 0x00,0x0A }
    186   *      TLS_RSA_WITH_DES_CBC_SHA { 0x00,0x09 }
    187 - * The broken server only supports the third and fourth ones and will select
    188 - * the third one.
    189 + * The broken server only supports the fifth and sixth ones and will select
    190 + * the fifth one.
    191   */
    192  const PRUint16 SSL_ImplementedCiphers[] = {
    193  #ifdef NSS_ENABLE_ECC
    194 +    TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
    195 +    TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
    196      TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
    197      TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
    198      /* TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA must appear before
    199 diff -pu a/nss/lib/ssl/sslimpl.h b/nss/lib/ssl/sslimpl.h
    200 --- a/nss/lib/ssl/sslimpl.h	2014-01-17 18:03:47.906831535 -0800
    201 +++ b/nss/lib/ssl/sslimpl.h	2014-01-17 18:07:10.270188062 -0800
    202 @@ -65,6 +65,7 @@ typedef SSLSignType     SSL3SignType;
    203  #define calg_camellia	ssl_calg_camellia
    204  #define calg_seed	ssl_calg_seed
    205  #define calg_aes_gcm    ssl_calg_aes_gcm
    206 +#define calg_chacha20	ssl_calg_chacha20
    207  
    208  #define mac_null	ssl_mac_null
    209  #define mac_md5 	ssl_mac_md5
    210 @@ -299,7 +300,7 @@ typedef struct {
    211  } ssl3CipherSuiteCfg;
    212  
    213  #ifdef NSS_ENABLE_ECC
    214 -#define ssl_V3_SUITES_IMPLEMENTED 61
    215 +#define ssl_V3_SUITES_IMPLEMENTED 63
    216  #else
    217  #define ssl_V3_SUITES_IMPLEMENTED 37
    218  #endif /* NSS_ENABLE_ECC */
    219 @@ -483,6 +484,7 @@ typedef enum {
    220      cipher_camellia_256,
    221      cipher_seed,
    222      cipher_aes_128_gcm,
    223 +    cipher_chacha20,
    224      cipher_missing              /* reserved for no such supported cipher */
    225      /* This enum must match ssl3_cipherName[] in ssl3con.c.  */
    226  } SSL3BulkCipher;
    227 diff -pu a/nss/lib/ssl/sslinfo.c b/nss/lib/ssl/sslinfo.c
    228 --- a/nss/lib/ssl/sslinfo.c	2014-01-17 18:00:45.503806125 -0800
    229 +++ b/nss/lib/ssl/sslinfo.c	2014-01-17 18:07:10.270188062 -0800
    230 @@ -110,6 +110,7 @@ SSL_GetChannelInfo(PRFileDesc *fd, SSLCh
    231  #define C_NULL  "NULL", calg_null
    232  #define C_SJ 	"SKIPJACK", calg_sj
    233  #define C_AESGCM "AES-GCM", calg_aes_gcm
    234 +#define C_CHACHA20 "CHACHA20POLY1305", calg_chacha20
    235  
    236  #define B_256	256, 256, 256
    237  #define B_128	128, 128, 128
    238 @@ -188,12 +189,14 @@ static const SSLCipherSuiteInfo suiteInf
    239  {0,CS(TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA),  S_ECDSA, K_ECDHE, C_AES, B_128, M_SHA, 1, 0, 0, },
    240  {0,CS(TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256), S_ECDSA, K_ECDHE, C_AES, B_128, M_SHA256, 1, 0, 0, },
    241  {0,CS(TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA),  S_ECDSA, K_ECDHE, C_AES, B_256, M_SHA, 1, 0, 0, },
    242 +{0,CS(TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305),S_ECDSA,K_ECDHE,C_CHACHA20,B_256,M_AEAD_128,0, 0, 0, },
    243  
    244  {0,CS(TLS_ECDH_RSA_WITH_NULL_SHA),            S_RSA, K_ECDH, C_NULL, B_0, M_SHA, 0, 0, 0, },
    245  {0,CS(TLS_ECDH_RSA_WITH_RC4_128_SHA),         S_RSA, K_ECDH, C_RC4, B_128, M_SHA, 0, 0, 0, },
    246  {0,CS(TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA),    S_RSA, K_ECDH, C_3DES, B_3DES, M_SHA, 1, 0, 0, },
    247  {0,CS(TLS_ECDH_RSA_WITH_AES_128_CBC_SHA),     S_RSA, K_ECDH, C_AES, B_128, M_SHA, 1, 0, 0, },
    248  {0,CS(TLS_ECDH_RSA_WITH_AES_256_CBC_SHA),     S_RSA, K_ECDH, C_AES, B_256, M_SHA, 1, 0, 0, },
    249 +{0,CS(TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305),  S_RSA,K_ECDHE,C_CHACHA20,B_256,M_AEAD_128, 0, 0, 0, },
    250  
    251  {0,CS(TLS_ECDHE_RSA_WITH_NULL_SHA),           S_RSA, K_ECDHE, C_NULL, B_0, M_SHA, 0, 0, 0, },
    252  {0,CS(TLS_ECDHE_RSA_WITH_RC4_128_SHA),        S_RSA, K_ECDHE, C_RC4, B_128, M_SHA, 0, 0, 0, },
    253 diff -pu a/nss/lib/ssl/sslproto.h b/nss/lib/ssl/sslproto.h
    254 --- a/nss/lib/ssl/sslproto.h	2014-01-17 17:49:26.072517368 -0800
    255 +++ b/nss/lib/ssl/sslproto.h	2014-01-17 18:07:10.270188062 -0800
    256 @@ -213,6 +213,9 @@
    257  #define TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256   0xC02F
    258  #define TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256    0xC031
    259  
    260 +#define TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305	0xCC13
    261 +#define TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305	0xCC14
    262 +
    263  /* Netscape "experimental" cipher suites. */
    264  #define SSL_RSA_OLDFIPS_WITH_3DES_EDE_CBC_SHA	0xffe0
    265  #define SSL_RSA_OLDFIPS_WITH_DES_CBC_SHA	0xffe1
    266 diff -pu a/nss/lib/ssl/sslt.h b/nss/lib/ssl/sslt.h
    267 --- a/nss/lib/ssl/sslt.h	2014-01-17 18:03:47.906831535 -0800
    268 +++ b/nss/lib/ssl/sslt.h	2014-01-17 18:07:10.270188062 -0800
    269 @@ -94,7 +94,8 @@ typedef enum {
    270      ssl_calg_aes      = 7,
    271      ssl_calg_camellia = 8,
    272      ssl_calg_seed     = 9,
    273 -    ssl_calg_aes_gcm  = 10
    274 +    ssl_calg_aes_gcm  = 10,
    275 +    ssl_calg_chacha20 = 11
    276  } SSLCipherAlgorithm;
    277  
    278  typedef enum { 
    279