ssl3con.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:233k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * SSL3 Protocol
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public
  5.  * License Version 1.1 (the "License"); you may not use this file
  6.  * except in compliance with the License. You may obtain a copy of
  7.  * the License at http://www.mozilla.org/MPL/
  8.  * 
  9.  * Software distributed under the License is distributed on an "AS
  10.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  11.  * implied. See the License for the specific language governing
  12.  * rights and limitations under the License.
  13.  * 
  14.  * The Original Code is the Netscape security libraries.
  15.  * 
  16.  * The Initial Developer of the Original Code is Netscape
  17.  * Communications Corporation.  Portions created by Netscape are 
  18.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  19.  * Rights Reserved.
  20.  * 
  21.  * Contributor(s):
  22.  * 
  23.  * Alternatively, the contents of this file may be used under the
  24.  * terms of the GNU General Public License Version 2 or later (the
  25.  * "GPL"), in which case the provisions of the GPL are applicable 
  26.  * instead of those above.  If you wish to allow use of your 
  27.  * version of this file only under the terms of the GPL and not to
  28.  * allow others to use your version of this file under the MPL,
  29.  * indicate your decision by deleting the provisions above and
  30.  * replace them with the notice and other provisions required by
  31.  * the GPL.  If you do not delete the provisions above, a recipient
  32.  * may use your version of this file under either the MPL or the
  33.  * GPL.
  34.  *
  35.  * $Id: ssl3con.c,v 1.9.2.1 2000/11/21 03:24:52 nelsonb%netscape.com Exp $
  36.  */
  37. #include "cert.h"
  38. #include "ssl.h"
  39. #include "cryptohi.h" /* for DSAU_ stuff */
  40. #include "keyhi.h"
  41. #include "secder.h"
  42. #include "secitem.h"
  43. #include "sslimpl.h"
  44. #include "sslproto.h"
  45. #include "sslerr.h"
  46. #include "prtime.h"
  47. #include "prinrval.h"
  48. #include "prerror.h"
  49. #include "pratom.h"
  50. #include "prthread.h"
  51. #include "pk11func.h"
  52. #include "secmod.h"
  53. #include "nsslocks.h"
  54. #include <stdio.h>
  55. #ifndef PK11_SETATTRS
  56. #define PK11_SETATTRS(x,id,v,l) (x)->type = (id); 
  57. (x)->pValue=(v); (x)->ulValueLen = (l);
  58. #endif
  59. static PK11SymKey *ssl3_GenerateRSAPMS(sslSocket *ss, ssl3CipherSpec *spec,
  60.                                        PK11SlotInfo * serverKeySlot);
  61. static SECStatus ssl3_GenerateSessionKeys(sslSocket *ss, const PK11SymKey *pms);
  62. static SECStatus ssl3_HandshakeFailure(      sslSocket *ss);
  63. static SECStatus ssl3_InitState(             sslSocket *ss);
  64. static sslSessionID *ssl3_NewSessionID(      sslSocket *ss, PRBool is_server);
  65. static SECStatus ssl3_SendCertificate(       sslSocket *ss);
  66. static SECStatus ssl3_SendEmptyCertificate(  sslSocket *ss);
  67. static SECStatus ssl3_SendCertificateRequest(sslSocket *ss);
  68. static SECStatus ssl3_SendFinished(          sslSocket *ss, PRInt32 flags);
  69. static SECStatus ssl3_SendServerHello(       sslSocket *ss);
  70. static SECStatus ssl3_SendServerHelloDone(   sslSocket *ss);
  71. static SECStatus ssl3_SendServerKeyExchange( sslSocket *ss);
  72. static SECStatus Null_Cipher(void *ctx, unsigned char *output, int *outputLen,
  73.      int maxOutputLen, const unsigned char *input,
  74.      int inputLen);
  75. #define MAX_SEND_BUF_LENGTH 32000 /* watch for 16-bit integer overflow */
  76. #define MIN_SEND_BUF_LENGTH  4000
  77. #define MAX_CIPHER_SUITES 20
  78. /* This list of SSL3 cipher suites is sorted in descending order of
  79.  * precedence (desirability).  It only includes cipher suites we implement.
  80.  * This table is modified by SSL3_SetPolicy().
  81.  */
  82. static ssl3CipherSuiteCfg cipherSuites[ssl_V3_SUITES_IMPLEMENTED] = {
  83.    /*      cipher_suite                         policy      enabled is_present*/
  84.  { SSL_FORTEZZA_DMS_WITH_FORTEZZA_CBC_SHA, SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE},
  85.  { SSL_FORTEZZA_DMS_WITH_RC4_128_SHA,      SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE},
  86.  { SSL_RSA_WITH_RC4_128_MD5,               SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE},
  87.  { SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA,     SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE},
  88.  { SSL_RSA_WITH_3DES_EDE_CBC_SHA,          SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE},
  89.  { SSL_RSA_FIPS_WITH_DES_CBC_SHA,          SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE},
  90.  { SSL_RSA_WITH_DES_CBC_SHA,               SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE},
  91.  { TLS_RSA_EXPORT1024_WITH_RC4_56_SHA,     SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE},
  92.  { TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA,    SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE},
  93.  { SSL_RSA_EXPORT_WITH_RC4_40_MD5,         SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE},
  94.  { SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5,     SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE},
  95.  { SSL_FORTEZZA_DMS_WITH_NULL_SHA,         SSL_NOT_ALLOWED, PR_TRUE, PR_FALSE},
  96.  { SSL_RSA_WITH_NULL_MD5,                  SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE}
  97. };
  98. static const /*SSL3CompressionMethod*/ uint8 compressions [] = {
  99.     compression_null
  100. };
  101. static const int compressionMethodsCount =
  102. sizeof(compressions) / sizeof(compressions[0]);
  103. static const /*SSL3ClientCertificateType */ uint8 certificate_types [] = {
  104.     ct_RSA_sign,
  105.     ct_DSS_sign,
  106. };
  107. static const /*SSL3ClientCertificateType */ uint8 fortezza_certificate_types [] = {
  108.     ct_Fortezza,
  109. };
  110. /*
  111.  * make sure there is room in the write buffer for padding and
  112.  * other compression and cryptographic expansions
  113.  */
  114. #define SSL3_BUFFER_FUDGE     100
  115. #undef BPB
  116. #define BPB 8 /* Bits Per Byte */
  117. #define SET_ERROR_CODE /* reminder */
  118. #define SEND_ALERT /* reminder */
  119. #define TEST_FOR_FAILURE /* reminder */
  120. #define DEAL_WITH_FAILURE /* reminder */
  121. /* This is a hack to make sure we don't do double handshakes for US policy */
  122. PRBool ssl3_global_policy_some_restricted = PR_FALSE;
  123. /* This global item is used only in servers.  It is is initialized by
  124. ** SSL_ConfigSecureServer(), and is used in ssl3_SendCertificateRequest().
  125. */
  126. CERTDistNames *ssl3_server_ca_list = NULL;
  127. /* statistics from ssl3_SendClientHello (sch) */
  128. long ssl3_sch_sid_cache_hits;
  129. long ssl3_sch_sid_cache_misses;
  130. long ssl3_sch_sid_cache_not_ok;
  131. /* statistics from ssl3_HandleServerHello (hsh) */
  132. long ssl3_hsh_sid_cache_hits;
  133. long ssl3_hsh_sid_cache_misses;
  134. long ssl3_hsh_sid_cache_not_ok;
  135. /* statistics from ssl3_HandleClientHello (hch) */
  136. long ssl3_hch_sid_cache_hits;
  137. long ssl3_hch_sid_cache_misses;
  138. long ssl3_hch_sid_cache_not_ok;
  139. /* indexed by SSL3BulkCipher */
  140. static const ssl3BulkCipherDef bulk_cipher_defs[] = {
  141.     /* cipher          calg        keySz secretSz  type  ivSz BlkSz keygen */
  142.     {cipher_null,      calg_null,      0,  0, type_stream,  0, 0, kg_null},
  143.     {cipher_rc4,       calg_rc4,      16, 16, type_stream,  0, 0, kg_strong},
  144.     {cipher_rc4_40,    calg_rc4,      16,  5, type_stream,  0, 0, kg_export},
  145.     {cipher_rc4_56,    calg_rc4,      16,  7, type_stream,  0, 0, kg_export},
  146.     {cipher_rc2,       calg_rc2,      16, 16, type_block,   8, 8, kg_strong},
  147.     {cipher_rc2_40,    calg_rc2,      16,  5, type_block,   8, 8, kg_export},
  148.     {cipher_des,       calg_des,       8,  8, type_block,   8, 8, kg_strong},
  149.     {cipher_3des,      calg_3des,     24, 24, type_block,   8, 8, kg_strong},
  150.     {cipher_des40,     calg_des,       8,  5, type_block,   8, 8, kg_export},
  151.     {cipher_idea,      calg_idea,     16, 16, type_block,   8, 8, kg_strong},
  152.     {cipher_fortezza,  calg_fortezza, 10, 10, type_block,  24, 8, kg_null},
  153.     {cipher_missing,   calg_null,      0,  0, type_stream,  0, 0, kg_null},
  154. };
  155. static const ssl3KEADef kea_defs[] = { /* indexed by SSL3KeyExchangeAlgorithm */
  156.     /* kea              exchKeyType signKeyType is_limited limit  tls_keygen */
  157.     {kea_null,           kt_null,     sign_null, PR_FALSE,   0, PR_FALSE},
  158.     {kea_rsa,            kt_rsa,      sign_rsa,  PR_FALSE,   0, PR_FALSE},
  159.     {kea_rsa_export,     kt_rsa,      sign_rsa,  PR_TRUE,  512, PR_FALSE},
  160.     {kea_rsa_export_1024,kt_rsa,      sign_rsa,  PR_TRUE, 1024, PR_FALSE},
  161.     {kea_dh_dss,         kt_dh,       sign_dsa,  PR_FALSE,   0, PR_FALSE},
  162.     {kea_dh_dss_export,  kt_dh,       sign_dsa,  PR_TRUE,  512, PR_FALSE},
  163.     {kea_dh_rsa,         kt_dh,       sign_rsa,  PR_FALSE,   0, PR_FALSE},
  164.     {kea_dh_rsa_export,  kt_dh,       sign_rsa,  PR_TRUE,  512, PR_FALSE},
  165.     {kea_dhe_dss,        kt_dh,       sign_dsa,  PR_FALSE,   0, PR_FALSE},
  166.     {kea_dhe_dss_export, kt_dh,       sign_dsa,  PR_TRUE,  512, PR_FALSE},
  167.     {kea_dhe_rsa,        kt_dh,       sign_rsa,  PR_FALSE,   0, PR_FALSE},
  168.     {kea_dhe_rsa_export, kt_dh,       sign_rsa,  PR_TRUE,  512, PR_FALSE},
  169.     {kea_dh_anon,        kt_dh,       sign_null, PR_FALSE,   0, PR_FALSE},
  170.     {kea_dh_anon_export, kt_dh,       sign_null, PR_TRUE,  512, PR_FALSE},
  171.     {kea_fortezza,       kt_fortezza, sign_dsa,  PR_FALSE,   0, PR_FALSE},
  172.     {kea_rsa_fips,       kt_rsa,      sign_rsa,  PR_FALSE,   0, PR_TRUE },
  173. };
  174. static const CK_MECHANISM_TYPE kea_alg_defs[] = {
  175.     0x80000000L,
  176.     CKM_RSA_PKCS,
  177.     CKM_DH_PKCS_DERIVE,
  178.     CKM_KEA_KEY_DERIVE
  179. };
  180. static const ssl3MACDef mac_defs[] = { /* indexed by SSL3MACAlgorithm */
  181.     /* mac      malg        pad_size  mac_size                       */
  182.     { mac_null, malg_null,      0,     0          },
  183.     { mac_md5,  malg_md5,      48,     MD5_LENGTH },
  184.     { mac_sha,  malg_sha,      40,     SHA1_LENGTH},
  185.     {hmac_md5,  malg_md5_hmac, 48,     MD5_LENGTH },
  186.     {hmac_sha,  malg_sha_hmac, 40,     SHA1_LENGTH},
  187. };
  188. /* must use ssl_LookupCipherSuiteDef to access */
  189. static const ssl3CipherSuiteDef cipher_suite_defs[] = {
  190. /*  cipher_suite                    bulk_cipher_alg mac_alg key_exchange_alg */
  191.     {SSL_NULL_WITH_NULL_NULL,       cipher_null,   mac_null, kea_null},
  192.     {SSL_RSA_WITH_NULL_MD5,         cipher_null,   mac_md5, kea_rsa},
  193.     {SSL_RSA_WITH_NULL_SHA,         cipher_null,   mac_sha, kea_rsa},
  194.     {SSL_RSA_EXPORT_WITH_RC4_40_MD5,cipher_rc4_40, mac_md5, kea_rsa_export},
  195.     {SSL_RSA_WITH_RC4_128_MD5,      cipher_rc4,    mac_md5, kea_rsa},
  196.     {SSL_RSA_WITH_RC4_128_SHA,      cipher_rc4,    mac_sha, kea_rsa},
  197.     {SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5,
  198.                                     cipher_rc2_40, mac_md5, kea_rsa_export},
  199. #if 0 /* not implemented */
  200.     {SSL_RSA_WITH_IDEA_CBC_SHA,     cipher_idea,   mac_sha, kea_rsa},
  201.     {SSL_RSA_EXPORT_WITH_DES40_CBC_SHA,
  202.                                     cipher_des40,  mac_sha, kea_rsa_export},
  203. #endif
  204.     {SSL_RSA_WITH_DES_CBC_SHA,      cipher_des,    mac_sha, kea_rsa},
  205.     {SSL_RSA_WITH_3DES_EDE_CBC_SHA, cipher_3des,   mac_sha, kea_rsa},
  206. #if 0 /* not implemented */
  207.     {SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA,
  208.                                     cipher_des40,  mac_sha, kea_dh_dss_export},
  209.     {SSL_DH_DSS_DES_CBC_SHA,        cipher_des,    mac_sha, kea_dh_dss},
  210.     {SSL_DH_DSS_3DES_CBC_SHA,       cipher_3des,   mac_sha, kea_dh_dss},
  211.     {SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA,
  212.                                     cipher_des40,  mac_sha, kea_dh_rsa_export},
  213.     {SSL_DH_RSA_DES_CBC_SHA,        cipher_des,    mac_sha, kea_dh_rsa},
  214.     {SSL_DH_RSA_3DES_CBC_SHA,       cipher_des,    mac_sha, kea_dh_rsa},
  215.     {SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA,
  216.                                     cipher_des40,  mac_sha, kea_dh_dss_export},
  217.     {SSL_DHE_DSS_DES_CBC_SHA,       cipher_des,    mac_sha, kea_dh_dss},
  218.     {SSL_DHE_DSS_3DES_CBC_SHA,      cipher_3des,   mac_sha, kea_dh_dss},
  219.     {SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,
  220.                                     cipher_des40,  mac_sha, kea_dh_rsa_export},
  221.     {SSL_DHE_RSA_DES_CBC_SHA,       cipher_des,    mac_sha, kea_dh_rsa},
  222.     {SSL_DHE_RSA_3DES_CBC_SHA,      cipher_des,    mac_sha, kea_dh_rsa},
  223.     {SSL_DH_ANON_EXPORT_RC4_40_MD5, cipher_rc4_40, mac_md5, kea_dh_anon_export},
  224.     {SSL_DH_ANON_EXPORT_RC4_40_MD5, cipher_rc4,    mac_md5, kea_dh_anon_export},
  225.     {SSL_DH_ANON_EXPORT_WITH_DES40_CBC_SHA,
  226.                                     cipher_des40,  mac_sha, kea_dh_anon_export},
  227.     {SSL_DH_ANON_DES_CBC_SHA,       cipher_des,    mac_sha, kea_dh_anon},
  228.     {SSL_DH_ANON_3DES_CBC_SHA,      cipher_3des,   mac_sha, kea_dh_anon},
  229. #endif
  230.     {SSL_FORTEZZA_DMS_WITH_NULL_SHA, cipher_null,  mac_sha, kea_fortezza},
  231.     {SSL_FORTEZZA_DMS_WITH_FORTEZZA_CBC_SHA,
  232.                                   cipher_fortezza, mac_sha, kea_fortezza},
  233.     {SSL_FORTEZZA_DMS_WITH_RC4_128_SHA, cipher_rc4, mac_sha, kea_fortezza},
  234.     {TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA,
  235.                                     cipher_des,    mac_sha,kea_rsa_export_1024},
  236.     {TLS_RSA_EXPORT1024_WITH_RC4_56_SHA,
  237.                                     cipher_rc4_56, mac_sha,kea_rsa_export_1024},
  238.     {SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA, cipher_3des, mac_sha, kea_rsa_fips},
  239.     {SSL_RSA_FIPS_WITH_DES_CBC_SHA, cipher_des,    mac_sha, kea_rsa_fips},
  240. };
  241. /* indexed by SSL3BulkCipher */
  242. const char * const ssl3_cipherName[] = {
  243.     "NULL",
  244.     "RC4",
  245.     "RC4-40",
  246.     "RC4-56",
  247.     "RC2-CBC",
  248.     "RC2-CBC-40",
  249.     "DES-CBC",
  250.     "3DES-EDE-CBC",
  251.     "DES-CBC-40",
  252.     "IDEA-CBC",
  253.     "FORTEZZA",
  254.     "missing"
  255. };
  256. #if defined(TRACE)
  257. static char *
  258. ssl3_DecodeHandshakeType(int msgType)
  259. {
  260.     char * rv;
  261.     static char line[40];
  262.     switch(msgType) {
  263.     case hello_request:         rv = "hello_request (0)";               break;
  264.     case client_hello:         rv = "client_hello  (1)";               break;
  265.     case server_hello:         rv = "server_hello  (2)";               break;
  266.     case certificate:         rv = "certificate  (11)";               break;
  267.     case server_key_exchange: rv = "server_key_exchange (12)";        break;
  268.     case certificate_request: rv = "certificate_request (13)";        break;
  269.     case server_hello_done: rv = "server_hello_done   (14)";        break;
  270.     case certificate_verify: rv = "certificate_verify  (15)";        break;
  271.     case client_key_exchange: rv = "client_key_exchange (16)";        break;
  272.     case finished:         rv = "finished     (20)";               break;
  273.     default:
  274.         sprintf(line, "*UNKNOWN* handshake type! (%d)", msgType);
  275. rv = line;
  276.     }
  277.     return rv;
  278. }
  279. static char *
  280. ssl3_DecodeContentType(int msgType)
  281. {
  282.     char * rv;
  283.     static char line[40];
  284.     switch(msgType) {
  285.     case content_change_cipher_spec:
  286.                                 rv = "change_cipher_spec (20)";         break;
  287.     case content_alert:         rv = "alert      (21)";                 break;
  288.     case content_handshake: rv = "handshake  (22)";                 break;
  289.     case content_application_data:
  290.                                 rv = "application_data (23)";           break;
  291.     default:
  292.         sprintf(line, "*UNKNOWN* record type! (%d)", msgType);
  293. rv = line;
  294.     }
  295.     return rv;
  296. }
  297. #endif
  298. /* return pointer to ssl3CipherSuiteDef for suite, or NULL */
  299. /* XXX This does a linear search.  A binary search would be better. */
  300. static const ssl3CipherSuiteDef *
  301. ssl_LookupCipherSuiteDef(ssl3CipherSuite suite)
  302. {
  303.     int cipher_suite_def_len =
  304. sizeof(cipher_suite_defs) / sizeof(cipher_suite_defs[0]);
  305.     int i;
  306.     for (i = 0; i < cipher_suite_def_len; i++) {
  307. if (cipher_suite_defs[i].cipher_suite == suite)
  308.     return &cipher_suite_defs[i];
  309.     }
  310.     PORT_Assert(PR_FALSE);  /* We should never get here. */
  311.     PORT_SetError(SSL_ERROR_UNKNOWN_CIPHER_SUITE);
  312.     return NULL;
  313. }
  314. /* Find the cipher configuration struct associate with suite */
  315. /* XXX This does a linear search.  A binary search would be better. */
  316. static ssl3CipherSuiteCfg *
  317. ssl_LookupCipherSuiteCfg(ssl3CipherSuite suite, ssl3CipherSuiteCfg *suites)
  318. {
  319.     int i;
  320.     for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) {
  321. if (suites[i].cipher_suite == suite)
  322.     return &suites[i];
  323.     }
  324.     /* return NULL and let the caller handle it.  */
  325.     PORT_SetError(SSL_ERROR_UNKNOWN_CIPHER_SUITE);
  326.     return NULL;
  327. }
  328. /* Initialize the suite->isPresent value for config_match
  329.  * Returns count of enabled ciphers supported by extant tokens,
  330.  * regardless of policy or user preference.
  331.  * If this returns zero, the user cannot do SSL v3.
  332.  */
  333. int
  334. ssl3_config_match_init(sslSocket *ss)
  335. {
  336.     ssl3CipherSuiteCfg *      suite;
  337.     const ssl3CipherSuiteDef *cipher_def;
  338.     CipherAlgorithm           cipher_alg;
  339.     SSL3KEAType               exchKeyType;
  340.     int                       i;
  341.     int                       numPresent = 0;
  342.     int                       numEnabled = 0;
  343.     PRBool                    isServer;
  344.     if (!ss->enableSSL3 && !ss->enableTLS) {
  345.      return 0;
  346.     }
  347.     isServer = (PRBool)( ss && ss->sec && ss->sec->isServer );
  348.     for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) {
  349. suite = &ss->cipherSuites[i];
  350. if (suite->enabled) {
  351.     ++numEnabled;
  352.     /* We need the cipher defs to see if we have a token that can handle
  353.      * this cipher.  It isn't part of the static definition.
  354.      */
  355.     cipher_def = ssl_LookupCipherSuiteDef(suite->cipher_suite);
  356.     if (!cipher_def) {
  357.      suite->isPresent = PR_FALSE;
  358. continue;
  359.     }
  360.     cipher_alg=bulk_cipher_defs[cipher_def->bulk_cipher_alg ].calg;
  361.     exchKeyType =
  362.          kea_defs[cipher_def->key_exchange_alg].exchKeyType;
  363.     /* Mark the suites that are backed by real tokens, certs and keys */
  364.     suite->isPresent = (PRBool)
  365. (((exchKeyType == kt_null) ||
  366.     (!isServer || (ss->serverKey[exchKeyType] &&
  367.    ss->serverCertChain[exchKeyType])) &&
  368.     PK11_TokenExists(kea_alg_defs[exchKeyType])) &&
  369. ((cipher_alg == calg_null) || PK11_TokenExists(cipher_alg)));
  370.     if (suite->isPresent)
  371.      ++numPresent;
  372. }
  373.     }
  374.     PORT_Assert(numPresent > 0 || numEnabled == 0);
  375.     if (numPresent <= 0) {
  376. PORT_SetError(SSL_ERROR_NO_CIPHERS_SUPPORTED);
  377.     }
  378.     return numPresent;
  379. }
  380. /* return PR_TRUE if suite matches policy and enabled state */
  381. /* It would be a REALLY BAD THING (tm) if we ever permitted the use
  382. ** of a cipher that was NOT_ALLOWED.  So, if this is ever called with
  383. ** policy == SSL_NOT_ALLOWED, report no match.
  384. */
  385. /* adjust suite enabled to the availability of a token that can do the
  386.  * cipher suite. */
  387. static PRBool
  388. config_match(ssl3CipherSuiteCfg *suite, int policy, PRBool enabled)
  389. {
  390.     PORT_Assert(policy != SSL_NOT_ALLOWED && enabled != PR_FALSE);
  391.     if (policy == SSL_NOT_ALLOWED || !enabled)
  392.      return PR_FALSE;
  393.     return (PRBool)(suite->enabled &&
  394.                     suite->isPresent &&
  395.             suite->policy != SSL_NOT_ALLOWED &&
  396.     suite->policy <= policy);
  397. }
  398. /* return number of cipher suites that match policy and enabled state */
  399. /* called from ssl3_SendClientHello and ssl3_ConstructV2CipherSpecsHack */
  400. static int
  401. count_cipher_suites(sslSocket *ss, int policy, PRBool enabled)
  402. {
  403.     int i, count = 0;
  404.     if (!ss->enableSSL3 && !ss->enableTLS) {
  405.      return 0;
  406.     }
  407.     for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) {
  408. if (config_match(&ss->cipherSuites[i], policy, enabled))
  409.     count++;
  410.     }
  411.     if (count <= 0) {
  412. PORT_SetError(SSL_ERROR_SSL_DISABLED);
  413.     }
  414.     return count;
  415. }
  416. static PRBool
  417. anyRestrictedEnabled(sslSocket *ss)
  418. {
  419.     int i;
  420.     if (!ss->enableSSL3 && !ss->enableTLS) {
  421.      return PR_FALSE;
  422.     }
  423.     for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) {
  424. ssl3CipherSuiteCfg *suite = &ss->cipherSuites[i];
  425. if (suite->policy == SSL_RESTRICTED &&
  426.     suite->enabled &&
  427.     suite->isPresent)
  428.     return PR_TRUE;
  429.     }
  430.     return PR_FALSE;
  431. }
  432. /*
  433.  * Null compression, mac and encryption functions
  434.  */
  435. static SECStatus
  436. Null_Cipher(void *ctx, unsigned char *output, int *outputLen, int maxOutputLen,
  437.     const unsigned char *input, int inputLen)
  438. {
  439.     *outputLen = inputLen;
  440.     if (input != output)
  441. PORT_Memcpy(output, input, inputLen);
  442.     return SECSuccess;
  443. }
  444. /*
  445.  * SSL3 Utility functions
  446.  */
  447. SECStatus
  448. ssl3_NegotiateVersion(sslSocket *ss, SSL3ProtocolVersion peerVersion)
  449. {
  450.     SSL3ProtocolVersion version;
  451.     SSL3ProtocolVersion maxVersion;
  452.     if (ss->enableTLS) {
  453. maxVersion = SSL_LIBRARY_VERSION_3_1_TLS;
  454.     } else if (ss->enableSSL3) {
  455. maxVersion = SSL_LIBRARY_VERSION_3_0;
  456.     } else {
  457.      /* what are we doing here? */
  458. PORT_Assert(ss->enableSSL3 || ss->enableTLS);
  459. PORT_SetError(SSL_ERROR_SSL_DISABLED);
  460. return SECFailure;
  461.     }
  462.     ss->version = version = PR_MIN(maxVersion, peerVersion);
  463.     if ((version == SSL_LIBRARY_VERSION_3_1_TLS && ss->enableTLS) ||
  464.      (version == SSL_LIBRARY_VERSION_3_0     && ss->enableSSL3)) {
  465. return SECSuccess;
  466.     }
  467.     PORT_SetError(SSL_ERROR_NO_CYPHER_OVERLAP);
  468.     return SECFailure;
  469. }
  470. static SECStatus
  471. ssl3_GetNewRandom(SSL3Random *random)
  472. {
  473.     PRIntervalTime gmt = PR_IntervalToSeconds(PR_IntervalNow());
  474.     SECStatus rv;
  475.     random->rand[0] = (unsigned char)(gmt >> 24);
  476.     random->rand[1] = (unsigned char)(gmt >> 16);
  477.     random->rand[2] = (unsigned char)(gmt >>  8);
  478.     random->rand[3] = (unsigned char)(gmt);
  479.     /* first 4 bytes are reserverd for time */
  480.     rv = PK11_GenerateRandom(&random->rand[4], SSL3_RANDOM_LENGTH - 4);
  481.     if (rv != SECSuccess) {
  482. ssl_MapLowLevelError(SSL_ERROR_GENERATE_RANDOM_FAILURE);
  483.     }
  484.     return rv;
  485. }
  486. static SECStatus
  487. ssl3_SignHashes(SSL3Hashes *hash, SECKEYPrivateKey *key, SECItem *buf, 
  488.                 PRBool isTLS)
  489. {
  490.     SECStatus rv = SECFailure;
  491.     PRBool    doDerEncode       = PR_FALSE;
  492.     int       signatureLen;
  493.     SECItem   hashItem;
  494.     buf->data    = NULL;
  495.     signatureLen = PK11_SignatureLen(key);
  496.     if (signatureLen <= 0) {
  497. PORT_SetError(SEC_ERROR_INVALID_KEY);
  498.         goto done;
  499.     }
  500.     buf->len  = (unsigned)signatureLen;
  501.     buf->data = (unsigned char *)PORT_Alloc(signatureLen + 1);
  502.     if (!buf->data)
  503.         goto done; /* error code was set. */
  504.     switch (key->keyType) {
  505.     case rsaKey:
  506.      hashItem.data = hash->md5;
  507.      hashItem.len = sizeof(SSL3Hashes);
  508. break;
  509.     case dsaKey:
  510.     case fortezzaKey:
  511. doDerEncode = isTLS;
  512. hashItem.data = hash->sha;
  513. hashItem.len = sizeof(hash->sha);
  514. break;
  515.     default:
  516. PORT_SetError(SEC_ERROR_INVALID_KEY);
  517. goto done;
  518.     }
  519.     PRINT_BUF(60, (NULL, "hash(es) to be signed", hashItem.data, hashItem.len));
  520.     rv = PK11_Sign(key, buf, &hashItem);
  521.     if (rv != SECSuccess) {
  522. ssl_MapLowLevelError(SSL_ERROR_SIGN_HASHES_FAILURE);
  523.     } else if (doDerEncode) {
  524. SECItem   derSig = {siBuffer, NULL, 0};
  525.      rv = DSAU_EncodeDerSig(&derSig, buf);
  526. if (rv == SECSuccess) {
  527.     PORT_Free(buf->data); /* discard unencoded signature. */
  528.     *buf = derSig; /* give caller encoded signature. */
  529. } else if (derSig.data) {
  530.     PORT_Free(derSig.data);
  531. }
  532.     }
  533.     PRINT_BUF(60, (NULL, "signed hashes", (unsigned char*)buf->data, buf->len));
  534. done:
  535.     if (rv != SECSuccess && buf->data) {
  536. PORT_Free(buf->data);
  537. buf->data = NULL;
  538.     }
  539.     return rv;
  540. }
  541. static SECStatus
  542. ssl3_VerifySignedHashes(SSL3Hashes *hash, CERTCertificate *cert, 
  543.                         SECItem *buf, PRBool isTLS, void *pwArg)
  544. {
  545.     SECKEYPublicKey * key;
  546.     SECItem *         signature = NULL;
  547.     SECStatus         rv;
  548.     SECItem           hashItem;
  549.     PRINT_BUF(60, (NULL, "check signed hashes",
  550.                   buf->data, buf->len));
  551.     key = CERT_ExtractPublicKey(cert);
  552.     if (key == NULL) {
  553. /* CERT_ExtractPublicKey doesn't set error code */
  554. PORT_SetError(SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE);
  555.      return SECFailure;
  556.     }
  557.     switch (key->keyType) {
  558.     case rsaKey:
  559.      hashItem.data = hash->md5;
  560.      hashItem.len = sizeof(SSL3Hashes);
  561. break;
  562.     case dsaKey:
  563.     case fortezzaKey:
  564. hashItem.data = hash->sha;
  565. hashItem.len = sizeof(hash->sha);
  566. if (isTLS) {
  567.     signature = DSAU_DecodeDerSig(buf);
  568.     if (!signature) {
  569.      PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE);
  570. return SECFailure;
  571.     }
  572.     buf = signature;
  573. }
  574. break;
  575.     default:
  576.      SECKEY_DestroyPublicKey(key);
  577. PORT_SetError(SEC_ERROR_UNSUPPORTED_KEYALG);
  578. return SECFailure;
  579.     }
  580.     PRINT_BUF(60, (NULL, "hash(es) to be verified",
  581.                   hashItem.data, hashItem.len));
  582.     rv = PK11_Verify(key, buf, &hashItem, pwArg);
  583.     SECKEY_DestroyPublicKey(key);
  584.     if (signature) {
  585.      SECITEM_FreeItem(signature, PR_TRUE);
  586.     }
  587.     if (rv != SECSuccess) {
  588. ssl_MapLowLevelError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE);
  589.     }
  590.     return rv;
  591. }
  592. /* Caller must set hiLevel error code. */
  593. static SECStatus
  594. ssl3_ComputeExportRSAKeyHash(SECItem modulus, SECItem publicExponent,
  595.      SSL3Random *client_rand, SSL3Random *server_rand,
  596.      SSL3Hashes *hashes)
  597. {
  598.     PK11Context * md5  = NULL;
  599.     PK11Context * sha  = NULL;
  600.     PRUint8     * hashBuf;
  601.     PRUint8     * pBuf;
  602.     SECStatus     rv  = SECSuccess;
  603.     unsigned int  outLen;
  604.     unsigned int  bufLen;
  605.     PRUint8       buf[2*SSL3_RANDOM_LENGTH + 2 + 4096/8 + 2 + 4096/8];
  606.     bufLen = 2*SSL3_RANDOM_LENGTH + 2 + modulus.len + 2 + publicExponent.len;
  607.     if (bufLen <= sizeof buf) {
  608.      hashBuf = buf;
  609.     } else {
  610.      hashBuf = PORT_Alloc(bufLen);
  611. if (!hashBuf) {
  612.     return SECFailure;
  613. }
  614.     }
  615.     md5 = PK11_CreateDigestContext(SEC_OID_MD5);
  616.     if (md5 == NULL) {
  617. ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE);
  618. rv = SECFailure; /* Caller must set hiLevel error code. */
  619. goto done;
  620.     }
  621.     sha = PK11_CreateDigestContext(SEC_OID_SHA1);
  622.     if (sha == NULL) {
  623. ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
  624. rv = SECFailure; /* Caller must set hiLevel error code. */
  625. goto done;
  626.     }
  627.     memcpy(hashBuf, client_rand, SSL3_RANDOM_LENGTH); 
  628.      pBuf = hashBuf + SSL3_RANDOM_LENGTH;
  629.     memcpy(pBuf, server_rand, SSL3_RANDOM_LENGTH);
  630.      pBuf += SSL3_RANDOM_LENGTH;
  631.     pBuf[0]  = (PRUint8)(modulus.len >> 8);
  632.     pBuf[1]  = (PRUint8)(modulus.len);
  633.      pBuf += 2;
  634.     memcpy(pBuf, modulus.data, modulus.len);
  635.      pBuf += modulus.len;
  636.     pBuf[0] = (PRUint8)(publicExponent.len >> 8);
  637.     pBuf[1] = (PRUint8)(publicExponent.len);
  638.      pBuf += 2;
  639.     memcpy(pBuf, publicExponent.data, publicExponent.len);
  640.      pBuf += publicExponent.len;
  641.     PORT_Assert(pBuf - hashBuf == bufLen);
  642.     rv  = PK11_DigestBegin(md5);
  643.     rv |= PK11_DigestOp(md5, hashBuf, bufLen);
  644.     rv |= PK11_DigestFinal(md5, hashes->md5, &outLen, MD5_LENGTH);
  645.     PORT_Assert(rv != SECSuccess || outLen == MD5_LENGTH);
  646.     if (rv != SECSuccess) {
  647. ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE);
  648.      rv = SECFailure;
  649. goto done;
  650.     }
  651.     rv  = PK11_DigestBegin(sha);
  652.     rv |= PK11_DigestOp(sha, hashBuf, bufLen);
  653.     rv |= PK11_DigestFinal(sha, hashes->sha, &outLen, SHA1_LENGTH);
  654.     PORT_Assert(rv != SECSuccess || outLen == SHA1_LENGTH);
  655.     if (rv != SECSuccess) {
  656. ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
  657.      rv = SECFailure;
  658. goto done;
  659.     }
  660.     PRINT_BUF(95, (NULL, "RSAkey hash: ", hashBuf, bufLen));
  661.     PRINT_BUF(95, (NULL, "RSAkey hash: MD5 result", hashes->md5, MD5_LENGTH));
  662.     PRINT_BUF(95, (NULL, "RSAkey hash: SHA1 result", hashes->sha, SHA1_LENGTH));
  663. done:
  664.     if (md5 != NULL) PK11_DestroyContext(md5, PR_TRUE);
  665.     if (sha != NULL) PK11_DestroyContext(sha, PR_TRUE);
  666.     if (hashBuf != buf && hashBuf != NULL)
  667.      PORT_Free(hashBuf);
  668.     return rv;
  669. }
  670. /* Caller must set hiLevel error code. */
  671. static SECStatus
  672. ssl3_ComputeFortezzaPublicKeyHash(SECItem publicValue, unsigned char * hash)
  673. {
  674.     PK11Context *sha  = NULL;
  675.     SECStatus    rv = SECFailure;
  676.     unsigned int outLen;
  677.     sha = PK11_CreateDigestContext(SEC_OID_SHA1);
  678.     if (sha == NULL) {
  679. return rv; /* Caller must set hiLevel error code. */
  680.     }
  681.     rv  = PK11_DigestBegin(sha);
  682.     rv |= PK11_DigestOp(sha, (unsigned char *)publicValue.data, publicValue.len);
  683.     rv |= PK11_DigestFinal(sha, hash, &outLen, SHA1_LENGTH);
  684.     PORT_Assert(rv != SECSuccess || outLen == SHA1_LENGTH);
  685.     if (rv != SECSuccess)
  686.      rv = SECFailure;
  687.     PK11_DestroyContext(sha, PR_TRUE);
  688.     return rv;
  689. }
  690. static void
  691. ssl3_BumpSequenceNumber(SSL3SequenceNumber *num)
  692. {
  693.     num->low++;
  694.     if (num->low == 0)
  695. num->high++;
  696. }
  697. /* Called only from ssl3_DestroyCipherSpec (immediately below). */
  698. static void
  699. ssl3_CleanupKeyMaterial(ssl3KeyMaterial *mat)
  700. {
  701.     if (mat->write_key != NULL) {
  702. PK11_FreeSymKey(mat->write_key);
  703. mat->write_key = NULL;
  704.     }
  705.     if (mat->write_mac_key != NULL) {
  706. PK11_FreeSymKey(mat->write_mac_key);
  707. mat->write_mac_key = NULL;
  708.     }
  709.     if (mat->write_mac_context != NULL) {
  710. PK11_DestroyContext(mat->write_mac_context, PR_TRUE);
  711. mat->write_mac_context = NULL;
  712.     }
  713. }
  714. /* Called from ssl3_SendChangeCipherSpecs() and ssl3_HandleChangeCipherSpecs()
  715. ** Caller must hold SpecWriteLock.
  716. */
  717. static void
  718. ssl3_DestroyCipherSpec(ssl3CipherSpec *spec)
  719. {
  720. /*  PORT_Assert( ssl_HaveSpecWriteLock(ss)); Don't have ss! */
  721.     if (spec->destroy) {
  722. spec->destroy(spec->encodeContext,PR_TRUE);
  723. spec->destroy(spec->decodeContext,PR_TRUE);
  724. spec->encodeContext = NULL; /* paranoia */
  725. spec->decodeContext = NULL;
  726.     }
  727.     if (spec->master_secret != NULL) {
  728. PK11_FreeSymKey(spec->master_secret);
  729. spec->master_secret = NULL;
  730.     }
  731.     ssl3_CleanupKeyMaterial(&spec->client);
  732.     ssl3_CleanupKeyMaterial(&spec->server);
  733.     spec->destroy=NULL;
  734. }
  735. /* Called from ssl3_HandleServerHello(), ssl3_SendServerHello()
  736. ** Caller must hold the ssl3 handshake lock.
  737. ** Acquires & releases SpecWriteLock.
  738. */
  739. static SECStatus
  740. ssl3_SetupPendingCipherSpec(sslSocket *ss, ssl3State *ssl3)
  741. {
  742.     ssl3CipherSpec *          pwSpec;
  743.     ssl3CipherSpec *          cwSpec;
  744.     ssl3CipherSuite           suite     = ssl3->hs.cipher_suite;
  745.     sslSecurityInfo *         sec       = ss->sec;
  746.     SSL3MACAlgorithm          mac;
  747.     SSL3BulkCipher            cipher;
  748.     SSL3KeyExchangeAlgorithm  kea;
  749.     const ssl3CipherSuiteDef *suite_def;
  750.     PRBool                    isTLS;
  751.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss));
  752.     ssl_GetSpecWriteLock(ss);  /*******************************/
  753.     pwSpec = ssl3->pwSpec;
  754.     PORT_Assert(pwSpec == ssl3->prSpec);
  755.     /* This hack provides maximal interoperability with SSL 3 servers. */
  756.     cwSpec = ss->ssl3->cwSpec;
  757.     if (cwSpec->mac_def->mac == mac_null) {
  758. /* SSL records are not being MACed. */
  759. cwSpec->version = ss->version;
  760.     }
  761.     pwSpec->version  = ss->version;
  762.     isTLS  = (PRBool)(pwSpec->version > SSL_LIBRARY_VERSION_3_0);
  763.     SSL_TRC(3, ("%d: SSL3[%d]: Set XXX Pending Cipher Suite to 0x%04x",
  764. SSL_GETPID(), ss->fd, suite));
  765.     suite_def = ssl_LookupCipherSuiteDef(suite);
  766.     if (suite_def == NULL) {
  767. ssl_ReleaseSpecWriteLock(ss);
  768. return SECFailure; /* error code set by ssl_LookupCipherSuiteDef */
  769.     }
  770.     cipher = suite_def->bulk_cipher_alg;
  771.     kea    = suite_def->key_exchange_alg;
  772.     mac    = suite_def->mac_alg;
  773.     if (isTLS)
  774. mac += 2;
  775.     ssl3->hs.suite_def = suite_def;
  776.     ssl3->hs.kea_def   = &kea_defs[kea];
  777.     PORT_Assert(ssl3->hs.kea_def->kea == kea);
  778.     pwSpec->cipher_def   = &bulk_cipher_defs[cipher];
  779.     PORT_Assert(pwSpec->cipher_def->cipher == cipher);
  780.     pwSpec->mac_def = &mac_defs[mac];
  781.     PORT_Assert(pwSpec->mac_def->mac == mac);
  782.     sec->keyBits       = pwSpec->cipher_def->key_size        * BPB;
  783.     sec->secretKeyBits = pwSpec->cipher_def->secret_key_size * BPB;
  784.     sec->cipherType    = cipher;
  785.     pwSpec->encodeContext = NULL;
  786.     pwSpec->decodeContext = NULL;
  787.     pwSpec->mac_size = pwSpec->mac_def->mac_size;
  788.     ssl_ReleaseSpecWriteLock(ss);  /*******************************/
  789.     return SECSuccess;
  790. }
  791. /*
  792.  * Called from: ssl3_SendClientKeyExchange  (for Full handshake)
  793.  *              ssl3_HandleClientKeyExchange (for Full handshake)
  794.  *              ssl3_HandleServerHello (for session restart)
  795.  *              ssl3_HandleClientHello (for session restart)
  796.  * Sets error code, but caller probably should override to disambiguate.
  797.  * NULL pms means re-use old master_secret.
  798.  */
  799. static SECStatus
  800. ssl3_InitPendingCipherSpec(sslSocket *ss, PK11SymKey *pms)
  801. {
  802.       ssl3CipherSpec  *  pwSpec;
  803.       sslSecurityInfo *  sec           = ss->sec;
  804. const ssl3BulkCipherDef *cipher_def;
  805.       PK11Context *      serverContext = NULL;
  806.       PK11Context *      clientContext = NULL;
  807.       SECItem *          param;
  808.       CK_ULONG           macLength;
  809.       SECStatus          rv;
  810.       CK_MECHANISM_TYPE  mechanism;
  811.       CK_MECHANISM_TYPE  mac_mech;
  812.       SECItem            iv;
  813.       SECItem            mac_param;
  814.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss));
  815.     ssl_GetSpecWriteLock(ss); /**************************************/
  816.     PORT_Assert(ss->ssl3->prSpec == ss->ssl3->pwSpec);
  817.     pwSpec        = ss->ssl3->pwSpec;
  818.     cipher_def    = pwSpec->cipher_def;
  819.     macLength     = pwSpec->mac_size;
  820.     /* generate session keys from pms (if pms is not NULL) or ms */
  821.     rv = ssl3_GenerateSessionKeys(ss, pms);
  822.     if (rv != SECSuccess) {
  823.      goto bail_out; /* err code set by ssl3_GenerateSessionKeys */
  824.     }
  825.     pwSpec->client.write_mac_context = NULL;
  826.     pwSpec->server.write_mac_context = NULL;
  827.     mac_param.data = (unsigned char *)&macLength;
  828.     mac_param.len  = sizeof(macLength);
  829.     mac_mech       = (CK_MECHANISM_TYPE) pwSpec->mac_def->malg;
  830.     if (cipher_def->calg == calg_null) {
  831. pwSpec->encode  = Null_Cipher;
  832. pwSpec->decode  = Null_Cipher;
  833.         pwSpec->destroy = NULL;
  834. pwSpec->client.write_mac_context = PK11_CreateContextBySymKey(
  835. mac_mech, CKA_SIGN, pwSpec->client.write_mac_key, &mac_param);
  836. if (pwSpec->client.write_mac_context == NULL)  {
  837.     ssl_MapLowLevelError(SSL_ERROR_SYM_KEY_CONTEXT_FAILURE);
  838.     goto fail;
  839. }
  840. pwSpec->server.write_mac_context = PK11_CreateContextBySymKey(
  841. mac_mech, CKA_SIGN, pwSpec->server.write_mac_key, &mac_param);
  842. if (pwSpec->server.write_mac_context == NULL) {
  843.     ssl_MapLowLevelError(SSL_ERROR_SYM_KEY_CONTEXT_FAILURE);
  844.     goto fail;
  845. }
  846. goto success;
  847.     }
  848.     mechanism = (CK_MECHANISM_TYPE) cipher_def->calg;
  849.     /*
  850.      * build the server context
  851.      */
  852.     iv.data = pwSpec->server.write_iv;
  853.     iv.len  = cipher_def->iv_size;
  854.     param = PK11_ParamFromIV(mechanism, &iv);
  855.     if (param == NULL) {
  856. ssl_MapLowLevelError(SSL_ERROR_IV_PARAM_FAILURE);
  857.      goto fail;
  858.     }
  859.     serverContext = PK11_CreateContextBySymKey(mechanism,
  860. (sec->isServer ? CKA_ENCRYPT : CKA_DECRYPT),
  861. pwSpec->server.write_key, param);
  862.     iv.data = PK11_IVFromParam(mechanism, param, (int *)&iv.len);
  863.     if (iv.data)
  864.      PORT_Memcpy(pwSpec->server.write_iv, iv.data, iv.len);
  865.     SECITEM_FreeItem(param, PR_TRUE);
  866.     if (serverContext == NULL) {
  867. ssl_MapLowLevelError(SSL_ERROR_SYM_KEY_CONTEXT_FAILURE);
  868.      goto fail;
  869.     }
  870.     /*
  871.      * build the client context
  872.      */
  873.     iv.data = pwSpec->client.write_iv;
  874.     iv.len  = cipher_def->iv_size;
  875.     param = PK11_ParamFromIV(mechanism, &iv);
  876.     if (param == NULL) {
  877. ssl_MapLowLevelError(SSL_ERROR_IV_PARAM_FAILURE);
  878.      goto fail;
  879.     }
  880.     clientContext = PK11_CreateContextBySymKey(mechanism,
  881. (sec->isServer ? CKA_DECRYPT : CKA_ENCRYPT),
  882. pwSpec->client.write_key, param);
  883.     iv.data = PK11_IVFromParam(mechanism, param, (int *)&iv.len);
  884.     if (iv.data)
  885.      PORT_Memcpy(pwSpec->client.write_iv, iv.data, iv.len);
  886.     SECITEM_FreeItem(param,PR_TRUE);
  887.     if (clientContext == NULL) {
  888. ssl_MapLowLevelError(SSL_ERROR_SYM_KEY_CONTEXT_FAILURE);
  889.      goto fail;
  890.     }
  891.     pwSpec->encodeContext = (sec->isServer) ? serverContext : clientContext;
  892.     pwSpec->decodeContext = (sec->isServer) ? clientContext : serverContext;
  893.     pwSpec->encode  = (SSLCipher) PK11_CipherOp;
  894.     pwSpec->decode  = (SSLCipher) PK11_CipherOp;
  895.     pwSpec->destroy = (SSLDestroy) PK11_DestroyContext;
  896.     serverContext = NULL;
  897.     clientContext = NULL;
  898.     pwSpec->client.write_mac_context = PK11_CreateContextBySymKey(
  899. mac_mech,CKA_SIGN, pwSpec->client.write_mac_key,&mac_param);
  900.     if (pwSpec->client.write_mac_context == NULL)  {
  901. ssl_MapLowLevelError(SSL_ERROR_SYM_KEY_CONTEXT_FAILURE);
  902.      goto fail;
  903.     }
  904.     pwSpec->server.write_mac_context = PK11_CreateContextBySymKey(
  905. mac_mech, CKA_SIGN, pwSpec->server.write_mac_key,&mac_param);
  906.     if (pwSpec->server.write_mac_context == NULL) {
  907. ssl_MapLowLevelError(SSL_ERROR_SYM_KEY_CONTEXT_FAILURE);
  908.      goto fail;
  909.     }
  910. success:
  911.     ssl_ReleaseSpecWriteLock(ss); /******************************/
  912.     return SECSuccess;
  913. fail:
  914.     if (serverContext != NULL) PK11_DestroyContext(serverContext, PR_TRUE);
  915.     if (clientContext != NULL) PK11_DestroyContext(clientContext, PR_TRUE);
  916.     if (pwSpec->client.write_mac_context != NULL) {
  917.      PK11_DestroyContext(pwSpec->client.write_mac_context,PR_TRUE);
  918. pwSpec->client.write_mac_context = NULL;
  919.     }
  920.     if (pwSpec->server.write_mac_context != NULL) {
  921.      PK11_DestroyContext(pwSpec->server.write_mac_context,PR_TRUE);
  922. pwSpec->server.write_mac_context = NULL;
  923.     }
  924. bail_out:
  925.     ssl_ReleaseSpecWriteLock(ss);
  926.     return SECFailure;
  927. }
  928. /*
  929.  * 60 bytes is 3 times the maximum length MAC size that is supported.
  930.  */
  931. static const unsigned char mac_pad_1 [60] = {
  932.     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  933.     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  934.     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  935.     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  936.     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  937.     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  938.     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  939.     0x36, 0x36, 0x36, 0x36
  940. };
  941. static const unsigned char mac_pad_2 [60] = {
  942.     0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  943.     0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  944.     0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  945.     0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  946.     0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  947.     0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  948.     0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  949.     0x5c, 0x5c, 0x5c, 0x5c
  950. };
  951. /* Called from: ssl3_SendRecord()
  952. ** ssl3_HandleRecord()
  953. ** Caller must already hold the SpecReadLock. (wish we could assert that!)
  954. */
  955. static SECStatus
  956. ssl3_ComputeRecordMAC(
  957.     ssl3CipherSpec *   spec,
  958.     PK11Context *      mac_context,
  959.     SSL3ContentType    type,
  960.     SSL3ProtocolVersion version,
  961.     SSL3SequenceNumber seq_num,
  962.     SSL3Opaque *       input,
  963.     int                inputLength,
  964.     unsigned char *    outbuf,
  965.     unsigned int *     outLength)
  966. {
  967.     const ssl3MACDef * mac_def;
  968.     SECStatus          rv;
  969.     unsigned int       tempLen;
  970.     unsigned char      temp[MAX_MAC_LENGTH];
  971. /*  ssl_GetSpecReadLock(ss);  Don't have "ss"! */
  972.     mac_def = spec->mac_def;
  973.     if (mac_def->malg == malg_null) {
  974. *outLength = 0;
  975. /* ssl_ReleaseSpecReadLock(ss); */
  976. return SECSuccess;
  977.     }
  978.     temp[0] = (unsigned char)(seq_num.high >> 24);
  979.     temp[1] = (unsigned char)(seq_num.high >> 16);
  980.     temp[2] = (unsigned char)(seq_num.high >>  8);
  981.     temp[3] = (unsigned char)(seq_num.high >>  0);
  982.     temp[4] = (unsigned char)(seq_num.low  >> 24);
  983.     temp[5] = (unsigned char)(seq_num.low  >> 16);
  984.     temp[6] = (unsigned char)(seq_num.low  >>  8);
  985.     temp[7] = (unsigned char)(seq_num.low  >>  0);
  986.     temp[8] = type;
  987.     /* TLS MAC includes the record's version field, SSL's doesn't.
  988.     ** We decide which MAC defintion to use based on the version of 
  989.     ** the protocol that was negotiated when the spec became current,
  990.     ** NOT based on the version value in the record itself.
  991.     ** But, we use the record'v version value in the computation.
  992.     */
  993.     if (spec->version <= SSL_LIBRARY_VERSION_3_0) {
  994. temp[9]  = MSB(inputLength);
  995. temp[10] = LSB(inputLength);
  996. tempLen  = 11;
  997.     } else {
  998.      /* New TLS hash includes version. */
  999. temp[9]  = MSB(version);
  1000. temp[10] = LSB(version);
  1001. temp[11] = MSB(inputLength);
  1002. temp[12] = LSB(inputLength);
  1003. tempLen  = 13;
  1004.     }
  1005.     PRINT_BUF(95, (NULL, "frag hash1: temp", temp, tempLen));
  1006.     PRINT_BUF(95, (NULL, "frag hash1: input", input, inputLength));
  1007.     rv  = PK11_DigestBegin(mac_context);
  1008.     rv |= PK11_DigestOp(mac_context, temp, tempLen);
  1009.     rv |= PK11_DigestOp(mac_context, input, inputLength);
  1010.     rv |= PK11_DigestFinal(mac_context, outbuf, outLength, spec->mac_size);
  1011.     PORT_Assert(rv != SECSuccess || *outLength == (unsigned)spec->mac_size);
  1012. /*  ssl_ReleaseSpecReadLock(ss); */
  1013.     PRINT_BUF(95, (NULL, "frag hash2: result", outbuf, *outLength));
  1014.     if (rv != SECSuccess) {
  1015.      rv = SECFailure;
  1016. ssl_MapLowLevelError(SSL_ERROR_MAC_COMPUTATION_FAILURE);
  1017.     }
  1018.     return rv;
  1019. }
  1020. /* Process the plain text before sending it.
  1021.  * Returns the number of bytes of plaintext that were succesfully sent
  1022.  *  plus the number of bytes of plaintext that were copied into the
  1023.  * output (write) buffer.
  1024.  * Returns SECFailure on a hard IO error, memory error, or crypto error.
  1025.  * Does NOT return SECWouldBlock.
  1026.  */
  1027. static PRInt32
  1028. ssl3_SendRecord(   sslSocket *        ss,
  1029.                    SSL3ContentType    type,
  1030.    const SSL3Opaque * buf,
  1031.    PRInt32            bytes,
  1032.    PRInt32            flags)
  1033. {
  1034.     ssl3CipherSpec *          cwSpec;
  1035.     sslBuffer      *          write    = &ss->sec->writeBuf;
  1036.     const ssl3BulkCipherDef * cipher_def;
  1037.     SECStatus                 rv;
  1038.     PRUint32                  bufSize     =  0;
  1039.     PRInt32                   sent        =  0;
  1040.     PRInt32                   cipherBytes = -1;
  1041.     PRBool                    isBlocking  = ssl_SocketIsBlocking(ss);
  1042.     PRBool                    ssl3WasNull = PR_FALSE;
  1043.     SSL_TRC(3, ("%d: SSL3[%d] SendRecord type: %s bytes=%d",
  1044. SSL_GETPID(), ss->fd, ssl3_DecodeContentType(type),
  1045. bytes));
  1046.     PRINT_BUF(3, (ss, "Send record (plain text)", buf, bytes));
  1047.     PORT_Assert( ssl_HaveXmitBufLock(ss) );
  1048.     if (ss->ssl3 == NULL) {
  1049. /* This can happen on a server if the very first incoming record
  1050. ** looks like a defective ssl3 record (e.g. too long), and we're
  1051. ** trying to send an alert.
  1052. */
  1053. ssl3WasNull = PR_TRUE;
  1054. PR_ASSERT(type == content_alert);
  1055. rv = ssl3_InitState(ss);
  1056. if (rv != SECSuccess) {
  1057.     return SECFailure; /* ssl3_InitState has set the error code. */
  1058.      }
  1059.     }
  1060.     while (bytes > 0) {
  1061.      PRInt32   count;
  1062. PRUint32  contentLen;
  1063. PRUint32  fragLen;
  1064. PRUint32  macLen;
  1065. contentLen = PR_MIN(bytes, MAX_FRAGMENT_LENGTH);
  1066. if (write->space < contentLen + SSL3_BUFFER_FUDGE) {
  1067.     rv = sslBuffer_Grow(write, contentLen + SSL3_BUFFER_FUDGE);
  1068.     if (rv != SECSuccess) {
  1069. SSL_DBG(("%d: SSL3[%d]: SendRecord, tried to get %d bytes",
  1070.  SSL_GETPID(), ss->fd, contentLen + SSL3_BUFFER_FUDGE));
  1071. return SECFailure; /* sslBuffer_Grow set a memory error code. */
  1072.     }
  1073. }
  1074. /* This variable records 
  1075.  * the actual size of the buffer we allocated above. Some
  1076.  * algorithms (FORTEZZA) will expand the number of bytes it needs to
  1077.  * send data. If we only supply the output buffer with the same number
  1078.  * of bytes as the input buffer, we will fail.
  1079.  */
  1080. bufSize = contentLen + SSL3_BUFFER_FUDGE;
  1081. /*
  1082.  * null compression is easy to do
  1083.  */
  1084. PORT_Memcpy(write->buf + SSL3_RECORD_HEADER_LENGTH, buf, contentLen);
  1085. buf   += contentLen;
  1086. bytes -= contentLen;
  1087. PORT_Assert( bytes >= 0 );
  1088. ssl_GetSpecReadLock(ss); /********************************/
  1089. cwSpec = ss->ssl3->cwSpec;
  1090. cipher_def = cwSpec->cipher_def;
  1091. /*
  1092.  * Add the MAC
  1093.  */
  1094. rv = ssl3_ComputeRecordMAC(
  1095.     cwSpec, (ss->sec->isServer) ? cwSpec->server.write_mac_context
  1096.                                 : cwSpec->client.write_mac_context,
  1097.     type, cwSpec->version, cwSpec->write_seq_num,
  1098.     write->buf + SSL3_RECORD_HEADER_LENGTH, contentLen,
  1099.     write->buf + contentLen + SSL3_RECORD_HEADER_LENGTH, &macLen);
  1100. if (rv != SECSuccess) {
  1101.     ssl_MapLowLevelError(SSL_ERROR_MAC_COMPUTATION_FAILURE);
  1102.     goto spec_locked_loser;
  1103. }
  1104. fragLen = contentLen + macLen; /* needs to be encrypted */
  1105. PORT_Assert(fragLen <= MAX_FRAGMENT_LENGTH + 1024);
  1106. /*
  1107.  * Pad the text (if we're doing a block cipher)
  1108.  * then Encrypt it
  1109.  */
  1110. if (cipher_def->type == type_block) {
  1111.     int             padding_length;
  1112.     int             i;
  1113.     unsigned char * pBuf;
  1114.     /* Assume blockSize is a power of two */
  1115.     padding_length = cipher_def->block_size - 1 -
  1116. ((fragLen) & (cipher_def->block_size - 1));
  1117.     fragLen += padding_length + 1;
  1118.     PORT_Assert((fragLen % cipher_def->block_size) == 0);
  1119.     /* Pad according to TLS rules (also acceptable to SSL3). */
  1120.     pBuf = &write->buf[fragLen + SSL3_RECORD_HEADER_LENGTH - 1];
  1121.     for (i = padding_length + 1; i > 0; --i) {
  1122.      *pBuf-- = padding_length;
  1123.     }
  1124. }
  1125. rv = cwSpec->encode(
  1126.     cwSpec->encodeContext, write->buf + SSL3_RECORD_HEADER_LENGTH,
  1127.     &cipherBytes, bufSize, write->buf + SSL3_RECORD_HEADER_LENGTH,
  1128.     fragLen);
  1129. if (rv != SECSuccess) {
  1130.     ssl_MapLowLevelError(SSL_ERROR_ENCRYPTION_FAILURE);
  1131. spec_locked_loser:
  1132.     ssl_ReleaseSpecReadLock(ss);
  1133.     return SECFailure;
  1134. }
  1135. PORT_Assert(cipherBytes <= MAX_FRAGMENT_LENGTH + 1024);
  1136. /*
  1137.  * XXX should we zero out our copy of the buffer after compressing
  1138.  * and encryption ??
  1139.  */
  1140. ssl3_BumpSequenceNumber(&cwSpec->write_seq_num);
  1141. ssl_ReleaseSpecReadLock(ss); /************************************/
  1142. /* PORT_Assert(fragLen == cipherBytes); */
  1143. write->len    = cipherBytes + SSL3_RECORD_HEADER_LENGTH;
  1144. write->buf[0] = type;
  1145. write->buf[1] = MSB(cwSpec->version);
  1146. write->buf[2] = LSB(cwSpec->version);
  1147. write->buf[3] = MSB(cipherBytes);
  1148. write->buf[4] = LSB(cipherBytes);
  1149. PRINT_BUF(50, (ss, "send (encrypted) record data:", write->buf, write->len));
  1150. /* If there's still some previously saved ciphertext,
  1151.  * or the caller doesn't want us to send the data yet,
  1152.  * then add all our new ciphertext to the amount previously saved.
  1153.  */
  1154. if ((ss->pendingBuf.len > 0) ||
  1155.     (flags & ssl_SEND_FLAG_FORCE_INTO_BUFFER)) {
  1156.     rv = ssl_SaveWriteData(ss, &ss->pendingBuf,
  1157.    write->buf, write->len);
  1158.     if (rv != SECSuccess) {
  1159. /* presumably a memory error, SEC_ERROR_NO_MEMORY */
  1160. return SECFailure;
  1161.     }
  1162.     write->len = 0; /* All cipher text is saved away. */
  1163.     if (!(flags & ssl_SEND_FLAG_FORCE_INTO_BUFFER)) {
  1164. count = ssl_SendSavedWriteData(ss, &ss->pendingBuf,
  1165.                                &ssl_DefSend);
  1166. if (count < 0 && PR_GetError() != PR_WOULD_BLOCK_ERROR) {
  1167.     ssl_MapLowLevelError(SSL_ERROR_SOCKET_WRITE_FAILURE);
  1168.     return SECFailure;
  1169. }
  1170.     }
  1171. } else if (write->len > 0) {
  1172.     count = ssl_DefSend(ss, write->buf, write->len,
  1173. flags & ~ssl_SEND_FLAG_MASK);
  1174.     if (count < 0) {
  1175. if (PR_GetError() != PR_WOULD_BLOCK_ERROR) {
  1176.     ssl_MapLowLevelError(SSL_ERROR_SOCKET_WRITE_FAILURE);
  1177.     return (sent > 0) ? sent : SECFailure;
  1178. }
  1179. /* we got PR_WOULD_BLOCK_ERROR, which means none was sent. */
  1180. count = 0;
  1181.     }
  1182.     /* now take all the remaining unsent newly-generated ciphertext and
  1183.      * append it to the buffer of previously unsent ciphertext.
  1184.      */
  1185.     if ((unsigned)count < write->len) {
  1186. rv = ssl_SaveWriteData(ss, &ss->pendingBuf,
  1187.        write->buf + (unsigned)count,
  1188.        write->len - (unsigned)count);
  1189. if (rv != SECSuccess) {
  1190.     /* presumably a memory error, SEC_ERROR_NO_MEMORY */
  1191.     return SECFailure;
  1192. }
  1193.     }
  1194.     write->len = 0;
  1195. }
  1196. sent += contentLen;
  1197. if ((flags & ssl_SEND_FLAG_NO_BUFFER) &&
  1198.     (isBlocking || (ss->pendingBuf.len > 0))) {
  1199.     break;
  1200. }
  1201.     }
  1202.     return sent;
  1203. }
  1204. /* Attempt to send the content of "in" in an SSL application_data record.
  1205.  * Returns "len" or SECFailure,   never SECWouldBlock, nor SECSuccess.
  1206.  */
  1207. int
  1208. ssl3_SendApplicationData(sslSocket *ss, const unsigned char *in,
  1209.  PRInt32 len, PRInt32 flags)
  1210. {
  1211.     PRInt32   sent = 0;
  1212.     PORT_Assert( ssl_HaveXmitBufLock(ss) );
  1213.     while (len > 0) {
  1214. PRInt32   count;
  1215. if (sent > 0) {
  1216.     ssl_ReleaseXmitBufLock(ss);
  1217.     PR_Sleep(PR_INTERVAL_NO_WAIT); /* PR_Yield(); */
  1218.     ssl_GetXmitBufLock(ss);
  1219. }
  1220. count = ssl3_SendRecord(ss, content_application_data, in, len,
  1221.                            flags | ssl_SEND_FLAG_NO_BUFFER);
  1222. if (count < 0) {
  1223.     return (sent > 0) ? sent : count;
  1224.     /* error code set by ssl3_SendRecord */
  1225. }
  1226. sent += count;
  1227. len  -= count;
  1228. in   += count;
  1229.     }
  1230.     return sent;
  1231. }
  1232. /* Attempt to send the content of sendBuf buffer in an SSL handshake record.
  1233.  * This function returns SECSuccess or SECFailure, never SECWouldBlock.
  1234.  * It used to always set sendBuf.len to 0, even when returning SECFailure.
  1235.  * Now it does not.
  1236.  *
  1237.  * Called from SSL3_SendAlert(), ssl3_SendChangeCipherSpecs(),
  1238.  *             ssl3_AppendHandshake(), ssl3_SendClientHello(),
  1239.  *             ssl3_SendHelloRequest(), ssl3_SendServerHelloDone(),
  1240.  *             ssl3_SendFinished(),
  1241.  */
  1242. static SECStatus
  1243. ssl3_FlushHandshake(sslSocket *ss, PRInt32 flags)
  1244. {
  1245.     PRInt32 rv;
  1246.     sslConnectInfo *ci;
  1247.     PORT_Assert(ss->sec != NULL);
  1248.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss));
  1249.     PORT_Assert( ssl_HaveXmitBufLock(ss) );
  1250.     ci = &ss->sec->ci;
  1251.     if (!ci->sendBuf.buf || !ci->sendBuf.len)
  1252. return SECSuccess;
  1253.     rv = ssl3_SendRecord(ss, content_handshake, ci->sendBuf.buf,
  1254.     ci->sendBuf.len, flags);
  1255.     if (rv < 0) {
  1256. return (SECStatus)rv; /* error code set by ssl3_SendRecord */
  1257.     }
  1258.     ci->sendBuf.len = 0;
  1259.     return SECSuccess;
  1260. }
  1261. /*
  1262.  * Called from ssl3_HandleAlert and from ssl3_HandleCertificates when
  1263.  * the remote client sends a negative response to our certificate request.
  1264.  * Returns SECFailure if the application has required client auth.
  1265.  *         SECSuccess otherwise.
  1266.  */
  1267. static SECStatus
  1268. ssl3_HandleNoCertificate(sslSocket *ss)
  1269. {
  1270.     if (ss->sec->peerCert != NULL) {
  1271. if (ss->sec->peerKey != NULL) {
  1272.     SECKEY_DestroyPublicKey(ss->sec->peerKey);
  1273.     ss->sec->peerKey = NULL;
  1274. }
  1275. CERT_DestroyCertificate(ss->sec->peerCert);
  1276. ss->sec->peerCert = NULL;
  1277.     }
  1278.     /* If the server has required client-auth blindly but doesn't
  1279.      * actually look at the certificate it won't know that no
  1280.      * certificate was presented so we shutdown the socket to ensure
  1281.      * an error.  We only do this if we aren't connected because
  1282.      * if we're redoing the handshake we know the server is paying
  1283.      * attention to the certificate.
  1284.      */
  1285.     if ((ss->requireCertificate == 1) ||
  1286. (!ss->connected && (ss->requireCertificate > 1))) {
  1287. PRFileDesc * lower;
  1288. ss->sec->uncache(ss->sec->ci.sid);
  1289. SSL3_SendAlert(ss, alert_fatal, bad_certificate);
  1290. lower = ss->fd->lower;
  1291. lower->methods->shutdown(lower, PR_SHUTDOWN_BOTH);
  1292. PORT_SetError(SSL_ERROR_NO_CERTIFICATE);
  1293. return SECFailure;
  1294.     }
  1295.     return SECSuccess;
  1296. }
  1297. /************************************************************************
  1298.  * Alerts
  1299.  */
  1300. /*
  1301. ** Acquires both handshake and XmitBuf locks.
  1302. ** Called from: ssl3_IllegalParameter <-
  1303. **              ssl3_HandshakeFailure <-
  1304. **              ssl3_HandleAlert <- ssl3_HandleRecord.
  1305. **              ssl3_HandleChangeCipherSpecs <- ssl3_HandleRecord
  1306. **              ssl3_ConsumeHandshakeVariable <-
  1307. **              ssl3_HandleHelloRequest <-
  1308. **              ssl3_HandleServerHello <-
  1309. **              ssl3_HandleServerKeyExchange <-
  1310. **              ssl3_HandleCertificateRequest <-
  1311. **              ssl3_HandleServerHelloDone <-
  1312. **              ssl3_HandleClientHello <-
  1313. **              ssl3_HandleV2ClientHello <-
  1314. **              ssl3_HandleCertificateVerify <-
  1315. **              ssl3_HandleFortezzaClientKeyExchange <-
  1316. **              ssl3_HandleClientKeyExchange <-
  1317. **              ssl3_HandleCertificate <-
  1318. **              ssl3_HandleFinished <-
  1319. **              ssl3_HandleHandshakeMessage <-
  1320. **              ssl3_HandleRecord <-
  1321. **
  1322. */
  1323. SECStatus
  1324. SSL3_SendAlert(sslSocket *ss, SSL3AlertLevel level, SSL3AlertDescription desc)
  1325. {
  1326.     uint8  bytes[2];
  1327.     SECStatus rv;
  1328.     SSL_TRC(3, ("%d: SSL3[%d]: send alert record, level=%d desc=%d",
  1329. SSL_GETPID(), ss->fd, level, desc));
  1330.     bytes[0] = level;
  1331.     bytes[1] = desc;
  1332.     ssl_GetSSL3HandshakeLock(ss);
  1333.     if (level == alert_fatal) {
  1334. if (ss->sec->ci.sid) {
  1335.     ss->sec->uncache(ss->sec->ci.sid);
  1336. }
  1337.     }
  1338.     ssl_GetXmitBufLock(ss);
  1339.     rv = ssl3_FlushHandshake(ss, ssl_SEND_FLAG_FORCE_INTO_BUFFER);
  1340.     if (rv == SECSuccess) {
  1341. PRInt32 sent;
  1342. sent = ssl3_SendRecord(ss, content_alert, bytes, 2, 0);
  1343. rv = (sent >= 0) ? SECSuccess : (SECStatus)sent;
  1344.     }
  1345.     ssl_ReleaseXmitBufLock(ss);
  1346.     ssl_ReleaseSSL3HandshakeLock(ss);
  1347.     return rv; /* error set by ssl3_FlushHandshake or ssl3_SendRecord */
  1348. }
  1349. /*
  1350.  * Send illegal_parameter alert.  Set generic error number.
  1351.  */
  1352. static SECStatus
  1353. ssl3_IllegalParameter(sslSocket *ss)
  1354. {
  1355.     PRBool isTLS;
  1356.     isTLS = (PRBool)(ss->ssl3->pwSpec->version > SSL_LIBRARY_VERSION_3_0);
  1357.     (void)SSL3_SendAlert(ss, alert_fatal, illegal_parameter);
  1358.     PORT_SetError(ss->sec->isServer ? SSL_ERROR_BAD_CLIENT
  1359.                                     : SSL_ERROR_BAD_SERVER );
  1360.     return SECFailure;
  1361. }
  1362. /*
  1363.  * Send handshake_Failure alert.  Set generic error number.
  1364.  */
  1365. static SECStatus
  1366. ssl3_HandshakeFailure(sslSocket *ss)
  1367. {
  1368.     (void)SSL3_SendAlert(ss, alert_fatal, handshake_failure);
  1369.     PORT_SetError( ss->sec->isServer ? SSL_ERROR_BAD_CLIENT
  1370.                                      : SSL_ERROR_BAD_SERVER );
  1371.     return SECFailure;
  1372. }
  1373. /*
  1374.  * Send handshake_Failure alert.  Set generic error number.
  1375.  */
  1376. static SECStatus
  1377. ssl3_DecodeError(sslSocket *ss)
  1378. {
  1379.     (void)SSL3_SendAlert(ss, alert_fatal, 
  1380.   ss->version > SSL_LIBRARY_VERSION_3_0 ? decode_error 
  1381. : illegal_parameter);
  1382.     PORT_SetError( ss->sec->isServer ? SSL_ERROR_BAD_CLIENT
  1383.                                      : SSL_ERROR_BAD_SERVER );
  1384.     return SECFailure;
  1385. }
  1386. /* Called from ssl3_HandleRecord.
  1387. ** Caller must hold both RecvBuf and Handshake locks.
  1388. */
  1389. static SECStatus
  1390. ssl3_HandleAlert(sslSocket *ss, sslBuffer *buf)
  1391. {
  1392.     SSL3AlertLevel       level;
  1393.     SSL3AlertDescription desc;
  1394.     int                  error;
  1395.     PORT_Assert( ssl_HaveRecvBufLock(ss) );
  1396.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  1397.     SSL_TRC(3, ("%d: SSL3[%d]: handle alert record", SSL_GETPID(), ss->fd));
  1398.     if (buf->len != 2) {
  1399. (void)ssl3_DecodeError(ss);
  1400. PORT_SetError(SSL_ERROR_RX_MALFORMED_ALERT);
  1401. return SECFailure;
  1402.     }
  1403.     level = (SSL3AlertLevel)buf->buf[0];
  1404.     desc  = (SSL3AlertDescription)buf->buf[1];
  1405.     buf->len = 0;
  1406.     SSL_TRC(5, ("%d: SSL3[%d] received alert, level = %d, description = %d",
  1407.         SSL_GETPID(), ss->fd, level, desc));
  1408.     switch (desc) {
  1409.     case close_notify: ss->recvdCloseNotify = 1;
  1410.          error = SSL_ERROR_CLOSE_NOTIFY_ALERT;     break;
  1411.     case unexpected_message:  error = SSL_ERROR_HANDSHAKE_UNEXPECTED_ALERT;
  1412.   break;
  1413.     case bad_record_mac:  error = SSL_ERROR_BAD_MAC_ALERT;    break;
  1414.     case decryption_failed:  error = SSL_ERROR_DECRYPTION_FAILED_ALERT; 
  1415.        break;
  1416.     case record_overflow:  error = SSL_ERROR_RECORD_OVERFLOW_ALERT;  break;
  1417.     case decompression_failure: error = SSL_ERROR_DECOMPRESSION_FAILURE_ALERT;
  1418.   break;
  1419.     case handshake_failure:  error = SSL_ERROR_HANDSHAKE_FAILURE_ALERT;
  1420.            break;
  1421.     case no_certificate:  error = SSL_ERROR_NO_CERTIFICATE;   break;
  1422.     case bad_certificate:  error = SSL_ERROR_BAD_CERT_ALERT;    break;
  1423.     case unsupported_certificate:error = SSL_ERROR_UNSUPPORTED_CERT_ALERT;break;
  1424.     case certificate_revoked:  error = SSL_ERROR_REVOKED_CERT_ALERT;    break;
  1425.     case certificate_expired:  error = SSL_ERROR_EXPIRED_CERT_ALERT;    break;
  1426.     case certificate_unknown:  error = SSL_ERROR_CERTIFICATE_UNKNOWN_ALERT;
  1427.            break;
  1428.     case illegal_parameter:  error = SSL_ERROR_ILLEGAL_PARAMETER_ALERT;break;
  1429.     /* All alerts below are TLS only. */
  1430.     case unknown_ca:  error = SSL_ERROR_UNKNOWN_CA_ALERT;       break;
  1431.     case access_denied:  error = SSL_ERROR_ACCESS_DENIED_ALERT;    break;
  1432.     case decode_error:  error = SSL_ERROR_DECODE_ERROR_ALERT;     break;
  1433.     case decrypt_error:  error = SSL_ERROR_DECRYPT_ERROR_ALERT;    break;
  1434.     case export_restriction:  error = SSL_ERROR_EXPORT_RESTRICTION_ALERT; 
  1435.        break;
  1436.     case protocol_version:  error = SSL_ERROR_PROTOCOL_VERSION_ALERT; break;
  1437.     case insufficient_security: error = SSL_ERROR_INSUFFICIENT_SECURITY_ALERT; 
  1438.        break;
  1439.     case internal_error:  error = SSL_ERROR_INTERNAL_ERROR_ALERT;   break;
  1440.     case user_canceled:  error = SSL_ERROR_USER_CANCELED_ALERT;    break;
  1441.     case no_renegotiation:  error = SSL_ERROR_NO_RENEGOTIATION_ALERT; break;
  1442.     default:  error = SSL_ERROR_RX_UNKNOWN_ALERT;    break;
  1443.     }
  1444.     if (level == alert_fatal) {
  1445. ss->sec->uncache(ss->sec->ci.sid);
  1446. if ((ss->ssl3->hs.ws == wait_server_hello) &&
  1447.     (desc == handshake_failure)) {
  1448.     /* XXX This is a hack.  We're assuming that any handshake failure
  1449.      * XXX on the client hello is a failure to match ciphers.
  1450.      */
  1451.     error = SSL_ERROR_NO_CYPHER_OVERLAP;
  1452. }
  1453. PORT_SetError(error);
  1454. return SECFailure;
  1455.     }
  1456.     if ((desc == no_certificate) && (ss->ssl3->hs.ws == wait_client_cert)) {
  1457.      /* I'm a server. I've requested a client cert. He hasn't got one. */
  1458. SECStatus rv;
  1459. PORT_Assert(ss->sec->isServer);
  1460. ss->ssl3->hs.ws = wait_client_key;
  1461. rv = ssl3_HandleNoCertificate(ss);
  1462. return rv;
  1463.     }
  1464.     return SECSuccess;
  1465. }
  1466. /*
  1467.  * Change Cipher Specs
  1468.  * Called from ssl3_HandleServerHelloDone,
  1469.  *             ssl3_HandleClientHello,
  1470.  * and         ssl3_HandleFinished
  1471.  *
  1472.  * Acquires and releases spec write lock, to protect switching the current
  1473.  * and pending write spec pointers.
  1474.  */
  1475. static SECStatus
  1476. ssl3_SendChangeCipherSpecs(sslSocket *ss)
  1477. {
  1478.     uint8             change = change_cipher_spec_choice;
  1479.     ssl3State *       ssl3   = ss->ssl3;
  1480.     ssl3CipherSpec *  pwSpec;
  1481.     SECStatus         rv;
  1482.     PRInt32           sent;
  1483.     SSL_TRC(3, ("%d: SSL3[%d]: send change_cipher_spec record",
  1484. SSL_GETPID(), ss->fd));
  1485.     PORT_Assert( ssl_HaveXmitBufLock(ss) );
  1486.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss));
  1487.     rv = ssl3_FlushHandshake(ss, ssl_SEND_FLAG_FORCE_INTO_BUFFER);
  1488.     if (rv != SECSuccess) {
  1489. return rv; /* error code set by ssl3_FlushHandshake */
  1490.     }
  1491.     sent = ssl3_SendRecord(ss, content_change_cipher_spec, &change, 1,
  1492.                               ssl_SEND_FLAG_FORCE_INTO_BUFFER);
  1493.     if (sent < 0) {
  1494. return (SECStatus)sent; /* error code set by ssl3_SendRecord */
  1495.     }
  1496.     /* swap the pending and current write specs. */
  1497.     ssl_GetSpecWriteLock(ss); /**************************************/
  1498.     pwSpec                     = ss->ssl3->pwSpec;
  1499.     pwSpec->write_seq_num.high = 0;
  1500.     pwSpec->write_seq_num.low  = 0;
  1501.     ssl3->pwSpec = ssl3->cwSpec;
  1502.     ssl3->cwSpec = pwSpec;
  1503.     SSL_TRC(3, ("%d: SSL3[%d] Set Current Write Cipher Suite to Pending",
  1504. SSL_GETPID(), ss->fd ));
  1505.     /* We need to free up the contexts, keys and certs ! */
  1506.     /* If we are really through with the old cipher spec
  1507.      * (Both the read and write sides have changed) destroy it.
  1508.      */
  1509.     if (ss->ssl3->prSpec == ss->ssl3->pwSpec) {
  1510.      ssl3_DestroyCipherSpec(ss->ssl3->pwSpec);
  1511.     }
  1512.     ssl_ReleaseSpecWriteLock(ss); /**************************************/
  1513.     return SECSuccess;
  1514. }
  1515. /* Called from ssl3_HandleRecord.
  1516. ** Caller must hold both RecvBuf and Handshake locks.
  1517.  *
  1518.  * Acquires and releases spec write lock, to protect switching the current
  1519.  * and pending write spec pointers.
  1520. */
  1521. static SECStatus
  1522. ssl3_HandleChangeCipherSpecs(sslSocket *ss, sslBuffer *buf)
  1523. {
  1524.     ssl3CipherSpec *           prSpec;
  1525.     SSL3WaitState              ws      = ss->ssl3->hs.ws;
  1526.     SSL3ChangeCipherSpecChoice change;
  1527.     PORT_Assert( ssl_HaveRecvBufLock(ss) );
  1528.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  1529.     SSL_TRC(3, ("%d: SSL3[%d]: handle change_cipher_spec record",
  1530. SSL_GETPID(), ss->fd));
  1531.     if (ws != wait_change_cipher && ws != wait_cert_verify) {
  1532. (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message);
  1533. PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CHANGE_CIPHER);
  1534. return SECFailure;
  1535.     }
  1536.     if(buf->len != 1) {
  1537. (void)ssl3_DecodeError(ss);
  1538. PORT_SetError(SSL_ERROR_RX_MALFORMED_CHANGE_CIPHER);
  1539. return SECFailure;
  1540.     }
  1541.     change = (SSL3ChangeCipherSpecChoice)buf->buf[0];
  1542.     if (change != change_cipher_spec_choice) {
  1543. /* illegal_parameter is correct here for both SSL3 and TLS. */
  1544. (void)ssl3_IllegalParameter(ss);
  1545. PORT_SetError(SSL_ERROR_RX_MALFORMED_CHANGE_CIPHER);
  1546. return SECFailure;
  1547.     }
  1548.     buf->len = 0;
  1549.     /* Swap the pending and current read specs. */
  1550.     ssl_GetSpecWriteLock(ss);   /*************************************/
  1551.     prSpec                    = ss->ssl3->prSpec;
  1552.     prSpec->read_seq_num.high = prSpec->read_seq_num.low = 0;
  1553.     ss->ssl3->prSpec  = ss->ssl3->crSpec;
  1554.     ss->ssl3->crSpec  = prSpec;
  1555.     ss->ssl3->hs.ws         = wait_finished;
  1556.     SSL_TRC(3, ("%d: SSL3[%d] Set Current Read Cipher Suite to Pending",
  1557. SSL_GETPID(), ss->fd ));
  1558.     /* If we are really through with the old cipher prSpec
  1559.      * (Both the read and write sides have changed) destroy it.
  1560.      */
  1561.     if (ss->ssl3->prSpec == ss->ssl3->pwSpec) {
  1562.      ssl3_DestroyCipherSpec(ss->ssl3->prSpec);
  1563.     }
  1564.     ssl_ReleaseSpecWriteLock(ss);   /*************************************/
  1565.     return SECSuccess;
  1566. }
  1567. /*
  1568.  * Key generation given pre master secret, or master secret (if !pms).
  1569.  * Sets a useful error code when returning SECFailure.
  1570.  *
  1571.  * Called only from ssl3_InitPendingCipherSpec(),
  1572.  *
  1573.  * which in turn is called from
  1574.  *              ssl3_SendClientKeyExchange      (for Full handshake)
  1575.  *              ssl3_HandleClientKeyExchange    (for Full handshake)
  1576.  *              ssl3_HandleServerHello          (for session restart)
  1577.  *              ssl3_HandleClientHello          (for session restart)
  1578.  * Caller MUST hold the specWriteLock, and SSL3HandshakeLock.
  1579.  * ssl3_InitPendingCipherSpec does that.
  1580.  */
  1581. static SECStatus
  1582. ssl3_GenerateSessionKeys(sslSocket *ss, const PK11SymKey *pms)
  1583. {
  1584.     ssl3CipherSpec *         pwSpec     = ss->ssl3->pwSpec;
  1585.     const ssl3BulkCipherDef *cipher_def = pwSpec->cipher_def;
  1586.     const ssl3KEADef *       kea_def    = ss->ssl3->hs.kea_def;
  1587.     unsigned char *   cr     = (unsigned char *)&ss->ssl3->hs.client_random;
  1588.     unsigned char *   sr     = (unsigned char *)&ss->ssl3->hs.server_random;
  1589.     PK11SymKey *      symKey = NULL;
  1590.     PK11SlotInfo *    slot   = NULL;
  1591.     void *            pwArg  = ss->pkcs11PinArg;
  1592.     PRBool            isTLS  = (PRBool)(kea_def->tls_keygen ||
  1593.                                 (pwSpec->version > SSL_LIBRARY_VERSION_3_0));
  1594.     PRBool            skipKeysAndIVs = (PRBool)
  1595.      ((cipher_def->calg == calg_fortezza) ||
  1596.  (cipher_def->calg == calg_null));
  1597.     CK_MECHANISM_TYPE master_derive;
  1598.     CK_MECHANISM_TYPE key_derive;
  1599.     CK_MECHANISM_TYPE bulk_mechanism;
  1600.     SECItem           params;
  1601.     int               keySize;
  1602.     CK_FLAGS          keyFlags;
  1603.     CK_VERSION        pms_version;
  1604.     CK_SSL3_KEY_MAT_PARAMS key_material_params;
  1605.     CK_SSL3_KEY_MAT_OUT    returnedKeys;
  1606.     CK_SSL3_MASTER_KEY_DERIVE_PARAMS master_params;
  1607.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss));
  1608.     PORT_Assert( ssl_HaveSpecWriteLock(ss));
  1609.     PORT_Assert(ss->ssl3->prSpec == ss->ssl3->pwSpec);
  1610.     if (isTLS) {
  1611. master_derive = CKM_TLS_MASTER_KEY_DERIVE;
  1612. key_derive    = CKM_TLS_KEY_AND_MAC_DERIVE;
  1613. keyFlags      = CKF_SIGN | CKF_VERIFY;
  1614.     } else {
  1615. master_derive = CKM_SSL3_MASTER_KEY_DERIVE;
  1616. key_derive    = CKM_SSL3_KEY_AND_MAC_DERIVE;
  1617. keyFlags      = 0;
  1618.     }
  1619.     if (pms || !pwSpec->master_secret) {
  1620. master_params.pVersion                     = &pms_version;
  1621. master_params.RandomInfo.pClientRandom     = cr;
  1622. master_params.RandomInfo.ulClientRandomLen = SSL3_RANDOM_LENGTH;
  1623. master_params.RandomInfo.pServerRandom     = sr;
  1624. master_params.RandomInfo.ulServerRandomLen = SSL3_RANDOM_LENGTH;
  1625. params.data = (unsigned char *) &master_params;
  1626. params.len  = sizeof master_params;
  1627.     }
  1628.     if (pms != NULL) {
  1629. pwSpec->master_secret = PK11_DeriveWithFlags((PK11SymKey *)pms, 
  1630. master_derive, &params, key_derive, 
  1631. CKA_DERIVE, 0, keyFlags);
  1632. if (pwSpec->master_secret != NULL && ss->detectRollBack) {
  1633.     SSL3ProtocolVersion client_version;
  1634.     client_version = pms_version.major << 8 | pms_version.minor;
  1635.     if (client_version != ss->clientHelloVersion) {
  1636. /* Destroy it.  Version roll-back detected. */
  1637. PK11_FreeSymKey(pwSpec->master_secret);
  1638.      pwSpec->master_secret = NULL;
  1639.     }
  1640. }
  1641. if (pwSpec->master_secret == NULL) {
  1642.     /* Generate a faux master secret in the same slot as the old one. */
  1643.     PK11SlotInfo * slot = PK11_GetSlotFromKey((PK11SymKey *)pms);
  1644.     PK11SymKey *   fpms = ssl3_GenerateRSAPMS(ss, pwSpec, slot);
  1645.     PK11_FreeSlot(slot);
  1646.     if (fpms != NULL) {
  1647. pwSpec->master_secret = PK11_DeriveWithFlags(fpms, 
  1648. master_derive, &params, key_derive, 
  1649. CKA_DERIVE, 0, keyFlags);
  1650. PK11_FreeSymKey(fpms);
  1651.     }
  1652. }
  1653.     }
  1654.     if (pwSpec->master_secret == NULL) {
  1655. /* Generate a faux master secret from the internal slot. */
  1656. PK11SlotInfo *  slot = PK11_GetInternalSlot();
  1657. PK11SymKey *    fpms = ssl3_GenerateRSAPMS(ss, pwSpec, slot);
  1658. PK11_FreeSlot(slot);
  1659. if (fpms != NULL) {
  1660.     pwSpec->master_secret = PK11_DeriveWithFlags(fpms, 
  1661. master_derive, &params, key_derive, 
  1662. CKA_DERIVE, 0, keyFlags);
  1663.     if (pwSpec->master_secret == NULL) {
  1664.      pwSpec->master_secret = fpms; /* use the fpms as the master. */
  1665. fpms = NULL;
  1666.     }
  1667. }
  1668. if (fpms) {
  1669.     PK11_FreeSymKey(fpms);
  1670.      }
  1671.     }
  1672.     if (pwSpec->master_secret == NULL) {
  1673. ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE);
  1674. return SECFailure;
  1675.     }
  1676.     /*
  1677.      * generate the key material
  1678.      */
  1679.     key_material_params.ulMacSizeInBits = pwSpec->mac_size           * BPB;
  1680.     key_material_params.ulKeySizeInBits = cipher_def->secret_key_size* BPB;
  1681.     key_material_params.ulIVSizeInBits  = cipher_def->iv_size        * BPB;
  1682.     key_material_params.bIsExport = (CK_BBOOL)(kea_def->is_limited);
  1683.     /* was: (CK_BBOOL)(cipher_def->keygen_mode != kg_strong); */
  1684.     key_material_params.RandomInfo.pClientRandom     = cr;
  1685.     key_material_params.RandomInfo.ulClientRandomLen = SSL3_RANDOM_LENGTH;
  1686.     key_material_params.RandomInfo.pServerRandom     = sr;
  1687.     key_material_params.RandomInfo.ulServerRandomLen = SSL3_RANDOM_LENGTH;
  1688.     key_material_params.pReturnedKeyMaterial         = &returnedKeys;
  1689.     returnedKeys.pIVClient = pwSpec->client.write_iv;
  1690.     returnedKeys.pIVServer = pwSpec->server.write_iv;
  1691.     keySize                = cipher_def->key_size;
  1692.     if (skipKeysAndIVs) {
  1693. keySize                             = 0;
  1694.         key_material_params.ulKeySizeInBits = 0;
  1695.         key_material_params.ulIVSizeInBits  = 0;
  1696.      returnedKeys.pIVClient              = NULL;
  1697.      returnedKeys.pIVServer              = NULL;
  1698.     }
  1699.     bulk_mechanism = (CK_MECHANISM_TYPE) cipher_def->calg;
  1700.     params.data    = (unsigned char *)&key_material_params;
  1701.     params.len     = sizeof(key_material_params);
  1702.     /* CKM_SSL3_KEY_AND_MAC_DERIVE is defined to set ENCRYPT, DECRYPT, and
  1703.      * DERIVE by DEFAULT */
  1704.     symKey = PK11_Derive(pwSpec->master_secret, key_derive, &params,
  1705.                          bulk_mechanism, CKA_ENCRYPT, keySize);
  1706.     if (!symKey) {
  1707. ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE);
  1708. return SECFailure;
  1709.     }
  1710.     /* we really should use the actual mac'ing mechanism here, but we
  1711.      * don't because these types are used to map keytype anyway and both
  1712.      * mac's map to the same keytype.
  1713.      */
  1714.     slot  = PK11_GetSlotFromKey(symKey);
  1715.     PK11_FreeSlot(slot); /* slot is held until the key is freed */
  1716.     pwSpec->client.write_mac_key =
  1717.      PK11_SymKeyFromHandle(slot, symKey, PK11_OriginDerive,
  1718.     CKM_SSL3_SHA1_MAC, returnedKeys.hClientMacSecret, PR_TRUE, pwArg);
  1719.     if (pwSpec->client.write_mac_key == NULL ) {
  1720. goto loser; /* loser sets err */
  1721.     }
  1722.     pwSpec->server.write_mac_key =
  1723.      PK11_SymKeyFromHandle(slot, symKey, PK11_OriginDerive,
  1724.     CKM_SSL3_SHA1_MAC, returnedKeys.hServerMacSecret, PR_TRUE, pwArg);
  1725.     if (pwSpec->server.write_mac_key == NULL ) {
  1726. goto loser; /* loser sets err */
  1727.     }
  1728.     if (!skipKeysAndIVs) {
  1729. pwSpec->client.write_key =
  1730. PK11_SymKeyFromHandle(slot, symKey, PK11_OriginDerive,
  1731.      bulk_mechanism, returnedKeys.hClientKey, PR_TRUE, pwArg);
  1732. if (pwSpec->client.write_key == NULL ) {
  1733.     goto loser; /* loser sets err */
  1734. }
  1735. pwSpec->server.write_key =
  1736. PK11_SymKeyFromHandle(slot, symKey, PK11_OriginDerive,
  1737.      bulk_mechanism, returnedKeys.hServerKey, PR_TRUE, pwArg);
  1738. if (pwSpec->server.write_key == NULL ) {
  1739.     goto loser; /* loser sets err */
  1740. }
  1741.     }
  1742.     PK11_FreeSymKey(symKey);
  1743.     return SECSuccess;
  1744. loser:
  1745.     if (symKey) PK11_FreeSymKey(symKey);
  1746.     ssl_MapLowLevelError(SSL_ERROR_SESSION_KEY_GEN_FAILURE);
  1747.     return SECFailure;
  1748. }
  1749. /*
  1750.  * Handshake messages
  1751.  */
  1752. /* Called from ssl3_AppendHandshake()
  1753. ** ssl3_StartHandshakeHash()
  1754. ** ssl3_HandleV2ClientHello()
  1755. ** ssl3_HandleHandshakeMessage()
  1756. ** Caller must hold the ssl3Handshake lock.
  1757. */
  1758. static SECStatus
  1759. ssl3_UpdateHandshakeHashes(sslSocket *ss, unsigned char *b, unsigned int l)
  1760. {
  1761.     ssl3State *ssl3 = ss->ssl3;
  1762.     SECStatus  rv;
  1763.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  1764.     PRINT_BUF(90, (NULL, "MD5 & SHA handshake hash input:", b, l));
  1765.     rv = PK11_DigestOp(ssl3->hs.md5, b, l);
  1766.     if (rv != SECSuccess) {
  1767. ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE);
  1768. return rv;
  1769.     }
  1770.     rv = PK11_DigestOp(ssl3->hs.sha, b, l);
  1771.     if (rv != SECSuccess) {
  1772. ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
  1773. return rv;
  1774.     }
  1775.     return rv;
  1776. }
  1777. /**************************************************************************
  1778.  * Append Handshake functions.
  1779.  * All these functions set appropriate error codes.
  1780.  * Most rely on ssl3_AppendHandshake to set the error code.
  1781.  **************************************************************************/
  1782. static SECStatus
  1783. ssl3_AppendHandshake(sslSocket *ss, const void *void_src, PRInt32 bytes)
  1784. {
  1785.     sslConnectInfo * ci   = &ss->sec->ci;
  1786.     unsigned char *  src  = (unsigned char *)void_src;
  1787.     int              room = ci->sendBuf.space - ci->sendBuf.len;
  1788.     SECStatus        rv;
  1789.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) ); /* protects sendBuf. */
  1790.     if (ci->sendBuf.space < MAX_SEND_BUF_LENGTH && room < bytes) {
  1791. rv = sslBuffer_Grow(&ci->sendBuf, PR_MAX(MIN_SEND_BUF_LENGTH,
  1792.  PR_MIN(MAX_SEND_BUF_LENGTH,
  1793. ci->sendBuf.len + bytes)));
  1794. if (rv != SECSuccess)
  1795.     return rv; /* sslBuffer_Grow has set a memory error code. */
  1796. room = ci->sendBuf.space - ci->sendBuf.len;
  1797.     }
  1798.     PRINT_BUF(60, (ss, "Append to Handshake", (unsigned char*)void_src, bytes));
  1799.     rv = ssl3_UpdateHandshakeHashes(ss, src, bytes);
  1800.     if (rv != SECSuccess)
  1801. return rv; /* error code set by ssl3_UpdateHandshakeHashes */
  1802.     while (bytes > room) {
  1803. if (room > 0)
  1804.     PORT_Memcpy(ci->sendBuf.buf + ci->sendBuf.len, src, room);
  1805. ci->sendBuf.len += room;
  1806. rv = ssl3_FlushHandshake(ss, ssl_SEND_FLAG_FORCE_INTO_BUFFER);
  1807. if (rv != SECSuccess) {
  1808.     return rv; /* error code set by ssl3_FlushHandshake */
  1809. }
  1810. bytes -= room;
  1811. src += room;
  1812. room = ci->sendBuf.space;
  1813. PORT_Assert(ci->sendBuf.len == 0);
  1814.     }
  1815.     PORT_Memcpy(ci->sendBuf.buf + ci->sendBuf.len, src, bytes);
  1816.     ci->sendBuf.len += bytes;
  1817.     return SECSuccess;
  1818. }
  1819. static SECStatus
  1820. ssl3_AppendHandshakeNumber(sslSocket *ss, PRInt32 num, PRInt32 lenSize)
  1821. {
  1822.     SECStatus rv;
  1823.     uint8     b[4];
  1824.     uint8 *   p = b;
  1825.     switch (lenSize) {
  1826.       case 4:
  1827. *p++ = (num >> 24) & 0xff;
  1828.       case 3:
  1829. *p++ = (num >> 16) & 0xff;
  1830.       case 2:
  1831. *p++ = (num >> 8) & 0xff;
  1832.       case 1:
  1833. *p = num & 0xff;
  1834.     }
  1835.     SSL_TRC(60, ("%d: number:", SSL_GETPID()));
  1836.     rv = ssl3_AppendHandshake(ss, &b[0], lenSize);
  1837.     return rv; /* error code set by AppendHandshake, if applicable. */
  1838. }
  1839. static SECStatus
  1840. ssl3_AppendHandshakeVariable(
  1841.     sslSocket *ss, const SSL3Opaque *src, PRInt32 bytes, PRInt32 lenSize)
  1842. {
  1843.     SECStatus rv;
  1844.     PORT_Assert((bytes < (1<<8) && lenSize == 1) ||
  1845.       (bytes < (1L<<16) && lenSize == 2) ||
  1846.       (bytes < (1L<<24) && lenSize == 3));
  1847.     SSL_TRC(60,("%d: append variable:", SSL_GETPID()));
  1848.     rv = ssl3_AppendHandshakeNumber(ss, bytes, lenSize);
  1849.     if (rv != SECSuccess) {
  1850. return rv; /* error code set by AppendHandshake, if applicable. */
  1851.     }
  1852.     SSL_TRC(60, ("data:"));
  1853.     rv = ssl3_AppendHandshake(ss, src, bytes);
  1854.     return rv; /* error code set by AppendHandshake, if applicable. */
  1855. }
  1856. static SECStatus
  1857. ssl3_AppendHandshakeHeader(sslSocket *ss, SSL3HandshakeType t, PRUint32 length)
  1858. {
  1859.     SECStatus rv;
  1860.     SSL_TRC(30,("%d: SSL3[%d]: append handshake header: type %s",
  1861.      SSL_GETPID(), ss->fd, ssl3_DecodeHandshakeType(t)));
  1862.     PRINT_BUF(60, (ss, "MD5 handshake hash:",
  1863.                (unsigned char*)ss->ssl3->hs.md5, MD5_LENGTH));
  1864.     PRINT_BUF(95, (ss, "SHA handshake hash:",
  1865.                (unsigned char*)ss->ssl3->hs.sha, SHA1_LENGTH));
  1866.     rv = ssl3_AppendHandshakeNumber(ss, t, 1);
  1867.     if (rv != SECSuccess) {
  1868.      return rv; /* error code set by AppendHandshake, if applicable. */
  1869.     }
  1870.     rv = ssl3_AppendHandshakeNumber(ss, length, 3);
  1871.     return rv; /* error code set by AppendHandshake, if applicable. */
  1872. }
  1873. /**************************************************************************
  1874.  * Consume Handshake functions.
  1875.  *
  1876.  * All data used in these functions is protected by two locks,
  1877.  * the RecvBufLock and the SSL3HandshakeLock
  1878.  **************************************************************************/
  1879. /* Read up the next "bytes" number of bytes from the (decrypted) input
  1880.  * stream "b" (which is *length bytes long). Copy them into buffer "v".
  1881.  * Reduces *length by bytes.  Advances *b by bytes.
  1882.  *
  1883.  * If this function returns SECFailure, it has already sent an alert,
  1884.  * and has set a generic error code.  The caller should probably
  1885.  * override the generic error code by setting another.
  1886.  */
  1887. static SECStatus
  1888. ssl3_ConsumeHandshake(sslSocket *ss, void *v, PRInt32 bytes, SSL3Opaque **b,
  1889.       PRUint32 *length)
  1890. {
  1891.     PORT_Assert( ssl_HaveRecvBufLock(ss) );
  1892.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  1893.     if (bytes > *length) {
  1894. return ssl3_DecodeError(ss);
  1895.     }
  1896.     PORT_Memcpy(v, *b, bytes);
  1897.     PRINT_BUF(60, (ss, "consume bytes:", *b, bytes));
  1898.     *b      += bytes;
  1899.     *length -= bytes;
  1900.     return SECSuccess;
  1901. }
  1902. /* Read up the next "bytes" number of bytes from the (decrypted) input
  1903.  * stream "b" (which is *length bytes long), and interpret them as an
  1904.  * integer in network byte order.  Returns the received value.
  1905.  * Reduces *length by bytes.  Advances *b by bytes.
  1906.  *
  1907.  * Returns SECFailure (-1) on failure.
  1908.  * This value is indistinguishable from the equivalent received value.
  1909.  * Only positive numbers are to be received this way.
  1910.  * Thus, the largest value that may be sent this way is 0x7fffffff.
  1911.  * On error, an alert has been sent, and a generic error code has been set.
  1912.  */
  1913. static PRInt32
  1914. ssl3_ConsumeHandshakeNumber(sslSocket *ss, PRInt32 bytes, SSL3Opaque **b,
  1915.     PRUint32 *length)
  1916. {
  1917.     PRInt32   num = 0;
  1918.     int       i;
  1919.     SECStatus status;
  1920.     uint8     buf[4];
  1921.     status = ssl3_ConsumeHandshake(ss, buf, bytes, b, length);
  1922.     if (status != SECSuccess) {
  1923. /* ssl3_DecodeError has already been called */
  1924. return SECFailure;
  1925.     }
  1926.     for (i = 0; i < bytes; i++)
  1927. num = (num << 8) + buf[i];
  1928.     return num;
  1929. }
  1930. /* Read in two values from the incoming decrypted byte stream "b", which is
  1931.  * *length bytes long.  The first value is a number whose size is "bytes"
  1932.  * bytes long.  The second value is a byte-string whose size is the value
  1933.  * of the first number received.  The latter byte-string, and its length,
  1934.  * is returned in the SECItem i.
  1935.  *
  1936.  * Returns SECFailure (-1) on failure.
  1937.  * On error, an alert has been sent, and a generic error code has been set.
  1938.  */
  1939. static SECStatus
  1940. ssl3_ConsumeHandshakeVariable(sslSocket *ss, SECItem *i, PRInt32 bytes,
  1941.       SSL3Opaque **b, PRUint32 *length)
  1942. {
  1943.     PRInt32   count;
  1944.     SECStatus rv;
  1945.     PORT_Assert(bytes <= 3);
  1946.     i->len  = 0;
  1947.     i->data = NULL;
  1948.     count = ssl3_ConsumeHandshakeNumber(ss, bytes, b, length);
  1949.     if (count < 0) {  /* Can't test for SECSuccess here. */
  1950.      return SECFailure;
  1951.     }
  1952.     if (count > 0) {
  1953. i->data = (unsigned char*)PORT_Alloc(count);
  1954. if (i->data == NULL) {
  1955.     /* XXX inconsistent.  In other places, we don't send alerts for
  1956.      * our own memory failures.  But here we do... */
  1957.     (void)SSL3_SendAlert(ss, alert_fatal, handshake_failure);
  1958.     PORT_SetError(SEC_ERROR_NO_MEMORY);
  1959.     return SECFailure;
  1960. }
  1961. i->len = count;
  1962. rv = ssl3_ConsumeHandshake(ss, i->data, i->len, b, length);
  1963. if (rv != SECSuccess) {
  1964.     PORT_Free(i->data);
  1965.     i->data = NULL;
  1966.     return rv; /* alert has already been sent. */
  1967. }
  1968.     }
  1969.     return SECSuccess;
  1970. }
  1971. /**************************************************************************
  1972.  * end of Consume Handshake functions.
  1973.  **************************************************************************/
  1974. /* Extract the hashes of handshake messages to this point.
  1975.  * Called from ssl3_SendCertificateVerify
  1976.  *             ssl3_SendFinished
  1977.  *             ssl3_HandleHandshakeMessage
  1978.  *
  1979.  * Caller must hold the SSL3HandshakeLock.
  1980.  * Caller must hold a read or write lock on the Spec R/W lock.
  1981.  * (There is presently no way to assert on a Read lock.)
  1982.  */
  1983. static SECStatus
  1984. ssl3_ComputeHandshakeHashes(sslSocket *     ss,
  1985.                             ssl3CipherSpec *spec,   /* uses ->master_secret */
  1986.     SSL3Hashes *    hashes, /* output goes here. */
  1987.     uint32          sender)
  1988. {
  1989.     ssl3State *   ssl3      = ss->ssl3;
  1990.     PK11Context * md5;
  1991.     PK11Context * sha       = NULL;
  1992.     SECStatus     rv        = SECSuccess;
  1993.     unsigned int  outLength;
  1994.     PRBool        isTLS;
  1995.     SSL3Opaque    md5_inner[MAX_MAC_LENGTH];
  1996.     SSL3Opaque    sha_inner[MAX_MAC_LENGTH];
  1997.     unsigned char s[4];
  1998.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  1999.     isTLS = (PRBool)(spec->version > SSL_LIBRARY_VERSION_3_0);
  2000.     md5 = PK11_CloneContext(ssl3->hs.md5);
  2001.     if (md5 == NULL) {
  2002. ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE);
  2003.      return SECFailure;
  2004.     }
  2005.     sha = PK11_CloneContext(ssl3->hs.sha);
  2006.     if (sha == NULL) {
  2007. ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
  2008. goto loser;
  2009.     }
  2010.     if (!isTLS) {
  2011. /* compute hashes for SSL3. */
  2012. s[0] = (unsigned char)(sender >> 24);
  2013. s[1] = (unsigned char)(sender >> 16);
  2014. s[2] = (unsigned char)(sender >> 8);
  2015. s[3] = (unsigned char)sender;
  2016. if (sender != 0) {
  2017.     rv |= PK11_DigestOp(md5, s, 4);
  2018.     PRINT_BUF(95, (NULL, "MD5 inner: sender", s, 4));
  2019. }
  2020. PRINT_BUF(95, (NULL, "MD5 inner: MAC Pad 1", mac_pad_1, mac_defs[mac_md5].pad_size));
  2021. rv |= PK11_DigestKey(md5,spec->master_secret);
  2022. rv |= PK11_DigestOp(md5, mac_pad_1, mac_defs[mac_md5].pad_size);
  2023. rv |= PK11_DigestFinal(md5, md5_inner, &outLength, MD5_LENGTH);
  2024. PORT_Assert(rv != SECSuccess || outLength == MD5_LENGTH);
  2025. if (rv != SECSuccess) {
  2026.     ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE);
  2027.     rv = SECFailure;
  2028.     goto loser;
  2029. }
  2030. PRINT_BUF(95, (NULL, "MD5 inner: result", md5_inner, outLength));
  2031. if (sender != 0) {
  2032.     rv |= PK11_DigestOp(sha, s, 4);
  2033.     PRINT_BUF(95, (NULL, "SHA inner: sender", s, 4));
  2034. }
  2035. PRINT_BUF(95, (NULL, "SHA inner: MAC Pad 1", mac_pad_1, mac_defs[mac_sha].pad_size));
  2036. rv |= PK11_DigestKey(sha, spec->master_secret);
  2037. rv |= PK11_DigestOp(sha, mac_pad_1, mac_defs[mac_sha].pad_size);
  2038. rv |= PK11_DigestFinal(sha, sha_inner, &outLength, SHA1_LENGTH);
  2039. PORT_Assert(rv != SECSuccess || outLength == SHA1_LENGTH);
  2040. if (rv != SECSuccess) {
  2041.     ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
  2042.     rv = SECFailure;
  2043.     goto loser;
  2044. }
  2045. PRINT_BUF(95, (NULL, "SHA inner: result", sha_inner, outLength));
  2046. PRINT_BUF(95, (NULL, "MD5 outer: MAC Pad 2", mac_pad_2, mac_defs[mac_md5].pad_size));
  2047. PRINT_BUF(95, (NULL, "MD5 outer: MD5 inner", md5_inner, MD5_LENGTH));
  2048. rv |= PK11_DigestBegin(md5);
  2049. rv |= PK11_DigestKey(md5, spec->master_secret);
  2050. rv |= PK11_DigestOp(md5, mac_pad_2, mac_defs[mac_md5].pad_size);
  2051. rv |= PK11_DigestOp(md5, md5_inner, MD5_LENGTH);
  2052.     }
  2053.     rv |= PK11_DigestFinal(md5, hashes->md5, &outLength, MD5_LENGTH);
  2054.     PORT_Assert(rv != SECSuccess || outLength == MD5_LENGTH);
  2055.     if (rv != SECSuccess) {
  2056. ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE);
  2057. rv = SECFailure;
  2058. goto loser;
  2059.     }
  2060.     PRINT_BUF(60, (NULL, "MD5 outer: result", hashes->md5, MD5_LENGTH));
  2061.     if (!isTLS) {
  2062. PRINT_BUF(95, (NULL, "SHA outer: MAC Pad 2", mac_pad_2, mac_defs[mac_sha].pad_size));
  2063. PRINT_BUF(95, (NULL, "SHA outer: SHA inner", sha_inner, SHA1_LENGTH));
  2064. rv |= PK11_DigestBegin(sha);
  2065. rv |= PK11_DigestKey(sha,spec->master_secret);
  2066. rv |= PK11_DigestOp(sha, mac_pad_2, mac_defs[mac_sha].pad_size);
  2067. rv |= PK11_DigestOp(sha, sha_inner, SHA1_LENGTH);
  2068.     }
  2069.     rv |= PK11_DigestFinal(sha, hashes->sha, &outLength, SHA1_LENGTH);
  2070.     PORT_Assert(rv != SECSuccess || outLength == SHA1_LENGTH);
  2071.     if (rv != SECSuccess) {
  2072. ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
  2073. rv = SECFailure;
  2074. goto loser;
  2075.     }
  2076.     PRINT_BUF(60, (NULL, "SHA outer: result", hashes->sha, SHA1_LENGTH));
  2077.     rv = SECSuccess;
  2078. loser:
  2079.     if (md5) PK11_DestroyContext(md5, PR_TRUE);
  2080.     if (sha) PK11_DestroyContext(sha, PR_TRUE);
  2081.     return rv;
  2082. }
  2083. /*
  2084.  * SSL 2 based implementations pass in the initial outbound buffer
  2085.  * so that the handshake hash can contain the included information.
  2086.  *
  2087.  * Called from ssl2_BeginClientHandshake() in sslcon.c
  2088.  */
  2089. SECStatus
  2090. ssl3_StartHandshakeHash(sslSocket *ss, unsigned char * buf, int length)
  2091. {
  2092.     SECStatus rv;
  2093.     ssl_GetSSL3HandshakeLock(ss);  /**************************************/
  2094.     rv = ssl3_InitState(ss);
  2095.     if (rv != SECSuccess) {
  2096. goto done; /* ssl3_InitState has set the error code. */
  2097.     }
  2098.     PORT_Memset(&ss->ssl3->hs.client_random, 0, SSL3_RANDOM_LENGTH);
  2099.     PORT_Memcpy(
  2100. &ss->ssl3->hs.client_random.rand[SSL3_RANDOM_LENGTH - SSL_CHALLENGE_BYTES],
  2101. &ss->sec->ci.clientChallenge,
  2102. SSL_CHALLENGE_BYTES);
  2103.     rv = ssl3_UpdateHandshakeHashes(ss, buf, length);
  2104.     /* if it failed, ssl3_UpdateHandshakeHashes has set the error code. */
  2105. done:
  2106.     ssl_ReleaseSSL3HandshakeLock(ss);  /**************************************/
  2107.     return rv;
  2108. }
  2109. /**************************************************************************
  2110.  * end of Handshake Hash functions.
  2111.  * Begin Send and Handle functions for handshakes.
  2112.  **************************************************************************/
  2113. /* Called from ssl3_HandleHelloRequest(),
  2114.  *             ssl3_HandleFinished() (for step-up)
  2115.  *             ssl3_RedoHandshake()
  2116.  *             ssl2_BeginClientHandshake (when resuming ssl3 session)
  2117.  */
  2118. SECStatus
  2119. ssl3_SendClientHello(sslSocket *ss)
  2120. {
  2121.     sslSecurityInfo *sec = ss->sec;
  2122.     sslSessionID *   sid;
  2123.     SECStatus        rv;
  2124.     int              i;
  2125.     int              length;
  2126.     int              num_suites;
  2127.     int              actual_count = 0;
  2128.     SSL_TRC(3, ("%d: SSL3[%d]: send client_hello handshake", SSL_GETPID(),
  2129. ss->fd));
  2130.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  2131.     PORT_Assert( ssl_HaveXmitBufLock(ss) );
  2132.     rv = ssl3_InitState(ss);
  2133.     if (rv != SECSuccess) {
  2134. return rv; /* ssl3_InitState has set the error code. */
  2135.     }
  2136.     SSL_TRC(30,("%d: SSL3[%d]: reset handshake hashes",
  2137.     SSL_GETPID(), ss->fd ));
  2138.     rv = PK11_DigestBegin(ss->ssl3->hs.md5);
  2139.     if (rv != SECSuccess) {
  2140. ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE);
  2141. return rv;
  2142.     }
  2143.     rv = PK11_DigestBegin(ss->ssl3->hs.sha);
  2144.     if (rv != SECSuccess) {
  2145. ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
  2146. return rv;
  2147.     }
  2148.     PORT_Assert(sec);
  2149.     /* We ignore ss->sec->ci.sid here, and use ssl_Lookup because Lookup
  2150.      * handles expired entries and other details.
  2151.      * XXX If we've been called from ssl2_BeginClientHandshake, then
  2152.      * this lookup is duplicative and wasteful.
  2153.      */
  2154.     sid = (ss->noCache) ? NULL
  2155.     : ssl_LookupSID(&sec->ci.peer, sec->ci.port, ss->peerID, ss->url);
  2156.     /* We can't resume based on a different token. If the sid exists,
  2157.      * make sure the token that holds the master secret still exists ...
  2158.      * If we previously did client-auth, make sure that the token that holds
  2159.      * the private key still exists, is logged in, hasn't been removed, etc.
  2160.      * Also for fortezza, make sure that the card that holds the session keys
  2161.      * exist as well... */
  2162.     if (sid) {
  2163. PK11SlotInfo *slot;
  2164. PRBool sidOK = PR_TRUE;
  2165. slot = (!sid->u.ssl3.masterValid) ? NULL :
  2166.                      SECMOD_LookupSlot(sid->u.ssl3.masterModuleID,
  2167.                                        sid->u.ssl3.masterSlotID);
  2168. if (slot == NULL) {
  2169.    sidOK = PR_FALSE;
  2170. } else {
  2171.     PK11SymKey *wrapKey = NULL;
  2172.     if (!PK11_IsPresent(slot) ||
  2173. ((wrapKey = PK11_GetWrapKey(slot, sid->u.ssl3.masterWrapIndex,
  2174.     sid->u.ssl3.masterWrapMech,
  2175.     sid->u.ssl3.masterWrapSeries,
  2176.     ss->pkcs11PinArg)) == NULL) ) {
  2177. sidOK = PR_FALSE;
  2178.     }
  2179.     if (wrapKey) PK11_FreeSymKey(wrapKey);
  2180.     PK11_FreeSlot(slot);
  2181.     slot = NULL;
  2182. }
  2183. /* do sid-has-FORTEZZA-slot check */
  2184.      if (sid->u.ssl3.hasFortezza) {
  2185.     /* do has fortezza check */
  2186.     if (!PK11_VerifyKeyOK(sid->u.ssl3.tek))
  2187.      sidOK = PR_FALSE;
  2188. }
  2189. /* If we previously did client-auth, make sure that the token that
  2190. ** holds the private key still exists, is logged in, hasn't been
  2191. ** removed, etc.
  2192. */
  2193. if (sidOK && sid->u.ssl3.clAuthValid) {
  2194.     slot = SECMOD_LookupSlot(sid->u.ssl3.clAuthModuleID,
  2195.                              sid->u.ssl3.clAuthSlotID);
  2196.     if (slot == NULL ||
  2197.         !PK11_IsPresent(slot) ||
  2198. sid->u.ssl3.clAuthSeries     != PK11_GetSlotSeries(slot) ||
  2199. sid->u.ssl3.clAuthSlotID     != PK11_GetSlotID(slot)     ||
  2200. sid->u.ssl3.clAuthModuleID   != PK11_GetModuleID(slot)   ) {
  2201.         sidOK = PR_FALSE;
  2202.     }
  2203.     if (slot) {
  2204. PK11_FreeSlot(slot);
  2205. slot = NULL;
  2206.     }
  2207. }
  2208. if (!sidOK) {
  2209.     ++ssl3_sch_sid_cache_not_ok;
  2210.     (*ss->sec->uncache)(sid);
  2211.     ssl_FreeSID(sid);
  2212.     sid = NULL;
  2213. }
  2214.     }
  2215.     if (sid) {
  2216. ++ssl3_sch_sid_cache_hits;
  2217. rv = ssl3_NegotiateVersion(ss, sid->version);
  2218. if (rv != SECSuccess)
  2219.     return rv; /* error code was set */
  2220. PRINT_BUF(4, (ss, "client, found session-id:", sid->u.ssl3.sessionID,
  2221.       sid->u.ssl3.sessionIDLength));
  2222. ss->ssl3->policy = sid->u.ssl3.policy;
  2223.     } else {
  2224. ++ssl3_sch_sid_cache_misses;
  2225. rv = ssl3_NegotiateVersion(ss, SSL_LIBRARY_VERSION_3_1_TLS);
  2226. if (rv != SECSuccess)
  2227.     return rv; /* error code was set */
  2228. sid = ssl3_NewSessionID(ss, PR_FALSE);
  2229. if (!sid) {
  2230.     return SECFailure; /* memory error is set */
  2231.         }
  2232.     }
  2233.     if (sec->ci.sid != NULL) {
  2234. ssl_FreeSID(sec->ci.sid); /* decrement ref count, free if zero */
  2235.     }
  2236.     sec->ci.sid = sid;
  2237.     sec->send = ssl3_SendApplicationData;
  2238.     /* shouldn't get here if SSL3 is disabled, but ... */
  2239.     PORT_Assert(ss->enableSSL3 || ss->enableTLS);
  2240.     if (!ss->enableSSL3 && !ss->enableTLS) {
  2241. PORT_SetError(SSL_ERROR_SSL_DISABLED);
  2242.      return SECFailure;
  2243.     }
  2244.     /* how many suites does our PKCS11 support (regardless of policy)? */
  2245.     num_suites = ssl3_config_match_init(ss);
  2246.     if (!num_suites)
  2247.      return SECFailure; /* ssl3_config_match_init has set error code. */
  2248.     /* how many suites are permitted by policy and user preference? */
  2249.     num_suites = count_cipher_suites(ss, ss->ssl3->policy, PR_TRUE);
  2250.     if (!num_suites)
  2251.      return SECFailure; /* count_cipher_suites has set error code. */
  2252.     length = sizeof(SSL3ProtocolVersion) + SSL3_RANDOM_LENGTH +
  2253. 1 + ((sid == NULL) ? 0 : sid->u.ssl3.sessionIDLength) +
  2254. 2 + num_suites*sizeof(ssl3CipherSuite) +
  2255. 1 + compressionMethodsCount;
  2256.     rv = ssl3_AppendHandshakeHeader(ss, client_hello, length);
  2257.     if (rv != SECSuccess) {
  2258. return rv; /* err set by ssl3_AppendHandshake* */
  2259.     }
  2260.     ss->clientHelloVersion = ss->version;
  2261.     rv = ssl3_AppendHandshakeNumber(ss, ss->clientHelloVersion, 2);
  2262.     if (rv != SECSuccess) {
  2263. return rv; /* err set by ssl3_AppendHandshake* */
  2264.     }
  2265.     rv = ssl3_GetNewRandom(&ss->ssl3->hs.client_random);
  2266.     if (rv != SECSuccess) {
  2267. return rv; /* err set by GetNewRandom. */
  2268.     }
  2269.     rv = ssl3_AppendHandshake(ss, &ss->ssl3->hs.client_random,
  2270.                               SSL3_RANDOM_LENGTH);
  2271.     if (rv != SECSuccess) {
  2272. return rv; /* err set by ssl3_AppendHandshake* */
  2273.     }
  2274.     if (sid)
  2275. rv = ssl3_AppendHandshakeVariable(
  2276.     ss, sid->u.ssl3.sessionID, sid->u.ssl3.sessionIDLength, 1);
  2277.     else
  2278. rv = ssl3_AppendHandshakeVariable(ss, NULL, 0, 1);
  2279.     if (rv != SECSuccess) {
  2280. return rv; /* err set by ssl3_AppendHandshake* */
  2281.     }
  2282.     rv = ssl3_AppendHandshakeNumber(ss, num_suites*sizeof(ssl3CipherSuite), 2);
  2283.     if (rv != SECSuccess) {
  2284. return rv; /* err set by ssl3_AppendHandshake* */
  2285.     }
  2286.     for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) {
  2287. ssl3CipherSuiteCfg *suite = &ss->cipherSuites[i];
  2288. if (config_match(suite, ss->ssl3->policy, PR_TRUE)) {
  2289.     actual_count++;
  2290.     if (actual_count > num_suites) {
  2291. /* set error card removal/insertion error */
  2292. PORT_SetError(SSL_ERROR_TOKEN_INSERTION_REMOVAL);
  2293. return SECFailure;
  2294.     }
  2295.     rv = ssl3_AppendHandshakeNumber(ss, suite->cipher_suite,
  2296.     sizeof(ssl3CipherSuite));
  2297.     if (rv != SECSuccess) {
  2298. return rv; /* err set by ssl3_AppendHandshake* */
  2299.     }
  2300. }
  2301.     }
  2302.     /* if cards were removed or inserted between count_cipher_suites and
  2303.      * generating our list, detect the error here rather than send it off to
  2304.      * the server.. */
  2305.     if (actual_count != num_suites) {
  2306. /* Card removal/insertion error */
  2307. PORT_SetError(SSL_ERROR_TOKEN_INSERTION_REMOVAL);
  2308. return SECFailure;
  2309.     }
  2310.     rv = ssl3_AppendHandshakeNumber(ss, compressionMethodsCount, 1);
  2311.     if (rv != SECSuccess) {
  2312. return rv; /* err set by ssl3_AppendHandshake* */
  2313.     }
  2314.     for (i = 0; i < compressionMethodsCount; i++) {
  2315. rv = ssl3_AppendHandshakeNumber(ss, compressions[i], 1);
  2316. if (rv != SECSuccess) {
  2317.     return rv; /* err set by ssl3_AppendHandshake* */
  2318. }
  2319.     }
  2320.     rv = ssl3_FlushHandshake(ss, 0);
  2321.     if (rv != SECSuccess) {
  2322. return rv; /* error code set by ssl3_FlushHandshake */
  2323.     }
  2324.     ss->ssl3->hs.ws = wait_server_hello;
  2325.     return rv;
  2326. }
  2327. /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete
  2328.  * ssl3 Hello Request.
  2329.  * Caller must hold Handshake and RecvBuf locks.
  2330.  */
  2331. static SECStatus
  2332. ssl3_HandleHelloRequest(sslSocket *ss)
  2333. {
  2334.     sslSessionID *sid = ss->sec->ci.sid;
  2335.     SECStatus     rv;
  2336.     SSL_TRC(3, ("%d: SSL3[%d]: handle hello_request handshake",
  2337. SSL_GETPID(), ss->fd));
  2338.     PORT_Assert(ss->ssl3);
  2339.     PORT_Assert( ssl_HaveRecvBufLock(ss) );
  2340.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  2341.     if (ss->ssl3->hs.ws == wait_server_hello)
  2342. return SECSuccess;
  2343.     if (ss->ssl3->hs.ws != idle_handshake || ss->sec->isServer) {
  2344. (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message);
  2345. PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HELLO_REQUEST);
  2346. return SECFailure;
  2347.     }
  2348.     if (sid) {
  2349. ss->sec->uncache(sid);
  2350. ssl_FreeSID(sid);
  2351. ss->sec->ci.sid = NULL;
  2352.     }
  2353.     ssl_GetXmitBufLock(ss);
  2354.     rv = ssl3_SendClientHello(ss);
  2355.     ssl_ReleaseXmitBufLock(ss);
  2356.     return rv;
  2357. }
  2358. #define UNKNOWN_WRAP_MECHANISM 0x7fffffff
  2359. static const CK_MECHANISM_TYPE wrapMechanismList[SSL_NUM_WRAP_MECHS] = {
  2360.     CKM_DES3_ECB,
  2361.     CKM_CAST5_ECB,
  2362.     CKM_DES_ECB,
  2363.     CKM_KEY_WRAP_LYNKS,
  2364.     CKM_IDEA_ECB,
  2365.     CKM_CAST3_ECB,
  2366.     CKM_CAST_ECB,
  2367.     CKM_RC5_ECB,
  2368.     CKM_RC2_ECB,
  2369.     CKM_CDMF_ECB,
  2370.     CKM_SKIPJACK_WRAP,
  2371.     CKM_SKIPJACK_CBC64,
  2372.     UNKNOWN_WRAP_MECHANISM
  2373. };
  2374. static int
  2375. ssl_FindIndexByWrapMechanism(CK_MECHANISM_TYPE mech)
  2376. {
  2377.     const CK_MECHANISM_TYPE *pMech = wrapMechanismList;
  2378.     while (mech != *pMech && *pMech != UNKNOWN_WRAP_MECHANISM) {
  2379.      ++pMech;
  2380.     }
  2381.     return (*pMech == UNKNOWN_WRAP_MECHANISM) ? -1
  2382.                                               : (pMech - wrapMechanismList);
  2383. }
  2384. static PK11SymKey *
  2385. ssl_UnwrapSymWrappingKey(
  2386. SSLWrappedSymWrappingKey *pWswk,
  2387. SECKEYPrivateKey *        svrPrivKey,
  2388. SSL3KEAType               exchKeyType,
  2389. CK_MECHANISM_TYPE         masterWrapMech,
  2390. void *                    pwArg)
  2391. {
  2392.     PK11SymKey *             unwrappedWrappingKey  = NULL;
  2393.     SECItem                  wrappedKey;
  2394.     /* found the wrapping key on disk. */
  2395.     PORT_Assert(pWswk->symWrapMechanism == masterWrapMech);
  2396.     PORT_Assert(pWswk->exchKeyType      == exchKeyType);
  2397.     if (pWswk->symWrapMechanism != masterWrapMech ||
  2398. pWswk->exchKeyType      != exchKeyType) {
  2399. goto loser;
  2400.     }
  2401.     wrappedKey.type = siBuffer;
  2402.     wrappedKey.data = pWswk->wrappedSymmetricWrappingkey;
  2403.     wrappedKey.len  = pWswk->wrappedSymKeyLen;
  2404.     PORT_Assert(wrappedKey.len <= sizeof pWswk->wrappedSymmetricWrappingkey);
  2405.     switch (exchKeyType) {
  2406.     PK11SymKey *      Ks;
  2407.     PK11SlotInfo *    slot;
  2408.     SECItem           param;
  2409.     case kt_fortezza:
  2410. /* get the slot that the fortezza server private key is in. */
  2411. slot = PK11_GetSlotFromPrivateKey(svrPrivKey);
  2412. if (slot == NULL) {
  2413.     SET_ERROR_CODE
  2414.     goto loser;
  2415. }
  2416. /* Look up the Token Fixed Key */
  2417. Ks = PK11_FindFixedKey(slot, CKM_SKIPJACK_CBC64, NULL, pwArg);
  2418. PK11_FreeSlot(slot);
  2419. if (Ks == NULL) {
  2420.     SET_ERROR_CODE
  2421.     goto loser;
  2422. }
  2423. /* unwrap client write key with the local Ks and IV */
  2424. param.type = siBuffer;
  2425.      param.data = pWswk->wrapIV;
  2426.      param.len  = pWswk->wrapIVLen;
  2427. unwrappedWrappingKey =
  2428.     PK11_UnwrapSymKey(Ks, CKM_SKIPJACK_CBC64, &param, &wrappedKey,
  2429.       masterWrapMech, CKA_UNWRAP, 0);
  2430. PK11_FreeSymKey(Ks);
  2431. break;
  2432.     case kt_rsa:
  2433. unwrappedWrappingKey =
  2434.     PK11_PubUnwrapSymKey(svrPrivKey, &wrappedKey,
  2435.  masterWrapMech, CKA_UNWRAP, 0);
  2436. break;
  2437.     }
  2438. loser:
  2439.     return unwrappedWrappingKey;
  2440. }
  2441. /* Each process sharing the server session ID cache has its own array of
  2442.  * SymKey pointers for the symmetric wrapping keys that are used to wrap
  2443.  * the master secrets.  There is one key for each KEA type.  These Symkeys
  2444.  * correspond to the wrapped SymKeys kept in the server session cache.
  2445.  */
  2446. typedef struct {
  2447.     PK11SymKey *      symWrapKey[kt_kea_size];
  2448. } ssl3SymWrapKey;
  2449. /* Try to get wrapping key for mechanism from in-memory array.
  2450.  * If that fails, look for one on disk.
  2451.  * If that fails, generate a new one, put the new one on disk,
  2452.  * Put the new key in the in-memory array.
  2453.  */
  2454. static PK11SymKey *
  2455. getWrappingKey( sslSocket *       ss,
  2456. PK11SlotInfo *    masterSecretSlot,
  2457. SSL3KEAType       exchKeyType,
  2458.                 CK_MECHANISM_TYPE masterWrapMech,
  2459.         void *            pwArg)
  2460. {
  2461.     CERTCertificate *        svrCert;
  2462.     SECKEYPrivateKey *       svrPrivKey;
  2463.     SECKEYPublicKey *        svrPubKey             = NULL;
  2464.     PK11SymKey *             unwrappedWrappingKey  = NULL;
  2465.     PK11SymKey **            pSymWrapKey;
  2466.     CK_MECHANISM_TYPE        asymWrapMechanism;
  2467.     int                      length;
  2468.     int                      symWrapMechIndex;
  2469.     SECStatus                rv;
  2470.     SECItem                  wrappedKey;
  2471.     SSLWrappedSymWrappingKey wswk;
  2472.     static PRLock *          symWrapKeysLock;
  2473.     static ssl3SymWrapKey    symWrapKeys[SSL_NUM_WRAP_MECHS];
  2474.     svrPrivKey  = ss->serverKey[exchKeyType];
  2475.     PORT_Assert(svrPrivKey != NULL);
  2476.     if (!svrPrivKey) {
  2477.      return NULL; /* why are we here?!? */
  2478.     }
  2479.     symWrapMechIndex = ssl_FindIndexByWrapMechanism(masterWrapMech);
  2480.     PORT_Assert(symWrapMechIndex >= 0);
  2481.     if (symWrapMechIndex < 0)
  2482.      return NULL; /* invalid masterWrapMech. */
  2483.     pSymWrapKey = &symWrapKeys[symWrapMechIndex].symWrapKey[exchKeyType];
  2484.     /* atomically initialize the lock */
  2485.     if (!symWrapKeysLock)
  2486. nss_InitLock(&symWrapKeysLock);
  2487.     PR_Lock(symWrapKeysLock);
  2488.     unwrappedWrappingKey = *pSymWrapKey;
  2489.     if (unwrappedWrappingKey != NULL) {
  2490. if (PK11_VerifyKeyOK(unwrappedWrappingKey)) {
  2491.     unwrappedWrappingKey = PK11_ReferenceSymKey(unwrappedWrappingKey);
  2492.     goto done;
  2493. }
  2494. /* slot series has changed, so this key is no good any more. */
  2495. PK11_FreeSymKey(unwrappedWrappingKey);
  2496. *pSymWrapKey = unwrappedWrappingKey = NULL;
  2497.     }
  2498.     /* Try to get wrapped SymWrapping key out of the (disk) cache. */
  2499.     /* Following call fills in wswk on success. */
  2500.     if (ssl_GetWrappingKey(symWrapMechIndex, exchKeyType, &wswk)) {
  2501.      /* found the wrapped sym wrapping key on disk. */
  2502. unwrappedWrappingKey =
  2503.     ssl_UnwrapSymWrappingKey(&wswk, svrPrivKey, exchKeyType,
  2504.                                      masterWrapMech, pwArg);
  2505. if (unwrappedWrappingKey) {
  2506.     goto install;
  2507. }
  2508.     }
  2509. no_wrapped_key:
  2510.     if (!masterSecretSlot)  /* caller doesn't want to create a new one. */
  2511.      goto loser;
  2512.     length = PK11_GetBestKeyLength(masterSecretSlot, masterWrapMech);
  2513.     /* Zero length means fixed key length algorithm, or error.
  2514.      * It's ambiguous.
  2515.      */
  2516.     unwrappedWrappingKey = PK11_KeyGen(masterSecretSlot, masterWrapMech, NULL,
  2517.                                        length, pwArg);
  2518.     if (!unwrappedWrappingKey) {
  2519.      goto loser;
  2520.     }
  2521.     /* Prepare the buffer to receive the wrappedWrappingKey,
  2522.      * the symmetric wrapping key wrapped using the server's pub key.
  2523.      */
  2524.     PORT_Memset(&wswk, 0, sizeof wswk); /* eliminate UMRs. */
  2525.     svrCert         = ss->serverCert[exchKeyType];
  2526.     svrPubKey       = CERT_ExtractPublicKey(svrCert);
  2527.     if (svrPubKey == NULL) {
  2528. /* CERT_ExtractPublicKey doesn't set error code */
  2529. PORT_SetError(SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE);
  2530.      goto loser;
  2531.     }
  2532.     wrappedKey.type = siBuffer;
  2533.     wrappedKey.len  = SECKEY_PublicKeyStrength(svrPubKey);
  2534.     wrappedKey.data = wswk.wrappedSymmetricWrappingkey;
  2535.     PORT_Assert(wrappedKey.len <= sizeof wswk.wrappedSymmetricWrappingkey);
  2536.     if (wrappedKey.len > sizeof wswk.wrappedSymmetricWrappingkey)
  2537.      goto loser;
  2538.     /* wrap symmetric wrapping key in server's public key. */
  2539.     switch (exchKeyType) {
  2540.     PK11SymKey *      Ks;
  2541.     PK11SlotInfo *    fSlot;
  2542.     SECItem           param;
  2543.     case kt_fortezza:
  2544. /* get the slot that the fortezza server private key is in. */
  2545. fSlot = PK11_GetSlotFromPrivateKey(svrPrivKey);
  2546. if (fSlot == NULL) {
  2547.     SET_ERROR_CODE
  2548.     goto loser;
  2549. }
  2550. /* Look up the Token Fixed Key */
  2551. Ks = PK11_FindFixedKey(fSlot, CKM_SKIPJACK_CBC64, NULL, pwArg);
  2552. PK11_FreeSlot(fSlot);
  2553. if (Ks == NULL) {
  2554.     SET_ERROR_CODE
  2555.     goto loser;
  2556. }
  2557. /* wrap symmetricWrapping key with the local Ks */
  2558. param.type = siBuffer;
  2559.      param.data = wswk.wrapIV;
  2560.      param.len  = sizeof wswk.wrapIV;
  2561. rv = PK11_WrapSymKey(CKM_SKIPJACK_CBC64, &param, Ks,
  2562.                      unwrappedWrappingKey, &wrappedKey);
  2563. wswk.wrapIVLen = param.len;
  2564. PK11_FreeSymKey(Ks);
  2565. asymWrapMechanism = CKM_SKIPJACK_CBC64;
  2566. break;
  2567.     case kt_rsa:
  2568. asymWrapMechanism = CKM_RSA_PKCS;
  2569. rv = PK11_PubWrapSymKey(asymWrapMechanism, svrPubKey,
  2570.                         unwrappedWrappingKey, &wrappedKey);
  2571. break;
  2572.     default:
  2573. rv = SECFailure;
  2574. break;
  2575.     }
  2576.     if (rv != SECSuccess) {
  2577. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  2578. goto loser;
  2579.     }
  2580.     wswk.symWrapMechanism  = masterWrapMech;
  2581.     wswk.symWrapMechIndex  = symWrapMechIndex;
  2582.     wswk.asymWrapMechanism = asymWrapMechanism;
  2583.     wswk.exchKeyType       = exchKeyType;
  2584.     wswk.wrappedSymKeyLen  = wrappedKey.len;
  2585.     /* put it on disk. */
  2586.     /* If the wrapping key for this KEA type has already been set, 
  2587.      * then abandon the value we just computed and 
  2588.      * use the one we got from the disk.
  2589.      */
  2590.     if (ssl_SetWrappingKey(&wswk)) {
  2591.      /* somebody beat us to it.  The original contents of our wswk
  2592.  * has been replaced with the content on disk.  Now, discard
  2593.  * the key we just created and unwrap this new one.
  2594.  */
  2595.      PK11_FreeSymKey(unwrappedWrappingKey);
  2596. unwrappedWrappingKey =
  2597.     ssl_UnwrapSymWrappingKey(&wswk, svrPrivKey, exchKeyType,
  2598.                                      masterWrapMech, pwArg);
  2599.     }
  2600. install:
  2601.     if (unwrappedWrappingKey) {
  2602. *pSymWrapKey = PK11_ReferenceSymKey(unwrappedWrappingKey);
  2603.     }
  2604. loser:
  2605. done:
  2606.     if (svrPubKey) {
  2607.      SECKEY_DestroyPublicKey(svrPubKey);
  2608. svrPubKey = NULL;
  2609.     }
  2610.     PR_Unlock(symWrapKeysLock);
  2611.     return unwrappedWrappingKey;
  2612. }
  2613. static SECStatus
  2614. ssl3_FortezzaAppendHandshake(sslSocket *ss, unsigned char * data, int len)
  2615. {
  2616.     SSL3FortezzaKeys *fortezza_CKE  = NULL;
  2617.     SECStatus         rv            = SECFailure;
  2618.     rv = ssl3_AppendHandshakeHeader(ss, client_key_exchange,
  2619.     (sizeof(*fortezza_CKE)-sizeof(fortezza_CKE->y_c)) + 1 + len);
  2620.     if (rv == SECSuccess) {
  2621.         rv = ssl3_AppendHandshakeVariable(ss, data, len, 1);
  2622.     }
  2623.     return rv; /* err set by ssl3_AppendHandshake* */
  2624. }
  2625. /* Called from ssl3_SendClientKeyExchange(). */
  2626. static SECStatus
  2627. sendRSAClientKeyExchange(sslSocket * ss, SECKEYPublicKey * svrPubKey)
  2628. {
  2629.     PK11SymKey * pms  = NULL;
  2630.     SECStatus           rv     = SECFailure;
  2631.     SECItem  enc_pms  = {siBuffer, NULL, 0};
  2632.     PRBool              isTLS;
  2633.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  2634.     PORT_Assert( ssl_HaveXmitBufLock(ss));
  2635.     /* Generate the pre-master secret ...  */
  2636.     ssl_GetSpecWriteLock(ss);
  2637.     isTLS = (PRBool)(ss->ssl3->pwSpec->version > SSL_LIBRARY_VERSION_3_0);
  2638.     pms = ssl3_GenerateRSAPMS(ss, ss->ssl3->pwSpec, NULL);
  2639.     ssl_ReleaseSpecWriteLock(ss);
  2640.     if (pms == NULL) {
  2641. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  2642. goto loser;
  2643.     }
  2644.     /* Get the wrapped (encrypted) pre-master secret, enc_pms */
  2645.     enc_pms.len  = SECKEY_PublicKeyStrength(svrPubKey);
  2646.     enc_pms.data = (unsigned char*)PORT_Alloc(enc_pms.len);
  2647.     if (enc_pms.data == NULL) {
  2648. goto loser; /* err set by PORT_Alloc */
  2649.     }
  2650.     /* wrap pre-master secret in server's public key. */
  2651.     rv = PK11_PubWrapSymKey(CKM_RSA_PKCS, svrPubKey, pms, &enc_pms);
  2652.     if (rv != SECSuccess) {
  2653. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  2654. goto loser;
  2655.     }
  2656.     rv = ssl3_InitPendingCipherSpec(ss,  pms);
  2657.     PK11_FreeSymKey(pms); pms = NULL;
  2658.     if (rv != SECSuccess) {
  2659. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  2660. goto loser;
  2661.     }
  2662.     rv = ssl3_AppendHandshakeHeader(ss, client_key_exchange, 
  2663.     isTLS ? enc_pms.len + 2 : enc_pms.len);
  2664.     if (rv != SECSuccess) {
  2665. goto loser; /* err set by ssl3_AppendHandshake* */
  2666.     }
  2667.     if (isTLS) {
  2668.      rv = ssl3_AppendHandshakeVariable(ss, enc_pms.data, enc_pms.len, 2);
  2669.     } else {
  2670. rv = ssl3_AppendHandshake(ss, enc_pms.data, enc_pms.len);
  2671.     }
  2672.     if (rv != SECSuccess) {
  2673. goto loser; /* err set by ssl3_AppendHandshake* */
  2674.     }
  2675.     rv = SECSuccess;
  2676. loser:
  2677.     if (enc_pms.data != NULL) {
  2678. PORT_Free(enc_pms.data);
  2679.     }
  2680.     if (pms != NULL) {
  2681.      PK11_FreeSymKey(pms);
  2682.     }
  2683.     return rv;
  2684. }
  2685. /* fortezza client-auth portion of ClientKeyExchange message
  2686.  * This function appends the KEA public key from the client's  V3 cert
  2687.  * (empty for a V1 cert) to the outgoing ClientKeyExchange message.
  2688.  * For a V3 cert, it also computes the Fortezza public key hash of that key
  2689.  * and signs that hash with the client's signing private key.
  2690.  * It also finds and returns the client's KEA private key.
  2691.  *
  2692.  * Called from sendFortezzaClientKeyExchange <- ssl3_SendClientKeyExchange()
  2693.  */
  2694. static SECKEYPrivateKey *
  2695. sendFortezzaCKXClientAuth(sslSocket *ss, SSL3FortezzaKeys * fortezza_CKE)
  2696. {
  2697.     SECKEYPublicKey * pubKey  = NULL;
  2698.     SECKEYPrivateKey * privKeaKey  = NULL;
  2699.     CERTCertificate * peerCert  = ss->sec->peerCert;
  2700.     void * pwArg  = ss->pkcs11PinArg;
  2701.     SECStatus  rv  = SECFailure;
  2702.     SECItem  sigItem;
  2703.     SECItem  hashItem;
  2704.     /* extract our own local public key. */
  2705.     pubKey = CERT_ExtractPublicKey(ss->ssl3->clientCertificate);
  2706.     if (!pubKey) {
  2707. ssl_MapLowLevelError(SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE);
  2708. goto loser;
  2709.     }
  2710.     if (pubKey->keyType == fortezzaKey) {
  2711. /* fortezza clientauth with fortezza V1 certificate */
  2712. rv = ssl3_FortezzaAppendHandshake(ss, NULL, 0);
  2713. if (rv != SECSuccess) {
  2714.     goto loser; /* err was set by AppendHandshake. */
  2715. }
  2716. privKeaKey = PK11_FindKeyByAnyCert(ss->ssl3->clientCertificate, pwArg);
  2717. if (!privKeaKey) {
  2718.     ssl_MapLowLevelError(SEC_ERROR_NO_KEY);
  2719. }
  2720.     } else {
  2721. /* fortezza clientauth w/ V3 certificate or non fortezza cert*/
  2722. CERTCertificate *   ccert  = NULL;
  2723. SECKEYPublicKey *   foundPubKey  = NULL;
  2724. unsigned char       hash[SHA1_LENGTH];
  2725. ccert = PK11_FindBestKEAMatch(peerCert, pwArg);
  2726. if (ccert == NULL) {
  2727.     PORT_SetError(SSL_ERROR_FORTEZZA_PQG);
  2728.     goto v3_loser;
  2729. }
  2730. foundPubKey = CERT_ExtractPublicKey(ccert);
  2731. if (foundPubKey == NULL) {
  2732.     ssl_MapLowLevelError(SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE);
  2733.     goto v3_loser;
  2734. }
  2735. if (foundPubKey->keyType == keaKey) {
  2736.     rv = ssl3_FortezzaAppendHandshake(ss,
  2737.     foundPubKey->u.kea.publicValue.data,
  2738.     foundPubKey->u.kea.publicValue.len);
  2739.     if (rv != SECSuccess) {
  2740. goto v3_loser; /* err was set by AppendHandshake. */
  2741.     }
  2742.     rv = ssl3_ComputeFortezzaPublicKeyHash(
  2743.     foundPubKey->u.kea.publicValue, hash);
  2744.     if (rv != SECSuccess) {
  2745. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  2746. goto v3_loser;
  2747.     }
  2748. } else {
  2749.     rv = ssl3_FortezzaAppendHandshake(ss,
  2750.     foundPubKey->u.fortezza.KEAKey.data,
  2751.     foundPubKey->u.fortezza.KEAKey.len);
  2752.     if (rv != SECSuccess) {
  2753. goto v3_loser; /* err was set by AppendHandshake. */
  2754.     }
  2755.     rv = ssl3_ComputeFortezzaPublicKeyHash(
  2756.     foundPubKey->u.fortezza.KEAKey, hash);
  2757.     if (rv != SECSuccess) {
  2758. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  2759. goto v3_loser;
  2760.     }
  2761. }
  2762. hashItem.data = (unsigned char *) hash;
  2763. hashItem.len  = SHA1_LENGTH;
  2764. sigItem.data  = fortezza_CKE->y_signature;
  2765. sigItem.len   = sizeof fortezza_CKE->y_signature;
  2766. rv = PK11_Sign(ss->ssl3->clientPrivateKey, &sigItem, &hashItem);
  2767. if (rv != SECSuccess) {
  2768.     ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  2769.     goto v3_loser;
  2770. }
  2771. privKeaKey = PK11_FindKeyByAnyCert(ccert, pwArg);
  2772. if (!privKeaKey) {
  2773.     ssl_MapLowLevelError(SEC_ERROR_NO_KEY);
  2774. }
  2775. v3_loser:
  2776. if (foundPubKey)
  2777.     SECKEY_DestroyPublicKey(foundPubKey);
  2778. if (ccert)
  2779.     CERT_DestroyCertificate(ccert);
  2780.     } /* fortezza clientauth w/ V3 certificate or non fortezza cert*/
  2781. loser:
  2782.     if (pubKey)
  2783. SECKEY_DestroyPublicKey(pubKey);
  2784.     return privKeaKey;
  2785. } /* End of fortezza client-auth. */
  2786. /* fortezza without client-auth */
  2787. /* fortezza client-auth portion of ClientKeyExchange message
  2788.  * This function appends the public KEA key from the client's cert
  2789.  * to the outgoing ClientKeyExchange message.
  2790.  * It also finds and returns the client's KEA private key.
  2791.  *
  2792.  * Called from sendFortezzaClientKeyExchange <- ssl3_SendClientKeyExchange()
  2793.  */
  2794. static SECKEYPrivateKey *
  2795. sendFortezzaCKXNoClientAuth(sslSocket *ss)
  2796. {
  2797.     SECKEYPublicKey *   foundPubKey  = NULL;
  2798.     SECKEYPrivateKey * privKeaKey  = NULL;
  2799.     CERTCertificate * ccert  = NULL;
  2800.     CERTCertificate * peerCert  = ss->sec->peerCert;
  2801.     void * pwArg  = ss->pkcs11PinArg;
  2802.     SECStatus  rv  = SECFailure;
  2803.     ccert = PK11_FindBestKEAMatch(peerCert, pwArg);
  2804.     if (ccert == NULL) {
  2805. PORT_SetError(SSL_ERROR_FORTEZZA_PQG);
  2806. goto loser;
  2807.     }
  2808.     foundPubKey = CERT_ExtractPublicKey(ccert);
  2809.     if (foundPubKey == NULL) {
  2810. ssl_MapLowLevelError(SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE);
  2811. goto loser;
  2812.     }
  2813.     if (foundPubKey->keyType == fortezzaKey) {
  2814. /* fortezza V1 cert */
  2815. rv = ssl3_FortezzaAppendHandshake(ss,
  2816.     foundPubKey->u.fortezza.KEAKey.data,
  2817.     foundPubKey->u.fortezza.KEAKey.len);
  2818. if (rv != SECSuccess) {
  2819.     goto loser; /* err was set by AppendHandshake. */
  2820. }
  2821. privKeaKey = PK11_FindKeyByAnyCert(ccert, pwArg);
  2822. if (!privKeaKey) {
  2823.     ssl_MapLowLevelError(SEC_ERROR_NO_KEY);
  2824. }
  2825.     } else {
  2826. /* fortezza V3 cert */
  2827. rv = ssl3_FortezzaAppendHandshake(ss,
  2828.     foundPubKey->u.kea.publicValue.data,
  2829.     foundPubKey->u.kea.publicValue.len);
  2830. if (rv != SECSuccess) {
  2831.     goto loser; /* err was set by AppendHandshake. */
  2832. }
  2833. privKeaKey = PK11_FindKeyByAnyCert(ccert, pwArg);
  2834. if (!privKeaKey) {
  2835.     ssl_MapLowLevelError(SEC_ERROR_NO_KEY);
  2836. }
  2837.     }
  2838. loser:
  2839.     if (foundPubKey)
  2840. SECKEY_DestroyPublicKey(foundPubKey);
  2841.     if (ccert)
  2842. CERT_DestroyCertificate(ccert);
  2843.     return privKeaKey;
  2844. }
  2845. /* Called from ssl3_SendClientKeyExchange().  */
  2846. static SECStatus
  2847. sendFortezzaClientKeyExchange(sslSocket * ss, SECKEYPublicKey * serverKey)
  2848. {
  2849.     ssl3CipherSpec * pwSpec;
  2850.     sslSessionID * sid  = ss->sec->ci.sid;
  2851.     PK11SlotInfo * slot = NULL;
  2852.     PK11SymKey * pms  = NULL;
  2853.     PK11SymKey * tek = NULL;
  2854.     PK11SymKey * client_write_key = NULL;
  2855.     PK11SymKey * server_write_key = NULL;
  2856.     SECKEYPrivateKey * privKeaKey  = NULL;
  2857.     void * pwArg  = ss->pkcs11PinArg;
  2858.     SECStatus  rv  = SECFailure;
  2859.     CK_VERSION  version;
  2860.     SECItem  param;
  2861.     SECItem  raItem;
  2862.     SECItem  rbItem;
  2863.     SECItem  enc_pms;
  2864.     SECItem  item;
  2865.     SSL3FortezzaKeys fortezza_CKE;
  2866.     PRBool              releaseSpecWriteLock = PR_FALSE;
  2867.     PORT_Assert( ssl_HaveXmitBufLock(ss));
  2868.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  2869.     /* first get an appropriate slot for doing MACing.
  2870.      * Note: This slot will NOT be a Fortezza slot because Fortezza
  2871.      * cannot generate an SSL3 pre-master-secret.
  2872.      */
  2873.     slot = PK11_GetBestSlot(CKM_SSL3_PRE_MASTER_KEY_GEN, pwArg);
  2874.     if (slot == NULL) {
  2875. PORT_SetError(SSL_ERROR_TOKEN_SLOT_NOT_FOUND);
  2876. goto loser;
  2877.     }
  2878.     /* create a pre-Master secret */
  2879.     version.major = MSB(ss->version);
  2880.     version.minor = LSB(ss->version);
  2881.     param.data = (unsigned char *)&version;
  2882.     param.len  = sizeof version;
  2883.     pms = PK11_KeyGen(slot, CKM_SSL3_PRE_MASTER_KEY_GEN,
  2884.  &param, 0, pwArg);
  2885.     PK11_FreeSlot(slot);
  2886.     slot = NULL;
  2887.     if (pms == NULL) {
  2888. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  2889. goto loser;
  2890.     }
  2891.     /* If we don't have a certificate, we need to read out your public key.
  2892.      * This changes a bit when we need to deal with the PQG stuff
  2893.      */
  2894.     PORT_Memset(fortezza_CKE.y_signature, 0, sizeof fortezza_CKE.y_signature);
  2895.     /* Send the KEA public key and get the KEA private key. */
  2896.     if (ss->ssl3->clientCertificate != NULL) {
  2897. /* with client-auth */
  2898. privKeaKey = sendFortezzaCKXClientAuth(ss, &fortezza_CKE);
  2899.     } else {
  2900. /* without client-auth */
  2901. privKeaKey = sendFortezzaCKXNoClientAuth(ss);
  2902.     }
  2903.     if (privKeaKey == NULL) {
  2904. rv = SECFailure;
  2905. goto loser; /* error was already set. */
  2906.     }
  2907.     /* Now we derive the TEK, and generate r_c the client's "random" public key.
  2908.      * r_c is generated and filled in by the PubDerive call below.
  2909.      */
  2910.     raItem.data = fortezza_CKE.r_c;
  2911.     raItem.len  = sizeof fortezza_CKE.r_c;
  2912.     /* R_s == server's "random" public key, sent in the Server Key Exchange */
  2913.     rbItem.data = ss->ssl3->fortezza.R_s;
  2914.     rbItem.len  = sizeof ss->ssl3->fortezza.R_s;
  2915.     tek = PK11_PubDerive(privKeaKey, serverKey, PR_TRUE, /* generate r_c */
  2916.                          &raItem, &rbItem, CKM_KEA_KEY_DERIVE,
  2917.  CKM_SKIPJACK_WRAP, CKA_WRAP, 0, pwArg);
  2918.     SECKEY_DestroyPrivateKey(privKeaKey);
  2919.     privKeaKey = NULL;
  2920.     if (tek == NULL) {
  2921. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  2922. goto loser;
  2923.     }
  2924.     ss->ssl3->fortezza.tek = PK11_ReferenceSymKey(tek); /* can't fail. */
  2925.     /* encrypt the pms with the TEK.
  2926.      * NB: PK11_WrapSymKey will generate and output the encrypted PMS
  2927.      *     AND the IV for decrypting the PMS.
  2928.      */
  2929.     param.data   = fortezza_CKE.master_secret_iv;
  2930.     param.len    = sizeof fortezza_CKE.master_secret_iv;
  2931.     enc_pms.data = fortezza_CKE.encrypted_preMasterSecret;
  2932.     enc_pms.len  = sizeof fortezza_CKE.encrypted_preMasterSecret;
  2933.     rv = PK11_WrapSymKey(CKM_SKIPJACK_CBC64, &param, tek, pms, &enc_pms);
  2934.     if (rv != SECSuccess) {
  2935. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  2936. goto loser;
  2937.     }
  2938.     rv = SECFailure; /* not there yet. */
  2939.     slot = PK11_GetSlotFromKey(tek);
  2940.     ssl_GetSpecWriteLock(ss); releaseSpecWriteLock = PR_TRUE;
  2941.     pwSpec  = ss->ssl3->pwSpec;
  2942.     pwSpec->client.write_key = client_write_key =
  2943.     PK11_KeyGen(slot, CKM_SKIPJACK_CBC64, NULL, 0, pwArg);
  2944.     if (client_write_key == NULL) {
  2945. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  2946. goto loser;
  2947.     }
  2948.     /* the -1 is a hack. It's supposed to be key size, but we use it
  2949.      * to tell the wrapper that we're doing a weird PKCS #11 key gen.
  2950.      * Usually the result of key gen is an encrypt key. This is not
  2951.      * the case with SSL, where this key is a decrypt key.
  2952.      */
  2953.     pwSpec->server.write_key = server_write_key =
  2954.     PK11_KeyGen(slot, CKM_SKIPJACK_CBC64, NULL, -1, pwArg);
  2955.     if (server_write_key == NULL) {
  2956. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  2957. goto loser;
  2958.     }
  2959.     rv = ssl3_InitPendingCipherSpec(ss,  pms);
  2960.     PK11_FreeSymKey(pms); pms = NULL;
  2961.     if (rv != SECSuccess) {
  2962. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  2963. goto loser;
  2964.     }
  2965.     /* copy the keys and IVs out now */
  2966.     item.data = fortezza_CKE.wrapped_client_write_key;
  2967.     item.len  = sizeof fortezza_CKE.wrapped_client_write_key;
  2968.     rv = PK11_WrapSymKey(CKM_SKIPJACK_WRAP, NULL, tek, client_write_key, &item);
  2969.     if (rv != SECSuccess) {
  2970. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  2971. goto loser;
  2972.     }
  2973.     item.data = fortezza_CKE.wrapped_server_write_key;
  2974.     item.len  = sizeof fortezza_CKE.wrapped_server_write_key;
  2975.     rv = PK11_WrapSymKey(CKM_SKIPJACK_WRAP, NULL, tek, server_write_key, &item);
  2976.     if (rv != SECSuccess) {
  2977. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  2978. goto loser;
  2979.     }
  2980.     /* we only get the generated IV's if we're doing skipjack.  */
  2981.     if (pwSpec->cipher_def->calg == calg_fortezza) {
  2982. PORT_Memcpy(fortezza_CKE.client_write_iv, pwSpec->client.write_iv,
  2983.     sizeof fortezza_CKE.client_write_iv);
  2984. PORT_Memcpy(fortezza_CKE.server_write_iv, pwSpec->server.write_iv,
  2985.     sizeof fortezza_CKE.server_write_iv);
  2986.     } else {
  2987. /* generate IVs to make old servers happy */
  2988. rv = PK11_GenerateFortezzaIV(client_write_key,
  2989.                              fortezza_CKE.client_write_iv,
  2990.                              sizeof fortezza_CKE.client_write_iv);
  2991. if (rv != SECSuccess) {
  2992.     ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  2993.     goto loser;
  2994. }
  2995. rv = PK11_GenerateFortezzaIV(server_write_key,
  2996.                              fortezza_CKE.server_write_iv,
  2997.                              sizeof fortezza_CKE.server_write_iv);
  2998. if (rv != SECSuccess) {
  2999.     ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  3000.     goto loser;
  3001. }
  3002.     }
  3003.     /* NOTE: This technique of writing out the struct, rather than writing
  3004.      * out the individual members works only because all the rest of the
  3005.      * values are fixed-length strings of well-defined byte order.
  3006.      * Add one SECItem or one Number and we will need to break the elements out.
  3007.      */
  3008.     rv = ssl3_AppendHandshake(ss, &fortezza_CKE.r_c,
  3009.       (sizeof fortezza_CKE - sizeof fortezza_CKE.y_c));
  3010.     if (rv != SECSuccess) {
  3011. goto loser; /* err was set by AppendHandshake. */
  3012.     }
  3013.     /* now we initialize our contexts */
  3014.     sid->u.ssl3.hasFortezza = PR_TRUE;
  3015.     sid->u.ssl3.tek         = tek; tek = NULL;  /* adopt.. */
  3016.     if (pwSpec->cipher_def->calg == calg_fortezza) {
  3017. sid->u.ssl3.clientWriteKey =
  3018.     PK11_ReferenceSymKey(pwSpec->client.write_key);
  3019. sid->u.ssl3.serverWriteKey=
  3020.     PK11_ReferenceSymKey(pwSpec->server.write_key);
  3021. PORT_Memcpy(sid->u.ssl3.keys.client_write_iv,
  3022.             pwSpec->client.write_iv,
  3023.     sizeof sid->u.ssl3.keys.client_write_iv);
  3024. PORT_Memcpy(sid->u.ssl3.keys.server_write_iv,
  3025.             pwSpec->server.write_iv,
  3026.     sizeof sid->u.ssl3.keys.server_write_iv);
  3027. rv = PK11_SaveContext((PK11Context *)pwSpec->encodeContext,
  3028.       sid->u.ssl3.clientWriteSave,
  3029.       &sid->u.ssl3.clientWriteSaveLen,
  3030.       sizeof sid->u.ssl3.clientWriteSave);
  3031. if (rv != SECSuccess) {
  3032.     ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  3033.     goto loser;
  3034. }
  3035.     } else {
  3036. PK11_FreeSymKey(client_write_key);
  3037. pwSpec->client.write_key = client_write_key = NULL;
  3038. PK11_FreeSymKey(server_write_key);
  3039. pwSpec->server.write_key = server_write_key = NULL;
  3040. rv = SECSuccess;
  3041.     }
  3042.     /* FALL THROUGH */
  3043. loser:
  3044.     if (tek)    PK11_FreeSymKey(tek);
  3045.     if (slot)   PK11_FreeSlot(slot);
  3046.     if (pms)    PK11_FreeSymKey(pms);
  3047.     if (rv != SECSuccess) {
  3048.      if (client_write_key) {
  3049.     PK11_FreeSymKey(client_write_key);
  3050.     pwSpec->client.write_key = client_write_key = NULL;
  3051. }
  3052.      if (server_write_key) {
  3053.     PK11_FreeSymKey(server_write_key);
  3054.     pwSpec->server.write_key = server_write_key = NULL;
  3055. }
  3056.     }
  3057.     if (releaseSpecWriteLock)
  3058. ssl_GetSpecWriteLock(ss);
  3059.     return rv;
  3060. }
  3061. /* Called from ssl3_HandleServerHelloDone(). */
  3062. static SECStatus
  3063. ssl3_SendClientKeyExchange(sslSocket *ss)
  3064. {
  3065.     SECKEYPublicKey * serverKey  = NULL;
  3066.     SECStatus  rv  = SECFailure;
  3067.     PRBool              isTLS;
  3068.     SSL_TRC(3, ("%d: SSL3[%d]: send client_key_exchange handshake",
  3069. SSL_GETPID(), ss->fd));
  3070.     PORT_Assert( ssl_HaveXmitBufLock(ss));
  3071.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss));
  3072.     if (ss->sec->peerKey == NULL) {
  3073. serverKey = CERT_ExtractPublicKey(ss->sec->peerCert);
  3074. if (serverKey == NULL) {
  3075.     PORT_SetError(SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE);
  3076.     return SECFailure;
  3077. }
  3078.     } else {
  3079. serverKey = ss->sec->peerKey;
  3080. ss->sec->peerKey = NULL; /* we're done with it now */
  3081.     }
  3082.     isTLS = (PRBool)(ss->ssl3->pwSpec->version > SSL_LIBRARY_VERSION_3_0);
  3083.     /* enforce limits on kea key sizes. */
  3084.     if (ss->ssl3->hs.kea_def->is_limited) {
  3085. int keyLen = SECKEY_PublicKeyStrength(serverKey); /* bytes */
  3086. if (keyLen * BPB > ss->ssl3->hs.kea_def->key_size_limit) {
  3087.     if (isTLS)
  3088. (void)SSL3_SendAlert(ss, alert_fatal, export_restriction);
  3089.     else
  3090. (void)ssl3_HandshakeFailure(ss);
  3091.     PORT_SetError(SSL_ERROR_PUB_KEY_SIZE_LIMIT_EXCEEDED);
  3092.     goto loser;
  3093. }
  3094.     }
  3095.     switch (ss->ssl3->hs.kea_def->exchKeyType) {
  3096.     case kt_rsa:
  3097. rv = sendRSAClientKeyExchange(ss, serverKey);
  3098. break;
  3099.     case kt_fortezza:
  3100. rv = sendFortezzaClientKeyExchange(ss, serverKey);
  3101. break;
  3102.     default:
  3103. /* got an unknown or unsupported Key Exchange Algorithm.  */
  3104. SEND_ALERT
  3105. PORT_SetError(SEC_ERROR_UNSUPPORTED_KEYALG);
  3106. break;
  3107.     }
  3108.     SSL_TRC(3, ("%d: SSL3[%d]: DONE sending client_key_exchange",
  3109. SSL_GETPID(), ss->fd));
  3110. loser:
  3111.     if (serverKey) SECKEY_DestroyPublicKey(serverKey);
  3112.     return rv; /* err code already set. */
  3113. }
  3114. /* Called from ssl3_HandleServerHelloDone(). */
  3115. static SECStatus
  3116. ssl3_SendCertificateVerify(sslSocket *ss)
  3117. {
  3118.     ssl3State *   ssl3  = ss->ssl3;
  3119.     SECStatus     rv = SECFailure;
  3120.     PRBool        isTLS;
  3121.     SECItem       buf           = {siBuffer, NULL, 0};
  3122.     SSL3Hashes    hashes;
  3123.     PORT_Assert( ssl_HaveXmitBufLock(ss));
  3124.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss));
  3125.     SSL_TRC(3, ("%d: SSL3[%d]: send certificate_verify handshake",
  3126. SSL_GETPID(), ss->fd));
  3127.     ssl_GetSpecReadLock(ss);
  3128.     rv = ssl3_ComputeHandshakeHashes(ss, ssl3->pwSpec, &hashes, 0);
  3129.     ssl_ReleaseSpecReadLock(ss);
  3130.     if (rv != SECSuccess) {
  3131. goto done; /* err code was set by ssl3_ComputeHandshakeHashes */
  3132.     }
  3133.     isTLS = (PRBool)(ssl3->pwSpec->version > SSL_LIBRARY_VERSION_3_0);
  3134.     rv = ssl3_SignHashes(&hashes, ssl3->clientPrivateKey, &buf, isTLS);
  3135.     if (rv == SECSuccess) {
  3136. PK11SlotInfo * slot;
  3137. sslSessionID * sid   = ss->sec->ci.sid;
  3138.      /* Remember the info about the slot that did the signing.
  3139. ** Later, when doing an SSL restart handshake, verify this.
  3140. ** These calls are mere accessors, and can't fail.
  3141. */
  3142. slot = PK11_GetSlotFromPrivateKey(ss->ssl3->clientPrivateKey);
  3143. sid->u.ssl3.clAuthSeries     = PK11_GetSlotSeries(slot);
  3144. sid->u.ssl3.clAuthSlotID     = PK11_GetSlotID(slot);
  3145. sid->u.ssl3.clAuthModuleID   = PK11_GetModuleID(slot);
  3146. sid->u.ssl3.clAuthValid      = PR_TRUE;
  3147. PK11_FreeSlot(slot);
  3148.     }
  3149.     /* If we're doing RSA key exchange, we're all done with the private key
  3150.      * here.  Diffie-Hellman & Fortezza key exchanges need the client's
  3151.      * private key for the key exchange.
  3152.      */
  3153.     if (ssl3->hs.kea_def->exchKeyType == kt_rsa) {
  3154. SECKEY_DestroyPrivateKey(ssl3->clientPrivateKey);
  3155. ssl3->clientPrivateKey = NULL;
  3156.     }
  3157.     if (rv != SECSuccess) {
  3158. goto done; /* err code was set by ssl3_SignHashes */
  3159.     }
  3160.     rv = ssl3_AppendHandshakeHeader(ss, certificate_verify, buf.len + 2);
  3161.     if (rv != SECSuccess) {
  3162. goto done; /* error code set by AppendHandshake */
  3163.     }
  3164.     rv = ssl3_AppendHandshakeVariable(ss, buf.data, buf.len, 2);
  3165.     if (rv != SECSuccess) {
  3166. goto done; /* error code set by AppendHandshake */
  3167.     }
  3168. done:
  3169.     if (buf.data)
  3170. PORT_Free(buf.data);
  3171.     return rv;
  3172. }
  3173. /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete
  3174.  * ssl3 ServerHello message.
  3175.  * Caller must hold Handshake and RecvBuf locks.
  3176.  */
  3177. static SECStatus
  3178. ssl3_HandleServerHello(sslSocket *ss, SSL3Opaque *b, PRUint32 length)
  3179. {
  3180.     sslSessionID *sid = ss->sec->ci.sid;
  3181.     PRInt32       temp; /* allow for consume number failure */
  3182.     PRBool        suite_found   = PR_FALSE;
  3183.     int           i;
  3184.     int           errCode = SSL_ERROR_RX_MALFORMED_SERVER_HELLO;
  3185.     SECStatus     rv;
  3186.     SECItem       sidBytes  = {siBuffer, NULL, 0};
  3187.     PRBool        sid_match;
  3188.     PRBool        isTLS = PR_FALSE;
  3189.     SSL3AlertDescription desc   = illegal_parameter;
  3190.     SSL3ProtocolVersion version;
  3191.     SSL_TRC(3, ("%d: SSL3[%d]: handle server_hello handshake",
  3192.      SSL_GETPID(), ss->fd));
  3193.     PORT_Assert( ssl_HaveRecvBufLock(ss) );
  3194.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  3195.     rv = ssl3_InitState(ss);
  3196.     if (rv != SECSuccess) {
  3197. errCode = PORT_GetError(); /* ssl3_InitState has set the error code. */
  3198. goto alert_loser;
  3199.     }
  3200.     if (ss->ssl3->hs.ws != wait_server_hello) {
  3201.         errCode = SSL_ERROR_RX_UNEXPECTED_SERVER_HELLO;
  3202. desc    = unexpected_message;
  3203. goto alert_loser;
  3204.     }
  3205.     temp = ssl3_ConsumeHandshakeNumber(ss, 2, &b, &length);
  3206.     if (temp < 0) {
  3207.      goto loser;  /* alert has been sent */
  3208.     }
  3209.     version = (SSL3ProtocolVersion)temp;
  3210.     /* this is appropriate since the negotiation is complete, and we only
  3211.     ** know SSL 3.x.
  3212.     */
  3213.     if (MSB(version) != MSB(SSL_LIBRARY_VERSION_3_0)) {
  3214.      desc = handshake_failure;
  3215. goto alert_loser;
  3216.     }
  3217.     rv = ssl3_NegotiateVersion(ss, version);
  3218.     if (rv != SECSuccess) {
  3219.      desc    = handshake_failure;
  3220. errCode = SSL_ERROR_NO_CYPHER_OVERLAP;
  3221. goto alert_loser;
  3222.     }
  3223.     isTLS = (ss->version > SSL_LIBRARY_VERSION_3_0);
  3224.     rv = ssl3_ConsumeHandshake(
  3225. ss, &ss->ssl3->hs.server_random, SSL3_RANDOM_LENGTH, &b, &length);
  3226.     if (rv != SECSuccess) {
  3227.      goto loser;  /* alert has been sent */
  3228.     }
  3229.     rv = ssl3_ConsumeHandshakeVariable(ss, &sidBytes, 1, &b, &length);
  3230.     if (rv != SECSuccess) {
  3231.      goto loser;  /* alert has been sent */
  3232.     }
  3233.     if (sidBytes.len > SSL3_SESSIONID_BYTES) {
  3234. if (isTLS)
  3235.     desc = decode_error;
  3236. goto alert_loser; /* malformed. */
  3237.     }
  3238.     /* find selected cipher suite in our list. */
  3239.     temp = ssl3_ConsumeHandshakeNumber(ss, 2, &b, &length);
  3240.     if (temp < 0) {
  3241.      goto loser;  /* alert has been sent */
  3242.     }
  3243.     ssl3_config_match_init(ss);
  3244.     for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) {
  3245. ssl3CipherSuiteCfg *suite = &ss->cipherSuites[i];
  3246. if ((temp == suite->cipher_suite) &&
  3247.     (config_match(suite, ss->ssl3->policy, PR_TRUE))) {
  3248.     suite_found = PR_TRUE;
  3249.     break; /* success */
  3250. }
  3251.     }
  3252.     if (!suite_found) {
  3253.      desc    = handshake_failure;
  3254. errCode = SSL_ERROR_NO_CYPHER_OVERLAP;
  3255. goto alert_loser;
  3256.     }
  3257.     ss->ssl3->hs.cipher_suite = (ssl3CipherSuite)temp;
  3258.     ss->ssl3->hs.suite_def    = ssl_LookupCipherSuiteDef((ssl3CipherSuite)temp);
  3259.     PORT_Assert(ss->ssl3->hs.suite_def);
  3260.     if (!ss->ssl3->hs.suite_def) {
  3261.      PORT_SetError(errCode = SEC_ERROR_LIBRARY_FAILURE);
  3262. goto loser; /* we don't send alerts for our screw-ups. */
  3263.     }
  3264.     /* find selected compression method in our list. */
  3265.     temp = ssl3_ConsumeHandshakeNumber(ss, 1, &b, &length);
  3266.     if (temp < 0) {
  3267.      goto loser;  /* alert has been sent */
  3268.     }
  3269.     suite_found = PR_FALSE;
  3270.     for (i = 0; i < compressionMethodsCount; i++) {
  3271. if (temp == compressions[i])  {
  3272.     suite_found = PR_TRUE;
  3273.     break; /* success */
  3274.      }
  3275.     }
  3276.     if (!suite_found) {
  3277.      desc    = handshake_failure;
  3278. errCode = SSL_ERROR_NO_COMPRESSION_OVERLAP;
  3279. goto alert_loser;
  3280.     }
  3281.     ss->ssl3->hs.compression = (SSL3CompressionMethod)temp;
  3282.     if (length != 0) { /* malformed */
  3283. goto alert_loser;
  3284.     }
  3285.     /* Any errors after this point are not "malformed" errors. */
  3286.     desc    = handshake_failure;
  3287.     /* we need to call ssl3_SetupPendingCipherSpec here so we can check the
  3288.      * key exchange algorithm. */
  3289.     rv = ssl3_SetupPendingCipherSpec(ss, ss->ssl3);
  3290.     if (rv != SECSuccess) {
  3291. goto alert_loser; /* error code is set. */
  3292.     }
  3293.     /* We may or may not have sent a session id, we may get one back or
  3294.      * not and if so it may match the one we sent.
  3295.      * Attempt to restore the master secret to see if this is so...