1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 /* 3 * SSL3 Protocol 4 * 5 * This Source Code Form is subject to the terms of the Mozilla Public 6 * License, v. 2.0. If a copy of the MPL was not distributed with this 7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 8 9 /* TODO(ekr): Implement HelloVerifyRequest on server side. OK for now. */ 10 11 #include "cert.h" 12 #include "ssl.h" 13 #include "cryptohi.h" /* for DSAU_ stuff */ 14 #include "keyhi.h" 15 #include "secder.h" 16 #include "secitem.h" 17 #include "sechash.h" 18 19 #include "sslimpl.h" 20 #include "sslproto.h" 21 #include "sslerr.h" 22 #include "prtime.h" 23 #include "prinrval.h" 24 #include "prerror.h" 25 #include "pratom.h" 26 #include "prthread.h" 27 28 #include "pk11func.h" 29 #include "secmod.h" 30 #ifndef NO_PKCS11_BYPASS 31 #include "blapi.h" 32 #endif 33 34 /* This is a bodge to allow this code to be compiled against older NSS headers 35 * that don't contain the TLS 1.2 changes. */ 36 #ifndef CKM_NSS_TLS_PRF_GENERAL_SHA256 37 #define CKM_NSS_TLS_PRF_GENERAL_SHA256 (CKM_NSS + 21) 38 #define CKM_NSS_TLS_MASTER_KEY_DERIVE_SHA256 (CKM_NSS + 22) 39 #define CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256 (CKM_NSS + 23) 40 #define CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256 (CKM_NSS + 24) 41 #endif 42 43 /* This is a bodge to allow this code to be compiled against older NSS 44 * headers. */ 45 #ifndef CKM_NSS_CHACHA20_POLY1305 46 #define CKM_NSS_CHACHA20_POLY1305 (CKM_NSS + 26) 47 48 typedef struct CK_NSS_AEAD_PARAMS { 49 CK_BYTE_PTR pIv; /* This is the nonce. */ 50 CK_ULONG ulIvLen; 51 CK_BYTE_PTR pAAD; 52 CK_ULONG ulAADLen; 53 CK_ULONG ulTagLen; 54 } CK_NSS_AEAD_PARAMS; 55 56 #endif 57 58 #include <stdio.h> 59 #ifdef NSS_ENABLE_ZLIB 60 #include "zlib.h" 61 #endif 62 #ifdef LINUX 63 #include <dlfcn.h> 64 #endif 65 66 #ifndef PK11_SETATTRS 67 #define PK11_SETATTRS(x,id,v,l) (x)->type = (id); \ 68 (x)->pValue=(v); (x)->ulValueLen = (l); 69 #endif 70 71 static SECStatus ssl3_AuthCertificate(sslSocket *ss); 72 static void ssl3_CleanupPeerCerts(sslSocket *ss); 73 static void ssl3_CopyPeerCertsFromSID(sslSocket *ss, sslSessionID *sid); 74 static PK11SymKey *ssl3_GenerateRSAPMS(sslSocket *ss, ssl3CipherSpec *spec, 75 PK11SlotInfo * serverKeySlot); 76 static SECStatus ssl3_DeriveMasterSecret(sslSocket *ss, PK11SymKey *pms); 77 static SECStatus ssl3_DeriveConnectionKeysPKCS11(sslSocket *ss); 78 static SECStatus ssl3_HandshakeFailure( sslSocket *ss); 79 static SECStatus ssl3_InitState( sslSocket *ss); 80 static SECStatus ssl3_SendCertificate( sslSocket *ss); 81 static SECStatus ssl3_SendCertificateStatus( sslSocket *ss); 82 static SECStatus ssl3_SendEmptyCertificate( sslSocket *ss); 83 static SECStatus ssl3_SendCertificateRequest(sslSocket *ss); 84 static SECStatus ssl3_SendNextProto( sslSocket *ss); 85 static SECStatus ssl3_SendEncryptedExtensions(sslSocket *ss); 86 static SECStatus ssl3_SendFinished( sslSocket *ss, PRInt32 flags); 87 static SECStatus ssl3_SendServerHello( sslSocket *ss); 88 static SECStatus ssl3_SendServerHelloDone( sslSocket *ss); 89 static SECStatus ssl3_SendServerKeyExchange( sslSocket *ss); 90 static SECStatus ssl3_UpdateHandshakeHashes( sslSocket *ss, 91 const unsigned char *b, 92 unsigned int l); 93 static SECStatus ssl3_FlushHandshakeMessages(sslSocket *ss, PRInt32 flags); 94 static int ssl3_OIDToTLSHashAlgorithm(SECOidTag oid); 95 96 static SECStatus Null_Cipher(void *ctx, unsigned char *output, int *outputLen, 97 int maxOutputLen, const unsigned char *input, 98 int inputLen); 99 #ifndef NO_PKCS11_BYPASS 100 static SECStatus ssl3_AESGCMBypass(ssl3KeyMaterial *keys, PRBool doDecrypt, 101 unsigned char *out, int *outlen, int maxout, 102 const unsigned char *in, int inlen, 103 const unsigned char *additionalData, 104 int additionalDataLen); 105 #endif 106 107 #define MAX_SEND_BUF_LENGTH 32000 /* watch for 16-bit integer overflow */ 108 #define MIN_SEND_BUF_LENGTH 4000 109 110 /* This list of SSL3 cipher suites is sorted in descending order of 111 * precedence (desirability). It only includes cipher suites we implement. 112 * This table is modified by SSL3_SetPolicy(). The ordering of cipher suites 113 * in this table must match the ordering in SSL_ImplementedCiphers (sslenum.c) 114 * 115 * Important: See bug 946147 before enabling, reordering, or adding any cipher 116 * suites to this list. 117 */ 118 static ssl3CipherSuiteCfg cipherSuites[ssl_V3_SUITES_IMPLEMENTED] = { 119 /* cipher_suite policy enabled isPresent */ 120 121 #ifdef NSS_ENABLE_ECC 122 { TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 123 { TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 124 { TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 125 { TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 126 /* TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA is out of order to work around 127 * bug 946147. 128 */ 129 { TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 130 { TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 131 { TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 132 { TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 133 { TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 134 { TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 135 { TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 136 { TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 137 { TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 138 { TLS_ECDHE_RSA_WITH_RC4_128_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 139 #endif /* NSS_ENABLE_ECC */ 140 141 { TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, 142 { TLS_DHE_RSA_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, 143 { TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, 144 { TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, 145 { TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 146 { TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 147 { TLS_DHE_RSA_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, 148 { TLS_DHE_DSS_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, 149 { TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, 150 { TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 151 { TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 152 { SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, 153 { SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, 154 { TLS_DHE_DSS_WITH_RC4_128_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 155 156 #ifdef NSS_ENABLE_ECC 157 { TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 158 { TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 159 { TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 160 { TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 161 { TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 162 { TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 163 { TLS_ECDH_ECDSA_WITH_RC4_128_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 164 { TLS_ECDH_RSA_WITH_RC4_128_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 165 #endif /* NSS_ENABLE_ECC */ 166 167 /* RSA */ 168 { TLS_RSA_WITH_AES_128_GCM_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, 169 { TLS_RSA_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, 170 { TLS_RSA_WITH_AES_128_CBC_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, 171 { TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 172 { TLS_RSA_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, 173 { TLS_RSA_WITH_AES_256_CBC_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, 174 { TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 175 { TLS_RSA_WITH_SEED_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 176 { SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 177 { SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, 178 { SSL_RSA_WITH_RC4_128_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, 179 { SSL_RSA_WITH_RC4_128_MD5, SSL_ALLOWED, PR_TRUE, PR_FALSE}, 180 181 /* 56-bit DES "domestic" cipher suites */ 182 { SSL_DHE_RSA_WITH_DES_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 183 { SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 184 { SSL_RSA_FIPS_WITH_DES_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 185 { SSL_RSA_WITH_DES_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 186 187 /* export ciphersuites with 1024-bit public key exchange keys */ 188 { TLS_RSA_EXPORT1024_WITH_RC4_56_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 189 { TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 190 191 /* export ciphersuites with 512-bit public key exchange keys */ 192 { SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 193 { SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 194 195 /* ciphersuites with no encryption */ 196 #ifdef NSS_ENABLE_ECC 197 { TLS_ECDHE_ECDSA_WITH_NULL_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 198 { TLS_ECDHE_RSA_WITH_NULL_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 199 { TLS_ECDH_RSA_WITH_NULL_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 200 { TLS_ECDH_ECDSA_WITH_NULL_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 201 #endif /* NSS_ENABLE_ECC */ 202 { SSL_RSA_WITH_NULL_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 203 { TLS_RSA_WITH_NULL_SHA256, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 204 { SSL_RSA_WITH_NULL_MD5, SSL_ALLOWED, PR_FALSE, PR_FALSE}, 205 }; 206 207 /* Verify that SSL_ImplementedCiphers and cipherSuites are in consistent order. 208 */ 209 #ifdef DEBUG 210 void ssl3_CheckCipherSuiteOrderConsistency() 211 { 212 unsigned int i; 213 214 /* Note that SSL_ImplementedCiphers has more elements than cipherSuites 215 * because it SSL_ImplementedCiphers includes SSL 2.0 cipher suites. 216 */ 217 PORT_Assert(SSL_NumImplementedCiphers >= PR_ARRAY_SIZE(cipherSuites)); 218 219 for (i = 0; i < PR_ARRAY_SIZE(cipherSuites); ++i) { 220 PORT_Assert(SSL_ImplementedCiphers[i] == cipherSuites[i].cipher_suite); 221 } 222 } 223 #endif 224 225 /* This list of SSL3 compression methods is sorted in descending order of 226 * precedence (desirability). It only includes compression methods we 227 * implement. 228 */ 229 static const /*SSLCompressionMethod*/ PRUint8 compressions [] = { 230 #ifdef NSS_ENABLE_ZLIB 231 ssl_compression_deflate, 232 #endif 233 ssl_compression_null 234 }; 235 236 static const int compressionMethodsCount = 237 sizeof(compressions) / sizeof(compressions[0]); 238 239 /* compressionEnabled returns true iff the compression algorithm is enabled 240 * for the given SSL socket. */ 241 static PRBool 242 compressionEnabled(sslSocket *ss, SSLCompressionMethod compression) 243 { 244 switch (compression) { 245 case ssl_compression_null: 246 return PR_TRUE; /* Always enabled */ 247 #ifdef NSS_ENABLE_ZLIB 248 case ssl_compression_deflate: 249 return ss->opt.enableDeflate; 250 #endif 251 default: 252 return PR_FALSE; 253 } 254 } 255 256 static const /*SSL3ClientCertificateType */ PRUint8 certificate_types [] = { 257 ct_RSA_sign, 258 #ifdef NSS_ENABLE_ECC 259 ct_ECDSA_sign, 260 #endif /* NSS_ENABLE_ECC */ 261 ct_DSS_sign, 262 }; 263 264 /* This block is the contents of the supported_signature_algorithms field of 265 * our TLS 1.2 CertificateRequest message, in wire format. See 266 * https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 267 * 268 * This block contains only sha256 entries because we only support TLS 1.2 269 * CertificateVerify messages that use the handshake hash. */ 270 static const PRUint8 supported_signature_algorithms[] = { 271 tls_hash_sha256, tls_sig_rsa, 272 #ifdef NSS_ENABLE_ECC 273 tls_hash_sha256, tls_sig_ecdsa, 274 #endif 275 tls_hash_sha256, tls_sig_dsa, 276 }; 277 278 #define EXPORT_RSA_KEY_LENGTH 64 /* bytes */ 279 280 281 /* This global item is used only in servers. It is is initialized by 282 ** SSL_ConfigSecureServer(), and is used in ssl3_SendCertificateRequest(). 283 */ 284 CERTDistNames *ssl3_server_ca_list = NULL; 285 static SSL3Statistics ssl3stats; 286 287 /* indexed by SSL3BulkCipher */ 288 static const ssl3BulkCipherDef bulk_cipher_defs[] = { 289 /* |--------- Lengths --------| */ 290 /* cipher calg k s type i b t n */ 291 /* e e v l a o */ 292 /* y c | o g n */ 293 /* | r | c | c */ 294 /* | e | k | e */ 295 /* | t | | | | */ 296 {cipher_null, calg_null, 0, 0, type_stream, 0, 0, 0, 0}, 297 {cipher_rc4, calg_rc4, 16,16, type_stream, 0, 0, 0, 0}, 298 {cipher_rc4_40, calg_rc4, 16, 5, type_stream, 0, 0, 0, 0}, 299 {cipher_rc4_56, calg_rc4, 16, 7, type_stream, 0, 0, 0, 0}, 300 {cipher_rc2, calg_rc2, 16,16, type_block, 8, 8, 0, 0}, 301 {cipher_rc2_40, calg_rc2, 16, 5, type_block, 8, 8, 0, 0}, 302 {cipher_des, calg_des, 8, 8, type_block, 8, 8, 0, 0}, 303 {cipher_3des, calg_3des, 24,24, type_block, 8, 8, 0, 0}, 304 {cipher_des40, calg_des, 8, 5, type_block, 8, 8, 0, 0}, 305 {cipher_idea, calg_idea, 16,16, type_block, 8, 8, 0, 0}, 306 {cipher_aes_128, calg_aes, 16,16, type_block, 16,16, 0, 0}, 307 {cipher_aes_256, calg_aes, 32,32, type_block, 16,16, 0, 0}, 308 {cipher_camellia_128, calg_camellia, 16,16, type_block, 16,16, 0, 0}, 309 {cipher_camellia_256, calg_camellia, 32,32, type_block, 16,16, 0, 0}, 310 {cipher_seed, calg_seed, 16,16, type_block, 16,16, 0, 0}, 311 {cipher_aes_128_gcm, calg_aes_gcm, 16,16, type_aead, 4, 0,16, 8}, 312 {cipher_chacha20, calg_chacha20, 32,32, type_aead, 0, 0,16, 0}, 313 {cipher_missing, calg_null, 0, 0, type_stream, 0, 0, 0, 0}, 314 }; 315 316 static const ssl3KEADef kea_defs[] = 317 { /* indexed by SSL3KeyExchangeAlgorithm */ 318 /* kea exchKeyType signKeyType is_limited limit tls_keygen */ 319 {kea_null, kt_null, sign_null, PR_FALSE, 0, PR_FALSE}, 320 {kea_rsa, kt_rsa, sign_rsa, PR_FALSE, 0, PR_FALSE}, 321 {kea_rsa_export, kt_rsa, sign_rsa, PR_TRUE, 512, PR_FALSE}, 322 {kea_rsa_export_1024,kt_rsa, sign_rsa, PR_TRUE, 1024, PR_FALSE}, 323 {kea_dh_dss, kt_dh, sign_dsa, PR_FALSE, 0, PR_FALSE}, 324 {kea_dh_dss_export, kt_dh, sign_dsa, PR_TRUE, 512, PR_FALSE}, 325 {kea_dh_rsa, kt_dh, sign_rsa, PR_FALSE, 0, PR_FALSE}, 326 {kea_dh_rsa_export, kt_dh, sign_rsa, PR_TRUE, 512, PR_FALSE}, 327 {kea_dhe_dss, kt_dh, sign_dsa, PR_FALSE, 0, PR_FALSE}, 328 {kea_dhe_dss_export, kt_dh, sign_dsa, PR_TRUE, 512, PR_FALSE}, 329 {kea_dhe_rsa, kt_dh, sign_rsa, PR_FALSE, 0, PR_FALSE}, 330 {kea_dhe_rsa_export, kt_dh, sign_rsa, PR_TRUE, 512, PR_FALSE}, 331 {kea_dh_anon, kt_dh, sign_null, PR_FALSE, 0, PR_FALSE}, 332 {kea_dh_anon_export, kt_dh, sign_null, PR_TRUE, 512, PR_FALSE}, 333 {kea_rsa_fips, kt_rsa, sign_rsa, PR_FALSE, 0, PR_TRUE }, 334 #ifdef NSS_ENABLE_ECC 335 {kea_ecdh_ecdsa, kt_ecdh, sign_ecdsa, PR_FALSE, 0, PR_FALSE}, 336 {kea_ecdhe_ecdsa, kt_ecdh, sign_ecdsa, PR_FALSE, 0, PR_FALSE}, 337 {kea_ecdh_rsa, kt_ecdh, sign_rsa, PR_FALSE, 0, PR_FALSE}, 338 {kea_ecdhe_rsa, kt_ecdh, sign_rsa, PR_FALSE, 0, PR_FALSE}, 339 {kea_ecdh_anon, kt_ecdh, sign_null, PR_FALSE, 0, PR_FALSE}, 340 #endif /* NSS_ENABLE_ECC */ 341 }; 342 343 /* must use ssl_LookupCipherSuiteDef to access */ 344 static const ssl3CipherSuiteDef cipher_suite_defs[] = 345 { 346 /* cipher_suite bulk_cipher_alg mac_alg key_exchange_alg */ 347 348 {SSL_NULL_WITH_NULL_NULL, cipher_null, mac_null, kea_null}, 349 {SSL_RSA_WITH_NULL_MD5, cipher_null, mac_md5, kea_rsa}, 350 {SSL_RSA_WITH_NULL_SHA, cipher_null, mac_sha, kea_rsa}, 351 {TLS_RSA_WITH_NULL_SHA256, cipher_null, hmac_sha256, kea_rsa}, 352 {SSL_RSA_EXPORT_WITH_RC4_40_MD5,cipher_rc4_40, mac_md5, kea_rsa_export}, 353 {SSL_RSA_WITH_RC4_128_MD5, cipher_rc4, mac_md5, kea_rsa}, 354 {SSL_RSA_WITH_RC4_128_SHA, cipher_rc4, mac_sha, kea_rsa}, 355 {SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5, 356 cipher_rc2_40, mac_md5, kea_rsa_export}, 357 #if 0 /* not implemented */ 358 {SSL_RSA_WITH_IDEA_CBC_SHA, cipher_idea, mac_sha, kea_rsa}, 359 {SSL_RSA_EXPORT_WITH_DES40_CBC_SHA, 360 cipher_des40, mac_sha, kea_rsa_export}, 361 #endif 362 {SSL_RSA_WITH_DES_CBC_SHA, cipher_des, mac_sha, kea_rsa}, 363 {SSL_RSA_WITH_3DES_EDE_CBC_SHA, cipher_3des, mac_sha, kea_rsa}, 364 {SSL_DHE_DSS_WITH_DES_CBC_SHA, cipher_des, mac_sha, kea_dhe_dss}, 365 {SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, 366 cipher_3des, mac_sha, kea_dhe_dss}, 367 {TLS_DHE_DSS_WITH_RC4_128_SHA, cipher_rc4, mac_sha, kea_dhe_dss}, 368 #if 0 /* not implemented */ 369 {SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA, 370 cipher_des40, mac_sha, kea_dh_dss_export}, 371 {SSL_DH_DSS_DES_CBC_SHA, cipher_des, mac_sha, kea_dh_dss}, 372 {SSL_DH_DSS_3DES_CBC_SHA, cipher_3des, mac_sha, kea_dh_dss}, 373 {SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA, 374 cipher_des40, mac_sha, kea_dh_rsa_export}, 375 {SSL_DH_RSA_DES_CBC_SHA, cipher_des, mac_sha, kea_dh_rsa}, 376 {SSL_DH_RSA_3DES_CBC_SHA, cipher_3des, mac_sha, kea_dh_rsa}, 377 {SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, 378 cipher_des40, mac_sha, kea_dh_dss_export}, 379 {SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, 380 cipher_des40, mac_sha, kea_dh_rsa_export}, 381 #endif 382 {SSL_DHE_RSA_WITH_DES_CBC_SHA, cipher_des, mac_sha, kea_dhe_rsa}, 383 {SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, 384 cipher_3des, mac_sha, kea_dhe_rsa}, 385 #if 0 386 {SSL_DH_ANON_EXPORT_RC4_40_MD5, cipher_rc4_40, mac_md5, kea_dh_anon_export}, 387 {SSL_DH_ANON_EXPORT_WITH_DES40_CBC_SHA, 388 cipher_des40, mac_sha, kea_dh_anon_export}, 389 {SSL_DH_ANON_DES_CBC_SHA, cipher_des, mac_sha, kea_dh_anon}, 390 {SSL_DH_ANON_3DES_CBC_SHA, cipher_3des, mac_sha, kea_dh_anon}, 391 #endif 392 393 394 /* New TLS cipher suites */ 395 {TLS_RSA_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_rsa}, 396 {TLS_RSA_WITH_AES_128_CBC_SHA256, cipher_aes_128, hmac_sha256, kea_rsa}, 397 {TLS_DHE_DSS_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_dhe_dss}, 398 {TLS_DHE_RSA_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_dhe_rsa}, 399 {TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, cipher_aes_128, hmac_sha256, kea_dhe_rsa}, 400 {TLS_RSA_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_rsa}, 401 {TLS_RSA_WITH_AES_256_CBC_SHA256, cipher_aes_256, hmac_sha256, kea_rsa}, 402 {TLS_DHE_DSS_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_dhe_dss}, 403 {TLS_DHE_RSA_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_dhe_rsa}, 404 {TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, cipher_aes_256, hmac_sha256, kea_dhe_rsa}, 405 #if 0 406 {TLS_DH_DSS_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_dh_dss}, 407 {TLS_DH_RSA_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_dh_rsa}, 408 {TLS_DH_ANON_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_dh_anon}, 409 {TLS_DH_DSS_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_dh_dss}, 410 {TLS_DH_RSA_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_dh_rsa}, 411 {TLS_DH_ANON_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_dh_anon}, 412 #endif 413 414 {TLS_RSA_WITH_SEED_CBC_SHA, cipher_seed, mac_sha, kea_rsa}, 415 416 {TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, cipher_camellia_128, mac_sha, kea_rsa}, 417 {TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA, 418 cipher_camellia_128, mac_sha, kea_dhe_dss}, 419 {TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, 420 cipher_camellia_128, mac_sha, kea_dhe_rsa}, 421 {TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, cipher_camellia_256, mac_sha, kea_rsa}, 422 {TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA, 423 cipher_camellia_256, mac_sha, kea_dhe_dss}, 424 {TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, 425 cipher_camellia_256, mac_sha, kea_dhe_rsa}, 426 427 {TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA, 428 cipher_des, mac_sha,kea_rsa_export_1024}, 429 {TLS_RSA_EXPORT1024_WITH_RC4_56_SHA, 430 cipher_rc4_56, mac_sha,kea_rsa_export_1024}, 431 432 {SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA, cipher_3des, mac_sha, kea_rsa_fips}, 433 {SSL_RSA_FIPS_WITH_DES_CBC_SHA, cipher_des, mac_sha, kea_rsa_fips}, 434 435 {TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, cipher_aes_128_gcm, mac_aead, kea_dhe_rsa}, 436 {TLS_RSA_WITH_AES_128_GCM_SHA256, cipher_aes_128_gcm, mac_aead, kea_rsa}, 437 {TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, cipher_aes_128_gcm, mac_aead, kea_ecdhe_rsa}, 438 {TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, cipher_aes_128_gcm, mac_aead, kea_ecdhe_ecdsa}, 439 {TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, cipher_chacha20, mac_aead, kea_ecdhe_rsa}, 440 {TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, cipher_chacha20, mac_aead, kea_ecdhe_ecdsa}, 441 442 #ifdef NSS_ENABLE_ECC 443 {TLS_ECDH_ECDSA_WITH_NULL_SHA, cipher_null, mac_sha, kea_ecdh_ecdsa}, 444 {TLS_ECDH_ECDSA_WITH_RC4_128_SHA, cipher_rc4, mac_sha, kea_ecdh_ecdsa}, 445 {TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, cipher_3des, mac_sha, kea_ecdh_ecdsa}, 446 {TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_ecdh_ecdsa}, 447 {TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_ecdh_ecdsa}, 448 449 {TLS_ECDHE_ECDSA_WITH_NULL_SHA, cipher_null, mac_sha, kea_ecdhe_ecdsa}, 450 {TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, cipher_rc4, mac_sha, kea_ecdhe_ecdsa}, 451 {TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, cipher_3des, mac_sha, kea_ecdhe_ecdsa}, 452 {TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_ecdhe_ecdsa}, 453 {TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, cipher_aes_128, hmac_sha256, kea_ecdhe_ecdsa}, 454 {TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_ecdhe_ecdsa}, 455 456 {TLS_ECDH_RSA_WITH_NULL_SHA, cipher_null, mac_sha, kea_ecdh_rsa}, 457 {TLS_ECDH_RSA_WITH_RC4_128_SHA, cipher_rc4, mac_sha, kea_ecdh_rsa}, 458 {TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, cipher_3des, mac_sha, kea_ecdh_rsa}, 459 {TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_ecdh_rsa}, 460 {TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_ecdh_rsa}, 461 462 {TLS_ECDHE_RSA_WITH_NULL_SHA, cipher_null, mac_sha, kea_ecdhe_rsa}, 463 {TLS_ECDHE_RSA_WITH_RC4_128_SHA, cipher_rc4, mac_sha, kea_ecdhe_rsa}, 464 {TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, cipher_3des, mac_sha, kea_ecdhe_rsa}, 465 {TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_ecdhe_rsa}, 466 {TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, cipher_aes_128, hmac_sha256, kea_ecdhe_rsa}, 467 {TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_ecdhe_rsa}, 468 469 #if 0 470 {TLS_ECDH_anon_WITH_NULL_SHA, cipher_null, mac_sha, kea_ecdh_anon}, 471 {TLS_ECDH_anon_WITH_RC4_128_SHA, cipher_rc4, mac_sha, kea_ecdh_anon}, 472 {TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA, cipher_3des, mac_sha, kea_ecdh_anon}, 473 {TLS_ECDH_anon_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_ecdh_anon}, 474 {TLS_ECDH_anon_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_ecdh_anon}, 475 #endif 476 #endif /* NSS_ENABLE_ECC */ 477 }; 478 479 static const CK_MECHANISM_TYPE kea_alg_defs[] = { 480 0x80000000L, 481 CKM_RSA_PKCS, 482 CKM_DH_PKCS_DERIVE, 483 CKM_KEA_KEY_DERIVE, 484 CKM_ECDH1_DERIVE 485 }; 486 487 typedef struct SSLCipher2MechStr { 488 SSLCipherAlgorithm calg; 489 CK_MECHANISM_TYPE cmech; 490 } SSLCipher2Mech; 491 492 /* indexed by type SSLCipherAlgorithm */ 493 static const SSLCipher2Mech alg2Mech[] = { 494 /* calg, cmech */ 495 { calg_null , (CK_MECHANISM_TYPE)0x80000000L }, 496 { calg_rc4 , CKM_RC4 }, 497 { calg_rc2 , CKM_RC2_CBC }, 498 { calg_des , CKM_DES_CBC }, 499 { calg_3des , CKM_DES3_CBC }, 500 { calg_idea , CKM_IDEA_CBC }, 501 { calg_fortezza , CKM_SKIPJACK_CBC64 }, 502 { calg_aes , CKM_AES_CBC }, 503 { calg_camellia , CKM_CAMELLIA_CBC }, 504 { calg_seed , CKM_SEED_CBC }, 505 { calg_aes_gcm , CKM_AES_GCM }, 506 { calg_chacha20 , CKM_NSS_CHACHA20_POLY1305 }, 507 /* { calg_init , (CK_MECHANISM_TYPE)0x7fffffffL } */ 508 }; 509 510 #define mmech_invalid (CK_MECHANISM_TYPE)0x80000000L 511 #define mmech_md5 CKM_SSL3_MD5_MAC 512 #define mmech_sha CKM_SSL3_SHA1_MAC 513 #define mmech_md5_hmac CKM_MD5_HMAC 514 #define mmech_sha_hmac CKM_SHA_1_HMAC 515 #define mmech_sha256_hmac CKM_SHA256_HMAC 516 517 static const ssl3MACDef mac_defs[] = { /* indexed by SSL3MACAlgorithm */ 518 /* pad_size is only used for SSL 3.0 MAC. See RFC 6101 Sec. 5.2.3.1. */ 519 /* mac mmech pad_size mac_size */ 520 { mac_null, mmech_invalid, 0, 0 }, 521 { mac_md5, mmech_md5, 48, MD5_LENGTH }, 522 { mac_sha, mmech_sha, 40, SHA1_LENGTH}, 523 {hmac_md5, mmech_md5_hmac, 0, MD5_LENGTH }, 524 {hmac_sha, mmech_sha_hmac, 0, SHA1_LENGTH}, 525 {hmac_sha256, mmech_sha256_hmac, 0, SHA256_LENGTH}, 526 { mac_aead, mmech_invalid, 0, 0 }, 527 }; 528 529 /* indexed by SSL3BulkCipher */ 530 const char * const ssl3_cipherName[] = { 531 "NULL", 532 "RC4", 533 "RC4-40", 534 "RC4-56", 535 "RC2-CBC", 536 "RC2-CBC-40", 537 "DES-CBC", 538 "3DES-EDE-CBC", 539 "DES-CBC-40", 540 "IDEA-CBC", 541 "AES-128", 542 "AES-256", 543 "Camellia-128", 544 "Camellia-256", 545 "SEED-CBC", 546 "AES-128-GCM", 547 "missing" 548 }; 549 550 #ifdef NSS_ENABLE_ECC 551 /* The ECCWrappedKeyInfo structure defines how various pieces of 552 * information are laid out within wrappedSymmetricWrappingkey 553 * for ECDH key exchange. Since wrappedSymmetricWrappingkey is 554 * a 512-byte buffer (see sslimpl.h), the variable length field 555 * in ECCWrappedKeyInfo can be at most (512 - 8) = 504 bytes. 556 * 557 * XXX For now, NSS only supports named elliptic curves of size 571 bits 558 * or smaller. The public value will fit within 145 bytes and EC params 559 * will fit within 12 bytes. We'll need to revisit this when NSS 560 * supports arbitrary curves. 561 */ 562 #define MAX_EC_WRAPPED_KEY_BUFLEN 504 563 564 typedef struct ECCWrappedKeyInfoStr { 565 PRUint16 size; /* EC public key size in bits */ 566 PRUint16 encodedParamLen; /* length (in bytes) of DER encoded EC params */ 567 PRUint16 pubValueLen; /* length (in bytes) of EC public value */ 568 PRUint16 wrappedKeyLen; /* length (in bytes) of the wrapped key */ 569 PRUint8 var[MAX_EC_WRAPPED_KEY_BUFLEN]; /* this buffer contains the */ 570 /* EC public-key params, the EC public value and the wrapped key */ 571 } ECCWrappedKeyInfo; 572 #endif /* NSS_ENABLE_ECC */ 573 574 #if defined(TRACE) 575 576 static char * 577 ssl3_DecodeHandshakeType(int msgType) 578 { 579 char * rv; 580 static char line[40]; 581 582 switch(msgType) { 583 case hello_request: rv = "hello_request (0)"; break; 584 case client_hello: rv = "client_hello (1)"; break; 585 case server_hello: rv = "server_hello (2)"; break; 586 case hello_verify_request: rv = "hello_verify_request (3)"; break; 587 case certificate: rv = "certificate (11)"; break; 588 case server_key_exchange: rv = "server_key_exchange (12)"; break; 589 case certificate_request: rv = "certificate_request (13)"; break; 590 case server_hello_done: rv = "server_hello_done (14)"; break; 591 case certificate_verify: rv = "certificate_verify (15)"; break; 592 case client_key_exchange: rv = "client_key_exchange (16)"; break; 593 case finished: rv = "finished (20)"; break; 594 default: 595 sprintf(line, "*UNKNOWN* handshake type! (%d)", msgType); 596 rv = line; 597 } 598 return rv; 599 } 600 601 static char * 602 ssl3_DecodeContentType(int msgType) 603 { 604 char * rv; 605 static char line[40]; 606 607 switch(msgType) { 608 case content_change_cipher_spec: 609 rv = "change_cipher_spec (20)"; break; 610 case content_alert: rv = "alert (21)"; break; 611 case content_handshake: rv = "handshake (22)"; break; 612 case content_application_data: 613 rv = "application_data (23)"; break; 614 default: 615 sprintf(line, "*UNKNOWN* record type! (%d)", msgType); 616 rv = line; 617 } 618 return rv; 619 } 620 621 #endif 622 623 SSL3Statistics * 624 SSL_GetStatistics(void) 625 { 626 return &ssl3stats; 627 } 628 629 typedef struct tooLongStr { 630 #if defined(IS_LITTLE_ENDIAN) 631 PRInt32 low; 632 PRInt32 high; 633 #else 634 PRInt32 high; 635 PRInt32 low; 636 #endif 637 } tooLong; 638 639 void SSL_AtomicIncrementLong(long * x) 640 { 641 if ((sizeof *x) == sizeof(PRInt32)) { 642 PR_ATOMIC_INCREMENT((PRInt32 *)x); 643 } else { 644 tooLong * tl = (tooLong *)x; 645 if (PR_ATOMIC_INCREMENT(&tl->low) == 0) 646 PR_ATOMIC_INCREMENT(&tl->high); 647 } 648 } 649 650 static PRBool 651 ssl3_CipherSuiteAllowedForVersionRange( 652 ssl3CipherSuite cipherSuite, 653 const SSLVersionRange *vrange) 654 { 655 switch (cipherSuite) { 656 /* See RFC 4346 A.5. Export cipher suites must not be used in TLS 1.1 or 657 * later. This set of cipher suites is similar to, but different from, the 658 * set of cipher suites considered exportable by SSL_IsExportCipherSuite. 659 */ 660 case SSL_RSA_EXPORT_WITH_RC4_40_MD5: 661 case SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5: 662 /* SSL_RSA_EXPORT_WITH_DES40_CBC_SHA: never implemented 663 * SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA: never implemented 664 * SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA: never implemented 665 * SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA: never implemented 666 * SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA: never implemented 667 * SSL_DH_ANON_EXPORT_WITH_RC4_40_MD5: never implemented 668 * SSL_DH_ANON_EXPORT_WITH_DES40_CBC_SHA: never implemented 669 */ 670 return vrange->min <= SSL_LIBRARY_VERSION_TLS_1_0; 671 case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305: 672 case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305: 673 case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256: 674 case TLS_RSA_WITH_AES_256_CBC_SHA256: 675 case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256: 676 case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256: 677 case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256: 678 case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256: 679 case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256: 680 case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256: 681 case TLS_RSA_WITH_AES_128_CBC_SHA256: 682 case TLS_RSA_WITH_AES_128_GCM_SHA256: 683 case TLS_RSA_WITH_NULL_SHA256: 684 return vrange->max >= SSL_LIBRARY_VERSION_TLS_1_2; 685 default: 686 return PR_TRUE; 687 } 688 } 689 690 /* return pointer to ssl3CipherSuiteDef for suite, or NULL */ 691 /* XXX This does a linear search. A binary search would be better. */ 692 static const ssl3CipherSuiteDef * 693 ssl_LookupCipherSuiteDef(ssl3CipherSuite suite) 694 { 695 int cipher_suite_def_len = 696 sizeof(cipher_suite_defs) / sizeof(cipher_suite_defs[0]); 697 int i; 698 699 for (i = 0; i < cipher_suite_def_len; i++) { 700 if (cipher_suite_defs[i].cipher_suite == suite) 701 return &cipher_suite_defs[i]; 702 } 703 PORT_Assert(PR_FALSE); /* We should never get here. */ 704 PORT_SetError(SSL_ERROR_UNKNOWN_CIPHER_SUITE); 705 return NULL; 706 } 707 708 /* Find the cipher configuration struct associate with suite */ 709 /* XXX This does a linear search. A binary search would be better. */ 710 static ssl3CipherSuiteCfg * 711 ssl_LookupCipherSuiteCfg(ssl3CipherSuite suite, ssl3CipherSuiteCfg *suites) 712 { 713 int i; 714 715 for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) { 716 if (suites[i].cipher_suite == suite) 717 return &suites[i]; 718 } 719 /* return NULL and let the caller handle it. */ 720 PORT_SetError(SSL_ERROR_UNKNOWN_CIPHER_SUITE); 721 return NULL; 722 } 723 724 725 /* Initialize the suite->isPresent value for config_match 726 * Returns count of enabled ciphers supported by extant tokens, 727 * regardless of policy or user preference. 728 * If this returns zero, the user cannot do SSL v3. 729 */ 730 int 731 ssl3_config_match_init(sslSocket *ss) 732 { 733 ssl3CipherSuiteCfg * suite; 734 const ssl3CipherSuiteDef *cipher_def; 735 SSLCipherAlgorithm cipher_alg; 736 CK_MECHANISM_TYPE cipher_mech; 737 SSL3KEAType exchKeyType; 738 int i; 739 int numPresent = 0; 740 int numEnabled = 0; 741 PRBool isServer; 742 sslServerCerts *svrAuth; 743 744 PORT_Assert(ss); 745 if (!ss) { 746 PORT_SetError(SEC_ERROR_INVALID_ARGS); 747 return 0; 748 } 749 if (SSL3_ALL_VERSIONS_DISABLED(&ss->vrange)) { 750 return 0; 751 } 752 isServer = (PRBool)(ss->sec.isServer != 0); 753 754 for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) { 755 suite = &ss->cipherSuites[i]; 756 if (suite->enabled) { 757 ++numEnabled; 758 /* We need the cipher defs to see if we have a token that can handle 759 * this cipher. It isn't part of the static definition. 760 */ 761 cipher_def = ssl_LookupCipherSuiteDef(suite->cipher_suite); 762 if (!cipher_def) { 763 suite->isPresent = PR_FALSE; 764 continue; 765 } 766 cipher_alg = bulk_cipher_defs[cipher_def->bulk_cipher_alg].calg; 767 PORT_Assert( alg2Mech[cipher_alg].calg == cipher_alg); 768 cipher_mech = alg2Mech[cipher_alg].cmech; 769 exchKeyType = 770 kea_defs[cipher_def->key_exchange_alg].exchKeyType; 771 #ifndef NSS_ENABLE_ECC 772 svrAuth = ss->serverCerts + exchKeyType; 773 #else 774 /* XXX SSLKEAType isn't really a good choice for 775 * indexing certificates. It doesn't work for 776 * (EC)DHE-* ciphers. Here we use a hack to ensure 777 * that the server uses an RSA cert for (EC)DHE-RSA. 778 */ 779 switch (cipher_def->key_exchange_alg) { 780 case kea_ecdhe_rsa: 781 #if NSS_SERVER_DHE_IMPLEMENTED 782 /* XXX NSS does not yet implement the server side of _DHE_ 783 * cipher suites. Correcting the computation for svrAuth, 784 * as the case below does, causes NSS SSL servers to begin to 785 * negotiate cipher suites they do not implement. So, until 786 * server side _DHE_ is implemented, keep this disabled. 787 */ 788 case kea_dhe_rsa: 789 #endif 790 svrAuth = ss->serverCerts + kt_rsa; 791 break; 792 case kea_ecdh_ecdsa: 793 case kea_ecdh_rsa: 794 /* 795 * XXX We ought to have different indices for 796 * ECDSA- and RSA-signed EC certificates so 797 * we could support both key exchange mechanisms 798 * simultaneously. For now, both of them use 799 * whatever is in the certificate slot for kt_ecdh 800 */ 801 default: 802 svrAuth = ss->serverCerts + exchKeyType; 803 break; 804 } 805 #endif /* NSS_ENABLE_ECC */ 806 807 /* Mark the suites that are backed by real tokens, certs and keys */ 808 suite->isPresent = (PRBool) 809 (((exchKeyType == kt_null) || 810 ((!isServer || (svrAuth->serverKeyPair && 811 svrAuth->SERVERKEY && 812 svrAuth->serverCertChain)) && 813 PK11_TokenExists(kea_alg_defs[exchKeyType]))) && 814 ((cipher_alg == calg_null) || PK11_TokenExists(cipher_mech))); 815 if (suite->isPresent) 816 ++numPresent; 817 } 818 } 819 PORT_Assert(numPresent > 0 || numEnabled == 0); 820 if (numPresent <= 0) { 821 PORT_SetError(SSL_ERROR_NO_CIPHERS_SUPPORTED); 822 } 823 return numPresent; 824 } 825 826 827 /* return PR_TRUE if suite matches policy, enabled state and is applicable to 828 * the given version range. */ 829 /* It would be a REALLY BAD THING (tm) if we ever permitted the use 830 ** of a cipher that was NOT_ALLOWED. So, if this is ever called with 831 ** policy == SSL_NOT_ALLOWED, report no match. 832 */ 833 /* adjust suite enabled to the availability of a token that can do the 834 * cipher suite. */ 835 static PRBool 836 config_match(ssl3CipherSuiteCfg *suite, int policy, PRBool enabled, 837 const SSLVersionRange *vrange) 838 { 839 PORT_Assert(policy != SSL_NOT_ALLOWED && enabled != PR_FALSE); 840 if (policy == SSL_NOT_ALLOWED || !enabled) 841 return PR_FALSE; 842 return (PRBool)(suite->enabled && 843 suite->isPresent && 844 suite->policy != SSL_NOT_ALLOWED && 845 suite->policy <= policy && 846 ssl3_CipherSuiteAllowedForVersionRange( 847 suite->cipher_suite, vrange)); 848 } 849 850 /* return number of cipher suites that match policy, enabled state and are 851 * applicable for the configured protocol version range. */ 852 /* called from ssl3_SendClientHello and ssl3_ConstructV2CipherSpecsHack */ 853 static int 854 count_cipher_suites(sslSocket *ss, int policy, PRBool enabled) 855 { 856 int i, count = 0; 857 858 if (SSL3_ALL_VERSIONS_DISABLED(&ss->vrange)) { 859 return 0; 860 } 861 for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) { 862 if (config_match(&ss->cipherSuites[i], policy, enabled, &ss->vrange)) 863 count++; 864 } 865 if (count <= 0) { 866 PORT_SetError(SSL_ERROR_SSL_DISABLED); 867 } 868 return count; 869 } 870 871 /* 872 * Null compression, mac and encryption functions 873 */ 874 875 static SECStatus 876 Null_Cipher(void *ctx, unsigned char *output, int *outputLen, int maxOutputLen, 877 const unsigned char *input, int inputLen) 878 { 879 if (inputLen > maxOutputLen) { 880 *outputLen = 0; /* Match PK11_CipherOp in setting outputLen */ 881 PORT_SetError(SEC_ERROR_OUTPUT_LEN); 882 return SECFailure; 883 } 884 *outputLen = inputLen; 885 if (input != output) 886 PORT_Memcpy(output, input, inputLen); 887 return SECSuccess; 888 } 889 890 /* 891 * SSL3 Utility functions 892 */ 893 894 /* allowLargerPeerVersion controls whether the function will select the 895 * highest enabled SSL version or fail when peerVersion is greater than the 896 * highest enabled version. 897 * 898 * If allowLargerPeerVersion is true, peerVersion is the peer's highest 899 * enabled version rather than the peer's selected version. 900 */ 901 SECStatus 902 ssl3_NegotiateVersion(sslSocket *ss, SSL3ProtocolVersion peerVersion, 903 PRBool allowLargerPeerVersion) 904 { 905 if (SSL3_ALL_VERSIONS_DISABLED(&ss->vrange)) { 906 PORT_SetError(SSL_ERROR_SSL_DISABLED); 907 return SECFailure; 908 } 909 910 if (peerVersion < ss->vrange.min || 911 (peerVersion > ss->vrange.max && !allowLargerPeerVersion)) { 912 PORT_SetError(SSL_ERROR_NO_CYPHER_OVERLAP); 913 return SECFailure; 914 } 915 916 ss->version = PR_MIN(peerVersion, ss->vrange.max); 917 PORT_Assert(ssl3_VersionIsSupported(ss->protocolVariant, ss->version)); 918 919 return SECSuccess; 920 } 921 922 static SECStatus 923 ssl3_GetNewRandom(SSL3Random *random) 924 { 925 SECStatus rv; 926 927 /* first 4 bytes are reserverd for time */ 928 rv = PK11_GenerateRandom(random->rand, SSL3_RANDOM_LENGTH); 929 if (rv != SECSuccess) { 930 ssl_MapLowLevelError(SSL_ERROR_GENERATE_RANDOM_FAILURE); 931 } 932 return rv; 933 } 934 935 /* Called by ssl3_SendServerKeyExchange and ssl3_SendCertificateVerify */ 936 SECStatus 937 ssl3_SignHashes(SSL3Hashes *hash, SECKEYPrivateKey *key, SECItem *buf, 938 PRBool isTLS) 939 { 940 SECStatus rv = SECFailure; 941 PRBool doDerEncode = PR_FALSE; 942 int signatureLen; 943 SECItem hashItem; 944 945 buf->data = NULL; 946 947 switch (key->keyType) { 948 case rsaKey: 949 hashItem.data = hash->u.raw; 950 hashItem.len = hash->len; 951 break; 952 case dsaKey: 953 doDerEncode = isTLS; 954 /* SEC_OID_UNKNOWN is used to specify the MD5/SHA1 concatenated hash. 955 * In that case, we use just the SHA1 part. */ 956 if (hash->hashAlg == SEC_OID_UNKNOWN) { 957 hashItem.data = hash->u.s.sha; 958 hashItem.len = sizeof(hash->u.s.sha); 959 } else { 960 hashItem.data = hash->u.raw; 961 hashItem.len = hash->len; 962 } 963 break; 964 #ifdef NSS_ENABLE_ECC 965 case ecKey: 966 doDerEncode = PR_TRUE; 967 /* SEC_OID_UNKNOWN is used to specify the MD5/SHA1 concatenated hash. 968 * In that case, we use just the SHA1 part. */ 969 if (hash->hashAlg == SEC_OID_UNKNOWN) { 970 hashItem.data = hash->u.s.sha; 971 hashItem.len = sizeof(hash->u.s.sha); 972 } else { 973 hashItem.data = hash->u.raw; 974 hashItem.len = hash->len; 975 } 976 break; 977 #endif /* NSS_ENABLE_ECC */ 978 default: 979 PORT_SetError(SEC_ERROR_INVALID_KEY); 980 goto done; 981 } 982 PRINT_BUF(60, (NULL, "hash(es) to be signed", hashItem.data, hashItem.len)); 983 984 if (hash->hashAlg == SEC_OID_UNKNOWN) { 985 signatureLen = PK11_SignatureLen(key); 986 if (signatureLen <= 0) { 987 PORT_SetError(SEC_ERROR_INVALID_KEY); 988 goto done; 989 } 990 991 buf->len = (unsigned)signatureLen; 992 buf->data = (unsigned char *)PORT_Alloc(signatureLen); 993 if (!buf->data) 994 goto done; /* error code was set. */ 995 996 rv = PK11_Sign(key, buf, &hashItem); 997 } else { 998 rv = SGN_Digest(key, hash->hashAlg, buf, &hashItem); 999 } 1000 if (rv != SECSuccess) { 1001 ssl_MapLowLevelError(SSL_ERROR_SIGN_HASHES_FAILURE); 1002 } else if (doDerEncode) { 1003 SECItem derSig = {siBuffer, NULL, 0}; 1004 1005 /* This also works for an ECDSA signature */ 1006 rv = DSAU_EncodeDerSigWithLen(&derSig, buf, buf->len); 1007 if (rv == SECSuccess) { 1008 PORT_Free(buf->data); /* discard unencoded signature. */ 1009 *buf = derSig; /* give caller encoded signature. */ 1010 } else if (derSig.data) { 1011 PORT_Free(derSig.data); 1012 } 1013 } 1014 1015 PRINT_BUF(60, (NULL, "signed hashes", (unsigned char*)buf->data, buf->len)); 1016 done: 1017 if (rv != SECSuccess && buf->data) { 1018 PORT_Free(buf->data); 1019 buf->data = NULL; 1020 } 1021 return rv; 1022 } 1023 1024 /* Called from ssl3_HandleServerKeyExchange, ssl3_HandleCertificateVerify */ 1025 SECStatus 1026 ssl3_VerifySignedHashes(SSL3Hashes *hash, CERTCertificate *cert, 1027 SECItem *buf, PRBool isTLS, void *pwArg) 1028 { 1029 SECKEYPublicKey * key; 1030 SECItem * signature = NULL; 1031 SECStatus rv; 1032 SECItem hashItem; 1033 SECOidTag encAlg; 1034 SECOidTag hashAlg; 1035 1036 1037 PRINT_BUF(60, (NULL, "check signed hashes", 1038 buf->data, buf->len)); 1039 1040 key = CERT_ExtractPublicKey(cert); 1041 if (key == NULL) { 1042 ssl_MapLowLevelError(SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE); 1043 return SECFailure; 1044 } 1045 1046 hashAlg = hash->hashAlg; 1047 switch (key->keyType) { 1048 case rsaKey: 1049 encAlg = SEC_OID_PKCS1_RSA_ENCRYPTION; 1050 hashItem.data = hash->u.raw; 1051 hashItem.len = hash->len; 1052 break; 1053 case dsaKey: 1054 encAlg = SEC_OID_ANSIX9_DSA_SIGNATURE; 1055 /* SEC_OID_UNKNOWN is used to specify the MD5/SHA1 concatenated hash. 1056 * In that case, we use just the SHA1 part. */ 1057 if (hash->hashAlg == SEC_OID_UNKNOWN) { 1058 hashItem.data = hash->u.s.sha; 1059 hashItem.len = sizeof(hash->u.s.sha); 1060 } else { 1061 hashItem.data = hash->u.raw; 1062 hashItem.len = hash->len; 1063 } 1064 /* Allow DER encoded DSA signatures in SSL 3.0 */ 1065 if (isTLS || buf->len != SECKEY_SignatureLen(key)) { 1066 signature = DSAU_DecodeDerSigToLen(buf, SECKEY_SignatureLen(key)); 1067 if (!signature) { 1068 PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); 1069 return SECFailure; 1070 } 1071 buf = signature; 1072 } 1073 break; 1074 1075 #ifdef NSS_ENABLE_ECC 1076 case ecKey: 1077 encAlg = SEC_OID_ANSIX962_EC_PUBLIC_KEY; 1078 /* SEC_OID_UNKNOWN is used to specify the MD5/SHA1 concatenated hash. 1079 * In that case, we use just the SHA1 part. 1080 * ECDSA signatures always encode the integers r and s using ASN.1 1081 * (unlike DSA where ASN.1 encoding is used with TLS but not with 1082 * SSL3). So we can use VFY_VerifyDigestDirect for ECDSA. 1083 */ 1084 if (hash->hashAlg == SEC_OID_UNKNOWN) { 1085 hashAlg = SEC_OID_SHA1; 1086 hashItem.data = hash->u.s.sha; 1087 hashItem.len = sizeof(hash->u.s.sha); 1088 } else { 1089 hashItem.data = hash->u.raw; 1090 hashItem.len = hash->len; 1091 } 1092 break; 1093 #endif /* NSS_ENABLE_ECC */ 1094 1095 default: 1096 SECKEY_DestroyPublicKey(key); 1097 PORT_SetError(SEC_ERROR_UNSUPPORTED_KEYALG); 1098 return SECFailure; 1099 } 1100 1101 PRINT_BUF(60, (NULL, "hash(es) to be verified", 1102 hashItem.data, hashItem.len)); 1103 1104 if (hashAlg == SEC_OID_UNKNOWN || key->keyType == dsaKey) { 1105 /* VFY_VerifyDigestDirect requires DSA signatures to be DER-encoded. 1106 * DSA signatures are DER-encoded in TLS but not in SSL3 and the code 1107 * above always removes the DER encoding of DSA signatures when 1108 * present. Thus DSA signatures are always verified with PK11_Verify. 1109 */ 1110 rv = PK11_Verify(key, buf, &hashItem, pwArg); 1111 } else { 1112 rv = VFY_VerifyDigestDirect(&hashItem, key, buf, encAlg, hashAlg, 1113 pwArg); 1114 } 1115 SECKEY_DestroyPublicKey(key); 1116 if (signature) { 1117 SECITEM_FreeItem(signature, PR_TRUE); 1118 } 1119 if (rv != SECSuccess) { 1120 ssl_MapLowLevelError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); 1121 } 1122 return rv; 1123 } 1124 1125 1126 /* Caller must set hiLevel error code. */ 1127 /* Called from ssl3_ComputeExportRSAKeyHash 1128 * ssl3_ComputeDHKeyHash 1129 * which are called from ssl3_HandleServerKeyExchange. 1130 * 1131 * hashAlg: either the OID for a hash algorithm or SEC_OID_UNKNOWN to specify 1132 * the pre-1.2, MD5/SHA1 combination hash. 1133 */ 1134 SECStatus 1135 ssl3_ComputeCommonKeyHash(SECOidTag hashAlg, 1136 PRUint8 * hashBuf, unsigned int bufLen, 1137 SSL3Hashes *hashes, PRBool bypassPKCS11) 1138 { 1139 SECStatus rv = SECSuccess; 1140 1141 #ifndef NO_PKCS11_BYPASS 1142 if (bypassPKCS11) { 1143 if (hashAlg == SEC_OID_UNKNOWN) { 1144 MD5_HashBuf (hashes->u.s.md5, hashBuf, bufLen); 1145 SHA1_HashBuf(hashes->u.s.sha, hashBuf, bufLen); 1146 hashes->len = MD5_LENGTH + SHA1_LENGTH; 1147 } else if (hashAlg == SEC_OID_SHA1) { 1148 SHA1_HashBuf(hashes->u.raw, hashBuf, bufLen); 1149 hashes->len = SHA1_LENGTH; 1150 } else if (hashAlg == SEC_OID_SHA256) { 1151 SHA256_HashBuf(hashes->u.raw, hashBuf, bufLen); 1152 hashes->len = SHA256_LENGTH; 1153 } else if (hashAlg == SEC_OID_SHA384) { 1154 SHA384_HashBuf(hashes->u.raw, hashBuf, bufLen); 1155 hashes->len = SHA384_LENGTH; 1156 } else if (hashAlg == SEC_OID_SHA512) { 1157 SHA512_HashBuf(hashes->u.raw, hashBuf, bufLen); 1158 hashes->len = SHA512_LENGTH; 1159 } else { 1160 PORT_SetError(SSL_ERROR_UNSUPPORTED_HASH_ALGORITHM); 1161 return SECFailure; 1162 } 1163 } else 1164 #endif 1165 { 1166 if (hashAlg == SEC_OID_UNKNOWN) { 1167 rv = PK11_HashBuf(SEC_OID_MD5, hashes->u.s.md5, hashBuf, bufLen); 1168 if (rv != SECSuccess) { 1169 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); 1170 rv = SECFailure; 1171 goto done; 1172 } 1173 1174 rv = PK11_HashBuf(SEC_OID_SHA1, hashes->u.s.sha, hashBuf, bufLen); 1175 if (rv != SECSuccess) { 1176 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); 1177 rv = SECFailure; 1178 } 1179 hashes->len = MD5_LENGTH + SHA1_LENGTH; 1180 } else { 1181 hashes->len = HASH_ResultLenByOidTag(hashAlg); 1182 if (hashes->len > sizeof(hashes->u.raw)) { 1183 ssl_MapLowLevelError(SSL_ERROR_UNSUPPORTED_HASH_ALGORITHM); 1184 rv = SECFailure; 1185 goto done; 1186 } 1187 rv = PK11_HashBuf(hashAlg, hashes->u.raw, hashBuf, bufLen); 1188 if (rv != SECSuccess) { 1189 ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); 1190 rv = SECFailure; 1191 } 1192 } 1193 } 1194 hashes->hashAlg = hashAlg; 1195 1196 done: 1197 return rv; 1198 } 1199 1200 /* Caller must set hiLevel error code. 1201 ** Called from ssl3_SendServerKeyExchange and 1202 ** ssl3_HandleServerKeyExchange. 1203 */ 1204 static SECStatus 1205 ssl3_ComputeExportRSAKeyHash(SECOidTag hashAlg, 1206 SECItem modulus, SECItem publicExponent, 1207 SSL3Random *client_rand, SSL3Random *server_rand, 1208 SSL3Hashes *hashes, PRBool bypassPKCS11) 1209 { 1210 PRUint8 * hashBuf; 1211 PRUint8 * pBuf; 1212 SECStatus rv = SECSuccess; 1213 unsigned int bufLen; 1214 PRUint8 buf[2*SSL3_RANDOM_LENGTH + 2 + 4096/8 + 2 + 4096/8]; 1215 1216 bufLen = 2*SSL3_RANDOM_LENGTH + 2 + modulus.len + 2 + publicExponent.len; 1217 if (bufLen <= sizeof buf) { 1218 hashBuf = buf; 1219 } else { 1220 hashBuf = PORT_Alloc(bufLen); 1221 if (!hashBuf) { 1222 return SECFailure; 1223 } 1224 } 1225 1226 memcpy(hashBuf, client_rand, SSL3_RANDOM_LENGTH); 1227 pBuf = hashBuf + SSL3_RANDOM_LENGTH; 1228 memcpy(pBuf, server_rand, SSL3_RANDOM_LENGTH); 1229 pBuf += SSL3_RANDOM_LENGTH; 1230 pBuf[0] = (PRUint8)(modulus.len >> 8); 1231 pBuf[1] = (PRUint8)(modulus.len); 1232 pBuf += 2; 1233 memcpy(pBuf, modulus.data, modulus.len); 1234 pBuf += modulus.len; 1235 pBuf[0] = (PRUint8)(publicExponent.len >> 8); 1236 pBuf[1] = (PRUint8)(publicExponent.len); 1237 pBuf += 2; 1238 memcpy(pBuf, publicExponent.data, publicExponent.len); 1239 pBuf += publicExponent.len; 1240 PORT_Assert((unsigned int)(pBuf - hashBuf) == bufLen); 1241 1242 rv = ssl3_ComputeCommonKeyHash(hashAlg, hashBuf, bufLen, hashes, 1243 bypassPKCS11); 1244 1245 PRINT_BUF(95, (NULL, "RSAkey hash: ", hashBuf, bufLen)); 1246 if (hashAlg == SEC_OID_UNKNOWN) { 1247 PRINT_BUF(95, (NULL, "RSAkey hash: MD5 result", 1248 hashes->u.s.md5, MD5_LENGTH)); 1249 PRINT_BUF(95, (NULL, "RSAkey hash: SHA1 result", 1250 hashes->u.s.sha, SHA1_LENGTH)); 1251 } else { 1252 PRINT_BUF(95, (NULL, "RSAkey hash: result", 1253 hashes->u.raw, hashes->len)); 1254 } 1255 1256 if (hashBuf != buf && hashBuf != NULL) 1257 PORT_Free(hashBuf); 1258 return rv; 1259 } 1260 1261 /* Caller must set hiLevel error code. */ 1262 /* Called from ssl3_HandleServerKeyExchange. */ 1263 static SECStatus 1264 ssl3_ComputeDHKeyHash(SECOidTag hashAlg, 1265 SECItem dh_p, SECItem dh_g, SECItem dh_Ys, 1266 SSL3Random *client_rand, SSL3Random *server_rand, 1267 SSL3Hashes *hashes, PRBool bypassPKCS11) 1268 { 1269 PRUint8 * hashBuf; 1270 PRUint8 * pBuf; 1271 SECStatus rv = SECSuccess; 1272 unsigned int bufLen; 1273 PRUint8 buf[2*SSL3_RANDOM_LENGTH + 2 + 4096/8 + 2 + 4096/8]; 1274 1275 bufLen = 2*SSL3_RANDOM_LENGTH + 2 + dh_p.len + 2 + dh_g.len + 2 + dh_Ys.len; 1276 if (bufLen <= sizeof buf) { 1277 hashBuf = buf; 1278 } else { 1279 hashBuf = PORT_Alloc(bufLen); 1280 if (!hashBuf) { 1281 return SECFailure; 1282 } 1283 } 1284 1285 memcpy(hashBuf, client_rand, SSL3_RANDOM_LENGTH); 1286 pBuf = hashBuf + SSL3_RANDOM_LENGTH; 1287 memcpy(pBuf, server_rand, SSL3_RANDOM_LENGTH); 1288 pBuf += SSL3_RANDOM_LENGTH; 1289 pBuf[0] = (PRUint8)(dh_p.len >> 8); 1290 pBuf[1] = (PRUint8)(dh_p.len); 1291 pBuf += 2; 1292 memcpy(pBuf, dh_p.data, dh_p.len); 1293 pBuf += dh_p.len; 1294 pBuf[0] = (PRUint8)(dh_g.len >> 8); 1295 pBuf[1] = (PRUint8)(dh_g.len); 1296 pBuf += 2; 1297 memcpy(pBuf, dh_g.data, dh_g.len); 1298 pBuf += dh_g.len; 1299 pBuf[0] = (PRUint8)(dh_Ys.len >> 8); 1300 pBuf[1] = (PRUint8)(dh_Ys.len); 1301 pBuf += 2; 1302 memcpy(pBuf, dh_Ys.data, dh_Ys.len); 1303 pBuf += dh_Ys.len; 1304 PORT_Assert((unsigned int)(pBuf - hashBuf) == bufLen); 1305 1306 rv = ssl3_ComputeCommonKeyHash(hashAlg, hashBuf, bufLen, hashes, 1307 bypassPKCS11); 1308 1309 PRINT_BUF(95, (NULL, "DHkey hash: ", hashBuf, bufLen)); 1310 if (hashAlg == SEC_OID_UNKNOWN) { 1311 PRINT_BUF(95, (NULL, "DHkey hash: MD5 result", 1312 hashes->u.s.md5, MD5_LENGTH)); 1313 PRINT_BUF(95, (NULL, "DHkey hash: SHA1 result", 1314 hashes->u.s.sha, SHA1_LENGTH)); 1315 } else { 1316 PRINT_BUF(95, (NULL, "DHkey hash: result", 1317 hashes->u.raw, hashes->len)); 1318 } 1319 1320 if (hashBuf != buf && hashBuf != NULL) 1321 PORT_Free(hashBuf); 1322 return rv; 1323 } 1324 1325 static void 1326 ssl3_BumpSequenceNumber(SSL3SequenceNumber *num) 1327 { 1328 num->low++; 1329 if (num->low == 0) 1330 num->high++; 1331 } 1332 1333 /* Called twice, only from ssl3_DestroyCipherSpec (immediately below). */ 1334 static void 1335 ssl3_CleanupKeyMaterial(ssl3KeyMaterial *mat) 1336 { 1337 if (mat->write_key != NULL) { 1338 PK11_FreeSymKey(mat->write_key); 1339 mat->write_key = NULL; 1340 } 1341 if (mat->write_mac_key != NULL) { 1342 PK11_FreeSymKey(mat->write_mac_key); 1343 mat->write_mac_key = NULL; 1344 } 1345 if (mat->write_mac_context != NULL) { 1346 PK11_DestroyContext(mat->write_mac_context, PR_TRUE); 1347 mat->write_mac_context = NULL; 1348 } 1349 } 1350 1351 /* Called from ssl3_SendChangeCipherSpecs() and 1352 ** ssl3_HandleChangeCipherSpecs() 1353 ** ssl3_DestroySSL3Info 1354 ** Caller must hold SpecWriteLock. 1355 */ 1356 void 1357 ssl3_DestroyCipherSpec(ssl3CipherSpec *spec, PRBool freeSrvName) 1358 { 1359 PRBool freeit = (PRBool)(!spec->bypassCiphers); 1360 /* PORT_Assert( ss->opt.noLocks || ssl_HaveSpecWriteLock(ss)); Don't have ss! */ 1361 if (spec->destroy) { 1362 spec->destroy(spec->encodeContext, freeit); 1363 spec->destroy(spec->decodeContext, freeit); 1364 spec->encodeContext = NULL; /* paranoia */ 1365 spec->decodeContext = NULL; 1366 } 1367 if (spec->destroyCompressContext && spec->compressContext) { 1368 spec->destroyCompressContext(spec->compressContext, 1); 1369 spec->compressContext = NULL; 1370 } 1371 if (spec->destroyDecompressContext && spec->decompressContext) { 1372 spec->destroyDecompressContext(spec->decompressContext, 1); 1373 spec->decompressContext = NULL; 1374 } 1375 if (freeSrvName && spec->srvVirtName.data) { 1376 SECITEM_FreeItem(&spec->srvVirtName, PR_FALSE); 1377 } 1378 if (spec->master_secret != NULL) { 1379 PK11_FreeSymKey(spec->master_secret); 1380 spec->master_secret = NULL; 1381 } 1382 spec->msItem.data = NULL; 1383 spec->msItem.len = 0; 1384 ssl3_CleanupKeyMaterial(&spec->client); 1385 ssl3_CleanupKeyMaterial(&spec->server); 1386 spec->bypassCiphers = PR_FALSE; 1387 spec->destroy=NULL; 1388 spec->destroyCompressContext = NULL; 1389 spec->destroyDecompressContext = NULL; 1390 } 1391 1392 /* Fill in the pending cipher spec with info from the selected ciphersuite. 1393 ** This is as much initialization as we can do without having key material. 1394 ** Called from ssl3_HandleServerHello(), ssl3_SendServerHello() 1395 ** Caller must hold the ssl3 handshake lock. 1396 ** Acquires & releases SpecWriteLock. 1397 */ 1398 static SECStatus 1399 ssl3_SetupPendingCipherSpec(sslSocket *ss) 1400 { 1401 ssl3CipherSpec * pwSpec; 1402 ssl3CipherSpec * cwSpec; 1403 ssl3CipherSuite suite = ss->ssl3.hs.cipher_suite; 1404 SSL3MACAlgorithm mac; 1405 SSL3BulkCipher cipher; 1406 SSL3KeyExchangeAlgorithm kea; 1407 const ssl3CipherSuiteDef *suite_def; 1408 PRBool isTLS; 1409 1410 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 1411 1412 ssl_GetSpecWriteLock(ss); /*******************************/ 1413 1414 pwSpec = ss->ssl3.pwSpec; 1415 PORT_Assert(pwSpec == ss->ssl3.prSpec); 1416 1417 /* This hack provides maximal interoperability with SSL 3 servers. */ 1418 cwSpec = ss->ssl3.cwSpec; 1419 if (cwSpec->mac_def->mac == mac_null) { 1420 /* SSL records are not being MACed. */ 1421 cwSpec->version = ss->version; 1422 } 1423 1424 pwSpec->version = ss->version; 1425 isTLS = (PRBool)(pwSpec->version > SSL_LIBRARY_VERSION_3_0); 1426 1427 SSL_TRC(3, ("%d: SSL3[%d]: Set XXX Pending Cipher Suite to 0x%04x", 1428 SSL_GETPID(), ss->fd, suite)); 1429 1430 suite_def = ssl_LookupCipherSuiteDef(suite); 1431 if (suite_def == NULL) { 1432 ssl_ReleaseSpecWriteLock(ss); 1433 return SECFailure; /* error code set by ssl_LookupCipherSuiteDef */ 1434 } 1435 1436 if (IS_DTLS(ss)) { 1437 /* Double-check that we did not pick an RC4 suite */ 1438 PORT_Assert((suite_def->bulk_cipher_alg != cipher_rc4) && 1439 (suite_def->bulk_cipher_alg != cipher_rc4_40) && 1440 (suite_def->bulk_cipher_alg != cipher_rc4_56)); 1441 } 1442 1443 cipher = suite_def->bulk_cipher_alg; 1444 kea = suite_def->key_exchange_alg; 1445 mac = suite_def->mac_alg; 1446 if (mac <= ssl_mac_sha && mac != ssl_mac_null && isTLS) 1447 mac += 2; 1448 1449 ss->ssl3.hs.suite_def = suite_def; 1450 ss->ssl3.hs.kea_def = &kea_defs[kea]; 1451 PORT_Assert(ss->ssl3.hs.kea_def->kea == kea); 1452 1453 pwSpec->cipher_def = &bulk_cipher_defs[cipher]; 1454 PORT_Assert(pwSpec->cipher_def->cipher == cipher); 1455 1456 pwSpec->mac_def = &mac_defs[mac]; 1457 PORT_Assert(pwSpec->mac_def->mac == mac); 1458 1459 ss->sec.keyBits = pwSpec->cipher_def->key_size * BPB; 1460 ss->sec.secretKeyBits = pwSpec->cipher_def->secret_key_size * BPB; 1461 ss->sec.cipherType = cipher; 1462 1463 pwSpec->encodeContext = NULL; 1464 pwSpec->decodeContext = NULL; 1465 1466 pwSpec->mac_size = pwSpec->mac_def->mac_size; 1467 1468 pwSpec->compression_method = ss->ssl3.hs.compression; 1469 pwSpec->compressContext = NULL; 1470 pwSpec->decompressContext = NULL; 1471 1472 ssl_ReleaseSpecWriteLock(ss); /*******************************/ 1473 return SECSuccess; 1474 } 1475 1476 #ifdef NSS_ENABLE_ZLIB 1477 #define SSL3_DEFLATE_CONTEXT_SIZE sizeof(z_stream) 1478 1479 static SECStatus 1480 ssl3_MapZlibError(int zlib_error) 1481 { 1482 switch (zlib_error) { 1483 case Z_OK: 1484 return SECSuccess; 1485 default: 1486 return SECFailure; 1487 } 1488 } 1489 1490 static SECStatus 1491 ssl3_DeflateInit(void *void_context) 1492 { 1493 z_stream *context = void_context; 1494 context->zalloc = NULL; 1495 context->zfree = NULL; 1496 context->opaque = NULL; 1497 1498 return ssl3_MapZlibError(deflateInit(context, Z_DEFAULT_COMPRESSION)); 1499 } 1500 1501 static SECStatus 1502 ssl3_InflateInit(void *void_context) 1503 { 1504 z_stream *context = void_context; 1505 context->zalloc = NULL; 1506 context->zfree = NULL; 1507 context->opaque = NULL; 1508 context->next_in = NULL; 1509 context->avail_in = 0; 1510 1511 return ssl3_MapZlibError(inflateInit(context)); 1512 } 1513 1514 static SECStatus 1515 ssl3_DeflateCompress(void *void_context, unsigned char *out, int *out_len, 1516 int maxout, const unsigned char *in, int inlen) 1517 { 1518 z_stream *context = void_context; 1519 1520 if (!inlen) { 1521 *out_len = 0; 1522 return SECSuccess; 1523 } 1524 1525 context->next_in = (unsigned char*) in; 1526 context->avail_in = inlen; 1527 context->next_out = out; 1528 context->avail_out = maxout; 1529 if (deflate(context, Z_SYNC_FLUSH) != Z_OK) { 1530 return SECFailure; 1531 } 1532 if (context->avail_out == 0) { 1533 /* We ran out of space! */ 1534 SSL_TRC(3, ("%d: SSL3[%d] Ran out of buffer while compressing", 1535 SSL_GETPID())); 1536 return SECFailure; 1537 } 1538 1539 *out_len = maxout - context->avail_out; 1540 return SECSuccess; 1541 } 1542 1543 static SECStatus 1544 ssl3_DeflateDecompress(void *void_context, unsigned char *out, int *out_len, 1545 int maxout, const unsigned char *in, int inlen) 1546 { 1547 z_stream *context = void_context; 1548 1549 if (!inlen) { 1550 *out_len = 0; 1551 return SECSuccess; 1552 } 1553 1554 context->next_in = (unsigned char*) in; 1555 context->avail_in = inlen; 1556 context->next_out = out; 1557 context->avail_out = maxout; 1558 if (inflate(context, Z_SYNC_FLUSH) != Z_OK) { 1559 PORT_SetError(SSL_ERROR_DECOMPRESSION_FAILURE); 1560 return SECFailure; 1561 } 1562 1563 *out_len = maxout - context->avail_out; 1564 return SECSuccess; 1565 } 1566 1567 static SECStatus 1568 ssl3_DestroyCompressContext(void *void_context, PRBool unused) 1569 { 1570 deflateEnd(void_context); 1571 PORT_Free(void_context); 1572 return SECSuccess; 1573 } 1574 1575 static SECStatus 1576 ssl3_DestroyDecompressContext(void *void_context, PRBool unused) 1577 { 1578 inflateEnd(void_context); 1579 PORT_Free(void_context); 1580 return SECSuccess; 1581 } 1582 1583 #endif /* NSS_ENABLE_ZLIB */ 1584 1585 /* Initialize the compression functions and contexts for the given 1586 * CipherSpec. */ 1587 static SECStatus 1588 ssl3_InitCompressionContext(ssl3CipherSpec *pwSpec) 1589 { 1590 /* Setup the compression functions */ 1591 switch (pwSpec->compression_method) { 1592 case ssl_compression_null: 1593 pwSpec->compressor = NULL; 1594 pwSpec->decompressor = NULL; 1595 pwSpec->compressContext = NULL; 1596 pwSpec->decompressContext = NULL; 1597 pwSpec->destroyCompressContext = NULL; 1598 pwSpec->destroyDecompressContext = NULL; 1599 break; 1600 #ifdef NSS_ENABLE_ZLIB 1601 case ssl_compression_deflate: 1602 pwSpec->compressor = ssl3_DeflateCompress; 1603 pwSpec->decompressor = ssl3_DeflateDecompress; 1604 pwSpec->compressContext = PORT_Alloc(SSL3_DEFLATE_CONTEXT_SIZE); 1605 pwSpec->decompressContext = PORT_Alloc(SSL3_DEFLATE_CONTEXT_SIZE); 1606 pwSpec->destroyCompressContext = ssl3_DestroyCompressContext; 1607 pwSpec->destroyDecompressContext = ssl3_DestroyDecompressContext; 1608 ssl3_DeflateInit(pwSpec->compressContext); 1609 ssl3_InflateInit(pwSpec->decompressContext); 1610 break; 1611 #endif /* NSS_ENABLE_ZLIB */ 1612 default: 1613 PORT_Assert(0); 1614 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 1615 return SECFailure; 1616 } 1617 1618 return SECSuccess; 1619 } 1620 1621 #ifndef NO_PKCS11_BYPASS 1622 /* Initialize encryption contexts for pending spec. 1623 * MAC contexts are set up when computing the mac, not here. 1624 * Master Secret already is derived in spec->msItem 1625 * Caller holds Spec write lock. 1626 */ 1627 static SECStatus 1628 ssl3_InitPendingContextsBypass(sslSocket *ss) 1629 { 1630 ssl3CipherSpec * pwSpec; 1631 const ssl3BulkCipherDef *cipher_def; 1632 void * serverContext = NULL; 1633 void * clientContext = NULL; 1634 BLapiInitContextFunc initFn = (BLapiInitContextFunc)NULL; 1635 int mode = 0; 1636 unsigned int optArg1 = 0; 1637 unsigned int optArg2 = 0; 1638 PRBool server_encrypts = ss->sec.isServer; 1639 SSLCipherAlgorithm calg; 1640 SECStatus rv; 1641 1642 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 1643 PORT_Assert(ss->opt.noLocks || ssl_HaveSpecWriteLock(ss)); 1644 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); 1645 1646 pwSpec = ss->ssl3.pwSpec; 1647 cipher_def = pwSpec->cipher_def; 1648 1649 calg = cipher_def->calg; 1650 1651 if (calg == ssl_calg_aes_gcm) { 1652 pwSpec->encode = NULL; 1653 pwSpec->decode = NULL; 1654 pwSpec->destroy = NULL; 1655 pwSpec->encodeContext = NULL; 1656 pwSpec->decodeContext = NULL; 1657 pwSpec->aead = ssl3_AESGCMBypass; 1658 ssl3_InitCompressionContext(pwSpec); 1659 return SECSuccess; 1660 } 1661 1662 serverContext = pwSpec->server.cipher_context; 1663 clientContext = pwSpec->client.cipher_context; 1664 1665 switch (calg) { 1666 case ssl_calg_null: 1667 pwSpec->encode = Null_Cipher; 1668 pwSpec->decode = Null_Cipher; 1669 pwSpec->destroy = NULL; 1670 goto success; 1671 1672 case ssl_calg_rc4: 1673 initFn = (BLapiInitContextFunc)RC4_InitContext; 1674 pwSpec->encode = (SSLCipher) RC4_Encrypt; 1675 pwSpec->decode = (SSLCipher) RC4_Decrypt; 1676 pwSpec->destroy = (SSLDestroy) RC4_DestroyContext; 1677 break; 1678 case ssl_calg_rc2: 1679 initFn = (BLapiInitContextFunc)RC2_InitContext; 1680 mode = NSS_RC2_CBC; 1681 optArg1 = cipher_def->key_size; 1682 pwSpec->encode = (SSLCipher) RC2_Encrypt; 1683 pwSpec->decode = (SSLCipher) RC2_Decrypt; 1684 pwSpec->destroy = (SSLDestroy) RC2_DestroyContext; 1685 break; 1686 case ssl_calg_des: 1687 initFn = (BLapiInitContextFunc)DES_InitContext; 1688 mode = NSS_DES_CBC; 1689 optArg1 = server_encrypts; 1690 pwSpec->encode = (SSLCipher) DES_Encrypt; 1691 pwSpec->decode = (SSLCipher) DES_Decrypt; 1692 pwSpec->destroy = (SSLDestroy) DES_DestroyContext; 1693 break; 1694 case ssl_calg_3des: 1695 initFn = (BLapiInitContextFunc)DES_InitContext; 1696 mode = NSS_DES_EDE3_CBC; 1697 optArg1 = server_encrypts; 1698 pwSpec->encode = (SSLCipher) DES_Encrypt; 1699 pwSpec->decode = (SSLCipher) DES_Decrypt; 1700 pwSpec->destroy = (SSLDestroy) DES_DestroyContext; 1701 break; 1702 case ssl_calg_aes: 1703 initFn = (BLapiInitContextFunc)AES_InitContext; 1704 mode = NSS_AES_CBC; 1705 optArg1 = server_encrypts; 1706 optArg2 = AES_BLOCK_SIZE; 1707 pwSpec->encode = (SSLCipher) AES_Encrypt; 1708 pwSpec->decode = (SSLCipher) AES_Decrypt; 1709 pwSpec->destroy = (SSLDestroy) AES_DestroyContext; 1710 break; 1711 1712 case ssl_calg_camellia: 1713 initFn = (BLapiInitContextFunc)Camellia_InitContext; 1714 mode = NSS_CAMELLIA_CBC; 1715 optArg1 = server_encrypts; 1716 optArg2 = CAMELLIA_BLOCK_SIZE; 1717 pwSpec->encode = (SSLCipher) Camellia_Encrypt; 1718 pwSpec->decode = (SSLCipher) Camellia_Decrypt; 1719 pwSpec->destroy = (SSLDestroy) Camellia_DestroyContext; 1720 break; 1721 1722 case ssl_calg_seed: 1723 initFn = (BLapiInitContextFunc)SEED_InitContext; 1724 mode = NSS_SEED_CBC; 1725 optArg1 = server_encrypts; 1726 optArg2 = SEED_BLOCK_SIZE; 1727 pwSpec->encode = (SSLCipher) SEED_Encrypt; 1728 pwSpec->decode = (SSLCipher) SEED_Decrypt; 1729 pwSpec->destroy = (SSLDestroy) SEED_DestroyContext; 1730 break; 1731 1732 case ssl_calg_idea: 1733 case ssl_calg_fortezza : 1734 default: 1735 PORT_Assert(0); 1736 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 1737 goto bail_out; 1738 } 1739 rv = (*initFn)(serverContext, 1740 pwSpec->server.write_key_item.data, 1741 pwSpec->server.write_key_item.len, 1742 pwSpec->server.write_iv_item.data, 1743 mode, optArg1, optArg2); 1744 if (rv != SECSuccess) { 1745 PORT_Assert(0); 1746 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 1747 goto bail_out; 1748 } 1749 1750 switch (calg) { 1751 case ssl_calg_des: 1752 case ssl_calg_3des: 1753 case ssl_calg_aes: 1754 case ssl_calg_camellia: 1755 case ssl_calg_seed: 1756 /* For block ciphers, if the server is encrypting, then the client 1757 * is decrypting, and vice versa. 1758 */ 1759 optArg1 = !optArg1; 1760 break; 1761 /* kill warnings. */ 1762 case ssl_calg_null: 1763 case ssl_calg_rc4: 1764 case ssl_calg_rc2: 1765 case ssl_calg_idea: 1766 case ssl_calg_fortezza: 1767 case ssl_calg_aes_gcm: 1768 break; 1769 } 1770 1771 rv = (*initFn)(clientContext, 1772 pwSpec->client.write_key_item.data, 1773 pwSpec->client.write_key_item.len, 1774 pwSpec->client.write_iv_item.data, 1775 mode, optArg1, optArg2); 1776 if (rv != SECSuccess) { 1777 PORT_Assert(0); 1778 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 1779 goto bail_out; 1780 } 1781 1782 pwSpec->encodeContext = (ss->sec.isServer) ? serverContext : clientContext; 1783 pwSpec->decodeContext = (ss->sec.isServer) ? clientContext : serverContext; 1784 1785 ssl3_InitCompressionContext(pwSpec); 1786 1787 success: 1788 return SECSuccess; 1789 1790 bail_out: 1791 return SECFailure; 1792 } 1793 #endif 1794 1795 /* This function should probably be moved to pk11wrap and be named 1796 * PK11_ParamFromIVAndEffectiveKeyBits 1797 */ 1798 static SECItem * 1799 ssl3_ParamFromIV(CK_MECHANISM_TYPE mtype, SECItem *iv, CK_ULONG ulEffectiveBits) 1800 { 1801 SECItem * param = PK11_ParamFromIV(mtype, iv); 1802 if (param && param->data && param->len >= sizeof(CK_RC2_PARAMS)) { 1803 switch (mtype) { 1804 case CKM_RC2_KEY_GEN: 1805 case CKM_RC2_ECB: 1806 case CKM_RC2_CBC: 1807 case CKM_RC2_MAC: 1808 case CKM_RC2_MAC_GENERAL: 1809 case CKM_RC2_CBC_PAD: 1810 *(CK_RC2_PARAMS *)param->data = ulEffectiveBits; 1811 default: break; 1812 } 1813 } 1814 return param; 1815 } 1816 1817 /* ssl3_BuildRecordPseudoHeader writes the SSL/TLS pseudo-header (the data 1818 * which is included in the MAC or AEAD additional data) to |out| and returns 1819 * its length. See https://tools.ietf.org/html/rfc5246#section-6.2.3.3 for the 1820 * definition of the AEAD additional data. 1821 * 1822 * TLS pseudo-header includes the record's version field, SSL's doesn't. Which 1823 * pseudo-header defintiion to use should be decided based on the version of 1824 * the protocol that was negotiated when the cipher spec became current, NOT 1825 * based on the version value in the record itself, and the decision is passed 1826 * to this function as the |includesVersion| argument. But, the |version| 1827 * argument should be the record's version value. 1828 */ 1829 static unsigned int 1830 ssl3_BuildRecordPseudoHeader(unsigned char *out, 1831 SSL3SequenceNumber seq_num, 1832 SSL3ContentType type, 1833 PRBool includesVersion, 1834 SSL3ProtocolVersion version, 1835 PRBool isDTLS, 1836 int length) 1837 { 1838 out[0] = (unsigned char)(seq_num.high >> 24); 1839 out[1] = (unsigned char)(seq_num.high >> 16); 1840 out[2] = (unsigned char)(seq_num.high >> 8); 1841 out[3] = (unsigned char)(seq_num.high >> 0); 1842 out[4] = (unsigned char)(seq_num.low >> 24); 1843 out[5] = (unsigned char)(seq_num.low >> 16); 1844 out[6] = (unsigned char)(seq_num.low >> 8); 1845 out[7] = (unsigned char)(seq_num.low >> 0); 1846 out[8] = type; 1847 1848 /* SSL3 MAC doesn't include the record's version field. */ 1849 if (!includesVersion) { 1850 out[9] = MSB(length); 1851 out[10] = LSB(length); 1852 return 11; 1853 } 1854 1855 /* TLS MAC and AEAD additional data include version. */ 1856 if (isDTLS) { 1857 SSL3ProtocolVersion dtls_version; 1858 1859 dtls_version = dtls_TLSVersionToDTLSVersion(version); 1860 out[9] = MSB(dtls_version); 1861 out[10] = LSB(dtls_version); 1862 } else { 1863 out[9] = MSB(version); 1864 out[10] = LSB(version); 1865 } 1866 out[11] = MSB(length); 1867 out[12] = LSB(length); 1868 return 13; 1869 } 1870 1871 typedef SECStatus (*PK11CryptFcn)( 1872 PK11SymKey *symKey, CK_MECHANISM_TYPE mechanism, SECItem *param, 1873 unsigned char *out, unsigned int *outLen, unsigned int maxLen, 1874 const unsigned char *in, unsigned int inLen); 1875 1876 static PK11CryptFcn pk11_encrypt = NULL; 1877 static PK11CryptFcn pk11_decrypt = NULL; 1878 1879 static PRCallOnceType resolvePK11CryptOnce; 1880 1881 static PRStatus 1882 ssl3_ResolvePK11CryptFunctions(void) 1883 { 1884 #ifdef LINUX 1885 /* On Linux we use the system NSS libraries. Look up the PK11_Encrypt and 1886 * PK11_Decrypt functions at run time. */ 1887 void *handle = dlopen(NULL, RTLD_LAZY); 1888 if (!handle) { 1889 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 1890 return PR_FAILURE; 1891 } 1892 pk11_encrypt = (PK11CryptFcn)dlsym(handle, "PK11_Encrypt"); 1893 pk11_decrypt = (PK11CryptFcn)dlsym(handle, "PK11_Decrypt"); 1894 dlclose(handle); 1895 return PR_SUCCESS; 1896 #else 1897 /* On other platforms we use our own copy of NSS. PK11_Encrypt and 1898 * PK11_Decrypt are known to be available. */ 1899 pk11_encrypt = PK11_Encrypt; 1900 pk11_decrypt = PK11_Decrypt; 1901 return PR_SUCCESS; 1902 #endif 1903 } 1904 1905 /* 1906 * In NSS 3.15, PK11_Encrypt and PK11_Decrypt were added to provide access 1907 * to the AES GCM implementation in the NSS softoken. So the presence of 1908 * these two functions implies the NSS version supports AES GCM. 1909 */ 1910 static PRBool 1911 ssl3_HasGCMSupport(void) 1912 { 1913 (void)PR_CallOnce(&resolvePK11CryptOnce, ssl3_ResolvePK11CryptFunctions); 1914 return pk11_encrypt != NULL; 1915 } 1916 1917 /* On this socket, disable the GCM cipher suites */ 1918 SECStatus 1919 ssl3_DisableGCMSuites(sslSocket * ss) 1920 { 1921 unsigned int i; 1922 1923 for (i = 0; i < PR_ARRAY_SIZE(cipher_suite_defs); i++) { 1924 const ssl3CipherSuiteDef *cipher_def = &cipher_suite_defs[i]; 1925 if (cipher_def->bulk_cipher_alg == cipher_aes_128_gcm) { 1926 SECStatus rv = ssl3_CipherPrefSet(ss, cipher_def->cipher_suite, 1927 PR_FALSE); 1928 PORT_Assert(rv == SECSuccess); /* else is coding error */ 1929 } 1930 } 1931 return SECSuccess; 1932 } 1933 1934 static SECStatus 1935 ssl3_AESGCM(ssl3KeyMaterial *keys, 1936 PRBool doDecrypt, 1937 unsigned char *out, 1938 int *outlen, 1939 int maxout, 1940 const unsigned char *in, 1941 int inlen, 1942 const unsigned char *additionalData, 1943 int additionalDataLen) 1944 { 1945 SECItem param; 1946 SECStatus rv = SECFailure; 1947 unsigned char nonce[12]; 1948 unsigned int uOutLen; 1949 CK_GCM_PARAMS gcmParams; 1950 1951 static const int tagSize = 16; 1952 static const int explicitNonceLen = 8; 1953 1954 /* See https://tools.ietf.org/html/rfc5288#section-3 for details of how the 1955 * nonce is formed. */ 1956 memcpy(nonce, keys->write_iv, 4); 1957 if (doDecrypt) { 1958 memcpy(nonce + 4, in, explicitNonceLen); 1959 in += explicitNonceLen; 1960 inlen -= explicitNonceLen; 1961 *outlen = 0; 1962 } else { 1963 if (maxout < explicitNonceLen) { 1964 PORT_SetError(SEC_ERROR_INPUT_LEN); 1965 return SECFailure; 1966 } 1967 /* Use the 64-bit sequence number as the explicit nonce. */ 1968 memcpy(nonce + 4, additionalData, explicitNonceLen); 1969 memcpy(out, additionalData, explicitNonceLen); 1970 out += explicitNonceLen; 1971 maxout -= explicitNonceLen; 1972 *outlen = explicitNonceLen; 1973 } 1974 1975 param.type = siBuffer; 1976 param.data = (unsigned char *) &gcmParams; 1977 param.len = sizeof(gcmParams); 1978 gcmParams.pIv = nonce; 1979 gcmParams.ulIvLen = sizeof(nonce); 1980 gcmParams.pAAD = (unsigned char *)additionalData; /* const cast */ 1981 gcmParams.ulAADLen = additionalDataLen; 1982 gcmParams.ulTagBits = tagSize * 8; 1983 1984 if (doDecrypt) { 1985 rv = pk11_decrypt(keys->write_key, CKM_AES_GCM, ¶m, out, &uOutLen, 1986 maxout, in, inlen); 1987 } else { 1988 rv = pk11_encrypt(keys->write_key, CKM_AES_GCM, ¶m, out, &uOutLen, 1989 maxout, in, inlen); 1990 } 1991 *outlen += (int) uOutLen; 1992 1993 return rv; 1994 } 1995 1996 #ifndef NO_PKCS11_BYPASS 1997 static SECStatus 1998 ssl3_AESGCMBypass(ssl3KeyMaterial *keys, 1999 PRBool doDecrypt, 2000 unsigned char *out, 2001 int *outlen, 2002 int maxout, 2003 const unsigned char *in, 2004 int inlen, 2005 const unsigned char *additionalData, 2006 int additionalDataLen) 2007 { 2008 SECStatus rv = SECFailure; 2009 unsigned char nonce[12]; 2010 unsigned int uOutLen; 2011 AESContext *cx; 2012 CK_GCM_PARAMS gcmParams; 2013 2014 static const int tagSize = 16; 2015 static const int explicitNonceLen = 8; 2016 2017 /* See https://tools.ietf.org/html/rfc5288#section-3 for details of how the 2018 * nonce is formed. */ 2019 PORT_Assert(keys->write_iv_item.len == 4); 2020 if (keys->write_iv_item.len != 4) { 2021 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 2022 return SECFailure; 2023 } 2024 memcpy(nonce, keys->write_iv_item.data, 4); 2025 if (doDecrypt) { 2026 memcpy(nonce + 4, in, explicitNonceLen); 2027 in += explicitNonceLen; 2028 inlen -= explicitNonceLen; 2029 *outlen = 0; 2030 } else { 2031 if (maxout < explicitNonceLen) { 2032 PORT_SetError(SEC_ERROR_INPUT_LEN); 2033 return SECFailure; 2034 } 2035 /* Use the 64-bit sequence number as the explicit nonce. */ 2036 memcpy(nonce + 4, additionalData, explicitNonceLen); 2037 memcpy(out, additionalData, explicitNonceLen); 2038 out += explicitNonceLen; 2039 maxout -= explicitNonceLen; 2040 *outlen = explicitNonceLen; 2041 } 2042 2043 gcmParams.pIv = nonce; 2044 gcmParams.ulIvLen = sizeof(nonce); 2045 gcmParams.pAAD = (unsigned char *)additionalData; /* const cast */ 2046 gcmParams.ulAADLen = additionalDataLen; 2047 gcmParams.ulTagBits = tagSize * 8; 2048 2049 cx = (AESContext *)keys->cipher_context; 2050 rv = AES_InitContext(cx, keys->write_key_item.data, 2051 keys->write_key_item.len, 2052 (unsigned char *)&gcmParams, NSS_AES_GCM, !doDecrypt, 2053 AES_BLOCK_SIZE); 2054 if (rv != SECSuccess) { 2055 return rv; 2056 } 2057 if (doDecrypt) { 2058 rv = AES_Decrypt(cx, out, &uOutLen, maxout, in, inlen); 2059 } else { 2060 rv = AES_Encrypt(cx, out, &uOutLen, maxout, in, inlen); 2061 } 2062 AES_DestroyContext(cx, PR_FALSE); 2063 *outlen += (int) uOutLen; 2064 2065 return rv; 2066 } 2067 #endif 2068 2069 static SECStatus 2070 ssl3_ChaCha20Poly1305( 2071 ssl3KeyMaterial *keys, 2072 PRBool doDecrypt, 2073 unsigned char *out, 2074 int *outlen, 2075 int maxout, 2076 const unsigned char *in, 2077 int inlen, 2078 const unsigned char *additionalData, 2079 int additionalDataLen) 2080 { 2081 SECItem param; 2082 SECStatus rv = SECFailure; 2083 unsigned int uOutLen; 2084 CK_NSS_AEAD_PARAMS aeadParams; 2085 static const int tagSize = 16; 2086 2087 param.type = siBuffer; 2088 param.len = sizeof(aeadParams); 2089 param.data = (unsigned char *) &aeadParams; 2090 memset(&aeadParams, 0, sizeof(aeadParams)); 2091 aeadParams.pIv = (unsigned char *) additionalData; 2092 aeadParams.ulIvLen = 8; 2093 aeadParams.pAAD = (unsigned char *) additionalData; 2094 aeadParams.ulAADLen = additionalDataLen; 2095 aeadParams.ulTagLen = tagSize; 2096 2097 if (doDecrypt) { 2098 rv = pk11_decrypt(keys->write_key, CKM_NSS_CHACHA20_POLY1305, ¶m, 2099 out, &uOutLen, maxout, in, inlen); 2100 } else { 2101 rv = pk11_encrypt(keys->write_key, CKM_NSS_CHACHA20_POLY1305, ¶m, 2102 out, &uOutLen, maxout, in, inlen); 2103 } 2104 *outlen = (int) uOutLen; 2105 2106 return rv; 2107 } 2108 2109 /* Initialize encryption and MAC contexts for pending spec. 2110 * Master Secret already is derived. 2111 * Caller holds Spec write lock. 2112 */ 2113 static SECStatus 2114 ssl3_InitPendingContextsPKCS11(sslSocket *ss) 2115 { 2116 ssl3CipherSpec * pwSpec; 2117 const ssl3BulkCipherDef *cipher_def; 2118 PK11Context * serverContext = NULL; 2119 PK11Context * clientContext = NULL; 2120 SECItem * param; 2121 CK_MECHANISM_TYPE mechanism; 2122 CK_MECHANISM_TYPE mac_mech; 2123 CK_ULONG macLength; 2124 CK_ULONG effKeyBits; 2125 SECItem iv; 2126 SECItem mac_param; 2127 SSLCipherAlgorithm calg; 2128 2129 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 2130 PORT_Assert( ss->opt.noLocks || ssl_HaveSpecWriteLock(ss)); 2131 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); 2132 2133 pwSpec = ss->ssl3.pwSpec; 2134 cipher_def = pwSpec->cipher_def; 2135 macLength = pwSpec->mac_size; 2136 calg = cipher_def->calg; 2137 PORT_Assert(alg2Mech[calg].calg == calg); 2138 2139 pwSpec->client.write_mac_context = NULL; 2140 pwSpec->server.write_mac_context = NULL; 2141 2142 if (calg == calg_aes_gcm || calg == calg_chacha20) { 2143 pwSpec->encode = NULL; 2144 pwSpec->decode = NULL; 2145 pwSpec->destroy = NULL; 2146 pwSpec->encodeContext = NULL; 2147 pwSpec->decodeContext = NULL; 2148 if (calg == calg_aes_gcm) { 2149 pwSpec->aead = ssl3_AESGCM; 2150 } else { 2151 pwSpec->aead = ssl3_ChaCha20Poly1305; 2152 } 2153 return SECSuccess; 2154 } 2155 2156 /* 2157 ** Now setup the MAC contexts, 2158 ** crypto contexts are setup below. 2159 */ 2160 2161 mac_mech = pwSpec->mac_def->mmech; 2162 mac_param.data = (unsigned char *)&macLength; 2163 mac_param.len = sizeof(macLength); 2164 mac_param.type = 0; 2165 2166 pwSpec->client.write_mac_context = PK11_CreateContextBySymKey( 2167 mac_mech, CKA_SIGN, pwSpec->client.write_mac_key, &mac_param); 2168 if (pwSpec->client.write_mac_context == NULL) { 2169 ssl_MapLowLevelError(SSL_ERROR_SYM_KEY_CONTEXT_FAILURE); 2170 goto fail; 2171 } 2172 pwSpec->server.write_mac_context = PK11_CreateContextBySymKey( 2173 mac_mech, CKA_SIGN, pwSpec->server.write_mac_key, &mac_param); 2174 if (pwSpec->server.write_mac_context == NULL) { 2175 ssl_MapLowLevelError(SSL_ERROR_SYM_KEY_CONTEXT_FAILURE); 2176 goto fail; 2177 } 2178 2179 /* 2180 ** Now setup the crypto contexts. 2181 */ 2182 2183 if (calg == calg_null) { 2184 pwSpec->encode = Null_Cipher; 2185 pwSpec->decode = Null_Cipher; 2186 pwSpec->destroy = NULL; 2187 return SECSuccess; 2188 } 2189 mechanism = alg2Mech[calg].cmech; 2190 effKeyBits = cipher_def->key_size * BPB; 2191 2192 /* 2193 * build the server context 2194 */ 2195 iv.data = pwSpec->server.write_iv; 2196 iv.len = cipher_def->iv_size; 2197 param = ssl3_ParamFromIV(mechanism, &iv, effKeyBits); 2198 if (param == NULL) { 2199 ssl_MapLowLevelError(SSL_ERROR_IV_PARAM_FAILURE); 2200 goto fail; 2201 } 2202 serverContext = PK11_CreateContextBySymKey(mechanism, 2203 (ss->sec.isServer ? CKA_ENCRYPT : CKA_DECRYPT), 2204 pwSpec->server.write_key, param); 2205 iv.data = PK11_IVFromParam(mechanism, param, (int *)&iv.len); 2206 if (iv.data) 2207 PORT_Memcpy(pwSpec->server.write_iv, iv.data, iv.len); 2208 SECITEM_FreeItem(param, PR_TRUE); 2209 if (serverContext == NULL) { 2210 ssl_MapLowLevelError(SSL_ERROR_SYM_KEY_CONTEXT_FAILURE); 2211 goto fail; 2212 } 2213 2214 /* 2215 * build the client context 2216 */ 2217 iv.data = pwSpec->client.write_iv; 2218 iv.len = cipher_def->iv_size; 2219 2220 param = ssl3_ParamFromIV(mechanism, &iv, effKeyBits); 2221 if (param == NULL) { 2222 ssl_MapLowLevelError(SSL_ERROR_IV_PARAM_FAILURE); 2223 goto fail; 2224 } 2225 clientContext = PK11_CreateContextBySymKey(mechanism, 2226 (ss->sec.isServer ? CKA_DECRYPT : CKA_ENCRYPT), 2227 pwSpec->client.write_key, param); 2228 iv.data = PK11_IVFromParam(mechanism, param, (int *)&iv.len); 2229 if (iv.data) 2230 PORT_Memcpy(pwSpec->client.write_iv, iv.data, iv.len); 2231 SECITEM_FreeItem(param,PR_TRUE); 2232 if (clientContext == NULL) { 2233 ssl_MapLowLevelError(SSL_ERROR_SYM_KEY_CONTEXT_FAILURE); 2234 goto fail; 2235 } 2236 pwSpec->encode = (SSLCipher) PK11_CipherOp; 2237 pwSpec->decode = (SSLCipher) PK11_CipherOp; 2238 pwSpec->destroy = (SSLDestroy) PK11_DestroyContext; 2239 2240 pwSpec->encodeContext = (ss->sec.isServer) ? serverContext : clientContext; 2241 pwSpec->decodeContext = (ss->sec.isServer) ? clientContext : serverContext; 2242 2243 serverContext = NULL; 2244 clientContext = NULL; 2245 2246 ssl3_InitCompressionContext(pwSpec); 2247 2248 return SECSuccess; 2249 2250 fail: 2251 if (serverContext != NULL) PK11_DestroyContext(serverContext, PR_TRUE); 2252 if (clientContext != NULL) PK11_DestroyContext(clientContext, PR_TRUE); 2253 if (pwSpec->client.write_mac_context != NULL) { 2254 PK11_DestroyContext(pwSpec->client.write_mac_context,PR_TRUE); 2255 pwSpec->client.write_mac_context = NULL; 2256 } 2257 if (pwSpec->server.write_mac_context != NULL) { 2258 PK11_DestroyContext(pwSpec->server.write_mac_context,PR_TRUE); 2259 pwSpec->server.write_mac_context = NULL; 2260 } 2261 2262 return SECFailure; 2263 } 2264 2265 /* Complete the initialization of all keys, ciphers, MACs and their contexts 2266 * for the pending Cipher Spec. 2267 * Called from: ssl3_SendClientKeyExchange (for Full handshake) 2268 * ssl3_HandleRSAClientKeyExchange (for Full handshake) 2269 * ssl3_HandleServerHello (for session restart) 2270 * ssl3_HandleClientHello (for session restart) 2271 * Sets error code, but caller probably should override to disambiguate. 2272 * NULL pms means re-use old master_secret. 2273 * 2274 * This code is common to the bypass and PKCS11 execution paths. 2275 * For the bypass case, pms is NULL. 2276 */ 2277 SECStatus 2278 ssl3_InitPendingCipherSpec(sslSocket *ss, PK11SymKey *pms) 2279 { 2280 ssl3CipherSpec * pwSpec; 2281 ssl3CipherSpec * cwSpec; 2282 SECStatus rv; 2283 2284 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 2285 2286 ssl_GetSpecWriteLock(ss); /**************************************/ 2287 2288 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); 2289 2290 pwSpec = ss->ssl3.pwSpec; 2291 cwSpec = ss->ssl3.cwSpec; 2292 2293 if (pms || (!pwSpec->msItem.len && !pwSpec->master_secret)) { 2294 rv = ssl3_DeriveMasterSecret(ss, pms); 2295 if (rv != SECSuccess) { 2296 goto done; /* err code set by ssl3_DeriveMasterSecret */ 2297 } 2298 } 2299 #ifndef NO_PKCS11_BYPASS 2300 if (ss->opt.bypassPKCS11 && pwSpec->msItem.len && pwSpec->msItem.data) { 2301 /* Double Bypass succeeded in extracting the master_secret */ 2302 const ssl3KEADef * kea_def = ss->ssl3.hs.kea_def; 2303 PRBool isTLS = (PRBool)(kea_def->tls_keygen || 2304 (pwSpec->version > SSL_LIBRARY_VERSION_3_0)); 2305 pwSpec->bypassCiphers = PR_TRUE; 2306 rv = ssl3_KeyAndMacDeriveBypass( pwSpec, 2307 (const unsigned char *)&ss->ssl3.hs.client_random, 2308 (const unsigned char *)&ss->ssl3.hs.server_random, 2309 isTLS, 2310 (PRBool)(kea_def->is_limited)); 2311 if (rv == SECSuccess) { 2312 rv = ssl3_InitPendingContextsBypass(ss); 2313 } 2314 } else 2315 #endif 2316 if (pwSpec->master_secret) { 2317 rv = ssl3_DeriveConnectionKeysPKCS11(ss); 2318 if (rv == SECSuccess) { 2319 rv = ssl3_InitPendingContextsPKCS11(ss); 2320 } 2321 } else { 2322 PORT_Assert(pwSpec->master_secret); 2323 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 2324 rv = SECFailure; 2325 } 2326 if (rv != SECSuccess) { 2327 goto done; 2328 } 2329 2330 /* Generic behaviors -- common to all crypto methods */ 2331 if (!IS_DTLS(ss)) { 2332 pwSpec->read_seq_num.high = pwSpec->write_seq_num.high = 0; 2333 } else { 2334 if (cwSpec->epoch == PR_UINT16_MAX) { 2335 /* The problem here is that we have rehandshaked too many 2336 * times (you are not allowed to wrap the epoch). The 2337 * spec says you should be discarding the connection 2338 * and start over, so not much we can do here. */ 2339 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 2340 rv = SECFailure; 2341 goto done; 2342 } 2343 /* The sequence number has the high 16 bits as the epoch. */ 2344 pwSpec->epoch = cwSpec->epoch + 1; 2345 pwSpec->read_seq_num.high = pwSpec->write_seq_num.high = 2346 pwSpec->epoch << 16; 2347 2348 dtls_InitRecvdRecords(&pwSpec->recvdRecords); 2349 } 2350 pwSpec->read_seq_num.low = pwSpec->write_seq_num.low = 0; 2351 2352 done: 2353 ssl_ReleaseSpecWriteLock(ss); /******************************/ 2354 if (rv != SECSuccess) 2355 ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE); 2356 return rv; 2357 } 2358 2359 /* 2360 * 60 bytes is 3 times the maximum length MAC size that is supported. 2361 */ 2362 static const unsigned char mac_pad_1 [60] = { 2363 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 2364 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 2365 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 2366 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 2367 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 2368 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 2369 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 2370 0x36, 0x36, 0x36, 0x36 2371 }; 2372 static const unsigned char mac_pad_2 [60] = { 2373 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 2374 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 2375 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 2376 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 2377 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 2378 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 2379 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 2380 0x5c, 0x5c, 0x5c, 0x5c 2381 }; 2382 2383 /* Called from: ssl3_SendRecord() 2384 ** Caller must already hold the SpecReadLock. (wish we could assert that!) 2385 */ 2386 static SECStatus 2387 ssl3_ComputeRecordMAC( 2388 ssl3CipherSpec * spec, 2389 PRBool useServerMacKey, 2390 const unsigned char *header, 2391 unsigned int headerLen, 2392 const SSL3Opaque * input, 2393 int inputLength, 2394 unsigned char * outbuf, 2395 unsigned int * outLength) 2396 { 2397 const ssl3MACDef * mac_def; 2398 SECStatus rv; 2399 2400 PRINT_BUF(95, (NULL, "frag hash1: header", header, headerLen)); 2401 PRINT_BUF(95, (NULL, "frag hash1: input", input, inputLength)); 2402 2403 mac_def = spec->mac_def; 2404 if (mac_def->mac == mac_null) { 2405 *outLength = 0; 2406 return SECSuccess; 2407 } 2408 #ifndef NO_PKCS11_BYPASS 2409 if (spec->bypassCiphers) { 2410 /* bypass version */ 2411 const SECHashObject *hashObj = NULL; 2412 unsigned int pad_bytes = 0; 2413 PRUint64 write_mac_context[MAX_MAC_CONTEXT_LLONGS]; 2414 2415 switch (mac_def->mac) { 2416 case ssl_mac_null: 2417 *outLength = 0; 2418 return SECSuccess; 2419 case ssl_mac_md5: 2420 pad_bytes = 48; 2421 hashObj = HASH_GetRawHashObject(HASH_AlgMD5); 2422 break; 2423 case ssl_mac_sha: 2424 pad_bytes = 40; 2425 hashObj = HASH_GetRawHashObject(HASH_AlgSHA1); 2426 break; 2427 case ssl_hmac_md5: /* used with TLS */ 2428 hashObj = HASH_GetRawHashObject(HASH_AlgMD5); 2429 break; 2430 case ssl_hmac_sha: /* used with TLS */ 2431 hashObj = HASH_GetRawHashObject(HASH_AlgSHA1); 2432 break; 2433 case ssl_hmac_sha256: /* used with TLS */ 2434 hashObj = HASH_GetRawHashObject(HASH_AlgSHA256); 2435 break; 2436 default: 2437 break; 2438 } 2439 if (!hashObj) { 2440 PORT_Assert(0); 2441 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 2442 return SECFailure; 2443 } 2444 2445 if (spec->version <= SSL_LIBRARY_VERSION_3_0) { 2446 unsigned int tempLen; 2447 unsigned char temp[MAX_MAC_LENGTH]; 2448 2449 /* compute "inner" part of SSL3 MAC */ 2450 hashObj->begin(write_mac_context); 2451 if (useServerMacKey) 2452 hashObj->update(write_mac_context, 2453 spec->server.write_mac_key_item.data, 2454 spec->server.write_mac_key_item.len); 2455 else 2456 hashObj->update(write_mac_context, 2457 spec->client.write_mac_key_item.data, 2458 spec->client.write_mac_key_item.len); 2459 hashObj->update(write_mac_context, mac_pad_1, pad_bytes); 2460 hashObj->update(write_mac_context, header, headerLen); 2461 hashObj->update(write_mac_context, input, inputLength); 2462 hashObj->end(write_mac_context, temp, &tempLen, sizeof temp); 2463 2464 /* compute "outer" part of SSL3 MAC */ 2465 hashObj->begin(write_mac_context); 2466 if (useServerMacKey) 2467 hashObj->update(write_mac_context, 2468 spec->server.write_mac_key_item.data, 2469 spec->server.write_mac_key_item.len); 2470 else 2471 hashObj->update(write_mac_context, 2472 spec->client.write_mac_key_item.data, 2473 spec->client.write_mac_key_item.len); 2474 hashObj->update(write_mac_context, mac_pad_2, pad_bytes); 2475 hashObj->update(write_mac_context, temp, tempLen); 2476 hashObj->end(write_mac_context, outbuf, outLength, spec->mac_size); 2477 rv = SECSuccess; 2478 } else { /* is TLS */ 2479 #define cx ((HMACContext *)write_mac_context) 2480 if (useServerMacKey) { 2481 rv = HMAC_Init(cx, hashObj, 2482 spec->server.write_mac_key_item.data, 2483 spec->server.write_mac_key_item.len, PR_FALSE); 2484 } else { 2485 rv = HMAC_Init(cx, hashObj, 2486 spec->client.write_mac_key_item.data, 2487 spec->client.write_mac_key_item.len, PR_FALSE); 2488 } 2489 if (rv == SECSuccess) { 2490 HMAC_Begin(cx); 2491 HMAC_Update(cx, header, headerLen); 2492 HMAC_Update(cx, input, inputLength); 2493 rv = HMAC_Finish(cx, outbuf, outLength, spec->mac_size); 2494 HMAC_Destroy(cx, PR_FALSE); 2495 } 2496 #undef cx 2497 } 2498 } else 2499 #endif 2500 { 2501 PK11Context *mac_context = 2502 (useServerMacKey ? spec->server.write_mac_context 2503 : spec->client.write_mac_context); 2504 rv = PK11_DigestBegin(mac_context); 2505 rv |= PK11_DigestOp(mac_context, header, headerLen); 2506 rv |= PK11_DigestOp(mac_context, input, inputLength); 2507 rv |= PK11_DigestFinal(mac_context, outbuf, outLength, spec->mac_size); 2508 } 2509 2510 PORT_Assert(rv != SECSuccess || *outLength == (unsigned)spec->mac_size); 2511 2512 PRINT_BUF(95, (NULL, "frag hash2: result", outbuf, *outLength)); 2513 2514 if (rv != SECSuccess) { 2515 rv = SECFailure; 2516 ssl_MapLowLevelError(SSL_ERROR_MAC_COMPUTATION_FAILURE); 2517 } 2518 return rv; 2519 } 2520 2521 /* Called from: ssl3_HandleRecord() 2522 * Caller must already hold the SpecReadLock. (wish we could assert that!) 2523 * 2524 * On entry: 2525 * originalLen >= inputLen >= MAC size 2526 */ 2527 static SECStatus 2528 ssl3_ComputeRecordMACConstantTime( 2529 ssl3CipherSpec * spec, 2530 PRBool useServerMacKey, 2531 const unsigned char *header, 2532 unsigned int headerLen, 2533 const SSL3Opaque * input, 2534 int inputLen, 2535 int originalLen, 2536 unsigned char * outbuf, 2537 unsigned int * outLen) 2538 { 2539 CK_MECHANISM_TYPE macType; 2540 CK_NSS_MAC_CONSTANT_TIME_PARAMS params; 2541 SECItem param, inputItem, outputItem; 2542 SECStatus rv; 2543 PK11SymKey * key; 2544 2545 PORT_Assert(inputLen >= spec->mac_size); 2546 PORT_Assert(originalLen >= inputLen); 2547 2548 if (spec->bypassCiphers) { 2549 /* This function doesn't support PKCS#11 bypass. We fallback on the 2550 * non-constant time version. */ 2551 goto fallback; 2552 } 2553 2554 if (spec->mac_def->mac == mac_null) { 2555 *outLen = 0; 2556 return SECSuccess; 2557 } 2558 2559 macType = CKM_NSS_HMAC_CONSTANT_TIME; 2560 if (spec->version <= SSL_LIBRARY_VERSION_3_0) { 2561 macType = CKM_NSS_SSL3_MAC_CONSTANT_TIME; 2562 } 2563 2564 params.macAlg = spec->mac_def->mmech; 2565 params.ulBodyTotalLen = originalLen; 2566 params.pHeader = (unsigned char *) header; /* const cast */ 2567 params.ulHeaderLen = headerLen; 2568 2569 param.data = (unsigned char*) ¶ms; 2570 param.len = sizeof(params); 2571 param.type = 0; 2572 2573 inputItem.data = (unsigned char *) input; 2574 inputItem.len = inputLen; 2575 inputItem.type = 0; 2576 2577 outputItem.data = outbuf; 2578 outputItem.len = *outLen; 2579 outputItem.type = 0; 2580 2581 key = spec->server.write_mac_key; 2582 if (!useServerMacKey) { 2583 key = spec->client.write_mac_key; 2584 } 2585 2586 rv = PK11_SignWithSymKey(key, macType, ¶m, &outputItem, &inputItem); 2587 if (rv != SECSuccess) { 2588 if (PORT_GetError() == SEC_ERROR_INVALID_ALGORITHM) { 2589 goto fallback; 2590 } 2591 2592 *outLen = 0; 2593 rv = SECFailure; 2594 ssl_MapLowLevelError(SSL_ERROR_MAC_COMPUTATION_FAILURE); 2595 return rv; 2596 } 2597 2598 PORT_Assert(outputItem.len == (unsigned)spec->mac_size); 2599 *outLen = outputItem.len; 2600 2601 return rv; 2602 2603 fallback: 2604 /* ssl3_ComputeRecordMAC expects the MAC to have been removed from the 2605 * length already. */ 2606 inputLen -= spec->mac_size; 2607 return ssl3_ComputeRecordMAC(spec, useServerMacKey, header, headerLen, 2608 input, inputLen, outbuf, outLen); 2609 } 2610 2611 static PRBool 2612 ssl3_ClientAuthTokenPresent(sslSessionID *sid) { 2613 PK11SlotInfo *slot = NULL; 2614 PRBool isPresent = PR_TRUE; 2615 2616 /* we only care if we are doing client auth */ 2617 /* If NSS_PLATFORM_CLIENT_AUTH is defined and a platformClientKey is being 2618 * used, u.ssl3.clAuthValid will be false and this function will always 2619 * return PR_TRUE. */ 2620 if (!sid || !sid->u.ssl3.clAuthValid) { 2621 return PR_TRUE; 2622 } 2623 2624 /* get the slot */ 2625 slot = SECMOD_LookupSlot(sid->u.ssl3.clAuthModuleID, 2626 sid->u.ssl3.clAuthSlotID); 2627 if (slot == NULL || 2628 !PK11_IsPresent(slot) || 2629 sid->u.ssl3.clAuthSeries != PK11_GetSlotSeries(slot) || 2630 sid->u.ssl3.clAuthSlotID != PK11_GetSlotID(slot) || 2631 sid->u.ssl3.clAuthModuleID != PK11_GetModuleID(slot) || 2632 (PK11_NeedLogin(slot) && !PK11_IsLoggedIn(slot, NULL))) { 2633 isPresent = PR_FALSE; 2634 } 2635 if (slot) { 2636 PK11_FreeSlot(slot); 2637 } 2638 return isPresent; 2639 } 2640 2641 /* Caller must hold the spec read lock. */ 2642 SECStatus 2643 ssl3_CompressMACEncryptRecord(ssl3CipherSpec * cwSpec, 2644 PRBool isServer, 2645 PRBool isDTLS, 2646 PRBool capRecordVersion, 2647 SSL3ContentType type, 2648 const SSL3Opaque * pIn, 2649 PRUint32 contentLen, 2650 sslBuffer * wrBuf) 2651 { 2652 const ssl3BulkCipherDef * cipher_def; 2653 SECStatus rv; 2654 PRUint32 macLen = 0; 2655 PRUint32 fragLen; 2656 PRUint32 p1Len, p2Len, oddLen = 0; 2657 PRUint16 headerLen; 2658 int ivLen = 0; 2659 int cipherBytes = 0; 2660 unsigned char pseudoHeader[13]; 2661 unsigned int pseudoHeaderLen; 2662 2663 cipher_def = cwSpec->cipher_def; 2664 headerLen = isDTLS ? DTLS_RECORD_HEADER_LENGTH : SSL3_RECORD_HEADER_LENGTH; 2665 2666 if (cipher_def->type == type_block && 2667 cwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_1) { 2668 /* Prepend the per-record explicit IV using technique 2b from 2669 * RFC 4346 section 6.2.3.2: The IV is a cryptographically 2670 * strong random number XORed with the CBC residue from the previous 2671 * record. 2672 */ 2673 ivLen = cipher_def->iv_size; 2674 if (ivLen > wrBuf->space - headerLen) { 2675 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 2676 return SECFailure; 2677 } 2678 rv = PK11_GenerateRandom(wrBuf->buf + headerLen, ivLen); 2679 if (rv != SECSuccess) { 2680 ssl_MapLowLevelError(SSL_ERROR_GENERATE_RANDOM_FAILURE); 2681 return rv; 2682 } 2683 rv = cwSpec->encode( cwSpec->encodeContext, 2684 wrBuf->buf + headerLen, 2685 &cipherBytes, /* output and actual outLen */ 2686 ivLen, /* max outlen */ 2687 wrBuf->buf + headerLen, 2688 ivLen); /* input and inputLen*/ 2689 if (rv != SECSuccess || cipherBytes != ivLen) { 2690 PORT_SetError(SSL_ERROR_ENCRYPTION_FAILURE); 2691 return SECFailure; 2692 } 2693 } 2694 2695 if (cwSpec->compressor) { 2696 int outlen; 2697 rv = cwSpec->compressor( 2698 cwSpec->compressContext, 2699 wrBuf->buf + headerLen + ivLen, &outlen, 2700 wrBuf->space - headerLen - ivLen, pIn, contentLen); 2701 if (rv != SECSuccess) 2702 return rv; 2703 pIn = wrBuf->buf + headerLen + ivLen; 2704 contentLen = outlen; 2705 } 2706 2707 pseudoHeaderLen = ssl3_BuildRecordPseudoHeader( 2708 pseudoHeader, cwSpec->write_seq_num, type, 2709 cwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_0, cwSpec->version, 2710 isDTLS, contentLen); 2711 PORT_Assert(pseudoHeaderLen <= sizeof(pseudoHeader)); 2712 if (cipher_def->type == type_aead) { 2713 const int nonceLen = cipher_def->explicit_nonce_size; 2714 const int tagLen = cipher_def->tag_size; 2715 2716 if (headerLen + nonceLen + contentLen + tagLen > wrBuf->space) { 2717 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 2718 return SECFailure; 2719 } 2720 2721 cipherBytes = contentLen; 2722 rv = cwSpec->aead( 2723 isServer ? &cwSpec->server : &cwSpec->client, 2724 PR_FALSE, /* do encrypt */ 2725 wrBuf->buf + headerLen, /* output */ 2726 &cipherBytes, /* out len */ 2727 wrBuf->space - headerLen, /* max out */ 2728 pIn, contentLen, /* input */ 2729 pseudoHeader, pseudoHeaderLen); 2730 if (rv != SECSuccess) { 2731 PORT_SetError(SSL_ERROR_ENCRYPTION_FAILURE); 2732 return SECFailure; 2733 } 2734 } else { 2735 /* 2736 * Add the MAC 2737 */ 2738 rv = ssl3_ComputeRecordMAC(cwSpec, isServer, 2739 pseudoHeader, pseudoHeaderLen, pIn, contentLen, 2740 wrBuf->buf + headerLen + ivLen + contentLen, &macLen); 2741 if (rv != SECSuccess) { 2742 ssl_MapLowLevelError(SSL_ERROR_MAC_COMPUTATION_FAILURE); 2743 return SECFailure; 2744 } 2745 p1Len = contentLen; 2746 p2Len = macLen; 2747 fragLen = contentLen + macLen; /* needs to be encrypted */ 2748 PORT_Assert(fragLen <= MAX_FRAGMENT_LENGTH + 1024); 2749 2750 /* 2751 * Pad the text (if we're doing a block cipher) 2752 * then Encrypt it 2753 */ 2754 if (cipher_def->type == type_block) { 2755 unsigned char * pBuf; 2756 int padding_length; 2757 int i; 2758 2759 oddLen = contentLen % cipher_def->block_size; 2760 /* Assume blockSize is a power of two */ 2761 padding_length = cipher_def->block_size - 1 - 2762 ((fragLen) & (cipher_def->block_size - 1)); 2763 fragLen += padding_length + 1; 2764 PORT_Assert((fragLen % cipher_def->block_size) == 0); 2765 2766 /* Pad according to TLS rules (also acceptable to SSL3). */ 2767 pBuf = &wrBuf->buf[headerLen + ivLen + fragLen - 1]; 2768 for (i = padding_length + 1; i > 0; --i) { 2769 *pBuf-- = padding_length; 2770 } 2771 /* now, if contentLen is not a multiple of block size, fix it */ 2772 p2Len = fragLen - p1Len; 2773 } 2774 if (p1Len < 256) { 2775 oddLen = p1Len; 2776 p1Len = 0; 2777 } else { 2778 p1Len -= oddLen; 2779 } 2780 if (oddLen) { 2781 p2Len += oddLen; 2782 PORT_Assert( (cipher_def->block_size < 2) || \ 2783 (p2Len % cipher_def->block_size) == 0); 2784 memmove(wrBuf->buf + headerLen + ivLen + p1Len, pIn + p1Len, 2785 oddLen); 2786 } 2787 if (p1Len > 0) { 2788 int cipherBytesPart1 = -1; 2789 rv = cwSpec->encode( cwSpec->encodeContext, 2790 wrBuf->buf + headerLen + ivLen, /* output */ 2791 &cipherBytesPart1, /* actual outlen */ 2792 p1Len, /* max outlen */ 2793 pIn, p1Len); /* input, and inputlen */ 2794 PORT_Assert(rv == SECSuccess && cipherBytesPart1 == (int) p1Len); 2795 if (rv != SECSuccess || cipherBytesPart1 != (int) p1Len) { 2796 PORT_SetError(SSL_ERROR_ENCRYPTION_FAILURE); 2797 return SECFailure; 2798 } 2799 cipherBytes += cipherBytesPart1; 2800 } 2801 if (p2Len > 0) { 2802 int cipherBytesPart2 = -1; 2803 rv = cwSpec->encode( cwSpec->encodeContext, 2804 wrBuf->buf + headerLen + ivLen + p1Len, 2805 &cipherBytesPart2, /* output and actual outLen */ 2806 p2Len, /* max outlen */ 2807 wrBuf->buf + headerLen + ivLen + p1Len, 2808 p2Len); /* input and inputLen*/ 2809 PORT_Assert(rv == SECSuccess && cipherBytesPart2 == (int) p2Len); 2810 if (rv != SECSuccess || cipherBytesPart2 != (int) p2Len) { 2811 PORT_SetError(SSL_ERROR_ENCRYPTION_FAILURE); 2812 return SECFailure; 2813 } 2814 cipherBytes += cipherBytesPart2; 2815 } 2816 } 2817 2818 PORT_Assert(cipherBytes <= MAX_FRAGMENT_LENGTH + 1024); 2819 2820 wrBuf->len = cipherBytes + headerLen; 2821 wrBuf->buf[0] = type; 2822 if (isDTLS) { 2823 SSL3ProtocolVersion version; 2824 2825 version = dtls_TLSVersionToDTLSVersion(cwSpec->version); 2826 wrBuf->buf[1] = MSB(version); 2827 wrBuf->buf[2] = LSB(version); 2828 wrBuf->buf[3] = (unsigned char)(cwSpec->write_seq_num.high >> 24); 2829 wrBuf->buf[4] = (unsigned char)(cwSpec->write_seq_num.high >> 16); 2830 wrBuf->buf[5] = (unsigned char)(cwSpec->write_seq_num.high >> 8); 2831 wrBuf->buf[6] = (unsigned char)(cwSpec->write_seq_num.high >> 0); 2832 wrBuf->buf[7] = (unsigned char)(cwSpec->write_seq_num.low >> 24); 2833 wrBuf->buf[8] = (unsigned char)(cwSpec->write_seq_num.low >> 16); 2834 wrBuf->buf[9] = (unsigned char)(cwSpec->write_seq_num.low >> 8); 2835 wrBuf->buf[10] = (unsigned char)(cwSpec->write_seq_num.low >> 0); 2836 wrBuf->buf[11] = MSB(cipherBytes); 2837 wrBuf->buf[12] = LSB(cipherBytes); 2838 } else { 2839 SSL3ProtocolVersion version = cwSpec->version; 2840 2841 if (capRecordVersion) { 2842 version = PR_MIN(SSL_LIBRARY_VERSION_TLS_1_0, version); 2843 } 2844 wrBuf->buf[1] = MSB(version); 2845 wrBuf->buf[2] = LSB(version); 2846 wrBuf->buf[3] = MSB(cipherBytes); 2847 wrBuf->buf[4] = LSB(cipherBytes); 2848 } 2849 2850 ssl3_BumpSequenceNumber(&cwSpec->write_seq_num); 2851 2852 return SECSuccess; 2853 } 2854 2855 /* Process the plain text before sending it. 2856 * Returns the number of bytes of plaintext that were successfully sent 2857 * plus the number of bytes of plaintext that were copied into the 2858 * output (write) buffer. 2859 * Returns SECFailure on a hard IO error, memory error, or crypto error. 2860 * Does NOT return SECWouldBlock. 2861 * 2862 * Notes on the use of the private ssl flags: 2863 * (no private SSL flags) 2864 * Attempt to make and send SSL records for all plaintext 2865 * If non-blocking and a send gets WOULD_BLOCK, 2866 * or if the pending (ciphertext) buffer is not empty, 2867 * then buffer remaining bytes of ciphertext into pending buf, 2868 * and continue to do that for all succssive records until all 2869 * bytes are used. 2870 * ssl_SEND_FLAG_FORCE_INTO_BUFFER 2871 * As above, except this suppresses all write attempts, and forces 2872 * all ciphertext into the pending ciphertext buffer. 2873 * ssl_SEND_FLAG_USE_EPOCH (for DTLS) 2874 * Forces the use of the provided epoch 2875 * ssl_SEND_FLAG_CAP_RECORD_VERSION 2876 * Caps the record layer version number of TLS ClientHello to { 3, 1 } 2877 * (TLS 1.0). Some TLS 1.0 servers (which seem to use F5 BIG-IP) ignore 2878 * ClientHello.client_version and use the record layer version number 2879 * (TLSPlaintext.version) instead when negotiating protocol versions. In 2880 * addition, if the record layer version number of ClientHello is { 3, 2 } 2881 * (TLS 1.1) or higher, these servers reset the TCP connections. Lastly, 2882 * some F5 BIG-IP servers hang if a record containing a ClientHello has a 2883 * version greater than { 3, 1 } and a length greater than 255. Set this 2884 * flag to work around such servers. 2885 */ 2886 PRInt32 2887 ssl3_SendRecord( sslSocket * ss, 2888 DTLSEpoch epoch, /* DTLS only */ 2889 SSL3ContentType type, 2890 const SSL3Opaque * pIn, /* input buffer */ 2891 PRInt32 nIn, /* bytes of input */ 2892 PRInt32 flags) 2893 { 2894 sslBuffer * wrBuf = &ss->sec.writeBuf; 2895 SECStatus rv; 2896 PRInt32 totalSent = 0; 2897 PRBool capRecordVersion; 2898 2899 SSL_TRC(3, ("%d: SSL3[%d] SendRecord type: %s nIn=%d", 2900 SSL_GETPID(), ss->fd, ssl3_DecodeContentType(type), 2901 nIn)); 2902 PRINT_BUF(50, (ss, "Send record (plain text)", pIn, nIn)); 2903 2904 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss) ); 2905 2906 capRecordVersion = ((flags & ssl_SEND_FLAG_CAP_RECORD_VERSION) != 0); 2907 2908 if (capRecordVersion) { 2909 /* ssl_SEND_FLAG_CAP_RECORD_VERSION can only be used with the 2910 * TLS initial ClientHello. */ 2911 PORT_Assert(!IS_DTLS(ss)); 2912 PORT_Assert(!ss->firstHsDone); 2913 PORT_Assert(type == content_handshake); 2914 PORT_Assert(ss->ssl3.hs.ws == wait_server_hello); 2915 } 2916 2917 if (ss->ssl3.initialized == PR_FALSE) { 2918 /* This can happen on a server if the very first incoming record 2919 ** looks like a defective ssl3 record (e.g. too long), and we're 2920 ** trying to send an alert. 2921 */ 2922 PR_ASSERT(type == content_alert); 2923 rv = ssl3_InitState(ss); 2924 if (rv != SECSuccess) { 2925 return SECFailure; /* ssl3_InitState has set the error code. */ 2926 } 2927 } 2928 2929 /* check for Token Presence */ 2930 if (!ssl3_ClientAuthTokenPresent(ss->sec.ci.sid)) { 2931 PORT_SetError(SSL_ERROR_TOKEN_INSERTION_REMOVAL); 2932 return SECFailure; 2933 } 2934 2935 while (nIn > 0) { 2936 PRUint32 contentLen = PR_MIN(nIn, MAX_FRAGMENT_LENGTH); 2937 unsigned int spaceNeeded; 2938 unsigned int numRecords; 2939 2940 ssl_GetSpecReadLock(ss); /********************************/ 2941 2942 if (nIn > 1 && ss->opt.cbcRandomIV && 2943 ss->ssl3.cwSpec->version < SSL_LIBRARY_VERSION_TLS_1_1 && 2944 type == content_application_data && 2945 ss->ssl3.cwSpec->cipher_def->type == type_block /* CBC mode */) { 2946 /* We will split the first byte of the record into its own record, 2947 * as explained in the documentation for SSL_CBC_RANDOM_IV in ssl.h 2948 */ 2949 numRecords = 2; 2950 } else { 2951 numRecords = 1; 2952 } 2953 2954 spaceNeeded = contentLen + (numRecords * SSL3_BUFFER_FUDGE); 2955 if (ss->ssl3.cwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_1 && 2956 ss->ssl3.cwSpec->cipher_def->type == type_block) { 2957 spaceNeeded += ss->ssl3.cwSpec->cipher_def->iv_size; 2958 } 2959 if (spaceNeeded > wrBuf->space) { 2960 rv = sslBuffer_Grow(wrBuf, spaceNeeded); 2961 if (rv != SECSuccess) { 2962 SSL_DBG(("%d: SSL3[%d]: SendRecord, tried to get %d bytes", 2963 SSL_GETPID(), ss->fd, spaceNeeded)); 2964 goto spec_locked_loser; /* sslBuffer_Grow set error code. */ 2965 } 2966 } 2967 2968 if (numRecords == 2) { 2969 sslBuffer secondRecord; 2970 2971 rv = ssl3_CompressMACEncryptRecord(ss->ssl3.cwSpec, 2972 ss->sec.isServer, IS_DTLS(ss), 2973 capRecordVersion, type, pIn, 2974 1, wrBuf); 2975 if (rv != SECSuccess) 2976 goto spec_locked_loser; 2977 2978 PRINT_BUF(50, (ss, "send (encrypted) record data [1/2]:", 2979 wrBuf->buf, wrBuf->len)); 2980 2981 secondRecord.buf = wrBuf->buf + wrBuf->len; 2982 secondRecord.len = 0; 2983 secondRecord.space = wrBuf->space - wrBuf->len; 2984 2985 rv = ssl3_CompressMACEncryptRecord(ss->ssl3.cwSpec, 2986 ss->sec.isServer, IS_DTLS(ss), 2987 capRecordVersion, type, 2988 pIn + 1, contentLen - 1, 2989 &secondRecord); 2990 if (rv == SECSuccess) { 2991 PRINT_BUF(50, (ss, "send (encrypted) record data [2/2]:", 2992 secondRecord.buf, secondRecord.len)); 2993 wrBuf->len += secondRecord.len; 2994 } 2995 } else { 2996 if (!IS_DTLS(ss)) { 2997 rv = ssl3_CompressMACEncryptRecord(ss->ssl3.cwSpec, 2998 ss->sec.isServer, 2999 IS_DTLS(ss), 3000 capRecordVersion, 3001 type, pIn, 3002 contentLen, wrBuf); 3003 } else { 3004 rv = dtls_CompressMACEncryptRecord(ss, epoch, 3005 !!(flags & ssl_SEND_FLAG_USE_EPOCH), 3006 type, pIn, 3007 contentLen, wrBuf); 3008 } 3009 3010 if (rv == SECSuccess) { 3011 PRINT_BUF(50, (ss, "send (encrypted) record data:", 3012 wrBuf->buf, wrBuf->len)); 3013 } 3014 } 3015 3016 spec_locked_loser: 3017 ssl_ReleaseSpecReadLock(ss); /************************************/ 3018 3019 if (rv != SECSuccess) 3020 return SECFailure; 3021 3022 pIn += contentLen; 3023 nIn -= contentLen; 3024 PORT_Assert( nIn >= 0 ); 3025 3026 /* If there's still some previously saved ciphertext, 3027 * or the caller doesn't want us to send the data yet, 3028 * then add all our new ciphertext to the amount previously saved. 3029 */ 3030 if ((ss->pendingBuf.len > 0) || 3031 (flags & ssl_SEND_FLAG_FORCE_INTO_BUFFER)) { 3032 3033 rv = ssl_SaveWriteData(ss, wrBuf->buf, wrBuf->len); 3034 if (rv != SECSuccess) { 3035 /* presumably a memory error, SEC_ERROR_NO_MEMORY */ 3036 return SECFailure; 3037 } 3038 wrBuf->len = 0; /* All cipher text is saved away. */ 3039 3040 if (!(flags & ssl_SEND_FLAG_FORCE_INTO_BUFFER)) { 3041 PRInt32 sent; 3042 ss->handshakeBegun = 1; 3043 sent = ssl_SendSavedWriteData(ss); 3044 if (sent < 0 && PR_GetError() != PR_WOULD_BLOCK_ERROR) { 3045 ssl_MapLowLevelError(SSL_ERROR_SOCKET_WRITE_FAILURE); 3046 return SECFailure; 3047 } 3048 if (ss->pendingBuf.len) { 3049 flags |= ssl_SEND_FLAG_FORCE_INTO_BUFFER; 3050 } 3051 } 3052 } else if (wrBuf->len > 0) { 3053 PRInt32 sent; 3054 ss->handshakeBegun = 1; 3055 sent = ssl_DefSend(ss, wrBuf->buf, wrBuf->len, 3056 flags & ~ssl_SEND_FLAG_MASK); 3057 if (sent < 0) { 3058 if (PR_GetError() != PR_WOULD_BLOCK_ERROR) { 3059 ssl_MapLowLevelError(SSL_ERROR_SOCKET_WRITE_FAILURE); 3060 return SECFailure; 3061 } 3062 /* we got PR_WOULD_BLOCK_ERROR, which means none was sent. */ 3063 sent = 0; 3064 } 3065 wrBuf->len -= sent; 3066 if (wrBuf->len) { 3067 if (IS_DTLS(ss)) { 3068 /* DTLS just says no in this case. No buffering */ 3069 PR_SetError(PR_WOULD_BLOCK_ERROR, 0); 3070 return SECFailure; 3071 } 3072 /* now take all the remaining unsent new ciphertext and 3073 * append it to the buffer of previously unsent ciphertext. 3074 */ 3075 rv = ssl_SaveWriteData(ss, wrBuf->buf + sent, wrBuf->len); 3076 if (rv != SECSuccess) { 3077 /* presumably a memory error, SEC_ERROR_NO_MEMORY */ 3078 return SECFailure; 3079 } 3080 } 3081 } 3082 totalSent += contentLen; 3083 } 3084 return totalSent; 3085 } 3086 3087 #define SSL3_PENDING_HIGH_WATER 1024 3088 3089 /* Attempt to send the content of "in" in an SSL application_data record. 3090 * Returns "len" or SECFailure, never SECWouldBlock, nor SECSuccess. 3091 */ 3092 int 3093 ssl3_SendApplicationData(sslSocket *ss, const unsigned char *in, 3094 PRInt32 len, PRInt32 flags) 3095 { 3096 PRInt32 totalSent = 0; 3097 PRInt32 discarded = 0; 3098 3099 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss) ); 3100 /* These flags for internal use only */ 3101 PORT_Assert(!(flags & (ssl_SEND_FLAG_USE_EPOCH | 3102 ssl_SEND_FLAG_NO_RETRANSMIT))); 3103 if (len < 0 || !in) { 3104 PORT_SetError(PR_INVALID_ARGUMENT_ERROR); 3105 return SECFailure; 3106 } 3107 3108 if (ss->pendingBuf.len > SSL3_PENDING_HIGH_WATER && 3109 !ssl_SocketIsBlocking(ss)) { 3110 PORT_Assert(!ssl_SocketIsBlocking(ss)); 3111 PORT_SetError(PR_WOULD_BLOCK_ERROR); 3112 return SECFailure; 3113 } 3114 3115 if (ss->appDataBuffered && len) { 3116 PORT_Assert (in[0] == (unsigned char)(ss->appDataBuffered)); 3117 if (in[0] != (unsigned char)(ss->appDataBuffered)) { 3118 PORT_SetError(PR_INVALID_ARGUMENT_ERROR); 3119 return SECFailure; 3120 } 3121 in++; 3122 len--; 3123 discarded = 1; 3124 } 3125 while (len > totalSent) { 3126 PRInt32 sent, toSend; 3127 3128 if (totalSent > 0) { 3129 /* 3130 * The thread yield is intended to give the reader thread a 3131 * chance to get some cycles while the writer thread is in 3132 * the middle of a large application data write. (See 3133 * Bugzilla bug 127740, comment #1.) 3134 */ 3135 ssl_ReleaseXmitBufLock(ss); 3136 PR_Sleep(PR_INTERVAL_NO_WAIT); /* PR_Yield(); */ 3137 ssl_GetXmitBufLock(ss); 3138 } 3139 toSend = PR_MIN(len - totalSent, MAX_FRAGMENT_LENGTH); 3140 /* 3141 * Note that the 0 epoch is OK because flags will never require 3142 * its use, as guaranteed by the PORT_Assert above. 3143 */ 3144 sent = ssl3_SendRecord(ss, 0, content_application_data, 3145 in + totalSent, toSend, flags); 3146 if (sent < 0) { 3147 if (totalSent > 0 && PR_GetError() == PR_WOULD_BLOCK_ERROR) { 3148 PORT_Assert(ss->lastWriteBlocked); 3149 break; 3150 } 3151 return SECFailure; /* error code set by ssl3_SendRecord */ 3152 } 3153 totalSent += sent; 3154 if (ss->pendingBuf.len) { 3155 /* must be a non-blocking socket */ 3156 PORT_Assert(!ssl_SocketIsBlocking(ss)); 3157 PORT_Assert(ss->lastWriteBlocked); 3158 break; 3159 } 3160 } 3161 if (ss->pendingBuf.len) { 3162 /* Must be non-blocking. */ 3163 PORT_Assert(!ssl_SocketIsBlocking(ss)); 3164 if (totalSent > 0) { 3165 ss->appDataBuffered = 0x100 | in[totalSent - 1]; 3166 } 3167 3168 totalSent = totalSent + discarded - 1; 3169 if (totalSent <= 0) { 3170 PORT_SetError(PR_WOULD_BLOCK_ERROR); 3171 totalSent = SECFailure; 3172 } 3173 return totalSent; 3174 } 3175 ss->appDataBuffered = 0; 3176 return totalSent + discarded; 3177 } 3178 3179 /* Attempt to send buffered handshake messages. 3180 * This function returns SECSuccess or SECFailure, never SECWouldBlock. 3181 * Always set sendBuf.len to 0, even when returning SECFailure. 3182 * 3183 * Depending on whether we are doing DTLS or not, this either calls 3184 * 3185 * - ssl3_FlushHandshakeMessages if non-DTLS 3186 * - dtls_FlushHandshakeMessages if DTLS 3187 * 3188 * Called from SSL3_SendAlert(), ssl3_SendChangeCipherSpecs(), 3189 * ssl3_AppendHandshake(), ssl3_SendClientHello(), 3190 * ssl3_SendHelloRequest(), ssl3_SendServerHelloDone(), 3191 * ssl3_SendFinished(), 3192 */ 3193 static SECStatus 3194 ssl3_FlushHandshake(sslSocket *ss, PRInt32 flags) 3195 { 3196 if (IS_DTLS(ss)) { 3197 return dtls_FlushHandshakeMessages(ss, flags); 3198 } else { 3199 return ssl3_FlushHandshakeMessages(ss, flags); 3200 } 3201 } 3202 3203 /* Attempt to send the content of sendBuf buffer in an SSL handshake record. 3204 * This function returns SECSuccess or SECFailure, never SECWouldBlock. 3205 * Always set sendBuf.len to 0, even when returning SECFailure. 3206 * 3207 * Called from ssl3_FlushHandshake 3208 */ 3209 static SECStatus 3210 ssl3_FlushHandshakeMessages(sslSocket *ss, PRInt32 flags) 3211 { 3212 static const PRInt32 allowedFlags = ssl_SEND_FLAG_FORCE_INTO_BUFFER | 3213 ssl_SEND_FLAG_CAP_RECORD_VERSION; 3214 PRInt32 rv = SECSuccess; 3215 3216 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 3217 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss) ); 3218 3219 if (!ss->sec.ci.sendBuf.buf || !ss->sec.ci.sendBuf.len) 3220 return rv; 3221 3222 /* only these flags are allowed */ 3223 PORT_Assert(!(flags & ~allowedFlags)); 3224 if ((flags & ~allowedFlags) != 0) { 3225 PORT_SetError(SEC_ERROR_INVALID_ARGS); 3226 rv = SECFailure; 3227 } else { 3228 rv = ssl3_SendRecord(ss, 0, content_handshake, ss->sec.ci.sendBuf.buf, 3229 ss->sec.ci.sendBuf.len, flags); 3230 } 3231 if (rv < 0) { 3232 int err = PORT_GetError(); 3233 PORT_Assert(err != PR_WOULD_BLOCK_ERROR); 3234 if (err == PR_WOULD_BLOCK_ERROR) { 3235 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 3236 } 3237 } else if (rv < ss->sec.ci.sendBuf.len) { 3238 /* short write should never happen */ 3239 PORT_Assert(rv >= ss->sec.ci.sendBuf.len); 3240 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 3241 rv = SECFailure; 3242 } else { 3243 rv = SECSuccess; 3244 } 3245 3246 /* Whether we succeeded or failed, toss the old handshake data. */ 3247 ss->sec.ci.sendBuf.len = 0; 3248 return rv; 3249 } 3250 3251 /* 3252 * Called from ssl3_HandleAlert and from ssl3_HandleCertificate when 3253 * the remote client sends a negative response to our certificate request. 3254 * Returns SECFailure if the application has required client auth. 3255 * SECSuccess otherwise. 3256 */ 3257 static SECStatus 3258 ssl3_HandleNoCertificate(sslSocket *ss) 3259 { 3260 if (ss->sec.peerCert != NULL) { 3261 if (ss->sec.peerKey != NULL) { 3262 SECKEY_DestroyPublicKey(ss->sec.peerKey); 3263 ss->sec.peerKey = NULL; 3264 } 3265 CERT_DestroyCertificate(ss->sec.peerCert); 3266 ss->sec.peerCert = NULL; 3267 } 3268 ssl3_CleanupPeerCerts(ss); 3269 3270 /* If the server has required client-auth blindly but doesn't 3271 * actually look at the certificate it won't know that no 3272 * certificate was presented so we shutdown the socket to ensure 3273 * an error. We only do this if we haven't already completed the 3274 * first handshake because if we're redoing the handshake we 3275 * know the server is paying attention to the certificate. 3276 */ 3277 if ((ss->opt.requireCertificate == SSL_REQUIRE_ALWAYS) || 3278 (!ss->firstHsDone && 3279 (ss->opt.requireCertificate == SSL_REQUIRE_FIRST_HANDSHAKE))) { 3280 PRFileDesc * lower; 3281 3282 if (ss->sec.uncache) 3283 ss->sec.uncache(ss->sec.ci.sid); 3284 SSL3_SendAlert(ss, alert_fatal, bad_certificate); 3285 3286 lower = ss->fd->lower; 3287 #ifdef _WIN32 3288 lower->methods->shutdown(lower, PR_SHUTDOWN_SEND); 3289 #else 3290 lower->methods->shutdown(lower, PR_SHUTDOWN_BOTH); 3291 #endif 3292 PORT_SetError(SSL_ERROR_NO_CERTIFICATE); 3293 return SECFailure; 3294 } 3295 return SECSuccess; 3296 } 3297 3298 /************************************************************************ 3299 * Alerts 3300 */ 3301 3302 /* 3303 ** Acquires both handshake and XmitBuf locks. 3304 ** Called from: ssl3_IllegalParameter <- 3305 ** ssl3_HandshakeFailure <- 3306 ** ssl3_HandleAlert <- ssl3_HandleRecord. 3307 ** ssl3_HandleChangeCipherSpecs <- ssl3_HandleRecord 3308 ** ssl3_ConsumeHandshakeVariable <- 3309 ** ssl3_HandleHelloRequest <- 3310 ** ssl3_HandleServerHello <- 3311 ** ssl3_HandleServerKeyExchange <- 3312 ** ssl3_HandleCertificateRequest <- 3313 ** ssl3_HandleServerHelloDone <- 3314 ** ssl3_HandleClientHello <- 3315 ** ssl3_HandleV2ClientHello <- 3316 ** ssl3_HandleCertificateVerify <- 3317 ** ssl3_HandleClientKeyExchange <- 3318 ** ssl3_HandleCertificate <- 3319 ** ssl3_HandleFinished <- 3320 ** ssl3_HandleHandshakeMessage <- 3321 ** ssl3_HandleRecord <- 3322 ** 3323 */ 3324 SECStatus 3325 SSL3_SendAlert(sslSocket *ss, SSL3AlertLevel level, SSL3AlertDescription desc) 3326 { 3327 PRUint8 bytes[2]; 3328 SECStatus rv; 3329 3330 SSL_TRC(3, ("%d: SSL3[%d]: send alert record, level=%d desc=%d", 3331 SSL_GETPID(), ss->fd, level, desc)); 3332 3333 bytes[0] = level; 3334 bytes[1] = desc; 3335 3336 ssl_GetSSL3HandshakeLock(ss); 3337 if (level == alert_fatal) { 3338 if (!ss->opt.noCache && ss->sec.ci.sid && ss->sec.uncache) { 3339 ss->sec.uncache(ss->sec.ci.sid); 3340 } 3341 } 3342 ssl_GetXmitBufLock(ss); 3343 rv = ssl3_FlushHandshake(ss, ssl_SEND_FLAG_FORCE_INTO_BUFFER); 3344 if (rv == SECSuccess) { 3345 PRInt32 sent; 3346 sent = ssl3_SendRecord(ss, 0, content_alert, bytes, 2, 3347 desc == no_certificate 3348 ? ssl_SEND_FLAG_FORCE_INTO_BUFFER : 0); 3349 rv = (sent >= 0) ? SECSuccess : (SECStatus)sent; 3350 } 3351 ssl_ReleaseXmitBufLock(ss); 3352 ssl_ReleaseSSL3HandshakeLock(ss); 3353 return rv; /* error set by ssl3_FlushHandshake or ssl3_SendRecord */ 3354 } 3355 3356 /* 3357 * Send illegal_parameter alert. Set generic error number. 3358 */ 3359 static SECStatus 3360 ssl3_IllegalParameter(sslSocket *ss) 3361 { 3362 (void)SSL3_SendAlert(ss, alert_fatal, illegal_parameter); 3363 PORT_SetError(ss->sec.isServer ? SSL_ERROR_BAD_CLIENT 3364 : SSL_ERROR_BAD_SERVER ); 3365 return SECFailure; 3366 } 3367 3368 /* 3369 * Send handshake_Failure alert. Set generic error number. 3370 */ 3371 static SECStatus 3372 ssl3_HandshakeFailure(sslSocket *ss) 3373 { 3374 (void)SSL3_SendAlert(ss, alert_fatal, handshake_failure); 3375 PORT_SetError( ss->sec.isServer ? SSL_ERROR_BAD_CLIENT 3376 : SSL_ERROR_BAD_SERVER ); 3377 return SECFailure; 3378 } 3379 3380 static void 3381 ssl3_SendAlertForCertError(sslSocket * ss, PRErrorCode errCode) 3382 { 3383 SSL3AlertDescription desc = bad_certificate; 3384 PRBool isTLS = ss->version >= SSL_LIBRARY_VERSION_3_1_TLS; 3385 3386 switch (errCode) { 3387 case SEC_ERROR_LIBRARY_FAILURE: desc = unsupported_certificate; break; 3388 case SEC_ERROR_EXPIRED_CERTIFICATE: desc = certificate_expired; break; 3389 case SEC_ERROR_REVOKED_CERTIFICATE: desc = certificate_revoked; break; 3390 case SEC_ERROR_INADEQUATE_KEY_USAGE: 3391 case SEC_ERROR_INADEQUATE_CERT_TYPE: 3392 desc = certificate_unknown; break; 3393 case SEC_ERROR_UNTRUSTED_CERT: 3394 desc = isTLS ? access_denied : certificate_unknown; break; 3395 case SEC_ERROR_UNKNOWN_ISSUER: 3396 case SEC_ERROR_UNTRUSTED_ISSUER: 3397 desc = isTLS ? unknown_ca : certificate_unknown; break; 3398 case SEC_ERROR_EXPIRED_ISSUER_CERTIFICATE: 3399 desc = isTLS ? unknown_ca : certificate_expired; break; 3400 3401 case SEC_ERROR_CERT_NOT_IN_NAME_SPACE: 3402 case SEC_ERROR_PATH_LEN_CONSTRAINT_INVALID: 3403 case SEC_ERROR_CA_CERT_INVALID: 3404 case SEC_ERROR_BAD_SIGNATURE: 3405 default: desc = bad_certificate; break; 3406 } 3407 SSL_DBG(("%d: SSL3[%d]: peer certificate is no good: error=%d", 3408 SSL_GETPID(), ss->fd, errCode)); 3409 3410 (void) SSL3_SendAlert(ss, alert_fatal, desc); 3411 } 3412 3413 3414 /* 3415 * Send decode_error alert. Set generic error number. 3416 */ 3417 SECStatus 3418 ssl3_DecodeError(sslSocket *ss) 3419 { 3420 (void)SSL3_SendAlert(ss, alert_fatal, 3421 ss->version > SSL_LIBRARY_VERSION_3_0 ? decode_error 3422 : illegal_parameter); 3423 PORT_SetError( ss->sec.isServer ? SSL_ERROR_BAD_CLIENT 3424 : SSL_ERROR_BAD_SERVER ); 3425 return SECFailure; 3426 } 3427 3428 /* Called from ssl3_HandleRecord. 3429 ** Caller must hold both RecvBuf and Handshake locks. 3430 */ 3431 static SECStatus 3432 ssl3_HandleAlert(sslSocket *ss, sslBuffer *buf) 3433 { 3434 SSL3AlertLevel level; 3435 SSL3AlertDescription desc; 3436 int error; 3437 3438 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 3439 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 3440 3441 SSL_TRC(3, ("%d: SSL3[%d]: handle alert record", SSL_GETPID(), ss->fd)); 3442 3443 if (buf->len != 2) { 3444 (void)ssl3_DecodeError(ss); 3445 PORT_SetError(SSL_ERROR_RX_MALFORMED_ALERT); 3446 return SECFailure; 3447 } 3448 level = (SSL3AlertLevel)buf->buf[0]; 3449 desc = (SSL3AlertDescription)buf->buf[1]; 3450 buf->len = 0; 3451 SSL_TRC(5, ("%d: SSL3[%d] received alert, level = %d, description = %d", 3452 SSL_GETPID(), ss->fd, level, desc)); 3453 3454 switch (desc) { 3455 case close_notify: ss->recvdCloseNotify = 1; 3456 error = SSL_ERROR_CLOSE_NOTIFY_ALERT; break; 3457 case unexpected_message: error = SSL_ERROR_HANDSHAKE_UNEXPECTED_ALERT; 3458 break; 3459 case bad_record_mac: error = SSL_ERROR_BAD_MAC_ALERT; break; 3460 case decryption_failed_RESERVED: 3461 error = SSL_ERROR_DECRYPTION_FAILED_ALERT; 3462 break; 3463 case record_overflow: error = SSL_ERROR_RECORD_OVERFLOW_ALERT; break; 3464 case decompression_failure: error = SSL_ERROR_DECOMPRESSION_FAILURE_ALERT; 3465 break; 3466 case handshake_failure: error = SSL_ERROR_HANDSHAKE_FAILURE_ALERT; 3467 break; 3468 case no_certificate: error = SSL_ERROR_NO_CERTIFICATE; break; 3469 case bad_certificate: error = SSL_ERROR_BAD_CERT_ALERT; break; 3470 case unsupported_certificate:error = SSL_ERROR_UNSUPPORTED_CERT_ALERT;break; 3471 case certificate_revoked: error = SSL_ERROR_REVOKED_CERT_ALERT; break; 3472 case certificate_expired: error = SSL_ERROR_EXPIRED_CERT_ALERT; break; 3473 case certificate_unknown: error = SSL_ERROR_CERTIFICATE_UNKNOWN_ALERT; 3474 break; 3475 case illegal_parameter: error = SSL_ERROR_ILLEGAL_PARAMETER_ALERT;break; 3476 case inappropriate_fallback: 3477 error = SSL_ERROR_INAPPROPRIATE_FALLBACK_ALERT; 3478 break; 3479 3480 /* All alerts below are TLS only. */ 3481 case unknown_ca: error = SSL_ERROR_UNKNOWN_CA_ALERT; break; 3482 case access_denied: error = SSL_ERROR_ACCESS_DENIED_ALERT; break; 3483 case decode_error: error = SSL_ERROR_DECODE_ERROR_ALERT; break; 3484 case decrypt_error: error = SSL_ERROR_DECRYPT_ERROR_ALERT; break; 3485 case export_restriction: error = SSL_ERROR_EXPORT_RESTRICTION_ALERT; 3486 break; 3487 case protocol_version: error = SSL_ERROR_PROTOCOL_VERSION_ALERT; break; 3488 case insufficient_security: error = SSL_ERROR_INSUFFICIENT_SECURITY_ALERT; 3489 break; 3490 case internal_error: error = SSL_ERROR_INTERNAL_ERROR_ALERT; break; 3491 case user_canceled: error = SSL_ERROR_USER_CANCELED_ALERT; break; 3492 case no_renegotiation: error = SSL_ERROR_NO_RENEGOTIATION_ALERT; break; 3493 3494 /* Alerts for TLS client hello extensions */ 3495 case unsupported_extension: 3496 error = SSL_ERROR_UNSUPPORTED_EXTENSION_ALERT; break; 3497 case certificate_unobtainable: 3498 error = SSL_ERROR_CERTIFICATE_UNOBTAINABLE_ALERT; break; 3499 case unrecognized_name: 3500 error = SSL_ERROR_UNRECOGNIZED_NAME_ALERT; break; 3501 case bad_certificate_status_response: 3502 error = SSL_ERROR_BAD_CERT_STATUS_RESPONSE_ALERT; break; 3503 case bad_certificate_hash_value: 3504 error = SSL_ERROR_BAD_CERT_HASH_VALUE_ALERT; break; 3505 default: error = SSL_ERROR_RX_UNKNOWN_ALERT; break; 3506 } 3507 if (level == alert_fatal) { 3508 if (!ss->opt.noCache) { 3509 if (ss->sec.uncache) 3510 ss->sec.uncache(ss->sec.ci.sid); 3511 } 3512 if ((ss->ssl3.hs.ws == wait_server_hello) && 3513 (desc == handshake_failure)) { 3514 /* XXX This is a hack. We're assuming that any handshake failure 3515 * XXX on the client hello is a failure to match ciphers. 3516 */ 3517 error = SSL_ERROR_NO_CYPHER_OVERLAP; 3518 } 3519 PORT_SetError(error); 3520 return SECFailure; 3521 } 3522 if ((desc == no_certificate) && (ss->ssl3.hs.ws == wait_client_cert)) { 3523 /* I'm a server. I've requested a client cert. He hasn't got one. */ 3524 SECStatus rv; 3525 3526 PORT_Assert(ss->sec.isServer); 3527 ss->ssl3.hs.ws = wait_client_key; 3528 rv = ssl3_HandleNoCertificate(ss); 3529 return rv; 3530 } 3531 return SECSuccess; 3532 } 3533 3534 /* 3535 * Change Cipher Specs 3536 * Called from ssl3_HandleServerHelloDone, 3537 * ssl3_HandleClientHello, 3538 * and ssl3_HandleFinished 3539 * 3540 * Acquires and releases spec write lock, to protect switching the current 3541 * and pending write spec pointers. 3542 */ 3543 3544 static SECStatus 3545 ssl3_SendChangeCipherSpecs(sslSocket *ss) 3546 { 3547 PRUint8 change = change_cipher_spec_choice; 3548 ssl3CipherSpec * pwSpec; 3549 SECStatus rv; 3550 PRInt32 sent; 3551 3552 SSL_TRC(3, ("%d: SSL3[%d]: send change_cipher_spec record", 3553 SSL_GETPID(), ss->fd)); 3554 3555 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss) ); 3556 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 3557 3558 rv = ssl3_FlushHandshake(ss, ssl_SEND_FLAG_FORCE_INTO_BUFFER); 3559 if (rv != SECSuccess) { 3560 return rv; /* error code set by ssl3_FlushHandshake */ 3561 } 3562 if (!IS_DTLS(ss)) { 3563 sent = ssl3_SendRecord(ss, 0, content_change_cipher_spec, &change, 1, 3564 ssl_SEND_FLAG_FORCE_INTO_BUFFER); 3565 if (sent < 0) { 3566 return (SECStatus)sent; /* error code set by ssl3_SendRecord */ 3567 } 3568 } else { 3569 rv = dtls_QueueMessage(ss, content_change_cipher_spec, &change, 1); 3570 if (rv != SECSuccess) { 3571 return rv; 3572 } 3573 } 3574 3575 /* swap the pending and current write specs. */ 3576 ssl_GetSpecWriteLock(ss); /**************************************/ 3577 pwSpec = ss->ssl3.pwSpec; 3578 3579 ss->ssl3.pwSpec = ss->ssl3.cwSpec; 3580 ss->ssl3.cwSpec = pwSpec; 3581 3582 SSL_TRC(3, ("%d: SSL3[%d] Set Current Write Cipher Suite to Pending", 3583 SSL_GETPID(), ss->fd )); 3584 3585 /* We need to free up the contexts, keys and certs ! */ 3586 /* If we are really through with the old cipher spec 3587 * (Both the read and write sides have changed) destroy it. 3588 */ 3589 if (ss->ssl3.prSpec == ss->ssl3.pwSpec) { 3590 if (!IS_DTLS(ss)) { 3591 ssl3_DestroyCipherSpec(ss->ssl3.pwSpec, PR_FALSE/*freeSrvName*/); 3592 } else { 3593 /* With DTLS, we need to set a holddown timer in case the final 3594 * message got lost */ 3595 ss->ssl3.hs.rtTimeoutMs = DTLS_FINISHED_TIMER_MS; 3596 dtls_StartTimer(ss, dtls_FinishedTimerCb); 3597 } 3598 } 3599 ssl_ReleaseSpecWriteLock(ss); /**************************************/ 3600 3601 return SECSuccess; 3602 } 3603 3604 /* Called from ssl3_HandleRecord. 3605 ** Caller must hold both RecvBuf and Handshake locks. 3606 * 3607 * Acquires and releases spec write lock, to protect switching the current 3608 * and pending write spec pointers. 3609 */ 3610 static SECStatus 3611 ssl3_HandleChangeCipherSpecs(sslSocket *ss, sslBuffer *buf) 3612 { 3613 ssl3CipherSpec * prSpec; 3614 SSL3WaitState ws = ss->ssl3.hs.ws; 3615 SSL3ChangeCipherSpecChoice change; 3616 3617 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 3618 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 3619 3620 SSL_TRC(3, ("%d: SSL3[%d]: handle change_cipher_spec record", 3621 SSL_GETPID(), ss->fd)); 3622 3623 if (ws != wait_change_cipher) { 3624 if (IS_DTLS(ss)) { 3625 /* Ignore this because it's out of order. */ 3626 SSL_TRC(3, ("%d: SSL3[%d]: discard out of order " 3627 "DTLS change_cipher_spec", 3628 SSL_GETPID(), ss->fd)); 3629 buf->len = 0; 3630 return SECSuccess; 3631 } 3632 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); 3633 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CHANGE_CIPHER); 3634 return SECFailure; 3635 } 3636 3637 if(buf->len != 1) { 3638 (void)ssl3_DecodeError(ss); 3639 PORT_SetError(SSL_ERROR_RX_MALFORMED_CHANGE_CIPHER); 3640 return SECFailure; 3641 } 3642 change = (SSL3ChangeCipherSpecChoice)buf->buf[0]; 3643 if (change != change_cipher_spec_choice) { 3644 /* illegal_parameter is correct here for both SSL3 and TLS. */ 3645 (void)ssl3_IllegalParameter(ss); 3646 PORT_SetError(SSL_ERROR_RX_MALFORMED_CHANGE_CIPHER); 3647 return SECFailure; 3648 } 3649 buf->len = 0; 3650 3651 /* Swap the pending and current read specs. */ 3652 ssl_GetSpecWriteLock(ss); /*************************************/ 3653 prSpec = ss->ssl3.prSpec; 3654 3655 ss->ssl3.prSpec = ss->ssl3.crSpec; 3656 ss->ssl3.crSpec = prSpec; 3657 ss->ssl3.hs.ws = wait_finished; 3658 3659 SSL_TRC(3, ("%d: SSL3[%d] Set Current Read Cipher Suite to Pending", 3660 SSL_GETPID(), ss->fd )); 3661 3662 /* If we are really through with the old cipher prSpec 3663 * (Both the read and write sides have changed) destroy it. 3664 */ 3665 if (ss->ssl3.prSpec == ss->ssl3.pwSpec) { 3666 ssl3_DestroyCipherSpec(ss->ssl3.prSpec, PR_FALSE/*freeSrvName*/); 3667 } 3668 ssl_ReleaseSpecWriteLock(ss); /*************************************/ 3669 return SECSuccess; 3670 } 3671 3672 /* This method uses PKCS11 to derive the MS from the PMS, where PMS 3673 ** is a PKCS11 symkey. This is used in all cases except the 3674 ** "triple bypass" with RSA key exchange. 3675 ** Called from ssl3_InitPendingCipherSpec. prSpec is pwSpec. 3676 */ 3677 static SECStatus 3678 ssl3_DeriveMasterSecret(sslSocket *ss, PK11SymKey *pms) 3679 { 3680 ssl3CipherSpec * pwSpec = ss->ssl3.pwSpec; 3681 const ssl3KEADef *kea_def= ss->ssl3.hs.kea_def; 3682 unsigned char * cr = (unsigned char *)&ss->ssl3.hs.client_random; 3683 unsigned char * sr = (unsigned char *)&ss->ssl3.hs.server_random; 3684 PRBool isTLS = (PRBool)(kea_def->tls_keygen || 3685 (pwSpec->version > SSL_LIBRARY_VERSION_3_0)); 3686 PRBool isTLS12= 3687 (PRBool)(isTLS && pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); 3688 /* 3689 * Whenever isDH is true, we need to use CKM_TLS_MASTER_KEY_DERIVE_DH 3690 * which, unlike CKM_TLS_MASTER_KEY_DERIVE, converts arbitrary size 3691 * data into a 48-byte value. 3692 */ 3693 PRBool isDH = (PRBool) ((ss->ssl3.hs.kea_def->exchKeyType == kt_dh) || 3694 (ss->ssl3.hs.kea_def->exchKeyType == kt_ecdh)); 3695 SECStatus rv = SECFailure; 3696 CK_MECHANISM_TYPE master_derive; 3697 CK_MECHANISM_TYPE key_derive; 3698 SECItem params; 3699 CK_FLAGS keyFlags; 3700 CK_VERSION pms_version; 3701 CK_SSL3_MASTER_KEY_DERIVE_PARAMS master_params; 3702 3703 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 3704 PORT_Assert( ss->opt.noLocks || ssl_HaveSpecWriteLock(ss)); 3705 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); 3706 if (isTLS12) { 3707 if(isDH) master_derive = CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256; 3708 else master_derive = CKM_NSS_TLS_MASTER_KEY_DERIVE_SHA256; 3709 key_derive = CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256; 3710 keyFlags = CKF_SIGN | CKF_VERIFY; 3711 } else if (isTLS) { 3712 if(isDH) master_derive = CKM_TLS_MASTER_KEY_DERIVE_DH; 3713 else master_derive = CKM_TLS_MASTER_KEY_DERIVE; 3714 key_derive = CKM_TLS_KEY_AND_MAC_DERIVE; 3715 keyFlags = CKF_SIGN | CKF_VERIFY; 3716 } else { 3717 if (isDH) master_derive = CKM_SSL3_MASTER_KEY_DERIVE_DH; 3718 else master_derive = CKM_SSL3_MASTER_KEY_DERIVE; 3719 key_derive = CKM_SSL3_KEY_AND_MAC_DERIVE; 3720 keyFlags = 0; 3721 } 3722 3723 if (pms || !pwSpec->master_secret) { 3724 if (isDH) { 3725 master_params.pVersion = NULL; 3726 } else { 3727 master_params.pVersion = &pms_version; 3728 } 3729 master_params.RandomInfo.pClientRandom = cr; 3730 master_params.RandomInfo.ulClientRandomLen = SSL3_RANDOM_LENGTH; 3731 master_params.RandomInfo.pServerRandom = sr; 3732 master_params.RandomInfo.ulServerRandomLen = SSL3_RANDOM_LENGTH; 3733 3734 params.data = (unsigned char *) &master_params; 3735 params.len = sizeof master_params; 3736 } 3737 3738 if (pms != NULL) { 3739 #if defined(TRACE) 3740 if (ssl_trace >= 100) { 3741 SECStatus extractRV = PK11_ExtractKeyValue(pms); 3742 if (extractRV == SECSuccess) { 3743 SECItem * keyData = PK11_GetKeyData(pms); 3744 if (keyData && keyData->data && keyData->len) { 3745 ssl_PrintBuf(ss, "Pre-Master Secret", 3746 keyData->data, keyData->len); 3747 } 3748 } 3749 } 3750 #endif 3751 pwSpec->master_secret = PK11_DeriveWithFlags(pms, master_derive, 3752 ¶ms, key_derive, CKA_DERIVE, 0, keyFlags); 3753 if (!isDH && pwSpec->master_secret && ss->opt.detectRollBack) { 3754 SSL3ProtocolVersion client_version; 3755 client_version = pms_version.major << 8 | pms_version.minor; 3756 3757 if (IS_DTLS(ss)) { 3758 client_version = dtls_DTLSVersionToTLSVersion(client_version); 3759 } 3760 3761 if (client_version != ss->clientHelloVersion) { 3762 /* Destroy it. Version roll-back detected. */ 3763 PK11_FreeSymKey(pwSpec->master_secret); 3764 pwSpec->master_secret = NULL; 3765 } 3766 } 3767 if (pwSpec->master_secret == NULL) { 3768 /* Generate a faux master secret in the same slot as the old one. */ 3769 PK11SlotInfo * slot = PK11_GetSlotFromKey((PK11SymKey *)pms); 3770 PK11SymKey * fpms = ssl3_GenerateRSAPMS(ss, pwSpec, slot); 3771 3772 PK11_FreeSlot(slot); 3773 if (fpms != NULL) { 3774 pwSpec->master_secret = PK11_DeriveWithFlags(fpms, 3775 master_derive, ¶ms, key_derive, 3776 CKA_DERIVE, 0, keyFlags); 3777 PK11_FreeSymKey(fpms); 3778 } 3779 } 3780 } 3781 if (pwSpec->master_secret == NULL) { 3782 /* Generate a faux master secret from the internal slot. */ 3783 PK11SlotInfo * slot = PK11_GetInternalSlot(); 3784 PK11SymKey * fpms = ssl3_GenerateRSAPMS(ss, pwSpec, slot); 3785 3786 PK11_FreeSlot(slot); 3787 if (fpms != NULL) { 3788 pwSpec->master_secret = PK11_DeriveWithFlags(fpms, 3789 master_derive, ¶ms, key_derive, 3790 CKA_DERIVE, 0, keyFlags); 3791 if (pwSpec->master_secret == NULL) { 3792 pwSpec->master_secret = fpms; /* use the fpms as the master. */ 3793 fpms = NULL; 3794 } 3795 } 3796 if (fpms) { 3797 PK11_FreeSymKey(fpms); 3798 } 3799 } 3800 if (pwSpec->master_secret == NULL) { 3801 ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE); 3802 return rv; 3803 } 3804 #ifndef NO_PKCS11_BYPASS 3805 if (ss->opt.bypassPKCS11) { 3806 SECItem * keydata; 3807 /* In hope of doing a "double bypass", 3808 * need to extract the master secret's value from the key object 3809 * and store it raw in the sslSocket struct. 3810 */ 3811 rv = PK11_ExtractKeyValue(pwSpec->master_secret); 3812 if (rv != SECSuccess) { 3813 return rv; 3814 } 3815 /* This returns the address of the secItem inside the key struct, 3816 * not a copy or a reference. So, there's no need to free it. 3817 */ 3818 keydata = PK11_GetKeyData(pwSpec->master_secret); 3819 if (keydata && keydata->len <= sizeof pwSpec->raw_master_secret) { 3820 memcpy(pwSpec->raw_master_secret, keydata->data, keydata->len); 3821 pwSpec->msItem.data = pwSpec->raw_master_secret; 3822 pwSpec->msItem.len = keydata->len; 3823 } else { 3824 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 3825 return SECFailure; 3826 } 3827 } 3828 #endif 3829 return SECSuccess; 3830 } 3831 3832 3833 /* 3834 * Derive encryption and MAC Keys (and IVs) from master secret 3835 * Sets a useful error code when returning SECFailure. 3836 * 3837 * Called only from ssl3_InitPendingCipherSpec(), 3838 * which in turn is called from 3839 * sendRSAClientKeyExchange (for Full handshake) 3840 * sendDHClientKeyExchange (for Full handshake) 3841 * ssl3_HandleClientKeyExchange (for Full handshake) 3842 * ssl3_HandleServerHello (for session restart) 3843 * ssl3_HandleClientHello (for session restart) 3844 * Caller MUST hold the specWriteLock, and SSL3HandshakeLock. 3845 * ssl3_InitPendingCipherSpec does that. 3846 * 3847 */ 3848 static SECStatus 3849 ssl3_DeriveConnectionKeysPKCS11(sslSocket *ss) 3850 { 3851 ssl3CipherSpec * pwSpec = ss->ssl3.pwSpec; 3852 const ssl3KEADef * kea_def = ss->ssl3.hs.kea_def; 3853 unsigned char * cr = (unsigned char *)&ss->ssl3.hs.client_random; 3854 unsigned char * sr = (unsigned char *)&ss->ssl3.hs.server_random; 3855 PRBool isTLS = (PRBool)(kea_def->tls_keygen || 3856 (pwSpec->version > SSL_LIBRARY_VERSION_3_0)); 3857 PRBool isTLS12= 3858 (PRBool)(isTLS && pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); 3859 /* following variables used in PKCS11 path */ 3860 const ssl3BulkCipherDef *cipher_def = pwSpec->cipher_def; 3861 PK11SlotInfo * slot = NULL; 3862 PK11SymKey * symKey = NULL; 3863 void * pwArg = ss->pkcs11PinArg; 3864 int keySize; 3865 CK_SSL3_KEY_MAT_PARAMS key_material_params; 3866 CK_SSL3_KEY_MAT_OUT returnedKeys; 3867 CK_MECHANISM_TYPE key_derive; 3868 CK_MECHANISM_TYPE bulk_mechanism; 3869 SSLCipherAlgorithm calg; 3870 SECItem params; 3871 PRBool skipKeysAndIVs = (PRBool)(cipher_def->calg == calg_null); 3872 3873 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 3874 PORT_Assert( ss->opt.noLocks || ssl_HaveSpecWriteLock(ss)); 3875 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); 3876 3877 if (!pwSpec->master_secret) { 3878 PORT_SetError(SSL_ERROR_SESSION_KEY_GEN_FAILURE); 3879 return SECFailure; 3880 } 3881 /* 3882 * generate the key material 3883 */ 3884 key_material_params.ulMacSizeInBits = pwSpec->mac_size * BPB; 3885 key_material_params.ulKeySizeInBits = cipher_def->secret_key_size* BPB; 3886 key_material_params.ulIVSizeInBits = cipher_def->iv_size * BPB; 3887 if (cipher_def->type == type_block && 3888 pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_1) { 3889 /* Block ciphers in >= TLS 1.1 use a per-record, explicit IV. */ 3890 key_material_params.ulIVSizeInBits = 0; 3891 memset(pwSpec->client.write_iv, 0, cipher_def->iv_size); 3892 memset(pwSpec->server.write_iv, 0, cipher_def->iv_size); 3893 } 3894 3895 key_material_params.bIsExport = (CK_BBOOL)(kea_def->is_limited); 3896 3897 key_material_params.RandomInfo.pClientRandom = cr; 3898 key_material_params.RandomInfo.ulClientRandomLen = SSL3_RANDOM_LENGTH; 3899 key_material_params.RandomInfo.pServerRandom = sr; 3900 key_material_params.RandomInfo.ulServerRandomLen = SSL3_RANDOM_LENGTH; 3901 key_material_params.pReturnedKeyMaterial = &returnedKeys; 3902 3903 returnedKeys.pIVClient = pwSpec->client.write_iv; 3904 returnedKeys.pIVServer = pwSpec->server.write_iv; 3905 keySize = cipher_def->key_size; 3906 3907 if (skipKeysAndIVs) { 3908 keySize = 0; 3909 key_material_params.ulKeySizeInBits = 0; 3910 key_material_params.ulIVSizeInBits = 0; 3911 returnedKeys.pIVClient = NULL; 3912 returnedKeys.pIVServer = NULL; 3913 } 3914 3915 calg = cipher_def->calg; 3916 PORT_Assert( alg2Mech[calg].calg == calg); 3917 bulk_mechanism = alg2Mech[calg].cmech; 3918 3919 params.data = (unsigned char *)&key_material_params; 3920 params.len = sizeof(key_material_params); 3921 3922 if (isTLS12) { 3923 key_derive = CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256; 3924 } else if (isTLS) { 3925 key_derive = CKM_TLS_KEY_AND_MAC_DERIVE; 3926 } else { 3927 key_derive = CKM_SSL3_KEY_AND_MAC_DERIVE; 3928 } 3929 3930 /* CKM_SSL3_KEY_AND_MAC_DERIVE is defined to set ENCRYPT, DECRYPT, and 3931 * DERIVE by DEFAULT */ 3932 symKey = PK11_Derive(pwSpec->master_secret, key_derive, ¶ms, 3933 bulk_mechanism, CKA_ENCRYPT, keySize); 3934 if (!symKey) { 3935 ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE); 3936 return SECFailure; 3937 } 3938 /* we really should use the actual mac'ing mechanism here, but we 3939 * don't because these types are used to map keytype anyway and both 3940 * mac's map to the same keytype. 3941 */ 3942 slot = PK11_GetSlotFromKey(symKey); 3943 3944 PK11_FreeSlot(slot); /* slot is held until the key is freed */ 3945 pwSpec->client.write_mac_key = 3946 PK11_SymKeyFromHandle(slot, symKey, PK11_OriginDerive, 3947 CKM_SSL3_SHA1_MAC, returnedKeys.hClientMacSecret, PR_TRUE, pwArg); 3948 if (pwSpec->client.write_mac_key == NULL ) { 3949 goto loser; /* loser sets err */ 3950 } 3951 pwSpec->server.write_mac_key = 3952 PK11_SymKeyFromHandle(slot, symKey, PK11_OriginDerive, 3953 CKM_SSL3_SHA1_MAC, returnedKeys.hServerMacSecret, PR_TRUE, pwArg); 3954 if (pwSpec->server.write_mac_key == NULL ) { 3955 goto loser; /* loser sets err */ 3956 } 3957 if (!skipKeysAndIVs) { 3958 pwSpec->client.write_key = 3959 PK11_SymKeyFromHandle(slot, symKey, PK11_OriginDerive, 3960 bulk_mechanism, returnedKeys.hClientKey, PR_TRUE, pwArg); 3961 if (pwSpec->client.write_key == NULL ) { 3962 goto loser; /* loser sets err */ 3963 } 3964 pwSpec->server.write_key = 3965 PK11_SymKeyFromHandle(slot, symKey, PK11_OriginDerive, 3966 bulk_mechanism, returnedKeys.hServerKey, PR_TRUE, pwArg); 3967 if (pwSpec->server.write_key == NULL ) { 3968 goto loser; /* loser sets err */ 3969 } 3970 } 3971 PK11_FreeSymKey(symKey); 3972 return SECSuccess; 3973 3974 3975 loser: 3976 if (symKey) PK11_FreeSymKey(symKey); 3977 ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE); 3978 return SECFailure; 3979 } 3980 3981 /* ssl3_InitHandshakeHashes creates handshake hash contexts and hashes in 3982 * buffered messages in ss->ssl3.hs.messages. */ 3983 static SECStatus 3984 ssl3_InitHandshakeHashes(sslSocket *ss) 3985 { 3986 SSL_TRC(30,("%d: SSL3[%d]: start handshake hashes", SSL_GETPID(), ss->fd)); 3987 3988 PORT_Assert(ss->ssl3.hs.hashType == handshake_hash_unknown); 3989 #ifndef NO_PKCS11_BYPASS 3990 if (ss->opt.bypassPKCS11) { 3991 PORT_Assert(!ss->ssl3.hs.sha_obj && !ss->ssl3.hs.sha_clone); 3992 if (ss->version >= SSL_LIBRARY_VERSION_TLS_1_2) { 3993 /* If we ever support ciphersuites where the PRF hash isn't SHA-256 3994 * then this will need to be updated. */ 3995 ss->ssl3.hs.sha_obj = HASH_GetRawHashObject(HASH_AlgSHA256); 3996 if (!ss->ssl3.hs.sha_obj) { 3997 ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); 3998 return SECFailure; 3999 } 4000 ss->ssl3.hs.sha_clone = (void (*)(void *, void *))SHA256_Clone; 4001 ss->ssl3.hs.hashType = handshake_hash_single; 4002 ss->ssl3.hs.sha_obj->begin(ss->ssl3.hs.sha_cx); 4003 } else { 4004 ss->ssl3.hs.hashType = handshake_hash_combo; 4005 MD5_Begin((MD5Context *)ss->ssl3.hs.md5_cx); 4006 SHA1_Begin((SHA1Context *)ss->ssl3.hs.sha_cx); 4007 } 4008 } else 4009 #endif 4010 { 4011 PORT_Assert(!ss->ssl3.hs.md5 && !ss->ssl3.hs.sha); 4012 /* 4013 * note: We should probably lookup an SSL3 slot for these 4014 * handshake hashes in hopes that we wind up with the same slots 4015 * that the master secret will wind up in ... 4016 */ 4017 if (ss->version >= SSL_LIBRARY_VERSION_TLS_1_2) { 4018 /* If we ever support ciphersuites where the PRF hash isn't SHA-256 4019 * then this will need to be updated. */ 4020 ss->ssl3.hs.sha = PK11_CreateDigestContext(SEC_OID_SHA256); 4021 if (ss->ssl3.hs.sha == NULL) { 4022 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); 4023 return SECFailure; 4024 } 4025 ss->ssl3.hs.hashType = handshake_hash_single; 4026 4027 if (PK11_DigestBegin(ss->ssl3.hs.sha) != SECSuccess) { 4028 ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); 4029 return SECFailure; 4030 } 4031 4032 /* Create a backup SHA-1 hash for a potential client auth 4033 * signature. 4034 * 4035 * In TLS 1.2, ssl3_ComputeHandshakeHashes always uses the 4036 * handshake hash function (SHA-256). If the server or the client 4037 * does not support SHA-256 as a signature hash, we can either 4038 * maintain a backup SHA-1 handshake hash or buffer all handshake 4039 * messages. 4040 */ 4041 if (!ss->sec.isServer) { 4042 ss->ssl3.hs.backupHash = PK11_CreateDigestContext(SEC_OID_SHA1); 4043 if (ss->ssl3.hs.backupHash == NULL) { 4044 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); 4045 return SECFailure; 4046 } 4047 4048 if (PK11_DigestBegin(ss->ssl3.hs.backupHash) != SECSuccess) { 4049 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); 4050 return SECFailure; 4051 } 4052 } 4053 } else { 4054 /* Both ss->ssl3.hs.md5 and ss->ssl3.hs.sha should be NULL or 4055 * created successfully. */ 4056 ss->ssl3.hs.md5 = PK11_CreateDigestContext(SEC_OID_MD5); 4057 if (ss->ssl3.hs.md5 == NULL) { 4058 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); 4059 return SECFailure; 4060 } 4061 ss->ssl3.hs.sha = PK11_CreateDigestContext(SEC_OID_SHA1); 4062 if (ss->ssl3.hs.sha == NULL) { 4063 PK11_DestroyContext(ss->ssl3.hs.md5, PR_TRUE); 4064 ss->ssl3.hs.md5 = NULL; 4065 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); 4066 return SECFailure; 4067 } 4068 ss->ssl3.hs.hashType = handshake_hash_combo; 4069 4070 if (PK11_DigestBegin(ss->ssl3.hs.md5) != SECSuccess) { 4071 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); 4072 return SECFailure; 4073 } 4074 if (PK11_DigestBegin(ss->ssl3.hs.sha) != SECSuccess) { 4075 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); 4076 return SECFailure; 4077 } 4078 } 4079 } 4080 4081 if (ss->ssl3.hs.messages.len > 0) { 4082 if (ssl3_UpdateHandshakeHashes(ss, ss->ssl3.hs.messages.buf, 4083 ss->ssl3.hs.messages.len) != 4084 SECSuccess) { 4085 return SECFailure; 4086 } 4087 PORT_Free(ss->ssl3.hs.messages.buf); 4088 ss->ssl3.hs.messages.buf = NULL; 4089 ss->ssl3.hs.messages.len = 0; 4090 ss->ssl3.hs.messages.space = 0; 4091 } 4092 4093 return SECSuccess; 4094 } 4095 4096 static SECStatus 4097 ssl3_RestartHandshakeHashes(sslSocket *ss) 4098 { 4099 SECStatus rv = SECSuccess; 4100 4101 SSL_TRC(30,("%d: SSL3[%d]: reset handshake hashes", 4102 SSL_GETPID(), ss->fd )); 4103 ss->ssl3.hs.hashType = handshake_hash_unknown; 4104 ss->ssl3.hs.messages.len = 0; 4105 #ifndef NO_PKCS11_BYPASS 4106 ss->ssl3.hs.sha_obj = NULL; 4107 ss->ssl3.hs.sha_clone = NULL; 4108 #endif 4109 if (ss->ssl3.hs.md5) { 4110 PK11_DestroyContext(ss->ssl3.hs.md5,PR_TRUE); 4111 ss->ssl3.hs.md5 = NULL; 4112 } 4113 if (ss->ssl3.hs.sha) { 4114 PK11_DestroyContext(ss->ssl3.hs.sha,PR_TRUE); 4115 ss->ssl3.hs.sha = NULL; 4116 } 4117 return rv; 4118 } 4119 4120 /* 4121 * Handshake messages 4122 */ 4123 /* Called from ssl3_InitHandshakeHashes() 4124 ** ssl3_AppendHandshake() 4125 ** ssl3_StartHandshakeHash() 4126 ** ssl3_HandleV2ClientHello() 4127 ** ssl3_HandleHandshakeMessage() 4128 ** Caller must hold the ssl3Handshake lock. 4129 */ 4130 static SECStatus 4131 ssl3_UpdateHandshakeHashes(sslSocket *ss, const unsigned char *b, 4132 unsigned int l) 4133 { 4134 SECStatus rv = SECSuccess; 4135 4136 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 4137 4138 /* We need to buffer the handshake messages until we have established 4139 * which handshake hash function to use. */ 4140 if (ss->ssl3.hs.hashType == handshake_hash_unknown) { 4141 return sslBuffer_Append(&ss->ssl3.hs.messages, b, l); 4142 } 4143 4144 PRINT_BUF(90, (NULL, "handshake hash input:", b, l)); 4145 4146 #ifndef NO_PKCS11_BYPASS 4147 if (ss->opt.bypassPKCS11) { 4148 if (ss->ssl3.hs.hashType == handshake_hash_single) { 4149 ss->ssl3.hs.sha_obj->update(ss->ssl3.hs.sha_cx, b, l); 4150 } else { 4151 MD5_Update((MD5Context *)ss->ssl3.hs.md5_cx, b, l); 4152 SHA1_Update((SHA1Context *)ss->ssl3.hs.sha_cx, b, l); 4153 } 4154 return rv; 4155 } 4156 #endif 4157 if (ss->ssl3.hs.hashType == handshake_hash_single) { 4158 rv = PK11_DigestOp(ss->ssl3.hs.sha, b, l); 4159 if (rv != SECSuccess) { 4160 ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); 4161 return rv; 4162 } 4163 if (ss->ssl3.hs.backupHash) { 4164 rv = PK11_DigestOp(ss->ssl3.hs.backupHash, b, l); 4165 if (rv != SECSuccess) { 4166 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); 4167 return rv; 4168 } 4169 } 4170 } else { 4171 rv = PK11_DigestOp(ss->ssl3.hs.md5, b, l); 4172 if (rv != SECSuccess) { 4173 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); 4174 return rv; 4175 } 4176 rv = PK11_DigestOp(ss->ssl3.hs.sha, b, l); 4177 if (rv != SECSuccess) { 4178 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); 4179 return rv; 4180 } 4181 } 4182 return rv; 4183 } 4184 4185 /************************************************************************** 4186 * Append Handshake functions. 4187 * All these functions set appropriate error codes. 4188 * Most rely on ssl3_AppendHandshake to set the error code. 4189 **************************************************************************/ 4190 SECStatus 4191 ssl3_AppendHandshake(sslSocket *ss, const void *void_src, PRInt32 bytes) 4192 { 4193 unsigned char * src = (unsigned char *)void_src; 4194 int room = ss->sec.ci.sendBuf.space - ss->sec.ci.sendBuf.len; 4195 SECStatus rv; 4196 4197 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); /* protects sendBuf. */ 4198 4199 if (!bytes) 4200 return SECSuccess; 4201 if (ss->sec.ci.sendBuf.space < MAX_SEND_BUF_LENGTH && room < bytes) { 4202 rv = sslBuffer_Grow(&ss->sec.ci.sendBuf, PR_MAX(MIN_SEND_BUF_LENGTH, 4203 PR_MIN(MAX_SEND_BUF_LENGTH, ss->sec.ci.sendBuf.len + bytes))); 4204 if (rv != SECSuccess) 4205 return rv; /* sslBuffer_Grow has set a memory error code. */ 4206 room = ss->sec.ci.sendBuf.space - ss->sec.ci.sendBuf.len; 4207 } 4208 4209 PRINT_BUF(60, (ss, "Append to Handshake", (unsigned char*)void_src, bytes)); 4210 rv = ssl3_UpdateHandshakeHashes(ss, src, bytes); 4211 if (rv != SECSuccess) 4212 return rv; /* error code set by ssl3_UpdateHandshakeHashes */ 4213 4214 while (bytes > room) { 4215 if (room > 0) 4216 PORT_Memcpy(ss->sec.ci.sendBuf.buf + ss->sec.ci.sendBuf.len, src, 4217 room); 4218 ss->sec.ci.sendBuf.len += room; 4219 rv = ssl3_FlushHandshake(ss, ssl_SEND_FLAG_FORCE_INTO_BUFFER); 4220 if (rv != SECSuccess) { 4221 return rv; /* error code set by ssl3_FlushHandshake */ 4222 } 4223 bytes -= room; 4224 src += room; 4225 room = ss->sec.ci.sendBuf.space; 4226 PORT_Assert(ss->sec.ci.sendBuf.len == 0); 4227 } 4228 PORT_Memcpy(ss->sec.ci.sendBuf.buf + ss->sec.ci.sendBuf.len, src, bytes); 4229 ss->sec.ci.sendBuf.len += bytes; 4230 return SECSuccess; 4231 } 4232 4233 SECStatus 4234 ssl3_AppendHandshakeNumber(sslSocket *ss, PRInt32 num, PRInt32 lenSize) 4235 { 4236 SECStatus rv; 4237 PRUint8 b[4]; 4238 PRUint8 * p = b; 4239 4240 switch (lenSize) { 4241 case 4: 4242 *p++ = (num >> 24) & 0xff; 4243 case 3: 4244 *p++ = (num >> 16) & 0xff; 4245 case 2: 4246 *p++ = (num >> 8) & 0xff; 4247 case 1: 4248 *p = num & 0xff; 4249 } 4250 SSL_TRC(60, ("%d: number:", SSL_GETPID())); 4251 rv = ssl3_AppendHandshake(ss, &b[0], lenSize); 4252 return rv; /* error code set by AppendHandshake, if applicable. */ 4253 } 4254 4255 SECStatus 4256 ssl3_AppendHandshakeVariable( 4257 sslSocket *ss, const SSL3Opaque *src, PRInt32 bytes, PRInt32 lenSize) 4258 { 4259 SECStatus rv; 4260 4261 PORT_Assert((bytes < (1<<8) && lenSize == 1) || 4262 (bytes < (1L<<16) && lenSize == 2) || 4263 (bytes < (1L<<24) && lenSize == 3)); 4264 4265 SSL_TRC(60,("%d: append variable:", SSL_GETPID())); 4266 rv = ssl3_AppendHandshakeNumber(ss, bytes, lenSize); 4267 if (rv != SECSuccess) { 4268 return rv; /* error code set by AppendHandshake, if applicable. */ 4269 } 4270 SSL_TRC(60, ("data:")); 4271 rv = ssl3_AppendHandshake(ss, src, bytes); 4272 return rv; /* error code set by AppendHandshake, if applicable. */ 4273 } 4274 4275 SECStatus 4276 ssl3_AppendHandshakeHeader(sslSocket *ss, SSL3HandshakeType t, PRUint32 length) 4277 { 4278 SECStatus rv; 4279 4280 /* If we already have a message in place, we need to enqueue it. 4281 * This empties the buffer. This is a convenient place to call 4282 * dtls_StageHandshakeMessage to mark the message boundary. 4283 */ 4284 if (IS_DTLS(ss)) { 4285 rv = dtls_StageHandshakeMessage(ss); 4286 if (rv != SECSuccess) { 4287 return rv; 4288 } 4289 } 4290 4291 SSL_TRC(30,("%d: SSL3[%d]: append handshake header: type %s", 4292 SSL_GETPID(), ss->fd, ssl3_DecodeHandshakeType(t))); 4293 4294 rv = ssl3_AppendHandshakeNumber(ss, t, 1); 4295 if (rv != SECSuccess) { 4296 return rv; /* error code set by AppendHandshake, if applicable. */ 4297 } 4298 rv = ssl3_AppendHandshakeNumber(ss, length, 3); 4299 if (rv != SECSuccess) { 4300 return rv; /* error code set by AppendHandshake, if applicable. */ 4301 } 4302 4303 if (IS_DTLS(ss)) { 4304 /* Note that we make an unfragmented message here. We fragment in the 4305 * transmission code, if necessary */ 4306 rv = ssl3_AppendHandshakeNumber(ss, ss->ssl3.hs.sendMessageSeq, 2); 4307 if (rv != SECSuccess) { 4308 return rv; /* error code set by AppendHandshake, if applicable. */ 4309 } 4310 ss->ssl3.hs.sendMessageSeq++; 4311 4312 /* 0 is the fragment offset, because it's not fragmented yet */ 4313 rv = ssl3_AppendHandshakeNumber(ss, 0, 3); 4314 if (rv != SECSuccess) { 4315 return rv; /* error code set by AppendHandshake, if applicable. */ 4316 } 4317 4318 /* Fragment length -- set to the packet length because not fragmented */ 4319 rv = ssl3_AppendHandshakeNumber(ss, length, 3); 4320 if (rv != SECSuccess) { 4321 return rv; /* error code set by AppendHandshake, if applicable. */ 4322 } 4323 } 4324 4325 return rv; /* error code set by AppendHandshake, if applicable. */ 4326 } 4327 4328 /* ssl3_AppendSignatureAndHashAlgorithm appends the serialisation of 4329 * |sigAndHash| to the current handshake message. */ 4330 SECStatus 4331 ssl3_AppendSignatureAndHashAlgorithm( 4332 sslSocket *ss, const SSL3SignatureAndHashAlgorithm* sigAndHash) 4333 { 4334 unsigned char serialized[2]; 4335 4336 serialized[0] = ssl3_OIDToTLSHashAlgorithm(sigAndHash->hashAlg); 4337 if (serialized[0] == 0) { 4338 PORT_SetError(SSL_ERROR_UNSUPPORTED_HASH_ALGORITHM); 4339 return SECFailure; 4340 } 4341 4342 serialized[1] = sigAndHash->sigAlg; 4343 4344 return ssl3_AppendHandshake(ss, serialized, sizeof(serialized)); 4345 } 4346 4347 /************************************************************************** 4348 * Consume Handshake functions. 4349 * 4350 * All data used in these functions is protected by two locks, 4351 * the RecvBufLock and the SSL3HandshakeLock 4352 **************************************************************************/ 4353 4354 /* Read up the next "bytes" number of bytes from the (decrypted) input 4355 * stream "b" (which is *length bytes long). Copy them into buffer "v". 4356 * Reduces *length by bytes. Advances *b by bytes. 4357 * 4358 * If this function returns SECFailure, it has already sent an alert, 4359 * and has set a generic error code. The caller should probably 4360 * override the generic error code by setting another. 4361 */ 4362 SECStatus 4363 ssl3_ConsumeHandshake(sslSocket *ss, void *v, PRInt32 bytes, SSL3Opaque **b, 4364 PRUint32 *length) 4365 { 4366 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 4367 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 4368 4369 if ((PRUint32)bytes > *length) { 4370 return ssl3_DecodeError(ss); 4371 } 4372 PORT_Memcpy(v, *b, bytes); 4373 PRINT_BUF(60, (ss, "consume bytes:", *b, bytes)); 4374 *b += bytes; 4375 *length -= bytes; 4376 return SECSuccess; 4377 } 4378 4379 /* Read up the next "bytes" number of bytes from the (decrypted) input 4380 * stream "b" (which is *length bytes long), and interpret them as an 4381 * integer in network byte order. Returns the received value. 4382 * Reduces *length by bytes. Advances *b by bytes. 4383 * 4384 * Returns SECFailure (-1) on failure. 4385 * This value is indistinguishable from the equivalent received value. 4386 * Only positive numbers are to be received this way. 4387 * Thus, the largest value that may be sent this way is 0x7fffffff. 4388 * On error, an alert has been sent, and a generic error code has been set. 4389 */ 4390 PRInt32 4391 ssl3_ConsumeHandshakeNumber(sslSocket *ss, PRInt32 bytes, SSL3Opaque **b, 4392 PRUint32 *length) 4393 { 4394 PRUint8 *buf = *b; 4395 int i; 4396 PRInt32 num = 0; 4397 4398 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 4399 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 4400 PORT_Assert( bytes <= sizeof num); 4401 4402 if ((PRUint32)bytes > *length) { 4403 return ssl3_DecodeError(ss); 4404 } 4405 PRINT_BUF(60, (ss, "consume bytes:", *b, bytes)); 4406 4407 for (i = 0; i < bytes; i++) 4408 num = (num << 8) + buf[i]; 4409 *b += bytes; 4410 *length -= bytes; 4411 return num; 4412 } 4413 4414 /* Read in two values from the incoming decrypted byte stream "b", which is 4415 * *length bytes long. The first value is a number whose size is "bytes" 4416 * bytes long. The second value is a byte-string whose size is the value 4417 * of the first number received. The latter byte-string, and its length, 4418 * is returned in the SECItem i. 4419 * 4420 * Returns SECFailure (-1) on failure. 4421 * On error, an alert has been sent, and a generic error code has been set. 4422 * 4423 * RADICAL CHANGE for NSS 3.11. All callers of this function make copies 4424 * of the data returned in the SECItem *i, so making a copy of it here 4425 * is simply wasteful. So, This function now just sets SECItem *i to 4426 * point to the values in the buffer **b. 4427 */ 4428 SECStatus 4429 ssl3_ConsumeHandshakeVariable(sslSocket *ss, SECItem *i, PRInt32 bytes, 4430 SSL3Opaque **b, PRUint32 *length) 4431 { 4432 PRInt32 count; 4433 4434 PORT_Assert(bytes <= 3); 4435 i->len = 0; 4436 i->data = NULL; 4437 count = ssl3_ConsumeHandshakeNumber(ss, bytes, b, length); 4438 if (count < 0) { /* Can't test for SECSuccess here. */ 4439 return SECFailure; 4440 } 4441 if (count > 0) { 4442 if ((PRUint32)count > *length) { 4443 return ssl3_DecodeError(ss); 4444 } 4445 i->data = *b; 4446 i->len = count; 4447 *b += count; 4448 *length -= count; 4449 } 4450 return SECSuccess; 4451 } 4452 4453 /* tlsHashOIDMap contains the mapping between TLS hash identifiers and the 4454 * SECOidTag used internally by NSS. */ 4455 static const struct { 4456 int tlsHash; 4457 SECOidTag oid; 4458 } tlsHashOIDMap[] = { 4459 { tls_hash_md5, SEC_OID_MD5 }, 4460 { tls_hash_sha1, SEC_OID_SHA1 }, 4461 { tls_hash_sha224, SEC_OID_SHA224 }, 4462 { tls_hash_sha256, SEC_OID_SHA256 }, 4463 { tls_hash_sha384, SEC_OID_SHA384 }, 4464 { tls_hash_sha512, SEC_OID_SHA512 } 4465 }; 4466 4467 /* ssl3_TLSHashAlgorithmToOID converts a TLS hash identifier into an OID value. 4468 * If the hash is not recognised, SEC_OID_UNKNOWN is returned. 4469 * 4470 * See https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 */ 4471 SECOidTag 4472 ssl3_TLSHashAlgorithmToOID(int hashFunc) 4473 { 4474 unsigned int i; 4475 4476 for (i = 0; i < PR_ARRAY_SIZE(tlsHashOIDMap); i++) { 4477 if (hashFunc == tlsHashOIDMap[i].tlsHash) { 4478 return tlsHashOIDMap[i].oid; 4479 } 4480 } 4481 return SEC_OID_UNKNOWN; 4482 } 4483 4484 /* ssl3_OIDToTLSHashAlgorithm converts an OID to a TLS hash algorithm 4485 * identifier. If the hash is not recognised, zero is returned. 4486 * 4487 * See https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 */ 4488 static int 4489 ssl3_OIDToTLSHashAlgorithm(SECOidTag oid) 4490 { 4491 unsigned int i; 4492 4493 for (i = 0; i < PR_ARRAY_SIZE(tlsHashOIDMap); i++) { 4494 if (oid == tlsHashOIDMap[i].oid) { 4495 return tlsHashOIDMap[i].tlsHash; 4496 } 4497 } 4498 return 0; 4499 } 4500 4501 /* ssl3_TLSSignatureAlgorithmForKeyType returns the TLS 1.2 signature algorithm 4502 * identifier for a given KeyType. */ 4503 static SECStatus 4504 ssl3_TLSSignatureAlgorithmForKeyType(KeyType keyType, 4505 TLSSignatureAlgorithm *out) 4506 { 4507 switch (keyType) { 4508 case rsaKey: 4509 *out = tls_sig_rsa; 4510 return SECSuccess; 4511 case dsaKey: 4512 *out = tls_sig_dsa; 4513 return SECSuccess; 4514 case ecKey: 4515 *out = tls_sig_ecdsa; 4516 return SECSuccess; 4517 default: 4518 PORT_SetError(SEC_ERROR_INVALID_KEY); 4519 return SECFailure; 4520 } 4521 } 4522 4523 /* ssl3_TLSSignatureAlgorithmForCertificate returns the TLS 1.2 signature 4524 * algorithm identifier for the given certificate. */ 4525 static SECStatus 4526 ssl3_TLSSignatureAlgorithmForCertificate(CERTCertificate *cert, 4527 TLSSignatureAlgorithm *out) 4528 { 4529 SECKEYPublicKey *key; 4530 KeyType keyType; 4531 4532 key = CERT_ExtractPublicKey(cert); 4533 if (key == NULL) { 4534 ssl_MapLowLevelError(SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE); 4535 return SECFailure; 4536 } 4537 4538 keyType = key->keyType; 4539 SECKEY_DestroyPublicKey(key); 4540 return ssl3_TLSSignatureAlgorithmForKeyType(keyType, out); 4541 } 4542 4543 /* ssl3_CheckSignatureAndHashAlgorithmConsistency checks that the signature 4544 * algorithm identifier in |sigAndHash| is consistent with the public key in 4545 * |cert|. If so, SECSuccess is returned. Otherwise, PORT_SetError is called 4546 * and SECFailure is returned. */ 4547 SECStatus 4548 ssl3_CheckSignatureAndHashAlgorithmConsistency( 4549 const SSL3SignatureAndHashAlgorithm *sigAndHash, CERTCertificate* cert) 4550 { 4551 SECStatus rv; 4552 TLSSignatureAlgorithm sigAlg; 4553 4554 rv = ssl3_TLSSignatureAlgorithmForCertificate(cert, &sigAlg); 4555 if (rv != SECSuccess) { 4556 return rv; 4557 } 4558 if (sigAlg != sigAndHash->sigAlg) { 4559 PORT_SetError(SSL_ERROR_INCORRECT_SIGNATURE_ALGORITHM); 4560 return SECFailure; 4561 } 4562 return SECSuccess; 4563 } 4564 4565 /* ssl3_ConsumeSignatureAndHashAlgorithm reads a SignatureAndHashAlgorithm 4566 * structure from |b| and puts the resulting value into |out|. |b| and |length| 4567 * are updated accordingly. 4568 * 4569 * See https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 */ 4570 SECStatus 4571 ssl3_ConsumeSignatureAndHashAlgorithm(sslSocket *ss, 4572 SSL3Opaque **b, 4573 PRUint32 *length, 4574 SSL3SignatureAndHashAlgorithm *out) 4575 { 4576 unsigned char bytes[2]; 4577 SECStatus rv; 4578 4579 rv = ssl3_ConsumeHandshake(ss, bytes, sizeof(bytes), b, length); 4580 if (rv != SECSuccess) { 4581 return rv; 4582 } 4583 4584 out->hashAlg = ssl3_TLSHashAlgorithmToOID(bytes[0]); 4585 if (out->hashAlg == SEC_OID_UNKNOWN) { 4586 PORT_SetError(SSL_ERROR_UNSUPPORTED_HASH_ALGORITHM); 4587 return SECFailure; 4588 } 4589 4590 out->sigAlg = bytes[1]; 4591 return SECSuccess; 4592 } 4593 4594 /************************************************************************** 4595 * end of Consume Handshake functions. 4596 **************************************************************************/ 4597 4598 /* Extract the hashes of handshake messages to this point. 4599 * Called from ssl3_SendCertificateVerify 4600 * ssl3_SendFinished 4601 * ssl3_HandleHandshakeMessage 4602 * 4603 * Caller must hold the SSL3HandshakeLock. 4604 * Caller must hold a read or write lock on the Spec R/W lock. 4605 * (There is presently no way to assert on a Read lock.) 4606 */ 4607 static SECStatus 4608 ssl3_ComputeHandshakeHashes(sslSocket * ss, 4609 ssl3CipherSpec *spec, /* uses ->master_secret */ 4610 SSL3Hashes * hashes, /* output goes here. */ 4611 PRUint32 sender) 4612 { 4613 SECStatus rv = SECSuccess; 4614 PRBool isTLS = (PRBool)(spec->version > SSL_LIBRARY_VERSION_3_0); 4615 unsigned int outLength; 4616 SSL3Opaque md5_inner[MAX_MAC_LENGTH]; 4617 SSL3Opaque sha_inner[MAX_MAC_LENGTH]; 4618 4619 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 4620 hashes->hashAlg = SEC_OID_UNKNOWN; 4621 4622 #ifndef NO_PKCS11_BYPASS 4623 if (ss->opt.bypassPKCS11 && 4624 ss->ssl3.hs.hashType == handshake_hash_single) { 4625 /* compute them without PKCS11 */ 4626 PRUint64 sha_cx[MAX_MAC_CONTEXT_LLONGS]; 4627 4628 if (!spec->msItem.data) { 4629 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HANDSHAKE); 4630 return SECFailure; 4631 } 4632 4633 ss->ssl3.hs.sha_clone(sha_cx, ss->ssl3.hs.sha_cx); 4634 ss->ssl3.hs.sha_obj->end(sha_cx, hashes->u.raw, &hashes->len, 4635 sizeof(hashes->u.raw)); 4636 4637 PRINT_BUF(60, (NULL, "SHA-256: result", hashes->u.raw, hashes->len)); 4638 4639 /* If we ever support ciphersuites where the PRF hash isn't SHA-256 4640 * then this will need to be updated. */ 4641 hashes->hashAlg = SEC_OID_SHA256; 4642 rv = SECSuccess; 4643 } else if (ss->opt.bypassPKCS11) { 4644 /* compute them without PKCS11 */ 4645 PRUint64 md5_cx[MAX_MAC_CONTEXT_LLONGS]; 4646 PRUint64 sha_cx[MAX_MAC_CONTEXT_LLONGS]; 4647 4648 #define md5cx ((MD5Context *)md5_cx) 4649 #define shacx ((SHA1Context *)sha_cx) 4650 4651 if (!spec->msItem.data) { 4652 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HANDSHAKE); 4653 return SECFailure; 4654 } 4655 4656 MD5_Clone (md5cx, (MD5Context *)ss->ssl3.hs.md5_cx); 4657 SHA1_Clone(shacx, (SHA1Context *)ss->ssl3.hs.sha_cx); 4658 4659 if (!isTLS) { 4660 /* compute hashes for SSL3. */ 4661 unsigned char s[4]; 4662 4663 s[0] = (unsigned char)(sender >> 24); 4664 s[1] = (unsigned char)(sender >> 16); 4665 s[2] = (unsigned char)(sender >> 8); 4666 s[3] = (unsigned char)sender; 4667 4668 if (sender != 0) { 4669 MD5_Update(md5cx, s, 4); 4670 PRINT_BUF(95, (NULL, "MD5 inner: sender", s, 4)); 4671 } 4672 4673 PRINT_BUF(95, (NULL, "MD5 inner: MAC Pad 1", mac_pad_1, 4674 mac_defs[mac_md5].pad_size)); 4675 4676 MD5_Update(md5cx, spec->msItem.data, spec->msItem.len); 4677 MD5_Update(md5cx, mac_pad_1, mac_defs[mac_md5].pad_size); 4678 MD5_End(md5cx, md5_inner, &outLength, MD5_LENGTH); 4679 4680 PRINT_BUF(95, (NULL, "MD5 inner: result", md5_inner, outLength)); 4681 4682 if (sender != 0) { 4683 SHA1_Update(shacx, s, 4); 4684 PRINT_BUF(95, (NULL, "SHA inner: sender", s, 4)); 4685 } 4686 4687 PRINT_BUF(95, (NULL, "SHA inner: MAC Pad 1", mac_pad_1, 4688 mac_defs[mac_sha].pad_size)); 4689 4690 SHA1_Update(shacx, spec->msItem.data, spec->msItem.len); 4691 SHA1_Update(shacx, mac_pad_1, mac_defs[mac_sha].pad_size); 4692 SHA1_End(shacx, sha_inner, &outLength, SHA1_LENGTH); 4693 4694 PRINT_BUF(95, (NULL, "SHA inner: result", sha_inner, outLength)); 4695 PRINT_BUF(95, (NULL, "MD5 outer: MAC Pad 2", mac_pad_2, 4696 mac_defs[mac_md5].pad_size)); 4697 PRINT_BUF(95, (NULL, "MD5 outer: MD5 inner", md5_inner, MD5_LENGTH)); 4698 4699 MD5_Begin(md5cx); 4700 MD5_Update(md5cx, spec->msItem.data, spec->msItem.len); 4701 MD5_Update(md5cx, mac_pad_2, mac_defs[mac_md5].pad_size); 4702 MD5_Update(md5cx, md5_inner, MD5_LENGTH); 4703 } 4704 MD5_End(md5cx, hashes->u.s.md5, &outLength, MD5_LENGTH); 4705 4706 PRINT_BUF(60, (NULL, "MD5 outer: result", hashes->u.s.md5, MD5_LENGTH)); 4707 4708 if (!isTLS) { 4709 PRINT_BUF(95, (NULL, "SHA outer: MAC Pad 2", mac_pad_2, 4710 mac_defs[mac_sha].pad_size)); 4711 PRINT_BUF(95, (NULL, "SHA outer: SHA inner", sha_inner, SHA1_LENGTH)); 4712 4713 SHA1_Begin(shacx); 4714 SHA1_Update(shacx, spec->msItem.data, spec->msItem.len); 4715 SHA1_Update(shacx, mac_pad_2, mac_defs[mac_sha].pad_size); 4716 SHA1_Update(shacx, sha_inner, SHA1_LENGTH); 4717 } 4718 SHA1_End(shacx, hashes->u.s.sha, &outLength, SHA1_LENGTH); 4719 4720 PRINT_BUF(60, (NULL, "SHA outer: result", hashes->u.s.sha, SHA1_LENGTH)); 4721 4722 hashes->len = MD5_LENGTH + SHA1_LENGTH; 4723 rv = SECSuccess; 4724 #undef md5cx 4725 #undef shacx 4726 } else 4727 #endif 4728 if (ss->ssl3.hs.hashType == handshake_hash_single) { 4729 /* compute hashes with PKCS11 */ 4730 PK11Context *h; 4731 unsigned int stateLen; 4732 unsigned char stackBuf[1024]; 4733 unsigned char *stateBuf = NULL; 4734 4735 if (!spec->master_secret) { 4736 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HANDSHAKE); 4737 return SECFailure; 4738 } 4739 4740 h = ss->ssl3.hs.sha; 4741 stateBuf = PK11_SaveContextAlloc(h, stackBuf, 4742 sizeof(stackBuf), &stateLen); 4743 if (stateBuf == NULL) { 4744 ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); 4745 goto tls12_loser; 4746 } 4747 rv |= PK11_DigestFinal(h, hashes->u.raw, &hashes->len, 4748 sizeof(hashes->u.raw)); 4749 if (rv != SECSuccess) { 4750 ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); 4751 rv = SECFailure; 4752 goto tls12_loser; 4753 } 4754 /* If we ever support ciphersuites where the PRF hash isn't SHA-256 4755 * then this will need to be updated. */ 4756 hashes->hashAlg = SEC_OID_SHA256; 4757 rv = SECSuccess; 4758 4759 tls12_loser: 4760 if (stateBuf) { 4761 if (PK11_RestoreContext(h, stateBuf, stateLen) != SECSuccess) { 4762 ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); 4763 rv = SECFailure; 4764 } 4765 if (stateBuf != stackBuf) { 4766 PORT_ZFree(stateBuf, stateLen); 4767 } 4768 } 4769 } else { 4770 /* compute hashes with PKCS11 */ 4771 PK11Context * md5; 4772 PK11Context * sha = NULL; 4773 unsigned char *md5StateBuf = NULL; 4774 unsigned char *shaStateBuf = NULL; 4775 unsigned int md5StateLen, shaStateLen; 4776 unsigned char md5StackBuf[256]; 4777 unsigned char shaStackBuf[512]; 4778 4779 if (!spec->master_secret) { 4780 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HANDSHAKE); 4781 return SECFailure; 4782 } 4783 4784 md5StateBuf = PK11_SaveContextAlloc(ss->ssl3.hs.md5, md5StackBuf, 4785 sizeof md5StackBuf, &md5StateLen); 4786 if (md5StateBuf == NULL) { 4787 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); 4788 goto loser; 4789 } 4790 md5 = ss->ssl3.hs.md5; 4791 4792 shaStateBuf = PK11_SaveContextAlloc(ss->ssl3.hs.sha, shaStackBuf, 4793 sizeof shaStackBuf, &shaStateLen); 4794 if (shaStateBuf == NULL) { 4795 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); 4796 goto loser; 4797 } 4798 sha = ss->ssl3.hs.sha; 4799 4800 if (!isTLS) { 4801 /* compute hashes for SSL3. */ 4802 unsigned char s[4]; 4803 4804 s[0] = (unsigned char)(sender >> 24); 4805 s[1] = (unsigned char)(sender >> 16); 4806 s[2] = (unsigned char)(sender >> 8); 4807 s[3] = (unsigned char)sender; 4808 4809 if (sender != 0) { 4810 rv |= PK11_DigestOp(md5, s, 4); 4811 PRINT_BUF(95, (NULL, "MD5 inner: sender", s, 4)); 4812 } 4813 4814 PRINT_BUF(95, (NULL, "MD5 inner: MAC Pad 1", mac_pad_1, 4815 mac_defs[mac_md5].pad_size)); 4816 4817 rv |= PK11_DigestKey(md5,spec->master_secret); 4818 rv |= PK11_DigestOp(md5, mac_pad_1, mac_defs[mac_md5].pad_size); 4819 rv |= PK11_DigestFinal(md5, md5_inner, &outLength, MD5_LENGTH); 4820 PORT_Assert(rv != SECSuccess || outLength == MD5_LENGTH); 4821 if (rv != SECSuccess) { 4822 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); 4823 rv = SECFailure; 4824 goto loser; 4825 } 4826 4827 PRINT_BUF(95, (NULL, "MD5 inner: result", md5_inner, outLength)); 4828 4829 if (sender != 0) { 4830 rv |= PK11_DigestOp(sha, s, 4); 4831 PRINT_BUF(95, (NULL, "SHA inner: sender", s, 4)); 4832 } 4833 4834 PRINT_BUF(95, (NULL, "SHA inner: MAC Pad 1", mac_pad_1, 4835 mac_defs[mac_sha].pad_size)); 4836 4837 rv |= PK11_DigestKey(sha, spec->master_secret); 4838 rv |= PK11_DigestOp(sha, mac_pad_1, mac_defs[mac_sha].pad_size); 4839 rv |= PK11_DigestFinal(sha, sha_inner, &outLength, SHA1_LENGTH); 4840 PORT_Assert(rv != SECSuccess || outLength == SHA1_LENGTH); 4841 if (rv != SECSuccess) { 4842 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); 4843 rv = SECFailure; 4844 goto loser; 4845 } 4846 4847 PRINT_BUF(95, (NULL, "SHA inner: result", sha_inner, outLength)); 4848 4849 PRINT_BUF(95, (NULL, "MD5 outer: MAC Pad 2", mac_pad_2, 4850 mac_defs[mac_md5].pad_size)); 4851 PRINT_BUF(95, (NULL, "MD5 outer: MD5 inner", md5_inner, MD5_LENGTH)); 4852 4853 rv |= PK11_DigestBegin(md5); 4854 rv |= PK11_DigestKey(md5, spec->master_secret); 4855 rv |= PK11_DigestOp(md5, mac_pad_2, mac_defs[mac_md5].pad_size); 4856 rv |= PK11_DigestOp(md5, md5_inner, MD5_LENGTH); 4857 } 4858 rv |= PK11_DigestFinal(md5, hashes->u.s.md5, &outLength, MD5_LENGTH); 4859 PORT_Assert(rv != SECSuccess || outLength == MD5_LENGTH); 4860 if (rv != SECSuccess) { 4861 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); 4862 rv = SECFailure; 4863 goto loser; 4864 } 4865 4866 PRINT_BUF(60, (NULL, "MD5 outer: result", hashes->u.s.md5, MD5_LENGTH)); 4867 4868 if (!isTLS) { 4869 PRINT_BUF(95, (NULL, "SHA outer: MAC Pad 2", mac_pad_2, 4870 mac_defs[mac_sha].pad_size)); 4871 PRINT_BUF(95, (NULL, "SHA outer: SHA inner", sha_inner, SHA1_LENGTH)); 4872 4873 rv |= PK11_DigestBegin(sha); 4874 rv |= PK11_DigestKey(sha,spec->master_secret); 4875 rv |= PK11_DigestOp(sha, mac_pad_2, mac_defs[mac_sha].pad_size); 4876 rv |= PK11_DigestOp(sha, sha_inner, SHA1_LENGTH); 4877 } 4878 rv |= PK11_DigestFinal(sha, hashes->u.s.sha, &outLength, SHA1_LENGTH); 4879 PORT_Assert(rv != SECSuccess || outLength == SHA1_LENGTH); 4880 if (rv != SECSuccess) { 4881 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); 4882 rv = SECFailure; 4883 goto loser; 4884 } 4885 4886 PRINT_BUF(60, (NULL, "SHA outer: result", hashes->u.s.sha, SHA1_LENGTH)); 4887 4888 hashes->len = MD5_LENGTH + SHA1_LENGTH; 4889 rv = SECSuccess; 4890 4891 loser: 4892 if (md5StateBuf) { 4893 if (PK11_RestoreContext(ss->ssl3.hs.md5, md5StateBuf, md5StateLen) 4894 != SECSuccess) 4895 { 4896 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); 4897 rv = SECFailure; 4898 } 4899 if (md5StateBuf != md5StackBuf) { 4900 PORT_ZFree(md5StateBuf, md5StateLen); 4901 } 4902 } 4903 if (shaStateBuf) { 4904 if (PK11_RestoreContext(ss->ssl3.hs.sha, shaStateBuf, shaStateLen) 4905 != SECSuccess) 4906 { 4907 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); 4908 rv = SECFailure; 4909 } 4910 if (shaStateBuf != shaStackBuf) { 4911 PORT_ZFree(shaStateBuf, shaStateLen); 4912 } 4913 } 4914 } 4915 return rv; 4916 } 4917 4918 static SECStatus 4919 ssl3_ComputeBackupHandshakeHashes(sslSocket * ss, 4920 SSL3Hashes * hashes) /* output goes here. */ 4921 { 4922 SECStatus rv = SECSuccess; 4923 4924 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 4925 PORT_Assert( !ss->sec.isServer ); 4926 PORT_Assert( ss->ssl3.hs.hashType == handshake_hash_single ); 4927 4928 rv = PK11_DigestFinal(ss->ssl3.hs.backupHash, hashes->u.raw, &hashes->len, 4929 sizeof(hashes->u.raw)); 4930 if (rv != SECSuccess) { 4931 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); 4932 rv = SECFailure; 4933 goto loser; 4934 } 4935 hashes->hashAlg = SEC_OID_SHA1; 4936 4937 loser: 4938 PK11_DestroyContext(ss->ssl3.hs.backupHash, PR_TRUE); 4939 ss->ssl3.hs.backupHash = NULL; 4940 return rv; 4941 } 4942 4943 /* 4944 * SSL 2 based implementations pass in the initial outbound buffer 4945 * so that the handshake hash can contain the included information. 4946 * 4947 * Called from ssl2_BeginClientHandshake() in sslcon.c 4948 */ 4949 SECStatus 4950 ssl3_StartHandshakeHash(sslSocket *ss, unsigned char * buf, int length) 4951 { 4952 SECStatus rv; 4953 4954 ssl_GetSSL3HandshakeLock(ss); /**************************************/ 4955 4956 rv = ssl3_InitState(ss); 4957 if (rv != SECSuccess) { 4958 goto done; /* ssl3_InitState has set the error code. */ 4959 } 4960 rv = ssl3_RestartHandshakeHashes(ss); 4961 if (rv != SECSuccess) { 4962 goto done; 4963 } 4964 4965 PORT_Memset(&ss->ssl3.hs.client_random, 0, SSL3_RANDOM_LENGTH); 4966 PORT_Memcpy( 4967 &ss->ssl3.hs.client_random.rand[SSL3_RANDOM_LENGTH - SSL_CHALLENGE_BYTES], 4968 &ss->sec.ci.clientChallenge, 4969 SSL_CHALLENGE_BYTES); 4970 4971 rv = ssl3_UpdateHandshakeHashes(ss, buf, length); 4972 /* if it failed, ssl3_UpdateHandshakeHashes has set the error code. */ 4973 4974 done: 4975 ssl_ReleaseSSL3HandshakeLock(ss); /**************************************/ 4976 return rv; 4977 } 4978 4979 /************************************************************************** 4980 * end of Handshake Hash functions. 4981 * Begin Send and Handle functions for handshakes. 4982 **************************************************************************/ 4983 4984 /* Called from ssl3_HandleHelloRequest(), 4985 * ssl3_RedoHandshake() 4986 * ssl2_BeginClientHandshake (when resuming ssl3 session) 4987 * dtls_HandleHelloVerifyRequest(with resending=PR_TRUE) 4988 */ 4989 SECStatus 4990 ssl3_SendClientHello(sslSocket *ss, PRBool resending) 4991 { 4992 sslSessionID * sid; 4993 ssl3CipherSpec * cwSpec; 4994 SECStatus rv; 4995 int i; 4996 int length; 4997 int num_suites; 4998 int actual_count = 0; 4999 PRBool isTLS = PR_FALSE; 5000 PRBool requestingResume = PR_FALSE, fallbackSCSV = PR_FALSE; 5001 PRInt32 total_exten_len = 0; 5002 unsigned paddingExtensionLen; 5003 unsigned numCompressionMethods; 5004 PRInt32 flags; 5005 5006 SSL_TRC(3, ("%d: SSL3[%d]: send client_hello handshake", SSL_GETPID(), 5007 ss->fd)); 5008 5009 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 5010 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss) ); 5011 5012 rv = ssl3_InitState(ss); 5013 if (rv != SECSuccess) { 5014 return rv; /* ssl3_InitState has set the error code. */ 5015 } 5016 ss->ssl3.hs.sendingSCSV = PR_FALSE; /* Must be reset every handshake */ 5017 PORT_Assert(IS_DTLS(ss) || !resending); 5018 5019 SECITEM_FreeItem(&ss->ssl3.hs.newSessionTicket.ticket, PR_FALSE); 5020 ss->ssl3.hs.receivedNewSessionTicket = PR_FALSE; 5021 5022 /* We might be starting a session renegotiation in which case we should 5023 * clear previous state. 5024 */ 5025 PORT_Memset(&ss->xtnData, 0, sizeof(TLSExtensionData)); 5026 5027 rv = ssl3_RestartHandshakeHashes(ss); 5028 if (rv != SECSuccess) { 5029 return rv; 5030 } 5031 5032 /* 5033 * During a renegotiation, ss->clientHelloVersion will be used again to 5034 * work around a Windows SChannel bug. Ensure that it is still enabled. 5035 */ 5036 if (ss->firstHsDone) { 5037 if (SSL3_ALL_VERSIONS_DISABLED(&ss->vrange)) { 5038 PORT_SetError(SSL_ERROR_SSL_DISABLED); 5039 return SECFailure; 5040 } 5041 5042 if (ss->clientHelloVersion < ss->vrange.min || 5043 ss->clientHelloVersion > ss->vrange.max) { 5044 PORT_SetError(SSL_ERROR_NO_CYPHER_OVERLAP); 5045 return SECFailure; 5046 } 5047 } 5048 5049 /* We ignore ss->sec.ci.sid here, and use ssl_Lookup because Lookup 5050 * handles expired entries and other details. 5051 * XXX If we've been called from ssl2_BeginClientHandshake, then 5052 * this lookup is duplicative and wasteful. 5053 */ 5054 sid = (ss->opt.noCache) ? NULL 5055 : ssl_LookupSID(&ss->sec.ci.peer, ss->sec.ci.port, ss->peerID, ss->url); 5056 5057 /* We can't resume based on a different token. If the sid exists, 5058 * make sure the token that holds the master secret still exists ... 5059 * If we previously did client-auth, make sure that the token that holds 5060 * the private key still exists, is logged in, hasn't been removed, etc. 5061 */ 5062 if (sid) { 5063 PRBool sidOK = PR_TRUE; 5064 if (sid->u.ssl3.keys.msIsWrapped) { 5065 /* Session key was wrapped, which means it was using PKCS11, */ 5066 PK11SlotInfo *slot = NULL; 5067 if (sid->u.ssl3.masterValid && !ss->opt.bypassPKCS11) { 5068 slot = SECMOD_LookupSlot(sid->u.ssl3.masterModuleID, 5069 sid->u.ssl3.masterSlotID); 5070 } 5071 if (slot == NULL) { 5072 sidOK = PR_FALSE; 5073 } else { 5074 PK11SymKey *wrapKey = NULL; 5075 if (!PK11_IsPresent(slot) || 5076 ((wrapKey = PK11_GetWrapKey(slot, 5077 sid->u.ssl3.masterWrapIndex, 5078 sid->u.ssl3.masterWrapMech, 5079 sid->u.ssl3.masterWrapSeries, 5080 ss->pkcs11PinArg)) == NULL) ) { 5081 sidOK = PR_FALSE; 5082 } 5083 if (wrapKey) PK11_FreeSymKey(wrapKey); 5084 PK11_FreeSlot(slot); 5085 slot = NULL; 5086 } 5087 } 5088 /* If we previously did client-auth, make sure that the token that 5089 ** holds the private key still exists, is logged in, hasn't been 5090 ** removed, etc. 5091 */ 5092 if (sidOK && !ssl3_ClientAuthTokenPresent(sid)) { 5093 sidOK = PR_FALSE; 5094 } 5095 5096 /* TLS 1.0 (RFC 2246) Appendix E says: 5097 * Whenever a client already knows the highest protocol known to 5098 * a server (for example, when resuming a session), it should 5099 * initiate the connection in that native protocol. 5100 * So we pass sid->version to ssl3_NegotiateVersion() here, except 5101 * when renegotiating. 5102 * 5103 * Windows SChannel compares the client_version inside the RSA 5104 * EncryptedPreMasterSecret of a renegotiation with the 5105 * client_version of the initial ClientHello rather than the 5106 * ClientHello in the renegotiation. To work around this bug, we 5107 * continue to use the client_version used in the initial 5108 * ClientHello when renegotiating. 5109 */ 5110 if (sidOK) { 5111 if (ss->firstHsDone) { 5112 /* 5113 * The client_version of the initial ClientHello is still 5114 * available in ss->clientHelloVersion. Ensure that 5115 * sid->version is bounded within 5116 * [ss->vrange.min, ss->clientHelloVersion], otherwise we 5117 * can't use sid. 5118 */ 5119 if (sid->version >= ss->vrange.min && 5120 sid->version <= ss->clientHelloVersion) { 5121 ss->version = ss->clientHelloVersion; 5122 } else { 5123 sidOK = PR_FALSE; 5124 } 5125 } else { 5126 if (ssl3_NegotiateVersion(ss, sid->version, 5127 PR_FALSE) != SECSuccess) { 5128 sidOK = PR_FALSE; 5129 } 5130 } 5131 } 5132 5133 if (!sidOK) { 5134 SSL_AtomicIncrementLong(& ssl3stats.sch_sid_cache_not_ok ); 5135 if (ss->sec.uncache) 5136 (*ss->sec.uncache)(sid); 5137 ssl_FreeSID(sid); 5138 sid = NULL; 5139 } 5140 } 5141 5142 if (sid) { 5143 requestingResume = PR_TRUE; 5144 SSL_AtomicIncrementLong(& ssl3stats.sch_sid_cache_hits ); 5145 5146 PRINT_BUF(4, (ss, "client, found session-id:", sid->u.ssl3.sessionID, 5147 sid->u.ssl3.sessionIDLength)); 5148 5149 ss->ssl3.policy = sid->u.ssl3.policy; 5150 } else { 5151 SSL_AtomicIncrementLong(& ssl3stats.sch_sid_cache_misses ); 5152 5153 /* 5154 * Windows SChannel compares the client_version inside the RSA 5155 * EncryptedPreMasterSecret of a renegotiation with the 5156 * client_version of the initial ClientHello rather than the 5157 * ClientHello in the renegotiation. To work around this bug, we 5158 * continue to use the client_version used in the initial 5159 * ClientHello when renegotiating. 5160 */ 5161 if (ss->firstHsDone) { 5162 ss->version = ss->clientHelloVersion; 5163 } else { 5164 rv = ssl3_NegotiateVersion(ss, SSL_LIBRARY_VERSION_MAX_SUPPORTED, 5165 PR_TRUE); 5166 if (rv != SECSuccess) 5167 return rv; /* error code was set */ 5168 } 5169 5170 sid = ssl3_NewSessionID(ss, PR_FALSE); 5171 if (!sid) { 5172 return SECFailure; /* memory error is set */ 5173 } 5174 } 5175 5176 isTLS = (ss->version > SSL_LIBRARY_VERSION_3_0); 5177 ssl_GetSpecWriteLock(ss); 5178 cwSpec = ss->ssl3.cwSpec; 5179 if (cwSpec->mac_def->mac == mac_null) { 5180 /* SSL records are not being MACed. */ 5181 cwSpec->version = ss->version; 5182 } 5183 ssl_ReleaseSpecWriteLock(ss); 5184 5185 if (ss->sec.ci.sid != NULL) { 5186 ssl_FreeSID(ss->sec.ci.sid); /* decrement ref count, free if zero */ 5187 } 5188 ss->sec.ci.sid = sid; 5189 5190 ss->sec.send = ssl3_SendApplicationData; 5191 5192 /* shouldn't get here if SSL3 is disabled, but ... */ 5193 if (SSL3_ALL_VERSIONS_DISABLED(&ss->vrange)) { 5194 PR_NOT_REACHED("No versions of SSL 3.0 or later are enabled"); 5195 PORT_SetError(SSL_ERROR_SSL_DISABLED); 5196 return SECFailure; 5197 } 5198 5199 /* how many suites does our PKCS11 support (regardless of policy)? */ 5200 num_suites = ssl3_config_match_init(ss); 5201 if (!num_suites) 5202 return SECFailure; /* ssl3_config_match_init has set error code. */ 5203 5204 /* HACK for SCSV in SSL 3.0. On initial handshake, prepend SCSV, 5205 * only if TLS is disabled. 5206 */ 5207 if (!ss->firstHsDone && !isTLS) { 5208 /* Must set this before calling Hello Extension Senders, 5209 * to suppress sending of empty RI extension. 5210 */ 5211 ss->ssl3.hs.sendingSCSV = PR_TRUE; 5212 } 5213 5214 /* When we attempt session resumption (only), we must lock the sid to 5215 * prevent races with other resumption connections that receive a 5216 * NewSessionTicket that will cause the ticket in the sid to be replaced. 5217 * Once we've copied the session ticket into our ClientHello message, it 5218 * is OK for the ticket to change, so we just need to make sure we hold 5219 * the lock across the calls to ssl3_CallHelloExtensionSenders. 5220 */ 5221 if (sid->u.ssl3.lock) { 5222 NSSRWLock_LockRead(sid->u.ssl3.lock); 5223 } 5224 5225 if (isTLS || (ss->firstHsDone && ss->peerRequestedProtection)) { 5226 PRUint32 maxBytes = 65535; /* 2^16 - 1 */ 5227 PRInt32 extLen; 5228 5229 extLen = ssl3_CallHelloExtensionSenders(ss, PR_FALSE, maxBytes, NULL); 5230 if (extLen < 0) { 5231 if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 5232 return SECFailure; 5233 } 5234 maxBytes -= extLen; 5235 total_exten_len += extLen; 5236 5237 if (total_exten_len > 0) 5238 total_exten_len += 2; 5239 } 5240 5241 #if defined(NSS_ENABLE_ECC) 5242 if (!total_exten_len || !isTLS) { 5243 /* not sending the elliptic_curves and ec_point_formats extensions */ 5244 ssl3_DisableECCSuites(ss, NULL); /* disable all ECC suites */ 5245 } 5246 #endif 5247 5248 if (IS_DTLS(ss)) { 5249 ssl3_DisableNonDTLSSuites(ss); 5250 } 5251 5252 if (!ssl3_HasGCMSupport()) { 5253 ssl3_DisableGCMSuites(ss); 5254 } 5255 5256 /* how many suites are permitted by policy and user preference? */ 5257 num_suites = count_cipher_suites(ss, ss->ssl3.policy, PR_TRUE); 5258 if (!num_suites) { 5259 if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 5260 return SECFailure; /* count_cipher_suites has set error code. */ 5261 } 5262 5263 fallbackSCSV = ss->opt.enableFallbackSCSV && (!requestingResume || 5264 ss->version < sid->version); 5265 /* make room for SCSV */ 5266 if (ss->ssl3.hs.sendingSCSV) { 5267 ++num_suites; 5268 } 5269 if (fallbackSCSV) { 5270 ++num_suites; 5271 } 5272 5273 /* count compression methods */ 5274 numCompressionMethods = 0; 5275 for (i = 0; i < compressionMethodsCount; i++) { 5276 if (compressionEnabled(ss, compressions[i])) 5277 numCompressionMethods++; 5278 } 5279 5280 length = sizeof(SSL3ProtocolVersion) + SSL3_RANDOM_LENGTH + 5281 1 + ((sid == NULL) ? 0 : sid->u.ssl3.sessionIDLength) + 5282 2 + num_suites*sizeof(ssl3CipherSuite) + 5283 1 + numCompressionMethods + total_exten_len; 5284 if (IS_DTLS(ss)) { 5285 length += 1 + ss->ssl3.hs.cookieLen; 5286 } 5287 5288 /* A padding extension may be included to ensure that the record containing 5289 * the ClientHello doesn't have a length between 256 and 511 bytes 5290 * (inclusive). Initial, ClientHello records with such lengths trigger bugs 5291 * in F5 devices. 5292 * 5293 * This is not done for DTLS nor for renegotiation. */ 5294 if (!IS_DTLS(ss) && isTLS && !ss->firstHsDone) { 5295 paddingExtensionLen = ssl3_CalculatePaddingExtensionLength(length); 5296 total_exten_len += paddingExtensionLen; 5297 length += paddingExtensionLen; 5298 } else { 5299 paddingExtensionLen = 0; 5300 } 5301 5302 rv = ssl3_AppendHandshakeHeader(ss, client_hello, length); 5303 if (rv != SECSuccess) { 5304 if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 5305 return rv; /* err set by ssl3_AppendHandshake* */ 5306 } 5307 5308 if (ss->firstHsDone) { 5309 /* The client hello version must stay unchanged to work around 5310 * the Windows SChannel bug described above. */ 5311 PORT_Assert(ss->version == ss->clientHelloVersion); 5312 } 5313 ss->clientHelloVersion = ss->version; 5314 if (IS_DTLS(ss)) { 5315 PRUint16 version; 5316 5317 version = dtls_TLSVersionToDTLSVersion(ss->clientHelloVersion); 5318 rv = ssl3_AppendHandshakeNumber(ss, version, 2); 5319 } else { 5320 rv = ssl3_AppendHandshakeNumber(ss, ss->clientHelloVersion, 2); 5321 } 5322 if (rv != SECSuccess) { 5323 if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 5324 return rv; /* err set by ssl3_AppendHandshake* */ 5325 } 5326 5327 if (!resending) { /* Don't re-generate if we are in DTLS re-sending mode */ 5328 rv = ssl3_GetNewRandom(&ss->ssl3.hs.client_random); 5329 if (rv != SECSuccess) { 5330 if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 5331 return rv; /* err set by GetNewRandom. */ 5332 } 5333 } 5334 rv = ssl3_AppendHandshake(ss, &ss->ssl3.hs.client_random, 5335 SSL3_RANDOM_LENGTH); 5336 if (rv != SECSuccess) { 5337 if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 5338 return rv; /* err set by ssl3_AppendHandshake* */ 5339 } 5340 5341 if (sid) 5342 rv = ssl3_AppendHandshakeVariable( 5343 ss, sid->u.ssl3.sessionID, sid->u.ssl3.sessionIDLength, 1); 5344 else 5345 rv = ssl3_AppendHandshakeVariable(ss, NULL, 0, 1); 5346 if (rv != SECSuccess) { 5347 if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 5348 return rv; /* err set by ssl3_AppendHandshake* */ 5349 } 5350 5351 if (IS_DTLS(ss)) { 5352 rv = ssl3_AppendHandshakeVariable( 5353 ss, ss->ssl3.hs.cookie, ss->ssl3.hs.cookieLen, 1); 5354 if (rv != SECSuccess) { 5355 if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 5356 return rv; /* err set by ssl3_AppendHandshake* */ 5357 } 5358 } 5359 5360 rv = ssl3_AppendHandshakeNumber(ss, num_suites*sizeof(ssl3CipherSuite), 2); 5361 if (rv != SECSuccess) { 5362 if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 5363 return rv; /* err set by ssl3_AppendHandshake* */ 5364 } 5365 5366 if (ss->ssl3.hs.sendingSCSV) { 5367 /* Add the actual SCSV */ 5368 rv = ssl3_AppendHandshakeNumber(ss, TLS_EMPTY_RENEGOTIATION_INFO_SCSV, 5369 sizeof(ssl3CipherSuite)); 5370 if (rv != SECSuccess) { 5371 if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 5372 return rv; /* err set by ssl3_AppendHandshake* */ 5373 } 5374 actual_count++; 5375 } 5376 if (fallbackSCSV) { 5377 rv = ssl3_AppendHandshakeNumber(ss, TLS_FALLBACK_SCSV, 5378 sizeof(ssl3CipherSuite)); 5379 if (rv != SECSuccess) { 5380 if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 5381 return rv; /* err set by ssl3_AppendHandshake* */ 5382 } 5383 actual_count++; 5384 } 5385 for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) { 5386 ssl3CipherSuiteCfg *suite = &ss->cipherSuites[i]; 5387 if (config_match(suite, ss->ssl3.policy, PR_TRUE, &ss->vrange)) { 5388 actual_count++; 5389 if (actual_count > num_suites) { 5390 if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 5391 /* set error card removal/insertion error */ 5392 PORT_SetError(SSL_ERROR_TOKEN_INSERTION_REMOVAL); 5393 return SECFailure; 5394 } 5395 rv = ssl3_AppendHandshakeNumber(ss, suite->cipher_suite, 5396 sizeof(ssl3CipherSuite)); 5397 if (rv != SECSuccess) { 5398 if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 5399 return rv; /* err set by ssl3_AppendHandshake* */ 5400 } 5401 } 5402 } 5403 5404 /* if cards were removed or inserted between count_cipher_suites and 5405 * generating our list, detect the error here rather than send it off to 5406 * the server.. */ 5407 if (actual_count != num_suites) { 5408 /* Card removal/insertion error */ 5409 if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 5410 PORT_SetError(SSL_ERROR_TOKEN_INSERTION_REMOVAL); 5411 return SECFailure; 5412 } 5413 5414 rv = ssl3_AppendHandshakeNumber(ss, numCompressionMethods, 1); 5415 if (rv != SECSuccess) { 5416 if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 5417 return rv; /* err set by ssl3_AppendHandshake* */ 5418 } 5419 for (i = 0; i < compressionMethodsCount; i++) { 5420 if (!compressionEnabled(ss, compressions[i])) 5421 continue; 5422 rv = ssl3_AppendHandshakeNumber(ss, compressions[i], 1); 5423 if (rv != SECSuccess) { 5424 if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 5425 return rv; /* err set by ssl3_AppendHandshake* */ 5426 } 5427 } 5428 5429 if (total_exten_len) { 5430 PRUint32 maxBytes = total_exten_len - 2; 5431 PRInt32 extLen; 5432 5433 rv = ssl3_AppendHandshakeNumber(ss, maxBytes, 2); 5434 if (rv != SECSuccess) { 5435 if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 5436 return rv; /* err set by AppendHandshake. */ 5437 } 5438 5439 extLen = ssl3_CallHelloExtensionSenders(ss, PR_TRUE, maxBytes, NULL); 5440 if (extLen < 0) { 5441 if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 5442 return SECFailure; 5443 } 5444 maxBytes -= extLen; 5445 5446 extLen = ssl3_AppendPaddingExtension(ss, paddingExtensionLen, maxBytes); 5447 if (extLen < 0) { 5448 if (sid->u.ssl3.lock) { NSSRWLock_UnlockRead(sid->u.ssl3.lock); } 5449 return SECFailure; 5450 } 5451 maxBytes -= extLen; 5452 5453 PORT_Assert(!maxBytes); 5454 } 5455 5456 if (sid->u.ssl3.lock) { 5457 NSSRWLock_UnlockRead(sid->u.ssl3.lock); 5458 } 5459 5460 if (ss->xtnData.sentSessionTicketInClientHello) { 5461 SSL_AtomicIncrementLong(&ssl3stats.sch_sid_stateless_resumes); 5462 } 5463 5464 if (ss->ssl3.hs.sendingSCSV) { 5465 /* Since we sent the SCSV, pretend we sent empty RI extension. */ 5466 TLSExtensionData *xtnData = &ss->xtnData; 5467 xtnData->advertised[xtnData->numAdvertised++] = 5468 ssl_renegotiation_info_xtn; 5469 } 5470 5471 flags = 0; 5472 if (!ss->firstHsDone && !IS_DTLS(ss)) { 5473 flags |= ssl_SEND_FLAG_CAP_RECORD_VERSION; 5474 } 5475 rv = ssl3_FlushHandshake(ss, flags); 5476 if (rv != SECSuccess) { 5477 return rv; /* error code set by ssl3_FlushHandshake */ 5478 } 5479 5480 ss->ssl3.hs.ws = wait_server_hello; 5481 return rv; 5482 } 5483 5484 5485 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete 5486 * ssl3 Hello Request. 5487 * Caller must hold Handshake and RecvBuf locks. 5488 */ 5489 static SECStatus 5490 ssl3_HandleHelloRequest(sslSocket *ss) 5491 { 5492 sslSessionID *sid = ss->sec.ci.sid; 5493 SECStatus rv; 5494 5495 SSL_TRC(3, ("%d: SSL3[%d]: handle hello_request handshake", 5496 SSL_GETPID(), ss->fd)); 5497 5498 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 5499 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 5500 5501 if (ss->ssl3.hs.ws == wait_server_hello) 5502 return SECSuccess; 5503 if (ss->ssl3.hs.ws != idle_handshake || ss->sec.isServer) { 5504 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); 5505 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HELLO_REQUEST); 5506 return SECFailure; 5507 } 5508 if (ss->opt.enableRenegotiation == SSL_RENEGOTIATE_NEVER) { 5509 ssl_GetXmitBufLock(ss); 5510 rv = SSL3_SendAlert(ss, alert_warning, no_renegotiation); 5511 ssl_ReleaseXmitBufLock(ss); 5512 PORT_SetError(SSL_ERROR_RENEGOTIATION_NOT_ALLOWED); 5513 return SECFailure; 5514 } 5515 5516 if (sid) { 5517 if (ss->sec.uncache) 5518 ss->sec.uncache(sid); 5519 ssl_FreeSID(sid); 5520 ss->sec.ci.sid = NULL; 5521 } 5522 5523 if (IS_DTLS(ss)) { 5524 dtls_RehandshakeCleanup(ss); 5525 } 5526 5527 ssl_GetXmitBufLock(ss); 5528 rv = ssl3_SendClientHello(ss, PR_FALSE); 5529 ssl_ReleaseXmitBufLock(ss); 5530 5531 return rv; 5532 } 5533 5534 #define UNKNOWN_WRAP_MECHANISM 0x7fffffff 5535 5536 static const CK_MECHANISM_TYPE wrapMechanismList[SSL_NUM_WRAP_MECHS] = { 5537 CKM_DES3_ECB, 5538 CKM_CAST5_ECB, 5539 CKM_DES_ECB, 5540 CKM_KEY_WRAP_LYNKS, 5541 CKM_IDEA_ECB, 5542 CKM_CAST3_ECB, 5543 CKM_CAST_ECB, 5544 CKM_RC5_ECB, 5545 CKM_RC2_ECB, 5546 CKM_CDMF_ECB, 5547 CKM_SKIPJACK_WRAP, 5548 CKM_SKIPJACK_CBC64, 5549 CKM_AES_ECB, 5550 CKM_CAMELLIA_ECB, 5551 CKM_SEED_ECB, 5552 UNKNOWN_WRAP_MECHANISM 5553 }; 5554 5555 static int 5556 ssl_FindIndexByWrapMechanism(CK_MECHANISM_TYPE mech) 5557 { 5558 const CK_MECHANISM_TYPE *pMech = wrapMechanismList; 5559 5560 while (mech != *pMech && *pMech != UNKNOWN_WRAP_MECHANISM) { 5561 ++pMech; 5562 } 5563 return (*pMech == UNKNOWN_WRAP_MECHANISM) ? -1 5564 : (pMech - wrapMechanismList); 5565 } 5566 5567 static PK11SymKey * 5568 ssl_UnwrapSymWrappingKey( 5569 SSLWrappedSymWrappingKey *pWswk, 5570 SECKEYPrivateKey * svrPrivKey, 5571 SSL3KEAType exchKeyType, 5572 CK_MECHANISM_TYPE masterWrapMech, 5573 void * pwArg) 5574 { 5575 PK11SymKey * unwrappedWrappingKey = NULL; 5576 SECItem wrappedKey; 5577 #ifdef NSS_ENABLE_ECC 5578 PK11SymKey * Ks; 5579 SECKEYPublicKey pubWrapKey; 5580 ECCWrappedKeyInfo *ecWrapped; 5581 #endif /* NSS_ENABLE_ECC */ 5582 5583 /* found the wrapping key on disk. */ 5584 PORT_Assert(pWswk->symWrapMechanism == masterWrapMech); 5585 PORT_Assert(pWswk->exchKeyType == exchKeyType); 5586 if (pWswk->symWrapMechanism != masterWrapMech || 5587 pWswk->exchKeyType != exchKeyType) { 5588 goto loser; 5589 } 5590 wrappedKey.type = siBuffer; 5591 wrappedKey.data = pWswk->wrappedSymmetricWrappingkey; 5592 wrappedKey.len = pWswk->wrappedSymKeyLen; 5593 PORT_Assert(wrappedKey.len <= sizeof pWswk->wrappedSymmetricWrappingkey); 5594 5595 switch (exchKeyType) { 5596 5597 case kt_rsa: 5598 unwrappedWrappingKey = 5599 PK11_PubUnwrapSymKey(svrPrivKey, &wrappedKey, 5600 masterWrapMech, CKA_UNWRAP, 0); 5601 break; 5602 5603 #ifdef NSS_ENABLE_ECC 5604 case kt_ecdh: 5605 /* 5606 * For kt_ecdh, we first create an EC public key based on 5607 * data stored with the wrappedSymmetricWrappingkey. Next, 5608 * we do an ECDH computation involving this public key and 5609 * the SSL server's (long-term) EC private key. The resulting 5610 * shared secret is treated the same way as Fortezza's Ks, i.e., 5611 * it is used to recover the symmetric wrapping key. 5612 * 5613 * The data in wrappedSymmetricWrappingkey is laid out as defined 5614 * in the ECCWrappedKeyInfo structure. 5615 */ 5616 ecWrapped = (ECCWrappedKeyInfo *) pWswk->wrappedSymmetricWrappingkey; 5617 5618 PORT_Assert(ecWrapped->encodedParamLen + ecWrapped->pubValueLen + 5619 ecWrapped->wrappedKeyLen <= MAX_EC_WRAPPED_KEY_BUFLEN); 5620 5621 if (ecWrapped->encodedParamLen + ecWrapped->pubValueLen + 5622 ecWrapped->wrappedKeyLen > MAX_EC_WRAPPED_KEY_BUFLEN) { 5623 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 5624 goto loser; 5625 } 5626 5627 pubWrapKey.keyType = ecKey; 5628 pubWrapKey.u.ec.size = ecWrapped->size; 5629 pubWrapKey.u.ec.DEREncodedParams.len = ecWrapped->encodedParamLen; 5630 pubWrapKey.u.ec.DEREncodedParams.data = ecWrapped->var; 5631 pubWrapKey.u.ec.publicValue.len = ecWrapped->pubValueLen; 5632 pubWrapKey.u.ec.publicValue.data = ecWrapped->var + 5633 ecWrapped->encodedParamLen; 5634 5635 wrappedKey.len = ecWrapped->wrappedKeyLen; 5636 wrappedKey.data = ecWrapped->var + ecWrapped->encodedParamLen + 5637 ecWrapped->pubValueLen; 5638 5639 /* Derive Ks using ECDH */ 5640 Ks = PK11_PubDeriveWithKDF(svrPrivKey, &pubWrapKey, PR_FALSE, NULL, 5641 NULL, CKM_ECDH1_DERIVE, masterWrapMech, 5642 CKA_DERIVE, 0, CKD_NULL, NULL, NULL); 5643 if (Ks == NULL) { 5644 goto loser; 5645 } 5646 5647 /* Use Ks to unwrap the wrapping key */ 5648 unwrappedWrappingKey = PK11_UnwrapSymKey(Ks, masterWrapMech, NULL, 5649 &wrappedKey, masterWrapMech, 5650 CKA_UNWRAP, 0); 5651 PK11_FreeSymKey(Ks); 5652 5653 break; 5654 #endif 5655 5656 default: 5657 /* Assert? */ 5658 SET_ERROR_CODE 5659 goto loser; 5660 } 5661 loser: 5662 return unwrappedWrappingKey; 5663 } 5664 5665 /* Each process sharing the server session ID cache has its own array of 5666 * SymKey pointers for the symmetric wrapping keys that are used to wrap 5667 * the master secrets. There is one key for each KEA type. These Symkeys 5668 * correspond to the wrapped SymKeys kept in the server session cache. 5669 */ 5670 5671 typedef struct { 5672 PK11SymKey * symWrapKey[kt_kea_size]; 5673 } ssl3SymWrapKey; 5674 5675 static PZLock * symWrapKeysLock = NULL; 5676 static ssl3SymWrapKey symWrapKeys[SSL_NUM_WRAP_MECHS]; 5677 5678 SECStatus ssl_FreeSymWrapKeysLock(void) 5679 { 5680 if (symWrapKeysLock) { 5681 PZ_DestroyLock(symWrapKeysLock); 5682 symWrapKeysLock = NULL; 5683 return SECSuccess; 5684 } 5685 PORT_SetError(SEC_ERROR_NOT_INITIALIZED); 5686 return SECFailure; 5687 } 5688 5689 SECStatus 5690 SSL3_ShutdownServerCache(void) 5691 { 5692 int i, j; 5693 5694 if (!symWrapKeysLock) 5695 return SECSuccess; /* lock was never initialized */ 5696 PZ_Lock(symWrapKeysLock); 5697 /* get rid of all symWrapKeys */ 5698 for (i = 0; i < SSL_NUM_WRAP_MECHS; ++i) { 5699 for (j = 0; j < kt_kea_size; ++j) { 5700 PK11SymKey ** pSymWrapKey; 5701 pSymWrapKey = &symWrapKeys[i].symWrapKey[j]; 5702 if (*pSymWrapKey) { 5703 PK11_FreeSymKey(*pSymWrapKey); 5704 *pSymWrapKey = NULL; 5705 } 5706 } 5707 } 5708 5709 PZ_Unlock(symWrapKeysLock); 5710 return SECSuccess; 5711 } 5712 5713 SECStatus ssl_InitSymWrapKeysLock(void) 5714 { 5715 symWrapKeysLock = PZ_NewLock(nssILockOther); 5716 return symWrapKeysLock ? SECSuccess : SECFailure; 5717 } 5718 5719 /* Try to get wrapping key for mechanism from in-memory array. 5720 * If that fails, look for one on disk. 5721 * If that fails, generate a new one, put the new one on disk, 5722 * Put the new key in the in-memory array. 5723 */ 5724 static PK11SymKey * 5725 getWrappingKey( sslSocket * ss, 5726 PK11SlotInfo * masterSecretSlot, 5727 SSL3KEAType exchKeyType, 5728 CK_MECHANISM_TYPE masterWrapMech, 5729 void * pwArg) 5730 { 5731 SECKEYPrivateKey * svrPrivKey; 5732 SECKEYPublicKey * svrPubKey = NULL; 5733 PK11SymKey * unwrappedWrappingKey = NULL; 5734 PK11SymKey ** pSymWrapKey; 5735 CK_MECHANISM_TYPE asymWrapMechanism = CKM_INVALID_MECHANISM; 5736 int length; 5737 int symWrapMechIndex; 5738 SECStatus rv; 5739 SECItem wrappedKey; 5740 SSLWrappedSymWrappingKey wswk; 5741 #ifdef NSS_ENABLE_ECC 5742 PK11SymKey * Ks = NULL; 5743 SECKEYPublicKey *pubWrapKey = NULL; 5744 SECKEYPrivateKey *privWrapKey = NULL; 5745 ECCWrappedKeyInfo *ecWrapped; 5746 #endif /* NSS_ENABLE_ECC */ 5747 5748 svrPrivKey = ss->serverCerts[exchKeyType].SERVERKEY; 5749 PORT_Assert(svrPrivKey != NULL); 5750 if (!svrPrivKey) { 5751 return NULL; /* why are we here?!? */ 5752 } 5753 5754 symWrapMechIndex = ssl_FindIndexByWrapMechanism(masterWrapMech); 5755 PORT_Assert(symWrapMechIndex >= 0); 5756 if (symWrapMechIndex < 0) 5757 return NULL; /* invalid masterWrapMech. */ 5758 5759 pSymWrapKey = &symWrapKeys[symWrapMechIndex].symWrapKey[exchKeyType]; 5760 5761 ssl_InitSessionCacheLocks(); 5762 5763 PZ_Lock(symWrapKeysLock); 5764 5765 unwrappedWrappingKey = *pSymWrapKey; 5766 if (unwrappedWrappingKey != NULL) { 5767 if (PK11_VerifyKeyOK(unwrappedWrappingKey)) { 5768 unwrappedWrappingKey = PK11_ReferenceSymKey(unwrappedWrappingKey); 5769 goto done; 5770 } 5771 /* slot series has changed, so this key is no good any more. */ 5772 PK11_FreeSymKey(unwrappedWrappingKey); 5773 *pSymWrapKey = unwrappedWrappingKey = NULL; 5774 } 5775 5776 /* Try to get wrapped SymWrapping key out of the (disk) cache. */ 5777 /* Following call fills in wswk on success. */ 5778 if (ssl_GetWrappingKey(symWrapMechIndex, exchKeyType, &wswk)) { 5779 /* found the wrapped sym wrapping key on disk. */ 5780 unwrappedWrappingKey = 5781 ssl_UnwrapSymWrappingKey(&wswk, svrPrivKey, exchKeyType, 5782 masterWrapMech, pwArg); 5783 if (unwrappedWrappingKey) { 5784 goto install; 5785 } 5786 } 5787 5788 if (!masterSecretSlot) /* caller doesn't want to create a new one. */ 5789 goto loser; 5790 5791 length = PK11_GetBestKeyLength(masterSecretSlot, masterWrapMech); 5792 /* Zero length means fixed key length algorithm, or error. 5793 * It's ambiguous. 5794 */ 5795 unwrappedWrappingKey = PK11_KeyGen(masterSecretSlot, masterWrapMech, NULL, 5796 length, pwArg); 5797 if (!unwrappedWrappingKey) { 5798 goto loser; 5799 } 5800 5801 /* Prepare the buffer to receive the wrappedWrappingKey, 5802 * the symmetric wrapping key wrapped using the server's pub key. 5803 */ 5804 PORT_Memset(&wswk, 0, sizeof wswk); /* eliminate UMRs. */ 5805 5806 if (ss->serverCerts[exchKeyType].serverKeyPair) { 5807 svrPubKey = ss->serverCerts[exchKeyType].serverKeyPair->pubKey; 5808 } 5809 if (svrPubKey == NULL) { 5810 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 5811 goto loser; 5812 } 5813 wrappedKey.type = siBuffer; 5814 wrappedKey.len = SECKEY_PublicKeyStrength(svrPubKey); 5815 wrappedKey.data = wswk.wrappedSymmetricWrappingkey; 5816 5817 PORT_Assert(wrappedKey.len <= sizeof wswk.wrappedSymmetricWrappingkey); 5818 if (wrappedKey.len > sizeof wswk.wrappedSymmetricWrappingkey) 5819 goto loser; 5820 5821 /* wrap symmetric wrapping key in server's public key. */ 5822 switch (exchKeyType) { 5823 case kt_rsa: 5824 asymWrapMechanism = CKM_RSA_PKCS; 5825 rv = PK11_PubWrapSymKey(asymWrapMechanism, svrPubKey, 5826 unwrappedWrappingKey, &wrappedKey); 5827 break; 5828 5829 #ifdef NSS_ENABLE_ECC 5830 case kt_ecdh: 5831 /* 5832 * We generate an ephemeral EC key pair. Perform an ECDH 5833 * computation involving this ephemeral EC public key and 5834 * the SSL server's (long-term) EC private key. The resulting 5835 * shared secret is treated in the same way as Fortezza's Ks, 5836 * i.e., it is used to wrap the wrapping key. To facilitate 5837 * unwrapping in ssl_UnwrapWrappingKey, we also store all 5838 * relevant info about the ephemeral EC public key in 5839 * wswk.wrappedSymmetricWrappingkey and lay it out as 5840 * described in the ECCWrappedKeyInfo structure. 5841 */ 5842 PORT_Assert(svrPubKey->keyType == ecKey); 5843 if (svrPubKey->keyType != ecKey) { 5844 /* something is wrong in sslsecur.c if this isn't an ecKey */ 5845 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 5846 rv = SECFailure; 5847 goto ec_cleanup; 5848 } 5849 5850 privWrapKey = SECKEY_CreateECPrivateKey( 5851 &svrPubKey->u.ec.DEREncodedParams, &pubWrapKey, NULL); 5852 if ((privWrapKey == NULL) || (pubWrapKey == NULL)) { 5853 rv = SECFailure; 5854 goto ec_cleanup; 5855 } 5856 5857 /* Set the key size in bits */ 5858 if (pubWrapKey->u.ec.size == 0) { 5859 pubWrapKey->u.ec.size = SECKEY_PublicKeyStrengthInBits(svrPubKey); 5860 } 5861 5862 PORT_Assert(pubWrapKey->u.ec.DEREncodedParams.len + 5863 pubWrapKey->u.ec.publicValue.len < MAX_EC_WRAPPED_KEY_BUFLEN); 5864 if (pubWrapKey->u.ec.DEREncodedParams.len + 5865 pubWrapKey->u.ec.publicValue.len >= MAX_EC_WRAPPED_KEY_BUFLEN) { 5866 PORT_SetError(SEC_ERROR_INVALID_KEY); 5867 rv = SECFailure; 5868 goto ec_cleanup; 5869 } 5870 5871 /* Derive Ks using ECDH */ 5872 Ks = PK11_PubDeriveWithKDF(svrPrivKey, pubWrapKey, PR_FALSE, NULL, 5873 NULL, CKM_ECDH1_DERIVE, masterWrapMech, 5874 CKA_DERIVE, 0, CKD_NULL, NULL, NULL); 5875 if (Ks == NULL) { 5876 rv = SECFailure; 5877 goto ec_cleanup; 5878 } 5879 5880 ecWrapped = (ECCWrappedKeyInfo *) (wswk.wrappedSymmetricWrappingkey); 5881 ecWrapped->size = pubWrapKey->u.ec.size; 5882 ecWrapped->encodedParamLen = pubWrapKey->u.ec.DEREncodedParams.len; 5883 PORT_Memcpy(ecWrapped->var, pubWrapKey->u.ec.DEREncodedParams.data, 5884 pubWrapKey->u.ec.DEREncodedParams.len); 5885 5886 ecWrapped->pubValueLen = pubWrapKey->u.ec.publicValue.len; 5887 PORT_Memcpy(ecWrapped->var + ecWrapped->encodedParamLen, 5888 pubWrapKey->u.ec.publicValue.data, 5889 pubWrapKey->u.ec.publicValue.len); 5890 5891 wrappedKey.len = MAX_EC_WRAPPED_KEY_BUFLEN - 5892 (ecWrapped->encodedParamLen + ecWrapped->pubValueLen); 5893 wrappedKey.data = ecWrapped->var + ecWrapped->encodedParamLen + 5894 ecWrapped->pubValueLen; 5895 5896 /* wrap symmetricWrapping key with the local Ks */ 5897 rv = PK11_WrapSymKey(masterWrapMech, NULL, Ks, 5898 unwrappedWrappingKey, &wrappedKey); 5899 5900 if (rv != SECSuccess) { 5901 goto ec_cleanup; 5902 } 5903 5904 /* Write down the length of wrapped key in the buffer 5905 * wswk.wrappedSymmetricWrappingkey at the appropriate offset 5906 */ 5907 ecWrapped->wrappedKeyLen = wrappedKey.len; 5908 5909 ec_cleanup: 5910 if (privWrapKey) SECKEY_DestroyPrivateKey(privWrapKey); 5911 if (pubWrapKey) SECKEY_DestroyPublicKey(pubWrapKey); 5912 if (Ks) PK11_FreeSymKey(Ks); 5913 asymWrapMechanism = masterWrapMech; 5914 break; 5915 #endif /* NSS_ENABLE_ECC */ 5916 5917 default: 5918 rv = SECFailure; 5919 break; 5920 } 5921 5922 if (rv != SECSuccess) { 5923 ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); 5924 goto loser; 5925 } 5926 5927 PORT_Assert(asymWrapMechanism != CKM_INVALID_MECHANISM); 5928 5929 wswk.symWrapMechanism = masterWrapMech; 5930 wswk.symWrapMechIndex = symWrapMechIndex; 5931 wswk.asymWrapMechanism = asymWrapMechanism; 5932 wswk.exchKeyType = exchKeyType; 5933 wswk.wrappedSymKeyLen = wrappedKey.len; 5934 5935 /* put it on disk. */ 5936 /* If the wrapping key for this KEA type has already been set, 5937 * then abandon the value we just computed and 5938 * use the one we got from the disk. 5939 */ 5940 if (ssl_SetWrappingKey(&wswk)) { 5941 /* somebody beat us to it. The original contents of our wswk 5942 * has been replaced with the content on disk. Now, discard 5943 * the key we just created and unwrap this new one. 5944 */ 5945 PK11_FreeSymKey(unwrappedWrappingKey); 5946 5947 unwrappedWrappingKey = 5948 ssl_UnwrapSymWrappingKey(&wswk, svrPrivKey, exchKeyType, 5949 masterWrapMech, pwArg); 5950 } 5951 5952 install: 5953 if (unwrappedWrappingKey) { 5954 *pSymWrapKey = PK11_ReferenceSymKey(unwrappedWrappingKey); 5955 } 5956 5957 loser: 5958 done: 5959 PZ_Unlock(symWrapKeysLock); 5960 return unwrappedWrappingKey; 5961 } 5962 5963 /* hexEncode hex encodes |length| bytes from |in| and writes it as |length*2| 5964 * bytes to |out|. */ 5965 static void 5966 hexEncode(char *out, const unsigned char *in, unsigned int length) 5967 { 5968 static const char hextable[] = "0123456789abcdef"; 5969 unsigned int i; 5970 5971 for (i = 0; i < length; i++) { 5972 *(out++) = hextable[in[i] >> 4]; 5973 *(out++) = hextable[in[i] & 15]; 5974 } 5975 } 5976 5977 /* Called from ssl3_SendClientKeyExchange(). */ 5978 /* Presently, this always uses PKCS11. There is no bypass for this. */ 5979 static SECStatus 5980 sendRSAClientKeyExchange(sslSocket * ss, SECKEYPublicKey * svrPubKey) 5981 { 5982 PK11SymKey * pms = NULL; 5983 SECStatus rv = SECFailure; 5984 SECItem enc_pms = {siBuffer, NULL, 0}; 5985 PRBool isTLS; 5986 5987 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 5988 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); 5989 5990 /* Generate the pre-master secret ... */ 5991 ssl_GetSpecWriteLock(ss); 5992 isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0); 5993 5994 pms = ssl3_GenerateRSAPMS(ss, ss->ssl3.pwSpec, NULL); 5995 ssl_ReleaseSpecWriteLock(ss); 5996 if (pms == NULL) { 5997 ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); 5998 goto loser; 5999 } 6000 6001 /* Get the wrapped (encrypted) pre-master secret, enc_pms */ 6002 enc_pms.len = SECKEY_PublicKeyStrength(svrPubKey); 6003 enc_pms.data = (unsigned char*)PORT_Alloc(enc_pms.len); 6004 if (enc_pms.data == NULL) { 6005 goto loser; /* err set by PORT_Alloc */ 6006 } 6007 6008 /* wrap pre-master secret in server's public key. */ 6009 rv = PK11_PubWrapSymKey(CKM_RSA_PKCS, svrPubKey, pms, &enc_pms); 6010 if (rv != SECSuccess) { 6011 ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); 6012 goto loser; 6013 } 6014 6015 if (ssl_keylog_iob) { 6016 SECStatus extractRV = PK11_ExtractKeyValue(pms); 6017 if (extractRV == SECSuccess) { 6018 SECItem * keyData = PK11_GetKeyData(pms); 6019 if (keyData && keyData->data && keyData->len) { 6020 #ifdef TRACE 6021 if (ssl_trace >= 100) { 6022 ssl_PrintBuf(ss, "Pre-Master Secret", 6023 keyData->data, keyData->len); 6024 } 6025 #endif 6026 if (ssl_keylog_iob && enc_pms.len >= 8 && keyData->len == 48) { 6027 /* https://developer.mozilla.org/en/NSS_Key_Log_Format */ 6028 6029 /* There could be multiple, concurrent writers to the 6030 * keylog, so we have to do everything in a single call to 6031 * fwrite. */ 6032 char buf[4 + 8*2 + 1 + 48*2 + 1]; 6033 6034 strcpy(buf, "RSA "); 6035 hexEncode(buf + 4, enc_pms.data, 8); 6036 buf[20] = ' '; 6037 hexEncode(buf + 21, keyData->data, 48); 6038 buf[sizeof(buf) - 1] = '\n'; 6039 6040 fwrite(buf, sizeof(buf), 1, ssl_keylog_iob); 6041 fflush(ssl_keylog_iob); 6042 } 6043 } 6044 } 6045 } 6046 6047 rv = ssl3_InitPendingCipherSpec(ss, pms); 6048 PK11_FreeSymKey(pms); pms = NULL; 6049 6050 if (rv != SECSuccess) { 6051 ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); 6052 goto loser; 6053 } 6054 6055 rv = ssl3_AppendHandshakeHeader(ss, client_key_exchange, 6056 isTLS ? enc_pms.len + 2 : enc_pms.len); 6057 if (rv != SECSuccess) { 6058 goto loser; /* err set by ssl3_AppendHandshake* */ 6059 } 6060 if (isTLS) { 6061 rv = ssl3_AppendHandshakeVariable(ss, enc_pms.data, enc_pms.len, 2); 6062 } else { 6063 rv = ssl3_AppendHandshake(ss, enc_pms.data, enc_pms.len); 6064 } 6065 if (rv != SECSuccess) { 6066 goto loser; /* err set by ssl3_AppendHandshake* */ 6067 } 6068 6069 rv = SECSuccess; 6070 6071 loser: 6072 if (enc_pms.data != NULL) { 6073 PORT_Free(enc_pms.data); 6074 } 6075 if (pms != NULL) { 6076 PK11_FreeSymKey(pms); 6077 } 6078 return rv; 6079 } 6080 6081 /* Called from ssl3_SendClientKeyExchange(). */ 6082 /* Presently, this always uses PKCS11. There is no bypass for this. */ 6083 static SECStatus 6084 sendDHClientKeyExchange(sslSocket * ss, SECKEYPublicKey * svrPubKey) 6085 { 6086 PK11SymKey * pms = NULL; 6087 SECStatus rv = SECFailure; 6088 PRBool isTLS; 6089 CK_MECHANISM_TYPE target; 6090 6091 SECKEYDHParams dhParam; /* DH parameters */ 6092 SECKEYPublicKey *pubKey = NULL; /* Ephemeral DH key */ 6093 SECKEYPrivateKey *privKey = NULL; /* Ephemeral DH key */ 6094 6095 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 6096 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); 6097 6098 isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0); 6099 6100 /* Copy DH parameters from server key */ 6101 6102 if (svrPubKey->keyType != dhKey) { 6103 PORT_SetError(SEC_ERROR_BAD_KEY); 6104 goto loser; 6105 } 6106 dhParam.prime.data = svrPubKey->u.dh.prime.data; 6107 dhParam.prime.len = svrPubKey->u.dh.prime.len; 6108 dhParam.base.data = svrPubKey->u.dh.base.data; 6109 dhParam.base.len = svrPubKey->u.dh.base.len; 6110 6111 /* Generate ephemeral DH keypair */ 6112 privKey = SECKEY_CreateDHPrivateKey(&dhParam, &pubKey, NULL); 6113 if (!privKey || !pubKey) { 6114 ssl_MapLowLevelError(SEC_ERROR_KEYGEN_FAIL); 6115 rv = SECFailure; 6116 goto loser; 6117 } 6118 PRINT_BUF(50, (ss, "DH public value:", 6119 pubKey->u.dh.publicValue.data, 6120 pubKey->u.dh.publicValue.len)); 6121 6122 if (isTLS) target = CKM_TLS_MASTER_KEY_DERIVE_DH; 6123 else target = CKM_SSL3_MASTER_KEY_DERIVE_DH; 6124 6125 /* Determine the PMS */ 6126 6127 pms = PK11_PubDerive(privKey, svrPubKey, PR_FALSE, NULL, NULL, 6128 CKM_DH_PKCS_DERIVE, target, CKA_DERIVE, 0, NULL); 6129 6130 if (pms == NULL) { 6131 ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); 6132 goto loser; 6133 } 6134 6135 SECKEY_DestroyPrivateKey(privKey); 6136 privKey = NULL; 6137 6138 rv = ssl3_InitPendingCipherSpec(ss, pms); 6139 PK11_FreeSymKey(pms); pms = NULL; 6140 6141 if (rv != SECSuccess) { 6142 ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); 6143 goto loser; 6144 } 6145 6146 rv = ssl3_AppendHandshakeHeader(ss, client_key_exchange, 6147 pubKey->u.dh.publicValue.len + 2); 6148 if (rv != SECSuccess) { 6149 goto loser; /* err set by ssl3_AppendHandshake* */ 6150 } 6151 rv = ssl3_AppendHandshakeVariable(ss, 6152 pubKey->u.dh.publicValue.data, 6153 pubKey->u.dh.publicValue.len, 2); 6154 SECKEY_DestroyPublicKey(pubKey); 6155 pubKey = NULL; 6156 6157 if (rv != SECSuccess) { 6158 goto loser; /* err set by ssl3_AppendHandshake* */ 6159 } 6160 6161 rv = SECSuccess; 6162 6163 6164 loser: 6165 6166 if(pms) PK11_FreeSymKey(pms); 6167 if(privKey) SECKEY_DestroyPrivateKey(privKey); 6168 if(pubKey) SECKEY_DestroyPublicKey(pubKey); 6169 return rv; 6170 } 6171 6172 6173 6174 6175 6176 /* Called from ssl3_HandleServerHelloDone(). */ 6177 static SECStatus 6178 ssl3_SendClientKeyExchange(sslSocket *ss) 6179 { 6180 SECKEYPublicKey * serverKey = NULL; 6181 SECStatus rv = SECFailure; 6182 PRBool isTLS; 6183 6184 SSL_TRC(3, ("%d: SSL3[%d]: send client_key_exchange handshake", 6185 SSL_GETPID(), ss->fd)); 6186 6187 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); 6188 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 6189 6190 if (ss->sec.peerKey == NULL) { 6191 serverKey = CERT_ExtractPublicKey(ss->sec.peerCert); 6192 if (serverKey == NULL) { 6193 ssl_MapLowLevelError(SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE); 6194 return SECFailure; 6195 } 6196 } else { 6197 serverKey = ss->sec.peerKey; 6198 ss->sec.peerKey = NULL; /* we're done with it now */ 6199 } 6200 6201 isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0); 6202 /* enforce limits on kea key sizes. */ 6203 if (ss->ssl3.hs.kea_def->is_limited) { 6204 int keyLen = SECKEY_PublicKeyStrength(serverKey); /* bytes */ 6205 6206 if (keyLen * BPB > ss->ssl3.hs.kea_def->key_size_limit) { 6207 if (isTLS) 6208 (void)SSL3_SendAlert(ss, alert_fatal, export_restriction); 6209 else 6210 (void)ssl3_HandshakeFailure(ss); 6211 PORT_SetError(SSL_ERROR_PUB_KEY_SIZE_LIMIT_EXCEEDED); 6212 goto loser; 6213 } 6214 } 6215 6216 ss->sec.keaType = ss->ssl3.hs.kea_def->exchKeyType; 6217 ss->sec.keaKeyBits = SECKEY_PublicKeyStrengthInBits(serverKey); 6218 6219 switch (ss->ssl3.hs.kea_def->exchKeyType) { 6220 case kt_rsa: 6221 rv = sendRSAClientKeyExchange(ss, serverKey); 6222 break; 6223 6224 case kt_dh: 6225 rv = sendDHClientKeyExchange(ss, serverKey); 6226 break; 6227 6228 #ifdef NSS_ENABLE_ECC 6229 case kt_ecdh: 6230 rv = ssl3_SendECDHClientKeyExchange(ss, serverKey); 6231 break; 6232 #endif /* NSS_ENABLE_ECC */ 6233 6234 default: 6235 /* got an unknown or unsupported Key Exchange Algorithm. */ 6236 SEND_ALERT 6237 PORT_SetError(SEC_ERROR_UNSUPPORTED_KEYALG); 6238 break; 6239 } 6240 6241 SSL_TRC(3, ("%d: SSL3[%d]: DONE sending client_key_exchange", 6242 SSL_GETPID(), ss->fd)); 6243 6244 loser: 6245 if (serverKey) 6246 SECKEY_DestroyPublicKey(serverKey); 6247 return rv; /* err code already set. */ 6248 } 6249 6250 /* Called from ssl3_HandleServerHelloDone(). */ 6251 static SECStatus 6252 ssl3_SendCertificateVerify(sslSocket *ss) 6253 { 6254 SECStatus rv = SECFailure; 6255 PRBool isTLS; 6256 PRBool isTLS12; 6257 SECItem buf = {siBuffer, NULL, 0}; 6258 SSL3Hashes hashes; 6259 KeyType keyType; 6260 unsigned int len; 6261 SSL3SignatureAndHashAlgorithm sigAndHash; 6262 6263 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); 6264 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 6265 6266 SSL_TRC(3, ("%d: SSL3[%d]: send certificate_verify handshake", 6267 SSL_GETPID(), ss->fd)); 6268 6269 ssl_GetSpecReadLock(ss); 6270 if (ss->ssl3.hs.hashType == handshake_hash_single && 6271 ss->ssl3.hs.backupHash) { 6272 rv = ssl3_ComputeBackupHandshakeHashes(ss, &hashes); 6273 PORT_Assert(!ss->ssl3.hs.backupHash); 6274 } else { 6275 rv = ssl3_ComputeHandshakeHashes(ss, ss->ssl3.pwSpec, &hashes, 0); 6276 } 6277 ssl_ReleaseSpecReadLock(ss); 6278 if (rv != SECSuccess) { 6279 goto done; /* err code was set by ssl3_ComputeHandshakeHashes */ 6280 } 6281 6282 isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0); 6283 isTLS12 = (PRBool)(ss->ssl3.pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); 6284 if (ss->ssl3.platformClientKey) { 6285 #ifdef NSS_PLATFORM_CLIENT_AUTH 6286 keyType = CERT_GetCertKeyType( 6287 &ss->ssl3.clientCertificate->subjectPublicKeyInfo); 6288 rv = ssl3_PlatformSignHashes( 6289 &hashes, ss->ssl3.platformClientKey, &buf, isTLS, keyType); 6290 ssl_FreePlatformKey(ss->ssl3.platformClientKey); 6291 ss->ssl3.platformClientKey = (PlatformKey)NULL; 6292 #endif /* NSS_PLATFORM_CLIENT_AUTH */ 6293 } else { 6294 keyType = ss->ssl3.clientPrivateKey->keyType; 6295 rv = ssl3_SignHashes(&hashes, ss->ssl3.clientPrivateKey, &buf, isTLS); 6296 if (rv == SECSuccess) { 6297 PK11SlotInfo * slot; 6298 sslSessionID * sid = ss->sec.ci.sid; 6299 6300 /* Remember the info about the slot that did the signing. 6301 ** Later, when doing an SSL restart handshake, verify this. 6302 ** These calls are mere accessors, and can't fail. 6303 */ 6304 slot = PK11_GetSlotFromPrivateKey(ss->ssl3.clientPrivateKey); 6305 sid->u.ssl3.clAuthSeries = PK11_GetSlotSeries(slot); 6306 sid->u.ssl3.clAuthSlotID = PK11_GetSlotID(slot); 6307 sid->u.ssl3.clAuthModuleID = PK11_GetModuleID(slot); 6308 sid->u.ssl3.clAuthValid = PR_TRUE; 6309 PK11_FreeSlot(slot); 6310 } 6311 SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); 6312 ss->ssl3.clientPrivateKey = NULL; 6313 } 6314 if (rv != SECSuccess) { 6315 goto done; /* err code was set by ssl3_SignHashes */ 6316 } 6317 6318 len = buf.len + 2 + (isTLS12 ? 2 : 0); 6319 6320 rv = ssl3_AppendHandshakeHeader(ss, certificate_verify, len); 6321 if (rv != SECSuccess) { 6322 goto done; /* error code set by AppendHandshake */ 6323 } 6324 if (isTLS12) { 6325 rv = ssl3_TLSSignatureAlgorithmForKeyType(keyType, 6326 &sigAndHash.sigAlg); 6327 if (rv != SECSuccess) { 6328 goto done; 6329 } 6330 sigAndHash.hashAlg = hashes.hashAlg; 6331 6332 rv = ssl3_AppendSignatureAndHashAlgorithm(ss, &sigAndHash); 6333 if (rv != SECSuccess) { 6334 goto done; /* err set by AppendHandshake. */ 6335 } 6336 } 6337 rv = ssl3_AppendHandshakeVariable(ss, buf.data, buf.len, 2); 6338 if (rv != SECSuccess) { 6339 goto done; /* error code set by AppendHandshake */ 6340 } 6341 6342 done: 6343 if (buf.data) 6344 PORT_Free(buf.data); 6345 return rv; 6346 } 6347 6348 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete 6349 * ssl3 ServerHello message. 6350 * Caller must hold Handshake and RecvBuf locks. 6351 */ 6352 static SECStatus 6353 ssl3_HandleServerHello(sslSocket *ss, SSL3Opaque *b, PRUint32 length) 6354 { 6355 sslSessionID *sid = ss->sec.ci.sid; 6356 PRInt32 temp; /* allow for consume number failure */ 6357 PRBool suite_found = PR_FALSE; 6358 int i; 6359 int errCode = SSL_ERROR_RX_MALFORMED_SERVER_HELLO; 6360 SECStatus rv; 6361 SECItem sidBytes = {siBuffer, NULL, 0}; 6362 PRBool sid_match; 6363 PRBool isTLS = PR_FALSE; 6364 SSL3AlertDescription desc = illegal_parameter; 6365 SSL3ProtocolVersion version; 6366 6367 SSL_TRC(3, ("%d: SSL3[%d]: handle server_hello handshake", 6368 SSL_GETPID(), ss->fd)); 6369 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 6370 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 6371 PORT_Assert( ss->ssl3.initialized ); 6372 6373 if (ss->ssl3.hs.ws != wait_server_hello) { 6374 errCode = SSL_ERROR_RX_UNEXPECTED_SERVER_HELLO; 6375 desc = unexpected_message; 6376 goto alert_loser; 6377 } 6378 6379 /* clean up anything left from previous handshake. */ 6380 if (ss->ssl3.clientCertChain != NULL) { 6381 CERT_DestroyCertificateList(ss->ssl3.clientCertChain); 6382 ss->ssl3.clientCertChain = NULL; 6383 } 6384 if (ss->ssl3.clientCertificate != NULL) { 6385 CERT_DestroyCertificate(ss->ssl3.clientCertificate); 6386 ss->ssl3.clientCertificate = NULL; 6387 } 6388 if (ss->ssl3.clientPrivateKey != NULL) { 6389 SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); 6390 ss->ssl3.clientPrivateKey = NULL; 6391 } 6392 #ifdef NSS_PLATFORM_CLIENT_AUTH 6393 if (ss->ssl3.platformClientKey) { 6394 ssl_FreePlatformKey(ss->ssl3.platformClientKey); 6395 ss->ssl3.platformClientKey = (PlatformKey)NULL; 6396 } 6397 #endif /* NSS_PLATFORM_CLIENT_AUTH */ 6398 6399 if (ss->ssl3.channelID != NULL) { 6400 SECKEY_DestroyPrivateKey(ss->ssl3.channelID); 6401 ss->ssl3.channelID = NULL; 6402 } 6403 if (ss->ssl3.channelIDPub != NULL) { 6404 SECKEY_DestroyPublicKey(ss->ssl3.channelIDPub); 6405 ss->ssl3.channelIDPub = NULL; 6406 } 6407 6408 temp = ssl3_ConsumeHandshakeNumber(ss, 2, &b, &length); 6409 if (temp < 0) { 6410 goto loser; /* alert has been sent */ 6411 } 6412 version = (SSL3ProtocolVersion)temp; 6413 6414 if (IS_DTLS(ss)) { 6415 /* RFC 4347 required that you verify that the server versions 6416 * match (Section 4.2.1) in the HelloVerifyRequest and the 6417 * ServerHello. 6418 * 6419 * RFC 6347 suggests (SHOULD) that servers always use 1.0 6420 * in HelloVerifyRequest and allows the versions not to match, 6421 * especially when 1.2 is being negotiated. 6422 * 6423 * Therefore we do not check for matching here. 6424 */ 6425 version = dtls_DTLSVersionToTLSVersion(version); 6426 if (version == 0) { /* Insane version number */ 6427 goto alert_loser; 6428 } 6429 } 6430 6431 rv = ssl3_NegotiateVersion(ss, version, PR_FALSE); 6432 if (rv != SECSuccess) { 6433 desc = (version > SSL_LIBRARY_VERSION_3_0) ? protocol_version 6434 : handshake_failure; 6435 errCode = SSL_ERROR_NO_CYPHER_OVERLAP; 6436 goto alert_loser; 6437 } 6438 isTLS = (ss->version > SSL_LIBRARY_VERSION_3_0); 6439 6440 rv = ssl3_InitHandshakeHashes(ss); 6441 if (rv != SECSuccess) { 6442 desc = internal_error; 6443 errCode = PORT_GetError(); 6444 goto alert_loser; 6445 } 6446 6447 rv = ssl3_ConsumeHandshake( 6448 ss, &ss->ssl3.hs.server_random, SSL3_RANDOM_LENGTH, &b, &length); 6449 if (rv != SECSuccess) { 6450 goto loser; /* alert has been sent */ 6451 } 6452 6453 rv = ssl3_ConsumeHandshakeVariable(ss, &sidBytes, 1, &b, &length); 6454 if (rv != SECSuccess) { 6455 goto loser; /* alert has been sent */ 6456 } 6457 if (sidBytes.len > SSL3_SESSIONID_BYTES) { 6458 if (isTLS) 6459 desc = decode_error; 6460 goto alert_loser; /* malformed. */ 6461 } 6462 6463 /* find selected cipher suite in our list. */ 6464 temp = ssl3_ConsumeHandshakeNumber(ss, 2, &b, &length); 6465 if (temp < 0) { 6466 goto loser; /* alert has been sent */ 6467 } 6468 ssl3_config_match_init(ss); 6469 for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) { 6470 ssl3CipherSuiteCfg *suite = &ss->cipherSuites[i]; 6471 if (temp == suite->cipher_suite) { 6472 SSLVersionRange vrange = {ss->version, ss->version}; 6473 if (!config_match(suite, ss->ssl3.policy, PR_TRUE, &vrange)) { 6474 /* config_match already checks whether the cipher suite is 6475 * acceptable for the version, but the check is repeated here 6476 * in order to give a more precise error code. */ 6477 if (!ssl3_CipherSuiteAllowedForVersionRange(temp, &vrange)) { 6478 desc = handshake_failure; 6479 errCode = SSL_ERROR_CIPHER_DISALLOWED_FOR_VERSION; 6480 goto alert_loser; 6481 } 6482 6483 break; /* failure */ 6484 } 6485 6486 suite_found = PR_TRUE; 6487 break; /* success */ 6488 } 6489 } 6490 if (!suite_found) { 6491 desc = handshake_failure; 6492 errCode = SSL_ERROR_NO_CYPHER_OVERLAP; 6493 goto alert_loser; 6494 } 6495 ss->ssl3.hs.cipher_suite = (ssl3CipherSuite)temp; 6496 ss->ssl3.hs.suite_def = ssl_LookupCipherSuiteDef((ssl3CipherSuite)temp); 6497 PORT_Assert(ss->ssl3.hs.suite_def); 6498 if (!ss->ssl3.hs.suite_def) { 6499 PORT_SetError(errCode = SEC_ERROR_LIBRARY_FAILURE); 6500 goto loser; /* we don't send alerts for our screw-ups. */ 6501 } 6502 6503 /* find selected compression method in our list. */ 6504 temp = ssl3_ConsumeHandshakeNumber(ss, 1, &b, &length); 6505 if (temp < 0) { 6506 goto loser; /* alert has been sent */ 6507 } 6508 suite_found = PR_FALSE; 6509 for (i = 0; i < compressionMethodsCount; i++) { 6510 if (temp == compressions[i]) { 6511 if (!compressionEnabled(ss, compressions[i])) { 6512 break; /* failure */ 6513 } 6514 suite_found = PR_TRUE; 6515 break; /* success */ 6516 } 6517 } 6518 if (!suite_found) { 6519 desc = handshake_failure; 6520 errCode = SSL_ERROR_NO_COMPRESSION_OVERLAP; 6521 goto alert_loser; 6522 } 6523 ss->ssl3.hs.compression = (SSLCompressionMethod)temp; 6524 6525 /* Note that if !isTLS and the extra stuff is not extensions, we 6526 * do NOT goto alert_loser. 6527 * There are some old SSL 3.0 implementations that do send stuff 6528 * after the end of the server hello, and we deliberately ignore 6529 * such stuff in the interest of maximal interoperability (being 6530 * "generous in what you accept"). 6531 * Update: Starting in NSS 3.12.6, we handle the renegotiation_info 6532 * extension in SSL 3.0. 6533 */ 6534 if (length != 0) { 6535 SECItem extensions; 6536 rv = ssl3_ConsumeHandshakeVariable(ss, &extensions, 2, &b, &length); 6537 if (rv != SECSuccess || length != 0) { 6538 if (isTLS) 6539 goto alert_loser; 6540 } else { 6541 rv = ssl3_HandleHelloExtensions(ss, &extensions.data, 6542 &extensions.len); 6543 if (rv != SECSuccess) 6544 goto alert_loser; 6545 } 6546 } 6547 if ((ss->opt.requireSafeNegotiation || 6548 (ss->firstHsDone && (ss->peerRequestedProtection || 6549 ss->opt.enableRenegotiation == SSL_RENEGOTIATE_REQUIRES_XTN))) && 6550 !ssl3_ExtensionNegotiated(ss, ssl_renegotiation_info_xtn)) { 6551 desc = handshake_failure; 6552 errCode = ss->firstHsDone ? SSL_ERROR_RENEGOTIATION_NOT_ALLOWED 6553 : SSL_ERROR_UNSAFE_NEGOTIATION; 6554 goto alert_loser; 6555 } 6556 6557 /* Any errors after this point are not "malformed" errors. */ 6558 desc = handshake_failure; 6559 6560 /* we need to call ssl3_SetupPendingCipherSpec here so we can check the 6561 * key exchange algorithm. */ 6562 rv = ssl3_SetupPendingCipherSpec(ss); 6563 if (rv != SECSuccess) { 6564 goto alert_loser; /* error code is set. */ 6565 } 6566 6567 /* We may or may not have sent a session id, we may get one back or 6568 * not and if so it may match the one we sent. 6569 * Attempt to restore the master secret to see if this is so... 6570 * Don't consider failure to find a matching SID an error. 6571 */ 6572 sid_match = (PRBool)(sidBytes.len > 0 && 6573 sidBytes.len == sid->u.ssl3.sessionIDLength && 6574 !PORT_Memcmp(sid->u.ssl3.sessionID, sidBytes.data, sidBytes.len)); 6575 6576 if (sid_match && 6577 sid->version == ss->version && 6578 sid->u.ssl3.cipherSuite == ss->ssl3.hs.cipher_suite) do { 6579 ssl3CipherSpec *pwSpec = ss->ssl3.pwSpec; 6580 6581 SECItem wrappedMS; /* wrapped master secret. */ 6582 6583 ss->sec.authAlgorithm = sid->authAlgorithm; 6584 ss->sec.authKeyBits = sid->authKeyBits; 6585 ss->sec.keaType = sid->keaType; 6586 ss->sec.keaKeyBits = sid->keaKeyBits; 6587 6588 /* 3 cases here: 6589 * a) key is wrapped (implies using PKCS11) 6590 * b) key is unwrapped, but we're still using PKCS11 6591 * c) key is unwrapped, and we're bypassing PKCS11. 6592 */ 6593 if (sid->u.ssl3.keys.msIsWrapped) { 6594 PK11SlotInfo *slot; 6595 PK11SymKey * wrapKey; /* wrapping key */ 6596 CK_FLAGS keyFlags = 0; 6597 6598 #ifndef NO_PKCS11_BYPASS 6599 if (ss->opt.bypassPKCS11) { 6600 /* we cannot restart a non-bypass session in a 6601 ** bypass socket. 6602 */ 6603 break; 6604 } 6605 #endif 6606 /* unwrap master secret with PKCS11 */ 6607 slot = SECMOD_LookupSlot(sid->u.ssl3.masterModuleID, 6608 sid->u.ssl3.masterSlotID); 6609 if (slot == NULL) { 6610 break; /* not considered an error. */ 6611 } 6612 if (!PK11_IsPresent(slot)) { 6613 PK11_FreeSlot(slot); 6614 break; /* not considered an error. */ 6615 } 6616 wrapKey = PK11_GetWrapKey(slot, sid->u.ssl3.masterWrapIndex, 6617 sid->u.ssl3.masterWrapMech, 6618 sid->u.ssl3.masterWrapSeries, 6619 ss->pkcs11PinArg); 6620 PK11_FreeSlot(slot); 6621 if (wrapKey == NULL) { 6622 break; /* not considered an error. */ 6623 } 6624 6625 if (ss->version > SSL_LIBRARY_VERSION_3_0) { /* isTLS */ 6626 keyFlags = CKF_SIGN | CKF_VERIFY; 6627 } 6628 6629 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; 6630 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; 6631 pwSpec->master_secret = 6632 PK11_UnwrapSymKeyWithFlags(wrapKey, sid->u.ssl3.masterWrapMech, 6633 NULL, &wrappedMS, CKM_SSL3_MASTER_KEY_DERIVE, 6634 CKA_DERIVE, sizeof(SSL3MasterSecret), keyFlags); 6635 errCode = PORT_GetError(); 6636 PK11_FreeSymKey(wrapKey); 6637 if (pwSpec->master_secret == NULL) { 6638 break; /* errorCode set just after call to UnwrapSymKey. */ 6639 } 6640 #ifndef NO_PKCS11_BYPASS 6641 } else if (ss->opt.bypassPKCS11) { 6642 /* MS is not wrapped */ 6643 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; 6644 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; 6645 memcpy(pwSpec->raw_master_secret, wrappedMS.data, wrappedMS.len); 6646 pwSpec->msItem.data = pwSpec->raw_master_secret; 6647 pwSpec->msItem.len = wrappedMS.len; 6648 #endif 6649 } else { 6650 /* We CAN restart a bypass session in a non-bypass socket. */ 6651 /* need to import the raw master secret to session object */ 6652 PK11SlotInfo *slot = PK11_GetInternalSlot(); 6653 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; 6654 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; 6655 pwSpec->master_secret = 6656 PK11_ImportSymKey(slot, CKM_SSL3_MASTER_KEY_DERIVE, 6657 PK11_OriginUnwrap, CKA_ENCRYPT, 6658 &wrappedMS, NULL); 6659 PK11_FreeSlot(slot); 6660 if (pwSpec->master_secret == NULL) { 6661 break; 6662 } 6663 } 6664 6665 /* Got a Match */ 6666 SSL_AtomicIncrementLong(& ssl3stats.hsh_sid_cache_hits ); 6667 6668 /* If we sent a session ticket, then this is a stateless resume. */ 6669 if (ss->xtnData.sentSessionTicketInClientHello) 6670 SSL_AtomicIncrementLong(& ssl3stats.hsh_sid_stateless_resumes ); 6671 6672 if (ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn)) 6673 ss->ssl3.hs.ws = wait_new_session_ticket; 6674 else 6675 ss->ssl3.hs.ws = wait_change_cipher; 6676 6677 ss->ssl3.hs.isResuming = PR_TRUE; 6678 6679 /* copy the peer cert from the SID */ 6680 if (sid->peerCert != NULL) { 6681 ss->sec.peerCert = CERT_DupCertificate(sid->peerCert); 6682 ssl3_CopyPeerCertsFromSID(ss, sid); 6683 } 6684 6685 /* NULL value for PMS signifies re-use of the old MS */ 6686 rv = ssl3_InitPendingCipherSpec(ss, NULL); 6687 if (rv != SECSuccess) { 6688 goto alert_loser; /* err code was set */ 6689 } 6690 goto winner; 6691 } while (0); 6692 6693 if (sid_match) 6694 SSL_AtomicIncrementLong(& ssl3stats.hsh_sid_cache_not_ok ); 6695 else 6696 SSL_AtomicIncrementLong(& ssl3stats.hsh_sid_cache_misses ); 6697 6698 /* throw the old one away */ 6699 sid->u.ssl3.keys.resumable = PR_FALSE; 6700 if (ss->sec.uncache) 6701 (*ss->sec.uncache)(sid); 6702 ssl_FreeSID(sid); 6703 6704 /* get a new sid */ 6705 ss->sec.ci.sid = sid = ssl3_NewSessionID(ss, PR_FALSE); 6706 if (sid == NULL) { 6707 goto alert_loser; /* memory error is set. */ 6708 } 6709 6710 sid->version = ss->version; 6711 sid->u.ssl3.sessionIDLength = sidBytes.len; 6712 PORT_Memcpy(sid->u.ssl3.sessionID, sidBytes.data, sidBytes.len); 6713 6714 /* Copy Signed Certificate Timestamps, if any. */ 6715 if (ss->xtnData.signedCertTimestamps.data) { 6716 rv = SECITEM_CopyItem(NULL, &sid->u.ssl3.signedCertTimestamps, 6717 &ss->xtnData.signedCertTimestamps); 6718 if (rv != SECSuccess) 6719 goto loser; 6720 } 6721 6722 ss->ssl3.hs.isResuming = PR_FALSE; 6723 ss->ssl3.hs.ws = wait_server_cert; 6724 6725 winner: 6726 /* Clean up the temporary pointer to the handshake buffer. */ 6727 ss->xtnData.signedCertTimestamps.data = NULL; 6728 ss->xtnData.signedCertTimestamps.len = 0; 6729 6730 /* If we will need a ChannelID key then we make the callback now. This 6731 * allows the handshake to be restarted cleanly if the callback returns 6732 * SECWouldBlock. */ 6733 if (ssl3_ExtensionNegotiated(ss, ssl_channel_id_xtn)) { 6734 rv = ss->getChannelID(ss->getChannelIDArg, ss->fd, 6735 &ss->ssl3.channelIDPub, &ss->ssl3.channelID); 6736 if (rv == SECWouldBlock) { 6737 ssl3_SetAlwaysBlock(ss); 6738 return rv; 6739 } 6740 if (rv != SECSuccess || 6741 ss->ssl3.channelIDPub == NULL || 6742 ss->ssl3.channelID == NULL) { 6743 PORT_SetError(SSL_ERROR_GET_CHANNEL_ID_FAILED); 6744 desc = internal_error; 6745 goto alert_loser; 6746 } 6747 } 6748 6749 return SECSuccess; 6750 6751 alert_loser: 6752 (void)SSL3_SendAlert(ss, alert_fatal, desc); 6753 6754 loser: 6755 /* Clean up the temporary pointer to the handshake buffer. */ 6756 ss->xtnData.signedCertTimestamps.data = NULL; 6757 ss->xtnData.signedCertTimestamps.len = 0; 6758 errCode = ssl_MapLowLevelError(errCode); 6759 return SECFailure; 6760 } 6761 6762 /* ssl3_BigIntGreaterThanOne returns true iff |mpint|, taken as an unsigned, 6763 * big-endian integer is > 1 */ 6764 static PRBool 6765 ssl3_BigIntGreaterThanOne(const SECItem* mpint) { 6766 unsigned char firstNonZeroByte = 0; 6767 unsigned int i; 6768 6769 for (i = 0; i < mpint->len; i++) { 6770 if (mpint->data[i]) { 6771 firstNonZeroByte = mpint->data[i]; 6772 break; 6773 } 6774 } 6775 6776 if (firstNonZeroByte == 0) 6777 return PR_FALSE; 6778 if (firstNonZeroByte > 1) 6779 return PR_TRUE; 6780 6781 /* firstNonZeroByte == 1, therefore mpint > 1 iff the first non-zero byte 6782 * is followed by another byte. */ 6783 return (i < mpint->len - 1); 6784 } 6785 6786 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete 6787 * ssl3 ServerKeyExchange message. 6788 * Caller must hold Handshake and RecvBuf locks. 6789 */ 6790 static SECStatus 6791 ssl3_HandleServerKeyExchange(sslSocket *ss, SSL3Opaque *b, PRUint32 length) 6792 { 6793 PLArenaPool * arena = NULL; 6794 SECKEYPublicKey *peerKey = NULL; 6795 PRBool isTLS, isTLS12; 6796 SECStatus rv; 6797 int errCode = SSL_ERROR_RX_MALFORMED_SERVER_KEY_EXCH; 6798 SSL3AlertDescription desc = illegal_parameter; 6799 SSL3Hashes hashes; 6800 SECItem signature = {siBuffer, NULL, 0}; 6801 SSL3SignatureAndHashAlgorithm sigAndHash; 6802 6803 sigAndHash.hashAlg = SEC_OID_UNKNOWN; 6804 6805 SSL_TRC(3, ("%d: SSL3[%d]: handle server_key_exchange handshake", 6806 SSL_GETPID(), ss->fd)); 6807 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 6808 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 6809 6810 if (ss->ssl3.hs.ws != wait_server_key && 6811 ss->ssl3.hs.ws != wait_server_cert) { 6812 errCode = SSL_ERROR_RX_UNEXPECTED_SERVER_KEY_EXCH; 6813 desc = unexpected_message; 6814 goto alert_loser; 6815 } 6816 if (ss->sec.peerCert == NULL) { 6817 errCode = SSL_ERROR_RX_UNEXPECTED_SERVER_KEY_EXCH; 6818 desc = unexpected_message; 6819 goto alert_loser; 6820 } 6821 6822 isTLS = (PRBool)(ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0); 6823 isTLS12 = (PRBool)(ss->ssl3.prSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); 6824 6825 switch (ss->ssl3.hs.kea_def->exchKeyType) { 6826 6827 case kt_rsa: { 6828 SECItem modulus = {siBuffer, NULL, 0}; 6829 SECItem exponent = {siBuffer, NULL, 0}; 6830 6831 rv = ssl3_ConsumeHandshakeVariable(ss, &modulus, 2, &b, &length); 6832 if (rv != SECSuccess) { 6833 goto loser; /* malformed. */ 6834 } 6835 rv = ssl3_ConsumeHandshakeVariable(ss, &exponent, 2, &b, &length); 6836 if (rv != SECSuccess) { 6837 goto loser; /* malformed. */ 6838 } 6839 if (isTLS12) { 6840 rv = ssl3_ConsumeSignatureAndHashAlgorithm(ss, &b, &length, 6841 &sigAndHash); 6842 if (rv != SECSuccess) { 6843 goto loser; /* malformed or unsupported. */ 6844 } 6845 rv = ssl3_CheckSignatureAndHashAlgorithmConsistency( 6846 &sigAndHash, ss->sec.peerCert); 6847 if (rv != SECSuccess) { 6848 goto loser; 6849 } 6850 } 6851 rv = ssl3_ConsumeHandshakeVariable(ss, &signature, 2, &b, &length); 6852 if (rv != SECSuccess) { 6853 goto loser; /* malformed. */ 6854 } 6855 if (length != 0) { 6856 if (isTLS) 6857 desc = decode_error; 6858 goto alert_loser; /* malformed. */ 6859 } 6860 6861 /* failures after this point are not malformed handshakes. */ 6862 /* TLS: send decrypt_error if signature failed. */ 6863 desc = isTLS ? decrypt_error : handshake_failure; 6864 6865 /* 6866 * check to make sure the hash is signed by right guy 6867 */ 6868 rv = ssl3_ComputeExportRSAKeyHash(sigAndHash.hashAlg, modulus, exponent, 6869 &ss->ssl3.hs.client_random, 6870 &ss->ssl3.hs.server_random, 6871 &hashes, ss->opt.bypassPKCS11); 6872 if (rv != SECSuccess) { 6873 errCode = 6874 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); 6875 goto alert_loser; 6876 } 6877 rv = ssl3_VerifySignedHashes(&hashes, ss->sec.peerCert, &signature, 6878 isTLS, ss->pkcs11PinArg); 6879 if (rv != SECSuccess) { 6880 errCode = 6881 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); 6882 goto alert_loser; 6883 } 6884 6885 /* 6886 * we really need to build a new key here because we can no longer 6887 * ignore calling SECKEY_DestroyPublicKey. Using the key may allocate 6888 * pkcs11 slots and ID's. 6889 */ 6890 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); 6891 if (arena == NULL) { 6892 goto no_memory; 6893 } 6894 6895 peerKey = PORT_ArenaZNew(arena, SECKEYPublicKey); 6896 if (peerKey == NULL) { 6897 PORT_FreeArena(arena, PR_FALSE); 6898 goto no_memory; 6899 } 6900 6901 peerKey->arena = arena; 6902 peerKey->keyType = rsaKey; 6903 peerKey->pkcs11Slot = NULL; 6904 peerKey->pkcs11ID = CK_INVALID_HANDLE; 6905 if (SECITEM_CopyItem(arena, &peerKey->u.rsa.modulus, &modulus) || 6906 SECITEM_CopyItem(arena, &peerKey->u.rsa.publicExponent, &exponent)) 6907 { 6908 PORT_FreeArena(arena, PR_FALSE); 6909 goto no_memory; 6910 } 6911 ss->sec.peerKey = peerKey; 6912 ss->ssl3.hs.ws = wait_cert_request; 6913 return SECSuccess; 6914 } 6915 6916 case kt_dh: { 6917 SECItem dh_p = {siBuffer, NULL, 0}; 6918 SECItem dh_g = {siBuffer, NULL, 0}; 6919 SECItem dh_Ys = {siBuffer, NULL, 0}; 6920 6921 rv = ssl3_ConsumeHandshakeVariable(ss, &dh_p, 2, &b, &length); 6922 if (rv != SECSuccess) { 6923 goto loser; /* malformed. */ 6924 } 6925 if (dh_p.len < 512/8) { 6926 errCode = SSL_ERROR_WEAK_SERVER_EPHEMERAL_DH_KEY; 6927 goto alert_loser; 6928 } 6929 rv = ssl3_ConsumeHandshakeVariable(ss, &dh_g, 2, &b, &length); 6930 if (rv != SECSuccess) { 6931 goto loser; /* malformed. */ 6932 } 6933 if (dh_g.len > dh_p.len || !ssl3_BigIntGreaterThanOne(&dh_g)) 6934 goto alert_loser; 6935 rv = ssl3_ConsumeHandshakeVariable(ss, &dh_Ys, 2, &b, &length); 6936 if (rv != SECSuccess) { 6937 goto loser; /* malformed. */ 6938 } 6939 if (dh_Ys.len > dh_p.len || !ssl3_BigIntGreaterThanOne(&dh_Ys)) 6940 goto alert_loser; 6941 if (isTLS12) { 6942 rv = ssl3_ConsumeSignatureAndHashAlgorithm(ss, &b, &length, 6943 &sigAndHash); 6944 if (rv != SECSuccess) { 6945 goto loser; /* malformed or unsupported. */ 6946 } 6947 rv = ssl3_CheckSignatureAndHashAlgorithmConsistency( 6948 &sigAndHash, ss->sec.peerCert); 6949 if (rv != SECSuccess) { 6950 goto loser; 6951 } 6952 } 6953 rv = ssl3_ConsumeHandshakeVariable(ss, &signature, 2, &b, &length); 6954 if (rv != SECSuccess) { 6955 goto loser; /* malformed. */ 6956 } 6957 if (length != 0) { 6958 if (isTLS) 6959 desc = decode_error; 6960 goto alert_loser; /* malformed. */ 6961 } 6962 6963 PRINT_BUF(60, (NULL, "Server DH p", dh_p.data, dh_p.len)); 6964 PRINT_BUF(60, (NULL, "Server DH g", dh_g.data, dh_g.len)); 6965 PRINT_BUF(60, (NULL, "Server DH Ys", dh_Ys.data, dh_Ys.len)); 6966 6967 /* failures after this point are not malformed handshakes. */ 6968 /* TLS: send decrypt_error if signature failed. */ 6969 desc = isTLS ? decrypt_error : handshake_failure; 6970 6971 /* 6972 * check to make sure the hash is signed by right guy 6973 */ 6974 rv = ssl3_ComputeDHKeyHash(sigAndHash.hashAlg, dh_p, dh_g, dh_Ys, 6975 &ss->ssl3.hs.client_random, 6976 &ss->ssl3.hs.server_random, 6977 &hashes, ss->opt.bypassPKCS11); 6978 if (rv != SECSuccess) { 6979 errCode = 6980 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); 6981 goto alert_loser; 6982 } 6983 rv = ssl3_VerifySignedHashes(&hashes, ss->sec.peerCert, &signature, 6984 isTLS, ss->pkcs11PinArg); 6985 if (rv != SECSuccess) { 6986 errCode = 6987 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); 6988 goto alert_loser; 6989 } 6990 6991 /* 6992 * we really need to build a new key here because we can no longer 6993 * ignore calling SECKEY_DestroyPublicKey. Using the key may allocate 6994 * pkcs11 slots and ID's. 6995 */ 6996 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); 6997 if (arena == NULL) { 6998 goto no_memory; 6999 } 7000 7001 ss->sec.peerKey = peerKey = PORT_ArenaZNew(arena, SECKEYPublicKey); 7002 if (peerKey == NULL) { 7003 goto no_memory; 7004 } 7005 7006 peerKey->arena = arena; 7007 peerKey->keyType = dhKey; 7008 peerKey->pkcs11Slot = NULL; 7009 peerKey->pkcs11ID = CK_INVALID_HANDLE; 7010 7011 if (SECITEM_CopyItem(arena, &peerKey->u.dh.prime, &dh_p) || 7012 SECITEM_CopyItem(arena, &peerKey->u.dh.base, &dh_g) || 7013 SECITEM_CopyItem(arena, &peerKey->u.dh.publicValue, &dh_Ys)) 7014 { 7015 PORT_FreeArena(arena, PR_FALSE); 7016 goto no_memory; 7017 } 7018 ss->sec.peerKey = peerKey; 7019 ss->ssl3.hs.ws = wait_cert_request; 7020 return SECSuccess; 7021 } 7022 7023 #ifdef NSS_ENABLE_ECC 7024 case kt_ecdh: 7025 rv = ssl3_HandleECDHServerKeyExchange(ss, b, length); 7026 return rv; 7027 #endif /* NSS_ENABLE_ECC */ 7028 7029 default: 7030 desc = handshake_failure; 7031 errCode = SEC_ERROR_UNSUPPORTED_KEYALG; 7032 break; /* goto alert_loser; */ 7033 } 7034 7035 alert_loser: 7036 (void)SSL3_SendAlert(ss, alert_fatal, desc); 7037 loser: 7038 PORT_SetError( errCode ); 7039 return SECFailure; 7040 7041 no_memory: /* no-memory error has already been set. */ 7042 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); 7043 return SECFailure; 7044 } 7045 7046 7047 /* 7048 * Returns the TLS signature algorithm for the client authentication key and 7049 * whether it is an RSA or DSA key that may be able to sign only SHA-1 hashes. 7050 */ 7051 static SECStatus 7052 ssl3_ExtractClientKeyInfo(sslSocket *ss, 7053 TLSSignatureAlgorithm *sigAlg, 7054 PRBool *preferSha1) 7055 { 7056 SECStatus rv = SECSuccess; 7057 SECKEYPublicKey *pubk; 7058 7059 pubk = CERT_ExtractPublicKey(ss->ssl3.clientCertificate); 7060 if (pubk == NULL) { 7061 rv = SECFailure; 7062 goto done; 7063 } 7064 7065 rv = ssl3_TLSSignatureAlgorithmForKeyType(pubk->keyType, sigAlg); 7066 if (rv != SECSuccess) { 7067 goto done; 7068 } 7069 7070 #if defined(NSS_PLATFORM_CLIENT_AUTH) && defined(_WIN32) 7071 /* If the key is in CAPI, assume conservatively that the CAPI service 7072 * provider may be unable to sign SHA-256 hashes. 7073 */ 7074 if (ss->ssl3.platformClientKey->dwKeySpec != CERT_NCRYPT_KEY_SPEC) { 7075 /* CAPI only supports RSA and DSA signatures, so we don't need to 7076 * check the key type. */ 7077 *preferSha1 = PR_TRUE; 7078 goto done; 7079 } 7080 #endif /* NSS_PLATFORM_CLIENT_AUTH && _WIN32 */ 7081 7082 /* If the key is a 1024-bit RSA or DSA key, assume conservatively that 7083 * it may be unable to sign SHA-256 hashes. This is the case for older 7084 * Estonian ID cards that have 1024-bit RSA keys. In FIPS 186-2 and 7085 * older, DSA key size is at most 1024 bits and the hash function must 7086 * be SHA-1. 7087 */ 7088 if (pubk->keyType == rsaKey || pubk->keyType == dsaKey) { 7089 *preferSha1 = SECKEY_PublicKeyStrength(pubk) <= 128; 7090 } else { 7091 *preferSha1 = PR_FALSE; 7092 } 7093 7094 done: 7095 if (pubk) 7096 SECKEY_DestroyPublicKey(pubk); 7097 return rv; 7098 } 7099 7100 /* Destroys the backup handshake hash context if we don't need it. Note that 7101 * this function selects the hash algorithm for client authentication 7102 * signatures; ssl3_SendCertificateVerify uses the presence of the backup hash 7103 * to determine whether to use SHA-1 or SHA-256. */ 7104 static void 7105 ssl3_DestroyBackupHandshakeHashIfNotNeeded(sslSocket *ss, 7106 const SECItem *algorithms) 7107 { 7108 SECStatus rv; 7109 TLSSignatureAlgorithm sigAlg; 7110 PRBool preferSha1; 7111 PRBool supportsSha1 = PR_FALSE; 7112 PRBool supportsSha256 = PR_FALSE; 7113 PRBool needBackupHash = PR_FALSE; 7114 unsigned int i; 7115 7116 #ifndef NO_PKCS11_BYPASS 7117 /* Backup handshake hash is not supported in PKCS #11 bypass mode. */ 7118 if (ss->opt.bypassPKCS11) { 7119 PORT_Assert(!ss->ssl3.hs.backupHash); 7120 return; 7121 } 7122 #endif 7123 PORT_Assert(ss->ssl3.hs.backupHash); 7124 7125 /* Determine the key's signature algorithm and whether it prefers SHA-1. */ 7126 rv = ssl3_ExtractClientKeyInfo(ss, &sigAlg, &preferSha1); 7127 if (rv != SECSuccess) { 7128 goto done; 7129 } 7130 7131 /* Determine the server's hash support for that signature algorithm. */ 7132 for (i = 0; i < algorithms->len; i += 2) { 7133 if (algorithms->data[i+1] == sigAlg) { 7134 if (algorithms->data[i] == tls_hash_sha1) { 7135 supportsSha1 = PR_TRUE; 7136 } else if (algorithms->data[i] == tls_hash_sha256) { 7137 supportsSha256 = PR_TRUE; 7138 } 7139 } 7140 } 7141 7142 /* If either the server does not support SHA-256 or the client key prefers 7143 * SHA-1, leave the backup hash. */ 7144 if (supportsSha1 && (preferSha1 || !supportsSha256)) { 7145 needBackupHash = PR_TRUE; 7146 } 7147 7148 done: 7149 if (!needBackupHash) { 7150 PK11_DestroyContext(ss->ssl3.hs.backupHash, PR_TRUE); 7151 ss->ssl3.hs.backupHash = NULL; 7152 } 7153 } 7154 7155 typedef struct dnameNode { 7156 struct dnameNode *next; 7157 SECItem name; 7158 } dnameNode; 7159 7160 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete 7161 * ssl3 Certificate Request message. 7162 * Caller must hold Handshake and RecvBuf locks. 7163 */ 7164 static SECStatus 7165 ssl3_HandleCertificateRequest(sslSocket *ss, SSL3Opaque *b, PRUint32 length) 7166 { 7167 PLArenaPool * arena = NULL; 7168 dnameNode * node; 7169 PRInt32 remaining; 7170 PRBool isTLS = PR_FALSE; 7171 PRBool isTLS12 = PR_FALSE; 7172 int i; 7173 int errCode = SSL_ERROR_RX_MALFORMED_CERT_REQUEST; 7174 int nnames = 0; 7175 SECStatus rv; 7176 SSL3AlertDescription desc = illegal_parameter; 7177 SECItem cert_types = {siBuffer, NULL, 0}; 7178 SECItem algorithms = {siBuffer, NULL, 0}; 7179 CERTDistNames ca_list; 7180 #ifdef NSS_PLATFORM_CLIENT_AUTH 7181 CERTCertList * platform_cert_list = NULL; 7182 CERTCertListNode * certNode = NULL; 7183 #endif /* NSS_PLATFORM_CLIENT_AUTH */ 7184 7185 SSL_TRC(3, ("%d: SSL3[%d]: handle certificate_request handshake", 7186 SSL_GETPID(), ss->fd)); 7187 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 7188 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 7189 7190 if (ss->ssl3.hs.ws != wait_cert_request && 7191 ss->ssl3.hs.ws != wait_server_key) { 7192 desc = unexpected_message; 7193 errCode = SSL_ERROR_RX_UNEXPECTED_CERT_REQUEST; 7194 goto alert_loser; 7195 } 7196 7197 PORT_Assert(ss->ssl3.clientCertChain == NULL); 7198 PORT_Assert(ss->ssl3.clientCertificate == NULL); 7199 PORT_Assert(ss->ssl3.clientPrivateKey == NULL); 7200 PORT_Assert(ss->ssl3.platformClientKey == (PlatformKey)NULL); 7201 7202 isTLS = (PRBool)(ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0); 7203 isTLS12 = (PRBool)(ss->ssl3.prSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); 7204 rv = ssl3_ConsumeHandshakeVariable(ss, &cert_types, 1, &b, &length); 7205 if (rv != SECSuccess) 7206 goto loser; /* malformed, alert has been sent */ 7207 7208 PORT_Assert(!ss->requestedCertTypes); 7209 ss->requestedCertTypes = &cert_types; 7210 7211 if (isTLS12) { 7212 rv = ssl3_ConsumeHandshakeVariable(ss, &algorithms, 2, &b, &length); 7213 if (rv != SECSuccess) 7214 goto loser; /* malformed, alert has been sent */ 7215 /* An empty or odd-length value is invalid. 7216 * SignatureAndHashAlgorithm 7217 * supported_signature_algorithms<2..2^16-2>; 7218 */ 7219 if (algorithms.len == 0 || (algorithms.len & 1) != 0) 7220 goto alert_loser; 7221 } 7222 7223 arena = ca_list.arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); 7224 if (arena == NULL) 7225 goto no_mem; 7226 7227 remaining = ssl3_ConsumeHandshakeNumber(ss, 2, &b, &length); 7228 if (remaining < 0) 7229 goto loser; /* malformed, alert has been sent */ 7230 7231 if ((PRUint32)remaining > length) 7232 goto alert_loser; 7233 7234 ca_list.head = node = PORT_ArenaZNew(arena, dnameNode); 7235 if (node == NULL) 7236 goto no_mem; 7237 7238 while (remaining > 0) { 7239 PRInt32 len; 7240 7241 if (remaining < 2) 7242 goto alert_loser; /* malformed */ 7243 7244 node->name.len = len = ssl3_ConsumeHandshakeNumber(ss, 2, &b, &length); 7245 if (len <= 0) 7246 goto loser; /* malformed, alert has been sent */ 7247 7248 remaining -= 2; 7249 if (remaining < len) 7250 goto alert_loser; /* malformed */ 7251 7252 node->name.data = b; 7253 b += len; 7254 length -= len; 7255 remaining -= len; 7256 nnames++; 7257 if (remaining <= 0) 7258 break; /* success */ 7259 7260 node->next = PORT_ArenaZNew(arena, dnameNode); 7261 node = node->next; 7262 if (node == NULL) 7263 goto no_mem; 7264 } 7265 7266 ca_list.nnames = nnames; 7267 ca_list.names = PORT_ArenaNewArray(arena, SECItem, nnames); 7268 if (nnames > 0 && ca_list.names == NULL) 7269 goto no_mem; 7270 7271 for(i = 0, node = (dnameNode*)ca_list.head; 7272 i < nnames; 7273 i++, node = node->next) { 7274 ca_list.names[i] = node->name; 7275 } 7276 7277 if (length != 0) 7278 goto alert_loser; /* malformed */ 7279 7280 desc = no_certificate; 7281 ss->ssl3.hs.ws = wait_hello_done; 7282 7283 #ifdef NSS_PLATFORM_CLIENT_AUTH 7284 if (ss->getPlatformClientAuthData != NULL) { 7285 /* XXX Should pass cert_types and algorithms in this call!! */ 7286 rv = (SECStatus)(*ss->getPlatformClientAuthData)( 7287 ss->getPlatformClientAuthDataArg, 7288 ss->fd, &ca_list, 7289 &platform_cert_list, 7290 (void**)&ss->ssl3.platformClientKey, 7291 &ss->ssl3.clientCertificate, 7292 &ss->ssl3.clientPrivateKey); 7293 } else 7294 #endif 7295 if (ss->getClientAuthData != NULL) { 7296 /* XXX Should pass cert_types and algorithms in this call!! */ 7297 rv = (SECStatus)(*ss->getClientAuthData)(ss->getClientAuthDataArg, 7298 ss->fd, &ca_list, 7299 &ss->ssl3.clientCertificate, 7300 &ss->ssl3.clientPrivateKey); 7301 } else { 7302 rv = SECFailure; /* force it to send a no_certificate alert */ 7303 } 7304 7305 switch (rv) { 7306 case SECWouldBlock: /* getClientAuthData has put up a dialog box. */ 7307 ssl3_SetAlwaysBlock(ss); 7308 break; /* not an error */ 7309 7310 case SECSuccess: 7311 #ifdef NSS_PLATFORM_CLIENT_AUTH 7312 if (!platform_cert_list || CERT_LIST_EMPTY(platform_cert_list) || 7313 !ss->ssl3.platformClientKey) { 7314 if (platform_cert_list) { 7315 CERT_DestroyCertList(platform_cert_list); 7316 platform_cert_list = NULL; 7317 } 7318 if (ss->ssl3.platformClientKey) { 7319 ssl_FreePlatformKey(ss->ssl3.platformClientKey); 7320 ss->ssl3.platformClientKey = (PlatformKey)NULL; 7321 } 7322 /* Fall through to NSS client auth check */ 7323 } else { 7324 certNode = CERT_LIST_HEAD(platform_cert_list); 7325 ss->ssl3.clientCertificate = CERT_DupCertificate(certNode->cert); 7326 7327 /* Setting ssl3.clientCertChain non-NULL will cause 7328 * ssl3_HandleServerHelloDone to call SendCertificate. 7329 * Note: clientCertChain should include the EE cert as 7330 * clientCertificate is ignored during the actual sending 7331 */ 7332 ss->ssl3.clientCertChain = 7333 hack_NewCertificateListFromCertList(platform_cert_list); 7334 CERT_DestroyCertList(platform_cert_list); 7335 platform_cert_list = NULL; 7336 if (ss->ssl3.clientCertChain == NULL) { 7337 if (ss->ssl3.clientCertificate != NULL) { 7338 CERT_DestroyCertificate(ss->ssl3.clientCertificate); 7339 ss->ssl3.clientCertificate = NULL; 7340 } 7341 if (ss->ssl3.platformClientKey) { 7342 ssl_FreePlatformKey(ss->ssl3.platformClientKey); 7343 ss->ssl3.platformClientKey = (PlatformKey)NULL; 7344 } 7345 goto send_no_certificate; 7346 } 7347 if (ss->ssl3.hs.hashType == handshake_hash_single) { 7348 ssl3_DestroyBackupHandshakeHashIfNotNeeded(ss, &algorithms); 7349 } 7350 break; /* not an error */ 7351 } 7352 #endif /* NSS_PLATFORM_CLIENT_AUTH */ 7353 /* check what the callback function returned */ 7354 if ((!ss->ssl3.clientCertificate) || (!ss->ssl3.clientPrivateKey)) { 7355 /* we are missing either the key or cert */ 7356 if (ss->ssl3.clientCertificate) { 7357 /* got a cert, but no key - free it */ 7358 CERT_DestroyCertificate(ss->ssl3.clientCertificate); 7359 ss->ssl3.clientCertificate = NULL; 7360 } 7361 if (ss->ssl3.clientPrivateKey) { 7362 /* got a key, but no cert - free it */ 7363 SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); 7364 ss->ssl3.clientPrivateKey = NULL; 7365 } 7366 goto send_no_certificate; 7367 } 7368 /* Setting ssl3.clientCertChain non-NULL will cause 7369 * ssl3_HandleServerHelloDone to call SendCertificate. 7370 */ 7371 ss->ssl3.clientCertChain = CERT_CertChainFromCert( 7372 ss->ssl3.clientCertificate, 7373 certUsageSSLClient, PR_FALSE); 7374 if (ss->ssl3.clientCertChain == NULL) { 7375 CERT_DestroyCertificate(ss->ssl3.clientCertificate); 7376 ss->ssl3.clientCertificate = NULL; 7377 SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); 7378 ss->ssl3.clientPrivateKey = NULL; 7379 goto send_no_certificate; 7380 } 7381 if (ss->ssl3.hs.hashType == handshake_hash_single) { 7382 ssl3_DestroyBackupHandshakeHashIfNotNeeded(ss, &algorithms); 7383 } 7384 break; /* not an error */ 7385 7386 case SECFailure: 7387 default: 7388 send_no_certificate: 7389 if (isTLS) { 7390 ss->ssl3.sendEmptyCert = PR_TRUE; 7391 } else { 7392 (void)SSL3_SendAlert(ss, alert_warning, no_certificate); 7393 } 7394 rv = SECSuccess; 7395 break; 7396 } 7397 goto done; 7398 7399 no_mem: 7400 rv = SECFailure; 7401 PORT_SetError(SEC_ERROR_NO_MEMORY); 7402 goto done; 7403 7404 alert_loser: 7405 if (isTLS && desc == illegal_parameter) 7406 desc = decode_error; 7407 (void)SSL3_SendAlert(ss, alert_fatal, desc); 7408 loser: 7409 PORT_SetError(errCode); 7410 rv = SECFailure; 7411 done: 7412 ss->requestedCertTypes = NULL; 7413 if (arena != NULL) 7414 PORT_FreeArena(arena, PR_FALSE); 7415 #ifdef NSS_PLATFORM_CLIENT_AUTH 7416 if (platform_cert_list) 7417 CERT_DestroyCertList(platform_cert_list); 7418 #endif 7419 return rv; 7420 } 7421 7422 /* 7423 * attempt to restart the handshake after asynchronously handling 7424 * a request for the client's certificate. 7425 * 7426 * inputs: 7427 * cert Client cert chosen by application. 7428 * Note: ssl takes this reference, and does not bump the 7429 * reference count. The caller should drop its reference 7430 * without calling CERT_DestroyCert after calling this function. 7431 * 7432 * key Private key associated with cert. This function takes 7433 * ownership of the private key, so the caller should drop its 7434 * reference without destroying the private key after this 7435 * function returns. 7436 * 7437 * certChain DER-encoded certs, client cert and its signers. 7438 * Note: ssl takes this reference, and does not copy the chain. 7439 * The caller should drop its reference without destroying the 7440 * chain. SSL will free the chain when it is done with it. 7441 * 7442 * Return value: XXX 7443 * 7444 * XXX This code only works on the initial handshake on a connection, XXX 7445 * It does not work on a subsequent handshake (redo). 7446 * 7447 * Caller holds 1stHandshakeLock. 7448 */ 7449 SECStatus 7450 ssl3_RestartHandshakeAfterCertReq(sslSocket * ss, 7451 CERTCertificate * cert, 7452 SECKEYPrivateKey * key, 7453 CERTCertificateList *certChain) 7454 { 7455 SECStatus rv = SECSuccess; 7456 7457 /* XXX This code only works on the initial handshake on a connection, 7458 ** XXX It does not work on a subsequent handshake (redo). 7459 */ 7460 if (ss->handshake != 0) { 7461 ss->handshake = ssl_GatherRecord1stHandshake; 7462 ss->ssl3.clientCertificate = cert; 7463 ss->ssl3.clientPrivateKey = key; 7464 ss->ssl3.clientCertChain = certChain; 7465 if (!cert || !key || !certChain) { 7466 /* we are missing the key, cert, or cert chain */ 7467 if (ss->ssl3.clientCertificate) { 7468 CERT_DestroyCertificate(ss->ssl3.clientCertificate); 7469 ss->ssl3.clientCertificate = NULL; 7470 } 7471 if (ss->ssl3.clientPrivateKey) { 7472 SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); 7473 ss->ssl3.clientPrivateKey = NULL; 7474 } 7475 if (ss->ssl3.clientCertChain != NULL) { 7476 CERT_DestroyCertificateList(ss->ssl3.clientCertChain); 7477 ss->ssl3.clientCertChain = NULL; 7478 } 7479 if (ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0) { 7480 ss->ssl3.sendEmptyCert = PR_TRUE; 7481 } else { 7482 (void)SSL3_SendAlert(ss, alert_warning, no_certificate); 7483 } 7484 } 7485 } else { 7486 if (cert) { 7487 CERT_DestroyCertificate(cert); 7488 } 7489 if (key) { 7490 SECKEY_DestroyPrivateKey(key); 7491 } 7492 if (certChain) { 7493 CERT_DestroyCertificateList(certChain); 7494 } 7495 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 7496 rv = SECFailure; 7497 } 7498 return rv; 7499 } 7500 7501 static SECStatus 7502 ssl3_CheckFalseStart(sslSocket *ss) 7503 { 7504 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 7505 PORT_Assert( !ss->ssl3.hs.authCertificatePending ); 7506 PORT_Assert( !ss->ssl3.hs.canFalseStart ); 7507 7508 if (!ss->canFalseStartCallback) { 7509 SSL_TRC(3, ("%d: SSL[%d]: no false start callback so no false start", 7510 SSL_GETPID(), ss->fd)); 7511 } else { 7512 PRBool maybeFalseStart; 7513 SECStatus rv; 7514 7515 /* An attacker can control the selected ciphersuite so we only wish to 7516 * do False Start in the case that the selected ciphersuite is 7517 * sufficiently strong that the attack can gain no advantage. 7518 * Therefore we always require an 80-bit cipher. */ 7519 ssl_GetSpecReadLock(ss); 7520 maybeFalseStart = ss->ssl3.cwSpec->cipher_def->secret_key_size >= 10; 7521 ssl_ReleaseSpecReadLock(ss); 7522 7523 if (!maybeFalseStart) { 7524 SSL_TRC(3, ("%d: SSL[%d]: no false start due to weak cipher", 7525 SSL_GETPID(), ss->fd)); 7526 } else { 7527 rv = (ss->canFalseStartCallback)(ss->fd, 7528 ss->canFalseStartCallbackData, 7529 &ss->ssl3.hs.canFalseStart); 7530 if (rv == SECSuccess) { 7531 SSL_TRC(3, ("%d: SSL[%d]: false start callback returned %s", 7532 SSL_GETPID(), ss->fd, 7533 ss->ssl3.hs.canFalseStart ? "TRUE" : "FALSE")); 7534 } else { 7535 SSL_TRC(3, ("%d: SSL[%d]: false start callback failed (%s)", 7536 SSL_GETPID(), ss->fd, 7537 PR_ErrorToName(PR_GetError()))); 7538 } 7539 return rv; 7540 } 7541 } 7542 7543 ss->ssl3.hs.canFalseStart = PR_FALSE; 7544 return SECSuccess; 7545 } 7546 7547 PRBool 7548 ssl3_WaitingForStartOfServerSecondRound(sslSocket *ss) 7549 { 7550 PRBool result; 7551 7552 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 7553 7554 switch (ss->ssl3.hs.ws) { 7555 case wait_new_session_ticket: 7556 result = PR_TRUE; 7557 break; 7558 case wait_change_cipher: 7559 result = !ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn); 7560 break; 7561 default: 7562 result = PR_FALSE; 7563 break; 7564 } 7565 7566 return result; 7567 } 7568 7569 static SECStatus ssl3_SendClientSecondRound(sslSocket *ss); 7570 7571 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete 7572 * ssl3 Server Hello Done message. 7573 * Caller must hold Handshake and RecvBuf locks. 7574 */ 7575 static SECStatus 7576 ssl3_HandleServerHelloDone(sslSocket *ss) 7577 { 7578 SECStatus rv; 7579 SSL3WaitState ws = ss->ssl3.hs.ws; 7580 7581 SSL_TRC(3, ("%d: SSL3[%d]: handle server_hello_done handshake", 7582 SSL_GETPID(), ss->fd)); 7583 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 7584 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 7585 7586 if (ws != wait_hello_done && 7587 ws != wait_server_cert && 7588 ws != wait_server_key && 7589 ws != wait_cert_request) { 7590 SSL3_SendAlert(ss, alert_fatal, unexpected_message); 7591 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HELLO_DONE); 7592 return SECFailure; 7593 } 7594 7595 rv = ssl3_SendClientSecondRound(ss); 7596 7597 return rv; 7598 } 7599 7600 /* Called from ssl3_HandleServerHelloDone and ssl3_AuthCertificateComplete. 7601 * 7602 * Caller must hold Handshake and RecvBuf locks. 7603 */ 7604 static SECStatus 7605 ssl3_SendClientSecondRound(sslSocket *ss) 7606 { 7607 SECStatus rv; 7608 PRBool sendClientCert; 7609 7610 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 7611 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 7612 7613 sendClientCert = !ss->ssl3.sendEmptyCert && 7614 ss->ssl3.clientCertChain != NULL && 7615 (ss->ssl3.platformClientKey || 7616 ss->ssl3.clientPrivateKey != NULL); 7617 7618 if (!sendClientCert && 7619 ss->ssl3.hs.hashType == handshake_hash_single && 7620 ss->ssl3.hs.backupHash) { 7621 /* Don't need the backup handshake hash. */ 7622 PK11_DestroyContext(ss->ssl3.hs.backupHash, PR_TRUE); 7623 ss->ssl3.hs.backupHash = NULL; 7624 } 7625 7626 /* We must wait for the server's certificate to be authenticated before 7627 * sending the client certificate in order to disclosing the client 7628 * certificate to an attacker that does not have a valid cert for the 7629 * domain we are connecting to. 7630 * 7631 * XXX: We should do the same for the NPN extension, but for that we 7632 * need an option to give the application the ability to leak the NPN 7633 * information to get better performance. 7634 * 7635 * During the initial handshake on a connection, we never send/receive 7636 * application data until we have authenticated the server's certificate; 7637 * i.e. we have fully authenticated the handshake before using the cipher 7638 * specs agreed upon for that handshake. During a renegotiation, we may 7639 * continue sending and receiving application data during the handshake 7640 * interleaved with the handshake records. If we were to send the client's 7641 * second round for a renegotiation before the server's certificate was 7642 * authenticated, then the application data sent/received after this point 7643 * would be using cipher spec that hadn't been authenticated. By waiting 7644 * until the server's certificate has been authenticated during 7645 * renegotiations, we ensure that renegotiations have the same property 7646 * as initial handshakes; i.e. we have fully authenticated the handshake 7647 * before using the cipher specs agreed upon for that handshake for 7648 * application data. 7649 */ 7650 if (ss->ssl3.hs.restartTarget) { 7651 PR_NOT_REACHED("unexpected ss->ssl3.hs.restartTarget"); 7652 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 7653 return SECFailure; 7654 } 7655 if (ss->ssl3.hs.authCertificatePending && 7656 (sendClientCert || ss->ssl3.sendEmptyCert || ss->firstHsDone)) { 7657 SSL_TRC(3, ("%d: SSL3[%p]: deferring ssl3_SendClientSecondRound because" 7658 " certificate authentication is still pending.", 7659 SSL_GETPID(), ss->fd)); 7660 ss->ssl3.hs.restartTarget = ssl3_SendClientSecondRound; 7661 return SECWouldBlock; 7662 } 7663 7664 ssl_GetXmitBufLock(ss); /*******************************/ 7665 7666 if (ss->ssl3.sendEmptyCert) { 7667 ss->ssl3.sendEmptyCert = PR_FALSE; 7668 rv = ssl3_SendEmptyCertificate(ss); 7669 /* Don't send verify */ 7670 if (rv != SECSuccess) { 7671 goto loser; /* error code is set. */ 7672 } 7673 } else if (sendClientCert) { 7674 rv = ssl3_SendCertificate(ss); 7675 if (rv != SECSuccess) { 7676 goto loser; /* error code is set. */ 7677 } 7678 } 7679 7680 rv = ssl3_SendClientKeyExchange(ss); 7681 if (rv != SECSuccess) { 7682 goto loser; /* err is set. */ 7683 } 7684 7685 if (sendClientCert) { 7686 rv = ssl3_SendCertificateVerify(ss); 7687 if (rv != SECSuccess) { 7688 goto loser; /* err is set. */ 7689 } 7690 } 7691 7692 rv = ssl3_SendChangeCipherSpecs(ss); 7693 if (rv != SECSuccess) { 7694 goto loser; /* err code was set. */ 7695 } 7696 7697 /* This must be done after we've set ss->ssl3.cwSpec in 7698 * ssl3_SendChangeCipherSpecs because SSL_GetChannelInfo uses information 7699 * from cwSpec. This must be done before we call ssl3_CheckFalseStart 7700 * because the false start callback (if any) may need the information from 7701 * the functions that depend on this being set. 7702 */ 7703 ss->enoughFirstHsDone = PR_TRUE; 7704 7705 if (!ss->firstHsDone) { 7706 /* XXX: If the server's certificate hasn't been authenticated by this 7707 * point, then we may be leaking this NPN message to an attacker. 7708 */ 7709 rv = ssl3_SendNextProto(ss); 7710 if (rv != SECSuccess) { 7711 goto loser; /* err code was set. */ 7712 } 7713 } 7714 7715 rv = ssl3_SendEncryptedExtensions(ss); 7716 if (rv != SECSuccess) { 7717 goto loser; /* err code was set. */ 7718 } 7719 7720 if (!ss->firstHsDone) { 7721 if (ss->opt.enableFalseStart) { 7722 if (!ss->ssl3.hs.authCertificatePending) { 7723 /* When we fix bug 589047, we will need to know whether we are 7724 * false starting before we try to flush the client second 7725 * round to the network. With that in mind, we purposefully 7726 * call ssl3_CheckFalseStart before calling ssl3_SendFinished, 7727 * which includes a call to ssl3_FlushHandshake, so that 7728 * no application develops a reliance on such flushing being 7729 * done before its false start callback is called. 7730 */ 7731 ssl_ReleaseXmitBufLock(ss); 7732 rv = ssl3_CheckFalseStart(ss); 7733 ssl_GetXmitBufLock(ss); 7734 if (rv != SECSuccess) { 7735 goto loser; 7736 } 7737 } else { 7738 /* The certificate authentication and the server's Finished 7739 * message are racing each other. If the certificate 7740 * authentication wins, then we will try to false start in 7741 * ssl3_AuthCertificateComplete. 7742 */ 7743 SSL_TRC(3, ("%d: SSL3[%p]: deferring false start check because" 7744 " certificate authentication is still pending.", 7745 SSL_GETPID(), ss->fd)); 7746 } 7747 } 7748 } 7749 7750 rv = ssl3_SendFinished(ss, 0); 7751 if (rv != SECSuccess) { 7752 goto loser; /* err code was set. */ 7753 } 7754 7755 ssl_ReleaseXmitBufLock(ss); /*******************************/ 7756 7757 if (!ss->ssl3.hs.isResuming && 7758 ssl3_ExtensionNegotiated(ss, ssl_channel_id_xtn)) { 7759 /* If we are negotiating ChannelID on a full handshake then we record 7760 * the handshake hashes in |sid| at this point. They will be needed in 7761 * the event that we resume this session and use ChannelID on the 7762 * resumption handshake. */ 7763 SSL3Hashes hashes; 7764 SECItem *originalHandshakeHash = 7765 &ss->sec.ci.sid->u.ssl3.originalHandshakeHash; 7766 PORT_Assert(ss->sec.ci.sid->cached == never_cached); 7767 7768 ssl_GetSpecReadLock(ss); 7769 PORT_Assert(ss->version > SSL_LIBRARY_VERSION_3_0); 7770 rv = ssl3_ComputeHandshakeHashes(ss, ss->ssl3.cwSpec, &hashes, 0); 7771 ssl_ReleaseSpecReadLock(ss); 7772 if (rv != SECSuccess) { 7773 return rv; 7774 } 7775 7776 PORT_Assert(originalHandshakeHash->len == 0); 7777 originalHandshakeHash->data = PORT_Alloc(hashes.len); 7778 if (!originalHandshakeHash->data) 7779 return SECFailure; 7780 originalHandshakeHash->len = hashes.len; 7781 memcpy(originalHandshakeHash->data, hashes.u.raw, hashes.len); 7782 } 7783 7784 if (ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn)) 7785 ss->ssl3.hs.ws = wait_new_session_ticket; 7786 else 7787 ss->ssl3.hs.ws = wait_change_cipher; 7788 7789 PORT_Assert(ssl3_WaitingForStartOfServerSecondRound(ss)); 7790 7791 return SECSuccess; 7792 7793 loser: 7794 ssl_ReleaseXmitBufLock(ss); 7795 return rv; 7796 } 7797 7798 /* 7799 * Routines used by servers 7800 */ 7801 static SECStatus 7802 ssl3_SendHelloRequest(sslSocket *ss) 7803 { 7804 SECStatus rv; 7805 7806 SSL_TRC(3, ("%d: SSL3[%d]: send hello_request handshake", SSL_GETPID(), 7807 ss->fd)); 7808 7809 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 7810 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss) ); 7811 7812 rv = ssl3_AppendHandshakeHeader(ss, hello_request, 0); 7813 if (rv != SECSuccess) { 7814 return rv; /* err set by AppendHandshake */ 7815 } 7816 rv = ssl3_FlushHandshake(ss, 0); 7817 if (rv != SECSuccess) { 7818 return rv; /* error code set by ssl3_FlushHandshake */ 7819 } 7820 ss->ssl3.hs.ws = wait_client_hello; 7821 return SECSuccess; 7822 } 7823 7824 /* 7825 * Called from: 7826 * ssl3_HandleClientHello() 7827 */ 7828 static SECComparison 7829 ssl3_ServerNameCompare(const SECItem *name1, const SECItem *name2) 7830 { 7831 if (!name1 != !name2) { 7832 return SECLessThan; 7833 } 7834 if (!name1) { 7835 return SECEqual; 7836 } 7837 if (name1->type != name2->type) { 7838 return SECLessThan; 7839 } 7840 return SECITEM_CompareItem(name1, name2); 7841 } 7842 7843 /* Sets memory error when returning NULL. 7844 * Called from: 7845 * ssl3_SendClientHello() 7846 * ssl3_HandleServerHello() 7847 * ssl3_HandleClientHello() 7848 * ssl3_HandleV2ClientHello() 7849 */ 7850 sslSessionID * 7851 ssl3_NewSessionID(sslSocket *ss, PRBool is_server) 7852 { 7853 sslSessionID *sid; 7854 7855 sid = PORT_ZNew(sslSessionID); 7856 if (sid == NULL) 7857 return sid; 7858 7859 if (is_server) { 7860 const SECItem * srvName; 7861 SECStatus rv = SECSuccess; 7862 7863 ssl_GetSpecReadLock(ss); /********************************/ 7864 srvName = &ss->ssl3.prSpec->srvVirtName; 7865 if (srvName->len && srvName->data) { 7866 rv = SECITEM_CopyItem(NULL, &sid->u.ssl3.srvName, srvName); 7867 } 7868 ssl_ReleaseSpecReadLock(ss); /************************************/ 7869 if (rv != SECSuccess) { 7870 PORT_Free(sid); 7871 return NULL; 7872 } 7873 } 7874 sid->peerID = (ss->peerID == NULL) ? NULL : PORT_Strdup(ss->peerID); 7875 sid->urlSvrName = (ss->url == NULL) ? NULL : PORT_Strdup(ss->url); 7876 sid->addr = ss->sec.ci.peer; 7877 sid->port = ss->sec.ci.port; 7878 sid->references = 1; 7879 sid->cached = never_cached; 7880 sid->version = ss->version; 7881 7882 sid->u.ssl3.keys.resumable = PR_TRUE; 7883 sid->u.ssl3.policy = SSL_ALLOWED; 7884 sid->u.ssl3.clientWriteKey = NULL; 7885 sid->u.ssl3.serverWriteKey = NULL; 7886 7887 if (is_server) { 7888 SECStatus rv; 7889 int pid = SSL_GETPID(); 7890 7891 sid->u.ssl3.sessionIDLength = SSL3_SESSIONID_BYTES; 7892 sid->u.ssl3.sessionID[0] = (pid >> 8) & 0xff; 7893 sid->u.ssl3.sessionID[1] = pid & 0xff; 7894 rv = PK11_GenerateRandom(sid->u.ssl3.sessionID + 2, 7895 SSL3_SESSIONID_BYTES -2); 7896 if (rv != SECSuccess) { 7897 ssl_FreeSID(sid); 7898 ssl_MapLowLevelError(SSL_ERROR_GENERATE_RANDOM_FAILURE); 7899 return NULL; 7900 } 7901 } 7902 return sid; 7903 } 7904 7905 /* Called from: ssl3_HandleClientHello, ssl3_HandleV2ClientHello */ 7906 static SECStatus 7907 ssl3_SendServerHelloSequence(sslSocket *ss) 7908 { 7909 const ssl3KEADef *kea_def; 7910 SECStatus rv; 7911 7912 SSL_TRC(3, ("%d: SSL3[%d]: begin send server_hello sequence", 7913 SSL_GETPID(), ss->fd)); 7914 7915 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 7916 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss) ); 7917 7918 rv = ssl3_SendServerHello(ss); 7919 if (rv != SECSuccess) { 7920 return rv; /* err code is set. */ 7921 } 7922 rv = ssl3_SendCertificate(ss); 7923 if (rv != SECSuccess) { 7924 return rv; /* error code is set. */ 7925 } 7926 rv = ssl3_SendCertificateStatus(ss); 7927 if (rv != SECSuccess) { 7928 return rv; /* error code is set. */ 7929 } 7930 /* We have to do this after the call to ssl3_SendServerHello, 7931 * because kea_def is set up by ssl3_SendServerHello(). 7932 */ 7933 kea_def = ss->ssl3.hs.kea_def; 7934 ss->ssl3.hs.usedStepDownKey = PR_FALSE; 7935 7936 if (kea_def->is_limited && kea_def->exchKeyType == kt_rsa) { 7937 /* see if we can legally use the key in the cert. */ 7938 int keyLen; /* bytes */ 7939 7940 keyLen = PK11_GetPrivateModulusLen( 7941 ss->serverCerts[kea_def->exchKeyType].SERVERKEY); 7942 7943 if (keyLen > 0 && 7944 keyLen * BPB <= kea_def->key_size_limit ) { 7945 /* XXX AND cert is not signing only!! */ 7946 /* just fall through and use it. */ 7947 } else if (ss->stepDownKeyPair != NULL) { 7948 ss->ssl3.hs.usedStepDownKey = PR_TRUE; 7949 rv = ssl3_SendServerKeyExchange(ss); 7950 if (rv != SECSuccess) { 7951 return rv; /* err code was set. */ 7952 } 7953 } else { 7954 #ifndef HACKED_EXPORT_SERVER 7955 PORT_SetError(SSL_ERROR_PUB_KEY_SIZE_LIMIT_EXCEEDED); 7956 return rv; 7957 #endif 7958 } 7959 #ifdef NSS_ENABLE_ECC 7960 } else if ((kea_def->kea == kea_ecdhe_rsa) || 7961 (kea_def->kea == kea_ecdhe_ecdsa)) { 7962 rv = ssl3_SendServerKeyExchange(ss); 7963 if (rv != SECSuccess) { 7964 return rv; /* err code was set. */ 7965 } 7966 #endif /* NSS_ENABLE_ECC */ 7967 } 7968 7969 if (ss->opt.requestCertificate) { 7970 rv = ssl3_SendCertificateRequest(ss); 7971 if (rv != SECSuccess) { 7972 return rv; /* err code is set. */ 7973 } 7974 } 7975 rv = ssl3_SendServerHelloDone(ss); 7976 if (rv != SECSuccess) { 7977 return rv; /* err code is set. */ 7978 } 7979 7980 ss->ssl3.hs.ws = (ss->opt.requestCertificate) ? wait_client_cert 7981 : wait_client_key; 7982 return SECSuccess; 7983 } 7984 7985 /* An empty TLS Renegotiation Info (RI) extension */ 7986 static const PRUint8 emptyRIext[5] = {0xff, 0x01, 0x00, 0x01, 0x00}; 7987 7988 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete 7989 * ssl3 Client Hello message. 7990 * Caller must hold Handshake and RecvBuf locks. 7991 */ 7992 static SECStatus 7993 ssl3_HandleClientHello(sslSocket *ss, SSL3Opaque *b, PRUint32 length) 7994 { 7995 sslSessionID * sid = NULL; 7996 PRInt32 tmp; 7997 unsigned int i; 7998 int j; 7999 SECStatus rv; 8000 int errCode = SSL_ERROR_RX_MALFORMED_CLIENT_HELLO; 8001 SSL3AlertDescription desc = illegal_parameter; 8002 SSL3AlertLevel level = alert_fatal; 8003 SSL3ProtocolVersion version; 8004 SECItem sidBytes = {siBuffer, NULL, 0}; 8005 SECItem cookieBytes = {siBuffer, NULL, 0}; 8006 SECItem suites = {siBuffer, NULL, 0}; 8007 SECItem comps = {siBuffer, NULL, 0}; 8008 PRBool haveSpecWriteLock = PR_FALSE; 8009 PRBool haveXmitBufLock = PR_FALSE; 8010 8011 SSL_TRC(3, ("%d: SSL3[%d]: handle client_hello handshake", 8012 SSL_GETPID(), ss->fd)); 8013 8014 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 8015 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 8016 PORT_Assert( ss->ssl3.initialized ); 8017 8018 /* Get peer name of client */ 8019 rv = ssl_GetPeerInfo(ss); 8020 if (rv != SECSuccess) { 8021 return rv; /* error code is set. */ 8022 } 8023 8024 /* Clearing the handshake pointers so that ssl_Do1stHandshake won't 8025 * call ssl2_HandleMessage. 8026 * 8027 * The issue here is that TLS ordinarily starts out in 8028 * ssl2_HandleV3HandshakeRecord() because of the backward-compatibility 8029 * code paths. That function zeroes these next pointers. But with DTLS, 8030 * we don't even try to do the v2 ClientHello so we skip that function 8031 * and need to reset these values here. 8032 */ 8033 if (IS_DTLS(ss)) { 8034 ss->nextHandshake = 0; 8035 ss->securityHandshake = 0; 8036 } 8037 8038 /* We might be starting session renegotiation in which case we should 8039 * clear previous state. 8040 */ 8041 PORT_Memset(&ss->xtnData, 0, sizeof(TLSExtensionData)); 8042 ss->statelessResume = PR_FALSE; 8043 8044 if ((ss->ssl3.hs.ws != wait_client_hello) && 8045 (ss->ssl3.hs.ws != idle_handshake)) { 8046 desc = unexpected_message; 8047 errCode = SSL_ERROR_RX_UNEXPECTED_CLIENT_HELLO; 8048 goto alert_loser; 8049 } 8050 if (ss->ssl3.hs.ws == idle_handshake && 8051 ss->opt.enableRenegotiation == SSL_RENEGOTIATE_NEVER) { 8052 desc = no_renegotiation; 8053 level = alert_warning; 8054 errCode = SSL_ERROR_RENEGOTIATION_NOT_ALLOWED; 8055 goto alert_loser; 8056 } 8057 8058 if (IS_DTLS(ss)) { 8059 dtls_RehandshakeCleanup(ss); 8060 } 8061 8062 tmp = ssl3_ConsumeHandshakeNumber(ss, 2, &b, &length); 8063 if (tmp < 0) 8064 goto loser; /* malformed, alert already sent */ 8065 8066 /* Translate the version */ 8067 if (IS_DTLS(ss)) { 8068 ss->clientHelloVersion = version = 8069 dtls_DTLSVersionToTLSVersion((SSL3ProtocolVersion)tmp); 8070 } else { 8071 ss->clientHelloVersion = version = (SSL3ProtocolVersion)tmp; 8072 } 8073 8074 rv = ssl3_NegotiateVersion(ss, version, PR_TRUE); 8075 if (rv != SECSuccess) { 8076 desc = (version > SSL_LIBRARY_VERSION_3_0) ? protocol_version 8077 : handshake_failure; 8078 errCode = SSL_ERROR_NO_CYPHER_OVERLAP; 8079 goto alert_loser; 8080 } 8081 8082 rv = ssl3_InitHandshakeHashes(ss); 8083 if (rv != SECSuccess) { 8084 desc = internal_error; 8085 errCode = PORT_GetError(); 8086 goto alert_loser; 8087 } 8088 8089 /* grab the client random data. */ 8090 rv = ssl3_ConsumeHandshake( 8091 ss, &ss->ssl3.hs.client_random, SSL3_RANDOM_LENGTH, &b, &length); 8092 if (rv != SECSuccess) { 8093 goto loser; /* malformed */ 8094 } 8095 8096 /* grab the client's SID, if present. */ 8097 rv = ssl3_ConsumeHandshakeVariable(ss, &sidBytes, 1, &b, &length); 8098 if (rv != SECSuccess) { 8099 goto loser; /* malformed */ 8100 } 8101 8102 /* grab the client's cookie, if present. */ 8103 if (IS_DTLS(ss)) { 8104 rv = ssl3_ConsumeHandshakeVariable(ss, &cookieBytes, 1, &b, &length); 8105 if (rv != SECSuccess) { 8106 goto loser; /* malformed */ 8107 } 8108 } 8109 8110 /* grab the list of cipher suites. */ 8111 rv = ssl3_ConsumeHandshakeVariable(ss, &suites, 2, &b, &length); 8112 if (rv != SECSuccess) { 8113 goto loser; /* malformed */ 8114 } 8115 8116 /* If the ClientHello version is less than our maximum version, check for a 8117 * TLS_FALLBACK_SCSV and reject the connection if found. */ 8118 if (ss->vrange.max > ss->clientHelloVersion) { 8119 for (i = 0; i + 1 < suites.len; i += 2) { 8120 PRUint16 suite_i = (suites.data[i] << 8) | suites.data[i + 1]; 8121 if (suite_i != TLS_FALLBACK_SCSV) 8122 continue; 8123 desc = inappropriate_fallback; 8124 errCode = SSL_ERROR_INAPPROPRIATE_FALLBACK_ALERT; 8125 goto alert_loser; 8126 } 8127 } 8128 8129 /* grab the list of compression methods. */ 8130 rv = ssl3_ConsumeHandshakeVariable(ss, &comps, 1, &b, &length); 8131 if (rv != SECSuccess) { 8132 goto loser; /* malformed */ 8133 } 8134 8135 desc = handshake_failure; 8136 8137 /* Handle TLS hello extensions for SSL3 & TLS. We do not know if 8138 * we are restarting a previous session until extensions have been 8139 * parsed, since we might have received a SessionTicket extension. 8140 * Note: we allow extensions even when negotiating SSL3 for the sake 8141 * of interoperability (and backwards compatibility). 8142 */ 8143 8144 if (length) { 8145 /* Get length of hello extensions */ 8146 PRInt32 extension_length; 8147 extension_length = ssl3_ConsumeHandshakeNumber(ss, 2, &b, &length); 8148 if (extension_length < 0) { 8149 goto loser; /* alert already sent */ 8150 } 8151 if (extension_length != length) { 8152 ssl3_DecodeError(ss); /* send alert */ 8153 goto loser; 8154 } 8155 rv = ssl3_HandleHelloExtensions(ss, &b, &length); 8156 if (rv != SECSuccess) { 8157 goto loser; /* malformed */ 8158 } 8159 } 8160 if (!ssl3_ExtensionNegotiated(ss, ssl_renegotiation_info_xtn)) { 8161 /* If we didn't receive an RI extension, look for the SCSV, 8162 * and if found, treat it just like an empty RI extension 8163 * by processing a local copy of an empty RI extension. 8164 */ 8165 for (i = 0; i + 1 < suites.len; i += 2) { 8166 PRUint16 suite_i = (suites.data[i] << 8) | suites.data[i + 1]; 8167 if (suite_i == TLS_EMPTY_RENEGOTIATION_INFO_SCSV) { 8168 SSL3Opaque * b2 = (SSL3Opaque *)emptyRIext; 8169 PRUint32 L2 = sizeof emptyRIext; 8170 (void)ssl3_HandleHelloExtensions(ss, &b2, &L2); 8171 break; 8172 } 8173 } 8174 } 8175 if (ss->firstHsDone && 8176 (ss->opt.enableRenegotiation == SSL_RENEGOTIATE_REQUIRES_XTN || 8177 ss->opt.enableRenegotiation == SSL_RENEGOTIATE_TRANSITIONAL) && 8178 !ssl3_ExtensionNegotiated(ss, ssl_renegotiation_info_xtn)) { 8179 desc = no_renegotiation; 8180 level = alert_warning; 8181 errCode = SSL_ERROR_RENEGOTIATION_NOT_ALLOWED; 8182 goto alert_loser; 8183 } 8184 if ((ss->opt.requireSafeNegotiation || 8185 (ss->firstHsDone && ss->peerRequestedProtection)) && 8186 !ssl3_ExtensionNegotiated(ss, ssl_renegotiation_info_xtn)) { 8187 desc = handshake_failure; 8188 errCode = SSL_ERROR_UNSAFE_NEGOTIATION; 8189 goto alert_loser; 8190 } 8191 8192 /* We do stateful resumes only if either of the following 8193 * conditions are satisfied: (1) the client does not support the 8194 * session ticket extension, or (2) the client support the session 8195 * ticket extension, but sent an empty ticket. 8196 */ 8197 if (!ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn) || 8198 ss->xtnData.emptySessionTicket) { 8199 if (sidBytes.len > 0 && !ss->opt.noCache) { 8200 SSL_TRC(7, ("%d: SSL3[%d]: server, lookup client session-id for 0x%08x%08x%08x%08x", 8201 SSL_GETPID(), ss->fd, ss->sec.ci.peer.pr_s6_addr32[0], 8202 ss->sec.ci.peer.pr_s6_addr32[1], 8203 ss->sec.ci.peer.pr_s6_addr32[2], 8204 ss->sec.ci.peer.pr_s6_addr32[3])); 8205 if (ssl_sid_lookup) { 8206 sid = (*ssl_sid_lookup)(&ss->sec.ci.peer, sidBytes.data, 8207 sidBytes.len, ss->dbHandle); 8208 } else { 8209 errCode = SSL_ERROR_SERVER_CACHE_NOT_CONFIGURED; 8210 goto loser; 8211 } 8212 } 8213 } else if (ss->statelessResume) { 8214 /* Fill in the client's session ID if doing a stateless resume. 8215 * (When doing stateless resumes, server echos client's SessionID.) 8216 */ 8217 sid = ss->sec.ci.sid; 8218 PORT_Assert(sid != NULL); /* Should have already been filled in.*/ 8219 8220 if (sidBytes.len > 0 && sidBytes.len <= SSL3_SESSIONID_BYTES) { 8221 sid->u.ssl3.sessionIDLength = sidBytes.len; 8222 PORT_Memcpy(sid->u.ssl3.sessionID, sidBytes.data, 8223 sidBytes.len); 8224 sid->u.ssl3.sessionIDLength = sidBytes.len; 8225 } else { 8226 sid->u.ssl3.sessionIDLength = 0; 8227 } 8228 ss->sec.ci.sid = NULL; 8229 } 8230 8231 /* We only send a session ticket extension if the client supports 8232 * the extension and we are unable to do either a stateful or 8233 * stateless resume. 8234 * 8235 * TODO: send a session ticket if performing a stateful 8236 * resumption. (As per RFC4507, a server may issue a session 8237 * ticket while doing a (stateless or stateful) session resume, 8238 * but OpenSSL-0.9.8g does not accept session tickets while 8239 * resuming.) 8240 */ 8241 if (ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn) && sid == NULL) { 8242 ssl3_RegisterServerHelloExtensionSender(ss, 8243 ssl_session_ticket_xtn, ssl3_SendSessionTicketXtn); 8244 } 8245 8246 if (sid != NULL) { 8247 /* We've found a session cache entry for this client. 8248 * Now, if we're going to require a client-auth cert, 8249 * and we don't already have this client's cert in the session cache, 8250 * and this is the first handshake on this connection (not a redo), 8251 * then drop this old cache entry and start a new session. 8252 */ 8253 if ((sid->peerCert == NULL) && ss->opt.requestCertificate && 8254 ((ss->opt.requireCertificate == SSL_REQUIRE_ALWAYS) || 8255 (ss->opt.requireCertificate == SSL_REQUIRE_NO_ERROR) || 8256 ((ss->opt.requireCertificate == SSL_REQUIRE_FIRST_HANDSHAKE) 8257 && !ss->firstHsDone))) { 8258 8259 SSL_AtomicIncrementLong(& ssl3stats.hch_sid_cache_not_ok ); 8260 if (ss->sec.uncache) 8261 ss->sec.uncache(sid); 8262 ssl_FreeSID(sid); 8263 sid = NULL; 8264 } 8265 } 8266 8267 #ifdef NSS_ENABLE_ECC 8268 /* Disable any ECC cipher suites for which we have no cert. */ 8269 ssl3_FilterECCipherSuitesByServerCerts(ss); 8270 #endif 8271 8272 if (IS_DTLS(ss)) { 8273 ssl3_DisableNonDTLSSuites(ss); 8274 } 8275 8276 if (!ssl3_HasGCMSupport()) { 8277 ssl3_DisableGCMSuites(ss); 8278 } 8279 8280 #ifdef PARANOID 8281 /* Look for a matching cipher suite. */ 8282 j = ssl3_config_match_init(ss); 8283 if (j <= 0) { /* no ciphers are working/supported by PK11 */ 8284 errCode = PORT_GetError(); /* error code is already set. */ 8285 goto alert_loser; 8286 } 8287 #endif 8288 8289 /* If we already have a session for this client, be sure to pick the 8290 ** same cipher suite and compression method we picked before. 8291 ** This is not a loop, despite appearances. 8292 */ 8293 if (sid) do { 8294 ssl3CipherSuiteCfg *suite; 8295 #ifdef PARANOID 8296 SSLVersionRange vrange = {ss->version, ss->version}; 8297 #endif 8298 8299 /* Check that the cached compression method is still enabled. */ 8300 if (!compressionEnabled(ss, sid->u.ssl3.compression)) 8301 break; 8302 8303 /* Check that the cached compression method is in the client's list */ 8304 for (i = 0; i < comps.len; i++) { 8305 if (comps.data[i] == sid->u.ssl3.compression) 8306 break; 8307 } 8308 if (i == comps.len) 8309 break; 8310 8311 suite = ss->cipherSuites; 8312 /* Find the entry for the cipher suite used in the cached session. */ 8313 for (j = ssl_V3_SUITES_IMPLEMENTED; j > 0; --j, ++suite) { 8314 if (suite->cipher_suite == sid->u.ssl3.cipherSuite) 8315 break; 8316 } 8317 PORT_Assert(j > 0); 8318 if (j <= 0) 8319 break; 8320 #ifdef PARANOID 8321 /* Double check that the cached cipher suite is still enabled, 8322 * implemented, and allowed by policy. Might have been disabled. 8323 * The product policy won't change during the process lifetime. 8324 * Implemented ("isPresent") shouldn't change for servers. 8325 */ 8326 if (!config_match(suite, ss->ssl3.policy, PR_TRUE, &vrange)) 8327 break; 8328 #else 8329 if (!suite->enabled) 8330 break; 8331 #endif 8332 /* Double check that the cached cipher suite is in the client's list */ 8333 for (i = 0; i + 1 < suites.len; i += 2) { 8334 PRUint16 suite_i = (suites.data[i] << 8) | suites.data[i + 1]; 8335 if (suite_i == suite->cipher_suite) { 8336 ss->ssl3.hs.cipher_suite = suite->cipher_suite; 8337 ss->ssl3.hs.suite_def = 8338 ssl_LookupCipherSuiteDef(ss->ssl3.hs.cipher_suite); 8339 8340 /* Use the cached compression method. */ 8341 ss->ssl3.hs.compression = sid->u.ssl3.compression; 8342 goto compression_found; 8343 } 8344 } 8345 } while (0); 8346 8347 /* START A NEW SESSION */ 8348 8349 #ifndef PARANOID 8350 /* Look for a matching cipher suite. */ 8351 j = ssl3_config_match_init(ss); 8352 if (j <= 0) { /* no ciphers are working/supported by PK11 */ 8353 errCode = PORT_GetError(); /* error code is already set. */ 8354 goto alert_loser; 8355 } 8356 #endif 8357 8358 /* Select a cipher suite. 8359 ** 8360 ** NOTE: This suite selection algorithm should be the same as the one in 8361 ** ssl3_HandleV2ClientHello(). 8362 ** 8363 ** If TLS 1.0 is enabled, we could handle the case where the client 8364 ** offered TLS 1.1 but offered only export cipher suites by choosing TLS 8365 ** 1.0 and selecting one of those export cipher suites. However, a secure 8366 ** TLS 1.1 client should not have export cipher suites enabled at all, 8367 ** and a TLS 1.1 client should definitely not be offering *only* export 8368 ** cipher suites. Therefore, we refuse to negotiate export cipher suites 8369 ** with any client that indicates support for TLS 1.1 or higher when we 8370 ** (the server) have TLS 1.1 support enabled. 8371 */ 8372 for (j = 0; j < ssl_V3_SUITES_IMPLEMENTED; j++) { 8373 ssl3CipherSuiteCfg *suite = &ss->cipherSuites[j]; 8374 SSLVersionRange vrange = {ss->version, ss->version}; 8375 if (!config_match(suite, ss->ssl3.policy, PR_TRUE, &vrange)) { 8376 continue; 8377 } 8378 for (i = 0; i + 1 < suites.len; i += 2) { 8379 PRUint16 suite_i = (suites.data[i] << 8) | suites.data[i + 1]; 8380 if (suite_i == suite->cipher_suite) { 8381 ss->ssl3.hs.cipher_suite = suite->cipher_suite; 8382 ss->ssl3.hs.suite_def = 8383 ssl_LookupCipherSuiteDef(ss->ssl3.hs.cipher_suite); 8384 goto suite_found; 8385 } 8386 } 8387 } 8388 errCode = SSL_ERROR_NO_CYPHER_OVERLAP; 8389 goto alert_loser; 8390 8391 suite_found: 8392 /* Select a compression algorithm. */ 8393 for (i = 0; i < comps.len; i++) { 8394 if (!compressionEnabled(ss, comps.data[i])) 8395 continue; 8396 for (j = 0; j < compressionMethodsCount; j++) { 8397 if (comps.data[i] == compressions[j]) { 8398 ss->ssl3.hs.compression = 8399 (SSLCompressionMethod)compressions[j]; 8400 goto compression_found; 8401 } 8402 } 8403 } 8404 errCode = SSL_ERROR_NO_COMPRESSION_OVERLAP; 8405 /* null compression must be supported */ 8406 goto alert_loser; 8407 8408 compression_found: 8409 suites.data = NULL; 8410 comps.data = NULL; 8411 8412 ss->sec.send = ssl3_SendApplicationData; 8413 8414 /* If there are any failures while processing the old sid, 8415 * we don't consider them to be errors. Instead, We just behave 8416 * as if the client had sent us no sid to begin with, and make a new one. 8417 */ 8418 if (sid != NULL) do { 8419 ssl3CipherSpec *pwSpec; 8420 SECItem wrappedMS; /* wrapped key */ 8421 8422 if (sid->version != ss->version || 8423 sid->u.ssl3.cipherSuite != ss->ssl3.hs.cipher_suite || 8424 sid->u.ssl3.compression != ss->ssl3.hs.compression) { 8425 break; /* not an error */ 8426 } 8427 8428 if (ss->sec.ci.sid) { 8429 if (ss->sec.uncache) 8430 ss->sec.uncache(ss->sec.ci.sid); 8431 PORT_Assert(ss->sec.ci.sid != sid); /* should be impossible, but ... */ 8432 if (ss->sec.ci.sid != sid) { 8433 ssl_FreeSID(ss->sec.ci.sid); 8434 } 8435 ss->sec.ci.sid = NULL; 8436 } 8437 /* we need to resurrect the master secret.... */ 8438 8439 ssl_GetSpecWriteLock(ss); haveSpecWriteLock = PR_TRUE; 8440 pwSpec = ss->ssl3.pwSpec; 8441 if (sid->u.ssl3.keys.msIsWrapped) { 8442 PK11SymKey * wrapKey; /* wrapping key */ 8443 CK_FLAGS keyFlags = 0; 8444 #ifndef NO_PKCS11_BYPASS 8445 if (ss->opt.bypassPKCS11) { 8446 /* we cannot restart a non-bypass session in a 8447 ** bypass socket. 8448 */ 8449 break; 8450 } 8451 #endif 8452 8453 wrapKey = getWrappingKey(ss, NULL, sid->u.ssl3.exchKeyType, 8454 sid->u.ssl3.masterWrapMech, 8455 ss->pkcs11PinArg); 8456 if (!wrapKey) { 8457 /* we have a SID cache entry, but no wrapping key for it??? */ 8458 break; 8459 } 8460 8461 if (ss->version > SSL_LIBRARY_VERSION_3_0) { /* isTLS */ 8462 keyFlags = CKF_SIGN | CKF_VERIFY; 8463 } 8464 8465 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; 8466 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; 8467 8468 /* unwrap the master secret. */ 8469 pwSpec->master_secret = 8470 PK11_UnwrapSymKeyWithFlags(wrapKey, sid->u.ssl3.masterWrapMech, 8471 NULL, &wrappedMS, CKM_SSL3_MASTER_KEY_DERIVE, 8472 CKA_DERIVE, sizeof(SSL3MasterSecret), keyFlags); 8473 PK11_FreeSymKey(wrapKey); 8474 if (pwSpec->master_secret == NULL) { 8475 break; /* not an error */ 8476 } 8477 #ifndef NO_PKCS11_BYPASS 8478 } else if (ss->opt.bypassPKCS11) { 8479 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; 8480 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; 8481 memcpy(pwSpec->raw_master_secret, wrappedMS.data, wrappedMS.len); 8482 pwSpec->msItem.data = pwSpec->raw_master_secret; 8483 pwSpec->msItem.len = wrappedMS.len; 8484 #endif 8485 } else { 8486 /* We CAN restart a bypass session in a non-bypass socket. */ 8487 /* need to import the raw master secret to session object */ 8488 PK11SlotInfo * slot; 8489 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; 8490 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; 8491 slot = PK11_GetInternalSlot(); 8492 pwSpec->master_secret = 8493 PK11_ImportSymKey(slot, CKM_SSL3_MASTER_KEY_DERIVE, 8494 PK11_OriginUnwrap, CKA_ENCRYPT, &wrappedMS, 8495 NULL); 8496 PK11_FreeSlot(slot); 8497 if (pwSpec->master_secret == NULL) { 8498 break; /* not an error */ 8499 } 8500 } 8501 ss->sec.ci.sid = sid; 8502 if (sid->peerCert != NULL) { 8503 ss->sec.peerCert = CERT_DupCertificate(sid->peerCert); 8504 ssl3_CopyPeerCertsFromSID(ss, sid); 8505 } 8506 8507 /* 8508 * Old SID passed all tests, so resume this old session. 8509 * 8510 * XXX make sure compression still matches 8511 */ 8512 SSL_AtomicIncrementLong(& ssl3stats.hch_sid_cache_hits ); 8513 if (ss->statelessResume) 8514 SSL_AtomicIncrementLong(& ssl3stats.hch_sid_stateless_resumes ); 8515 ss->ssl3.hs.isResuming = PR_TRUE; 8516 8517 ss->sec.authAlgorithm = sid->authAlgorithm; 8518 ss->sec.authKeyBits = sid->authKeyBits; 8519 ss->sec.keaType = sid->keaType; 8520 ss->sec.keaKeyBits = sid->keaKeyBits; 8521 8522 /* server sids don't remember the server cert we previously sent, 8523 ** but they do remember the kea type we originally used, so we 8524 ** can locate it again, provided that the current ssl socket 8525 ** has had its server certs configured the same as the previous one. 8526 */ 8527 ss->sec.localCert = 8528 CERT_DupCertificate(ss->serverCerts[sid->keaType].serverCert); 8529 8530 /* Copy cached name in to pending spec */ 8531 if (sid != NULL && 8532 sid->version > SSL_LIBRARY_VERSION_3_0 && 8533 sid->u.ssl3.srvName.len && sid->u.ssl3.srvName.data) { 8534 /* Set server name from sid */ 8535 SECItem *sidName = &sid->u.ssl3.srvName; 8536 SECItem *pwsName = &ss->ssl3.pwSpec->srvVirtName; 8537 if (pwsName->data) { 8538 SECITEM_FreeItem(pwsName, PR_FALSE); 8539 } 8540 rv = SECITEM_CopyItem(NULL, pwsName, sidName); 8541 if (rv != SECSuccess) { 8542 errCode = PORT_GetError(); 8543 desc = internal_error; 8544 goto alert_loser; 8545 } 8546 } 8547 8548 /* Clean up sni name array */ 8549 if (ssl3_ExtensionNegotiated(ss, ssl_server_name_xtn) && 8550 ss->xtnData.sniNameArr) { 8551 PORT_Free(ss->xtnData.sniNameArr); 8552 ss->xtnData.sniNameArr = NULL; 8553 ss->xtnData.sniNameArrSize = 0; 8554 } 8555 8556 ssl_GetXmitBufLock(ss); haveXmitBufLock = PR_TRUE; 8557 8558 rv = ssl3_SendServerHello(ss); 8559 if (rv != SECSuccess) { 8560 errCode = PORT_GetError(); 8561 goto loser; 8562 } 8563 8564 if (haveSpecWriteLock) { 8565 ssl_ReleaseSpecWriteLock(ss); 8566 haveSpecWriteLock = PR_FALSE; 8567 } 8568 8569 /* NULL value for PMS signifies re-use of the old MS */ 8570 rv = ssl3_InitPendingCipherSpec(ss, NULL); 8571 if (rv != SECSuccess) { 8572 errCode = PORT_GetError(); 8573 goto loser; 8574 } 8575 8576 rv = ssl3_SendChangeCipherSpecs(ss); 8577 if (rv != SECSuccess) { 8578 errCode = PORT_GetError(); 8579 goto loser; 8580 } 8581 rv = ssl3_SendFinished(ss, 0); 8582 ss->ssl3.hs.ws = wait_change_cipher; 8583 if (rv != SECSuccess) { 8584 errCode = PORT_GetError(); 8585 goto loser; 8586 } 8587 8588 if (haveXmitBufLock) { 8589 ssl_ReleaseXmitBufLock(ss); 8590 haveXmitBufLock = PR_FALSE; 8591 } 8592 8593 return SECSuccess; 8594 } while (0); 8595 8596 if (haveSpecWriteLock) { 8597 ssl_ReleaseSpecWriteLock(ss); 8598 haveSpecWriteLock = PR_FALSE; 8599 } 8600 8601 if (sid) { /* we had a sid, but it's no longer valid, free it */ 8602 SSL_AtomicIncrementLong(& ssl3stats.hch_sid_cache_not_ok ); 8603 if (ss->sec.uncache) 8604 ss->sec.uncache(sid); 8605 ssl_FreeSID(sid); 8606 sid = NULL; 8607 } 8608 SSL_AtomicIncrementLong(& ssl3stats.hch_sid_cache_misses ); 8609 8610 if (ssl3_ExtensionNegotiated(ss, ssl_server_name_xtn)) { 8611 int ret = 0; 8612 if (ss->sniSocketConfig) do { /* not a loop */ 8613 ret = SSL_SNI_SEND_ALERT; 8614 /* If extension is negotiated, the len of names should > 0. */ 8615 if (ss->xtnData.sniNameArrSize) { 8616 /* Calling client callback to reconfigure the socket. */ 8617 ret = (SECStatus)(*ss->sniSocketConfig)(ss->fd, 8618 ss->xtnData.sniNameArr, 8619 ss->xtnData.sniNameArrSize, 8620 ss->sniSocketConfigArg); 8621 } 8622 if (ret <= SSL_SNI_SEND_ALERT) { 8623 /* Application does not know the name or was not able to 8624 * properly reconfigure the socket. */ 8625 errCode = SSL_ERROR_UNRECOGNIZED_NAME_ALERT; 8626 desc = unrecognized_name; 8627 break; 8628 } else if (ret == SSL_SNI_CURRENT_CONFIG_IS_USED) { 8629 SECStatus rv = SECSuccess; 8630 SECItem * cwsName, *pwsName; 8631 8632 ssl_GetSpecWriteLock(ss); /*******************************/ 8633 pwsName = &ss->ssl3.pwSpec->srvVirtName; 8634 cwsName = &ss->ssl3.cwSpec->srvVirtName; 8635 #ifndef SSL_SNI_ALLOW_NAME_CHANGE_2HS 8636 /* not allow name change on the 2d HS */ 8637 if (ss->firstHsDone) { 8638 if (ssl3_ServerNameCompare(pwsName, cwsName)) { 8639 ssl_ReleaseSpecWriteLock(ss); /******************/ 8640 errCode = SSL_ERROR_UNRECOGNIZED_NAME_ALERT; 8641 desc = handshake_failure; 8642 ret = SSL_SNI_SEND_ALERT; 8643 break; 8644 } 8645 } 8646 #endif 8647 if (pwsName->data) { 8648 SECITEM_FreeItem(pwsName, PR_FALSE); 8649 } 8650 if (cwsName->data) { 8651 rv = SECITEM_CopyItem(NULL, pwsName, cwsName); 8652 } 8653 ssl_ReleaseSpecWriteLock(ss); /**************************/ 8654 if (rv != SECSuccess) { 8655 errCode = SSL_ERROR_INTERNAL_ERROR_ALERT; 8656 desc = internal_error; 8657 ret = SSL_SNI_SEND_ALERT; 8658 break; 8659 } 8660 } else if (ret < ss->xtnData.sniNameArrSize) { 8661 /* Application has configured new socket info. Lets check it 8662 * and save the name. */ 8663 SECStatus rv; 8664 SECItem * name = &ss->xtnData.sniNameArr[ret]; 8665 int configedCiphers; 8666 SECItem * pwsName; 8667 8668 /* get rid of the old name and save the newly picked. */ 8669 /* This code is protected by ssl3HandshakeLock. */ 8670 ssl_GetSpecWriteLock(ss); /*******************************/ 8671 #ifndef SSL_SNI_ALLOW_NAME_CHANGE_2HS 8672 /* not allow name change on the 2d HS */ 8673 if (ss->firstHsDone) { 8674 SECItem *cwsName = &ss->ssl3.cwSpec->srvVirtName; 8675 if (ssl3_ServerNameCompare(name, cwsName)) { 8676 ssl_ReleaseSpecWriteLock(ss); /******************/ 8677 errCode = SSL_ERROR_UNRECOGNIZED_NAME_ALERT; 8678 desc = handshake_failure; 8679 ret = SSL_SNI_SEND_ALERT; 8680 break; 8681 } 8682 } 8683 #endif 8684 pwsName = &ss->ssl3.pwSpec->srvVirtName; 8685 if (pwsName->data) { 8686 SECITEM_FreeItem(pwsName, PR_FALSE); 8687 } 8688 rv = SECITEM_CopyItem(NULL, pwsName, name); 8689 ssl_ReleaseSpecWriteLock(ss); /***************************/ 8690 if (rv != SECSuccess) { 8691 errCode = SSL_ERROR_INTERNAL_ERROR_ALERT; 8692 desc = internal_error; 8693 ret = SSL_SNI_SEND_ALERT; 8694 break; 8695 } 8696 configedCiphers = ssl3_config_match_init(ss); 8697 if (configedCiphers <= 0) { 8698 /* no ciphers are working/supported */ 8699 errCode = PORT_GetError(); 8700 desc = handshake_failure; 8701 ret = SSL_SNI_SEND_ALERT; 8702 break; 8703 } 8704 /* Need to tell the client that application has picked 8705 * the name from the offered list and reconfigured the socket. 8706 */ 8707 ssl3_RegisterServerHelloExtensionSender(ss, ssl_server_name_xtn, 8708 ssl3_SendServerNameXtn); 8709 } else { 8710 /* Callback returned index outside of the boundary. */ 8711 PORT_Assert(ret < ss->xtnData.sniNameArrSize); 8712 errCode = SSL_ERROR_INTERNAL_ERROR_ALERT; 8713 desc = internal_error; 8714 ret = SSL_SNI_SEND_ALERT; 8715 break; 8716 } 8717 } while (0); 8718 /* Free sniNameArr. The data that each SECItem in the array 8719 * points into is the data from the input buffer "b". It will 8720 * not be available outside the scope of this or it's child 8721 * functions.*/ 8722 if (ss->xtnData.sniNameArr) { 8723 PORT_Free(ss->xtnData.sniNameArr); 8724 ss->xtnData.sniNameArr = NULL; 8725 ss->xtnData.sniNameArrSize = 0; 8726 } 8727 if (ret <= SSL_SNI_SEND_ALERT) { 8728 /* desc and errCode should be set. */ 8729 goto alert_loser; 8730 } 8731 } 8732 #ifndef SSL_SNI_ALLOW_NAME_CHANGE_2HS 8733 else if (ss->firstHsDone) { 8734 /* Check that we don't have the name is current spec 8735 * if this extension was not negotiated on the 2d hs. */ 8736 PRBool passed = PR_TRUE; 8737 ssl_GetSpecReadLock(ss); /*******************************/ 8738 if (ss->ssl3.cwSpec->srvVirtName.data) { 8739 passed = PR_FALSE; 8740 } 8741 ssl_ReleaseSpecReadLock(ss); /***************************/ 8742 if (!passed) { 8743 errCode = SSL_ERROR_UNRECOGNIZED_NAME_ALERT; 8744 desc = handshake_failure; 8745 goto alert_loser; 8746 } 8747 } 8748 #endif 8749 8750 sid = ssl3_NewSessionID(ss, PR_TRUE); 8751 if (sid == NULL) { 8752 errCode = PORT_GetError(); 8753 goto loser; /* memory error is set. */ 8754 } 8755 ss->sec.ci.sid = sid; 8756 8757 ss->ssl3.hs.isResuming = PR_FALSE; 8758 ssl_GetXmitBufLock(ss); 8759 rv = ssl3_SendServerHelloSequence(ss); 8760 ssl_ReleaseXmitBufLock(ss); 8761 if (rv != SECSuccess) { 8762 errCode = PORT_GetError(); 8763 goto loser; 8764 } 8765 8766 if (haveXmitBufLock) { 8767 ssl_ReleaseXmitBufLock(ss); 8768 haveXmitBufLock = PR_FALSE; 8769 } 8770 8771 return SECSuccess; 8772 8773 alert_loser: 8774 if (haveSpecWriteLock) { 8775 ssl_ReleaseSpecWriteLock(ss); 8776 haveSpecWriteLock = PR_FALSE; 8777 } 8778 (void)SSL3_SendAlert(ss, level, desc); 8779 /* FALLTHRU */ 8780 loser: 8781 if (haveSpecWriteLock) { 8782 ssl_ReleaseSpecWriteLock(ss); 8783 haveSpecWriteLock = PR_FALSE; 8784 } 8785 8786 if (haveXmitBufLock) { 8787 ssl_ReleaseXmitBufLock(ss); 8788 haveXmitBufLock = PR_FALSE; 8789 } 8790 8791 PORT_SetError(errCode); 8792 return SECFailure; 8793 } 8794 8795 /* 8796 * ssl3_HandleV2ClientHello is used when a V2 formatted hello comes 8797 * in asking to use the V3 handshake. 8798 * Called from ssl2_HandleClientHelloMessage() in sslcon.c 8799 */ 8800 SECStatus 8801 ssl3_HandleV2ClientHello(sslSocket *ss, unsigned char *buffer, int length) 8802 { 8803 sslSessionID * sid = NULL; 8804 unsigned char * suites; 8805 unsigned char * random; 8806 SSL3ProtocolVersion version; 8807 SECStatus rv; 8808 int i; 8809 int j; 8810 int sid_length; 8811 int suite_length; 8812 int rand_length; 8813 int errCode = SSL_ERROR_RX_MALFORMED_CLIENT_HELLO; 8814 SSL3AlertDescription desc = handshake_failure; 8815 8816 SSL_TRC(3, ("%d: SSL3[%d]: handle v2 client_hello", SSL_GETPID(), ss->fd)); 8817 8818 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 8819 8820 ssl_GetSSL3HandshakeLock(ss); 8821 8822 PORT_Memset(&ss->xtnData, 0, sizeof(TLSExtensionData)); 8823 8824 rv = ssl3_InitState(ss); 8825 if (rv != SECSuccess) { 8826 ssl_ReleaseSSL3HandshakeLock(ss); 8827 return rv; /* ssl3_InitState has set the error code. */ 8828 } 8829 rv = ssl3_RestartHandshakeHashes(ss); 8830 if (rv != SECSuccess) { 8831 ssl_ReleaseSSL3HandshakeLock(ss); 8832 return rv; 8833 } 8834 8835 if (ss->ssl3.hs.ws != wait_client_hello) { 8836 desc = unexpected_message; 8837 errCode = SSL_ERROR_RX_UNEXPECTED_CLIENT_HELLO; 8838 goto loser; /* alert_loser */ 8839 } 8840 8841 version = (buffer[1] << 8) | buffer[2]; 8842 suite_length = (buffer[3] << 8) | buffer[4]; 8843 sid_length = (buffer[5] << 8) | buffer[6]; 8844 rand_length = (buffer[7] << 8) | buffer[8]; 8845 ss->clientHelloVersion = version; 8846 8847 rv = ssl3_NegotiateVersion(ss, version, PR_TRUE); 8848 if (rv != SECSuccess) { 8849 /* send back which ever alert client will understand. */ 8850 desc = (version > SSL_LIBRARY_VERSION_3_0) ? protocol_version : handshake_failure; 8851 errCode = SSL_ERROR_NO_CYPHER_OVERLAP; 8852 goto alert_loser; 8853 } 8854 8855 rv = ssl3_InitHandshakeHashes(ss); 8856 if (rv != SECSuccess) { 8857 desc = internal_error; 8858 errCode = PORT_GetError(); 8859 goto alert_loser; 8860 } 8861 8862 /* if we get a non-zero SID, just ignore it. */ 8863 if (length != 8864 SSL_HL_CLIENT_HELLO_HBYTES + suite_length + sid_length + rand_length) { 8865 SSL_DBG(("%d: SSL3[%d]: bad v2 client hello message, len=%d should=%d", 8866 SSL_GETPID(), ss->fd, length, 8867 SSL_HL_CLIENT_HELLO_HBYTES + suite_length + sid_length + 8868 rand_length)); 8869 goto loser; /* malformed */ /* alert_loser */ 8870 } 8871 8872 suites = buffer + SSL_HL_CLIENT_HELLO_HBYTES; 8873 random = suites + suite_length + sid_length; 8874 8875 if (rand_length < SSL_MIN_CHALLENGE_BYTES || 8876 rand_length > SSL_MAX_CHALLENGE_BYTES) { 8877 goto loser; /* malformed */ /* alert_loser */ 8878 } 8879 8880 PORT_Assert(SSL_MAX_CHALLENGE_BYTES == SSL3_RANDOM_LENGTH); 8881 8882 PORT_Memset(&ss->ssl3.hs.client_random, 0, SSL3_RANDOM_LENGTH); 8883 PORT_Memcpy( 8884 &ss->ssl3.hs.client_random.rand[SSL3_RANDOM_LENGTH - rand_length], 8885 random, rand_length); 8886 8887 PRINT_BUF(60, (ss, "client random:", &ss->ssl3.hs.client_random.rand[0], 8888 SSL3_RANDOM_LENGTH)); 8889 #ifdef NSS_ENABLE_ECC 8890 /* Disable any ECC cipher suites for which we have no cert. */ 8891 ssl3_FilterECCipherSuitesByServerCerts(ss); 8892 #endif 8893 i = ssl3_config_match_init(ss); 8894 if (i <= 0) { 8895 errCode = PORT_GetError(); /* error code is already set. */ 8896 goto alert_loser; 8897 } 8898 8899 /* Select a cipher suite. 8900 ** 8901 ** NOTE: This suite selection algorithm should be the same as the one in 8902 ** ssl3_HandleClientHello(). 8903 ** 8904 ** See the comments about export cipher suites in ssl3_HandleClientHello(). 8905 */ 8906 for (j = 0; j < ssl_V3_SUITES_IMPLEMENTED; j++) { 8907 ssl3CipherSuiteCfg *suite = &ss->cipherSuites[j]; 8908 SSLVersionRange vrange = {ss->version, ss->version}; 8909 if (!config_match(suite, ss->ssl3.policy, PR_TRUE, &vrange)) { 8910 continue; 8911 } 8912 for (i = 0; i+2 < suite_length; i += 3) { 8913 PRUint32 suite_i = (suites[i] << 16)|(suites[i+1] << 8)|suites[i+2]; 8914 if (suite_i == suite->cipher_suite) { 8915 ss->ssl3.hs.cipher_suite = suite->cipher_suite; 8916 ss->ssl3.hs.suite_def = 8917 ssl_LookupCipherSuiteDef(ss->ssl3.hs.cipher_suite); 8918 goto suite_found; 8919 } 8920 } 8921 } 8922 errCode = SSL_ERROR_NO_CYPHER_OVERLAP; 8923 goto alert_loser; 8924 8925 suite_found: 8926 8927 /* Look for the SCSV, and if found, treat it just like an empty RI 8928 * extension by processing a local copy of an empty RI extension. 8929 */ 8930 for (i = 0; i+2 < suite_length; i += 3) { 8931 PRUint32 suite_i = (suites[i] << 16) | (suites[i+1] << 8) | suites[i+2]; 8932 if (suite_i == TLS_EMPTY_RENEGOTIATION_INFO_SCSV) { 8933 SSL3Opaque * b2 = (SSL3Opaque *)emptyRIext; 8934 PRUint32 L2 = sizeof emptyRIext; 8935 (void)ssl3_HandleHelloExtensions(ss, &b2, &L2); 8936 break; 8937 } 8938 } 8939 8940 if (ss->opt.requireSafeNegotiation && 8941 !ssl3_ExtensionNegotiated(ss, ssl_renegotiation_info_xtn)) { 8942 desc = handshake_failure; 8943 errCode = SSL_ERROR_UNSAFE_NEGOTIATION; 8944 goto alert_loser; 8945 } 8946 8947 ss->ssl3.hs.compression = ssl_compression_null; 8948 ss->sec.send = ssl3_SendApplicationData; 8949 8950 /* we don't even search for a cache hit here. It's just a miss. */ 8951 SSL_AtomicIncrementLong(& ssl3stats.hch_sid_cache_misses ); 8952 sid = ssl3_NewSessionID(ss, PR_TRUE); 8953 if (sid == NULL) { 8954 errCode = PORT_GetError(); 8955 goto loser; /* memory error is set. */ 8956 } 8957 ss->sec.ci.sid = sid; 8958 /* do not worry about memory leak of sid since it now belongs to ci */ 8959 8960 /* We have to update the handshake hashes before we can send stuff */ 8961 rv = ssl3_UpdateHandshakeHashes(ss, buffer, length); 8962 if (rv != SECSuccess) { 8963 errCode = PORT_GetError(); 8964 goto loser; 8965 } 8966 8967 ssl_GetXmitBufLock(ss); 8968 rv = ssl3_SendServerHelloSequence(ss); 8969 ssl_ReleaseXmitBufLock(ss); 8970 if (rv != SECSuccess) { 8971 errCode = PORT_GetError(); 8972 goto loser; 8973 } 8974 8975 /* XXX_1 The call stack to here is: 8976 * ssl_Do1stHandshake -> ssl2_HandleClientHelloMessage -> here. 8977 * ssl2_HandleClientHelloMessage returns whatever we return here. 8978 * ssl_Do1stHandshake will continue looping if it gets back either 8979 * SECSuccess or SECWouldBlock. 8980 * SECSuccess is preferable here. See XXX_1 in sslgathr.c. 8981 */ 8982 ssl_ReleaseSSL3HandshakeLock(ss); 8983 return SECSuccess; 8984 8985 alert_loser: 8986 SSL3_SendAlert(ss, alert_fatal, desc); 8987 loser: 8988 ssl_ReleaseSSL3HandshakeLock(ss); 8989 PORT_SetError(errCode); 8990 return SECFailure; 8991 } 8992 8993 /* The negotiated version number has been already placed in ss->version. 8994 ** 8995 ** Called from: ssl3_HandleClientHello (resuming session), 8996 ** ssl3_SendServerHelloSequence <- ssl3_HandleClientHello (new session), 8997 ** ssl3_SendServerHelloSequence <- ssl3_HandleV2ClientHello (new session) 8998 */ 8999 static SECStatus 9000 ssl3_SendServerHello(sslSocket *ss) 9001 { 9002 sslSessionID *sid; 9003 SECStatus rv; 9004 PRUint32 maxBytes = 65535; 9005 PRUint32 length; 9006 PRInt32 extensions_len = 0; 9007 SSL3ProtocolVersion version; 9008 9009 SSL_TRC(3, ("%d: SSL3[%d]: send server_hello handshake", SSL_GETPID(), 9010 ss->fd)); 9011 9012 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); 9013 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 9014 9015 if (!IS_DTLS(ss)) { 9016 PORT_Assert(MSB(ss->version) == MSB(SSL_LIBRARY_VERSION_3_0)); 9017 9018 if (MSB(ss->version) != MSB(SSL_LIBRARY_VERSION_3_0)) { 9019 PORT_SetError(SSL_ERROR_NO_CYPHER_OVERLAP); 9020 return SECFailure; 9021 } 9022 } else { 9023 PORT_Assert(MSB(ss->version) == MSB(SSL_LIBRARY_VERSION_DTLS_1_0)); 9024 9025 if (MSB(ss->version) != MSB(SSL_LIBRARY_VERSION_DTLS_1_0)) { 9026 PORT_SetError(SSL_ERROR_NO_CYPHER_OVERLAP); 9027 return SECFailure; 9028 } 9029 } 9030 9031 sid = ss->sec.ci.sid; 9032 9033 extensions_len = ssl3_CallHelloExtensionSenders(ss, PR_FALSE, maxBytes, 9034 &ss->xtnData.serverSenders[0]); 9035 if (extensions_len > 0) 9036 extensions_len += 2; /* Add sizeof total extension length */ 9037 9038 length = sizeof(SSL3ProtocolVersion) + SSL3_RANDOM_LENGTH + 1 + 9039 ((sid == NULL) ? 0: sid->u.ssl3.sessionIDLength) + 9040 sizeof(ssl3CipherSuite) + 1 + extensions_len; 9041 rv = ssl3_AppendHandshakeHeader(ss, server_hello, length); 9042 if (rv != SECSuccess) { 9043 return rv; /* err set by AppendHandshake. */ 9044 } 9045 9046 if (IS_DTLS(ss)) { 9047 version = dtls_TLSVersionToDTLSVersion(ss->version); 9048 } else { 9049 version = ss->version; 9050 } 9051 9052 rv = ssl3_AppendHandshakeNumber(ss, version, 2); 9053 if (rv != SECSuccess) { 9054 return rv; /* err set by AppendHandshake. */ 9055 } 9056 rv = ssl3_GetNewRandom(&ss->ssl3.hs.server_random); 9057 if (rv != SECSuccess) { 9058 ssl_MapLowLevelError(SSL_ERROR_GENERATE_RANDOM_FAILURE); 9059 return rv; 9060 } 9061 rv = ssl3_AppendHandshake( 9062 ss, &ss->ssl3.hs.server_random, SSL3_RANDOM_LENGTH); 9063 if (rv != SECSuccess) { 9064 return rv; /* err set by AppendHandshake. */ 9065 } 9066 9067 if (sid) 9068 rv = ssl3_AppendHandshakeVariable( 9069 ss, sid->u.ssl3.sessionID, sid->u.ssl3.sessionIDLength, 1); 9070 else 9071 rv = ssl3_AppendHandshakeVariable(ss, NULL, 0, 1); 9072 if (rv != SECSuccess) { 9073 return rv; /* err set by AppendHandshake. */ 9074 } 9075 9076 rv = ssl3_AppendHandshakeNumber(ss, ss->ssl3.hs.cipher_suite, 2); 9077 if (rv != SECSuccess) { 9078 return rv; /* err set by AppendHandshake. */ 9079 } 9080 rv = ssl3_AppendHandshakeNumber(ss, ss->ssl3.hs.compression, 1); 9081 if (rv != SECSuccess) { 9082 return rv; /* err set by AppendHandshake. */ 9083 } 9084 if (extensions_len) { 9085 PRInt32 sent_len; 9086 9087 extensions_len -= 2; 9088 rv = ssl3_AppendHandshakeNumber(ss, extensions_len, 2); 9089 if (rv != SECSuccess) 9090 return rv; /* err set by ssl3_SetupPendingCipherSpec */ 9091 sent_len = ssl3_CallHelloExtensionSenders(ss, PR_TRUE, extensions_len, 9092 &ss->xtnData.serverSenders[0]); 9093 PORT_Assert(sent_len == extensions_len); 9094 if (sent_len != extensions_len) { 9095 if (sent_len >= 0) 9096 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 9097 return SECFailure; 9098 } 9099 } 9100 rv = ssl3_SetupPendingCipherSpec(ss); 9101 if (rv != SECSuccess) { 9102 return rv; /* err set by ssl3_SetupPendingCipherSpec */ 9103 } 9104 9105 return SECSuccess; 9106 } 9107 9108 /* ssl3_PickSignatureHashAlgorithm selects a hash algorithm to use when signing 9109 * elements of the handshake. (The negotiated cipher suite determines the 9110 * signature algorithm.) Prior to TLS 1.2, the MD5/SHA1 combination is always 9111 * used. With TLS 1.2, a client may advertise its support for signature and 9112 * hash combinations. */ 9113 static SECStatus 9114 ssl3_PickSignatureHashAlgorithm(sslSocket *ss, 9115 SSL3SignatureAndHashAlgorithm* out) 9116 { 9117 TLSSignatureAlgorithm sigAlg; 9118 unsigned int i, j; 9119 /* hashPreference expresses our preferences for hash algorithms, most 9120 * preferable first. */ 9121 static const PRUint8 hashPreference[] = { 9122 tls_hash_sha256, 9123 tls_hash_sha384, 9124 tls_hash_sha512, 9125 tls_hash_sha1, 9126 }; 9127 9128 switch (ss->ssl3.hs.kea_def->kea) { 9129 case kea_rsa: 9130 case kea_rsa_export: 9131 case kea_rsa_export_1024: 9132 case kea_dh_rsa: 9133 case kea_dh_rsa_export: 9134 case kea_dhe_rsa: 9135 case kea_dhe_rsa_export: 9136 case kea_rsa_fips: 9137 case kea_ecdh_rsa: 9138 case kea_ecdhe_rsa: 9139 sigAlg = tls_sig_rsa; 9140 break; 9141 case kea_dh_dss: 9142 case kea_dh_dss_export: 9143 case kea_dhe_dss: 9144 case kea_dhe_dss_export: 9145 sigAlg = tls_sig_dsa; 9146 break; 9147 case kea_ecdh_ecdsa: 9148 case kea_ecdhe_ecdsa: 9149 sigAlg = tls_sig_ecdsa; 9150 break; 9151 default: 9152 PORT_SetError(SEC_ERROR_UNSUPPORTED_KEYALG); 9153 return SECFailure; 9154 } 9155 out->sigAlg = sigAlg; 9156 9157 if (ss->version <= SSL_LIBRARY_VERSION_TLS_1_1) { 9158 /* SEC_OID_UNKNOWN means the MD5/SHA1 combo hash used in TLS 1.1 and 9159 * prior. */ 9160 out->hashAlg = SEC_OID_UNKNOWN; 9161 return SECSuccess; 9162 } 9163 9164 if (ss->ssl3.hs.numClientSigAndHash == 0) { 9165 /* If the client didn't provide any signature_algorithms extension then 9166 * we can assume that they support SHA-1: 9167 * https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 */ 9168 out->hashAlg = SEC_OID_SHA1; 9169 return SECSuccess; 9170 } 9171 9172 for (i = 0; i < PR_ARRAY_SIZE(hashPreference); i++) { 9173 for (j = 0; j < ss->ssl3.hs.numClientSigAndHash; j++) { 9174 const SSL3SignatureAndHashAlgorithm* sh = 9175 &ss->ssl3.hs.clientSigAndHash[j]; 9176 if (sh->sigAlg == sigAlg && sh->hashAlg == hashPreference[i]) { 9177 out->hashAlg = sh->hashAlg; 9178 return SECSuccess; 9179 } 9180 } 9181 } 9182 9183 PORT_SetError(SSL_ERROR_UNSUPPORTED_HASH_ALGORITHM); 9184 return SECFailure; 9185 } 9186 9187 9188 static SECStatus 9189 ssl3_SendServerKeyExchange(sslSocket *ss) 9190 { 9191 const ssl3KEADef * kea_def = ss->ssl3.hs.kea_def; 9192 SECStatus rv = SECFailure; 9193 int length; 9194 PRBool isTLS; 9195 SECItem signed_hash = {siBuffer, NULL, 0}; 9196 SSL3Hashes hashes; 9197 SECKEYPublicKey * sdPub; /* public key for step-down */ 9198 SSL3SignatureAndHashAlgorithm sigAndHash; 9199 9200 SSL_TRC(3, ("%d: SSL3[%d]: send server_key_exchange handshake", 9201 SSL_GETPID(), ss->fd)); 9202 9203 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); 9204 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 9205 9206 if (ssl3_PickSignatureHashAlgorithm(ss, &sigAndHash) != SECSuccess) { 9207 return SECFailure; 9208 } 9209 9210 switch (kea_def->exchKeyType) { 9211 case kt_rsa: 9212 /* Perform SSL Step-Down here. */ 9213 sdPub = ss->stepDownKeyPair->pubKey; 9214 PORT_Assert(sdPub != NULL); 9215 if (!sdPub) { 9216 PORT_SetError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); 9217 return SECFailure; 9218 } 9219 rv = ssl3_ComputeExportRSAKeyHash(sigAndHash.hashAlg, 9220 sdPub->u.rsa.modulus, 9221 sdPub->u.rsa.publicExponent, 9222 &ss->ssl3.hs.client_random, 9223 &ss->ssl3.hs.server_random, 9224 &hashes, ss->opt.bypassPKCS11); 9225 if (rv != SECSuccess) { 9226 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); 9227 return rv; 9228 } 9229 9230 isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0); 9231 rv = ssl3_SignHashes(&hashes, ss->serverCerts[kt_rsa].SERVERKEY, 9232 &signed_hash, isTLS); 9233 if (rv != SECSuccess) { 9234 goto loser; /* ssl3_SignHashes has set err. */ 9235 } 9236 if (signed_hash.data == NULL) { 9237 /* how can this happen and rv == SECSuccess ?? */ 9238 PORT_SetError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); 9239 goto loser; 9240 } 9241 length = 2 + sdPub->u.rsa.modulus.len + 9242 2 + sdPub->u.rsa.publicExponent.len + 9243 2 + signed_hash.len; 9244 9245 rv = ssl3_AppendHandshakeHeader(ss, server_key_exchange, length); 9246 if (rv != SECSuccess) { 9247 goto loser; /* err set by AppendHandshake. */ 9248 } 9249 9250 rv = ssl3_AppendHandshakeVariable(ss, sdPub->u.rsa.modulus.data, 9251 sdPub->u.rsa.modulus.len, 2); 9252 if (rv != SECSuccess) { 9253 goto loser; /* err set by AppendHandshake. */ 9254 } 9255 9256 rv = ssl3_AppendHandshakeVariable( 9257 ss, sdPub->u.rsa.publicExponent.data, 9258 sdPub->u.rsa.publicExponent.len, 2); 9259 if (rv != SECSuccess) { 9260 goto loser; /* err set by AppendHandshake. */ 9261 } 9262 9263 if (ss->ssl3.pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2) { 9264 rv = ssl3_AppendSignatureAndHashAlgorithm(ss, &sigAndHash); 9265 if (rv != SECSuccess) { 9266 goto loser; /* err set by AppendHandshake. */ 9267 } 9268 } 9269 9270 rv = ssl3_AppendHandshakeVariable(ss, signed_hash.data, 9271 signed_hash.len, 2); 9272 if (rv != SECSuccess) { 9273 goto loser; /* err set by AppendHandshake. */ 9274 } 9275 PORT_Free(signed_hash.data); 9276 return SECSuccess; 9277 9278 #ifdef NSS_ENABLE_ECC 9279 case kt_ecdh: { 9280 rv = ssl3_SendECDHServerKeyExchange(ss, &sigAndHash); 9281 return rv; 9282 } 9283 #endif /* NSS_ENABLE_ECC */ 9284 9285 case kt_dh: 9286 case kt_null: 9287 default: 9288 PORT_SetError(SEC_ERROR_UNSUPPORTED_KEYALG); 9289 break; 9290 } 9291 loser: 9292 if (signed_hash.data != NULL) 9293 PORT_Free(signed_hash.data); 9294 return SECFailure; 9295 } 9296 9297 9298 static SECStatus 9299 ssl3_SendCertificateRequest(sslSocket *ss) 9300 { 9301 PRBool isTLS12; 9302 SECItem * name; 9303 CERTDistNames *ca_list; 9304 const PRUint8 *certTypes; 9305 const PRUint8 *sigAlgs; 9306 SECItem * names = NULL; 9307 SECStatus rv; 9308 int length; 9309 int i; 9310 int calen = 0; 9311 int nnames = 0; 9312 int certTypesLength; 9313 int sigAlgsLength; 9314 9315 SSL_TRC(3, ("%d: SSL3[%d]: send certificate_request handshake", 9316 SSL_GETPID(), ss->fd)); 9317 9318 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); 9319 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 9320 9321 isTLS12 = (PRBool)(ss->ssl3.pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); 9322 9323 /* ssl3.ca_list is initialized to NULL, and never changed. */ 9324 ca_list = ss->ssl3.ca_list; 9325 if (!ca_list) { 9326 ca_list = ssl3_server_ca_list; 9327 } 9328 9329 if (ca_list != NULL) { 9330 names = ca_list->names; 9331 nnames = ca_list->nnames; 9332 } 9333 9334 for (i = 0, name = names; i < nnames; i++, name++) { 9335 calen += 2 + name->len; 9336 } 9337 9338 certTypes = certificate_types; 9339 certTypesLength = sizeof certificate_types; 9340 sigAlgs = supported_signature_algorithms; 9341 sigAlgsLength = sizeof supported_signature_algorithms; 9342 9343 length = 1 + certTypesLength + 2 + calen; 9344 if (isTLS12) { 9345 length += 2 + sigAlgsLength; 9346 } 9347 9348 rv = ssl3_AppendHandshakeHeader(ss, certificate_request, length); 9349 if (rv != SECSuccess) { 9350 return rv; /* err set by AppendHandshake. */ 9351 } 9352 rv = ssl3_AppendHandshakeVariable(ss, certTypes, certTypesLength, 1); 9353 if (rv != SECSuccess) { 9354 return rv; /* err set by AppendHandshake. */ 9355 } 9356 if (isTLS12) { 9357 rv = ssl3_AppendHandshakeVariable(ss, sigAlgs, sigAlgsLength, 2); 9358 if (rv != SECSuccess) { 9359 return rv; /* err set by AppendHandshake. */ 9360 } 9361 } 9362 rv = ssl3_AppendHandshakeNumber(ss, calen, 2); 9363 if (rv != SECSuccess) { 9364 return rv; /* err set by AppendHandshake. */ 9365 } 9366 for (i = 0, name = names; i < nnames; i++, name++) { 9367 rv = ssl3_AppendHandshakeVariable(ss, name->data, name->len, 2); 9368 if (rv != SECSuccess) { 9369 return rv; /* err set by AppendHandshake. */ 9370 } 9371 } 9372 9373 return SECSuccess; 9374 } 9375 9376 static SECStatus 9377 ssl3_SendServerHelloDone(sslSocket *ss) 9378 { 9379 SECStatus rv; 9380 9381 SSL_TRC(3, ("%d: SSL3[%d]: send server_hello_done handshake", 9382 SSL_GETPID(), ss->fd)); 9383 9384 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); 9385 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 9386 9387 rv = ssl3_AppendHandshakeHeader(ss, server_hello_done, 0); 9388 if (rv != SECSuccess) { 9389 return rv; /* err set by AppendHandshake. */ 9390 } 9391 rv = ssl3_FlushHandshake(ss, 0); 9392 if (rv != SECSuccess) { 9393 return rv; /* error code set by ssl3_FlushHandshake */ 9394 } 9395 return SECSuccess; 9396 } 9397 9398 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete 9399 * ssl3 Certificate Verify message 9400 * Caller must hold Handshake and RecvBuf locks. 9401 */ 9402 static SECStatus 9403 ssl3_HandleCertificateVerify(sslSocket *ss, SSL3Opaque *b, PRUint32 length, 9404 SSL3Hashes *hashes) 9405 { 9406 SECItem signed_hash = {siBuffer, NULL, 0}; 9407 SECStatus rv; 9408 int errCode = SSL_ERROR_RX_MALFORMED_CERT_VERIFY; 9409 SSL3AlertDescription desc = handshake_failure; 9410 PRBool isTLS, isTLS12; 9411 SSL3SignatureAndHashAlgorithm sigAndHash; 9412 9413 SSL_TRC(3, ("%d: SSL3[%d]: handle certificate_verify handshake", 9414 SSL_GETPID(), ss->fd)); 9415 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 9416 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 9417 9418 isTLS = (PRBool)(ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0); 9419 isTLS12 = (PRBool)(ss->ssl3.prSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); 9420 9421 if (ss->ssl3.hs.ws != wait_cert_verify || ss->sec.peerCert == NULL) { 9422 desc = unexpected_message; 9423 errCode = SSL_ERROR_RX_UNEXPECTED_CERT_VERIFY; 9424 goto alert_loser; 9425 } 9426 9427 if (isTLS12) { 9428 rv = ssl3_ConsumeSignatureAndHashAlgorithm(ss, &b, &length, 9429 &sigAndHash); 9430 if (rv != SECSuccess) { 9431 goto loser; /* malformed or unsupported. */ 9432 } 9433 rv = ssl3_CheckSignatureAndHashAlgorithmConsistency( 9434 &sigAndHash, ss->sec.peerCert); 9435 if (rv != SECSuccess) { 9436 errCode = PORT_GetError(); 9437 desc = decrypt_error; 9438 goto alert_loser; 9439 } 9440 9441 /* We only support CertificateVerify messages that use the handshake 9442 * hash. */ 9443 if (sigAndHash.hashAlg != hashes->hashAlg) { 9444 errCode = SSL_ERROR_UNSUPPORTED_HASH_ALGORITHM; 9445 desc = decrypt_error; 9446 goto alert_loser; 9447 } 9448 } 9449 9450 rv = ssl3_ConsumeHandshakeVariable(ss, &signed_hash, 2, &b, &length); 9451 if (rv != SECSuccess) { 9452 goto loser; /* malformed. */ 9453 } 9454 9455 /* XXX verify that the key & kea match */ 9456 rv = ssl3_VerifySignedHashes(hashes, ss->sec.peerCert, &signed_hash, 9457 isTLS, ss->pkcs11PinArg); 9458 if (rv != SECSuccess) { 9459 errCode = PORT_GetError(); 9460 desc = isTLS ? decrypt_error : handshake_failure; 9461 goto alert_loser; 9462 } 9463 9464 signed_hash.data = NULL; 9465 9466 if (length != 0) { 9467 desc = isTLS ? decode_error : illegal_parameter; 9468 goto alert_loser; /* malformed */ 9469 } 9470 ss->ssl3.hs.ws = wait_change_cipher; 9471 return SECSuccess; 9472 9473 alert_loser: 9474 SSL3_SendAlert(ss, alert_fatal, desc); 9475 loser: 9476 PORT_SetError(errCode); 9477 return SECFailure; 9478 } 9479 9480 9481 /* find a slot that is able to generate a PMS and wrap it with RSA. 9482 * Then generate and return the PMS. 9483 * If the serverKeySlot parameter is non-null, this function will use 9484 * that slot to do the job, otherwise it will find a slot. 9485 * 9486 * Called from ssl3_DeriveConnectionKeysPKCS11() (above) 9487 * sendRSAClientKeyExchange() (above) 9488 * ssl3_HandleRSAClientKeyExchange() (below) 9489 * Caller must hold the SpecWriteLock, the SSL3HandshakeLock 9490 */ 9491 static PK11SymKey * 9492 ssl3_GenerateRSAPMS(sslSocket *ss, ssl3CipherSpec *spec, 9493 PK11SlotInfo * serverKeySlot) 9494 { 9495 PK11SymKey * pms = NULL; 9496 PK11SlotInfo * slot = serverKeySlot; 9497 void * pwArg = ss->pkcs11PinArg; 9498 SECItem param; 9499 CK_VERSION version; 9500 CK_MECHANISM_TYPE mechanism_array[3]; 9501 9502 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 9503 9504 if (slot == NULL) { 9505 SSLCipherAlgorithm calg; 9506 /* The specReadLock would suffice here, but we cannot assert on 9507 ** read locks. Also, all the callers who call with a non-null 9508 ** slot already hold the SpecWriteLock. 9509 */ 9510 PORT_Assert( ss->opt.noLocks || ssl_HaveSpecWriteLock(ss)); 9511 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); 9512 9513 calg = spec->cipher_def->calg; 9514 PORT_Assert(alg2Mech[calg].calg == calg); 9515 9516 /* First get an appropriate slot. */ 9517 mechanism_array[0] = CKM_SSL3_PRE_MASTER_KEY_GEN; 9518 mechanism_array[1] = CKM_RSA_PKCS; 9519 mechanism_array[2] = alg2Mech[calg].cmech; 9520 9521 slot = PK11_GetBestSlotMultiple(mechanism_array, 3, pwArg); 9522 if (slot == NULL) { 9523 /* can't find a slot with all three, find a slot with the minimum */ 9524 slot = PK11_GetBestSlotMultiple(mechanism_array, 2, pwArg); 9525 if (slot == NULL) { 9526 PORT_SetError(SSL_ERROR_TOKEN_SLOT_NOT_FOUND); 9527 return pms; /* which is NULL */ 9528 } 9529 } 9530 } 9531 9532 /* Generate the pre-master secret ... */ 9533 if (IS_DTLS(ss)) { 9534 SSL3ProtocolVersion temp; 9535 9536 temp = dtls_TLSVersionToDTLSVersion(ss->clientHelloVersion); 9537 version.major = MSB(temp); 9538 version.minor = LSB(temp); 9539 } else { 9540 version.major = MSB(ss->clientHelloVersion); 9541 version.minor = LSB(ss->clientHelloVersion); 9542 } 9543 9544 param.data = (unsigned char *)&version; 9545 param.len = sizeof version; 9546 9547 pms = PK11_KeyGen(slot, CKM_SSL3_PRE_MASTER_KEY_GEN, ¶m, 0, pwArg); 9548 if (!serverKeySlot) 9549 PK11_FreeSlot(slot); 9550 if (pms == NULL) { 9551 ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); 9552 } 9553 return pms; 9554 } 9555 9556 /* Note: The Bleichenbacher attack on PKCS#1 necessitates that we NEVER 9557 * return any indication of failure of the Client Key Exchange message, 9558 * where that failure is caused by the content of the client's message. 9559 * This function must not return SECFailure for any reason that is directly 9560 * or indirectly caused by the content of the client's encrypted PMS. 9561 * We must not send an alert and also not drop the connection. 9562 * Instead, we generate a random PMS. This will cause a failure 9563 * in the processing the finished message, which is exactly where 9564 * the failure must occur. 9565 * 9566 * Called from ssl3_HandleClientKeyExchange 9567 */ 9568 static SECStatus 9569 ssl3_HandleRSAClientKeyExchange(sslSocket *ss, 9570 SSL3Opaque *b, 9571 PRUint32 length, 9572 SECKEYPrivateKey *serverKey) 9573 { 9574 PK11SymKey * pms; 9575 #ifndef NO_PKCS11_BYPASS 9576 unsigned char * cr = (unsigned char *)&ss->ssl3.hs.client_random; 9577 unsigned char * sr = (unsigned char *)&ss->ssl3.hs.server_random; 9578 ssl3CipherSpec * pwSpec = ss->ssl3.pwSpec; 9579 unsigned int outLen = 0; 9580 #endif 9581 PRBool isTLS = PR_FALSE; 9582 SECStatus rv; 9583 SECItem enc_pms; 9584 unsigned char rsaPmsBuf[SSL3_RSA_PMS_LENGTH]; 9585 SECItem pmsItem = {siBuffer, NULL, 0}; 9586 9587 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 9588 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 9589 PORT_Assert( ss->ssl3.prSpec == ss->ssl3.pwSpec ); 9590 9591 enc_pms.data = b; 9592 enc_pms.len = length; 9593 pmsItem.data = rsaPmsBuf; 9594 pmsItem.len = sizeof rsaPmsBuf; 9595 9596 if (ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0) { /* isTLS */ 9597 PRInt32 kLen; 9598 kLen = ssl3_ConsumeHandshakeNumber(ss, 2, &enc_pms.data, &enc_pms.len); 9599 if (kLen < 0) { 9600 PORT_SetError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); 9601 return SECFailure; 9602 } 9603 if ((unsigned)kLen < enc_pms.len) { 9604 enc_pms.len = kLen; 9605 } 9606 isTLS = PR_TRUE; 9607 } else { 9608 isTLS = (PRBool)(ss->ssl3.hs.kea_def->tls_keygen != 0); 9609 } 9610 9611 #ifndef NO_PKCS11_BYPASS 9612 if (ss->opt.bypassPKCS11) { 9613 /* TRIPLE BYPASS, get PMS directly from RSA decryption. 9614 * Use PK11_PrivDecryptPKCS1 to decrypt the PMS to a buffer, 9615 * then, check for version rollback attack, then 9616 * do the equivalent of ssl3_DeriveMasterSecret, placing the MS in 9617 * pwSpec->msItem. Finally call ssl3_InitPendingCipherSpec with 9618 * ss and NULL, so that it will use the MS we've already derived here. 9619 */ 9620 9621 rv = PK11_PrivDecryptPKCS1(serverKey, rsaPmsBuf, &outLen, 9622 sizeof rsaPmsBuf, enc_pms.data, enc_pms.len); 9623 if (rv != SECSuccess) { 9624 /* triple bypass failed. Let's try for a double bypass. */ 9625 goto double_bypass; 9626 } else if (ss->opt.detectRollBack) { 9627 SSL3ProtocolVersion client_version = 9628 (rsaPmsBuf[0] << 8) | rsaPmsBuf[1]; 9629 9630 if (IS_DTLS(ss)) { 9631 client_version = dtls_DTLSVersionToTLSVersion(client_version); 9632 } 9633 9634 if (client_version != ss->clientHelloVersion) { 9635 /* Version roll-back detected. ensure failure. */ 9636 rv = PK11_GenerateRandom(rsaPmsBuf, sizeof rsaPmsBuf); 9637 } 9638 } 9639 /* have PMS, build MS without PKCS11 */ 9640 rv = ssl3_MasterKeyDeriveBypass(pwSpec, cr, sr, &pmsItem, isTLS, 9641 PR_TRUE); 9642 if (rv != SECSuccess) { 9643 pwSpec->msItem.data = pwSpec->raw_master_secret; 9644 pwSpec->msItem.len = SSL3_MASTER_SECRET_LENGTH; 9645 PK11_GenerateRandom(pwSpec->msItem.data, pwSpec->msItem.len); 9646 } 9647 rv = ssl3_InitPendingCipherSpec(ss, NULL); 9648 } else 9649 #endif 9650 { 9651 #ifndef NO_PKCS11_BYPASS 9652 double_bypass: 9653 #endif 9654 /* 9655 * unwrap pms out of the incoming buffer 9656 * Note: CKM_SSL3_MASTER_KEY_DERIVE is NOT the mechanism used to do 9657 * the unwrap. Rather, it is the mechanism with which the 9658 * unwrapped pms will be used. 9659 */ 9660 pms = PK11_PubUnwrapSymKey(serverKey, &enc_pms, 9661 CKM_SSL3_MASTER_KEY_DERIVE, CKA_DERIVE, 0); 9662 if (pms != NULL) { 9663 PRINT_BUF(60, (ss, "decrypted premaster secret:", 9664 PK11_GetKeyData(pms)->data, 9665 PK11_GetKeyData(pms)->len)); 9666 } else { 9667 /* unwrap failed. Generate a bogus PMS and carry on. */ 9668 PK11SlotInfo * slot = PK11_GetSlotFromPrivateKey(serverKey); 9669 9670 ssl_GetSpecWriteLock(ss); 9671 pms = ssl3_GenerateRSAPMS(ss, ss->ssl3.prSpec, slot); 9672 ssl_ReleaseSpecWriteLock(ss); 9673 PK11_FreeSlot(slot); 9674 } 9675 9676 if (pms == NULL) { 9677 /* last gasp. */ 9678 ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); 9679 return SECFailure; 9680 } 9681 9682 /* This step will derive the MS from the PMS, among other things. */ 9683 rv = ssl3_InitPendingCipherSpec(ss, pms); 9684 PK11_FreeSymKey(pms); 9685 } 9686 9687 if (rv != SECSuccess) { 9688 SEND_ALERT 9689 return SECFailure; /* error code set by ssl3_InitPendingCipherSpec */ 9690 } 9691 return SECSuccess; 9692 } 9693 9694 9695 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete 9696 * ssl3 ClientKeyExchange message from the remote client 9697 * Caller must hold Handshake and RecvBuf locks. 9698 */ 9699 static SECStatus 9700 ssl3_HandleClientKeyExchange(sslSocket *ss, SSL3Opaque *b, PRUint32 length) 9701 { 9702 SECKEYPrivateKey *serverKey = NULL; 9703 SECStatus rv; 9704 const ssl3KEADef *kea_def; 9705 ssl3KeyPair *serverKeyPair = NULL; 9706 #ifdef NSS_ENABLE_ECC 9707 SECKEYPublicKey *serverPubKey = NULL; 9708 #endif /* NSS_ENABLE_ECC */ 9709 9710 SSL_TRC(3, ("%d: SSL3[%d]: handle client_key_exchange handshake", 9711 SSL_GETPID(), ss->fd)); 9712 9713 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 9714 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 9715 9716 if (ss->ssl3.hs.ws != wait_client_key) { 9717 SSL3_SendAlert(ss, alert_fatal, unexpected_message); 9718 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CLIENT_KEY_EXCH); 9719 return SECFailure; 9720 } 9721 9722 kea_def = ss->ssl3.hs.kea_def; 9723 9724 if (ss->ssl3.hs.usedStepDownKey) { 9725 PORT_Assert(kea_def->is_limited /* XXX OR cert is signing only */ 9726 && kea_def->exchKeyType == kt_rsa 9727 && ss->stepDownKeyPair != NULL); 9728 if (!kea_def->is_limited || 9729 kea_def->exchKeyType != kt_rsa || 9730 ss->stepDownKeyPair == NULL) { 9731 /* shouldn't happen, don't use step down if it does */ 9732 goto skip; 9733 } 9734 serverKeyPair = ss->stepDownKeyPair; 9735 ss->sec.keaKeyBits = EXPORT_RSA_KEY_LENGTH * BPB; 9736 } else 9737 skip: 9738 #ifdef NSS_ENABLE_ECC 9739 /* XXX Using SSLKEAType to index server certifiates 9740 * does not work for (EC)DHE ciphers. Until we have 9741 * an indexing mechanism general enough for all key 9742 * exchange algorithms, we'll need to deal with each 9743 * one seprately. 9744 */ 9745 if ((kea_def->kea == kea_ecdhe_rsa) || 9746 (kea_def->kea == kea_ecdhe_ecdsa)) { 9747 if (ss->ephemeralECDHKeyPair != NULL) { 9748 serverKeyPair = ss->ephemeralECDHKeyPair; 9749 if (serverKeyPair->pubKey) { 9750 ss->sec.keaKeyBits = 9751 SECKEY_PublicKeyStrengthInBits(serverKeyPair->pubKey); 9752 } 9753 } 9754 } else 9755 #endif 9756 { 9757 sslServerCerts * sc = ss->serverCerts + kea_def->exchKeyType; 9758 serverKeyPair = sc->serverKeyPair; 9759 ss->sec.keaKeyBits = sc->serverKeyBits; 9760 } 9761 9762 if (serverKeyPair) { 9763 serverKey = serverKeyPair->privKey; 9764 } 9765 9766 if (serverKey == NULL) { 9767 SEND_ALERT 9768 PORT_SetError(SSL_ERROR_NO_SERVER_KEY_FOR_ALG); 9769 return SECFailure; 9770 } 9771 9772 ss->sec.keaType = kea_def->exchKeyType; 9773 9774 switch (kea_def->exchKeyType) { 9775 case kt_rsa: 9776 rv = ssl3_HandleRSAClientKeyExchange(ss, b, length, serverKey); 9777 if (rv != SECSuccess) { 9778 SEND_ALERT 9779 return SECFailure; /* error code set */ 9780 } 9781 break; 9782 9783 9784 #ifdef NSS_ENABLE_ECC 9785 case kt_ecdh: 9786 /* XXX We really ought to be able to store multiple 9787 * EC certs (a requirement if we wish to support both 9788 * ECDH-RSA and ECDH-ECDSA key exchanges concurrently). 9789 * When we make that change, we'll need an index other 9790 * than kt_ecdh to pick the right EC certificate. 9791 */ 9792 if (serverKeyPair) { 9793 serverPubKey = serverKeyPair->pubKey; 9794 } 9795 if (serverPubKey == NULL) { 9796 /* XXX Is this the right error code? */ 9797 PORT_SetError(SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE); 9798 return SECFailure; 9799 } 9800 rv = ssl3_HandleECDHClientKeyExchange(ss, b, length, 9801 serverPubKey, serverKey); 9802 if (rv != SECSuccess) { 9803 return SECFailure; /* error code set */ 9804 } 9805 break; 9806 #endif /* NSS_ENABLE_ECC */ 9807 9808 default: 9809 (void) ssl3_HandshakeFailure(ss); 9810 PORT_SetError(SEC_ERROR_UNSUPPORTED_KEYALG); 9811 return SECFailure; 9812 } 9813 ss->ssl3.hs.ws = ss->sec.peerCert ? wait_cert_verify : wait_change_cipher; 9814 return SECSuccess; 9815 9816 } 9817 9818 /* This is TLS's equivalent of sending a no_certificate alert. */ 9819 static SECStatus 9820 ssl3_SendEmptyCertificate(sslSocket *ss) 9821 { 9822 SECStatus rv; 9823 9824 rv = ssl3_AppendHandshakeHeader(ss, certificate, 3); 9825 if (rv == SECSuccess) { 9826 rv = ssl3_AppendHandshakeNumber(ss, 0, 3); 9827 } 9828 return rv; /* error, if any, set by functions called above. */ 9829 } 9830 9831 SECStatus 9832 ssl3_HandleNewSessionTicket(sslSocket *ss, SSL3Opaque *b, PRUint32 length) 9833 { 9834 SECStatus rv; 9835 SECItem ticketData; 9836 9837 SSL_TRC(3, ("%d: SSL3[%d]: handle session_ticket handshake", 9838 SSL_GETPID(), ss->fd)); 9839 9840 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 9841 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 9842 9843 PORT_Assert(!ss->ssl3.hs.newSessionTicket.ticket.data); 9844 PORT_Assert(!ss->ssl3.hs.receivedNewSessionTicket); 9845 9846 if (ss->ssl3.hs.ws != wait_new_session_ticket) { 9847 SSL3_SendAlert(ss, alert_fatal, unexpected_message); 9848 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_NEW_SESSION_TICKET); 9849 return SECFailure; 9850 } 9851 9852 /* RFC5077 Section 3.3: "The client MUST NOT treat the ticket as valid 9853 * until it has verified the server's Finished message." See the comment in 9854 * ssl3_FinishHandshake for more details. 9855 */ 9856 ss->ssl3.hs.newSessionTicket.received_timestamp = ssl_Time(); 9857 if (length < 4) { 9858 (void)SSL3_SendAlert(ss, alert_fatal, decode_error); 9859 PORT_SetError(SSL_ERROR_RX_MALFORMED_NEW_SESSION_TICKET); 9860 return SECFailure; 9861 } 9862 ss->ssl3.hs.newSessionTicket.ticket_lifetime_hint = 9863 (PRUint32)ssl3_ConsumeHandshakeNumber(ss, 4, &b, &length); 9864 9865 rv = ssl3_ConsumeHandshakeVariable(ss, &ticketData, 2, &b, &length); 9866 if (length != 0 || rv != SECSuccess) { 9867 (void)SSL3_SendAlert(ss, alert_fatal, decode_error); 9868 PORT_SetError(SSL_ERROR_RX_MALFORMED_NEW_SESSION_TICKET); 9869 return SECFailure; /* malformed */ 9870 } 9871 rv = SECITEM_CopyItem(NULL, &ss->ssl3.hs.newSessionTicket.ticket, 9872 &ticketData); 9873 if (rv != SECSuccess) { 9874 return rv; 9875 } 9876 ss->ssl3.hs.receivedNewSessionTicket = PR_TRUE; 9877 9878 ss->ssl3.hs.ws = wait_change_cipher; 9879 return SECSuccess; 9880 } 9881 9882 #ifdef NISCC_TEST 9883 static PRInt32 connNum = 0; 9884 9885 static SECStatus 9886 get_fake_cert(SECItem *pCertItem, int *pIndex) 9887 { 9888 PRFileDesc *cf; 9889 char * testdir; 9890 char * startat; 9891 char * stopat; 9892 const char *extension; 9893 int fileNum; 9894 PRInt32 numBytes = 0; 9895 PRStatus prStatus; 9896 PRFileInfo info; 9897 char cfn[100]; 9898 9899 pCertItem->data = 0; 9900 if ((testdir = PR_GetEnv("NISCC_TEST")) == NULL) { 9901 return SECSuccess; 9902 } 9903 *pIndex = (NULL != strstr(testdir, "root")); 9904 extension = (strstr(testdir, "simple") ? "" : ".der"); 9905 fileNum = PR_ATOMIC_INCREMENT(&connNum) - 1; 9906 if ((startat = PR_GetEnv("START_AT")) != NULL) { 9907 fileNum += atoi(startat); 9908 } 9909 if ((stopat = PR_GetEnv("STOP_AT")) != NULL && 9910 fileNum >= atoi(stopat)) { 9911 *pIndex = -1; 9912 return SECSuccess; 9913 } 9914 sprintf(cfn, "%s/%08d%s", testdir, fileNum, extension); 9915 cf = PR_Open(cfn, PR_RDONLY, 0); 9916 if (!cf) { 9917 goto loser; 9918 } 9919 prStatus = PR_GetOpenFileInfo(cf, &info); 9920 if (prStatus != PR_SUCCESS) { 9921 PR_Close(cf); 9922 goto loser; 9923 } 9924 pCertItem = SECITEM_AllocItem(NULL, pCertItem, info.size); 9925 if (pCertItem) { 9926 numBytes = PR_Read(cf, pCertItem->data, info.size); 9927 } 9928 PR_Close(cf); 9929 if (numBytes != info.size) { 9930 SECITEM_FreeItem(pCertItem, PR_FALSE); 9931 PORT_SetError(SEC_ERROR_IO); 9932 goto loser; 9933 } 9934 fprintf(stderr, "using %s\n", cfn); 9935 return SECSuccess; 9936 9937 loser: 9938 fprintf(stderr, "failed to use %s\n", cfn); 9939 *pIndex = -1; 9940 return SECFailure; 9941 } 9942 #endif 9943 9944 /* 9945 * Used by both client and server. 9946 * Called from HandleServerHelloDone and from SendServerHelloSequence. 9947 */ 9948 static SECStatus 9949 ssl3_SendCertificate(sslSocket *ss) 9950 { 9951 SECStatus rv; 9952 CERTCertificateList *certChain; 9953 int len = 0; 9954 int i; 9955 SSL3KEAType certIndex; 9956 #ifdef NISCC_TEST 9957 SECItem fakeCert; 9958 int ndex = -1; 9959 #endif 9960 9961 SSL_TRC(3, ("%d: SSL3[%d]: send certificate handshake", 9962 SSL_GETPID(), ss->fd)); 9963 9964 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); 9965 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 9966 9967 if (ss->sec.localCert) 9968 CERT_DestroyCertificate(ss->sec.localCert); 9969 if (ss->sec.isServer) { 9970 sslServerCerts * sc = NULL; 9971 9972 /* XXX SSLKEAType isn't really a good choice for 9973 * indexing certificates (it breaks when we deal 9974 * with (EC)DHE-* cipher suites. This hack ensures 9975 * the RSA cert is picked for (EC)DHE-RSA. 9976 * Revisit this when we add server side support 9977 * for ECDHE-ECDSA or client-side authentication 9978 * using EC certificates. 9979 */ 9980 if ((ss->ssl3.hs.kea_def->kea == kea_ecdhe_rsa) || 9981 (ss->ssl3.hs.kea_def->kea == kea_dhe_rsa)) { 9982 certIndex = kt_rsa; 9983 } else { 9984 certIndex = ss->ssl3.hs.kea_def->exchKeyType; 9985 } 9986 sc = ss->serverCerts + certIndex; 9987 certChain = sc->serverCertChain; 9988 ss->sec.authKeyBits = sc->serverKeyBits; 9989 ss->sec.authAlgorithm = ss->ssl3.hs.kea_def->signKeyType; 9990 ss->sec.localCert = CERT_DupCertificate(sc->serverCert); 9991 } else { 9992 certChain = ss->ssl3.clientCertChain; 9993 ss->sec.localCert = CERT_DupCertificate(ss->ssl3.clientCertificate); 9994 } 9995 9996 #ifdef NISCC_TEST 9997 rv = get_fake_cert(&fakeCert, &ndex); 9998 #endif 9999 10000 if (certChain) { 10001 for (i = 0; i < certChain->len; i++) { 10002 #ifdef NISCC_TEST 10003 if (fakeCert.len > 0 && i == ndex) { 10004 len += fakeCert.len + 3; 10005 } else { 10006 len += certChain->certs[i].len + 3; 10007 } 10008 #else 10009 len += certChain->certs[i].len + 3; 10010 #endif 10011 } 10012 } 10013 10014 rv = ssl3_AppendHandshakeHeader(ss, certificate, len + 3); 10015 if (rv != SECSuccess) { 10016 return rv; /* err set by AppendHandshake. */ 10017 } 10018 rv = ssl3_AppendHandshakeNumber(ss, len, 3); 10019 if (rv != SECSuccess) { 10020 return rv; /* err set by AppendHandshake. */ 10021 } 10022 if (certChain) { 10023 for (i = 0; i < certChain->len; i++) { 10024 #ifdef NISCC_TEST 10025 if (fakeCert.len > 0 && i == ndex) { 10026 rv = ssl3_AppendHandshakeVariable(ss, fakeCert.data, 10027 fakeCert.len, 3); 10028 SECITEM_FreeItem(&fakeCert, PR_FALSE); 10029 } else { 10030 rv = ssl3_AppendHandshakeVariable(ss, certChain->certs[i].data, 10031 certChain->certs[i].len, 3); 10032 } 10033 #else 10034 rv = ssl3_AppendHandshakeVariable(ss, certChain->certs[i].data, 10035 certChain->certs[i].len, 3); 10036 #endif 10037 if (rv != SECSuccess) { 10038 return rv; /* err set by AppendHandshake. */ 10039 } 10040 } 10041 } 10042 10043 return SECSuccess; 10044 } 10045 10046 /* 10047 * Used by server only. 10048 * single-stapling, send only a single cert status 10049 */ 10050 static SECStatus 10051 ssl3_SendCertificateStatus(sslSocket *ss) 10052 { 10053 SECStatus rv; 10054 int len = 0; 10055 SECItemArray *statusToSend = NULL; 10056 SSL3KEAType certIndex; 10057 10058 SSL_TRC(3, ("%d: SSL3[%d]: send certificate status handshake", 10059 SSL_GETPID(), ss->fd)); 10060 10061 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); 10062 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 10063 PORT_Assert( ss->sec.isServer); 10064 10065 if (!ssl3_ExtensionNegotiated(ss, ssl_cert_status_xtn)) 10066 return SECSuccess; 10067 10068 /* Use certStatus based on the cert being used. */ 10069 if ((ss->ssl3.hs.kea_def->kea == kea_ecdhe_rsa) || 10070 (ss->ssl3.hs.kea_def->kea == kea_dhe_rsa)) { 10071 certIndex = kt_rsa; 10072 } else { 10073 certIndex = ss->ssl3.hs.kea_def->exchKeyType; 10074 } 10075 if (ss->certStatusArray[certIndex] && ss->certStatusArray[certIndex]->len) { 10076 statusToSend = ss->certStatusArray[certIndex]; 10077 } 10078 if (!statusToSend) 10079 return SECSuccess; 10080 10081 /* Use the array's first item only (single stapling) */ 10082 len = 1 + statusToSend->items[0].len + 3; 10083 10084 rv = ssl3_AppendHandshakeHeader(ss, certificate_status, len); 10085 if (rv != SECSuccess) { 10086 return rv; /* err set by AppendHandshake. */ 10087 } 10088 rv = ssl3_AppendHandshakeNumber(ss, 1 /*ocsp*/, 1); 10089 if (rv != SECSuccess) 10090 return rv; /* err set by AppendHandshake. */ 10091 10092 rv = ssl3_AppendHandshakeVariable(ss, 10093 statusToSend->items[0].data, 10094 statusToSend->items[0].len, 10095 3); 10096 if (rv != SECSuccess) 10097 return rv; /* err set by AppendHandshake. */ 10098 10099 return SECSuccess; 10100 } 10101 10102 /* This is used to delete the CA certificates in the peer certificate chain 10103 * from the cert database after they've been validated. 10104 */ 10105 static void 10106 ssl3_CleanupPeerCerts(sslSocket *ss) 10107 { 10108 PLArenaPool * arena = ss->ssl3.peerCertArena; 10109 ssl3CertNode *certs = (ssl3CertNode *)ss->ssl3.peerCertChain; 10110 10111 for (; certs; certs = certs->next) { 10112 CERT_DestroyCertificate(certs->cert); 10113 } 10114 if (arena) PORT_FreeArena(arena, PR_FALSE); 10115 ss->ssl3.peerCertArena = NULL; 10116 ss->ssl3.peerCertChain = NULL; 10117 } 10118 10119 static void 10120 ssl3_CopyPeerCertsFromSID(sslSocket *ss, sslSessionID *sid) 10121 { 10122 PLArenaPool *arena; 10123 ssl3CertNode *lastCert = NULL; 10124 ssl3CertNode *certs = NULL; 10125 int i; 10126 10127 if (!sid->peerCertChain[0]) 10128 return; 10129 PORT_Assert(!ss->ssl3.peerCertArena); 10130 PORT_Assert(!ss->ssl3.peerCertChain); 10131 ss->ssl3.peerCertArena = arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); 10132 for (i = 0; i < MAX_PEER_CERT_CHAIN_SIZE && sid->peerCertChain[i]; i++) { 10133 ssl3CertNode *c = PORT_ArenaNew(arena, ssl3CertNode); 10134 c->cert = CERT_DupCertificate(sid->peerCertChain[i]); 10135 c->next = NULL; 10136 if (lastCert) { 10137 lastCert->next = c; 10138 } else { 10139 certs = c; 10140 } 10141 lastCert = c; 10142 } 10143 ss->ssl3.peerCertChain = certs; 10144 } 10145 10146 static void 10147 ssl3_CopyPeerCertsToSID(ssl3CertNode *certs, sslSessionID *sid) 10148 { 10149 int i = 0; 10150 ssl3CertNode *c = certs; 10151 for (; i < MAX_PEER_CERT_CHAIN_SIZE && c; i++, c = c->next) { 10152 PORT_Assert(!sid->peerCertChain[i]); 10153 sid->peerCertChain[i] = CERT_DupCertificate(c->cert); 10154 } 10155 } 10156 10157 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete 10158 * ssl3 CertificateStatus message. 10159 * Caller must hold Handshake and RecvBuf locks. 10160 * This is always called before ssl3_HandleCertificate, even if the Certificate 10161 * message is sent first. 10162 */ 10163 static SECStatus 10164 ssl3_HandleCertificateStatus(sslSocket *ss, SSL3Opaque *b, PRUint32 length) 10165 { 10166 PRInt32 status, len; 10167 10168 if (ss->ssl3.hs.ws != wait_certificate_status) { 10169 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); 10170 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CERT_STATUS); 10171 return SECFailure; 10172 } 10173 10174 PORT_Assert(!ss->sec.isServer); 10175 10176 /* Consume the CertificateStatusType enum */ 10177 status = ssl3_ConsumeHandshakeNumber(ss, 1, &b, &length); 10178 if (status != 1 /* ocsp */) { 10179 goto format_loser; 10180 } 10181 10182 len = ssl3_ConsumeHandshakeNumber(ss, 3, &b, &length); 10183 if (len != length) { 10184 goto format_loser; 10185 } 10186 10187 #define MAX_CERTSTATUS_LEN 0x1ffff /* 128k - 1 */ 10188 if (length > MAX_CERTSTATUS_LEN) 10189 goto format_loser; 10190 #undef MAX_CERTSTATUS_LEN 10191 10192 /* Array size 1, because we currently implement single-stapling only */ 10193 SECITEM_AllocArray(NULL, &ss->sec.ci.sid->peerCertStatus, 1); 10194 if (!ss->sec.ci.sid->peerCertStatus.items) 10195 return SECFailure; 10196 10197 ss->sec.ci.sid->peerCertStatus.items[0].data = PORT_Alloc(length); 10198 10199 if (!ss->sec.ci.sid->peerCertStatus.items[0].data) { 10200 SECITEM_FreeArray(&ss->sec.ci.sid->peerCertStatus, PR_FALSE); 10201 return SECFailure; 10202 } 10203 10204 PORT_Memcpy(ss->sec.ci.sid->peerCertStatus.items[0].data, b, length); 10205 ss->sec.ci.sid->peerCertStatus.items[0].len = length; 10206 ss->sec.ci.sid->peerCertStatus.items[0].type = siBuffer; 10207 10208 return ssl3_AuthCertificate(ss); 10209 10210 format_loser: 10211 return ssl3_DecodeError(ss); 10212 } 10213 10214 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete 10215 * ssl3 Certificate message. 10216 * Caller must hold Handshake and RecvBuf locks. 10217 */ 10218 static SECStatus 10219 ssl3_HandleCertificate(sslSocket *ss, SSL3Opaque *b, PRUint32 length) 10220 { 10221 ssl3CertNode * c; 10222 ssl3CertNode * lastCert = NULL; 10223 PRInt32 remaining = 0; 10224 PRInt32 size; 10225 SECStatus rv; 10226 PRBool isServer = (PRBool)(!!ss->sec.isServer); 10227 PRBool isTLS; 10228 SSL3AlertDescription desc; 10229 int errCode = SSL_ERROR_RX_MALFORMED_CERTIFICATE; 10230 SECItem certItem; 10231 10232 SSL_TRC(3, ("%d: SSL3[%d]: handle certificate handshake", 10233 SSL_GETPID(), ss->fd)); 10234 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 10235 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 10236 10237 if ((ss->ssl3.hs.ws != wait_server_cert) && 10238 (ss->ssl3.hs.ws != wait_client_cert)) { 10239 desc = unexpected_message; 10240 errCode = SSL_ERROR_RX_UNEXPECTED_CERTIFICATE; 10241 goto alert_loser; 10242 } 10243 10244 if (ss->sec.peerCert != NULL) { 10245 if (ss->sec.peerKey) { 10246 SECKEY_DestroyPublicKey(ss->sec.peerKey); 10247 ss->sec.peerKey = NULL; 10248 } 10249 CERT_DestroyCertificate(ss->sec.peerCert); 10250 ss->sec.peerCert = NULL; 10251 } 10252 10253 ssl3_CleanupPeerCerts(ss); 10254 isTLS = (PRBool)(ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0); 10255 10256 /* It is reported that some TLS client sends a Certificate message 10257 ** with a zero-length message body. We'll treat that case like a 10258 ** normal no_certificates message to maximize interoperability. 10259 */ 10260 if (length) { 10261 remaining = ssl3_ConsumeHandshakeNumber(ss, 3, &b, &length); 10262 if (remaining < 0) 10263 goto loser; /* fatal alert already sent by ConsumeHandshake. */ 10264 if ((PRUint32)remaining > length) 10265 goto decode_loser; 10266 } 10267 10268 if (!remaining) { 10269 if (!(isTLS && isServer)) { 10270 desc = bad_certificate; 10271 goto alert_loser; 10272 } 10273 /* This is TLS's version of a no_certificate alert. */ 10274 /* I'm a server. I've requested a client cert. He hasn't got one. */ 10275 rv = ssl3_HandleNoCertificate(ss); 10276 if (rv != SECSuccess) { 10277 errCode = PORT_GetError(); 10278 goto loser; 10279 } 10280 ss->ssl3.hs.ws = wait_client_key; 10281 return SECSuccess; 10282 } 10283 10284 ss->ssl3.peerCertArena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); 10285 if (ss->ssl3.peerCertArena == NULL) { 10286 goto loser; /* don't send alerts on memory errors */ 10287 } 10288 10289 /* First get the peer cert. */ 10290 remaining -= 3; 10291 if (remaining < 0) 10292 goto decode_loser; 10293 10294 size = ssl3_ConsumeHandshakeNumber(ss, 3, &b, &length); 10295 if (size <= 0) 10296 goto loser; /* fatal alert already sent by ConsumeHandshake. */ 10297 10298 if (remaining < size) 10299 goto decode_loser; 10300 10301 certItem.data = b; 10302 certItem.len = size; 10303 b += size; 10304 length -= size; 10305 remaining -= size; 10306 10307 ss->sec.peerCert = CERT_NewTempCertificate(ss->dbHandle, &certItem, NULL, 10308 PR_FALSE, PR_TRUE); 10309 if (ss->sec.peerCert == NULL) { 10310 /* We should report an alert if the cert was bad, but not if the 10311 * problem was just some local problem, like memory error. 10312 */ 10313 goto ambiguous_err; 10314 } 10315 10316 /* Now get all of the CA certs. */ 10317 while (remaining > 0) { 10318 remaining -= 3; 10319 if (remaining < 0) 10320 goto decode_loser; 10321 10322 size = ssl3_ConsumeHandshakeNumber(ss, 3, &b, &length); 10323 if (size <= 0) 10324 goto loser; /* fatal alert already sent by ConsumeHandshake. */ 10325 10326 if (remaining < size) 10327 goto decode_loser; 10328 10329 certItem.data = b; 10330 certItem.len = size; 10331 b += size; 10332 length -= size; 10333 remaining -= size; 10334 10335 c = PORT_ArenaNew(ss->ssl3.peerCertArena, ssl3CertNode); 10336 if (c == NULL) { 10337 goto loser; /* don't send alerts on memory errors */ 10338 } 10339 10340 c->cert = CERT_NewTempCertificate(ss->dbHandle, &certItem, NULL, 10341 PR_FALSE, PR_TRUE); 10342 if (c->cert == NULL) { 10343 goto ambiguous_err; 10344 } 10345 10346 c->next = NULL; 10347 if (lastCert) { 10348 lastCert->next = c; 10349 } else { 10350 ss->ssl3.peerCertChain = c; 10351 } 10352 lastCert = c; 10353 } 10354 10355 if (remaining != 0) 10356 goto decode_loser; 10357 10358 SECKEY_UpdateCertPQG(ss->sec.peerCert); 10359 10360 if (!isServer && ssl3_ExtensionNegotiated(ss, ssl_cert_status_xtn)) { 10361 ss->ssl3.hs.ws = wait_certificate_status; 10362 rv = SECSuccess; 10363 } else { 10364 rv = ssl3_AuthCertificate(ss); /* sets ss->ssl3.hs.ws */ 10365 } 10366 10367 return rv; 10368 10369 ambiguous_err: 10370 errCode = PORT_GetError(); 10371 switch (errCode) { 10372 case PR_OUT_OF_MEMORY_ERROR: 10373 case SEC_ERROR_BAD_DATABASE: 10374 case SEC_ERROR_NO_MEMORY: 10375 if (isTLS) { 10376 desc = internal_error; 10377 goto alert_loser; 10378 } 10379 goto loser; 10380 } 10381 ssl3_SendAlertForCertError(ss, errCode); 10382 goto loser; 10383 10384 decode_loser: 10385 desc = isTLS ? decode_error : bad_certificate; 10386 10387 alert_loser: 10388 (void)SSL3_SendAlert(ss, alert_fatal, desc); 10389 10390 loser: 10391 (void)ssl_MapLowLevelError(errCode); 10392 return SECFailure; 10393 } 10394 10395 static SECStatus 10396 ssl3_AuthCertificate(sslSocket *ss) 10397 { 10398 SECStatus rv; 10399 PRBool isServer = (PRBool)(!!ss->sec.isServer); 10400 int errCode; 10401 10402 ss->ssl3.hs.authCertificatePending = PR_FALSE; 10403 10404 /* 10405 * Ask caller-supplied callback function to validate cert chain. 10406 */ 10407 rv = (SECStatus)(*ss->authCertificate)(ss->authCertificateArg, ss->fd, 10408 PR_TRUE, isServer); 10409 if (rv) { 10410 errCode = PORT_GetError(); 10411 if (rv != SECWouldBlock) { 10412 if (ss->handleBadCert) { 10413 rv = (*ss->handleBadCert)(ss->badCertArg, ss->fd); 10414 } 10415 } 10416 10417 if (rv == SECWouldBlock) { 10418 if (ss->sec.isServer) { 10419 errCode = SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_SERVERS; 10420 rv = SECFailure; 10421 goto loser; 10422 } 10423 10424 ss->ssl3.hs.authCertificatePending = PR_TRUE; 10425 rv = SECSuccess; 10426 } 10427 10428 if (rv != SECSuccess) { 10429 ssl3_SendAlertForCertError(ss, errCode); 10430 goto loser; 10431 } 10432 } 10433 10434 ss->sec.ci.sid->peerCert = CERT_DupCertificate(ss->sec.peerCert); 10435 ssl3_CopyPeerCertsToSID(ss->ssl3.peerCertChain, ss->sec.ci.sid); 10436 10437 if (!ss->sec.isServer) { 10438 CERTCertificate *cert = ss->sec.peerCert; 10439 10440 /* set the server authentication and key exchange types and sizes 10441 ** from the value in the cert. If the key exchange key is different, 10442 ** it will get fixed when we handle the server key exchange message. 10443 */ 10444 SECKEYPublicKey * pubKey = CERT_ExtractPublicKey(cert); 10445 ss->sec.authAlgorithm = ss->ssl3.hs.kea_def->signKeyType; 10446 ss->sec.keaType = ss->ssl3.hs.kea_def->exchKeyType; 10447 if (pubKey) { 10448 ss->sec.keaKeyBits = ss->sec.authKeyBits = 10449 SECKEY_PublicKeyStrengthInBits(pubKey); 10450 #ifdef NSS_ENABLE_ECC 10451 if (ss->sec.keaType == kt_ecdh) { 10452 /* Get authKeyBits from signing key. 10453 * XXX The code below uses a quick approximation of 10454 * key size based on cert->signatureWrap.signature.data 10455 * (which contains the DER encoded signature). The field 10456 * cert->signatureWrap.signature.len contains the 10457 * length of the encoded signature in bits. 10458 */ 10459 if (ss->ssl3.hs.kea_def->kea == kea_ecdh_ecdsa) { 10460 ss->sec.authKeyBits = 10461 cert->signatureWrap.signature.data[3]*8; 10462 if (cert->signatureWrap.signature.data[4] == 0x00) 10463 ss->sec.authKeyBits -= 8; 10464 /* 10465 * XXX: if cert is not signed by ecdsa we should 10466 * destroy pubKey and goto bad_cert 10467 */ 10468 } else if (ss->ssl3.hs.kea_def->kea == kea_ecdh_rsa) { 10469 ss->sec.authKeyBits = cert->signatureWrap.signature.len; 10470 /* 10471 * XXX: if cert is not signed by rsa we should 10472 * destroy pubKey and goto bad_cert 10473 */ 10474 } 10475 } 10476 #endif /* NSS_ENABLE_ECC */ 10477 SECKEY_DestroyPublicKey(pubKey); 10478 pubKey = NULL; 10479 } 10480 10481 ss->ssl3.hs.ws = wait_cert_request; /* disallow server_key_exchange */ 10482 if (ss->ssl3.hs.kea_def->is_limited || 10483 /* XXX OR server cert is signing only. */ 10484 #ifdef NSS_ENABLE_ECC 10485 ss->ssl3.hs.kea_def->kea == kea_ecdhe_ecdsa || 10486 ss->ssl3.hs.kea_def->kea == kea_ecdhe_rsa || 10487 #endif /* NSS_ENABLE_ECC */ 10488 ss->ssl3.hs.kea_def->exchKeyType == kt_dh) { 10489 ss->ssl3.hs.ws = wait_server_key; /* allow server_key_exchange */ 10490 } 10491 } else { 10492 ss->ssl3.hs.ws = wait_client_key; 10493 } 10494 10495 PORT_Assert(rv == SECSuccess); 10496 if (rv != SECSuccess) { 10497 errCode = SEC_ERROR_LIBRARY_FAILURE; 10498 rv = SECFailure; 10499 goto loser; 10500 } 10501 10502 return rv; 10503 10504 loser: 10505 (void)ssl_MapLowLevelError(errCode); 10506 return SECFailure; 10507 } 10508 10509 static SECStatus ssl3_FinishHandshake(sslSocket *ss); 10510 10511 static SECStatus 10512 ssl3_AlwaysFail(sslSocket * ss) 10513 { 10514 PORT_SetError(PR_INVALID_STATE_ERROR); 10515 return SECFailure; 10516 } 10517 10518 /* Caller must hold 1stHandshakeLock. 10519 */ 10520 SECStatus 10521 ssl3_AuthCertificateComplete(sslSocket *ss, PRErrorCode error) 10522 { 10523 SECStatus rv; 10524 10525 PORT_Assert(ss->opt.noLocks || ssl_Have1stHandshakeLock(ss)); 10526 10527 if (ss->sec.isServer) { 10528 PORT_SetError(SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_SERVERS); 10529 return SECFailure; 10530 } 10531 10532 ssl_GetRecvBufLock(ss); 10533 ssl_GetSSL3HandshakeLock(ss); 10534 10535 if (!ss->ssl3.hs.authCertificatePending) { 10536 PORT_SetError(PR_INVALID_STATE_ERROR); 10537 rv = SECFailure; 10538 goto done; 10539 } 10540 10541 ss->ssl3.hs.authCertificatePending = PR_FALSE; 10542 10543 if (error != 0) { 10544 ss->ssl3.hs.restartTarget = ssl3_AlwaysFail; 10545 ssl3_SendAlertForCertError(ss, error); 10546 rv = SECSuccess; 10547 } else if (ss->ssl3.hs.restartTarget != NULL) { 10548 sslRestartTarget target = ss->ssl3.hs.restartTarget; 10549 ss->ssl3.hs.restartTarget = NULL; 10550 10551 if (target == ssl3_FinishHandshake) { 10552 SSL_TRC(3,("%d: SSL3[%p]: certificate authentication lost the race" 10553 " with peer's finished message", SSL_GETPID(), ss->fd)); 10554 } 10555 10556 rv = target(ss); 10557 /* Even if we blocked here, we have accomplished enough to claim 10558 * success. Any remaining work will be taken care of by subsequent 10559 * calls to SSL_ForceHandshake/PR_Send/PR_Read/etc. 10560 */ 10561 if (rv == SECWouldBlock) { 10562 rv = SECSuccess; 10563 } 10564 } else { 10565 SSL_TRC(3, ("%d: SSL3[%p]: certificate authentication won the race with" 10566 " peer's finished message", SSL_GETPID(), ss->fd)); 10567 10568 PORT_Assert(!ss->ssl3.hs.isResuming); 10569 PORT_Assert(ss->ssl3.hs.ws != idle_handshake); 10570 10571 if (ss->opt.enableFalseStart && 10572 !ss->firstHsDone && 10573 !ss->ssl3.hs.isResuming && 10574 ssl3_WaitingForStartOfServerSecondRound(ss)) { 10575 /* ssl3_SendClientSecondRound deferred the false start check because 10576 * certificate authentication was pending, so we do it now if we still 10577 * haven't received any of the server's second round yet. 10578 */ 10579 rv = ssl3_CheckFalseStart(ss); 10580 } else { 10581 rv = SECSuccess; 10582 } 10583 } 10584 10585 done: 10586 ssl_ReleaseSSL3HandshakeLock(ss); 10587 ssl_ReleaseRecvBufLock(ss); 10588 10589 return rv; 10590 } 10591 10592 static SECStatus 10593 ssl3_ComputeTLSFinished(ssl3CipherSpec *spec, 10594 PRBool isServer, 10595 const SSL3Hashes * hashes, 10596 TLSFinished * tlsFinished) 10597 { 10598 const char * label; 10599 unsigned int len; 10600 SECStatus rv; 10601 10602 label = isServer ? "server finished" : "client finished"; 10603 len = 15; 10604 10605 rv = ssl3_TLSPRFWithMasterSecret(spec, label, len, hashes->u.raw, 10606 hashes->len, tlsFinished->verify_data, 10607 sizeof tlsFinished->verify_data); 10608 10609 return rv; 10610 } 10611 10612 /* The calling function must acquire and release the appropriate 10613 * lock (e.g., ssl_GetSpecReadLock / ssl_ReleaseSpecReadLock for 10614 * ss->ssl3.crSpec). 10615 */ 10616 SECStatus 10617 ssl3_TLSPRFWithMasterSecret(ssl3CipherSpec *spec, const char *label, 10618 unsigned int labelLen, const unsigned char *val, unsigned int valLen, 10619 unsigned char *out, unsigned int outLen) 10620 { 10621 SECStatus rv = SECSuccess; 10622 10623 if (spec->master_secret && !spec->bypassCiphers) { 10624 SECItem param = {siBuffer, NULL, 0}; 10625 CK_MECHANISM_TYPE mech = CKM_TLS_PRF_GENERAL; 10626 PK11Context *prf_context; 10627 unsigned int retLen; 10628 10629 if (spec->version >= SSL_LIBRARY_VERSION_TLS_1_2) { 10630 mech = CKM_NSS_TLS_PRF_GENERAL_SHA256; 10631 } 10632 prf_context = PK11_CreateContextBySymKey(mech, CKA_SIGN, 10633 spec->master_secret, ¶m); 10634 if (!prf_context) 10635 return SECFailure; 10636 10637 rv = PK11_DigestBegin(prf_context); 10638 rv |= PK11_DigestOp(prf_context, (unsigned char *) label, labelLen); 10639 rv |= PK11_DigestOp(prf_context, val, valLen); 10640 rv |= PK11_DigestFinal(prf_context, out, &retLen, outLen); 10641 PORT_Assert(rv != SECSuccess || retLen == outLen); 10642 10643 PK11_DestroyContext(prf_context, PR_TRUE); 10644 } else { 10645 /* bypass PKCS11 */ 10646 #ifdef NO_PKCS11_BYPASS 10647 PORT_Assert(spec->master_secret); 10648 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 10649 rv = SECFailure; 10650 #else 10651 SECItem inData = { siBuffer, }; 10652 SECItem outData = { siBuffer, }; 10653 PRBool isFIPS = PR_FALSE; 10654 10655 inData.data = (unsigned char *) val; 10656 inData.len = valLen; 10657 outData.data = out; 10658 outData.len = outLen; 10659 if (spec->version >= SSL_LIBRARY_VERSION_TLS_1_2) { 10660 rv = TLS_P_hash(HASH_AlgSHA256, &spec->msItem, label, &inData, 10661 &outData, isFIPS); 10662 } else { 10663 rv = TLS_PRF(&spec->msItem, label, &inData, &outData, isFIPS); 10664 } 10665 PORT_Assert(rv != SECSuccess || outData.len == outLen); 10666 #endif 10667 } 10668 return rv; 10669 } 10670 10671 /* called from ssl3_SendClientSecondRound 10672 * ssl3_HandleFinished 10673 */ 10674 static SECStatus 10675 ssl3_SendNextProto(sslSocket *ss) 10676 { 10677 SECStatus rv; 10678 int padding_len; 10679 static const unsigned char padding[32] = {0}; 10680 10681 if (ss->ssl3.nextProto.len == 0 || 10682 ss->ssl3.nextProtoState == SSL_NEXT_PROTO_SELECTED) { 10683 return SECSuccess; 10684 } 10685 10686 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); 10687 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 10688 10689 padding_len = 32 - ((ss->ssl3.nextProto.len + 2) % 32); 10690 10691 rv = ssl3_AppendHandshakeHeader(ss, next_proto, ss->ssl3.nextProto.len + 10692 2 + padding_len); 10693 if (rv != SECSuccess) { 10694 return rv; /* error code set by AppendHandshakeHeader */ 10695 } 10696 rv = ssl3_AppendHandshakeVariable(ss, ss->ssl3.nextProto.data, 10697 ss->ssl3.nextProto.len, 1); 10698 if (rv != SECSuccess) { 10699 return rv; /* error code set by AppendHandshake */ 10700 } 10701 rv = ssl3_AppendHandshakeVariable(ss, padding, padding_len, 1); 10702 if (rv != SECSuccess) { 10703 return rv; /* error code set by AppendHandshake */ 10704 } 10705 return rv; 10706 } 10707 10708 /* called from ssl3_SendFinished 10709 * 10710 * This function is simply a debugging aid and therefore does not return a 10711 * SECStatus. */ 10712 static void 10713 ssl3_RecordKeyLog(sslSocket *ss) 10714 { 10715 SECStatus rv; 10716 SECItem *keyData; 10717 char buf[14 /* "CLIENT_RANDOM " */ + 10718 SSL3_RANDOM_LENGTH*2 /* client_random */ + 10719 1 /* " " */ + 10720 48*2 /* master secret */ + 10721 1 /* new line */]; 10722 unsigned int j; 10723 10724 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 10725 10726 if (!ssl_keylog_iob) 10727 return; 10728 10729 rv = PK11_ExtractKeyValue(ss->ssl3.cwSpec->master_secret); 10730 if (rv != SECSuccess) 10731 return; 10732 10733 ssl_GetSpecReadLock(ss); 10734 10735 /* keyData does not need to be freed. */ 10736 keyData = PK11_GetKeyData(ss->ssl3.cwSpec->master_secret); 10737 if (!keyData || !keyData->data || keyData->len != 48) { 10738 ssl_ReleaseSpecReadLock(ss); 10739 return; 10740 } 10741 10742 /* https://developer.mozilla.org/en/NSS_Key_Log_Format */ 10743 10744 /* There could be multiple, concurrent writers to the 10745 * keylog, so we have to do everything in a single call to 10746 * fwrite. */ 10747 10748 memcpy(buf, "CLIENT_RANDOM ", 14); 10749 j = 14; 10750 hexEncode(buf + j, ss->ssl3.hs.client_random.rand, SSL3_RANDOM_LENGTH); 10751 j += SSL3_RANDOM_LENGTH*2; 10752 buf[j++] = ' '; 10753 hexEncode(buf + j, keyData->data, 48); 10754 j += 48*2; 10755 buf[j++] = '\n'; 10756 10757 PORT_Assert(j == sizeof(buf)); 10758 10759 ssl_ReleaseSpecReadLock(ss); 10760 10761 if (fwrite(buf, sizeof(buf), 1, ssl_keylog_iob) != 1) 10762 return; 10763 fflush(ssl_keylog_iob); 10764 return; 10765 } 10766 10767 /* called from ssl3_SendClientSecondRound 10768 * ssl3_HandleFinished 10769 */ 10770 static SECStatus 10771 ssl3_SendEncryptedExtensions(sslSocket *ss) 10772 { 10773 static const char CHANNEL_ID_MAGIC[] = "TLS Channel ID signature"; 10774 static const char CHANNEL_ID_RESUMPTION_MAGIC[] = "Resumption"; 10775 /* This is the ASN.1 prefix for a P-256 public key. Specifically it's: 10776 * SEQUENCE 10777 * SEQUENCE 10778 * OID id-ecPublicKey 10779 * OID prime256v1 10780 * BIT STRING, length 66, 0 trailing bits: 0x04 10781 * 10782 * The 0x04 in the BIT STRING is the prefix for an uncompressed, X9.62 10783 * public key. Following that are the two field elements as 32-byte, 10784 * big-endian numbers, as required by the Channel ID. */ 10785 static const unsigned char P256_SPKI_PREFIX[] = { 10786 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 10787 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 10788 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 10789 0x42, 0x00, 0x04 10790 }; 10791 /* ChannelIDs are always 128 bytes long: 64 bytes of P-256 public key and 64 10792 * bytes of ECDSA signature. */ 10793 static const int CHANNEL_ID_PUBLIC_KEY_LENGTH = 64; 10794 static const int CHANNEL_ID_LENGTH = 128; 10795 10796 SECStatus rv = SECFailure; 10797 SECItem *spki = NULL; 10798 SSL3Hashes hashes; 10799 const unsigned char *pub_bytes; 10800 unsigned char signed_data[sizeof(CHANNEL_ID_MAGIC) + 10801 sizeof(CHANNEL_ID_RESUMPTION_MAGIC) + 10802 sizeof(SSL3Hashes)*2]; 10803 size_t signed_data_len; 10804 unsigned char digest[SHA256_LENGTH]; 10805 SECItem digest_item; 10806 unsigned char signature[64]; 10807 SECItem signature_item; 10808 10809 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); 10810 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 10811 10812 if (ss->ssl3.channelID == NULL) 10813 return SECSuccess; 10814 10815 PORT_Assert(ssl3_ExtensionNegotiated(ss, ssl_channel_id_xtn)); 10816 10817 if (SECKEY_GetPrivateKeyType(ss->ssl3.channelID) != ecKey || 10818 PK11_SignatureLen(ss->ssl3.channelID) != sizeof(signature)) { 10819 PORT_SetError(SSL_ERROR_INVALID_CHANNEL_ID_KEY); 10820 rv = SECFailure; 10821 goto loser; 10822 } 10823 10824 ssl_GetSpecReadLock(ss); 10825 rv = ssl3_ComputeHandshakeHashes(ss, ss->ssl3.cwSpec, &hashes, 0); 10826 ssl_ReleaseSpecReadLock(ss); 10827 10828 if (rv != SECSuccess) 10829 goto loser; 10830 10831 rv = ssl3_AppendHandshakeHeader(ss, encrypted_extensions, 10832 2 + 2 + CHANNEL_ID_LENGTH); 10833 if (rv != SECSuccess) 10834 goto loser; /* error code set by AppendHandshakeHeader */ 10835 rv = ssl3_AppendHandshakeNumber(ss, ssl_channel_id_xtn, 2); 10836 if (rv != SECSuccess) 10837 goto loser; /* error code set by AppendHandshake */ 10838 rv = ssl3_AppendHandshakeNumber(ss, CHANNEL_ID_LENGTH, 2); 10839 if (rv != SECSuccess) 10840 goto loser; /* error code set by AppendHandshake */ 10841 10842 spki = SECKEY_EncodeDERSubjectPublicKeyInfo(ss->ssl3.channelIDPub); 10843 10844 if (spki->len != sizeof(P256_SPKI_PREFIX) + CHANNEL_ID_PUBLIC_KEY_LENGTH || 10845 memcmp(spki->data, P256_SPKI_PREFIX, sizeof(P256_SPKI_PREFIX)) != 0) { 10846 PORT_SetError(SSL_ERROR_INVALID_CHANNEL_ID_KEY); 10847 rv = SECFailure; 10848 goto loser; 10849 } 10850 10851 pub_bytes = spki->data + sizeof(P256_SPKI_PREFIX); 10852 10853 signed_data_len = 0; 10854 memcpy(signed_data + signed_data_len, CHANNEL_ID_MAGIC, 10855 sizeof(CHANNEL_ID_MAGIC)); 10856 signed_data_len += sizeof(CHANNEL_ID_MAGIC); 10857 if (ss->ssl3.hs.isResuming) { 10858 SECItem *originalHandshakeHash = 10859 &ss->sec.ci.sid->u.ssl3.originalHandshakeHash; 10860 PORT_Assert(originalHandshakeHash->len > 0); 10861 10862 memcpy(signed_data + signed_data_len, CHANNEL_ID_RESUMPTION_MAGIC, 10863 sizeof(CHANNEL_ID_RESUMPTION_MAGIC)); 10864 signed_data_len += sizeof(CHANNEL_ID_RESUMPTION_MAGIC); 10865 memcpy(signed_data + signed_data_len, originalHandshakeHash->data, 10866 originalHandshakeHash->len); 10867 signed_data_len += originalHandshakeHash->len; 10868 } 10869 memcpy(signed_data + signed_data_len, hashes.u.raw, hashes.len); 10870 signed_data_len += hashes.len; 10871 10872 rv = PK11_HashBuf(SEC_OID_SHA256, digest, signed_data, signed_data_len); 10873 if (rv != SECSuccess) 10874 goto loser; 10875 10876 digest_item.data = digest; 10877 digest_item.len = sizeof(digest); 10878 10879 signature_item.data = signature; 10880 signature_item.len = sizeof(signature); 10881 10882 rv = PK11_Sign(ss->ssl3.channelID, &signature_item, &digest_item); 10883 if (rv != SECSuccess) 10884 goto loser; 10885 10886 rv = ssl3_AppendHandshake(ss, pub_bytes, CHANNEL_ID_PUBLIC_KEY_LENGTH); 10887 if (rv != SECSuccess) 10888 goto loser; 10889 rv = ssl3_AppendHandshake(ss, signature, sizeof(signature)); 10890 10891 loser: 10892 if (spki) 10893 SECITEM_FreeItem(spki, PR_TRUE); 10894 if (ss->ssl3.channelID) { 10895 SECKEY_DestroyPrivateKey(ss->ssl3.channelID); 10896 ss->ssl3.channelID = NULL; 10897 } 10898 if (ss->ssl3.channelIDPub) { 10899 SECKEY_DestroyPublicKey(ss->ssl3.channelIDPub); 10900 ss->ssl3.channelIDPub = NULL; 10901 } 10902 10903 return rv; 10904 } 10905 10906 /* ssl3_RestartHandshakeAfterChannelIDReq is called to restart a handshake 10907 * after a ChannelID callback returned SECWouldBlock. At this point we have 10908 * processed the server's ServerHello but not yet any further messages. We will 10909 * always get a message from the server after a ServerHello so either they are 10910 * waiting in the buffer or we'll get network I/O. */ 10911 SECStatus 10912 ssl3_RestartHandshakeAfterChannelIDReq(sslSocket *ss, 10913 SECKEYPublicKey *channelIDPub, 10914 SECKEYPrivateKey *channelID) 10915 { 10916 if (ss->handshake == 0) { 10917 SECKEY_DestroyPublicKey(channelIDPub); 10918 SECKEY_DestroyPrivateKey(channelID); 10919 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 10920 return SECFailure; 10921 } 10922 10923 if (channelIDPub == NULL || 10924 channelID == NULL) { 10925 if (channelIDPub) 10926 SECKEY_DestroyPublicKey(channelIDPub); 10927 if (channelID) 10928 SECKEY_DestroyPrivateKey(channelID); 10929 PORT_SetError(PR_INVALID_ARGUMENT_ERROR); 10930 return SECFailure; 10931 } 10932 10933 if (ss->ssl3.channelID) 10934 SECKEY_DestroyPrivateKey(ss->ssl3.channelID); 10935 if (ss->ssl3.channelIDPub) 10936 SECKEY_DestroyPublicKey(ss->ssl3.channelIDPub); 10937 10938 ss->handshake = ssl_GatherRecord1stHandshake; 10939 ss->ssl3.channelID = channelID; 10940 ss->ssl3.channelIDPub = channelIDPub; 10941 10942 return SECSuccess; 10943 } 10944 10945 /* called from ssl3_SendClientSecondRound 10946 * ssl3_HandleClientHello 10947 * ssl3_HandleFinished 10948 */ 10949 static SECStatus 10950 ssl3_SendFinished(sslSocket *ss, PRInt32 flags) 10951 { 10952 ssl3CipherSpec *cwSpec; 10953 PRBool isTLS; 10954 PRBool isServer = ss->sec.isServer; 10955 SECStatus rv; 10956 SSL3Sender sender = isServer ? sender_server : sender_client; 10957 SSL3Hashes hashes; 10958 TLSFinished tlsFinished; 10959 10960 SSL_TRC(3, ("%d: SSL3[%d]: send finished handshake", SSL_GETPID(), ss->fd)); 10961 10962 PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); 10963 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 10964 10965 ssl_GetSpecReadLock(ss); 10966 cwSpec = ss->ssl3.cwSpec; 10967 isTLS = (PRBool)(cwSpec->version > SSL_LIBRARY_VERSION_3_0); 10968 rv = ssl3_ComputeHandshakeHashes(ss, cwSpec, &hashes, sender); 10969 if (isTLS && rv == SECSuccess) { 10970 rv = ssl3_ComputeTLSFinished(cwSpec, isServer, &hashes, &tlsFinished); 10971 } 10972 ssl_ReleaseSpecReadLock(ss); 10973 if (rv != SECSuccess) { 10974 goto fail; /* err code was set by ssl3_ComputeHandshakeHashes */ 10975 } 10976 10977 if (isTLS) { 10978 if (isServer) 10979 ss->ssl3.hs.finishedMsgs.tFinished[1] = tlsFinished; 10980 else 10981 ss->ssl3.hs.finishedMsgs.tFinished[0] = tlsFinished; 10982 ss->ssl3.hs.finishedBytes = sizeof tlsFinished; 10983 rv = ssl3_AppendHandshakeHeader(ss, finished, sizeof tlsFinished); 10984 if (rv != SECSuccess) 10985 goto fail; /* err set by AppendHandshake. */ 10986 rv = ssl3_AppendHandshake(ss, &tlsFinished, sizeof tlsFinished); 10987 if (rv != SECSuccess) 10988 goto fail; /* err set by AppendHandshake. */ 10989 } else { 10990 if (isServer) 10991 ss->ssl3.hs.finishedMsgs.sFinished[1] = hashes.u.s; 10992 else 10993 ss->ssl3.hs.finishedMsgs.sFinished[0] = hashes.u.s; 10994 PORT_Assert(hashes.len == sizeof hashes.u.s); 10995 ss->ssl3.hs.finishedBytes = sizeof hashes.u.s; 10996 rv = ssl3_AppendHandshakeHeader(ss, finished, sizeof hashes.u.s); 10997 if (rv != SECSuccess) 10998 goto fail; /* err set by AppendHandshake. */ 10999 rv = ssl3_AppendHandshake(ss, &hashes.u.s, sizeof hashes.u.s); 11000 if (rv != SECSuccess) 11001 goto fail; /* err set by AppendHandshake. */ 11002 } 11003 rv = ssl3_FlushHandshake(ss, flags); 11004 if (rv != SECSuccess) { 11005 goto fail; /* error code set by ssl3_FlushHandshake */ 11006 } 11007 11008 ssl3_RecordKeyLog(ss); 11009 11010 return SECSuccess; 11011 11012 fail: 11013 return rv; 11014 } 11015 11016 /* wrap the master secret, and put it into the SID. 11017 * Caller holds the Spec read lock. 11018 */ 11019 SECStatus 11020 ssl3_CacheWrappedMasterSecret(sslSocket *ss, sslSessionID *sid, 11021 ssl3CipherSpec *spec, SSL3KEAType effectiveExchKeyType) 11022 { 11023 PK11SymKey * wrappingKey = NULL; 11024 PK11SlotInfo * symKeySlot; 11025 void * pwArg = ss->pkcs11PinArg; 11026 SECStatus rv = SECFailure; 11027 PRBool isServer = ss->sec.isServer; 11028 CK_MECHANISM_TYPE mechanism = CKM_INVALID_MECHANISM; 11029 symKeySlot = PK11_GetSlotFromKey(spec->master_secret); 11030 if (!isServer) { 11031 int wrapKeyIndex; 11032 int incarnation; 11033 11034 /* these next few functions are mere accessors and don't fail. */ 11035 sid->u.ssl3.masterWrapIndex = wrapKeyIndex = 11036 PK11_GetCurrentWrapIndex(symKeySlot); 11037 PORT_Assert(wrapKeyIndex == 0); /* array has only one entry! */ 11038 11039 sid->u.ssl3.masterWrapSeries = incarnation = 11040 PK11_GetSlotSeries(symKeySlot); 11041 sid->u.ssl3.masterSlotID = PK11_GetSlotID(symKeySlot); 11042 sid->u.ssl3.masterModuleID = PK11_GetModuleID(symKeySlot); 11043 sid->u.ssl3.masterValid = PR_TRUE; 11044 /* Get the default wrapping key, for wrapping the master secret before 11045 * placing it in the SID cache entry. */ 11046 wrappingKey = PK11_GetWrapKey(symKeySlot, wrapKeyIndex, 11047 CKM_INVALID_MECHANISM, incarnation, 11048 pwArg); 11049 if (wrappingKey) { 11050 mechanism = PK11_GetMechanism(wrappingKey); /* can't fail. */ 11051 } else { 11052 int keyLength; 11053 /* if the wrappingKey doesn't exist, attempt to create it. 11054 * Note: we intentionally ignore errors here. If we cannot 11055 * generate a wrapping key, it is not fatal to this SSL connection, 11056 * but we will not be able to restart this session. 11057 */ 11058 mechanism = PK11_GetBestWrapMechanism(symKeySlot); 11059 keyLength = PK11_GetBestKeyLength(symKeySlot, mechanism); 11060 /* Zero length means fixed key length algorithm, or error. 11061 * It's ambiguous. 11062 */ 11063 wrappingKey = PK11_KeyGen(symKeySlot, mechanism, NULL, 11064 keyLength, pwArg); 11065 if (wrappingKey) { 11066 PK11_SetWrapKey(symKeySlot, wrapKeyIndex, wrappingKey); 11067 } 11068 } 11069 } else { 11070 /* server socket using session cache. */ 11071 mechanism = PK11_GetBestWrapMechanism(symKeySlot); 11072 if (mechanism != CKM_INVALID_MECHANISM) { 11073 wrappingKey = 11074 getWrappingKey(ss, symKeySlot, effectiveExchKeyType, 11075 mechanism, pwArg); 11076 if (wrappingKey) { 11077 mechanism = PK11_GetMechanism(wrappingKey); /* can't fail. */ 11078 } 11079 } 11080 } 11081 11082 sid->u.ssl3.masterWrapMech = mechanism; 11083 PK11_FreeSlot(symKeySlot); 11084 11085 if (wrappingKey) { 11086 SECItem wmsItem; 11087 11088 wmsItem.data = sid->u.ssl3.keys.wrapped_master_secret; 11089 wmsItem.len = sizeof sid->u.ssl3.keys.wrapped_master_secret; 11090 rv = PK11_WrapSymKey(mechanism, NULL, wrappingKey, 11091 spec->master_secret, &wmsItem); 11092 /* rv is examined below. */ 11093 sid->u.ssl3.keys.wrapped_master_secret_len = wmsItem.len; 11094 PK11_FreeSymKey(wrappingKey); 11095 } 11096 return rv; 11097 } 11098 11099 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete 11100 * ssl3 Finished message from the peer. 11101 * Caller must hold Handshake and RecvBuf locks. 11102 */ 11103 static SECStatus 11104 ssl3_HandleFinished(sslSocket *ss, SSL3Opaque *b, PRUint32 length, 11105 const SSL3Hashes *hashes) 11106 { 11107 sslSessionID * sid = ss->sec.ci.sid; 11108 SECStatus rv = SECSuccess; 11109 PRBool isServer = ss->sec.isServer; 11110 PRBool isTLS; 11111 SSL3KEAType effectiveExchKeyType; 11112 11113 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 11114 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 11115 11116 SSL_TRC(3, ("%d: SSL3[%d]: handle finished handshake", 11117 SSL_GETPID(), ss->fd)); 11118 11119 if (ss->ssl3.hs.ws != wait_finished) { 11120 SSL3_SendAlert(ss, alert_fatal, unexpected_message); 11121 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_FINISHED); 11122 return SECFailure; 11123 } 11124 11125 isTLS = (PRBool)(ss->ssl3.crSpec->version > SSL_LIBRARY_VERSION_3_0); 11126 if (isTLS) { 11127 TLSFinished tlsFinished; 11128 11129 if (length != sizeof tlsFinished) { 11130 (void)SSL3_SendAlert(ss, alert_fatal, decode_error); 11131 PORT_SetError(SSL_ERROR_RX_MALFORMED_FINISHED); 11132 return SECFailure; 11133 } 11134 rv = ssl3_ComputeTLSFinished(ss->ssl3.crSpec, !isServer, 11135 hashes, &tlsFinished); 11136 if (!isServer) 11137 ss->ssl3.hs.finishedMsgs.tFinished[1] = tlsFinished; 11138 else 11139 ss->ssl3.hs.finishedMsgs.tFinished[0] = tlsFinished; 11140 ss->ssl3.hs.finishedBytes = sizeof tlsFinished; 11141 if (rv != SECSuccess || 11142 0 != NSS_SecureMemcmp(&tlsFinished, b, length)) { 11143 (void)SSL3_SendAlert(ss, alert_fatal, decrypt_error); 11144 PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); 11145 return SECFailure; 11146 } 11147 } else { 11148 if (length != sizeof(SSL3Finished)) { 11149 (void)ssl3_IllegalParameter(ss); 11150 PORT_SetError(SSL_ERROR_RX_MALFORMED_FINISHED); 11151 return SECFailure; 11152 } 11153 11154 if (!isServer) 11155 ss->ssl3.hs.finishedMsgs.sFinished[1] = hashes->u.s; 11156 else 11157 ss->ssl3.hs.finishedMsgs.sFinished[0] = hashes->u.s; 11158 PORT_Assert(hashes->len == sizeof hashes->u.s); 11159 ss->ssl3.hs.finishedBytes = sizeof hashes->u.s; 11160 if (0 != NSS_SecureMemcmp(&hashes->u.s, b, length)) { 11161 (void)ssl3_HandshakeFailure(ss); 11162 PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); 11163 return SECFailure; 11164 } 11165 } 11166 11167 ssl_GetXmitBufLock(ss); /*************************************/ 11168 11169 if ((isServer && !ss->ssl3.hs.isResuming) || 11170 (!isServer && ss->ssl3.hs.isResuming)) { 11171 PRInt32 flags = 0; 11172 11173 /* Send a NewSessionTicket message if the client sent us 11174 * either an empty session ticket, or one that did not verify. 11175 * (Note that if either of these conditions was met, then the 11176 * server has sent a SessionTicket extension in the 11177 * ServerHello message.) 11178 */ 11179 if (isServer && !ss->ssl3.hs.isResuming && 11180 ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn)) { 11181 /* RFC 5077 Section 3.3: "In the case of a full handshake, the 11182 * server MUST verify the client's Finished message before sending 11183 * the ticket." Presumably, this also means that the client's 11184 * certificate, if any, must be verified beforehand too. 11185 */ 11186 rv = ssl3_SendNewSessionTicket(ss); 11187 if (rv != SECSuccess) { 11188 goto xmit_loser; 11189 } 11190 } 11191 11192 rv = ssl3_SendChangeCipherSpecs(ss); 11193 if (rv != SECSuccess) { 11194 goto xmit_loser; /* err is set. */ 11195 } 11196 /* If this thread is in SSL_SecureSend (trying to write some data) 11197 ** then set the ssl_SEND_FLAG_FORCE_INTO_BUFFER flag, so that the 11198 ** last two handshake messages (change cipher spec and finished) 11199 ** will be sent in the same send/write call as the application data. 11200 */ 11201 if (ss->writerThread == PR_GetCurrentThread()) { 11202 flags = ssl_SEND_FLAG_FORCE_INTO_BUFFER; 11203 } 11204 11205 if (!isServer) { 11206 if (!ss->firstHsDone) { 11207 rv = ssl3_SendNextProto(ss); 11208 if (rv != SECSuccess) { 11209 goto xmit_loser; /* err code was set. */ 11210 } 11211 } 11212 rv = ssl3_SendEncryptedExtensions(ss); 11213 if (rv != SECSuccess) 11214 goto xmit_loser; /* err code was set. */ 11215 } 11216 11217 if (IS_DTLS(ss)) { 11218 flags |= ssl_SEND_FLAG_NO_RETRANSMIT; 11219 } 11220 11221 rv = ssl3_SendFinished(ss, flags); 11222 if (rv != SECSuccess) { 11223 goto xmit_loser; /* err is set. */ 11224 } 11225 } 11226 11227 xmit_loser: 11228 ssl_ReleaseXmitBufLock(ss); /*************************************/ 11229 if (rv != SECSuccess) { 11230 return rv; 11231 } 11232 11233 if (ss->ssl3.hs.kea_def->kea == kea_ecdhe_rsa) { 11234 effectiveExchKeyType = kt_rsa; 11235 } else { 11236 effectiveExchKeyType = ss->ssl3.hs.kea_def->exchKeyType; 11237 } 11238 11239 if (sid->cached == never_cached && !ss->opt.noCache && ss->sec.cache) { 11240 /* fill in the sid */ 11241 sid->u.ssl3.cipherSuite = ss->ssl3.hs.cipher_suite; 11242 sid->u.ssl3.compression = ss->ssl3.hs.compression; 11243 sid->u.ssl3.policy = ss->ssl3.policy; 11244 #ifdef NSS_ENABLE_ECC 11245 sid->u.ssl3.negotiatedECCurves = ss->ssl3.hs.negotiatedECCurves; 11246 #endif 11247 sid->u.ssl3.exchKeyType = effectiveExchKeyType; 11248 sid->version = ss->version; 11249 sid->authAlgorithm = ss->sec.authAlgorithm; 11250 sid->authKeyBits = ss->sec.authKeyBits; 11251 sid->keaType = ss->sec.keaType; 11252 sid->keaKeyBits = ss->sec.keaKeyBits; 11253 sid->lastAccessTime = sid->creationTime = ssl_Time(); 11254 sid->expirationTime = sid->creationTime + ssl3_sid_timeout; 11255 sid->localCert = CERT_DupCertificate(ss->sec.localCert); 11256 11257 ssl_GetSpecReadLock(ss); /*************************************/ 11258 11259 /* Copy the master secret (wrapped or unwrapped) into the sid */ 11260 if (ss->ssl3.crSpec->msItem.len && ss->ssl3.crSpec->msItem.data) { 11261 sid->u.ssl3.keys.wrapped_master_secret_len = 11262 ss->ssl3.crSpec->msItem.len; 11263 memcpy(sid->u.ssl3.keys.wrapped_master_secret, 11264 ss->ssl3.crSpec->msItem.data, ss->ssl3.crSpec->msItem.len); 11265 sid->u.ssl3.masterValid = PR_TRUE; 11266 sid->u.ssl3.keys.msIsWrapped = PR_FALSE; 11267 rv = SECSuccess; 11268 } else { 11269 rv = ssl3_CacheWrappedMasterSecret(ss, ss->sec.ci.sid, 11270 ss->ssl3.crSpec, 11271 effectiveExchKeyType); 11272 sid->u.ssl3.keys.msIsWrapped = PR_TRUE; 11273 } 11274 ssl_ReleaseSpecReadLock(ss); /*************************************/ 11275 11276 /* If the wrap failed, we don't cache the sid. 11277 * The connection continues normally however. 11278 */ 11279 ss->ssl3.hs.cacheSID = rv == SECSuccess; 11280 } 11281 11282 if (ss->ssl3.hs.authCertificatePending) { 11283 if (ss->ssl3.hs.restartTarget) { 11284 PR_NOT_REACHED("ssl3_HandleFinished: unexpected restartTarget"); 11285 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 11286 return SECFailure; 11287 } 11288 11289 ss->ssl3.hs.restartTarget = ssl3_FinishHandshake; 11290 return SECWouldBlock; 11291 } 11292 11293 rv = ssl3_FinishHandshake(ss); 11294 return rv; 11295 } 11296 11297 /* The return type is SECStatus instead of void because this function needs 11298 * to have type sslRestartTarget. 11299 */ 11300 SECStatus 11301 ssl3_FinishHandshake(sslSocket * ss) 11302 { 11303 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 11304 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 11305 PORT_Assert( ss->ssl3.hs.restartTarget == NULL ); 11306 11307 /* The first handshake is now completed. */ 11308 ss->handshake = NULL; 11309 11310 /* RFC 5077 Section 3.3: "The client MUST NOT treat the ticket as valid 11311 * until it has verified the server's Finished message." When the server 11312 * sends a NewSessionTicket in a resumption handshake, we must wait until 11313 * the handshake is finished (we have verified the server's Finished 11314 * AND the server's certificate) before we update the ticket in the sid. 11315 * 11316 * This must be done before we call (*ss->sec.cache)(ss->sec.ci.sid) 11317 * because CacheSID requires the session ticket to already be set, and also 11318 * because of the lazy lock creation scheme used by CacheSID and 11319 * ssl3_SetSIDSessionTicket. 11320 */ 11321 if (ss->ssl3.hs.receivedNewSessionTicket) { 11322 PORT_Assert(!ss->sec.isServer); 11323 ssl3_SetSIDSessionTicket(ss->sec.ci.sid, &ss->ssl3.hs.newSessionTicket); 11324 /* The sid took over the ticket data */ 11325 PORT_Assert(!ss->ssl3.hs.newSessionTicket.ticket.data); 11326 ss->ssl3.hs.receivedNewSessionTicket = PR_FALSE; 11327 } 11328 11329 if (ss->ssl3.hs.cacheSID && ss->sec.isServer) { 11330 PORT_Assert(ss->sec.ci.sid->cached == never_cached); 11331 (*ss->sec.cache)(ss->sec.ci.sid); 11332 ss->ssl3.hs.cacheSID = PR_FALSE; 11333 } 11334 11335 ss->ssl3.hs.canFalseStart = PR_FALSE; /* False Start phase is complete */ 11336 ss->ssl3.hs.ws = idle_handshake; 11337 11338 ssl_FinishHandshake(ss); 11339 11340 return SECSuccess; 11341 } 11342 11343 /* Called from ssl3_HandleHandshake() when it has gathered a complete ssl3 11344 * hanshake message. 11345 * Caller must hold Handshake and RecvBuf locks. 11346 */ 11347 SECStatus 11348 ssl3_HandleHandshakeMessage(sslSocket *ss, SSL3Opaque *b, PRUint32 length) 11349 { 11350 SECStatus rv = SECSuccess; 11351 SSL3HandshakeType type = ss->ssl3.hs.msg_type; 11352 SSL3Hashes hashes; /* computed hashes are put here. */ 11353 PRUint8 hdr[4]; 11354 PRUint8 dtlsData[8]; 11355 11356 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 11357 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 11358 /* 11359 * We have to compute the hashes before we update them with the 11360 * current message. 11361 */ 11362 ssl_GetSpecReadLock(ss); /************************************/ 11363 if((type == finished) || (type == certificate_verify)) { 11364 SSL3Sender sender = (SSL3Sender)0; 11365 ssl3CipherSpec *rSpec = ss->ssl3.prSpec; 11366 11367 if (type == finished) { 11368 sender = ss->sec.isServer ? sender_client : sender_server; 11369 rSpec = ss->ssl3.crSpec; 11370 } 11371 rv = ssl3_ComputeHandshakeHashes(ss, rSpec, &hashes, sender); 11372 } 11373 ssl_ReleaseSpecReadLock(ss); /************************************/ 11374 if (rv != SECSuccess) { 11375 return rv; /* error code was set by ssl3_ComputeHandshakeHashes*/ 11376 } 11377 SSL_TRC(30,("%d: SSL3[%d]: handle handshake message: %s", SSL_GETPID(), 11378 ss->fd, ssl3_DecodeHandshakeType(ss->ssl3.hs.msg_type))); 11379 11380 hdr[0] = (PRUint8)ss->ssl3.hs.msg_type; 11381 hdr[1] = (PRUint8)(length >> 16); 11382 hdr[2] = (PRUint8)(length >> 8); 11383 hdr[3] = (PRUint8)(length ); 11384 11385 /* Start new handshake hashes when we start a new handshake */ 11386 if (ss->ssl3.hs.msg_type == client_hello) { 11387 rv = ssl3_RestartHandshakeHashes(ss); 11388 if (rv != SECSuccess) { 11389 return rv; 11390 } 11391 } 11392 /* We should not include hello_request and hello_verify_request messages 11393 * in the handshake hashes */ 11394 if ((ss->ssl3.hs.msg_type != hello_request) && 11395 (ss->ssl3.hs.msg_type != hello_verify_request)) { 11396 rv = ssl3_UpdateHandshakeHashes(ss, (unsigned char*) hdr, 4); 11397 if (rv != SECSuccess) return rv; /* err code already set. */ 11398 11399 /* Extra data to simulate a complete DTLS handshake fragment */ 11400 if (IS_DTLS(ss)) { 11401 /* Sequence number */ 11402 dtlsData[0] = MSB(ss->ssl3.hs.recvMessageSeq); 11403 dtlsData[1] = LSB(ss->ssl3.hs.recvMessageSeq); 11404 11405 /* Fragment offset */ 11406 dtlsData[2] = 0; 11407 dtlsData[3] = 0; 11408 dtlsData[4] = 0; 11409 11410 /* Fragment length */ 11411 dtlsData[5] = (PRUint8)(length >> 16); 11412 dtlsData[6] = (PRUint8)(length >> 8); 11413 dtlsData[7] = (PRUint8)(length ); 11414 11415 rv = ssl3_UpdateHandshakeHashes(ss, (unsigned char*) dtlsData, 11416 sizeof(dtlsData)); 11417 if (rv != SECSuccess) return rv; /* err code already set. */ 11418 } 11419 11420 /* The message body */ 11421 rv = ssl3_UpdateHandshakeHashes(ss, b, length); 11422 if (rv != SECSuccess) return rv; /* err code already set. */ 11423 } 11424 11425 PORT_SetError(0); /* each message starts with no error. */ 11426 11427 if (ss->ssl3.hs.ws == wait_certificate_status && 11428 ss->ssl3.hs.msg_type != certificate_status) { 11429 /* If we negotiated the certificate_status extension then we deferred 11430 * certificate validation until we get the CertificateStatus messsage. 11431 * But the CertificateStatus message is optional. If the server did 11432 * not send it then we need to validate the certificate now. If the 11433 * server does send the CertificateStatus message then we will 11434 * authenticate the certificate in ssl3_HandleCertificateStatus. 11435 */ 11436 rv = ssl3_AuthCertificate(ss); /* sets ss->ssl3.hs.ws */ 11437 PORT_Assert(rv != SECWouldBlock); 11438 if (rv != SECSuccess) { 11439 return rv; 11440 } 11441 } 11442 11443 switch (ss->ssl3.hs.msg_type) { 11444 case hello_request: 11445 if (length != 0) { 11446 (void)ssl3_DecodeError(ss); 11447 PORT_SetError(SSL_ERROR_RX_MALFORMED_HELLO_REQUEST); 11448 return SECFailure; 11449 } 11450 if (ss->sec.isServer) { 11451 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); 11452 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HELLO_REQUEST); 11453 return SECFailure; 11454 } 11455 rv = ssl3_HandleHelloRequest(ss); 11456 break; 11457 case client_hello: 11458 if (!ss->sec.isServer) { 11459 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); 11460 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CLIENT_HELLO); 11461 return SECFailure; 11462 } 11463 rv = ssl3_HandleClientHello(ss, b, length); 11464 break; 11465 case server_hello: 11466 if (ss->sec.isServer) { 11467 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); 11468 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_SERVER_HELLO); 11469 return SECFailure; 11470 } 11471 rv = ssl3_HandleServerHello(ss, b, length); 11472 break; 11473 case hello_verify_request: 11474 if (!IS_DTLS(ss) || ss->sec.isServer) { 11475 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); 11476 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HELLO_VERIFY_REQUEST); 11477 return SECFailure; 11478 } 11479 rv = dtls_HandleHelloVerifyRequest(ss, b, length); 11480 break; 11481 case certificate: 11482 rv = ssl3_HandleCertificate(ss, b, length); 11483 break; 11484 case certificate_status: 11485 rv = ssl3_HandleCertificateStatus(ss, b, length); 11486 break; 11487 case server_key_exchange: 11488 if (ss->sec.isServer) { 11489 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); 11490 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_SERVER_KEY_EXCH); 11491 return SECFailure; 11492 } 11493 rv = ssl3_HandleServerKeyExchange(ss, b, length); 11494 break; 11495 case certificate_request: 11496 if (ss->sec.isServer) { 11497 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); 11498 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CERT_REQUEST); 11499 return SECFailure; 11500 } 11501 rv = ssl3_HandleCertificateRequest(ss, b, length); 11502 break; 11503 case server_hello_done: 11504 if (length != 0) { 11505 (void)ssl3_DecodeError(ss); 11506 PORT_SetError(SSL_ERROR_RX_MALFORMED_HELLO_DONE); 11507 return SECFailure; 11508 } 11509 if (ss->sec.isServer) { 11510 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); 11511 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HELLO_DONE); 11512 return SECFailure; 11513 } 11514 rv = ssl3_HandleServerHelloDone(ss); 11515 break; 11516 case certificate_verify: 11517 if (!ss->sec.isServer) { 11518 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); 11519 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CERT_VERIFY); 11520 return SECFailure; 11521 } 11522 rv = ssl3_HandleCertificateVerify(ss, b, length, &hashes); 11523 break; 11524 case client_key_exchange: 11525 if (!ss->sec.isServer) { 11526 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); 11527 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CLIENT_KEY_EXCH); 11528 return SECFailure; 11529 } 11530 rv = ssl3_HandleClientKeyExchange(ss, b, length); 11531 break; 11532 case new_session_ticket: 11533 if (ss->sec.isServer) { 11534 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); 11535 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_NEW_SESSION_TICKET); 11536 return SECFailure; 11537 } 11538 rv = ssl3_HandleNewSessionTicket(ss, b, length); 11539 break; 11540 case finished: 11541 rv = ssl3_HandleFinished(ss, b, length, &hashes); 11542 break; 11543 default: 11544 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); 11545 PORT_SetError(SSL_ERROR_RX_UNKNOWN_HANDSHAKE); 11546 rv = SECFailure; 11547 } 11548 11549 if (IS_DTLS(ss) && (rv != SECFailure)) { 11550 /* Increment the expected sequence number */ 11551 ss->ssl3.hs.recvMessageSeq++; 11552 } 11553 11554 return rv; 11555 } 11556 11557 /* Called only from ssl3_HandleRecord, for each (deciphered) ssl3 record. 11558 * origBuf is the decrypted ssl record content. 11559 * Caller must hold the handshake and RecvBuf locks. 11560 */ 11561 static SECStatus 11562 ssl3_HandleHandshake(sslSocket *ss, sslBuffer *origBuf) 11563 { 11564 /* 11565 * There may be a partial handshake message already in the handshake 11566 * state. The incoming buffer may contain another portion, or a 11567 * complete message or several messages followed by another portion. 11568 * 11569 * Each message is made contiguous before being passed to the actual 11570 * message parser. 11571 */ 11572 sslBuffer *buf = &ss->ssl3.hs.msgState; /* do not lose the original buffer pointer */ 11573 SECStatus rv; 11574 11575 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 11576 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 11577 11578 if (buf->buf == NULL) { 11579 *buf = *origBuf; 11580 } 11581 while (buf->len > 0) { 11582 if (ss->ssl3.hs.header_bytes < 4) { 11583 PRUint8 t; 11584 t = *(buf->buf++); 11585 buf->len--; 11586 if (ss->ssl3.hs.header_bytes++ == 0) 11587 ss->ssl3.hs.msg_type = (SSL3HandshakeType)t; 11588 else 11589 ss->ssl3.hs.msg_len = (ss->ssl3.hs.msg_len << 8) + t; 11590 if (ss->ssl3.hs.header_bytes < 4) 11591 continue; 11592 11593 #define MAX_HANDSHAKE_MSG_LEN 0x1ffff /* 128k - 1 */ 11594 if (ss->ssl3.hs.msg_len > MAX_HANDSHAKE_MSG_LEN) { 11595 (void)ssl3_DecodeError(ss); 11596 PORT_SetError(SSL_ERROR_RX_RECORD_TOO_LONG); 11597 return SECFailure; 11598 } 11599 #undef MAX_HANDSHAKE_MSG_LEN 11600 11601 /* If msg_len is zero, be sure we fall through, 11602 ** even if buf->len is zero. 11603 */ 11604 if (ss->ssl3.hs.msg_len > 0) 11605 continue; 11606 } 11607 11608 /* 11609 * Header has been gathered and there is at least one byte of new 11610 * data available for this message. If it can be done right out 11611 * of the original buffer, then use it from there. 11612 */ 11613 if (ss->ssl3.hs.msg_body.len == 0 && buf->len >= ss->ssl3.hs.msg_len) { 11614 /* handle it from input buffer */ 11615 rv = ssl3_HandleHandshakeMessage(ss, buf->buf, ss->ssl3.hs.msg_len); 11616 if (rv == SECFailure) { 11617 /* This test wants to fall through on either 11618 * SECSuccess or SECWouldBlock. 11619 * ssl3_HandleHandshakeMessage MUST set the error code. 11620 */ 11621 return rv; 11622 } 11623 buf->buf += ss->ssl3.hs.msg_len; 11624 buf->len -= ss->ssl3.hs.msg_len; 11625 ss->ssl3.hs.msg_len = 0; 11626 ss->ssl3.hs.header_bytes = 0; 11627 if (rv != SECSuccess) { /* return if SECWouldBlock. */ 11628 return rv; 11629 } 11630 } else { 11631 /* must be copied to msg_body and dealt with from there */ 11632 unsigned int bytes; 11633 11634 PORT_Assert(ss->ssl3.hs.msg_body.len < ss->ssl3.hs.msg_len); 11635 bytes = PR_MIN(buf->len, ss->ssl3.hs.msg_len - ss->ssl3.hs.msg_body.len); 11636 11637 /* Grow the buffer if needed */ 11638 rv = sslBuffer_Grow(&ss->ssl3.hs.msg_body, ss->ssl3.hs.msg_len); 11639 if (rv != SECSuccess) { 11640 /* sslBuffer_Grow has set a memory error code. */ 11641 return SECFailure; 11642 } 11643 11644 PORT_Memcpy(ss->ssl3.hs.msg_body.buf + ss->ssl3.hs.msg_body.len, 11645 buf->buf, bytes); 11646 ss->ssl3.hs.msg_body.len += bytes; 11647 buf->buf += bytes; 11648 buf->len -= bytes; 11649 11650 PORT_Assert(ss->ssl3.hs.msg_body.len <= ss->ssl3.hs.msg_len); 11651 11652 /* if we have a whole message, do it */ 11653 if (ss->ssl3.hs.msg_body.len == ss->ssl3.hs.msg_len) { 11654 rv = ssl3_HandleHandshakeMessage( 11655 ss, ss->ssl3.hs.msg_body.buf, ss->ssl3.hs.msg_len); 11656 if (rv == SECFailure) { 11657 /* This test wants to fall through on either 11658 * SECSuccess or SECWouldBlock. 11659 * ssl3_HandleHandshakeMessage MUST set error code. 11660 */ 11661 return rv; 11662 } 11663 ss->ssl3.hs.msg_body.len = 0; 11664 ss->ssl3.hs.msg_len = 0; 11665 ss->ssl3.hs.header_bytes = 0; 11666 if (rv != SECSuccess) { /* return if SECWouldBlock. */ 11667 return rv; 11668 } 11669 } else { 11670 PORT_Assert(buf->len == 0); 11671 break; 11672 } 11673 } 11674 } /* end loop */ 11675 11676 origBuf->len = 0; /* So ssl3_GatherAppDataRecord will keep looping. */ 11677 buf->buf = NULL; /* not a leak. */ 11678 return SECSuccess; 11679 } 11680 11681 /* These macros return the given value with the MSB copied to all the other 11682 * bits. They use the fact that arithmetic shift shifts-in the sign bit. 11683 * However, this is not ensured by the C standard so you may need to replace 11684 * them with something else for odd compilers. */ 11685 #define DUPLICATE_MSB_TO_ALL(x) ( (unsigned)( (int)(x) >> (sizeof(int)*8-1) ) ) 11686 #define DUPLICATE_MSB_TO_ALL_8(x) ((unsigned char)(DUPLICATE_MSB_TO_ALL(x))) 11687 11688 /* SECStatusToMask returns, in constant time, a mask value of all ones if 11689 * rv == SECSuccess. Otherwise it returns zero. */ 11690 static unsigned int 11691 SECStatusToMask(SECStatus rv) 11692 { 11693 unsigned int good; 11694 /* rv ^ SECSuccess is zero iff rv == SECSuccess. Subtracting one results 11695 * in the MSB being set to one iff it was zero before. */ 11696 good = rv ^ SECSuccess; 11697 good--; 11698 return DUPLICATE_MSB_TO_ALL(good); 11699 } 11700 11701 /* ssl_ConstantTimeGE returns 0xff if a>=b and 0x00 otherwise. */ 11702 static unsigned char 11703 ssl_ConstantTimeGE(unsigned int a, unsigned int b) 11704 { 11705 a -= b; 11706 return DUPLICATE_MSB_TO_ALL(~a); 11707 } 11708 11709 /* ssl_ConstantTimeEQ8 returns 0xff if a==b and 0x00 otherwise. */ 11710 static unsigned char 11711 ssl_ConstantTimeEQ8(unsigned char a, unsigned char b) 11712 { 11713 unsigned int c = a ^ b; 11714 c--; 11715 return DUPLICATE_MSB_TO_ALL_8(c); 11716 } 11717 11718 static SECStatus 11719 ssl_RemoveSSLv3CBCPadding(sslBuffer *plaintext, 11720 unsigned int blockSize, 11721 unsigned int macSize) 11722 { 11723 unsigned int paddingLength, good, t; 11724 const unsigned int overhead = 1 /* padding length byte */ + macSize; 11725 11726 /* These lengths are all public so we can test them in non-constant 11727 * time. */ 11728 if (overhead > plaintext->len) { 11729 return SECFailure; 11730 } 11731 11732 paddingLength = plaintext->buf[plaintext->len-1]; 11733 /* SSLv3 padding bytes are random and cannot be checked. */ 11734 t = plaintext->len; 11735 t -= paddingLength+overhead; 11736 /* If len >= paddingLength+overhead then the MSB of t is zero. */ 11737 good = DUPLICATE_MSB_TO_ALL(~t); 11738 /* SSLv3 requires that the padding is minimal. */ 11739 t = blockSize - (paddingLength+1); 11740 good &= DUPLICATE_MSB_TO_ALL(~t); 11741 plaintext->len -= good & (paddingLength+1); 11742 return (good & SECSuccess) | (~good & SECFailure); 11743 } 11744 11745 static SECStatus 11746 ssl_RemoveTLSCBCPadding(sslBuffer *plaintext, unsigned int macSize) 11747 { 11748 unsigned int paddingLength, good, t, toCheck, i; 11749 const unsigned int overhead = 1 /* padding length byte */ + macSize; 11750 11751 /* These lengths are all public so we can test them in non-constant 11752 * time. */ 11753 if (overhead > plaintext->len) { 11754 return SECFailure; 11755 } 11756 11757 paddingLength = plaintext->buf[plaintext->len-1]; 11758 t = plaintext->len; 11759 t -= paddingLength+overhead; 11760 /* If len >= paddingLength+overhead then the MSB of t is zero. */ 11761 good = DUPLICATE_MSB_TO_ALL(~t); 11762 11763 /* The padding consists of a length byte at the end of the record and then 11764 * that many bytes of padding, all with the same value as the length byte. 11765 * Thus, with the length byte included, there are paddingLength+1 bytes of 11766 * padding. 11767 * 11768 * We can't check just |paddingLength+1| bytes because that leaks 11769 * decrypted information. Therefore we always have to check the maximum 11770 * amount of padding possible. (Again, the length of the record is 11771 * public information so we can use it.) */ 11772 toCheck = 255; /* maximum amount of padding. */ 11773 if (toCheck > plaintext->len-1) { 11774 toCheck = plaintext->len-1; 11775 } 11776 11777 for (i = 0; i < toCheck; i++) { 11778 unsigned int t = paddingLength - i; 11779 /* If i <= paddingLength then the MSB of t is zero and mask is 11780 * 0xff. Otherwise, mask is 0. */ 11781 unsigned char mask = DUPLICATE_MSB_TO_ALL(~t); 11782 unsigned char b = plaintext->buf[plaintext->len-1-i]; 11783 /* The final |paddingLength+1| bytes should all have the value 11784 * |paddingLength|. Therefore the XOR should be zero. */ 11785 good &= ~(mask&(paddingLength ^ b)); 11786 } 11787 11788 /* If any of the final |paddingLength+1| bytes had the wrong value, 11789 * one or more of the lower eight bits of |good| will be cleared. We 11790 * AND the bottom 8 bits together and duplicate the result to all the 11791 * bits. */ 11792 good &= good >> 4; 11793 good &= good >> 2; 11794 good &= good >> 1; 11795 good <<= sizeof(good)*8-1; 11796 good = DUPLICATE_MSB_TO_ALL(good); 11797 11798 plaintext->len -= good & (paddingLength+1); 11799 return (good & SECSuccess) | (~good & SECFailure); 11800 } 11801 11802 /* On entry: 11803 * originalLength >= macSize 11804 * macSize <= MAX_MAC_LENGTH 11805 * plaintext->len >= macSize 11806 */ 11807 static void 11808 ssl_CBCExtractMAC(sslBuffer *plaintext, 11809 unsigned int originalLength, 11810 SSL3Opaque* out, 11811 unsigned int macSize) 11812 { 11813 unsigned char rotatedMac[MAX_MAC_LENGTH]; 11814 /* macEnd is the index of |plaintext->buf| just after the end of the 11815 * MAC. */ 11816 unsigned macEnd = plaintext->len; 11817 unsigned macStart = macEnd - macSize; 11818 /* scanStart contains the number of bytes that we can ignore because 11819 * the MAC's position can only vary by 255 bytes. */ 11820 unsigned scanStart = 0; 11821 unsigned i, j, divSpoiler; 11822 unsigned char rotateOffset; 11823 11824 if (originalLength > macSize + 255 + 1) 11825 scanStart = originalLength - (macSize + 255 + 1); 11826 11827 /* divSpoiler contains a multiple of macSize that is used to cause the 11828 * modulo operation to be constant time. Without this, the time varies 11829 * based on the amount of padding when running on Intel chips at least. 11830 * 11831 * The aim of right-shifting macSize is so that the compiler doesn't 11832 * figure out that it can remove divSpoiler as that would require it 11833 * to prove that macSize is always even, which I hope is beyond it. */ 11834 divSpoiler = macSize >> 1; 11835 divSpoiler <<= (sizeof(divSpoiler)-1)*8; 11836 rotateOffset = (divSpoiler + macStart - scanStart) % macSize; 11837 11838 memset(rotatedMac, 0, macSize); 11839 for (i = scanStart; i < originalLength;) { 11840 for (j = 0; j < macSize && i < originalLength; i++, j++) { 11841 unsigned char macStarted = ssl_ConstantTimeGE(i, macStart); 11842 unsigned char macEnded = ssl_ConstantTimeGE(i, macEnd); 11843 unsigned char b = 0; 11844 b = plaintext->buf[i]; 11845 rotatedMac[j] |= b & macStarted & ~macEnded; 11846 } 11847 } 11848 11849 /* Now rotate the MAC. If we knew that the MAC fit into a CPU cache line 11850 * we could line-align |rotatedMac| and rotate in place. */ 11851 memset(out, 0, macSize); 11852 for (i = 0; i < macSize; i++) { 11853 unsigned char offset = 11854 (divSpoiler + macSize - rotateOffset + i) % macSize; 11855 for (j = 0; j < macSize; j++) { 11856 out[j] |= rotatedMac[i] & ssl_ConstantTimeEQ8(j, offset); 11857 } 11858 } 11859 } 11860 11861 /* if cText is non-null, then decipher, check MAC, and decompress the 11862 * SSL record from cText->buf (typically gs->inbuf) 11863 * into databuf (typically gs->buf), and any previous contents of databuf 11864 * is lost. Then handle databuf according to its SSL record type, 11865 * unless it's an application record. 11866 * 11867 * If cText is NULL, then the ciphertext has previously been deciphered and 11868 * checked, and is already sitting in databuf. It is processed as an SSL 11869 * Handshake message. 11870 * 11871 * DOES NOT process the decrypted/decompressed application data. 11872 * On return, databuf contains the decrypted/decompressed record. 11873 * 11874 * Called from ssl3_GatherCompleteHandshake 11875 * ssl3_RestartHandshakeAfterCertReq 11876 * 11877 * Caller must hold the RecvBufLock. 11878 * 11879 * This function aquires and releases the SSL3Handshake Lock, holding the 11880 * lock around any calls to functions that handle records other than 11881 * Application Data records. 11882 */ 11883 SECStatus 11884 ssl3_HandleRecord(sslSocket *ss, SSL3Ciphertext *cText, sslBuffer *databuf) 11885 { 11886 const ssl3BulkCipherDef *cipher_def; 11887 ssl3CipherSpec * crSpec; 11888 SECStatus rv; 11889 unsigned int hashBytes = MAX_MAC_LENGTH + 1; 11890 PRBool isTLS; 11891 SSL3ContentType rType; 11892 SSL3Opaque hash[MAX_MAC_LENGTH]; 11893 SSL3Opaque givenHashBuf[MAX_MAC_LENGTH]; 11894 SSL3Opaque *givenHash; 11895 sslBuffer *plaintext; 11896 sslBuffer temp_buf; 11897 PRUint64 dtls_seq_num; 11898 unsigned int ivLen = 0; 11899 unsigned int originalLen = 0; 11900 unsigned int good; 11901 unsigned int minLength; 11902 unsigned char header[13]; 11903 unsigned int headerLen; 11904 11905 PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss) ); 11906 11907 if (!ss->ssl3.initialized) { 11908 ssl_GetSSL3HandshakeLock(ss); 11909 rv = ssl3_InitState(ss); 11910 ssl_ReleaseSSL3HandshakeLock(ss); 11911 if (rv != SECSuccess) { 11912 return rv; /* ssl3_InitState has set the error code. */ 11913 } 11914 } 11915 11916 /* check for Token Presence */ 11917 if (!ssl3_ClientAuthTokenPresent(ss->sec.ci.sid)) { 11918 PORT_SetError(SSL_ERROR_TOKEN_INSERTION_REMOVAL); 11919 return SECFailure; 11920 } 11921 11922 /* cText is NULL when we're called from ssl3_RestartHandshakeAfterXXX(). 11923 * This implies that databuf holds a previously deciphered SSL Handshake 11924 * message. 11925 */ 11926 if (cText == NULL) { 11927 SSL_DBG(("%d: SSL3[%d]: HandleRecord, resuming handshake", 11928 SSL_GETPID(), ss->fd)); 11929 rType = content_handshake; 11930 goto process_it; 11931 } 11932 11933 ssl_GetSpecReadLock(ss); /******************************************/ 11934 11935 crSpec = ss->ssl3.crSpec; 11936 cipher_def = crSpec->cipher_def; 11937 11938 /* 11939 * DTLS relevance checks: 11940 * Note that this code currently ignores all out-of-epoch packets, 11941 * which means we lose some in the case of rehandshake + 11942 * loss/reordering. Since DTLS is explicitly unreliable, this 11943 * seems like a good tradeoff for implementation effort and is 11944 * consistent with the guidance of RFC 6347 Sections 4.1 and 4.2.4.1 11945 */ 11946 if (IS_DTLS(ss)) { 11947 DTLSEpoch epoch = (cText->seq_num.high >> 16) & 0xffff; 11948 11949 if (crSpec->epoch != epoch) { 11950 ssl_ReleaseSpecReadLock(ss); 11951 SSL_DBG(("%d: SSL3[%d]: HandleRecord, received packet " 11952 "from irrelevant epoch %d", SSL_GETPID(), ss->fd, epoch)); 11953 /* Silently drop the packet */ 11954 databuf->len = 0; /* Needed to ensure data not left around */ 11955 return SECSuccess; 11956 } 11957 11958 dtls_seq_num = (((PRUint64)(cText->seq_num.high & 0xffff)) << 32) | 11959 ((PRUint64)cText->seq_num.low); 11960 11961 if (dtls_RecordGetRecvd(&crSpec->recvdRecords, dtls_seq_num) != 0) { 11962 ssl_ReleaseSpecReadLock(ss); 11963 SSL_DBG(("%d: SSL3[%d]: HandleRecord, rejecting " 11964 "potentially replayed packet", SSL_GETPID(), ss->fd)); 11965 /* Silently drop the packet */ 11966 databuf->len = 0; /* Needed to ensure data not left around */ 11967 return SECSuccess; 11968 } 11969 } 11970 11971 good = ~0U; 11972 minLength = crSpec->mac_size; 11973 if (cipher_def->type == type_block) { 11974 /* CBC records have a padding length byte at the end. */ 11975 minLength++; 11976 if (crSpec->version >= SSL_LIBRARY_VERSION_TLS_1_1) { 11977 /* With >= TLS 1.1, CBC records have an explicit IV. */ 11978 minLength += cipher_def->iv_size; 11979 } 11980 } else if (cipher_def->type == type_aead) { 11981 minLength = cipher_def->explicit_nonce_size + cipher_def->tag_size; 11982 } 11983 11984 /* We can perform this test in variable time because the record's total 11985 * length and the ciphersuite are both public knowledge. */ 11986 if (cText->buf->len < minLength) { 11987 goto decrypt_loser; 11988 } 11989 11990 if (cipher_def->type == type_block && 11991 crSpec->version >= SSL_LIBRARY_VERSION_TLS_1_1) { 11992 /* Consume the per-record explicit IV. RFC 4346 Section 6.2.3.2 states 11993 * "The receiver decrypts the entire GenericBlockCipher structure and 11994 * then discards the first cipher block corresponding to the IV 11995 * component." Instead, we decrypt the first cipher block and then 11996 * discard it before decrypting the rest. 11997 */ 11998 SSL3Opaque iv[MAX_IV_LENGTH]; 11999 int decoded; 12000 12001 ivLen = cipher_def->iv_size; 12002 if (ivLen < 8 || ivLen > sizeof(iv)) { 12003 ssl_ReleaseSpecReadLock(ss); 12004 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); 12005 return SECFailure; 12006 } 12007 12008 PRINT_BUF(80, (ss, "IV (ciphertext):", cText->buf->buf, ivLen)); 12009 12010 /* The decryption result is garbage, but since we just throw away 12011 * the block it doesn't matter. The decryption of the next block 12012 * depends only on the ciphertext of the IV block. 12013 */ 12014 rv = crSpec->decode(crSpec->decodeContext, iv, &decoded, 12015 sizeof(iv), cText->buf->buf, ivLen); 12016 12017 good &= SECStatusToMask(rv); 12018 } 12019 12020 /* If we will be decompressing the buffer we need to decrypt somewhere 12021 * other than into databuf */ 12022 if (crSpec->decompressor) { 12023 temp_buf.buf = NULL; 12024 temp_buf.space = 0; 12025 plaintext = &temp_buf; 12026 } else { 12027 plaintext = databuf; 12028 } 12029 12030 plaintext->len = 0; /* filled in by decode call below. */ 12031 if (plaintext->space < MAX_FRAGMENT_LENGTH) { 12032 rv = sslBuffer_Grow(plaintext, MAX_FRAGMENT_LENGTH + 2048); 12033 if (rv != SECSuccess) { 12034 ssl_ReleaseSpecReadLock(ss); 12035 SSL_DBG(("%d: SSL3[%d]: HandleRecord, tried to get %d bytes", 12036 SSL_GETPID(), ss->fd, MAX_FRAGMENT_LENGTH + 2048)); 12037 /* sslBuffer_Grow has set a memory error code. */ 12038 /* Perhaps we should send an alert. (but we have no memory!) */ 12039 return SECFailure; 12040 } 12041 } 12042 12043 PRINT_BUF(80, (ss, "ciphertext:", cText->buf->buf + ivLen, 12044 cText->buf->len - ivLen)); 12045 12046 isTLS = (PRBool)(crSpec->version > SSL_LIBRARY_VERSION_3_0); 12047 12048 if (isTLS && cText->buf->len - ivLen > (MAX_FRAGMENT_LENGTH + 2048)) { 12049 ssl_ReleaseSpecReadLock(ss); 12050 SSL3_SendAlert(ss, alert_fatal, record_overflow); 12051 PORT_SetError(SSL_ERROR_RX_RECORD_TOO_LONG); 12052 return SECFailure; 12053 } 12054 12055 rType = cText->type; 12056 if (cipher_def->type == type_aead) { 12057 /* XXX For many AEAD ciphers, the plaintext is shorter than the 12058 * ciphertext by a fixed byte count, but it is not true in general. 12059 * Each AEAD cipher should provide a function that returns the 12060 * plaintext length for a given ciphertext. */ 12061 unsigned int decryptedLen = 12062 cText->buf->len - cipher_def->explicit_nonce_size - 12063 cipher_def->tag_size; 12064 headerLen = ssl3_BuildRecordPseudoHeader( 12065 header, IS_DTLS(ss) ? cText->seq_num : crSpec->read_seq_num, 12066 rType, isTLS, cText->version, IS_DTLS(ss), decryptedLen); 12067 PORT_Assert(headerLen <= sizeof(header)); 12068 rv = crSpec->aead( 12069 ss->sec.isServer ? &crSpec->client : &crSpec->server, 12070 PR_TRUE, /* do decrypt */ 12071 plaintext->buf, /* out */ 12072 (int*) &plaintext->len, /* outlen */ 12073 plaintext->space, /* maxout */ 12074 cText->buf->buf, /* in */ 12075 cText->buf->len, /* inlen */ 12076 header, headerLen); 12077 if (rv != SECSuccess) { 12078 good = 0; 12079 } 12080 } else { 12081 if (cipher_def->type == type_block && 12082 ((cText->buf->len - ivLen) % cipher_def->block_size) != 0) { 12083 goto decrypt_loser; 12084 } 12085 12086 /* decrypt from cText buf to plaintext. */ 12087 rv = crSpec->decode( 12088 crSpec->decodeContext, plaintext->buf, (int *)&plaintext->len, 12089 plaintext->space, cText->buf->buf + ivLen, cText->buf->len - ivLen); 12090 if (rv != SECSuccess) { 12091 goto decrypt_loser; 12092 } 12093 12094 PRINT_BUF(80, (ss, "cleartext:", plaintext->buf, plaintext->len)); 12095 12096 originalLen = plaintext->len; 12097 12098 /* If it's a block cipher, check and strip the padding. */ 12099 if (cipher_def->type == type_block) { 12100 const unsigned int blockSize = cipher_def->block_size; 12101 const unsigned int macSize = crSpec->mac_size; 12102 12103 if (!isTLS) { 12104 good &= SECStatusToMask(ssl_RemoveSSLv3CBCPadding( 12105 plaintext, blockSize, macSize)); 12106 } else { 12107 good &= SECStatusToMask(ssl_RemoveTLSCBCPadding( 12108 plaintext, macSize)); 12109 } 12110 } 12111 12112 /* compute the MAC */ 12113 headerLen = ssl3_BuildRecordPseudoHeader( 12114 header, IS_DTLS(ss) ? cText->seq_num : crSpec->read_seq_num, 12115 rType, isTLS, cText->version, IS_DTLS(ss), 12116 plaintext->len - crSpec->mac_size); 12117 PORT_Assert(headerLen <= sizeof(header)); 12118 if (cipher_def->type == type_block) { 12119 rv = ssl3_ComputeRecordMACConstantTime( 12120 crSpec, (PRBool)(!ss->sec.isServer), header, headerLen, 12121 plaintext->buf, plaintext->len, originalLen, 12122 hash, &hashBytes); 12123 12124 ssl_CBCExtractMAC(plaintext, originalLen, givenHashBuf, 12125 crSpec->mac_size); 12126 givenHash = givenHashBuf; 12127 12128 /* plaintext->len will always have enough space to remove the MAC 12129 * because in ssl_Remove{SSLv3|TLS}CBCPadding we only adjust 12130 * plaintext->len if the result has enough space for the MAC and we 12131 * tested the unadjusted size against minLength, above. */ 12132 plaintext->len -= crSpec->mac_size; 12133 } else { 12134 /* This is safe because we checked the minLength above. */ 12135 plaintext->len -= crSpec->mac_size; 12136 12137 rv = ssl3_ComputeRecordMAC( 12138 crSpec, (PRBool)(!ss->sec.isServer), header, headerLen, 12139 plaintext->buf, plaintext->len, hash, &hashBytes); 12140 12141 /* We can read the MAC directly from the record because its location 12142 * is public when a stream cipher is used. */ 12143 givenHash = plaintext->buf + plaintext->len; 12144 } 12145 12146 good &= SECStatusToMask(rv); 12147 12148 if (hashBytes != (unsigned)crSpec->mac_size || 12149 NSS_SecureMemcmp(givenHash, hash, crSpec->mac_size) != 0) { 12150 /* We're allowed to leak whether or not the MAC check was correct */ 12151 good = 0; 12152 } 12153 } 12154 12155 if (good == 0) { 12156 decrypt_loser: 12157 /* must not hold spec lock when calling SSL3_SendAlert. */ 12158 ssl_ReleaseSpecReadLock(ss); 12159 12160 SSL_DBG(("%d: SSL3[%d]: decryption failed", SSL_GETPID(), ss->fd)); 12161 12162 if (!IS_DTLS(ss)) { 12163 SSL3_SendAlert(ss, alert_fatal, bad_record_mac); 12164 /* always log mac error, in case attacker can read server logs. */ 12165 PORT_SetError(SSL_ERROR_BAD_MAC_READ); 12166 return SECFailure; 12167 } else { 12168 /* Silently drop the packet */ 12169 databuf->len = 0; /* Needed to ensure data not left around */ 12170 return SECSuccess; 12171 } 12172 } 12173 12174 if (!IS_DTLS(ss)) { 12175 ssl3_BumpSequenceNumber(&crSpec->read_seq_num); 12176 } else { 12177 dtls_RecordSetRecvd(&crSpec->recvdRecords, dtls_seq_num); 12178 } 12179 12180 ssl_ReleaseSpecReadLock(ss); /*****************************************/ 12181 12182 /* 12183 * The decrypted data is now in plaintext. 12184 */ 12185 12186 /* possibly decompress the record. If we aren't using compression then 12187 * plaintext == databuf and so the uncompressed data is already in 12188 * databuf. */ 12189 if (crSpec->decompressor) { 12190 if (databuf->space < plaintext->len + SSL3_COMPRESSION_MAX_EXPANSION) { 12191 rv = sslBuffer_Grow( 12192 databuf, plaintext->len + SSL3_COMPRESSION_MAX_EXPANSION); 12193 if (rv != SECSuccess) { 12194 SSL_DBG(("%d: SSL3[%d]: HandleRecord, tried to get %d bytes", 12195 SSL_GETPID(), ss->fd, 12196 plaintext->len + SSL3_COMPRESSION_MAX_EXPANSION)); 12197 /* sslBuffer_Grow has set a memory error code. */ 12198 /* Perhaps we should send an alert. (but we have no memory!) */ 12199 PORT_Free(plaintext->buf); 12200 return SECFailure; 12201 } 12202 } 12203 12204 rv = crSpec->decompressor(crSpec->decompressContext, 12205 databuf->buf, 12206 (int*) &databuf->len, 12207 databuf->space, 12208 plaintext->buf, 12209 plaintext->len); 12210 12211 if (rv != SECSuccess) { 12212 int err = ssl_MapLowLevelError(SSL_ERROR_DECOMPRESSION_FAILURE); 12213 SSL3_SendAlert(ss, alert_fatal, 12214 isTLS ? decompression_failure : bad_record_mac); 12215 12216 /* There appears to be a bug with (at least) Apache + OpenSSL where 12217 * resumed SSLv3 connections don't actually use compression. See 12218 * comments 93-95 of 12219 * https://bugzilla.mozilla.org/show_bug.cgi?id=275744 12220 * 12221 * So, if we get a decompression error, and the record appears to 12222 * be already uncompressed, then we return a more specific error 12223 * code to hopefully save somebody some debugging time in the 12224 * future. 12225 */ 12226 if (plaintext->len >= 4) { 12227 unsigned int len = ((unsigned int) plaintext->buf[1] << 16) | 12228 ((unsigned int) plaintext->buf[2] << 8) | 12229 (unsigned int) plaintext->buf[3]; 12230 if (len == plaintext->len - 4) { 12231 /* This appears to be uncompressed already */ 12232 err = SSL_ERROR_RX_UNEXPECTED_UNCOMPRESSED_RECORD; 12233 } 12234 } 12235 12236 PORT_Free(plaintext->buf); 12237 PORT_SetError(err); 12238 return SECFailure; 12239 } 12240 12241 PORT_Free(plaintext->buf); 12242 } 12243 12244 /* 12245 ** Having completed the decompression, check the length again. 12246 */ 12247 if (isTLS && databuf->len > (MAX_FRAGMENT_LENGTH + 1024)) { 12248 SSL3_SendAlert(ss, alert_fatal, record_overflow); 12249 PORT_SetError(SSL_ERROR_RX_RECORD_TOO_LONG); 12250 return SECFailure; 12251 } 12252 12253 /* Application data records are processed by the caller of this 12254 ** function, not by this function. 12255 */ 12256 if (rType == content_application_data) { 12257 if (ss->firstHsDone) 12258 return SECSuccess; 12259 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); 12260 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_APPLICATION_DATA); 12261 return SECFailure; 12262 } 12263 12264 /* It's a record that must be handled by ssl itself, not the application. 12265 */ 12266 process_it: 12267 /* XXX Get the xmit lock here. Odds are very high that we'll be xmiting 12268 * data ang getting the xmit lock here prevents deadlocks. 12269 */ 12270 ssl_GetSSL3HandshakeLock(ss); 12271 12272 /* All the functions called in this switch MUST set error code if 12273 ** they return SECFailure or SECWouldBlock. 12274 */ 12275 switch (rType) { 12276 case content_change_cipher_spec: 12277 rv = ssl3_HandleChangeCipherSpecs(ss, databuf); 12278 break; 12279 case content_alert: 12280 rv = ssl3_HandleAlert(ss, databuf); 12281 break; 12282 case content_handshake: 12283 if (!IS_DTLS(ss)) { 12284 rv = ssl3_HandleHandshake(ss, databuf); 12285 } else { 12286 rv = dtls_HandleHandshake(ss, databuf); 12287 } 12288 break; 12289 /* 12290 case content_application_data is handled before this switch 12291 */ 12292 default: 12293 SSL_DBG(("%d: SSL3[%d]: bogus content type=%d", 12294 SSL_GETPID(), ss->fd, cText->type)); 12295 /* XXX Send an alert ??? */ 12296 PORT_SetError(SSL_ERROR_RX_UNKNOWN_RECORD_TYPE); 12297 rv = SECFailure; 12298 break; 12299 } 12300 12301 ssl_ReleaseSSL3HandshakeLock(ss); 12302 return rv; 12303 } 12304 12305 /* 12306 * Initialization functions 12307 */ 12308 12309 /* Called from ssl3_InitState, immediately below. */ 12310 /* Caller must hold the SpecWriteLock. */ 12311 static void 12312 ssl3_InitCipherSpec(sslSocket *ss, ssl3CipherSpec *spec) 12313 { 12314 spec->cipher_def = &bulk_cipher_defs[cipher_null]; 12315 PORT_Assert(spec->cipher_def->cipher == cipher_null); 12316 spec->mac_def = &mac_defs[mac_null]; 12317 PORT_Assert(spec->mac_def->mac == mac_null); 12318 spec->encode = Null_Cipher; 12319 spec->decode = Null_Cipher; 12320 spec->destroy = NULL; 12321 spec->compressor = NULL; 12322 spec->decompressor = NULL; 12323 spec->destroyCompressContext = NULL; 12324 spec->destroyDecompressContext = NULL; 12325 spec->mac_size = 0; 12326 spec->master_secret = NULL; 12327 spec->bypassCiphers = PR_FALSE; 12328 12329 spec->msItem.data = NULL; 12330 spec->msItem.len = 0; 12331 12332 spec->client.write_key = NULL; 12333 spec->client.write_mac_key = NULL; 12334 spec->client.write_mac_context = NULL; 12335 12336 spec->server.write_key = NULL; 12337 spec->server.write_mac_key = NULL; 12338 spec->server.write_mac_context = NULL; 12339 12340 spec->write_seq_num.high = 0; 12341 spec->write_seq_num.low = 0; 12342 12343 spec->read_seq_num.high = 0; 12344 spec->read_seq_num.low = 0; 12345 12346 spec->epoch = 0; 12347 dtls_InitRecvdRecords(&spec->recvdRecords); 12348 12349 spec->version = ss->vrange.max; 12350 } 12351 12352 /* Called from: ssl3_SendRecord 12353 ** ssl3_StartHandshakeHash() <- ssl2_BeginClientHandshake() 12354 ** ssl3_SendClientHello() 12355 ** ssl3_HandleV2ClientHello() 12356 ** ssl3_HandleRecord() 12357 ** 12358 ** This function should perhaps acquire and release the SpecWriteLock. 12359 ** 12360 ** 12361 */ 12362 static SECStatus 12363 ssl3_InitState(sslSocket *ss) 12364 { 12365 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); 12366 12367 if (ss->ssl3.initialized) 12368 return SECSuccess; /* Function should be idempotent */ 12369 12370 ss->ssl3.policy = SSL_ALLOWED; 12371 12372 ssl_GetSpecWriteLock(ss); 12373 ss->ssl3.crSpec = ss->ssl3.cwSpec = &ss->ssl3.specs[0]; 12374 ss->ssl3.prSpec = ss->ssl3.pwSpec = &ss->ssl3.specs[1]; 12375 ss->ssl3.hs.sendingSCSV = PR_FALSE; 12376 ssl3_InitCipherSpec(ss, ss->ssl3.crSpec); 12377 ssl3_InitCipherSpec(ss, ss->ssl3.prSpec); 12378 12379 ss->ssl3.hs.ws = (ss->sec.isServer) ? wait_client_hello : wait_server_hello; 12380 #ifdef NSS_ENABLE_ECC 12381 ss->ssl3.hs.negotiatedECCurves = ssl3_GetSupportedECCurveMask(ss); 12382 #endif 12383 ssl_ReleaseSpecWriteLock(ss); 12384 12385 PORT_Memset(&ss->xtnData, 0, sizeof(TLSExtensionData)); 12386 12387 if (IS_DTLS(ss)) { 12388 ss->ssl3.hs.sendMessageSeq = 0; 12389 ss->ssl3.hs.recvMessageSeq = 0; 12390 ss->ssl3.hs.rtTimeoutMs = INITIAL_DTLS_TIMEOUT_MS; 12391 ss->ssl3.hs.rtRetries = 0; 12392 ss->ssl3.hs.recvdHighWater = -1; 12393 PR_INIT_CLIST(&ss->ssl3.hs.lastMessageFlight); 12394 dtls_SetMTU(ss, 0); /* Set the MTU to the highest plateau */ 12395 } 12396 12397 PORT_Assert(!ss->ssl3.hs.messages.buf && !ss->ssl3.hs.messages.space); 12398 ss->ssl3.hs.messages.buf = NULL; 12399 ss->ssl3.hs.messages.space = 0; 12400 12401 ss->ssl3.hs.receivedNewSessionTicket = PR_FALSE; 12402 PORT_Memset(&ss->ssl3.hs.newSessionTicket, 0, 12403 sizeof(ss->ssl3.hs.newSessionTicket)); 12404 12405 ss->ssl3.initialized = PR_TRUE; 12406 return SECSuccess; 12407 } 12408 12409 /* Returns a reference counted object that contains a key pair. 12410 * Or NULL on failure. Initial ref count is 1. 12411 * Uses the keys in the pair as input. 12412 */ 12413 ssl3KeyPair * 12414 ssl3_NewKeyPair( SECKEYPrivateKey * privKey, SECKEYPublicKey * pubKey) 12415 { 12416 ssl3KeyPair * pair; 12417 12418 if (!privKey || !pubKey) { 12419 PORT_SetError(PR_INVALID_ARGUMENT_ERROR); 12420 return NULL; 12421 } 12422 pair = PORT_ZNew(ssl3KeyPair); 12423 if (!pair) 12424 return NULL; /* error code is set. */ 12425 pair->refCount = 1; 12426 pair->privKey = privKey; 12427 pair->pubKey = pubKey; 12428 return pair; /* success */ 12429 } 12430 12431 ssl3KeyPair * 12432 ssl3_GetKeyPairRef(ssl3KeyPair * keyPair) 12433 { 12434 PR_ATOMIC_INCREMENT(&keyPair->refCount); 12435 return keyPair; 12436 } 12437 12438 void 12439 ssl3_FreeKeyPair(ssl3KeyPair * keyPair) 12440 { 12441 PRInt32 newCount = PR_ATOMIC_DECREMENT(&keyPair->refCount); 12442 if (!newCount) { 12443 if (keyPair->privKey) 12444 SECKEY_DestroyPrivateKey(keyPair->privKey); 12445 if (keyPair->pubKey) 12446 SECKEY_DestroyPublicKey( keyPair->pubKey); 12447 PORT_Free(keyPair); 12448 } 12449 } 12450 12451 12452 12453 /* 12454 * Creates the public and private RSA keys for SSL Step down. 12455 * Called from SSL_ConfigSecureServer in sslsecur.c 12456 */ 12457 SECStatus 12458 ssl3_CreateRSAStepDownKeys(sslSocket *ss) 12459 { 12460 SECStatus rv = SECSuccess; 12461 SECKEYPrivateKey * privKey; /* RSA step down key */ 12462 SECKEYPublicKey * pubKey; /* RSA step down key */ 12463 12464 if (ss->stepDownKeyPair) 12465 ssl3_FreeKeyPair(ss->stepDownKeyPair); 12466 ss->stepDownKeyPair = NULL; 12467 #ifndef HACKED_EXPORT_SERVER 12468 /* Sigh, should have a get key strength call for private keys */ 12469 if (PK11_GetPrivateModulusLen(ss->serverCerts[kt_rsa].SERVERKEY) > 12470 EXPORT_RSA_KEY_LENGTH) { 12471 /* need to ask for the key size in bits */ 12472 privKey = SECKEY_CreateRSAPrivateKey(EXPORT_RSA_KEY_LENGTH * BPB, 12473 &pubKey, NULL); 12474 if (!privKey || !pubKey || 12475 !(ss->stepDownKeyPair = ssl3_NewKeyPair(privKey, pubKey))) { 12476 ssl_MapLowLevelError(SEC_ERROR_KEYGEN_FAIL); 12477 rv = SECFailure; 12478 } 12479 } 12480 #endif 12481 return rv; 12482 } 12483 12484 12485 /* record the export policy for this cipher suite */ 12486 SECStatus 12487 ssl3_SetPolicy(ssl3CipherSuite which, int policy) 12488 { 12489 ssl3CipherSuiteCfg *suite; 12490 12491 suite = ssl_LookupCipherSuiteCfg(which, cipherSuites); 12492 if (suite == NULL) { 12493 return SECFailure; /* err code was set by ssl_LookupCipherSuiteCfg */ 12494 } 12495 suite->policy = policy; 12496 12497 return SECSuccess; 12498 } 12499 12500 SECStatus 12501 ssl3_GetPolicy(ssl3CipherSuite which, PRInt32 *oPolicy) 12502 { 12503 ssl3CipherSuiteCfg *suite; 12504 PRInt32 policy; 12505 SECStatus rv; 12506 12507 suite = ssl_LookupCipherSuiteCfg(which, cipherSuites); 12508 if (suite) { 12509 policy = suite->policy; 12510 rv = SECSuccess; 12511 } else { 12512 policy = SSL_NOT_ALLOWED; 12513 rv = SECFailure; /* err code was set by Lookup. */ 12514 } 12515 *oPolicy = policy; 12516 return rv; 12517 } 12518 12519 /* record the user preference for this suite */ 12520 SECStatus 12521 ssl3_CipherPrefSetDefault(ssl3CipherSuite which, PRBool enabled) 12522 { 12523 ssl3CipherSuiteCfg *suite; 12524 12525 suite = ssl_LookupCipherSuiteCfg(which, cipherSuites); 12526 if (suite == NULL) { 12527 return SECFailure; /* err code was set by ssl_LookupCipherSuiteCfg */ 12528 } 12529 suite->enabled = enabled; 12530 return SECSuccess; 12531 } 12532 12533 /* return the user preference for this suite */ 12534 SECStatus 12535 ssl3_CipherPrefGetDefault(ssl3CipherSuite which, PRBool *enabled) 12536 { 12537 ssl3CipherSuiteCfg *suite; 12538 PRBool pref; 12539 SECStatus rv; 12540 12541 suite = ssl_LookupCipherSuiteCfg(which, cipherSuites); 12542 if (suite) { 12543 pref = suite->enabled; 12544 rv = SECSuccess; 12545 } else { 12546 pref = SSL_NOT_ALLOWED; 12547 rv = SECFailure; /* err code was set by Lookup. */ 12548 } 12549 *enabled = pref; 12550 return rv; 12551 } 12552 12553 SECStatus 12554 ssl3_CipherPrefSet(sslSocket *ss, ssl3CipherSuite which, PRBool enabled) 12555 { 12556 ssl3CipherSuiteCfg *suite; 12557 12558 suite = ssl_LookupCipherSuiteCfg(which, ss->cipherSuites); 12559 if (suite == NULL) { 12560 return SECFailure; /* err code was set by ssl_LookupCipherSuiteCfg */ 12561 } 12562 suite->enabled = enabled; 12563 return SECSuccess; 12564 } 12565 12566 SECStatus 12567 ssl3_CipherPrefGet(sslSocket *ss, ssl3CipherSuite which, PRBool *enabled) 12568 { 12569 ssl3CipherSuiteCfg *suite; 12570 PRBool pref; 12571 SECStatus rv; 12572 12573 suite = ssl_LookupCipherSuiteCfg(which, ss->cipherSuites); 12574 if (suite) { 12575 pref = suite->enabled; 12576 rv = SECSuccess; 12577 } else { 12578 pref = SSL_NOT_ALLOWED; 12579 rv = SECFailure; /* err code was set by Lookup. */ 12580 } 12581 *enabled = pref; 12582 return rv; 12583 } 12584 12585 SECStatus 12586 ssl3_CipherOrderSet(sslSocket *ss, const ssl3CipherSuite *ciphers, unsigned int len) 12587 { 12588 /* |i| iterates over |ciphers| while |done| and |j| iterate over 12589 * |ss->cipherSuites|. */ 12590 unsigned int i, done; 12591 12592 for (i = done = 0; i < len; i++) { 12593 PRUint16 id = ciphers[i]; 12594 unsigned int existingIndex, j; 12595 PRBool found = PR_FALSE; 12596 12597 for (j = done; j < ssl_V3_SUITES_IMPLEMENTED; j++) { 12598 if (ss->cipherSuites[j].cipher_suite == id) { 12599 existingIndex = j; 12600 found = PR_TRUE; 12601 break; 12602 } 12603 } 12604 12605 if (!found) { 12606 continue; 12607 } 12608 12609 if (existingIndex != done) { 12610 const ssl3CipherSuiteCfg temp = ss->cipherSuites[done]; 12611 ss->cipherSuites[done] = ss->cipherSuites[existingIndex]; 12612 ss->cipherSuites[existingIndex] = temp; 12613 } 12614 done++; 12615 } 12616 12617 /* Disable all cipher suites that weren't included. */ 12618 for (; done < ssl_V3_SUITES_IMPLEMENTED; done++) { 12619 ss->cipherSuites[done].enabled = 0; 12620 } 12621 12622 return SECSuccess; 12623 } 12624 12625 /* copy global default policy into socket. */ 12626 void 12627 ssl3_InitSocketPolicy(sslSocket *ss) 12628 { 12629 PORT_Memcpy(ss->cipherSuites, cipherSuites, sizeof cipherSuites); 12630 } 12631 12632 SECStatus 12633 ssl3_GetTLSUniqueChannelBinding(sslSocket *ss, 12634 unsigned char *out, 12635 unsigned int *outLen, 12636 unsigned int outLenMax) { 12637 PRBool isTLS; 12638 int index = 0; 12639 unsigned int len; 12640 SECStatus rv = SECFailure; 12641 12642 *outLen = 0; 12643 12644 ssl_GetSSL3HandshakeLock(ss); 12645 12646 ssl_GetSpecReadLock(ss); 12647 isTLS = (PRBool)(ss->ssl3.cwSpec->version > SSL_LIBRARY_VERSION_3_0); 12648 ssl_ReleaseSpecReadLock(ss); 12649 12650 /* The tls-unique channel binding is the first Finished structure in the 12651 * handshake. In the case of a resumption, that's the server's Finished. 12652 * Otherwise, it's the client's Finished. */ 12653 len = ss->ssl3.hs.finishedBytes; 12654 12655 /* Sending or receiving a Finished message will set finishedBytes to a 12656 * non-zero value. */ 12657 if (len == 0) { 12658 PORT_SetError(SSL_ERROR_HANDSHAKE_NOT_COMPLETED); 12659 goto loser; 12660 } 12661 12662 /* If we are in the middle of a renegotiation then the channel binding 12663 * value is poorly defined and depends on the direction that it will be 12664 * used on. Therefore we simply return an error in this case. */ 12665 if (ss->firstHsDone && ss->ssl3.hs.ws != idle_handshake) { 12666 PORT_SetError(SSL_ERROR_RENEGOTIATION_NOT_ALLOWED); 12667 goto loser; 12668 } 12669 12670 /* If resuming, then we want the second Finished value in the array, which 12671 * is the server's */ 12672 if (ss->ssl3.hs.isResuming) 12673 index = 1; 12674 12675 *outLen = len; 12676 if (outLenMax < len) { 12677 PORT_SetError(SEC_ERROR_OUTPUT_LEN); 12678 goto loser; 12679 } 12680 12681 if (isTLS) { 12682 memcpy(out, &ss->ssl3.hs.finishedMsgs.tFinished[index], len); 12683 } else { 12684 memcpy(out, &ss->ssl3.hs.finishedMsgs.sFinished[index], len); 12685 } 12686 12687 rv = SECSuccess; 12688 12689 loser: 12690 ssl_ReleaseSSL3HandshakeLock(ss); 12691 return rv; 12692 } 12693 12694 /* ssl3_config_match_init must have already been called by 12695 * the caller of this function. 12696 */ 12697 SECStatus 12698 ssl3_ConstructV2CipherSpecsHack(sslSocket *ss, unsigned char *cs, int *size) 12699 { 12700 int i, count = 0; 12701 12702 PORT_Assert(ss != 0); 12703 if (!ss) { 12704 PORT_SetError(PR_INVALID_ARGUMENT_ERROR); 12705 return SECFailure; 12706 } 12707 if (SSL3_ALL_VERSIONS_DISABLED(&ss->vrange)) { 12708 *size = 0; 12709 return SECSuccess; 12710 } 12711 if (cs == NULL) { 12712 *size = count_cipher_suites(ss, SSL_ALLOWED, PR_TRUE); 12713 return SECSuccess; 12714 } 12715 12716 /* ssl3_config_match_init was called by the caller of this function. */ 12717 for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) { 12718 ssl3CipherSuiteCfg *suite = &ss->cipherSuites[i]; 12719 if (config_match(suite, SSL_ALLOWED, PR_TRUE, &ss->vrange)) { 12720 if (cs != NULL) { 12721 *cs++ = 0x00; 12722 *cs++ = (suite->cipher_suite >> 8) & 0xFF; 12723 *cs++ = suite->cipher_suite & 0xFF; 12724 } 12725 count++; 12726 } 12727 } 12728 *size = count; 12729 return SECSuccess; 12730 } 12731 12732 /* 12733 ** If ssl3 socket has completed the first handshake, and is in idle state, 12734 ** then start a new handshake. 12735 ** If flushCache is true, the SID cache will be flushed first, forcing a 12736 ** "Full" handshake (not a session restart handshake), to be done. 12737 ** 12738 ** called from SSL_RedoHandshake(), which already holds the handshake locks. 12739 */ 12740 SECStatus 12741 ssl3_RedoHandshake(sslSocket *ss, PRBool flushCache) 12742 { 12743 sslSessionID * sid = ss->sec.ci.sid; 12744 SECStatus rv; 12745 12746 PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) ); 12747 12748 if (!ss->firstHsDone || 12749 ((ss->version >= SSL_LIBRARY_VERSION_3_0) && 12750 ss->ssl3.initialized && 12751 (ss->ssl3.hs.ws != idle_handshake))) { 12752 PORT_SetError(SSL_ERROR_HANDSHAKE_NOT_COMPLETED); 12753 return SECFailure; 12754 } 12755 12756 if (IS_DTLS(ss)) { 12757 dtls_RehandshakeCleanup(ss); 12758 } 12759 12760 if (ss->opt.enableRenegotiation == SSL_RENEGOTIATE_NEVER) { 12761 PORT_SetError(SSL_ERROR_RENEGOTIATION_NOT_ALLOWED); 12762 return SECFailure; 12763 } 12764 if (sid && flushCache) { 12765 if (ss->sec.uncache) 12766 ss->sec.uncache(sid); /* remove it from whichever cache it's in. */ 12767 ssl_FreeSID(sid); /* dec ref count and free if zero. */ 12768 ss->sec.ci.sid = NULL; 12769 } 12770 12771 ssl_GetXmitBufLock(ss); /**************************************/ 12772 12773 /* start off a new handshake. */ 12774 rv = (ss->sec.isServer) ? ssl3_SendHelloRequest(ss) 12775 : ssl3_SendClientHello(ss, PR_FALSE); 12776 12777 ssl_ReleaseXmitBufLock(ss); /**************************************/ 12778 return rv; 12779 } 12780 12781 /* Called from ssl_DestroySocketContents() in sslsock.c */ 12782 void 12783 ssl3_DestroySSL3Info(sslSocket *ss) 12784 { 12785 12786 if (ss->ssl3.clientCertificate != NULL) 12787 CERT_DestroyCertificate(ss->ssl3.clientCertificate); 12788 12789 if (ss->ssl3.clientPrivateKey != NULL) 12790 SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); 12791 #ifdef NSS_PLATFORM_CLIENT_AUTH 12792 if (ss->ssl3.platformClientKey) 12793 ssl_FreePlatformKey(ss->ssl3.platformClientKey); 12794 #endif /* NSS_PLATFORM_CLIENT_AUTH */ 12795 12796 if (ss->ssl3.channelID) 12797 SECKEY_DestroyPrivateKey(ss->ssl3.channelID); 12798 if (ss->ssl3.channelIDPub) 12799 SECKEY_DestroyPublicKey(ss->ssl3.channelIDPub); 12800 12801 if (ss->ssl3.peerCertArena != NULL) 12802 ssl3_CleanupPeerCerts(ss); 12803 12804 if (ss->ssl3.clientCertChain != NULL) { 12805 CERT_DestroyCertificateList(ss->ssl3.clientCertChain); 12806 ss->ssl3.clientCertChain = NULL; 12807 } 12808 12809 /* clean up handshake */ 12810 #ifndef NO_PKCS11_BYPASS 12811 if (ss->opt.bypassPKCS11) { 12812 if (ss->ssl3.hs.hashType == handshake_hash_combo) { 12813 SHA1_DestroyContext((SHA1Context *)ss->ssl3.hs.sha_cx, PR_FALSE); 12814 MD5_DestroyContext((MD5Context *)ss->ssl3.hs.md5_cx, PR_FALSE); 12815 } else if (ss->ssl3.hs.hashType == handshake_hash_single) { 12816 ss->ssl3.hs.sha_obj->destroy(ss->ssl3.hs.sha_cx, PR_FALSE); 12817 } 12818 } 12819 #endif 12820 if (ss->ssl3.hs.md5) { 12821 PK11_DestroyContext(ss->ssl3.hs.md5,PR_TRUE); 12822 } 12823 if (ss->ssl3.hs.sha) { 12824 PK11_DestroyContext(ss->ssl3.hs.sha,PR_TRUE); 12825 } 12826 if (ss->ssl3.hs.clientSigAndHash) { 12827 PORT_Free(ss->ssl3.hs.clientSigAndHash); 12828 } 12829 if (ss->ssl3.hs.messages.buf) { 12830 PORT_Free(ss->ssl3.hs.messages.buf); 12831 ss->ssl3.hs.messages.buf = NULL; 12832 ss->ssl3.hs.messages.len = 0; 12833 ss->ssl3.hs.messages.space = 0; 12834 } 12835 12836 /* free the SSL3Buffer (msg_body) */ 12837 PORT_Free(ss->ssl3.hs.msg_body.buf); 12838 12839 SECITEM_FreeItem(&ss->ssl3.hs.newSessionTicket.ticket, PR_FALSE); 12840 12841 /* free up the CipherSpecs */ 12842 ssl3_DestroyCipherSpec(&ss->ssl3.specs[0], PR_TRUE/*freeSrvName*/); 12843 ssl3_DestroyCipherSpec(&ss->ssl3.specs[1], PR_TRUE/*freeSrvName*/); 12844 12845 /* Destroy the DTLS data */ 12846 if (IS_DTLS(ss)) { 12847 dtls_FreeHandshakeMessages(&ss->ssl3.hs.lastMessageFlight); 12848 if (ss->ssl3.hs.recvdFragments.buf) { 12849 PORT_Free(ss->ssl3.hs.recvdFragments.buf); 12850 } 12851 } 12852 12853 ss->ssl3.initialized = PR_FALSE; 12854 12855 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE); 12856 } 12857 12858 /* End of ssl3con.c */ 12859