| OLD | NEW |
| (Empty) |
| 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 #include "nss.h" | |
| 28 #include "nssoptions.h" | |
| 29 | |
| 30 #include "pk11func.h" | |
| 31 #include "secmod.h" | |
| 32 #ifndef NO_PKCS11_BYPASS | |
| 33 #include "blapi.h" | |
| 34 #endif | |
| 35 | |
| 36 #include <stdio.h> | |
| 37 #ifdef NSS_SSL_ENABLE_ZLIB | |
| 38 #include "zlib.h" | |
| 39 #endif | |
| 40 | |
| 41 #ifndef PK11_SETATTRS | |
| 42 #define PK11_SETATTRS(x, id, v, l) \ | |
| 43 (x)->type = (id); \ | |
| 44 (x)->pValue = (v); \ | |
| 45 (x)->ulValueLen = (l); | |
| 46 #endif | |
| 47 | |
| 48 static SECStatus ssl3_AuthCertificate(sslSocket *ss); | |
| 49 static void ssl3_CleanupPeerCerts(sslSocket *ss); | |
| 50 static void ssl3_CopyPeerCertsFromSID(sslSocket *ss, sslSessionID *sid); | |
| 51 static PK11SymKey *ssl3_GenerateRSAPMS(sslSocket *ss, ssl3CipherSpec *spec, | |
| 52 PK11SlotInfo *serverKeySlot); | |
| 53 static SECStatus ssl3_DeriveMasterSecret(sslSocket *ss, PK11SymKey *pms); | |
| 54 static SECStatus ssl3_DeriveConnectionKeysPKCS11(sslSocket *ss); | |
| 55 static SECStatus ssl3_HandshakeFailure(sslSocket *ss); | |
| 56 static SECStatus ssl3_InitState(sslSocket *ss); | |
| 57 | |
| 58 static SECStatus ssl3_SendCertificateRequest(sslSocket *ss); | |
| 59 static SECStatus ssl3_SendNextProto(sslSocket *ss); | |
| 60 static SECStatus ssl3_SendChannelIDEncryptedExtensions(sslSocket *ss); | |
| 61 static SECStatus ssl3_SendFinished(sslSocket *ss, PRInt32 flags); | |
| 62 static SECStatus ssl3_SendServerHelloDone(sslSocket *ss); | |
| 63 static SECStatus ssl3_SendServerKeyExchange(sslSocket *ss); | |
| 64 static SECStatus ssl3_UpdateHandshakeHashes(sslSocket *ss, | |
| 65 const unsigned char *b, | |
| 66 unsigned int l); | |
| 67 static SECStatus ssl3_HandlePostHelloHandshakeMessage(sslSocket *ss, | |
| 68 SSL3Opaque *b, | |
| 69 PRUint32 length, | |
| 70 SSL3Hashes *hashesPtr); | |
| 71 static SECStatus ssl3_FlushHandshakeMessages(sslSocket *ss, PRInt32 flags); | |
| 72 | |
| 73 static SECStatus Null_Cipher(void *ctx, unsigned char *output, int *outputLen, | |
| 74 int maxOutputLen, const unsigned char *input, | |
| 75 int inputLen); | |
| 76 #ifndef NO_PKCS11_BYPASS | |
| 77 static SECStatus ssl3_AESGCMBypass(ssl3KeyMaterial *keys, PRBool doDecrypt, | |
| 78 unsigned char *out, int *outlen, int maxout, | |
| 79 const unsigned char *in, int inlen, | |
| 80 const unsigned char *additionalData, | |
| 81 int additionalDataLen); | |
| 82 #endif | |
| 83 | |
| 84 #define MAX_SEND_BUF_LENGTH 32000 /* watch for 16-bit integer overflow */ | |
| 85 #define MIN_SEND_BUF_LENGTH 4000 | |
| 86 | |
| 87 /* This list of SSL3 cipher suites is sorted in descending order of | |
| 88 * precedence (desirability). It only includes cipher suites we implement. | |
| 89 * This table is modified by SSL3_SetPolicy(). The ordering of cipher suites | |
| 90 * in this table must match the ordering in SSL_ImplementedCiphers (sslenum.c) | |
| 91 * | |
| 92 * Important: See bug 946147 before enabling, reordering, or adding any cipher | |
| 93 * suites to this list. | |
| 94 */ | |
| 95 /* clang-format off */ | |
| 96 static ssl3CipherSuiteCfg cipherSuites[ssl_V3_SUITES_IMPLEMENTED] = { | |
| 97 /* cipher_suite policy enabled isPresent */ | |
| 98 | |
| 99 #ifndef NSS_DISABLE_ECC | |
| 100 { TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 101 { TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 102 { TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE
}, | |
| 103 { TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE
}, | |
| 104 /* TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA is out of order to work around | |
| 105 * bug 946147. | |
| 106 */ | |
| 107 { TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 108 { TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 109 { TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 110 { TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 111 { TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 112 { TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 113 { TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 114 { TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 115 { TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 116 { TLS_ECDHE_RSA_WITH_RC4_128_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 117 #endif /* NSS_DISABLE_ECC */ | |
| 118 | |
| 119 { TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 120 { TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256,SSL_ALLOWED,PR_TRUE, PR_FALSE}, | |
| 121 { TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 122 { TLS_DHE_RSA_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 123 { TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 124 { TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 125 { TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 126 { TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 127 { TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 128 { TLS_DHE_RSA_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 129 { TLS_DHE_DSS_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 130 { TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 131 { TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 132 { TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 133 { TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 134 { TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 135 { TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 136 { TLS_DHE_DSS_WITH_RC4_128_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 137 | |
| 138 #ifndef NSS_DISABLE_ECC | |
| 139 { TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 140 { TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 141 { TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 142 { TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 143 { TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 144 { TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 145 { TLS_ECDH_ECDSA_WITH_RC4_128_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 146 { TLS_ECDH_RSA_WITH_RC4_128_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 147 #endif /* NSS_DISABLE_ECC */ | |
| 148 | |
| 149 /* RSA */ | |
| 150 { TLS_RSA_WITH_AES_128_GCM_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 151 { TLS_RSA_WITH_AES_128_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 152 { TLS_RSA_WITH_AES_128_CBC_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 153 { TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 154 { TLS_RSA_WITH_AES_256_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 155 { TLS_RSA_WITH_AES_256_CBC_SHA256, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 156 { TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 157 { TLS_RSA_WITH_SEED_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 158 { SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 159 { TLS_RSA_WITH_3DES_EDE_CBC_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 160 { TLS_RSA_WITH_RC4_128_SHA, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 161 { TLS_RSA_WITH_RC4_128_MD5, SSL_ALLOWED, PR_TRUE, PR_FALSE}, | |
| 162 | |
| 163 /* 56-bit DES "domestic" cipher suites */ | |
| 164 { TLS_DHE_RSA_WITH_DES_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 165 { TLS_DHE_DSS_WITH_DES_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 166 { SSL_RSA_FIPS_WITH_DES_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 167 { TLS_RSA_WITH_DES_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 168 | |
| 169 /* export ciphersuites with 1024-bit public key exchange keys */ | |
| 170 { TLS_RSA_EXPORT1024_WITH_RC4_56_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 171 { TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 172 | |
| 173 /* export ciphersuites with 512-bit public key exchange keys */ | |
| 174 { TLS_RSA_EXPORT_WITH_RC4_40_MD5, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 175 { TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 176 | |
| 177 /* ciphersuites with no encryption */ | |
| 178 #ifndef NSS_DISABLE_ECC | |
| 179 { TLS_ECDHE_ECDSA_WITH_NULL_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 180 { TLS_ECDHE_RSA_WITH_NULL_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 181 { TLS_ECDH_RSA_WITH_NULL_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 182 { TLS_ECDH_ECDSA_WITH_NULL_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 183 #endif /* NSS_DISABLE_ECC */ | |
| 184 { TLS_RSA_WITH_NULL_SHA, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 185 { TLS_RSA_WITH_NULL_SHA256, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 186 { TLS_RSA_WITH_NULL_MD5, SSL_ALLOWED, PR_FALSE, PR_FALSE}, | |
| 187 }; | |
| 188 /* clang-format on */ | |
| 189 | |
| 190 static const SSLSignatureAndHashAlg defaultSignatureAlgorithms[] = { | |
| 191 { ssl_hash_sha256, ssl_sign_rsa }, | |
| 192 { ssl_hash_sha384, ssl_sign_rsa }, | |
| 193 { ssl_hash_sha512, ssl_sign_rsa }, | |
| 194 { ssl_hash_sha1, ssl_sign_rsa }, | |
| 195 #ifndef NSS_DISABLE_ECC | |
| 196 { ssl_hash_sha256, ssl_sign_ecdsa }, | |
| 197 { ssl_hash_sha384, ssl_sign_ecdsa }, | |
| 198 { ssl_hash_sha512, ssl_sign_ecdsa }, | |
| 199 { ssl_hash_sha1, ssl_sign_ecdsa }, | |
| 200 #endif | |
| 201 { ssl_hash_sha256, ssl_sign_dsa }, | |
| 202 { ssl_hash_sha1, ssl_sign_dsa } | |
| 203 }; | |
| 204 PR_STATIC_ASSERT(PR_ARRAY_SIZE(defaultSignatureAlgorithms) <= | |
| 205 MAX_SIGNATURE_ALGORITHMS); | |
| 206 | |
| 207 /* Verify that SSL_ImplementedCiphers and cipherSuites are in consistent order. | |
| 208 */ | |
| 209 #ifdef DEBUG | |
| 210 void | |
| 211 ssl3_CheckCipherSuiteOrderConsistency() | |
| 212 { | |
| 213 unsigned int i; | |
| 214 | |
| 215 /* Note that SSL_ImplementedCiphers has more elements than cipherSuites | |
| 216 * because it SSL_ImplementedCiphers includes SSL 2.0 cipher suites. | |
| 217 */ | |
| 218 PORT_Assert(SSL_NumImplementedCiphers >= PR_ARRAY_SIZE(cipherSuites)); | |
| 219 | |
| 220 for (i = 0; i < PR_ARRAY_SIZE(cipherSuites); ++i) { | |
| 221 PORT_Assert(SSL_ImplementedCiphers[i] == cipherSuites[i].cipher_suite); | |
| 222 } | |
| 223 } | |
| 224 #endif | |
| 225 | |
| 226 /* This list of SSL3 compression methods is sorted in descending order of | |
| 227 * precedence (desirability). It only includes compression methods we | |
| 228 * implement. | |
| 229 */ | |
| 230 static const /*SSLCompressionMethod*/ PRUint8 compressions[] = { | |
| 231 #ifdef NSS_SSL_ENABLE_ZLIB | |
| 232 ssl_compression_deflate, | |
| 233 #endif | |
| 234 ssl_compression_null | |
| 235 }; | |
| 236 | |
| 237 static const int compressionMethodsCount = | |
| 238 sizeof(compressions) / sizeof(compressions[0]); | |
| 239 | |
| 240 /* compressionEnabled returns true iff the compression algorithm is enabled | |
| 241 * for the given SSL socket. */ | |
| 242 static PRBool | |
| 243 compressionEnabled(sslSocket *ss, SSLCompressionMethod compression) | |
| 244 { | |
| 245 switch (compression) { | |
| 246 case ssl_compression_null: | |
| 247 return PR_TRUE; /* Always enabled */ | |
| 248 #ifdef NSS_SSL_ENABLE_ZLIB | |
| 249 case ssl_compression_deflate: | |
| 250 if (ss->version < SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 251 return ss->opt.enableDeflate; | |
| 252 } | |
| 253 return PR_FALSE; | |
| 254 #endif | |
| 255 default: | |
| 256 return PR_FALSE; | |
| 257 } | |
| 258 } | |
| 259 | |
| 260 static const /*SSL3ClientCertificateType */ PRUint8 certificate_types[] = { | |
| 261 ct_RSA_sign, | |
| 262 #ifndef NSS_DISABLE_ECC | |
| 263 ct_ECDSA_sign, | |
| 264 #endif /* NSS_DISABLE_ECC */ | |
| 265 ct_DSS_sign, | |
| 266 }; | |
| 267 | |
| 268 #define EXPORT_RSA_KEY_LENGTH 64 /* bytes */ | |
| 269 | |
| 270 /* This global item is used only in servers. It is is initialized by | |
| 271 ** SSL_ConfigSecureServer(), and is used in ssl3_SendCertificateRequest(). | |
| 272 */ | |
| 273 CERTDistNames *ssl3_server_ca_list = NULL; | |
| 274 static SSL3Statistics ssl3stats; | |
| 275 | |
| 276 /* indexed by SSL3BulkCipher */ | |
| 277 /* clang-format off */ | |
| 278 static const ssl3BulkCipherDef bulk_cipher_defs[] = { | |
| 279 /* |--------- Lengths --------| */ | |
| 280 /* cipher calg k s type i b t n o */ | |
| 281 /* e e v l a o i */ | |
| 282 /* y c | o g n d */ | |
| 283 /* | r | c | c | */ | |
| 284 /* | e | k | e | */ | |
| 285 /* | t | | | | | */ | |
| 286 {cipher_null, calg_null, 0, 0, type_stream, 0, 0, 0, 0, SEC_
OID_NULL_CIPHER}, | |
| 287 {cipher_rc4, calg_rc4, 16,16, type_stream, 0, 0, 0, 0, SEC_
OID_RC4}, | |
| 288 {cipher_rc4_40, calg_rc4, 16, 5, type_stream, 0, 0, 0, 0, SEC_
OID_RC4_40}, | |
| 289 {cipher_rc4_56, calg_rc4, 16, 7, type_stream, 0, 0, 0, 0, SEC_
OID_RC4_56}, | |
| 290 {cipher_rc2, calg_rc2, 16,16, type_block, 8, 8, 0, 0, SEC_
OID_RC2_CBC}, | |
| 291 {cipher_rc2_40, calg_rc2, 16, 5, type_block, 8, 8, 0, 0, SEC_
OID_RC2_40_CBC}, | |
| 292 {cipher_des, calg_des, 8, 8, type_block, 8, 8, 0, 0, SEC_
OID_DES_CBC}, | |
| 293 {cipher_3des, calg_3des, 24,24, type_block, 8, 8, 0, 0, SEC_
OID_DES_EDE3_CBC}, | |
| 294 {cipher_des40, calg_des, 8, 5, type_block, 8, 8, 0, 0, SEC_
OID_DES_40_CBC}, | |
| 295 {cipher_idea, calg_idea, 16,16, type_block, 8, 8, 0, 0, SEC_
OID_IDEA_CBC}, | |
| 296 {cipher_aes_128, calg_aes, 16,16, type_block, 16,16, 0, 0, SEC_
OID_AES_128_CBC}, | |
| 297 {cipher_aes_256, calg_aes, 32,32, type_block, 16,16, 0, 0, SEC_
OID_AES_256_CBC}, | |
| 298 {cipher_camellia_128, calg_camellia, 16,16, type_block, 16,16, 0, 0, SEC_
OID_CAMELLIA_128_CBC}, | |
| 299 {cipher_camellia_256, calg_camellia, 32,32, type_block, 16,16, 0, 0, SEC_
OID_CAMELLIA_256_CBC}, | |
| 300 {cipher_seed, calg_seed, 16,16, type_block, 16,16, 0, 0, SEC_
OID_SEED_CBC}, | |
| 301 {cipher_aes_128_gcm, calg_aes_gcm, 16,16, type_aead, 4, 0,16, 8, SEC_
OID_AES_128_GCM}, | |
| 302 {cipher_chacha20, calg_chacha20, 32,32, type_aead, 12, 0,16, 0, SEC_
OID_CHACHA20_POLY1305}, | |
| 303 {cipher_missing, calg_null, 0, 0, type_stream, 0, 0, 0, 0, 0}, | |
| 304 }; | |
| 305 | |
| 306 static const ssl3KEADef kea_defs[] = | |
| 307 { /* indexed by SSL3KeyExchangeAlgorithm */ | |
| 308 /* kea exchKeyType signKeyType is_limited limit tls_keygen epheme
ral oid */ | |
| 309 {kea_null, kt_null, ssl_sign_null, PR_FALSE, 0, PR_FALSE, PR_FA
LSE, 0}, | |
| 310 {kea_rsa, kt_rsa, ssl_sign_rsa, PR_FALSE, 0, PR_FALSE, PR_FA
LSE, SEC_OID_TLS_RSA}, | |
| 311 {kea_rsa_export, kt_rsa, ssl_sign_rsa, PR_TRUE, 512, PR_FALSE, PR_FA
LSE, SEC_OID_TLS_RSA_EXPORT}, | |
| 312 {kea_rsa_export_1024,kt_rsa, ssl_sign_rsa, PR_TRUE, 1024, PR_FALSE, PR_FA
LSE, SEC_OID_TLS_RSA_EXPORT}, | |
| 313 {kea_dh_dss, kt_dh, ssl_sign_dsa, PR_FALSE, 0, PR_FALSE, PR_FA
LSE, SEC_OID_TLS_DH_DSS}, | |
| 314 {kea_dh_dss_export, kt_dh, ssl_sign_dsa, PR_TRUE, 512, PR_FALSE, PR_FA
LSE, SEC_OID_TLS_DH_DSS_EXPORT}, | |
| 315 {kea_dh_rsa, kt_dh, ssl_sign_rsa, PR_FALSE, 0, PR_FALSE, PR_FA
LSE, SEC_OID_TLS_DH_RSA}, | |
| 316 {kea_dh_rsa_export, kt_dh, ssl_sign_rsa, PR_TRUE, 512, PR_FALSE, PR_FA
LSE, SEC_OID_TLS_DH_RSA_EXPORT}, | |
| 317 {kea_dhe_dss, kt_dh, ssl_sign_dsa, PR_FALSE, 0, PR_FALSE, PR_TR
UE, SEC_OID_TLS_DHE_DSS}, | |
| 318 {kea_dhe_dss_export, kt_dh, ssl_sign_dsa, PR_TRUE, 512, PR_FALSE, PR_TR
UE, SEC_OID_TLS_DHE_DSS_EXPORT}, | |
| 319 {kea_dhe_rsa, kt_dh, ssl_sign_rsa, PR_FALSE, 0, PR_FALSE, PR_TR
UE, SEC_OID_TLS_DHE_RSA}, | |
| 320 {kea_dhe_rsa_export, kt_dh, ssl_sign_rsa, PR_TRUE, 512, PR_FALSE, PR_TR
UE, SEC_OID_TLS_DHE_RSA_EXPORT}, | |
| 321 {kea_dh_anon, kt_dh, ssl_sign_null, PR_FALSE, 0, PR_FALSE, PR_TR
UE, SEC_OID_TLS_DH_ANON}, | |
| 322 {kea_dh_anon_export, kt_dh, ssl_sign_null, PR_TRUE, 512, PR_FALSE, PR_TR
UE, SEC_OID_TLS_DH_ANON_EXPORT}, | |
| 323 {kea_rsa_fips, kt_rsa, ssl_sign_rsa, PR_FALSE, 0, PR_TRUE, PR_FA
LSE, SEC_OID_TLS_RSA}, | |
| 324 #ifndef NSS_DISABLE_ECC | |
| 325 {kea_ecdh_ecdsa, kt_ecdh, ssl_sign_ecdsa, PR_FALSE, 0, PR_FALSE, PR_FA
LSE, SEC_OID_TLS_ECDH_ECDSA}, | |
| 326 {kea_ecdhe_ecdsa, kt_ecdh, ssl_sign_ecdsa, PR_FALSE, 0, PR_FALSE, PR_TR
UE, SEC_OID_TLS_ECDHE_ECDSA}, | |
| 327 {kea_ecdh_rsa, kt_ecdh, ssl_sign_rsa, PR_FALSE, 0, PR_FALSE, PR_FA
LSE, SEC_OID_TLS_ECDH_RSA}, | |
| 328 {kea_ecdhe_rsa, kt_ecdh, ssl_sign_rsa, PR_FALSE, 0, PR_FALSE, PR_TR
UE, SEC_OID_TLS_ECDHE_RSA}, | |
| 329 {kea_ecdh_anon, kt_ecdh, ssl_sign_null, PR_FALSE, 0, PR_FALSE, PR_TR
UE, SEC_OID_TLS_ECDH_ANON}, | |
| 330 #endif /* NSS_DISABLE_ECC */ | |
| 331 }; | |
| 332 | |
| 333 /* must use ssl_LookupCipherSuiteDef to access */ | |
| 334 static const ssl3CipherSuiteDef cipher_suite_defs[] = | |
| 335 { | |
| 336 /* cipher_suite bulk_cipher_alg mac_alg key_exchange_alg */ | |
| 337 | |
| 338 {TLS_NULL_WITH_NULL_NULL, cipher_null, mac_null, kea_null}, | |
| 339 {TLS_RSA_WITH_NULL_MD5, cipher_null, mac_md5, kea_rsa}, | |
| 340 {TLS_RSA_WITH_NULL_SHA, cipher_null, mac_sha, kea_rsa}, | |
| 341 {TLS_RSA_WITH_NULL_SHA256, cipher_null, hmac_sha256, kea_rsa}, | |
| 342 {TLS_RSA_EXPORT_WITH_RC4_40_MD5,cipher_rc4_40, mac_md5, kea_rsa_export}, | |
| 343 {TLS_RSA_WITH_RC4_128_MD5, cipher_rc4, mac_md5, kea_rsa}, | |
| 344 {TLS_RSA_WITH_RC4_128_SHA, cipher_rc4, mac_sha, kea_rsa}, | |
| 345 {TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5, | |
| 346 cipher_rc2_40, mac_md5, kea_rsa_export}, | |
| 347 #if 0 /* not implemented */ | |
| 348 {TLS_RSA_WITH_IDEA_CBC_SHA, cipher_idea, mac_sha, kea_rsa}, | |
| 349 {TLS_RSA_EXPORT_WITH_DES40_CBC_SHA, | |
| 350 cipher_des40, mac_sha, kea_rsa_export}, | |
| 351 #endif | |
| 352 {TLS_RSA_WITH_DES_CBC_SHA, cipher_des, mac_sha, kea_rsa}, | |
| 353 {TLS_RSA_WITH_3DES_EDE_CBC_SHA, cipher_3des, mac_sha, kea_rsa}, | |
| 354 {TLS_DHE_DSS_WITH_DES_CBC_SHA, cipher_des, mac_sha, kea_dhe_dss}, | |
| 355 {TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, | |
| 356 cipher_3des, mac_sha, kea_dhe_dss}, | |
| 357 {TLS_DHE_DSS_WITH_RC4_128_SHA, cipher_rc4, mac_sha, kea_dhe_dss}, | |
| 358 #if 0 /* not implemented */ | |
| 359 {TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA, | |
| 360 cipher_des40, mac_sha, kea_dh_dss_export}, | |
| 361 {TLS_DH_DSS_DES_CBC_SHA, cipher_des, mac_sha, kea_dh_dss}, | |
| 362 {TLS_DH_DSS_3DES_CBC_SHA, cipher_3des, mac_sha, kea_dh_dss}, | |
| 363 {TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA, | |
| 364 cipher_des40, mac_sha, kea_dh_rsa_export}, | |
| 365 {TLS_DH_RSA_DES_CBC_SHA, cipher_des, mac_sha, kea_dh_rsa}, | |
| 366 {TLS_DH_RSA_3DES_CBC_SHA, cipher_3des, mac_sha, kea_dh_rsa}, | |
| 367 {TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, | |
| 368 cipher_des40, mac_sha, kea_dh_dss_export}, | |
| 369 {TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, | |
| 370 cipher_des40, mac_sha, kea_dh_rsa_export}, | |
| 371 #endif | |
| 372 {TLS_DHE_RSA_WITH_DES_CBC_SHA, cipher_des, mac_sha, kea_dhe_rsa}, | |
| 373 {TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, | |
| 374 cipher_3des, mac_sha, kea_dhe_rsa}, | |
| 375 #if 0 | |
| 376 {SSL_DH_ANON_EXPORT_RC4_40_MD5, cipher_rc4_40, mac_md5, kea_dh_anon_export}, | |
| 377 {TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA, | |
| 378 cipher_des40, mac_sha, kea_dh_anon_export}, | |
| 379 {TLS_DH_anon_WITH_DES_CBC_SHA, cipher_des, mac_sha, kea_dh_anon}, | |
| 380 {TLS_DH_anon_WITH_3DES_CBC_SHA, cipher_3des, mac_sha, kea_dh_anon}, | |
| 381 #endif | |
| 382 | |
| 383 | |
| 384 /* New TLS cipher suites */ | |
| 385 {TLS_RSA_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_rsa}, | |
| 386 {TLS_RSA_WITH_AES_128_CBC_SHA256, cipher_aes_128, hmac_sha256, kea_rsa}, | |
| 387 {TLS_DHE_DSS_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_dhe_dss}, | |
| 388 {TLS_DHE_RSA_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_dhe_rsa}, | |
| 389 {TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, cipher_aes_128, hmac_sha256, kea_dhe_r
sa}, | |
| 390 {TLS_RSA_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_rsa}, | |
| 391 {TLS_RSA_WITH_AES_256_CBC_SHA256, cipher_aes_256, hmac_sha256, kea_rsa}, | |
| 392 {TLS_DHE_DSS_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_dhe_dss}, | |
| 393 {TLS_DHE_RSA_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_dhe_rsa}, | |
| 394 {TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, cipher_aes_256, hmac_sha256, kea_dhe_r
sa}, | |
| 395 #if 0 | |
| 396 {TLS_DH_DSS_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_dh_dss}, | |
| 397 {TLS_DH_RSA_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_dh_rsa}, | |
| 398 {TLS_DH_anon_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_dh_anon}, | |
| 399 {TLS_DH_DSS_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_dh_dss}, | |
| 400 {TLS_DH_RSA_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_dh_rsa}, | |
| 401 {TLS_DH_anon_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_dh_anon}, | |
| 402 #endif | |
| 403 | |
| 404 {TLS_RSA_WITH_SEED_CBC_SHA, cipher_seed, mac_sha, kea_rsa}, | |
| 405 | |
| 406 {TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, cipher_camellia_128, mac_sha, kea_rsa}, | |
| 407 {TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA, | |
| 408 cipher_camellia_128, mac_sha, kea_dhe_dss}, | |
| 409 {TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, | |
| 410 cipher_camellia_128, mac_sha, kea_dhe_rsa}, | |
| 411 {TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, cipher_camellia_256, mac_sha, kea_rsa}, | |
| 412 {TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA, | |
| 413 cipher_camellia_256, mac_sha, kea_dhe_dss}, | |
| 414 {TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, | |
| 415 cipher_camellia_256, mac_sha, kea_dhe_rsa}, | |
| 416 | |
| 417 {TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA, | |
| 418 cipher_des, mac_sha,kea_rsa_export_1024}, | |
| 419 {TLS_RSA_EXPORT1024_WITH_RC4_56_SHA, | |
| 420 cipher_rc4_56, mac_sha,kea_rsa_export_1024}, | |
| 421 | |
| 422 {SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA, cipher_3des, mac_sha, kea_rsa_fips}, | |
| 423 {SSL_RSA_FIPS_WITH_DES_CBC_SHA, cipher_des, mac_sha, kea_rsa_fips}, | |
| 424 | |
| 425 {TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, cipher_aes_128_gcm, mac_aead, kea_dhe_
rsa}, | |
| 426 {TLS_RSA_WITH_AES_128_GCM_SHA256, cipher_aes_128_gcm, mac_aead, kea_rsa}, | |
| 427 {TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, cipher_aes_128_gcm, mac_aead, kea_ec
dhe_rsa}, | |
| 428 {TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, cipher_aes_128_gcm, mac_aead, kea_
ecdhe_ecdsa}, | |
| 429 | |
| 430 {TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, cipher_aes_128_gcm, mac_aead, kea_dhe_
dss}, | |
| 431 {TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, cipher_aes_128, hmac_sha256, kea_dhe_d
ss}, | |
| 432 {TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, cipher_aes_256, hmac_sha256, kea_dhe_d
ss}, | |
| 433 | |
| 434 {TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256, cipher_chacha20, mac_aead, kea_d
he_rsa}, | |
| 435 {TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, cipher_chacha20, mac_aead, kea
_ecdhe_rsa}, | |
| 436 {TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, cipher_chacha20, mac_aead, k
ea_ecdhe_ecdsa}, | |
| 437 | |
| 438 #ifndef NSS_DISABLE_ECC | |
| 439 {TLS_ECDH_ECDSA_WITH_NULL_SHA, cipher_null, mac_sha, kea_ecdh_ecdsa}, | |
| 440 {TLS_ECDH_ECDSA_WITH_RC4_128_SHA, cipher_rc4, mac_sha, kea_ecdh_ecdsa}, | |
| 441 {TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, cipher_3des, mac_sha, kea_ecdh_ecdsa}
, | |
| 442 {TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_ecdh_ecds
a}, | |
| 443 {TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_ecdh_ecds
a}, | |
| 444 | |
| 445 {TLS_ECDHE_ECDSA_WITH_NULL_SHA, cipher_null, mac_sha, kea_ecdhe_ecdsa
}, | |
| 446 {TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, cipher_rc4, mac_sha, kea_ecdhe_ecdsa
}, | |
| 447 {TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, cipher_3des, mac_sha, kea_ecdhe_ecds
a}, | |
| 448 {TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_ecdhe_ec
dsa}, | |
| 449 {TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, cipher_aes_128, hmac_sha256, kea_e
cdhe_ecdsa}, | |
| 450 {TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_ecdhe_ec
dsa}, | |
| 451 | |
| 452 {TLS_ECDH_RSA_WITH_NULL_SHA, cipher_null, mac_sha, kea_ecdh_rsa}, | |
| 453 {TLS_ECDH_RSA_WITH_RC4_128_SHA, cipher_rc4, mac_sha, kea_ecdh_rsa}, | |
| 454 {TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, cipher_3des, mac_sha, kea_ecdh_rsa}, | |
| 455 {TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_ecdh_rsa}, | |
| 456 {TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_ecdh_rsa}, | |
| 457 | |
| 458 {TLS_ECDHE_RSA_WITH_NULL_SHA, cipher_null, mac_sha, kea_ecdhe_rsa
}, | |
| 459 {TLS_ECDHE_RSA_WITH_RC4_128_SHA, cipher_rc4, mac_sha, kea_ecdhe_rsa
}, | |
| 460 {TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, cipher_3des, mac_sha, kea_ecdhe_rsa
}, | |
| 461 {TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_ecdhe_rsa
}, | |
| 462 {TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, cipher_aes_128, hmac_sha256, kea_ecd
he_rsa}, | |
| 463 {TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_ecdhe_rsa
}, | |
| 464 | |
| 465 #if 0 | |
| 466 {TLS_ECDH_anon_WITH_NULL_SHA, cipher_null, mac_sha, kea_ecdh_anon
}, | |
| 467 {TLS_ECDH_anon_WITH_RC4_128_SHA, cipher_rc4, mac_sha, kea_ecdh_anon
}, | |
| 468 {TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA, cipher_3des, mac_sha, kea_ecdh_anon
}, | |
| 469 {TLS_ECDH_anon_WITH_AES_128_CBC_SHA, cipher_aes_128, mac_sha, kea_ecdh_anon
}, | |
| 470 {TLS_ECDH_anon_WITH_AES_256_CBC_SHA, cipher_aes_256, mac_sha, kea_ecdh_anon
}, | |
| 471 #endif | |
| 472 #endif /* NSS_DISABLE_ECC */ | |
| 473 }; | |
| 474 /* clang-format on */ | |
| 475 | |
| 476 static const CK_MECHANISM_TYPE kea_alg_defs[] = { | |
| 477 0x80000000L, | |
| 478 CKM_RSA_PKCS, | |
| 479 CKM_DH_PKCS_DERIVE, | |
| 480 CKM_KEA_KEY_DERIVE, | |
| 481 CKM_ECDH1_DERIVE | |
| 482 }; | |
| 483 | |
| 484 typedef struct SSLCipher2MechStr { | |
| 485 SSLCipherAlgorithm calg; | |
| 486 CK_MECHANISM_TYPE cmech; | |
| 487 } SSLCipher2Mech; | |
| 488 | |
| 489 /* indexed by type SSLCipherAlgorithm */ | |
| 490 static const SSLCipher2Mech alg2Mech[] = { | |
| 491 /* calg, cmech */ | |
| 492 { calg_null, (CK_MECHANISM_TYPE)0x80000000L }, | |
| 493 { calg_rc4, CKM_RC4 }, | |
| 494 { calg_rc2, CKM_RC2_CBC }, | |
| 495 { calg_des, CKM_DES_CBC }, | |
| 496 { calg_3des, CKM_DES3_CBC }, | |
| 497 { calg_idea, CKM_IDEA_CBC }, | |
| 498 { calg_fortezza, CKM_SKIPJACK_CBC64 }, | |
| 499 { calg_aes, CKM_AES_CBC }, | |
| 500 { calg_camellia, CKM_CAMELLIA_CBC }, | |
| 501 { calg_seed, CKM_SEED_CBC }, | |
| 502 { calg_aes_gcm, CKM_AES_GCM }, | |
| 503 { calg_chacha20, CKM_NSS_CHACHA20_POLY1305 }, | |
| 504 /* { calg_init , (CK_MECHANISM_TYPE)0x7fffffffL } */ | |
| 505 }; | |
| 506 | |
| 507 #define mmech_invalid (CK_MECHANISM_TYPE)0x80000000L | |
| 508 #define mmech_md5 CKM_SSL3_MD5_MAC | |
| 509 #define mmech_sha CKM_SSL3_SHA1_MAC | |
| 510 #define mmech_md5_hmac CKM_MD5_HMAC | |
| 511 #define mmech_sha_hmac CKM_SHA_1_HMAC | |
| 512 #define mmech_sha256_hmac CKM_SHA256_HMAC | |
| 513 | |
| 514 /* clang-format off */ | |
| 515 static const ssl3MACDef mac_defs[] = { /* indexed by SSL3MACAlgorithm */ | |
| 516 /* pad_size is only used for SSL 3.0 MAC. See RFC 6101 Sec. 5.2.3.1. */ | |
| 517 /* mac mmech pad_size mac_size */ | |
| 518 { mac_null, mmech_invalid, 0, 0 , 0}, | |
| 519 { mac_md5, mmech_md5, 48, MD5_LENGTH, SEC_OID_HMAC_MD5 }, | |
| 520 { mac_sha, mmech_sha, 40, SHA1_LENGTH, SEC_OID_HMAC_SHA1}, | |
| 521 {hmac_md5, mmech_md5_hmac, 0, MD5_LENGTH, SEC_OID_HMAC_MD5}, | |
| 522 {hmac_sha, mmech_sha_hmac, 0, SHA1_LENGTH, SEC_OID_HMAC_SHA1}, | |
| 523 {hmac_sha256, mmech_sha256_hmac, 0, SHA256_LENGTH, SEC_OID_HMAC_SHA256}, | |
| 524 { mac_aead, mmech_invalid, 0, 0, 0 }, | |
| 525 }; | |
| 526 /* clang-format on */ | |
| 527 | |
| 528 /* indexed by SSL3BulkCipher */ | |
| 529 const char *const ssl3_cipherName[] = { | |
| 530 "NULL", | |
| 531 "RC4", | |
| 532 "RC4-40", | |
| 533 "RC4-56", | |
| 534 "RC2-CBC", | |
| 535 "RC2-CBC-40", | |
| 536 "DES-CBC", | |
| 537 "3DES-EDE-CBC", | |
| 538 "DES-CBC-40", | |
| 539 "IDEA-CBC", | |
| 540 "AES-128", | |
| 541 "AES-256", | |
| 542 "Camellia-128", | |
| 543 "Camellia-256", | |
| 544 "SEED-CBC", | |
| 545 "AES-128-GCM", | |
| 546 "missing" | |
| 547 }; | |
| 548 | |
| 549 const PRUint8 tls13_downgrade_random[] = { 0x44, 0x4F, 0x57, 0x4E, | |
| 550 0x47, 0x52, 0x44, 0x01 }; | |
| 551 const PRUint8 tls12_downgrade_random[] = { 0x44, 0x4F, 0x57, 0x4E, | |
| 552 0x47, 0x52, 0x44, 0x00 }; | |
| 553 | |
| 554 #ifndef NSS_DISABLE_ECC | |
| 555 /* The ECCWrappedKeyInfo structure defines how various pieces of | |
| 556 * information are laid out within wrappedSymmetricWrappingkey | |
| 557 * for ECDH key exchange. Since wrappedSymmetricWrappingkey is | |
| 558 * a 512-byte buffer (see sslimpl.h), the variable length field | |
| 559 * in ECCWrappedKeyInfo can be at most (512 - 8) = 504 bytes. | |
| 560 * | |
| 561 * XXX For now, NSS only supports named elliptic curves of size 571 bits | |
| 562 * or smaller. The public value will fit within 145 bytes and EC params | |
| 563 * will fit within 12 bytes. We'll need to revisit this when NSS | |
| 564 * supports arbitrary curves. | |
| 565 */ | |
| 566 #define MAX_EC_WRAPPED_KEY_BUFLEN 504 | |
| 567 | |
| 568 typedef struct ECCWrappedKeyInfoStr { | |
| 569 PRUint16 size; /* EC public key size in bits */ | |
| 570 PRUint16 encodedParamLen; /* length (in bytes) of DER encoded
EC params */ | |
| 571 PRUint16 pubValueLen; /* length (in bytes) of EC public va
lue */ | |
| 572 PRUint16 wrappedKeyLen; /* length (in bytes) of the wrapped
key */ | |
| 573 PRUint8 var[MAX_EC_WRAPPED_KEY_BUFLEN]; /* this buffer contains the */ | |
| 574 /* EC public-key params, the EC public value and the wrapped key */ | |
| 575 } ECCWrappedKeyInfo; | |
| 576 #endif /* NSS_DISABLE_ECC */ | |
| 577 | |
| 578 CK_MECHANISM_TYPE | |
| 579 ssl3_Alg2Mech(SSLCipherAlgorithm calg) | |
| 580 { | |
| 581 PORT_Assert(alg2Mech[calg].calg == calg); | |
| 582 return alg2Mech[calg].cmech; | |
| 583 } | |
| 584 | |
| 585 #if defined(TRACE) | |
| 586 | |
| 587 static char * | |
| 588 ssl3_DecodeHandshakeType(int msgType) | |
| 589 { | |
| 590 char *rv; | |
| 591 static char line[40]; | |
| 592 | |
| 593 switch (msgType) { | |
| 594 case hello_request: | |
| 595 rv = "hello_request (0)"; | |
| 596 break; | |
| 597 case client_hello: | |
| 598 rv = "client_hello (1)"; | |
| 599 break; | |
| 600 case server_hello: | |
| 601 rv = "server_hello (2)"; | |
| 602 break; | |
| 603 case hello_verify_request: | |
| 604 rv = "hello_verify_request (3)"; | |
| 605 break; | |
| 606 case encrypted_extensions: | |
| 607 rv = "encrypted_extensions (8)"; | |
| 608 break; | |
| 609 case certificate: | |
| 610 rv = "certificate (11)"; | |
| 611 break; | |
| 612 case server_key_exchange: | |
| 613 rv = "server_key_exchange (12)"; | |
| 614 break; | |
| 615 case certificate_request: | |
| 616 rv = "certificate_request (13)"; | |
| 617 break; | |
| 618 case server_hello_done: | |
| 619 rv = "server_hello_done (14)"; | |
| 620 break; | |
| 621 case certificate_verify: | |
| 622 rv = "certificate_verify (15)"; | |
| 623 break; | |
| 624 case client_key_exchange: | |
| 625 rv = "client_key_exchange (16)"; | |
| 626 break; | |
| 627 case finished: | |
| 628 rv = "finished (20)"; | |
| 629 break; | |
| 630 default: | |
| 631 sprintf(line, "*UNKNOWN* handshake type! (%d)", msgType); | |
| 632 rv = line; | |
| 633 } | |
| 634 return rv; | |
| 635 } | |
| 636 | |
| 637 static char * | |
| 638 ssl3_DecodeContentType(int msgType) | |
| 639 { | |
| 640 char *rv; | |
| 641 static char line[40]; | |
| 642 | |
| 643 switch (msgType) { | |
| 644 case content_change_cipher_spec: | |
| 645 rv = "change_cipher_spec (20)"; | |
| 646 break; | |
| 647 case content_alert: | |
| 648 rv = "alert (21)"; | |
| 649 break; | |
| 650 case content_handshake: | |
| 651 rv = "handshake (22)"; | |
| 652 break; | |
| 653 case content_application_data: | |
| 654 rv = "application_data (23)"; | |
| 655 break; | |
| 656 default: | |
| 657 sprintf(line, "*UNKNOWN* record type! (%d)", msgType); | |
| 658 rv = line; | |
| 659 } | |
| 660 return rv; | |
| 661 } | |
| 662 | |
| 663 #endif | |
| 664 | |
| 665 SSL3Statistics * | |
| 666 SSL_GetStatistics(void) | |
| 667 { | |
| 668 return &ssl3stats; | |
| 669 } | |
| 670 | |
| 671 typedef struct tooLongStr { | |
| 672 #if defined(IS_LITTLE_ENDIAN) | |
| 673 PRInt32 low; | |
| 674 PRInt32 high; | |
| 675 #else | |
| 676 PRInt32 high; | |
| 677 PRInt32 low; | |
| 678 #endif | |
| 679 } tooLong; | |
| 680 | |
| 681 void | |
| 682 SSL_AtomicIncrementLong(long *x) | |
| 683 { | |
| 684 if ((sizeof *x) == sizeof(PRInt32)) { | |
| 685 PR_ATOMIC_INCREMENT((PRInt32 *)x); | |
| 686 } else { | |
| 687 tooLong *tl = (tooLong *)x; | |
| 688 if (PR_ATOMIC_INCREMENT(&tl->low) == 0) | |
| 689 PR_ATOMIC_INCREMENT(&tl->high); | |
| 690 } | |
| 691 } | |
| 692 | |
| 693 static PRBool | |
| 694 ssl3_CipherSuiteAllowedForVersionRange( | |
| 695 ssl3CipherSuite cipherSuite, | |
| 696 const SSLVersionRange *vrange) | |
| 697 { | |
| 698 switch (cipherSuite) { | |
| 699 /* See RFC 4346 A.5. Export cipher suites must not be used in TLS 1.1 or | |
| 700 * later. This set of cipher suites is similar to, but different from, t
he | |
| 701 * set of cipher suites considered exportable by SSL_IsExportCipherSuite
. | |
| 702 */ | |
| 703 case TLS_RSA_EXPORT_WITH_RC4_40_MD5: | |
| 704 case TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5: | |
| 705 /* TLS_RSA_EXPORT_WITH_DES40_CBC_SHA: never implemented | |
| 706 * TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA: never implemented | |
| 707 * TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA: never implemented | |
| 708 * TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA: never implemented | |
| 709 * TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA: never implemented | |
| 710 * TLS_DH_anon_EXPORT_WITH_RC4_40_MD5: never implemented | |
| 711 * TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA: never implemented | |
| 712 */ | |
| 713 return vrange->min <= SSL_LIBRARY_VERSION_TLS_1_0; | |
| 714 | |
| 715 case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256: | |
| 716 case TLS_RSA_WITH_AES_256_CBC_SHA256: | |
| 717 case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256: | |
| 718 case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256: | |
| 719 case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256: | |
| 720 case TLS_RSA_WITH_AES_128_CBC_SHA256: | |
| 721 case TLS_RSA_WITH_AES_128_GCM_SHA256: | |
| 722 case TLS_DHE_DSS_WITH_AES_128_CBC_SHA256: | |
| 723 case TLS_DHE_DSS_WITH_AES_256_CBC_SHA256: | |
| 724 case TLS_RSA_WITH_NULL_SHA256: | |
| 725 case TLS_DHE_DSS_WITH_AES_128_GCM_SHA256: | |
| 726 return vrange->max == SSL_LIBRARY_VERSION_TLS_1_2; | |
| 727 | |
| 728 case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256: | |
| 729 case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256: | |
| 730 case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256: | |
| 731 return vrange->max >= SSL_LIBRARY_VERSION_TLS_1_2; | |
| 732 | |
| 733 /* RFC 4492: ECC cipher suites need TLS extensions to negotiate curves a
nd | |
| 734 * point formats.*/ | |
| 735 case TLS_ECDH_ECDSA_WITH_NULL_SHA: | |
| 736 case TLS_ECDH_ECDSA_WITH_RC4_128_SHA: | |
| 737 case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA: | |
| 738 case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA: | |
| 739 case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA: | |
| 740 case TLS_ECDHE_ECDSA_WITH_NULL_SHA: | |
| 741 case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA: | |
| 742 case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA: | |
| 743 case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA: | |
| 744 case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA: | |
| 745 case TLS_ECDH_RSA_WITH_NULL_SHA: | |
| 746 case TLS_ECDH_RSA_WITH_RC4_128_SHA: | |
| 747 case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA: | |
| 748 case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA: | |
| 749 case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA: | |
| 750 case TLS_ECDHE_RSA_WITH_NULL_SHA: | |
| 751 case TLS_ECDHE_RSA_WITH_RC4_128_SHA: | |
| 752 case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA: | |
| 753 case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA: | |
| 754 case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA: | |
| 755 return vrange->max >= SSL_LIBRARY_VERSION_TLS_1_0 && | |
| 756 vrange->min < SSL_LIBRARY_VERSION_TLS_1_3; | |
| 757 | |
| 758 default: | |
| 759 return vrange->min < SSL_LIBRARY_VERSION_TLS_1_3; | |
| 760 } | |
| 761 } | |
| 762 | |
| 763 /* return pointer to ssl3CipherSuiteDef for suite, or NULL */ | |
| 764 /* XXX This does a linear search. A binary search would be better. */ | |
| 765 static const ssl3CipherSuiteDef * | |
| 766 ssl_LookupCipherSuiteDef(ssl3CipherSuite suite) | |
| 767 { | |
| 768 int cipher_suite_def_len = | |
| 769 sizeof(cipher_suite_defs) / sizeof(cipher_suite_defs[0]); | |
| 770 int i; | |
| 771 | |
| 772 for (i = 0; i < cipher_suite_def_len; i++) { | |
| 773 if (cipher_suite_defs[i].cipher_suite == suite) | |
| 774 return &cipher_suite_defs[i]; | |
| 775 } | |
| 776 PORT_Assert(PR_FALSE); /* We should never get here. */ | |
| 777 PORT_SetError(SSL_ERROR_UNKNOWN_CIPHER_SUITE); | |
| 778 return NULL; | |
| 779 } | |
| 780 | |
| 781 /* Find the cipher configuration struct associate with suite */ | |
| 782 /* XXX This does a linear search. A binary search would be better. */ | |
| 783 static ssl3CipherSuiteCfg * | |
| 784 ssl_LookupCipherSuiteCfg(ssl3CipherSuite suite, ssl3CipherSuiteCfg *suites) | |
| 785 { | |
| 786 int i; | |
| 787 | |
| 788 for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) { | |
| 789 if (suites[i].cipher_suite == suite) | |
| 790 return &suites[i]; | |
| 791 } | |
| 792 /* return NULL and let the caller handle it. */ | |
| 793 PORT_SetError(SSL_ERROR_UNKNOWN_CIPHER_SUITE); | |
| 794 return NULL; | |
| 795 } | |
| 796 | |
| 797 /* Initialize the suite->isPresent value for config_match | |
| 798 * Returns count of enabled ciphers supported by extant tokens, | |
| 799 * regardless of policy or user preference. | |
| 800 * If this returns zero, the user cannot do SSL v3. | |
| 801 */ | |
| 802 int | |
| 803 ssl3_config_match_init(sslSocket *ss) | |
| 804 { | |
| 805 ssl3CipherSuiteCfg *suite; | |
| 806 const ssl3CipherSuiteDef *cipher_def; | |
| 807 SSLCipherAlgorithm cipher_alg; | |
| 808 CK_MECHANISM_TYPE cipher_mech; | |
| 809 SSL3KEAType exchKeyType; | |
| 810 int i; | |
| 811 int numPresent = 0; | |
| 812 int numEnabled = 0; | |
| 813 PRBool isServer; | |
| 814 sslServerCerts *svrAuth; | |
| 815 | |
| 816 PORT_Assert(ss); | |
| 817 if (!ss) { | |
| 818 PORT_SetError(SEC_ERROR_INVALID_ARGS); | |
| 819 return 0; | |
| 820 } | |
| 821 if (SSL3_ALL_VERSIONS_DISABLED(&ss->vrange)) { | |
| 822 return 0; | |
| 823 } | |
| 824 isServer = (PRBool)(ss->sec.isServer != 0); | |
| 825 | |
| 826 for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) { | |
| 827 suite = &ss->cipherSuites[i]; | |
| 828 if (suite->enabled) { | |
| 829 ++numEnabled; | |
| 830 /* We need the cipher defs to see if we have a token that can handle | |
| 831 * this cipher. It isn't part of the static definition. | |
| 832 */ | |
| 833 cipher_def = ssl_LookupCipherSuiteDef(suite->cipher_suite); | |
| 834 if (!cipher_def) { | |
| 835 suite->isPresent = PR_FALSE; | |
| 836 continue; | |
| 837 } | |
| 838 cipher_alg = bulk_cipher_defs[cipher_def->bulk_cipher_alg].calg; | |
| 839 cipher_mech = ssl3_Alg2Mech(cipher_alg); | |
| 840 exchKeyType = | |
| 841 kea_defs[cipher_def->key_exchange_alg].exchKeyType; | |
| 842 #ifdef NSS_DISABLE_ECC | |
| 843 svrAuth = ss->serverCerts + exchKeyType; | |
| 844 #else | |
| 845 /* XXX SSLKEAType isn't really a good choice for | |
| 846 * indexing certificates. It doesn't work for | |
| 847 * (EC)DHE-* ciphers. Here we use a hack to ensure | |
| 848 * that the server uses an RSA cert for (EC)DHE-RSA. | |
| 849 */ | |
| 850 switch (cipher_def->key_exchange_alg) { | |
| 851 case kea_dhe_dss: | |
| 852 svrAuth = ss->serverCerts + ssl_kea_dh; | |
| 853 break; | |
| 854 case kea_ecdhe_rsa: | |
| 855 case kea_dhe_rsa: | |
| 856 svrAuth = ss->serverCerts + kt_rsa; | |
| 857 break; | |
| 858 case kea_ecdh_ecdsa: | |
| 859 case kea_ecdh_rsa: | |
| 860 /* | |
| 861 * XXX We ought to have different indices for | |
| 862 * ECDSA- and RSA-signed EC certificates so | |
| 863 * we could support both key exchange mechanisms | |
| 864 * simultaneously. For now, both of them use | |
| 865 * whatever is in the certificate slot for kt_ecdh | |
| 866 */ | |
| 867 case kea_dhe_dss_export: | |
| 868 case kea_dhe_rsa_export: | |
| 869 default: | |
| 870 svrAuth = ss->serverCerts + exchKeyType; | |
| 871 break; | |
| 872 } | |
| 873 #endif /* NSS_DISABLE_ECC */ | |
| 874 | |
| 875 /* Mark the suites that are backed by real tokens, certs and keys */ | |
| 876 suite->isPresent = (PRBool)(((exchKeyType == kt_null) || | |
| 877 ((!isServer || | |
| 878 (svrAuth->serverKeyPair && svrAuth->S
ERVERKEY && | |
| 879 svrAuth->serverCertChain)) && | |
| 880 PK11_TokenExists(kea_alg_defs[exchKeyT
ype]))) && | |
| 881 ((cipher_alg == calg_null) || PK11_Token
Exists(cipher_mech))); | |
| 882 if (suite->isPresent) | |
| 883 ++numPresent; | |
| 884 } | |
| 885 } | |
| 886 PORT_Assert(numPresent > 0 || numEnabled == 0); | |
| 887 if (numPresent <= 0) { | |
| 888 PORT_SetError(SSL_ERROR_NO_CIPHERS_SUPPORTED); | |
| 889 } | |
| 890 return numPresent; | |
| 891 } | |
| 892 | |
| 893 /* return PR_TRUE if suite matches policy, enabled state and is applicable to | |
| 894 * the given version range. */ | |
| 895 /* It would be a REALLY BAD THING (tm) if we ever permitted the use | |
| 896 ** of a cipher that was NOT_ALLOWED. So, if this is ever called with | |
| 897 ** policy == SSL_NOT_ALLOWED, report no match. | |
| 898 */ | |
| 899 /* adjust suite enabled to the availability of a token that can do the | |
| 900 * cipher suite. */ | |
| 901 static PRBool | |
| 902 config_match(ssl3CipherSuiteCfg *suite, int policy, PRBool enabled, | |
| 903 const SSLVersionRange *vrange, const sslSocket *ss) | |
| 904 { | |
| 905 const ssl3CipherSuiteDef *cipher_def; | |
| 906 | |
| 907 PORT_Assert(policy != SSL_NOT_ALLOWED && enabled != PR_FALSE); | |
| 908 if (policy == SSL_NOT_ALLOWED || !enabled) | |
| 909 return PR_FALSE; | |
| 910 | |
| 911 cipher_def = ssl_LookupCipherSuiteDef(suite->cipher_suite); | |
| 912 PORT_Assert(cipher_def != NULL); | |
| 913 | |
| 914 PORT_Assert(ss != NULL); | |
| 915 if (ss->sec.isServer && !ss->opt.enableServerDhe && | |
| 916 kea_defs[cipher_def->key_exchange_alg].exchKeyType == ssl_kea_dh) | |
| 917 return PR_FALSE; | |
| 918 | |
| 919 return (PRBool)(suite->enabled && | |
| 920 suite->isPresent && | |
| 921 suite->policy != SSL_NOT_ALLOWED && | |
| 922 suite->policy <= policy && | |
| 923 ssl3_CipherSuiteAllowedForVersionRange( | |
| 924 suite->cipher_suite, vrange)); | |
| 925 } | |
| 926 | |
| 927 /* return number of cipher suites that match policy, enabled state and are | |
| 928 * applicable for the configured protocol version range. */ | |
| 929 /* called from ssl3_SendClientHello and ssl3_ConstructV2CipherSpecsHack */ | |
| 930 static int | |
| 931 count_cipher_suites(sslSocket *ss, int policy, PRBool enabled) | |
| 932 { | |
| 933 int i, count = 0; | |
| 934 | |
| 935 if (SSL3_ALL_VERSIONS_DISABLED(&ss->vrange)) { | |
| 936 return 0; | |
| 937 } | |
| 938 for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) { | |
| 939 if (config_match(&ss->cipherSuites[i], policy, enabled, &ss->vrange, ss)
) | |
| 940 count++; | |
| 941 } | |
| 942 if (count <= 0) { | |
| 943 PORT_SetError(SSL_ERROR_SSL_DISABLED); | |
| 944 } | |
| 945 return count; | |
| 946 } | |
| 947 | |
| 948 /* | |
| 949 * Null compression, mac and encryption functions | |
| 950 */ | |
| 951 | |
| 952 static SECStatus | |
| 953 Null_Cipher(void *ctx, unsigned char *output, int *outputLen, int maxOutputLen, | |
| 954 const unsigned char *input, int inputLen) | |
| 955 { | |
| 956 if (inputLen > maxOutputLen) { | |
| 957 *outputLen = 0; /* Match PK11_CipherOp in setting outputLen */ | |
| 958 PORT_SetError(SEC_ERROR_OUTPUT_LEN); | |
| 959 return SECFailure; | |
| 960 } | |
| 961 *outputLen = inputLen; | |
| 962 if (input != output) | |
| 963 PORT_Memcpy(output, input, inputLen); | |
| 964 return SECSuccess; | |
| 965 } | |
| 966 | |
| 967 /* | |
| 968 * SSL3 Utility functions | |
| 969 */ | |
| 970 | |
| 971 /* allowLargerPeerVersion controls whether the function will select the | |
| 972 * highest enabled SSL version or fail when peerVersion is greater than the | |
| 973 * highest enabled version. | |
| 974 * | |
| 975 * If allowLargerPeerVersion is true, peerVersion is the peer's highest | |
| 976 * enabled version rather than the peer's selected version. | |
| 977 */ | |
| 978 SECStatus | |
| 979 ssl3_NegotiateVersion(sslSocket *ss, SSL3ProtocolVersion peerVersion, | |
| 980 PRBool allowLargerPeerVersion) | |
| 981 { | |
| 982 if (SSL3_ALL_VERSIONS_DISABLED(&ss->vrange)) { | |
| 983 PORT_SetError(SSL_ERROR_SSL_DISABLED); | |
| 984 return SECFailure; | |
| 985 } | |
| 986 | |
| 987 if (peerVersion < ss->vrange.min || | |
| 988 (peerVersion > ss->vrange.max && !allowLargerPeerVersion)) { | |
| 989 PORT_SetError(SSL_ERROR_UNSUPPORTED_VERSION); | |
| 990 return SECFailure; | |
| 991 } | |
| 992 | |
| 993 ss->version = PR_MIN(peerVersion, ss->vrange.max); | |
| 994 PORT_Assert(ssl3_VersionIsSupported(ss->protocolVariant, ss->version)); | |
| 995 | |
| 996 return SECSuccess; | |
| 997 } | |
| 998 | |
| 999 static SECStatus | |
| 1000 ssl3_GetNewRandom(SSL3Random *random) | |
| 1001 { | |
| 1002 SECStatus rv; | |
| 1003 | |
| 1004 rv = PK11_GenerateRandom(random->rand, SSL3_RANDOM_LENGTH); | |
| 1005 if (rv != SECSuccess) { | |
| 1006 ssl_MapLowLevelError(SSL_ERROR_GENERATE_RANDOM_FAILURE); | |
| 1007 } | |
| 1008 return rv; | |
| 1009 } | |
| 1010 | |
| 1011 /* Called by ssl3_SendServerKeyExchange and ssl3_SendCertificateVerify */ | |
| 1012 SECStatus | |
| 1013 ssl3_SignHashes(SSL3Hashes *hash, SECKEYPrivateKey *key, SECItem *buf, | |
| 1014 PRBool isTLS) | |
| 1015 { | |
| 1016 SECStatus rv = SECFailure; | |
| 1017 PRBool doDerEncode = PR_FALSE; | |
| 1018 int signatureLen; | |
| 1019 SECItem hashItem; | |
| 1020 | |
| 1021 buf->data = NULL; | |
| 1022 | |
| 1023 switch (key->keyType) { | |
| 1024 case rsaKey: | |
| 1025 hashItem.data = hash->u.raw; | |
| 1026 hashItem.len = hash->len; | |
| 1027 break; | |
| 1028 case dsaKey: | |
| 1029 doDerEncode = isTLS; | |
| 1030 /* ssl_hash_none is used to specify the MD5/SHA1 concatenated hash. | |
| 1031 * In that case, we use just the SHA1 part. */ | |
| 1032 if (hash->hashAlg == ssl_hash_none) { | |
| 1033 hashItem.data = hash->u.s.sha; | |
| 1034 hashItem.len = sizeof(hash->u.s.sha); | |
| 1035 } else { | |
| 1036 hashItem.data = hash->u.raw; | |
| 1037 hashItem.len = hash->len; | |
| 1038 } | |
| 1039 break; | |
| 1040 #ifndef NSS_DISABLE_ECC | |
| 1041 case ecKey: | |
| 1042 doDerEncode = PR_TRUE; | |
| 1043 /* ssl_hash_none is used to specify the MD5/SHA1 concatenated hash. | |
| 1044 * In that case, we use just the SHA1 part. */ | |
| 1045 if (hash->hashAlg == ssl_hash_none) { | |
| 1046 hashItem.data = hash->u.s.sha; | |
| 1047 hashItem.len = sizeof(hash->u.s.sha); | |
| 1048 } else { | |
| 1049 hashItem.data = hash->u.raw; | |
| 1050 hashItem.len = hash->len; | |
| 1051 } | |
| 1052 break; | |
| 1053 #endif /* NSS_DISABLE_ECC */ | |
| 1054 default: | |
| 1055 PORT_SetError(SEC_ERROR_INVALID_KEY); | |
| 1056 goto done; | |
| 1057 } | |
| 1058 PRINT_BUF(60, (NULL, "hash(es) to be signed", hashItem.data, hashItem.len)); | |
| 1059 | |
| 1060 if (hash->hashAlg == ssl_hash_none) { | |
| 1061 signatureLen = PK11_SignatureLen(key); | |
| 1062 if (signatureLen <= 0) { | |
| 1063 PORT_SetError(SEC_ERROR_INVALID_KEY); | |
| 1064 goto done; | |
| 1065 } | |
| 1066 | |
| 1067 buf->len = (unsigned)signatureLen; | |
| 1068 buf->data = (unsigned char *)PORT_Alloc(signatureLen); | |
| 1069 if (!buf->data) | |
| 1070 goto done; /* error code was set. */ | |
| 1071 | |
| 1072 rv = PK11_Sign(key, buf, &hashItem); | |
| 1073 } else { | |
| 1074 SECOidTag hashOID = ssl3_TLSHashAlgorithmToOID(hash->hashAlg); | |
| 1075 rv = SGN_Digest(key, hashOID, buf, &hashItem); | |
| 1076 } | |
| 1077 if (rv != SECSuccess) { | |
| 1078 ssl_MapLowLevelError(SSL_ERROR_SIGN_HASHES_FAILURE); | |
| 1079 } else if (doDerEncode) { | |
| 1080 SECItem derSig = { siBuffer, NULL, 0 }; | |
| 1081 | |
| 1082 /* This also works for an ECDSA signature */ | |
| 1083 rv = DSAU_EncodeDerSigWithLen(&derSig, buf, buf->len); | |
| 1084 if (rv == SECSuccess) { | |
| 1085 PORT_Free(buf->data); /* discard unencoded signature. */ | |
| 1086 *buf = derSig; /* give caller encoded signature. */ | |
| 1087 } else if (derSig.data) { | |
| 1088 PORT_Free(derSig.data); | |
| 1089 } | |
| 1090 } | |
| 1091 | |
| 1092 PRINT_BUF(60, (NULL, "signed hashes", (unsigned char *)buf->data, buf->len))
; | |
| 1093 done: | |
| 1094 if (rv != SECSuccess && buf->data) { | |
| 1095 PORT_Free(buf->data); | |
| 1096 buf->data = NULL; | |
| 1097 } | |
| 1098 return rv; | |
| 1099 } | |
| 1100 | |
| 1101 /* Called from ssl3_HandleServerKeyExchange, ssl3_HandleCertificateVerify */ | |
| 1102 SECStatus | |
| 1103 ssl3_VerifySignedHashes(SSL3Hashes *hash, CERTCertificate *cert, | |
| 1104 SECItem *buf, PRBool isTLS, void *pwArg) | |
| 1105 { | |
| 1106 SECKEYPublicKey *key; | |
| 1107 SECItem *signature = NULL; | |
| 1108 SECStatus rv; | |
| 1109 SECItem hashItem; | |
| 1110 SECOidTag encAlg; | |
| 1111 SECOidTag hashAlg; | |
| 1112 | |
| 1113 PRINT_BUF(60, (NULL, "check signed hashes", | |
| 1114 buf->data, buf->len)); | |
| 1115 | |
| 1116 key = CERT_ExtractPublicKey(cert); | |
| 1117 if (key == NULL) { | |
| 1118 ssl_MapLowLevelError(SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE); | |
| 1119 return SECFailure; | |
| 1120 } | |
| 1121 | |
| 1122 hashAlg = ssl3_TLSHashAlgorithmToOID(hash->hashAlg); | |
| 1123 switch (key->keyType) { | |
| 1124 case rsaKey: | |
| 1125 encAlg = SEC_OID_PKCS1_RSA_ENCRYPTION; | |
| 1126 hashItem.data = hash->u.raw; | |
| 1127 hashItem.len = hash->len; | |
| 1128 break; | |
| 1129 case dsaKey: | |
| 1130 encAlg = SEC_OID_ANSIX9_DSA_SIGNATURE; | |
| 1131 /* ssl_hash_none is used to specify the MD5/SHA1 concatenated hash. | |
| 1132 * In that case, we use just the SHA1 part. */ | |
| 1133 if (hash->hashAlg == ssl_hash_none) { | |
| 1134 hashItem.data = hash->u.s.sha; | |
| 1135 hashItem.len = sizeof(hash->u.s.sha); | |
| 1136 } else { | |
| 1137 hashItem.data = hash->u.raw; | |
| 1138 hashItem.len = hash->len; | |
| 1139 } | |
| 1140 /* Allow DER encoded DSA signatures in SSL 3.0 */ | |
| 1141 if (isTLS || buf->len != SECKEY_SignatureLen(key)) { | |
| 1142 signature = DSAU_DecodeDerSigToLen(buf, SECKEY_SignatureLen(key)
); | |
| 1143 if (!signature) { | |
| 1144 PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); | |
| 1145 return SECFailure; | |
| 1146 } | |
| 1147 buf = signature; | |
| 1148 } | |
| 1149 break; | |
| 1150 | |
| 1151 #ifndef NSS_DISABLE_ECC | |
| 1152 case ecKey: | |
| 1153 encAlg = SEC_OID_ANSIX962_EC_PUBLIC_KEY; | |
| 1154 /* ssl_hash_none is used to specify the MD5/SHA1 concatenated hash. | |
| 1155 * In that case, we use just the SHA1 part. | |
| 1156 * ECDSA signatures always encode the integers r and s using ASN.1 | |
| 1157 * (unlike DSA where ASN.1 encoding is used with TLS but not with | |
| 1158 * SSL3). So we can use VFY_VerifyDigestDirect for ECDSA. | |
| 1159 */ | |
| 1160 if (hash->hashAlg == ssl_hash_none) { | |
| 1161 hashAlg = SEC_OID_SHA1; | |
| 1162 hashItem.data = hash->u.s.sha; | |
| 1163 hashItem.len = sizeof(hash->u.s.sha); | |
| 1164 } else { | |
| 1165 hashItem.data = hash->u.raw; | |
| 1166 hashItem.len = hash->len; | |
| 1167 } | |
| 1168 break; | |
| 1169 #endif /* NSS_DISABLE_ECC */ | |
| 1170 | |
| 1171 default: | |
| 1172 SECKEY_DestroyPublicKey(key); | |
| 1173 PORT_SetError(SEC_ERROR_UNSUPPORTED_KEYALG); | |
| 1174 return SECFailure; | |
| 1175 } | |
| 1176 | |
| 1177 PRINT_BUF(60, (NULL, "hash(es) to be verified", | |
| 1178 hashItem.data, hashItem.len)); | |
| 1179 | |
| 1180 if (hashAlg == SEC_OID_UNKNOWN || key->keyType == dsaKey) { | |
| 1181 /* VFY_VerifyDigestDirect requires DSA signatures to be DER-encoded. | |
| 1182 * DSA signatures are DER-encoded in TLS but not in SSL3 and the code | |
| 1183 * above always removes the DER encoding of DSA signatures when | |
| 1184 * present. Thus DSA signatures are always verified with PK11_Verify. | |
| 1185 */ | |
| 1186 rv = PK11_Verify(key, buf, &hashItem, pwArg); | |
| 1187 } else { | |
| 1188 rv = VFY_VerifyDigestDirect(&hashItem, key, buf, encAlg, hashAlg, | |
| 1189 pwArg); | |
| 1190 } | |
| 1191 SECKEY_DestroyPublicKey(key); | |
| 1192 if (signature) { | |
| 1193 SECITEM_FreeItem(signature, PR_TRUE); | |
| 1194 } | |
| 1195 if (rv != SECSuccess) { | |
| 1196 ssl_MapLowLevelError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); | |
| 1197 } | |
| 1198 return rv; | |
| 1199 } | |
| 1200 | |
| 1201 /* Caller must set hiLevel error code. */ | |
| 1202 /* Called from ssl3_ComputeExportRSAKeyHash | |
| 1203 * ssl3_ComputeDHKeyHash | |
| 1204 * which are called from ssl3_HandleServerKeyExchange. | |
| 1205 * | |
| 1206 * hashAlg: ssl_hash_none indicates the pre-1.2, MD5/SHA1 combination hash. | |
| 1207 */ | |
| 1208 SECStatus | |
| 1209 ssl3_ComputeCommonKeyHash(SSLHashType hashAlg, | |
| 1210 PRUint8 *hashBuf, unsigned int bufLen, | |
| 1211 SSL3Hashes *hashes, PRBool bypassPKCS11) | |
| 1212 { | |
| 1213 SECStatus rv; | |
| 1214 SECOidTag hashOID; | |
| 1215 | |
| 1216 #ifndef NO_PKCS11_BYPASS | |
| 1217 if (bypassPKCS11) { | |
| 1218 if (hashAlg == ssl_hash_none) { | |
| 1219 MD5_HashBuf(hashes->u.s.md5, hashBuf, bufLen); | |
| 1220 SHA1_HashBuf(hashes->u.s.sha, hashBuf, bufLen); | |
| 1221 hashes->len = MD5_LENGTH + SHA1_LENGTH; | |
| 1222 } else if (hashAlg == ssl_hash_sha1) { | |
| 1223 SHA1_HashBuf(hashes->u.raw, hashBuf, bufLen); | |
| 1224 hashes->len = SHA1_LENGTH; | |
| 1225 } else if (hashAlg == ssl_hash_sha256) { | |
| 1226 SHA256_HashBuf(hashes->u.raw, hashBuf, bufLen); | |
| 1227 hashes->len = SHA256_LENGTH; | |
| 1228 } else if (hashAlg == ssl_hash_sha384) { | |
| 1229 SHA384_HashBuf(hashes->u.raw, hashBuf, bufLen); | |
| 1230 hashes->len = SHA384_LENGTH; | |
| 1231 } else if (hashAlg == ssl_hash_sha512) { | |
| 1232 SHA512_HashBuf(hashes->u.raw, hashBuf, bufLen); | |
| 1233 hashes->len = SHA512_LENGTH; | |
| 1234 } else { | |
| 1235 PORT_SetError(SSL_ERROR_UNSUPPORTED_HASH_ALGORITHM); | |
| 1236 return SECFailure; | |
| 1237 } | |
| 1238 } else | |
| 1239 #endif | |
| 1240 { | |
| 1241 if (hashAlg == ssl_hash_none) { | |
| 1242 rv = PK11_HashBuf(SEC_OID_MD5, hashes->u.s.md5, hashBuf, bufLen); | |
| 1243 if (rv != SECSuccess) { | |
| 1244 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); | |
| 1245 return rv; | |
| 1246 } | |
| 1247 rv = PK11_HashBuf(SEC_OID_SHA1, hashes->u.s.sha, hashBuf, bufLen); | |
| 1248 if (rv != SECSuccess) { | |
| 1249 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | |
| 1250 return rv; | |
| 1251 } | |
| 1252 hashes->len = MD5_LENGTH + SHA1_LENGTH; | |
| 1253 } else { | |
| 1254 hashOID = ssl3_TLSHashAlgorithmToOID(hashAlg); | |
| 1255 hashes->len = HASH_ResultLenByOidTag(hashOID); | |
| 1256 if (hashes->len == 0 || hashes->len > sizeof(hashes->u.raw)) { | |
| 1257 ssl_MapLowLevelError(SSL_ERROR_UNSUPPORTED_HASH_ALGORITHM); | |
| 1258 return SECFailure; | |
| 1259 } | |
| 1260 rv = PK11_HashBuf(hashOID, hashes->u.raw, hashBuf, bufLen); | |
| 1261 if (rv != SECSuccess) { | |
| 1262 ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); | |
| 1263 return rv; | |
| 1264 } | |
| 1265 } | |
| 1266 } | |
| 1267 hashes->hashAlg = hashAlg; | |
| 1268 return SECSuccess; | |
| 1269 } | |
| 1270 | |
| 1271 /* Caller must set hiLevel error code. | |
| 1272 ** Called from ssl3_SendServerKeyExchange and | |
| 1273 ** ssl3_HandleServerKeyExchange. | |
| 1274 */ | |
| 1275 static SECStatus | |
| 1276 ssl3_ComputeExportRSAKeyHash(SSLHashType hashAlg, | |
| 1277 SECItem modulus, SECItem publicExponent, | |
| 1278 SSL3Random *client_rand, SSL3Random *server_rand, | |
| 1279 SSL3Hashes *hashes, PRBool bypassPKCS11) | |
| 1280 { | |
| 1281 PRUint8 *hashBuf; | |
| 1282 PRUint8 *pBuf; | |
| 1283 SECStatus rv = SECSuccess; | |
| 1284 unsigned int bufLen; | |
| 1285 PRUint8 buf[2 * SSL3_RANDOM_LENGTH + 2 + 4096 / 8 + 2 + 4096 / 8]; | |
| 1286 | |
| 1287 bufLen = 2 * SSL3_RANDOM_LENGTH + 2 + modulus.len + 2 + publicExponent.len; | |
| 1288 if (bufLen <= sizeof buf) { | |
| 1289 hashBuf = buf; | |
| 1290 } else { | |
| 1291 hashBuf = PORT_Alloc(bufLen); | |
| 1292 if (!hashBuf) { | |
| 1293 return SECFailure; | |
| 1294 } | |
| 1295 } | |
| 1296 | |
| 1297 memcpy(hashBuf, client_rand, SSL3_RANDOM_LENGTH); | |
| 1298 pBuf = hashBuf + SSL3_RANDOM_LENGTH; | |
| 1299 memcpy(pBuf, server_rand, SSL3_RANDOM_LENGTH); | |
| 1300 pBuf += SSL3_RANDOM_LENGTH; | |
| 1301 pBuf[0] = (PRUint8)(modulus.len >> 8); | |
| 1302 pBuf[1] = (PRUint8)(modulus.len); | |
| 1303 pBuf += 2; | |
| 1304 memcpy(pBuf, modulus.data, modulus.len); | |
| 1305 pBuf += modulus.len; | |
| 1306 pBuf[0] = (PRUint8)(publicExponent.len >> 8); | |
| 1307 pBuf[1] = (PRUint8)(publicExponent.len); | |
| 1308 pBuf += 2; | |
| 1309 memcpy(pBuf, publicExponent.data, publicExponent.len); | |
| 1310 pBuf += publicExponent.len; | |
| 1311 PORT_Assert((unsigned int)(pBuf - hashBuf) == bufLen); | |
| 1312 | |
| 1313 rv = ssl3_ComputeCommonKeyHash(hashAlg, hashBuf, bufLen, hashes, | |
| 1314 bypassPKCS11); | |
| 1315 | |
| 1316 PRINT_BUF(95, (NULL, "RSAkey hash: ", hashBuf, bufLen)); | |
| 1317 if (hashAlg == ssl_hash_none) { | |
| 1318 PRINT_BUF(95, (NULL, "RSAkey hash: MD5 result", | |
| 1319 hashes->u.s.md5, MD5_LENGTH)); | |
| 1320 PRINT_BUF(95, (NULL, "RSAkey hash: SHA1 result", | |
| 1321 hashes->u.s.sha, SHA1_LENGTH)); | |
| 1322 } else { | |
| 1323 PRINT_BUF(95, (NULL, "RSAkey hash: result", | |
| 1324 hashes->u.raw, hashes->len)); | |
| 1325 } | |
| 1326 | |
| 1327 if (hashBuf != buf && hashBuf != NULL) | |
| 1328 PORT_Free(hashBuf); | |
| 1329 return rv; | |
| 1330 } | |
| 1331 | |
| 1332 /* Caller must set hiLevel error code. */ | |
| 1333 /* Called from ssl3_HandleServerKeyExchange. */ | |
| 1334 static SECStatus | |
| 1335 ssl3_ComputeDHKeyHash(SSLHashType hashAlg, | |
| 1336 SECItem dh_p, SECItem dh_g, SECItem dh_Ys, | |
| 1337 SSL3Random *client_rand, SSL3Random *server_rand, | |
| 1338 SSL3Hashes *hashes, PRBool bypassPKCS11) | |
| 1339 { | |
| 1340 PRUint8 *hashBuf; | |
| 1341 PRUint8 *pBuf; | |
| 1342 SECStatus rv = SECSuccess; | |
| 1343 unsigned int bufLen; | |
| 1344 PRUint8 buf[2 * SSL3_RANDOM_LENGTH + 2 + 4096 / 8 + 2 + 4096 / 8]; | |
| 1345 | |
| 1346 bufLen = 2 * SSL3_RANDOM_LENGTH + 2 + dh_p.len + 2 + dh_g.len + 2 + dh_Ys.le
n; | |
| 1347 if (bufLen <= sizeof buf) { | |
| 1348 hashBuf = buf; | |
| 1349 } else { | |
| 1350 hashBuf = PORT_Alloc(bufLen); | |
| 1351 if (!hashBuf) { | |
| 1352 return SECFailure; | |
| 1353 } | |
| 1354 } | |
| 1355 | |
| 1356 memcpy(hashBuf, client_rand, SSL3_RANDOM_LENGTH); | |
| 1357 pBuf = hashBuf + SSL3_RANDOM_LENGTH; | |
| 1358 memcpy(pBuf, server_rand, SSL3_RANDOM_LENGTH); | |
| 1359 pBuf += SSL3_RANDOM_LENGTH; | |
| 1360 pBuf[0] = (PRUint8)(dh_p.len >> 8); | |
| 1361 pBuf[1] = (PRUint8)(dh_p.len); | |
| 1362 pBuf += 2; | |
| 1363 memcpy(pBuf, dh_p.data, dh_p.len); | |
| 1364 pBuf += dh_p.len; | |
| 1365 pBuf[0] = (PRUint8)(dh_g.len >> 8); | |
| 1366 pBuf[1] = (PRUint8)(dh_g.len); | |
| 1367 pBuf += 2; | |
| 1368 memcpy(pBuf, dh_g.data, dh_g.len); | |
| 1369 pBuf += dh_g.len; | |
| 1370 pBuf[0] = (PRUint8)(dh_Ys.len >> 8); | |
| 1371 pBuf[1] = (PRUint8)(dh_Ys.len); | |
| 1372 pBuf += 2; | |
| 1373 memcpy(pBuf, dh_Ys.data, dh_Ys.len); | |
| 1374 pBuf += dh_Ys.len; | |
| 1375 PORT_Assert((unsigned int)(pBuf - hashBuf) == bufLen); | |
| 1376 | |
| 1377 rv = ssl3_ComputeCommonKeyHash(hashAlg, hashBuf, bufLen, hashes, | |
| 1378 bypassPKCS11); | |
| 1379 | |
| 1380 PRINT_BUF(95, (NULL, "DHkey hash: ", hashBuf, bufLen)); | |
| 1381 if (hashAlg == ssl_hash_none) { | |
| 1382 PRINT_BUF(95, (NULL, "DHkey hash: MD5 result", | |
| 1383 hashes->u.s.md5, MD5_LENGTH)); | |
| 1384 PRINT_BUF(95, (NULL, "DHkey hash: SHA1 result", | |
| 1385 hashes->u.s.sha, SHA1_LENGTH)); | |
| 1386 } else { | |
| 1387 PRINT_BUF(95, (NULL, "DHkey hash: result", | |
| 1388 hashes->u.raw, hashes->len)); | |
| 1389 } | |
| 1390 | |
| 1391 if (hashBuf != buf && hashBuf != NULL) | |
| 1392 PORT_Free(hashBuf); | |
| 1393 return rv; | |
| 1394 } | |
| 1395 | |
| 1396 void | |
| 1397 ssl3_BumpSequenceNumber(SSL3SequenceNumber *num) | |
| 1398 { | |
| 1399 num->low++; | |
| 1400 if (num->low == 0) | |
| 1401 num->high++; | |
| 1402 } | |
| 1403 | |
| 1404 /* Called twice, only from ssl3_DestroyCipherSpec (immediately below). */ | |
| 1405 static void | |
| 1406 ssl3_CleanupKeyMaterial(ssl3KeyMaterial *mat) | |
| 1407 { | |
| 1408 if (mat->write_key != NULL) { | |
| 1409 PK11_FreeSymKey(mat->write_key); | |
| 1410 mat->write_key = NULL; | |
| 1411 } | |
| 1412 if (mat->write_mac_key != NULL) { | |
| 1413 PK11_FreeSymKey(mat->write_mac_key); | |
| 1414 mat->write_mac_key = NULL; | |
| 1415 } | |
| 1416 if (mat->write_mac_context != NULL) { | |
| 1417 PK11_DestroyContext(mat->write_mac_context, PR_TRUE); | |
| 1418 mat->write_mac_context = NULL; | |
| 1419 } | |
| 1420 } | |
| 1421 | |
| 1422 /* Called from ssl3_SendChangeCipherSpecs() and | |
| 1423 ** ssl3_HandleChangeCipherSpecs() | |
| 1424 ** ssl3_DestroySSL3Info | |
| 1425 ** Caller must hold SpecWriteLock. | |
| 1426 */ | |
| 1427 void | |
| 1428 ssl3_DestroyCipherSpec(ssl3CipherSpec *spec, PRBool freeSrvName) | |
| 1429 { | |
| 1430 PRBool freeit = (PRBool)(!spec->bypassCiphers); | |
| 1431 /* PORT_Assert( ss->opt.noLocks || ssl_HaveSpecWriteLock(ss)); Don't have s
s! */ | |
| 1432 if (spec->destroy) { | |
| 1433 spec->destroy(spec->encodeContext, freeit); | |
| 1434 spec->destroy(spec->decodeContext, freeit); | |
| 1435 spec->encodeContext = NULL; /* paranoia */ | |
| 1436 spec->decodeContext = NULL; | |
| 1437 } | |
| 1438 if (spec->destroyCompressContext && spec->compressContext) { | |
| 1439 spec->destroyCompressContext(spec->compressContext, 1); | |
| 1440 spec->compressContext = NULL; | |
| 1441 } | |
| 1442 if (spec->destroyDecompressContext && spec->decompressContext) { | |
| 1443 spec->destroyDecompressContext(spec->decompressContext, 1); | |
| 1444 spec->decompressContext = NULL; | |
| 1445 } | |
| 1446 if (freeSrvName && spec->srvVirtName.data) { | |
| 1447 SECITEM_FreeItem(&spec->srvVirtName, PR_FALSE); | |
| 1448 } | |
| 1449 if (spec->master_secret != NULL) { | |
| 1450 PK11_FreeSymKey(spec->master_secret); | |
| 1451 spec->master_secret = NULL; | |
| 1452 } | |
| 1453 spec->msItem.data = NULL; | |
| 1454 spec->msItem.len = 0; | |
| 1455 ssl3_CleanupKeyMaterial(&spec->client); | |
| 1456 ssl3_CleanupKeyMaterial(&spec->server); | |
| 1457 spec->bypassCiphers = PR_FALSE; | |
| 1458 spec->destroy = NULL; | |
| 1459 spec->destroyCompressContext = NULL; | |
| 1460 spec->destroyDecompressContext = NULL; | |
| 1461 } | |
| 1462 | |
| 1463 /* Fill in the pending cipher spec with info from the selected ciphersuite. | |
| 1464 ** This is as much initialization as we can do without having key material. | |
| 1465 ** Called from ssl3_HandleServerHello(), ssl3_SendServerHello() | |
| 1466 ** Caller must hold the ssl3 handshake lock. | |
| 1467 ** Acquires & releases SpecWriteLock. | |
| 1468 */ | |
| 1469 SECStatus | |
| 1470 ssl3_SetupPendingCipherSpec(sslSocket *ss) | |
| 1471 { | |
| 1472 ssl3CipherSpec *pwSpec; | |
| 1473 ssl3CipherSpec *cwSpec; | |
| 1474 ssl3CipherSuite suite = ss->ssl3.hs.cipher_suite; | |
| 1475 SSL3MACAlgorithm mac; | |
| 1476 SSL3BulkCipher cipher; | |
| 1477 SSL3KeyExchangeAlgorithm kea; | |
| 1478 const ssl3CipherSuiteDef *suite_def; | |
| 1479 PRBool isTLS; | |
| 1480 | |
| 1481 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 1482 | |
| 1483 ssl_GetSpecWriteLock(ss); /*******************************/ | |
| 1484 | |
| 1485 pwSpec = ss->ssl3.pwSpec; | |
| 1486 PORT_Assert(pwSpec == ss->ssl3.prSpec); | |
| 1487 | |
| 1488 /* This hack provides maximal interoperability with SSL 3 servers. */ | |
| 1489 cwSpec = ss->ssl3.cwSpec; | |
| 1490 if (cwSpec->mac_def->mac == mac_null) { | |
| 1491 /* SSL records are not being MACed. */ | |
| 1492 cwSpec->version = ss->version; | |
| 1493 } | |
| 1494 | |
| 1495 pwSpec->version = ss->version; | |
| 1496 isTLS = (PRBool)(pwSpec->version > SSL_LIBRARY_VERSION_3_0); | |
| 1497 | |
| 1498 SSL_TRC(3, ("%d: SSL3[%d]: Set XXX Pending Cipher Suite to 0x%04x", | |
| 1499 SSL_GETPID(), ss->fd, suite)); | |
| 1500 | |
| 1501 suite_def = ssl_LookupCipherSuiteDef(suite); | |
| 1502 if (suite_def == NULL) { | |
| 1503 ssl_ReleaseSpecWriteLock(ss); | |
| 1504 return SECFailure; /* error code set by ssl_LookupCipherSuiteDef */ | |
| 1505 } | |
| 1506 | |
| 1507 if (IS_DTLS(ss)) { | |
| 1508 /* Double-check that we did not pick an RC4 suite */ | |
| 1509 PORT_Assert((suite_def->bulk_cipher_alg != cipher_rc4) && | |
| 1510 (suite_def->bulk_cipher_alg != cipher_rc4_40) && | |
| 1511 (suite_def->bulk_cipher_alg != cipher_rc4_56)); | |
| 1512 } | |
| 1513 | |
| 1514 cipher = suite_def->bulk_cipher_alg; | |
| 1515 kea = suite_def->key_exchange_alg; | |
| 1516 mac = suite_def->mac_alg; | |
| 1517 if (mac <= ssl_mac_sha && mac != ssl_mac_null && isTLS) | |
| 1518 mac += 2; | |
| 1519 | |
| 1520 ss->ssl3.hs.suite_def = suite_def; | |
| 1521 ss->ssl3.hs.kea_def = &kea_defs[kea]; | |
| 1522 PORT_Assert(ss->ssl3.hs.kea_def->kea == kea); | |
| 1523 | |
| 1524 pwSpec->cipher_def = &bulk_cipher_defs[cipher]; | |
| 1525 PORT_Assert(pwSpec->cipher_def->cipher == cipher); | |
| 1526 | |
| 1527 pwSpec->mac_def = &mac_defs[mac]; | |
| 1528 PORT_Assert(pwSpec->mac_def->mac == mac); | |
| 1529 | |
| 1530 ss->sec.keyBits = pwSpec->cipher_def->key_size * BPB; | |
| 1531 ss->sec.secretKeyBits = pwSpec->cipher_def->secret_key_size * BPB; | |
| 1532 ss->sec.cipherType = cipher; | |
| 1533 | |
| 1534 pwSpec->encodeContext = NULL; | |
| 1535 pwSpec->decodeContext = NULL; | |
| 1536 | |
| 1537 pwSpec->mac_size = pwSpec->mac_def->mac_size; | |
| 1538 | |
| 1539 pwSpec->compression_method = ss->ssl3.hs.compression; | |
| 1540 pwSpec->compressContext = NULL; | |
| 1541 pwSpec->decompressContext = NULL; | |
| 1542 | |
| 1543 if (ss->version >= SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 1544 PORT_Assert(ss->ssl3.hs.kea_def->ephemeral); | |
| 1545 PORT_Assert(pwSpec->cipher_def->type == type_aead); | |
| 1546 } | |
| 1547 ssl_ReleaseSpecWriteLock(ss); /*******************************/ | |
| 1548 return SECSuccess; | |
| 1549 } | |
| 1550 | |
| 1551 #ifdef NSS_SSL_ENABLE_ZLIB | |
| 1552 #define SSL3_DEFLATE_CONTEXT_SIZE sizeof(z_stream) | |
| 1553 | |
| 1554 static SECStatus | |
| 1555 ssl3_MapZlibError(int zlib_error) | |
| 1556 { | |
| 1557 switch (zlib_error) { | |
| 1558 case Z_OK: | |
| 1559 return SECSuccess; | |
| 1560 default: | |
| 1561 return SECFailure; | |
| 1562 } | |
| 1563 } | |
| 1564 | |
| 1565 static SECStatus | |
| 1566 ssl3_DeflateInit(void *void_context) | |
| 1567 { | |
| 1568 z_stream *context = void_context; | |
| 1569 context->zalloc = NULL; | |
| 1570 context->zfree = NULL; | |
| 1571 context->opaque = NULL; | |
| 1572 | |
| 1573 return ssl3_MapZlibError(deflateInit(context, Z_DEFAULT_COMPRESSION)); | |
| 1574 } | |
| 1575 | |
| 1576 static SECStatus | |
| 1577 ssl3_InflateInit(void *void_context) | |
| 1578 { | |
| 1579 z_stream *context = void_context; | |
| 1580 context->zalloc = NULL; | |
| 1581 context->zfree = NULL; | |
| 1582 context->opaque = NULL; | |
| 1583 context->next_in = NULL; | |
| 1584 context->avail_in = 0; | |
| 1585 | |
| 1586 return ssl3_MapZlibError(inflateInit(context)); | |
| 1587 } | |
| 1588 | |
| 1589 static SECStatus | |
| 1590 ssl3_DeflateCompress(void *void_context, unsigned char *out, int *out_len, | |
| 1591 int maxout, const unsigned char *in, int inlen) | |
| 1592 { | |
| 1593 z_stream *context = void_context; | |
| 1594 | |
| 1595 if (!inlen) { | |
| 1596 *out_len = 0; | |
| 1597 return SECSuccess; | |
| 1598 } | |
| 1599 | |
| 1600 context->next_in = (unsigned char *)in; | |
| 1601 context->avail_in = inlen; | |
| 1602 context->next_out = out; | |
| 1603 context->avail_out = maxout; | |
| 1604 if (deflate(context, Z_SYNC_FLUSH) != Z_OK) { | |
| 1605 return SECFailure; | |
| 1606 } | |
| 1607 if (context->avail_out == 0) { | |
| 1608 /* We ran out of space! */ | |
| 1609 SSL_TRC(3, ("%d: SSL3[%d] Ran out of buffer while compressing", | |
| 1610 SSL_GETPID())); | |
| 1611 return SECFailure; | |
| 1612 } | |
| 1613 | |
| 1614 *out_len = maxout - context->avail_out; | |
| 1615 return SECSuccess; | |
| 1616 } | |
| 1617 | |
| 1618 static SECStatus | |
| 1619 ssl3_DeflateDecompress(void *void_context, unsigned char *out, int *out_len, | |
| 1620 int maxout, const unsigned char *in, int inlen) | |
| 1621 { | |
| 1622 z_stream *context = void_context; | |
| 1623 | |
| 1624 if (!inlen) { | |
| 1625 *out_len = 0; | |
| 1626 return SECSuccess; | |
| 1627 } | |
| 1628 | |
| 1629 context->next_in = (unsigned char *)in; | |
| 1630 context->avail_in = inlen; | |
| 1631 context->next_out = out; | |
| 1632 context->avail_out = maxout; | |
| 1633 if (inflate(context, Z_SYNC_FLUSH) != Z_OK) { | |
| 1634 PORT_SetError(SSL_ERROR_DECOMPRESSION_FAILURE); | |
| 1635 return SECFailure; | |
| 1636 } | |
| 1637 | |
| 1638 *out_len = maxout - context->avail_out; | |
| 1639 return SECSuccess; | |
| 1640 } | |
| 1641 | |
| 1642 static SECStatus | |
| 1643 ssl3_DestroyCompressContext(void *void_context, PRBool unused) | |
| 1644 { | |
| 1645 deflateEnd(void_context); | |
| 1646 PORT_Free(void_context); | |
| 1647 return SECSuccess; | |
| 1648 } | |
| 1649 | |
| 1650 static SECStatus | |
| 1651 ssl3_DestroyDecompressContext(void *void_context, PRBool unused) | |
| 1652 { | |
| 1653 inflateEnd(void_context); | |
| 1654 PORT_Free(void_context); | |
| 1655 return SECSuccess; | |
| 1656 } | |
| 1657 | |
| 1658 #endif /* NSS_SSL_ENABLE_ZLIB */ | |
| 1659 | |
| 1660 /* Initialize the compression functions and contexts for the given | |
| 1661 * CipherSpec. */ | |
| 1662 static SECStatus | |
| 1663 ssl3_InitCompressionContext(ssl3CipherSpec *pwSpec) | |
| 1664 { | |
| 1665 /* Setup the compression functions */ | |
| 1666 switch (pwSpec->compression_method) { | |
| 1667 case ssl_compression_null: | |
| 1668 pwSpec->compressor = NULL; | |
| 1669 pwSpec->decompressor = NULL; | |
| 1670 pwSpec->compressContext = NULL; | |
| 1671 pwSpec->decompressContext = NULL; | |
| 1672 pwSpec->destroyCompressContext = NULL; | |
| 1673 pwSpec->destroyDecompressContext = NULL; | |
| 1674 break; | |
| 1675 #ifdef NSS_SSL_ENABLE_ZLIB | |
| 1676 case ssl_compression_deflate: | |
| 1677 pwSpec->compressor = ssl3_DeflateCompress; | |
| 1678 pwSpec->decompressor = ssl3_DeflateDecompress; | |
| 1679 pwSpec->compressContext = PORT_Alloc(SSL3_DEFLATE_CONTEXT_SIZE); | |
| 1680 pwSpec->decompressContext = PORT_Alloc(SSL3_DEFLATE_CONTEXT_SIZE); | |
| 1681 pwSpec->destroyCompressContext = ssl3_DestroyCompressContext; | |
| 1682 pwSpec->destroyDecompressContext = ssl3_DestroyDecompressContext; | |
| 1683 ssl3_DeflateInit(pwSpec->compressContext); | |
| 1684 ssl3_InflateInit(pwSpec->decompressContext); | |
| 1685 break; | |
| 1686 #endif /* NSS_SSL_ENABLE_ZLIB */ | |
| 1687 default: | |
| 1688 PORT_Assert(0); | |
| 1689 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 1690 return SECFailure; | |
| 1691 } | |
| 1692 | |
| 1693 return SECSuccess; | |
| 1694 } | |
| 1695 | |
| 1696 #ifndef NO_PKCS11_BYPASS | |
| 1697 /* Initialize encryption contexts for pending spec. | |
| 1698 * MAC contexts are set up when computing the mac, not here. | |
| 1699 * Master Secret already is derived in spec->msItem | |
| 1700 * Caller holds Spec write lock. | |
| 1701 */ | |
| 1702 static SECStatus | |
| 1703 ssl3_InitPendingContextsBypass(sslSocket *ss) | |
| 1704 { | |
| 1705 ssl3CipherSpec *pwSpec; | |
| 1706 const ssl3BulkCipherDef *cipher_def; | |
| 1707 void *serverContext = NULL; | |
| 1708 void *clientContext = NULL; | |
| 1709 BLapiInitContextFunc initFn = (BLapiInitContextFunc)NULL; | |
| 1710 int mode = 0; | |
| 1711 unsigned int optArg1 = 0; | |
| 1712 unsigned int optArg2 = 0; | |
| 1713 PRBool server_encrypts = ss->sec.isServer; | |
| 1714 SSLCipherAlgorithm calg; | |
| 1715 SECStatus rv; | |
| 1716 | |
| 1717 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 1718 PORT_Assert(ss->opt.noLocks || ssl_HaveSpecWriteLock(ss)); | |
| 1719 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); | |
| 1720 | |
| 1721 pwSpec = ss->ssl3.pwSpec; | |
| 1722 cipher_def = pwSpec->cipher_def; | |
| 1723 | |
| 1724 calg = cipher_def->calg; | |
| 1725 | |
| 1726 if (calg == ssl_calg_aes_gcm) { | |
| 1727 pwSpec->encode = NULL; | |
| 1728 pwSpec->decode = NULL; | |
| 1729 pwSpec->destroy = NULL; | |
| 1730 pwSpec->encodeContext = NULL; | |
| 1731 pwSpec->decodeContext = NULL; | |
| 1732 pwSpec->aead = ssl3_AESGCMBypass; | |
| 1733 ssl3_InitCompressionContext(pwSpec); | |
| 1734 return SECSuccess; | |
| 1735 } | |
| 1736 | |
| 1737 serverContext = pwSpec->server.cipher_context; | |
| 1738 clientContext = pwSpec->client.cipher_context; | |
| 1739 | |
| 1740 switch (calg) { | |
| 1741 case ssl_calg_null: | |
| 1742 pwSpec->encode = Null_Cipher; | |
| 1743 pwSpec->decode = Null_Cipher; | |
| 1744 pwSpec->destroy = NULL; | |
| 1745 goto success; | |
| 1746 | |
| 1747 case ssl_calg_rc4: | |
| 1748 initFn = (BLapiInitContextFunc)RC4_InitContext; | |
| 1749 pwSpec->encode = (SSLCipher)RC4_Encrypt; | |
| 1750 pwSpec->decode = (SSLCipher)RC4_Decrypt; | |
| 1751 pwSpec->destroy = (SSLDestroy)RC4_DestroyContext; | |
| 1752 break; | |
| 1753 case ssl_calg_rc2: | |
| 1754 initFn = (BLapiInitContextFunc)RC2_InitContext; | |
| 1755 mode = NSS_RC2_CBC; | |
| 1756 optArg1 = cipher_def->key_size; | |
| 1757 pwSpec->encode = (SSLCipher)RC2_Encrypt; | |
| 1758 pwSpec->decode = (SSLCipher)RC2_Decrypt; | |
| 1759 pwSpec->destroy = (SSLDestroy)RC2_DestroyContext; | |
| 1760 break; | |
| 1761 case ssl_calg_des: | |
| 1762 initFn = (BLapiInitContextFunc)DES_InitContext; | |
| 1763 mode = NSS_DES_CBC; | |
| 1764 optArg1 = server_encrypts; | |
| 1765 pwSpec->encode = (SSLCipher)DES_Encrypt; | |
| 1766 pwSpec->decode = (SSLCipher)DES_Decrypt; | |
| 1767 pwSpec->destroy = (SSLDestroy)DES_DestroyContext; | |
| 1768 break; | |
| 1769 case ssl_calg_3des: | |
| 1770 initFn = (BLapiInitContextFunc)DES_InitContext; | |
| 1771 mode = NSS_DES_EDE3_CBC; | |
| 1772 optArg1 = server_encrypts; | |
| 1773 pwSpec->encode = (SSLCipher)DES_Encrypt; | |
| 1774 pwSpec->decode = (SSLCipher)DES_Decrypt; | |
| 1775 pwSpec->destroy = (SSLDestroy)DES_DestroyContext; | |
| 1776 break; | |
| 1777 case ssl_calg_aes: | |
| 1778 initFn = (BLapiInitContextFunc)AES_InitContext; | |
| 1779 mode = NSS_AES_CBC; | |
| 1780 optArg1 = server_encrypts; | |
| 1781 optArg2 = AES_BLOCK_SIZE; | |
| 1782 pwSpec->encode = (SSLCipher)AES_Encrypt; | |
| 1783 pwSpec->decode = (SSLCipher)AES_Decrypt; | |
| 1784 pwSpec->destroy = (SSLDestroy)AES_DestroyContext; | |
| 1785 break; | |
| 1786 | |
| 1787 case ssl_calg_camellia: | |
| 1788 initFn = (BLapiInitContextFunc)Camellia_InitContext; | |
| 1789 mode = NSS_CAMELLIA_CBC; | |
| 1790 optArg1 = server_encrypts; | |
| 1791 optArg2 = CAMELLIA_BLOCK_SIZE; | |
| 1792 pwSpec->encode = (SSLCipher)Camellia_Encrypt; | |
| 1793 pwSpec->decode = (SSLCipher)Camellia_Decrypt; | |
| 1794 pwSpec->destroy = (SSLDestroy)Camellia_DestroyContext; | |
| 1795 break; | |
| 1796 | |
| 1797 case ssl_calg_seed: | |
| 1798 initFn = (BLapiInitContextFunc)SEED_InitContext; | |
| 1799 mode = NSS_SEED_CBC; | |
| 1800 optArg1 = server_encrypts; | |
| 1801 optArg2 = SEED_BLOCK_SIZE; | |
| 1802 pwSpec->encode = (SSLCipher)SEED_Encrypt; | |
| 1803 pwSpec->decode = (SSLCipher)SEED_Decrypt; | |
| 1804 pwSpec->destroy = (SSLDestroy)SEED_DestroyContext; | |
| 1805 break; | |
| 1806 | |
| 1807 case ssl_calg_idea: | |
| 1808 case ssl_calg_fortezza: | |
| 1809 default: | |
| 1810 PORT_Assert(0); | |
| 1811 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 1812 goto bail_out; | |
| 1813 } | |
| 1814 rv = (*initFn)(serverContext, | |
| 1815 pwSpec->server.write_key_item.data, | |
| 1816 pwSpec->server.write_key_item.len, | |
| 1817 pwSpec->server.write_iv_item.data, | |
| 1818 mode, optArg1, optArg2); | |
| 1819 if (rv != SECSuccess) { | |
| 1820 PORT_Assert(0); | |
| 1821 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 1822 goto bail_out; | |
| 1823 } | |
| 1824 | |
| 1825 switch (calg) { | |
| 1826 case ssl_calg_des: | |
| 1827 case ssl_calg_3des: | |
| 1828 case ssl_calg_aes: | |
| 1829 case ssl_calg_camellia: | |
| 1830 case ssl_calg_seed: | |
| 1831 /* For block ciphers, if the server is encrypting, then the client | |
| 1832 * is decrypting, and vice versa. | |
| 1833 */ | |
| 1834 optArg1 = !optArg1; | |
| 1835 break; | |
| 1836 /* kill warnings. */ | |
| 1837 case ssl_calg_null: | |
| 1838 case ssl_calg_rc4: | |
| 1839 case ssl_calg_rc2: | |
| 1840 case ssl_calg_idea: | |
| 1841 case ssl_calg_fortezza: | |
| 1842 case ssl_calg_aes_gcm: | |
| 1843 case ssl_calg_chacha20: | |
| 1844 break; | |
| 1845 } | |
| 1846 | |
| 1847 rv = (*initFn)(clientContext, | |
| 1848 pwSpec->client.write_key_item.data, | |
| 1849 pwSpec->client.write_key_item.len, | |
| 1850 pwSpec->client.write_iv_item.data, | |
| 1851 mode, optArg1, optArg2); | |
| 1852 if (rv != SECSuccess) { | |
| 1853 PORT_Assert(0); | |
| 1854 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 1855 goto bail_out; | |
| 1856 } | |
| 1857 | |
| 1858 pwSpec->encodeContext = (ss->sec.isServer) ? serverContext : clientContext; | |
| 1859 pwSpec->decodeContext = (ss->sec.isServer) ? clientContext : serverContext; | |
| 1860 | |
| 1861 ssl3_InitCompressionContext(pwSpec); | |
| 1862 | |
| 1863 success: | |
| 1864 return SECSuccess; | |
| 1865 | |
| 1866 bail_out: | |
| 1867 return SECFailure; | |
| 1868 } | |
| 1869 #endif | |
| 1870 | |
| 1871 /* This function should probably be moved to pk11wrap and be named | |
| 1872 * PK11_ParamFromIVAndEffectiveKeyBits | |
| 1873 */ | |
| 1874 static SECItem * | |
| 1875 ssl3_ParamFromIV(CK_MECHANISM_TYPE mtype, SECItem *iv, CK_ULONG ulEffectiveBits) | |
| 1876 { | |
| 1877 SECItem *param = PK11_ParamFromIV(mtype, iv); | |
| 1878 if (param && param->data && param->len >= sizeof(CK_RC2_PARAMS)) { | |
| 1879 switch (mtype) { | |
| 1880 case CKM_RC2_KEY_GEN: | |
| 1881 case CKM_RC2_ECB: | |
| 1882 case CKM_RC2_CBC: | |
| 1883 case CKM_RC2_MAC: | |
| 1884 case CKM_RC2_MAC_GENERAL: | |
| 1885 case CKM_RC2_CBC_PAD: | |
| 1886 *(CK_RC2_PARAMS *)param->data = ulEffectiveBits; | |
| 1887 default: | |
| 1888 break; | |
| 1889 } | |
| 1890 } | |
| 1891 return param; | |
| 1892 } | |
| 1893 | |
| 1894 /* ssl3_BuildRecordPseudoHeader writes the SSL/TLS pseudo-header (the data | |
| 1895 * which is included in the MAC or AEAD additional data) to |out| and returns | |
| 1896 * its length. See https://tools.ietf.org/html/rfc5246#section-6.2.3.3 for the | |
| 1897 * definition of the AEAD additional data. | |
| 1898 * | |
| 1899 * TLS pseudo-header includes the record's version field, SSL's doesn't. Which | |
| 1900 * pseudo-header defintiion to use should be decided based on the version of | |
| 1901 * the protocol that was negotiated when the cipher spec became current, NOT | |
| 1902 * based on the version value in the record itself, and the decision is passed | |
| 1903 * to this function as the |includesVersion| argument. But, the |version| | |
| 1904 * argument should be the record's version value. | |
| 1905 */ | |
| 1906 static unsigned int | |
| 1907 ssl3_BuildRecordPseudoHeader(unsigned char *out, | |
| 1908 SSL3SequenceNumber seq_num, | |
| 1909 SSL3ContentType type, | |
| 1910 PRBool includesVersion, | |
| 1911 SSL3ProtocolVersion version, | |
| 1912 PRBool isDTLS, | |
| 1913 int length) | |
| 1914 { | |
| 1915 out[0] = (unsigned char)(seq_num.high >> 24); | |
| 1916 out[1] = (unsigned char)(seq_num.high >> 16); | |
| 1917 out[2] = (unsigned char)(seq_num.high >> 8); | |
| 1918 out[3] = (unsigned char)(seq_num.high >> 0); | |
| 1919 out[4] = (unsigned char)(seq_num.low >> 24); | |
| 1920 out[5] = (unsigned char)(seq_num.low >> 16); | |
| 1921 out[6] = (unsigned char)(seq_num.low >> 8); | |
| 1922 out[7] = (unsigned char)(seq_num.low >> 0); | |
| 1923 out[8] = type; | |
| 1924 | |
| 1925 /* SSL3 MAC doesn't include the record's version field. */ | |
| 1926 if (!includesVersion) { | |
| 1927 out[9] = MSB(length); | |
| 1928 out[10] = LSB(length); | |
| 1929 return 11; | |
| 1930 } | |
| 1931 | |
| 1932 /* TLS MAC and AEAD additional data include version. */ | |
| 1933 if (isDTLS) { | |
| 1934 SSL3ProtocolVersion dtls_version; | |
| 1935 | |
| 1936 dtls_version = dtls_TLSVersionToDTLSVersion(version); | |
| 1937 out[9] = MSB(dtls_version); | |
| 1938 out[10] = LSB(dtls_version); | |
| 1939 } else { | |
| 1940 out[9] = MSB(version); | |
| 1941 out[10] = LSB(version); | |
| 1942 } | |
| 1943 out[11] = MSB(length); | |
| 1944 out[12] = LSB(length); | |
| 1945 return 13; | |
| 1946 } | |
| 1947 | |
| 1948 static SECStatus | |
| 1949 ssl3_AESGCM(ssl3KeyMaterial *keys, | |
| 1950 PRBool doDecrypt, | |
| 1951 unsigned char *out, | |
| 1952 int *outlen, | |
| 1953 int maxout, | |
| 1954 const unsigned char *in, | |
| 1955 int inlen, | |
| 1956 const unsigned char *additionalData, | |
| 1957 int additionalDataLen) | |
| 1958 { | |
| 1959 SECItem param; | |
| 1960 SECStatus rv = SECFailure; | |
| 1961 unsigned char nonce[12]; | |
| 1962 unsigned int uOutLen; | |
| 1963 CK_GCM_PARAMS gcmParams; | |
| 1964 | |
| 1965 const int tagSize = bulk_cipher_defs[cipher_aes_128_gcm].tag_size; | |
| 1966 const int explicitNonceLen = | |
| 1967 bulk_cipher_defs[cipher_aes_128_gcm].explicit_nonce_size; | |
| 1968 | |
| 1969 /* See https://tools.ietf.org/html/rfc5288#section-3 for details of how the | |
| 1970 * nonce is formed. */ | |
| 1971 memcpy(nonce, keys->write_iv, 4); | |
| 1972 if (doDecrypt) { | |
| 1973 memcpy(nonce + 4, in, explicitNonceLen); | |
| 1974 in += explicitNonceLen; | |
| 1975 inlen -= explicitNonceLen; | |
| 1976 *outlen = 0; | |
| 1977 } else { | |
| 1978 if (maxout < explicitNonceLen) { | |
| 1979 PORT_SetError(SEC_ERROR_INPUT_LEN); | |
| 1980 return SECFailure; | |
| 1981 } | |
| 1982 /* Use the 64-bit sequence number as the explicit nonce. */ | |
| 1983 memcpy(nonce + 4, additionalData, explicitNonceLen); | |
| 1984 memcpy(out, additionalData, explicitNonceLen); | |
| 1985 out += explicitNonceLen; | |
| 1986 maxout -= explicitNonceLen; | |
| 1987 *outlen = explicitNonceLen; | |
| 1988 } | |
| 1989 | |
| 1990 param.type = siBuffer; | |
| 1991 param.data = (unsigned char *)&gcmParams; | |
| 1992 param.len = sizeof(gcmParams); | |
| 1993 gcmParams.pIv = nonce; | |
| 1994 gcmParams.ulIvLen = sizeof(nonce); | |
| 1995 gcmParams.pAAD = (unsigned char *)additionalData; /* const cast */ | |
| 1996 gcmParams.ulAADLen = additionalDataLen; | |
| 1997 gcmParams.ulTagBits = tagSize * 8; | |
| 1998 | |
| 1999 if (doDecrypt) { | |
| 2000 rv = PK11_Decrypt(keys->write_key, CKM_AES_GCM, ¶m, out, &uOutLen, | |
| 2001 maxout, in, inlen); | |
| 2002 } else { | |
| 2003 rv = PK11_Encrypt(keys->write_key, CKM_AES_GCM, ¶m, out, &uOutLen, | |
| 2004 maxout, in, inlen); | |
| 2005 } | |
| 2006 *outlen += (int)uOutLen; | |
| 2007 | |
| 2008 return rv; | |
| 2009 } | |
| 2010 | |
| 2011 #ifndef NO_PKCS11_BYPASS | |
| 2012 static SECStatus | |
| 2013 ssl3_AESGCMBypass(ssl3KeyMaterial *keys, | |
| 2014 PRBool doDecrypt, | |
| 2015 unsigned char *out, | |
| 2016 int *outlen, | |
| 2017 int maxout, | |
| 2018 const unsigned char *in, | |
| 2019 int inlen, | |
| 2020 const unsigned char *additionalData, | |
| 2021 int additionalDataLen) | |
| 2022 { | |
| 2023 SECStatus rv = SECFailure; | |
| 2024 unsigned char nonce[12]; | |
| 2025 unsigned int uOutLen; | |
| 2026 AESContext *cx; | |
| 2027 CK_GCM_PARAMS gcmParams; | |
| 2028 | |
| 2029 const int tagSize = bulk_cipher_defs[cipher_aes_128_gcm].tag_size; | |
| 2030 const int explicitNonceLen = | |
| 2031 bulk_cipher_defs[cipher_aes_128_gcm].explicit_nonce_size; | |
| 2032 | |
| 2033 /* See https://tools.ietf.org/html/rfc5288#section-3 for details of how the | |
| 2034 * nonce is formed. */ | |
| 2035 PORT_Assert(keys->write_iv_item.len == 4); | |
| 2036 if (keys->write_iv_item.len != 4) { | |
| 2037 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 2038 return SECFailure; | |
| 2039 } | |
| 2040 memcpy(nonce, keys->write_iv_item.data, 4); | |
| 2041 if (doDecrypt) { | |
| 2042 memcpy(nonce + 4, in, explicitNonceLen); | |
| 2043 in += explicitNonceLen; | |
| 2044 inlen -= explicitNonceLen; | |
| 2045 *outlen = 0; | |
| 2046 } else { | |
| 2047 if (maxout < explicitNonceLen) { | |
| 2048 PORT_SetError(SEC_ERROR_INPUT_LEN); | |
| 2049 return SECFailure; | |
| 2050 } | |
| 2051 /* Use the 64-bit sequence number as the explicit nonce. */ | |
| 2052 memcpy(nonce + 4, additionalData, explicitNonceLen); | |
| 2053 memcpy(out, additionalData, explicitNonceLen); | |
| 2054 out += explicitNonceLen; | |
| 2055 maxout -= explicitNonceLen; | |
| 2056 *outlen = explicitNonceLen; | |
| 2057 } | |
| 2058 | |
| 2059 gcmParams.pIv = nonce; | |
| 2060 gcmParams.ulIvLen = sizeof(nonce); | |
| 2061 gcmParams.pAAD = (unsigned char *)additionalData; /* const cast */ | |
| 2062 gcmParams.ulAADLen = additionalDataLen; | |
| 2063 gcmParams.ulTagBits = tagSize * 8; | |
| 2064 | |
| 2065 cx = (AESContext *)keys->cipher_context; | |
| 2066 rv = AES_InitContext(cx, keys->write_key_item.data, | |
| 2067 keys->write_key_item.len, | |
| 2068 (unsigned char *)&gcmParams, NSS_AES_GCM, !doDecrypt, | |
| 2069 AES_BLOCK_SIZE); | |
| 2070 if (rv != SECSuccess) { | |
| 2071 return rv; | |
| 2072 } | |
| 2073 if (doDecrypt) { | |
| 2074 rv = AES_Decrypt(cx, out, &uOutLen, maxout, in, inlen); | |
| 2075 } else { | |
| 2076 rv = AES_Encrypt(cx, out, &uOutLen, maxout, in, inlen); | |
| 2077 } | |
| 2078 AES_DestroyContext(cx, PR_FALSE); | |
| 2079 *outlen += (int)uOutLen; | |
| 2080 | |
| 2081 return rv; | |
| 2082 } | |
| 2083 #endif | |
| 2084 | |
| 2085 static SECStatus | |
| 2086 ssl3_ChaCha20Poly1305(ssl3KeyMaterial *keys, PRBool doDecrypt, | |
| 2087 unsigned char *out, int *outlen, int maxout, | |
| 2088 const unsigned char *in, int inlen, | |
| 2089 const unsigned char *additionalData, | |
| 2090 int additionalDataLen) | |
| 2091 { | |
| 2092 size_t i; | |
| 2093 SECItem param; | |
| 2094 SECStatus rv = SECFailure; | |
| 2095 unsigned int uOutLen; | |
| 2096 unsigned char nonce[12]; | |
| 2097 CK_NSS_AEAD_PARAMS aeadParams; | |
| 2098 | |
| 2099 const int tagSize = bulk_cipher_defs[cipher_chacha20].tag_size; | |
| 2100 | |
| 2101 /* See | |
| 2102 * https://tools.ietf.org/html/draft-ietf-tls-chacha20-poly1305-04#section-2 | |
| 2103 * for details of how the nonce is formed. */ | |
| 2104 PORT_Memcpy(nonce, keys->write_iv, 12); | |
| 2105 | |
| 2106 /* XOR the last 8 bytes of the IV with the sequence number. */ | |
| 2107 PORT_Assert(additionalDataLen >= 8); | |
| 2108 for (i = 0; i < 8; ++i) { | |
| 2109 nonce[4 + i] ^= additionalData[i]; | |
| 2110 } | |
| 2111 | |
| 2112 param.type = siBuffer; | |
| 2113 param.len = sizeof(aeadParams); | |
| 2114 param.data = (unsigned char *)&aeadParams; | |
| 2115 memset(&aeadParams, 0, sizeof(aeadParams)); | |
| 2116 aeadParams.pNonce = nonce; | |
| 2117 aeadParams.ulNonceLen = sizeof(nonce); | |
| 2118 aeadParams.pAAD = (unsigned char *)additionalData; | |
| 2119 aeadParams.ulAADLen = additionalDataLen; | |
| 2120 aeadParams.ulTagLen = tagSize; | |
| 2121 | |
| 2122 if (doDecrypt) { | |
| 2123 rv = PK11_Decrypt(keys->write_key, CKM_NSS_CHACHA20_POLY1305, ¶m, | |
| 2124 out, &uOutLen, maxout, in, inlen); | |
| 2125 } else { | |
| 2126 rv = PK11_Encrypt(keys->write_key, CKM_NSS_CHACHA20_POLY1305, ¶m, | |
| 2127 out, &uOutLen, maxout, in, inlen); | |
| 2128 } | |
| 2129 *outlen = (int)uOutLen; | |
| 2130 | |
| 2131 return rv; | |
| 2132 } | |
| 2133 | |
| 2134 /* Initialize encryption and MAC contexts for pending spec. | |
| 2135 * Master Secret already is derived. | |
| 2136 * Caller holds Spec write lock. | |
| 2137 */ | |
| 2138 static SECStatus | |
| 2139 ssl3_InitPendingContextsPKCS11(sslSocket *ss) | |
| 2140 { | |
| 2141 ssl3CipherSpec *pwSpec; | |
| 2142 const ssl3BulkCipherDef *cipher_def; | |
| 2143 PK11Context *serverContext = NULL; | |
| 2144 PK11Context *clientContext = NULL; | |
| 2145 SECItem *param; | |
| 2146 CK_MECHANISM_TYPE mechanism; | |
| 2147 CK_MECHANISM_TYPE mac_mech; | |
| 2148 CK_ULONG macLength; | |
| 2149 CK_ULONG effKeyBits; | |
| 2150 SECItem iv; | |
| 2151 SECItem mac_param; | |
| 2152 SSLCipherAlgorithm calg; | |
| 2153 | |
| 2154 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 2155 PORT_Assert(ss->opt.noLocks || ssl_HaveSpecWriteLock(ss)); | |
| 2156 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); | |
| 2157 | |
| 2158 pwSpec = ss->ssl3.pwSpec; | |
| 2159 cipher_def = pwSpec->cipher_def; | |
| 2160 macLength = pwSpec->mac_size; | |
| 2161 calg = cipher_def->calg; | |
| 2162 PORT_Assert(alg2Mech[calg].calg == calg); | |
| 2163 | |
| 2164 pwSpec->client.write_mac_context = NULL; | |
| 2165 pwSpec->server.write_mac_context = NULL; | |
| 2166 | |
| 2167 if (cipher_def->type == type_aead) { | |
| 2168 pwSpec->encode = NULL; | |
| 2169 pwSpec->decode = NULL; | |
| 2170 pwSpec->destroy = NULL; | |
| 2171 pwSpec->encodeContext = NULL; | |
| 2172 pwSpec->decodeContext = NULL; | |
| 2173 switch (calg) { | |
| 2174 case calg_aes_gcm: | |
| 2175 pwSpec->aead = ssl3_AESGCM; | |
| 2176 break; | |
| 2177 case calg_chacha20: | |
| 2178 pwSpec->aead = ssl3_ChaCha20Poly1305; | |
| 2179 break; | |
| 2180 default: | |
| 2181 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 2182 return SECFailure; | |
| 2183 } | |
| 2184 return SECSuccess; | |
| 2185 } | |
| 2186 | |
| 2187 /* | |
| 2188 ** Now setup the MAC contexts, | |
| 2189 ** crypto contexts are setup below. | |
| 2190 */ | |
| 2191 | |
| 2192 mac_mech = pwSpec->mac_def->mmech; | |
| 2193 mac_param.data = (unsigned char *)&macLength; | |
| 2194 mac_param.len = sizeof(macLength); | |
| 2195 mac_param.type = 0; | |
| 2196 | |
| 2197 pwSpec->client.write_mac_context = PK11_CreateContextBySymKey( | |
| 2198 mac_mech, CKA_SIGN, pwSpec->client.write_mac_key, &mac_param); | |
| 2199 if (pwSpec->client.write_mac_context == NULL) { | |
| 2200 ssl_MapLowLevelError(SSL_ERROR_SYM_KEY_CONTEXT_FAILURE); | |
| 2201 goto fail; | |
| 2202 } | |
| 2203 pwSpec->server.write_mac_context = PK11_CreateContextBySymKey( | |
| 2204 mac_mech, CKA_SIGN, pwSpec->server.write_mac_key, &mac_param); | |
| 2205 if (pwSpec->server.write_mac_context == NULL) { | |
| 2206 ssl_MapLowLevelError(SSL_ERROR_SYM_KEY_CONTEXT_FAILURE); | |
| 2207 goto fail; | |
| 2208 } | |
| 2209 | |
| 2210 /* | |
| 2211 ** Now setup the crypto contexts. | |
| 2212 */ | |
| 2213 | |
| 2214 if (calg == calg_null) { | |
| 2215 pwSpec->encode = Null_Cipher; | |
| 2216 pwSpec->decode = Null_Cipher; | |
| 2217 pwSpec->destroy = NULL; | |
| 2218 return SECSuccess; | |
| 2219 } | |
| 2220 mechanism = ssl3_Alg2Mech(calg); | |
| 2221 effKeyBits = cipher_def->key_size * BPB; | |
| 2222 | |
| 2223 /* | |
| 2224 * build the server context | |
| 2225 */ | |
| 2226 iv.data = pwSpec->server.write_iv; | |
| 2227 iv.len = cipher_def->iv_size; | |
| 2228 param = ssl3_ParamFromIV(mechanism, &iv, effKeyBits); | |
| 2229 if (param == NULL) { | |
| 2230 ssl_MapLowLevelError(SSL_ERROR_IV_PARAM_FAILURE); | |
| 2231 goto fail; | |
| 2232 } | |
| 2233 serverContext = PK11_CreateContextBySymKey(mechanism, | |
| 2234 (ss->sec.isServer ? CKA_ENCRYPT | |
| 2235 : CKA_DECRYPT), | |
| 2236 pwSpec->server.write_key, param); | |
| 2237 iv.data = PK11_IVFromParam(mechanism, param, (int *)&iv.len); | |
| 2238 if (iv.data) | |
| 2239 PORT_Memcpy(pwSpec->server.write_iv, iv.data, iv.len); | |
| 2240 SECITEM_FreeItem(param, PR_TRUE); | |
| 2241 if (serverContext == NULL) { | |
| 2242 ssl_MapLowLevelError(SSL_ERROR_SYM_KEY_CONTEXT_FAILURE); | |
| 2243 goto fail; | |
| 2244 } | |
| 2245 | |
| 2246 /* | |
| 2247 * build the client context | |
| 2248 */ | |
| 2249 iv.data = pwSpec->client.write_iv; | |
| 2250 iv.len = cipher_def->iv_size; | |
| 2251 | |
| 2252 param = ssl3_ParamFromIV(mechanism, &iv, effKeyBits); | |
| 2253 if (param == NULL) { | |
| 2254 ssl_MapLowLevelError(SSL_ERROR_IV_PARAM_FAILURE); | |
| 2255 goto fail; | |
| 2256 } | |
| 2257 clientContext = PK11_CreateContextBySymKey(mechanism, | |
| 2258 (ss->sec.isServer ? CKA_DECRYPT | |
| 2259 : CKA_ENCRYPT), | |
| 2260 pwSpec->client.write_key, param); | |
| 2261 iv.data = PK11_IVFromParam(mechanism, param, (int *)&iv.len); | |
| 2262 if (iv.data) | |
| 2263 PORT_Memcpy(pwSpec->client.write_iv, iv.data, iv.len); | |
| 2264 SECITEM_FreeItem(param, PR_TRUE); | |
| 2265 if (clientContext == NULL) { | |
| 2266 ssl_MapLowLevelError(SSL_ERROR_SYM_KEY_CONTEXT_FAILURE); | |
| 2267 goto fail; | |
| 2268 } | |
| 2269 pwSpec->encode = (SSLCipher)PK11_CipherOp; | |
| 2270 pwSpec->decode = (SSLCipher)PK11_CipherOp; | |
| 2271 pwSpec->destroy = (SSLDestroy)PK11_DestroyContext; | |
| 2272 | |
| 2273 pwSpec->encodeContext = (ss->sec.isServer) ? serverContext : clientContext; | |
| 2274 pwSpec->decodeContext = (ss->sec.isServer) ? clientContext : serverContext; | |
| 2275 | |
| 2276 serverContext = NULL; | |
| 2277 clientContext = NULL; | |
| 2278 | |
| 2279 ssl3_InitCompressionContext(pwSpec); | |
| 2280 | |
| 2281 return SECSuccess; | |
| 2282 | |
| 2283 fail: | |
| 2284 if (serverContext != NULL) | |
| 2285 PK11_DestroyContext(serverContext, PR_TRUE); | |
| 2286 if (clientContext != NULL) | |
| 2287 PK11_DestroyContext(clientContext, PR_TRUE); | |
| 2288 if (pwSpec->client.write_mac_context != NULL) { | |
| 2289 PK11_DestroyContext(pwSpec->client.write_mac_context, PR_TRUE); | |
| 2290 pwSpec->client.write_mac_context = NULL; | |
| 2291 } | |
| 2292 if (pwSpec->server.write_mac_context != NULL) { | |
| 2293 PK11_DestroyContext(pwSpec->server.write_mac_context, PR_TRUE); | |
| 2294 pwSpec->server.write_mac_context = NULL; | |
| 2295 } | |
| 2296 | |
| 2297 return SECFailure; | |
| 2298 } | |
| 2299 | |
| 2300 #ifndef NO_PKCS11_BYPASS | |
| 2301 /* Returns whether we can bypass PKCS#11 for a given cipher algorithm. | |
| 2302 * | |
| 2303 * We do not support PKCS#11 bypass for ChaCha20/Poly1305. | |
| 2304 */ | |
| 2305 static PRBool | |
| 2306 ssl3_CanBypassCipher(SSLCipherAlgorithm calg) | |
| 2307 { | |
| 2308 switch (calg) { | |
| 2309 case calg_chacha20: | |
| 2310 return PR_FALSE; | |
| 2311 default: | |
| 2312 return PR_TRUE; | |
| 2313 } | |
| 2314 } | |
| 2315 #endif | |
| 2316 | |
| 2317 /* Complete the initialization of all keys, ciphers, MACs and their contexts | |
| 2318 * for the pending Cipher Spec. | |
| 2319 * Called from: ssl3_SendClientKeyExchange (for Full handshake) | |
| 2320 * ssl3_HandleRSAClientKeyExchange (for Full handshake) | |
| 2321 * ssl3_HandleServerHello (for session restart) | |
| 2322 * ssl3_HandleClientHello (for session restart) | |
| 2323 * Sets error code, but caller probably should override to disambiguate. | |
| 2324 * NULL pms means re-use old master_secret. | |
| 2325 * | |
| 2326 * This code is common to the bypass and PKCS11 execution paths. For | |
| 2327 * the bypass case, pms is NULL. If the old master secret is reused, | |
| 2328 * pms is NULL and the master secret is already in either | |
| 2329 * pwSpec->msItem.len (the bypass case) or pwSpec->master_secret. | |
| 2330 * | |
| 2331 * For the bypass case, pms is NULL. | |
| 2332 */ | |
| 2333 SECStatus | |
| 2334 ssl3_InitPendingCipherSpec(sslSocket *ss, PK11SymKey *pms) | |
| 2335 { | |
| 2336 ssl3CipherSpec *pwSpec; | |
| 2337 ssl3CipherSpec *cwSpec; | |
| 2338 SECStatus rv; | |
| 2339 | |
| 2340 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 2341 | |
| 2342 ssl_GetSpecWriteLock(ss); /**************************************/ | |
| 2343 | |
| 2344 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); | |
| 2345 | |
| 2346 pwSpec = ss->ssl3.pwSpec; | |
| 2347 cwSpec = ss->ssl3.cwSpec; | |
| 2348 | |
| 2349 if (pms || (!pwSpec->msItem.len && !pwSpec->master_secret)) { | |
| 2350 rv = ssl3_DeriveMasterSecret(ss, pms); | |
| 2351 if (rv != SECSuccess) { | |
| 2352 goto done; /* err code set by ssl3_DeriveMasterSecret */ | |
| 2353 } | |
| 2354 } | |
| 2355 #ifndef NO_PKCS11_BYPASS | |
| 2356 if (ss->opt.bypassPKCS11 && pwSpec->msItem.len && pwSpec->msItem.data && | |
| 2357 ssl3_CanBypassCipher(ss->ssl3.pwSpec->cipher_def->calg)) { | |
| 2358 /* Double Bypass succeeded in extracting the master_secret */ | |
| 2359 const ssl3KEADef *kea_def = ss->ssl3.hs.kea_def; | |
| 2360 PRBool isTLS = (PRBool)(kea_def->tls_keygen || | |
| 2361 (pwSpec->version > SSL_LIBRARY_VERSION_3_0)); | |
| 2362 pwSpec->bypassCiphers = PR_TRUE; | |
| 2363 rv = ssl3_KeyAndMacDeriveBypass(pwSpec, | |
| 2364 (const unsigned char *)&ss->ssl3.hs.clie
nt_random, | |
| 2365 (const unsigned char *)&ss->ssl3.hs.serv
er_random, | |
| 2366 isTLS, | |
| 2367 (PRBool)(kea_def->is_limited)); | |
| 2368 if (rv == SECSuccess) { | |
| 2369 rv = ssl3_InitPendingContextsBypass(ss); | |
| 2370 } | |
| 2371 } else | |
| 2372 #endif | |
| 2373 if (pwSpec->master_secret) { | |
| 2374 rv = ssl3_DeriveConnectionKeysPKCS11(ss); | |
| 2375 if (rv == SECSuccess) { | |
| 2376 rv = ssl3_InitPendingContextsPKCS11(ss); | |
| 2377 } | |
| 2378 } else { | |
| 2379 PORT_Assert(pwSpec->master_secret); | |
| 2380 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 2381 rv = SECFailure; | |
| 2382 } | |
| 2383 if (rv != SECSuccess) { | |
| 2384 goto done; | |
| 2385 } | |
| 2386 | |
| 2387 /* Generic behaviors -- common to all crypto methods */ | |
| 2388 if (!IS_DTLS(ss)) { | |
| 2389 pwSpec->read_seq_num.high = pwSpec->write_seq_num.high = 0; | |
| 2390 } else { | |
| 2391 if (cwSpec->epoch == PR_UINT16_MAX) { | |
| 2392 /* The problem here is that we have rehandshaked too many | |
| 2393 * times (you are not allowed to wrap the epoch). The | |
| 2394 * spec says you should be discarding the connection | |
| 2395 * and start over, so not much we can do here. */ | |
| 2396 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 2397 rv = SECFailure; | |
| 2398 goto done; | |
| 2399 } | |
| 2400 /* The sequence number has the high 16 bits as the epoch. */ | |
| 2401 pwSpec->epoch = cwSpec->epoch + 1; | |
| 2402 pwSpec->read_seq_num.high = pwSpec->write_seq_num.high = | |
| 2403 pwSpec->epoch << 16; | |
| 2404 | |
| 2405 dtls_InitRecvdRecords(&pwSpec->recvdRecords); | |
| 2406 } | |
| 2407 pwSpec->read_seq_num.low = pwSpec->write_seq_num.low = 0; | |
| 2408 | |
| 2409 done: | |
| 2410 ssl_ReleaseSpecWriteLock(ss); /******************************/ | |
| 2411 if (rv != SECSuccess) | |
| 2412 ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE); | |
| 2413 return rv; | |
| 2414 } | |
| 2415 | |
| 2416 /* | |
| 2417 * 60 bytes is 3 times the maximum length MAC size that is supported. | |
| 2418 */ | |
| 2419 static const unsigned char mac_pad_1[60] = { | |
| 2420 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, | |
| 2421 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, | |
| 2422 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, | |
| 2423 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, | |
| 2424 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, | |
| 2425 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, | |
| 2426 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, | |
| 2427 0x36, 0x36, 0x36, 0x36 | |
| 2428 }; | |
| 2429 static const unsigned char mac_pad_2[60] = { | |
| 2430 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, | |
| 2431 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, | |
| 2432 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, | |
| 2433 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, | |
| 2434 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, | |
| 2435 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, | |
| 2436 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, | |
| 2437 0x5c, 0x5c, 0x5c, 0x5c | |
| 2438 }; | |
| 2439 | |
| 2440 /* Called from: ssl3_SendRecord() | |
| 2441 ** Caller must already hold the SpecReadLock. (wish we could assert that!) | |
| 2442 */ | |
| 2443 static SECStatus | |
| 2444 ssl3_ComputeRecordMAC( | |
| 2445 ssl3CipherSpec *spec, | |
| 2446 PRBool useServerMacKey, | |
| 2447 const unsigned char *header, | |
| 2448 unsigned int headerLen, | |
| 2449 const SSL3Opaque *input, | |
| 2450 int inputLength, | |
| 2451 unsigned char *outbuf, | |
| 2452 unsigned int *outLength) | |
| 2453 { | |
| 2454 const ssl3MACDef *mac_def; | |
| 2455 SECStatus rv; | |
| 2456 | |
| 2457 PRINT_BUF(95, (NULL, "frag hash1: header", header, headerLen)); | |
| 2458 PRINT_BUF(95, (NULL, "frag hash1: input", input, inputLength)); | |
| 2459 | |
| 2460 mac_def = spec->mac_def; | |
| 2461 if (mac_def->mac == mac_null) { | |
| 2462 *outLength = 0; | |
| 2463 return SECSuccess; | |
| 2464 } | |
| 2465 #ifndef NO_PKCS11_BYPASS | |
| 2466 if (spec->bypassCiphers) { | |
| 2467 /* bypass version */ | |
| 2468 const SECHashObject *hashObj = NULL; | |
| 2469 unsigned int pad_bytes = 0; | |
| 2470 PRUint64 write_mac_context[MAX_MAC_CONTEXT_LLONGS]; | |
| 2471 | |
| 2472 switch (mac_def->mac) { | |
| 2473 case ssl_mac_null: | |
| 2474 *outLength = 0; | |
| 2475 return SECSuccess; | |
| 2476 case ssl_mac_md5: | |
| 2477 pad_bytes = 48; | |
| 2478 hashObj = HASH_GetRawHashObject(HASH_AlgMD5); | |
| 2479 break; | |
| 2480 case ssl_mac_sha: | |
| 2481 pad_bytes = 40; | |
| 2482 hashObj = HASH_GetRawHashObject(HASH_AlgSHA1); | |
| 2483 break; | |
| 2484 case ssl_hmac_md5: /* used with TLS */ | |
| 2485 hashObj = HASH_GetRawHashObject(HASH_AlgMD5); | |
| 2486 break; | |
| 2487 case ssl_hmac_sha: /* used with TLS */ | |
| 2488 hashObj = HASH_GetRawHashObject(HASH_AlgSHA1); | |
| 2489 break; | |
| 2490 case ssl_hmac_sha256: /* used with TLS */ | |
| 2491 hashObj = HASH_GetRawHashObject(HASH_AlgSHA256); | |
| 2492 break; | |
| 2493 default: | |
| 2494 break; | |
| 2495 } | |
| 2496 if (!hashObj) { | |
| 2497 PORT_Assert(0); | |
| 2498 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 2499 return SECFailure; | |
| 2500 } | |
| 2501 | |
| 2502 if (spec->version <= SSL_LIBRARY_VERSION_3_0) { | |
| 2503 unsigned int tempLen; | |
| 2504 unsigned char temp[MAX_MAC_LENGTH]; | |
| 2505 | |
| 2506 /* compute "inner" part of SSL3 MAC */ | |
| 2507 hashObj->begin(write_mac_context); | |
| 2508 if (useServerMacKey) | |
| 2509 hashObj->update(write_mac_context, | |
| 2510 spec->server.write_mac_key_item.data, | |
| 2511 spec->server.write_mac_key_item.len); | |
| 2512 else | |
| 2513 hashObj->update(write_mac_context, | |
| 2514 spec->client.write_mac_key_item.data, | |
| 2515 spec->client.write_mac_key_item.len); | |
| 2516 hashObj->update(write_mac_context, mac_pad_1, pad_bytes); | |
| 2517 hashObj->update(write_mac_context, header, headerLen); | |
| 2518 hashObj->update(write_mac_context, input, inputLength); | |
| 2519 hashObj->end(write_mac_context, temp, &tempLen, sizeof temp); | |
| 2520 | |
| 2521 /* compute "outer" part of SSL3 MAC */ | |
| 2522 hashObj->begin(write_mac_context); | |
| 2523 if (useServerMacKey) | |
| 2524 hashObj->update(write_mac_context, | |
| 2525 spec->server.write_mac_key_item.data, | |
| 2526 spec->server.write_mac_key_item.len); | |
| 2527 else | |
| 2528 hashObj->update(write_mac_context, | |
| 2529 spec->client.write_mac_key_item.data, | |
| 2530 spec->client.write_mac_key_item.len); | |
| 2531 hashObj->update(write_mac_context, mac_pad_2, pad_bytes); | |
| 2532 hashObj->update(write_mac_context, temp, tempLen); | |
| 2533 hashObj->end(write_mac_context, outbuf, outLength, spec->mac_size); | |
| 2534 rv = SECSuccess; | |
| 2535 } else { /* is TLS */ | |
| 2536 #define cx ((HMACContext *)write_mac_context) | |
| 2537 if (useServerMacKey) { | |
| 2538 rv = HMAC_Init(cx, hashObj, | |
| 2539 spec->server.write_mac_key_item.data, | |
| 2540 spec->server.write_mac_key_item.len, PR_FALSE); | |
| 2541 } else { | |
| 2542 rv = HMAC_Init(cx, hashObj, | |
| 2543 spec->client.write_mac_key_item.data, | |
| 2544 spec->client.write_mac_key_item.len, PR_FALSE); | |
| 2545 } | |
| 2546 if (rv == SECSuccess) { | |
| 2547 HMAC_Begin(cx); | |
| 2548 HMAC_Update(cx, header, headerLen); | |
| 2549 HMAC_Update(cx, input, inputLength); | |
| 2550 rv = HMAC_Finish(cx, outbuf, outLength, spec->mac_size); | |
| 2551 HMAC_Destroy(cx, PR_FALSE); | |
| 2552 } | |
| 2553 #undef cx | |
| 2554 } | |
| 2555 } else | |
| 2556 #endif | |
| 2557 { | |
| 2558 PK11Context *mac_context = | |
| 2559 (useServerMacKey ? spec->server.write_mac_context | |
| 2560 : spec->client.write_mac_context); | |
| 2561 rv = PK11_DigestBegin(mac_context); | |
| 2562 rv |= PK11_DigestOp(mac_context, header, headerLen); | |
| 2563 rv |= PK11_DigestOp(mac_context, input, inputLength); | |
| 2564 rv |= PK11_DigestFinal(mac_context, outbuf, outLength, spec->mac_size); | |
| 2565 } | |
| 2566 | |
| 2567 PORT_Assert(rv != SECSuccess || *outLength == (unsigned)spec->mac_size); | |
| 2568 | |
| 2569 PRINT_BUF(95, (NULL, "frag hash2: result", outbuf, *outLength)); | |
| 2570 | |
| 2571 if (rv != SECSuccess) { | |
| 2572 rv = SECFailure; | |
| 2573 ssl_MapLowLevelError(SSL_ERROR_MAC_COMPUTATION_FAILURE); | |
| 2574 } | |
| 2575 return rv; | |
| 2576 } | |
| 2577 | |
| 2578 /* Called from: ssl3_HandleRecord() | |
| 2579 * Caller must already hold the SpecReadLock. (wish we could assert that!) | |
| 2580 * | |
| 2581 * On entry: | |
| 2582 * originalLen >= inputLen >= MAC size | |
| 2583 */ | |
| 2584 static SECStatus | |
| 2585 ssl3_ComputeRecordMACConstantTime( | |
| 2586 ssl3CipherSpec *spec, | |
| 2587 PRBool useServerMacKey, | |
| 2588 const unsigned char *header, | |
| 2589 unsigned int headerLen, | |
| 2590 const SSL3Opaque *input, | |
| 2591 int inputLen, | |
| 2592 int originalLen, | |
| 2593 unsigned char *outbuf, | |
| 2594 unsigned int *outLen) | |
| 2595 { | |
| 2596 CK_MECHANISM_TYPE macType; | |
| 2597 CK_NSS_MAC_CONSTANT_TIME_PARAMS params; | |
| 2598 SECItem param, inputItem, outputItem; | |
| 2599 SECStatus rv; | |
| 2600 PK11SymKey *key; | |
| 2601 | |
| 2602 PORT_Assert(inputLen >= spec->mac_size); | |
| 2603 PORT_Assert(originalLen >= inputLen); | |
| 2604 | |
| 2605 if (spec->bypassCiphers) { | |
| 2606 /* This function doesn't support PKCS#11 bypass. We fallback on the | |
| 2607 * non-constant time version. */ | |
| 2608 goto fallback; | |
| 2609 } | |
| 2610 | |
| 2611 if (spec->mac_def->mac == mac_null) { | |
| 2612 *outLen = 0; | |
| 2613 return SECSuccess; | |
| 2614 } | |
| 2615 | |
| 2616 macType = CKM_NSS_HMAC_CONSTANT_TIME; | |
| 2617 if (spec->version <= SSL_LIBRARY_VERSION_3_0) { | |
| 2618 macType = CKM_NSS_SSL3_MAC_CONSTANT_TIME; | |
| 2619 } | |
| 2620 | |
| 2621 params.macAlg = spec->mac_def->mmech; | |
| 2622 params.ulBodyTotalLen = originalLen; | |
| 2623 params.pHeader = (unsigned char *)header; /* const cast */ | |
| 2624 params.ulHeaderLen = headerLen; | |
| 2625 | |
| 2626 param.data = (unsigned char *)¶ms; | |
| 2627 param.len = sizeof(params); | |
| 2628 param.type = 0; | |
| 2629 | |
| 2630 inputItem.data = (unsigned char *)input; | |
| 2631 inputItem.len = inputLen; | |
| 2632 inputItem.type = 0; | |
| 2633 | |
| 2634 outputItem.data = outbuf; | |
| 2635 outputItem.len = *outLen; | |
| 2636 outputItem.type = 0; | |
| 2637 | |
| 2638 key = spec->server.write_mac_key; | |
| 2639 if (!useServerMacKey) { | |
| 2640 key = spec->client.write_mac_key; | |
| 2641 } | |
| 2642 | |
| 2643 rv = PK11_SignWithSymKey(key, macType, ¶m, &outputItem, &inputItem); | |
| 2644 if (rv != SECSuccess) { | |
| 2645 if (PORT_GetError() == SEC_ERROR_INVALID_ALGORITHM) { | |
| 2646 goto fallback; | |
| 2647 } | |
| 2648 | |
| 2649 *outLen = 0; | |
| 2650 rv = SECFailure; | |
| 2651 ssl_MapLowLevelError(SSL_ERROR_MAC_COMPUTATION_FAILURE); | |
| 2652 return rv; | |
| 2653 } | |
| 2654 | |
| 2655 PORT_Assert(outputItem.len == (unsigned)spec->mac_size); | |
| 2656 *outLen = outputItem.len; | |
| 2657 | |
| 2658 return rv; | |
| 2659 | |
| 2660 fallback: | |
| 2661 /* ssl3_ComputeRecordMAC expects the MAC to have been removed from the | |
| 2662 * length already. */ | |
| 2663 inputLen -= spec->mac_size; | |
| 2664 return ssl3_ComputeRecordMAC(spec, useServerMacKey, header, headerLen, | |
| 2665 input, inputLen, outbuf, outLen); | |
| 2666 } | |
| 2667 | |
| 2668 static PRBool | |
| 2669 ssl3_ClientAuthTokenPresent(sslSessionID *sid) | |
| 2670 { | |
| 2671 PK11SlotInfo *slot = NULL; | |
| 2672 PRBool isPresent = PR_TRUE; | |
| 2673 | |
| 2674 /* we only care if we are doing client auth */ | |
| 2675 if (!sid || !sid->u.ssl3.clAuthValid) { | |
| 2676 return PR_TRUE; | |
| 2677 } | |
| 2678 | |
| 2679 /* get the slot */ | |
| 2680 slot = SECMOD_LookupSlot(sid->u.ssl3.clAuthModuleID, | |
| 2681 sid->u.ssl3.clAuthSlotID); | |
| 2682 if (slot == NULL || | |
| 2683 !PK11_IsPresent(slot) || | |
| 2684 sid->u.ssl3.clAuthSeries != PK11_GetSlotSeries(slot) || | |
| 2685 sid->u.ssl3.clAuthSlotID != PK11_GetSlotID(slot) || | |
| 2686 sid->u.ssl3.clAuthModuleID != PK11_GetModuleID(slot) || | |
| 2687 (PK11_NeedLogin(slot) && !PK11_IsLoggedIn(slot, NULL))) { | |
| 2688 isPresent = PR_FALSE; | |
| 2689 } | |
| 2690 if (slot) { | |
| 2691 PK11_FreeSlot(slot); | |
| 2692 } | |
| 2693 return isPresent; | |
| 2694 } | |
| 2695 | |
| 2696 /* Caller must hold the spec read lock. */ | |
| 2697 SECStatus | |
| 2698 ssl3_CompressMACEncryptRecord(ssl3CipherSpec *cwSpec, | |
| 2699 PRBool isServer, | |
| 2700 PRBool isDTLS, | |
| 2701 PRBool capRecordVersion, | |
| 2702 SSL3ContentType type, | |
| 2703 const SSL3Opaque *pIn, | |
| 2704 PRUint32 contentLen, | |
| 2705 sslBuffer *wrBuf) | |
| 2706 { | |
| 2707 const ssl3BulkCipherDef *cipher_def; | |
| 2708 SECStatus rv; | |
| 2709 PRUint32 macLen = 0; | |
| 2710 PRUint32 fragLen; | |
| 2711 PRUint32 p1Len, p2Len, oddLen = 0; | |
| 2712 PRUint16 headerLen; | |
| 2713 unsigned int ivLen = 0; | |
| 2714 int cipherBytes = 0; | |
| 2715 unsigned char pseudoHeader[13]; | |
| 2716 unsigned int pseudoHeaderLen; | |
| 2717 | |
| 2718 cipher_def = cwSpec->cipher_def; | |
| 2719 headerLen = isDTLS ? DTLS_RECORD_HEADER_LENGTH : SSL3_RECORD_HEADER_LENGTH; | |
| 2720 | |
| 2721 if (cipher_def->type == type_block && | |
| 2722 cwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_1) { | |
| 2723 /* Prepend the per-record explicit IV using technique 2b from | |
| 2724 * RFC 4346 section 6.2.3.2: The IV is a cryptographically | |
| 2725 * strong random number XORed with the CBC residue from the previous | |
| 2726 * record. | |
| 2727 */ | |
| 2728 ivLen = cipher_def->iv_size; | |
| 2729 if (ivLen > wrBuf->space - headerLen) { | |
| 2730 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 2731 return SECFailure; | |
| 2732 } | |
| 2733 rv = PK11_GenerateRandom(wrBuf->buf + headerLen, ivLen); | |
| 2734 if (rv != SECSuccess) { | |
| 2735 ssl_MapLowLevelError(SSL_ERROR_GENERATE_RANDOM_FAILURE); | |
| 2736 return rv; | |
| 2737 } | |
| 2738 rv = cwSpec->encode(cwSpec->encodeContext, | |
| 2739 wrBuf->buf + headerLen, | |
| 2740 &cipherBytes, /* output and actual outLen */ | |
| 2741 ivLen, /* max outlen */ | |
| 2742 wrBuf->buf + headerLen, | |
| 2743 ivLen); /* input and inputLen*/ | |
| 2744 if (rv != SECSuccess || cipherBytes != ivLen) { | |
| 2745 PORT_SetError(SSL_ERROR_ENCRYPTION_FAILURE); | |
| 2746 return SECFailure; | |
| 2747 } | |
| 2748 } | |
| 2749 | |
| 2750 if (cwSpec->compressor) { | |
| 2751 int outlen; | |
| 2752 rv = cwSpec->compressor( | |
| 2753 cwSpec->compressContext, | |
| 2754 wrBuf->buf + headerLen + ivLen, &outlen, | |
| 2755 wrBuf->space - headerLen - ivLen, pIn, contentLen); | |
| 2756 if (rv != SECSuccess) | |
| 2757 return rv; | |
| 2758 pIn = wrBuf->buf + headerLen + ivLen; | |
| 2759 contentLen = outlen; | |
| 2760 } | |
| 2761 | |
| 2762 pseudoHeaderLen = ssl3_BuildRecordPseudoHeader( | |
| 2763 pseudoHeader, cwSpec->write_seq_num, type, | |
| 2764 cwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_0, cwSpec->version, | |
| 2765 isDTLS, contentLen); | |
| 2766 PORT_Assert(pseudoHeaderLen <= sizeof(pseudoHeader)); | |
| 2767 if (cipher_def->type == type_aead) { | |
| 2768 const int nonceLen = cipher_def->explicit_nonce_size; | |
| 2769 const int tagLen = cipher_def->tag_size; | |
| 2770 | |
| 2771 if (headerLen + nonceLen + contentLen + tagLen > wrBuf->space) { | |
| 2772 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 2773 return SECFailure; | |
| 2774 } | |
| 2775 | |
| 2776 cipherBytes = contentLen; | |
| 2777 rv = cwSpec->aead( | |
| 2778 isServer ? &cwSpec->server : &cwSpec->client, | |
| 2779 PR_FALSE, /* do encrypt */ | |
| 2780 wrBuf->buf + headerLen, /* output */ | |
| 2781 &cipherBytes, /* out len */ | |
| 2782 wrBuf->space - headerLen, /* max out */ | |
| 2783 pIn, contentLen, /* input */ | |
| 2784 pseudoHeader, pseudoHeaderLen); | |
| 2785 if (rv != SECSuccess) { | |
| 2786 PORT_SetError(SSL_ERROR_ENCRYPTION_FAILURE); | |
| 2787 return SECFailure; | |
| 2788 } | |
| 2789 } else { | |
| 2790 /* | |
| 2791 * Add the MAC | |
| 2792 */ | |
| 2793 rv = ssl3_ComputeRecordMAC(cwSpec, isServer, | |
| 2794 pseudoHeader, pseudoHeaderLen, pIn, contentLe
n, | |
| 2795 wrBuf->buf + headerLen + ivLen + contentLen, | |
| 2796 &macLen); | |
| 2797 if (rv != SECSuccess) { | |
| 2798 ssl_MapLowLevelError(SSL_ERROR_MAC_COMPUTATION_FAILURE); | |
| 2799 return SECFailure; | |
| 2800 } | |
| 2801 p1Len = contentLen; | |
| 2802 p2Len = macLen; | |
| 2803 fragLen = contentLen + macLen; /* needs to be encrypted */ | |
| 2804 PORT_Assert(fragLen <= MAX_FRAGMENT_LENGTH + 1024); | |
| 2805 | |
| 2806 /* | |
| 2807 * Pad the text (if we're doing a block cipher) | |
| 2808 * then Encrypt it | |
| 2809 */ | |
| 2810 if (cipher_def->type == type_block) { | |
| 2811 unsigned char *pBuf; | |
| 2812 int padding_length; | |
| 2813 int i; | |
| 2814 | |
| 2815 oddLen = contentLen % cipher_def->block_size; | |
| 2816 /* Assume blockSize is a power of two */ | |
| 2817 padding_length = cipher_def->block_size - 1 - ((fragLen) & (cipher_d
ef->block_size - 1)); | |
| 2818 fragLen += padding_length + 1; | |
| 2819 PORT_Assert((fragLen % cipher_def->block_size) == 0); | |
| 2820 | |
| 2821 /* Pad according to TLS rules (also acceptable to SSL3). */ | |
| 2822 pBuf = &wrBuf->buf[headerLen + ivLen + fragLen - 1]; | |
| 2823 for (i = padding_length + 1; i > 0; --i) { | |
| 2824 *pBuf-- = padding_length; | |
| 2825 } | |
| 2826 /* now, if contentLen is not a multiple of block size, fix it */ | |
| 2827 p2Len = fragLen - p1Len; | |
| 2828 } | |
| 2829 if (p1Len < 256) { | |
| 2830 oddLen = p1Len; | |
| 2831 p1Len = 0; | |
| 2832 } else { | |
| 2833 p1Len -= oddLen; | |
| 2834 } | |
| 2835 if (oddLen) { | |
| 2836 p2Len += oddLen; | |
| 2837 PORT_Assert((cipher_def->block_size < 2) || | |
| 2838 (p2Len % cipher_def->block_size) == 0); | |
| 2839 memmove(wrBuf->buf + headerLen + ivLen + p1Len, pIn + p1Len, | |
| 2840 oddLen); | |
| 2841 } | |
| 2842 if (p1Len > 0) { | |
| 2843 int cipherBytesPart1 = -1; | |
| 2844 rv = cwSpec->encode(cwSpec->encodeContext, | |
| 2845 wrBuf->buf + headerLen + ivLen, /* output */ | |
| 2846 &cipherBytesPart1, /* actual outlen
*/ | |
| 2847 p1Len, /* max outlen */ | |
| 2848 pIn, | |
| 2849 p1Len); /* input, and inputlen */ | |
| 2850 PORT_Assert(rv == SECSuccess && cipherBytesPart1 == (int)p1Len); | |
| 2851 if (rv != SECSuccess || cipherBytesPart1 != (int)p1Len) { | |
| 2852 PORT_SetError(SSL_ERROR_ENCRYPTION_FAILURE); | |
| 2853 return SECFailure; | |
| 2854 } | |
| 2855 cipherBytes += cipherBytesPart1; | |
| 2856 } | |
| 2857 if (p2Len > 0) { | |
| 2858 int cipherBytesPart2 = -1; | |
| 2859 rv = cwSpec->encode(cwSpec->encodeContext, | |
| 2860 wrBuf->buf + headerLen + ivLen + p1Len, | |
| 2861 &cipherBytesPart2, /* output and actual outLen *
/ | |
| 2862 p2Len, /* max outlen */ | |
| 2863 wrBuf->buf + headerLen + ivLen + p1Len, | |
| 2864 p2Len); /* input and inputLen*/ | |
| 2865 PORT_Assert(rv == SECSuccess && cipherBytesPart2 == (int)p2Len); | |
| 2866 if (rv != SECSuccess || cipherBytesPart2 != (int)p2Len) { | |
| 2867 PORT_SetError(SSL_ERROR_ENCRYPTION_FAILURE); | |
| 2868 return SECFailure; | |
| 2869 } | |
| 2870 cipherBytes += cipherBytesPart2; | |
| 2871 } | |
| 2872 } | |
| 2873 | |
| 2874 PORT_Assert(cipherBytes <= MAX_FRAGMENT_LENGTH + 1024); | |
| 2875 | |
| 2876 wrBuf->len = cipherBytes + headerLen; | |
| 2877 wrBuf->buf[0] = type; | |
| 2878 if (isDTLS) { | |
| 2879 SSL3ProtocolVersion version; | |
| 2880 | |
| 2881 version = dtls_TLSVersionToDTLSVersion(cwSpec->version); | |
| 2882 wrBuf->buf[1] = MSB(version); | |
| 2883 wrBuf->buf[2] = LSB(version); | |
| 2884 wrBuf->buf[3] = (unsigned char)(cwSpec->write_seq_num.high >> 24); | |
| 2885 wrBuf->buf[4] = (unsigned char)(cwSpec->write_seq_num.high >> 16); | |
| 2886 wrBuf->buf[5] = (unsigned char)(cwSpec->write_seq_num.high >> 8); | |
| 2887 wrBuf->buf[6] = (unsigned char)(cwSpec->write_seq_num.high >> 0); | |
| 2888 wrBuf->buf[7] = (unsigned char)(cwSpec->write_seq_num.low >> 24); | |
| 2889 wrBuf->buf[8] = (unsigned char)(cwSpec->write_seq_num.low >> 16); | |
| 2890 wrBuf->buf[9] = (unsigned char)(cwSpec->write_seq_num.low >> 8); | |
| 2891 wrBuf->buf[10] = (unsigned char)(cwSpec->write_seq_num.low >> 0); | |
| 2892 wrBuf->buf[11] = MSB(cipherBytes); | |
| 2893 wrBuf->buf[12] = LSB(cipherBytes); | |
| 2894 } else { | |
| 2895 SSL3ProtocolVersion version = cwSpec->version; | |
| 2896 | |
| 2897 if (capRecordVersion || version >= SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 2898 version = PR_MIN(SSL_LIBRARY_VERSION_TLS_1_0, version); | |
| 2899 } | |
| 2900 | |
| 2901 wrBuf->buf[1] = MSB(version); | |
| 2902 wrBuf->buf[2] = LSB(version); | |
| 2903 wrBuf->buf[3] = MSB(cipherBytes); | |
| 2904 wrBuf->buf[4] = LSB(cipherBytes); | |
| 2905 } | |
| 2906 | |
| 2907 ssl3_BumpSequenceNumber(&cwSpec->write_seq_num); | |
| 2908 | |
| 2909 return SECSuccess; | |
| 2910 } | |
| 2911 | |
| 2912 /* Process the plain text before sending it. | |
| 2913 * Returns the number of bytes of plaintext that were successfully sent | |
| 2914 * plus the number of bytes of plaintext that were copied into the | |
| 2915 * output (write) buffer. | |
| 2916 * Returns SECFailure on a hard IO error, memory error, or crypto error. | |
| 2917 * Does NOT return SECWouldBlock. | |
| 2918 * | |
| 2919 * Notes on the use of the private ssl flags: | |
| 2920 * (no private SSL flags) | |
| 2921 * Attempt to make and send SSL records for all plaintext | |
| 2922 * If non-blocking and a send gets WOULD_BLOCK, | |
| 2923 * or if the pending (ciphertext) buffer is not empty, | |
| 2924 * then buffer remaining bytes of ciphertext into pending buf, | |
| 2925 * and continue to do that for all succssive records until all | |
| 2926 * bytes are used. | |
| 2927 * ssl_SEND_FLAG_FORCE_INTO_BUFFER | |
| 2928 * As above, except this suppresses all write attempts, and forces | |
| 2929 * all ciphertext into the pending ciphertext buffer. | |
| 2930 * ssl_SEND_FLAG_USE_EPOCH (for DTLS) | |
| 2931 * Forces the use of the provided epoch | |
| 2932 * ssl_SEND_FLAG_CAP_RECORD_VERSION | |
| 2933 * Caps the record layer version number of TLS ClientHello to { 3, 1 } | |
| 2934 * (TLS 1.0). Some TLS 1.0 servers (which seem to use F5 BIG-IP) ignore | |
| 2935 * ClientHello.client_version and use the record layer version number | |
| 2936 * (TLSPlaintext.version) instead when negotiating protocol versions. In | |
| 2937 * addition, if the record layer version number of ClientHello is { 3, 2 } | |
| 2938 * (TLS 1.1) or higher, these servers reset the TCP connections. Lastly, | |
| 2939 * some F5 BIG-IP servers hang if a record containing a ClientHello has a | |
| 2940 * version greater than { 3, 1 } and a length greater than 255. Set this | |
| 2941 * flag to work around such servers. | |
| 2942 */ | |
| 2943 PRInt32 | |
| 2944 ssl3_SendRecord(sslSocket *ss, | |
| 2945 DTLSEpoch epoch, /* DTLS only */ | |
| 2946 SSL3ContentType type, | |
| 2947 const SSL3Opaque *pIn, /* input buffer */ | |
| 2948 PRInt32 nIn, /* bytes of input */ | |
| 2949 PRInt32 flags) | |
| 2950 { | |
| 2951 sslBuffer *wrBuf = &ss->sec.writeBuf; | |
| 2952 SECStatus rv; | |
| 2953 PRInt32 totalSent = 0; | |
| 2954 PRBool capRecordVersion; | |
| 2955 | |
| 2956 SSL_TRC(3, ("%d: SSL3[%d] SendRecord type: %s nIn=%d", | |
| 2957 SSL_GETPID(), ss->fd, ssl3_DecodeContentType(type), | |
| 2958 nIn)); | |
| 2959 PRINT_BUF(50, (ss, "Send record (plain text)", pIn, nIn)); | |
| 2960 | |
| 2961 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | |
| 2962 | |
| 2963 if (ss->ssl3.fatalAlertSent) { | |
| 2964 SSL_TRC(3, ("%d: SSL3[%d] Suppress write, fatal alert already sent", | |
| 2965 SSL_GETPID(), ss->fd)); | |
| 2966 return SECFailure; | |
| 2967 } | |
| 2968 | |
| 2969 capRecordVersion = ((flags & ssl_SEND_FLAG_CAP_RECORD_VERSION) != 0); | |
| 2970 | |
| 2971 if (capRecordVersion) { | |
| 2972 /* ssl_SEND_FLAG_CAP_RECORD_VERSION can only be used with the | |
| 2973 * TLS initial ClientHello. */ | |
| 2974 PORT_Assert(!IS_DTLS(ss)); | |
| 2975 PORT_Assert(!ss->firstHsDone); | |
| 2976 PORT_Assert(type == content_handshake); | |
| 2977 PORT_Assert(ss->ssl3.hs.ws == wait_server_hello); | |
| 2978 } | |
| 2979 | |
| 2980 if (ss->ssl3.initialized == PR_FALSE) { | |
| 2981 /* This can happen on a server if the very first incoming record | |
| 2982 ** looks like a defective ssl3 record (e.g. too long), and we're | |
| 2983 ** trying to send an alert. | |
| 2984 */ | |
| 2985 PR_ASSERT(type == content_alert); | |
| 2986 rv = ssl3_InitState(ss); | |
| 2987 if (rv != SECSuccess) { | |
| 2988 return SECFailure; /* ssl3_InitState has set the error code. */ | |
| 2989 } | |
| 2990 } | |
| 2991 | |
| 2992 /* check for Token Presence */ | |
| 2993 if (!ssl3_ClientAuthTokenPresent(ss->sec.ci.sid)) { | |
| 2994 PORT_SetError(SSL_ERROR_TOKEN_INSERTION_REMOVAL); | |
| 2995 return SECFailure; | |
| 2996 } | |
| 2997 | |
| 2998 while (nIn > 0) { | |
| 2999 PRUint32 contentLen = PR_MIN(nIn, MAX_FRAGMENT_LENGTH); | |
| 3000 unsigned int spaceNeeded; | |
| 3001 unsigned int numRecords; | |
| 3002 | |
| 3003 ssl_GetSpecReadLock(ss); /********************************/ | |
| 3004 | |
| 3005 if (nIn > 1 && ss->opt.cbcRandomIV && | |
| 3006 ss->ssl3.cwSpec->version < SSL_LIBRARY_VERSION_TLS_1_1 && | |
| 3007 type == content_application_data && | |
| 3008 ss->ssl3.cwSpec->cipher_def->type == type_block /* CBC mode */) { | |
| 3009 /* We will split the first byte of the record into its own record, | |
| 3010 * as explained in the documentation for SSL_CBC_RANDOM_IV in ssl.h | |
| 3011 */ | |
| 3012 numRecords = 2; | |
| 3013 } else { | |
| 3014 numRecords = 1; | |
| 3015 } | |
| 3016 | |
| 3017 spaceNeeded = contentLen + (numRecords * SSL3_BUFFER_FUDGE); | |
| 3018 if (ss->ssl3.cwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_1 && | |
| 3019 ss->ssl3.cwSpec->cipher_def->type == type_block) { | |
| 3020 spaceNeeded += ss->ssl3.cwSpec->cipher_def->iv_size; | |
| 3021 } | |
| 3022 if (spaceNeeded > wrBuf->space) { | |
| 3023 rv = sslBuffer_Grow(wrBuf, spaceNeeded); | |
| 3024 if (rv != SECSuccess) { | |
| 3025 SSL_DBG(("%d: SSL3[%d]: SendRecord, tried to get %d bytes", | |
| 3026 SSL_GETPID(), ss->fd, spaceNeeded)); | |
| 3027 goto spec_locked_loser; /* sslBuffer_Grow set error code. */ | |
| 3028 } | |
| 3029 } | |
| 3030 | |
| 3031 if (numRecords == 2) { | |
| 3032 sslBuffer secondRecord; | |
| 3033 rv = ssl3_CompressMACEncryptRecord(ss->ssl3.cwSpec, | |
| 3034 ss->sec.isServer, IS_DTLS(ss), | |
| 3035 capRecordVersion, type, pIn, | |
| 3036 1, wrBuf); | |
| 3037 if (rv != SECSuccess) | |
| 3038 goto spec_locked_loser; | |
| 3039 | |
| 3040 PRINT_BUF(50, (ss, "send (encrypted) record data [1/2]:", | |
| 3041 wrBuf->buf, wrBuf->len)); | |
| 3042 | |
| 3043 secondRecord.buf = wrBuf->buf + wrBuf->len; | |
| 3044 secondRecord.len = 0; | |
| 3045 secondRecord.space = wrBuf->space - wrBuf->len; | |
| 3046 | |
| 3047 rv = ssl3_CompressMACEncryptRecord(ss->ssl3.cwSpec, | |
| 3048 ss->sec.isServer, IS_DTLS(ss), | |
| 3049 capRecordVersion, type, | |
| 3050 pIn + 1, | |
| 3051 contentLen - 1, | |
| 3052 &secondRecord); | |
| 3053 if (rv == SECSuccess) { | |
| 3054 PRINT_BUF(50, (ss, "send (encrypted) record data [2/2]:", | |
| 3055 secondRecord.buf, secondRecord.len)); | |
| 3056 wrBuf->len += secondRecord.len; | |
| 3057 } | |
| 3058 } else { | |
| 3059 if (!IS_DTLS(ss)) { | |
| 3060 if (ss->ssl3.cwSpec->version < SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 3061 rv = ssl3_CompressMACEncryptRecord(ss->ssl3.cwSpec, | |
| 3062 ss->sec.isServer, | |
| 3063 PR_FALSE, | |
| 3064 capRecordVersion, | |
| 3065 type, pIn, | |
| 3066 contentLen, wrBuf); | |
| 3067 } else { | |
| 3068 rv = tls13_ProtectRecord(ss, type, pIn, | |
| 3069 contentLen, wrBuf); | |
| 3070 } | |
| 3071 } else { | |
| 3072 /* TLS <= 1.2 and TLS 1.3 cases are both handled in | |
| 3073 * dtls_CompressMACEncryptRecord. */ | |
| 3074 rv = dtls_CompressMACEncryptRecord(ss, epoch, | |
| 3075 !!(flags & ssl_SEND_FLAG_USE_
EPOCH), | |
| 3076 type, pIn, | |
| 3077 contentLen, wrBuf); | |
| 3078 } | |
| 3079 | |
| 3080 if (rv == SECSuccess) { | |
| 3081 PRINT_BUF(50, (ss, "send (encrypted) record data:", | |
| 3082 wrBuf->buf, wrBuf->len)); | |
| 3083 } | |
| 3084 } | |
| 3085 | |
| 3086 spec_locked_loser: | |
| 3087 ssl_ReleaseSpecReadLock(ss); /************************************/ | |
| 3088 | |
| 3089 if (rv != SECSuccess) | |
| 3090 return SECFailure; | |
| 3091 | |
| 3092 pIn += contentLen; | |
| 3093 nIn -= contentLen; | |
| 3094 PORT_Assert(nIn >= 0); | |
| 3095 | |
| 3096 /* If there's still some previously saved ciphertext, | |
| 3097 * or the caller doesn't want us to send the data yet, | |
| 3098 * then add all our new ciphertext to the amount previously saved. | |
| 3099 */ | |
| 3100 if ((ss->pendingBuf.len > 0) || | |
| 3101 (flags & ssl_SEND_FLAG_FORCE_INTO_BUFFER)) { | |
| 3102 | |
| 3103 rv = ssl_SaveWriteData(ss, wrBuf->buf, wrBuf->len); | |
| 3104 if (rv != SECSuccess) { | |
| 3105 /* presumably a memory error, SEC_ERROR_NO_MEMORY */ | |
| 3106 return SECFailure; | |
| 3107 } | |
| 3108 wrBuf->len = 0; /* All cipher text is saved away. */ | |
| 3109 | |
| 3110 if (!(flags & ssl_SEND_FLAG_FORCE_INTO_BUFFER)) { | |
| 3111 PRInt32 sent; | |
| 3112 ss->handshakeBegun = 1; | |
| 3113 sent = ssl_SendSavedWriteData(ss); | |
| 3114 if (sent < 0 && PR_GetError() != PR_WOULD_BLOCK_ERROR) { | |
| 3115 ssl_MapLowLevelError(SSL_ERROR_SOCKET_WRITE_FAILURE); | |
| 3116 return SECFailure; | |
| 3117 } | |
| 3118 if (ss->pendingBuf.len) { | |
| 3119 flags |= ssl_SEND_FLAG_FORCE_INTO_BUFFER; | |
| 3120 } | |
| 3121 } | |
| 3122 } else if (wrBuf->len > 0) { | |
| 3123 PRInt32 sent; | |
| 3124 ss->handshakeBegun = 1; | |
| 3125 sent = ssl_DefSend(ss, wrBuf->buf, wrBuf->len, | |
| 3126 flags & ~ssl_SEND_FLAG_MASK); | |
| 3127 if (sent < 0) { | |
| 3128 if (PR_GetError() != PR_WOULD_BLOCK_ERROR) { | |
| 3129 ssl_MapLowLevelError(SSL_ERROR_SOCKET_WRITE_FAILURE); | |
| 3130 return SECFailure; | |
| 3131 } | |
| 3132 /* we got PR_WOULD_BLOCK_ERROR, which means none was sent. */ | |
| 3133 sent = 0; | |
| 3134 } | |
| 3135 wrBuf->len -= sent; | |
| 3136 if (wrBuf->len) { | |
| 3137 if (IS_DTLS(ss)) { | |
| 3138 /* DTLS just says no in this case. No buffering */ | |
| 3139 PR_SetError(PR_WOULD_BLOCK_ERROR, 0); | |
| 3140 return SECFailure; | |
| 3141 } | |
| 3142 /* now take all the remaining unsent new ciphertext and | |
| 3143 * append it to the buffer of previously unsent ciphertext. | |
| 3144 */ | |
| 3145 rv = ssl_SaveWriteData(ss, wrBuf->buf + sent, wrBuf->len); | |
| 3146 if (rv != SECSuccess) { | |
| 3147 /* presumably a memory error, SEC_ERROR_NO_MEMORY */ | |
| 3148 return SECFailure; | |
| 3149 } | |
| 3150 } | |
| 3151 } | |
| 3152 totalSent += contentLen; | |
| 3153 } | |
| 3154 return totalSent; | |
| 3155 } | |
| 3156 | |
| 3157 #define SSL3_PENDING_HIGH_WATER 1024 | |
| 3158 | |
| 3159 /* Attempt to send the content of "in" in an SSL application_data record. | |
| 3160 * Returns "len" or SECFailure, never SECWouldBlock, nor SECSuccess. | |
| 3161 */ | |
| 3162 int | |
| 3163 ssl3_SendApplicationData(sslSocket *ss, const unsigned char *in, | |
| 3164 PRInt32 len, PRInt32 flags) | |
| 3165 { | |
| 3166 PRInt32 totalSent = 0; | |
| 3167 PRInt32 discarded = 0; | |
| 3168 | |
| 3169 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | |
| 3170 /* These flags for internal use only */ | |
| 3171 PORT_Assert(!(flags & (ssl_SEND_FLAG_USE_EPOCH | | |
| 3172 ssl_SEND_FLAG_NO_RETRANSMIT))); | |
| 3173 if (len < 0 || !in) { | |
| 3174 PORT_SetError(PR_INVALID_ARGUMENT_ERROR); | |
| 3175 return SECFailure; | |
| 3176 } | |
| 3177 | |
| 3178 if (ss->pendingBuf.len > SSL3_PENDING_HIGH_WATER && | |
| 3179 !ssl_SocketIsBlocking(ss)) { | |
| 3180 PORT_Assert(!ssl_SocketIsBlocking(ss)); | |
| 3181 PORT_SetError(PR_WOULD_BLOCK_ERROR); | |
| 3182 return SECFailure; | |
| 3183 } | |
| 3184 | |
| 3185 if (ss->appDataBuffered && len) { | |
| 3186 PORT_Assert(in[0] == (unsigned char)(ss->appDataBuffered)); | |
| 3187 if (in[0] != (unsigned char)(ss->appDataBuffered)) { | |
| 3188 PORT_SetError(PR_INVALID_ARGUMENT_ERROR); | |
| 3189 return SECFailure; | |
| 3190 } | |
| 3191 in++; | |
| 3192 len--; | |
| 3193 discarded = 1; | |
| 3194 } | |
| 3195 while (len > totalSent) { | |
| 3196 PRInt32 sent, toSend; | |
| 3197 | |
| 3198 if (totalSent > 0) { | |
| 3199 /* | |
| 3200 * The thread yield is intended to give the reader thread a | |
| 3201 * chance to get some cycles while the writer thread is in | |
| 3202 * the middle of a large application data write. (See | |
| 3203 * Bugzilla bug 127740, comment #1.) | |
| 3204 */ | |
| 3205 ssl_ReleaseXmitBufLock(ss); | |
| 3206 PR_Sleep(PR_INTERVAL_NO_WAIT); /* PR_Yield(); */ | |
| 3207 ssl_GetXmitBufLock(ss); | |
| 3208 } | |
| 3209 toSend = PR_MIN(len - totalSent, MAX_FRAGMENT_LENGTH); | |
| 3210 /* | |
| 3211 * Note that the 0 epoch is OK because flags will never require | |
| 3212 * its use, as guaranteed by the PORT_Assert above. | |
| 3213 */ | |
| 3214 sent = ssl3_SendRecord(ss, 0, content_application_data, | |
| 3215 in + totalSent, toSend, flags); | |
| 3216 if (sent < 0) { | |
| 3217 if (totalSent > 0 && PR_GetError() == PR_WOULD_BLOCK_ERROR) { | |
| 3218 PORT_Assert(ss->lastWriteBlocked); | |
| 3219 break; | |
| 3220 } | |
| 3221 return SECFailure; /* error code set by ssl3_SendRecord */ | |
| 3222 } | |
| 3223 totalSent += sent; | |
| 3224 if (ss->pendingBuf.len) { | |
| 3225 /* must be a non-blocking socket */ | |
| 3226 PORT_Assert(!ssl_SocketIsBlocking(ss)); | |
| 3227 PORT_Assert(ss->lastWriteBlocked); | |
| 3228 break; | |
| 3229 } | |
| 3230 } | |
| 3231 if (ss->pendingBuf.len) { | |
| 3232 /* Must be non-blocking. */ | |
| 3233 PORT_Assert(!ssl_SocketIsBlocking(ss)); | |
| 3234 if (totalSent > 0) { | |
| 3235 ss->appDataBuffered = 0x100 | in[totalSent - 1]; | |
| 3236 } | |
| 3237 | |
| 3238 totalSent = totalSent + discarded - 1; | |
| 3239 if (totalSent <= 0) { | |
| 3240 PORT_SetError(PR_WOULD_BLOCK_ERROR); | |
| 3241 totalSent = SECFailure; | |
| 3242 } | |
| 3243 return totalSent; | |
| 3244 } | |
| 3245 ss->appDataBuffered = 0; | |
| 3246 return totalSent + discarded; | |
| 3247 } | |
| 3248 | |
| 3249 /* Attempt to send buffered handshake messages. | |
| 3250 * This function returns SECSuccess or SECFailure, never SECWouldBlock. | |
| 3251 * Always set sendBuf.len to 0, even when returning SECFailure. | |
| 3252 * | |
| 3253 * Depending on whether we are doing DTLS or not, this either calls | |
| 3254 * | |
| 3255 * - ssl3_FlushHandshakeMessages if non-DTLS | |
| 3256 * - dtls_FlushHandshakeMessages if DTLS | |
| 3257 * | |
| 3258 * Called from SSL3_SendAlert(), ssl3_SendChangeCipherSpecs(), | |
| 3259 * ssl3_AppendHandshake(), ssl3_SendClientHello(), | |
| 3260 * ssl3_SendHelloRequest(), ssl3_SendServerHelloDone(), | |
| 3261 * ssl3_SendFinished(), | |
| 3262 */ | |
| 3263 SECStatus | |
| 3264 ssl3_FlushHandshake(sslSocket *ss, PRInt32 flags) | |
| 3265 { | |
| 3266 if (IS_DTLS(ss)) { | |
| 3267 return dtls_FlushHandshakeMessages(ss, flags); | |
| 3268 } else { | |
| 3269 return ssl3_FlushHandshakeMessages(ss, flags); | |
| 3270 } | |
| 3271 } | |
| 3272 | |
| 3273 /* Attempt to send the content of sendBuf buffer in an SSL handshake record. | |
| 3274 * This function returns SECSuccess or SECFailure, never SECWouldBlock. | |
| 3275 * Always set sendBuf.len to 0, even when returning SECFailure. | |
| 3276 * | |
| 3277 * Called from ssl3_FlushHandshake | |
| 3278 */ | |
| 3279 static SECStatus | |
| 3280 ssl3_FlushHandshakeMessages(sslSocket *ss, PRInt32 flags) | |
| 3281 { | |
| 3282 static const PRInt32 allowedFlags = ssl_SEND_FLAG_FORCE_INTO_BUFFER | | |
| 3283 ssl_SEND_FLAG_CAP_RECORD_VERSION; | |
| 3284 PRInt32 count = -1; | |
| 3285 SECStatus rv = SECSuccess; | |
| 3286 | |
| 3287 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 3288 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | |
| 3289 | |
| 3290 if (!ss->sec.ci.sendBuf.buf || !ss->sec.ci.sendBuf.len) | |
| 3291 return rv; | |
| 3292 | |
| 3293 /* only these flags are allowed */ | |
| 3294 PORT_Assert(!(flags & ~allowedFlags)); | |
| 3295 if ((flags & ~allowedFlags) != 0) { | |
| 3296 PORT_SetError(SEC_ERROR_INVALID_ARGS); | |
| 3297 rv = SECFailure; | |
| 3298 } else { | |
| 3299 count = ssl3_SendRecord(ss, 0, content_handshake, ss->sec.ci.sendBuf.buf
, | |
| 3300 ss->sec.ci.sendBuf.len, flags); | |
| 3301 } | |
| 3302 if (count < 0) { | |
| 3303 int err = PORT_GetError(); | |
| 3304 PORT_Assert(err != PR_WOULD_BLOCK_ERROR); | |
| 3305 if (err == PR_WOULD_BLOCK_ERROR) { | |
| 3306 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 3307 } | |
| 3308 rv = SECFailure; | |
| 3309 } else if ((unsigned int)count < ss->sec.ci.sendBuf.len) { | |
| 3310 /* short write should never happen */ | |
| 3311 PORT_Assert((unsigned int)count >= ss->sec.ci.sendBuf.len); | |
| 3312 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 3313 rv = SECFailure; | |
| 3314 } else { | |
| 3315 rv = SECSuccess; | |
| 3316 } | |
| 3317 | |
| 3318 /* Whether we succeeded or failed, toss the old handshake data. */ | |
| 3319 ss->sec.ci.sendBuf.len = 0; | |
| 3320 return rv; | |
| 3321 } | |
| 3322 | |
| 3323 /* | |
| 3324 * Called from ssl3_HandleAlert and from ssl3_HandleCertificate when | |
| 3325 * the remote client sends a negative response to our certificate request. | |
| 3326 * Returns SECFailure if the application has required client auth. | |
| 3327 * SECSuccess otherwise. | |
| 3328 */ | |
| 3329 static SECStatus | |
| 3330 ssl3_HandleNoCertificate(sslSocket *ss) | |
| 3331 { | |
| 3332 if (ss->sec.peerCert != NULL) { | |
| 3333 if (ss->sec.peerKey != NULL) { | |
| 3334 SECKEY_DestroyPublicKey(ss->sec.peerKey); | |
| 3335 ss->sec.peerKey = NULL; | |
| 3336 } | |
| 3337 CERT_DestroyCertificate(ss->sec.peerCert); | |
| 3338 ss->sec.peerCert = NULL; | |
| 3339 } | |
| 3340 ssl3_CleanupPeerCerts(ss); | |
| 3341 | |
| 3342 /* If the server has required client-auth blindly but doesn't | |
| 3343 * actually look at the certificate it won't know that no | |
| 3344 * certificate was presented so we shutdown the socket to ensure | |
| 3345 * an error. We only do this if we haven't already completed the | |
| 3346 * first handshake because if we're redoing the handshake we | |
| 3347 * know the server is paying attention to the certificate. | |
| 3348 */ | |
| 3349 if ((ss->opt.requireCertificate == SSL_REQUIRE_ALWAYS) || | |
| 3350 (!ss->firstHsDone && | |
| 3351 (ss->opt.requireCertificate == SSL_REQUIRE_FIRST_HANDSHAKE))) { | |
| 3352 PRFileDesc *lower; | |
| 3353 | |
| 3354 if (ss->sec.uncache) | |
| 3355 ss->sec.uncache(ss->sec.ci.sid); | |
| 3356 SSL3_SendAlert(ss, alert_fatal, bad_certificate); | |
| 3357 | |
| 3358 lower = ss->fd->lower; | |
| 3359 #ifdef _WIN32 | |
| 3360 lower->methods->shutdown(lower, PR_SHUTDOWN_SEND); | |
| 3361 #else | |
| 3362 lower->methods->shutdown(lower, PR_SHUTDOWN_BOTH); | |
| 3363 #endif | |
| 3364 PORT_SetError(SSL_ERROR_NO_CERTIFICATE); | |
| 3365 return SECFailure; | |
| 3366 } | |
| 3367 return SECSuccess; | |
| 3368 } | |
| 3369 | |
| 3370 /************************************************************************ | |
| 3371 * Alerts | |
| 3372 */ | |
| 3373 | |
| 3374 /* | |
| 3375 ** Acquires both handshake and XmitBuf locks. | |
| 3376 ** Called from: ssl3_IllegalParameter <- | |
| 3377 ** ssl3_HandshakeFailure <- | |
| 3378 ** ssl3_HandleAlert <- ssl3_HandleRecord. | |
| 3379 ** ssl3_HandleChangeCipherSpecs <- ssl3_HandleRecord | |
| 3380 ** ssl3_ConsumeHandshakeVariable <- | |
| 3381 ** ssl3_HandleHelloRequest <- | |
| 3382 ** ssl3_HandleServerHello <- | |
| 3383 ** ssl3_HandleServerKeyExchange <- | |
| 3384 ** ssl3_HandleCertificateRequest <- | |
| 3385 ** ssl3_HandleServerHelloDone <- | |
| 3386 ** ssl3_HandleClientHello <- | |
| 3387 ** ssl3_HandleV2ClientHello <- | |
| 3388 ** ssl3_HandleCertificateVerify <- | |
| 3389 ** ssl3_HandleClientKeyExchange <- | |
| 3390 ** ssl3_HandleCertificate <- | |
| 3391 ** ssl3_HandleFinished <- | |
| 3392 ** ssl3_HandleHandshakeMessage <- | |
| 3393 ** ssl3_HandlePostHelloHandshakeMessage <- | |
| 3394 ** ssl3_HandleRecord <- | |
| 3395 ** | |
| 3396 */ | |
| 3397 SECStatus | |
| 3398 SSL3_SendAlert(sslSocket *ss, SSL3AlertLevel level, SSL3AlertDescription desc) | |
| 3399 { | |
| 3400 PRUint8 bytes[2]; | |
| 3401 SECStatus rv; | |
| 3402 | |
| 3403 SSL_TRC(3, ("%d: SSL3[%d]: send alert record, level=%d desc=%d", | |
| 3404 SSL_GETPID(), ss->fd, level, desc)); | |
| 3405 | |
| 3406 bytes[0] = level; | |
| 3407 bytes[1] = desc; | |
| 3408 | |
| 3409 ssl_GetSSL3HandshakeLock(ss); | |
| 3410 if (level == alert_fatal) { | |
| 3411 if (!ss->opt.noCache && ss->sec.ci.sid && ss->sec.uncache) { | |
| 3412 ss->sec.uncache(ss->sec.ci.sid); | |
| 3413 } | |
| 3414 } | |
| 3415 ssl_GetXmitBufLock(ss); | |
| 3416 rv = ssl3_FlushHandshake(ss, ssl_SEND_FLAG_FORCE_INTO_BUFFER); | |
| 3417 if (rv == SECSuccess) { | |
| 3418 PRInt32 sent; | |
| 3419 sent = ssl3_SendRecord(ss, 0, content_alert, bytes, 2, | |
| 3420 desc == no_certificate ? ssl_SEND_FLAG_FORCE_INTO
_BUFFER : 0); | |
| 3421 rv = (sent >= 0) ? SECSuccess : (SECStatus)sent; | |
| 3422 } | |
| 3423 if (level == alert_fatal) { | |
| 3424 ss->ssl3.fatalAlertSent = PR_TRUE; | |
| 3425 } | |
| 3426 ssl_ReleaseXmitBufLock(ss); | |
| 3427 ssl_ReleaseSSL3HandshakeLock(ss); | |
| 3428 return rv; /* error set by ssl3_FlushHandshake or ssl3_SendRecord */ | |
| 3429 } | |
| 3430 | |
| 3431 /* | |
| 3432 * Send illegal_parameter alert. Set generic error number. | |
| 3433 */ | |
| 3434 static SECStatus | |
| 3435 ssl3_IllegalParameter(sslSocket *ss) | |
| 3436 { | |
| 3437 (void)SSL3_SendAlert(ss, alert_fatal, illegal_parameter); | |
| 3438 PORT_SetError(ss->sec.isServer ? SSL_ERROR_BAD_CLIENT | |
| 3439 : SSL_ERROR_BAD_SERVER); | |
| 3440 return SECFailure; | |
| 3441 } | |
| 3442 | |
| 3443 /* | |
| 3444 * Send handshake_Failure alert. Set generic error number. | |
| 3445 */ | |
| 3446 static SECStatus | |
| 3447 ssl3_HandshakeFailure(sslSocket *ss) | |
| 3448 { | |
| 3449 (void)SSL3_SendAlert(ss, alert_fatal, handshake_failure); | |
| 3450 PORT_SetError(ss->sec.isServer ? SSL_ERROR_BAD_CLIENT | |
| 3451 : SSL_ERROR_BAD_SERVER); | |
| 3452 return SECFailure; | |
| 3453 } | |
| 3454 | |
| 3455 static void | |
| 3456 ssl3_SendAlertForCertError(sslSocket *ss, PRErrorCode errCode) | |
| 3457 { | |
| 3458 SSL3AlertDescription desc = bad_certificate; | |
| 3459 PRBool isTLS = ss->version >= SSL_LIBRARY_VERSION_3_1_TLS; | |
| 3460 | |
| 3461 switch (errCode) { | |
| 3462 case SEC_ERROR_LIBRARY_FAILURE: | |
| 3463 desc = unsupported_certificate; | |
| 3464 break; | |
| 3465 case SEC_ERROR_EXPIRED_CERTIFICATE: | |
| 3466 desc = certificate_expired; | |
| 3467 break; | |
| 3468 case SEC_ERROR_REVOKED_CERTIFICATE: | |
| 3469 desc = certificate_revoked; | |
| 3470 break; | |
| 3471 case SEC_ERROR_INADEQUATE_KEY_USAGE: | |
| 3472 case SEC_ERROR_INADEQUATE_CERT_TYPE: | |
| 3473 desc = certificate_unknown; | |
| 3474 break; | |
| 3475 case SEC_ERROR_UNTRUSTED_CERT: | |
| 3476 desc = isTLS ? access_denied : certificate_unknown; | |
| 3477 break; | |
| 3478 case SEC_ERROR_UNKNOWN_ISSUER: | |
| 3479 case SEC_ERROR_UNTRUSTED_ISSUER: | |
| 3480 desc = isTLS ? unknown_ca : certificate_unknown; | |
| 3481 break; | |
| 3482 case SEC_ERROR_EXPIRED_ISSUER_CERTIFICATE: | |
| 3483 desc = isTLS ? unknown_ca : certificate_expired; | |
| 3484 break; | |
| 3485 | |
| 3486 case SEC_ERROR_CERT_NOT_IN_NAME_SPACE: | |
| 3487 case SEC_ERROR_PATH_LEN_CONSTRAINT_INVALID: | |
| 3488 case SEC_ERROR_CA_CERT_INVALID: | |
| 3489 case SEC_ERROR_BAD_SIGNATURE: | |
| 3490 default: | |
| 3491 desc = bad_certificate; | |
| 3492 break; | |
| 3493 } | |
| 3494 SSL_DBG(("%d: SSL3[%d]: peer certificate is no good: error=%d", | |
| 3495 SSL_GETPID(), ss->fd, errCode)); | |
| 3496 | |
| 3497 (void)SSL3_SendAlert(ss, alert_fatal, desc); | |
| 3498 } | |
| 3499 | |
| 3500 /* | |
| 3501 * Send decode_error alert. Set generic error number. | |
| 3502 */ | |
| 3503 SECStatus | |
| 3504 ssl3_DecodeError(sslSocket *ss) | |
| 3505 { | |
| 3506 (void)SSL3_SendAlert(ss, alert_fatal, | |
| 3507 ss->version > SSL_LIBRARY_VERSION_3_0 ? decode_error | |
| 3508 : illegal_paramet
er); | |
| 3509 PORT_SetError(ss->sec.isServer ? SSL_ERROR_BAD_CLIENT | |
| 3510 : SSL_ERROR_BAD_SERVER); | |
| 3511 return SECFailure; | |
| 3512 } | |
| 3513 | |
| 3514 /* Called from ssl3_HandleRecord. | |
| 3515 ** Caller must hold both RecvBuf and Handshake locks. | |
| 3516 */ | |
| 3517 static SECStatus | |
| 3518 ssl3_HandleAlert(sslSocket *ss, sslBuffer *buf) | |
| 3519 { | |
| 3520 SSL3AlertLevel level; | |
| 3521 SSL3AlertDescription desc; | |
| 3522 int error; | |
| 3523 | |
| 3524 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 3525 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 3526 | |
| 3527 SSL_TRC(3, ("%d: SSL3[%d]: handle alert record", SSL_GETPID(), ss->fd)); | |
| 3528 | |
| 3529 if (buf->len != 2) { | |
| 3530 (void)ssl3_DecodeError(ss); | |
| 3531 PORT_SetError(SSL_ERROR_RX_MALFORMED_ALERT); | |
| 3532 return SECFailure; | |
| 3533 } | |
| 3534 level = (SSL3AlertLevel)buf->buf[0]; | |
| 3535 desc = (SSL3AlertDescription)buf->buf[1]; | |
| 3536 buf->len = 0; | |
| 3537 SSL_TRC(5, ("%d: SSL3[%d] received alert, level = %d, description = %d", | |
| 3538 SSL_GETPID(), ss->fd, level, desc)); | |
| 3539 | |
| 3540 switch (desc) { | |
| 3541 case close_notify: | |
| 3542 ss->recvdCloseNotify = 1; | |
| 3543 error = SSL_ERROR_CLOSE_NOTIFY_ALERT; | |
| 3544 break; | |
| 3545 case unexpected_message: | |
| 3546 error = SSL_ERROR_HANDSHAKE_UNEXPECTED_ALERT; | |
| 3547 break; | |
| 3548 case bad_record_mac: | |
| 3549 error = SSL_ERROR_BAD_MAC_ALERT; | |
| 3550 break; | |
| 3551 case decryption_failed_RESERVED: | |
| 3552 error = SSL_ERROR_DECRYPTION_FAILED_ALERT; | |
| 3553 break; | |
| 3554 case record_overflow: | |
| 3555 error = SSL_ERROR_RECORD_OVERFLOW_ALERT; | |
| 3556 break; | |
| 3557 case decompression_failure: | |
| 3558 error = SSL_ERROR_DECOMPRESSION_FAILURE_ALERT; | |
| 3559 break; | |
| 3560 case handshake_failure: | |
| 3561 error = SSL_ERROR_HANDSHAKE_FAILURE_ALERT; | |
| 3562 break; | |
| 3563 case no_certificate: | |
| 3564 error = SSL_ERROR_NO_CERTIFICATE; | |
| 3565 break; | |
| 3566 case bad_certificate: | |
| 3567 error = SSL_ERROR_BAD_CERT_ALERT; | |
| 3568 break; | |
| 3569 case unsupported_certificate: | |
| 3570 error = SSL_ERROR_UNSUPPORTED_CERT_ALERT; | |
| 3571 break; | |
| 3572 case certificate_revoked: | |
| 3573 error = SSL_ERROR_REVOKED_CERT_ALERT; | |
| 3574 break; | |
| 3575 case certificate_expired: | |
| 3576 error = SSL_ERROR_EXPIRED_CERT_ALERT; | |
| 3577 break; | |
| 3578 case certificate_unknown: | |
| 3579 error = SSL_ERROR_CERTIFICATE_UNKNOWN_ALERT; | |
| 3580 break; | |
| 3581 case illegal_parameter: | |
| 3582 error = SSL_ERROR_ILLEGAL_PARAMETER_ALERT; | |
| 3583 break; | |
| 3584 case inappropriate_fallback: | |
| 3585 error = SSL_ERROR_INAPPROPRIATE_FALLBACK_ALERT; | |
| 3586 break; | |
| 3587 | |
| 3588 /* All alerts below are TLS only. */ | |
| 3589 case unknown_ca: | |
| 3590 error = SSL_ERROR_UNKNOWN_CA_ALERT; | |
| 3591 break; | |
| 3592 case access_denied: | |
| 3593 error = SSL_ERROR_ACCESS_DENIED_ALERT; | |
| 3594 break; | |
| 3595 case decode_error: | |
| 3596 error = SSL_ERROR_DECODE_ERROR_ALERT; | |
| 3597 break; | |
| 3598 case decrypt_error: | |
| 3599 error = SSL_ERROR_DECRYPT_ERROR_ALERT; | |
| 3600 break; | |
| 3601 case export_restriction: | |
| 3602 error = SSL_ERROR_EXPORT_RESTRICTION_ALERT; | |
| 3603 break; | |
| 3604 case protocol_version: | |
| 3605 error = SSL_ERROR_PROTOCOL_VERSION_ALERT; | |
| 3606 break; | |
| 3607 case insufficient_security: | |
| 3608 error = SSL_ERROR_INSUFFICIENT_SECURITY_ALERT; | |
| 3609 break; | |
| 3610 case internal_error: | |
| 3611 error = SSL_ERROR_INTERNAL_ERROR_ALERT; | |
| 3612 break; | |
| 3613 case user_canceled: | |
| 3614 error = SSL_ERROR_USER_CANCELED_ALERT; | |
| 3615 break; | |
| 3616 case no_renegotiation: | |
| 3617 error = SSL_ERROR_NO_RENEGOTIATION_ALERT; | |
| 3618 break; | |
| 3619 | |
| 3620 /* Alerts for TLS client hello extensions */ | |
| 3621 case missing_extension: | |
| 3622 error = SSL_ERROR_MISSING_EXTENSION_ALERT; | |
| 3623 break; | |
| 3624 case unsupported_extension: | |
| 3625 error = SSL_ERROR_UNSUPPORTED_EXTENSION_ALERT; | |
| 3626 break; | |
| 3627 case certificate_unobtainable: | |
| 3628 error = SSL_ERROR_CERTIFICATE_UNOBTAINABLE_ALERT; | |
| 3629 break; | |
| 3630 case unrecognized_name: | |
| 3631 error = SSL_ERROR_UNRECOGNIZED_NAME_ALERT; | |
| 3632 break; | |
| 3633 case bad_certificate_status_response: | |
| 3634 error = SSL_ERROR_BAD_CERT_STATUS_RESPONSE_ALERT; | |
| 3635 break; | |
| 3636 case bad_certificate_hash_value: | |
| 3637 error = SSL_ERROR_BAD_CERT_HASH_VALUE_ALERT; | |
| 3638 break; | |
| 3639 default: | |
| 3640 error = SSL_ERROR_RX_UNKNOWN_ALERT; | |
| 3641 break; | |
| 3642 } | |
| 3643 if (level == alert_fatal) { | |
| 3644 if (!ss->opt.noCache) { | |
| 3645 if (ss->sec.uncache) | |
| 3646 ss->sec.uncache(ss->sec.ci.sid); | |
| 3647 } | |
| 3648 if ((ss->ssl3.hs.ws == wait_server_hello) && | |
| 3649 (desc == handshake_failure)) { | |
| 3650 /* XXX This is a hack. We're assuming that any handshake failure | |
| 3651 * XXX on the client hello is a failure to match ciphers. | |
| 3652 */ | |
| 3653 error = SSL_ERROR_NO_CYPHER_OVERLAP; | |
| 3654 } | |
| 3655 PORT_SetError(error); | |
| 3656 return SECFailure; | |
| 3657 } | |
| 3658 if ((desc == no_certificate) && (ss->ssl3.hs.ws == wait_client_cert)) { | |
| 3659 /* I'm a server. I've requested a client cert. He hasn't got one. */ | |
| 3660 SECStatus rv; | |
| 3661 | |
| 3662 PORT_Assert(ss->sec.isServer); | |
| 3663 ss->ssl3.hs.ws = wait_client_key; | |
| 3664 rv = ssl3_HandleNoCertificate(ss); | |
| 3665 return rv; | |
| 3666 } | |
| 3667 return SECSuccess; | |
| 3668 } | |
| 3669 | |
| 3670 /* | |
| 3671 * Change Cipher Specs | |
| 3672 * Called from ssl3_HandleServerHelloDone, | |
| 3673 * ssl3_HandleClientHello, | |
| 3674 * and ssl3_HandleFinished | |
| 3675 * | |
| 3676 * Acquires and releases spec write lock, to protect switching the current | |
| 3677 * and pending write spec pointers. | |
| 3678 */ | |
| 3679 | |
| 3680 static SECStatus | |
| 3681 ssl3_SendChangeCipherSpecs(sslSocket *ss) | |
| 3682 { | |
| 3683 PRUint8 change = change_cipher_spec_choice; | |
| 3684 ssl3CipherSpec *pwSpec; | |
| 3685 SECStatus rv; | |
| 3686 PRInt32 sent; | |
| 3687 | |
| 3688 SSL_TRC(3, ("%d: SSL3[%d]: send change_cipher_spec record", | |
| 3689 SSL_GETPID(), ss->fd)); | |
| 3690 | |
| 3691 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | |
| 3692 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 3693 | |
| 3694 rv = ssl3_FlushHandshake(ss, ssl_SEND_FLAG_FORCE_INTO_BUFFER); | |
| 3695 if (rv != SECSuccess) { | |
| 3696 return rv; /* error code set by ssl3_FlushHandshake */ | |
| 3697 } | |
| 3698 if (!IS_DTLS(ss)) { | |
| 3699 sent = ssl3_SendRecord(ss, 0, content_change_cipher_spec, &change, 1, | |
| 3700 ssl_SEND_FLAG_FORCE_INTO_BUFFER); | |
| 3701 if (sent < 0) { | |
| 3702 return (SECStatus)sent; /* error code set by ssl3_SendRecord */ | |
| 3703 } | |
| 3704 } else { | |
| 3705 rv = dtls_QueueMessage(ss, content_change_cipher_spec, &change, 1); | |
| 3706 if (rv != SECSuccess) { | |
| 3707 return rv; | |
| 3708 } | |
| 3709 } | |
| 3710 | |
| 3711 /* swap the pending and current write specs. */ | |
| 3712 ssl_GetSpecWriteLock(ss); /**************************************/ | |
| 3713 pwSpec = ss->ssl3.pwSpec; | |
| 3714 | |
| 3715 ss->ssl3.pwSpec = ss->ssl3.cwSpec; | |
| 3716 ss->ssl3.cwSpec = pwSpec; | |
| 3717 | |
| 3718 SSL_TRC(3, ("%d: SSL3[%d] Set Current Write Cipher Suite to Pending", | |
| 3719 SSL_GETPID(), ss->fd)); | |
| 3720 | |
| 3721 /* We need to free up the contexts, keys and certs ! */ | |
| 3722 /* If we are really through with the old cipher spec | |
| 3723 * (Both the read and write sides have changed) destroy it. | |
| 3724 */ | |
| 3725 if (ss->ssl3.prSpec == ss->ssl3.pwSpec) { | |
| 3726 if (!IS_DTLS(ss)) { | |
| 3727 ssl3_DestroyCipherSpec(ss->ssl3.pwSpec, PR_FALSE /*freeSrvName*/); | |
| 3728 } else { | |
| 3729 /* With DTLS, we need to set a holddown timer in case the final | |
| 3730 * message got lost */ | |
| 3731 ss->ssl3.hs.rtTimeoutMs = DTLS_FINISHED_TIMER_MS; | |
| 3732 dtls_StartTimer(ss, dtls_FinishedTimerCb); | |
| 3733 } | |
| 3734 } | |
| 3735 ssl_ReleaseSpecWriteLock(ss); /**************************************/ | |
| 3736 | |
| 3737 return SECSuccess; | |
| 3738 } | |
| 3739 | |
| 3740 /* Called from ssl3_HandleRecord. | |
| 3741 ** Caller must hold both RecvBuf and Handshake locks. | |
| 3742 * | |
| 3743 * Acquires and releases spec write lock, to protect switching the current | |
| 3744 * and pending write spec pointers. | |
| 3745 */ | |
| 3746 static SECStatus | |
| 3747 ssl3_HandleChangeCipherSpecs(sslSocket *ss, sslBuffer *buf) | |
| 3748 { | |
| 3749 ssl3CipherSpec *prSpec; | |
| 3750 SSL3WaitState ws = ss->ssl3.hs.ws; | |
| 3751 SSL3ChangeCipherSpecChoice change; | |
| 3752 | |
| 3753 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 3754 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 3755 | |
| 3756 SSL_TRC(3, ("%d: SSL3[%d]: handle change_cipher_spec record", | |
| 3757 SSL_GETPID(), ss->fd)); | |
| 3758 | |
| 3759 if (ws != wait_change_cipher) { | |
| 3760 if (IS_DTLS(ss)) { | |
| 3761 /* Ignore this because it's out of order. */ | |
| 3762 SSL_TRC(3, ("%d: SSL3[%d]: discard out of order " | |
| 3763 "DTLS change_cipher_spec", | |
| 3764 SSL_GETPID(), ss->fd)); | |
| 3765 buf->len = 0; | |
| 3766 return SECSuccess; | |
| 3767 } | |
| 3768 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); | |
| 3769 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CHANGE_CIPHER); | |
| 3770 return SECFailure; | |
| 3771 } | |
| 3772 | |
| 3773 if (buf->len != 1) { | |
| 3774 (void)ssl3_DecodeError(ss); | |
| 3775 PORT_SetError(SSL_ERROR_RX_MALFORMED_CHANGE_CIPHER); | |
| 3776 return SECFailure; | |
| 3777 } | |
| 3778 change = (SSL3ChangeCipherSpecChoice)buf->buf[0]; | |
| 3779 if (change != change_cipher_spec_choice) { | |
| 3780 /* illegal_parameter is correct here for both SSL3 and TLS. */ | |
| 3781 (void)ssl3_IllegalParameter(ss); | |
| 3782 PORT_SetError(SSL_ERROR_RX_MALFORMED_CHANGE_CIPHER); | |
| 3783 return SECFailure; | |
| 3784 } | |
| 3785 buf->len = 0; | |
| 3786 | |
| 3787 /* Swap the pending and current read specs. */ | |
| 3788 ssl_GetSpecWriteLock(ss); /*************************************/ | |
| 3789 prSpec = ss->ssl3.prSpec; | |
| 3790 | |
| 3791 ss->ssl3.prSpec = ss->ssl3.crSpec; | |
| 3792 ss->ssl3.crSpec = prSpec; | |
| 3793 ss->ssl3.hs.ws = wait_finished; | |
| 3794 | |
| 3795 SSL_TRC(3, ("%d: SSL3[%d] Set Current Read Cipher Suite to Pending", | |
| 3796 SSL_GETPID(), ss->fd)); | |
| 3797 | |
| 3798 /* If we are really through with the old cipher prSpec | |
| 3799 * (Both the read and write sides have changed) destroy it. | |
| 3800 */ | |
| 3801 if (ss->ssl3.prSpec == ss->ssl3.pwSpec) { | |
| 3802 ssl3_DestroyCipherSpec(ss->ssl3.prSpec, PR_FALSE /*freeSrvName*/); | |
| 3803 } | |
| 3804 ssl_ReleaseSpecWriteLock(ss); /*************************************/ | |
| 3805 return SECSuccess; | |
| 3806 } | |
| 3807 | |
| 3808 /* This method completes the derivation of the MS from the PMS. | |
| 3809 ** | |
| 3810 ** 1. Derive the MS, if possible, else return an error. | |
| 3811 ** | |
| 3812 ** 2. Check the version if |pms_version| is non-zero and if wrong, | |
| 3813 ** return an error. | |
| 3814 ** | |
| 3815 ** 3. If |msp| is nonzero, return MS in |*msp|. | |
| 3816 | |
| 3817 ** Called from: | |
| 3818 ** ssl3_ComputeMasterSecretInt | |
| 3819 ** tls_ComputeExtendedMasterSecretInt | |
| 3820 */ | |
| 3821 static SECStatus | |
| 3822 ssl3_ComputeMasterSecretFinish(sslSocket *ss, | |
| 3823 CK_MECHANISM_TYPE master_derive, | |
| 3824 CK_MECHANISM_TYPE key_derive, | |
| 3825 CK_VERSION *pms_version, | |
| 3826 SECItem *params, CK_FLAGS keyFlags, | |
| 3827 PK11SymKey *pms, PK11SymKey **msp) | |
| 3828 { | |
| 3829 PK11SymKey *ms = NULL; | |
| 3830 | |
| 3831 ms = PK11_DeriveWithFlags(pms, master_derive, | |
| 3832 params, key_derive, | |
| 3833 CKA_DERIVE, 0, keyFlags); | |
| 3834 if (!ms) { | |
| 3835 ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE); | |
| 3836 return SECFailure; | |
| 3837 } | |
| 3838 | |
| 3839 if (pms_version && ss->opt.detectRollBack) { | |
| 3840 SSL3ProtocolVersion client_version; | |
| 3841 client_version = pms_version->major << 8 | pms_version->minor; | |
| 3842 | |
| 3843 if (IS_DTLS(ss)) { | |
| 3844 client_version = dtls_DTLSVersionToTLSVersion(client_version); | |
| 3845 } | |
| 3846 | |
| 3847 if (client_version != ss->clientHelloVersion) { | |
| 3848 /* Destroy MS. Version roll-back detected. */ | |
| 3849 PK11_FreeSymKey(ms); | |
| 3850 ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE); | |
| 3851 return SECFailure; | |
| 3852 } | |
| 3853 } | |
| 3854 | |
| 3855 if (msp) { | |
| 3856 *msp = ms; | |
| 3857 } else { | |
| 3858 PK11_FreeSymKey(ms); | |
| 3859 } | |
| 3860 | |
| 3861 return SECSuccess; | |
| 3862 } | |
| 3863 | |
| 3864 /* Compute the ordinary (pre draft-ietf-tls-session-hash) master | |
| 3865 ** secret and return it in |*msp|. | |
| 3866 ** | |
| 3867 ** Called from: ssl3_ComputeMasterSecret | |
| 3868 */ | |
| 3869 static SECStatus | |
| 3870 ssl3_ComputeMasterSecretInt(sslSocket *ss, PK11SymKey *pms, | |
| 3871 PK11SymKey **msp) | |
| 3872 { | |
| 3873 ssl3CipherSpec *pwSpec = ss->ssl3.pwSpec; | |
| 3874 const ssl3KEADef *kea_def = ss->ssl3.hs.kea_def; | |
| 3875 unsigned char *cr = (unsigned char *)&ss->ssl3.hs.client_random; | |
| 3876 unsigned char *sr = (unsigned char *)&ss->ssl3.hs.server_random; | |
| 3877 PRBool isTLS = (PRBool)(kea_def->tls_keygen || | |
| 3878 (pwSpec->version > SSL_LIBRARY_VERSION_3_0)); | |
| 3879 PRBool isTLS12 = | |
| 3880 (PRBool)(isTLS && pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); | |
| 3881 /* | |
| 3882 * Whenever isDH is true, we need to use CKM_TLS_MASTER_KEY_DERIVE_DH | |
| 3883 * which, unlike CKM_TLS_MASTER_KEY_DERIVE, converts arbitrary size | |
| 3884 * data into a 48-byte value, and does not expect to return the version. | |
| 3885 */ | |
| 3886 PRBool isDH = (PRBool)((ss->ssl3.hs.kea_def->exchKeyType == kt_dh) || | |
| 3887 (ss->ssl3.hs.kea_def->exchKeyType == kt_ecdh)); | |
| 3888 CK_MECHANISM_TYPE master_derive; | |
| 3889 CK_MECHANISM_TYPE key_derive; | |
| 3890 SECItem params; | |
| 3891 CK_FLAGS keyFlags; | |
| 3892 CK_VERSION pms_version; | |
| 3893 CK_VERSION *pms_version_ptr = NULL; | |
| 3894 /* master_params may be used as a CK_SSL3_MASTER_KEY_DERIVE_PARAMS */ | |
| 3895 CK_TLS12_MASTER_KEY_DERIVE_PARAMS master_params; | |
| 3896 unsigned int master_params_len; | |
| 3897 | |
| 3898 if (isTLS12) { | |
| 3899 if (isDH) | |
| 3900 master_derive = CKM_TLS12_MASTER_KEY_DERIVE_DH; | |
| 3901 else | |
| 3902 master_derive = CKM_TLS12_MASTER_KEY_DERIVE; | |
| 3903 key_derive = CKM_TLS12_KEY_AND_MAC_DERIVE; | |
| 3904 keyFlags = CKF_SIGN | CKF_VERIFY; | |
| 3905 } else if (isTLS) { | |
| 3906 if (isDH) | |
| 3907 master_derive = CKM_TLS_MASTER_KEY_DERIVE_DH; | |
| 3908 else | |
| 3909 master_derive = CKM_TLS_MASTER_KEY_DERIVE; | |
| 3910 key_derive = CKM_TLS_KEY_AND_MAC_DERIVE; | |
| 3911 keyFlags = CKF_SIGN | CKF_VERIFY; | |
| 3912 } else { | |
| 3913 if (isDH) | |
| 3914 master_derive = CKM_SSL3_MASTER_KEY_DERIVE_DH; | |
| 3915 else | |
| 3916 master_derive = CKM_SSL3_MASTER_KEY_DERIVE; | |
| 3917 key_derive = CKM_SSL3_KEY_AND_MAC_DERIVE; | |
| 3918 keyFlags = 0; | |
| 3919 } | |
| 3920 | |
| 3921 if (!isDH) { | |
| 3922 pms_version_ptr = &pms_version; | |
| 3923 } | |
| 3924 | |
| 3925 master_params.pVersion = pms_version_ptr; | |
| 3926 master_params.RandomInfo.pClientRandom = cr; | |
| 3927 master_params.RandomInfo.ulClientRandomLen = SSL3_RANDOM_LENGTH; | |
| 3928 master_params.RandomInfo.pServerRandom = sr; | |
| 3929 master_params.RandomInfo.ulServerRandomLen = SSL3_RANDOM_LENGTH; | |
| 3930 if (isTLS12) { | |
| 3931 master_params.prfHashMechanism = CKM_SHA256; | |
| 3932 master_params_len = sizeof(CK_TLS12_MASTER_KEY_DERIVE_PARAMS); | |
| 3933 } else { | |
| 3934 /* prfHashMechanism is not relevant with this PRF */ | |
| 3935 master_params_len = sizeof(CK_SSL3_MASTER_KEY_DERIVE_PARAMS); | |
| 3936 } | |
| 3937 | |
| 3938 params.data = (unsigned char *)&master_params; | |
| 3939 params.len = master_params_len; | |
| 3940 | |
| 3941 return ssl3_ComputeMasterSecretFinish(ss, master_derive, key_derive, | |
| 3942 pms_version_ptr, ¶ms, | |
| 3943 keyFlags, pms, msp); | |
| 3944 } | |
| 3945 | |
| 3946 /* Compute the draft-ietf-tls-session-hash master | |
| 3947 ** secret and return it in |*msp|. | |
| 3948 ** | |
| 3949 ** Called from: ssl3_ComputeMasterSecret | |
| 3950 */ | |
| 3951 static SECStatus | |
| 3952 tls_ComputeExtendedMasterSecretInt(sslSocket *ss, PK11SymKey *pms, | |
| 3953 PK11SymKey **msp) | |
| 3954 { | |
| 3955 ssl3CipherSpec *pwSpec = ss->ssl3.pwSpec; | |
| 3956 CK_NSS_TLS_EXTENDED_MASTER_KEY_DERIVE_PARAMS extended_master_params; | |
| 3957 SSL3Hashes hashes; | |
| 3958 /* | |
| 3959 * Determine whether to use the DH/ECDH or RSA derivation modes. | |
| 3960 */ | |
| 3961 /* | |
| 3962 * TODO(ekr@rtfm.com): Verify that the slot can handle this key expansion | |
| 3963 * mode. Bug 1198298 */ | |
| 3964 PRBool isDH = (PRBool)((ss->ssl3.hs.kea_def->exchKeyType == kt_dh) || | |
| 3965 (ss->ssl3.hs.kea_def->exchKeyType == kt_ecdh)); | |
| 3966 CK_MECHANISM_TYPE master_derive; | |
| 3967 CK_MECHANISM_TYPE key_derive; | |
| 3968 SECItem params; | |
| 3969 const CK_FLAGS keyFlags = CKF_SIGN | CKF_VERIFY; | |
| 3970 CK_VERSION pms_version; | |
| 3971 CK_VERSION *pms_version_ptr = NULL; | |
| 3972 SECStatus rv; | |
| 3973 | |
| 3974 rv = ssl3_ComputeHandshakeHashes(ss, pwSpec, &hashes, 0); | |
| 3975 if (rv != SECSuccess) { | |
| 3976 PORT_Assert(0); /* Should never fail */ | |
| 3977 ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE); | |
| 3978 return SECFailure; | |
| 3979 } | |
| 3980 | |
| 3981 if (isDH) { | |
| 3982 master_derive = CKM_NSS_TLS_EXTENDED_MASTER_KEY_DERIVE_DH; | |
| 3983 } else { | |
| 3984 master_derive = CKM_NSS_TLS_EXTENDED_MASTER_KEY_DERIVE; | |
| 3985 pms_version_ptr = &pms_version; | |
| 3986 } | |
| 3987 | |
| 3988 if (pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2) { | |
| 3989 /* TLS 1.2 */ | |
| 3990 extended_master_params.prfHashMechanism = CKM_SHA256; | |
| 3991 key_derive = CKM_TLS12_KEY_AND_MAC_DERIVE; | |
| 3992 } else { | |
| 3993 /* TLS < 1.2 */ | |
| 3994 extended_master_params.prfHashMechanism = CKM_TLS_PRF; | |
| 3995 key_derive = CKM_TLS_KEY_AND_MAC_DERIVE; | |
| 3996 } | |
| 3997 | |
| 3998 extended_master_params.pVersion = pms_version_ptr; | |
| 3999 extended_master_params.pSessionHash = hashes.u.raw; | |
| 4000 extended_master_params.ulSessionHashLen = hashes.len; | |
| 4001 | |
| 4002 params.data = (unsigned char *)&extended_master_params; | |
| 4003 params.len = sizeof extended_master_params; | |
| 4004 | |
| 4005 return ssl3_ComputeMasterSecretFinish(ss, master_derive, key_derive, | |
| 4006 pms_version_ptr, ¶ms, | |
| 4007 keyFlags, pms, msp); | |
| 4008 } | |
| 4009 | |
| 4010 /* Wrapper method to compute the master secret and return it in |*msp|. | |
| 4011 ** | |
| 4012 ** Called from ssl3_ComputeMasterSecret | |
| 4013 */ | |
| 4014 static SECStatus | |
| 4015 ssl3_ComputeMasterSecret(sslSocket *ss, PK11SymKey *pms, | |
| 4016 PK11SymKey **msp) | |
| 4017 { | |
| 4018 PORT_Assert(pms != NULL); | |
| 4019 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 4020 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); | |
| 4021 | |
| 4022 if (ssl3_ExtensionNegotiated(ss, ssl_extended_master_secret_xtn)) { | |
| 4023 return tls_ComputeExtendedMasterSecretInt(ss, pms, msp); | |
| 4024 } else { | |
| 4025 return ssl3_ComputeMasterSecretInt(ss, pms, msp); | |
| 4026 } | |
| 4027 } | |
| 4028 | |
| 4029 /* This method uses PKCS11 to derive the MS from the PMS, where PMS | |
| 4030 ** is a PKCS11 symkey. We call ssl3_ComputeMasterSecret to do the | |
| 4031 ** computations and then modify the pwSpec->state as a side effect. | |
| 4032 ** | |
| 4033 ** This is used in all cases except the "triple bypass" with RSA key | |
| 4034 ** exchange. | |
| 4035 ** | |
| 4036 ** Called from ssl3_InitPendingCipherSpec. prSpec is pwSpec. | |
| 4037 */ | |
| 4038 static SECStatus | |
| 4039 ssl3_DeriveMasterSecret(sslSocket *ss, PK11SymKey *pms) | |
| 4040 { | |
| 4041 SECStatus rv; | |
| 4042 PK11SymKey *ms = NULL; | |
| 4043 ssl3CipherSpec *pwSpec = ss->ssl3.pwSpec; | |
| 4044 | |
| 4045 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 4046 PORT_Assert(ss->opt.noLocks || ssl_HaveSpecWriteLock(ss)); | |
| 4047 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); | |
| 4048 | |
| 4049 if (pms) { | |
| 4050 rv = ssl3_ComputeMasterSecret(ss, pms, &ms); | |
| 4051 pwSpec->master_secret = ms; | |
| 4052 if (rv != SECSuccess) | |
| 4053 return rv; | |
| 4054 } | |
| 4055 | |
| 4056 #ifndef NO_PKCS11_BYPASS | |
| 4057 if (ss->opt.bypassPKCS11) { | |
| 4058 SECItem *keydata; | |
| 4059 /* In hope of doing a "double bypass", | |
| 4060 * need to extract the master secret's value from the key object | |
| 4061 * and store it raw in the sslSocket struct. | |
| 4062 */ | |
| 4063 rv = PK11_ExtractKeyValue(pwSpec->master_secret); | |
| 4064 if (rv != SECSuccess) { | |
| 4065 return rv; | |
| 4066 } | |
| 4067 /* This returns the address of the secItem inside the key struct, | |
| 4068 * not a copy or a reference. So, there's no need to free it. | |
| 4069 */ | |
| 4070 keydata = PK11_GetKeyData(pwSpec->master_secret); | |
| 4071 if (keydata && keydata->len <= sizeof pwSpec->raw_master_secret) { | |
| 4072 memcpy(pwSpec->raw_master_secret, keydata->data, keydata->len); | |
| 4073 pwSpec->msItem.data = pwSpec->raw_master_secret; | |
| 4074 pwSpec->msItem.len = keydata->len; | |
| 4075 } else { | |
| 4076 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 4077 return SECFailure; | |
| 4078 } | |
| 4079 } | |
| 4080 #endif | |
| 4081 | |
| 4082 return SECSuccess; | |
| 4083 } | |
| 4084 | |
| 4085 /* | |
| 4086 * Derive encryption and MAC Keys (and IVs) from master secret | |
| 4087 * Sets a useful error code when returning SECFailure. | |
| 4088 * | |
| 4089 * Called only from ssl3_InitPendingCipherSpec(), | |
| 4090 * which in turn is called from | |
| 4091 * sendRSAClientKeyExchange (for Full handshake) | |
| 4092 * sendDHClientKeyExchange (for Full handshake) | |
| 4093 * ssl3_HandleClientKeyExchange (for Full handshake) | |
| 4094 * ssl3_HandleServerHello (for session restart) | |
| 4095 * ssl3_HandleClientHello (for session restart) | |
| 4096 * Caller MUST hold the specWriteLock, and SSL3HandshakeLock. | |
| 4097 * ssl3_InitPendingCipherSpec does that. | |
| 4098 * | |
| 4099 */ | |
| 4100 static SECStatus | |
| 4101 ssl3_DeriveConnectionKeysPKCS11(sslSocket *ss) | |
| 4102 { | |
| 4103 ssl3CipherSpec *pwSpec = ss->ssl3.pwSpec; | |
| 4104 const ssl3KEADef *kea_def = ss->ssl3.hs.kea_def; | |
| 4105 unsigned char *cr = (unsigned char *)&ss->ssl3.hs.client_random; | |
| 4106 unsigned char *sr = (unsigned char *)&ss->ssl3.hs.server_random; | |
| 4107 PRBool isTLS = (PRBool)(kea_def->tls_keygen || | |
| 4108 (pwSpec->version > SSL_LIBRARY_VERSION_3_0)); | |
| 4109 PRBool isTLS12 = | |
| 4110 (PRBool)(isTLS && pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); | |
| 4111 /* following variables used in PKCS11 path */ | |
| 4112 const ssl3BulkCipherDef *cipher_def = pwSpec->cipher_def; | |
| 4113 PK11SlotInfo *slot = NULL; | |
| 4114 PK11SymKey *symKey = NULL; | |
| 4115 void *pwArg = ss->pkcs11PinArg; | |
| 4116 int keySize; | |
| 4117 CK_TLS12_KEY_MAT_PARAMS key_material_params; /* may be used as a | |
| 4118 * CK_SSL3_KEY_MAT_PARAMS */ | |
| 4119 unsigned int key_material_params_len; | |
| 4120 CK_SSL3_KEY_MAT_OUT returnedKeys; | |
| 4121 CK_MECHANISM_TYPE key_derive; | |
| 4122 CK_MECHANISM_TYPE bulk_mechanism; | |
| 4123 SSLCipherAlgorithm calg; | |
| 4124 SECItem params; | |
| 4125 PRBool skipKeysAndIVs = (PRBool)(cipher_def->calg == calg_null); | |
| 4126 | |
| 4127 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 4128 PORT_Assert(ss->opt.noLocks || ssl_HaveSpecWriteLock(ss)); | |
| 4129 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); | |
| 4130 | |
| 4131 if (!pwSpec->master_secret) { | |
| 4132 PORT_SetError(SSL_ERROR_SESSION_KEY_GEN_FAILURE); | |
| 4133 return SECFailure; | |
| 4134 } | |
| 4135 /* | |
| 4136 * generate the key material | |
| 4137 */ | |
| 4138 key_material_params.ulMacSizeInBits = pwSpec->mac_size * BPB; | |
| 4139 key_material_params.ulKeySizeInBits = cipher_def->secret_key_size * BPB; | |
| 4140 key_material_params.ulIVSizeInBits = cipher_def->iv_size * BPB; | |
| 4141 if (cipher_def->type == type_block && | |
| 4142 pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_1) { | |
| 4143 /* Block ciphers in >= TLS 1.1 use a per-record, explicit IV. */ | |
| 4144 key_material_params.ulIVSizeInBits = 0; | |
| 4145 memset(pwSpec->client.write_iv, 0, cipher_def->iv_size); | |
| 4146 memset(pwSpec->server.write_iv, 0, cipher_def->iv_size); | |
| 4147 } | |
| 4148 | |
| 4149 key_material_params.bIsExport = (CK_BBOOL)(kea_def->is_limited); | |
| 4150 | |
| 4151 key_material_params.RandomInfo.pClientRandom = cr; | |
| 4152 key_material_params.RandomInfo.ulClientRandomLen = SSL3_RANDOM_LENGTH; | |
| 4153 key_material_params.RandomInfo.pServerRandom = sr; | |
| 4154 key_material_params.RandomInfo.ulServerRandomLen = SSL3_RANDOM_LENGTH; | |
| 4155 key_material_params.pReturnedKeyMaterial = &returnedKeys; | |
| 4156 | |
| 4157 returnedKeys.pIVClient = pwSpec->client.write_iv; | |
| 4158 returnedKeys.pIVServer = pwSpec->server.write_iv; | |
| 4159 keySize = cipher_def->key_size; | |
| 4160 | |
| 4161 if (skipKeysAndIVs) { | |
| 4162 keySize = 0; | |
| 4163 key_material_params.ulKeySizeInBits = 0; | |
| 4164 key_material_params.ulIVSizeInBits = 0; | |
| 4165 returnedKeys.pIVClient = NULL; | |
| 4166 returnedKeys.pIVServer = NULL; | |
| 4167 } | |
| 4168 | |
| 4169 calg = cipher_def->calg; | |
| 4170 bulk_mechanism = ssl3_Alg2Mech(calg); | |
| 4171 | |
| 4172 if (isTLS12) { | |
| 4173 key_derive = CKM_TLS12_KEY_AND_MAC_DERIVE; | |
| 4174 key_material_params.prfHashMechanism = CKM_SHA256; | |
| 4175 key_material_params_len = sizeof(CK_TLS12_KEY_MAT_PARAMS); | |
| 4176 } else if (isTLS) { | |
| 4177 key_derive = CKM_TLS_KEY_AND_MAC_DERIVE; | |
| 4178 key_material_params_len = sizeof(CK_SSL3_KEY_MAT_PARAMS); | |
| 4179 } else { | |
| 4180 key_derive = CKM_SSL3_KEY_AND_MAC_DERIVE; | |
| 4181 key_material_params_len = sizeof(CK_SSL3_KEY_MAT_PARAMS); | |
| 4182 } | |
| 4183 | |
| 4184 params.data = (unsigned char *)&key_material_params; | |
| 4185 params.len = key_material_params_len; | |
| 4186 | |
| 4187 /* CKM_SSL3_KEY_AND_MAC_DERIVE is defined to set ENCRYPT, DECRYPT, and | |
| 4188 * DERIVE by DEFAULT */ | |
| 4189 symKey = PK11_Derive(pwSpec->master_secret, key_derive, ¶ms, | |
| 4190 bulk_mechanism, CKA_ENCRYPT, keySize); | |
| 4191 if (!symKey) { | |
| 4192 ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE); | |
| 4193 return SECFailure; | |
| 4194 } | |
| 4195 /* we really should use the actual mac'ing mechanism here, but we | |
| 4196 * don't because these types are used to map keytype anyway and both | |
| 4197 * mac's map to the same keytype. | |
| 4198 */ | |
| 4199 slot = PK11_GetSlotFromKey(symKey); | |
| 4200 | |
| 4201 PK11_FreeSlot(slot); /* slot is held until the key is freed */ | |
| 4202 pwSpec->client.write_mac_key = | |
| 4203 PK11_SymKeyFromHandle(slot, symKey, PK11_OriginDerive, | |
| 4204 CKM_SSL3_SHA1_MAC, returnedKeys.hClientMacSecret,
PR_TRUE, pwArg); | |
| 4205 if (pwSpec->client.write_mac_key == NULL) { | |
| 4206 goto loser; /* loser sets err */ | |
| 4207 } | |
| 4208 pwSpec->server.write_mac_key = | |
| 4209 PK11_SymKeyFromHandle(slot, symKey, PK11_OriginDerive, | |
| 4210 CKM_SSL3_SHA1_MAC, returnedKeys.hServerMacSecret,
PR_TRUE, pwArg); | |
| 4211 if (pwSpec->server.write_mac_key == NULL) { | |
| 4212 goto loser; /* loser sets err */ | |
| 4213 } | |
| 4214 if (!skipKeysAndIVs) { | |
| 4215 pwSpec->client.write_key = | |
| 4216 PK11_SymKeyFromHandle(slot, symKey, PK11_OriginDerive, | |
| 4217 bulk_mechanism, returnedKeys.hClientKey, PR_TR
UE, pwArg); | |
| 4218 if (pwSpec->client.write_key == NULL) { | |
| 4219 goto loser; /* loser sets err */ | |
| 4220 } | |
| 4221 pwSpec->server.write_key = | |
| 4222 PK11_SymKeyFromHandle(slot, symKey, PK11_OriginDerive, | |
| 4223 bulk_mechanism, returnedKeys.hServerKey, PR_TR
UE, pwArg); | |
| 4224 if (pwSpec->server.write_key == NULL) { | |
| 4225 goto loser; /* loser sets err */ | |
| 4226 } | |
| 4227 } | |
| 4228 PK11_FreeSymKey(symKey); | |
| 4229 return SECSuccess; | |
| 4230 | |
| 4231 loser: | |
| 4232 if (symKey) | |
| 4233 PK11_FreeSymKey(symKey); | |
| 4234 ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE); | |
| 4235 return SECFailure; | |
| 4236 } | |
| 4237 | |
| 4238 /* ssl3_InitHandshakeHashes creates handshake hash contexts and hashes in | |
| 4239 * buffered messages in ss->ssl3.hs.messages. */ | |
| 4240 static SECStatus | |
| 4241 ssl3_InitHandshakeHashes(sslSocket *ss) | |
| 4242 { | |
| 4243 SSL_TRC(30, ("%d: SSL3[%d]: start handshake hashes", SSL_GETPID(), ss->fd)); | |
| 4244 | |
| 4245 PORT_Assert(ss->ssl3.hs.hashType == handshake_hash_unknown); | |
| 4246 #ifndef NO_PKCS11_BYPASS | |
| 4247 if (ss->opt.bypassPKCS11) { | |
| 4248 PORT_Assert(!ss->ssl3.hs.sha_obj && !ss->ssl3.hs.sha_clone); | |
| 4249 if (ss->version >= SSL_LIBRARY_VERSION_TLS_1_2) { | |
| 4250 /* If we ever support ciphersuites where the PRF hash isn't SHA-256 | |
| 4251 * then this will need to be updated. */ | |
| 4252 ss->ssl3.hs.sha_obj = HASH_GetRawHashObject(HASH_AlgSHA256); | |
| 4253 if (!ss->ssl3.hs.sha_obj) { | |
| 4254 ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); | |
| 4255 return SECFailure; | |
| 4256 } | |
| 4257 ss->ssl3.hs.sha_clone = (void (*)(void *, void *))SHA256_Clone; | |
| 4258 ss->ssl3.hs.hashType = handshake_hash_single; | |
| 4259 ss->ssl3.hs.sha_obj->begin(ss->ssl3.hs.sha_cx); | |
| 4260 } else { | |
| 4261 ss->ssl3.hs.hashType = handshake_hash_combo; | |
| 4262 MD5_Begin((MD5Context *)ss->ssl3.hs.md5_cx); | |
| 4263 SHA1_Begin((SHA1Context *)ss->ssl3.hs.sha_cx); | |
| 4264 } | |
| 4265 } else | |
| 4266 #endif | |
| 4267 { | |
| 4268 PORT_Assert(!ss->ssl3.hs.md5 && !ss->ssl3.hs.sha); | |
| 4269 /* | |
| 4270 * note: We should probably lookup an SSL3 slot for these | |
| 4271 * handshake hashes in hopes that we wind up with the same slots | |
| 4272 * that the master secret will wind up in ... | |
| 4273 */ | |
| 4274 if (ss->version >= SSL_LIBRARY_VERSION_TLS_1_2) { | |
| 4275 /* If we ever support ciphersuites where the PRF hash isn't SHA-256 | |
| 4276 * then this will need to be updated. */ | |
| 4277 ss->ssl3.hs.sha = PK11_CreateDigestContext(SEC_OID_SHA256); | |
| 4278 if (ss->ssl3.hs.sha == NULL) { | |
| 4279 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | |
| 4280 return SECFailure; | |
| 4281 } | |
| 4282 ss->ssl3.hs.hashType = handshake_hash_single; | |
| 4283 | |
| 4284 if (PK11_DigestBegin(ss->ssl3.hs.sha) != SECSuccess) { | |
| 4285 ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); | |
| 4286 return SECFailure; | |
| 4287 } | |
| 4288 | |
| 4289 /* Create a backup SHA-1 hash for a potential client auth | |
| 4290 * signature. | |
| 4291 * | |
| 4292 * In TLS 1.2, ssl3_ComputeHandshakeHashes always uses the | |
| 4293 * handshake hash function (SHA-256). If the server or the client | |
| 4294 * does not support SHA-256 as a signature hash, we can either | |
| 4295 * maintain a backup SHA-1 handshake hash or buffer all handshake | |
| 4296 * messages. | |
| 4297 */ | |
| 4298 if (!ss->sec.isServer) { | |
| 4299 ss->ssl3.hs.backupHash = PK11_CreateDigestContext(SEC_OID_SHA1); | |
| 4300 if (ss->ssl3.hs.backupHash == NULL) { | |
| 4301 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | |
| 4302 return SECFailure; | |
| 4303 } | |
| 4304 | |
| 4305 if (PK11_DigestBegin(ss->ssl3.hs.backupHash) != SECSuccess) { | |
| 4306 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | |
| 4307 return SECFailure; | |
| 4308 } | |
| 4309 } | |
| 4310 } else { | |
| 4311 /* Both ss->ssl3.hs.md5 and ss->ssl3.hs.sha should be NULL or | |
| 4312 * created successfully. */ | |
| 4313 ss->ssl3.hs.md5 = PK11_CreateDigestContext(SEC_OID_MD5); | |
| 4314 if (ss->ssl3.hs.md5 == NULL) { | |
| 4315 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); | |
| 4316 return SECFailure; | |
| 4317 } | |
| 4318 ss->ssl3.hs.sha = PK11_CreateDigestContext(SEC_OID_SHA1); | |
| 4319 if (ss->ssl3.hs.sha == NULL) { | |
| 4320 PK11_DestroyContext(ss->ssl3.hs.md5, PR_TRUE); | |
| 4321 ss->ssl3.hs.md5 = NULL; | |
| 4322 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | |
| 4323 return SECFailure; | |
| 4324 } | |
| 4325 ss->ssl3.hs.hashType = handshake_hash_combo; | |
| 4326 | |
| 4327 if (PK11_DigestBegin(ss->ssl3.hs.md5) != SECSuccess) { | |
| 4328 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); | |
| 4329 return SECFailure; | |
| 4330 } | |
| 4331 if (PK11_DigestBegin(ss->ssl3.hs.sha) != SECSuccess) { | |
| 4332 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | |
| 4333 return SECFailure; | |
| 4334 } | |
| 4335 } | |
| 4336 } | |
| 4337 | |
| 4338 if (ss->ssl3.hs.messages.len > 0) { | |
| 4339 if (ssl3_UpdateHandshakeHashes(ss, ss->ssl3.hs.messages.buf, | |
| 4340 ss->ssl3.hs.messages.len) != | |
| 4341 SECSuccess) { | |
| 4342 return SECFailure; | |
| 4343 } | |
| 4344 PORT_Free(ss->ssl3.hs.messages.buf); | |
| 4345 ss->ssl3.hs.messages.buf = NULL; | |
| 4346 ss->ssl3.hs.messages.len = 0; | |
| 4347 ss->ssl3.hs.messages.space = 0; | |
| 4348 } | |
| 4349 | |
| 4350 return SECSuccess; | |
| 4351 } | |
| 4352 | |
| 4353 static SECStatus | |
| 4354 ssl3_RestartHandshakeHashes(sslSocket *ss) | |
| 4355 { | |
| 4356 SECStatus rv = SECSuccess; | |
| 4357 | |
| 4358 SSL_TRC(30, ("%d: SSL3[%d]: reset handshake hashes", | |
| 4359 SSL_GETPID(), ss->fd)); | |
| 4360 ss->ssl3.hs.hashType = handshake_hash_unknown; | |
| 4361 ss->ssl3.hs.messages.len = 0; | |
| 4362 #ifndef NO_PKCS11_BYPASS | |
| 4363 ss->ssl3.hs.sha_obj = NULL; | |
| 4364 ss->ssl3.hs.sha_clone = NULL; | |
| 4365 #endif | |
| 4366 if (ss->ssl3.hs.md5) { | |
| 4367 PK11_DestroyContext(ss->ssl3.hs.md5, PR_TRUE); | |
| 4368 ss->ssl3.hs.md5 = NULL; | |
| 4369 } | |
| 4370 if (ss->ssl3.hs.sha) { | |
| 4371 PK11_DestroyContext(ss->ssl3.hs.sha, PR_TRUE); | |
| 4372 ss->ssl3.hs.sha = NULL; | |
| 4373 } | |
| 4374 return rv; | |
| 4375 } | |
| 4376 | |
| 4377 /* | |
| 4378 * Handshake messages | |
| 4379 */ | |
| 4380 /* Called from ssl3_InitHandshakeHashes() | |
| 4381 ** ssl3_AppendHandshake() | |
| 4382 ** ssl3_StartHandshakeHash() | |
| 4383 ** ssl3_HandleV2ClientHello() | |
| 4384 ** ssl3_HandleHandshakeMessage() | |
| 4385 ** Caller must hold the ssl3Handshake lock. | |
| 4386 */ | |
| 4387 static SECStatus | |
| 4388 ssl3_UpdateHandshakeHashes(sslSocket *ss, const unsigned char *b, | |
| 4389 unsigned int l) | |
| 4390 { | |
| 4391 SECStatus rv = SECSuccess; | |
| 4392 | |
| 4393 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 4394 | |
| 4395 /* We need to buffer the handshake messages until we have established | |
| 4396 * which handshake hash function to use. */ | |
| 4397 if (ss->ssl3.hs.hashType == handshake_hash_unknown) { | |
| 4398 return sslBuffer_Append(&ss->ssl3.hs.messages, b, l); | |
| 4399 } | |
| 4400 | |
| 4401 PRINT_BUF(90, (NULL, "handshake hash input:", b, l)); | |
| 4402 | |
| 4403 #ifndef NO_PKCS11_BYPASS | |
| 4404 if (ss->opt.bypassPKCS11) { | |
| 4405 if (ss->ssl3.hs.hashType == handshake_hash_single) { | |
| 4406 ss->ssl3.hs.sha_obj->update(ss->ssl3.hs.sha_cx, b, l); | |
| 4407 } else { | |
| 4408 MD5_Update((MD5Context *)ss->ssl3.hs.md5_cx, b, l); | |
| 4409 SHA1_Update((SHA1Context *)ss->ssl3.hs.sha_cx, b, l); | |
| 4410 } | |
| 4411 return rv; | |
| 4412 } | |
| 4413 #endif | |
| 4414 if (ss->ssl3.hs.hashType == handshake_hash_single) { | |
| 4415 rv = PK11_DigestOp(ss->ssl3.hs.sha, b, l); | |
| 4416 if (rv != SECSuccess) { | |
| 4417 ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); | |
| 4418 return rv; | |
| 4419 } | |
| 4420 if (ss->ssl3.hs.backupHash) { | |
| 4421 rv = PK11_DigestOp(ss->ssl3.hs.backupHash, b, l); | |
| 4422 if (rv != SECSuccess) { | |
| 4423 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | |
| 4424 return rv; | |
| 4425 } | |
| 4426 } | |
| 4427 } else { | |
| 4428 rv = PK11_DigestOp(ss->ssl3.hs.md5, b, l); | |
| 4429 if (rv != SECSuccess) { | |
| 4430 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); | |
| 4431 return rv; | |
| 4432 } | |
| 4433 rv = PK11_DigestOp(ss->ssl3.hs.sha, b, l); | |
| 4434 if (rv != SECSuccess) { | |
| 4435 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | |
| 4436 return rv; | |
| 4437 } | |
| 4438 } | |
| 4439 return rv; | |
| 4440 } | |
| 4441 | |
| 4442 /************************************************************************** | |
| 4443 * Append Handshake functions. | |
| 4444 * All these functions set appropriate error codes. | |
| 4445 * Most rely on ssl3_AppendHandshake to set the error code. | |
| 4446 **************************************************************************/ | |
| 4447 SECStatus | |
| 4448 ssl3_AppendHandshake(sslSocket *ss, const void *void_src, PRInt32 bytes) | |
| 4449 { | |
| 4450 unsigned char *src = (unsigned char *)void_src; | |
| 4451 int room = ss->sec.ci.sendBuf.space - ss->sec.ci.sendBuf.len; | |
| 4452 SECStatus rv; | |
| 4453 | |
| 4454 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); /* protects s
endBuf. */ | |
| 4455 | |
| 4456 if (!bytes) | |
| 4457 return SECSuccess; | |
| 4458 if (ss->sec.ci.sendBuf.space < MAX_SEND_BUF_LENGTH && room < bytes) { | |
| 4459 rv = sslBuffer_Grow(&ss->sec.ci.sendBuf, PR_MAX(MIN_SEND_BUF_LENGTH, | |
| 4460 PR_MIN(MAX_SEND_BUF_LENG
TH, ss->sec.ci.sendBuf.len + bytes))); | |
| 4461 if (rv != SECSuccess) | |
| 4462 return rv; /* sslBuffer_Grow has set a memory error code. */ | |
| 4463 room = ss->sec.ci.sendBuf.space - ss->sec.ci.sendBuf.len; | |
| 4464 } | |
| 4465 | |
| 4466 PRINT_BUF(60, (ss, "Append to Handshake", (unsigned char *)void_src, bytes))
; | |
| 4467 rv = ssl3_UpdateHandshakeHashes(ss, src, bytes); | |
| 4468 if (rv != SECSuccess) | |
| 4469 return rv; /* error code set by ssl3_UpdateHandshakeHashes */ | |
| 4470 | |
| 4471 while (bytes > room) { | |
| 4472 if (room > 0) | |
| 4473 PORT_Memcpy(ss->sec.ci.sendBuf.buf + ss->sec.ci.sendBuf.len, src, | |
| 4474 room); | |
| 4475 ss->sec.ci.sendBuf.len += room; | |
| 4476 rv = ssl3_FlushHandshake(ss, ssl_SEND_FLAG_FORCE_INTO_BUFFER); | |
| 4477 if (rv != SECSuccess) { | |
| 4478 return rv; /* error code set by ssl3_FlushHandshake */ | |
| 4479 } | |
| 4480 bytes -= room; | |
| 4481 src += room; | |
| 4482 room = ss->sec.ci.sendBuf.space; | |
| 4483 PORT_Assert(ss->sec.ci.sendBuf.len == 0); | |
| 4484 } | |
| 4485 PORT_Memcpy(ss->sec.ci.sendBuf.buf + ss->sec.ci.sendBuf.len, src, bytes); | |
| 4486 ss->sec.ci.sendBuf.len += bytes; | |
| 4487 return SECSuccess; | |
| 4488 } | |
| 4489 | |
| 4490 SECStatus | |
| 4491 ssl3_AppendHandshakeNumber(sslSocket *ss, PRInt32 num, PRInt32 lenSize) | |
| 4492 { | |
| 4493 SECStatus rv; | |
| 4494 PRUint8 b[4]; | |
| 4495 PRUint8 *p = b; | |
| 4496 | |
| 4497 PORT_Assert(lenSize <= 4 && lenSize > 0); | |
| 4498 if (lenSize < 4 && num >= (1L << (lenSize * 8))) { | |
| 4499 PORT_SetError(SSL_ERROR_TX_RECORD_TOO_LONG); | |
| 4500 return SECFailure; | |
| 4501 } | |
| 4502 | |
| 4503 switch (lenSize) { | |
| 4504 case 4: | |
| 4505 *p++ = (num >> 24) & 0xff; | |
| 4506 case 3: | |
| 4507 *p++ = (num >> 16) & 0xff; | |
| 4508 case 2: | |
| 4509 *p++ = (num >> 8) & 0xff; | |
| 4510 case 1: | |
| 4511 *p = num & 0xff; | |
| 4512 } | |
| 4513 SSL_TRC(60, ("%d: number:", SSL_GETPID())); | |
| 4514 rv = ssl3_AppendHandshake(ss, &b[0], lenSize); | |
| 4515 return rv; /* error code set by AppendHandshake, if applicable. */ | |
| 4516 } | |
| 4517 | |
| 4518 SECStatus | |
| 4519 ssl3_AppendHandshakeVariable( | |
| 4520 sslSocket *ss, const SSL3Opaque *src, PRInt32 bytes, PRInt32 lenSize) | |
| 4521 { | |
| 4522 SECStatus rv; | |
| 4523 | |
| 4524 PORT_Assert((bytes < (1 << 8) && lenSize == 1) || | |
| 4525 (bytes < (1L << 16) && lenSize == 2) || | |
| 4526 (bytes < (1L << 24) && lenSize == 3)); | |
| 4527 | |
| 4528 SSL_TRC(60, ("%d: append variable:", SSL_GETPID())); | |
| 4529 rv = ssl3_AppendHandshakeNumber(ss, bytes, lenSize); | |
| 4530 if (rv != SECSuccess) { | |
| 4531 return rv; /* error code set by AppendHandshake, if applicable. */ | |
| 4532 } | |
| 4533 SSL_TRC(60, ("data:")); | |
| 4534 rv = ssl3_AppendHandshake(ss, src, bytes); | |
| 4535 return rv; /* error code set by AppendHandshake, if applicable. */ | |
| 4536 } | |
| 4537 | |
| 4538 SECStatus | |
| 4539 ssl3_AppendHandshakeHeader(sslSocket *ss, SSL3HandshakeType t, PRUint32 length) | |
| 4540 { | |
| 4541 SECStatus rv; | |
| 4542 | |
| 4543 /* If we already have a message in place, we need to enqueue it. | |
| 4544 * This empties the buffer. This is a convenient place to call | |
| 4545 * dtls_StageHandshakeMessage to mark the message boundary. | |
| 4546 */ | |
| 4547 if (IS_DTLS(ss)) { | |
| 4548 rv = dtls_StageHandshakeMessage(ss); | |
| 4549 if (rv != SECSuccess) { | |
| 4550 return rv; | |
| 4551 } | |
| 4552 } | |
| 4553 | |
| 4554 SSL_TRC(30, ("%d: SSL3[%d]: append handshake header: type %s", | |
| 4555 SSL_GETPID(), ss->fd, ssl3_DecodeHandshakeType(t))); | |
| 4556 | |
| 4557 rv = ssl3_AppendHandshakeNumber(ss, t, 1); | |
| 4558 if (rv != SECSuccess) { | |
| 4559 return rv; /* error code set by AppendHandshake, if applicable. */ | |
| 4560 } | |
| 4561 rv = ssl3_AppendHandshakeNumber(ss, length, 3); | |
| 4562 if (rv != SECSuccess) { | |
| 4563 return rv; /* error code set by AppendHandshake, if applicable. */ | |
| 4564 } | |
| 4565 | |
| 4566 if (IS_DTLS(ss)) { | |
| 4567 /* Note that we make an unfragmented message here. We fragment in the | |
| 4568 * transmission code, if necessary */ | |
| 4569 rv = ssl3_AppendHandshakeNumber(ss, ss->ssl3.hs.sendMessageSeq, 2); | |
| 4570 if (rv != SECSuccess) { | |
| 4571 return rv; /* error code set by AppendHandshake, if applicable. */ | |
| 4572 } | |
| 4573 ss->ssl3.hs.sendMessageSeq++; | |
| 4574 | |
| 4575 /* 0 is the fragment offset, because it's not fragmented yet */ | |
| 4576 rv = ssl3_AppendHandshakeNumber(ss, 0, 3); | |
| 4577 if (rv != SECSuccess) { | |
| 4578 return rv; /* error code set by AppendHandshake, if applicable. */ | |
| 4579 } | |
| 4580 | |
| 4581 /* Fragment length -- set to the packet length because not fragmented */ | |
| 4582 rv = ssl3_AppendHandshakeNumber(ss, length, 3); | |
| 4583 if (rv != SECSuccess) { | |
| 4584 return rv; /* error code set by AppendHandshake, if applicable. */ | |
| 4585 } | |
| 4586 } | |
| 4587 | |
| 4588 return rv; /* error code set by AppendHandshake, if applicable. */ | |
| 4589 } | |
| 4590 | |
| 4591 /* ssl3_AppendSignatureAndHashAlgorithm appends the serialisation of | |
| 4592 * |sigAndHash| to the current handshake message. */ | |
| 4593 SECStatus | |
| 4594 ssl3_AppendSignatureAndHashAlgorithm( | |
| 4595 sslSocket *ss, const SSLSignatureAndHashAlg *sigAndHash) | |
| 4596 { | |
| 4597 PRUint8 serialized[2]; | |
| 4598 | |
| 4599 serialized[0] = (PRUint8)sigAndHash->hashAlg; | |
| 4600 serialized[1] = (PRUint8)sigAndHash->sigAlg; | |
| 4601 | |
| 4602 return ssl3_AppendHandshake(ss, serialized, sizeof(serialized)); | |
| 4603 } | |
| 4604 | |
| 4605 /************************************************************************** | |
| 4606 * Consume Handshake functions. | |
| 4607 * | |
| 4608 * All data used in these functions is protected by two locks, | |
| 4609 * the RecvBufLock and the SSL3HandshakeLock | |
| 4610 **************************************************************************/ | |
| 4611 | |
| 4612 /* Read up the next "bytes" number of bytes from the (decrypted) input | |
| 4613 * stream "b" (which is *length bytes long). Copy them into buffer "v". | |
| 4614 * Reduces *length by bytes. Advances *b by bytes. | |
| 4615 * | |
| 4616 * If this function returns SECFailure, it has already sent an alert, | |
| 4617 * and has set a generic error code. The caller should probably | |
| 4618 * override the generic error code by setting another. | |
| 4619 */ | |
| 4620 SECStatus | |
| 4621 ssl3_ConsumeHandshake(sslSocket *ss, void *v, PRInt32 bytes, SSL3Opaque **b, | |
| 4622 PRUint32 *length) | |
| 4623 { | |
| 4624 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 4625 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 4626 | |
| 4627 if ((PRUint32)bytes > *length) { | |
| 4628 return ssl3_DecodeError(ss); | |
| 4629 } | |
| 4630 PORT_Memcpy(v, *b, bytes); | |
| 4631 PRINT_BUF(60, (ss, "consume bytes:", *b, bytes)); | |
| 4632 *b += bytes; | |
| 4633 *length -= bytes; | |
| 4634 return SECSuccess; | |
| 4635 } | |
| 4636 | |
| 4637 /* Read up the next "bytes" number of bytes from the (decrypted) input | |
| 4638 * stream "b" (which is *length bytes long), and interpret them as an | |
| 4639 * integer in network byte order. Returns the received value. | |
| 4640 * Reduces *length by bytes. Advances *b by bytes. | |
| 4641 * | |
| 4642 * Returns SECFailure (-1) on failure. | |
| 4643 * This value is indistinguishable from the equivalent received value. | |
| 4644 * Only positive numbers are to be received this way. | |
| 4645 * Thus, the largest value that may be sent this way is 0x7fffffff. | |
| 4646 * On error, an alert has been sent, and a generic error code has been set. | |
| 4647 */ | |
| 4648 PRInt32 | |
| 4649 ssl3_ConsumeHandshakeNumber(sslSocket *ss, PRInt32 bytes, SSL3Opaque **b, | |
| 4650 PRUint32 *length) | |
| 4651 { | |
| 4652 PRUint8 *buf = *b; | |
| 4653 int i; | |
| 4654 PRInt32 num = 0; | |
| 4655 | |
| 4656 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 4657 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 4658 PORT_Assert(bytes <= sizeof num); | |
| 4659 | |
| 4660 if ((PRUint32)bytes > *length) { | |
| 4661 return ssl3_DecodeError(ss); | |
| 4662 } | |
| 4663 PRINT_BUF(60, (ss, "consume bytes:", *b, bytes)); | |
| 4664 | |
| 4665 for (i = 0; i < bytes; i++) | |
| 4666 num = (num << 8) + buf[i]; | |
| 4667 *b += bytes; | |
| 4668 *length -= bytes; | |
| 4669 return num; | |
| 4670 } | |
| 4671 | |
| 4672 /* Read in two values from the incoming decrypted byte stream "b", which is | |
| 4673 * *length bytes long. The first value is a number whose size is "bytes" | |
| 4674 * bytes long. The second value is a byte-string whose size is the value | |
| 4675 * of the first number received. The latter byte-string, and its length, | |
| 4676 * is returned in the SECItem i. | |
| 4677 * | |
| 4678 * Returns SECFailure (-1) on failure. | |
| 4679 * On error, an alert has been sent, and a generic error code has been set. | |
| 4680 * | |
| 4681 * RADICAL CHANGE for NSS 3.11. All callers of this function make copies | |
| 4682 * of the data returned in the SECItem *i, so making a copy of it here | |
| 4683 * is simply wasteful. So, This function now just sets SECItem *i to | |
| 4684 * point to the values in the buffer **b. | |
| 4685 */ | |
| 4686 SECStatus | |
| 4687 ssl3_ConsumeHandshakeVariable(sslSocket *ss, SECItem *i, PRInt32 bytes, | |
| 4688 SSL3Opaque **b, PRUint32 *length) | |
| 4689 { | |
| 4690 PRInt32 count; | |
| 4691 | |
| 4692 PORT_Assert(bytes <= 3); | |
| 4693 i->len = 0; | |
| 4694 i->data = NULL; | |
| 4695 i->type = siBuffer; | |
| 4696 count = ssl3_ConsumeHandshakeNumber(ss, bytes, b, length); | |
| 4697 if (count < 0) { /* Can't test for SECSuccess here. */ | |
| 4698 return SECFailure; | |
| 4699 } | |
| 4700 if (count > 0) { | |
| 4701 if ((PRUint32)count > *length) { | |
| 4702 return ssl3_DecodeError(ss); | |
| 4703 } | |
| 4704 i->data = *b; | |
| 4705 i->len = count; | |
| 4706 *b += count; | |
| 4707 *length -= count; | |
| 4708 } | |
| 4709 return SECSuccess; | |
| 4710 } | |
| 4711 | |
| 4712 /* tlsHashOIDMap contains the mapping between TLS hash identifiers and the | |
| 4713 * SECOidTag used internally by NSS. */ | |
| 4714 static const struct { | |
| 4715 SSLHashType tlsHash; | |
| 4716 SECOidTag oid; | |
| 4717 } tlsHashOIDMap[] = { | |
| 4718 { ssl_hash_sha1, SEC_OID_SHA1 }, | |
| 4719 { ssl_hash_sha256, SEC_OID_SHA256 }, | |
| 4720 { ssl_hash_sha384, SEC_OID_SHA384 }, | |
| 4721 { ssl_hash_sha512, SEC_OID_SHA512 } | |
| 4722 }; | |
| 4723 | |
| 4724 /* ssl3_TLSHashAlgorithmToOID converts a TLS hash identifier into an OID value. | |
| 4725 * If the hash is not recognised, SEC_OID_UNKNOWN is returned. | |
| 4726 * | |
| 4727 * See https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 */ | |
| 4728 SECOidTag | |
| 4729 ssl3_TLSHashAlgorithmToOID(SSLHashType hashFunc) | |
| 4730 { | |
| 4731 unsigned int i; | |
| 4732 | |
| 4733 for (i = 0; i < PR_ARRAY_SIZE(tlsHashOIDMap); i++) { | |
| 4734 if (hashFunc == tlsHashOIDMap[i].tlsHash) { | |
| 4735 return tlsHashOIDMap[i].oid; | |
| 4736 } | |
| 4737 } | |
| 4738 return SEC_OID_UNKNOWN; | |
| 4739 } | |
| 4740 | |
| 4741 /* ssl3_TLSSignatureAlgorithmForKeyType returns the TLS 1.2 signature algorithm | |
| 4742 * identifier for a given KeyType. */ | |
| 4743 static SECStatus | |
| 4744 ssl3_TLSSignatureAlgorithmForKeyType(KeyType keyType, SSLSignType *out) | |
| 4745 { | |
| 4746 switch (keyType) { | |
| 4747 case rsaKey: | |
| 4748 *out = ssl_sign_rsa; | |
| 4749 return SECSuccess; | |
| 4750 case dsaKey: | |
| 4751 *out = ssl_sign_dsa; | |
| 4752 return SECSuccess; | |
| 4753 case ecKey: | |
| 4754 *out = ssl_sign_ecdsa; | |
| 4755 return SECSuccess; | |
| 4756 default: | |
| 4757 PORT_SetError(SEC_ERROR_INVALID_KEY); | |
| 4758 return SECFailure; | |
| 4759 } | |
| 4760 } | |
| 4761 | |
| 4762 /* ssl3_TLSSignatureAlgorithmForCertificate returns the TLS 1.2 signature | |
| 4763 * algorithm identifier for the given certificate. */ | |
| 4764 static SECStatus | |
| 4765 ssl3_TLSSignatureAlgorithmForCertificate(CERTCertificate *cert, | |
| 4766 SSLSignType *out) | |
| 4767 { | |
| 4768 SECKEYPublicKey *key; | |
| 4769 KeyType keyType; | |
| 4770 | |
| 4771 key = CERT_ExtractPublicKey(cert); | |
| 4772 if (key == NULL) { | |
| 4773 ssl_MapLowLevelError(SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE); | |
| 4774 return SECFailure; | |
| 4775 } | |
| 4776 | |
| 4777 keyType = key->keyType; | |
| 4778 SECKEY_DestroyPublicKey(key); | |
| 4779 return ssl3_TLSSignatureAlgorithmForKeyType(keyType, out); | |
| 4780 } | |
| 4781 | |
| 4782 /* ssl3_CheckSignatureAndHashAlgorithmConsistency checks that the signature | |
| 4783 * algorithm identifier in |sigAndHash| is consistent with the public key in | |
| 4784 * |cert|. It also checks the hash algorithm against the configured signature | |
| 4785 * algorithms. If all the tests pass, SECSuccess is returned. Otherwise, | |
| 4786 * PORT_SetError is called and SECFailure is returned. */ | |
| 4787 SECStatus | |
| 4788 ssl3_CheckSignatureAndHashAlgorithmConsistency( | |
| 4789 sslSocket *ss, const SSLSignatureAndHashAlg *sigAndHash, | |
| 4790 CERTCertificate *cert) | |
| 4791 { | |
| 4792 SECStatus rv; | |
| 4793 SSLSignType sigAlg; | |
| 4794 unsigned int i; | |
| 4795 | |
| 4796 /* If we're a client, check that the signature algorithm matches the signing | |
| 4797 * key type of the cipher suite. */ | |
| 4798 if (!ss->sec.isServer && | |
| 4799 ss->ssl3.hs.kea_def->signKeyType != sigAndHash->sigAlg) { | |
| 4800 PORT_SetError(SSL_ERROR_INCORRECT_SIGNATURE_ALGORITHM); | |
| 4801 return SECFailure; | |
| 4802 } | |
| 4803 | |
| 4804 /* Verify that the signature algorithm used for the | |
| 4805 * signature matches the signing key. */ | |
| 4806 rv = ssl3_TLSSignatureAlgorithmForCertificate(cert, &sigAlg); | |
| 4807 if (rv != SECSuccess) { | |
| 4808 return rv; | |
| 4809 } | |
| 4810 if (sigAlg != sigAndHash->sigAlg) { | |
| 4811 PORT_SetError(SSL_ERROR_INCORRECT_SIGNATURE_ALGORITHM); | |
| 4812 return SECFailure; | |
| 4813 } | |
| 4814 | |
| 4815 for (i = 0; i < ss->ssl3.signatureAlgorithmCount; ++i) { | |
| 4816 const SSLSignatureAndHashAlg *alg = &ss->ssl3.signatureAlgorithms[i]; | |
| 4817 if (sigAndHash->sigAlg == alg->sigAlg && | |
| 4818 sigAndHash->hashAlg == alg->hashAlg) { | |
| 4819 return SECSuccess; | |
| 4820 } | |
| 4821 } | |
| 4822 PORT_SetError(SSL_ERROR_UNSUPPORTED_SIGNATURE_ALGORITHM); | |
| 4823 return SECFailure; | |
| 4824 } | |
| 4825 | |
| 4826 PRBool | |
| 4827 ssl3_IsSupportedSignatureAlgorithm(const SSLSignatureAndHashAlg *alg) | |
| 4828 { | |
| 4829 static const SSLHashType supportedHashes[] = { | |
| 4830 ssl_hash_sha1, | |
| 4831 ssl_hash_sha256, | |
| 4832 ssl_hash_sha384, | |
| 4833 ssl_hash_sha512 | |
| 4834 }; | |
| 4835 | |
| 4836 static const SSLSignType supportedSigAlgs[] = { | |
| 4837 ssl_sign_rsa, | |
| 4838 #ifndef NSS_DISABLE_ECC | |
| 4839 ssl_sign_ecdsa, | |
| 4840 #endif | |
| 4841 ssl_sign_dsa | |
| 4842 }; | |
| 4843 | |
| 4844 unsigned int i; | |
| 4845 PRBool hashOK = PR_FALSE; | |
| 4846 PRBool signOK = PR_FALSE; | |
| 4847 | |
| 4848 for (i = 0; i < PR_ARRAY_SIZE(supportedHashes); ++i) { | |
| 4849 if (alg->hashAlg == supportedHashes[i]) { | |
| 4850 hashOK = PR_TRUE; | |
| 4851 break; | |
| 4852 } | |
| 4853 } | |
| 4854 | |
| 4855 for (i = 0; i < PR_ARRAY_SIZE(supportedSigAlgs); ++i) { | |
| 4856 if (alg->sigAlg == supportedSigAlgs[i]) { | |
| 4857 signOK = PR_TRUE; | |
| 4858 break; | |
| 4859 } | |
| 4860 } | |
| 4861 | |
| 4862 return hashOK && signOK; | |
| 4863 } | |
| 4864 | |
| 4865 /* ssl3_ConsumeSignatureAndHashAlgorithm reads a SignatureAndHashAlgorithm | |
| 4866 * structure from |b| and puts the resulting value into |out|. |b| and |length| | |
| 4867 * are updated accordingly. | |
| 4868 * | |
| 4869 * See https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 */ | |
| 4870 SECStatus | |
| 4871 ssl3_ConsumeSignatureAndHashAlgorithm(sslSocket *ss, | |
| 4872 SSL3Opaque **b, | |
| 4873 PRUint32 *length, | |
| 4874 SSLSignatureAndHashAlg *out) | |
| 4875 { | |
| 4876 PRUint8 bytes[2]; | |
| 4877 SECStatus rv; | |
| 4878 | |
| 4879 rv = ssl3_ConsumeHandshake(ss, bytes, sizeof(bytes), b, length); | |
| 4880 if (rv != SECSuccess) { | |
| 4881 return rv; | |
| 4882 } | |
| 4883 | |
| 4884 out->hashAlg = (SSLHashType)bytes[0]; | |
| 4885 out->sigAlg = (SSLSignType)bytes[1]; | |
| 4886 if (!ssl3_IsSupportedSignatureAlgorithm(out)) { | |
| 4887 PORT_SetError(SSL_ERROR_UNSUPPORTED_SIGNATURE_ALGORITHM); | |
| 4888 return SECFailure; | |
| 4889 } | |
| 4890 return SECSuccess; | |
| 4891 } | |
| 4892 | |
| 4893 /************************************************************************** | |
| 4894 * end of Consume Handshake functions. | |
| 4895 **************************************************************************/ | |
| 4896 | |
| 4897 /* Extract the hashes of handshake messages to this point. | |
| 4898 * Called from ssl3_SendCertificateVerify | |
| 4899 * ssl3_SendFinished | |
| 4900 * ssl3_HandleHandshakeMessage | |
| 4901 * | |
| 4902 * Caller must hold the SSL3HandshakeLock. | |
| 4903 * Caller must hold a read or write lock on the Spec R/W lock. | |
| 4904 * (There is presently no way to assert on a Read lock.) | |
| 4905 */ | |
| 4906 SECStatus | |
| 4907 ssl3_ComputeHandshakeHashes(sslSocket *ss, | |
| 4908 ssl3CipherSpec *spec, /* uses ->master_secret */ | |
| 4909 SSL3Hashes *hashes, /* output goes here. */ | |
| 4910 PRUint32 sender) | |
| 4911 { | |
| 4912 SECStatus rv = SECSuccess; | |
| 4913 PRBool isTLS = (PRBool)(spec->version > SSL_LIBRARY_VERSION_3_0); | |
| 4914 unsigned int outLength; | |
| 4915 SSL3Opaque md5_inner[MAX_MAC_LENGTH]; | |
| 4916 SSL3Opaque sha_inner[MAX_MAC_LENGTH]; | |
| 4917 | |
| 4918 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 4919 if (ss->ssl3.hs.hashType == handshake_hash_unknown) { | |
| 4920 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 4921 return SECFailure; | |
| 4922 } | |
| 4923 | |
| 4924 hashes->hashAlg = ssl_hash_none; | |
| 4925 | |
| 4926 #ifndef NO_PKCS11_BYPASS | |
| 4927 if (ss->opt.bypassPKCS11 && | |
| 4928 ss->ssl3.hs.hashType == handshake_hash_single) { | |
| 4929 /* compute them without PKCS11 */ | |
| 4930 PRUint64 sha_cx[MAX_MAC_CONTEXT_LLONGS]; | |
| 4931 | |
| 4932 ss->ssl3.hs.sha_clone(sha_cx, ss->ssl3.hs.sha_cx); | |
| 4933 ss->ssl3.hs.sha_obj->end(sha_cx, hashes->u.raw, &hashes->len, | |
| 4934 sizeof(hashes->u.raw)); | |
| 4935 | |
| 4936 PRINT_BUF(60, (NULL, "SHA-256: result", hashes->u.raw, hashes->len)); | |
| 4937 | |
| 4938 /* If we ever support ciphersuites where the PRF hash isn't SHA-256 | |
| 4939 * then this will need to be updated. */ | |
| 4940 hashes->hashAlg = ssl_hash_sha256; | |
| 4941 rv = SECSuccess; | |
| 4942 } else if (ss->opt.bypassPKCS11) { | |
| 4943 /* compute them without PKCS11 */ | |
| 4944 PRUint64 md5_cx[MAX_MAC_CONTEXT_LLONGS]; | |
| 4945 PRUint64 sha_cx[MAX_MAC_CONTEXT_LLONGS]; | |
| 4946 | |
| 4947 #define md5cx ((MD5Context *)md5_cx) | |
| 4948 #define shacx ((SHA1Context *)sha_cx) | |
| 4949 | |
| 4950 MD5_Clone(md5cx, (MD5Context *)ss->ssl3.hs.md5_cx); | |
| 4951 SHA1_Clone(shacx, (SHA1Context *)ss->ssl3.hs.sha_cx); | |
| 4952 | |
| 4953 if (!isTLS) { | |
| 4954 /* compute hashes for SSL3. */ | |
| 4955 unsigned char s[4]; | |
| 4956 | |
| 4957 if (!spec->msItem.data) { | |
| 4958 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HANDSHAKE); | |
| 4959 return SECFailure; | |
| 4960 } | |
| 4961 | |
| 4962 s[0] = (unsigned char)(sender >> 24); | |
| 4963 s[1] = (unsigned char)(sender >> 16); | |
| 4964 s[2] = (unsigned char)(sender >> 8); | |
| 4965 s[3] = (unsigned char)sender; | |
| 4966 | |
| 4967 if (sender != 0) { | |
| 4968 MD5_Update(md5cx, s, 4); | |
| 4969 PRINT_BUF(95, (NULL, "MD5 inner: sender", s, 4)); | |
| 4970 } | |
| 4971 | |
| 4972 PRINT_BUF(95, (NULL, "MD5 inner: MAC Pad 1", mac_pad_1, | |
| 4973 mac_defs[mac_md5].pad_size)); | |
| 4974 | |
| 4975 MD5_Update(md5cx, spec->msItem.data, spec->msItem.len); | |
| 4976 MD5_Update(md5cx, mac_pad_1, mac_defs[mac_md5].pad_size); | |
| 4977 MD5_End(md5cx, md5_inner, &outLength, MD5_LENGTH); | |
| 4978 | |
| 4979 PRINT_BUF(95, (NULL, "MD5 inner: result", md5_inner, outLength)); | |
| 4980 | |
| 4981 if (sender != 0) { | |
| 4982 SHA1_Update(shacx, s, 4); | |
| 4983 PRINT_BUF(95, (NULL, "SHA inner: sender", s, 4)); | |
| 4984 } | |
| 4985 | |
| 4986 PRINT_BUF(95, (NULL, "SHA inner: MAC Pad 1", mac_pad_1, | |
| 4987 mac_defs[mac_sha].pad_size)); | |
| 4988 | |
| 4989 SHA1_Update(shacx, spec->msItem.data, spec->msItem.len); | |
| 4990 SHA1_Update(shacx, mac_pad_1, mac_defs[mac_sha].pad_size); | |
| 4991 SHA1_End(shacx, sha_inner, &outLength, SHA1_LENGTH); | |
| 4992 | |
| 4993 PRINT_BUF(95, (NULL, "SHA inner: result", sha_inner, outLength)); | |
| 4994 PRINT_BUF(95, (NULL, "MD5 outer: MAC Pad 2", mac_pad_2, | |
| 4995 mac_defs[mac_md5].pad_size)); | |
| 4996 PRINT_BUF(95, (NULL, "MD5 outer: MD5 inner", md5_inner, MD5_LENGTH))
; | |
| 4997 | |
| 4998 MD5_Begin(md5cx); | |
| 4999 MD5_Update(md5cx, spec->msItem.data, spec->msItem.len); | |
| 5000 MD5_Update(md5cx, mac_pad_2, mac_defs[mac_md5].pad_size); | |
| 5001 MD5_Update(md5cx, md5_inner, MD5_LENGTH); | |
| 5002 } | |
| 5003 MD5_End(md5cx, hashes->u.s.md5, &outLength, MD5_LENGTH); | |
| 5004 | |
| 5005 PRINT_BUF(60, (NULL, "MD5 outer: result", hashes->u.s.md5, MD5_LENGTH)); | |
| 5006 | |
| 5007 if (!isTLS) { | |
| 5008 PRINT_BUF(95, (NULL, "SHA outer: MAC Pad 2", mac_pad_2, | |
| 5009 mac_defs[mac_sha].pad_size)); | |
| 5010 PRINT_BUF(95, (NULL, "SHA outer: SHA inner", sha_inner, SHA1_LENGTH)
); | |
| 5011 | |
| 5012 SHA1_Begin(shacx); | |
| 5013 SHA1_Update(shacx, spec->msItem.data, spec->msItem.len); | |
| 5014 SHA1_Update(shacx, mac_pad_2, mac_defs[mac_sha].pad_size); | |
| 5015 SHA1_Update(shacx, sha_inner, SHA1_LENGTH); | |
| 5016 } | |
| 5017 SHA1_End(shacx, hashes->u.s.sha, &outLength, SHA1_LENGTH); | |
| 5018 | |
| 5019 PRINT_BUF(60, (NULL, "SHA outer: result", hashes->u.s.sha, SHA1_LENGTH))
; | |
| 5020 | |
| 5021 hashes->len = MD5_LENGTH + SHA1_LENGTH; | |
| 5022 rv = SECSuccess; | |
| 5023 #undef md5cx | |
| 5024 #undef shacx | |
| 5025 } else | |
| 5026 #endif | |
| 5027 if (ss->ssl3.hs.hashType == handshake_hash_single) { | |
| 5028 /* compute hashes with PKCS11 */ | |
| 5029 PK11Context *h; | |
| 5030 unsigned int stateLen; | |
| 5031 unsigned char stackBuf[1024]; | |
| 5032 unsigned char *stateBuf = NULL; | |
| 5033 | |
| 5034 h = ss->ssl3.hs.sha; | |
| 5035 stateBuf = PK11_SaveContextAlloc(h, stackBuf, | |
| 5036 sizeof(stackBuf), &stateLen); | |
| 5037 if (stateBuf == NULL) { | |
| 5038 ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); | |
| 5039 goto tls12_loser; | |
| 5040 } | |
| 5041 rv |= PK11_DigestFinal(h, hashes->u.raw, &hashes->len, | |
| 5042 sizeof(hashes->u.raw)); | |
| 5043 if (rv != SECSuccess) { | |
| 5044 ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); | |
| 5045 rv = SECFailure; | |
| 5046 goto tls12_loser; | |
| 5047 } | |
| 5048 /* If we ever support ciphersuites where the PRF hash isn't SHA-256 | |
| 5049 * then this will need to be updated. */ | |
| 5050 hashes->hashAlg = ssl_hash_sha256; | |
| 5051 rv = SECSuccess; | |
| 5052 | |
| 5053 tls12_loser: | |
| 5054 if (stateBuf) { | |
| 5055 if (PK11_RestoreContext(h, stateBuf, stateLen) != SECSuccess) { | |
| 5056 ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE); | |
| 5057 rv = SECFailure; | |
| 5058 } | |
| 5059 if (stateBuf != stackBuf) { | |
| 5060 PORT_ZFree(stateBuf, stateLen); | |
| 5061 } | |
| 5062 } | |
| 5063 } else { | |
| 5064 /* compute hashes with PKCS11 */ | |
| 5065 PK11Context *md5; | |
| 5066 PK11Context *sha = NULL; | |
| 5067 unsigned char *md5StateBuf = NULL; | |
| 5068 unsigned char *shaStateBuf = NULL; | |
| 5069 unsigned int md5StateLen, shaStateLen; | |
| 5070 unsigned char md5StackBuf[256]; | |
| 5071 unsigned char shaStackBuf[512]; | |
| 5072 | |
| 5073 md5StateBuf = PK11_SaveContextAlloc(ss->ssl3.hs.md5, md5StackBuf, | |
| 5074 sizeof md5StackBuf, &md5StateLen); | |
| 5075 if (md5StateBuf == NULL) { | |
| 5076 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); | |
| 5077 goto loser; | |
| 5078 } | |
| 5079 md5 = ss->ssl3.hs.md5; | |
| 5080 | |
| 5081 shaStateBuf = PK11_SaveContextAlloc(ss->ssl3.hs.sha, shaStackBuf, | |
| 5082 sizeof shaStackBuf, &shaStateLen); | |
| 5083 if (shaStateBuf == NULL) { | |
| 5084 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | |
| 5085 goto loser; | |
| 5086 } | |
| 5087 sha = ss->ssl3.hs.sha; | |
| 5088 | |
| 5089 if (!isTLS) { | |
| 5090 /* compute hashes for SSL3. */ | |
| 5091 unsigned char s[4]; | |
| 5092 | |
| 5093 if (!spec->master_secret) { | |
| 5094 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HANDSHAKE); | |
| 5095 rv = SECFailure; | |
| 5096 goto loser; | |
| 5097 } | |
| 5098 | |
| 5099 s[0] = (unsigned char)(sender >> 24); | |
| 5100 s[1] = (unsigned char)(sender >> 16); | |
| 5101 s[2] = (unsigned char)(sender >> 8); | |
| 5102 s[3] = (unsigned char)sender; | |
| 5103 | |
| 5104 if (sender != 0) { | |
| 5105 rv |= PK11_DigestOp(md5, s, 4); | |
| 5106 PRINT_BUF(95, (NULL, "MD5 inner: sender", s, 4)); | |
| 5107 } | |
| 5108 | |
| 5109 PRINT_BUF(95, (NULL, "MD5 inner: MAC Pad 1", mac_pad_1, | |
| 5110 mac_defs[mac_md5].pad_size)); | |
| 5111 | |
| 5112 rv |= PK11_DigestKey(md5, spec->master_secret); | |
| 5113 rv |= PK11_DigestOp(md5, mac_pad_1, mac_defs[mac_md5].pad_size); | |
| 5114 rv |= PK11_DigestFinal(md5, md5_inner, &outLength, MD5_LENGTH); | |
| 5115 PORT_Assert(rv != SECSuccess || outLength == MD5_LENGTH); | |
| 5116 if (rv != SECSuccess) { | |
| 5117 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); | |
| 5118 rv = SECFailure; | |
| 5119 goto loser; | |
| 5120 } | |
| 5121 | |
| 5122 PRINT_BUF(95, (NULL, "MD5 inner: result", md5_inner, outLength)); | |
| 5123 | |
| 5124 if (sender != 0) { | |
| 5125 rv |= PK11_DigestOp(sha, s, 4); | |
| 5126 PRINT_BUF(95, (NULL, "SHA inner: sender", s, 4)); | |
| 5127 } | |
| 5128 | |
| 5129 PRINT_BUF(95, (NULL, "SHA inner: MAC Pad 1", mac_pad_1, | |
| 5130 mac_defs[mac_sha].pad_size)); | |
| 5131 | |
| 5132 rv |= PK11_DigestKey(sha, spec->master_secret); | |
| 5133 rv |= PK11_DigestOp(sha, mac_pad_1, mac_defs[mac_sha].pad_size); | |
| 5134 rv |= PK11_DigestFinal(sha, sha_inner, &outLength, SHA1_LENGTH); | |
| 5135 PORT_Assert(rv != SECSuccess || outLength == SHA1_LENGTH); | |
| 5136 if (rv != SECSuccess) { | |
| 5137 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | |
| 5138 rv = SECFailure; | |
| 5139 goto loser; | |
| 5140 } | |
| 5141 | |
| 5142 PRINT_BUF(95, (NULL, "SHA inner: result", sha_inner, outLength)); | |
| 5143 | |
| 5144 PRINT_BUF(95, (NULL, "MD5 outer: MAC Pad 2", mac_pad_2, | |
| 5145 mac_defs[mac_md5].pad_size)); | |
| 5146 PRINT_BUF(95, (NULL, "MD5 outer: MD5 inner", md5_inner, MD5_LENGTH))
; | |
| 5147 | |
| 5148 rv |= PK11_DigestBegin(md5); | |
| 5149 rv |= PK11_DigestKey(md5, spec->master_secret); | |
| 5150 rv |= PK11_DigestOp(md5, mac_pad_2, mac_defs[mac_md5].pad_size); | |
| 5151 rv |= PK11_DigestOp(md5, md5_inner, MD5_LENGTH); | |
| 5152 } | |
| 5153 rv |= PK11_DigestFinal(md5, hashes->u.s.md5, &outLength, MD5_LENGTH); | |
| 5154 PORT_Assert(rv != SECSuccess || outLength == MD5_LENGTH); | |
| 5155 if (rv != SECSuccess) { | |
| 5156 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); | |
| 5157 rv = SECFailure; | |
| 5158 goto loser; | |
| 5159 } | |
| 5160 | |
| 5161 PRINT_BUF(60, (NULL, "MD5 outer: result", hashes->u.s.md5, MD5_LENGTH)); | |
| 5162 | |
| 5163 if (!isTLS) { | |
| 5164 PRINT_BUF(95, (NULL, "SHA outer: MAC Pad 2", mac_pad_2, | |
| 5165 mac_defs[mac_sha].pad_size)); | |
| 5166 PRINT_BUF(95, (NULL, "SHA outer: SHA inner", sha_inner, SHA1_LENGTH)
); | |
| 5167 | |
| 5168 rv |= PK11_DigestBegin(sha); | |
| 5169 rv |= PK11_DigestKey(sha, spec->master_secret); | |
| 5170 rv |= PK11_DigestOp(sha, mac_pad_2, mac_defs[mac_sha].pad_size); | |
| 5171 rv |= PK11_DigestOp(sha, sha_inner, SHA1_LENGTH); | |
| 5172 } | |
| 5173 rv |= PK11_DigestFinal(sha, hashes->u.s.sha, &outLength, SHA1_LENGTH); | |
| 5174 PORT_Assert(rv != SECSuccess || outLength == SHA1_LENGTH); | |
| 5175 if (rv != SECSuccess) { | |
| 5176 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | |
| 5177 rv = SECFailure; | |
| 5178 goto loser; | |
| 5179 } | |
| 5180 | |
| 5181 PRINT_BUF(60, (NULL, "SHA outer: result", hashes->u.s.sha, SHA1_LENGTH))
; | |
| 5182 | |
| 5183 hashes->len = MD5_LENGTH + SHA1_LENGTH; | |
| 5184 rv = SECSuccess; | |
| 5185 | |
| 5186 loser: | |
| 5187 if (md5StateBuf) { | |
| 5188 if (PK11_RestoreContext(ss->ssl3.hs.md5, md5StateBuf, md5StateLen) !
= | |
| 5189 SECSuccess) { | |
| 5190 ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE); | |
| 5191 rv = SECFailure; | |
| 5192 } | |
| 5193 if (md5StateBuf != md5StackBuf) { | |
| 5194 PORT_ZFree(md5StateBuf, md5StateLen); | |
| 5195 } | |
| 5196 } | |
| 5197 if (shaStateBuf) { | |
| 5198 if (PK11_RestoreContext(ss->ssl3.hs.sha, shaStateBuf, shaStateLen) !
= | |
| 5199 SECSuccess) { | |
| 5200 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | |
| 5201 rv = SECFailure; | |
| 5202 } | |
| 5203 if (shaStateBuf != shaStackBuf) { | |
| 5204 PORT_ZFree(shaStateBuf, shaStateLen); | |
| 5205 } | |
| 5206 } | |
| 5207 } | |
| 5208 return rv; | |
| 5209 } | |
| 5210 | |
| 5211 static SECStatus | |
| 5212 ssl3_ComputeBackupHandshakeHashes(sslSocket *ss, | |
| 5213 SSL3Hashes *hashes) /* output goes here. */ | |
| 5214 { | |
| 5215 SECStatus rv = SECSuccess; | |
| 5216 | |
| 5217 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 5218 PORT_Assert(!ss->sec.isServer); | |
| 5219 PORT_Assert(ss->ssl3.hs.hashType == handshake_hash_single); | |
| 5220 | |
| 5221 rv = PK11_DigestFinal(ss->ssl3.hs.backupHash, hashes->u.raw, &hashes->len, | |
| 5222 sizeof(hashes->u.raw)); | |
| 5223 if (rv != SECSuccess) { | |
| 5224 ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE); | |
| 5225 rv = SECFailure; | |
| 5226 goto loser; | |
| 5227 } | |
| 5228 hashes->hashAlg = ssl_hash_sha1; | |
| 5229 | |
| 5230 loser: | |
| 5231 PK11_DestroyContext(ss->ssl3.hs.backupHash, PR_TRUE); | |
| 5232 ss->ssl3.hs.backupHash = NULL; | |
| 5233 return rv; | |
| 5234 } | |
| 5235 | |
| 5236 /* | |
| 5237 * SSL 2 based implementations pass in the initial outbound buffer | |
| 5238 * so that the handshake hash can contain the included information. | |
| 5239 * | |
| 5240 * Called from ssl2_BeginClientHandshake() in sslcon.c | |
| 5241 */ | |
| 5242 SECStatus | |
| 5243 ssl3_StartHandshakeHash(sslSocket *ss, unsigned char *buf, int length) | |
| 5244 { | |
| 5245 SECStatus rv; | |
| 5246 | |
| 5247 ssl_GetSSL3HandshakeLock(ss); /**************************************/ | |
| 5248 | |
| 5249 rv = ssl3_InitState(ss); | |
| 5250 if (rv != SECSuccess) { | |
| 5251 goto done; /* ssl3_InitState has set the error code. */ | |
| 5252 } | |
| 5253 rv = ssl3_RestartHandshakeHashes(ss); | |
| 5254 if (rv != SECSuccess) { | |
| 5255 goto done; | |
| 5256 } | |
| 5257 | |
| 5258 PORT_Memset(&ss->ssl3.hs.client_random, 0, SSL3_RANDOM_LENGTH); | |
| 5259 PORT_Memcpy( | |
| 5260 &ss->ssl3.hs.client_random.rand[SSL3_RANDOM_LENGTH - SSL_CHALLENGE_BYTES
], | |
| 5261 &ss->sec.ci.clientChallenge, | |
| 5262 SSL_CHALLENGE_BYTES); | |
| 5263 | |
| 5264 rv = ssl3_UpdateHandshakeHashes(ss, buf, length); | |
| 5265 /* if it failed, ssl3_UpdateHandshakeHashes has set the error code. */ | |
| 5266 | |
| 5267 done: | |
| 5268 ssl_ReleaseSSL3HandshakeLock(ss); /**************************************/ | |
| 5269 return rv; | |
| 5270 } | |
| 5271 | |
| 5272 /************************************************************************** | |
| 5273 * end of Handshake Hash functions. | |
| 5274 * Begin Send and Handle functions for handshakes. | |
| 5275 **************************************************************************/ | |
| 5276 | |
| 5277 /* Called from ssl3_HandleHelloRequest(), | |
| 5278 * ssl3_RedoHandshake() | |
| 5279 * ssl2_BeginClientHandshake (when resuming ssl3 session) | |
| 5280 * dtls_HandleHelloVerifyRequest(with resending=PR_TRUE) | |
| 5281 */ | |
| 5282 SECStatus | |
| 5283 ssl3_SendClientHello(sslSocket *ss, PRBool resending) | |
| 5284 { | |
| 5285 sslSessionID *sid; | |
| 5286 ssl3CipherSpec *cwSpec; | |
| 5287 SECStatus rv; | |
| 5288 int i; | |
| 5289 int length; | |
| 5290 int num_suites; | |
| 5291 int actual_count = 0; | |
| 5292 PRBool isTLS = PR_FALSE; | |
| 5293 PRBool requestingResume = PR_FALSE, fallbackSCSV = PR_FALSE; | |
| 5294 PRInt32 total_exten_len = 0; | |
| 5295 unsigned paddingExtensionLen; | |
| 5296 unsigned numCompressionMethods; | |
| 5297 PRInt32 flags; | |
| 5298 | |
| 5299 SSL_TRC(3, ("%d: SSL3[%d]: send client_hello handshake", SSL_GETPID(), | |
| 5300 ss->fd)); | |
| 5301 | |
| 5302 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 5303 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | |
| 5304 | |
| 5305 rv = ssl3_InitState(ss); | |
| 5306 if (rv != SECSuccess) { | |
| 5307 return rv; /* ssl3_InitState has set the error code. */ | |
| 5308 } | |
| 5309 /* These must be reset every handshake. */ | |
| 5310 ss->ssl3.hs.sendingSCSV = PR_FALSE; | |
| 5311 ss->ssl3.hs.preliminaryInfo = 0; | |
| 5312 PORT_Assert(IS_DTLS(ss) || !resending); | |
| 5313 | |
| 5314 SECITEM_FreeItem(&ss->ssl3.hs.newSessionTicket.ticket, PR_FALSE); | |
| 5315 ss->ssl3.hs.receivedNewSessionTicket = PR_FALSE; | |
| 5316 | |
| 5317 /* We might be starting a session renegotiation in which case we should | |
| 5318 * clear previous state. | |
| 5319 */ | |
| 5320 PORT_Memset(&ss->xtnData, 0, sizeof(TLSExtensionData)); | |
| 5321 | |
| 5322 rv = ssl3_RestartHandshakeHashes(ss); | |
| 5323 if (rv != SECSuccess) { | |
| 5324 return rv; | |
| 5325 } | |
| 5326 | |
| 5327 /* | |
| 5328 * During a renegotiation, ss->clientHelloVersion will be used again to | |
| 5329 * work around a Windows SChannel bug. Ensure that it is still enabled. | |
| 5330 */ | |
| 5331 if (ss->firstHsDone) { | |
| 5332 if (SSL3_ALL_VERSIONS_DISABLED(&ss->vrange)) { | |
| 5333 PORT_SetError(SSL_ERROR_SSL_DISABLED); | |
| 5334 return SECFailure; | |
| 5335 } | |
| 5336 | |
| 5337 if (ss->clientHelloVersion < ss->vrange.min || | |
| 5338 ss->clientHelloVersion > ss->vrange.max) { | |
| 5339 PORT_SetError(SSL_ERROR_NO_CYPHER_OVERLAP); | |
| 5340 return SECFailure; | |
| 5341 } | |
| 5342 } | |
| 5343 | |
| 5344 /* We ignore ss->sec.ci.sid here, and use ssl_Lookup because Lookup | |
| 5345 * handles expired entries and other details. | |
| 5346 * XXX If we've been called from ssl2_BeginClientHandshake, then | |
| 5347 * this lookup is duplicative and wasteful. | |
| 5348 */ | |
| 5349 sid = (ss->opt.noCache) ? NULL | |
| 5350 : ssl_LookupSID(&ss->sec.ci.peer, ss->sec.ci.port, s
s->peerID, ss->url); | |
| 5351 | |
| 5352 /* We can't resume based on a different token. If the sid exists, | |
| 5353 * make sure the token that holds the master secret still exists ... | |
| 5354 * If we previously did client-auth, make sure that the token that holds | |
| 5355 * the private key still exists, is logged in, hasn't been removed, etc. | |
| 5356 */ | |
| 5357 if (sid) { | |
| 5358 PRBool sidOK = PR_TRUE; | |
| 5359 if (sid->u.ssl3.keys.msIsWrapped) { | |
| 5360 /* Session key was wrapped, which means it was using PKCS11, */ | |
| 5361 PK11SlotInfo *slot = NULL; | |
| 5362 if (sid->u.ssl3.masterValid && !ss->opt.bypassPKCS11) { | |
| 5363 slot = SECMOD_LookupSlot(sid->u.ssl3.masterModuleID, | |
| 5364 sid->u.ssl3.masterSlotID); | |
| 5365 } | |
| 5366 if (slot == NULL) { | |
| 5367 sidOK = PR_FALSE; | |
| 5368 } else { | |
| 5369 PK11SymKey *wrapKey = NULL; | |
| 5370 if (!PK11_IsPresent(slot) || | |
| 5371 ((wrapKey = PK11_GetWrapKey(slot, | |
| 5372 sid->u.ssl3.masterWrapIndex, | |
| 5373 sid->u.ssl3.masterWrapMech, | |
| 5374 sid->u.ssl3.masterWrapSeries, | |
| 5375 ss->pkcs11PinArg)) == NULL)) { | |
| 5376 sidOK = PR_FALSE; | |
| 5377 } | |
| 5378 if (wrapKey) | |
| 5379 PK11_FreeSymKey(wrapKey); | |
| 5380 PK11_FreeSlot(slot); | |
| 5381 slot = NULL; | |
| 5382 } | |
| 5383 } | |
| 5384 /* If we previously did client-auth, make sure that the token that | |
| 5385 ** holds the private key still exists, is logged in, hasn't been | |
| 5386 ** removed, etc. | |
| 5387 */ | |
| 5388 if (sidOK && !ssl3_ClientAuthTokenPresent(sid)) { | |
| 5389 sidOK = PR_FALSE; | |
| 5390 } | |
| 5391 | |
| 5392 if (sidOK) { | |
| 5393 /* Set ss->version based on the session cache */ | |
| 5394 if (ss->firstHsDone) { | |
| 5395 /* | |
| 5396 * Windows SChannel compares the client_version inside the RSA | |
| 5397 * EncryptedPreMasterSecret of a renegotiation with the | |
| 5398 * client_version of the initial ClientHello rather than the | |
| 5399 * ClientHello in the renegotiation. To work around this bug, we | |
| 5400 * continue to use the client_version used in the initial | |
| 5401 * ClientHello when renegotiating. | |
| 5402 * | |
| 5403 * The client_version of the initial ClientHello is still | |
| 5404 * available in ss->clientHelloVersion. Ensure that | |
| 5405 * sid->version is bounded within | |
| 5406 * [ss->vrange.min, ss->clientHelloVersion], otherwise we | |
| 5407 * can't use sid. | |
| 5408 */ | |
| 5409 if (sid->version >= ss->vrange.min && | |
| 5410 sid->version <= ss->clientHelloVersion) { | |
| 5411 ss->version = ss->clientHelloVersion; | |
| 5412 } else { | |
| 5413 sidOK = PR_FALSE; | |
| 5414 } | |
| 5415 } else { | |
| 5416 /* | |
| 5417 * Check sid->version is OK first. | |
| 5418 * Previously, we would cap the version based on sid->version, | |
| 5419 * but that prevents negotiation of a higher version if the | |
| 5420 * previous session was reduced (e.g., with version fallback) | |
| 5421 */ | |
| 5422 if (sid->version < ss->vrange.min || | |
| 5423 sid->version > ss->vrange.max) { | |
| 5424 sidOK = PR_FALSE; | |
| 5425 } else { | |
| 5426 rv = ssl3_NegotiateVersion(ss, SSL_LIBRARY_VERSION_MAX_SUPPO
RTED, | |
| 5427 PR_TRUE); | |
| 5428 if (rv != SECSuccess) { | |
| 5429 return rv; /* error code was set */ | |
| 5430 } | |
| 5431 } | |
| 5432 } | |
| 5433 } | |
| 5434 | |
| 5435 if (!sidOK) { | |
| 5436 SSL_AtomicIncrementLong(&ssl3stats.sch_sid_cache_not_ok); | |
| 5437 if (ss->sec.uncache) | |
| 5438 (*ss->sec.uncache)(sid); | |
| 5439 ssl_FreeSID(sid); | |
| 5440 sid = NULL; | |
| 5441 } | |
| 5442 } | |
| 5443 | |
| 5444 if (sid) { | |
| 5445 requestingResume = PR_TRUE; | |
| 5446 SSL_AtomicIncrementLong(&ssl3stats.sch_sid_cache_hits); | |
| 5447 | |
| 5448 PRINT_BUF(4, (ss, "client, found session-id:", sid->u.ssl3.sessionID, | |
| 5449 sid->u.ssl3.sessionIDLength)); | |
| 5450 | |
| 5451 ss->ssl3.policy = sid->u.ssl3.policy; | |
| 5452 } else { | |
| 5453 SSL_AtomicIncrementLong(&ssl3stats.sch_sid_cache_misses); | |
| 5454 | |
| 5455 /* | |
| 5456 * Windows SChannel compares the client_version inside the RSA | |
| 5457 * EncryptedPreMasterSecret of a renegotiation with the | |
| 5458 * client_version of the initial ClientHello rather than the | |
| 5459 * ClientHello in the renegotiation. To work around this bug, we | |
| 5460 * continue to use the client_version used in the initial | |
| 5461 * ClientHello when renegotiating. | |
| 5462 */ | |
| 5463 if (ss->firstHsDone) { | |
| 5464 ss->version = ss->clientHelloVersion; | |
| 5465 } else { | |
| 5466 rv = ssl3_NegotiateVersion(ss, SSL_LIBRARY_VERSION_MAX_SUPPORTED, | |
| 5467 PR_TRUE); | |
| 5468 if (rv != SECSuccess) | |
| 5469 return rv; /* error code was set */ | |
| 5470 } | |
| 5471 | |
| 5472 sid = ssl3_NewSessionID(ss, PR_FALSE); | |
| 5473 if (!sid) { | |
| 5474 return SECFailure; /* memory error is set */ | |
| 5475 } | |
| 5476 } | |
| 5477 | |
| 5478 if (ss->version >= SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 5479 rv = tls13_SetupClientHello(ss); | |
| 5480 if (rv != SECSuccess) { | |
| 5481 if (sid) { | |
| 5482 ssl_FreeSID(sid); | |
| 5483 } | |
| 5484 return rv; | |
| 5485 } | |
| 5486 } | |
| 5487 | |
| 5488 isTLS = (ss->version > SSL_LIBRARY_VERSION_3_0); | |
| 5489 ssl_GetSpecWriteLock(ss); | |
| 5490 cwSpec = ss->ssl3.cwSpec; | |
| 5491 if (cwSpec->mac_def->mac == mac_null) { | |
| 5492 /* SSL records are not being MACed. */ | |
| 5493 cwSpec->version = ss->version; | |
| 5494 } | |
| 5495 ssl_ReleaseSpecWriteLock(ss); | |
| 5496 | |
| 5497 if (ss->sec.ci.sid != NULL) { | |
| 5498 ssl_FreeSID(ss->sec.ci.sid); /* decrement ref count, free if zero */ | |
| 5499 } | |
| 5500 ss->sec.ci.sid = sid; | |
| 5501 | |
| 5502 ss->sec.send = ssl3_SendApplicationData; | |
| 5503 | |
| 5504 /* shouldn't get here if SSL3 is disabled, but ... */ | |
| 5505 if (SSL3_ALL_VERSIONS_DISABLED(&ss->vrange)) { | |
| 5506 PR_NOT_REACHED("No versions of SSL 3.0 or later are enabled"); | |
| 5507 PORT_SetError(SSL_ERROR_SSL_DISABLED); | |
| 5508 return SECFailure; | |
| 5509 } | |
| 5510 | |
| 5511 /* how many suites does our PKCS11 support (regardless of policy)? */ | |
| 5512 num_suites = ssl3_config_match_init(ss); | |
| 5513 if (!num_suites) | |
| 5514 return SECFailure; /* ssl3_config_match_init has set error code. */ | |
| 5515 | |
| 5516 /* HACK for SCSV in SSL 3.0. On initial handshake, prepend SCSV, | |
| 5517 * only if TLS is disabled. | |
| 5518 */ | |
| 5519 if (!ss->firstHsDone && !isTLS) { | |
| 5520 /* Must set this before calling Hello Extension Senders, | |
| 5521 * to suppress sending of empty RI extension. | |
| 5522 */ | |
| 5523 ss->ssl3.hs.sendingSCSV = PR_TRUE; | |
| 5524 } | |
| 5525 | |
| 5526 /* When we attempt session resumption (only), we must lock the sid to | |
| 5527 * prevent races with other resumption connections that receive a | |
| 5528 * NewSessionTicket that will cause the ticket in the sid to be replaced. | |
| 5529 * Once we've copied the session ticket into our ClientHello message, it | |
| 5530 * is OK for the ticket to change, so we just need to make sure we hold | |
| 5531 * the lock across the calls to ssl3_CallHelloExtensionSenders. | |
| 5532 */ | |
| 5533 if (sid->u.ssl3.lock) { | |
| 5534 PR_RWLock_Rlock(sid->u.ssl3.lock); | |
| 5535 } | |
| 5536 | |
| 5537 if (isTLS || (ss->firstHsDone && ss->peerRequestedProtection)) { | |
| 5538 PRUint32 maxBytes = 65535; /* 2^16 - 1 */ | |
| 5539 PRInt32 extLen; | |
| 5540 | |
| 5541 extLen = ssl3_CallHelloExtensionSenders(ss, PR_FALSE, maxBytes, NULL); | |
| 5542 if (extLen < 0) { | |
| 5543 if (sid->u.ssl3.lock) { | |
| 5544 PR_RWLock_Unlock(sid->u.ssl3.lock); | |
| 5545 } | |
| 5546 return SECFailure; | |
| 5547 } | |
| 5548 total_exten_len += extLen; | |
| 5549 | |
| 5550 if (total_exten_len > 0) | |
| 5551 total_exten_len += 2; | |
| 5552 } | |
| 5553 | |
| 5554 #ifndef NSS_DISABLE_ECC | |
| 5555 if (!total_exten_len || !isTLS) { | |
| 5556 /* not sending the elliptic_curves and ec_point_formats extensions */ | |
| 5557 ssl3_DisableECCSuites(ss, NULL); /* disable all ECC suites */ | |
| 5558 } | |
| 5559 #endif /* NSS_DISABLE_ECC */ | |
| 5560 | |
| 5561 if (IS_DTLS(ss)) { | |
| 5562 ssl3_DisableNonDTLSSuites(ss); | |
| 5563 } | |
| 5564 | |
| 5565 /* how many suites are permitted by policy and user preference? */ | |
| 5566 num_suites = count_cipher_suites(ss, ss->ssl3.policy, PR_TRUE); | |
| 5567 if (!num_suites) { | |
| 5568 if (sid->u.ssl3.lock) { | |
| 5569 PR_RWLock_Unlock(sid->u.ssl3.lock); | |
| 5570 } | |
| 5571 return SECFailure; /* count_cipher_suites has set error code. */ | |
| 5572 } | |
| 5573 | |
| 5574 fallbackSCSV = ss->opt.enableFallbackSCSV && (!requestingResume || | |
| 5575 ss->version < sid->version); | |
| 5576 /* make room for SCSV */ | |
| 5577 if (ss->ssl3.hs.sendingSCSV) { | |
| 5578 ++num_suites; | |
| 5579 } | |
| 5580 if (fallbackSCSV) { | |
| 5581 ++num_suites; | |
| 5582 } | |
| 5583 | |
| 5584 /* count compression methods */ | |
| 5585 numCompressionMethods = 0; | |
| 5586 for (i = 0; i < compressionMethodsCount; i++) { | |
| 5587 if (compressionEnabled(ss, compressions[i])) | |
| 5588 numCompressionMethods++; | |
| 5589 } | |
| 5590 | |
| 5591 length = sizeof(SSL3ProtocolVersion) + SSL3_RANDOM_LENGTH + | |
| 5592 1 + ((sid == NULL) ? 0 : sid->u.ssl3.sessionIDLength) + | |
| 5593 2 + num_suites * sizeof(ssl3CipherSuite) + | |
| 5594 1 + numCompressionMethods + total_exten_len; | |
| 5595 if (IS_DTLS(ss)) { | |
| 5596 length += 1 + ss->ssl3.hs.cookieLen; | |
| 5597 } | |
| 5598 | |
| 5599 /* A padding extension may be included to ensure that the record containing | |
| 5600 * the ClientHello doesn't have a length between 256 and 511 bytes | |
| 5601 * (inclusive). Initial, ClientHello records with such lengths trigger bugs | |
| 5602 * in F5 devices. | |
| 5603 * | |
| 5604 * This is not done for DTLS nor for renegotiation. */ | |
| 5605 if (!IS_DTLS(ss) && isTLS && !ss->firstHsDone) { | |
| 5606 paddingExtensionLen = ssl3_CalculatePaddingExtensionLength(length); | |
| 5607 total_exten_len += paddingExtensionLen; | |
| 5608 length += paddingExtensionLen; | |
| 5609 } else { | |
| 5610 paddingExtensionLen = 0; | |
| 5611 } | |
| 5612 | |
| 5613 rv = ssl3_AppendHandshakeHeader(ss, client_hello, length); | |
| 5614 if (rv != SECSuccess) { | |
| 5615 if (sid->u.ssl3.lock) { | |
| 5616 PR_RWLock_Unlock(sid->u.ssl3.lock); | |
| 5617 } | |
| 5618 return rv; /* err set by ssl3_AppendHandshake* */ | |
| 5619 } | |
| 5620 | |
| 5621 if (ss->firstHsDone) { | |
| 5622 /* The client hello version must stay unchanged to work around | |
| 5623 * the Windows SChannel bug described above. */ | |
| 5624 PORT_Assert(ss->version == ss->clientHelloVersion); | |
| 5625 } | |
| 5626 ss->clientHelloVersion = ss->version; | |
| 5627 if (IS_DTLS(ss)) { | |
| 5628 PRUint16 version; | |
| 5629 | |
| 5630 version = dtls_TLSVersionToDTLSVersion(ss->clientHelloVersion); | |
| 5631 rv = ssl3_AppendHandshakeNumber(ss, version, 2); | |
| 5632 } else { | |
| 5633 rv = ssl3_AppendHandshakeNumber(ss, ss->clientHelloVersion, 2); | |
| 5634 } | |
| 5635 if (rv != SECSuccess) { | |
| 5636 if (sid->u.ssl3.lock) { | |
| 5637 PR_RWLock_Unlock(sid->u.ssl3.lock); | |
| 5638 } | |
| 5639 return rv; /* err set by ssl3_AppendHandshake* */ | |
| 5640 } | |
| 5641 | |
| 5642 if (!resending) { /* Don't re-generate if we are in DTLS re-sending mode */ | |
| 5643 rv = ssl3_GetNewRandom(&ss->ssl3.hs.client_random); | |
| 5644 if (rv != SECSuccess) { | |
| 5645 if (sid->u.ssl3.lock) { | |
| 5646 PR_RWLock_Unlock(sid->u.ssl3.lock); | |
| 5647 } | |
| 5648 return rv; /* err set by GetNewRandom. */ | |
| 5649 } | |
| 5650 } | |
| 5651 rv = ssl3_AppendHandshake(ss, &ss->ssl3.hs.client_random, | |
| 5652 SSL3_RANDOM_LENGTH); | |
| 5653 if (rv != SECSuccess) { | |
| 5654 if (sid->u.ssl3.lock) { | |
| 5655 PR_RWLock_Unlock(sid->u.ssl3.lock); | |
| 5656 } | |
| 5657 return rv; /* err set by ssl3_AppendHandshake* */ | |
| 5658 } | |
| 5659 | |
| 5660 if (sid) | |
| 5661 rv = ssl3_AppendHandshakeVariable( | |
| 5662 ss, sid->u.ssl3.sessionID, sid->u.ssl3.sessionIDLength, 1); | |
| 5663 else | |
| 5664 rv = ssl3_AppendHandshakeNumber(ss, 0, 1); | |
| 5665 if (rv != SECSuccess) { | |
| 5666 if (sid->u.ssl3.lock) { | |
| 5667 PR_RWLock_Unlock(sid->u.ssl3.lock); | |
| 5668 } | |
| 5669 return rv; /* err set by ssl3_AppendHandshake* */ | |
| 5670 } | |
| 5671 | |
| 5672 if (IS_DTLS(ss)) { | |
| 5673 rv = ssl3_AppendHandshakeVariable( | |
| 5674 ss, ss->ssl3.hs.cookie, ss->ssl3.hs.cookieLen, 1); | |
| 5675 if (rv != SECSuccess) { | |
| 5676 if (sid->u.ssl3.lock) { | |
| 5677 PR_RWLock_Unlock(sid->u.ssl3.lock); | |
| 5678 } | |
| 5679 return rv; /* err set by ssl3_AppendHandshake* */ | |
| 5680 } | |
| 5681 } | |
| 5682 | |
| 5683 rv = ssl3_AppendHandshakeNumber(ss, num_suites * sizeof(ssl3CipherSuite), 2)
; | |
| 5684 if (rv != SECSuccess) { | |
| 5685 if (sid->u.ssl3.lock) { | |
| 5686 PR_RWLock_Unlock(sid->u.ssl3.lock); | |
| 5687 } | |
| 5688 return rv; /* err set by ssl3_AppendHandshake* */ | |
| 5689 } | |
| 5690 | |
| 5691 if (ss->ssl3.hs.sendingSCSV) { | |
| 5692 /* Add the actual SCSV */ | |
| 5693 rv = ssl3_AppendHandshakeNumber(ss, TLS_EMPTY_RENEGOTIATION_INFO_SCSV, | |
| 5694 sizeof(ssl3CipherSuite)); | |
| 5695 if (rv != SECSuccess) { | |
| 5696 if (sid->u.ssl3.lock) { | |
| 5697 PR_RWLock_Unlock(sid->u.ssl3.lock); | |
| 5698 } | |
| 5699 return rv; /* err set by ssl3_AppendHandshake* */ | |
| 5700 } | |
| 5701 actual_count++; | |
| 5702 } | |
| 5703 if (fallbackSCSV) { | |
| 5704 rv = ssl3_AppendHandshakeNumber(ss, TLS_FALLBACK_SCSV, | |
| 5705 sizeof(ssl3CipherSuite)); | |
| 5706 if (rv != SECSuccess) { | |
| 5707 if (sid->u.ssl3.lock) { | |
| 5708 PR_RWLock_Unlock(sid->u.ssl3.lock); | |
| 5709 } | |
| 5710 return rv; /* err set by ssl3_AppendHandshake* */ | |
| 5711 } | |
| 5712 actual_count++; | |
| 5713 } | |
| 5714 for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) { | |
| 5715 ssl3CipherSuiteCfg *suite = &ss->cipherSuites[i]; | |
| 5716 if (config_match(suite, ss->ssl3.policy, PR_TRUE, &ss->vrange, ss)) { | |
| 5717 actual_count++; | |
| 5718 if (actual_count > num_suites) { | |
| 5719 if (sid->u.ssl3.lock) { | |
| 5720 PR_RWLock_Unlock(sid->u.ssl3.lock); | |
| 5721 } | |
| 5722 /* set error card removal/insertion error */ | |
| 5723 PORT_SetError(SSL_ERROR_TOKEN_INSERTION_REMOVAL); | |
| 5724 return SECFailure; | |
| 5725 } | |
| 5726 rv = ssl3_AppendHandshakeNumber(ss, suite->cipher_suite, | |
| 5727 sizeof(ssl3CipherSuite)); | |
| 5728 if (rv != SECSuccess) { | |
| 5729 if (sid->u.ssl3.lock) { | |
| 5730 PR_RWLock_Unlock(sid->u.ssl3.lock); | |
| 5731 } | |
| 5732 return rv; /* err set by ssl3_AppendHandshake* */ | |
| 5733 } | |
| 5734 } | |
| 5735 } | |
| 5736 | |
| 5737 /* if cards were removed or inserted between count_cipher_suites and | |
| 5738 * generating our list, detect the error here rather than send it off to | |
| 5739 * the server.. */ | |
| 5740 if (actual_count != num_suites) { | |
| 5741 /* Card removal/insertion error */ | |
| 5742 if (sid->u.ssl3.lock) { | |
| 5743 PR_RWLock_Unlock(sid->u.ssl3.lock); | |
| 5744 } | |
| 5745 PORT_SetError(SSL_ERROR_TOKEN_INSERTION_REMOVAL); | |
| 5746 return SECFailure; | |
| 5747 } | |
| 5748 | |
| 5749 rv = ssl3_AppendHandshakeNumber(ss, numCompressionMethods, 1); | |
| 5750 if (rv != SECSuccess) { | |
| 5751 if (sid->u.ssl3.lock) { | |
| 5752 PR_RWLock_Unlock(sid->u.ssl3.lock); | |
| 5753 } | |
| 5754 return rv; /* err set by ssl3_AppendHandshake* */ | |
| 5755 } | |
| 5756 for (i = 0; i < compressionMethodsCount; i++) { | |
| 5757 if (!compressionEnabled(ss, compressions[i])) | |
| 5758 continue; | |
| 5759 rv = ssl3_AppendHandshakeNumber(ss, compressions[i], 1); | |
| 5760 if (rv != SECSuccess) { | |
| 5761 if (sid->u.ssl3.lock) { | |
| 5762 PR_RWLock_Unlock(sid->u.ssl3.lock); | |
| 5763 } | |
| 5764 return rv; /* err set by ssl3_AppendHandshake* */ | |
| 5765 } | |
| 5766 } | |
| 5767 | |
| 5768 if (total_exten_len) { | |
| 5769 PRUint32 maxBytes = total_exten_len - 2; | |
| 5770 PRInt32 extLen; | |
| 5771 | |
| 5772 rv = ssl3_AppendHandshakeNumber(ss, maxBytes, 2); | |
| 5773 if (rv != SECSuccess) { | |
| 5774 if (sid->u.ssl3.lock) { | |
| 5775 PR_RWLock_Unlock(sid->u.ssl3.lock); | |
| 5776 } | |
| 5777 return rv; /* err set by AppendHandshake. */ | |
| 5778 } | |
| 5779 | |
| 5780 extLen = ssl3_CallHelloExtensionSenders(ss, PR_TRUE, maxBytes, NULL); | |
| 5781 if (extLen < 0) { | |
| 5782 if (sid->u.ssl3.lock) { | |
| 5783 PR_RWLock_Unlock(sid->u.ssl3.lock); | |
| 5784 } | |
| 5785 return SECFailure; | |
| 5786 } | |
| 5787 maxBytes -= extLen; | |
| 5788 | |
| 5789 extLen = ssl3_AppendPaddingExtension(ss, paddingExtensionLen, maxBytes); | |
| 5790 if (extLen < 0) { | |
| 5791 if (sid->u.ssl3.lock) { | |
| 5792 PR_RWLock_Unlock(sid->u.ssl3.lock); | |
| 5793 } | |
| 5794 return SECFailure; | |
| 5795 } | |
| 5796 maxBytes -= extLen; | |
| 5797 | |
| 5798 PORT_Assert(!maxBytes); | |
| 5799 } | |
| 5800 | |
| 5801 if (sid->u.ssl3.lock) { | |
| 5802 PR_RWLock_Unlock(sid->u.ssl3.lock); | |
| 5803 } | |
| 5804 | |
| 5805 if (ss->xtnData.sentSessionTicketInClientHello) { | |
| 5806 SSL_AtomicIncrementLong(&ssl3stats.sch_sid_stateless_resumes); | |
| 5807 } | |
| 5808 | |
| 5809 if (ss->ssl3.hs.sendingSCSV) { | |
| 5810 /* Since we sent the SCSV, pretend we sent empty RI extension. */ | |
| 5811 TLSExtensionData *xtnData = &ss->xtnData; | |
| 5812 xtnData->advertised[xtnData->numAdvertised++] = | |
| 5813 ssl_renegotiation_info_xtn; | |
| 5814 } | |
| 5815 | |
| 5816 flags = 0; | |
| 5817 if (!ss->firstHsDone && !IS_DTLS(ss)) { | |
| 5818 flags |= ssl_SEND_FLAG_CAP_RECORD_VERSION; | |
| 5819 } | |
| 5820 rv = ssl3_FlushHandshake(ss, flags); | |
| 5821 if (rv != SECSuccess) { | |
| 5822 return rv; /* error code set by ssl3_FlushHandshake */ | |
| 5823 } | |
| 5824 | |
| 5825 ss->ssl3.hs.ws = wait_server_hello; | |
| 5826 return rv; | |
| 5827 } | |
| 5828 | |
| 5829 /* Called from ssl3_HandlePostHelloHandshakeMessage() when it has deciphered a | |
| 5830 * complete ssl3 Hello Request. | |
| 5831 * Caller must hold Handshake and RecvBuf locks. | |
| 5832 */ | |
| 5833 static SECStatus | |
| 5834 ssl3_HandleHelloRequest(sslSocket *ss) | |
| 5835 { | |
| 5836 sslSessionID *sid = ss->sec.ci.sid; | |
| 5837 SECStatus rv; | |
| 5838 | |
| 5839 SSL_TRC(3, ("%d: SSL3[%d]: handle hello_request handshake", | |
| 5840 SSL_GETPID(), ss->fd)); | |
| 5841 | |
| 5842 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 5843 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 5844 PORT_Assert(ss->version < SSL_LIBRARY_VERSION_TLS_1_3); | |
| 5845 | |
| 5846 if (ss->ssl3.hs.ws == wait_server_hello) | |
| 5847 return SECSuccess; | |
| 5848 if (ss->ssl3.hs.ws != idle_handshake || ss->sec.isServer) { | |
| 5849 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); | |
| 5850 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HELLO_REQUEST); | |
| 5851 return SECFailure; | |
| 5852 } | |
| 5853 if (ss->opt.enableRenegotiation == SSL_RENEGOTIATE_NEVER) { | |
| 5854 (void)SSL3_SendAlert(ss, alert_warning, no_renegotiation); | |
| 5855 PORT_SetError(SSL_ERROR_RENEGOTIATION_NOT_ALLOWED); | |
| 5856 return SECFailure; | |
| 5857 } | |
| 5858 | |
| 5859 if (sid) { | |
| 5860 if (ss->sec.uncache) | |
| 5861 ss->sec.uncache(sid); | |
| 5862 ssl_FreeSID(sid); | |
| 5863 ss->sec.ci.sid = NULL; | |
| 5864 } | |
| 5865 | |
| 5866 if (IS_DTLS(ss)) { | |
| 5867 dtls_RehandshakeCleanup(ss); | |
| 5868 } | |
| 5869 | |
| 5870 ssl_GetXmitBufLock(ss); | |
| 5871 rv = ssl3_SendClientHello(ss, PR_FALSE); | |
| 5872 ssl_ReleaseXmitBufLock(ss); | |
| 5873 | |
| 5874 return rv; | |
| 5875 } | |
| 5876 | |
| 5877 #define UNKNOWN_WRAP_MECHANISM 0x7fffffff | |
| 5878 | |
| 5879 static const CK_MECHANISM_TYPE wrapMechanismList[SSL_NUM_WRAP_MECHS] = { | |
| 5880 CKM_DES3_ECB, | |
| 5881 CKM_CAST5_ECB, | |
| 5882 CKM_DES_ECB, | |
| 5883 CKM_KEY_WRAP_LYNKS, | |
| 5884 CKM_IDEA_ECB, | |
| 5885 CKM_CAST3_ECB, | |
| 5886 CKM_CAST_ECB, | |
| 5887 CKM_RC5_ECB, | |
| 5888 CKM_RC2_ECB, | |
| 5889 CKM_CDMF_ECB, | |
| 5890 CKM_SKIPJACK_WRAP, | |
| 5891 CKM_SKIPJACK_CBC64, | |
| 5892 CKM_AES_ECB, | |
| 5893 CKM_CAMELLIA_ECB, | |
| 5894 CKM_SEED_ECB, | |
| 5895 UNKNOWN_WRAP_MECHANISM | |
| 5896 }; | |
| 5897 | |
| 5898 static int | |
| 5899 ssl_FindIndexByWrapMechanism(CK_MECHANISM_TYPE mech) | |
| 5900 { | |
| 5901 const CK_MECHANISM_TYPE *pMech = wrapMechanismList; | |
| 5902 | |
| 5903 while (mech != *pMech && *pMech != UNKNOWN_WRAP_MECHANISM) { | |
| 5904 ++pMech; | |
| 5905 } | |
| 5906 return (*pMech == UNKNOWN_WRAP_MECHANISM) ? -1 | |
| 5907 : (pMech - wrapMechanismList); | |
| 5908 } | |
| 5909 | |
| 5910 static PK11SymKey * | |
| 5911 ssl_UnwrapSymWrappingKey( | |
| 5912 SSLWrappedSymWrappingKey *pWswk, | |
| 5913 SECKEYPrivateKey *svrPrivKey, | |
| 5914 SSL3KEAType exchKeyType, | |
| 5915 CK_MECHANISM_TYPE masterWrapMech, | |
| 5916 void *pwArg) | |
| 5917 { | |
| 5918 PK11SymKey *unwrappedWrappingKey = NULL; | |
| 5919 SECItem wrappedKey; | |
| 5920 #ifndef NSS_DISABLE_ECC | |
| 5921 PK11SymKey *Ks; | |
| 5922 SECKEYPublicKey pubWrapKey; | |
| 5923 ECCWrappedKeyInfo *ecWrapped; | |
| 5924 #endif /* NSS_DISABLE_ECC */ | |
| 5925 | |
| 5926 /* found the wrapping key on disk. */ | |
| 5927 PORT_Assert(pWswk->symWrapMechanism == masterWrapMech); | |
| 5928 PORT_Assert(pWswk->exchKeyType == exchKeyType); | |
| 5929 if (pWswk->symWrapMechanism != masterWrapMech || | |
| 5930 pWswk->exchKeyType != exchKeyType) { | |
| 5931 goto loser; | |
| 5932 } | |
| 5933 wrappedKey.type = siBuffer; | |
| 5934 wrappedKey.data = pWswk->wrappedSymmetricWrappingkey; | |
| 5935 wrappedKey.len = pWswk->wrappedSymKeyLen; | |
| 5936 PORT_Assert(wrappedKey.len <= sizeof pWswk->wrappedSymmetricWrappingkey); | |
| 5937 | |
| 5938 switch (exchKeyType) { | |
| 5939 | |
| 5940 case kt_rsa: | |
| 5941 unwrappedWrappingKey = | |
| 5942 PK11_PubUnwrapSymKey(svrPrivKey, &wrappedKey, | |
| 5943 masterWrapMech, CKA_UNWRAP, 0); | |
| 5944 break; | |
| 5945 | |
| 5946 #ifndef NSS_DISABLE_ECC | |
| 5947 case kt_ecdh: | |
| 5948 /* | |
| 5949 * For kt_ecdh, we first create an EC public key based on | |
| 5950 * data stored with the wrappedSymmetricWrappingkey. Next, | |
| 5951 * we do an ECDH computation involving this public key and | |
| 5952 * the SSL server's (long-term) EC private key. The resulting | |
| 5953 * shared secret is treated the same way as Fortezza's Ks, i.e., | |
| 5954 * it is used to recover the symmetric wrapping key. | |
| 5955 * | |
| 5956 * The data in wrappedSymmetricWrappingkey is laid out as defined | |
| 5957 * in the ECCWrappedKeyInfo structure. | |
| 5958 */ | |
| 5959 ecWrapped = (ECCWrappedKeyInfo *)pWswk->wrappedSymmetricWrappingkey; | |
| 5960 | |
| 5961 PORT_Assert(ecWrapped->encodedParamLen + ecWrapped->pubValueLen + | |
| 5962 ecWrapped->wrappedKeyLen <= MAX_EC_WRAPPED_KEY_BUFLE
N); | |
| 5963 | |
| 5964 if (ecWrapped->encodedParamLen + ecWrapped->pubValueLen + | |
| 5965 ecWrapped->wrappedKeyLen > MAX_EC_WRAPPED_KEY_BUFLEN) { | |
| 5966 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 5967 goto loser; | |
| 5968 } | |
| 5969 | |
| 5970 pubWrapKey.keyType = ecKey; | |
| 5971 pubWrapKey.u.ec.size = ecWrapped->size; | |
| 5972 pubWrapKey.u.ec.DEREncodedParams.len = ecWrapped->encodedParamLen; | |
| 5973 pubWrapKey.u.ec.DEREncodedParams.data = ecWrapped->var; | |
| 5974 pubWrapKey.u.ec.publicValue.len = ecWrapped->pubValueLen; | |
| 5975 pubWrapKey.u.ec.publicValue.data = ecWrapped->var + | |
| 5976 ecWrapped->encodedParamLen; | |
| 5977 | |
| 5978 wrappedKey.len = ecWrapped->wrappedKeyLen; | |
| 5979 wrappedKey.data = ecWrapped->var + ecWrapped->encodedParamLen + | |
| 5980 ecWrapped->pubValueLen; | |
| 5981 | |
| 5982 /* Derive Ks using ECDH */ | |
| 5983 Ks = PK11_PubDeriveWithKDF(svrPrivKey, &pubWrapKey, PR_FALSE, NULL, | |
| 5984 NULL, CKM_ECDH1_DERIVE, masterWrapMech, | |
| 5985 CKA_DERIVE, 0, CKD_NULL, NULL, NULL); | |
| 5986 if (Ks == NULL) { | |
| 5987 goto loser; | |
| 5988 } | |
| 5989 | |
| 5990 /* Use Ks to unwrap the wrapping key */ | |
| 5991 unwrappedWrappingKey = PK11_UnwrapSymKey(Ks, masterWrapMech, NULL, | |
| 5992 &wrappedKey, masterWrapMech
, | |
| 5993 CKA_UNWRAP, 0); | |
| 5994 PK11_FreeSymKey(Ks); | |
| 5995 | |
| 5996 break; | |
| 5997 #endif | |
| 5998 | |
| 5999 default: | |
| 6000 /* Assert? */ | |
| 6001 SET_ERROR_CODE | |
| 6002 goto loser; | |
| 6003 } | |
| 6004 loser: | |
| 6005 return unwrappedWrappingKey; | |
| 6006 } | |
| 6007 | |
| 6008 /* Each process sharing the server session ID cache has its own array of | |
| 6009 * SymKey pointers for the symmetric wrapping keys that are used to wrap | |
| 6010 * the master secrets. There is one key for each KEA type. These Symkeys | |
| 6011 * correspond to the wrapped SymKeys kept in the server session cache. | |
| 6012 */ | |
| 6013 | |
| 6014 typedef struct { | |
| 6015 PK11SymKey *symWrapKey[kt_kea_size]; | |
| 6016 } ssl3SymWrapKey; | |
| 6017 | |
| 6018 static PZLock *symWrapKeysLock = NULL; | |
| 6019 static ssl3SymWrapKey symWrapKeys[SSL_NUM_WRAP_MECHS]; | |
| 6020 | |
| 6021 SECStatus | |
| 6022 ssl_FreeSymWrapKeysLock(void) | |
| 6023 { | |
| 6024 if (symWrapKeysLock) { | |
| 6025 PZ_DestroyLock(symWrapKeysLock); | |
| 6026 symWrapKeysLock = NULL; | |
| 6027 return SECSuccess; | |
| 6028 } | |
| 6029 PORT_SetError(SEC_ERROR_NOT_INITIALIZED); | |
| 6030 return SECFailure; | |
| 6031 } | |
| 6032 | |
| 6033 SECStatus | |
| 6034 SSL3_ShutdownServerCache(void) | |
| 6035 { | |
| 6036 int i, j; | |
| 6037 | |
| 6038 if (!symWrapKeysLock) | |
| 6039 return SECSuccess; /* lock was never initialized */ | |
| 6040 PZ_Lock(symWrapKeysLock); | |
| 6041 /* get rid of all symWrapKeys */ | |
| 6042 for (i = 0; i < SSL_NUM_WRAP_MECHS; ++i) { | |
| 6043 for (j = 0; j < kt_kea_size; ++j) { | |
| 6044 PK11SymKey **pSymWrapKey; | |
| 6045 pSymWrapKey = &symWrapKeys[i].symWrapKey[j]; | |
| 6046 if (*pSymWrapKey) { | |
| 6047 PK11_FreeSymKey(*pSymWrapKey); | |
| 6048 *pSymWrapKey = NULL; | |
| 6049 } | |
| 6050 } | |
| 6051 } | |
| 6052 | |
| 6053 PZ_Unlock(symWrapKeysLock); | |
| 6054 return SECSuccess; | |
| 6055 } | |
| 6056 | |
| 6057 SECStatus | |
| 6058 ssl_InitSymWrapKeysLock(void) | |
| 6059 { | |
| 6060 symWrapKeysLock = PZ_NewLock(nssILockOther); | |
| 6061 return symWrapKeysLock ? SECSuccess : SECFailure; | |
| 6062 } | |
| 6063 | |
| 6064 /* Try to get wrapping key for mechanism from in-memory array. | |
| 6065 * If that fails, look for one on disk. | |
| 6066 * If that fails, generate a new one, put the new one on disk, | |
| 6067 * Put the new key in the in-memory array. | |
| 6068 */ | |
| 6069 static PK11SymKey * | |
| 6070 getWrappingKey(sslSocket *ss, | |
| 6071 PK11SlotInfo *masterSecretSlot, | |
| 6072 SSL3KEAType exchKeyType, | |
| 6073 CK_MECHANISM_TYPE masterWrapMech, | |
| 6074 void *pwArg) | |
| 6075 { | |
| 6076 SECKEYPrivateKey *svrPrivKey; | |
| 6077 SECKEYPublicKey *svrPubKey = NULL; | |
| 6078 PK11SymKey *unwrappedWrappingKey = NULL; | |
| 6079 PK11SymKey **pSymWrapKey; | |
| 6080 CK_MECHANISM_TYPE asymWrapMechanism = CKM_INVALID_MECHANISM; | |
| 6081 int length; | |
| 6082 int symWrapMechIndex; | |
| 6083 SECStatus rv; | |
| 6084 SECItem wrappedKey; | |
| 6085 SSLWrappedSymWrappingKey wswk; | |
| 6086 #ifndef NSS_DISABLE_ECC | |
| 6087 PK11SymKey *Ks = NULL; | |
| 6088 SECKEYPublicKey *pubWrapKey = NULL; | |
| 6089 SECKEYPrivateKey *privWrapKey = NULL; | |
| 6090 ECCWrappedKeyInfo *ecWrapped; | |
| 6091 #endif /* NSS_DISABLE_ECC */ | |
| 6092 | |
| 6093 svrPrivKey = ss->serverCerts[exchKeyType].SERVERKEY; | |
| 6094 PORT_Assert(svrPrivKey != NULL); | |
| 6095 if (!svrPrivKey) { | |
| 6096 return NULL; /* why are we here?!? */ | |
| 6097 } | |
| 6098 | |
| 6099 symWrapMechIndex = ssl_FindIndexByWrapMechanism(masterWrapMech); | |
| 6100 PORT_Assert(symWrapMechIndex >= 0); | |
| 6101 if (symWrapMechIndex < 0) | |
| 6102 return NULL; /* invalid masterWrapMech. */ | |
| 6103 | |
| 6104 pSymWrapKey = &symWrapKeys[symWrapMechIndex].symWrapKey[exchKeyType]; | |
| 6105 | |
| 6106 ssl_InitSessionCacheLocks(); | |
| 6107 | |
| 6108 PZ_Lock(symWrapKeysLock); | |
| 6109 | |
| 6110 unwrappedWrappingKey = *pSymWrapKey; | |
| 6111 if (unwrappedWrappingKey != NULL) { | |
| 6112 if (PK11_VerifyKeyOK(unwrappedWrappingKey)) { | |
| 6113 unwrappedWrappingKey = PK11_ReferenceSymKey(unwrappedWrappingKey); | |
| 6114 goto done; | |
| 6115 } | |
| 6116 /* slot series has changed, so this key is no good any more. */ | |
| 6117 PK11_FreeSymKey(unwrappedWrappingKey); | |
| 6118 *pSymWrapKey = unwrappedWrappingKey = NULL; | |
| 6119 } | |
| 6120 | |
| 6121 /* Try to get wrapped SymWrapping key out of the (disk) cache. */ | |
| 6122 /* Following call fills in wswk on success. */ | |
| 6123 if (ssl_GetWrappingKey(symWrapMechIndex, exchKeyType, &wswk)) { | |
| 6124 /* found the wrapped sym wrapping key on disk. */ | |
| 6125 unwrappedWrappingKey = | |
| 6126 ssl_UnwrapSymWrappingKey(&wswk, svrPrivKey, exchKeyType, | |
| 6127 masterWrapMech, pwArg); | |
| 6128 if (unwrappedWrappingKey) { | |
| 6129 goto install; | |
| 6130 } | |
| 6131 } | |
| 6132 | |
| 6133 if (!masterSecretSlot) /* caller doesn't want to create a new one. */ | |
| 6134 goto loser; | |
| 6135 | |
| 6136 length = PK11_GetBestKeyLength(masterSecretSlot, masterWrapMech); | |
| 6137 /* Zero length means fixed key length algorithm, or error. | |
| 6138 * It's ambiguous. | |
| 6139 */ | |
| 6140 unwrappedWrappingKey = PK11_KeyGen(masterSecretSlot, masterWrapMech, NULL, | |
| 6141 length, pwArg); | |
| 6142 if (!unwrappedWrappingKey) { | |
| 6143 goto loser; | |
| 6144 } | |
| 6145 | |
| 6146 /* Prepare the buffer to receive the wrappedWrappingKey, | |
| 6147 * the symmetric wrapping key wrapped using the server's pub key. | |
| 6148 */ | |
| 6149 PORT_Memset(&wswk, 0, sizeof wswk); /* eliminate UMRs. */ | |
| 6150 | |
| 6151 if (ss->serverCerts[exchKeyType].serverKeyPair) { | |
| 6152 svrPubKey = ss->serverCerts[exchKeyType].serverKeyPair->pubKey; | |
| 6153 } | |
| 6154 if (svrPubKey == NULL) { | |
| 6155 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 6156 goto loser; | |
| 6157 } | |
| 6158 wrappedKey.type = siBuffer; | |
| 6159 wrappedKey.len = SECKEY_PublicKeyStrength(svrPubKey); | |
| 6160 wrappedKey.data = wswk.wrappedSymmetricWrappingkey; | |
| 6161 | |
| 6162 PORT_Assert(wrappedKey.len <= sizeof wswk.wrappedSymmetricWrappingkey); | |
| 6163 if (wrappedKey.len > sizeof wswk.wrappedSymmetricWrappingkey) | |
| 6164 goto loser; | |
| 6165 | |
| 6166 /* wrap symmetric wrapping key in server's public key. */ | |
| 6167 switch (exchKeyType) { | |
| 6168 case kt_rsa: | |
| 6169 asymWrapMechanism = CKM_RSA_PKCS; | |
| 6170 rv = PK11_PubWrapSymKey(asymWrapMechanism, svrPubKey, | |
| 6171 unwrappedWrappingKey, &wrappedKey); | |
| 6172 break; | |
| 6173 | |
| 6174 #ifndef NSS_DISABLE_ECC | |
| 6175 case kt_ecdh: | |
| 6176 /* | |
| 6177 * We generate an ephemeral EC key pair. Perform an ECDH | |
| 6178 * computation involving this ephemeral EC public key and | |
| 6179 * the SSL server's (long-term) EC private key. The resulting | |
| 6180 * shared secret is treated in the same way as Fortezza's Ks, | |
| 6181 * i.e., it is used to wrap the wrapping key. To facilitate | |
| 6182 * unwrapping in ssl_UnwrapWrappingKey, we also store all | |
| 6183 * relevant info about the ephemeral EC public key in | |
| 6184 * wswk.wrappedSymmetricWrappingkey and lay it out as | |
| 6185 * described in the ECCWrappedKeyInfo structure. | |
| 6186 */ | |
| 6187 PORT_Assert(svrPubKey->keyType == ecKey); | |
| 6188 if (svrPubKey->keyType != ecKey) { | |
| 6189 /* something is wrong in sslsecur.c if this isn't an ecKey */ | |
| 6190 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 6191 rv = SECFailure; | |
| 6192 goto ec_cleanup; | |
| 6193 } | |
| 6194 | |
| 6195 privWrapKey = SECKEY_CreateECPrivateKey( | |
| 6196 &svrPubKey->u.ec.DEREncodedParams, &pubWrapKey, NULL); | |
| 6197 if ((privWrapKey == NULL) || (pubWrapKey == NULL)) { | |
| 6198 rv = SECFailure; | |
| 6199 goto ec_cleanup; | |
| 6200 } | |
| 6201 | |
| 6202 /* Set the key size in bits */ | |
| 6203 if (pubWrapKey->u.ec.size == 0) { | |
| 6204 pubWrapKey->u.ec.size = SECKEY_PublicKeyStrengthInBits(svrPubKey
); | |
| 6205 } | |
| 6206 | |
| 6207 PORT_Assert(pubWrapKey->u.ec.DEREncodedParams.len + | |
| 6208 pubWrapKey->u.ec.publicValue.len < MAX_EC_WRAPPED_KE
Y_BUFLEN); | |
| 6209 if (pubWrapKey->u.ec.DEREncodedParams.len + | |
| 6210 pubWrapKey->u.ec.publicValue.len >= MAX_EC_WRAPPED_KEY_BUFLE
N) { | |
| 6211 PORT_SetError(SEC_ERROR_INVALID_KEY); | |
| 6212 rv = SECFailure; | |
| 6213 goto ec_cleanup; | |
| 6214 } | |
| 6215 | |
| 6216 /* Derive Ks using ECDH */ | |
| 6217 Ks = PK11_PubDeriveWithKDF(svrPrivKey, pubWrapKey, PR_FALSE, NULL, | |
| 6218 NULL, CKM_ECDH1_DERIVE, masterWrapMech, | |
| 6219 CKA_DERIVE, 0, CKD_NULL, NULL, NULL); | |
| 6220 if (Ks == NULL) { | |
| 6221 rv = SECFailure; | |
| 6222 goto ec_cleanup; | |
| 6223 } | |
| 6224 | |
| 6225 ecWrapped = (ECCWrappedKeyInfo *)(wswk.wrappedSymmetricWrappingkey); | |
| 6226 ecWrapped->size = pubWrapKey->u.ec.size; | |
| 6227 ecWrapped->encodedParamLen = pubWrapKey->u.ec.DEREncodedParams.len; | |
| 6228 PORT_Memcpy(ecWrapped->var, pubWrapKey->u.ec.DEREncodedParams.data, | |
| 6229 pubWrapKey->u.ec.DEREncodedParams.len); | |
| 6230 | |
| 6231 ecWrapped->pubValueLen = pubWrapKey->u.ec.publicValue.len; | |
| 6232 PORT_Memcpy(ecWrapped->var + ecWrapped->encodedParamLen, | |
| 6233 pubWrapKey->u.ec.publicValue.data, | |
| 6234 pubWrapKey->u.ec.publicValue.len); | |
| 6235 | |
| 6236 wrappedKey.len = MAX_EC_WRAPPED_KEY_BUFLEN - | |
| 6237 (ecWrapped->encodedParamLen + ecWrapped->pubValueLe
n); | |
| 6238 wrappedKey.data = ecWrapped->var + ecWrapped->encodedParamLen + | |
| 6239 ecWrapped->pubValueLen; | |
| 6240 | |
| 6241 /* wrap symmetricWrapping key with the local Ks */ | |
| 6242 rv = PK11_WrapSymKey(masterWrapMech, NULL, Ks, | |
| 6243 unwrappedWrappingKey, &wrappedKey); | |
| 6244 | |
| 6245 if (rv != SECSuccess) { | |
| 6246 goto ec_cleanup; | |
| 6247 } | |
| 6248 | |
| 6249 /* Write down the length of wrapped key in the buffer | |
| 6250 * wswk.wrappedSymmetricWrappingkey at the appropriate offset | |
| 6251 */ | |
| 6252 ecWrapped->wrappedKeyLen = wrappedKey.len; | |
| 6253 | |
| 6254 ec_cleanup: | |
| 6255 if (privWrapKey) | |
| 6256 SECKEY_DestroyPrivateKey(privWrapKey); | |
| 6257 if (pubWrapKey) | |
| 6258 SECKEY_DestroyPublicKey(pubWrapKey); | |
| 6259 if (Ks) | |
| 6260 PK11_FreeSymKey(Ks); | |
| 6261 asymWrapMechanism = masterWrapMech; | |
| 6262 break; | |
| 6263 #endif /* NSS_DISABLE_ECC */ | |
| 6264 | |
| 6265 default: | |
| 6266 rv = SECFailure; | |
| 6267 break; | |
| 6268 } | |
| 6269 | |
| 6270 if (rv != SECSuccess) { | |
| 6271 ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); | |
| 6272 goto loser; | |
| 6273 } | |
| 6274 | |
| 6275 PORT_Assert(asymWrapMechanism != CKM_INVALID_MECHANISM); | |
| 6276 | |
| 6277 wswk.symWrapMechanism = masterWrapMech; | |
| 6278 wswk.symWrapMechIndex = symWrapMechIndex; | |
| 6279 wswk.asymWrapMechanism = asymWrapMechanism; | |
| 6280 wswk.exchKeyType = exchKeyType; | |
| 6281 wswk.wrappedSymKeyLen = wrappedKey.len; | |
| 6282 | |
| 6283 /* put it on disk. */ | |
| 6284 /* If the wrapping key for this KEA type has already been set, | |
| 6285 * then abandon the value we just computed and | |
| 6286 * use the one we got from the disk. | |
| 6287 */ | |
| 6288 if (ssl_SetWrappingKey(&wswk)) { | |
| 6289 /* somebody beat us to it. The original contents of our wswk | |
| 6290 * has been replaced with the content on disk. Now, discard | |
| 6291 * the key we just created and unwrap this new one. | |
| 6292 */ | |
| 6293 PK11_FreeSymKey(unwrappedWrappingKey); | |
| 6294 | |
| 6295 unwrappedWrappingKey = | |
| 6296 ssl_UnwrapSymWrappingKey(&wswk, svrPrivKey, exchKeyType, | |
| 6297 masterWrapMech, pwArg); | |
| 6298 } | |
| 6299 | |
| 6300 install: | |
| 6301 if (unwrappedWrappingKey) { | |
| 6302 *pSymWrapKey = PK11_ReferenceSymKey(unwrappedWrappingKey); | |
| 6303 } | |
| 6304 | |
| 6305 loser: | |
| 6306 done: | |
| 6307 PZ_Unlock(symWrapKeysLock); | |
| 6308 return unwrappedWrappingKey; | |
| 6309 } | |
| 6310 | |
| 6311 /* hexEncode hex encodes |length| bytes from |in| and writes it as |length*2| | |
| 6312 * bytes to |out|. */ | |
| 6313 static void | |
| 6314 hexEncode(char *out, const unsigned char *in, unsigned int length) | |
| 6315 { | |
| 6316 static const char hextable[] = "0123456789abcdef"; | |
| 6317 unsigned int i; | |
| 6318 | |
| 6319 for (i = 0; i < length; i++) { | |
| 6320 *(out++) = hextable[in[i] >> 4]; | |
| 6321 *(out++) = hextable[in[i] & 15]; | |
| 6322 } | |
| 6323 } | |
| 6324 | |
| 6325 /* Called from ssl3_SendClientKeyExchange(). */ | |
| 6326 /* Presently, this always uses PKCS11. There is no bypass for this. */ | |
| 6327 static SECStatus | |
| 6328 sendRSAClientKeyExchange(sslSocket *ss, SECKEYPublicKey *svrPubKey) | |
| 6329 { | |
| 6330 PK11SymKey *pms = NULL; | |
| 6331 SECStatus rv = SECFailure; | |
| 6332 SECItem enc_pms = { siBuffer, NULL, 0 }; | |
| 6333 PRBool isTLS; | |
| 6334 | |
| 6335 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 6336 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | |
| 6337 | |
| 6338 /* Generate the pre-master secret ... */ | |
| 6339 ssl_GetSpecWriteLock(ss); | |
| 6340 isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0); | |
| 6341 | |
| 6342 pms = ssl3_GenerateRSAPMS(ss, ss->ssl3.pwSpec, NULL); | |
| 6343 ssl_ReleaseSpecWriteLock(ss); | |
| 6344 if (pms == NULL) { | |
| 6345 ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); | |
| 6346 goto loser; | |
| 6347 } | |
| 6348 | |
| 6349 /* Get the wrapped (encrypted) pre-master secret, enc_pms */ | |
| 6350 enc_pms.len = SECKEY_PublicKeyStrength(svrPubKey); | |
| 6351 enc_pms.data = (unsigned char *)PORT_Alloc(enc_pms.len); | |
| 6352 if (enc_pms.data == NULL) { | |
| 6353 goto loser; /* err set by PORT_Alloc */ | |
| 6354 } | |
| 6355 | |
| 6356 /* wrap pre-master secret in server's public key. */ | |
| 6357 rv = PK11_PubWrapSymKey(CKM_RSA_PKCS, svrPubKey, pms, &enc_pms); | |
| 6358 if (rv != SECSuccess) { | |
| 6359 ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); | |
| 6360 goto loser; | |
| 6361 } | |
| 6362 | |
| 6363 if (ssl_keylog_iob) { | |
| 6364 SECStatus extractRV = PK11_ExtractKeyValue(pms); | |
| 6365 if (extractRV == SECSuccess) { | |
| 6366 SECItem *keyData = PK11_GetKeyData(pms); | |
| 6367 if (keyData && keyData->data && keyData->len) { | |
| 6368 #ifdef TRACE | |
| 6369 if (ssl_trace >= 100) { | |
| 6370 ssl_PrintBuf(ss, "Pre-Master Secret", | |
| 6371 keyData->data, keyData->len); | |
| 6372 } | |
| 6373 #endif | |
| 6374 if (ssl_keylog_iob && enc_pms.len >= 8 && keyData->len == 48) { | |
| 6375 /* https://developer.mozilla.org/en/NSS_Key_Log_Format */ | |
| 6376 | |
| 6377 /* There could be multiple, concurrent writers to the | |
| 6378 * keylog, so we have to do everything in a single call to | |
| 6379 * fwrite. */ | |
| 6380 char buf[4 + 8 * 2 + 1 + 48 * 2 + 1]; | |
| 6381 | |
| 6382 strcpy(buf, "RSA "); | |
| 6383 hexEncode(buf + 4, enc_pms.data, 8); | |
| 6384 buf[20] = ' '; | |
| 6385 hexEncode(buf + 21, keyData->data, 48); | |
| 6386 buf[sizeof(buf) - 1] = '\n'; | |
| 6387 | |
| 6388 fwrite(buf, sizeof(buf), 1, ssl_keylog_iob); | |
| 6389 fflush(ssl_keylog_iob); | |
| 6390 } | |
| 6391 } | |
| 6392 } | |
| 6393 } | |
| 6394 | |
| 6395 rv = ssl3_AppendHandshakeHeader(ss, client_key_exchange, | |
| 6396 isTLS ? enc_pms.len + 2 | |
| 6397 : enc_pms.len); | |
| 6398 if (rv != SECSuccess) { | |
| 6399 goto loser; /* err set by ssl3_AppendHandshake* */ | |
| 6400 } | |
| 6401 if (isTLS) { | |
| 6402 rv = ssl3_AppendHandshakeVariable(ss, enc_pms.data, enc_pms.len, 2); | |
| 6403 } else { | |
| 6404 rv = ssl3_AppendHandshake(ss, enc_pms.data, enc_pms.len); | |
| 6405 } | |
| 6406 if (rv != SECSuccess) { | |
| 6407 goto loser; /* err set by ssl3_AppendHandshake* */ | |
| 6408 } | |
| 6409 | |
| 6410 rv = ssl3_InitPendingCipherSpec(ss, pms); | |
| 6411 PK11_FreeSymKey(pms); | |
| 6412 pms = NULL; | |
| 6413 | |
| 6414 if (rv != SECSuccess) { | |
| 6415 ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); | |
| 6416 goto loser; | |
| 6417 } | |
| 6418 | |
| 6419 rv = SECSuccess; | |
| 6420 | |
| 6421 loser: | |
| 6422 if (enc_pms.data != NULL) { | |
| 6423 PORT_Free(enc_pms.data); | |
| 6424 } | |
| 6425 if (pms != NULL) { | |
| 6426 PK11_FreeSymKey(pms); | |
| 6427 } | |
| 6428 return rv; | |
| 6429 } | |
| 6430 | |
| 6431 /* Called from ssl3_SendClientKeyExchange(). */ | |
| 6432 /* Presently, this always uses PKCS11. There is no bypass for this. */ | |
| 6433 static SECStatus | |
| 6434 sendDHClientKeyExchange(sslSocket *ss, SECKEYPublicKey *svrPubKey) | |
| 6435 { | |
| 6436 PK11SymKey *pms = NULL; | |
| 6437 SECStatus rv = SECFailure; | |
| 6438 PRBool isTLS; | |
| 6439 CK_MECHANISM_TYPE target; | |
| 6440 | |
| 6441 SECKEYDHParams dhParam; /* DH parameters */ | |
| 6442 SECKEYPublicKey *pubKey = NULL; /* Ephemeral DH key */ | |
| 6443 SECKEYPrivateKey *privKey = NULL; /* Ephemeral DH key */ | |
| 6444 | |
| 6445 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 6446 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | |
| 6447 | |
| 6448 isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0); | |
| 6449 | |
| 6450 /* Copy DH parameters from server key */ | |
| 6451 | |
| 6452 if (svrPubKey->keyType != dhKey) { | |
| 6453 PORT_SetError(SEC_ERROR_BAD_KEY); | |
| 6454 goto loser; | |
| 6455 } | |
| 6456 dhParam.prime.data = svrPubKey->u.dh.prime.data; | |
| 6457 dhParam.prime.len = svrPubKey->u.dh.prime.len; | |
| 6458 dhParam.base.data = svrPubKey->u.dh.base.data; | |
| 6459 dhParam.base.len = svrPubKey->u.dh.base.len; | |
| 6460 | |
| 6461 /* Generate ephemeral DH keypair */ | |
| 6462 privKey = SECKEY_CreateDHPrivateKey(&dhParam, &pubKey, NULL); | |
| 6463 if (!privKey || !pubKey) { | |
| 6464 ssl_MapLowLevelError(SEC_ERROR_KEYGEN_FAIL); | |
| 6465 rv = SECFailure; | |
| 6466 goto loser; | |
| 6467 } | |
| 6468 PRINT_BUF(50, (ss, "DH public value:", | |
| 6469 pubKey->u.dh.publicValue.data, | |
| 6470 pubKey->u.dh.publicValue.len)); | |
| 6471 | |
| 6472 if (isTLS) | |
| 6473 target = CKM_TLS_MASTER_KEY_DERIVE_DH; | |
| 6474 else | |
| 6475 target = CKM_SSL3_MASTER_KEY_DERIVE_DH; | |
| 6476 | |
| 6477 /* Determine the PMS */ | |
| 6478 | |
| 6479 pms = PK11_PubDerive(privKey, svrPubKey, PR_FALSE, NULL, NULL, | |
| 6480 CKM_DH_PKCS_DERIVE, target, CKA_DERIVE, 0, NULL); | |
| 6481 | |
| 6482 if (pms == NULL) { | |
| 6483 ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); | |
| 6484 goto loser; | |
| 6485 } | |
| 6486 | |
| 6487 SECKEY_DestroyPrivateKey(privKey); | |
| 6488 privKey = NULL; | |
| 6489 | |
| 6490 rv = ssl3_AppendHandshakeHeader(ss, client_key_exchange, | |
| 6491 pubKey->u.dh.publicValue.len + 2); | |
| 6492 if (rv != SECSuccess) { | |
| 6493 goto loser; /* err set by ssl3_AppendHandshake* */ | |
| 6494 } | |
| 6495 rv = ssl3_AppendHandshakeVariable(ss, | |
| 6496 pubKey->u.dh.publicValue.data, | |
| 6497 pubKey->u.dh.publicValue.len, 2); | |
| 6498 SECKEY_DestroyPublicKey(pubKey); | |
| 6499 pubKey = NULL; | |
| 6500 | |
| 6501 if (rv != SECSuccess) { | |
| 6502 goto loser; /* err set by ssl3_AppendHandshake* */ | |
| 6503 } | |
| 6504 | |
| 6505 rv = ssl3_InitPendingCipherSpec(ss, pms); | |
| 6506 PK11_FreeSymKey(pms); | |
| 6507 pms = NULL; | |
| 6508 | |
| 6509 if (rv != SECSuccess) { | |
| 6510 ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); | |
| 6511 goto loser; | |
| 6512 } | |
| 6513 | |
| 6514 rv = SECSuccess; | |
| 6515 | |
| 6516 loser: | |
| 6517 | |
| 6518 if (pms) | |
| 6519 PK11_FreeSymKey(pms); | |
| 6520 if (privKey) | |
| 6521 SECKEY_DestroyPrivateKey(privKey); | |
| 6522 if (pubKey) | |
| 6523 SECKEY_DestroyPublicKey(pubKey); | |
| 6524 return rv; | |
| 6525 } | |
| 6526 | |
| 6527 /* Called from ssl3_HandleServerHelloDone(). */ | |
| 6528 static SECStatus | |
| 6529 ssl3_SendClientKeyExchange(sslSocket *ss) | |
| 6530 { | |
| 6531 SECKEYPublicKey *serverKey = NULL; | |
| 6532 SECStatus rv = SECFailure; | |
| 6533 PRBool isTLS; | |
| 6534 | |
| 6535 SSL_TRC(3, ("%d: SSL3[%d]: send client_key_exchange handshake", | |
| 6536 SSL_GETPID(), ss->fd)); | |
| 6537 | |
| 6538 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | |
| 6539 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 6540 | |
| 6541 if (ss->sec.peerKey == NULL) { | |
| 6542 serverKey = CERT_ExtractPublicKey(ss->sec.peerCert); | |
| 6543 if (serverKey == NULL) { | |
| 6544 ssl_MapLowLevelError(SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE); | |
| 6545 return SECFailure; | |
| 6546 } | |
| 6547 } else { | |
| 6548 serverKey = ss->sec.peerKey; | |
| 6549 ss->sec.peerKey = NULL; /* we're done with it now */ | |
| 6550 } | |
| 6551 | |
| 6552 isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0); | |
| 6553 /* enforce limits on kea key sizes. */ | |
| 6554 if (ss->ssl3.hs.kea_def->is_limited) { | |
| 6555 unsigned int keyLen = SECKEY_PublicKeyStrengthInBits(serverKey); | |
| 6556 | |
| 6557 if (keyLen > ss->ssl3.hs.kea_def->key_size_limit) { | |
| 6558 if (isTLS) | |
| 6559 (void)SSL3_SendAlert(ss, alert_fatal, export_restriction); | |
| 6560 else | |
| 6561 (void)ssl3_HandshakeFailure(ss); | |
| 6562 PORT_SetError(SSL_ERROR_PUB_KEY_SIZE_LIMIT_EXCEEDED); | |
| 6563 goto loser; | |
| 6564 } | |
| 6565 } | |
| 6566 | |
| 6567 ss->sec.keaType = ss->ssl3.hs.kea_def->exchKeyType; | |
| 6568 ss->sec.keaKeyBits = SECKEY_PublicKeyStrengthInBits(serverKey); | |
| 6569 | |
| 6570 switch (ss->ssl3.hs.kea_def->exchKeyType) { | |
| 6571 case kt_rsa: | |
| 6572 rv = sendRSAClientKeyExchange(ss, serverKey); | |
| 6573 break; | |
| 6574 | |
| 6575 case kt_dh: | |
| 6576 rv = sendDHClientKeyExchange(ss, serverKey); | |
| 6577 break; | |
| 6578 | |
| 6579 #ifndef NSS_DISABLE_ECC | |
| 6580 case kt_ecdh: | |
| 6581 rv = ssl3_SendECDHClientKeyExchange(ss, serverKey); | |
| 6582 break; | |
| 6583 #endif /* NSS_DISABLE_ECC */ | |
| 6584 | |
| 6585 default: | |
| 6586 /* got an unknown or unsupported Key Exchange Algorithm. */ | |
| 6587 SEND_ALERT | |
| 6588 PORT_SetError(SEC_ERROR_UNSUPPORTED_KEYALG); | |
| 6589 break; | |
| 6590 } | |
| 6591 | |
| 6592 SSL_TRC(3, ("%d: SSL3[%d]: DONE sending client_key_exchange", | |
| 6593 SSL_GETPID(), ss->fd)); | |
| 6594 | |
| 6595 loser: | |
| 6596 if (serverKey) | |
| 6597 SECKEY_DestroyPublicKey(serverKey); | |
| 6598 return rv; /* err code already set. */ | |
| 6599 } | |
| 6600 | |
| 6601 /* Called from ssl3_HandleServerHelloDone(). */ | |
| 6602 SECStatus | |
| 6603 ssl3_SendCertificateVerify(sslSocket *ss, SECKEYPrivateKey *privKey) | |
| 6604 { | |
| 6605 SECStatus rv = SECFailure; | |
| 6606 PRBool isTLS; | |
| 6607 PRBool isTLS12; | |
| 6608 PRBool isTLS13; | |
| 6609 SECItem buf = { siBuffer, NULL, 0 }; | |
| 6610 SSL3Hashes hashes; | |
| 6611 KeyType keyType; | |
| 6612 unsigned int len; | |
| 6613 SSLSignatureAndHashAlg sigAndHash; | |
| 6614 | |
| 6615 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | |
| 6616 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 6617 | |
| 6618 SSL_TRC(3, ("%d: SSL3[%d]: send certificate_verify handshake", | |
| 6619 SSL_GETPID(), ss->fd)); | |
| 6620 | |
| 6621 isTLS13 = (PRBool)(ss->version >= SSL_LIBRARY_VERSION_TLS_1_3); | |
| 6622 ssl_GetSpecReadLock(ss); | |
| 6623 if (ss->ssl3.hs.hashType == handshake_hash_single && | |
| 6624 ss->ssl3.hs.backupHash) { | |
| 6625 PORT_Assert(!ss->ssl3.hs.backupHash); | |
| 6626 PORT_Assert(!isTLS13); | |
| 6627 /* TODO(ekr@rtfm.com): The backup hash here contains a SHA-1 hash | |
| 6628 * but in TLS 1.3, we always sign H(Context, Hash(handshake)) | |
| 6629 * where: | |
| 6630 * | |
| 6631 * H is the negotiated signature hash and | |
| 6632 * Hash is the cipher-suite specific handshake hash | |
| 6633 * Generally this means that Hash is SHA-256. | |
| 6634 * | |
| 6635 * We need code to negotiate H but the current code is a mess. | |
| 6636 */ | |
| 6637 if (isTLS13) { | |
| 6638 /* rv is already set to SECFailure */ | |
| 6639 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 6640 } else { | |
| 6641 rv = ssl3_ComputeBackupHandshakeHashes(ss, &hashes); | |
| 6642 } | |
| 6643 } else { | |
| 6644 ssl3CipherSpec *spec; | |
| 6645 | |
| 6646 if (isTLS13) { | |
| 6647 /* In TLS 1.3, we are already encrypted. */ | |
| 6648 spec = ss->ssl3.cwSpec; | |
| 6649 } else { | |
| 6650 spec = ss->ssl3.pwSpec; | |
| 6651 } | |
| 6652 | |
| 6653 rv = ssl3_ComputeHandshakeHashes(ss, spec, &hashes, 0); | |
| 6654 } | |
| 6655 ssl_ReleaseSpecReadLock(ss); | |
| 6656 if (rv != SECSuccess) { | |
| 6657 goto done; /* err code was set by ssl3_ComputeHandshakeHashes */ | |
| 6658 } | |
| 6659 | |
| 6660 if (isTLS13) { | |
| 6661 rv = tls13_AddContextToHashes(ss, &hashes, tls13_GetHash(ss), PR_TRUE); | |
| 6662 if (rv != SECSuccess) { | |
| 6663 goto done; /* err code was set by tls13_AddContextToHashes */ | |
| 6664 } | |
| 6665 } | |
| 6666 | |
| 6667 isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0); | |
| 6668 isTLS12 = (PRBool)(ss->ssl3.pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); | |
| 6669 | |
| 6670 keyType = privKey->keyType; | |
| 6671 rv = ssl3_SignHashes(&hashes, privKey, &buf, isTLS); | |
| 6672 if (rv == SECSuccess && !ss->sec.isServer) { | |
| 6673 /* Remember the info about the slot that did the signing. | |
| 6674 ** Later, when doing an SSL restart handshake, verify this. | |
| 6675 ** These calls are mere accessors, and can't fail. | |
| 6676 */ | |
| 6677 PK11SlotInfo *slot; | |
| 6678 sslSessionID *sid = ss->sec.ci.sid; | |
| 6679 | |
| 6680 slot = PK11_GetSlotFromPrivateKey(privKey); | |
| 6681 sid->u.ssl3.clAuthSeries = PK11_GetSlotSeries(slot); | |
| 6682 sid->u.ssl3.clAuthSlotID = PK11_GetSlotID(slot); | |
| 6683 sid->u.ssl3.clAuthModuleID = PK11_GetModuleID(slot); | |
| 6684 sid->u.ssl3.clAuthValid = PR_TRUE; | |
| 6685 PK11_FreeSlot(slot); | |
| 6686 } | |
| 6687 if (rv != SECSuccess) { | |
| 6688 goto done; /* err code was set by ssl3_SignHashes */ | |
| 6689 } | |
| 6690 | |
| 6691 len = buf.len + 2 + (isTLS12 ? 2 : 0); | |
| 6692 | |
| 6693 rv = ssl3_AppendHandshakeHeader(ss, certificate_verify, len); | |
| 6694 if (rv != SECSuccess) { | |
| 6695 goto done; /* error code set by AppendHandshake */ | |
| 6696 } | |
| 6697 if (isTLS12) { | |
| 6698 rv = ssl3_TLSSignatureAlgorithmForKeyType(keyType, | |
| 6699 &sigAndHash.sigAlg); | |
| 6700 if (rv != SECSuccess) { | |
| 6701 goto done; | |
| 6702 } | |
| 6703 sigAndHash.hashAlg = hashes.hashAlg; | |
| 6704 | |
| 6705 rv = ssl3_AppendSignatureAndHashAlgorithm(ss, &sigAndHash); | |
| 6706 if (rv != SECSuccess) { | |
| 6707 goto done; /* err set by AppendHandshake. */ | |
| 6708 } | |
| 6709 } | |
| 6710 rv = ssl3_AppendHandshakeVariable(ss, buf.data, buf.len, 2); | |
| 6711 if (rv != SECSuccess) { | |
| 6712 goto done; /* error code set by AppendHandshake */ | |
| 6713 } | |
| 6714 | |
| 6715 done: | |
| 6716 if (buf.data) | |
| 6717 PORT_Free(buf.data); | |
| 6718 return rv; | |
| 6719 } | |
| 6720 | |
| 6721 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete | |
| 6722 * ssl3 ServerHello message. | |
| 6723 * Caller must hold Handshake and RecvBuf locks. | |
| 6724 */ | |
| 6725 static SECStatus | |
| 6726 ssl3_HandleServerHello(sslSocket *ss, SSL3Opaque *b, PRUint32 length) | |
| 6727 { | |
| 6728 sslSessionID *sid = ss->sec.ci.sid; | |
| 6729 PRInt32 temp; /* allow for consume number failure */ | |
| 6730 PRBool suite_found = PR_FALSE; | |
| 6731 int i; | |
| 6732 int errCode = SSL_ERROR_RX_MALFORMED_SERVER_HELLO; | |
| 6733 SECStatus rv; | |
| 6734 SECItem sidBytes = { siBuffer, NULL, 0 }; | |
| 6735 PRBool sid_match; | |
| 6736 PRBool isTLS = PR_FALSE; | |
| 6737 SSL3AlertDescription desc = illegal_parameter; | |
| 6738 SSL3ProtocolVersion version; | |
| 6739 SSL3ProtocolVersion downgradeCheckVersion; | |
| 6740 | |
| 6741 SSL_TRC(3, ("%d: SSL3[%d]: handle server_hello handshake", | |
| 6742 SSL_GETPID(), ss->fd)); | |
| 6743 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 6744 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 6745 PORT_Assert(ss->ssl3.initialized); | |
| 6746 | |
| 6747 if (ss->ssl3.hs.ws != wait_server_hello) { | |
| 6748 errCode = SSL_ERROR_RX_UNEXPECTED_SERVER_HELLO; | |
| 6749 desc = unexpected_message; | |
| 6750 goto alert_loser; | |
| 6751 } | |
| 6752 | |
| 6753 /* clean up anything left from previous handshake. */ | |
| 6754 if (ss->ssl3.clientCertChain != NULL) { | |
| 6755 CERT_DestroyCertificateList(ss->ssl3.clientCertChain); | |
| 6756 ss->ssl3.clientCertChain = NULL; | |
| 6757 } | |
| 6758 if (ss->ssl3.clientCertificate != NULL) { | |
| 6759 CERT_DestroyCertificate(ss->ssl3.clientCertificate); | |
| 6760 ss->ssl3.clientCertificate = NULL; | |
| 6761 } | |
| 6762 if (ss->ssl3.clientPrivateKey != NULL) { | |
| 6763 SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); | |
| 6764 ss->ssl3.clientPrivateKey = NULL; | |
| 6765 } | |
| 6766 | |
| 6767 if (ss->ssl3.channelID != NULL) { | |
| 6768 SECKEY_DestroyPrivateKey(ss->ssl3.channelID); | |
| 6769 ss->ssl3.channelID = NULL; | |
| 6770 } | |
| 6771 if (ss->ssl3.channelIDPub != NULL) { | |
| 6772 SECKEY_DestroyPublicKey(ss->ssl3.channelIDPub); | |
| 6773 ss->ssl3.channelIDPub = NULL; | |
| 6774 } | |
| 6775 | |
| 6776 temp = ssl3_ConsumeHandshakeNumber(ss, 2, &b, &length); | |
| 6777 if (temp < 0) { | |
| 6778 goto loser; /* alert has been sent */ | |
| 6779 } | |
| 6780 version = (SSL3ProtocolVersion)temp; | |
| 6781 | |
| 6782 if (IS_DTLS(ss)) { | |
| 6783 /* RFC 4347 required that you verify that the server versions | |
| 6784 * match (Section 4.2.1) in the HelloVerifyRequest and the | |
| 6785 * ServerHello. | |
| 6786 * | |
| 6787 * RFC 6347 suggests (SHOULD) that servers always use 1.0 | |
| 6788 * in HelloVerifyRequest and allows the versions not to match, | |
| 6789 * especially when 1.2 is being negotiated. | |
| 6790 * | |
| 6791 * Therefore we do not check for matching here. | |
| 6792 */ | |
| 6793 version = dtls_DTLSVersionToTLSVersion(version); | |
| 6794 if (version == 0) { /* Insane version number */ | |
| 6795 goto alert_loser; | |
| 6796 } | |
| 6797 } | |
| 6798 | |
| 6799 rv = ssl3_NegotiateVersion(ss, version, PR_FALSE); | |
| 6800 if (rv != SECSuccess) { | |
| 6801 desc = (version > SSL_LIBRARY_VERSION_3_0) ? protocol_version | |
| 6802 : handshake_failure; | |
| 6803 errCode = SSL_ERROR_UNSUPPORTED_VERSION; | |
| 6804 goto alert_loser; | |
| 6805 } | |
| 6806 ss->ssl3.hs.preliminaryInfo |= ssl_preinfo_version; | |
| 6807 isTLS = (ss->version > SSL_LIBRARY_VERSION_3_0); | |
| 6808 | |
| 6809 rv = ssl3_InitHandshakeHashes(ss); | |
| 6810 if (rv != SECSuccess) { | |
| 6811 desc = internal_error; | |
| 6812 errCode = PORT_GetError(); | |
| 6813 goto alert_loser; | |
| 6814 } | |
| 6815 | |
| 6816 rv = ssl3_ConsumeHandshake( | |
| 6817 ss, &ss->ssl3.hs.server_random, SSL3_RANDOM_LENGTH, &b, &length); | |
| 6818 if (rv != SECSuccess) { | |
| 6819 goto loser; /* alert has been sent */ | |
| 6820 } | |
| 6821 | |
| 6822 /* Check the ServerHello.random per | |
| 6823 * [draft-ietf-tls-tls13-11 Section 6.3.1.1]. | |
| 6824 * | |
| 6825 * TLS 1.3 clients receiving a TLS 1.2 or below ServerHello MUST check | |
| 6826 * that the top eight octets are not equal to either of these values. | |
| 6827 * TLS 1.2 clients SHOULD also perform this check if the ServerHello | |
| 6828 * indicates TLS 1.1 or below. If a match is found the client MUST | |
| 6829 * abort the handshake with a fatal "illegal_parameter" alert. | |
| 6830 */ | |
| 6831 downgradeCheckVersion = ss->ssl3.downgradeCheckVersion ? ss->ssl3.downgradeC
heckVersion | |
| 6832 : ss->vrange.max; | |
| 6833 | |
| 6834 if (downgradeCheckVersion >= SSL_LIBRARY_VERSION_TLS_1_2 && | |
| 6835 downgradeCheckVersion > ss->version) { | |
| 6836 if (!PORT_Memcmp(ss->ssl3.hs.server_random.rand, | |
| 6837 tls13_downgrade_random, | |
| 6838 sizeof(tls13_downgrade_random)) || | |
| 6839 !PORT_Memcmp(ss->ssl3.hs.server_random.rand, | |
| 6840 tls12_downgrade_random, | |
| 6841 sizeof(tls12_downgrade_random))) { | |
| 6842 desc = illegal_parameter; | |
| 6843 errCode = SSL_ERROR_RX_MALFORMED_SERVER_HELLO; | |
| 6844 goto alert_loser; | |
| 6845 } | |
| 6846 } | |
| 6847 | |
| 6848 if (ss->version < SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 6849 rv = ssl3_ConsumeHandshakeVariable(ss, &sidBytes, 1, &b, &length); | |
| 6850 if (rv != SECSuccess) { | |
| 6851 goto loser; /* alert has been sent */ | |
| 6852 } | |
| 6853 if (sidBytes.len > SSL3_SESSIONID_BYTES) { | |
| 6854 if (isTLS) | |
| 6855 desc = decode_error; | |
| 6856 goto alert_loser; /* malformed. */ | |
| 6857 } | |
| 6858 } | |
| 6859 | |
| 6860 /* find selected cipher suite in our list. */ | |
| 6861 temp = ssl3_ConsumeHandshakeNumber(ss, 2, &b, &length); | |
| 6862 if (temp < 0) { | |
| 6863 goto loser; /* alert has been sent */ | |
| 6864 } | |
| 6865 ssl3_config_match_init(ss); | |
| 6866 for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) { | |
| 6867 ssl3CipherSuiteCfg *suite = &ss->cipherSuites[i]; | |
| 6868 if (temp == suite->cipher_suite) { | |
| 6869 SSLVersionRange vrange = { ss->version, ss->version }; | |
| 6870 if (!config_match(suite, ss->ssl3.policy, PR_TRUE, &vrange, ss)) { | |
| 6871 /* config_match already checks whether the cipher suite is | |
| 6872 * acceptable for the version, but the check is repeated here | |
| 6873 * in order to give a more precise error code. */ | |
| 6874 if (!ssl3_CipherSuiteAllowedForVersionRange(temp, &vrange)) { | |
| 6875 desc = handshake_failure; | |
| 6876 errCode = SSL_ERROR_CIPHER_DISALLOWED_FOR_VERSION; | |
| 6877 goto alert_loser; | |
| 6878 } | |
| 6879 | |
| 6880 break; /* failure */ | |
| 6881 } | |
| 6882 | |
| 6883 suite_found = PR_TRUE; | |
| 6884 break; /* success */ | |
| 6885 } | |
| 6886 } | |
| 6887 if (!suite_found) { | |
| 6888 desc = handshake_failure; | |
| 6889 errCode = SSL_ERROR_NO_CYPHER_OVERLAP; | |
| 6890 goto alert_loser; | |
| 6891 } | |
| 6892 ss->ssl3.hs.cipher_suite = (ssl3CipherSuite)temp; | |
| 6893 ss->ssl3.hs.suite_def = ssl_LookupCipherSuiteDef((ssl3CipherSuite)temp); | |
| 6894 ss->ssl3.hs.preliminaryInfo |= ssl_preinfo_cipher_suite; | |
| 6895 PORT_Assert(ss->ssl3.hs.suite_def); | |
| 6896 if (!ss->ssl3.hs.suite_def) { | |
| 6897 errCode = SEC_ERROR_LIBRARY_FAILURE; | |
| 6898 PORT_SetError(errCode); | |
| 6899 goto loser; /* we don't send alerts for our screw-ups. */ | |
| 6900 } | |
| 6901 | |
| 6902 ss->ssl3.hs.kea_def = &kea_defs[ss->ssl3.hs.suite_def->key_exchange_alg]; | |
| 6903 | |
| 6904 if (ss->version < SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 6905 /* find selected compression method in our list. */ | |
| 6906 temp = ssl3_ConsumeHandshakeNumber(ss, 1, &b, &length); | |
| 6907 if (temp < 0) { | |
| 6908 goto loser; /* alert has been sent */ | |
| 6909 } | |
| 6910 suite_found = PR_FALSE; | |
| 6911 for (i = 0; i < compressionMethodsCount; i++) { | |
| 6912 if (temp == compressions[i]) { | |
| 6913 if (!compressionEnabled(ss, compressions[i])) { | |
| 6914 break; /* failure */ | |
| 6915 } | |
| 6916 suite_found = PR_TRUE; | |
| 6917 break; /* success */ | |
| 6918 } | |
| 6919 } | |
| 6920 if (!suite_found) { | |
| 6921 desc = handshake_failure; | |
| 6922 errCode = SSL_ERROR_NO_COMPRESSION_OVERLAP; | |
| 6923 goto alert_loser; | |
| 6924 } | |
| 6925 ss->ssl3.hs.compression = (SSLCompressionMethod)temp; | |
| 6926 } else { | |
| 6927 ss->ssl3.hs.compression = ssl_compression_null; | |
| 6928 } | |
| 6929 | |
| 6930 /* Note that if !isTLS and the extra stuff is not extensions, we | |
| 6931 * do NOT goto alert_loser. | |
| 6932 * There are some old SSL 3.0 implementations that do send stuff | |
| 6933 * after the end of the server hello, and we deliberately ignore | |
| 6934 * such stuff in the interest of maximal interoperability (being | |
| 6935 * "generous in what you accept"). | |
| 6936 * Update: Starting in NSS 3.12.6, we handle the renegotiation_info | |
| 6937 * extension in SSL 3.0. | |
| 6938 */ | |
| 6939 if (length != 0) { | |
| 6940 SECItem extensions; | |
| 6941 rv = ssl3_ConsumeHandshakeVariable(ss, &extensions, 2, &b, &length); | |
| 6942 if (rv != SECSuccess || length != 0) { | |
| 6943 if (isTLS) | |
| 6944 goto alert_loser; | |
| 6945 } else { | |
| 6946 rv = ssl3_HandleHelloExtensions(ss, &extensions.data, | |
| 6947 &extensions.len, server_hello); | |
| 6948 if (rv != SECSuccess) | |
| 6949 goto alert_loser; | |
| 6950 } | |
| 6951 } | |
| 6952 if ((ss->opt.requireSafeNegotiation || | |
| 6953 (ss->firstHsDone && (ss->peerRequestedProtection || | |
| 6954 ss->opt.enableRenegotiation == | |
| 6955 SSL_RENEGOTIATE_REQUIRES_XTN))) && | |
| 6956 !ssl3_ExtensionNegotiated(ss, ssl_renegotiation_info_xtn)) { | |
| 6957 desc = handshake_failure; | |
| 6958 errCode = ss->firstHsDone ? SSL_ERROR_RENEGOTIATION_NOT_ALLOWED | |
| 6959 : SSL_ERROR_UNSAFE_NEGOTIATION; | |
| 6960 goto alert_loser; | |
| 6961 } | |
| 6962 | |
| 6963 /* Any errors after this point are not "malformed" errors. */ | |
| 6964 desc = handshake_failure; | |
| 6965 | |
| 6966 /* we need to call ssl3_SetupPendingCipherSpec here so we can check the | |
| 6967 * key exchange algorithm. */ | |
| 6968 rv = ssl3_SetupPendingCipherSpec(ss); | |
| 6969 if (rv != SECSuccess) { | |
| 6970 goto alert_loser; /* error code is set. */ | |
| 6971 } | |
| 6972 | |
| 6973 /* We may or may not have sent a session id, we may get one back or | |
| 6974 * not and if so it may match the one we sent. | |
| 6975 * Attempt to restore the master secret to see if this is so... | |
| 6976 * Don't consider failure to find a matching SID an error. | |
| 6977 */ | |
| 6978 sid_match = (PRBool)(sidBytes.len > 0 && | |
| 6979 sidBytes.len == | |
| 6980 sid->u.ssl3.sessionIDLength && | |
| 6981 !PORT_Memcmp(sid->u.ssl3.sessionID, sidBytes.data, sidB
ytes.len)); | |
| 6982 | |
| 6983 if (sid_match && | |
| 6984 sid->version == ss->version && | |
| 6985 sid->u.ssl3.cipherSuite == ss->ssl3.hs.cipher_suite) | |
| 6986 do { | |
| 6987 ssl3CipherSpec *pwSpec = ss->ssl3.pwSpec; | |
| 6988 | |
| 6989 SECItem wrappedMS; /* wrapped master secret. */ | |
| 6990 | |
| 6991 /* [draft-ietf-tls-session-hash-06; Section 5.3] | |
| 6992 * | |
| 6993 * o If the original session did not use the "extended_master_secre
t" | |
| 6994 * extension but the new ServerHello contains the extension, the | |
| 6995 * client MUST abort the handshake. | |
| 6996 */ | |
| 6997 if (!sid->u.ssl3.keys.extendedMasterSecretUsed && | |
| 6998 ssl3_ExtensionNegotiated(ss, ssl_extended_master_secret_xtn)) { | |
| 6999 errCode = SSL_ERROR_UNEXPECTED_EXTENDED_MASTER_SECRET; | |
| 7000 goto alert_loser; | |
| 7001 } | |
| 7002 | |
| 7003 /* | |
| 7004 * o If the original session used an extended master secret but t
he new | |
| 7005 * ServerHello does not contain the "extended_master_secret" | |
| 7006 * extension, the client SHOULD abort the handshake. | |
| 7007 * | |
| 7008 * TODO(ekr@rtfm.com): Add option to refuse to resume when EMS is no
t | |
| 7009 * used at all (bug 1176526). | |
| 7010 */ | |
| 7011 if (sid->u.ssl3.keys.extendedMasterSecretUsed && | |
| 7012 !ssl3_ExtensionNegotiated(ss, ssl_extended_master_secret_xtn)) { | |
| 7013 errCode = SSL_ERROR_MISSING_EXTENDED_MASTER_SECRET; | |
| 7014 goto alert_loser; | |
| 7015 } | |
| 7016 | |
| 7017 ss->sec.authAlgorithm = sid->authAlgorithm; | |
| 7018 ss->sec.authKeyBits = sid->authKeyBits; | |
| 7019 ss->sec.keaType = sid->keaType; | |
| 7020 ss->sec.keaKeyBits = sid->keaKeyBits; | |
| 7021 | |
| 7022 /* 3 cases here: | |
| 7023 * a) key is wrapped (implies using PKCS11) | |
| 7024 * b) key is unwrapped, but we're still using PKCS11 | |
| 7025 * c) key is unwrapped, and we're bypassing PKCS11. | |
| 7026 */ | |
| 7027 if (sid->u.ssl3.keys.msIsWrapped) { | |
| 7028 PK11SlotInfo *slot; | |
| 7029 PK11SymKey *wrapKey; /* wrapping key */ | |
| 7030 CK_FLAGS keyFlags = 0; | |
| 7031 | |
| 7032 #ifndef NO_PKCS11_BYPASS | |
| 7033 if (ss->opt.bypassPKCS11) { | |
| 7034 /* we cannot restart a non-bypass session in a | |
| 7035 ** bypass socket. | |
| 7036 */ | |
| 7037 break; | |
| 7038 } | |
| 7039 #endif | |
| 7040 /* unwrap master secret with PKCS11 */ | |
| 7041 slot = SECMOD_LookupSlot(sid->u.ssl3.masterModuleID, | |
| 7042 sid->u.ssl3.masterSlotID); | |
| 7043 if (slot == NULL) { | |
| 7044 break; /* not considered an error. */ | |
| 7045 } | |
| 7046 if (!PK11_IsPresent(slot)) { | |
| 7047 PK11_FreeSlot(slot); | |
| 7048 break; /* not considered an error. */ | |
| 7049 } | |
| 7050 wrapKey = PK11_GetWrapKey(slot, sid->u.ssl3.masterWrapIndex, | |
| 7051 sid->u.ssl3.masterWrapMech, | |
| 7052 sid->u.ssl3.masterWrapSeries, | |
| 7053 ss->pkcs11PinArg); | |
| 7054 PK11_FreeSlot(slot); | |
| 7055 if (wrapKey == NULL) { | |
| 7056 break; /* not considered an error. */ | |
| 7057 } | |
| 7058 | |
| 7059 if (ss->version > SSL_LIBRARY_VERSION_3_0) { /* isTLS */ | |
| 7060 keyFlags = | |
| 7061 CKF_SIGN | CKF_VERIFY; | |
| 7062 } | |
| 7063 | |
| 7064 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; | |
| 7065 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; | |
| 7066 pwSpec->master_secret = | |
| 7067 PK11_UnwrapSymKeyWithFlags(wrapKey, sid->u.ssl3.masterWrapMe
ch, | |
| 7068 NULL, &wrappedMS, CKM_SSL3_MASTER
_KEY_DERIVE, | |
| 7069 CKA_DERIVE, sizeof(SSL3MasterSecr
et), keyFlags); | |
| 7070 errCode = PORT_GetError(); | |
| 7071 PK11_FreeSymKey(wrapKey); | |
| 7072 if (pwSpec->master_secret == NULL) { | |
| 7073 break; /* errorCode set just after call to UnwrapSymKey. */ | |
| 7074 } | |
| 7075 #ifndef NO_PKCS11_BYPASS | |
| 7076 } else if (ss->opt.bypassPKCS11) { | |
| 7077 /* MS is not wrapped */ | |
| 7078 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; | |
| 7079 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; | |
| 7080 memcpy(pwSpec->raw_master_secret, wrappedMS.data, wrappedMS.len)
; | |
| 7081 pwSpec->msItem.data = pwSpec->raw_master_secret; | |
| 7082 pwSpec->msItem.len = wrappedMS.len; | |
| 7083 #endif | |
| 7084 } else { | |
| 7085 /* We CAN restart a bypass session in a non-bypass socket. */ | |
| 7086 /* need to import the raw master secret to session object */ | |
| 7087 PK11SlotInfo *slot = PK11_GetInternalSlot(); | |
| 7088 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; | |
| 7089 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; | |
| 7090 pwSpec->master_secret = | |
| 7091 PK11_ImportSymKey(slot, CKM_SSL3_MASTER_KEY_DERIVE, | |
| 7092 PK11_OriginUnwrap, CKA_ENCRYPT, | |
| 7093 &wrappedMS, NULL); | |
| 7094 PK11_FreeSlot(slot); | |
| 7095 if (pwSpec->master_secret == NULL) { | |
| 7096 break; | |
| 7097 } | |
| 7098 } | |
| 7099 | |
| 7100 /* Got a Match */ | |
| 7101 SSL_AtomicIncrementLong(&ssl3stats.hsh_sid_cache_hits); | |
| 7102 | |
| 7103 /* If we sent a session ticket, then this is a stateless resume. */ | |
| 7104 if (ss->xtnData.sentSessionTicketInClientHello) | |
| 7105 SSL_AtomicIncrementLong(&ssl3stats.hsh_sid_stateless_resumes); | |
| 7106 | |
| 7107 if (ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn)) | |
| 7108 ss->ssl3.hs.ws = wait_new_session_ticket; | |
| 7109 else | |
| 7110 ss->ssl3.hs.ws = wait_change_cipher; | |
| 7111 | |
| 7112 ss->ssl3.hs.isResuming = PR_TRUE; | |
| 7113 | |
| 7114 /* copy the peer cert from the SID */ | |
| 7115 if (sid->peerCert != NULL) { | |
| 7116 ss->sec.peerCert = CERT_DupCertificate(sid->peerCert); | |
| 7117 ssl3_CopyPeerCertsFromSID(ss, sid); | |
| 7118 } | |
| 7119 | |
| 7120 /* NULL value for PMS because we are reusing the old MS */ | |
| 7121 rv = ssl3_InitPendingCipherSpec(ss, NULL); | |
| 7122 if (rv != SECSuccess) { | |
| 7123 goto alert_loser; /* err code was set */ | |
| 7124 } | |
| 7125 goto winner; | |
| 7126 } while (0); | |
| 7127 | |
| 7128 if (sid_match) | |
| 7129 SSL_AtomicIncrementLong(&ssl3stats.hsh_sid_cache_not_ok); | |
| 7130 else | |
| 7131 SSL_AtomicIncrementLong(&ssl3stats.hsh_sid_cache_misses); | |
| 7132 | |
| 7133 /* throw the old one away */ | |
| 7134 sid->u.ssl3.keys.resumable = PR_FALSE; | |
| 7135 if (ss->sec.uncache) | |
| 7136 (*ss->sec.uncache)(sid); | |
| 7137 ssl_FreeSID(sid); | |
| 7138 | |
| 7139 /* get a new sid */ | |
| 7140 ss->sec.ci.sid = sid = ssl3_NewSessionID(ss, PR_FALSE); | |
| 7141 if (sid == NULL) { | |
| 7142 goto alert_loser; /* memory error is set. */ | |
| 7143 } | |
| 7144 | |
| 7145 sid->version = ss->version; | |
| 7146 sid->u.ssl3.sessionIDLength = sidBytes.len; | |
| 7147 PORT_Memcpy(sid->u.ssl3.sessionID, sidBytes.data, sidBytes.len); | |
| 7148 | |
| 7149 sid->u.ssl3.keys.extendedMasterSecretUsed = | |
| 7150 ssl3_ExtensionNegotiated(ss, ssl_extended_master_secret_xtn); | |
| 7151 | |
| 7152 /* Copy Signed Certificate Timestamps, if any. */ | |
| 7153 if (ss->xtnData.signedCertTimestamps.data) { | |
| 7154 rv = SECITEM_CopyItem(NULL, &sid->u.ssl3.signedCertTimestamps, | |
| 7155 &ss->xtnData.signedCertTimestamps); | |
| 7156 if (rv != SECSuccess) | |
| 7157 goto loser; | |
| 7158 /* Clean up the temporary pointer to the handshake buffer. */ | |
| 7159 ss->xtnData.signedCertTimestamps.data = NULL; | |
| 7160 ss->xtnData.signedCertTimestamps.len = 0; | |
| 7161 } | |
| 7162 | |
| 7163 ss->ssl3.hs.isResuming = PR_FALSE; | |
| 7164 if (ss->version >= SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 7165 rv = tls13_HandleServerKeyShare(ss); | |
| 7166 if (rv != SECSuccess) | |
| 7167 goto alert_loser; | |
| 7168 TLS13_SET_HS_STATE(ss, wait_encrypted_extensions); | |
| 7169 } else if (ss->ssl3.hs.kea_def->signKeyType != ssl_sign_null) { | |
| 7170 /* All current cipher suites other than those with ssl_sign_null (i.e., | |
| 7171 * (EC)DH_anon_* suites) require a certificate, so use that signal. */ | |
| 7172 ss->ssl3.hs.ws = wait_server_cert; | |
| 7173 } else { | |
| 7174 /* All the remaining cipher suites must be (EC)DH_anon_* and so | |
| 7175 * must be ephemeral. Note, if we ever add PSK this might | |
| 7176 * change. */ | |
| 7177 PORT_Assert(ss->ssl3.hs.kea_def->ephemeral); | |
| 7178 ss->ssl3.hs.ws = wait_server_key; | |
| 7179 } | |
| 7180 | |
| 7181 winner: | |
| 7182 /* If we will need a ChannelID key then we make the callback now. This | |
| 7183 * allows the handshake to be restarted cleanly if the callback returns | |
| 7184 * SECWouldBlock. */ | |
| 7185 if (ssl3_ExtensionNegotiated(ss, ssl_channel_id_xtn)) { | |
| 7186 rv = ss->getChannelID(ss->getChannelIDArg, ss->fd, | |
| 7187 &ss->ssl3.channelIDPub, &ss->ssl3.channelID); | |
| 7188 if (rv == SECWouldBlock) { | |
| 7189 ssl3_SetAlwaysBlock(ss); | |
| 7190 return rv; | |
| 7191 } | |
| 7192 if (rv != SECSuccess || | |
| 7193 ss->ssl3.channelIDPub == NULL || | |
| 7194 ss->ssl3.channelID == NULL) { | |
| 7195 PORT_SetError(SSL_ERROR_GET_CHANNEL_ID_FAILED); | |
| 7196 desc = internal_error; | |
| 7197 goto alert_loser; | |
| 7198 } | |
| 7199 } | |
| 7200 | |
| 7201 return SECSuccess; | |
| 7202 | |
| 7203 alert_loser: | |
| 7204 (void)SSL3_SendAlert(ss, alert_fatal, desc); | |
| 7205 | |
| 7206 loser: | |
| 7207 /* Clean up the temporary pointer to the handshake buffer. */ | |
| 7208 ss->xtnData.signedCertTimestamps.data = NULL; | |
| 7209 ss->xtnData.signedCertTimestamps.len = 0; | |
| 7210 ssl_MapLowLevelError(errCode); | |
| 7211 return SECFailure; | |
| 7212 } | |
| 7213 | |
| 7214 /* Called from ssl3_HandlePostHelloHandshakeMessage() when it has deciphered a | |
| 7215 * complete ssl3 ServerKeyExchange message. | |
| 7216 * Caller must hold Handshake and RecvBuf locks. | |
| 7217 */ | |
| 7218 static SECStatus | |
| 7219 ssl3_HandleServerKeyExchange(sslSocket *ss, SSL3Opaque *b, PRUint32 length) | |
| 7220 { | |
| 7221 PLArenaPool *arena = NULL; | |
| 7222 SECKEYPublicKey *peerKey = NULL; | |
| 7223 PRBool isTLS, isTLS12; | |
| 7224 SECStatus rv; | |
| 7225 int errCode = SSL_ERROR_RX_MALFORMED_SERVER_KEY_EXCH; | |
| 7226 SSL3AlertDescription desc = illegal_parameter; | |
| 7227 SSL3Hashes hashes; | |
| 7228 SECItem signature = { siBuffer, NULL, 0 }; | |
| 7229 SSLSignatureAndHashAlg sigAndHash; | |
| 7230 | |
| 7231 sigAndHash.hashAlg = ssl_hash_none; | |
| 7232 | |
| 7233 SSL_TRC(3, ("%d: SSL3[%d]: handle server_key_exchange handshake", | |
| 7234 SSL_GETPID(), ss->fd)); | |
| 7235 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 7236 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 7237 | |
| 7238 if (ss->ssl3.hs.ws != wait_server_key) { | |
| 7239 errCode = SSL_ERROR_RX_UNEXPECTED_SERVER_KEY_EXCH; | |
| 7240 desc = unexpected_message; | |
| 7241 goto alert_loser; | |
| 7242 } | |
| 7243 | |
| 7244 isTLS = (PRBool)(ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0); | |
| 7245 isTLS12 = (PRBool)(ss->ssl3.prSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); | |
| 7246 | |
| 7247 switch (ss->ssl3.hs.kea_def->exchKeyType) { | |
| 7248 | |
| 7249 case kt_rsa: { | |
| 7250 SECItem modulus = { siBuffer, NULL, 0 }; | |
| 7251 SECItem exponent = { siBuffer, NULL, 0 }; | |
| 7252 | |
| 7253 rv = ssl3_ConsumeHandshakeVariable(ss, &modulus, 2, &b, &length); | |
| 7254 if (rv != SECSuccess) { | |
| 7255 goto loser; /* malformed. */ | |
| 7256 } | |
| 7257 /* This exchange method is only used by export cipher suites. | |
| 7258 * Those are broken and so this code will eventually be removed. */ | |
| 7259 if (SECKEY_BigIntegerBitLength(&modulus) < 512) { | |
| 7260 desc = isTLS ? insufficient_security : illegal_parameter; | |
| 7261 goto alert_loser; | |
| 7262 } | |
| 7263 rv = ssl3_ConsumeHandshakeVariable(ss, &exponent, 2, &b, &length); | |
| 7264 if (rv != SECSuccess) { | |
| 7265 goto loser; /* malformed. */ | |
| 7266 } | |
| 7267 if (isTLS12) { | |
| 7268 rv = ssl3_ConsumeSignatureAndHashAlgorithm(ss, &b, &length, | |
| 7269 &sigAndHash); | |
| 7270 if (rv != SECSuccess) { | |
| 7271 goto loser; /* malformed or unsupported. */ | |
| 7272 } | |
| 7273 rv = ssl3_CheckSignatureAndHashAlgorithmConsistency(ss, | |
| 7274 &sigAndHash,
ss->sec.peerCert); | |
| 7275 if (rv != SECSuccess) { | |
| 7276 goto loser; | |
| 7277 } | |
| 7278 } | |
| 7279 rv = ssl3_ConsumeHandshakeVariable(ss, &signature, 2, &b, &length); | |
| 7280 if (rv != SECSuccess) { | |
| 7281 goto loser; /* malformed. */ | |
| 7282 } | |
| 7283 if (length != 0) { | |
| 7284 if (isTLS) | |
| 7285 desc = | |
| 7286 decode_error; | |
| 7287 goto alert_loser; /* malformed. */ | |
| 7288 } | |
| 7289 | |
| 7290 /* failures after this point are not malformed handshakes. */ | |
| 7291 /* TLS: send decrypt_error if signature failed. */ | |
| 7292 desc = isTLS ? decrypt_error : handshake_failure; | |
| 7293 | |
| 7294 /* | |
| 7295 * check to make sure the hash is signed by right guy | |
| 7296 */ | |
| 7297 rv = ssl3_ComputeExportRSAKeyHash(sigAndHash.hashAlg, modulus, expon
ent, | |
| 7298 &ss->ssl3.hs.client_random, | |
| 7299 &ss->ssl3.hs.server_random, | |
| 7300 &hashes, ss->opt.bypassPKCS11); | |
| 7301 if (rv != SECSuccess) { | |
| 7302 errCode = | |
| 7303 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); | |
| 7304 goto alert_loser; | |
| 7305 } | |
| 7306 rv = ssl3_VerifySignedHashes(&hashes, ss->sec.peerCert, &signature, | |
| 7307 isTLS, ss->pkcs11PinArg); | |
| 7308 if (rv != SECSuccess) { | |
| 7309 errCode = | |
| 7310 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); | |
| 7311 goto alert_loser; | |
| 7312 } | |
| 7313 | |
| 7314 /* | |
| 7315 * we really need to build a new key here because we can no longer | |
| 7316 * ignore calling SECKEY_DestroyPublicKey. Using the key may allocat
e | |
| 7317 * pkcs11 slots and ID's. | |
| 7318 */ | |
| 7319 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); | |
| 7320 if (arena == NULL) { | |
| 7321 goto no_memory; | |
| 7322 } | |
| 7323 | |
| 7324 peerKey = PORT_ArenaZNew(arena, SECKEYPublicKey); | |
| 7325 if (peerKey == NULL) { | |
| 7326 goto no_memory; | |
| 7327 } | |
| 7328 | |
| 7329 peerKey->arena = arena; | |
| 7330 peerKey->keyType = rsaKey; | |
| 7331 peerKey->pkcs11Slot = NULL; | |
| 7332 peerKey->pkcs11ID = CK_INVALID_HANDLE; | |
| 7333 if (SECITEM_CopyItem(arena, &peerKey->u.rsa.modulus, &modulus) || | |
| 7334 SECITEM_CopyItem(arena, &peerKey->u.rsa.publicExponent, &exponen
t)) { | |
| 7335 goto no_memory; | |
| 7336 } | |
| 7337 ss->sec.peerKey = peerKey; | |
| 7338 ss->ssl3.hs.ws = wait_cert_request; | |
| 7339 return SECSuccess; | |
| 7340 } | |
| 7341 | |
| 7342 case kt_dh: { | |
| 7343 SECItem dh_p = { siBuffer, NULL, 0 }; | |
| 7344 SECItem dh_g = { siBuffer, NULL, 0 }; | |
| 7345 SECItem dh_Ys = { siBuffer, NULL, 0 }; | |
| 7346 unsigned dh_p_bits; | |
| 7347 unsigned dh_g_bits; | |
| 7348 unsigned dh_Ys_bits; | |
| 7349 PRInt32 minDH; | |
| 7350 | |
| 7351 rv = ssl3_ConsumeHandshakeVariable(ss, &dh_p, 2, &b, &length); | |
| 7352 if (rv != SECSuccess) { | |
| 7353 goto loser; /* malformed. */ | |
| 7354 } | |
| 7355 | |
| 7356 rv = NSS_OptionGet(NSS_DH_MIN_KEY_SIZE, &minDH); | |
| 7357 if (rv != SECSuccess) { | |
| 7358 minDH = SSL_DH_MIN_P_BITS; | |
| 7359 } | |
| 7360 dh_p_bits = SECKEY_BigIntegerBitLength(&dh_p); | |
| 7361 if (dh_p_bits < minDH) { | |
| 7362 errCode = SSL_ERROR_WEAK_SERVER_EPHEMERAL_DH_KEY; | |
| 7363 goto alert_loser; | |
| 7364 } | |
| 7365 rv = ssl3_ConsumeHandshakeVariable(ss, &dh_g, 2, &b, &length); | |
| 7366 if (rv != SECSuccess) { | |
| 7367 goto loser; /* malformed. */ | |
| 7368 } | |
| 7369 /* Abort if dh_g is 0, 1, or obviously too big. */ | |
| 7370 dh_g_bits = SECKEY_BigIntegerBitLength(&dh_g); | |
| 7371 if (dh_g_bits > dh_p_bits || dh_g_bits <= 1) | |
| 7372 goto alert_loser; | |
| 7373 rv = ssl3_ConsumeHandshakeVariable(ss, &dh_Ys, 2, &b, &length); | |
| 7374 if (rv != SECSuccess) { | |
| 7375 goto loser; /* malformed. */ | |
| 7376 } | |
| 7377 dh_Ys_bits = SECKEY_BigIntegerBitLength(&dh_Ys); | |
| 7378 if (dh_Ys_bits > dh_p_bits || dh_Ys_bits <= 1) | |
| 7379 goto alert_loser; | |
| 7380 if (isTLS12) { | |
| 7381 rv = ssl3_ConsumeSignatureAndHashAlgorithm(ss, &b, &length, | |
| 7382 &sigAndHash); | |
| 7383 if (rv != SECSuccess) { | |
| 7384 goto loser; /* malformed or unsupported. */ | |
| 7385 } | |
| 7386 rv = ssl3_CheckSignatureAndHashAlgorithmConsistency(ss, | |
| 7387 &sigAndHash,
ss->sec.peerCert); | |
| 7388 if (rv != SECSuccess) { | |
| 7389 goto loser; | |
| 7390 } | |
| 7391 } | |
| 7392 rv = ssl3_ConsumeHandshakeVariable(ss, &signature, 2, &b, &length); | |
| 7393 if (rv != SECSuccess) { | |
| 7394 goto loser; /* malformed. */ | |
| 7395 } | |
| 7396 if (length != 0) { | |
| 7397 if (isTLS) | |
| 7398 desc = | |
| 7399 decode_error; | |
| 7400 goto alert_loser; /* malformed. */ | |
| 7401 } | |
| 7402 | |
| 7403 PRINT_BUF(60, (NULL, "Server DH p", dh_p.data, dh_p.len)); | |
| 7404 PRINT_BUF(60, (NULL, "Server DH g", dh_g.data, dh_g.len)); | |
| 7405 PRINT_BUF(60, (NULL, "Server DH Ys", dh_Ys.data, dh_Ys.len)); | |
| 7406 | |
| 7407 /* failures after this point are not malformed handshakes. */ | |
| 7408 /* TLS: send decrypt_error if signature failed. */ | |
| 7409 desc = isTLS ? decrypt_error : handshake_failure; | |
| 7410 | |
| 7411 /* | |
| 7412 * check to make sure the hash is signed by right guy | |
| 7413 */ | |
| 7414 rv = ssl3_ComputeDHKeyHash(sigAndHash.hashAlg, dh_p, dh_g, dh_Ys, | |
| 7415 &ss->ssl3.hs.client_random, | |
| 7416 &ss->ssl3.hs.server_random, | |
| 7417 &hashes, ss->opt.bypassPKCS11); | |
| 7418 if (rv != SECSuccess) { | |
| 7419 errCode = | |
| 7420 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); | |
| 7421 goto alert_loser; | |
| 7422 } | |
| 7423 rv = ssl3_VerifySignedHashes(&hashes, ss->sec.peerCert, &signature, | |
| 7424 isTLS, ss->pkcs11PinArg); | |
| 7425 if (rv != SECSuccess) { | |
| 7426 errCode = | |
| 7427 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); | |
| 7428 goto alert_loser; | |
| 7429 } | |
| 7430 | |
| 7431 /* | |
| 7432 * we really need to build a new key here because we can no longer | |
| 7433 * ignore calling SECKEY_DestroyPublicKey. Using the key may allocat
e | |
| 7434 * pkcs11 slots and ID's. | |
| 7435 */ | |
| 7436 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); | |
| 7437 if (arena == NULL) { | |
| 7438 goto no_memory; | |
| 7439 } | |
| 7440 | |
| 7441 peerKey = PORT_ArenaZNew(arena, SECKEYPublicKey); | |
| 7442 if (peerKey == NULL) { | |
| 7443 goto no_memory; | |
| 7444 } | |
| 7445 | |
| 7446 peerKey->arena = arena; | |
| 7447 peerKey->keyType = dhKey; | |
| 7448 peerKey->pkcs11Slot = NULL; | |
| 7449 peerKey->pkcs11ID = CK_INVALID_HANDLE; | |
| 7450 | |
| 7451 if (SECITEM_CopyItem(arena, &peerKey->u.dh.prime, &dh_p) || | |
| 7452 SECITEM_CopyItem(arena, &peerKey->u.dh.base, &dh_g) || | |
| 7453 SECITEM_CopyItem(arena, &peerKey->u.dh.publicValue, &dh_Ys)) { | |
| 7454 goto no_memory; | |
| 7455 } | |
| 7456 ss->sec.peerKey = peerKey; | |
| 7457 ss->ssl3.hs.ws = wait_cert_request; | |
| 7458 return SECSuccess; | |
| 7459 } | |
| 7460 | |
| 7461 #ifndef NSS_DISABLE_ECC | |
| 7462 case kt_ecdh: | |
| 7463 rv = ssl3_HandleECDHServerKeyExchange(ss, b, length); | |
| 7464 return rv; | |
| 7465 #endif /* NSS_DISABLE_ECC */ | |
| 7466 | |
| 7467 default: | |
| 7468 desc = handshake_failure; | |
| 7469 errCode = SEC_ERROR_UNSUPPORTED_KEYALG; | |
| 7470 break; /* goto alert_loser; */ | |
| 7471 } | |
| 7472 | |
| 7473 alert_loser: | |
| 7474 (void)SSL3_SendAlert(ss, alert_fatal, desc); | |
| 7475 loser: | |
| 7476 if (arena) { | |
| 7477 PORT_FreeArena(arena, PR_FALSE); | |
| 7478 } | |
| 7479 PORT_SetError(errCode); | |
| 7480 return SECFailure; | |
| 7481 | |
| 7482 no_memory: /* no-memory error has already been set. */ | |
| 7483 if (arena) { | |
| 7484 PORT_FreeArena(arena, PR_FALSE); | |
| 7485 } | |
| 7486 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); | |
| 7487 return SECFailure; | |
| 7488 } | |
| 7489 | |
| 7490 /* | |
| 7491 * Returns the TLS signature algorithm for the client authentication key and | |
| 7492 * whether it is an RSA or DSA key that may be able to sign only SHA-1 hashes. | |
| 7493 */ | |
| 7494 static SECStatus | |
| 7495 ssl3_ExtractClientKeyInfo(sslSocket *ss, | |
| 7496 SSLSignType *sigAlg, | |
| 7497 PRBool *preferSha1) | |
| 7498 { | |
| 7499 SECStatus rv = SECSuccess; | |
| 7500 SECKEYPublicKey *pubk; | |
| 7501 | |
| 7502 pubk = CERT_ExtractPublicKey(ss->ssl3.clientCertificate); | |
| 7503 if (pubk == NULL) { | |
| 7504 rv = SECFailure; | |
| 7505 goto done; | |
| 7506 } | |
| 7507 | |
| 7508 rv = ssl3_TLSSignatureAlgorithmForKeyType(pubk->keyType, sigAlg); | |
| 7509 if (rv != SECSuccess) { | |
| 7510 goto done; | |
| 7511 } | |
| 7512 | |
| 7513 /* If the key is a 1024-bit RSA or DSA key, assume conservatively that | |
| 7514 * it may be unable to sign SHA-256 hashes. This is the case for older | |
| 7515 * Estonian ID cards that have 1024-bit RSA keys. In FIPS 186-2 and | |
| 7516 * older, DSA key size is at most 1024 bits and the hash function must | |
| 7517 * be SHA-1. | |
| 7518 */ | |
| 7519 if (pubk->keyType == rsaKey || pubk->keyType == dsaKey) { | |
| 7520 *preferSha1 = SECKEY_PublicKeyStrength(pubk) <= 128; | |
| 7521 } else { | |
| 7522 *preferSha1 = PR_FALSE; | |
| 7523 } | |
| 7524 | |
| 7525 done: | |
| 7526 if (pubk) | |
| 7527 SECKEY_DestroyPublicKey(pubk); | |
| 7528 return rv; | |
| 7529 } | |
| 7530 | |
| 7531 /* Destroys the backup handshake hash context if we don't need it. Note that | |
| 7532 * this function selects the hash algorithm for client authentication | |
| 7533 * signatures; ssl3_SendCertificateVerify uses the presence of the backup hash | |
| 7534 * to determine whether to use SHA-1 or SHA-256. */ | |
| 7535 static void | |
| 7536 ssl3_DestroyBackupHandshakeHashIfNotNeeded(sslSocket *ss, | |
| 7537 const SECItem *algorithms) | |
| 7538 { | |
| 7539 SECStatus rv; | |
| 7540 SSLSignType sigAlg; | |
| 7541 PRBool preferSha1 = PR_FALSE; | |
| 7542 PRBool supportsSha1 = PR_FALSE; | |
| 7543 PRBool supportsSha256 = PR_FALSE; | |
| 7544 PRBool needBackupHash = PR_FALSE; | |
| 7545 unsigned int i; | |
| 7546 | |
| 7547 #ifndef NO_PKCS11_BYPASS | |
| 7548 /* Backup handshake hash is not supported in PKCS #11 bypass mode. */ | |
| 7549 if (ss->opt.bypassPKCS11) { | |
| 7550 PORT_Assert(!ss->ssl3.hs.backupHash); | |
| 7551 return; | |
| 7552 } | |
| 7553 #endif | |
| 7554 PORT_Assert(ss->ssl3.hs.backupHash); | |
| 7555 | |
| 7556 /* Determine the key's signature algorithm and whether it prefers SHA-1. */ | |
| 7557 rv = ssl3_ExtractClientKeyInfo(ss, &sigAlg, &preferSha1); | |
| 7558 if (rv != SECSuccess) { | |
| 7559 goto done; | |
| 7560 } | |
| 7561 | |
| 7562 /* Determine the server's hash support for that signature algorithm. */ | |
| 7563 for (i = 0; i < algorithms->len; i += 2) { | |
| 7564 if (algorithms->data[i + 1] == sigAlg) { | |
| 7565 if (algorithms->data[i] == ssl_hash_sha1) { | |
| 7566 supportsSha1 = PR_TRUE; | |
| 7567 } else if (algorithms->data[i] == ssl_hash_sha256) { | |
| 7568 supportsSha256 = PR_TRUE; | |
| 7569 } | |
| 7570 } | |
| 7571 } | |
| 7572 | |
| 7573 /* If either the server does not support SHA-256 or the client key prefers | |
| 7574 * SHA-1, leave the backup hash. */ | |
| 7575 if (supportsSha1 && (preferSha1 || !supportsSha256)) { | |
| 7576 needBackupHash = PR_TRUE; | |
| 7577 } | |
| 7578 | |
| 7579 done: | |
| 7580 if (!needBackupHash) { | |
| 7581 PK11_DestroyContext(ss->ssl3.hs.backupHash, PR_TRUE); | |
| 7582 ss->ssl3.hs.backupHash = NULL; | |
| 7583 } | |
| 7584 } | |
| 7585 | |
| 7586 typedef struct dnameNode { | |
| 7587 struct dnameNode *next; | |
| 7588 SECItem name; | |
| 7589 } dnameNode; | |
| 7590 | |
| 7591 /* | |
| 7592 * Parse the ca_list structure in a CertificateRequest. | |
| 7593 * | |
| 7594 * Called from: | |
| 7595 * ssl3_HandleCertificateRequest | |
| 7596 * tls13_HandleCertificateRequest | |
| 7597 */ | |
| 7598 SECStatus | |
| 7599 ssl3_ParseCertificateRequestCAs(sslSocket *ss, SSL3Opaque **b, PRUint32 *length, | |
| 7600 PLArenaPool *arena, CERTDistNames *ca_list) | |
| 7601 { | |
| 7602 PRInt32 remaining; | |
| 7603 int nnames = 0; | |
| 7604 dnameNode *node; | |
| 7605 int i; | |
| 7606 | |
| 7607 remaining = ssl3_ConsumeHandshakeNumber(ss, 2, b, length); | |
| 7608 if (remaining < 0) | |
| 7609 return SECFailure; /* malformed, alert has been sent */ | |
| 7610 | |
| 7611 if ((PRUint32)remaining > *length) | |
| 7612 goto alert_loser; | |
| 7613 | |
| 7614 ca_list->head = node = PORT_ArenaZNew(arena, dnameNode); | |
| 7615 if (node == NULL) | |
| 7616 goto no_mem; | |
| 7617 | |
| 7618 while (remaining > 0) { | |
| 7619 PRInt32 len; | |
| 7620 | |
| 7621 if (remaining < 2) | |
| 7622 goto alert_loser; /* malformed */ | |
| 7623 | |
| 7624 node->name.len = len = ssl3_ConsumeHandshakeNumber(ss, 2, b, length); | |
| 7625 if (len <= 0) | |
| 7626 return SECFailure; /* malformed, alert has been sent */ | |
| 7627 | |
| 7628 remaining -= 2; | |
| 7629 if (remaining < len) | |
| 7630 goto alert_loser; /* malformed */ | |
| 7631 | |
| 7632 node->name.data = *b; | |
| 7633 *b += len; | |
| 7634 *length -= len; | |
| 7635 remaining -= len; | |
| 7636 nnames++; | |
| 7637 if (remaining <= 0) | |
| 7638 break; /* success */ | |
| 7639 | |
| 7640 node->next = PORT_ArenaZNew(arena, dnameNode); | |
| 7641 node = node->next; | |
| 7642 if (node == NULL) | |
| 7643 goto no_mem; | |
| 7644 } | |
| 7645 | |
| 7646 ca_list->nnames = nnames; | |
| 7647 ca_list->names = PORT_ArenaNewArray(arena, SECItem, nnames); | |
| 7648 if (nnames > 0 && ca_list->names == NULL) | |
| 7649 goto no_mem; | |
| 7650 | |
| 7651 for (i = 0, node = (dnameNode *)ca_list->head; | |
| 7652 i < nnames; | |
| 7653 i++, node = node->next) { | |
| 7654 ca_list->names[i] = node->name; | |
| 7655 } | |
| 7656 | |
| 7657 return SECSuccess; | |
| 7658 | |
| 7659 no_mem: | |
| 7660 PORT_SetError(SEC_ERROR_NO_MEMORY); | |
| 7661 return SECFailure; | |
| 7662 | |
| 7663 alert_loser: | |
| 7664 (void)SSL3_SendAlert(ss, alert_fatal, | |
| 7665 ss->version < SSL_LIBRARY_VERSION_TLS_1_0 ? illegal_par
ameter | |
| 7666 : decode_erro
r); | |
| 7667 PORT_SetError(SSL_ERROR_RX_MALFORMED_CERT_REQUEST); | |
| 7668 return SECFailure; | |
| 7669 } | |
| 7670 | |
| 7671 /* Called from ssl3_HandlePostHelloHandshakeMessage() when it has deciphered | |
| 7672 * a complete ssl3 Certificate Request message. | |
| 7673 * Caller must hold Handshake and RecvBuf locks. | |
| 7674 */ | |
| 7675 static SECStatus | |
| 7676 ssl3_HandleCertificateRequest(sslSocket *ss, SSL3Opaque *b, PRUint32 length) | |
| 7677 { | |
| 7678 PLArenaPool *arena = NULL; | |
| 7679 PRBool isTLS = PR_FALSE; | |
| 7680 PRBool isTLS12 = PR_FALSE; | |
| 7681 int errCode = SSL_ERROR_RX_MALFORMED_CERT_REQUEST; | |
| 7682 SECStatus rv; | |
| 7683 SSL3AlertDescription desc = illegal_parameter; | |
| 7684 SECItem cert_types = { siBuffer, NULL, 0 }; | |
| 7685 SECItem algorithms = { siBuffer, NULL, 0 }; | |
| 7686 CERTDistNames ca_list; | |
| 7687 | |
| 7688 SSL_TRC(3, ("%d: SSL3[%d]: handle certificate_request handshake", | |
| 7689 SSL_GETPID(), ss->fd)); | |
| 7690 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 7691 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 7692 | |
| 7693 if (ss->ssl3.hs.ws != wait_cert_request) { | |
| 7694 desc = unexpected_message; | |
| 7695 errCode = SSL_ERROR_RX_UNEXPECTED_CERT_REQUEST; | |
| 7696 goto alert_loser; | |
| 7697 } | |
| 7698 | |
| 7699 PORT_Assert(ss->ssl3.clientCertChain == NULL); | |
| 7700 PORT_Assert(ss->ssl3.clientCertificate == NULL); | |
| 7701 PORT_Assert(ss->ssl3.clientPrivateKey == NULL); | |
| 7702 | |
| 7703 isTLS = (PRBool)(ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0); | |
| 7704 isTLS12 = (PRBool)(ss->ssl3.prSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); | |
| 7705 rv = ssl3_ConsumeHandshakeVariable(ss, &cert_types, 1, &b, &length); | |
| 7706 if (rv != SECSuccess) | |
| 7707 goto loser; /* malformed, alert has been sent */ | |
| 7708 | |
| 7709 PORT_Assert(!ss->requestedCertTypes); | |
| 7710 ss->requestedCertTypes = &cert_types; | |
| 7711 | |
| 7712 if (isTLS12) { | |
| 7713 rv = ssl3_ConsumeHandshakeVariable(ss, &algorithms, 2, &b, &length); | |
| 7714 if (rv != SECSuccess) | |
| 7715 goto loser; /* malformed, alert has been sent */ | |
| 7716 /* An empty or odd-length value is invalid. | |
| 7717 * SignatureAndHashAlgorithm | |
| 7718 * supported_signature_algorithms<2..2^16-2>; | |
| 7719 */ | |
| 7720 if (algorithms.len == 0 || (algorithms.len & 1) != 0) | |
| 7721 goto alert_loser; | |
| 7722 } | |
| 7723 | |
| 7724 arena = ca_list.arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); | |
| 7725 if (arena == NULL) | |
| 7726 goto no_mem; | |
| 7727 | |
| 7728 rv = ssl3_ParseCertificateRequestCAs(ss, &b, &length, arena, &ca_list); | |
| 7729 if (rv != SECSuccess) | |
| 7730 goto done; /* alert sent in ssl3_ParseCertificateRequestCAs */ | |
| 7731 | |
| 7732 if (length != 0) | |
| 7733 goto alert_loser; /* malformed */ | |
| 7734 | |
| 7735 desc = no_certificate; | |
| 7736 | |
| 7737 ss->ssl3.hs.ws = wait_hello_done; | |
| 7738 | |
| 7739 rv = ssl3_CompleteHandleCertificateRequest(ss, &algorithms, &ca_list); | |
| 7740 if (rv == SECFailure) { | |
| 7741 PORT_Assert(0); | |
| 7742 errCode = SEC_ERROR_LIBRARY_FAILURE; | |
| 7743 desc = internal_error; | |
| 7744 goto alert_loser; | |
| 7745 } | |
| 7746 goto done; | |
| 7747 | |
| 7748 no_mem: | |
| 7749 rv = SECFailure; | |
| 7750 PORT_SetError(SEC_ERROR_NO_MEMORY); | |
| 7751 goto done; | |
| 7752 | |
| 7753 alert_loser: | |
| 7754 if (isTLS && desc == illegal_parameter) | |
| 7755 desc = decode_error; | |
| 7756 (void)SSL3_SendAlert(ss, alert_fatal, desc); | |
| 7757 loser: | |
| 7758 PORT_SetError(errCode); | |
| 7759 rv = SECFailure; | |
| 7760 done: | |
| 7761 ss->requestedCertTypes = NULL; | |
| 7762 if (arena != NULL) | |
| 7763 PORT_FreeArena(arena, PR_FALSE); | |
| 7764 return rv; | |
| 7765 } | |
| 7766 | |
| 7767 SECStatus | |
| 7768 ssl3_CompleteHandleCertificateRequest(sslSocket *ss, SECItem *algorithms, | |
| 7769 CERTDistNames *ca_list) | |
| 7770 { | |
| 7771 SECStatus rv; | |
| 7772 | |
| 7773 if (ss->getClientAuthData != NULL) { | |
| 7774 PORT_Assert((ss->ssl3.hs.preliminaryInfo & ssl_preinfo_all) == | |
| 7775 ssl_preinfo_all); | |
| 7776 /* XXX Should pass cert_types and algorithms in this call!! */ | |
| 7777 rv = (SECStatus)(*ss->getClientAuthData)(ss->getClientAuthDataArg, | |
| 7778 ss->fd, ca_list, | |
| 7779 &ss->ssl3.clientCertificate, | |
| 7780 &ss->ssl3.clientPrivateKey); | |
| 7781 } else { | |
| 7782 rv = SECFailure; /* force it to send a no_certificate alert */ | |
| 7783 } | |
| 7784 switch (rv) { | |
| 7785 case SECWouldBlock: /* getClientAuthData has put up a dialog box. */ | |
| 7786 ssl3_SetAlwaysBlock(ss); | |
| 7787 break; /* not an error */ | |
| 7788 | |
| 7789 case SECSuccess: | |
| 7790 /* check what the callback function returned */ | |
| 7791 if ((!ss->ssl3.clientCertificate) || (!ss->ssl3.clientPrivateKey)) { | |
| 7792 /* we are missing either the key or cert */ | |
| 7793 if (ss->ssl3.clientCertificate) { | |
| 7794 /* got a cert, but no key - free it */ | |
| 7795 CERT_DestroyCertificate(ss->ssl3.clientCertificate); | |
| 7796 ss->ssl3.clientCertificate = NULL; | |
| 7797 } | |
| 7798 if (ss->ssl3.clientPrivateKey) { | |
| 7799 /* got a key, but no cert - free it */ | |
| 7800 SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); | |
| 7801 ss->ssl3.clientPrivateKey = NULL; | |
| 7802 } | |
| 7803 goto send_no_certificate; | |
| 7804 } | |
| 7805 /* Setting ssl3.clientCertChain non-NULL will cause | |
| 7806 * ssl3_HandleServerHelloDone to call SendCertificate. | |
| 7807 */ | |
| 7808 ss->ssl3.clientCertChain = CERT_CertChainFromCert( | |
| 7809 ss->ssl3.clientCertificate, | |
| 7810 certUsageSSLClient, PR_FALSE); | |
| 7811 if (ss->ssl3.clientCertChain == NULL) { | |
| 7812 CERT_DestroyCertificate(ss->ssl3.clientCertificate); | |
| 7813 ss->ssl3.clientCertificate = NULL; | |
| 7814 SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); | |
| 7815 ss->ssl3.clientPrivateKey = NULL; | |
| 7816 goto send_no_certificate; | |
| 7817 } | |
| 7818 if (ss->ssl3.hs.hashType == handshake_hash_single) { | |
| 7819 ssl3_DestroyBackupHandshakeHashIfNotNeeded(ss, algorithms); | |
| 7820 } | |
| 7821 break; /* not an error */ | |
| 7822 | |
| 7823 case SECFailure: | |
| 7824 default: | |
| 7825 send_no_certificate: | |
| 7826 if (ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0) { | |
| 7827 ss->ssl3.sendEmptyCert = PR_TRUE; | |
| 7828 } else { | |
| 7829 (void)SSL3_SendAlert(ss, alert_warning, no_certificate); | |
| 7830 } | |
| 7831 rv = SECSuccess; | |
| 7832 break; | |
| 7833 } | |
| 7834 | |
| 7835 return rv; | |
| 7836 } | |
| 7837 | |
| 7838 /* | |
| 7839 * attempt to restart the handshake after asynchronously handling | |
| 7840 * a request for the client's certificate. | |
| 7841 * | |
| 7842 * inputs: | |
| 7843 * cert Client cert chosen by application. | |
| 7844 * Note: ssl takes this reference, and does not bump the | |
| 7845 * reference count. The caller should drop its reference | |
| 7846 * without calling CERT_DestroyCert after calling this function. | |
| 7847 * | |
| 7848 * key Private key associated with cert. This function takes | |
| 7849 * ownership of the private key, so the caller should drop its | |
| 7850 * reference without destroying the private key after this | |
| 7851 * function returns. | |
| 7852 * | |
| 7853 * certChain DER-encoded certs, client cert and its signers. | |
| 7854 * Note: ssl takes this reference, and does not copy the chain. | |
| 7855 * The caller should drop its reference without destroying the | |
| 7856 * chain. SSL will free the chain when it is done with it. | |
| 7857 * | |
| 7858 * Return value: XXX | |
| 7859 * | |
| 7860 * XXX This code only works on the initial handshake on a connection, XXX | |
| 7861 * It does not work on a subsequent handshake (redo). | |
| 7862 * | |
| 7863 * Caller holds 1stHandshakeLock. | |
| 7864 */ | |
| 7865 SECStatus | |
| 7866 ssl3_RestartHandshakeAfterCertReq(sslSocket *ss, | |
| 7867 CERTCertificate *cert, | |
| 7868 SECKEYPrivateKey *key, | |
| 7869 CERTCertificateList *certChain) | |
| 7870 { | |
| 7871 SECStatus rv = SECSuccess; | |
| 7872 | |
| 7873 /* XXX This code only works on the initial handshake on a connection, | |
| 7874 ** XXX It does not work on a subsequent handshake (redo). | |
| 7875 */ | |
| 7876 if (ss->handshake != 0) { | |
| 7877 ss->handshake = ssl_GatherRecord1stHandshake; | |
| 7878 ss->ssl3.clientCertificate = cert; | |
| 7879 ss->ssl3.clientPrivateKey = key; | |
| 7880 ss->ssl3.clientCertChain = certChain; | |
| 7881 if (!cert || !key || !certChain) { | |
| 7882 /* we are missing the key, cert, or cert chain */ | |
| 7883 if (ss->ssl3.clientCertificate) { | |
| 7884 CERT_DestroyCertificate(ss->ssl3.clientCertificate); | |
| 7885 ss->ssl3.clientCertificate = NULL; | |
| 7886 } | |
| 7887 if (ss->ssl3.clientPrivateKey) { | |
| 7888 SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); | |
| 7889 ss->ssl3.clientPrivateKey = NULL; | |
| 7890 } | |
| 7891 if (ss->ssl3.clientCertChain != NULL) { | |
| 7892 CERT_DestroyCertificateList(ss->ssl3.clientCertChain); | |
| 7893 ss->ssl3.clientCertChain = NULL; | |
| 7894 } | |
| 7895 if (ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0) { | |
| 7896 ss->ssl3.sendEmptyCert = PR_TRUE; | |
| 7897 } else { | |
| 7898 (void)SSL3_SendAlert(ss, alert_warning, no_certificate); | |
| 7899 } | |
| 7900 } | |
| 7901 } else { | |
| 7902 if (cert) { | |
| 7903 CERT_DestroyCertificate(cert); | |
| 7904 } | |
| 7905 if (key) { | |
| 7906 SECKEY_DestroyPrivateKey(key); | |
| 7907 } | |
| 7908 if (certChain) { | |
| 7909 CERT_DestroyCertificateList(certChain); | |
| 7910 } | |
| 7911 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 7912 rv = SECFailure; | |
| 7913 } | |
| 7914 return rv; | |
| 7915 } | |
| 7916 | |
| 7917 static SECStatus | |
| 7918 ssl3_CheckFalseStart(sslSocket *ss) | |
| 7919 { | |
| 7920 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 7921 PORT_Assert(!ss->ssl3.hs.authCertificatePending); | |
| 7922 PORT_Assert(!ss->ssl3.hs.canFalseStart); | |
| 7923 | |
| 7924 if (!ss->canFalseStartCallback) { | |
| 7925 SSL_TRC(3, ("%d: SSL[%d]: no false start callback so no false start", | |
| 7926 SSL_GETPID(), ss->fd)); | |
| 7927 } else { | |
| 7928 PRBool maybeFalseStart; | |
| 7929 SECStatus rv; | |
| 7930 | |
| 7931 /* An attacker can control the selected ciphersuite so we only wish to | |
| 7932 * do False Start in the case that the selected ciphersuite is | |
| 7933 * sufficiently strong that the attack can gain no advantage. | |
| 7934 * Therefore we always require an 80-bit cipher. */ | |
| 7935 ssl_GetSpecReadLock(ss); | |
| 7936 maybeFalseStart = ss->ssl3.cwSpec->cipher_def->secret_key_size >= 10; | |
| 7937 ssl_ReleaseSpecReadLock(ss); | |
| 7938 | |
| 7939 if (!maybeFalseStart) { | |
| 7940 SSL_TRC(3, ("%d: SSL[%d]: no false start due to weak cipher", | |
| 7941 SSL_GETPID(), ss->fd)); | |
| 7942 } else { | |
| 7943 PORT_Assert((ss->ssl3.hs.preliminaryInfo & ssl_preinfo_all) == | |
| 7944 ssl_preinfo_all); | |
| 7945 rv = (ss->canFalseStartCallback)(ss->fd, | |
| 7946 ss->canFalseStartCallbackData, | |
| 7947 &ss->ssl3.hs.canFalseStart); | |
| 7948 if (rv == SECSuccess) { | |
| 7949 SSL_TRC(3, ("%d: SSL[%d]: false start callback returned %s", | |
| 7950 SSL_GETPID(), ss->fd, | |
| 7951 ss->ssl3.hs.canFalseStart ? "TRUE" | |
| 7952 : "FALSE")); | |
| 7953 } else { | |
| 7954 SSL_TRC(3, ("%d: SSL[%d]: false start callback failed (%s)", | |
| 7955 SSL_GETPID(), ss->fd, | |
| 7956 PR_ErrorToName(PR_GetError()))); | |
| 7957 } | |
| 7958 return rv; | |
| 7959 } | |
| 7960 } | |
| 7961 | |
| 7962 ss->ssl3.hs.canFalseStart = PR_FALSE; | |
| 7963 return SECSuccess; | |
| 7964 } | |
| 7965 | |
| 7966 PRBool | |
| 7967 ssl3_WaitingForServerSecondRound(sslSocket *ss) | |
| 7968 { | |
| 7969 PRBool result; | |
| 7970 | |
| 7971 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 7972 | |
| 7973 switch (ss->ssl3.hs.ws) { | |
| 7974 case wait_new_session_ticket: | |
| 7975 case wait_change_cipher: | |
| 7976 case wait_finished: | |
| 7977 result = PR_TRUE; | |
| 7978 break; | |
| 7979 default: | |
| 7980 result = PR_FALSE; | |
| 7981 break; | |
| 7982 } | |
| 7983 | |
| 7984 return result; | |
| 7985 } | |
| 7986 | |
| 7987 static SECStatus ssl3_SendClientSecondRound(sslSocket *ss); | |
| 7988 | |
| 7989 /* Called from ssl3_HandlePostHelloHandshakeMessage() when it has deciphered | |
| 7990 * a complete ssl3 Server Hello Done message. | |
| 7991 * Caller must hold Handshake and RecvBuf locks. | |
| 7992 */ | |
| 7993 static SECStatus | |
| 7994 ssl3_HandleServerHelloDone(sslSocket *ss) | |
| 7995 { | |
| 7996 SECStatus rv; | |
| 7997 SSL3WaitState ws = ss->ssl3.hs.ws; | |
| 7998 | |
| 7999 SSL_TRC(3, ("%d: SSL3[%d]: handle server_hello_done handshake", | |
| 8000 SSL_GETPID(), ss->fd)); | |
| 8001 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 8002 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 8003 | |
| 8004 /* Skipping CertificateRequest is always permitted. */ | |
| 8005 if (ws != wait_hello_done && | |
| 8006 ws != wait_cert_request) { | |
| 8007 SSL3_SendAlert(ss, alert_fatal, unexpected_message); | |
| 8008 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HELLO_DONE); | |
| 8009 return SECFailure; | |
| 8010 } | |
| 8011 | |
| 8012 rv = ssl3_SendClientSecondRound(ss); | |
| 8013 | |
| 8014 return rv; | |
| 8015 } | |
| 8016 | |
| 8017 /* Called from ssl3_HandleServerHelloDone and ssl3_AuthCertificateComplete. | |
| 8018 * | |
| 8019 * Caller must hold Handshake and RecvBuf locks. | |
| 8020 */ | |
| 8021 static SECStatus | |
| 8022 ssl3_SendClientSecondRound(sslSocket *ss) | |
| 8023 { | |
| 8024 SECStatus rv; | |
| 8025 PRBool sendClientCert; | |
| 8026 | |
| 8027 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 8028 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 8029 | |
| 8030 sendClientCert = !ss->ssl3.sendEmptyCert && | |
| 8031 ss->ssl3.clientCertChain != NULL && | |
| 8032 ss->ssl3.clientPrivateKey != NULL; | |
| 8033 | |
| 8034 if (!sendClientCert && | |
| 8035 ss->ssl3.hs.hashType == handshake_hash_single && | |
| 8036 ss->ssl3.hs.backupHash) { | |
| 8037 /* Don't need the backup handshake hash. */ | |
| 8038 PK11_DestroyContext(ss->ssl3.hs.backupHash, PR_TRUE); | |
| 8039 ss->ssl3.hs.backupHash = NULL; | |
| 8040 } | |
| 8041 | |
| 8042 /* We must wait for the server's certificate to be authenticated before | |
| 8043 * sending the client certificate in order to disclosing the client | |
| 8044 * certificate to an attacker that does not have a valid cert for the | |
| 8045 * domain we are connecting to. | |
| 8046 * | |
| 8047 * XXX: We should do the same for the NPN extension, but for that we | |
| 8048 * need an option to give the application the ability to leak the NPN | |
| 8049 * information to get better performance. | |
| 8050 * | |
| 8051 * During the initial handshake on a connection, we never send/receive | |
| 8052 * application data until we have authenticated the server's certificate; | |
| 8053 * i.e. we have fully authenticated the handshake before using the cipher | |
| 8054 * specs agreed upon for that handshake. During a renegotiation, we may | |
| 8055 * continue sending and receiving application data during the handshake | |
| 8056 * interleaved with the handshake records. If we were to send the client's | |
| 8057 * second round for a renegotiation before the server's certificate was | |
| 8058 * authenticated, then the application data sent/received after this point | |
| 8059 * would be using cipher spec that hadn't been authenticated. By waiting | |
| 8060 * until the server's certificate has been authenticated during | |
| 8061 * renegotiations, we ensure that renegotiations have the same property | |
| 8062 * as initial handshakes; i.e. we have fully authenticated the handshake | |
| 8063 * before using the cipher specs agreed upon for that handshake for | |
| 8064 * application data. | |
| 8065 */ | |
| 8066 if (ss->ssl3.hs.restartTarget) { | |
| 8067 PR_NOT_REACHED("unexpected ss->ssl3.hs.restartTarget"); | |
| 8068 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 8069 return SECFailure; | |
| 8070 } | |
| 8071 if (ss->ssl3.hs.authCertificatePending && | |
| 8072 (sendClientCert || ss->ssl3.sendEmptyCert || ss->firstHsDone)) { | |
| 8073 SSL_TRC(3, ("%d: SSL3[%p]: deferring ssl3_SendClientSecondRound because" | |
| 8074 " certificate authentication is still pending.", | |
| 8075 SSL_GETPID(), ss->fd)); | |
| 8076 ss->ssl3.hs.restartTarget = ssl3_SendClientSecondRound; | |
| 8077 return SECWouldBlock; | |
| 8078 } | |
| 8079 | |
| 8080 ssl_GetXmitBufLock(ss); /*******************************/ | |
| 8081 | |
| 8082 if (ss->ssl3.sendEmptyCert) { | |
| 8083 ss->ssl3.sendEmptyCert = PR_FALSE; | |
| 8084 rv = ssl3_SendEmptyCertificate(ss); | |
| 8085 /* Don't send verify */ | |
| 8086 if (rv != SECSuccess) { | |
| 8087 goto loser; /* error code is set. */ | |
| 8088 } | |
| 8089 } else if (sendClientCert) { | |
| 8090 rv = ssl3_SendCertificate(ss); | |
| 8091 if (rv != SECSuccess) { | |
| 8092 goto loser; /* error code is set. */ | |
| 8093 } | |
| 8094 } | |
| 8095 | |
| 8096 rv = ssl3_SendClientKeyExchange(ss); | |
| 8097 if (rv != SECSuccess) { | |
| 8098 goto loser; /* err is set. */ | |
| 8099 } | |
| 8100 | |
| 8101 if (sendClientCert) { | |
| 8102 rv = ssl3_SendCertificateVerify(ss, ss->ssl3.clientPrivateKey); | |
| 8103 SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); | |
| 8104 ss->ssl3.clientPrivateKey = NULL; | |
| 8105 if (rv != SECSuccess) { | |
| 8106 goto loser; /* err is set. */ | |
| 8107 } | |
| 8108 } | |
| 8109 | |
| 8110 rv = ssl3_SendChangeCipherSpecs(ss); | |
| 8111 if (rv != SECSuccess) { | |
| 8112 goto loser; /* err code was set. */ | |
| 8113 } | |
| 8114 | |
| 8115 /* This must be done after we've set ss->ssl3.cwSpec in | |
| 8116 * ssl3_SendChangeCipherSpecs because SSL_GetChannelInfo uses information | |
| 8117 * from cwSpec. This must be done before we call ssl3_CheckFalseStart | |
| 8118 * because the false start callback (if any) may need the information from | |
| 8119 * the functions that depend on this being set. | |
| 8120 */ | |
| 8121 ss->enoughFirstHsDone = PR_TRUE; | |
| 8122 | |
| 8123 if (!ss->firstHsDone) { | |
| 8124 /* XXX: If the server's certificate hasn't been authenticated by this | |
| 8125 * point, then we may be leaking this NPN message to an attacker. | |
| 8126 */ | |
| 8127 rv = ssl3_SendNextProto(ss); | |
| 8128 if (rv != SECSuccess) { | |
| 8129 goto loser; /* err code was set. */ | |
| 8130 } | |
| 8131 } | |
| 8132 | |
| 8133 rv = ssl3_SendChannelIDEncryptedExtensions(ss); | |
| 8134 if (rv != SECSuccess) { | |
| 8135 goto loser; /* err code was set. */ | |
| 8136 } | |
| 8137 | |
| 8138 if (!ss->firstHsDone) { | |
| 8139 if (ss->opt.enableFalseStart) { | |
| 8140 if (!ss->ssl3.hs.authCertificatePending) { | |
| 8141 /* When we fix bug 589047, we will need to know whether we are | |
| 8142 * false starting before we try to flush the client second | |
| 8143 * round to the network. With that in mind, we purposefully | |
| 8144 * call ssl3_CheckFalseStart before calling ssl3_SendFinished, | |
| 8145 * which includes a call to ssl3_FlushHandshake, so that | |
| 8146 * no application develops a reliance on such flushing being | |
| 8147 * done before its false start callback is called. | |
| 8148 */ | |
| 8149 ssl_ReleaseXmitBufLock(ss); | |
| 8150 rv = ssl3_CheckFalseStart(ss); | |
| 8151 ssl_GetXmitBufLock(ss); | |
| 8152 if (rv != SECSuccess) { | |
| 8153 goto loser; | |
| 8154 } | |
| 8155 } else { | |
| 8156 /* The certificate authentication and the server's Finished | |
| 8157 * message are racing each other. If the certificate | |
| 8158 * authentication wins, then we will try to false start in | |
| 8159 * ssl3_AuthCertificateComplete. | |
| 8160 */ | |
| 8161 SSL_TRC(3, ("%d: SSL3[%p]: deferring false start check because" | |
| 8162 " certificate authentication is still pending.", | |
| 8163 SSL_GETPID(), ss->fd)); | |
| 8164 } | |
| 8165 } | |
| 8166 } | |
| 8167 | |
| 8168 rv = ssl3_SendFinished(ss, 0); | |
| 8169 if (rv != SECSuccess) { | |
| 8170 goto loser; /* err code was set. */ | |
| 8171 } | |
| 8172 | |
| 8173 ssl_ReleaseXmitBufLock(ss); /*******************************/ | |
| 8174 | |
| 8175 if (!ss->ssl3.hs.isResuming && | |
| 8176 ssl3_ExtensionNegotiated(ss, ssl_channel_id_xtn)) { | |
| 8177 /* If we are negotiating ChannelID on a full handshake then we record | |
| 8178 * the handshake hashes in |sid| at this point. They will be needed in | |
| 8179 * the event that we resume this session and use ChannelID on the | |
| 8180 * resumption handshake. */ | |
| 8181 SSL3Hashes hashes; | |
| 8182 SECItem *originalHandshakeHash = | |
| 8183 &ss->sec.ci.sid->u.ssl3.originalHandshakeHash; | |
| 8184 PORT_Assert(ss->sec.ci.sid->cached == never_cached); | |
| 8185 | |
| 8186 ssl_GetSpecReadLock(ss); | |
| 8187 PORT_Assert(ss->version > SSL_LIBRARY_VERSION_3_0); | |
| 8188 rv = ssl3_ComputeHandshakeHashes(ss, ss->ssl3.cwSpec, &hashes, 0); | |
| 8189 ssl_ReleaseSpecReadLock(ss); | |
| 8190 if (rv != SECSuccess) { | |
| 8191 return rv; | |
| 8192 } | |
| 8193 | |
| 8194 PORT_Assert(originalHandshakeHash->len == 0); | |
| 8195 originalHandshakeHash->data = PORT_Alloc(hashes.len); | |
| 8196 if (!originalHandshakeHash->data) | |
| 8197 return SECFailure; | |
| 8198 originalHandshakeHash->len = hashes.len; | |
| 8199 memcpy(originalHandshakeHash->data, hashes.u.raw, hashes.len); | |
| 8200 } | |
| 8201 | |
| 8202 if (ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn)) | |
| 8203 ss->ssl3.hs.ws = wait_new_session_ticket; | |
| 8204 else | |
| 8205 ss->ssl3.hs.ws = wait_change_cipher; | |
| 8206 | |
| 8207 PORT_Assert(ssl3_WaitingForServerSecondRound(ss)); | |
| 8208 | |
| 8209 return SECSuccess; | |
| 8210 | |
| 8211 loser: | |
| 8212 ssl_ReleaseXmitBufLock(ss); | |
| 8213 return rv; | |
| 8214 } | |
| 8215 | |
| 8216 /* | |
| 8217 * Routines used by servers | |
| 8218 */ | |
| 8219 static SECStatus | |
| 8220 ssl3_SendHelloRequest(sslSocket *ss) | |
| 8221 { | |
| 8222 SECStatus rv; | |
| 8223 | |
| 8224 SSL_TRC(3, ("%d: SSL3[%d]: send hello_request handshake", SSL_GETPID(), | |
| 8225 ss->fd)); | |
| 8226 | |
| 8227 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 8228 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | |
| 8229 | |
| 8230 rv = ssl3_AppendHandshakeHeader(ss, hello_request, 0); | |
| 8231 if (rv != SECSuccess) { | |
| 8232 return rv; /* err set by AppendHandshake */ | |
| 8233 } | |
| 8234 rv = ssl3_FlushHandshake(ss, 0); | |
| 8235 if (rv != SECSuccess) { | |
| 8236 return rv; /* error code set by ssl3_FlushHandshake */ | |
| 8237 } | |
| 8238 ss->ssl3.hs.ws = wait_client_hello; | |
| 8239 return SECSuccess; | |
| 8240 } | |
| 8241 | |
| 8242 /* | |
| 8243 * Called from: | |
| 8244 * ssl3_HandleClientHello() | |
| 8245 */ | |
| 8246 static SECComparison | |
| 8247 ssl3_ServerNameCompare(const SECItem *name1, const SECItem *name2) | |
| 8248 { | |
| 8249 if (!name1 != !name2) { | |
| 8250 return SECLessThan; | |
| 8251 } | |
| 8252 if (!name1) { | |
| 8253 return SECEqual; | |
| 8254 } | |
| 8255 if (name1->type != name2->type) { | |
| 8256 return SECLessThan; | |
| 8257 } | |
| 8258 return SECITEM_CompareItem(name1, name2); | |
| 8259 } | |
| 8260 | |
| 8261 /* Sets memory error when returning NULL. | |
| 8262 * Called from: | |
| 8263 * ssl3_SendClientHello() | |
| 8264 * ssl3_HandleServerHello() | |
| 8265 * ssl3_HandleClientHello() | |
| 8266 * ssl3_HandleV2ClientHello() | |
| 8267 */ | |
| 8268 sslSessionID * | |
| 8269 ssl3_NewSessionID(sslSocket *ss, PRBool is_server) | |
| 8270 { | |
| 8271 sslSessionID *sid; | |
| 8272 | |
| 8273 sid = PORT_ZNew(sslSessionID); | |
| 8274 if (sid == NULL) | |
| 8275 return sid; | |
| 8276 | |
| 8277 if (is_server) { | |
| 8278 const SECItem *srvName; | |
| 8279 SECStatus rv = SECSuccess; | |
| 8280 | |
| 8281 ssl_GetSpecReadLock(ss); /********************************/ | |
| 8282 srvName = &ss->ssl3.prSpec->srvVirtName; | |
| 8283 if (srvName->len && srvName->data) { | |
| 8284 rv = SECITEM_CopyItem(NULL, &sid->u.ssl3.srvName, srvName); | |
| 8285 } | |
| 8286 ssl_ReleaseSpecReadLock(ss); /************************************/ | |
| 8287 if (rv != SECSuccess) { | |
| 8288 PORT_Free(sid); | |
| 8289 return NULL; | |
| 8290 } | |
| 8291 } | |
| 8292 sid->peerID = (ss->peerID == NULL) ? NULL : PORT_Strdup(ss->peerID); | |
| 8293 sid->urlSvrName = (ss->url == NULL) ? NULL : PORT_Strdup(ss->url); | |
| 8294 sid->addr = ss->sec.ci.peer; | |
| 8295 sid->port = ss->sec.ci.port; | |
| 8296 sid->references = 1; | |
| 8297 sid->cached = never_cached; | |
| 8298 sid->version = ss->version; | |
| 8299 | |
| 8300 sid->u.ssl3.keys.resumable = PR_TRUE; | |
| 8301 sid->u.ssl3.policy = SSL_ALLOWED; | |
| 8302 sid->u.ssl3.clientWriteKey = NULL; | |
| 8303 sid->u.ssl3.serverWriteKey = NULL; | |
| 8304 sid->u.ssl3.keys.extendedMasterSecretUsed = PR_FALSE; | |
| 8305 | |
| 8306 if (is_server) { | |
| 8307 SECStatus rv; | |
| 8308 int pid = SSL_GETPID(); | |
| 8309 | |
| 8310 sid->u.ssl3.sessionIDLength = SSL3_SESSIONID_BYTES; | |
| 8311 sid->u.ssl3.sessionID[0] = (pid >> 8) & 0xff; | |
| 8312 sid->u.ssl3.sessionID[1] = pid & 0xff; | |
| 8313 rv = PK11_GenerateRandom(sid->u.ssl3.sessionID + 2, | |
| 8314 SSL3_SESSIONID_BYTES - 2); | |
| 8315 if (rv != SECSuccess) { | |
| 8316 ssl_FreeSID(sid); | |
| 8317 ssl_MapLowLevelError(SSL_ERROR_GENERATE_RANDOM_FAILURE); | |
| 8318 return NULL; | |
| 8319 } | |
| 8320 } | |
| 8321 return sid; | |
| 8322 } | |
| 8323 | |
| 8324 /* Called from: ssl3_HandleClientHello, ssl3_HandleV2ClientHello */ | |
| 8325 static SECStatus | |
| 8326 ssl3_SendServerHelloSequence(sslSocket *ss) | |
| 8327 { | |
| 8328 const ssl3KEADef *kea_def; | |
| 8329 SECStatus rv; | |
| 8330 | |
| 8331 SSL_TRC(3, ("%d: SSL3[%d]: begin send server_hello sequence", | |
| 8332 SSL_GETPID(), ss->fd)); | |
| 8333 | |
| 8334 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 8335 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | |
| 8336 | |
| 8337 rv = ssl3_SendServerHello(ss); | |
| 8338 if (rv != SECSuccess) { | |
| 8339 return rv; /* err code is set. */ | |
| 8340 } | |
| 8341 rv = ssl3_SendCertificate(ss); | |
| 8342 if (rv != SECSuccess) { | |
| 8343 return rv; /* error code is set. */ | |
| 8344 } | |
| 8345 rv = ssl3_SendCertificateStatus(ss); | |
| 8346 if (rv != SECSuccess) { | |
| 8347 return rv; /* error code is set. */ | |
| 8348 } | |
| 8349 /* We have to do this after the call to ssl3_SendServerHello, | |
| 8350 * because kea_def is set up by ssl3_SendServerHello(). | |
| 8351 */ | |
| 8352 kea_def = ss->ssl3.hs.kea_def; | |
| 8353 ss->ssl3.hs.usedStepDownKey = PR_FALSE; | |
| 8354 | |
| 8355 if (kea_def->is_limited && kea_def->exchKeyType == kt_rsa) { | |
| 8356 /* see if we can legally use the key in the cert. */ | |
| 8357 unsigned int keyLen; /* bytes */ | |
| 8358 | |
| 8359 keyLen = PK11_GetPrivateModulusLen( | |
| 8360 ss->serverCerts[kea_def->exchKeyType].SERVERKEY); | |
| 8361 | |
| 8362 if (keyLen > 0 && | |
| 8363 keyLen * BPB <= kea_def->key_size_limit) { | |
| 8364 /* XXX AND cert is not signing only!! */ | |
| 8365 /* just fall through and use it. */ | |
| 8366 } else if (ss->stepDownKeyPair != NULL) { | |
| 8367 ss->ssl3.hs.usedStepDownKey = PR_TRUE; | |
| 8368 rv = ssl3_SendServerKeyExchange(ss); | |
| 8369 if (rv != SECSuccess) { | |
| 8370 return rv; /* err code was set. */ | |
| 8371 } | |
| 8372 } else { | |
| 8373 #ifndef HACKED_EXPORT_SERVER | |
| 8374 PORT_SetError(SSL_ERROR_PUB_KEY_SIZE_LIMIT_EXCEEDED); | |
| 8375 return rv; | |
| 8376 #endif | |
| 8377 } | |
| 8378 } else if (kea_def->ephemeral) { | |
| 8379 rv = ssl3_SendServerKeyExchange(ss); | |
| 8380 if (rv != SECSuccess) { | |
| 8381 return rv; /* err code was set. */ | |
| 8382 } | |
| 8383 } | |
| 8384 | |
| 8385 if (ss->opt.requestCertificate) { | |
| 8386 rv = ssl3_SendCertificateRequest(ss); | |
| 8387 if (rv != SECSuccess) { | |
| 8388 return rv; /* err code is set. */ | |
| 8389 } | |
| 8390 } | |
| 8391 rv = ssl3_SendServerHelloDone(ss); | |
| 8392 if (rv != SECSuccess) { | |
| 8393 return rv; /* err code is set. */ | |
| 8394 } | |
| 8395 | |
| 8396 ss->ssl3.hs.ws = (ss->opt.requestCertificate) ? wait_client_cert | |
| 8397 : wait_client_key; | |
| 8398 return SECSuccess; | |
| 8399 } | |
| 8400 | |
| 8401 /* An empty TLS Renegotiation Info (RI) extension */ | |
| 8402 static const PRUint8 emptyRIext[5] = { 0xff, 0x01, 0x00, 0x01, 0x00 }; | |
| 8403 | |
| 8404 static PRBool | |
| 8405 ssl3_KEAAllowsSessionTicket(SSL3KeyExchangeAlgorithm kea) | |
| 8406 { | |
| 8407 switch (kea) { | |
| 8408 case kea_dhe_dss: | |
| 8409 case kea_dhe_dss_export: | |
| 8410 case kea_dh_dss_export: | |
| 8411 case kea_dh_dss: | |
| 8412 /* TODO: Fix session tickets for DSS. The server code rejects the | |
| 8413 * session ticket received from the client. Bug 1174677 */ | |
| 8414 return PR_FALSE; | |
| 8415 default: | |
| 8416 return PR_TRUE; | |
| 8417 }; | |
| 8418 } | |
| 8419 | |
| 8420 static void | |
| 8421 ssl3_CopyPeerCertsFromSID(sslSocket *ss, sslSessionID *sid) | |
| 8422 { | |
| 8423 PLArenaPool *arena; | |
| 8424 ssl3CertNode *lastCert = NULL; | |
| 8425 ssl3CertNode *certs = NULL; | |
| 8426 int i; | |
| 8427 | |
| 8428 if (!sid->peerCertChain[0]) | |
| 8429 return; | |
| 8430 PORT_Assert(!ss->ssl3.peerCertArena); | |
| 8431 PORT_Assert(!ss->ssl3.peerCertChain); | |
| 8432 ss->ssl3.peerCertArena = arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); | |
| 8433 for (i = 0; i < MAX_PEER_CERT_CHAIN_SIZE && sid->peerCertChain[i]; i++) { | |
| 8434 ssl3CertNode *c = PORT_ArenaNew(arena, ssl3CertNode); | |
| 8435 c->cert = CERT_DupCertificate(sid->peerCertChain[i]); | |
| 8436 c->next = NULL; | |
| 8437 if (lastCert) { | |
| 8438 lastCert->next = c; | |
| 8439 } else { | |
| 8440 certs = c; | |
| 8441 } | |
| 8442 lastCert = c; | |
| 8443 } | |
| 8444 ss->ssl3.peerCertChain = certs; | |
| 8445 } | |
| 8446 | |
| 8447 static void | |
| 8448 ssl3_CopyPeerCertsToSID(ssl3CertNode *certs, sslSessionID *sid) | |
| 8449 { | |
| 8450 int i = 0; | |
| 8451 ssl3CertNode *c = certs; | |
| 8452 for (; i < MAX_PEER_CERT_CHAIN_SIZE && c; i++, c = c->next) { | |
| 8453 PORT_Assert(!sid->peerCertChain[i]); | |
| 8454 sid->peerCertChain[i] = CERT_DupCertificate(c->cert); | |
| 8455 } | |
| 8456 } | |
| 8457 | |
| 8458 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete | |
| 8459 * ssl3 Client Hello message. | |
| 8460 * Caller must hold Handshake and RecvBuf locks. | |
| 8461 */ | |
| 8462 static SECStatus | |
| 8463 ssl3_HandleClientHello(sslSocket *ss, SSL3Opaque *b, PRUint32 length) | |
| 8464 { | |
| 8465 sslSessionID *sid = NULL; | |
| 8466 PRInt32 tmp; | |
| 8467 unsigned int i; | |
| 8468 int j; | |
| 8469 SECStatus rv; | |
| 8470 int errCode = SSL_ERROR_RX_MALFORMED_CLIENT_HELLO; | |
| 8471 SSL3AlertDescription desc = illegal_parameter; | |
| 8472 SSL3AlertLevel level = alert_fatal; | |
| 8473 SSL3ProtocolVersion version; | |
| 8474 SECItem sidBytes = { siBuffer, NULL, 0 }; | |
| 8475 SECItem cookieBytes = { siBuffer, NULL, 0 }; | |
| 8476 SECItem suites = { siBuffer, NULL, 0 }; | |
| 8477 SECItem comps = { siBuffer, NULL, 0 }; | |
| 8478 PRBool haveSpecWriteLock = PR_FALSE; | |
| 8479 PRBool haveXmitBufLock = PR_FALSE; | |
| 8480 PRBool canOfferSessionTicket = PR_FALSE; | |
| 8481 PRBool isTLS13 = PR_FALSE; | |
| 8482 | |
| 8483 SSL_TRC(3, ("%d: SSL3[%d]: handle client_hello handshake", | |
| 8484 SSL_GETPID(), ss->fd)); | |
| 8485 | |
| 8486 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 8487 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 8488 PORT_Assert(ss->ssl3.initialized); | |
| 8489 ss->ssl3.hs.preliminaryInfo = 0; | |
| 8490 | |
| 8491 if (!ss->sec.isServer || | |
| 8492 (ss->ssl3.hs.ws != wait_client_hello && | |
| 8493 ss->ssl3.hs.ws != idle_handshake)) { | |
| 8494 desc = unexpected_message; | |
| 8495 errCode = SSL_ERROR_RX_UNEXPECTED_CLIENT_HELLO; | |
| 8496 goto alert_loser; | |
| 8497 } | |
| 8498 if (ss->ssl3.hs.ws == idle_handshake) { | |
| 8499 if (ss->version >= SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 8500 desc = unexpected_message; | |
| 8501 errCode = SSL_ERROR_RENEGOTIATION_NOT_ALLOWED; | |
| 8502 goto alert_loser; | |
| 8503 } | |
| 8504 if (ss->opt.enableRenegotiation == SSL_RENEGOTIATE_NEVER) { | |
| 8505 desc = no_renegotiation; | |
| 8506 level = alert_warning; | |
| 8507 errCode = SSL_ERROR_RENEGOTIATION_NOT_ALLOWED; | |
| 8508 goto alert_loser; | |
| 8509 } | |
| 8510 } | |
| 8511 | |
| 8512 /* Get peer name of client */ | |
| 8513 rv = ssl_GetPeerInfo(ss); | |
| 8514 if (rv != SECSuccess) { | |
| 8515 return rv; /* error code is set. */ | |
| 8516 } | |
| 8517 | |
| 8518 /* Clearing the handshake pointers so that ssl_Do1stHandshake won't | |
| 8519 * call ssl2_HandleMessage. | |
| 8520 * | |
| 8521 * The issue here is that TLS ordinarily starts out in | |
| 8522 * ssl2_HandleV3HandshakeRecord() because of the backward-compatibility | |
| 8523 * code paths. That function zeroes these next pointers. But with DTLS, | |
| 8524 * we don't even try to do the v2 ClientHello so we skip that function | |
| 8525 * and need to reset these values here. | |
| 8526 */ | |
| 8527 if (IS_DTLS(ss)) { | |
| 8528 ss->nextHandshake = 0; | |
| 8529 ss->securityHandshake = 0; | |
| 8530 } | |
| 8531 | |
| 8532 /* We might be starting session renegotiation in which case we should | |
| 8533 * clear previous state. | |
| 8534 */ | |
| 8535 PORT_Memset(&ss->xtnData, 0, sizeof(TLSExtensionData)); | |
| 8536 ss->statelessResume = PR_FALSE; | |
| 8537 | |
| 8538 if (IS_DTLS(ss)) { | |
| 8539 dtls_RehandshakeCleanup(ss); | |
| 8540 } | |
| 8541 | |
| 8542 tmp = ssl3_ConsumeHandshakeNumber(ss, 2, &b, &length); | |
| 8543 if (tmp < 0) | |
| 8544 goto loser; /* malformed, alert already sent */ | |
| 8545 | |
| 8546 /* Translate the version */ | |
| 8547 if (IS_DTLS(ss)) { | |
| 8548 ss->clientHelloVersion = version = | |
| 8549 dtls_DTLSVersionToTLSVersion((SSL3ProtocolVersion)tmp); | |
| 8550 } else { | |
| 8551 ss->clientHelloVersion = version = (SSL3ProtocolVersion)tmp; | |
| 8552 } | |
| 8553 | |
| 8554 rv = ssl3_NegotiateVersion(ss, version, PR_TRUE); | |
| 8555 if (rv != SECSuccess) { | |
| 8556 desc = (version > SSL_LIBRARY_VERSION_3_0) ? protocol_version | |
| 8557 : handshake_failure; | |
| 8558 errCode = SSL_ERROR_UNSUPPORTED_VERSION; | |
| 8559 goto alert_loser; | |
| 8560 } | |
| 8561 isTLS13 = ss->version >= SSL_LIBRARY_VERSION_TLS_1_3; | |
| 8562 ss->ssl3.hs.preliminaryInfo |= ssl_preinfo_version; | |
| 8563 | |
| 8564 rv = ssl3_InitHandshakeHashes(ss); | |
| 8565 if (rv != SECSuccess) { | |
| 8566 desc = internal_error; | |
| 8567 errCode = PORT_GetError(); | |
| 8568 goto alert_loser; | |
| 8569 } | |
| 8570 | |
| 8571 /* Generate the Server Random now so it is available | |
| 8572 * when we process the ClientKeyShare in TLS 1.3 */ | |
| 8573 rv = ssl3_GetNewRandom(&ss->ssl3.hs.server_random); | |
| 8574 if (rv != SECSuccess) { | |
| 8575 errCode = SSL_ERROR_GENERATE_RANDOM_FAILURE; | |
| 8576 goto loser; | |
| 8577 } | |
| 8578 | |
| 8579 /* | |
| 8580 * [draft-ietf-tls-tls13-11 Section 6.3.1.1]. | |
| 8581 * TLS 1.3 server implementations which respond to a ClientHello with a | |
| 8582 * client_version indicating TLS 1.2 or below MUST set the first eight | |
| 8583 * bytes of their Random value to the bytes: | |
| 8584 * | |
| 8585 * 44 4F 57 4E 47 52 44 01 | |
| 8586 * | |
| 8587 * TLS 1.2 server implementations which respond to a ClientHello with a | |
| 8588 * client_version indicating TLS 1.1 or below SHOULD set the first eight | |
| 8589 * bytes of their Random value to the bytes: | |
| 8590 * | |
| 8591 * 44 4F 57 4E 47 52 44 00 | |
| 8592 * | |
| 8593 * TODO(ekr@rtfm.com): Note this change was not added in the SSLv2 | |
| 8594 * compat processing code since that will most likely be removed before | |
| 8595 * we ship the final version of TLS 1.3. | |
| 8596 */ | |
| 8597 if (ss->vrange.max > ss->version) { | |
| 8598 switch (ss->vrange.max) { | |
| 8599 case SSL_LIBRARY_VERSION_TLS_1_3: | |
| 8600 PORT_Memcpy(ss->ssl3.hs.server_random.rand, | |
| 8601 tls13_downgrade_random, | |
| 8602 sizeof(tls13_downgrade_random)); | |
| 8603 break; | |
| 8604 case SSL_LIBRARY_VERSION_TLS_1_2: | |
| 8605 PORT_Memcpy(ss->ssl3.hs.server_random.rand, | |
| 8606 tls12_downgrade_random, | |
| 8607 sizeof(tls12_downgrade_random)); | |
| 8608 break; | |
| 8609 default: | |
| 8610 /* Do not change random. */ | |
| 8611 break; | |
| 8612 } | |
| 8613 } | |
| 8614 | |
| 8615 /* grab the client random data. */ | |
| 8616 rv = ssl3_ConsumeHandshake( | |
| 8617 ss, &ss->ssl3.hs.client_random, SSL3_RANDOM_LENGTH, &b, &length); | |
| 8618 if (rv != SECSuccess) { | |
| 8619 goto loser; /* malformed */ | |
| 8620 } | |
| 8621 | |
| 8622 /* grab the client's SID, if present. */ | |
| 8623 rv = ssl3_ConsumeHandshakeVariable(ss, &sidBytes, 1, &b, &length); | |
| 8624 if (rv != SECSuccess) { | |
| 8625 goto loser; /* malformed */ | |
| 8626 } | |
| 8627 | |
| 8628 /* grab the client's cookie, if present. */ | |
| 8629 if (IS_DTLS(ss)) { | |
| 8630 rv = ssl3_ConsumeHandshakeVariable(ss, &cookieBytes, 1, &b, &length); | |
| 8631 if (rv != SECSuccess) { | |
| 8632 goto loser; /* malformed */ | |
| 8633 } | |
| 8634 } | |
| 8635 | |
| 8636 /* grab the list of cipher suites. */ | |
| 8637 rv = ssl3_ConsumeHandshakeVariable(ss, &suites, 2, &b, &length); | |
| 8638 if (rv != SECSuccess) { | |
| 8639 goto loser; /* malformed */ | |
| 8640 } | |
| 8641 | |
| 8642 /* If the ClientHello version is less than our maximum version, check for a | |
| 8643 * TLS_FALLBACK_SCSV and reject the connection if found. */ | |
| 8644 if (ss->vrange.max > ss->clientHelloVersion) { | |
| 8645 for (i = 0; i + 1 < suites.len; i += 2) { | |
| 8646 PRUint16 suite_i = (suites.data[i] << 8) | suites.data[i + 1]; | |
| 8647 if (suite_i != TLS_FALLBACK_SCSV) | |
| 8648 continue; | |
| 8649 desc = inappropriate_fallback; | |
| 8650 errCode = SSL_ERROR_INAPPROPRIATE_FALLBACK_ALERT; | |
| 8651 goto alert_loser; | |
| 8652 } | |
| 8653 } | |
| 8654 | |
| 8655 /* grab the list of compression methods. */ | |
| 8656 rv = ssl3_ConsumeHandshakeVariable(ss, &comps, 1, &b, &length); | |
| 8657 if (rv != SECSuccess) { | |
| 8658 goto loser; /* malformed */ | |
| 8659 } | |
| 8660 | |
| 8661 /* TLS 1.3 requires that compression be empty */ | |
| 8662 if (isTLS13) { | |
| 8663 if (comps.len != 1 || comps.data[0] != ssl_compression_null) { | |
| 8664 goto loser; | |
| 8665 } | |
| 8666 } | |
| 8667 desc = handshake_failure; | |
| 8668 | |
| 8669 /* Handle TLS hello extensions for SSL3 & TLS. We do not know if | |
| 8670 * we are restarting a previous session until extensions have been | |
| 8671 * parsed, since we might have received a SessionTicket extension. | |
| 8672 * Note: we allow extensions even when negotiating SSL3 for the sake | |
| 8673 * of interoperability (and backwards compatibility). | |
| 8674 */ | |
| 8675 | |
| 8676 if (length) { | |
| 8677 /* Get length of hello extensions */ | |
| 8678 PRInt32 extension_length; | |
| 8679 extension_length = ssl3_ConsumeHandshakeNumber(ss, 2, &b, &length); | |
| 8680 if (extension_length < 0) { | |
| 8681 goto loser; /* alert already sent */ | |
| 8682 } | |
| 8683 if (extension_length != length) { | |
| 8684 ssl3_DecodeError(ss); /* send alert */ | |
| 8685 goto loser; | |
| 8686 } | |
| 8687 rv = ssl3_HandleHelloExtensions(ss, &b, &length, client_hello); | |
| 8688 if (rv != SECSuccess) { | |
| 8689 goto loser; /* malformed */ | |
| 8690 } | |
| 8691 } | |
| 8692 if (!ssl3_ExtensionNegotiated(ss, ssl_renegotiation_info_xtn)) { | |
| 8693 /* If we didn't receive an RI extension, look for the SCSV, | |
| 8694 * and if found, treat it just like an empty RI extension | |
| 8695 * by processing a local copy of an empty RI extension. | |
| 8696 */ | |
| 8697 for (i = 0; i + 1 < suites.len; i += 2) { | |
| 8698 PRUint16 suite_i = (suites.data[i] << 8) | suites.data[i + 1]; | |
| 8699 if (suite_i == TLS_EMPTY_RENEGOTIATION_INFO_SCSV) { | |
| 8700 SSL3Opaque *b2 = (SSL3Opaque *)emptyRIext; | |
| 8701 PRUint32 L2 = sizeof emptyRIext; | |
| 8702 (void)ssl3_HandleHelloExtensions(ss, &b2, &L2, client_hello); | |
| 8703 break; | |
| 8704 } | |
| 8705 } | |
| 8706 } | |
| 8707 if (ss->firstHsDone && | |
| 8708 (ss->opt.enableRenegotiation == SSL_RENEGOTIATE_REQUIRES_XTN || | |
| 8709 ss->opt.enableRenegotiation == SSL_RENEGOTIATE_TRANSITIONAL) && | |
| 8710 !ssl3_ExtensionNegotiated(ss, ssl_renegotiation_info_xtn)) { | |
| 8711 desc = no_renegotiation; | |
| 8712 level = alert_warning; | |
| 8713 errCode = SSL_ERROR_RENEGOTIATION_NOT_ALLOWED; | |
| 8714 goto alert_loser; | |
| 8715 } | |
| 8716 if ((ss->opt.requireSafeNegotiation || | |
| 8717 (ss->firstHsDone && ss->peerRequestedProtection)) && | |
| 8718 !ssl3_ExtensionNegotiated(ss, ssl_renegotiation_info_xtn)) { | |
| 8719 desc = handshake_failure; | |
| 8720 errCode = SSL_ERROR_UNSAFE_NEGOTIATION; | |
| 8721 goto alert_loser; | |
| 8722 } | |
| 8723 | |
| 8724 /* We do stateful resumes only if either of the following | |
| 8725 * conditions are satisfied: (1) the client does not support the | |
| 8726 * session ticket extension, or (2) the client support the session | |
| 8727 * ticket extension, but sent an empty ticket. | |
| 8728 */ | |
| 8729 if (!ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn) || | |
| 8730 ss->xtnData.emptySessionTicket) { | |
| 8731 if (sidBytes.len > 0 && !ss->opt.noCache) { | |
| 8732 SSL_TRC(7, ("%d: SSL3[%d]: server, lookup client session-id for 0x%0
8x%08x%08x%08x", | |
| 8733 SSL_GETPID(), ss->fd, ss->sec.ci.peer.pr_s6_addr32[0], | |
| 8734 ss->sec.ci.peer.pr_s6_addr32[1], | |
| 8735 ss->sec.ci.peer.pr_s6_addr32[2], | |
| 8736 ss->sec.ci.peer.pr_s6_addr32[3])); | |
| 8737 if (ssl_sid_lookup) { | |
| 8738 sid = (*ssl_sid_lookup)(&ss->sec.ci.peer, sidBytes.data, | |
| 8739 sidBytes.len, ss->dbHandle); | |
| 8740 } else { | |
| 8741 errCode = SSL_ERROR_SERVER_CACHE_NOT_CONFIGURED; | |
| 8742 goto loser; | |
| 8743 } | |
| 8744 } | |
| 8745 } else if (ss->statelessResume) { | |
| 8746 /* Fill in the client's session ID if doing a stateless resume. | |
| 8747 * (When doing stateless resumes, server echos client's SessionID.) | |
| 8748 */ | |
| 8749 sid = ss->sec.ci.sid; | |
| 8750 PORT_Assert(sid != NULL); /* Should have already been filled in.*/ | |
| 8751 | |
| 8752 if (sidBytes.len > 0 && sidBytes.len <= SSL3_SESSIONID_BYTES) { | |
| 8753 sid->u.ssl3.sessionIDLength = sidBytes.len; | |
| 8754 PORT_Memcpy(sid->u.ssl3.sessionID, sidBytes.data, | |
| 8755 sidBytes.len); | |
| 8756 sid->u.ssl3.sessionIDLength = sidBytes.len; | |
| 8757 } else { | |
| 8758 sid->u.ssl3.sessionIDLength = 0; | |
| 8759 } | |
| 8760 ss->sec.ci.sid = NULL; | |
| 8761 } | |
| 8762 | |
| 8763 /* We only send a session ticket extension if the client supports | |
| 8764 * the extension and we are unable to do either a stateful or | |
| 8765 * stateless resume. | |
| 8766 * | |
| 8767 * TODO: send a session ticket if performing a stateful | |
| 8768 * resumption. (As per RFC4507, a server may issue a session | |
| 8769 * ticket while doing a (stateless or stateful) session resume, | |
| 8770 * but OpenSSL-0.9.8g does not accept session tickets while | |
| 8771 * resuming.) | |
| 8772 */ | |
| 8773 if (ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn) && sid == NULL) { | |
| 8774 canOfferSessionTicket = PR_TRUE; | |
| 8775 } | |
| 8776 | |
| 8777 if (sid != NULL) { | |
| 8778 /* We've found a session cache entry for this client. | |
| 8779 * Now, if we're going to require a client-auth cert, | |
| 8780 * and we don't already have this client's cert in the session cache, | |
| 8781 * and this is the first handshake on this connection (not a redo), | |
| 8782 * then drop this old cache entry and start a new session. | |
| 8783 */ | |
| 8784 if ((sid->peerCert == NULL) && ss->opt.requestCertificate && | |
| 8785 ((ss->opt.requireCertificate == SSL_REQUIRE_ALWAYS) || | |
| 8786 (ss->opt.requireCertificate == SSL_REQUIRE_NO_ERROR) || | |
| 8787 ((ss->opt.requireCertificate == SSL_REQUIRE_FIRST_HANDSHAKE) && | |
| 8788 !ss->firstHsDone))) { | |
| 8789 | |
| 8790 SSL_AtomicIncrementLong(&ssl3stats.hch_sid_cache_not_ok); | |
| 8791 if (ss->sec.uncache) | |
| 8792 ss->sec.uncache(sid); | |
| 8793 ssl_FreeSID(sid); | |
| 8794 sid = NULL; | |
| 8795 } | |
| 8796 } | |
| 8797 | |
| 8798 #ifndef NSS_DISABLE_ECC | |
| 8799 /* Disable any ECC cipher suites for which we have no cert. */ | |
| 8800 ssl3_FilterECCipherSuitesByServerCerts(ss); | |
| 8801 #endif | |
| 8802 | |
| 8803 if (IS_DTLS(ss)) { | |
| 8804 ssl3_DisableNonDTLSSuites(ss); | |
| 8805 } | |
| 8806 | |
| 8807 #ifdef PARANOID | |
| 8808 /* Look for a matching cipher suite. */ | |
| 8809 j = ssl3_config_match_init(ss); | |
| 8810 if (j <= 0) { /* no ciphers are working/supported by PK11 *
/ | |
| 8811 errCode = PORT_GetError(); /* error code is already set. */ | |
| 8812 goto alert_loser; | |
| 8813 } | |
| 8814 #endif | |
| 8815 | |
| 8816 /* If we already have a session for this client, be sure to pick the | |
| 8817 ** same cipher suite and compression method we picked before. | |
| 8818 ** This is not a loop, despite appearances. | |
| 8819 */ | |
| 8820 if (sid) | |
| 8821 do { | |
| 8822 ssl3CipherSuiteCfg *suite; | |
| 8823 #ifdef PARANOID | |
| 8824 SSLVersionRange vrange = { ss->version, ss->version }; | |
| 8825 #endif | |
| 8826 | |
| 8827 /* Check that the cached compression method is still enabled. */ | |
| 8828 if (!compressionEnabled(ss, sid->u.ssl3.compression)) | |
| 8829 break; | |
| 8830 | |
| 8831 /* Check that the cached compression method is in the client's list
*/ | |
| 8832 for (i = 0; i < comps.len; i++) { | |
| 8833 if (comps.data[i] == sid->u.ssl3.compression) | |
| 8834 break; | |
| 8835 } | |
| 8836 if (i == comps.len) | |
| 8837 break; | |
| 8838 | |
| 8839 suite = ss->cipherSuites; | |
| 8840 /* Find the entry for the cipher suite used in the cached session. *
/ | |
| 8841 for (j = ssl_V3_SUITES_IMPLEMENTED; j > 0; --j, ++suite) { | |
| 8842 if (suite->cipher_suite == sid->u.ssl3.cipherSuite) | |
| 8843 break; | |
| 8844 } | |
| 8845 PORT_Assert(j > 0); | |
| 8846 if (j <= 0) | |
| 8847 break; | |
| 8848 #ifdef PARANOID | |
| 8849 /* Double check that the cached cipher suite is still enabled, | |
| 8850 * implemented, and allowed by policy. Might have been disabled. | |
| 8851 * The product policy won't change during the process lifetime. | |
| 8852 * Implemented ("isPresent") shouldn't change for servers. | |
| 8853 */ | |
| 8854 if (!config_match(suite, ss->ssl3.policy, PR_TRUE, &vrange, ss)) | |
| 8855 break; | |
| 8856 #else | |
| 8857 if (!suite->enabled) | |
| 8858 break; | |
| 8859 #endif | |
| 8860 /* Double check that the cached cipher suite is in the client's list
*/ | |
| 8861 for (i = 0; i + 1 < suites.len; i += 2) { | |
| 8862 PRUint16 suite_i = (suites.data[i] << 8) | suites.data[i + 1]; | |
| 8863 if (suite_i == suite->cipher_suite) { | |
| 8864 ss->ssl3.hs.cipher_suite = | |
| 8865 suite->cipher_suite; | |
| 8866 ss->ssl3.hs.suite_def = | |
| 8867 ssl_LookupCipherSuiteDef(ss->ssl3.hs.cipher_suite); | |
| 8868 ss->ssl3.hs.kea_def = | |
| 8869 &kea_defs[ss->ssl3.hs.suite_def->key_exchange_alg]; | |
| 8870 ss->ssl3.hs.preliminaryInfo |= ssl_preinfo_cipher_suite; | |
| 8871 | |
| 8872 /* Use the cached compression method. */ | |
| 8873 ss->ssl3.hs.compression = | |
| 8874 sid->u.ssl3.compression; | |
| 8875 goto compression_found; | |
| 8876 } | |
| 8877 } | |
| 8878 } while (0); | |
| 8879 | |
| 8880 /* START A NEW SESSION */ | |
| 8881 | |
| 8882 #ifndef PARANOID | |
| 8883 /* Look for a matching cipher suite. */ | |
| 8884 j = ssl3_config_match_init(ss); | |
| 8885 if (j <= 0) { /* no ciphers are working/supported by PK11 *
/ | |
| 8886 errCode = PORT_GetError(); /* error code is already set. */ | |
| 8887 goto alert_loser; | |
| 8888 } | |
| 8889 #endif | |
| 8890 | |
| 8891 /* Select a cipher suite. | |
| 8892 ** | |
| 8893 ** NOTE: This suite selection algorithm should be the same as the one in | |
| 8894 ** ssl3_HandleV2ClientHello(). | |
| 8895 ** | |
| 8896 ** If TLS 1.0 is enabled, we could handle the case where the client | |
| 8897 ** offered TLS 1.1 but offered only export cipher suites by choosing TLS | |
| 8898 ** 1.0 and selecting one of those export cipher suites. However, a secure | |
| 8899 ** TLS 1.1 client should not have export cipher suites enabled at all, | |
| 8900 ** and a TLS 1.1 client should definitely not be offering *only* export | |
| 8901 ** cipher suites. Therefore, we refuse to negotiate export cipher suites | |
| 8902 ** with any client that indicates support for TLS 1.1 or higher when we | |
| 8903 ** (the server) have TLS 1.1 support enabled. | |
| 8904 */ | |
| 8905 for (j = 0; j < ssl_V3_SUITES_IMPLEMENTED; j++) { | |
| 8906 ssl3CipherSuiteCfg *suite = &ss->cipherSuites[j]; | |
| 8907 SSLVersionRange vrange = { ss->version, ss->version }; | |
| 8908 if (!config_match(suite, ss->ssl3.policy, PR_TRUE, &vrange, ss)) { | |
| 8909 continue; | |
| 8910 } | |
| 8911 for (i = 0; i + 1 < suites.len; i += 2) { | |
| 8912 PRUint16 suite_i = (suites.data[i] << 8) | suites.data[i + 1]; | |
| 8913 if (suite_i == suite->cipher_suite) { | |
| 8914 ss->ssl3.hs.cipher_suite = suite->cipher_suite; | |
| 8915 ss->ssl3.hs.suite_def = | |
| 8916 ssl_LookupCipherSuiteDef(ss->ssl3.hs.cipher_suite); | |
| 8917 ss->ssl3.hs.kea_def = | |
| 8918 &kea_defs[ss->ssl3.hs.suite_def->key_exchange_alg]; | |
| 8919 ss->ssl3.hs.preliminaryInfo |= ssl_preinfo_cipher_suite; | |
| 8920 goto suite_found; | |
| 8921 } | |
| 8922 } | |
| 8923 } | |
| 8924 errCode = SSL_ERROR_NO_CYPHER_OVERLAP; | |
| 8925 goto alert_loser; | |
| 8926 | |
| 8927 suite_found: | |
| 8928 if (canOfferSessionTicket) | |
| 8929 canOfferSessionTicket = ssl3_KEAAllowsSessionTicket( | |
| 8930 ss->ssl3.hs.suite_def->key_exchange_alg); | |
| 8931 | |
| 8932 if (canOfferSessionTicket) { | |
| 8933 ssl3_RegisterServerHelloExtensionSender(ss, | |
| 8934 ssl_session_ticket_xtn, ssl3_Sen
dSessionTicketXtn); | |
| 8935 } | |
| 8936 | |
| 8937 /* Select a compression algorithm. */ | |
| 8938 for (i = 0; i < comps.len; i++) { | |
| 8939 if (!compressionEnabled(ss, comps.data[i])) | |
| 8940 continue; | |
| 8941 for (j = 0; j < compressionMethodsCount; j++) { | |
| 8942 if (comps.data[i] == compressions[j]) { | |
| 8943 ss->ssl3.hs.compression = | |
| 8944 (SSLCompressionMethod)compressions[j]; | |
| 8945 goto compression_found; | |
| 8946 } | |
| 8947 } | |
| 8948 } | |
| 8949 errCode = SSL_ERROR_NO_COMPRESSION_OVERLAP; | |
| 8950 /* null compression must be supported */ | |
| 8951 goto alert_loser; | |
| 8952 | |
| 8953 compression_found: | |
| 8954 suites.data = NULL; | |
| 8955 comps.data = NULL; | |
| 8956 | |
| 8957 ss->sec.send = ssl3_SendApplicationData; | |
| 8958 | |
| 8959 /* If there are any failures while processing the old sid, | |
| 8960 * we don't consider them to be errors. Instead, We just behave | |
| 8961 * as if the client had sent us no sid to begin with, and make a new one. | |
| 8962 * The exception here is attempts to resume extended_master_secret | |
| 8963 * sessions without the extension, which causes an alert. | |
| 8964 */ | |
| 8965 if (sid != NULL) | |
| 8966 do { | |
| 8967 ssl3CipherSpec *pwSpec; | |
| 8968 SECItem wrappedMS; /* wrapped key */ | |
| 8969 | |
| 8970 if (sid->version != ss->version || | |
| 8971 sid->u.ssl3.cipherSuite != ss->ssl3.hs.cipher_suite || | |
| 8972 sid->u.ssl3.compression != ss->ssl3.hs.compression) { | |
| 8973 break; /* not an error */ | |
| 8974 } | |
| 8975 | |
| 8976 /* [draft-ietf-tls-session-hash-06; Section 5.3] | |
| 8977 * o If the original session did not use the "extended_master_secre
t" | |
| 8978 * extension but the new ClientHello contains the extension, then
the | |
| 8979 * server MUST NOT perform the abbreviated handshake. Instead, i
t | |
| 8980 * SHOULD continue with a full handshake (as described in | |
| 8981 * Section 5.2) to negotiate a new session. | |
| 8982 * | |
| 8983 * o If the original session used the "extended_master_secret" | |
| 8984 * extension but the new ClientHello does not contain the extensi
on, | |
| 8985 * the server MUST abort the abbreviated handshake. | |
| 8986 */ | |
| 8987 if (ssl3_ExtensionNegotiated(ss, ssl_extended_master_secret_xtn)) { | |
| 8988 if (!sid->u.ssl3.keys.extendedMasterSecretUsed) { | |
| 8989 break; /* not an error */ | |
| 8990 } | |
| 8991 } else { | |
| 8992 if (sid->u.ssl3.keys.extendedMasterSecretUsed) { | |
| 8993 /* Note: we do not destroy the session */ | |
| 8994 desc = handshake_failure; | |
| 8995 errCode = SSL_ERROR_MISSING_EXTENDED_MASTER_SECRET; | |
| 8996 goto alert_loser; | |
| 8997 } | |
| 8998 } | |
| 8999 | |
| 9000 if (ss->sec.ci.sid) { | |
| 9001 if (ss->sec.uncache) | |
| 9002 ss->sec.uncache(ss->sec.ci.sid); | |
| 9003 PORT_Assert(ss->sec.ci.sid != sid); /* should be impossible, but
... */ | |
| 9004 if (ss->sec.ci.sid != sid) { | |
| 9005 ssl_FreeSID(ss->sec.ci.sid); | |
| 9006 } | |
| 9007 ss->sec.ci.sid = NULL; | |
| 9008 } | |
| 9009 /* we need to resurrect the master secret.... */ | |
| 9010 | |
| 9011 ssl_GetSpecWriteLock(ss); | |
| 9012 haveSpecWriteLock = PR_TRUE; | |
| 9013 pwSpec = ss->ssl3.pwSpec; | |
| 9014 if (sid->u.ssl3.keys.msIsWrapped) { | |
| 9015 PK11SymKey *wrapKey; /* wrapping key */ | |
| 9016 CK_FLAGS keyFlags = 0; | |
| 9017 #ifndef NO_PKCS11_BYPASS | |
| 9018 if (ss->opt.bypassPKCS11) { | |
| 9019 /* we cannot restart a non-bypass session in a | |
| 9020 ** bypass socket. | |
| 9021 */ | |
| 9022 break; | |
| 9023 } | |
| 9024 #endif | |
| 9025 | |
| 9026 wrapKey = getWrappingKey(ss, NULL, sid->u.ssl3.exchKeyType, | |
| 9027 sid->u.ssl3.masterWrapMech, | |
| 9028 ss->pkcs11PinArg); | |
| 9029 if (!wrapKey) { | |
| 9030 /* we have a SID cache entry, but no wrapping key for it???
*/ | |
| 9031 break; | |
| 9032 } | |
| 9033 | |
| 9034 if (ss->version > SSL_LIBRARY_VERSION_3_0) { /* isTLS */ | |
| 9035 keyFlags = | |
| 9036 CKF_SIGN | CKF_VERIFY; | |
| 9037 } | |
| 9038 | |
| 9039 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; | |
| 9040 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; | |
| 9041 | |
| 9042 /* unwrap the master secret. */ | |
| 9043 pwSpec->master_secret = | |
| 9044 PK11_UnwrapSymKeyWithFlags(wrapKey, sid->u.ssl3.masterWrapMe
ch, | |
| 9045 NULL, &wrappedMS, CKM_SSL3_MASTER
_KEY_DERIVE, | |
| 9046 CKA_DERIVE, sizeof(SSL3MasterSecr
et), keyFlags); | |
| 9047 PK11_FreeSymKey(wrapKey); | |
| 9048 if (pwSpec->master_secret == NULL) { | |
| 9049 break; /* not an error */ | |
| 9050 } | |
| 9051 #ifndef NO_PKCS11_BYPASS | |
| 9052 } else if (ss->opt.bypassPKCS11) { | |
| 9053 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; | |
| 9054 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; | |
| 9055 memcpy(pwSpec->raw_master_secret, wrappedMS.data, wrappedMS.len)
; | |
| 9056 pwSpec->msItem.data = pwSpec->raw_master_secret; | |
| 9057 pwSpec->msItem.len = wrappedMS.len; | |
| 9058 #endif | |
| 9059 } else { | |
| 9060 /* We CAN restart a bypass session in a non-bypass socket. */ | |
| 9061 /* need to import the raw master secret to session object */ | |
| 9062 PK11SlotInfo *slot; | |
| 9063 wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret; | |
| 9064 wrappedMS.len = sid->u.ssl3.keys.wrapped_master_secret_len; | |
| 9065 slot = PK11_GetInternalSlot(); | |
| 9066 pwSpec->master_secret = | |
| 9067 PK11_ImportSymKey(slot, CKM_SSL3_MASTER_KEY_DERIVE, | |
| 9068 PK11_OriginUnwrap, CKA_ENCRYPT, &wrappedMS
, | |
| 9069 NULL); | |
| 9070 PK11_FreeSlot(slot); | |
| 9071 if (pwSpec->master_secret == NULL) { | |
| 9072 break; /* not an error */ | |
| 9073 } | |
| 9074 } | |
| 9075 ss->sec.ci.sid = sid; | |
| 9076 if (sid->peerCert != NULL) { | |
| 9077 ss->sec.peerCert = CERT_DupCertificate(sid->peerCert); | |
| 9078 ssl3_CopyPeerCertsFromSID(ss, sid); | |
| 9079 } | |
| 9080 | |
| 9081 /* | |
| 9082 * Old SID passed all tests, so resume this old session. | |
| 9083 * | |
| 9084 * XXX make sure compression still matches | |
| 9085 */ | |
| 9086 SSL_AtomicIncrementLong(&ssl3stats.hch_sid_cache_hits); | |
| 9087 if (ss->statelessResume) | |
| 9088 SSL_AtomicIncrementLong(&ssl3stats.hch_sid_stateless_resumes); | |
| 9089 ss->ssl3.hs.isResuming = PR_TRUE; | |
| 9090 | |
| 9091 ss->sec.authAlgorithm = sid->authAlgorithm; | |
| 9092 ss->sec.authKeyBits = sid->authKeyBits; | |
| 9093 ss->sec.keaType = sid->keaType; | |
| 9094 ss->sec.keaKeyBits = sid->keaKeyBits; | |
| 9095 | |
| 9096 /* server sids don't remember the server cert we previously sent, | |
| 9097 ** but they do remember the kea type we originally used, so we | |
| 9098 ** can locate it again, provided that the current ssl socket | |
| 9099 ** has had its server certs configured the same as the previous one. | |
| 9100 */ | |
| 9101 ss->sec.localCert = | |
| 9102 CERT_DupCertificate(ss->serverCerts[sid->keaType].serverCert); | |
| 9103 | |
| 9104 /* Copy cached name in to pending spec */ | |
| 9105 if (sid != NULL && | |
| 9106 sid->version > SSL_LIBRARY_VERSION_3_0 && | |
| 9107 sid->u.ssl3.srvName.len && sid->u.ssl3.srvName.data) { | |
| 9108 /* Set server name from sid */ | |
| 9109 SECItem *sidName = &sid->u.ssl3.srvName; | |
| 9110 SECItem *pwsName = &ss->ssl3.pwSpec->srvVirtName; | |
| 9111 if (pwsName->data) { | |
| 9112 SECITEM_FreeItem(pwsName, PR_FALSE); | |
| 9113 } | |
| 9114 rv = SECITEM_CopyItem(NULL, pwsName, sidName); | |
| 9115 if (rv != SECSuccess) { | |
| 9116 errCode = PORT_GetError(); | |
| 9117 desc = internal_error; | |
| 9118 goto alert_loser; | |
| 9119 } | |
| 9120 } | |
| 9121 | |
| 9122 /* Clean up sni name array */ | |
| 9123 if (ssl3_ExtensionNegotiated(ss, ssl_server_name_xtn) && | |
| 9124 ss->xtnData.sniNameArr) { | |
| 9125 PORT_Free(ss->xtnData.sniNameArr); | |
| 9126 ss->xtnData.sniNameArr = NULL; | |
| 9127 ss->xtnData.sniNameArrSize = 0; | |
| 9128 } | |
| 9129 | |
| 9130 ssl_GetXmitBufLock(ss); | |
| 9131 haveXmitBufLock = PR_TRUE; | |
| 9132 | |
| 9133 rv = ssl3_SendServerHello(ss); | |
| 9134 if (rv != SECSuccess) { | |
| 9135 errCode = PORT_GetError(); | |
| 9136 goto loser; | |
| 9137 } | |
| 9138 | |
| 9139 if (haveSpecWriteLock) { | |
| 9140 ssl_ReleaseSpecWriteLock(ss); | |
| 9141 haveSpecWriteLock = PR_FALSE; | |
| 9142 } | |
| 9143 | |
| 9144 /* NULL value for PMS because we are re-using the old MS */ | |
| 9145 rv = ssl3_InitPendingCipherSpec(ss, NULL); | |
| 9146 if (rv != SECSuccess) { | |
| 9147 errCode = PORT_GetError(); | |
| 9148 goto loser; | |
| 9149 } | |
| 9150 | |
| 9151 rv = ssl3_SendChangeCipherSpecs(ss); | |
| 9152 if (rv != SECSuccess) { | |
| 9153 errCode = PORT_GetError(); | |
| 9154 goto loser; | |
| 9155 } | |
| 9156 rv = ssl3_SendFinished(ss, 0); | |
| 9157 ss->ssl3.hs.ws = wait_change_cipher; | |
| 9158 if (rv != SECSuccess) { | |
| 9159 errCode = PORT_GetError(); | |
| 9160 goto loser; | |
| 9161 } | |
| 9162 | |
| 9163 if (haveXmitBufLock) { | |
| 9164 ssl_ReleaseXmitBufLock(ss); | |
| 9165 haveXmitBufLock = PR_FALSE; | |
| 9166 } | |
| 9167 | |
| 9168 return SECSuccess; | |
| 9169 } while (0); | |
| 9170 | |
| 9171 if (haveSpecWriteLock) { | |
| 9172 ssl_ReleaseSpecWriteLock(ss); | |
| 9173 haveSpecWriteLock = PR_FALSE; | |
| 9174 } | |
| 9175 | |
| 9176 if (sid) { /* we had a sid, but it's no longer valid, free it */ | |
| 9177 SSL_AtomicIncrementLong(&ssl3stats.hch_sid_cache_not_ok); | |
| 9178 if (ss->sec.uncache) | |
| 9179 ss->sec.uncache(sid); | |
| 9180 ssl_FreeSID(sid); | |
| 9181 sid = NULL; | |
| 9182 } | |
| 9183 SSL_AtomicIncrementLong(&ssl3stats.hch_sid_cache_misses); | |
| 9184 | |
| 9185 if (ssl3_ExtensionNegotiated(ss, ssl_server_name_xtn)) { | |
| 9186 int ret = 0; | |
| 9187 if (ss->sniSocketConfig) | |
| 9188 do { /* not a loop */ | |
| 9189 PORT_Assert((ss->ssl3.hs.preliminaryInfo & ssl_preinfo_all) == | |
| 9190 ssl_preinfo_all); | |
| 9191 | |
| 9192 ret = SSL_SNI_SEND_ALERT; | |
| 9193 /* If extension is negotiated, the len of names should > 0. */ | |
| 9194 if (ss->xtnData.sniNameArrSize) { | |
| 9195 /* Calling client callback to reconfigure the socket. */ | |
| 9196 ret = (SECStatus)(*ss->sniSocketConfig)(ss->fd, | |
| 9197 ss->xtnData.sniNameA
rr, | |
| 9198 ss->xtnData.sniNameA
rrSize, | |
| 9199 ss->sniSocketConfigA
rg); | |
| 9200 } | |
| 9201 if (ret <= SSL_SNI_SEND_ALERT) { | |
| 9202 /* Application does not know the name or was not able to | |
| 9203 * properly reconfigure the socket. */ | |
| 9204 errCode = SSL_ERROR_UNRECOGNIZED_NAME_ALERT; | |
| 9205 desc = unrecognized_name; | |
| 9206 break; | |
| 9207 } else if (ret == SSL_SNI_CURRENT_CONFIG_IS_USED) { | |
| 9208 SECStatus rv = SECSuccess; | |
| 9209 SECItem *cwsName, *pwsName; | |
| 9210 | |
| 9211 ssl_GetSpecWriteLock(ss); /*******************************/ | |
| 9212 pwsName = &ss->ssl3.pwSpec->srvVirtName; | |
| 9213 cwsName = &ss->ssl3.cwSpec->srvVirtName; | |
| 9214 #ifndef SSL_SNI_ALLOW_NAME_CHANGE_2HS | |
| 9215 /* not allow name change on the 2d HS */ | |
| 9216 if (ss->firstHsDone) { | |
| 9217 if (ssl3_ServerNameCompare(pwsName, cwsName)) { | |
| 9218 ssl_ReleaseSpecWriteLock(ss); /******************/ | |
| 9219 errCode = SSL_ERROR_UNRECOGNIZED_NAME_ALERT; | |
| 9220 desc = handshake_failure; | |
| 9221 ret = SSL_SNI_SEND_ALERT; | |
| 9222 break; | |
| 9223 } | |
| 9224 } | |
| 9225 #endif | |
| 9226 if (pwsName->data) { | |
| 9227 SECITEM_FreeItem(pwsName, PR_FALSE); | |
| 9228 } | |
| 9229 if (cwsName->data) { | |
| 9230 rv = SECITEM_CopyItem(NULL, pwsName, cwsName); | |
| 9231 } | |
| 9232 ssl_ReleaseSpecWriteLock(ss); /**************************/ | |
| 9233 if (rv != SECSuccess) { | |
| 9234 errCode = SSL_ERROR_INTERNAL_ERROR_ALERT; | |
| 9235 desc = internal_error; | |
| 9236 ret = SSL_SNI_SEND_ALERT; | |
| 9237 break; | |
| 9238 } | |
| 9239 } else if ((unsigned int)ret < ss->xtnData.sniNameArrSize) { | |
| 9240 /* Application has configured new socket info. Lets check it | |
| 9241 * and save the name. */ | |
| 9242 SECStatus rv; | |
| 9243 SECItem *name = &ss->xtnData.sniNameArr[ret]; | |
| 9244 int configedCiphers; | |
| 9245 SECItem *pwsName; | |
| 9246 | |
| 9247 /* get rid of the old name and save the newly picked. */ | |
| 9248 /* This code is protected by ssl3HandshakeLock. */ | |
| 9249 ssl_GetSpecWriteLock(ss); /*******************************/ | |
| 9250 #ifndef SSL_SNI_ALLOW_NAME_CHANGE_2HS | |
| 9251 /* not allow name change on the 2d HS */ | |
| 9252 if (ss->firstHsDone) { | |
| 9253 SECItem *cwsName = &ss->ssl3.cwSpec->srvVirtName; | |
| 9254 if (ssl3_ServerNameCompare(name, cwsName)) { | |
| 9255 ssl_ReleaseSpecWriteLock(ss); /******************/ | |
| 9256 errCode = SSL_ERROR_UNRECOGNIZED_NAME_ALERT; | |
| 9257 desc = handshake_failure; | |
| 9258 ret = SSL_SNI_SEND_ALERT; | |
| 9259 break; | |
| 9260 } | |
| 9261 } | |
| 9262 #endif | |
| 9263 pwsName = &ss->ssl3.pwSpec->srvVirtName; | |
| 9264 if (pwsName->data) { | |
| 9265 SECITEM_FreeItem(pwsName, PR_FALSE); | |
| 9266 } | |
| 9267 rv = SECITEM_CopyItem(NULL, pwsName, name); | |
| 9268 ssl_ReleaseSpecWriteLock(ss); /***************************/ | |
| 9269 if (rv != SECSuccess) { | |
| 9270 errCode = SSL_ERROR_INTERNAL_ERROR_ALERT; | |
| 9271 desc = internal_error; | |
| 9272 ret = SSL_SNI_SEND_ALERT; | |
| 9273 break; | |
| 9274 } | |
| 9275 configedCiphers = ssl3_config_match_init(ss); | |
| 9276 if (configedCiphers <= 0) { | |
| 9277 /* no ciphers are working/supported */ | |
| 9278 errCode = PORT_GetError(); | |
| 9279 desc = handshake_failure; | |
| 9280 ret = SSL_SNI_SEND_ALERT; | |
| 9281 break; | |
| 9282 } | |
| 9283 /* Need to tell the client that application has picked | |
| 9284 * the name from the offered list and reconfigured the socke
t. | |
| 9285 */ | |
| 9286 ssl3_RegisterServerHelloExtensionSender(ss, ssl_server_name_
xtn, | |
| 9287 ssl3_SendServerNameX
tn); | |
| 9288 } else { | |
| 9289 /* Callback returned index outside of the boundary. */ | |
| 9290 PORT_Assert((unsigned int)ret < ss->xtnData.sniNameArrSize); | |
| 9291 errCode = SSL_ERROR_INTERNAL_ERROR_ALERT; | |
| 9292 desc = internal_error; | |
| 9293 ret = SSL_SNI_SEND_ALERT; | |
| 9294 break; | |
| 9295 } | |
| 9296 } while (0); | |
| 9297 /* Free sniNameArr. The data that each SECItem in the array | |
| 9298 * points into is the data from the input buffer "b". It will | |
| 9299 * not be available outside the scope of this or it's child | |
| 9300 * functions.*/ | |
| 9301 if (ss->xtnData.sniNameArr) { | |
| 9302 PORT_Free(ss->xtnData.sniNameArr); | |
| 9303 ss->xtnData.sniNameArr = NULL; | |
| 9304 ss->xtnData.sniNameArrSize = 0; | |
| 9305 } | |
| 9306 if (ret <= SSL_SNI_SEND_ALERT) { | |
| 9307 /* desc and errCode should be set. */ | |
| 9308 goto alert_loser; | |
| 9309 } | |
| 9310 } | |
| 9311 #ifndef SSL_SNI_ALLOW_NAME_CHANGE_2HS | |
| 9312 else if (ss->firstHsDone) { | |
| 9313 /* Check that we don't have the name is current spec | |
| 9314 * if this extension was not negotiated on the 2d hs. */ | |
| 9315 PRBool passed = PR_TRUE; | |
| 9316 ssl_GetSpecReadLock(ss); /*******************************/ | |
| 9317 if (ss->ssl3.cwSpec->srvVirtName.data) { | |
| 9318 passed = PR_FALSE; | |
| 9319 } | |
| 9320 ssl_ReleaseSpecReadLock(ss); /***************************/ | |
| 9321 if (!passed) { | |
| 9322 errCode = SSL_ERROR_UNRECOGNIZED_NAME_ALERT; | |
| 9323 desc = handshake_failure; | |
| 9324 goto alert_loser; | |
| 9325 } | |
| 9326 } | |
| 9327 #endif | |
| 9328 | |
| 9329 /* If this is TLS 1.3 we are expecting a ClientKeyShare | |
| 9330 * extension. Missing/absent extension cause failure | |
| 9331 * below. */ | |
| 9332 if (isTLS13) { | |
| 9333 rv = tls13_HandleClientKeyShare(ss); | |
| 9334 if (rv != SECSuccess) { | |
| 9335 errCode = PORT_GetError(); | |
| 9336 goto alert_loser; | |
| 9337 } | |
| 9338 } | |
| 9339 | |
| 9340 sid = ssl3_NewSessionID(ss, PR_TRUE); | |
| 9341 if (sid == NULL) { | |
| 9342 errCode = PORT_GetError(); | |
| 9343 goto loser; /* memory error is set. */ | |
| 9344 } | |
| 9345 ss->sec.ci.sid = sid; | |
| 9346 | |
| 9347 sid->u.ssl3.keys.extendedMasterSecretUsed = | |
| 9348 ssl3_ExtensionNegotiated(ss, ssl_extended_master_secret_xtn); | |
| 9349 ss->ssl3.hs.isResuming = PR_FALSE; | |
| 9350 | |
| 9351 ssl_GetXmitBufLock(ss); | |
| 9352 if (isTLS13) { | |
| 9353 rv = tls13_SendServerHelloSequence(ss); | |
| 9354 } else { | |
| 9355 rv = ssl3_SendServerHelloSequence(ss); | |
| 9356 } | |
| 9357 ssl_ReleaseXmitBufLock(ss); | |
| 9358 if (rv != SECSuccess) { | |
| 9359 errCode = PORT_GetError(); | |
| 9360 desc = handshake_failure; | |
| 9361 goto alert_loser; | |
| 9362 } | |
| 9363 | |
| 9364 if (haveXmitBufLock) { | |
| 9365 ssl_ReleaseXmitBufLock(ss); | |
| 9366 haveXmitBufLock = PR_FALSE; | |
| 9367 } | |
| 9368 | |
| 9369 return SECSuccess; | |
| 9370 | |
| 9371 alert_loser: | |
| 9372 if (haveSpecWriteLock) { | |
| 9373 ssl_ReleaseSpecWriteLock(ss); | |
| 9374 haveSpecWriteLock = PR_FALSE; | |
| 9375 } | |
| 9376 (void)SSL3_SendAlert(ss, level, desc); | |
| 9377 /* FALLTHRU */ | |
| 9378 loser: | |
| 9379 if (haveSpecWriteLock) { | |
| 9380 ssl_ReleaseSpecWriteLock(ss); | |
| 9381 haveSpecWriteLock = PR_FALSE; | |
| 9382 } | |
| 9383 | |
| 9384 if (haveXmitBufLock) { | |
| 9385 ssl_ReleaseXmitBufLock(ss); | |
| 9386 haveXmitBufLock = PR_FALSE; | |
| 9387 } | |
| 9388 | |
| 9389 PORT_SetError(errCode); | |
| 9390 return SECFailure; | |
| 9391 } | |
| 9392 | |
| 9393 /* | |
| 9394 * ssl3_HandleV2ClientHello is used when a V2 formatted hello comes | |
| 9395 * in asking to use the V3 handshake. | |
| 9396 * Called from ssl2_HandleClientHelloMessage() in sslcon.c | |
| 9397 */ | |
| 9398 SECStatus | |
| 9399 ssl3_HandleV2ClientHello(sslSocket *ss, unsigned char *buffer, int length) | |
| 9400 { | |
| 9401 sslSessionID *sid = NULL; | |
| 9402 unsigned char *suites; | |
| 9403 unsigned char *random; | |
| 9404 SSL3ProtocolVersion version; | |
| 9405 SECStatus rv; | |
| 9406 int i; | |
| 9407 int j; | |
| 9408 int sid_length; | |
| 9409 int suite_length; | |
| 9410 int rand_length; | |
| 9411 int errCode = SSL_ERROR_RX_MALFORMED_CLIENT_HELLO; | |
| 9412 SSL3AlertDescription desc = handshake_failure; | |
| 9413 | |
| 9414 SSL_TRC(3, ("%d: SSL3[%d]: handle v2 client_hello", SSL_GETPID(), ss->fd)); | |
| 9415 | |
| 9416 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 9417 | |
| 9418 ssl_GetSSL3HandshakeLock(ss); | |
| 9419 | |
| 9420 PORT_Memset(&ss->xtnData, 0, sizeof(TLSExtensionData)); | |
| 9421 | |
| 9422 rv = ssl3_InitState(ss); | |
| 9423 if (rv != SECSuccess) { | |
| 9424 ssl_ReleaseSSL3HandshakeLock(ss); | |
| 9425 return rv; /* ssl3_InitState has set the error code. */ | |
| 9426 } | |
| 9427 rv = ssl3_RestartHandshakeHashes(ss); | |
| 9428 if (rv != SECSuccess) { | |
| 9429 ssl_ReleaseSSL3HandshakeLock(ss); | |
| 9430 return rv; | |
| 9431 } | |
| 9432 | |
| 9433 if (ss->ssl3.hs.ws != wait_client_hello) { | |
| 9434 desc = unexpected_message; | |
| 9435 errCode = SSL_ERROR_RX_UNEXPECTED_CLIENT_HELLO; | |
| 9436 goto loser; /* alert_loser */ | |
| 9437 } | |
| 9438 | |
| 9439 version = (buffer[1] << 8) | buffer[2]; | |
| 9440 suite_length = (buffer[3] << 8) | buffer[4]; | |
| 9441 sid_length = (buffer[5] << 8) | buffer[6]; | |
| 9442 rand_length = (buffer[7] << 8) | buffer[8]; | |
| 9443 ss->clientHelloVersion = version; | |
| 9444 | |
| 9445 if (version >= SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 9446 /* [draft-ietf-tls-tls-11; C.3] forbids sending a TLS 1.3 | |
| 9447 * ClientHello using the backwards-compatible format. */ | |
| 9448 desc = illegal_parameter; | |
| 9449 errCode = SSL_ERROR_RX_MALFORMED_CLIENT_HELLO; | |
| 9450 goto loser; | |
| 9451 } | |
| 9452 | |
| 9453 rv = ssl3_NegotiateVersion(ss, version, PR_TRUE); | |
| 9454 if (rv != SECSuccess) { | |
| 9455 /* send back which ever alert client will understand. */ | |
| 9456 desc = (version > SSL_LIBRARY_VERSION_3_0) ? protocol_version | |
| 9457 : handshake_failure; | |
| 9458 errCode = SSL_ERROR_UNSUPPORTED_VERSION; | |
| 9459 goto alert_loser; | |
| 9460 } | |
| 9461 ss->ssl3.hs.preliminaryInfo |= ssl_preinfo_version; | |
| 9462 | |
| 9463 rv = ssl3_InitHandshakeHashes(ss); | |
| 9464 if (rv != SECSuccess) { | |
| 9465 desc = internal_error; | |
| 9466 errCode = PORT_GetError(); | |
| 9467 goto alert_loser; | |
| 9468 } | |
| 9469 | |
| 9470 /* if we get a non-zero SID, just ignore it. */ | |
| 9471 if (length != | |
| 9472 SSL_HL_CLIENT_HELLO_HBYTES + suite_length + sid_length + rand_length) { | |
| 9473 SSL_DBG(("%d: SSL3[%d]: bad v2 client hello message, len=%d should=%d", | |
| 9474 SSL_GETPID(), ss->fd, length, | |
| 9475 SSL_HL_CLIENT_HELLO_HBYTES + suite_length + sid_length + | |
| 9476 rand_length)); | |
| 9477 goto loser; /* malformed */ /* alert_loser */ | |
| 9478 } | |
| 9479 | |
| 9480 suites = buffer + SSL_HL_CLIENT_HELLO_HBYTES; | |
| 9481 random = suites + suite_length + sid_length; | |
| 9482 | |
| 9483 if (rand_length < SSL_MIN_CHALLENGE_BYTES || | |
| 9484 rand_length > SSL_MAX_CHALLENGE_BYTES) { | |
| 9485 goto loser; /* malformed */ /* alert_loser */ | |
| 9486 } | |
| 9487 | |
| 9488 PORT_Assert(SSL_MAX_CHALLENGE_BYTES == SSL3_RANDOM_LENGTH); | |
| 9489 | |
| 9490 PORT_Memset(&ss->ssl3.hs.client_random, 0, SSL3_RANDOM_LENGTH); | |
| 9491 PORT_Memcpy( | |
| 9492 &ss->ssl3.hs.client_random.rand[SSL3_RANDOM_LENGTH - rand_length], | |
| 9493 random, rand_length); | |
| 9494 | |
| 9495 PRINT_BUF(60, (ss, "client random:", &ss->ssl3.hs.client_random.rand[0], | |
| 9496 SSL3_RANDOM_LENGTH)); | |
| 9497 #ifndef NSS_DISABLE_ECC | |
| 9498 /* Disable any ECC cipher suites for which we have no cert. */ | |
| 9499 ssl3_FilterECCipherSuitesByServerCerts(ss); | |
| 9500 #endif | |
| 9501 i = ssl3_config_match_init(ss); | |
| 9502 if (i <= 0) { | |
| 9503 errCode = PORT_GetError(); /* error code is already set. */ | |
| 9504 goto alert_loser; | |
| 9505 } | |
| 9506 | |
| 9507 /* Select a cipher suite. | |
| 9508 ** | |
| 9509 ** NOTE: This suite selection algorithm should be the same as the one in | |
| 9510 ** ssl3_HandleClientHello(). | |
| 9511 ** | |
| 9512 ** See the comments about export cipher suites in ssl3_HandleClientHello(). | |
| 9513 */ | |
| 9514 for (j = 0; j < ssl_V3_SUITES_IMPLEMENTED; j++) { | |
| 9515 ssl3CipherSuiteCfg *suite = &ss->cipherSuites[j]; | |
| 9516 SSLVersionRange vrange = { ss->version, ss->version }; | |
| 9517 if (!config_match(suite, ss->ssl3.policy, PR_TRUE, &vrange, ss)) { | |
| 9518 continue; | |
| 9519 } | |
| 9520 for (i = 0; i + 2 < suite_length; i += 3) { | |
| 9521 PRUint32 suite_i = (suites[i] << 16) | (suites[i + 1] << 8) | suites
[i + 2]; | |
| 9522 if (suite_i == suite->cipher_suite) { | |
| 9523 ss->ssl3.hs.cipher_suite = suite->cipher_suite; | |
| 9524 ss->ssl3.hs.suite_def = | |
| 9525 ssl_LookupCipherSuiteDef(ss->ssl3.hs.cipher_suite); | |
| 9526 ss->ssl3.hs.kea_def = | |
| 9527 &kea_defs[ss->ssl3.hs.suite_def->key_exchange_alg]; | |
| 9528 ss->ssl3.hs.preliminaryInfo |= ssl_preinfo_cipher_suite; | |
| 9529 goto suite_found; | |
| 9530 } | |
| 9531 } | |
| 9532 } | |
| 9533 errCode = SSL_ERROR_NO_CYPHER_OVERLAP; | |
| 9534 goto alert_loser; | |
| 9535 | |
| 9536 suite_found: | |
| 9537 | |
| 9538 /* Look for the SCSV, and if found, treat it just like an empty RI | |
| 9539 * extension by processing a local copy of an empty RI extension. | |
| 9540 */ | |
| 9541 for (i = 0; i + 2 < suite_length; i += 3) { | |
| 9542 PRUint32 suite_i = (suites[i] << 16) | (suites[i + 1] << 8) | suites[i +
2]; | |
| 9543 if (suite_i == TLS_EMPTY_RENEGOTIATION_INFO_SCSV) { | |
| 9544 SSL3Opaque *b2 = (SSL3Opaque *)emptyRIext; | |
| 9545 PRUint32 L2 = sizeof emptyRIext; | |
| 9546 (void)ssl3_HandleHelloExtensions(ss, &b2, &L2, client_hello); | |
| 9547 break; | |
| 9548 } | |
| 9549 } | |
| 9550 | |
| 9551 if (ss->opt.requireSafeNegotiation && | |
| 9552 !ssl3_ExtensionNegotiated(ss, ssl_renegotiation_info_xtn)) { | |
| 9553 desc = handshake_failure; | |
| 9554 errCode = SSL_ERROR_UNSAFE_NEGOTIATION; | |
| 9555 goto alert_loser; | |
| 9556 } | |
| 9557 | |
| 9558 ss->ssl3.hs.compression = ssl_compression_null; | |
| 9559 ss->sec.send = ssl3_SendApplicationData; | |
| 9560 | |
| 9561 /* we don't even search for a cache hit here. It's just a miss. */ | |
| 9562 SSL_AtomicIncrementLong(&ssl3stats.hch_sid_cache_misses); | |
| 9563 sid = ssl3_NewSessionID(ss, PR_TRUE); | |
| 9564 if (sid == NULL) { | |
| 9565 errCode = PORT_GetError(); | |
| 9566 goto loser; /* memory error is set. */ | |
| 9567 } | |
| 9568 ss->sec.ci.sid = sid; | |
| 9569 /* do not worry about memory leak of sid since it now belongs to ci */ | |
| 9570 | |
| 9571 /* We have to update the handshake hashes before we can send stuff */ | |
| 9572 rv = ssl3_UpdateHandshakeHashes(ss, buffer, length); | |
| 9573 if (rv != SECSuccess) { | |
| 9574 errCode = PORT_GetError(); | |
| 9575 goto loser; | |
| 9576 } | |
| 9577 | |
| 9578 ssl_GetXmitBufLock(ss); | |
| 9579 rv = ssl3_SendServerHelloSequence(ss); | |
| 9580 ssl_ReleaseXmitBufLock(ss); | |
| 9581 if (rv != SECSuccess) { | |
| 9582 errCode = PORT_GetError(); | |
| 9583 goto loser; | |
| 9584 } | |
| 9585 | |
| 9586 /* XXX_1 The call stack to here is: | |
| 9587 * ssl_Do1stHandshake -> ssl2_HandleClientHelloMessage -> here. | |
| 9588 * ssl2_HandleClientHelloMessage returns whatever we return here. | |
| 9589 * ssl_Do1stHandshake will continue looping if it gets back either | |
| 9590 * SECSuccess or SECWouldBlock. | |
| 9591 * SECSuccess is preferable here. See XXX_1 in sslgathr.c. | |
| 9592 */ | |
| 9593 ssl_ReleaseSSL3HandshakeLock(ss); | |
| 9594 return SECSuccess; | |
| 9595 | |
| 9596 alert_loser: | |
| 9597 SSL3_SendAlert(ss, alert_fatal, desc); | |
| 9598 loser: | |
| 9599 ssl_ReleaseSSL3HandshakeLock(ss); | |
| 9600 PORT_SetError(errCode); | |
| 9601 return SECFailure; | |
| 9602 } | |
| 9603 | |
| 9604 /* The negotiated version number has been already placed in ss->version. | |
| 9605 ** | |
| 9606 ** Called from: ssl3_HandleClientHello (resuming session), | |
| 9607 ** ssl3_SendServerHelloSequence <- ssl3_HandleClientHello (new session), | |
| 9608 ** ssl3_SendServerHelloSequence <- ssl3_HandleV2ClientHello (new session) | |
| 9609 */ | |
| 9610 SECStatus | |
| 9611 ssl3_SendServerHello(sslSocket *ss) | |
| 9612 { | |
| 9613 sslSessionID *sid; | |
| 9614 SECStatus rv; | |
| 9615 PRUint32 maxBytes = 65535; | |
| 9616 PRUint32 length; | |
| 9617 PRInt32 extensions_len = 0; | |
| 9618 SSL3ProtocolVersion version; | |
| 9619 | |
| 9620 SSL_TRC(3, ("%d: SSL3[%d]: send server_hello handshake", SSL_GETPID(), | |
| 9621 ss->fd)); | |
| 9622 | |
| 9623 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | |
| 9624 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 9625 | |
| 9626 if (!IS_DTLS(ss)) { | |
| 9627 PORT_Assert(MSB(ss->version) == MSB(SSL_LIBRARY_VERSION_3_0)); | |
| 9628 | |
| 9629 if (MSB(ss->version) != MSB(SSL_LIBRARY_VERSION_3_0)) { | |
| 9630 PORT_SetError(SSL_ERROR_NO_CYPHER_OVERLAP); | |
| 9631 return SECFailure; | |
| 9632 } | |
| 9633 } else { | |
| 9634 PORT_Assert(MSB(ss->version) == MSB(SSL_LIBRARY_VERSION_DTLS_1_0)); | |
| 9635 | |
| 9636 if (MSB(ss->version) != MSB(SSL_LIBRARY_VERSION_DTLS_1_0)) { | |
| 9637 PORT_SetError(SSL_ERROR_NO_CYPHER_OVERLAP); | |
| 9638 return SECFailure; | |
| 9639 } | |
| 9640 } | |
| 9641 | |
| 9642 sid = ss->sec.ci.sid; | |
| 9643 | |
| 9644 extensions_len = ssl3_CallHelloExtensionSenders( | |
| 9645 ss, PR_FALSE, maxBytes, &ss->xtnData.serverHelloSenders[0]); | |
| 9646 if (extensions_len > 0) | |
| 9647 extensions_len += 2; /* Add sizeof total extension length */ | |
| 9648 | |
| 9649 /* TLS 1.3 doesn't use the session_id or compression_method | |
| 9650 * fields in the ServerHello. */ | |
| 9651 length = sizeof(SSL3ProtocolVersion) + SSL3_RANDOM_LENGTH; | |
| 9652 if (ss->version < SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 9653 length += 1 + ((sid == NULL) ? 0 : sid->u.ssl3.sessionIDLength); | |
| 9654 } | |
| 9655 length += sizeof(ssl3CipherSuite); | |
| 9656 if (ss->version < SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 9657 length += 1; /* Compression */ | |
| 9658 } | |
| 9659 length += extensions_len; | |
| 9660 | |
| 9661 rv = ssl3_AppendHandshakeHeader(ss, server_hello, length); | |
| 9662 if (rv != SECSuccess) { | |
| 9663 return rv; /* err set by AppendHandshake. */ | |
| 9664 } | |
| 9665 | |
| 9666 if (IS_DTLS(ss)) { | |
| 9667 version = dtls_TLSVersionToDTLSVersion(ss->version); | |
| 9668 } else { | |
| 9669 version = ss->version; | |
| 9670 } | |
| 9671 | |
| 9672 rv = ssl3_AppendHandshakeNumber(ss, version, 2); | |
| 9673 if (rv != SECSuccess) { | |
| 9674 return rv; /* err set by AppendHandshake. */ | |
| 9675 } | |
| 9676 /* Random already generated in ssl3_HandleClientHello */ | |
| 9677 rv = ssl3_AppendHandshake( | |
| 9678 ss, &ss->ssl3.hs.server_random, SSL3_RANDOM_LENGTH); | |
| 9679 if (rv != SECSuccess) { | |
| 9680 return rv; /* err set by AppendHandshake. */ | |
| 9681 } | |
| 9682 | |
| 9683 if (ss->version < SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 9684 if (sid) { | |
| 9685 rv = ssl3_AppendHandshakeVariable( | |
| 9686 ss, sid->u.ssl3.sessionID, sid->u.ssl3.sessionIDLength, 1); | |
| 9687 } else { | |
| 9688 rv = ssl3_AppendHandshakeNumber(ss, 0, 1); | |
| 9689 } | |
| 9690 if (rv != SECSuccess) { | |
| 9691 return rv; /* err set by AppendHandshake. */ | |
| 9692 } | |
| 9693 } | |
| 9694 | |
| 9695 rv = ssl3_AppendHandshakeNumber(ss, ss->ssl3.hs.cipher_suite, 2); | |
| 9696 if (rv != SECSuccess) { | |
| 9697 return rv; /* err set by AppendHandshake. */ | |
| 9698 } | |
| 9699 if (ss->version < SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 9700 rv = ssl3_AppendHandshakeNumber(ss, ss->ssl3.hs.compression, 1); | |
| 9701 if (rv != SECSuccess) { | |
| 9702 return rv; /* err set by AppendHandshake. */ | |
| 9703 } | |
| 9704 } | |
| 9705 if (extensions_len) { | |
| 9706 PRInt32 sent_len; | |
| 9707 | |
| 9708 extensions_len -= 2; | |
| 9709 rv = ssl3_AppendHandshakeNumber(ss, extensions_len, 2); | |
| 9710 if (rv != SECSuccess) | |
| 9711 return rv; /* err set by ssl3_AppendHandshakeNumber */ | |
| 9712 sent_len = ssl3_CallHelloExtensionSenders(ss, PR_TRUE, extensions_len, | |
| 9713 &ss->xtnData.serverHelloSender
s[0]); | |
| 9714 PORT_Assert(sent_len == extensions_len); | |
| 9715 if (sent_len != extensions_len) { | |
| 9716 if (sent_len >= 0) | |
| 9717 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 9718 return SECFailure; | |
| 9719 } | |
| 9720 } | |
| 9721 rv = ssl3_SetupPendingCipherSpec(ss); | |
| 9722 if (rv != SECSuccess) { | |
| 9723 return rv; /* err set by ssl3_SetupPendingCipherSpec */ | |
| 9724 } | |
| 9725 | |
| 9726 return SECSuccess; | |
| 9727 } | |
| 9728 | |
| 9729 static SECStatus | |
| 9730 ssl3_PickSignatureHashAlgorithm(sslSocket *ss, | |
| 9731 SSLSignatureAndHashAlg *out); | |
| 9732 | |
| 9733 static SECStatus | |
| 9734 ssl3_SendDHServerKeyExchange(sslSocket *ss) | |
| 9735 { | |
| 9736 const ssl3KEADef *kea_def = ss->ssl3.hs.kea_def; | |
| 9737 SECStatus rv = SECFailure; | |
| 9738 int length; | |
| 9739 PRBool isTLS; | |
| 9740 SECItem signed_hash = { siBuffer, NULL, 0 }; | |
| 9741 SSL3Hashes hashes; | |
| 9742 SSLSignatureAndHashAlg sigAndHash; | |
| 9743 SECKEYDHParams dhParam; | |
| 9744 | |
| 9745 ssl3KeyPair *keyPair = NULL; | |
| 9746 SECKEYPublicKey *pubKey = NULL; /* Ephemeral DH key */ | |
| 9747 SECKEYPrivateKey *privKey = NULL; /* Ephemeral DH key */ | |
| 9748 int certIndex = -1; | |
| 9749 | |
| 9750 if (kea_def->kea != kea_dhe_dss && kea_def->kea != kea_dhe_rsa) { | |
| 9751 /* TODO: Support DH_anon. It might be sufficient to drop the signature. | |
| 9752 See bug 1170510. */ | |
| 9753 PORT_SetError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); | |
| 9754 return SECFailure; | |
| 9755 } | |
| 9756 | |
| 9757 dhParam.prime.data = ss->dheParams->prime.data; | |
| 9758 dhParam.prime.len = ss->dheParams->prime.len; | |
| 9759 dhParam.base.data = ss->dheParams->base.data; | |
| 9760 dhParam.base.len = ss->dheParams->base.len; | |
| 9761 | |
| 9762 PRINT_BUF(60, (NULL, "Server DH p", dhParam.prime.data, | |
| 9763 dhParam.prime.len)); | |
| 9764 PRINT_BUF(60, (NULL, "Server DH g", dhParam.base.data, | |
| 9765 dhParam.base.len)); | |
| 9766 | |
| 9767 /* Generate ephemeral DH keypair */ | |
| 9768 privKey = SECKEY_CreateDHPrivateKey(&dhParam, &pubKey, NULL); | |
| 9769 if (!privKey || !pubKey) { | |
| 9770 ssl_MapLowLevelError(SEC_ERROR_KEYGEN_FAIL); | |
| 9771 rv = SECFailure; | |
| 9772 goto loser; | |
| 9773 } | |
| 9774 | |
| 9775 keyPair = ssl3_NewKeyPair(privKey, pubKey); | |
| 9776 if (!keyPair) { | |
| 9777 ssl_MapLowLevelError(SEC_ERROR_KEYGEN_FAIL); | |
| 9778 goto loser; | |
| 9779 } | |
| 9780 | |
| 9781 PRINT_BUF(50, (ss, "DH public value:", | |
| 9782 pubKey->u.dh.publicValue.data, | |
| 9783 pubKey->u.dh.publicValue.len)); | |
| 9784 | |
| 9785 if (ssl3_PickSignatureHashAlgorithm(ss, &sigAndHash) != SECSuccess) { | |
| 9786 ssl_MapLowLevelError(SEC_ERROR_KEYGEN_FAIL); | |
| 9787 goto loser; | |
| 9788 } | |
| 9789 | |
| 9790 rv = ssl3_ComputeDHKeyHash(sigAndHash.hashAlg, | |
| 9791 pubKey->u.dh.prime, | |
| 9792 pubKey->u.dh.base, | |
| 9793 pubKey->u.dh.publicValue, | |
| 9794 &ss->ssl3.hs.client_random, | |
| 9795 &ss->ssl3.hs.server_random, | |
| 9796 &hashes, ss->opt.bypassPKCS11); | |
| 9797 if (rv != SECSuccess) { | |
| 9798 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); | |
| 9799 goto loser; | |
| 9800 } | |
| 9801 | |
| 9802 /* It has been suggested to test kea_def->signKeyType instead, and to use | |
| 9803 * ssl_auth_* instead. Investigate what to do. See bug 102794. */ | |
| 9804 if (kea_def->kea == kea_dhe_rsa) | |
| 9805 certIndex = ssl_kea_rsa; | |
| 9806 else | |
| 9807 certIndex = ssl_kea_dh; | |
| 9808 | |
| 9809 isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0); | |
| 9810 rv = ssl3_SignHashes(&hashes, ss->serverCerts[certIndex].SERVERKEY, | |
| 9811 &signed_hash, isTLS); | |
| 9812 if (rv != SECSuccess) { | |
| 9813 goto loser; /* ssl3_SignHashes has set err. */ | |
| 9814 } | |
| 9815 if (signed_hash.data == NULL) { | |
| 9816 PORT_SetError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); | |
| 9817 goto loser; | |
| 9818 } | |
| 9819 length = 2 + pubKey->u.dh.prime.len + | |
| 9820 2 + pubKey->u.dh.base.len + | |
| 9821 2 + pubKey->u.dh.publicValue.len + | |
| 9822 2 + signed_hash.len; | |
| 9823 | |
| 9824 if (ss->ssl3.pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2) { | |
| 9825 length += 2; | |
| 9826 } | |
| 9827 | |
| 9828 rv = ssl3_AppendHandshakeHeader(ss, server_key_exchange, length); | |
| 9829 if (rv != SECSuccess) { | |
| 9830 goto loser; /* err set by AppendHandshake. */ | |
| 9831 } | |
| 9832 | |
| 9833 rv = ssl3_AppendHandshakeVariable(ss, pubKey->u.dh.prime.data, | |
| 9834 pubKey->u.dh.prime.len, 2); | |
| 9835 if (rv != SECSuccess) { | |
| 9836 goto loser; /* err set by AppendHandshake. */ | |
| 9837 } | |
| 9838 | |
| 9839 rv = ssl3_AppendHandshakeVariable(ss, pubKey->u.dh.base.data, | |
| 9840 pubKey->u.dh.base.len, 2); | |
| 9841 if (rv != SECSuccess) { | |
| 9842 goto loser; /* err set by AppendHandshake. */ | |
| 9843 } | |
| 9844 | |
| 9845 rv = ssl3_AppendHandshakeVariable(ss, pubKey->u.dh.publicValue.data, | |
| 9846 pubKey->u.dh.publicValue.len, 2); | |
| 9847 if (rv != SECSuccess) { | |
| 9848 goto loser; /* err set by AppendHandshake. */ | |
| 9849 } | |
| 9850 | |
| 9851 if (ss->ssl3.pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2) { | |
| 9852 rv = ssl3_AppendSignatureAndHashAlgorithm(ss, &sigAndHash); | |
| 9853 if (rv != SECSuccess) { | |
| 9854 goto loser; /* err set by AppendHandshake. */ | |
| 9855 } | |
| 9856 } | |
| 9857 | |
| 9858 rv = ssl3_AppendHandshakeVariable(ss, signed_hash.data, | |
| 9859 signed_hash.len, 2); | |
| 9860 if (rv != SECSuccess) { | |
| 9861 goto loser; /* err set by AppendHandshake. */ | |
| 9862 } | |
| 9863 PORT_Free(signed_hash.data); | |
| 9864 ss->dheKeyPair = keyPair; | |
| 9865 return SECSuccess; | |
| 9866 | |
| 9867 loser: | |
| 9868 if (signed_hash.data) | |
| 9869 PORT_Free(signed_hash.data); | |
| 9870 if (privKey) | |
| 9871 SECKEY_DestroyPrivateKey(privKey); | |
| 9872 if (pubKey) | |
| 9873 SECKEY_DestroyPublicKey(pubKey); | |
| 9874 return SECFailure; | |
| 9875 } | |
| 9876 | |
| 9877 /* ssl3_PickSignatureHashAlgorithm selects a hash algorithm to use when signing | |
| 9878 * elements of the handshake. (The negotiated cipher suite determines the | |
| 9879 * signature algorithm.) Prior to TLS 1.2, the MD5/SHA1 combination is always | |
| 9880 * used. With TLS 1.2, a client may advertise its support for signature and | |
| 9881 * hash combinations. */ | |
| 9882 static SECStatus | |
| 9883 ssl3_PickSignatureHashAlgorithm(sslSocket *ss, | |
| 9884 SSLSignatureAndHashAlg *out) | |
| 9885 { | |
| 9886 PRUint32 policy; | |
| 9887 unsigned int i, j; | |
| 9888 | |
| 9889 out->sigAlg = ss->ssl3.hs.kea_def->signKeyType; | |
| 9890 | |
| 9891 if (ss->version <= SSL_LIBRARY_VERSION_TLS_1_1) { | |
| 9892 /* SEC_OID_UNKNOWN means the MD5/SHA1 combo hash used in TLS 1.1 and | |
| 9893 * prior. */ | |
| 9894 out->hashAlg = ssl_hash_none; | |
| 9895 return SECSuccess; | |
| 9896 } | |
| 9897 | |
| 9898 if (ss->ssl3.hs.numClientSigAndHash == 0) { | |
| 9899 /* If the client didn't provide any signature_algorithms extension then | |
| 9900 * we can assume that they support SHA-1: | |
| 9901 * https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 */ | |
| 9902 out->hashAlg = ssl_hash_sha1; | |
| 9903 return SECSuccess; | |
| 9904 } | |
| 9905 | |
| 9906 /* Here we look for the first server preference that the client has | |
| 9907 * indicated support for in their signature_algorithms extension. */ | |
| 9908 for (i = 0; i < ss->ssl3.signatureAlgorithmCount; ++i) { | |
| 9909 const SSLSignatureAndHashAlg *serverPref = | |
| 9910 &ss->ssl3.signatureAlgorithms[i]; | |
| 9911 SECOidTag hashOID; | |
| 9912 if (serverPref->sigAlg != out->sigAlg) { | |
| 9913 continue; | |
| 9914 } | |
| 9915 hashOID = ssl3_TLSHashAlgorithmToOID(serverPref->hashAlg); | |
| 9916 if ((NSS_GetAlgorithmPolicy(hashOID, &policy) == SECSuccess) && | |
| 9917 !(policy & NSS_USE_ALG_IN_SSL_KX)) { | |
| 9918 /* we ignore hashes we don't support */ | |
| 9919 continue; | |
| 9920 } | |
| 9921 for (j = 0; j < ss->ssl3.hs.numClientSigAndHash; j++) { | |
| 9922 const SSLSignatureAndHashAlg *clientPref = | |
| 9923 &ss->ssl3.hs.clientSigAndHash[j]; | |
| 9924 if (clientPref->hashAlg == serverPref->hashAlg && | |
| 9925 clientPref->sigAlg == out->sigAlg) { | |
| 9926 out->hashAlg = serverPref->hashAlg; | |
| 9927 return SECSuccess; | |
| 9928 } | |
| 9929 } | |
| 9930 } | |
| 9931 | |
| 9932 PORT_SetError(SSL_ERROR_UNSUPPORTED_HASH_ALGORITHM); | |
| 9933 return SECFailure; | |
| 9934 } | |
| 9935 | |
| 9936 static SECStatus | |
| 9937 ssl3_SendServerKeyExchange(sslSocket *ss) | |
| 9938 { | |
| 9939 const ssl3KEADef *kea_def = ss->ssl3.hs.kea_def; | |
| 9940 SECStatus rv = SECFailure; | |
| 9941 int length; | |
| 9942 PRBool isTLS; | |
| 9943 SECItem signed_hash = { siBuffer, NULL, 0 }; | |
| 9944 SSL3Hashes hashes; | |
| 9945 SECKEYPublicKey *sdPub; /* public key for step-down */ | |
| 9946 SSLSignatureAndHashAlg sigAndHash; | |
| 9947 | |
| 9948 SSL_TRC(3, ("%d: SSL3[%d]: send server_key_exchange handshake", | |
| 9949 SSL_GETPID(), ss->fd)); | |
| 9950 | |
| 9951 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | |
| 9952 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 9953 | |
| 9954 if (ssl3_PickSignatureHashAlgorithm(ss, &sigAndHash) != SECSuccess) { | |
| 9955 return SECFailure; | |
| 9956 } | |
| 9957 | |
| 9958 switch (kea_def->exchKeyType) { | |
| 9959 case kt_rsa: | |
| 9960 /* Perform SSL Step-Down here. */ | |
| 9961 sdPub = ss->stepDownKeyPair->pubKey; | |
| 9962 PORT_Assert(sdPub != NULL); | |
| 9963 if (!sdPub) { | |
| 9964 PORT_SetError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); | |
| 9965 return SECFailure; | |
| 9966 } | |
| 9967 rv = ssl3_ComputeExportRSAKeyHash(sigAndHash.hashAlg, | |
| 9968 sdPub->u.rsa.modulus, | |
| 9969 sdPub->u.rsa.publicExponent, | |
| 9970 &ss->ssl3.hs.client_random, | |
| 9971 &ss->ssl3.hs.server_random, | |
| 9972 &hashes, ss->opt.bypassPKCS11); | |
| 9973 if (rv != SECSuccess) { | |
| 9974 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); | |
| 9975 return rv; | |
| 9976 } | |
| 9977 | |
| 9978 isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0)
; | |
| 9979 rv = ssl3_SignHashes(&hashes, ss->serverCerts[kt_rsa].SERVERKEY, | |
| 9980 &signed_hash, isTLS); | |
| 9981 if (rv != SECSuccess) { | |
| 9982 goto loser; /* ssl3_SignHashes has set err. */ | |
| 9983 } | |
| 9984 if (signed_hash.data == NULL) { | |
| 9985 /* how can this happen and rv == SECSuccess ?? */ | |
| 9986 PORT_SetError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); | |
| 9987 goto loser; | |
| 9988 } | |
| 9989 length = 2 + sdPub->u.rsa.modulus.len + | |
| 9990 2 + sdPub->u.rsa.publicExponent.len + | |
| 9991 2 + signed_hash.len; | |
| 9992 | |
| 9993 if (ss->ssl3.pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2) { | |
| 9994 length += 2; | |
| 9995 } | |
| 9996 | |
| 9997 rv = ssl3_AppendHandshakeHeader(ss, server_key_exchange, length); | |
| 9998 if (rv != SECSuccess) { | |
| 9999 goto loser; /* err set by AppendHandshake. */ | |
| 10000 } | |
| 10001 | |
| 10002 rv = ssl3_AppendHandshakeVariable(ss, sdPub->u.rsa.modulus.data, | |
| 10003 sdPub->u.rsa.modulus.len, 2); | |
| 10004 if (rv != SECSuccess) { | |
| 10005 goto loser; /* err set by AppendHandshake. */ | |
| 10006 } | |
| 10007 | |
| 10008 rv = ssl3_AppendHandshakeVariable( | |
| 10009 ss, sdPub->u.rsa.publicExponent.data, | |
| 10010 sdPub->u.rsa.publicExponent.len, 2); | |
| 10011 if (rv != SECSuccess) { | |
| 10012 goto loser; /* err set by AppendHandshake. */ | |
| 10013 } | |
| 10014 | |
| 10015 if (ss->ssl3.pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2) { | |
| 10016 rv = ssl3_AppendSignatureAndHashAlgorithm(ss, &sigAndHash); | |
| 10017 if (rv != SECSuccess) { | |
| 10018 goto loser; /* err set by AppendHandshake. */ | |
| 10019 } | |
| 10020 } | |
| 10021 | |
| 10022 rv = ssl3_AppendHandshakeVariable(ss, signed_hash.data, | |
| 10023 signed_hash.len, 2); | |
| 10024 if (rv != SECSuccess) { | |
| 10025 goto loser; /* err set by AppendHandshake. */ | |
| 10026 } | |
| 10027 PORT_Free(signed_hash.data); | |
| 10028 return SECSuccess; | |
| 10029 | |
| 10030 case ssl_kea_dh: { | |
| 10031 rv = ssl3_SendDHServerKeyExchange(ss); | |
| 10032 return rv; | |
| 10033 } | |
| 10034 | |
| 10035 #ifndef NSS_DISABLE_ECC | |
| 10036 case kt_ecdh: { | |
| 10037 rv = ssl3_SendECDHServerKeyExchange(ss, &sigAndHash); | |
| 10038 return rv; | |
| 10039 } | |
| 10040 #endif /* NSS_DISABLE_ECC */ | |
| 10041 | |
| 10042 case kt_null: | |
| 10043 default: | |
| 10044 PORT_SetError(SEC_ERROR_UNSUPPORTED_KEYALG); | |
| 10045 break; | |
| 10046 } | |
| 10047 loser: | |
| 10048 if (signed_hash.data != NULL) | |
| 10049 PORT_Free(signed_hash.data); | |
| 10050 return SECFailure; | |
| 10051 } | |
| 10052 | |
| 10053 SECStatus | |
| 10054 ssl3_EncodeCertificateRequestSigAlgs(sslSocket *ss, PRUint8 *buf, | |
| 10055 unsigned maxLen, PRUint32 *len) | |
| 10056 { | |
| 10057 unsigned int i; | |
| 10058 | |
| 10059 PORT_Assert(maxLen >= ss->ssl3.signatureAlgorithmCount * 2); | |
| 10060 if (maxLen < ss->ssl3.signatureAlgorithmCount * 2) { | |
| 10061 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 10062 return SECFailure; | |
| 10063 } | |
| 10064 | |
| 10065 *len = 0; | |
| 10066 for (i = 0; i < ss->ssl3.signatureAlgorithmCount; ++i) { | |
| 10067 const SSLSignatureAndHashAlg *alg = &ss->ssl3.signatureAlgorithms[i]; | |
| 10068 /* Note that we don't support a handshake hash with anything other than | |
| 10069 * SHA-256, so asking for a signature from clients for something else | |
| 10070 * would be inviting disaster. */ | |
| 10071 if (alg->hashAlg == ssl_hash_sha256) { | |
| 10072 buf[(*len)++] = (PRUint8)alg->hashAlg; | |
| 10073 buf[(*len)++] = (PRUint8)alg->sigAlg; | |
| 10074 } | |
| 10075 } | |
| 10076 | |
| 10077 if (*len == 0) { | |
| 10078 PORT_SetError(SSL_ERROR_NO_SUPPORTED_SIGNATURE_ALGORITHM); | |
| 10079 return SECFailure; | |
| 10080 } | |
| 10081 return SECSuccess; | |
| 10082 } | |
| 10083 | |
| 10084 void | |
| 10085 ssl3_GetCertificateRequestCAs(sslSocket *ss, int *calen, SECItem **names, | |
| 10086 int *nnames) | |
| 10087 { | |
| 10088 SECItem *name; | |
| 10089 CERTDistNames *ca_list; | |
| 10090 int i; | |
| 10091 | |
| 10092 *calen = 0; | |
| 10093 *names = NULL; | |
| 10094 *nnames = 0; | |
| 10095 | |
| 10096 /* ssl3.ca_list is initialized to NULL, and never changed. */ | |
| 10097 ca_list = ss->ssl3.ca_list; | |
| 10098 if (!ca_list) { | |
| 10099 ca_list = ssl3_server_ca_list; | |
| 10100 } | |
| 10101 | |
| 10102 if (ca_list != NULL) { | |
| 10103 *names = ca_list->names; | |
| 10104 *nnames = ca_list->nnames; | |
| 10105 } | |
| 10106 | |
| 10107 for (i = 0, name = *names; i < *nnames; i++, name++) { | |
| 10108 *calen += 2 + name->len; | |
| 10109 } | |
| 10110 } | |
| 10111 | |
| 10112 static SECStatus | |
| 10113 ssl3_SendCertificateRequest(sslSocket *ss) | |
| 10114 { | |
| 10115 PRBool isTLS12; | |
| 10116 const PRUint8 *certTypes; | |
| 10117 SECStatus rv; | |
| 10118 int length; | |
| 10119 SECItem *names; | |
| 10120 int calen; | |
| 10121 int nnames; | |
| 10122 SECItem *name; | |
| 10123 int i; | |
| 10124 int certTypesLength; | |
| 10125 PRUint8 sigAlgs[MAX_SIGNATURE_ALGORITHMS * 2]; | |
| 10126 unsigned int sigAlgsLength = 0; | |
| 10127 | |
| 10128 SSL_TRC(3, ("%d: SSL3[%d]: send certificate_request handshake", | |
| 10129 SSL_GETPID(), ss->fd)); | |
| 10130 | |
| 10131 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | |
| 10132 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 10133 | |
| 10134 isTLS12 = (PRBool)(ss->ssl3.pwSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); | |
| 10135 | |
| 10136 ssl3_GetCertificateRequestCAs(ss, &calen, &names, &nnames); | |
| 10137 certTypes = certificate_types; | |
| 10138 certTypesLength = sizeof certificate_types; | |
| 10139 | |
| 10140 length = 1 + certTypesLength + 2 + calen; | |
| 10141 if (isTLS12) { | |
| 10142 rv = ssl3_EncodeCertificateRequestSigAlgs(ss, sigAlgs, sizeof(sigAlgs), | |
| 10143 &sigAlgsLength); | |
| 10144 if (rv != SECSuccess) { | |
| 10145 return rv; | |
| 10146 } | |
| 10147 length += 2 + sigAlgsLength; | |
| 10148 } | |
| 10149 | |
| 10150 rv = ssl3_AppendHandshakeHeader(ss, certificate_request, length); | |
| 10151 if (rv != SECSuccess) { | |
| 10152 return rv; /* err set by AppendHandshake. */ | |
| 10153 } | |
| 10154 rv = ssl3_AppendHandshakeVariable(ss, certTypes, certTypesLength, 1); | |
| 10155 if (rv != SECSuccess) { | |
| 10156 return rv; /* err set by AppendHandshake. */ | |
| 10157 } | |
| 10158 if (isTLS12) { | |
| 10159 rv = ssl3_AppendHandshakeVariable(ss, sigAlgs, sigAlgsLength, 2); | |
| 10160 if (rv != SECSuccess) { | |
| 10161 return rv; /* err set by AppendHandshake. */ | |
| 10162 } | |
| 10163 } | |
| 10164 rv = ssl3_AppendHandshakeNumber(ss, calen, 2); | |
| 10165 if (rv != SECSuccess) { | |
| 10166 return rv; /* err set by AppendHandshake. */ | |
| 10167 } | |
| 10168 for (i = 0, name = names; i < nnames; i++, name++) { | |
| 10169 rv = ssl3_AppendHandshakeVariable(ss, name->data, name->len, 2); | |
| 10170 if (rv != SECSuccess) { | |
| 10171 return rv; /* err set by AppendHandshake. */ | |
| 10172 } | |
| 10173 } | |
| 10174 | |
| 10175 return SECSuccess; | |
| 10176 } | |
| 10177 | |
| 10178 static SECStatus | |
| 10179 ssl3_SendServerHelloDone(sslSocket *ss) | |
| 10180 { | |
| 10181 SECStatus rv; | |
| 10182 | |
| 10183 SSL_TRC(3, ("%d: SSL3[%d]: send server_hello_done handshake", | |
| 10184 SSL_GETPID(), ss->fd)); | |
| 10185 | |
| 10186 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | |
| 10187 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 10188 | |
| 10189 rv = ssl3_AppendHandshakeHeader(ss, server_hello_done, 0); | |
| 10190 if (rv != SECSuccess) { | |
| 10191 return rv; /* err set by AppendHandshake. */ | |
| 10192 } | |
| 10193 rv = ssl3_FlushHandshake(ss, 0); | |
| 10194 if (rv != SECSuccess) { | |
| 10195 return rv; /* error code set by ssl3_FlushHandshake */ | |
| 10196 } | |
| 10197 return SECSuccess; | |
| 10198 } | |
| 10199 | |
| 10200 /* Called from ssl3_HandlePostHelloHandshakeMessage() when it has deciphered | |
| 10201 * a complete ssl3 Certificate Verify message | |
| 10202 * Caller must hold Handshake and RecvBuf locks. | |
| 10203 */ | |
| 10204 static SECStatus | |
| 10205 ssl3_HandleCertificateVerify(sslSocket *ss, SSL3Opaque *b, PRUint32 length, | |
| 10206 SSL3Hashes *hashes) | |
| 10207 { | |
| 10208 SECItem signed_hash = { siBuffer, NULL, 0 }; | |
| 10209 SECStatus rv; | |
| 10210 int errCode = SSL_ERROR_RX_MALFORMED_CERT_VERIFY; | |
| 10211 SSL3AlertDescription desc = handshake_failure; | |
| 10212 PRBool isTLS, isTLS12; | |
| 10213 SSLSignatureAndHashAlg sigAndHash; | |
| 10214 | |
| 10215 SSL_TRC(3, ("%d: SSL3[%d]: handle certificate_verify handshake", | |
| 10216 SSL_GETPID(), ss->fd)); | |
| 10217 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 10218 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 10219 | |
| 10220 isTLS = (PRBool)(ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0); | |
| 10221 isTLS12 = (PRBool)(ss->ssl3.prSpec->version >= SSL_LIBRARY_VERSION_TLS_1_2); | |
| 10222 | |
| 10223 if (ss->ssl3.hs.ws != wait_cert_verify) { | |
| 10224 desc = unexpected_message; | |
| 10225 errCode = SSL_ERROR_RX_UNEXPECTED_CERT_VERIFY; | |
| 10226 goto alert_loser; | |
| 10227 } | |
| 10228 | |
| 10229 if (!hashes) { | |
| 10230 PORT_Assert(0); | |
| 10231 desc = internal_error; | |
| 10232 errCode = SEC_ERROR_LIBRARY_FAILURE; | |
| 10233 goto alert_loser; | |
| 10234 } | |
| 10235 | |
| 10236 if (isTLS12) { | |
| 10237 rv = ssl3_ConsumeSignatureAndHashAlgorithm(ss, &b, &length, | |
| 10238 &sigAndHash); | |
| 10239 if (rv != SECSuccess) { | |
| 10240 goto loser; /* malformed or unsupported. */ | |
| 10241 } | |
| 10242 rv = ssl3_CheckSignatureAndHashAlgorithmConsistency( | |
| 10243 ss, &sigAndHash, ss->sec.peerCert); | |
| 10244 if (rv != SECSuccess) { | |
| 10245 errCode = PORT_GetError(); | |
| 10246 desc = decrypt_error; | |
| 10247 goto alert_loser; | |
| 10248 } | |
| 10249 | |
| 10250 /* We only support CertificateVerify messages that use the handshake | |
| 10251 * hash. */ | |
| 10252 if (sigAndHash.hashAlg != hashes->hashAlg) { | |
| 10253 errCode = SSL_ERROR_UNSUPPORTED_HASH_ALGORITHM; | |
| 10254 desc = decrypt_error; | |
| 10255 goto alert_loser; | |
| 10256 } | |
| 10257 } | |
| 10258 | |
| 10259 rv = ssl3_ConsumeHandshakeVariable(ss, &signed_hash, 2, &b, &length); | |
| 10260 if (rv != SECSuccess) { | |
| 10261 goto loser; /* malformed. */ | |
| 10262 } | |
| 10263 | |
| 10264 /* XXX verify that the key & kea match */ | |
| 10265 rv = ssl3_VerifySignedHashes(hashes, ss->sec.peerCert, &signed_hash, | |
| 10266 isTLS, ss->pkcs11PinArg); | |
| 10267 if (rv != SECSuccess) { | |
| 10268 errCode = PORT_GetError(); | |
| 10269 desc = isTLS ? decrypt_error : handshake_failure; | |
| 10270 goto alert_loser; | |
| 10271 } | |
| 10272 | |
| 10273 signed_hash.data = NULL; | |
| 10274 | |
| 10275 if (length != 0) { | |
| 10276 desc = isTLS ? decode_error : illegal_parameter; | |
| 10277 goto alert_loser; /* malformed */ | |
| 10278 } | |
| 10279 ss->ssl3.hs.ws = wait_change_cipher; | |
| 10280 return SECSuccess; | |
| 10281 | |
| 10282 alert_loser: | |
| 10283 SSL3_SendAlert(ss, alert_fatal, desc); | |
| 10284 loser: | |
| 10285 PORT_SetError(errCode); | |
| 10286 return SECFailure; | |
| 10287 } | |
| 10288 | |
| 10289 /* find a slot that is able to generate a PMS and wrap it with RSA. | |
| 10290 * Then generate and return the PMS. | |
| 10291 * If the serverKeySlot parameter is non-null, this function will use | |
| 10292 * that slot to do the job, otherwise it will find a slot. | |
| 10293 * | |
| 10294 * Called from ssl3_DeriveConnectionKeysPKCS11() (above) | |
| 10295 * sendRSAClientKeyExchange() (above) | |
| 10296 * ssl3_HandleRSAClientKeyExchange() (below) | |
| 10297 * Caller must hold the SpecWriteLock, the SSL3HandshakeLock | |
| 10298 */ | |
| 10299 static PK11SymKey * | |
| 10300 ssl3_GenerateRSAPMS(sslSocket *ss, ssl3CipherSpec *spec, | |
| 10301 PK11SlotInfo *serverKeySlot) | |
| 10302 { | |
| 10303 PK11SymKey *pms = NULL; | |
| 10304 PK11SlotInfo *slot = serverKeySlot; | |
| 10305 void *pwArg = ss->pkcs11PinArg; | |
| 10306 SECItem param; | |
| 10307 CK_VERSION version; | |
| 10308 CK_MECHANISM_TYPE mechanism_array[3]; | |
| 10309 | |
| 10310 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 10311 | |
| 10312 if (slot == NULL) { | |
| 10313 SSLCipherAlgorithm calg; | |
| 10314 /* The specReadLock would suffice here, but we cannot assert on | |
| 10315 ** read locks. Also, all the callers who call with a non-null | |
| 10316 ** slot already hold the SpecWriteLock. | |
| 10317 */ | |
| 10318 PORT_Assert(ss->opt.noLocks || ssl_HaveSpecWriteLock(ss)); | |
| 10319 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); | |
| 10320 | |
| 10321 calg = spec->cipher_def->calg; | |
| 10322 | |
| 10323 /* First get an appropriate slot. */ | |
| 10324 mechanism_array[0] = CKM_SSL3_PRE_MASTER_KEY_GEN; | |
| 10325 mechanism_array[1] = CKM_RSA_PKCS; | |
| 10326 mechanism_array[2] = ssl3_Alg2Mech(calg); | |
| 10327 | |
| 10328 slot = PK11_GetBestSlotMultiple(mechanism_array, 3, pwArg); | |
| 10329 if (slot == NULL) { | |
| 10330 /* can't find a slot with all three, find a slot with the minimum */ | |
| 10331 slot = PK11_GetBestSlotMultiple(mechanism_array, 2, pwArg); | |
| 10332 if (slot == NULL) { | |
| 10333 PORT_SetError(SSL_ERROR_TOKEN_SLOT_NOT_FOUND); | |
| 10334 return pms; /* which is NULL */ | |
| 10335 } | |
| 10336 } | |
| 10337 } | |
| 10338 | |
| 10339 /* Generate the pre-master secret ... */ | |
| 10340 if (IS_DTLS(ss)) { | |
| 10341 SSL3ProtocolVersion temp; | |
| 10342 | |
| 10343 temp = dtls_TLSVersionToDTLSVersion(ss->clientHelloVersion); | |
| 10344 version.major = MSB(temp); | |
| 10345 version.minor = LSB(temp); | |
| 10346 } else { | |
| 10347 version.major = MSB(ss->clientHelloVersion); | |
| 10348 version.minor = LSB(ss->clientHelloVersion); | |
| 10349 } | |
| 10350 | |
| 10351 param.data = (unsigned char *)&version; | |
| 10352 param.len = sizeof version; | |
| 10353 | |
| 10354 pms = PK11_KeyGen(slot, CKM_SSL3_PRE_MASTER_KEY_GEN, ¶m, 0, pwArg); | |
| 10355 if (!serverKeySlot) | |
| 10356 PK11_FreeSlot(slot); | |
| 10357 if (pms == NULL) { | |
| 10358 ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); | |
| 10359 } | |
| 10360 return pms; | |
| 10361 } | |
| 10362 | |
| 10363 /* Note: The Bleichenbacher attack on PKCS#1 necessitates that we NEVER | |
| 10364 * return any indication of failure of the Client Key Exchange message, | |
| 10365 * where that failure is caused by the content of the client's message. | |
| 10366 * This function must not return SECFailure for any reason that is directly | |
| 10367 * or indirectly caused by the content of the client's encrypted PMS. | |
| 10368 * We must not send an alert and also not drop the connection. | |
| 10369 * Instead, we generate a random PMS. This will cause a failure | |
| 10370 * in the processing the finished message, which is exactly where | |
| 10371 * the failure must occur. | |
| 10372 * | |
| 10373 * Called from ssl3_HandleClientKeyExchange | |
| 10374 */ | |
| 10375 static SECStatus | |
| 10376 ssl3_HandleRSAClientKeyExchange(sslSocket *ss, | |
| 10377 SSL3Opaque *b, | |
| 10378 PRUint32 length, | |
| 10379 SECKEYPrivateKey *serverKey) | |
| 10380 { | |
| 10381 #ifndef NO_PKCS11_BYPASS | |
| 10382 unsigned char *cr = (unsigned char *)&ss->ssl3.hs.client_random; | |
| 10383 unsigned char *sr = (unsigned char *)&ss->ssl3.hs.server_random; | |
| 10384 ssl3CipherSpec *pwSpec = ss->ssl3.pwSpec; | |
| 10385 unsigned int outLen = 0; | |
| 10386 PRBool isTLS = PR_FALSE; | |
| 10387 SECItem pmsItem = { siBuffer, NULL, 0 }; | |
| 10388 unsigned char rsaPmsBuf[SSL3_RSA_PMS_LENGTH]; | |
| 10389 #endif | |
| 10390 SECStatus rv; | |
| 10391 SECItem enc_pms; | |
| 10392 | |
| 10393 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 10394 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 10395 PORT_Assert(ss->ssl3.prSpec == ss->ssl3.pwSpec); | |
| 10396 | |
| 10397 enc_pms.data = b; | |
| 10398 enc_pms.len = length; | |
| 10399 #ifndef NO_PKCS11_BYPASS | |
| 10400 pmsItem.data = rsaPmsBuf; | |
| 10401 pmsItem.len = sizeof rsaPmsBuf; | |
| 10402 #endif | |
| 10403 | |
| 10404 if (ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0) { /* isTLS */ | |
| 10405 PRInt32 kLen; | |
| 10406 kLen = ssl3_ConsumeHandshakeNumber(ss, 2, &enc_pms.data, &enc_pms.len); | |
| 10407 if (kLen < 0) { | |
| 10408 PORT_SetError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); | |
| 10409 return SECFailure; | |
| 10410 } | |
| 10411 if ((unsigned)kLen < enc_pms.len) { | |
| 10412 enc_pms.len = kLen; | |
| 10413 } | |
| 10414 #ifndef NO_PKCS11_BYPASS | |
| 10415 isTLS = PR_TRUE; | |
| 10416 #endif | |
| 10417 } else { | |
| 10418 #ifndef NO_PKCS11_BYPASS | |
| 10419 isTLS = (PRBool)(ss->ssl3.hs.kea_def->tls_keygen != 0); | |
| 10420 #endif | |
| 10421 } | |
| 10422 | |
| 10423 #ifndef NO_PKCS11_BYPASS | |
| 10424 if (ss->opt.bypassPKCS11) { | |
| 10425 /* We have not implemented a tls_ExtendedMasterKeyDeriveBypass | |
| 10426 * and will not negotiate this extension in bypass mode. This | |
| 10427 * assert just double-checks that. | |
| 10428 */ | |
| 10429 PORT_Assert( | |
| 10430 !ssl3_ExtensionNegotiated(ss, ssl_extended_master_secret_xtn)); | |
| 10431 | |
| 10432 /* TRIPLE BYPASS, get PMS directly from RSA decryption. | |
| 10433 * Use PK11_PrivDecryptPKCS1 to decrypt the PMS to a buffer, | |
| 10434 * then, check for version rollback attack, then | |
| 10435 * do the equivalent of ssl3_DeriveMasterSecret, placing the MS in | |
| 10436 * pwSpec->msItem. Finally call ssl3_InitPendingCipherSpec with | |
| 10437 * ss and NULL, so that it will use the MS we've already derived here. | |
| 10438 */ | |
| 10439 | |
| 10440 rv = PK11_PrivDecryptPKCS1(serverKey, rsaPmsBuf, &outLen, | |
| 10441 sizeof rsaPmsBuf, enc_pms.data, enc_pms.len); | |
| 10442 if (rv != SECSuccess) { | |
| 10443 /* triple bypass failed. Let's try for a double bypass. */ | |
| 10444 goto double_bypass; | |
| 10445 } else if (ss->opt.detectRollBack) { | |
| 10446 SSL3ProtocolVersion client_version = | |
| 10447 (rsaPmsBuf[0] << 8) | rsaPmsBuf[1]; | |
| 10448 | |
| 10449 if (IS_DTLS(ss)) { | |
| 10450 client_version = dtls_DTLSVersionToTLSVersion(client_version); | |
| 10451 } | |
| 10452 | |
| 10453 if (client_version != ss->clientHelloVersion) { | |
| 10454 /* Version roll-back detected. ensure failure. */ | |
| 10455 rv = PK11_GenerateRandom(rsaPmsBuf, sizeof rsaPmsBuf); | |
| 10456 } | |
| 10457 } | |
| 10458 /* have PMS, build MS without PKCS11 */ | |
| 10459 rv = ssl3_MasterSecretDeriveBypass(pwSpec, cr, sr, &pmsItem, isTLS, | |
| 10460 PR_TRUE); | |
| 10461 if (rv != SECSuccess) { | |
| 10462 pwSpec->msItem.data = pwSpec->raw_master_secret; | |
| 10463 pwSpec->msItem.len = SSL3_MASTER_SECRET_LENGTH; | |
| 10464 PK11_GenerateRandom(pwSpec->msItem.data, pwSpec->msItem.len); | |
| 10465 } | |
| 10466 rv = ssl3_InitPendingCipherSpec(ss, NULL); | |
| 10467 } else | |
| 10468 #endif | |
| 10469 { | |
| 10470 PK11SymKey *tmpPms[2] = { NULL, NULL }; | |
| 10471 PK11SlotInfo *slot; | |
| 10472 int useFauxPms = 0; | |
| 10473 #define currentPms tmpPms[!useFauxPms] | |
| 10474 #define unusedPms tmpPms[useFauxPms] | |
| 10475 #define realPms tmpPms[1] | |
| 10476 #define fauxPms tmpPms[0] | |
| 10477 | |
| 10478 #ifndef NO_PKCS11_BYPASS | |
| 10479 double_bypass: | |
| 10480 #endif | |
| 10481 | |
| 10482 /* | |
| 10483 * Get as close to algorithm 2 from RFC 5246; Section 7.4.7.1 | |
| 10484 * as we can within the constraints of the PKCS#11 interface. | |
| 10485 * | |
| 10486 * 1. Unconditionally generate a bogus PMS (what RFC 5246 | |
| 10487 * calls R). | |
| 10488 * 2. Attempt the RSA decryption to recover the PMS (what | |
| 10489 * RFC 5246 calls M). | |
| 10490 * 3. Set PMS = (M == NULL) ? R : M | |
| 10491 * 4. Use ssl3_ComputeMasterSecret(PMS) to attempt to derive | |
| 10492 * the MS from PMS. This includes performing the version | |
| 10493 * check and length check. | |
| 10494 * 5. If either the initial RSA decryption failed or | |
| 10495 * ssl3_ComputeMasterSecret(PMS) failed, then discard | |
| 10496 * M and set PMS = R. Else, discard R and set PMS = M. | |
| 10497 * | |
| 10498 * We do two derivations here because we can't rely on having | |
| 10499 * a function that only performs the PMS version and length | |
| 10500 * check. The only redundant cost is that this runs the PRF, | |
| 10501 * which isn't necessary here. | |
| 10502 */ | |
| 10503 | |
| 10504 /* Generate the bogus PMS (R) */ | |
| 10505 slot = PK11_GetSlotFromPrivateKey(serverKey); | |
| 10506 if (!slot) { | |
| 10507 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 10508 return SECFailure; | |
| 10509 } | |
| 10510 | |
| 10511 if (!PK11_DoesMechanism(slot, CKM_SSL3_MASTER_KEY_DERIVE)) { | |
| 10512 PK11_FreeSlot(slot); | |
| 10513 slot = PK11_GetBestSlot(CKM_SSL3_MASTER_KEY_DERIVE, NULL); | |
| 10514 if (!slot) { | |
| 10515 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 10516 return SECFailure; | |
| 10517 } | |
| 10518 } | |
| 10519 | |
| 10520 ssl_GetSpecWriteLock(ss); | |
| 10521 fauxPms = ssl3_GenerateRSAPMS(ss, ss->ssl3.prSpec, slot); | |
| 10522 ssl_ReleaseSpecWriteLock(ss); | |
| 10523 PK11_FreeSlot(slot); | |
| 10524 | |
| 10525 if (fauxPms == NULL) { | |
| 10526 ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); | |
| 10527 return SECFailure; | |
| 10528 } | |
| 10529 | |
| 10530 /* | |
| 10531 * unwrap pms out of the incoming buffer | |
| 10532 * Note: CKM_SSL3_MASTER_KEY_DERIVE is NOT the mechanism used to do | |
| 10533 * the unwrap. Rather, it is the mechanism with which the | |
| 10534 * unwrapped pms will be used. | |
| 10535 */ | |
| 10536 realPms = PK11_PubUnwrapSymKey(serverKey, &enc_pms, | |
| 10537 CKM_SSL3_MASTER_KEY_DERIVE, CKA_DERIVE, 0
); | |
| 10538 /* Temporarily use the PMS if unwrapping the real PMS fails. */ | |
| 10539 useFauxPms |= (realPms == NULL); | |
| 10540 | |
| 10541 /* Attempt to derive the MS from the PMS. This is the only way to | |
| 10542 * check the version field in the RSA PMS. If this fails, we | |
| 10543 * then use the faux PMS in place of the PMS. Note that this | |
| 10544 * operation should never fail if we are using the faux PMS | |
| 10545 * since it is correctly formatted. */ | |
| 10546 rv = ssl3_ComputeMasterSecret(ss, currentPms, NULL); | |
| 10547 | |
| 10548 /* If we succeeded, then select the true PMS and discard the | |
| 10549 * FPMS. Else, select the FPMS and select the true PMS */ | |
| 10550 useFauxPms |= (rv != SECSuccess); | |
| 10551 | |
| 10552 if (unusedPms) { | |
| 10553 PK11_FreeSymKey(unusedPms); | |
| 10554 } | |
| 10555 | |
| 10556 /* This step will derive the MS from the PMS, among other things. */ | |
| 10557 rv = ssl3_InitPendingCipherSpec(ss, currentPms); | |
| 10558 PK11_FreeSymKey(currentPms); | |
| 10559 } | |
| 10560 | |
| 10561 if (rv != SECSuccess) { | |
| 10562 SEND_ALERT | |
| 10563 return SECFailure; /* error code set by ssl3_InitPendingCipherSpec */ | |
| 10564 } | |
| 10565 | |
| 10566 #undef currentPms | |
| 10567 #undef unusedPms | |
| 10568 #undef realPms | |
| 10569 #undef fauxPms | |
| 10570 | |
| 10571 return SECSuccess; | |
| 10572 } | |
| 10573 | |
| 10574 static SECStatus | |
| 10575 ssl3_HandleDHClientKeyExchange(sslSocket *ss, | |
| 10576 SSL3Opaque *b, | |
| 10577 PRUint32 length, | |
| 10578 SECKEYPublicKey *srvrPubKey, | |
| 10579 SECKEYPrivateKey *serverKey) | |
| 10580 { | |
| 10581 PK11SymKey *pms; | |
| 10582 SECStatus rv; | |
| 10583 SECKEYPublicKey clntPubKey; | |
| 10584 CK_MECHANISM_TYPE target; | |
| 10585 PRBool isTLS; | |
| 10586 | |
| 10587 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 10588 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 10589 PORT_Assert(srvrPubKey); | |
| 10590 | |
| 10591 clntPubKey.keyType = dhKey; | |
| 10592 clntPubKey.u.dh.prime.len = srvrPubKey->u.dh.prime.len; | |
| 10593 clntPubKey.u.dh.prime.data = srvrPubKey->u.dh.prime.data; | |
| 10594 clntPubKey.u.dh.base.len = srvrPubKey->u.dh.base.len; | |
| 10595 clntPubKey.u.dh.base.data = srvrPubKey->u.dh.base.data; | |
| 10596 | |
| 10597 rv = ssl3_ConsumeHandshakeVariable(ss, &clntPubKey.u.dh.publicValue, | |
| 10598 2, &b, &length); | |
| 10599 if (rv != SECSuccess) { | |
| 10600 goto loser; | |
| 10601 } | |
| 10602 | |
| 10603 isTLS = (PRBool)(ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0); | |
| 10604 | |
| 10605 if (isTLS) | |
| 10606 target = CKM_TLS_MASTER_KEY_DERIVE_DH; | |
| 10607 else | |
| 10608 target = CKM_SSL3_MASTER_KEY_DERIVE_DH; | |
| 10609 | |
| 10610 /* Determine the PMS */ | |
| 10611 pms = PK11_PubDerive(serverKey, &clntPubKey, PR_FALSE, NULL, NULL, | |
| 10612 CKM_DH_PKCS_DERIVE, target, CKA_DERIVE, 0, NULL); | |
| 10613 if (pms == NULL) { | |
| 10614 ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE); | |
| 10615 goto loser; | |
| 10616 } | |
| 10617 | |
| 10618 rv = ssl3_InitPendingCipherSpec(ss, pms); | |
| 10619 PK11_FreeSymKey(pms); | |
| 10620 pms = NULL; | |
| 10621 | |
| 10622 loser: | |
| 10623 if (ss->dheKeyPair) { | |
| 10624 ssl3_FreeKeyPair(ss->dheKeyPair); | |
| 10625 ss->dheKeyPair = NULL; | |
| 10626 } | |
| 10627 return rv; | |
| 10628 } | |
| 10629 | |
| 10630 /* Called from ssl3_HandlePostHelloHandshakeMessage() when it has deciphered | |
| 10631 * a complete ssl3 ClientKeyExchange message from the remote client | |
| 10632 * Caller must hold Handshake and RecvBuf locks. | |
| 10633 */ | |
| 10634 static SECStatus | |
| 10635 ssl3_HandleClientKeyExchange(sslSocket *ss, SSL3Opaque *b, PRUint32 length) | |
| 10636 { | |
| 10637 SECKEYPrivateKey *serverKey = NULL; | |
| 10638 SECStatus rv; | |
| 10639 const ssl3KEADef *kea_def; | |
| 10640 ssl3KeyPair *serverKeyPair = NULL; | |
| 10641 SECKEYPublicKey *serverPubKey = NULL; | |
| 10642 | |
| 10643 SSL_TRC(3, ("%d: SSL3[%d]: handle client_key_exchange handshake", | |
| 10644 SSL_GETPID(), ss->fd)); | |
| 10645 | |
| 10646 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 10647 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 10648 | |
| 10649 if (ss->ssl3.hs.ws != wait_client_key) { | |
| 10650 SSL3_SendAlert(ss, alert_fatal, unexpected_message); | |
| 10651 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CLIENT_KEY_EXCH); | |
| 10652 return SECFailure; | |
| 10653 } | |
| 10654 | |
| 10655 kea_def = ss->ssl3.hs.kea_def; | |
| 10656 | |
| 10657 if (ss->ssl3.hs.usedStepDownKey) { | |
| 10658 PORT_Assert(kea_def->is_limited /* XXX OR cert is signing only */ | |
| 10659 && | |
| 10660 kea_def->exchKeyType == kt_rsa && | |
| 10661 ss->stepDownKeyPair != NULL); | |
| 10662 if (!kea_def->is_limited || | |
| 10663 kea_def->exchKeyType != kt_rsa || | |
| 10664 ss->stepDownKeyPair == NULL) { | |
| 10665 /* shouldn't happen, don't use step down if it does */ | |
| 10666 goto skip; | |
| 10667 } | |
| 10668 serverKeyPair = ss->stepDownKeyPair; | |
| 10669 ss->sec.keaKeyBits = EXPORT_RSA_KEY_LENGTH * BPB; | |
| 10670 } else | |
| 10671 skip: | |
| 10672 if (kea_def->kea == kea_dhe_dss || | |
| 10673 kea_def->kea == kea_dhe_rsa) { | |
| 10674 if (ss->dheKeyPair) { | |
| 10675 serverKeyPair = ss->dheKeyPair; | |
| 10676 if (serverKeyPair->pubKey) { | |
| 10677 ss->sec.keaKeyBits = | |
| 10678 SECKEY_PublicKeyStrengthInBits(serverKeyPair->pubKey); | |
| 10679 } | |
| 10680 } | |
| 10681 } else | |
| 10682 #ifndef NSS_DISABLE_ECC | |
| 10683 /* XXX Using SSLKEAType to index server certifiates | |
| 10684 * does not work for (EC)DHE ciphers. Until we have | |
| 10685 * an indexing mechanism general enough for all key | |
| 10686 * exchange algorithms, we'll need to deal with each | |
| 10687 * one seprately. | |
| 10688 */ | |
| 10689 if ((kea_def->kea == kea_ecdhe_rsa) || | |
| 10690 (kea_def->kea == kea_ecdhe_ecdsa)) { | |
| 10691 if (ss->ephemeralECDHKeyPair != NULL) { | |
| 10692 serverKeyPair = ss->ephemeralECDHKeyPair; | |
| 10693 if (serverKeyPair->pubKey) { | |
| 10694 ss->sec.keaKeyBits = | |
| 10695 SECKEY_PublicKeyStrengthInBits(serverKeyPair->pubKey); | |
| 10696 } | |
| 10697 } | |
| 10698 } else | |
| 10699 #endif | |
| 10700 { | |
| 10701 sslServerCerts *sc = ss->serverCerts + kea_def->exchKeyType; | |
| 10702 serverKeyPair = sc->serverKeyPair; | |
| 10703 ss->sec.keaKeyBits = sc->serverKeyBits; | |
| 10704 } | |
| 10705 | |
| 10706 if (serverKeyPair) { | |
| 10707 serverKey = serverKeyPair->privKey; | |
| 10708 } | |
| 10709 | |
| 10710 if (serverKey == NULL) { | |
| 10711 SEND_ALERT | |
| 10712 PORT_SetError(SSL_ERROR_NO_SERVER_KEY_FOR_ALG); | |
| 10713 return SECFailure; | |
| 10714 } | |
| 10715 | |
| 10716 ss->sec.keaType = kea_def->exchKeyType; | |
| 10717 | |
| 10718 switch (kea_def->exchKeyType) { | |
| 10719 case kt_rsa: | |
| 10720 rv = ssl3_HandleRSAClientKeyExchange(ss, b, length, serverKey); | |
| 10721 if (rv != SECSuccess) { | |
| 10722 SEND_ALERT | |
| 10723 return SECFailure; /* error code set */ | |
| 10724 } | |
| 10725 break; | |
| 10726 | |
| 10727 case ssl_kea_dh: | |
| 10728 if (ss->dheKeyPair && ss->dheKeyPair->pubKey) { | |
| 10729 serverPubKey = ss->dheKeyPair->pubKey; | |
| 10730 } | |
| 10731 if (!serverPubKey) { | |
| 10732 PORT_SetError(SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE); | |
| 10733 return SECFailure; | |
| 10734 } | |
| 10735 rv = ssl3_HandleDHClientKeyExchange(ss, b, length, | |
| 10736 serverPubKey, serverKey); | |
| 10737 if (rv != SECSuccess) { | |
| 10738 SSL3_SendAlert(ss, alert_fatal, handshake_failure); | |
| 10739 return SECFailure; /* error code set */ | |
| 10740 } | |
| 10741 break; | |
| 10742 | |
| 10743 #ifndef NSS_DISABLE_ECC | |
| 10744 case kt_ecdh: | |
| 10745 /* XXX We really ought to be able to store multiple | |
| 10746 * EC certs (a requirement if we wish to support both | |
| 10747 * ECDH-RSA and ECDH-ECDSA key exchanges concurrently). | |
| 10748 * When we make that change, we'll need an index other | |
| 10749 * than kt_ecdh to pick the right EC certificate. | |
| 10750 */ | |
| 10751 if (serverKeyPair) { | |
| 10752 serverPubKey = serverKeyPair->pubKey; | |
| 10753 } | |
| 10754 if (serverPubKey == NULL) { | |
| 10755 /* XXX Is this the right error code? */ | |
| 10756 PORT_SetError(SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE); | |
| 10757 return SECFailure; | |
| 10758 } | |
| 10759 rv = ssl3_HandleECDHClientKeyExchange(ss, b, length, | |
| 10760 serverPubKey, serverKey); | |
| 10761 if (ss->ephemeralECDHKeyPair) { | |
| 10762 ssl3_FreeKeyPair(ss->ephemeralECDHKeyPair); | |
| 10763 ss->ephemeralECDHKeyPair = NULL; | |
| 10764 } | |
| 10765 if (rv != SECSuccess) { | |
| 10766 return SECFailure; /* error code set */ | |
| 10767 } | |
| 10768 break; | |
| 10769 #endif /* NSS_DISABLE_ECC */ | |
| 10770 | |
| 10771 default: | |
| 10772 (void)ssl3_HandshakeFailure(ss); | |
| 10773 PORT_SetError(SEC_ERROR_UNSUPPORTED_KEYALG); | |
| 10774 return SECFailure; | |
| 10775 } | |
| 10776 ss->ssl3.hs.ws = ss->sec.peerCert ? wait_cert_verify : wait_change_cipher; | |
| 10777 return SECSuccess; | |
| 10778 } | |
| 10779 | |
| 10780 /* This is TLS's equivalent of sending a no_certificate alert. */ | |
| 10781 SECStatus | |
| 10782 ssl3_SendEmptyCertificate(sslSocket *ss) | |
| 10783 { | |
| 10784 SECStatus rv; | |
| 10785 unsigned int len = 0; | |
| 10786 PRBool isTLS13 = PR_FALSE; | |
| 10787 | |
| 10788 if (ss->version >= SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 10789 len = ss->ssl3.hs.certReqContextLen + 1; | |
| 10790 isTLS13 = PR_TRUE; | |
| 10791 } | |
| 10792 | |
| 10793 rv = ssl3_AppendHandshakeHeader(ss, certificate, len + 3); | |
| 10794 if (rv != SECSuccess) { | |
| 10795 return rv; | |
| 10796 } | |
| 10797 | |
| 10798 if (isTLS13) { | |
| 10799 rv = ssl3_AppendHandshakeVariable(ss, ss->ssl3.hs.certReqContext, | |
| 10800 ss->ssl3.hs.certReqContextLen, 1); | |
| 10801 if (rv != SECSuccess) { | |
| 10802 return rv; | |
| 10803 } | |
| 10804 } | |
| 10805 | |
| 10806 return ssl3_AppendHandshakeNumber(ss, 0, 3); | |
| 10807 } | |
| 10808 | |
| 10809 SECStatus | |
| 10810 ssl3_HandleNewSessionTicket(sslSocket *ss, SSL3Opaque *b, PRUint32 length) | |
| 10811 { | |
| 10812 SECStatus rv; | |
| 10813 SECItem ticketData; | |
| 10814 | |
| 10815 SSL_TRC(3, ("%d: SSL3[%d]: handle session_ticket handshake", | |
| 10816 SSL_GETPID(), ss->fd)); | |
| 10817 | |
| 10818 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 10819 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 10820 | |
| 10821 PORT_Assert(!ss->ssl3.hs.newSessionTicket.ticket.data); | |
| 10822 PORT_Assert(!ss->ssl3.hs.receivedNewSessionTicket); | |
| 10823 | |
| 10824 if (ss->ssl3.hs.ws != wait_new_session_ticket) { | |
| 10825 SSL3_SendAlert(ss, alert_fatal, unexpected_message); | |
| 10826 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_NEW_SESSION_TICKET); | |
| 10827 return SECFailure; | |
| 10828 } | |
| 10829 | |
| 10830 /* RFC5077 Section 3.3: "The client MUST NOT treat the ticket as valid | |
| 10831 * until it has verified the server's Finished message." See the comment in | |
| 10832 * ssl3_FinishHandshake for more details. | |
| 10833 */ | |
| 10834 ss->ssl3.hs.newSessionTicket.received_timestamp = ssl_Time(); | |
| 10835 if (length < 4) { | |
| 10836 (void)SSL3_SendAlert(ss, alert_fatal, decode_error); | |
| 10837 PORT_SetError(SSL_ERROR_RX_MALFORMED_NEW_SESSION_TICKET); | |
| 10838 return SECFailure; | |
| 10839 } | |
| 10840 ss->ssl3.hs.newSessionTicket.ticket_lifetime_hint = | |
| 10841 (PRUint32)ssl3_ConsumeHandshakeNumber(ss, 4, &b, &length); | |
| 10842 | |
| 10843 rv = ssl3_ConsumeHandshakeVariable(ss, &ticketData, 2, &b, &length); | |
| 10844 if (rv != SECSuccess || length != 0) { | |
| 10845 (void)SSL3_SendAlert(ss, alert_fatal, decode_error); | |
| 10846 PORT_SetError(SSL_ERROR_RX_MALFORMED_NEW_SESSION_TICKET); | |
| 10847 return SECFailure; /* malformed */ | |
| 10848 } | |
| 10849 /* If the server sent a zero-length ticket, ignore it and keep the | |
| 10850 * existing ticket. */ | |
| 10851 if (ticketData.len != 0) { | |
| 10852 rv = SECITEM_CopyItem(NULL, &ss->ssl3.hs.newSessionTicket.ticket, | |
| 10853 &ticketData); | |
| 10854 if (rv != SECSuccess) { | |
| 10855 return rv; | |
| 10856 } | |
| 10857 ss->ssl3.hs.receivedNewSessionTicket = PR_TRUE; | |
| 10858 } | |
| 10859 | |
| 10860 ss->ssl3.hs.ws = wait_change_cipher; | |
| 10861 return SECSuccess; | |
| 10862 } | |
| 10863 | |
| 10864 #ifdef NISCC_TEST | |
| 10865 static PRInt32 connNum = 0; | |
| 10866 | |
| 10867 static SECStatus | |
| 10868 get_fake_cert(SECItem *pCertItem, int *pIndex) | |
| 10869 { | |
| 10870 PRFileDesc *cf; | |
| 10871 char *testdir; | |
| 10872 char *startat; | |
| 10873 char *stopat; | |
| 10874 const char *extension; | |
| 10875 int fileNum; | |
| 10876 PRInt32 numBytes = 0; | |
| 10877 PRStatus prStatus; | |
| 10878 PRFileInfo info; | |
| 10879 char cfn[100]; | |
| 10880 | |
| 10881 pCertItem->data = 0; | |
| 10882 if ((testdir = PR_GetEnvSecure("NISCC_TEST")) == NULL) { | |
| 10883 return SECSuccess; | |
| 10884 } | |
| 10885 *pIndex = (NULL != strstr(testdir, "root")); | |
| 10886 extension = (strstr(testdir, "simple") ? "" : ".der"); | |
| 10887 fileNum = PR_ATOMIC_INCREMENT(&connNum) - 1; | |
| 10888 if ((startat = PR_GetEnvSecure("START_AT")) != NULL) { | |
| 10889 fileNum += atoi(startat); | |
| 10890 } | |
| 10891 if ((stopat = PR_GetEnvSecure("STOP_AT")) != NULL && | |
| 10892 fileNum >= atoi(stopat)) { | |
| 10893 *pIndex = -1; | |
| 10894 return SECSuccess; | |
| 10895 } | |
| 10896 sprintf(cfn, "%s/%08d%s", testdir, fileNum, extension); | |
| 10897 cf = PR_Open(cfn, PR_RDONLY, 0); | |
| 10898 if (!cf) { | |
| 10899 goto loser; | |
| 10900 } | |
| 10901 prStatus = PR_GetOpenFileInfo(cf, &info); | |
| 10902 if (prStatus != PR_SUCCESS) { | |
| 10903 PR_Close(cf); | |
| 10904 goto loser; | |
| 10905 } | |
| 10906 pCertItem = SECITEM_AllocItem(NULL, pCertItem, info.size); | |
| 10907 if (pCertItem) { | |
| 10908 numBytes = PR_Read(cf, pCertItem->data, info.size); | |
| 10909 } | |
| 10910 PR_Close(cf); | |
| 10911 if (numBytes != info.size) { | |
| 10912 SECITEM_FreeItem(pCertItem, PR_FALSE); | |
| 10913 PORT_SetError(SEC_ERROR_IO); | |
| 10914 goto loser; | |
| 10915 } | |
| 10916 fprintf(stderr, "using %s\n", cfn); | |
| 10917 return SECSuccess; | |
| 10918 | |
| 10919 loser: | |
| 10920 fprintf(stderr, "failed to use %s\n", cfn); | |
| 10921 *pIndex = -1; | |
| 10922 return SECFailure; | |
| 10923 } | |
| 10924 #endif | |
| 10925 | |
| 10926 /* | |
| 10927 * Used by both client and server. | |
| 10928 * Called from HandleServerHelloDone and from SendServerHelloSequence. | |
| 10929 */ | |
| 10930 SECStatus | |
| 10931 ssl3_SendCertificate(sslSocket *ss) | |
| 10932 { | |
| 10933 SECStatus rv; | |
| 10934 CERTCertificateList *certChain; | |
| 10935 int certChainLen = 0; | |
| 10936 int i; | |
| 10937 SSL3KEAType certIndex; | |
| 10938 #ifdef NISCC_TEST | |
| 10939 SECItem fakeCert; | |
| 10940 int ndex = -1; | |
| 10941 #endif | |
| 10942 PRBool isTLS13 = ss->version >= SSL_LIBRARY_VERSION_TLS_1_3; | |
| 10943 unsigned int contextLen = 0; | |
| 10944 | |
| 10945 SSL_TRC(3, ("%d: SSL3[%d]: send certificate handshake", | |
| 10946 SSL_GETPID(), ss->fd)); | |
| 10947 | |
| 10948 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | |
| 10949 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 10950 | |
| 10951 if (ss->sec.localCert) | |
| 10952 CERT_DestroyCertificate(ss->sec.localCert); | |
| 10953 if (ss->sec.isServer) { | |
| 10954 sslServerCerts *sc = NULL; | |
| 10955 | |
| 10956 /* XXX SSLKEAType isn't really a good choice for | |
| 10957 * indexing certificates (it breaks when we deal | |
| 10958 * with (EC)DHE-* cipher suites. This hack ensures | |
| 10959 * the RSA cert is picked for (EC)DHE-RSA. | |
| 10960 * Revisit this when we add server side support | |
| 10961 * for ECDHE-ECDSA or client-side authentication | |
| 10962 * using EC certificates. | |
| 10963 */ | |
| 10964 if ((ss->ssl3.hs.kea_def->kea == kea_ecdhe_rsa) || | |
| 10965 (ss->ssl3.hs.kea_def->kea == kea_dhe_rsa)) { | |
| 10966 certIndex = kt_rsa; | |
| 10967 } else { | |
| 10968 certIndex = ss->ssl3.hs.kea_def->exchKeyType; | |
| 10969 } | |
| 10970 sc = ss->serverCerts + certIndex; | |
| 10971 certChain = sc->serverCertChain; | |
| 10972 ss->sec.authKeyBits = sc->serverKeyBits; | |
| 10973 ss->sec.authAlgorithm = ss->ssl3.hs.kea_def->signKeyType; | |
| 10974 ss->sec.localCert = CERT_DupCertificate(sc->serverCert); | |
| 10975 } else { | |
| 10976 certChain = ss->ssl3.clientCertChain; | |
| 10977 ss->sec.localCert = CERT_DupCertificate(ss->ssl3.clientCertificate); | |
| 10978 } | |
| 10979 | |
| 10980 #ifdef NISCC_TEST | |
| 10981 rv = get_fake_cert(&fakeCert, &ndex); | |
| 10982 #endif | |
| 10983 | |
| 10984 if (isTLS13) { | |
| 10985 contextLen = 1; /* Length of the context */ | |
| 10986 if (!ss->sec.isServer) { | |
| 10987 contextLen += ss->ssl3.hs.certReqContextLen; | |
| 10988 } | |
| 10989 } | |
| 10990 if (certChain) { | |
| 10991 for (i = 0; i < certChain->len; i++) { | |
| 10992 #ifdef NISCC_TEST | |
| 10993 if (fakeCert.len > 0 && i == ndex) { | |
| 10994 certChainLen += fakeCert.len + 3; | |
| 10995 } else { | |
| 10996 certChainLen += certChain->certs[i].len + 3; | |
| 10997 } | |
| 10998 #else | |
| 10999 certChainLen += certChain->certs[i].len + 3; | |
| 11000 #endif | |
| 11001 } | |
| 11002 } | |
| 11003 | |
| 11004 rv = ssl3_AppendHandshakeHeader(ss, certificate, | |
| 11005 contextLen + certChainLen + 3); | |
| 11006 if (rv != SECSuccess) { | |
| 11007 return rv; /* err set by AppendHandshake. */ | |
| 11008 } | |
| 11009 | |
| 11010 if (isTLS13) { | |
| 11011 if (ss->sec.isServer) { | |
| 11012 rv = ssl3_AppendHandshakeNumber(ss, 0, 1); | |
| 11013 } else { | |
| 11014 rv = ssl3_AppendHandshakeVariable(ss, | |
| 11015 ss->ssl3.hs.certReqContext, | |
| 11016 ss->ssl3.hs.certReqContextLen, 1); | |
| 11017 } | |
| 11018 if (rv != SECSuccess) { | |
| 11019 return rv; /* err set by AppendHandshake. */ | |
| 11020 } | |
| 11021 } | |
| 11022 | |
| 11023 rv = ssl3_AppendHandshakeNumber(ss, certChainLen, 3); | |
| 11024 if (rv != SECSuccess) { | |
| 11025 return rv; /* err set by AppendHandshake. */ | |
| 11026 } | |
| 11027 if (certChain) { | |
| 11028 for (i = 0; i < certChain->len; i++) { | |
| 11029 #ifdef NISCC_TEST | |
| 11030 if (fakeCert.len > 0 && i == ndex) { | |
| 11031 rv = ssl3_AppendHandshakeVariable(ss, fakeCert.data, | |
| 11032 fakeCert.len, 3); | |
| 11033 SECITEM_FreeItem(&fakeCert, PR_FALSE); | |
| 11034 } else { | |
| 11035 rv = ssl3_AppendHandshakeVariable(ss, certChain->certs[i].data, | |
| 11036 certChain->certs[i].len, 3); | |
| 11037 } | |
| 11038 #else | |
| 11039 rv = ssl3_AppendHandshakeVariable(ss, certChain->certs[i].data, | |
| 11040 certChain->certs[i].len, 3); | |
| 11041 #endif | |
| 11042 if (rv != SECSuccess) { | |
| 11043 return rv; /* err set by AppendHandshake. */ | |
| 11044 } | |
| 11045 } | |
| 11046 } | |
| 11047 | |
| 11048 return SECSuccess; | |
| 11049 } | |
| 11050 | |
| 11051 /* | |
| 11052 * Used by server only. | |
| 11053 * single-stapling, send only a single cert status | |
| 11054 */ | |
| 11055 SECStatus | |
| 11056 ssl3_SendCertificateStatus(sslSocket *ss) | |
| 11057 { | |
| 11058 SECStatus rv; | |
| 11059 int len = 0; | |
| 11060 SECItemArray *statusToSend = NULL; | |
| 11061 SSL3KEAType certIndex; | |
| 11062 | |
| 11063 SSL_TRC(3, ("%d: SSL3[%d]: send certificate status handshake", | |
| 11064 SSL_GETPID(), ss->fd)); | |
| 11065 | |
| 11066 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | |
| 11067 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 11068 PORT_Assert(ss->sec.isServer); | |
| 11069 | |
| 11070 if (!ssl3_ExtensionNegotiated(ss, ssl_cert_status_xtn)) | |
| 11071 return SECSuccess; | |
| 11072 | |
| 11073 /* Use certStatus based on the cert being used. */ | |
| 11074 if ((ss->ssl3.hs.kea_def->kea == kea_ecdhe_rsa) || | |
| 11075 (ss->ssl3.hs.kea_def->kea == kea_dhe_rsa)) { | |
| 11076 certIndex = kt_rsa; | |
| 11077 } else { | |
| 11078 certIndex = ss->ssl3.hs.kea_def->exchKeyType; | |
| 11079 } | |
| 11080 if (ss->certStatusArray[certIndex] && ss->certStatusArray[certIndex]->len) { | |
| 11081 statusToSend = ss->certStatusArray[certIndex]; | |
| 11082 } | |
| 11083 if (!statusToSend) | |
| 11084 return SECSuccess; | |
| 11085 | |
| 11086 /* Use the array's first item only (single stapling) */ | |
| 11087 len = 1 + statusToSend->items[0].len + 3; | |
| 11088 | |
| 11089 rv = ssl3_AppendHandshakeHeader(ss, certificate_status, len); | |
| 11090 if (rv != SECSuccess) { | |
| 11091 return rv; /* err set by AppendHandshake. */ | |
| 11092 } | |
| 11093 rv = ssl3_AppendHandshakeNumber(ss, 1 /*ocsp*/, 1); | |
| 11094 if (rv != SECSuccess) | |
| 11095 return rv; /* err set by AppendHandshake. */ | |
| 11096 | |
| 11097 rv = ssl3_AppendHandshakeVariable(ss, | |
| 11098 statusToSend->items[0].data, | |
| 11099 statusToSend->items[0].len, | |
| 11100 3); | |
| 11101 if (rv != SECSuccess) | |
| 11102 return rv; /* err set by AppendHandshake. */ | |
| 11103 | |
| 11104 return SECSuccess; | |
| 11105 } | |
| 11106 | |
| 11107 /* This is used to delete the CA certificates in the peer certificate chain | |
| 11108 * from the cert database after they've been validated. | |
| 11109 */ | |
| 11110 static void | |
| 11111 ssl3_CleanupPeerCerts(sslSocket *ss) | |
| 11112 { | |
| 11113 PLArenaPool *arena = ss->ssl3.peerCertArena; | |
| 11114 ssl3CertNode *certs = (ssl3CertNode *)ss->ssl3.peerCertChain; | |
| 11115 | |
| 11116 for (; certs; certs = certs->next) { | |
| 11117 CERT_DestroyCertificate(certs->cert); | |
| 11118 } | |
| 11119 if (arena) | |
| 11120 PORT_FreeArena(arena, PR_FALSE); | |
| 11121 ss->ssl3.peerCertArena = NULL; | |
| 11122 ss->ssl3.peerCertChain = NULL; | |
| 11123 } | |
| 11124 | |
| 11125 /* Called from ssl3_HandlePostHelloHandshakeMessage() when it has deciphered | |
| 11126 * a complete ssl3 CertificateStatus message. | |
| 11127 * Caller must hold Handshake and RecvBuf locks. | |
| 11128 */ | |
| 11129 static SECStatus | |
| 11130 ssl3_HandleCertificateStatus(sslSocket *ss, SSL3Opaque *b, PRUint32 length) | |
| 11131 { | |
| 11132 if (ss->ssl3.hs.ws != wait_certificate_status) { | |
| 11133 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); | |
| 11134 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CERT_STATUS); | |
| 11135 return SECFailure; | |
| 11136 } | |
| 11137 | |
| 11138 return ssl3_CompleteHandleCertificateStatus(ss, b, length); | |
| 11139 } | |
| 11140 | |
| 11141 /* Called from: | |
| 11142 * ssl3_HandleCertificateStatus | |
| 11143 * tls13_HandleCertificateStatus | |
| 11144 */ | |
| 11145 SECStatus | |
| 11146 ssl3_CompleteHandleCertificateStatus(sslSocket *ss, SSL3Opaque *b, | |
| 11147 PRUint32 length) | |
| 11148 { | |
| 11149 PRInt32 status, len; | |
| 11150 | |
| 11151 PORT_Assert(!ss->sec.isServer); | |
| 11152 | |
| 11153 /* Consume the CertificateStatusType enum */ | |
| 11154 status = ssl3_ConsumeHandshakeNumber(ss, 1, &b, &length); | |
| 11155 if (status != 1 /* ocsp */) { | |
| 11156 goto format_loser; | |
| 11157 } | |
| 11158 | |
| 11159 len = ssl3_ConsumeHandshakeNumber(ss, 3, &b, &length); | |
| 11160 if (len != length) { | |
| 11161 goto format_loser; | |
| 11162 } | |
| 11163 | |
| 11164 #define MAX_CERTSTATUS_LEN 0x1ffff /* 128k - 1 */ | |
| 11165 if (length > MAX_CERTSTATUS_LEN) | |
| 11166 goto format_loser; | |
| 11167 #undef MAX_CERTSTATUS_LEN | |
| 11168 | |
| 11169 /* Array size 1, because we currently implement single-stapling only */ | |
| 11170 SECITEM_AllocArray(NULL, &ss->sec.ci.sid->peerCertStatus, 1); | |
| 11171 if (!ss->sec.ci.sid->peerCertStatus.items) | |
| 11172 return SECFailure; | |
| 11173 | |
| 11174 ss->sec.ci.sid->peerCertStatus.items[0].data = PORT_Alloc(length); | |
| 11175 | |
| 11176 if (!ss->sec.ci.sid->peerCertStatus.items[0].data) { | |
| 11177 SECITEM_FreeArray(&ss->sec.ci.sid->peerCertStatus, PR_FALSE); | |
| 11178 return SECFailure; | |
| 11179 } | |
| 11180 | |
| 11181 PORT_Memcpy(ss->sec.ci.sid->peerCertStatus.items[0].data, b, length); | |
| 11182 ss->sec.ci.sid->peerCertStatus.items[0].len = length; | |
| 11183 ss->sec.ci.sid->peerCertStatus.items[0].type = siBuffer; | |
| 11184 | |
| 11185 return ssl3_AuthCertificate(ss); | |
| 11186 | |
| 11187 format_loser: | |
| 11188 return ssl3_DecodeError(ss); | |
| 11189 } | |
| 11190 | |
| 11191 /* Called from ssl3_HandlePostHelloHandshakeMessage() when it has deciphered | |
| 11192 * a complete ssl3 Certificate message. | |
| 11193 * Caller must hold Handshake and RecvBuf locks. | |
| 11194 */ | |
| 11195 static SECStatus | |
| 11196 ssl3_HandleCertificate(sslSocket *ss, SSL3Opaque *b, PRUint32 length) | |
| 11197 { | |
| 11198 SSL_TRC(3, ("%d: SSL3[%d]: handle certificate handshake", | |
| 11199 SSL_GETPID(), ss->fd)); | |
| 11200 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 11201 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 11202 | |
| 11203 if ((ss->sec.isServer && ss->ssl3.hs.ws != wait_client_cert) || | |
| 11204 (!ss->sec.isServer && ss->ssl3.hs.ws != wait_server_cert)) { | |
| 11205 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); | |
| 11206 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CERTIFICATE); | |
| 11207 return SECFailure; | |
| 11208 } | |
| 11209 | |
| 11210 return ssl3_CompleteHandleCertificate(ss, b, length); | |
| 11211 } | |
| 11212 | |
| 11213 /* Called from ssl3_HandleCertificate | |
| 11214 */ | |
| 11215 SECStatus | |
| 11216 ssl3_CompleteHandleCertificate(sslSocket *ss, SSL3Opaque *b, PRUint32 length) | |
| 11217 { | |
| 11218 ssl3CertNode *c; | |
| 11219 ssl3CertNode *lastCert = NULL; | |
| 11220 PRInt32 remaining = 0; | |
| 11221 PRInt32 size; | |
| 11222 SECStatus rv; | |
| 11223 PRBool isServer = (PRBool)(!!ss->sec.isServer); | |
| 11224 PRBool isTLS; | |
| 11225 SSL3AlertDescription desc; | |
| 11226 int errCode = SSL_ERROR_RX_MALFORMED_CERTIFICATE; | |
| 11227 SECItem certItem; | |
| 11228 | |
| 11229 if (ss->sec.peerCert != NULL) { | |
| 11230 if (ss->sec.peerKey) { | |
| 11231 SECKEY_DestroyPublicKey(ss->sec.peerKey); | |
| 11232 ss->sec.peerKey = NULL; | |
| 11233 } | |
| 11234 CERT_DestroyCertificate(ss->sec.peerCert); | |
| 11235 ss->sec.peerCert = NULL; | |
| 11236 } | |
| 11237 | |
| 11238 ssl3_CleanupPeerCerts(ss); | |
| 11239 isTLS = (PRBool)(ss->ssl3.prSpec->version > SSL_LIBRARY_VERSION_3_0); | |
| 11240 | |
| 11241 /* It is reported that some TLS client sends a Certificate message | |
| 11242 ** with a zero-length message body. We'll treat that case like a | |
| 11243 ** normal no_certificates message to maximize interoperability. | |
| 11244 */ | |
| 11245 if (length) { | |
| 11246 remaining = ssl3_ConsumeHandshakeNumber(ss, 3, &b, &length); | |
| 11247 if (remaining < 0) | |
| 11248 goto loser; /* fatal alert already sent by ConsumeHandshake. */ | |
| 11249 if ((PRUint32)remaining > length) | |
| 11250 goto decode_loser; | |
| 11251 } | |
| 11252 | |
| 11253 if (!remaining) { | |
| 11254 if (!(isTLS && isServer)) { | |
| 11255 desc = bad_certificate; | |
| 11256 goto alert_loser; | |
| 11257 } | |
| 11258 /* This is TLS's version of a no_certificate alert. */ | |
| 11259 /* I'm a server. I've requested a client cert. He hasn't got one. */ | |
| 11260 rv = ssl3_HandleNoCertificate(ss); | |
| 11261 if (rv != SECSuccess) { | |
| 11262 errCode = PORT_GetError(); | |
| 11263 goto loser; | |
| 11264 } | |
| 11265 | |
| 11266 if (ss->version < SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 11267 ss->ssl3.hs.ws = wait_client_key; | |
| 11268 } else { | |
| 11269 TLS13_SET_HS_STATE(ss, wait_finished); | |
| 11270 } | |
| 11271 return SECSuccess; | |
| 11272 } | |
| 11273 | |
| 11274 ss->ssl3.peerCertArena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); | |
| 11275 if (ss->ssl3.peerCertArena == NULL) { | |
| 11276 goto loser; /* don't send alerts on memory errors */ | |
| 11277 } | |
| 11278 | |
| 11279 /* First get the peer cert. */ | |
| 11280 remaining -= 3; | |
| 11281 if (remaining < 0) | |
| 11282 goto decode_loser; | |
| 11283 | |
| 11284 size = ssl3_ConsumeHandshakeNumber(ss, 3, &b, &length); | |
| 11285 if (size <= 0) | |
| 11286 goto loser; /* fatal alert already sent by ConsumeHandshake. */ | |
| 11287 | |
| 11288 if (remaining < size) | |
| 11289 goto decode_loser; | |
| 11290 | |
| 11291 certItem.data = b; | |
| 11292 certItem.len = size; | |
| 11293 b += size; | |
| 11294 length -= size; | |
| 11295 remaining -= size; | |
| 11296 | |
| 11297 ss->sec.peerCert = CERT_NewTempCertificate(ss->dbHandle, &certItem, NULL, | |
| 11298 PR_FALSE, PR_TRUE); | |
| 11299 if (ss->sec.peerCert == NULL) { | |
| 11300 /* We should report an alert if the cert was bad, but not if the | |
| 11301 * problem was just some local problem, like memory error. | |
| 11302 */ | |
| 11303 goto ambiguous_err; | |
| 11304 } | |
| 11305 | |
| 11306 /* Now get all of the CA certs. */ | |
| 11307 while (remaining > 0) { | |
| 11308 remaining -= 3; | |
| 11309 if (remaining < 0) | |
| 11310 goto decode_loser; | |
| 11311 | |
| 11312 size = ssl3_ConsumeHandshakeNumber(ss, 3, &b, &length); | |
| 11313 if (size <= 0) | |
| 11314 goto loser; /* fatal alert already sent by ConsumeHandshake. */ | |
| 11315 | |
| 11316 if (remaining < size) | |
| 11317 goto decode_loser; | |
| 11318 | |
| 11319 certItem.data = b; | |
| 11320 certItem.len = size; | |
| 11321 b += size; | |
| 11322 length -= size; | |
| 11323 remaining -= size; | |
| 11324 | |
| 11325 c = PORT_ArenaNew(ss->ssl3.peerCertArena, ssl3CertNode); | |
| 11326 if (c == NULL) { | |
| 11327 goto loser; /* don't send alerts on memory errors */ | |
| 11328 } | |
| 11329 | |
| 11330 c->cert = CERT_NewTempCertificate(ss->dbHandle, &certItem, NULL, | |
| 11331 PR_FALSE, PR_TRUE); | |
| 11332 if (c->cert == NULL) { | |
| 11333 goto ambiguous_err; | |
| 11334 } | |
| 11335 | |
| 11336 c->next = NULL; | |
| 11337 if (lastCert) { | |
| 11338 lastCert->next = c; | |
| 11339 } else { | |
| 11340 ss->ssl3.peerCertChain = c; | |
| 11341 } | |
| 11342 lastCert = c; | |
| 11343 } | |
| 11344 | |
| 11345 if (remaining != 0) | |
| 11346 goto decode_loser; | |
| 11347 | |
| 11348 SECKEY_UpdateCertPQG(ss->sec.peerCert); | |
| 11349 | |
| 11350 if (!isServer && ssl3_ExtensionNegotiated(ss, ssl_cert_status_xtn)) { | |
| 11351 ss->ssl3.hs.ws = wait_certificate_status; | |
| 11352 rv = SECSuccess; | |
| 11353 } else { | |
| 11354 rv = ssl3_AuthCertificate(ss); /* sets ss->ssl3.hs.ws */ | |
| 11355 } | |
| 11356 | |
| 11357 return rv; | |
| 11358 | |
| 11359 ambiguous_err: | |
| 11360 errCode = PORT_GetError(); | |
| 11361 switch (errCode) { | |
| 11362 case PR_OUT_OF_MEMORY_ERROR: | |
| 11363 case SEC_ERROR_BAD_DATABASE: | |
| 11364 case SEC_ERROR_NO_MEMORY: | |
| 11365 if (isTLS) { | |
| 11366 desc = internal_error; | |
| 11367 goto alert_loser; | |
| 11368 } | |
| 11369 goto loser; | |
| 11370 } | |
| 11371 ssl3_SendAlertForCertError(ss, errCode); | |
| 11372 goto loser; | |
| 11373 | |
| 11374 decode_loser: | |
| 11375 desc = isTLS ? decode_error : bad_certificate; | |
| 11376 | |
| 11377 alert_loser: | |
| 11378 (void)SSL3_SendAlert(ss, alert_fatal, desc); | |
| 11379 | |
| 11380 loser: | |
| 11381 (void)ssl_MapLowLevelError(errCode); | |
| 11382 return SECFailure; | |
| 11383 } | |
| 11384 | |
| 11385 static SECStatus | |
| 11386 ssl3_AuthCertificate(sslSocket *ss) | |
| 11387 { | |
| 11388 SECStatus rv; | |
| 11389 PRBool isServer = (PRBool)(!!ss->sec.isServer); | |
| 11390 int errCode; | |
| 11391 | |
| 11392 ss->ssl3.hs.authCertificatePending = PR_FALSE; | |
| 11393 | |
| 11394 PORT_Assert((ss->ssl3.hs.preliminaryInfo & ssl_preinfo_all) == | |
| 11395 ssl_preinfo_all); | |
| 11396 /* | |
| 11397 * Ask caller-supplied callback function to validate cert chain. | |
| 11398 */ | |
| 11399 rv = (SECStatus)(*ss->authCertificate)(ss->authCertificateArg, ss->fd, | |
| 11400 PR_TRUE, isServer); | |
| 11401 if (rv != SECSuccess) { | |
| 11402 errCode = PORT_GetError(); | |
| 11403 if (rv != SECWouldBlock) { | |
| 11404 if (ss->handleBadCert) { | |
| 11405 rv = (*ss->handleBadCert)(ss->badCertArg, ss->fd); | |
| 11406 } | |
| 11407 } | |
| 11408 | |
| 11409 if (rv == SECWouldBlock) { | |
| 11410 if (ss->sec.isServer) { | |
| 11411 errCode = SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_SERVERS; | |
| 11412 rv = SECFailure; | |
| 11413 goto loser; | |
| 11414 } | |
| 11415 /* TODO(ekr@rtfm.com): Reenable for TLS 1.3 */ | |
| 11416 if (ss->version >= SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 11417 errCode = SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_VERSION; | |
| 11418 rv = SECFailure; | |
| 11419 goto loser; | |
| 11420 } | |
| 11421 | |
| 11422 ss->ssl3.hs.authCertificatePending = PR_TRUE; | |
| 11423 rv = SECSuccess; | |
| 11424 } | |
| 11425 | |
| 11426 if (rv != SECSuccess) { | |
| 11427 ssl3_SendAlertForCertError(ss, errCode); | |
| 11428 goto loser; | |
| 11429 } | |
| 11430 } | |
| 11431 | |
| 11432 ss->sec.ci.sid->peerCert = CERT_DupCertificate(ss->sec.peerCert); | |
| 11433 ssl3_CopyPeerCertsToSID(ss->ssl3.peerCertChain, ss->sec.ci.sid); | |
| 11434 | |
| 11435 if (!ss->sec.isServer) { | |
| 11436 CERTCertificate *cert = ss->sec.peerCert; | |
| 11437 | |
| 11438 /* set the server authentication type and size from the value | |
| 11439 ** in the cert. */ | |
| 11440 SECKEYPublicKey *pubKey = CERT_ExtractPublicKey(cert); | |
| 11441 ss->sec.authAlgorithm = ss->ssl3.hs.kea_def->signKeyType; | |
| 11442 ss->sec.keaType = ss->ssl3.hs.kea_def->exchKeyType; | |
| 11443 if (pubKey) { | |
| 11444 KeyType pubKeyType; | |
| 11445 PRInt32 minKey; | |
| 11446 /* This partly fixes Bug 124230 and may cause problems for | |
| 11447 * callers which depend on the old (wrong) behavior. */ | |
| 11448 ss->sec.authKeyBits = SECKEY_PublicKeyStrengthInBits(pubKey); | |
| 11449 pubKeyType = SECKEY_GetPublicKeyType(pubKey); | |
| 11450 minKey = ss->sec.authKeyBits; | |
| 11451 switch (pubKeyType) { | |
| 11452 case rsaKey: | |
| 11453 case rsaPssKey: | |
| 11454 case rsaOaepKey: | |
| 11455 rv = | |
| 11456 NSS_OptionGet(NSS_RSA_MIN_KEY_SIZE, &minKey); | |
| 11457 if (rv != | |
| 11458 SECSuccess) { | |
| 11459 minKey = | |
| 11460 SSL_RSA_MIN_MODULUS_BITS; | |
| 11461 } | |
| 11462 break; | |
| 11463 case dsaKey: | |
| 11464 rv = | |
| 11465 NSS_OptionGet(NSS_DSA_MIN_KEY_SIZE, &minKey); | |
| 11466 if (rv != | |
| 11467 SECSuccess) { | |
| 11468 minKey = | |
| 11469 SSL_DSA_MIN_P_BITS; | |
| 11470 } | |
| 11471 break; | |
| 11472 case dhKey: | |
| 11473 rv = | |
| 11474 NSS_OptionGet(NSS_DH_MIN_KEY_SIZE, &minKey); | |
| 11475 if (rv != | |
| 11476 SECSuccess) { | |
| 11477 minKey = | |
| 11478 SSL_DH_MIN_P_BITS; | |
| 11479 } | |
| 11480 break; | |
| 11481 default: | |
| 11482 break; | |
| 11483 } | |
| 11484 | |
| 11485 /* Too small: not good enough. Send a fatal alert. */ | |
| 11486 /* We aren't checking EC here on the understanding that we only | |
| 11487 * support curves we like, a decision that might need revisiting. */ | |
| 11488 if (ss->sec.authKeyBits < minKey) { | |
| 11489 PORT_SetError(SSL_ERROR_WEAK_SERVER_CERT_KEY); | |
| 11490 (void)SSL3_SendAlert(ss, alert_fatal, | |
| 11491 ss->version >= SSL_LIBRARY_VERSION_TLS_1_0 | |
| 11492 ? insufficient_security | |
| 11493 : illegal_parameter); | |
| 11494 SECKEY_DestroyPublicKey(pubKey); | |
| 11495 return SECFailure; | |
| 11496 } | |
| 11497 SECKEY_DestroyPublicKey(pubKey); | |
| 11498 pubKey = NULL; | |
| 11499 } | |
| 11500 | |
| 11501 if (ss->version >= SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 11502 TLS13_SET_HS_STATE(ss, wait_cert_verify); | |
| 11503 } else { | |
| 11504 /* Ephemeral suites require ServerKeyExchange. Export cipher suites | |
| 11505 * with RSA key exchange also require ServerKeyExchange if the | |
| 11506 * authentication key exceeds the key size limit. */ | |
| 11507 if (ss->ssl3.hs.kea_def->ephemeral || | |
| 11508 (ss->ssl3.hs.kea_def->is_limited && | |
| 11509 ss->ssl3.hs.kea_def->exchKeyType == ssl_kea_rsa && | |
| 11510 ss->sec.authKeyBits > ss->ssl3.hs.kea_def->key_size_limit)) { | |
| 11511 /* require server_key_exchange */ | |
| 11512 ss->ssl3.hs.ws = wait_server_key; | |
| 11513 } else { | |
| 11514 /* disallow server_key_exchange */ | |
| 11515 ss->ssl3.hs.ws = wait_cert_request; | |
| 11516 /* This is static RSA key exchange so set the key bits to | |
| 11517 * auth bits. */ | |
| 11518 ss->sec.keaKeyBits = ss->sec.authKeyBits; | |
| 11519 } | |
| 11520 } | |
| 11521 } else { | |
| 11522 /* Server */ | |
| 11523 if (ss->version < SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 11524 ss->ssl3.hs.ws = wait_client_key; | |
| 11525 } else { | |
| 11526 TLS13_SET_HS_STATE(ss, wait_cert_verify); | |
| 11527 } | |
| 11528 } | |
| 11529 | |
| 11530 PORT_Assert(rv == SECSuccess); | |
| 11531 if (rv != SECSuccess) { | |
| 11532 errCode = SEC_ERROR_LIBRARY_FAILURE; | |
| 11533 rv = SECFailure; | |
| 11534 goto loser; | |
| 11535 } | |
| 11536 | |
| 11537 return rv; | |
| 11538 | |
| 11539 loser: | |
| 11540 (void)ssl_MapLowLevelError(errCode); | |
| 11541 return SECFailure; | |
| 11542 } | |
| 11543 | |
| 11544 static SECStatus ssl3_FinishHandshake(sslSocket *ss); | |
| 11545 | |
| 11546 static SECStatus | |
| 11547 ssl3_AlwaysFail(sslSocket *ss) | |
| 11548 { | |
| 11549 PORT_SetError(PR_INVALID_STATE_ERROR); | |
| 11550 return SECFailure; | |
| 11551 } | |
| 11552 | |
| 11553 /* Caller must hold 1stHandshakeLock. | |
| 11554 */ | |
| 11555 SECStatus | |
| 11556 ssl3_AuthCertificateComplete(sslSocket *ss, PRErrorCode error) | |
| 11557 { | |
| 11558 SECStatus rv; | |
| 11559 | |
| 11560 PORT_Assert(ss->opt.noLocks || ssl_Have1stHandshakeLock(ss)); | |
| 11561 | |
| 11562 if (ss->sec.isServer) { | |
| 11563 PORT_SetError(SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_SERVERS); | |
| 11564 return SECFailure; | |
| 11565 } | |
| 11566 | |
| 11567 ssl_GetRecvBufLock(ss); | |
| 11568 ssl_GetSSL3HandshakeLock(ss); | |
| 11569 | |
| 11570 if (!ss->ssl3.hs.authCertificatePending) { | |
| 11571 PORT_SetError(PR_INVALID_STATE_ERROR); | |
| 11572 rv = SECFailure; | |
| 11573 goto done; | |
| 11574 } | |
| 11575 | |
| 11576 ss->ssl3.hs.authCertificatePending = PR_FALSE; | |
| 11577 | |
| 11578 if (error != 0) { | |
| 11579 ss->ssl3.hs.restartTarget = ssl3_AlwaysFail; | |
| 11580 ssl3_SendAlertForCertError(ss, error); | |
| 11581 rv = SECSuccess; | |
| 11582 } else if (ss->ssl3.hs.restartTarget != NULL) { | |
| 11583 sslRestartTarget target = ss->ssl3.hs.restartTarget; | |
| 11584 ss->ssl3.hs.restartTarget = NULL; | |
| 11585 | |
| 11586 if (target == ssl3_FinishHandshake) { | |
| 11587 SSL_TRC(3, ("%d: SSL3[%p]: certificate authentication lost the race" | |
| 11588 " with peer's finished message", | |
| 11589 SSL_GETPID(), ss->fd)); | |
| 11590 } | |
| 11591 | |
| 11592 rv = target(ss); | |
| 11593 /* Even if we blocked here, we have accomplished enough to claim | |
| 11594 * success. Any remaining work will be taken care of by subsequent | |
| 11595 * calls to SSL_ForceHandshake/PR_Send/PR_Read/etc. | |
| 11596 */ | |
| 11597 if (rv == SECWouldBlock) { | |
| 11598 rv = SECSuccess; | |
| 11599 } | |
| 11600 } else { | |
| 11601 SSL_TRC(3, ("%d: SSL3[%p]: certificate authentication won the race with" | |
| 11602 " peer's finished message", | |
| 11603 SSL_GETPID(), ss->fd)); | |
| 11604 | |
| 11605 PORT_Assert(!ss->ssl3.hs.isResuming); | |
| 11606 PORT_Assert(ss->ssl3.hs.ws != idle_handshake); | |
| 11607 | |
| 11608 if (ss->opt.enableFalseStart && | |
| 11609 !ss->firstHsDone && | |
| 11610 !ss->ssl3.hs.isResuming && | |
| 11611 ssl3_WaitingForServerSecondRound(ss)) { | |
| 11612 /* ssl3_SendClientSecondRound deferred the false start check because | |
| 11613 * certificate authentication was pending, so we do it now if we sti
ll | |
| 11614 * haven't received all of the server's second round yet. | |
| 11615 */ | |
| 11616 rv = ssl3_CheckFalseStart(ss); | |
| 11617 } else { | |
| 11618 rv = SECSuccess; | |
| 11619 } | |
| 11620 } | |
| 11621 | |
| 11622 done: | |
| 11623 ssl_ReleaseSSL3HandshakeLock(ss); | |
| 11624 ssl_ReleaseRecvBufLock(ss); | |
| 11625 | |
| 11626 return rv; | |
| 11627 } | |
| 11628 | |
| 11629 static SECStatus | |
| 11630 ssl3_ComputeTLSFinished(ssl3CipherSpec *spec, | |
| 11631 PRBool isServer, | |
| 11632 const SSL3Hashes *hashes, | |
| 11633 TLSFinished *tlsFinished) | |
| 11634 { | |
| 11635 SECStatus rv; | |
| 11636 CK_TLS_MAC_PARAMS tls_mac_params; | |
| 11637 SECItem param = { siBuffer, NULL, 0 }; | |
| 11638 PK11Context *prf_context; | |
| 11639 unsigned int retLen; | |
| 11640 | |
| 11641 if (!spec->master_secret || spec->bypassCiphers) { | |
| 11642 const char *label = isServer ? "server finished" : "client finished"; | |
| 11643 unsigned int len = 15; | |
| 11644 | |
| 11645 return ssl3_TLSPRFWithMasterSecret(spec, label, len, hashes->u.raw, | |
| 11646 hashes->len, tlsFinished->verify_data
, | |
| 11647 sizeof tlsFinished->verify_data); | |
| 11648 } | |
| 11649 | |
| 11650 if (spec->version < SSL_LIBRARY_VERSION_TLS_1_2) { | |
| 11651 tls_mac_params.prfMechanism = CKM_TLS_PRF; | |
| 11652 } else { | |
| 11653 tls_mac_params.prfMechanism = CKM_SHA256; | |
| 11654 } | |
| 11655 tls_mac_params.ulMacLength = 12; | |
| 11656 tls_mac_params.ulServerOrClient = isServer ? 1 : 2; | |
| 11657 param.data = (unsigned char *)&tls_mac_params; | |
| 11658 param.len = sizeof(tls_mac_params); | |
| 11659 prf_context = PK11_CreateContextBySymKey(CKM_TLS_MAC, CKA_SIGN, | |
| 11660 spec->master_secret, ¶m); | |
| 11661 if (!prf_context) | |
| 11662 return SECFailure; | |
| 11663 | |
| 11664 rv = PK11_DigestBegin(prf_context); | |
| 11665 rv |= PK11_DigestOp(prf_context, hashes->u.raw, hashes->len); | |
| 11666 rv |= PK11_DigestFinal(prf_context, tlsFinished->verify_data, &retLen, | |
| 11667 sizeof tlsFinished->verify_data); | |
| 11668 PORT_Assert(rv != SECSuccess || retLen == sizeof tlsFinished->verify_data); | |
| 11669 | |
| 11670 PK11_DestroyContext(prf_context, PR_TRUE); | |
| 11671 | |
| 11672 return rv; | |
| 11673 } | |
| 11674 | |
| 11675 /* The calling function must acquire and release the appropriate | |
| 11676 * lock (e.g., ssl_GetSpecReadLock / ssl_ReleaseSpecReadLock for | |
| 11677 * ss->ssl3.crSpec). | |
| 11678 */ | |
| 11679 SECStatus | |
| 11680 ssl3_TLSPRFWithMasterSecret(ssl3CipherSpec *spec, const char *label, | |
| 11681 unsigned int labelLen, const unsigned char *val, uns
igned int valLen, | |
| 11682 unsigned char *out, unsigned int outLen) | |
| 11683 { | |
| 11684 SECStatus rv = SECSuccess; | |
| 11685 | |
| 11686 if (spec->master_secret && !spec->bypassCiphers) { | |
| 11687 SECItem param = { siBuffer, NULL, 0 }; | |
| 11688 CK_MECHANISM_TYPE mech = CKM_TLS_PRF_GENERAL; | |
| 11689 PK11Context *prf_context; | |
| 11690 unsigned int retLen; | |
| 11691 | |
| 11692 if (spec->version >= SSL_LIBRARY_VERSION_TLS_1_2) { | |
| 11693 mech = CKM_NSS_TLS_PRF_GENERAL_SHA256; | |
| 11694 } | |
| 11695 prf_context = PK11_CreateContextBySymKey(mech, CKA_SIGN, | |
| 11696 spec->master_secret, ¶m); | |
| 11697 if (!prf_context) | |
| 11698 return SECFailure; | |
| 11699 | |
| 11700 rv = PK11_DigestBegin(prf_context); | |
| 11701 rv |= PK11_DigestOp(prf_context, (unsigned char *)label, labelLen); | |
| 11702 rv |= PK11_DigestOp(prf_context, val, valLen); | |
| 11703 rv |= PK11_DigestFinal(prf_context, out, &retLen, outLen); | |
| 11704 PORT_Assert(rv != SECSuccess || retLen == outLen); | |
| 11705 | |
| 11706 PK11_DestroyContext(prf_context, PR_TRUE); | |
| 11707 } else { | |
| 11708 /* bypass PKCS11 */ | |
| 11709 #ifdef NO_PKCS11_BYPASS | |
| 11710 PORT_Assert(spec->master_secret); | |
| 11711 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 11712 rv = SECFailure; | |
| 11713 #else | |
| 11714 SECItem inData = { siBuffer }; | |
| 11715 SECItem outData = { siBuffer }; | |
| 11716 PRBool isFIPS = PR_FALSE; | |
| 11717 | |
| 11718 inData.data = (unsigned char *)val; | |
| 11719 inData.len = valLen; | |
| 11720 outData.data = out; | |
| 11721 outData.len = outLen; | |
| 11722 if (spec->version >= SSL_LIBRARY_VERSION_TLS_1_2) { | |
| 11723 rv = TLS_P_hash(HASH_AlgSHA256, &spec->msItem, label, &inData, | |
| 11724 &outData, isFIPS); | |
| 11725 } else { | |
| 11726 rv = TLS_PRF(&spec->msItem, label, &inData, &outData, isFIPS); | |
| 11727 } | |
| 11728 PORT_Assert(rv != SECSuccess || outData.len == outLen); | |
| 11729 #endif | |
| 11730 } | |
| 11731 return rv; | |
| 11732 } | |
| 11733 | |
| 11734 /* called from ssl3_SendClientSecondRound | |
| 11735 * ssl3_HandleFinished | |
| 11736 */ | |
| 11737 static SECStatus | |
| 11738 ssl3_SendNextProto(sslSocket *ss) | |
| 11739 { | |
| 11740 SECStatus rv; | |
| 11741 int padding_len; | |
| 11742 static const unsigned char padding[32] = { 0 }; | |
| 11743 | |
| 11744 if (ss->ssl3.nextProto.len == 0 || | |
| 11745 ss->ssl3.nextProtoState == SSL_NEXT_PROTO_SELECTED) { | |
| 11746 return SECSuccess; | |
| 11747 } | |
| 11748 | |
| 11749 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | |
| 11750 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 11751 | |
| 11752 padding_len = 32 - ((ss->ssl3.nextProto.len + 2) % 32); | |
| 11753 | |
| 11754 rv = ssl3_AppendHandshakeHeader(ss, next_proto, ss->ssl3.nextProto.len + | |
| 11755 2 + | |
| 11756 padding_len); | |
| 11757 if (rv != SECSuccess) { | |
| 11758 return rv; /* error code set by AppendHandshakeHeader */ | |
| 11759 } | |
| 11760 rv = ssl3_AppendHandshakeVariable(ss, ss->ssl3.nextProto.data, | |
| 11761 ss->ssl3.nextProto.len, 1); | |
| 11762 if (rv != SECSuccess) { | |
| 11763 return rv; /* error code set by AppendHandshake */ | |
| 11764 } | |
| 11765 rv = ssl3_AppendHandshakeVariable(ss, padding, padding_len, 1); | |
| 11766 if (rv != SECSuccess) { | |
| 11767 return rv; /* error code set by AppendHandshake */ | |
| 11768 } | |
| 11769 return rv; | |
| 11770 } | |
| 11771 | |
| 11772 /* called from ssl3_SendFinished | |
| 11773 * | |
| 11774 * This function is simply a debugging aid and therefore does not return a | |
| 11775 * SECStatus. */ | |
| 11776 static void | |
| 11777 ssl3_RecordKeyLog(sslSocket *ss) | |
| 11778 { | |
| 11779 SECStatus rv; | |
| 11780 SECItem *keyData; | |
| 11781 char buf[14 /* "CLIENT_RANDOM " */ + | |
| 11782 SSL3_RANDOM_LENGTH * 2 /* client_random */ + | |
| 11783 1 /* " " */ + | |
| 11784 48 * 2 /* master secret */ + | |
| 11785 1 /* new line */]; | |
| 11786 unsigned int j; | |
| 11787 | |
| 11788 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 11789 | |
| 11790 if (!ssl_keylog_iob) | |
| 11791 return; | |
| 11792 | |
| 11793 rv = PK11_ExtractKeyValue(ss->ssl3.cwSpec->master_secret); | |
| 11794 if (rv != SECSuccess) | |
| 11795 return; | |
| 11796 | |
| 11797 ssl_GetSpecReadLock(ss); | |
| 11798 | |
| 11799 /* keyData does not need to be freed. */ | |
| 11800 keyData = PK11_GetKeyData(ss->ssl3.cwSpec->master_secret); | |
| 11801 if (!keyData || !keyData->data || keyData->len != 48) { | |
| 11802 ssl_ReleaseSpecReadLock(ss); | |
| 11803 return; | |
| 11804 } | |
| 11805 | |
| 11806 /* https://developer.mozilla.org/en/NSS_Key_Log_Format */ | |
| 11807 | |
| 11808 /* There could be multiple, concurrent writers to the | |
| 11809 * keylog, so we have to do everything in a single call to | |
| 11810 * fwrite. */ | |
| 11811 | |
| 11812 memcpy(buf, "CLIENT_RANDOM ", 14); | |
| 11813 j = 14; | |
| 11814 hexEncode(buf + j, ss->ssl3.hs.client_random.rand, SSL3_RANDOM_LENGTH); | |
| 11815 j += SSL3_RANDOM_LENGTH * 2; | |
| 11816 buf[j++] = ' '; | |
| 11817 hexEncode(buf + j, keyData->data, 48); | |
| 11818 j += 48 * 2; | |
| 11819 buf[j++] = '\n'; | |
| 11820 | |
| 11821 PORT_Assert(j == sizeof(buf)); | |
| 11822 | |
| 11823 ssl_ReleaseSpecReadLock(ss); | |
| 11824 | |
| 11825 if (fwrite(buf, sizeof(buf), 1, ssl_keylog_iob) != 1) | |
| 11826 return; | |
| 11827 fflush(ssl_keylog_iob); | |
| 11828 return; | |
| 11829 } | |
| 11830 | |
| 11831 /* called from ssl3_SendClientSecondRound | |
| 11832 * ssl3_HandleFinished | |
| 11833 */ | |
| 11834 static SECStatus | |
| 11835 ssl3_SendChannelIDEncryptedExtensions(sslSocket *ss) | |
| 11836 { | |
| 11837 static const char CHANNEL_ID_MAGIC[] = "TLS Channel ID signature"; | |
| 11838 static const char CHANNEL_ID_RESUMPTION_MAGIC[] = "Resumption"; | |
| 11839 /* This is the ASN.1 prefix for a P-256 public key. Specifically it's: | |
| 11840 * SEQUENCE | |
| 11841 * SEQUENCE | |
| 11842 * OID id-ecPublicKey | |
| 11843 * OID prime256v1 | |
| 11844 * BIT STRING, length 66, 0 trailing bits: 0x04 | |
| 11845 * | |
| 11846 * The 0x04 in the BIT STRING is the prefix for an uncompressed, X9.62 | |
| 11847 * public key. Following that are the two field elements as 32-byte, | |
| 11848 * big-endian numbers, as required by the Channel ID. */ | |
| 11849 static const unsigned char P256_SPKI_PREFIX[] = { | |
| 11850 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, | |
| 11851 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, | |
| 11852 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, | |
| 11853 0x42, 0x00, 0x04 | |
| 11854 }; | |
| 11855 /* ChannelIDs are always 128 bytes long: 64 bytes of P-256 public key and 64 | |
| 11856 * bytes of ECDSA signature. */ | |
| 11857 static const int CHANNEL_ID_PUBLIC_KEY_LENGTH = 64; | |
| 11858 static const int CHANNEL_ID_LENGTH = 128; | |
| 11859 | |
| 11860 SECStatus rv = SECFailure; | |
| 11861 SECItem *spki = NULL; | |
| 11862 SSL3Hashes hashes; | |
| 11863 const unsigned char *pub_bytes; | |
| 11864 unsigned char signed_data[sizeof(CHANNEL_ID_MAGIC) + | |
| 11865 sizeof(CHANNEL_ID_RESUMPTION_MAGIC) + | |
| 11866 sizeof(SSL3Hashes) * 2]; | |
| 11867 size_t signed_data_len; | |
| 11868 unsigned char digest[SHA256_LENGTH]; | |
| 11869 SECItem digest_item; | |
| 11870 unsigned char signature[64]; | |
| 11871 SECItem signature_item; | |
| 11872 | |
| 11873 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | |
| 11874 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 11875 | |
| 11876 if (ss->ssl3.channelID == NULL) | |
| 11877 return SECSuccess; | |
| 11878 | |
| 11879 PORT_Assert(ssl3_ExtensionNegotiated(ss, ssl_channel_id_xtn)); | |
| 11880 | |
| 11881 if (SECKEY_GetPrivateKeyType(ss->ssl3.channelID) != ecKey || | |
| 11882 PK11_SignatureLen(ss->ssl3.channelID) != sizeof(signature)) { | |
| 11883 PORT_SetError(SSL_ERROR_INVALID_CHANNEL_ID_KEY); | |
| 11884 rv = SECFailure; | |
| 11885 goto loser; | |
| 11886 } | |
| 11887 | |
| 11888 ssl_GetSpecReadLock(ss); | |
| 11889 rv = ssl3_ComputeHandshakeHashes(ss, ss->ssl3.cwSpec, &hashes, 0); | |
| 11890 ssl_ReleaseSpecReadLock(ss); | |
| 11891 | |
| 11892 if (rv != SECSuccess) | |
| 11893 goto loser; | |
| 11894 | |
| 11895 rv = ssl3_AppendHandshakeHeader(ss, channelid_encrypted_extensions, | |
| 11896 2 + 2 + CHANNEL_ID_LENGTH); | |
| 11897 if (rv != SECSuccess) | |
| 11898 goto loser; /* error code set by AppendHandshakeHeader */ | |
| 11899 rv = ssl3_AppendHandshakeNumber(ss, ssl_channel_id_xtn, 2); | |
| 11900 if (rv != SECSuccess) | |
| 11901 goto loser; /* error code set by AppendHandshake */ | |
| 11902 rv = ssl3_AppendHandshakeNumber(ss, CHANNEL_ID_LENGTH, 2); | |
| 11903 if (rv != SECSuccess) | |
| 11904 goto loser; /* error code set by AppendHandshake */ | |
| 11905 | |
| 11906 spki = SECKEY_EncodeDERSubjectPublicKeyInfo(ss->ssl3.channelIDPub); | |
| 11907 | |
| 11908 if (spki->len != sizeof(P256_SPKI_PREFIX) + CHANNEL_ID_PUBLIC_KEY_LENGTH || | |
| 11909 memcmp(spki->data, P256_SPKI_PREFIX, sizeof(P256_SPKI_PREFIX)) != 0) { | |
| 11910 PORT_SetError(SSL_ERROR_INVALID_CHANNEL_ID_KEY); | |
| 11911 rv = SECFailure; | |
| 11912 goto loser; | |
| 11913 } | |
| 11914 | |
| 11915 pub_bytes = spki->data + sizeof(P256_SPKI_PREFIX); | |
| 11916 | |
| 11917 signed_data_len = 0; | |
| 11918 memcpy(signed_data + signed_data_len, CHANNEL_ID_MAGIC, | |
| 11919 sizeof(CHANNEL_ID_MAGIC)); | |
| 11920 signed_data_len += sizeof(CHANNEL_ID_MAGIC); | |
| 11921 if (ss->ssl3.hs.isResuming) { | |
| 11922 SECItem *originalHandshakeHash = | |
| 11923 &ss->sec.ci.sid->u.ssl3.originalHandshakeHash; | |
| 11924 PORT_Assert(originalHandshakeHash->len > 0); | |
| 11925 | |
| 11926 memcpy(signed_data + signed_data_len, CHANNEL_ID_RESUMPTION_MAGIC, | |
| 11927 sizeof(CHANNEL_ID_RESUMPTION_MAGIC)); | |
| 11928 signed_data_len += sizeof(CHANNEL_ID_RESUMPTION_MAGIC); | |
| 11929 memcpy(signed_data + signed_data_len, originalHandshakeHash->data, | |
| 11930 originalHandshakeHash->len); | |
| 11931 signed_data_len += originalHandshakeHash->len; | |
| 11932 } | |
| 11933 memcpy(signed_data + signed_data_len, hashes.u.raw, hashes.len); | |
| 11934 signed_data_len += hashes.len; | |
| 11935 | |
| 11936 rv = PK11_HashBuf(SEC_OID_SHA256, digest, signed_data, signed_data_len); | |
| 11937 if (rv != SECSuccess) | |
| 11938 goto loser; | |
| 11939 | |
| 11940 digest_item.data = digest; | |
| 11941 digest_item.len = sizeof(digest); | |
| 11942 | |
| 11943 signature_item.data = signature; | |
| 11944 signature_item.len = sizeof(signature); | |
| 11945 | |
| 11946 rv = PK11_Sign(ss->ssl3.channelID, &signature_item, &digest_item); | |
| 11947 if (rv != SECSuccess) | |
| 11948 goto loser; | |
| 11949 | |
| 11950 rv = ssl3_AppendHandshake(ss, pub_bytes, CHANNEL_ID_PUBLIC_KEY_LENGTH); | |
| 11951 if (rv != SECSuccess) | |
| 11952 goto loser; | |
| 11953 rv = ssl3_AppendHandshake(ss, signature, sizeof(signature)); | |
| 11954 | |
| 11955 loser: | |
| 11956 if (spki) | |
| 11957 SECITEM_FreeItem(spki, PR_TRUE); | |
| 11958 if (ss->ssl3.channelID) { | |
| 11959 SECKEY_DestroyPrivateKey(ss->ssl3.channelID); | |
| 11960 ss->ssl3.channelID = NULL; | |
| 11961 } | |
| 11962 if (ss->ssl3.channelIDPub) { | |
| 11963 SECKEY_DestroyPublicKey(ss->ssl3.channelIDPub); | |
| 11964 ss->ssl3.channelIDPub = NULL; | |
| 11965 } | |
| 11966 | |
| 11967 return rv; | |
| 11968 } | |
| 11969 | |
| 11970 /* ssl3_RestartHandshakeAfterChannelIDReq is called to restart a handshake | |
| 11971 * after a ChannelID callback returned SECWouldBlock. At this point we have | |
| 11972 * processed the server's ServerHello but not yet any further messages. We will | |
| 11973 * always get a message from the server after a ServerHello so either they are | |
| 11974 * waiting in the buffer or we'll get network I/O. */ | |
| 11975 SECStatus | |
| 11976 ssl3_RestartHandshakeAfterChannelIDReq(sslSocket *ss, | |
| 11977 SECKEYPublicKey *channelIDPub, | |
| 11978 SECKEYPrivateKey *channelID) | |
| 11979 { | |
| 11980 if (ss->handshake == 0) { | |
| 11981 SECKEY_DestroyPublicKey(channelIDPub); | |
| 11982 SECKEY_DestroyPrivateKey(channelID); | |
| 11983 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 11984 return SECFailure; | |
| 11985 } | |
| 11986 | |
| 11987 if (channelIDPub == NULL || | |
| 11988 channelID == NULL) { | |
| 11989 if (channelIDPub) | |
| 11990 SECKEY_DestroyPublicKey(channelIDPub); | |
| 11991 if (channelID) | |
| 11992 SECKEY_DestroyPrivateKey(channelID); | |
| 11993 PORT_SetError(PR_INVALID_ARGUMENT_ERROR); | |
| 11994 return SECFailure; | |
| 11995 } | |
| 11996 | |
| 11997 if (ss->ssl3.channelID) | |
| 11998 SECKEY_DestroyPrivateKey(ss->ssl3.channelID); | |
| 11999 if (ss->ssl3.channelIDPub) | |
| 12000 SECKEY_DestroyPublicKey(ss->ssl3.channelIDPub); | |
| 12001 | |
| 12002 ss->handshake = ssl_GatherRecord1stHandshake; | |
| 12003 ss->ssl3.channelID = channelID; | |
| 12004 ss->ssl3.channelIDPub = channelIDPub; | |
| 12005 | |
| 12006 return SECSuccess; | |
| 12007 } | |
| 12008 | |
| 12009 /* called from ssl3_SendClientSecondRound | |
| 12010 * ssl3_HandleClientHello | |
| 12011 * ssl3_HandleFinished | |
| 12012 */ | |
| 12013 static SECStatus | |
| 12014 ssl3_SendFinished(sslSocket *ss, PRInt32 flags) | |
| 12015 { | |
| 12016 ssl3CipherSpec *cwSpec; | |
| 12017 PRBool isTLS; | |
| 12018 PRBool isServer = ss->sec.isServer; | |
| 12019 SECStatus rv; | |
| 12020 SSL3Sender sender = isServer ? sender_server : sender_client; | |
| 12021 SSL3Hashes hashes; | |
| 12022 TLSFinished tlsFinished; | |
| 12023 | |
| 12024 SSL_TRC(3, ("%d: SSL3[%d]: send finished handshake", SSL_GETPID(), ss->fd)); | |
| 12025 | |
| 12026 PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss)); | |
| 12027 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 12028 | |
| 12029 ssl_GetSpecReadLock(ss); | |
| 12030 cwSpec = ss->ssl3.cwSpec; | |
| 12031 isTLS = (PRBool)(cwSpec->version > SSL_LIBRARY_VERSION_3_0); | |
| 12032 rv = ssl3_ComputeHandshakeHashes(ss, cwSpec, &hashes, sender); | |
| 12033 if (isTLS && rv == SECSuccess) { | |
| 12034 rv = ssl3_ComputeTLSFinished(cwSpec, isServer, &hashes, &tlsFinished); | |
| 12035 } | |
| 12036 ssl_ReleaseSpecReadLock(ss); | |
| 12037 if (rv != SECSuccess) { | |
| 12038 goto fail; /* err code was set by ssl3_ComputeHandshakeHashes */ | |
| 12039 } | |
| 12040 | |
| 12041 if (isTLS) { | |
| 12042 if (isServer) | |
| 12043 ss->ssl3.hs.finishedMsgs.tFinished[1] = tlsFinished; | |
| 12044 else | |
| 12045 ss->ssl3.hs.finishedMsgs.tFinished[0] = tlsFinished; | |
| 12046 ss->ssl3.hs.finishedBytes = sizeof tlsFinished; | |
| 12047 rv = ssl3_AppendHandshakeHeader(ss, finished, sizeof tlsFinished); | |
| 12048 if (rv != SECSuccess) | |
| 12049 goto fail; /* err set by AppendHandshake. */ | |
| 12050 rv = ssl3_AppendHandshake(ss, &tlsFinished, sizeof tlsFinished); | |
| 12051 if (rv != SECSuccess) | |
| 12052 goto fail; /* err set by AppendHandshake. */ | |
| 12053 } else { | |
| 12054 if (isServer) | |
| 12055 ss->ssl3.hs.finishedMsgs.sFinished[1] = hashes.u.s; | |
| 12056 else | |
| 12057 ss->ssl3.hs.finishedMsgs.sFinished[0] = hashes.u.s; | |
| 12058 PORT_Assert(hashes.len == sizeof hashes.u.s); | |
| 12059 ss->ssl3.hs.finishedBytes = sizeof hashes.u.s; | |
| 12060 rv = ssl3_AppendHandshakeHeader(ss, finished, sizeof hashes.u.s); | |
| 12061 if (rv != SECSuccess) | |
| 12062 goto fail; /* err set by AppendHandshake. */ | |
| 12063 rv = ssl3_AppendHandshake(ss, &hashes.u.s, sizeof hashes.u.s); | |
| 12064 if (rv != SECSuccess) | |
| 12065 goto fail; /* err set by AppendHandshake. */ | |
| 12066 } | |
| 12067 rv = ssl3_FlushHandshake(ss, flags); | |
| 12068 if (rv != SECSuccess) { | |
| 12069 goto fail; /* error code set by ssl3_FlushHandshake */ | |
| 12070 } | |
| 12071 | |
| 12072 ssl3_RecordKeyLog(ss); | |
| 12073 | |
| 12074 return SECSuccess; | |
| 12075 | |
| 12076 fail: | |
| 12077 return rv; | |
| 12078 } | |
| 12079 | |
| 12080 /* wrap the master secret, and put it into the SID. | |
| 12081 * Caller holds the Spec read lock. | |
| 12082 */ | |
| 12083 SECStatus | |
| 12084 ssl3_CacheWrappedMasterSecret(sslSocket *ss, sslSessionID *sid, | |
| 12085 ssl3CipherSpec *spec, SSL3KEAType effectiveExchKey
Type) | |
| 12086 { | |
| 12087 PK11SymKey *wrappingKey = NULL; | |
| 12088 PK11SlotInfo *symKeySlot; | |
| 12089 void *pwArg = ss->pkcs11PinArg; | |
| 12090 SECStatus rv = SECFailure; | |
| 12091 PRBool isServer = ss->sec.isServer; | |
| 12092 CK_MECHANISM_TYPE mechanism = CKM_INVALID_MECHANISM; | |
| 12093 symKeySlot = PK11_GetSlotFromKey(spec->master_secret); | |
| 12094 if (!isServer) { | |
| 12095 int wrapKeyIndex; | |
| 12096 int incarnation; | |
| 12097 | |
| 12098 /* these next few functions are mere accessors and don't fail. */ | |
| 12099 sid->u.ssl3.masterWrapIndex = wrapKeyIndex = | |
| 12100 PK11_GetCurrentWrapIndex(symKeySlot); | |
| 12101 PORT_Assert(wrapKeyIndex == 0); /* array has only one entry! */ | |
| 12102 | |
| 12103 sid->u.ssl3.masterWrapSeries = incarnation = | |
| 12104 PK11_GetSlotSeries(symKeySlot); | |
| 12105 sid->u.ssl3.masterSlotID = PK11_GetSlotID(symKeySlot); | |
| 12106 sid->u.ssl3.masterModuleID = PK11_GetModuleID(symKeySlot); | |
| 12107 sid->u.ssl3.masterValid = PR_TRUE; | |
| 12108 /* Get the default wrapping key, for wrapping the master secret before | |
| 12109 * placing it in the SID cache entry. */ | |
| 12110 wrappingKey = PK11_GetWrapKey(symKeySlot, wrapKeyIndex, | |
| 12111 CKM_INVALID_MECHANISM, incarnation, | |
| 12112 pwArg); | |
| 12113 if (wrappingKey) { | |
| 12114 mechanism = PK11_GetMechanism(wrappingKey); /* can't fail. */ | |
| 12115 } else { | |
| 12116 int keyLength; | |
| 12117 /* if the wrappingKey doesn't exist, attempt to create it. | |
| 12118 * Note: we intentionally ignore errors here. If we cannot | |
| 12119 * generate a wrapping key, it is not fatal to this SSL connection, | |
| 12120 * but we will not be able to restart this session. | |
| 12121 */ | |
| 12122 mechanism = PK11_GetBestWrapMechanism(symKeySlot); | |
| 12123 keyLength = PK11_GetBestKeyLength(symKeySlot, mechanism); | |
| 12124 /* Zero length means fixed key length algorithm, or error. | |
| 12125 * It's ambiguous. | |
| 12126 */ | |
| 12127 wrappingKey = PK11_KeyGen(symKeySlot, mechanism, NULL, | |
| 12128 keyLength, pwArg); | |
| 12129 if (wrappingKey) { | |
| 12130 PK11_SetWrapKey(symKeySlot, wrapKeyIndex, wrappingKey); | |
| 12131 } | |
| 12132 } | |
| 12133 } else { | |
| 12134 /* server socket using session cache. */ | |
| 12135 mechanism = PK11_GetBestWrapMechanism(symKeySlot); | |
| 12136 if (mechanism != CKM_INVALID_MECHANISM) { | |
| 12137 wrappingKey = | |
| 12138 getWrappingKey(ss, symKeySlot, effectiveExchKeyType, | |
| 12139 mechanism, pwArg); | |
| 12140 if (wrappingKey) { | |
| 12141 mechanism = PK11_GetMechanism(wrappingKey); /* can't fail. */ | |
| 12142 } | |
| 12143 } | |
| 12144 } | |
| 12145 | |
| 12146 sid->u.ssl3.masterWrapMech = mechanism; | |
| 12147 PK11_FreeSlot(symKeySlot); | |
| 12148 | |
| 12149 if (wrappingKey) { | |
| 12150 SECItem wmsItem; | |
| 12151 | |
| 12152 wmsItem.data = sid->u.ssl3.keys.wrapped_master_secret; | |
| 12153 wmsItem.len = sizeof sid->u.ssl3.keys.wrapped_master_secret; | |
| 12154 rv = PK11_WrapSymKey(mechanism, NULL, wrappingKey, | |
| 12155 spec->master_secret, &wmsItem); | |
| 12156 /* rv is examined below. */ | |
| 12157 sid->u.ssl3.keys.wrapped_master_secret_len = wmsItem.len; | |
| 12158 PK11_FreeSymKey(wrappingKey); | |
| 12159 } | |
| 12160 return rv; | |
| 12161 } | |
| 12162 | |
| 12163 /* Called from ssl3_HandlePostHelloHandshakeMessage() when it has deciphered | |
| 12164 * a complete ssl3 Finished message from the peer. | |
| 12165 * Caller must hold Handshake and RecvBuf locks. | |
| 12166 */ | |
| 12167 static SECStatus | |
| 12168 ssl3_HandleFinished(sslSocket *ss, SSL3Opaque *b, PRUint32 length, | |
| 12169 const SSL3Hashes *hashes) | |
| 12170 { | |
| 12171 sslSessionID *sid = ss->sec.ci.sid; | |
| 12172 SECStatus rv = SECSuccess; | |
| 12173 PRBool isServer = ss->sec.isServer; | |
| 12174 PRBool isTLS; | |
| 12175 SSL3KEAType effectiveExchKeyType; | |
| 12176 | |
| 12177 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 12178 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 12179 | |
| 12180 SSL_TRC(3, ("%d: SSL3[%d]: handle finished handshake", | |
| 12181 SSL_GETPID(), ss->fd)); | |
| 12182 | |
| 12183 if (ss->ssl3.hs.ws != wait_finished) { | |
| 12184 SSL3_SendAlert(ss, alert_fatal, unexpected_message); | |
| 12185 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_FINISHED); | |
| 12186 return SECFailure; | |
| 12187 } | |
| 12188 | |
| 12189 if (!hashes) { | |
| 12190 PORT_Assert(0); | |
| 12191 SSL3_SendAlert(ss, alert_fatal, internal_error); | |
| 12192 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 12193 return SECFailure; | |
| 12194 } | |
| 12195 | |
| 12196 isTLS = (PRBool)(ss->ssl3.crSpec->version > SSL_LIBRARY_VERSION_3_0); | |
| 12197 if (isTLS) { | |
| 12198 TLSFinished tlsFinished; | |
| 12199 | |
| 12200 if (length != sizeof tlsFinished) { | |
| 12201 (void)SSL3_SendAlert(ss, alert_fatal, decode_error); | |
| 12202 PORT_SetError(SSL_ERROR_RX_MALFORMED_FINISHED); | |
| 12203 return SECFailure; | |
| 12204 } | |
| 12205 rv = ssl3_ComputeTLSFinished(ss->ssl3.crSpec, !isServer, | |
| 12206 hashes, &tlsFinished); | |
| 12207 if (!isServer) | |
| 12208 ss->ssl3.hs.finishedMsgs.tFinished[1] = tlsFinished; | |
| 12209 else | |
| 12210 ss->ssl3.hs.finishedMsgs.tFinished[0] = tlsFinished; | |
| 12211 ss->ssl3.hs.finishedBytes = sizeof tlsFinished; | |
| 12212 if (rv != SECSuccess || | |
| 12213 0 != NSS_SecureMemcmp(&tlsFinished, b, length)) { | |
| 12214 (void)SSL3_SendAlert(ss, alert_fatal, decrypt_error); | |
| 12215 PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); | |
| 12216 return SECFailure; | |
| 12217 } | |
| 12218 } else { | |
| 12219 if (length != sizeof(SSL3Finished)) { | |
| 12220 (void)ssl3_IllegalParameter(ss); | |
| 12221 PORT_SetError(SSL_ERROR_RX_MALFORMED_FINISHED); | |
| 12222 return SECFailure; | |
| 12223 } | |
| 12224 | |
| 12225 if (!isServer) | |
| 12226 ss->ssl3.hs.finishedMsgs.sFinished[1] = hashes->u.s; | |
| 12227 else | |
| 12228 ss->ssl3.hs.finishedMsgs.sFinished[0] = hashes->u.s; | |
| 12229 PORT_Assert(hashes->len == sizeof hashes->u.s); | |
| 12230 ss->ssl3.hs.finishedBytes = sizeof hashes->u.s; | |
| 12231 if (0 != NSS_SecureMemcmp(&hashes->u.s, b, length)) { | |
| 12232 (void)ssl3_HandshakeFailure(ss); | |
| 12233 PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE); | |
| 12234 return SECFailure; | |
| 12235 } | |
| 12236 } | |
| 12237 | |
| 12238 ssl_GetXmitBufLock(ss); /*************************************/ | |
| 12239 | |
| 12240 if ((isServer && !ss->ssl3.hs.isResuming) || | |
| 12241 (!isServer && ss->ssl3.hs.isResuming)) { | |
| 12242 PRInt32 flags = 0; | |
| 12243 | |
| 12244 /* Send a NewSessionTicket message if the client sent us | |
| 12245 * either an empty session ticket, or one that did not verify. | |
| 12246 * (Note that if either of these conditions was met, then the | |
| 12247 * server has sent a SessionTicket extension in the | |
| 12248 * ServerHello message.) | |
| 12249 */ | |
| 12250 if (isServer && !ss->ssl3.hs.isResuming && | |
| 12251 ssl3_ExtensionNegotiated(ss, ssl_session_ticket_xtn) && | |
| 12252 ssl3_KEAAllowsSessionTicket(ss->ssl3.hs.suite_def->key_exchange_alg)
) { | |
| 12253 /* RFC 5077 Section 3.3: "In the case of a full handshake, the | |
| 12254 * server MUST verify the client's Finished message before sending | |
| 12255 * the ticket." Presumably, this also means that the client's | |
| 12256 * certificate, if any, must be verified beforehand too. | |
| 12257 */ | |
| 12258 rv = ssl3_SendNewSessionTicket(ss); | |
| 12259 if (rv != SECSuccess) { | |
| 12260 goto xmit_loser; | |
| 12261 } | |
| 12262 } | |
| 12263 | |
| 12264 rv = ssl3_SendChangeCipherSpecs(ss); | |
| 12265 if (rv != SECSuccess) { | |
| 12266 goto xmit_loser; /* err is set. */ | |
| 12267 } | |
| 12268 /* If this thread is in SSL_SecureSend (trying to write some data) | |
| 12269 ** then set the ssl_SEND_FLAG_FORCE_INTO_BUFFER flag, so that the | |
| 12270 ** last two handshake messages (change cipher spec and finished) | |
| 12271 ** will be sent in the same send/write call as the application data. | |
| 12272 */ | |
| 12273 if (ss->writerThread == PR_GetCurrentThread()) { | |
| 12274 flags = ssl_SEND_FLAG_FORCE_INTO_BUFFER; | |
| 12275 } | |
| 12276 | |
| 12277 if (!isServer) { | |
| 12278 if (!ss->firstHsDone) { | |
| 12279 rv = ssl3_SendNextProto(ss); | |
| 12280 if (rv != SECSuccess) { | |
| 12281 goto xmit_loser; /* err code was set. */ | |
| 12282 } | |
| 12283 } | |
| 12284 rv = ssl3_SendChannelIDEncryptedExtensions(ss); | |
| 12285 if (rv != SECSuccess) | |
| 12286 goto xmit_loser; /* err code was set. */ | |
| 12287 } | |
| 12288 | |
| 12289 if (IS_DTLS(ss)) { | |
| 12290 flags |= ssl_SEND_FLAG_NO_RETRANSMIT; | |
| 12291 } | |
| 12292 | |
| 12293 rv = ssl3_SendFinished(ss, flags); | |
| 12294 if (rv != SECSuccess) { | |
| 12295 goto xmit_loser; /* err is set. */ | |
| 12296 } | |
| 12297 } | |
| 12298 | |
| 12299 xmit_loser: | |
| 12300 ssl_ReleaseXmitBufLock(ss); /*************************************/ | |
| 12301 if (rv != SECSuccess) { | |
| 12302 return rv; | |
| 12303 } | |
| 12304 | |
| 12305 if (ss->ssl3.hs.kea_def->kea == kea_ecdhe_rsa || | |
| 12306 ss->ssl3.hs.kea_def->kea == kea_dhe_rsa) { | |
| 12307 effectiveExchKeyType = kt_rsa; | |
| 12308 } else { | |
| 12309 effectiveExchKeyType = ss->ssl3.hs.kea_def->exchKeyType; | |
| 12310 } | |
| 12311 | |
| 12312 if (sid->cached == never_cached && !ss->opt.noCache && ss->sec.cache) { | |
| 12313 /* fill in the sid */ | |
| 12314 sid->u.ssl3.cipherSuite = ss->ssl3.hs.cipher_suite; | |
| 12315 sid->u.ssl3.compression = ss->ssl3.hs.compression; | |
| 12316 sid->u.ssl3.policy = ss->ssl3.policy; | |
| 12317 #ifndef NSS_DISABLE_ECC | |
| 12318 sid->u.ssl3.negotiatedECCurves = ss->ssl3.hs.negotiatedECCurves; | |
| 12319 #endif | |
| 12320 sid->u.ssl3.exchKeyType = effectiveExchKeyType; | |
| 12321 sid->version = ss->version; | |
| 12322 sid->authAlgorithm = ss->sec.authAlgorithm; | |
| 12323 sid->authKeyBits = ss->sec.authKeyBits; | |
| 12324 sid->keaType = ss->sec.keaType; | |
| 12325 sid->keaKeyBits = ss->sec.keaKeyBits; | |
| 12326 sid->lastAccessTime = sid->creationTime = ssl_Time(); | |
| 12327 sid->expirationTime = sid->creationTime + ssl3_sid_timeout; | |
| 12328 sid->localCert = CERT_DupCertificate(ss->sec.localCert); | |
| 12329 | |
| 12330 ssl_GetSpecReadLock(ss); /*************************************/ | |
| 12331 | |
| 12332 /* Copy the master secret (wrapped or unwrapped) into the sid */ | |
| 12333 if (ss->ssl3.crSpec->msItem.len && ss->ssl3.crSpec->msItem.data) { | |
| 12334 sid->u.ssl3.keys.wrapped_master_secret_len = | |
| 12335 ss->ssl3.crSpec->msItem.len; | |
| 12336 memcpy(sid->u.ssl3.keys.wrapped_master_secret, | |
| 12337 ss->ssl3.crSpec->msItem.data, ss->ssl3.crSpec->msItem.len); | |
| 12338 sid->u.ssl3.masterValid = PR_TRUE; | |
| 12339 sid->u.ssl3.keys.msIsWrapped = PR_FALSE; | |
| 12340 rv = SECSuccess; | |
| 12341 } else { | |
| 12342 rv = ssl3_CacheWrappedMasterSecret(ss, ss->sec.ci.sid, | |
| 12343 ss->ssl3.crSpec, | |
| 12344 effectiveExchKeyType); | |
| 12345 sid->u.ssl3.keys.msIsWrapped = PR_TRUE; | |
| 12346 } | |
| 12347 ssl_ReleaseSpecReadLock(ss); /*************************************/ | |
| 12348 | |
| 12349 /* If the wrap failed, we don't cache the sid. | |
| 12350 * The connection continues normally however. | |
| 12351 */ | |
| 12352 ss->ssl3.hs.cacheSID = rv == SECSuccess; | |
| 12353 } | |
| 12354 | |
| 12355 if (ss->ssl3.hs.authCertificatePending) { | |
| 12356 if (ss->ssl3.hs.restartTarget) { | |
| 12357 PR_NOT_REACHED("ssl3_HandleFinished: unexpected restartTarget"); | |
| 12358 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 12359 return SECFailure; | |
| 12360 } | |
| 12361 | |
| 12362 ss->ssl3.hs.restartTarget = ssl3_FinishHandshake; | |
| 12363 return SECWouldBlock; | |
| 12364 } | |
| 12365 | |
| 12366 rv = ssl3_FinishHandshake(ss); | |
| 12367 return rv; | |
| 12368 } | |
| 12369 | |
| 12370 /* The return type is SECStatus instead of void because this function needs | |
| 12371 * to have type sslRestartTarget. | |
| 12372 */ | |
| 12373 SECStatus | |
| 12374 ssl3_FinishHandshake(sslSocket *ss) | |
| 12375 { | |
| 12376 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 12377 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 12378 PORT_Assert(ss->ssl3.hs.restartTarget == NULL); | |
| 12379 | |
| 12380 /* The first handshake is now completed. */ | |
| 12381 ss->handshake = NULL; | |
| 12382 | |
| 12383 /* RFC 5077 Section 3.3: "The client MUST NOT treat the ticket as valid | |
| 12384 * until it has verified the server's Finished message." When the server | |
| 12385 * sends a NewSessionTicket in a resumption handshake, we must wait until | |
| 12386 * the handshake is finished (we have verified the server's Finished | |
| 12387 * AND the server's certificate) before we update the ticket in the sid. | |
| 12388 * | |
| 12389 * This must be done before we call (*ss->sec.cache)(ss->sec.ci.sid) | |
| 12390 * because CacheSID requires the session ticket to already be set, and also | |
| 12391 * because of the lazy lock creation scheme used by CacheSID and | |
| 12392 * ssl3_SetSIDSessionTicket. | |
| 12393 */ | |
| 12394 if (ss->ssl3.hs.receivedNewSessionTicket) { | |
| 12395 PORT_Assert(!ss->sec.isServer); | |
| 12396 ssl3_SetSIDSessionTicket(ss->sec.ci.sid, &ss->ssl3.hs.newSessionTicket); | |
| 12397 /* The sid took over the ticket data */ | |
| 12398 PORT_Assert(!ss->ssl3.hs.newSessionTicket.ticket.data); | |
| 12399 ss->ssl3.hs.receivedNewSessionTicket = PR_FALSE; | |
| 12400 } | |
| 12401 | |
| 12402 if (ss->ssl3.hs.cacheSID && ss->sec.isServer) { | |
| 12403 PORT_Assert(ss->sec.ci.sid->cached == never_cached); | |
| 12404 (*ss->sec.cache)(ss->sec.ci.sid); | |
| 12405 ss->ssl3.hs.cacheSID = PR_FALSE; | |
| 12406 } | |
| 12407 | |
| 12408 ss->ssl3.hs.canFalseStart = PR_FALSE; /* False Start phase is complete */ | |
| 12409 ss->ssl3.hs.ws = idle_handshake; | |
| 12410 | |
| 12411 ssl_FinishHandshake(ss); | |
| 12412 | |
| 12413 return SECSuccess; | |
| 12414 } | |
| 12415 | |
| 12416 /* Called from ssl3_HandleHandshake() when it has gathered a complete ssl3 | |
| 12417 * hanshake message. | |
| 12418 * Caller must hold Handshake and RecvBuf locks. | |
| 12419 */ | |
| 12420 SECStatus | |
| 12421 ssl3_HandleHandshakeMessage(sslSocket *ss, SSL3Opaque *b, PRUint32 length) | |
| 12422 { | |
| 12423 SECStatus rv = SECSuccess; | |
| 12424 SSL3HandshakeType type = ss->ssl3.hs.msg_type; | |
| 12425 SSL3Hashes hashes; /* computed hashes are put here. */ | |
| 12426 SSL3Hashes *hashesPtr = NULL; /* Set when hashes are computed */ | |
| 12427 PRUint8 hdr[4]; | |
| 12428 PRUint8 dtlsData[8]; | |
| 12429 PRBool computeHashes = PR_FALSE; | |
| 12430 | |
| 12431 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 12432 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 12433 /* | |
| 12434 * We have to compute the hashes before we update them with the | |
| 12435 * current message. | |
| 12436 */ | |
| 12437 if (ss->version < SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 12438 if (((type == finished) && (ss->ssl3.hs.ws == wait_finished)) || | |
| 12439 ((type == certificate_verify) && | |
| 12440 (ss->ssl3.hs.ws == wait_cert_verify))) { | |
| 12441 computeHashes = PR_TRUE; | |
| 12442 } | |
| 12443 } else { | |
| 12444 if (type == certificate_verify) { | |
| 12445 computeHashes = | |
| 12446 TLS13_IN_HS_STATE(ss, wait_cert_verify); | |
| 12447 } else if (type == finished) { | |
| 12448 computeHashes = | |
| 12449 TLS13_IN_HS_STATE(ss, wait_cert_request, wait_finished); | |
| 12450 } | |
| 12451 } | |
| 12452 | |
| 12453 ssl_GetSpecReadLock(ss); /************************************/ | |
| 12454 if (computeHashes) { | |
| 12455 SSL3Sender sender = (SSL3Sender)0; | |
| 12456 ssl3CipherSpec *rSpec = ss->version >= SSL_LIBRARY_VERSION_TLS_1_3 ? ss-
>ssl3.crSpec | |
| 12457 : ss-
>ssl3.prSpec; | |
| 12458 | |
| 12459 if (type == finished) { | |
| 12460 sender = ss->sec.isServer ? sender_client : sender_server; | |
| 12461 rSpec = ss->ssl3.crSpec; | |
| 12462 } | |
| 12463 rv = ssl3_ComputeHandshakeHashes(ss, rSpec, &hashes, sender); | |
| 12464 if (rv == SECSuccess) { | |
| 12465 hashesPtr = &hashes; | |
| 12466 } | |
| 12467 } | |
| 12468 ssl_ReleaseSpecReadLock(ss); /************************************/ | |
| 12469 if (rv != SECSuccess) { | |
| 12470 return rv; /* error code was set by ssl3_ComputeHandshakeHashes*/ | |
| 12471 } | |
| 12472 SSL_TRC(30, ("%d: SSL3[%d]: handle handshake message: %s", SSL_GETPID(), | |
| 12473 ss->fd, ssl3_DecodeHandshakeType(ss->ssl3.hs.msg_type))); | |
| 12474 | |
| 12475 hdr[0] = (PRUint8)ss->ssl3.hs.msg_type; | |
| 12476 hdr[1] = (PRUint8)(length >> 16); | |
| 12477 hdr[2] = (PRUint8)(length >> 8); | |
| 12478 hdr[3] = (PRUint8)(length); | |
| 12479 | |
| 12480 /* Start new handshake hashes when we start a new handshake */ | |
| 12481 if (ss->ssl3.hs.msg_type == client_hello) { | |
| 12482 rv = ssl3_RestartHandshakeHashes(ss); | |
| 12483 if (rv != SECSuccess) { | |
| 12484 return rv; | |
| 12485 } | |
| 12486 } | |
| 12487 /* We should not include hello_request and hello_verify_request messages | |
| 12488 * in the handshake hashes */ | |
| 12489 if ((ss->ssl3.hs.msg_type != hello_request) && | |
| 12490 (ss->ssl3.hs.msg_type != hello_verify_request)) { | |
| 12491 rv = ssl3_UpdateHandshakeHashes(ss, (unsigned char *)hdr, 4); | |
| 12492 if (rv != SECSuccess) | |
| 12493 return rv; /* err code already set. */ | |
| 12494 | |
| 12495 /* Extra data to simulate a complete DTLS handshake fragment */ | |
| 12496 if (IS_DTLS(ss)) { | |
| 12497 /* Sequence number */ | |
| 12498 dtlsData[0] = MSB(ss->ssl3.hs.recvMessageSeq); | |
| 12499 dtlsData[1] = LSB(ss->ssl3.hs.recvMessageSeq); | |
| 12500 | |
| 12501 /* Fragment offset */ | |
| 12502 dtlsData[2] = 0; | |
| 12503 dtlsData[3] = 0; | |
| 12504 dtlsData[4] = 0; | |
| 12505 | |
| 12506 /* Fragment length */ | |
| 12507 dtlsData[5] = (PRUint8)(length >> 16); | |
| 12508 dtlsData[6] = (PRUint8)(length >> 8); | |
| 12509 dtlsData[7] = (PRUint8)(length); | |
| 12510 | |
| 12511 rv = ssl3_UpdateHandshakeHashes(ss, (unsigned char *)dtlsData, | |
| 12512 sizeof(dtlsData)); | |
| 12513 if (rv != SECSuccess) | |
| 12514 return rv; /* err code already set. */ | |
| 12515 } | |
| 12516 | |
| 12517 /* The message body */ | |
| 12518 rv = ssl3_UpdateHandshakeHashes(ss, b, length); | |
| 12519 if (rv != SECSuccess) | |
| 12520 return rv; /* err code already set. */ | |
| 12521 } | |
| 12522 | |
| 12523 PORT_SetError(0); /* each message starts with no error. */ | |
| 12524 | |
| 12525 if (ss->ssl3.hs.ws == wait_certificate_status && | |
| 12526 ss->ssl3.hs.msg_type != certificate_status) { | |
| 12527 /* If we negotiated the certificate_status extension then we deferred | |
| 12528 * certificate validation until we get the CertificateStatus messsage. | |
| 12529 * But the CertificateStatus message is optional. If the server did | |
| 12530 * not send it then we need to validate the certificate now. If the | |
| 12531 * server does send the CertificateStatus message then we will | |
| 12532 * authenticate the certificate in ssl3_HandleCertificateStatus. | |
| 12533 */ | |
| 12534 rv = ssl3_AuthCertificate(ss); /* sets ss->ssl3.hs.ws */ | |
| 12535 PORT_Assert(rv != SECWouldBlock); | |
| 12536 if (rv != SECSuccess) { | |
| 12537 return rv; | |
| 12538 } | |
| 12539 } | |
| 12540 | |
| 12541 switch (ss->ssl3.hs.msg_type) { | |
| 12542 case client_hello: | |
| 12543 if (!ss->sec.isServer) { | |
| 12544 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); | |
| 12545 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CLIENT_HELLO); | |
| 12546 return SECFailure; | |
| 12547 } | |
| 12548 rv = ssl3_HandleClientHello(ss, b, length); | |
| 12549 break; | |
| 12550 case server_hello: | |
| 12551 if (ss->sec.isServer) { | |
| 12552 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); | |
| 12553 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_SERVER_HELLO); | |
| 12554 return SECFailure; | |
| 12555 } | |
| 12556 rv = ssl3_HandleServerHello(ss, b, length); | |
| 12557 break; | |
| 12558 default: | |
| 12559 if (ss->version < SSL_LIBRARY_VERSION_TLS_1_3) { | |
| 12560 rv = ssl3_HandlePostHelloHandshakeMessage(ss, b, length, hashesP
tr); | |
| 12561 } else { | |
| 12562 rv = tls13_HandlePostHelloHandshakeMessage(ss, b, length, | |
| 12563 hashesPtr); | |
| 12564 } | |
| 12565 break; | |
| 12566 } | |
| 12567 | |
| 12568 if (IS_DTLS(ss) && (rv != SECFailure)) { | |
| 12569 /* Increment the expected sequence number */ | |
| 12570 ss->ssl3.hs.recvMessageSeq++; | |
| 12571 } | |
| 12572 return rv; | |
| 12573 } | |
| 12574 | |
| 12575 static SECStatus | |
| 12576 ssl3_HandlePostHelloHandshakeMessage(sslSocket *ss, SSL3Opaque *b, | |
| 12577 PRUint32 length, SSL3Hashes *hashesPtr) | |
| 12578 { | |
| 12579 SECStatus rv; | |
| 12580 PORT_Assert(ss->version < SSL_LIBRARY_VERSION_TLS_1_3); | |
| 12581 | |
| 12582 switch (ss->ssl3.hs.msg_type) { | |
| 12583 case hello_request: | |
| 12584 if (length != 0) { | |
| 12585 (void)ssl3_DecodeError(ss); | |
| 12586 PORT_SetError(SSL_ERROR_RX_MALFORMED_HELLO_REQUEST); | |
| 12587 return SECFailure; | |
| 12588 } | |
| 12589 if (ss->sec.isServer) { | |
| 12590 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); | |
| 12591 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HELLO_REQUEST); | |
| 12592 return SECFailure; | |
| 12593 } | |
| 12594 rv = ssl3_HandleHelloRequest(ss); | |
| 12595 break; | |
| 12596 case hello_verify_request: | |
| 12597 if (!IS_DTLS(ss) || ss->sec.isServer) { | |
| 12598 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); | |
| 12599 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HELLO_VERIFY_REQUEST); | |
| 12600 return SECFailure; | |
| 12601 } | |
| 12602 rv = dtls_HandleHelloVerifyRequest(ss, b, length); | |
| 12603 break; | |
| 12604 case certificate: | |
| 12605 rv = ssl3_HandleCertificate(ss, b, length); | |
| 12606 break; | |
| 12607 case certificate_status: | |
| 12608 rv = ssl3_HandleCertificateStatus(ss, b, length); | |
| 12609 break; | |
| 12610 case server_key_exchange: | |
| 12611 if (ss->sec.isServer) { | |
| 12612 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); | |
| 12613 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_SERVER_KEY_EXCH); | |
| 12614 return SECFailure; | |
| 12615 } | |
| 12616 rv = ssl3_HandleServerKeyExchange(ss, b, length); | |
| 12617 break; | |
| 12618 case certificate_request: | |
| 12619 if (ss->sec.isServer) { | |
| 12620 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); | |
| 12621 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CERT_REQUEST); | |
| 12622 return SECFailure; | |
| 12623 } | |
| 12624 rv = ssl3_HandleCertificateRequest(ss, b, length); | |
| 12625 break; | |
| 12626 case server_hello_done: | |
| 12627 if (length != 0) { | |
| 12628 (void)ssl3_DecodeError(ss); | |
| 12629 PORT_SetError(SSL_ERROR_RX_MALFORMED_HELLO_DONE); | |
| 12630 return SECFailure; | |
| 12631 } | |
| 12632 if (ss->sec.isServer) { | |
| 12633 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); | |
| 12634 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HELLO_DONE); | |
| 12635 return SECFailure; | |
| 12636 } | |
| 12637 rv = ssl3_HandleServerHelloDone(ss); | |
| 12638 break; | |
| 12639 case certificate_verify: | |
| 12640 if (!ss->sec.isServer) { | |
| 12641 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); | |
| 12642 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CERT_VERIFY); | |
| 12643 return SECFailure; | |
| 12644 } | |
| 12645 rv = ssl3_HandleCertificateVerify(ss, b, length, hashesPtr); | |
| 12646 break; | |
| 12647 case client_key_exchange: | |
| 12648 if (!ss->sec.isServer) { | |
| 12649 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); | |
| 12650 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CLIENT_KEY_EXCH); | |
| 12651 return SECFailure; | |
| 12652 } | |
| 12653 rv = ssl3_HandleClientKeyExchange(ss, b, length); | |
| 12654 break; | |
| 12655 case new_session_ticket: | |
| 12656 if (ss->sec.isServer) { | |
| 12657 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); | |
| 12658 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_NEW_SESSION_TICKET); | |
| 12659 return SECFailure; | |
| 12660 } | |
| 12661 rv = ssl3_HandleNewSessionTicket(ss, b, length); | |
| 12662 break; | |
| 12663 case finished: | |
| 12664 rv = ssl3_HandleFinished(ss, b, length, hashesPtr); | |
| 12665 break; | |
| 12666 default: | |
| 12667 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); | |
| 12668 PORT_SetError(SSL_ERROR_RX_UNKNOWN_HANDSHAKE); | |
| 12669 rv = SECFailure; | |
| 12670 } | |
| 12671 | |
| 12672 return rv; | |
| 12673 } | |
| 12674 | |
| 12675 /* Called only from ssl3_HandleRecord, for each (deciphered) ssl3 record. | |
| 12676 * origBuf is the decrypted ssl record content. | |
| 12677 * Caller must hold the handshake and RecvBuf locks. | |
| 12678 */ | |
| 12679 static SECStatus | |
| 12680 ssl3_HandleHandshake(sslSocket *ss, sslBuffer *origBuf) | |
| 12681 { | |
| 12682 /* | |
| 12683 * There may be a partial handshake message already in the handshake | |
| 12684 * state. The incoming buffer may contain another portion, or a | |
| 12685 * complete message or several messages followed by another portion. | |
| 12686 * | |
| 12687 * Each message is made contiguous before being passed to the actual | |
| 12688 * message parser. | |
| 12689 */ | |
| 12690 sslBuffer *buf = &ss->ssl3.hs.msgState; /* do not lose the original buffer p
ointer */ | |
| 12691 SECStatus rv; | |
| 12692 | |
| 12693 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 12694 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 12695 | |
| 12696 if (buf->buf == NULL) { | |
| 12697 *buf = *origBuf; | |
| 12698 } | |
| 12699 while (buf->len > 0) { | |
| 12700 if (ss->ssl3.hs.header_bytes < 4) { | |
| 12701 PRUint8 t; | |
| 12702 t = *(buf->buf++); | |
| 12703 buf->len--; | |
| 12704 if (ss->ssl3.hs.header_bytes++ == 0) | |
| 12705 ss->ssl3.hs.msg_type = (SSL3HandshakeType)t; | |
| 12706 else | |
| 12707 ss->ssl3.hs.msg_len = (ss->ssl3.hs.msg_len << 8) + t; | |
| 12708 if (ss->ssl3.hs.header_bytes < 4) | |
| 12709 continue; | |
| 12710 | |
| 12711 #define MAX_HANDSHAKE_MSG_LEN 0x1ffff /* 128k - 1 */ | |
| 12712 if (ss->ssl3.hs.msg_len > MAX_HANDSHAKE_MSG_LEN) { | |
| 12713 (void)ssl3_DecodeError(ss); | |
| 12714 PORT_SetError(SSL_ERROR_RX_MALFORMED_HANDSHAKE); | |
| 12715 return SECFailure; | |
| 12716 } | |
| 12717 #undef MAX_HANDSHAKE_MSG_LEN | |
| 12718 | |
| 12719 /* If msg_len is zero, be sure we fall through, | |
| 12720 ** even if buf->len is zero. | |
| 12721 */ | |
| 12722 if (ss->ssl3.hs.msg_len > 0) | |
| 12723 continue; | |
| 12724 } | |
| 12725 | |
| 12726 /* | |
| 12727 * Header has been gathered and there is at least one byte of new | |
| 12728 * data available for this message. If it can be done right out | |
| 12729 * of the original buffer, then use it from there. | |
| 12730 */ | |
| 12731 if (ss->ssl3.hs.msg_body.len == 0 && buf->len >= ss->ssl3.hs.msg_len) { | |
| 12732 /* handle it from input buffer */ | |
| 12733 rv = ssl3_HandleHandshakeMessage(ss, buf->buf, ss->ssl3.hs.msg_len); | |
| 12734 if (rv == SECFailure) { | |
| 12735 /* This test wants to fall through on either | |
| 12736 * SECSuccess or SECWouldBlock. | |
| 12737 * ssl3_HandleHandshakeMessage MUST set the error code. | |
| 12738 */ | |
| 12739 return rv; | |
| 12740 } | |
| 12741 buf->buf += ss->ssl3.hs.msg_len; | |
| 12742 buf->len -= ss->ssl3.hs.msg_len; | |
| 12743 ss->ssl3.hs.msg_len = 0; | |
| 12744 ss->ssl3.hs.header_bytes = 0; | |
| 12745 if (rv != SECSuccess) { /* return if SECWouldBlock. */ | |
| 12746 return rv; | |
| 12747 } | |
| 12748 } else { | |
| 12749 /* must be copied to msg_body and dealt with from there */ | |
| 12750 unsigned int bytes; | |
| 12751 | |
| 12752 PORT_Assert(ss->ssl3.hs.msg_body.len < ss->ssl3.hs.msg_len); | |
| 12753 bytes = PR_MIN(buf->len, ss->ssl3.hs.msg_len - ss->ssl3.hs.msg_body.
len); | |
| 12754 | |
| 12755 /* Grow the buffer if needed */ | |
| 12756 rv = sslBuffer_Grow(&ss->ssl3.hs.msg_body, ss->ssl3.hs.msg_len); | |
| 12757 if (rv != SECSuccess) { | |
| 12758 /* sslBuffer_Grow has set a memory error code. */ | |
| 12759 return SECFailure; | |
| 12760 } | |
| 12761 | |
| 12762 PORT_Memcpy(ss->ssl3.hs.msg_body.buf + ss->ssl3.hs.msg_body.len, | |
| 12763 buf->buf, bytes); | |
| 12764 ss->ssl3.hs.msg_body.len += bytes; | |
| 12765 buf->buf += bytes; | |
| 12766 buf->len -= bytes; | |
| 12767 | |
| 12768 PORT_Assert(ss->ssl3.hs.msg_body.len <= ss->ssl3.hs.msg_len); | |
| 12769 | |
| 12770 /* if we have a whole message, do it */ | |
| 12771 if (ss->ssl3.hs.msg_body.len == ss->ssl3.hs.msg_len) { | |
| 12772 rv = ssl3_HandleHandshakeMessage( | |
| 12773 ss, ss->ssl3.hs.msg_body.buf, ss->ssl3.hs.msg_len); | |
| 12774 if (rv == SECFailure) { | |
| 12775 /* This test wants to fall through on either | |
| 12776 * SECSuccess or SECWouldBlock. | |
| 12777 * ssl3_HandleHandshakeMessage MUST set error code. | |
| 12778 */ | |
| 12779 return rv; | |
| 12780 } | |
| 12781 ss->ssl3.hs.msg_body.len = 0; | |
| 12782 ss->ssl3.hs.msg_len = 0; | |
| 12783 ss->ssl3.hs.header_bytes = 0; | |
| 12784 if (rv != SECSuccess) { /* return if SECWouldBlock. */ | |
| 12785 return rv; | |
| 12786 } | |
| 12787 } else { | |
| 12788 PORT_Assert(buf->len == 0); | |
| 12789 break; | |
| 12790 } | |
| 12791 } | |
| 12792 } /* end loop */ | |
| 12793 | |
| 12794 origBuf->len = 0; /* So ssl3_GatherAppDataRecord will keep looping. */ | |
| 12795 buf->buf = NULL; /* not a leak. */ | |
| 12796 return SECSuccess; | |
| 12797 } | |
| 12798 | |
| 12799 /* These macros return the given value with the MSB copied to all the other | |
| 12800 * bits. They use the fact that arithmetic shift shifts-in the sign bit. | |
| 12801 * However, this is not ensured by the C standard so you may need to replace | |
| 12802 * them with something else for odd compilers. */ | |
| 12803 #define DUPLICATE_MSB_TO_ALL(x) ((unsigned)((int)(x) >> (sizeof(int) * 8 - 1))) | |
| 12804 #define DUPLICATE_MSB_TO_ALL_8(x) ((unsigned char)(DUPLICATE_MSB_TO_ALL(x))) | |
| 12805 | |
| 12806 /* SECStatusToMask returns, in constant time, a mask value of all ones if | |
| 12807 * rv == SECSuccess. Otherwise it returns zero. */ | |
| 12808 static unsigned int | |
| 12809 SECStatusToMask(SECStatus rv) | |
| 12810 { | |
| 12811 unsigned int good; | |
| 12812 /* rv ^ SECSuccess is zero iff rv == SECSuccess. Subtracting one results | |
| 12813 * in the MSB being set to one iff it was zero before. */ | |
| 12814 good = rv ^ SECSuccess; | |
| 12815 good--; | |
| 12816 return DUPLICATE_MSB_TO_ALL(good); | |
| 12817 } | |
| 12818 | |
| 12819 /* ssl_ConstantTimeGE returns 0xff if a>=b and 0x00 otherwise. */ | |
| 12820 static unsigned char | |
| 12821 ssl_ConstantTimeGE(unsigned int a, unsigned int b) | |
| 12822 { | |
| 12823 a -= b; | |
| 12824 return DUPLICATE_MSB_TO_ALL(~a); | |
| 12825 } | |
| 12826 | |
| 12827 /* ssl_ConstantTimeEQ8 returns 0xff if a==b and 0x00 otherwise. */ | |
| 12828 static unsigned char | |
| 12829 ssl_ConstantTimeEQ8(unsigned char a, unsigned char b) | |
| 12830 { | |
| 12831 unsigned int c = a ^ b; | |
| 12832 c--; | |
| 12833 return DUPLICATE_MSB_TO_ALL_8(c); | |
| 12834 } | |
| 12835 | |
| 12836 static SECStatus | |
| 12837 ssl_RemoveSSLv3CBCPadding(sslBuffer *plaintext, | |
| 12838 unsigned int blockSize, | |
| 12839 unsigned int macSize) | |
| 12840 { | |
| 12841 unsigned int paddingLength, good, t; | |
| 12842 const unsigned int overhead = 1 /* padding length byte */ + macSize; | |
| 12843 | |
| 12844 /* These lengths are all public so we can test them in non-constant | |
| 12845 * time. */ | |
| 12846 if (overhead > plaintext->len) { | |
| 12847 return SECFailure; | |
| 12848 } | |
| 12849 | |
| 12850 paddingLength = plaintext->buf[plaintext->len - 1]; | |
| 12851 /* SSLv3 padding bytes are random and cannot be checked. */ | |
| 12852 t = plaintext->len; | |
| 12853 t -= paddingLength + overhead; | |
| 12854 /* If len >= paddingLength+overhead then the MSB of t is zero. */ | |
| 12855 good = DUPLICATE_MSB_TO_ALL(~t); | |
| 12856 /* SSLv3 requires that the padding is minimal. */ | |
| 12857 t = blockSize - (paddingLength + 1); | |
| 12858 good &= DUPLICATE_MSB_TO_ALL(~t); | |
| 12859 plaintext->len -= good & (paddingLength + 1); | |
| 12860 return (good & SECSuccess) | (~good & SECFailure); | |
| 12861 } | |
| 12862 | |
| 12863 static SECStatus | |
| 12864 ssl_RemoveTLSCBCPadding(sslBuffer *plaintext, unsigned int macSize) | |
| 12865 { | |
| 12866 unsigned int paddingLength, good, t, toCheck, i; | |
| 12867 const unsigned int overhead = 1 /* padding length byte */ + macSize; | |
| 12868 | |
| 12869 /* These lengths are all public so we can test them in non-constant | |
| 12870 * time. */ | |
| 12871 if (overhead > plaintext->len) { | |
| 12872 return SECFailure; | |
| 12873 } | |
| 12874 | |
| 12875 paddingLength = plaintext->buf[plaintext->len - 1]; | |
| 12876 t = plaintext->len; | |
| 12877 t -= paddingLength + overhead; | |
| 12878 /* If len >= paddingLength+overhead then the MSB of t is zero. */ | |
| 12879 good = DUPLICATE_MSB_TO_ALL(~t); | |
| 12880 | |
| 12881 /* The padding consists of a length byte at the end of the record and then | |
| 12882 * that many bytes of padding, all with the same value as the length byte. | |
| 12883 * Thus, with the length byte included, there are paddingLength+1 bytes of | |
| 12884 * padding. | |
| 12885 * | |
| 12886 * We can't check just |paddingLength+1| bytes because that leaks | |
| 12887 * decrypted information. Therefore we always have to check the maximum | |
| 12888 * amount of padding possible. (Again, the length of the record is | |
| 12889 * public information so we can use it.) */ | |
| 12890 toCheck = 255; /* maximum amount of padding. */ | |
| 12891 if (toCheck > plaintext->len - 1) { | |
| 12892 toCheck = plaintext->len - 1; | |
| 12893 } | |
| 12894 | |
| 12895 for (i = 0; i < toCheck; i++) { | |
| 12896 unsigned int t = paddingLength - i; | |
| 12897 /* If i <= paddingLength then the MSB of t is zero and mask is | |
| 12898 * 0xff. Otherwise, mask is 0. */ | |
| 12899 unsigned char mask = DUPLICATE_MSB_TO_ALL(~t); | |
| 12900 unsigned char b = plaintext->buf[plaintext->len - 1 - i]; | |
| 12901 /* The final |paddingLength+1| bytes should all have the value | |
| 12902 * |paddingLength|. Therefore the XOR should be zero. */ | |
| 12903 good &= ~(mask & (paddingLength ^ b)); | |
| 12904 } | |
| 12905 | |
| 12906 /* If any of the final |paddingLength+1| bytes had the wrong value, | |
| 12907 * one or more of the lower eight bits of |good| will be cleared. We | |
| 12908 * AND the bottom 8 bits together and duplicate the result to all the | |
| 12909 * bits. */ | |
| 12910 good &= good >> 4; | |
| 12911 good &= good >> 2; | |
| 12912 good &= good >> 1; | |
| 12913 good <<= sizeof(good) * 8 - 1; | |
| 12914 good = DUPLICATE_MSB_TO_ALL(good); | |
| 12915 | |
| 12916 plaintext->len -= good & (paddingLength + 1); | |
| 12917 return (good & SECSuccess) | (~good & SECFailure); | |
| 12918 } | |
| 12919 | |
| 12920 /* On entry: | |
| 12921 * originalLength >= macSize | |
| 12922 * macSize <= MAX_MAC_LENGTH | |
| 12923 * plaintext->len >= macSize | |
| 12924 */ | |
| 12925 static void | |
| 12926 ssl_CBCExtractMAC(sslBuffer *plaintext, | |
| 12927 unsigned int originalLength, | |
| 12928 SSL3Opaque *out, | |
| 12929 unsigned int macSize) | |
| 12930 { | |
| 12931 unsigned char rotatedMac[MAX_MAC_LENGTH]; | |
| 12932 /* macEnd is the index of |plaintext->buf| just after the end of the | |
| 12933 * MAC. */ | |
| 12934 unsigned macEnd = plaintext->len; | |
| 12935 unsigned macStart = macEnd - macSize; | |
| 12936 /* scanStart contains the number of bytes that we can ignore because | |
| 12937 * the MAC's position can only vary by 255 bytes. */ | |
| 12938 unsigned scanStart = 0; | |
| 12939 unsigned i, j, divSpoiler; | |
| 12940 unsigned char rotateOffset; | |
| 12941 | |
| 12942 if (originalLength > macSize + 255 + 1) | |
| 12943 scanStart = originalLength - (macSize + 255 + 1); | |
| 12944 | |
| 12945 /* divSpoiler contains a multiple of macSize that is used to cause the | |
| 12946 * modulo operation to be constant time. Without this, the time varies | |
| 12947 * based on the amount of padding when running on Intel chips at least. | |
| 12948 * | |
| 12949 * The aim of right-shifting macSize is so that the compiler doesn't | |
| 12950 * figure out that it can remove divSpoiler as that would require it | |
| 12951 * to prove that macSize is always even, which I hope is beyond it. */ | |
| 12952 divSpoiler = macSize >> 1; | |
| 12953 divSpoiler <<= (sizeof(divSpoiler) - 1) * 8; | |
| 12954 rotateOffset = (divSpoiler + macStart - scanStart) % macSize; | |
| 12955 | |
| 12956 memset(rotatedMac, 0, macSize); | |
| 12957 for (i = scanStart; i < originalLength;) { | |
| 12958 for (j = 0; j < macSize && i < originalLength; i++, j++) { | |
| 12959 unsigned char macStarted = ssl_ConstantTimeGE(i, macStart); | |
| 12960 unsigned char macEnded = ssl_ConstantTimeGE(i, macEnd); | |
| 12961 unsigned char b = 0; | |
| 12962 b = plaintext->buf[i]; | |
| 12963 rotatedMac[j] |= b & macStarted & ~macEnded; | |
| 12964 } | |
| 12965 } | |
| 12966 | |
| 12967 /* Now rotate the MAC. If we knew that the MAC fit into a CPU cache line | |
| 12968 * we could line-align |rotatedMac| and rotate in place. */ | |
| 12969 memset(out, 0, macSize); | |
| 12970 for (i = 0; i < macSize; i++) { | |
| 12971 unsigned char offset = | |
| 12972 (divSpoiler + macSize - rotateOffset + i) % macSize; | |
| 12973 for (j = 0; j < macSize; j++) { | |
| 12974 out[j] |= rotatedMac[i] & ssl_ConstantTimeEQ8(j, offset); | |
| 12975 } | |
| 12976 } | |
| 12977 } | |
| 12978 | |
| 12979 /* Unprotect an SSL3 record and leave the result in plaintext. | |
| 12980 * | |
| 12981 * If SECFailure is returned, we: | |
| 12982 * 1. Set |*alert| to the alert to be sent. | |
| 12983 * 2. Call PORT_SetError() with an appropriate code. | |
| 12984 * | |
| 12985 * Called by ssl3_HandleRecord. Caller must hold the spec read lock. | |
| 12986 * Therefore, we MUST not call SSL3_SendAlert(). | |
| 12987 * | |
| 12988 */ | |
| 12989 static SECStatus | |
| 12990 ssl3_UnprotectRecord(sslSocket *ss, SSL3Ciphertext *cText, sslBuffer *plaintext, | |
| 12991 SSL3AlertDescription *alert) | |
| 12992 { | |
| 12993 ssl3CipherSpec *crSpec = ss->ssl3.crSpec; | |
| 12994 const ssl3BulkCipherDef *cipher_def = crSpec->cipher_def; | |
| 12995 PRBool isTLS; | |
| 12996 unsigned int good; | |
| 12997 unsigned int ivLen = 0; | |
| 12998 SSL3ContentType rType; | |
| 12999 unsigned int minLength; | |
| 13000 unsigned int originalLen = 0; | |
| 13001 unsigned char header[13]; | |
| 13002 unsigned int headerLen; | |
| 13003 SSL3Opaque hash[MAX_MAC_LENGTH]; | |
| 13004 SSL3Opaque givenHashBuf[MAX_MAC_LENGTH]; | |
| 13005 SSL3Opaque *givenHash; | |
| 13006 unsigned int hashBytes = MAX_MAC_LENGTH + 1; | |
| 13007 SECStatus rv; | |
| 13008 | |
| 13009 good = ~0U; | |
| 13010 minLength = crSpec->mac_size; | |
| 13011 if (cipher_def->type == type_block) { | |
| 13012 /* CBC records have a padding length byte at the end. */ | |
| 13013 minLength++; | |
| 13014 if (crSpec->version >= SSL_LIBRARY_VERSION_TLS_1_1) { | |
| 13015 /* With >= TLS 1.1, CBC records have an explicit IV. */ | |
| 13016 minLength += cipher_def->iv_size; | |
| 13017 } | |
| 13018 } else if (cipher_def->type == type_aead) { | |
| 13019 minLength = cipher_def->explicit_nonce_size + cipher_def->tag_size; | |
| 13020 } | |
| 13021 | |
| 13022 /* We can perform this test in variable time because the record's total | |
| 13023 * length and the ciphersuite are both public knowledge. */ | |
| 13024 if (cText->buf->len < minLength) { | |
| 13025 goto decrypt_loser; | |
| 13026 } | |
| 13027 | |
| 13028 if (cipher_def->type == type_block && | |
| 13029 crSpec->version >= SSL_LIBRARY_VERSION_TLS_1_1) { | |
| 13030 /* Consume the per-record explicit IV. RFC 4346 Section 6.2.3.2 states | |
| 13031 * "The receiver decrypts the entire GenericBlockCipher structure and | |
| 13032 * then discards the first cipher block corresponding to the IV | |
| 13033 * component." Instead, we decrypt the first cipher block and then | |
| 13034 * discard it before decrypting the rest. | |
| 13035 */ | |
| 13036 SSL3Opaque iv[MAX_IV_LENGTH]; | |
| 13037 int decoded; | |
| 13038 | |
| 13039 ivLen = cipher_def->iv_size; | |
| 13040 if (ivLen < 8 || ivLen > sizeof(iv)) { | |
| 13041 *alert = internal_error; | |
| 13042 PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); | |
| 13043 return SECFailure; | |
| 13044 } | |
| 13045 | |
| 13046 PRINT_BUF(80, (ss, "IV (ciphertext):", cText->buf->buf, ivLen)); | |
| 13047 | |
| 13048 /* The decryption result is garbage, but since we just throw away | |
| 13049 * the block it doesn't matter. The decryption of the next block | |
| 13050 * depends only on the ciphertext of the IV block. | |
| 13051 */ | |
| 13052 rv = crSpec->decode(crSpec->decodeContext, iv, &decoded, | |
| 13053 sizeof(iv), cText->buf->buf, ivLen); | |
| 13054 | |
| 13055 good &= SECStatusToMask(rv); | |
| 13056 } | |
| 13057 | |
| 13058 PRINT_BUF(80, (ss, "ciphertext:", cText->buf->buf + ivLen, | |
| 13059 cText->buf->len - ivLen)); | |
| 13060 | |
| 13061 isTLS = (PRBool)(crSpec->version > SSL_LIBRARY_VERSION_3_0); | |
| 13062 | |
| 13063 if (isTLS && cText->buf->len - ivLen > (MAX_FRAGMENT_LENGTH + 2048)) { | |
| 13064 *alert = record_overflow; | |
| 13065 PORT_SetError(SSL_ERROR_RX_RECORD_TOO_LONG); | |
| 13066 return SECFailure; | |
| 13067 } | |
| 13068 | |
| 13069 rType = cText->type; | |
| 13070 if (cipher_def->type == type_aead) { | |
| 13071 /* XXX For many AEAD ciphers, the plaintext is shorter than the | |
| 13072 * ciphertext by a fixed byte count, but it is not true in general. | |
| 13073 * Each AEAD cipher should provide a function that returns the | |
| 13074 * plaintext length for a given ciphertext. */ | |
| 13075 unsigned int decryptedLen = | |
| 13076 cText->buf->len - cipher_def->explicit_nonce_size - | |
| 13077 cipher_def->tag_size; | |
| 13078 headerLen = ssl3_BuildRecordPseudoHeader( | |
| 13079 header, IS_DTLS(ss) ? cText->seq_num : crSpec->read_seq_num, | |
| 13080 rType, isTLS, cText->version, IS_DTLS(ss), decryptedLen); | |
| 13081 PORT_Assert(headerLen <= sizeof(header)); | |
| 13082 rv = crSpec->aead( | |
| 13083 ss->sec.isServer ? &crSpec->client : &crSpec->server, | |
| 13084 PR_TRUE, /* do decrypt */ | |
| 13085 plaintext->buf, /* out */ | |
| 13086 (int *)&plaintext->len, /* outlen */ | |
| 13087 plaintext->space, /* maxout */ | |
| 13088 cText->buf->buf, /* in */ | |
| 13089 cText->buf->len, /* inlen */ | |
| 13090 header, headerLen); | |
| 13091 if (rv != SECSuccess) { | |
| 13092 good = 0; | |
| 13093 } | |
| 13094 } else { | |
| 13095 if (cipher_def->type == type_block && | |
| 13096 ((cText->buf->len - ivLen) % cipher_def->block_size) != 0) { | |
| 13097 goto decrypt_loser; | |
| 13098 } | |
| 13099 | |
| 13100 /* decrypt from cText buf to plaintext. */ | |
| 13101 rv = crSpec->decode( | |
| 13102 crSpec->decodeContext, plaintext->buf, (int *)&plaintext->len, | |
| 13103 plaintext->space, cText->buf->buf + ivLen, cText->buf->len - ivLen); | |
| 13104 if (rv != SECSuccess) { | |
| 13105 goto decrypt_loser; | |
| 13106 } | |
| 13107 | |
| 13108 PRINT_BUF(80, (ss, "cleartext:", plaintext->buf, plaintext->len)); | |
| 13109 | |
| 13110 originalLen = plaintext->len; | |
| 13111 | |
| 13112 /* If it's a block cipher, check and strip the padding. */ | |
| 13113 if (cipher_def->type == type_block) { | |
| 13114 const unsigned int blockSize = cipher_def->block_size; | |
| 13115 const unsigned int macSize = crSpec->mac_size; | |
| 13116 | |
| 13117 if (!isTLS) { | |
| 13118 good &= SECStatusToMask(ssl_RemoveSSLv3CBCPadding( | |
| 13119 plaintext, blockSize, macSize)); | |
| 13120 } else { | |
| 13121 good &= SECStatusToMask(ssl_RemoveTLSCBCPadding( | |
| 13122 plaintext, macSize)); | |
| 13123 } | |
| 13124 } | |
| 13125 | |
| 13126 /* compute the MAC */ | |
| 13127 headerLen = ssl3_BuildRecordPseudoHeader( | |
| 13128 header, IS_DTLS(ss) ? cText->seq_num : crSpec->read_seq_num, | |
| 13129 rType, isTLS, cText->version, IS_DTLS(ss), | |
| 13130 plaintext->len - crSpec->mac_size); | |
| 13131 PORT_Assert(headerLen <= sizeof(header)); | |
| 13132 if (cipher_def->type == type_block) { | |
| 13133 rv = ssl3_ComputeRecordMACConstantTime( | |
| 13134 crSpec, (PRBool)(!ss->sec.isServer), header, headerLen, | |
| 13135 plaintext->buf, plaintext->len, originalLen, | |
| 13136 hash, &hashBytes); | |
| 13137 | |
| 13138 ssl_CBCExtractMAC(plaintext, originalLen, givenHashBuf, | |
| 13139 crSpec->mac_size); | |
| 13140 givenHash = givenHashBuf; | |
| 13141 | |
| 13142 /* plaintext->len will always have enough space to remove the MAC | |
| 13143 * because in ssl_Remove{SSLv3|TLS}CBCPadding we only adjust | |
| 13144 * plaintext->len if the result has enough space for the MAC and we | |
| 13145 * tested the unadjusted size against minLength, above. */ | |
| 13146 plaintext->len -= crSpec->mac_size; | |
| 13147 } else { | |
| 13148 /* This is safe because we checked the minLength above. */ | |
| 13149 plaintext->len -= crSpec->mac_size; | |
| 13150 | |
| 13151 rv = ssl3_ComputeRecordMAC( | |
| 13152 crSpec, (PRBool)(!ss->sec.isServer), header, headerLen, | |
| 13153 plaintext->buf, plaintext->len, hash, &hashBytes); | |
| 13154 | |
| 13155 /* We can read the MAC directly from the record because its location | |
| 13156 * is public when a stream cipher is used. */ | |
| 13157 givenHash = plaintext->buf + plaintext->len; | |
| 13158 } | |
| 13159 | |
| 13160 good &= SECStatusToMask(rv); | |
| 13161 | |
| 13162 if (hashBytes != (unsigned)crSpec->mac_size || | |
| 13163 NSS_SecureMemcmp(givenHash, hash, crSpec->mac_size) != 0) { | |
| 13164 /* We're allowed to leak whether or not the MAC check was correct */ | |
| 13165 good = 0; | |
| 13166 } | |
| 13167 } | |
| 13168 | |
| 13169 if (good == 0) { | |
| 13170 decrypt_loser: | |
| 13171 /* always log mac error, in case attacker can read server logs. */ | |
| 13172 PORT_SetError(SSL_ERROR_BAD_MAC_READ); | |
| 13173 *alert = bad_record_mac; | |
| 13174 return SECFailure; | |
| 13175 } | |
| 13176 return SECSuccess; | |
| 13177 } | |
| 13178 | |
| 13179 /* if cText is non-null, then decipher, check MAC, and decompress the | |
| 13180 * SSL record from cText->buf (typically gs->inbuf) | |
| 13181 * into databuf (typically gs->buf), and any previous contents of databuf | |
| 13182 * is lost. Then handle databuf according to its SSL record type, | |
| 13183 * unless it's an application record. | |
| 13184 * | |
| 13185 * If cText is NULL, then the ciphertext has previously been deciphered and | |
| 13186 * checked, and is already sitting in databuf. It is processed as an SSL | |
| 13187 * Handshake message. | |
| 13188 * | |
| 13189 * DOES NOT process the decrypted/decompressed application data. | |
| 13190 * On return, databuf contains the decrypted/decompressed record. | |
| 13191 * | |
| 13192 * Called from ssl3_GatherCompleteHandshake | |
| 13193 * ssl3_RestartHandshakeAfterCertReq | |
| 13194 * | |
| 13195 * Caller must hold the RecvBufLock. | |
| 13196 * | |
| 13197 * This function aquires and releases the SSL3Handshake Lock, holding the | |
| 13198 * lock around any calls to functions that handle records other than | |
| 13199 * Application Data records. | |
| 13200 */ | |
| 13201 SECStatus | |
| 13202 ssl3_HandleRecord(sslSocket *ss, SSL3Ciphertext *cText, sslBuffer *databuf) | |
| 13203 { | |
| 13204 SECStatus rv; | |
| 13205 PRBool isTLS; | |
| 13206 PRUint64 dtls_seq_num = 0; | |
| 13207 ssl3CipherSpec *crSpec; | |
| 13208 SSL3ContentType rType; | |
| 13209 sslBuffer *plaintext; | |
| 13210 sslBuffer temp_buf; | |
| 13211 SSL3AlertDescription alert; | |
| 13212 PORT_Assert(ss->opt.noLocks || ssl_HaveRecvBufLock(ss)); | |
| 13213 | |
| 13214 if (!ss->ssl3.initialized) { | |
| 13215 ssl_GetSSL3HandshakeLock(ss); | |
| 13216 rv = ssl3_InitState(ss); | |
| 13217 ssl_ReleaseSSL3HandshakeLock(ss); | |
| 13218 if (rv != SECSuccess) { | |
| 13219 return rv; /* ssl3_InitState has set the error code. */ | |
| 13220 } | |
| 13221 } | |
| 13222 | |
| 13223 /* check for Token Presence */ | |
| 13224 if (!ssl3_ClientAuthTokenPresent(ss->sec.ci.sid)) { | |
| 13225 PORT_SetError(SSL_ERROR_TOKEN_INSERTION_REMOVAL); | |
| 13226 return SECFailure; | |
| 13227 } | |
| 13228 | |
| 13229 /* cText is NULL when we're called from ssl3_RestartHandshakeAfterXXX(). | |
| 13230 * This implies that databuf holds a previously deciphered SSL Handshake | |
| 13231 * message. | |
| 13232 */ | |
| 13233 if (cText == NULL) { | |
| 13234 SSL_DBG(("%d: SSL3[%d]: HandleRecord, resuming handshake", | |
| 13235 SSL_GETPID(), ss->fd)); | |
| 13236 rType = content_handshake; | |
| 13237 goto process_it; | |
| 13238 } | |
| 13239 | |
| 13240 ssl_GetSpecReadLock(ss); /******************************************/ | |
| 13241 crSpec = ss->ssl3.crSpec; | |
| 13242 isTLS = (PRBool)(crSpec->version > SSL_LIBRARY_VERSION_3_0); | |
| 13243 | |
| 13244 if (IS_DTLS(ss)) { | |
| 13245 if (!dtls_IsRelevant(ss, crSpec, cText, &dtls_seq_num)) { | |
| 13246 ssl_ReleaseSpecReadLock(ss); | |
| 13247 /* Silently drop the packet */ | |
| 13248 databuf->len = 0; /* Needed to ensure data not left around */ | |
| 13249 return SECSuccess; | |
| 13250 } | |
| 13251 } | |
| 13252 | |
| 13253 /* If we will be decompressing the buffer we need to decrypt somewhere | |
| 13254 * other than into databuf */ | |
| 13255 if (crSpec->decompressor) { | |
| 13256 temp_buf.buf = NULL; | |
| 13257 temp_buf.space = 0; | |
| 13258 plaintext = &temp_buf; | |
| 13259 } else { | |
| 13260 plaintext = databuf; | |
| 13261 } | |
| 13262 | |
| 13263 plaintext->len = 0; /* filled in by Unprotect call below. */ | |
| 13264 if (plaintext->space < MAX_FRAGMENT_LENGTH) { | |
| 13265 rv = sslBuffer_Grow(plaintext, MAX_FRAGMENT_LENGTH + 2048); | |
| 13266 if (rv != SECSuccess) { | |
| 13267 ssl_ReleaseSpecReadLock(ss); | |
| 13268 SSL_DBG(("%d: SSL3[%d]: HandleRecord, tried to get %d bytes", | |
| 13269 SSL_GETPID(), ss->fd, MAX_FRAGMENT_LENGTH + 2048)); | |
| 13270 /* sslBuffer_Grow has set a memory error code. */ | |
| 13271 /* Perhaps we should send an alert. (but we have no memory!) */ | |
| 13272 return SECFailure; | |
| 13273 } | |
| 13274 } | |
| 13275 | |
| 13276 /* IMPORTANT: Unprotect functions MUST NOT send alerts | |
| 13277 * because we still hold the spec read lock. Instead, if they | |
| 13278 * return SECFailure, they set *alert to the alert to be sent. */ | |
| 13279 if (crSpec->version < SSL_LIBRARY_VERSION_TLS_1_3 || | |
| 13280 crSpec->cipher_def->calg == ssl_calg_null) { | |
| 13281 /* Unencrypted TLS 1.3 records use the pre-TLS 1.3 format. */ | |
| 13282 rv = ssl3_UnprotectRecord(ss, cText, plaintext, &alert); | |
| 13283 } else { | |
| 13284 rv = tls13_UnprotectRecord(ss, cText, plaintext, &alert); | |
| 13285 } | |
| 13286 | |
| 13287 if (rv != SECSuccess) { | |
| 13288 ssl_ReleaseSpecReadLock(ss); | |
| 13289 | |
| 13290 SSL_DBG(("%d: SSL3[%d]: decryption failed", SSL_GETPID(), ss->fd)); | |
| 13291 | |
| 13292 if (!IS_DTLS(ss)) { | |
| 13293 int errCode = PORT_GetError(); | |
| 13294 SSL3_SendAlert(ss, alert_fatal, alert); | |
| 13295 /* Reset the error code in case SSL3_SendAlert called | |
| 13296 * PORT_SetError(). */ | |
| 13297 PORT_SetError(errCode); | |
| 13298 return SECFailure; | |
| 13299 } else { | |
| 13300 /* Silently drop the packet */ | |
| 13301 databuf->len = 0; /* Needed to ensure data not left around */ | |
| 13302 return SECSuccess; | |
| 13303 } | |
| 13304 } | |
| 13305 | |
| 13306 /* SECSuccess */ | |
| 13307 if (!IS_DTLS(ss)) { | |
| 13308 ssl3_BumpSequenceNumber(&crSpec->read_seq_num); | |
| 13309 } else { | |
| 13310 dtls_RecordSetRecvd(&crSpec->recvdRecords, dtls_seq_num); | |
| 13311 } | |
| 13312 | |
| 13313 ssl_ReleaseSpecReadLock(ss); /*****************************************/ | |
| 13314 | |
| 13315 /* | |
| 13316 * The decrypted data is now in plaintext. | |
| 13317 */ | |
| 13318 rType = cText->type; /* This must go after decryption because TLS 1.3 | |
| 13319 * has encrypted content types. */ | |
| 13320 | |
| 13321 /* possibly decompress the record. If we aren't using compression then | |
| 13322 * plaintext == databuf and so the uncompressed data is already in | |
| 13323 * databuf. */ | |
| 13324 if (crSpec->decompressor) { | |
| 13325 if (databuf->space < plaintext->len + SSL3_COMPRESSION_MAX_EXPANSION) { | |
| 13326 rv = sslBuffer_Grow( | |
| 13327 databuf, plaintext->len + SSL3_COMPRESSION_MAX_EXPANSION); | |
| 13328 if (rv != SECSuccess) { | |
| 13329 SSL_DBG(("%d: SSL3[%d]: HandleRecord, tried to get %d bytes", | |
| 13330 SSL_GETPID(), ss->fd, | |
| 13331 plaintext->len + | |
| 13332 SSL3_COMPRESSION_MAX_EXPANSION)); | |
| 13333 /* sslBuffer_Grow has set a memory error code. */ | |
| 13334 /* Perhaps we should send an alert. (but we have no memory!) */ | |
| 13335 PORT_Free(plaintext->buf); | |
| 13336 return SECFailure; | |
| 13337 } | |
| 13338 } | |
| 13339 | |
| 13340 rv = crSpec->decompressor(crSpec->decompressContext, | |
| 13341 databuf->buf, | |
| 13342 (int *)&databuf->len, | |
| 13343 databuf->space, | |
| 13344 plaintext->buf, | |
| 13345 plaintext->len); | |
| 13346 | |
| 13347 if (rv != SECSuccess) { | |
| 13348 int err = ssl_MapLowLevelError(SSL_ERROR_DECOMPRESSION_FAILURE); | |
| 13349 SSL3_SendAlert(ss, alert_fatal, | |
| 13350 isTLS ? decompression_failure | |
| 13351 : bad_record_mac); | |
| 13352 | |
| 13353 /* There appears to be a bug with (at least) Apache + OpenSSL where | |
| 13354 * resumed SSLv3 connections don't actually use compression. See | |
| 13355 * comments 93-95 of | |
| 13356 * https://bugzilla.mozilla.org/show_bug.cgi?id=275744 | |
| 13357 * | |
| 13358 * So, if we get a decompression error, and the record appears to | |
| 13359 * be already uncompressed, then we return a more specific error | |
| 13360 * code to hopefully save somebody some debugging time in the | |
| 13361 * future. | |
| 13362 */ | |
| 13363 if (plaintext->len >= 4) { | |
| 13364 unsigned int len = ((unsigned int)plaintext->buf[1] << 16) | | |
| 13365 ((unsigned int)plaintext->buf[2] << 8) | | |
| 13366 (unsigned int)plaintext->buf[3]; | |
| 13367 if (len == plaintext->len - 4) { | |
| 13368 /* This appears to be uncompressed already */ | |
| 13369 err = SSL_ERROR_RX_UNEXPECTED_UNCOMPRESSED_RECORD; | |
| 13370 } | |
| 13371 } | |
| 13372 | |
| 13373 PORT_Free(plaintext->buf); | |
| 13374 PORT_SetError(err); | |
| 13375 return SECFailure; | |
| 13376 } | |
| 13377 | |
| 13378 PORT_Free(plaintext->buf); | |
| 13379 } | |
| 13380 | |
| 13381 /* | |
| 13382 ** Having completed the decompression, check the length again. | |
| 13383 */ | |
| 13384 if (isTLS && databuf->len > (MAX_FRAGMENT_LENGTH + 1024)) { | |
| 13385 SSL3_SendAlert(ss, alert_fatal, record_overflow); | |
| 13386 PORT_SetError(SSL_ERROR_RX_RECORD_TOO_LONG); | |
| 13387 return SECFailure; | |
| 13388 } | |
| 13389 | |
| 13390 /* Application data records are processed by the caller of this | |
| 13391 ** function, not by this function. | |
| 13392 */ | |
| 13393 if (rType == content_application_data) { | |
| 13394 if (ss->firstHsDone) | |
| 13395 return SECSuccess; | |
| 13396 (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message); | |
| 13397 PORT_SetError(SSL_ERROR_RX_UNEXPECTED_APPLICATION_DATA); | |
| 13398 return SECFailure; | |
| 13399 } | |
| 13400 | |
| 13401 /* It's a record that must be handled by ssl itself, not the application. | |
| 13402 */ | |
| 13403 process_it: | |
| 13404 /* XXX Get the xmit lock here. Odds are very high that we'll be xmiting | |
| 13405 * data ang getting the xmit lock here prevents deadlocks. | |
| 13406 */ | |
| 13407 ssl_GetSSL3HandshakeLock(ss); | |
| 13408 | |
| 13409 /* All the functions called in this switch MUST set error code if | |
| 13410 ** they return SECFailure or SECWouldBlock. | |
| 13411 */ | |
| 13412 switch (rType) { | |
| 13413 case content_change_cipher_spec: | |
| 13414 rv = ssl3_HandleChangeCipherSpecs(ss, databuf); | |
| 13415 break; | |
| 13416 case content_alert: | |
| 13417 rv = ssl3_HandleAlert(ss, databuf); | |
| 13418 break; | |
| 13419 case content_handshake: | |
| 13420 if (!IS_DTLS(ss)) { | |
| 13421 rv = ssl3_HandleHandshake(ss, databuf); | |
| 13422 } else { | |
| 13423 rv = dtls_HandleHandshake(ss, databuf); | |
| 13424 } | |
| 13425 break; | |
| 13426 /* | |
| 13427 case content_application_data is handled before this switch | |
| 13428 */ | |
| 13429 default: | |
| 13430 SSL_DBG(("%d: SSL3[%d]: bogus content type=%d", | |
| 13431 SSL_GETPID(), ss->fd, cText->type)); | |
| 13432 /* XXX Send an alert ??? */ | |
| 13433 PORT_SetError(SSL_ERROR_RX_UNKNOWN_RECORD_TYPE); | |
| 13434 rv = SECFailure; | |
| 13435 break; | |
| 13436 } | |
| 13437 | |
| 13438 ssl_ReleaseSSL3HandshakeLock(ss); | |
| 13439 return rv; | |
| 13440 } | |
| 13441 | |
| 13442 /* | |
| 13443 * Initialization functions | |
| 13444 */ | |
| 13445 | |
| 13446 /* Called from ssl3_InitState, immediately below. */ | |
| 13447 /* Caller must hold the SpecWriteLock. */ | |
| 13448 static void | |
| 13449 ssl3_InitCipherSpec(sslSocket *ss, ssl3CipherSpec *spec) | |
| 13450 { | |
| 13451 spec->cipher_def = &bulk_cipher_defs[cipher_null]; | |
| 13452 PORT_Assert(spec->cipher_def->cipher == cipher_null); | |
| 13453 spec->mac_def = &mac_defs[mac_null]; | |
| 13454 PORT_Assert(spec->mac_def->mac == mac_null); | |
| 13455 spec->encode = Null_Cipher; | |
| 13456 spec->decode = Null_Cipher; | |
| 13457 spec->destroy = NULL; | |
| 13458 spec->compressor = NULL; | |
| 13459 spec->decompressor = NULL; | |
| 13460 spec->destroyCompressContext = NULL; | |
| 13461 spec->destroyDecompressContext = NULL; | |
| 13462 spec->mac_size = 0; | |
| 13463 spec->master_secret = NULL; | |
| 13464 spec->bypassCiphers = PR_FALSE; | |
| 13465 | |
| 13466 spec->msItem.data = NULL; | |
| 13467 spec->msItem.len = 0; | |
| 13468 | |
| 13469 spec->client.write_key = NULL; | |
| 13470 spec->client.write_mac_key = NULL; | |
| 13471 spec->client.write_mac_context = NULL; | |
| 13472 | |
| 13473 spec->server.write_key = NULL; | |
| 13474 spec->server.write_mac_key = NULL; | |
| 13475 spec->server.write_mac_context = NULL; | |
| 13476 | |
| 13477 spec->write_seq_num.high = 0; | |
| 13478 spec->write_seq_num.low = 0; | |
| 13479 | |
| 13480 spec->read_seq_num.high = 0; | |
| 13481 spec->read_seq_num.low = 0; | |
| 13482 | |
| 13483 spec->epoch = 0; | |
| 13484 dtls_InitRecvdRecords(&spec->recvdRecords); | |
| 13485 | |
| 13486 spec->version = ss->vrange.max; | |
| 13487 } | |
| 13488 | |
| 13489 /* Called from: ssl3_SendRecord | |
| 13490 ** ssl3_StartHandshakeHash() <- ssl2_BeginClientHandshake() | |
| 13491 ** ssl3_SendClientHello() | |
| 13492 ** ssl3_HandleV2ClientHello() | |
| 13493 ** ssl3_HandleRecord() | |
| 13494 ** | |
| 13495 ** This function should perhaps acquire and release the SpecWriteLock. | |
| 13496 ** | |
| 13497 ** | |
| 13498 */ | |
| 13499 static SECStatus | |
| 13500 ssl3_InitState(sslSocket *ss) | |
| 13501 { | |
| 13502 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 13503 | |
| 13504 if (ss->ssl3.initialized) | |
| 13505 return SECSuccess; /* Function should be idempotent */ | |
| 13506 | |
| 13507 ss->ssl3.policy = SSL_ALLOWED; | |
| 13508 | |
| 13509 ssl_GetSpecWriteLock(ss); | |
| 13510 ss->ssl3.crSpec = ss->ssl3.cwSpec = &ss->ssl3.specs[0]; | |
| 13511 ss->ssl3.prSpec = ss->ssl3.pwSpec = &ss->ssl3.specs[1]; | |
| 13512 ss->ssl3.hs.sendingSCSV = PR_FALSE; | |
| 13513 ssl3_InitCipherSpec(ss, ss->ssl3.crSpec); | |
| 13514 ssl3_InitCipherSpec(ss, ss->ssl3.prSpec); | |
| 13515 ss->ssl3.hs.preliminaryInfo = 0; | |
| 13516 | |
| 13517 ss->ssl3.hs.ws = (ss->sec.isServer) ? wait_client_hello : wait_server_hello; | |
| 13518 #ifndef NSS_DISABLE_ECC | |
| 13519 ss->ssl3.hs.negotiatedECCurves = ssl3_GetSupportedECCurveMask(ss); | |
| 13520 #endif | |
| 13521 ssl_ReleaseSpecWriteLock(ss); | |
| 13522 | |
| 13523 PORT_Memset(&ss->xtnData, 0, sizeof(TLSExtensionData)); | |
| 13524 | |
| 13525 if (IS_DTLS(ss)) { | |
| 13526 ss->ssl3.hs.sendMessageSeq = 0; | |
| 13527 ss->ssl3.hs.recvMessageSeq = 0; | |
| 13528 ss->ssl3.hs.rtTimeoutMs = INITIAL_DTLS_TIMEOUT_MS; | |
| 13529 ss->ssl3.hs.rtRetries = 0; | |
| 13530 ss->ssl3.hs.recvdHighWater = -1; | |
| 13531 PR_INIT_CLIST(&ss->ssl3.hs.lastMessageFlight); | |
| 13532 dtls_SetMTU(ss, 0); /* Set the MTU to the highest plateau */ | |
| 13533 } | |
| 13534 | |
| 13535 PR_INIT_CLIST(&ss->ssl3.hs.remoteKeyShares); | |
| 13536 ss->ssl3.hs.xSS = NULL; | |
| 13537 ss->ssl3.hs.xES = NULL; | |
| 13538 ss->ssl3.hs.trafficSecret = NULL; | |
| 13539 ss->ssl3.hs.clientFinishedSecret = NULL; | |
| 13540 ss->ssl3.hs.serverFinishedSecret = NULL; | |
| 13541 ss->ssl3.hs.certReqContextLen = 0; | |
| 13542 | |
| 13543 PORT_Assert(!ss->ssl3.hs.messages.buf && !ss->ssl3.hs.messages.space); | |
| 13544 ss->ssl3.hs.messages.buf = NULL; | |
| 13545 ss->ssl3.hs.messages.space = 0; | |
| 13546 | |
| 13547 ss->ssl3.hs.receivedNewSessionTicket = PR_FALSE; | |
| 13548 PORT_Memset(&ss->ssl3.hs.newSessionTicket, 0, | |
| 13549 sizeof(ss->ssl3.hs.newSessionTicket)); | |
| 13550 | |
| 13551 ss->ssl3.initialized = PR_TRUE; | |
| 13552 return SECSuccess; | |
| 13553 } | |
| 13554 | |
| 13555 /* Returns a reference counted object that contains a key pair. | |
| 13556 * Or NULL on failure. Initial ref count is 1. | |
| 13557 * Uses the keys in the pair as input. | |
| 13558 */ | |
| 13559 ssl3KeyPair * | |
| 13560 ssl3_NewKeyPair(SECKEYPrivateKey *privKey, SECKEYPublicKey *pubKey) | |
| 13561 { | |
| 13562 ssl3KeyPair *pair; | |
| 13563 | |
| 13564 if (!privKey || !pubKey) { | |
| 13565 PORT_SetError(PR_INVALID_ARGUMENT_ERROR); | |
| 13566 return NULL; | |
| 13567 } | |
| 13568 pair = PORT_ZNew(ssl3KeyPair); | |
| 13569 if (!pair) | |
| 13570 return NULL; /* error code is set. */ | |
| 13571 pair->refCount = 1; | |
| 13572 pair->privKey = privKey; | |
| 13573 pair->pubKey = pubKey; | |
| 13574 return pair; /* success */ | |
| 13575 } | |
| 13576 | |
| 13577 ssl3KeyPair * | |
| 13578 ssl3_GetKeyPairRef(ssl3KeyPair *keyPair) | |
| 13579 { | |
| 13580 PR_ATOMIC_INCREMENT(&keyPair->refCount); | |
| 13581 return keyPair; | |
| 13582 } | |
| 13583 | |
| 13584 void | |
| 13585 ssl3_FreeKeyPair(ssl3KeyPair *keyPair) | |
| 13586 { | |
| 13587 PRInt32 newCount = PR_ATOMIC_DECREMENT(&keyPair->refCount); | |
| 13588 if (!newCount) { | |
| 13589 if (keyPair->privKey) | |
| 13590 SECKEY_DestroyPrivateKey(keyPair->privKey); | |
| 13591 if (keyPair->pubKey) | |
| 13592 SECKEY_DestroyPublicKey(keyPair->pubKey); | |
| 13593 PORT_Free(keyPair); | |
| 13594 } | |
| 13595 } | |
| 13596 | |
| 13597 /* | |
| 13598 * Creates the public and private RSA keys for SSL Step down. | |
| 13599 * Called from SSL_ConfigSecureServer in sslsecur.c | |
| 13600 */ | |
| 13601 SECStatus | |
| 13602 ssl3_CreateRSAStepDownKeys(sslSocket *ss) | |
| 13603 { | |
| 13604 SECStatus rv = SECSuccess; | |
| 13605 SECKEYPrivateKey *privKey; /* RSA step down key */ | |
| 13606 SECKEYPublicKey *pubKey; /* RSA step down key */ | |
| 13607 | |
| 13608 if (ss->stepDownKeyPair) | |
| 13609 ssl3_FreeKeyPair(ss->stepDownKeyPair); | |
| 13610 ss->stepDownKeyPair = NULL; | |
| 13611 #ifndef HACKED_EXPORT_SERVER | |
| 13612 /* Sigh, should have a get key strength call for private keys */ | |
| 13613 if (PK11_GetPrivateModulusLen(ss->serverCerts[kt_rsa].SERVERKEY) > | |
| 13614 EXPORT_RSA_KEY_LENGTH) { | |
| 13615 /* need to ask for the key size in bits */ | |
| 13616 privKey = SECKEY_CreateRSAPrivateKey(EXPORT_RSA_KEY_LENGTH * BPB, | |
| 13617 &pubKey, NULL); | |
| 13618 if (!privKey || !pubKey || | |
| 13619 !(ss->stepDownKeyPair = ssl3_NewKeyPair(privKey, pubKey))) { | |
| 13620 ssl_MapLowLevelError(SEC_ERROR_KEYGEN_FAIL); | |
| 13621 rv = SECFailure; | |
| 13622 } | |
| 13623 } | |
| 13624 #endif | |
| 13625 return rv; | |
| 13626 } | |
| 13627 | |
| 13628 /* record the export policy for this cipher suite */ | |
| 13629 SECStatus | |
| 13630 ssl3_SetPolicy(ssl3CipherSuite which, int policy) | |
| 13631 { | |
| 13632 ssl3CipherSuiteCfg *suite; | |
| 13633 | |
| 13634 suite = ssl_LookupCipherSuiteCfg(which, cipherSuites); | |
| 13635 if (suite == NULL) { | |
| 13636 return SECFailure; /* err code was set by ssl_LookupCipherSuiteCfg */ | |
| 13637 } | |
| 13638 suite->policy = policy; | |
| 13639 | |
| 13640 return SECSuccess; | |
| 13641 } | |
| 13642 | |
| 13643 SECStatus | |
| 13644 ssl3_GetPolicy(ssl3CipherSuite which, PRInt32 *oPolicy) | |
| 13645 { | |
| 13646 ssl3CipherSuiteCfg *suite; | |
| 13647 PRInt32 policy; | |
| 13648 SECStatus rv; | |
| 13649 | |
| 13650 suite = ssl_LookupCipherSuiteCfg(which, cipherSuites); | |
| 13651 if (suite) { | |
| 13652 policy = suite->policy; | |
| 13653 rv = SECSuccess; | |
| 13654 } else { | |
| 13655 policy = SSL_NOT_ALLOWED; | |
| 13656 rv = SECFailure; /* err code was set by Lookup. */ | |
| 13657 } | |
| 13658 *oPolicy = policy; | |
| 13659 return rv; | |
| 13660 } | |
| 13661 | |
| 13662 /* record the user preference for this suite */ | |
| 13663 SECStatus | |
| 13664 ssl3_CipherPrefSetDefault(ssl3CipherSuite which, PRBool enabled) | |
| 13665 { | |
| 13666 ssl3CipherSuiteCfg *suite; | |
| 13667 | |
| 13668 suite = ssl_LookupCipherSuiteCfg(which, cipherSuites); | |
| 13669 if (suite == NULL) { | |
| 13670 return SECFailure; /* err code was set by ssl_LookupCipherSuiteCfg */ | |
| 13671 } | |
| 13672 suite->enabled = enabled; | |
| 13673 return SECSuccess; | |
| 13674 } | |
| 13675 | |
| 13676 /* return the user preference for this suite */ | |
| 13677 SECStatus | |
| 13678 ssl3_CipherPrefGetDefault(ssl3CipherSuite which, PRBool *enabled) | |
| 13679 { | |
| 13680 ssl3CipherSuiteCfg *suite; | |
| 13681 PRBool pref; | |
| 13682 SECStatus rv; | |
| 13683 | |
| 13684 suite = ssl_LookupCipherSuiteCfg(which, cipherSuites); | |
| 13685 if (suite) { | |
| 13686 pref = suite->enabled; | |
| 13687 rv = SECSuccess; | |
| 13688 } else { | |
| 13689 pref = SSL_NOT_ALLOWED; | |
| 13690 rv = SECFailure; /* err code was set by Lookup. */ | |
| 13691 } | |
| 13692 *enabled = pref; | |
| 13693 return rv; | |
| 13694 } | |
| 13695 | |
| 13696 SECStatus | |
| 13697 ssl3_CipherPrefSet(sslSocket *ss, ssl3CipherSuite which, PRBool enabled) | |
| 13698 { | |
| 13699 ssl3CipherSuiteCfg *suite; | |
| 13700 | |
| 13701 suite = ssl_LookupCipherSuiteCfg(which, ss->cipherSuites); | |
| 13702 if (suite == NULL) { | |
| 13703 return SECFailure; /* err code was set by ssl_LookupCipherSuiteCfg */ | |
| 13704 } | |
| 13705 suite->enabled = enabled; | |
| 13706 return SECSuccess; | |
| 13707 } | |
| 13708 | |
| 13709 SECStatus | |
| 13710 ssl3_CipherPrefGet(sslSocket *ss, ssl3CipherSuite which, PRBool *enabled) | |
| 13711 { | |
| 13712 ssl3CipherSuiteCfg *suite; | |
| 13713 PRBool pref; | |
| 13714 SECStatus rv; | |
| 13715 | |
| 13716 suite = ssl_LookupCipherSuiteCfg(which, ss->cipherSuites); | |
| 13717 if (suite) { | |
| 13718 pref = suite->enabled; | |
| 13719 rv = SECSuccess; | |
| 13720 } else { | |
| 13721 pref = SSL_NOT_ALLOWED; | |
| 13722 rv = SECFailure; /* err code was set by Lookup. */ | |
| 13723 } | |
| 13724 *enabled = pref; | |
| 13725 return rv; | |
| 13726 } | |
| 13727 | |
| 13728 SECStatus | |
| 13729 SSL_SignaturePrefSet(PRFileDesc *fd, const SSLSignatureAndHashAlg *algorithms, | |
| 13730 unsigned int count) | |
| 13731 { | |
| 13732 sslSocket *ss; | |
| 13733 unsigned int i; | |
| 13734 | |
| 13735 ss = ssl_FindSocket(fd); | |
| 13736 if (!ss) { | |
| 13737 SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SignaturePrefSet", | |
| 13738 SSL_GETPID(), fd)); | |
| 13739 PORT_SetError(SEC_ERROR_INVALID_ARGS); | |
| 13740 return SECFailure; | |
| 13741 } | |
| 13742 | |
| 13743 if (!count || count > MAX_SIGNATURE_ALGORITHMS) { | |
| 13744 PORT_SetError(SEC_ERROR_INVALID_ARGS); | |
| 13745 return SECFailure; | |
| 13746 } | |
| 13747 | |
| 13748 ss->ssl3.signatureAlgorithmCount = 0; | |
| 13749 for (i = 0; i < count; ++i) { | |
| 13750 if (!ssl3_IsSupportedSignatureAlgorithm(&algorithms[i])) { | |
| 13751 SSL_DBG(("%d: SSL[%d]: invalid signature algorithm set %d/%d", | |
| 13752 SSL_GETPID(), fd, algorithms[i].sigAlg, | |
| 13753 algorithms[i].hashAlg)); | |
| 13754 continue; | |
| 13755 } | |
| 13756 | |
| 13757 ss->ssl3.signatureAlgorithms[ss->ssl3.signatureAlgorithmCount++] = | |
| 13758 algorithms[i]; | |
| 13759 } | |
| 13760 | |
| 13761 if (ss->ssl3.signatureAlgorithmCount == 0) { | |
| 13762 PORT_SetError(SSL_ERROR_NO_SUPPORTED_SIGNATURE_ALGORITHM); | |
| 13763 return SECFailure; | |
| 13764 } | |
| 13765 return SECSuccess; | |
| 13766 } | |
| 13767 | |
| 13768 SECStatus | |
| 13769 SSL_SignaturePrefGet(PRFileDesc *fd, SSLSignatureAndHashAlg *algorithms, | |
| 13770 unsigned int *count, unsigned int maxCount) | |
| 13771 { | |
| 13772 sslSocket *ss; | |
| 13773 unsigned int requiredSpace; | |
| 13774 | |
| 13775 ss = ssl_FindSocket(fd); | |
| 13776 if (!ss) { | |
| 13777 SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SignaturePrefGet", | |
| 13778 SSL_GETPID(), fd)); | |
| 13779 PORT_SetError(SEC_ERROR_INVALID_ARGS); | |
| 13780 return SECFailure; | |
| 13781 } | |
| 13782 | |
| 13783 if (!algorithms || !count || | |
| 13784 maxCount < ss->ssl3.signatureAlgorithmCount) { | |
| 13785 PORT_SetError(SEC_ERROR_INVALID_ARGS); | |
| 13786 return SECFailure; | |
| 13787 } | |
| 13788 | |
| 13789 requiredSpace = | |
| 13790 ss->ssl3.signatureAlgorithmCount * sizeof(SSLSignatureAndHashAlg); | |
| 13791 PORT_Memcpy(algorithms, ss->ssl3.signatureAlgorithms, requiredSpace); | |
| 13792 *count = ss->ssl3.signatureAlgorithmCount; | |
| 13793 return SECSuccess; | |
| 13794 } | |
| 13795 | |
| 13796 unsigned int | |
| 13797 SSL_SignatureMaxCount() | |
| 13798 { | |
| 13799 return MAX_SIGNATURE_ALGORITHMS; | |
| 13800 } | |
| 13801 | |
| 13802 SECStatus | |
| 13803 ssl3_CipherOrderSet(sslSocket *ss, const ssl3CipherSuite *ciphers, unsigned int
len) | |
| 13804 { | |
| 13805 /* |i| iterates over |ciphers| while |done| and |j| iterate over | |
| 13806 * |ss->cipherSuites|. */ | |
| 13807 unsigned int i, done; | |
| 13808 | |
| 13809 for (i = done = 0; i < len; i++) { | |
| 13810 PRUint16 id = ciphers[i]; | |
| 13811 unsigned int existingIndex, j; | |
| 13812 PRBool found = PR_FALSE; | |
| 13813 | |
| 13814 for (j = done; j < ssl_V3_SUITES_IMPLEMENTED; j++) { | |
| 13815 if (ss->cipherSuites[j].cipher_suite == id) { | |
| 13816 existingIndex = j; | |
| 13817 found = PR_TRUE; | |
| 13818 break; | |
| 13819 } | |
| 13820 } | |
| 13821 | |
| 13822 if (!found) { | |
| 13823 continue; | |
| 13824 } | |
| 13825 | |
| 13826 if (existingIndex != done) { | |
| 13827 const ssl3CipherSuiteCfg temp = ss->cipherSuites[done]; | |
| 13828 ss->cipherSuites[done] = ss->cipherSuites[existingIndex]; | |
| 13829 ss->cipherSuites[existingIndex] = temp; | |
| 13830 } | |
| 13831 done++; | |
| 13832 } | |
| 13833 | |
| 13834 /* Disable all cipher suites that weren't included. */ | |
| 13835 for (; done < ssl_V3_SUITES_IMPLEMENTED; done++) { | |
| 13836 ss->cipherSuites[done].enabled = 0; | |
| 13837 } | |
| 13838 | |
| 13839 return SECSuccess; | |
| 13840 } | |
| 13841 | |
| 13842 /* copy global default policy into socket. */ | |
| 13843 void | |
| 13844 ssl3_InitSocketPolicy(sslSocket *ss) | |
| 13845 { | |
| 13846 PORT_Memcpy(ss->cipherSuites, cipherSuites, sizeof cipherSuites); | |
| 13847 PORT_Memcpy(ss->ssl3.signatureAlgorithms, defaultSignatureAlgorithms, | |
| 13848 sizeof(defaultSignatureAlgorithms)); | |
| 13849 ss->ssl3.signatureAlgorithmCount = PR_ARRAY_SIZE(defaultSignatureAlgorithms)
; | |
| 13850 } | |
| 13851 | |
| 13852 SECStatus | |
| 13853 ssl3_GetTLSUniqueChannelBinding(sslSocket *ss, | |
| 13854 unsigned char *out, | |
| 13855 unsigned int *outLen, | |
| 13856 unsigned int outLenMax) | |
| 13857 { | |
| 13858 PRBool isTLS; | |
| 13859 int index = 0; | |
| 13860 unsigned int len; | |
| 13861 SECStatus rv = SECFailure; | |
| 13862 | |
| 13863 *outLen = 0; | |
| 13864 | |
| 13865 ssl_GetSSL3HandshakeLock(ss); | |
| 13866 | |
| 13867 ssl_GetSpecReadLock(ss); | |
| 13868 isTLS = (PRBool)(ss->ssl3.cwSpec->version > SSL_LIBRARY_VERSION_3_0); | |
| 13869 ssl_ReleaseSpecReadLock(ss); | |
| 13870 | |
| 13871 /* The tls-unique channel binding is the first Finished structure in the | |
| 13872 * handshake. In the case of a resumption, that's the server's Finished. | |
| 13873 * Otherwise, it's the client's Finished. */ | |
| 13874 len = ss->ssl3.hs.finishedBytes; | |
| 13875 | |
| 13876 /* Sending or receiving a Finished message will set finishedBytes to a | |
| 13877 * non-zero value. */ | |
| 13878 if (len == 0) { | |
| 13879 PORT_SetError(SSL_ERROR_HANDSHAKE_NOT_COMPLETED); | |
| 13880 goto loser; | |
| 13881 } | |
| 13882 | |
| 13883 /* If we are in the middle of a renegotiation then the channel binding | |
| 13884 * value is poorly defined and depends on the direction that it will be | |
| 13885 * used on. Therefore we simply return an error in this case. */ | |
| 13886 if (ss->firstHsDone && ss->ssl3.hs.ws != idle_handshake) { | |
| 13887 PORT_SetError(SSL_ERROR_RENEGOTIATION_NOT_ALLOWED); | |
| 13888 goto loser; | |
| 13889 } | |
| 13890 | |
| 13891 /* If resuming, then we want the second Finished value in the array, which | |
| 13892 * is the server's */ | |
| 13893 if (ss->ssl3.hs.isResuming) | |
| 13894 index = 1; | |
| 13895 | |
| 13896 *outLen = len; | |
| 13897 if (outLenMax < len) { | |
| 13898 PORT_SetError(SEC_ERROR_OUTPUT_LEN); | |
| 13899 goto loser; | |
| 13900 } | |
| 13901 | |
| 13902 if (isTLS) { | |
| 13903 memcpy(out, &ss->ssl3.hs.finishedMsgs.tFinished[index], len); | |
| 13904 } else { | |
| 13905 memcpy(out, &ss->ssl3.hs.finishedMsgs.sFinished[index], len); | |
| 13906 } | |
| 13907 | |
| 13908 rv = SECSuccess; | |
| 13909 | |
| 13910 loser: | |
| 13911 ssl_ReleaseSSL3HandshakeLock(ss); | |
| 13912 return rv; | |
| 13913 } | |
| 13914 | |
| 13915 /* ssl3_config_match_init must have already been called by | |
| 13916 * the caller of this function. | |
| 13917 */ | |
| 13918 SECStatus | |
| 13919 ssl3_ConstructV2CipherSpecsHack(sslSocket *ss, unsigned char *cs, int *size) | |
| 13920 { | |
| 13921 int i, count = 0; | |
| 13922 | |
| 13923 PORT_Assert(ss != 0); | |
| 13924 if (!ss) { | |
| 13925 PORT_SetError(PR_INVALID_ARGUMENT_ERROR); | |
| 13926 return SECFailure; | |
| 13927 } | |
| 13928 if (SSL3_ALL_VERSIONS_DISABLED(&ss->vrange)) { | |
| 13929 *size = 0; | |
| 13930 return SECSuccess; | |
| 13931 } | |
| 13932 if (cs == NULL) { | |
| 13933 *size = count_cipher_suites(ss, SSL_ALLOWED, PR_TRUE); | |
| 13934 return SECSuccess; | |
| 13935 } | |
| 13936 | |
| 13937 /* ssl3_config_match_init was called by the caller of this function. */ | |
| 13938 for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) { | |
| 13939 ssl3CipherSuiteCfg *suite = &ss->cipherSuites[i]; | |
| 13940 if (config_match(suite, SSL_ALLOWED, PR_TRUE, &ss->vrange, ss)) { | |
| 13941 if (cs != NULL) { | |
| 13942 *cs++ = 0x00; | |
| 13943 *cs++ = (suite->cipher_suite >> 8) & 0xFF; | |
| 13944 *cs++ = suite->cipher_suite & 0xFF; | |
| 13945 } | |
| 13946 count++; | |
| 13947 } | |
| 13948 } | |
| 13949 *size = count; | |
| 13950 return SECSuccess; | |
| 13951 } | |
| 13952 | |
| 13953 /* | |
| 13954 ** If ssl3 socket has completed the first handshake, and is in idle state, | |
| 13955 ** then start a new handshake. | |
| 13956 ** If flushCache is true, the SID cache will be flushed first, forcing a | |
| 13957 ** "Full" handshake (not a session restart handshake), to be done. | |
| 13958 ** | |
| 13959 ** called from SSL_RedoHandshake(), which already holds the handshake locks. | |
| 13960 */ | |
| 13961 SECStatus | |
| 13962 ssl3_RedoHandshake(sslSocket *ss, PRBool flushCache) | |
| 13963 { | |
| 13964 sslSessionID *sid = ss->sec.ci.sid; | |
| 13965 SECStatus rv; | |
| 13966 | |
| 13967 PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss)); | |
| 13968 | |
| 13969 if (!ss->firstHsDone || | |
| 13970 ((ss->version >= SSL_LIBRARY_VERSION_3_0) && | |
| 13971 ss->ssl3.initialized && | |
| 13972 (ss->ssl3.hs.ws != idle_handshake))) { | |
| 13973 PORT_SetError(SSL_ERROR_HANDSHAKE_NOT_COMPLETED); | |
| 13974 return SECFailure; | |
| 13975 } | |
| 13976 | |
| 13977 if (IS_DTLS(ss)) { | |
| 13978 dtls_RehandshakeCleanup(ss); | |
| 13979 } | |
| 13980 | |
| 13981 if (ss->opt.enableRenegotiation == SSL_RENEGOTIATE_NEVER) { | |
| 13982 PORT_SetError(SSL_ERROR_RENEGOTIATION_NOT_ALLOWED); | |
| 13983 return SECFailure; | |
| 13984 } | |
| 13985 if (sid && flushCache) { | |
| 13986 if (ss->sec.uncache) | |
| 13987 ss->sec.uncache(sid); /* remove it from whichever cache it's in. */ | |
| 13988 ssl_FreeSID(sid); /* dec ref count and free if zero. */ | |
| 13989 ss->sec.ci.sid = NULL; | |
| 13990 } | |
| 13991 | |
| 13992 ssl_GetXmitBufLock(ss); /**************************************/ | |
| 13993 | |
| 13994 /* start off a new handshake. */ | |
| 13995 rv = (ss->sec.isServer) ? ssl3_SendHelloRequest(ss) | |
| 13996 : ssl3_SendClientHello(ss, PR_FALSE); | |
| 13997 | |
| 13998 ssl_ReleaseXmitBufLock(ss); /**************************************/ | |
| 13999 return rv; | |
| 14000 } | |
| 14001 | |
| 14002 /* Called from ssl_DestroySocketContents() in sslsock.c */ | |
| 14003 void | |
| 14004 ssl3_DestroySSL3Info(sslSocket *ss) | |
| 14005 { | |
| 14006 | |
| 14007 if (ss->ssl3.clientCertificate != NULL) | |
| 14008 CERT_DestroyCertificate(ss->ssl3.clientCertificate); | |
| 14009 | |
| 14010 if (ss->ssl3.clientPrivateKey != NULL) | |
| 14011 SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); | |
| 14012 | |
| 14013 if (ss->ssl3.channelID) | |
| 14014 SECKEY_DestroyPrivateKey(ss->ssl3.channelID); | |
| 14015 if (ss->ssl3.channelIDPub) | |
| 14016 SECKEY_DestroyPublicKey(ss->ssl3.channelIDPub); | |
| 14017 | |
| 14018 if (ss->ssl3.peerCertArena != NULL) | |
| 14019 ssl3_CleanupPeerCerts(ss); | |
| 14020 | |
| 14021 if (ss->ssl3.clientCertChain != NULL) { | |
| 14022 CERT_DestroyCertificateList(ss->ssl3.clientCertChain); | |
| 14023 ss->ssl3.clientCertChain = NULL; | |
| 14024 } | |
| 14025 | |
| 14026 /* clean up handshake */ | |
| 14027 #ifndef NO_PKCS11_BYPASS | |
| 14028 if (ss->opt.bypassPKCS11) { | |
| 14029 if (ss->ssl3.hs.hashType == handshake_hash_combo) { | |
| 14030 SHA1_DestroyContext((SHA1Context *)ss->ssl3.hs.sha_cx, PR_FALSE); | |
| 14031 MD5_DestroyContext((MD5Context *)ss->ssl3.hs.md5_cx, PR_FALSE); | |
| 14032 } else if (ss->ssl3.hs.hashType == handshake_hash_single) { | |
| 14033 ss->ssl3.hs.sha_obj->destroy(ss->ssl3.hs.sha_cx, PR_FALSE); | |
| 14034 } | |
| 14035 } | |
| 14036 #endif | |
| 14037 if (ss->ssl3.hs.md5) { | |
| 14038 PK11_DestroyContext(ss->ssl3.hs.md5, PR_TRUE); | |
| 14039 } | |
| 14040 if (ss->ssl3.hs.sha) { | |
| 14041 PK11_DestroyContext(ss->ssl3.hs.sha, PR_TRUE); | |
| 14042 } | |
| 14043 if (ss->ssl3.hs.clientSigAndHash) { | |
| 14044 PORT_Free(ss->ssl3.hs.clientSigAndHash); | |
| 14045 } | |
| 14046 if (ss->ssl3.hs.messages.buf) { | |
| 14047 PORT_Free(ss->ssl3.hs.messages.buf); | |
| 14048 ss->ssl3.hs.messages.buf = NULL; | |
| 14049 ss->ssl3.hs.messages.len = 0; | |
| 14050 ss->ssl3.hs.messages.space = 0; | |
| 14051 } | |
| 14052 | |
| 14053 /* free the SSL3Buffer (msg_body) */ | |
| 14054 PORT_Free(ss->ssl3.hs.msg_body.buf); | |
| 14055 | |
| 14056 SECITEM_FreeItem(&ss->ssl3.hs.newSessionTicket.ticket, PR_FALSE); | |
| 14057 | |
| 14058 /* free up the CipherSpecs */ | |
| 14059 ssl3_DestroyCipherSpec(&ss->ssl3.specs[0], PR_TRUE /*freeSrvName*/); | |
| 14060 ssl3_DestroyCipherSpec(&ss->ssl3.specs[1], PR_TRUE /*freeSrvName*/); | |
| 14061 | |
| 14062 /* Destroy the DTLS data */ | |
| 14063 if (IS_DTLS(ss)) { | |
| 14064 dtls_FreeHandshakeMessages(&ss->ssl3.hs.lastMessageFlight); | |
| 14065 if (ss->ssl3.hs.recvdFragments.buf) { | |
| 14066 PORT_Free(ss->ssl3.hs.recvdFragments.buf); | |
| 14067 } | |
| 14068 } | |
| 14069 | |
| 14070 /* Destroy TLS 1.3 handshake shares */ | |
| 14071 tls13_DestroyKeyShares(&ss->ssl3.hs.remoteKeyShares); | |
| 14072 | |
| 14073 /* Destroy TLS 1.3 keys */ | |
| 14074 if (ss->ssl3.hs.xSS) | |
| 14075 PK11_FreeSymKey(ss->ssl3.hs.xSS); | |
| 14076 if (ss->ssl3.hs.xES) | |
| 14077 PK11_FreeSymKey(ss->ssl3.hs.xES); | |
| 14078 if (ss->ssl3.hs.trafficSecret) | |
| 14079 PK11_FreeSymKey(ss->ssl3.hs.trafficSecret); | |
| 14080 if (ss->ssl3.hs.clientFinishedSecret) | |
| 14081 PK11_FreeSymKey(ss->ssl3.hs.clientFinishedSecret); | |
| 14082 if (ss->ssl3.hs.serverFinishedSecret) | |
| 14083 PK11_FreeSymKey(ss->ssl3.hs.serverFinishedSecret); | |
| 14084 | |
| 14085 if (ss->ssl3.dheGroups) { | |
| 14086 PORT_Free(ss->ssl3.dheGroups); | |
| 14087 } | |
| 14088 | |
| 14089 ss->ssl3.initialized = PR_FALSE; | |
| 14090 | |
| 14091 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE); | |
| 14092 } | |
| 14093 | |
| 14094 #define MAP_NULL(x) (((x) != 0) ? (x) : SEC_OID_NULL_CIPHER) | |
| 14095 | |
| 14096 SECStatus | |
| 14097 ssl3_ApplyNSSPolicy(void) | |
| 14098 { | |
| 14099 unsigned i; | |
| 14100 SECStatus rv; | |
| 14101 PRUint32 policy = 0; | |
| 14102 | |
| 14103 rv = NSS_GetAlgorithmPolicy(SEC_OID_APPLY_SSL_POLICY, &policy); | |
| 14104 if (rv != SECSuccess || !(policy & NSS_USE_POLICY_IN_SSL)) { | |
| 14105 return SECSuccess; /* do nothing */ | |
| 14106 } | |
| 14107 | |
| 14108 /* disable every ciphersuite */ | |
| 14109 for (i = 1; i < PR_ARRAY_SIZE(cipher_suite_defs); ++i) { | |
| 14110 const ssl3CipherSuiteDef *suite = &cipher_suite_defs[i]; | |
| 14111 SECOidTag policyOid; | |
| 14112 | |
| 14113 policyOid = MAP_NULL(kea_defs[suite->key_exchange_alg].oid); | |
| 14114 rv = NSS_GetAlgorithmPolicy(policyOid, &policy); | |
| 14115 if (rv == SECSuccess && !(policy & NSS_USE_ALG_IN_SSL_KX)) { | |
| 14116 ssl_CipherPrefSetDefault(suite->cipher_suite, PR_FALSE); | |
| 14117 ssl_CipherPolicySet(suite->cipher_suite, SSL_NOT_ALLOWED); | |
| 14118 continue; | |
| 14119 } | |
| 14120 | |
| 14121 policyOid = MAP_NULL(bulk_cipher_defs[suite->bulk_cipher_alg].oid); | |
| 14122 rv = NSS_GetAlgorithmPolicy(policyOid, &policy); | |
| 14123 if (rv == SECSuccess && !(policy & NSS_USE_ALG_IN_SSL)) { | |
| 14124 ssl_CipherPrefSetDefault(suite->cipher_suite, PR_FALSE); | |
| 14125 ssl_CipherPolicySet(suite->cipher_suite, SSL_NOT_ALLOWED); | |
| 14126 continue; | |
| 14127 } | |
| 14128 | |
| 14129 if (bulk_cipher_defs[suite->bulk_cipher_alg].type != type_aead) { | |
| 14130 policyOid = MAP_NULL(mac_defs[suite->mac_alg].oid); | |
| 14131 rv = NSS_GetAlgorithmPolicy(policyOid, &policy); | |
| 14132 if (rv == SECSuccess && !(policy & NSS_USE_ALG_IN_SSL)) { | |
| 14133 ssl_CipherPrefSetDefault(suite->cipher_suite, PR_FALSE); | |
| 14134 ssl_CipherPolicySet(suite->cipher_suite, | |
| 14135 SSL_NOT_ALLOWED); | |
| 14136 continue; | |
| 14137 } | |
| 14138 } | |
| 14139 } | |
| 14140 | |
| 14141 rv = ssl3_ConstrainRangeByPolicy(); | |
| 14142 | |
| 14143 return rv; | |
| 14144 } | |
| 14145 | |
| 14146 /* End of ssl3con.c */ | |
| OLD | NEW |