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

CA认证

开发平台:

WINDOWS

  1.      * Don't consider failure to find a matching SID an error.
  2.      */
  3.     sid_match = (PRBool)(sidBytes.len > 0 &&
  4. sidBytes.len == sid->u.ssl3.sessionIDLength &&
  5. !PORT_Memcmp(sid->u.ssl3.sessionID, sidBytes.data, sidBytes.len));
  6.     if (sid_match &&
  7. sid->version == ss->version &&
  8. sid->u.ssl3.cipherSuite == ss->ssl3->hs.cipher_suite) do {
  9. PK11SlotInfo *slot;
  10. PK11SymKey *  wrapKey;     /* wrapping key */
  11. SECItem       wrappedMS;   /* wrapped master secret. */
  12. CK_FLAGS      keyFlags      = 0;
  13. slot = SECMOD_LookupSlot(sid->u.ssl3.masterModuleID,
  14.                          sid->u.ssl3.masterSlotID);
  15. if (slot == NULL) {
  16.     break; /* not considered an error. */
  17. }
  18. if (!PK11_IsPresent(slot)) {
  19.     PK11_FreeSlot(slot);
  20.     break; /* not considered an error. */
  21. }
  22. wrapKey = PK11_GetWrapKey(slot, sid->u.ssl3.masterWrapIndex,
  23.   sid->u.ssl3.masterWrapMech,
  24.   sid->u.ssl3.masterWrapSeries,
  25.   ss->pkcs11PinArg);
  26. PK11_FreeSlot(slot);
  27. if (wrapKey == NULL) {
  28.     break; /* not considered an error. */
  29. }
  30. if (ss->version > SSL_LIBRARY_VERSION_3_0) { /* isTLS */
  31.     keyFlags = CKF_SIGN | CKF_VERIFY;
  32. }
  33.         wrappedMS.data = sid->u.ssl3.keys.wrapped_master_secret;
  34. wrappedMS.len  = sid->u.ssl3.keys.wrapped_master_secret_len;
  35. ss->ssl3->pwSpec->master_secret =
  36.     PK11_UnwrapSymKeyWithFlags(wrapKey, sid->u.ssl3.masterWrapMech, 
  37.      NULL, &wrappedMS, CKM_SSL3_MASTER_KEY_DERIVE,
  38.         CKA_DERIVE, sizeof(SSL3MasterSecret), keyFlags);
  39. errCode = PORT_GetError();
  40. PK11_FreeSymKey(wrapKey);
  41. if (ss->ssl3->pwSpec->master_secret == NULL) {
  42.     break; /* errorCode set just after call to UnwrapSymKey. */
  43. }
  44. /* Got a Match */
  45. ++ssl3_hsh_sid_cache_hits;
  46. ss->ssl3->hs.ws         = wait_change_cipher;
  47. ss->ssl3->hs.isResuming = PR_TRUE;
  48. /* copy the peer cert from the SID */
  49. if (sid->peerCert != NULL) {
  50.     ss->sec->peerCert = CERT_DupCertificate(sid->peerCert);
  51. }
  52. /* reload the FORTEZZA key material. These keys aren't generated
  53.  * by the master secret, but by the key exchange. We restart by
  54.  * reusing these keys. */
  55. if (sid->u.ssl3.hasFortezza) {
  56.     ss->ssl3->fortezza.tek = PK11_ReferenceSymKey(sid->u.ssl3.tek);
  57. }
  58. if (ss->ssl3->hs.suite_def->bulk_cipher_alg == cipher_fortezza) {
  59.     ss->ssl3->pwSpec->client.write_key =
  60.      PK11_ReferenceSymKey(sid->u.ssl3.clientWriteKey);
  61.     ss->ssl3->pwSpec->server.write_key =
  62.      PK11_ReferenceSymKey(sid->u.ssl3.serverWriteKey);
  63.     /* add the tek later for pre-encrypted files */
  64.     PORT_Memcpy(ss->ssl3->pwSpec->client.write_iv,
  65. sid->u.ssl3.keys.client_write_iv,
  66. sizeof sid->u.ssl3.keys.client_write_iv);
  67.     PORT_Memcpy(ss->ssl3->pwSpec->server.write_iv,
  68. sid->u.ssl3.keys.server_write_iv,
  69. sizeof sid->u.ssl3.keys.server_write_iv);
  70. }
  71. /* NULL value for PMS signifies re-use of the old MS */
  72. rv = ssl3_InitPendingCipherSpec(ss,  NULL);
  73. if (rv != SECSuccess) {
  74.     goto alert_loser; /* err code was set by ssl3_InitPendingCipherSpec */
  75. }
  76. if (ss->ssl3->hs.suite_def->bulk_cipher_alg == cipher_fortezza) {
  77.     rv = PK11_RestoreContext(
  78. (PK11Context *)ss->ssl3->pwSpec->encodeContext,
  79. sid->u.ssl3.clientWriteSave,
  80. sid->u.ssl3.clientWriteSaveLen);
  81.     if (rv != SECSuccess) {
  82. goto alert_loser; /* err is set. */
  83.     }
  84. }
  85. SECITEM_ZfreeItem(&sidBytes, PR_FALSE);
  86. return SECSuccess;
  87.     } while (0);
  88.     if (sid_match)
  89. ++ssl3_hsh_sid_cache_not_ok;
  90.     else
  91. ++ssl3_hsh_sid_cache_misses;
  92.     /* throw the old one away */
  93.     sid->u.ssl3.resumable = PR_FALSE;
  94.     (*ss->sec->uncache)(sid);
  95.     ssl_FreeSID(sid);
  96.     /* get a new sid */
  97.     ss->sec->ci.sid = sid = ssl3_NewSessionID(ss, PR_FALSE);
  98.     if (sid == NULL) {
  99. goto alert_loser; /* memory error is set. */
  100.     }
  101.     sid->version = ss->version;
  102.     sid->u.ssl3.sessionIDLength = sidBytes.len;
  103.     PORT_Memcpy(sid->u.ssl3.sessionID, sidBytes.data, sidBytes.len);
  104.     SECITEM_ZfreeItem(&sidBytes, PR_FALSE);
  105.     ss->ssl3->hs.isResuming = PR_FALSE;
  106.     ss->ssl3->hs.ws         = wait_server_cert;
  107.     return SECSuccess;
  108. alert_loser:
  109.     (void)SSL3_SendAlert(ss, alert_fatal, desc);
  110. loser:
  111.     if (sidBytes.data != NULL)
  112. SECITEM_ZfreeItem(&sidBytes, PR_FALSE);
  113.     errCode = ssl_MapLowLevelError(errCode);
  114.     return SECFailure;
  115. }
  116. /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete
  117.  * ssl3 ServerKeyExchange message.
  118.  * Caller must hold Handshake and RecvBuf locks.
  119.  */
  120. static SECStatus
  121. ssl3_HandleServerKeyExchange(sslSocket *ss, SSL3Opaque *b, PRUint32 length)
  122. {
  123.     PRArenaPool *    arena;
  124.     SECKEYPublicKey *peerKey;
  125.     PRBool           isTLS;
  126.     SECStatus        rv;
  127.     int              errCode   = SSL_ERROR_RX_MALFORMED_SERVER_KEY_EXCH;
  128.     SSL3AlertDescription desc  = illegal_parameter;
  129.     SECItem          modulus   = {siBuffer, NULL, 0};
  130.     SECItem          exponent  = {siBuffer, NULL, 0};
  131.     SECItem          signature = {siBuffer, NULL, 0};
  132.     SSL3Hashes       hashes;
  133.     SSL_TRC(3, ("%d: SSL3[%d]: handle server_key_exchange handshake",
  134. SSL_GETPID(), ss->fd));
  135.     PORT_Assert( ssl_HaveRecvBufLock(ss) );
  136.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  137.     if (ss->ssl3->hs.ws != wait_server_key &&
  138. ss->ssl3->hs.ws != wait_server_cert) {
  139. errCode = SSL_ERROR_RX_UNEXPECTED_SERVER_KEY_EXCH;
  140. desc    = unexpected_message;
  141. goto alert_loser;
  142.     }
  143.     if (ss->sec->peerCert == NULL) {
  144. errCode = SSL_ERROR_RX_UNEXPECTED_SERVER_KEY_EXCH;
  145. desc    = unexpected_message;
  146. goto alert_loser;
  147.     }
  148.     isTLS = (PRBool)(ss->ssl3->prSpec->version > SSL_LIBRARY_VERSION_3_0);
  149.     switch (ss->ssl3->hs.kea_def->exchKeyType) {
  150.     case kt_rsa:
  151.      rv = ssl3_ConsumeHandshakeVariable(ss, &modulus, 2, &b, &length);
  152.      if (rv != SECSuccess) {
  153.     goto loser; /* malformed. */
  154. }
  155.      rv = ssl3_ConsumeHandshakeVariable(ss, &exponent, 2, &b, &length);
  156.      if (rv != SECSuccess) {
  157.     goto loser; /* malformed. */
  158. }
  159.      rv = ssl3_ConsumeHandshakeVariable(ss, &signature, 2, &b, &length);
  160.      if (rv != SECSuccess) {
  161.     goto loser; /* malformed. */
  162. }
  163.      if (length != 0) {
  164.     if (isTLS)
  165. desc = decode_error;
  166.     goto alert_loser; /* malformed. */
  167. }
  168. /* failures after this point are not malformed handshakes. */
  169. /* TLS: send decrypt_error if signature failed. */
  170.      desc = isTLS ? decrypt_error : handshake_failure;
  171.      /*
  172.        *  check to make sure the hash is signed by right guy
  173.        */
  174.      rv = ssl3_ComputeExportRSAKeyHash(modulus, exponent,
  175.   &ss->ssl3->hs.client_random,
  176.   &ss->ssl3->hs.server_random, &hashes);
  177.         if (rv != SECSuccess) {
  178.     errCode =
  179.      ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE);
  180.     goto alert_loser;
  181. }
  182.         rv = ssl3_VerifySignedHashes(&hashes, ss->sec->peerCert, &signature,
  183.     isTLS, ss->pkcs11PinArg);
  184. if (rv != SECSuccess)  {
  185.     errCode =
  186.      ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE);
  187.     goto alert_loser;
  188. }
  189. /*
  190.  * we really need to build a new key here because we can no longer
  191.  * ignore calling SECKEY_DestroyPublicKey. Using the key may allocate
  192.  * pkcs11 slots and ID's.
  193.  */
  194.      arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
  195. if (arena == NULL) {
  196.     goto no_memory;
  197. }
  198.      ss->sec->peerKey = peerKey = PORT_ArenaZNew(arena, SECKEYPublicKey);
  199.      if (peerKey == NULL) {
  200.     goto no_memory;
  201. }
  202. peerKey->arena              = arena;
  203. peerKey->keyType            = rsaKey;
  204. peerKey->pkcs11Slot         = NULL;
  205. peerKey->pkcs11ID           = CK_INVALID_KEY;
  206.      peerKey->u.rsa.modulus.data =
  207.     (unsigned char*)PORT_ArenaAlloc(arena, modulus.len);
  208. if (peerKey->u.rsa.modulus.data == NULL)
  209.     goto no_memory;
  210.      PORT_Memcpy(peerKey->u.rsa.modulus.data, modulus.data, modulus.len);
  211.      peerKey->u.rsa.modulus.len = modulus.len;
  212.      peerKey->u.rsa.publicExponent.data =
  213.     (unsigned char*)PORT_ArenaAlloc(arena, exponent.len);
  214.         if (peerKey->u.rsa.publicExponent.data == NULL)
  215.     goto no_memory;
  216.      PORT_Memcpy(peerKey->u.rsa.publicExponent.data,
  217.     exponent.data, exponent.len);
  218.      peerKey->u.rsa.publicExponent.len = exponent.len;
  219.      PORT_Free(modulus.data);
  220.      PORT_Free(exponent.data);
  221. PORT_Free(signature.data);
  222.      ss->ssl3->hs.ws = wait_cert_request;
  223.      return SECSuccess;
  224.     case kt_fortezza:
  225. /* Fortezza needs *BOTH* a server cert message
  226.  * and a server key exchange message.
  227.    */
  228. if (ss->ssl3->hs.ws == wait_server_cert) {
  229.     errCode = SSL_ERROR_RX_UNEXPECTED_SERVER_KEY_EXCH;
  230.     desc    = unexpected_message;
  231.     goto alert_loser;
  232. }
  233. /* Get the server's "random" public key. */
  234.      rv = ssl3_ConsumeHandshake(ss, ss->ssl3->fortezza.R_s,
  235.    sizeof ss->ssl3->fortezza.R_s, &b, &length);
  236.      if (rv != SECSuccess) {
  237.     goto loser; /* malformed */
  238. }
  239.      ss->ssl3->hs.ws = wait_cert_request;
  240.      return SECSuccess;
  241.     default:
  242.      desc    = handshake_failure;
  243. errCode = SEC_ERROR_UNSUPPORTED_KEYALG;
  244. break; /* goto alert_loser; */
  245.     }
  246. alert_loser:
  247.     (void)SSL3_SendAlert(ss, alert_fatal, desc);
  248. loser:
  249.     if (modulus.data   != NULL) SECITEM_FreeItem(&modulus,   PR_FALSE);
  250.     if (exponent.data  != NULL) SECITEM_FreeItem(&exponent,  PR_FALSE);
  251.     if (signature.data != NULL) SECITEM_FreeItem(&signature, PR_FALSE);
  252.     PORT_SetError( errCode );
  253.     return SECFailure;
  254. no_memory: /* no-memory error has already been set. */
  255.     if (modulus.data   != NULL) SECITEM_FreeItem(&modulus,   PR_FALSE);
  256.     if (exponent.data  != NULL) SECITEM_FreeItem(&exponent,  PR_FALSE);
  257.     if (signature.data != NULL) SECITEM_FreeItem(&signature, PR_FALSE);
  258.     ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE);
  259.     return SECFailure;
  260. }
  261. typedef struct dnameNode {
  262.     struct dnameNode *next;
  263.     SECItem           name;
  264. } dnameNode;
  265. /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete
  266.  * ssl3 Certificate Request message.
  267.  * Caller must hold Handshake and RecvBuf locks.
  268.  */
  269. static SECStatus
  270. ssl3_HandleCertificateRequest(sslSocket *ss, SSL3Opaque *b, PRUint32 length)
  271. {
  272.     ssl3State *          ssl3        = ss->ssl3;
  273.     PRArenaPool *        arena       = NULL;
  274.     dnameNode *          node;
  275.     unsigned char *      data;
  276.     PRInt32              remaining;
  277.     PRInt32              len;
  278.     PRBool               isTLS       = PR_FALSE;
  279.     int                  i;
  280.     int                  errCode     = SSL_ERROR_RX_MALFORMED_CERT_REQUEST;
  281.     int                  nnames      = 0;
  282.     SECStatus            rv;
  283.     SSL3AlertDescription desc        = illegal_parameter;
  284.     SECItem              cert_types  = {siBuffer, NULL, 0};
  285.     CERTDistNames        ca_list;
  286.     SSL_TRC(3, ("%d: SSL3[%d]: handle certificate_request handshake",
  287. SSL_GETPID(), ss->fd));
  288.     PORT_Assert( ssl_HaveRecvBufLock(ss) );
  289.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  290.     if (ssl3->hs.ws != wait_cert_request &&
  291.      ssl3->hs.ws != wait_server_key) {
  292. desc    = unexpected_message;
  293. errCode = SSL_ERROR_RX_UNEXPECTED_CERT_REQUEST;
  294. goto alert_loser;
  295.     }
  296.     isTLS = (PRBool)(ssl3->prSpec->version > SSL_LIBRARY_VERSION_3_0);
  297.     rv = ssl3_ConsumeHandshakeVariable(ss, &cert_types, 1, &b, &length);
  298.     if (rv != SECSuccess)
  299.      goto loser; /* malformed, alert has been sent */
  300.     arena = ca_list.arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
  301.     if (arena == NULL)
  302.      goto no_mem;
  303.     remaining = ssl3_ConsumeHandshakeNumber(ss, 2, &b, &length);
  304.     if (remaining < 0)
  305.      goto loser;   /* malformed, alert has been sent */
  306.     ca_list.head = node = PORT_ArenaZNew(arena, dnameNode);
  307.     if (node == NULL)
  308.      goto no_mem;
  309.     while (remaining != 0) {
  310. if (remaining < 2)
  311.     goto alert_loser; /* malformed */
  312. node->name.len = len = ssl3_ConsumeHandshakeNumber(ss, 2, &b, &length);
  313. if (len < 0)
  314.     goto loser; /* malformed, alert has been sent */
  315. remaining -= 2;
  316. if (remaining < len)
  317.     goto alert_loser; /* malformed */
  318. data = node->name.data = (unsigned char*)PORT_ArenaAlloc(arena, len);
  319. if (data == NULL)
  320.     goto no_mem;
  321. rv = ssl3_ConsumeHandshake(ss, data, len, &b, &length);
  322. if (rv != SECSuccess)
  323.     goto loser; /* malformed, alert has been sent */
  324. remaining -= len;
  325. nnames++;
  326. if (remaining == 0)
  327.     break; /* success */
  328. node->next = PORT_ArenaZNew(arena, dnameNode);
  329. node = node->next;
  330. if (node == NULL)
  331.     goto no_mem;
  332.     }
  333.     ca_list.nnames = nnames;
  334.     ca_list.names  = (SECItem*)PORT_ArenaAlloc(arena, nnames * sizeof(SECItem));
  335.     if (ca_list.names == NULL)
  336.         goto no_mem;
  337.     for(i = 0, node = (dnameNode*)ca_list.head;
  338. i < nnames;
  339. i++, node = node->next) {
  340. ca_list.names[i] = node->name;
  341.     }
  342.     if (length != 0)
  343.         goto alert_loser;    /* malformed */
  344.     desc = no_certificate;
  345.     ssl3->hs.ws = wait_hello_done;
  346.     if (ss->getClientAuthData == NULL) {
  347. rv = SECFailure; /* force it to send a no_certificate alert */
  348.     } else {
  349. /* XXX Should pass cert_types in this call!! */
  350. rv = (SECStatus)(*ss->getClientAuthData)(ss->getClientAuthDataArg,
  351.  ss->fd, &ca_list,
  352.  &ssl3->clientCertificate,
  353.  &ssl3->clientPrivateKey);
  354.     }
  355.     switch (rv) {
  356.     case SECWouldBlock: /* getClientAuthData has put up a dialog box. */
  357. ssl_SetAlwaysBlock(ss);
  358. break; /* not an error */
  359.     case SECSuccess:
  360. /* Setting ssl3->clientCertChain non-NULL will cause
  361.  * ssl3_HandleServerHelloDone to call SendCertificate.
  362.  */
  363. ssl3->clientCertChain = CERT_CertChainFromCert(ssl3->clientCertificate,
  364. certUsageSSLClient, PR_FALSE);
  365. if (ssl3->clientCertChain == NULL) {
  366.     if (ssl3->clientCertificate != NULL) {
  367. CERT_DestroyCertificate(ssl3->clientCertificate);
  368. ssl3->clientCertificate = NULL;
  369.     }
  370.     if (ssl3->clientPrivateKey != NULL) {
  371. SECKEY_DestroyPrivateKey(ssl3->clientPrivateKey);
  372. ssl3->clientPrivateKey = NULL;
  373.     }
  374.     goto send_no_certificate;
  375. }
  376. break; /* not an error */
  377.     case SECFailure:
  378.     default:
  379. send_no_certificate:
  380. if (isTLS) {
  381.     ssl3->sendEmptyCert = PR_TRUE;
  382. } else {
  383.     (void)SSL3_SendAlert(ss, alert_warning, no_certificate);
  384. }
  385. rv = SECSuccess;
  386. break;
  387.     }
  388.     goto done;
  389. no_mem:
  390.     rv = SECFailure;
  391.     PORT_SetError(SEC_ERROR_NO_MEMORY);
  392.     goto done;
  393. alert_loser:
  394.     if (isTLS && desc == illegal_parameter)
  395.      desc = decode_error;
  396.     (void)SSL3_SendAlert(ss, alert_fatal, desc);
  397. loser:
  398.     PORT_SetError(errCode);
  399.     rv = SECFailure;
  400. done:
  401.     if (arena != NULL)
  402.      PORT_FreeArena(arena, PR_FALSE);
  403.     if (cert_types.data != NULL)
  404.      SECITEM_FreeItem(&cert_types, PR_FALSE);
  405.     return rv;
  406. }
  407. /*
  408.  * attempt to restart the handshake after asynchronously handling
  409.  * a request for the client's certificate.
  410.  *
  411.  * inputs:
  412.  * cert Client cert chosen by application.
  413.  * Note: ssl takes this reference, and does not bump the
  414.  * reference count.  The caller should drop its reference
  415.  * without calling CERT_DestroyCert after calling this function.
  416.  *
  417.  * key Private key associated with cert.  This function makes a
  418.  * copy of the private key, so the caller remains responsible
  419.  * for destroying its copy after this function returns.
  420.  *
  421.  * certChain  Chain of signers for cert.
  422.  * Note: ssl takes this reference, and does not copy the chain.
  423.  * The caller should drop its reference without destroying the
  424.  * chain.  SSL will free the chain when it is done with it.
  425.  *
  426.  * Return value: XXX
  427.  *
  428.  * XXX This code only works on the initial handshake on a connection, XXX
  429.  *     It does not work on a subsequent handshake (redo).
  430.  *
  431.  * Caller holds 1stHandshakeLock.
  432.  */
  433. SECStatus
  434. ssl3_RestartHandshakeAfterCertReq(sslSocket *         ss,
  435. CERTCertificate *    cert,
  436. SECKEYPrivateKey *   key,
  437. CERTCertificateList *certChain)
  438. {
  439.     SECStatus        rv          = SECSuccess;
  440.     if (MSB(ss->version) == MSB(SSL_LIBRARY_VERSION_3_0)) {
  441. /* XXX This code only works on the initial handshake on a connection,
  442. ** XXX It does not work on a subsequent handshake (redo).
  443. */
  444. if (ss->handshake != 0) {
  445.     ss->handshake               = ssl_GatherRecord1stHandshake;
  446.     ss->ssl3->clientCertificate = cert;
  447.     ss->ssl3->clientCertChain   = certChain;
  448.     if (key == NULL) {
  449. (void)SSL3_SendAlert(ss, alert_warning, no_certificate);
  450. ss->ssl3->clientPrivateKey = NULL;
  451.     } else {
  452. ss->ssl3->clientPrivateKey = SECKEY_CopyPrivateKey(key);
  453.     }
  454.     ssl_GetRecvBufLock(ss);
  455.     if (ss->ssl3->hs.msgState.buf != NULL) {
  456. rv = ssl3_HandleRecord(ss, NULL, &ss->gather->buf);
  457.     }
  458.     ssl_ReleaseRecvBufLock(ss);
  459. }
  460.     }
  461.     return rv;
  462. }
  463. /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete
  464.  * ssl3 Server Hello Done message.
  465.  * Caller must hold Handshake and RecvBuf locks.
  466.  */
  467. static SECStatus
  468. ssl3_HandleServerHelloDone(sslSocket *ss)
  469. {
  470.     SECStatus     rv;
  471.     SSL3WaitState ws          = ss->ssl3->hs.ws;
  472.     PRBool        send_verify = PR_FALSE;
  473.     SSL_TRC(3, ("%d: SSL3[%d]: handle server_hello_done handshake",
  474. SSL_GETPID(), ss->fd));
  475.     PORT_Assert( ssl_HaveRecvBufLock(ss) );
  476.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  477.     if (ws != wait_hello_done  &&
  478.         ws != wait_server_cert &&
  479. ws != wait_server_key  &&
  480. ws != wait_cert_request) {
  481. SSL3_SendAlert(ss, alert_fatal, unexpected_message);
  482. PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HELLO_DONE);
  483. return SECFailure;
  484.     }
  485.     ssl_GetXmitBufLock(ss); /*******************************/
  486.     if (ss->ssl3->sendEmptyCert) {
  487. ss->ssl3->sendEmptyCert = PR_FALSE;
  488. rv = ssl3_SendEmptyCertificate(ss);
  489. /* Don't send verify */
  490. if (rv != SECSuccess) {
  491.     goto loser; /* error code is set. */
  492.      }
  493.     } else
  494.     if (ss->ssl3->clientCertChain  != NULL &&
  495. ss->ssl3->clientPrivateKey != NULL) {
  496. send_verify = PR_TRUE;
  497. rv = ssl3_SendCertificate(ss);
  498. if (rv != SECSuccess) {
  499.     goto loser; /* error code is set. */
  500.      }
  501.     }
  502.     rv = ssl3_SendClientKeyExchange(ss);
  503.     if (rv != SECSuccess) {
  504.      goto loser; /* err is set. */
  505.     }
  506.     if (send_verify) {
  507. rv = ssl3_SendCertificateVerify(ss);
  508. if (rv != SECSuccess) {
  509.     goto loser; /* err is set. */
  510.         }
  511.     }
  512.     rv = ssl3_SendChangeCipherSpecs(ss);
  513.     if (rv != SECSuccess) {
  514. goto loser; /* err code was set. */
  515.     }
  516.     rv = ssl3_SendFinished(ss, 0);
  517.     if (rv != SECSuccess) {
  518. goto loser; /* err code was set. */
  519.     }
  520.     ssl_ReleaseXmitBufLock(ss); /*******************************/
  521.     ss->ssl3->hs.ws = wait_change_cipher;
  522.     return SECSuccess;
  523. loser:
  524.     ssl_ReleaseXmitBufLock(ss);
  525.     return rv;
  526. }
  527. /*
  528.  * Routines used by servers
  529.  */
  530. static SECStatus
  531. ssl3_SendHelloRequest(sslSocket *ss)
  532. {
  533.     SECStatus rv;
  534.     SSL_TRC(3, ("%d: SSL3[%d]: send hello_request handshake", SSL_GETPID(),
  535. ss->fd));
  536.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  537.     PORT_Assert( ssl_HaveXmitBufLock(ss) );
  538.     rv = ssl3_AppendHandshakeHeader(ss, hello_request, 0);
  539.     if (rv != SECSuccess) {
  540. return rv; /* err set by AppendHandshake */
  541.     }
  542.     rv = ssl3_FlushHandshake(ss, 0);
  543.     if (rv != SECSuccess) {
  544. return rv; /* error code set by ssl3_FlushHandshake */
  545.     }
  546.     ss->ssl3->hs.ws = wait_client_hello;
  547.     return SECSuccess;
  548. }
  549. /* Sets memory error when returning NULL.
  550.  * Called from:
  551.  * ssl3_SendClientHello()
  552.  * ssl3_HandleServerHello()
  553.  * ssl3_HandleClientHello()
  554.  * ssl3_HandleV2ClientHello()
  555.  */
  556. static sslSessionID *
  557. ssl3_NewSessionID(sslSocket *ss, PRBool is_server)
  558. {
  559.     sslSessionID *sid;
  560.     sid = PORT_ZNew(sslSessionID);
  561.     if (sid == NULL)
  562.      return sid;
  563.     sid->peerID = (ss->peerID == NULL) ? NULL : PORT_Strdup(ss->peerID);
  564.     sid->urlSvrName = (ss->url    == NULL) ? NULL : PORT_Strdup(ss->url);
  565.     sid->addr           = ss->sec->ci.peer;
  566.     sid->port           = ss->sec->ci.port;
  567.     sid->references     = 1;
  568.     sid->cached         = never_cached;
  569.     sid->version        = ss->version;
  570.     sid->u.ssl3.resumable      = PR_TRUE;
  571.     sid->u.ssl3.policy         = SSL_ALLOWED;
  572.     sid->u.ssl3.hasFortezza    = PR_FALSE;
  573.     sid->u.ssl3.clientWriteKey = NULL;
  574.     sid->u.ssl3.serverWriteKey = NULL;
  575.     sid->u.ssl3.tek            = NULL;
  576.     if (is_server) {
  577. SECStatus rv;
  578. int       pid = SSL_GETPID();
  579. sid->u.ssl3.sessionIDLength = SSL3_SESSIONID_BYTES;
  580. sid->u.ssl3.sessionID[0]    = (pid >> 8) & 0xff;
  581. sid->u.ssl3.sessionID[1]    =  pid       & 0xff;
  582. rv = PK11_GenerateRandom(sid->u.ssl3.sessionID + 2,
  583.                          SSL3_SESSIONID_BYTES -2);
  584. if (rv != SECSuccess) {
  585.     ssl_FreeSID(sid);
  586.     ssl_MapLowLevelError(SSL_ERROR_GENERATE_RANDOM_FAILURE);
  587.     return NULL;
  588.      }
  589.     }
  590.     return sid;
  591. }
  592. /* Called from:  ssl3_HandleClientHello, ssl3_HandleV2ClientHello */
  593. static SECStatus
  594. ssl3_SendServerHelloSequence(sslSocket *ss)
  595. {
  596.     const ssl3KEADef *kea_def;
  597.     SECStatus         rv;
  598.     SSL_TRC(3, ("%d: SSL3[%d]: begin send server_hello sequence",
  599. SSL_GETPID(), ss->fd));
  600.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  601.     PORT_Assert( ssl_HaveXmitBufLock(ss) );
  602.     rv = ssl3_SendServerHello(ss);
  603.     if (rv != SECSuccess) {
  604. return rv; /* err code is set. */
  605.     }
  606.     rv = ssl3_SendCertificate(ss);
  607.     if (rv != SECSuccess) {
  608. return rv; /* error code is set. */
  609.     }
  610.     /* We have to do this after the call to ssl3_SendServerHello,
  611.      * because kea_def is set up by ssl3_SendServerHello().
  612.      */
  613.     kea_def = ss->ssl3->hs.kea_def;
  614.     ss->ssl3->hs.usedStepDownKey = PR_FALSE;
  615.     if (kea_def->kea == kea_fortezza) {
  616. rv = ssl3_SendServerKeyExchange(ss);
  617. if (rv != SECSuccess) {
  618.     return rv; /* err code was set. */
  619. }
  620.     } else if (kea_def->is_limited && kea_def->exchKeyType == kt_rsa) {
  621. /* see if we can legally use the key in the cert. */
  622. int keyLen;  /* bytes */
  623. keyLen = PK11_GetPrivateModulusLen(
  624.     ss->serverKey[kea_def->exchKeyType]);
  625. if (keyLen > 0 &&
  626.     keyLen * BPB <= kea_def->key_size_limit ) {
  627.     /* XXX AND cert is not signing only!! */
  628.     /* just fall through and use it. */
  629. } else if (ss->stepDownKeyPair != NULL) {
  630.     ss->ssl3->hs.usedStepDownKey = PR_TRUE;
  631.     rv = ssl3_SendServerKeyExchange(ss);
  632.     if (rv != SECSuccess) {
  633. return rv; /* err code was set. */
  634.     }
  635. } else {
  636. #ifndef HACKED_EXPORT_SERVER
  637.     PORT_SetError(SSL_ERROR_PUB_KEY_SIZE_LIMIT_EXCEEDED);
  638.     return rv;
  639. #endif
  640. }
  641.     }
  642.     if (ss->requestCertificate) {
  643. rv = ssl3_SendCertificateRequest(ss);
  644. if (rv != SECSuccess) {
  645.     return rv; /* err code is set. */
  646. }
  647.     }
  648.     rv = ssl3_SendServerHelloDone(ss);
  649.     if (rv != SECSuccess) {
  650. return rv; /* err code is set. */
  651.     }
  652.     ss->ssl3->hs.ws = (ss->requestCertificate) ? wait_client_cert
  653.                                                : wait_client_key;
  654.     return SECSuccess;
  655. }
  656. /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete
  657.  * ssl3 Client Hello message.
  658.  * Caller must hold Handshake and RecvBuf locks.
  659.  */
  660. static SECStatus
  661. ssl3_HandleClientHello(sslSocket *ss, SSL3Opaque *b, PRUint32 length)
  662. {
  663.     sslSessionID *      sid      = NULL;
  664.     ssl3State *         ssl3;
  665.     sslConnectInfo *    ci;
  666.     PRInt32 tmp;
  667.     unsigned int        i;
  668.     int                 j;
  669.     SECStatus           rv;
  670.     int                 errCode  = SSL_ERROR_RX_MALFORMED_CLIENT_HELLO;
  671.     SSL3AlertDescription desc    = illegal_parameter;
  672.     SSL3ProtocolVersion version;
  673.     SECItem             sidBytes = {siBuffer, NULL, 0};
  674.     SECItem             suites   = {siBuffer, NULL, 0};
  675.     SECItem             comps    = {siBuffer, NULL, 0};
  676.     PRBool              haveSpecWriteLock = PR_FALSE;
  677.     PRBool              haveXmitBufLock   = PR_FALSE;
  678.     SSL_TRC(3, ("%d: SSL3[%d]: handle client_hello handshake",
  679.      SSL_GETPID(), ss->fd));
  680.     PORT_Assert( ssl_HaveRecvBufLock(ss) );
  681.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss));
  682.     /* Get peer name of client */
  683.     rv = ssl_GetPeerInfo(ss);
  684.     if (rv != SECSuccess) {
  685. return rv; /* error code is set. */
  686.     }
  687.     rv = ssl3_InitState(ss);
  688.     if (rv != SECSuccess) {
  689. return rv; /* ssl3_InitState has set the error code. */
  690.     }
  691.     ssl3 = ss->ssl3;
  692.     if ((ssl3->hs.ws != wait_client_hello) &&
  693. (ssl3->hs.ws != idle_handshake)) {
  694. desc    = unexpected_message;
  695. errCode = SSL_ERROR_RX_UNEXPECTED_CLIENT_HELLO;
  696. goto alert_loser;
  697.     }
  698.     ci = &ss->sec->ci;
  699.     tmp = ssl3_ConsumeHandshakeNumber(ss, 2, &b, &length);
  700.     if (tmp < 0)
  701. goto loser; /* malformed, alert already sent */
  702.     ss->clientHelloVersion = version = (SSL3ProtocolVersion)tmp;
  703.     rv = ssl3_NegotiateVersion(ss, version);
  704.     if (rv != SECSuccess) {
  705. /* We can't do the usual isTLS test here, because the negotiated
  706. ** version is definitely not 3.1.  So the question is, are we 
  707. ** willing/able to do TLS here on our side? 
  708. */
  709.      desc = ss->enableTLS ? protocol_version : handshake_failure;
  710. errCode = SSL_ERROR_NO_CYPHER_OVERLAP;
  711. goto alert_loser;
  712.     }
  713.     /* grab the client random data. */
  714.     rv = ssl3_ConsumeHandshake(
  715. ss, &ssl3->hs.client_random, SSL3_RANDOM_LENGTH, &b, &length);
  716.     if (rv != SECSuccess) {
  717. goto loser; /* malformed */
  718.     }
  719.     /* grab the client's SID, if present. */
  720.     rv = ssl3_ConsumeHandshakeVariable(ss, &sidBytes, 1, &b, &length);
  721.     if (rv != SECSuccess) {
  722. goto loser; /* malformed */
  723.     }
  724.     if (sidBytes.len > 0) {
  725. SSL_TRC(7, ("%d: SSL3[%d]: server, lookup client session-id for 0x%08x%08x%08x%08x",
  726.                     SSL_GETPID(), ss->fd, ci->peer.pr_s6_addr32[0],
  727.     ci->peer.pr_s6_addr32[1], ci->peer.pr_s6_addr32[2],
  728.     ci->peer.pr_s6_addr32[3]));
  729. sid = (*ssl_sid_lookup)(&ci->peer, sidBytes.data, sidBytes.len,
  730.                         ss->dbHandle);
  731.     }
  732.     SECITEM_FreeItem(&sidBytes, PR_FALSE);
  733.     /* grab the list of cipher suites. */
  734.     rv = ssl3_ConsumeHandshakeVariable(ss, &suites, 2, &b, &length);
  735.     if (rv != SECSuccess) {
  736. goto loser; /* malformed */
  737.     }
  738.     /* grab the list of compression methods. */
  739.     rv = ssl3_ConsumeHandshakeVariable(ss, &comps, 1, &b, &length);
  740.     if (rv != SECSuccess) {
  741. goto loser; /* malformed */
  742.     }
  743.     /* It's OK for length to be non-zero here.
  744.      * Non-zero length means that some new protocol revision has extended
  745.      * the client hello message.
  746.      */
  747.     desc = handshake_failure;
  748.     if (sid != NULL) {
  749. /* We've found a session cache entry for this client.
  750.  * Now, if we're going to require a client-auth cert,
  751.  * and we don't already have this client's cert in the session cache,
  752.  * and this is the first handshake on this connection (not a redo),
  753.  * then drop this old cache entry and start a new session.
  754.  */
  755. if ((sid->peerCert == NULL) && ss->requestCertificate &&
  756.     ((ss->requireCertificate == 1) ||
  757.      ((ss->requireCertificate == 2) && !ss->connected))) {
  758.     ++ssl3_hch_sid_cache_not_ok;
  759.     ss->sec->uncache(sid);
  760.     ssl_FreeSID(sid);
  761.     sid = NULL;
  762. }
  763.     }
  764.     /* Look for a matching cipher suite. */
  765.     j = ssl3_config_match_init(ss);
  766.     if (j <= 0) { /* no ciphers are working/supported by PK11 */
  767.      errCode = PORT_GetError(); /* error code is already set. */
  768. goto alert_loser;
  769.     }
  770.     /* If we already have a session for this client, be sure to pick the
  771.     ** same cipher suite we picked before.
  772.     ** This is not a loop, despite appearances.
  773.     */
  774.     if (sid) do {
  775. ssl3CipherSuiteCfg *suite = ss->cipherSuites;
  776. for (j = ssl_V3_SUITES_IMPLEMENTED; j > 0; --j, ++suite) {
  777.     if (suite->cipher_suite == sid->u.ssl3.cipherSuite)
  778. break;
  779. }
  780. if (!j)
  781.     break;
  782. if (!config_match(suite, ssl3->policy, PR_TRUE))
  783.     break;
  784. for (i = 0; i < suites.len; i += 2) {
  785.     if ((suites.data[i]     == MSB(suite->cipher_suite)) &&
  786.         (suites.data[i + 1] == LSB(suite->cipher_suite))) {
  787. ssl3->hs.cipher_suite = suite->cipher_suite;
  788. ssl3->hs.suite_def =
  789.     ssl_LookupCipherSuiteDef(ssl3->hs.cipher_suite);
  790. goto suite_found;
  791.     }
  792. }
  793.     } while (0);
  794.     /* Select a cipher suite.
  795.     ** NOTE: This suite selection algorithm should be the same as the one in
  796.     ** ssl3_HandleV2ClientHello().  
  797.     */
  798.     for (j = 0; j < ssl_V3_SUITES_IMPLEMENTED; j++) {
  799. ssl3CipherSuiteCfg *suite = &ss->cipherSuites[j];
  800. if (!config_match(suite, ssl3->policy, PR_TRUE))
  801.     continue;
  802. for (i = 0; i < suites.len; i += 2) {
  803.     if ((suites.data[i]     == MSB(suite->cipher_suite)) &&
  804.         (suites.data[i + 1] == LSB(suite->cipher_suite))) {
  805. ssl3->hs.cipher_suite = suite->cipher_suite;
  806. ssl3->hs.suite_def =
  807.     ssl_LookupCipherSuiteDef(ssl3->hs.cipher_suite);
  808. goto suite_found;
  809.     }
  810. }
  811.     }
  812.     errCode = SSL_ERROR_NO_CYPHER_OVERLAP;
  813.     goto alert_loser;
  814. suite_found:
  815.     /* Look for a matching compression algorithm. */
  816.     for (i = 0; i < comps.len; i++) {
  817. for (j = 0; j < compressionMethodsCount; j++) {
  818.     if (comps.data[i] == compressions[j]) {
  819. ssl3->hs.compression = (SSL3CompressionMethod)compressions[j];
  820. goto compression_found;
  821.     }
  822. }
  823.     }
  824.     errCode = SSL_ERROR_NO_COMPRESSION_OVERLAP;
  825.      /* null compression must be supported */
  826.     goto alert_loser;
  827. compression_found:
  828.     PORT_Free(suites.data);
  829.     suites.data = NULL;
  830.     PORT_Free(comps.data);
  831.     comps.data = NULL;
  832.     ss->sec->send = ssl3_SendApplicationData;
  833.     /* If there are any failures while processing the old sid,
  834.      * we don't consider them to be errors.  Instead, We just behave
  835.      * as if the client had sent us no sid to begin with, and make a new one.
  836.      */
  837.     if (sid != NULL) do {
  838. PK11SlotInfo *  slot;
  839. PK11SymKey *    wrapKey;  /* wrapping key */
  840. SECItem         wrappedKey;   /* wrapped key */
  841. ssl3CipherSpec *pwSpec;
  842. CK_FLAGS        keyFlags      = 0;
  843. if (sid->version != ss->version  ||
  844.     sid->u.ssl3.cipherSuite != ssl3->hs.cipher_suite) {
  845.     break; /* not an error */
  846. }
  847. if (ci->sid) {
  848.     ss->sec->uncache(ci->sid);
  849.     PORT_Assert(ci->sid != sid);  /* should be impossible, but ... */
  850.     if (ci->sid != sid) {
  851. ssl_FreeSID(ci->sid);
  852.     }
  853.     ci->sid = NULL;
  854. }
  855. /* we need to resurrect the master secret.... */
  856. ssl_GetSpecWriteLock(ss);  haveSpecWriteLock = PR_TRUE;
  857. pwSpec = ssl3->pwSpec;
  858. wrapKey = getWrappingKey(ss, NULL, sid->u.ssl3.exchKeyType,
  859.                          sid->u.ssl3.masterWrapMech, ss->pkcs11PinArg);
  860. if (!wrapKey) {
  861.     /* we have a SID cache entry, but no wrapping key for it??? */
  862.     break;
  863. }
  864. if (ss->version > SSL_LIBRARY_VERSION_3_0) { /* isTLS */
  865.     keyFlags = CKF_SIGN | CKF_VERIFY;
  866. }
  867.         wrappedKey.data = sid->u.ssl3.keys.wrapped_master_secret;
  868. wrappedKey.len  = sid->u.ssl3.keys.wrapped_master_secret_len;
  869. /* unwrap the master secret. */
  870. pwSpec->master_secret =
  871.     PK11_UnwrapSymKeyWithFlags(wrapKey, sid->u.ssl3.masterWrapMech, 
  872.      NULL, &wrappedKey, CKM_SSL3_MASTER_KEY_DERIVE,
  873. CKA_DERIVE, sizeof(SSL3MasterSecret), keyFlags);
  874. PK11_FreeSymKey(wrapKey);
  875. if (pwSpec->master_secret == NULL) {
  876.     break; /* not an error */
  877. }
  878. ci->sid = sid;
  879. if (sid->peerCert != NULL) {
  880.     ss->sec->peerCert = CERT_DupCertificate(sid->peerCert);
  881. }
  882. /*
  883.  * Old SID passed all tests, so resume this old session.
  884.  *
  885.  * XXX make sure compression still matches
  886.  */
  887. ++ssl3_hch_sid_cache_hits;
  888. ssl3->hs.isResuming = PR_TRUE;
  889. ssl_GetXmitBufLock(ss); haveXmitBufLock = PR_TRUE;
  890. rv = ssl3_SendServerHello(ss);
  891. if (rv != SECSuccess) {
  892.     errCode = PORT_GetError();
  893.     goto loser;
  894. }
  895. /* reload the FORTEZZA key material.
  896.  * On Fortezza, the following keys & IVs are generated by the KEA,
  897.  * not from the PMS.  Since we're not going to redo the KEA, we
  898.  * have to save & restore them for Fortezza.
  899.  * use kea because we haven't call InitCipher Specs yet...?
  900.  */
  901. if (ssl3->hs.suite_def->bulk_cipher_alg == cipher_fortezza) {
  902.     PK11SymKey *      Ks;
  903.     SECItem           item;
  904.     PORT_Memcpy(pwSpec->client.write_iv,
  905. sid->u.ssl3.keys.client_write_iv,
  906. sizeof sid->u.ssl3.keys.client_write_iv);
  907.     PORT_Memcpy(pwSpec->server.write_iv,
  908. sid->u.ssl3.keys.server_write_iv,
  909. sizeof sid->u.ssl3.keys.server_write_iv);
  910.     /* Now, unwrap the client and server write keys with Ks */
  911.     /* get the slot that the fortezza server private key is in. */
  912.     slot = PK11_GetSlotFromPrivateKey(ss->serverKey[kt_fortezza]);
  913.     if (slot == NULL) {
  914. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  915. goto loser;
  916.     }
  917.     /* Look up the Token Fixed Key */
  918.     Ks = PK11_FindFixedKey(slot, CKM_SKIPJACK_WRAP, NULL,
  919.                            ss->pkcs11PinArg);
  920.     PK11_FreeSlot(slot);
  921.     if (Ks == NULL) {
  922. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  923. goto loser;
  924.     }
  925.     /* unwrap client write key with the local Ks */
  926.     item.data = sid->u.ssl3.keys.wrapped_client_write_key;
  927.     item.len  = sizeof sid->u.ssl3.keys.wrapped_client_write_key;
  928.     pwSpec->client.write_key =
  929.     PK11_UnwrapSymKey(Ks, CKM_SKIPJACK_WRAP, NULL, &item,
  930.       CKM_SKIPJACK_CBC64, CKA_DECRYPT, 0);
  931.     if (pwSpec->client.write_key == NULL) {
  932. SEND_ALERT
  933. ssl_MapLowLevelError(SSL_ERROR_SYM_KEY_UNWRAP_FAILURE);
  934. goto loser;
  935.     }
  936.     /* unwrap server write key with the local Ks */
  937.     item.data = sid->u.ssl3.keys.wrapped_server_write_key;
  938.     item.len  = sizeof sid->u.ssl3.keys.wrapped_server_write_key;
  939.     pwSpec->server.write_key =
  940.     PK11_UnwrapSymKey(Ks, CKM_SKIPJACK_WRAP, NULL, &item,
  941.       CKM_SKIPJACK_CBC64, CKA_ENCRYPT, 0);
  942.     if (pwSpec->server.write_key == NULL) {
  943. PK11_FreeSymKey(pwSpec->client.write_key);
  944. pwSpec->client.write_key = NULL;
  945. SEND_ALERT
  946. ssl_MapLowLevelError(SSL_ERROR_SYM_KEY_UNWRAP_FAILURE);
  947. goto loser;
  948.     }
  949.     /* Set flag that says "generate 8 byte random prefix plaintext." */
  950.     PK11_SetFortezzaHack(pwSpec->server.write_key); /* can't fail */
  951. }
  952. if (haveSpecWriteLock) {
  953.     ssl_ReleaseSpecWriteLock(ss);
  954.     haveSpecWriteLock = PR_FALSE;
  955. }
  956. /* NULL value for PMS signifies re-use of the old MS */
  957. rv = ssl3_InitPendingCipherSpec(ss,  NULL);
  958. if (rv != SECSuccess) {
  959.     errCode = PORT_GetError();
  960.     goto loser;
  961. }
  962. rv = ssl3_SendChangeCipherSpecs(ss);
  963. if (rv != SECSuccess) {
  964.     errCode = PORT_GetError();
  965.     goto loser;
  966. }
  967. rv = ssl3_SendFinished(ss, 0);
  968. ssl3->hs.ws = wait_change_cipher;
  969. if (rv != SECSuccess) {
  970.     errCode = PORT_GetError();
  971.     goto loser;
  972. }
  973. if (haveXmitBufLock) {
  974.     ssl_ReleaseXmitBufLock(ss);
  975.     haveXmitBufLock = PR_FALSE;
  976. }
  977.         return SECSuccess;
  978.     } while (0);
  979.     if (haveSpecWriteLock) {
  980. ssl_ReleaseSpecWriteLock(ss);
  981. haveSpecWriteLock = PR_FALSE;
  982.     }
  983.     if (sid) {  /* we had a sid, but it's no longer valid, free it */
  984. ++ssl3_hch_sid_cache_not_ok;
  985. ss->sec->uncache(sid);
  986. ssl_FreeSID(sid);
  987. sid = NULL;
  988.     }
  989.     ++ssl3_hch_sid_cache_misses;
  990.     sid = ssl3_NewSessionID(ss, PR_TRUE);
  991.     if (sid == NULL) {
  992. errCode = PORT_GetError();
  993. goto loser; /* memory error is set. */
  994.     }
  995.     ci->sid = sid;
  996.     ssl3->hs.isResuming = PR_FALSE;
  997.     ssl_GetXmitBufLock(ss);
  998.     rv = ssl3_SendServerHelloSequence(ss);
  999.     ssl_ReleaseXmitBufLock(ss);
  1000.     if (rv != SECSuccess) {
  1001. errCode = PORT_GetError();
  1002. goto loser;
  1003.     }
  1004.     if (haveXmitBufLock) {
  1005. ssl_ReleaseXmitBufLock(ss);
  1006. haveXmitBufLock = PR_FALSE;
  1007.     }
  1008.     return SECSuccess;
  1009. alert_loser:
  1010.     if (haveSpecWriteLock) {
  1011. ssl_ReleaseSpecWriteLock(ss);
  1012. haveSpecWriteLock = PR_FALSE;
  1013.     }
  1014.     (void)SSL3_SendAlert(ss, alert_fatal, desc);
  1015.     /* FALLTHRU */
  1016. loser:
  1017.     if (haveSpecWriteLock) {
  1018. ssl_ReleaseSpecWriteLock(ss);
  1019. haveSpecWriteLock = PR_FALSE;
  1020.     }
  1021.     if (sidBytes.data != NULL) SECITEM_FreeItem(&sidBytes, PR_FALSE);
  1022.     if (suites.data   != NULL) SECITEM_FreeItem(&suites,   PR_FALSE);
  1023.     if (comps.data    != NULL) SECITEM_FreeItem(&comps,    PR_FALSE);
  1024.     if (haveXmitBufLock) {
  1025. ssl_ReleaseXmitBufLock(ss);
  1026. haveXmitBufLock = PR_FALSE;
  1027.     }
  1028.     PORT_SetError(errCode);
  1029.     return SECFailure;
  1030. }
  1031. /*
  1032.  * ssl3_HandleV2ClientHello is used when a V2 formatted hello comes
  1033.  * in asking to use the V3 handshake.
  1034.  * Called from ssl2_HandleClientHelloMessage() in sslcon.c
  1035.  */
  1036. SECStatus
  1037. ssl3_HandleV2ClientHello(sslSocket *ss, unsigned char *buffer, int length)
  1038. {
  1039.     sslSessionID *      sid  = NULL;
  1040.     unsigned char *     suites;
  1041.     unsigned char *     random;
  1042.     SSL3ProtocolVersion version;
  1043.     SECStatus           rv;
  1044.     int                 i;
  1045.     int                 j;
  1046.     int                 sid_length;
  1047.     int                 suite_length;
  1048.     int                 rand_length;
  1049.     int                 errCode  = SSL_ERROR_RX_MALFORMED_CLIENT_HELLO;
  1050.     SSL3AlertDescription desc    = handshake_failure;
  1051.     SSL_TRC(3, ("%d: SSL3[%d]: handle v2 client_hello", SSL_GETPID(), ss->fd));
  1052.     PORT_Assert( ssl_HaveRecvBufLock(ss) );
  1053.     ssl_GetSSL3HandshakeLock(ss);
  1054.     rv = ssl3_InitState(ss);
  1055.     if (rv != SECSuccess) {
  1056. ssl_ReleaseSSL3HandshakeLock(ss);
  1057. return rv; /* ssl3_InitState has set the error code. */
  1058.     }
  1059.     if (ss->ssl3->hs.ws != wait_client_hello) {
  1060. desc    = unexpected_message;
  1061. errCode = SSL_ERROR_RX_UNEXPECTED_CLIENT_HELLO;
  1062. goto loser; /* alert_loser */
  1063.     }
  1064.     version      = (buffer[1] << 8) | buffer[2];
  1065.     suite_length = (buffer[3] << 8) | buffer[4];
  1066.     sid_length   = (buffer[5] << 8) | buffer[6];
  1067.     rand_length  = (buffer[7] << 8) | buffer[8];
  1068.     ss->clientHelloVersion = version;
  1069.     rv = ssl3_NegotiateVersion(ss, version);
  1070.     if (rv != SECSuccess) {
  1071.      desc = ss->enableTLS ? protocol_version : handshake_failure;
  1072. errCode = SSL_ERROR_NO_CYPHER_OVERLAP;
  1073. /* It's not appropriate to send back SSL3/TLS alert records in 
  1074. ** response to an SSL2 client hello, unless the version is 
  1075. ** succesfully negotiated to 3.0 or greater, so just goto loser. */
  1076. goto loser; /* alert_loser */
  1077.     }
  1078.     /* if we get a non-zero SID, just ignore it. */
  1079.     if (length !=
  1080.         SSL_HL_CLIENT_HELLO_HBYTES + suite_length + sid_length + rand_length) {
  1081. SSL_DBG(("%d: SSL3[%d]: bad v2 client hello message, len=%d should=%d",
  1082.  SSL_GETPID(), ss->fd, length,
  1083.  SSL_HL_CLIENT_HELLO_HBYTES + suite_length + sid_length +
  1084.  rand_length));
  1085. goto loser; /* malformed */ /* alert_loser */
  1086.     }
  1087.     suites = buffer + SSL_HL_CLIENT_HELLO_HBYTES;
  1088.     random = suites + suite_length + sid_length;
  1089.     if (rand_length < SSL_MIN_CHALLENGE_BYTES ||
  1090. rand_length > SSL_MAX_CHALLENGE_BYTES) {
  1091. goto loser; /* malformed */ /* alert_loser */
  1092.     }
  1093.     PORT_Assert(SSL_MAX_CHALLENGE_BYTES == SSL3_RANDOM_LENGTH);
  1094.     PORT_Memset(&ss->ssl3->hs.client_random, 0, SSL3_RANDOM_LENGTH);
  1095.     PORT_Memcpy(
  1096. &ss->ssl3->hs.client_random.rand[SSL3_RANDOM_LENGTH - rand_length],
  1097. random, rand_length);
  1098.     PRINT_BUF(60, (ss, "client random:", &ss->ssl3->hs.client_random.rand[0],
  1099.    SSL3_RANDOM_LENGTH));
  1100.     i = ssl3_config_match_init(ss);
  1101.     if (i <= 0) {
  1102.      errCode = PORT_GetError(); /* error code is already set. */
  1103. goto alert_loser;
  1104.     }
  1105.     /* Select a cipher suite.
  1106.     ** NOTE: This suite selection algorithm should be the same as the one in
  1107.     ** ssl3_HandleClientHello().  
  1108.     */
  1109.     for (j = 0; j < ssl_V3_SUITES_IMPLEMENTED; j++) {
  1110. ssl3CipherSuiteCfg *suite = &ss->cipherSuites[j];
  1111. if (!config_match(suite, ss->ssl3->policy, PR_TRUE))
  1112.     continue;
  1113. for (i = 0; i < suite_length; i += 3) {
  1114.     if ((suites[i]   == 0) &&
  1115. (suites[i+1] == MSB(suite->cipher_suite)) &&
  1116. (suites[i+2] == LSB(suite->cipher_suite))) {
  1117. ss->ssl3->hs.cipher_suite = suite->cipher_suite;
  1118. ss->ssl3->hs.suite_def =
  1119.     ssl_LookupCipherSuiteDef(ss->ssl3->hs.cipher_suite);
  1120. goto suite_found;
  1121.     }
  1122. }
  1123.     }
  1124.     errCode = SSL_ERROR_NO_CYPHER_OVERLAP;
  1125.     goto alert_loser;
  1126. suite_found:
  1127.     ss->ssl3->hs.compression = compression_null;
  1128.     ss->sec->send            = ssl3_SendApplicationData;
  1129.     /* we don't even search for a cache hit here.  It's just a miss. */
  1130.     ++ssl3_hch_sid_cache_misses;
  1131.     sid = ssl3_NewSessionID(ss, PR_TRUE);
  1132.     if (sid == NULL) {
  1133.      errCode = PORT_GetError();
  1134. goto loser; /* memory error is set. */
  1135.     }
  1136.     ss->sec->ci.sid = sid;
  1137.     /* do not worry about memory leak of sid since it now belongs to ci */
  1138.     /* We have to update the handshake hashes before we can send stuff */
  1139.     rv = ssl3_UpdateHandshakeHashes(ss, buffer, length);
  1140.     if (rv != SECSuccess) {
  1141.      errCode = PORT_GetError();
  1142. goto loser;
  1143.     }
  1144.     ssl_GetXmitBufLock(ss);
  1145.     rv = ssl3_SendServerHelloSequence(ss);
  1146.     ssl_ReleaseXmitBufLock(ss);
  1147.     if (rv != SECSuccess) {
  1148.      errCode = PORT_GetError();
  1149. goto loser;
  1150.     }
  1151.     /* XXX_1  The call stack to here is:
  1152.      * ssl_Do1stHandshake -> ssl2_HandleClientHelloMessage -> here.
  1153.      * ssl2_HandleClientHelloMessage returns whatever we return here.
  1154.      * ssl_Do1stHandshake will continue looping if it gets back either
  1155.      * SECSuccess or SECWouldBlock.
  1156.      * SECSuccess is preferable here.  See XXX_1 in sslgathr.c.
  1157.      */
  1158.     ssl_ReleaseSSL3HandshakeLock(ss);
  1159.     return SECSuccess;
  1160. alert_loser:
  1161.     SSL3_SendAlert(ss, alert_fatal, desc);
  1162. loser:
  1163.     ssl_ReleaseSSL3HandshakeLock(ss);
  1164.     PORT_SetError(errCode);
  1165.     return SECFailure;
  1166. }
  1167. /* The negotiated version number has been already placed in ss->version.
  1168. **
  1169. ** Called from:  ssl3_HandleClientHello                     (resuming session),
  1170. **  ssl3_SendServerHelloSequence <- ssl3_HandleClientHello   (new session),
  1171. **  ssl3_SendServerHelloSequence <- ssl3_HandleV2ClientHello (new session)
  1172. */
  1173. static SECStatus
  1174. ssl3_SendServerHello(sslSocket *ss)
  1175. {
  1176.     sslSessionID *sid;
  1177.     SECStatus     rv;
  1178.     PRUint32      length;
  1179.     SSL_TRC(3, ("%d: SSL3[%d]: send server_hello handshake", SSL_GETPID(),
  1180. ss->fd));
  1181.     PORT_Assert(ss->sec);
  1182.     PORT_Assert( ssl_HaveXmitBufLock(ss));
  1183.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss));
  1184.     PORT_Assert( MSB(ss->version) == MSB(SSL_LIBRARY_VERSION_3_0));
  1185.     if (MSB(ss->version) != MSB(SSL_LIBRARY_VERSION_3_0)) {
  1186. PORT_SetError(SSL_ERROR_NO_CYPHER_OVERLAP);
  1187. return SECFailure;
  1188.     }
  1189.     sid = ss->sec->ci.sid;
  1190.     length = sizeof(SSL3ProtocolVersion) + SSL3_RANDOM_LENGTH + 1 +
  1191.              ((sid == NULL) ? 0: SSL3_SESSIONID_BYTES) +
  1192.      sizeof(ssl3CipherSuite) + 1;
  1193.     rv = ssl3_AppendHandshakeHeader(ss, server_hello, length);
  1194.     if (rv != SECSuccess) {
  1195. return rv; /* err set by AppendHandshake. */
  1196.     }
  1197.     rv = ssl3_AppendHandshakeNumber(ss, ss->version, 2);
  1198.     if (rv != SECSuccess) {
  1199. return rv; /* err set by AppendHandshake. */
  1200.     }
  1201.     rv = ssl3_GetNewRandom(&ss->ssl3->hs.server_random);
  1202.     if (rv != SECSuccess) {
  1203. ssl_MapLowLevelError(SSL_ERROR_GENERATE_RANDOM_FAILURE);
  1204. return rv;
  1205.     }
  1206.     rv = ssl3_AppendHandshake(
  1207. ss, &ss->ssl3->hs.server_random, SSL3_RANDOM_LENGTH);
  1208.     if (rv != SECSuccess) {
  1209. return rv; /* err set by AppendHandshake. */
  1210.     }
  1211.     if (sid)
  1212. rv = ssl3_AppendHandshakeVariable(
  1213.     ss, sid->u.ssl3.sessionID, sid->u.ssl3.sessionIDLength, 1);
  1214.     else
  1215. rv = ssl3_AppendHandshakeVariable(ss, NULL, 0, 1);
  1216.     if (rv != SECSuccess) {
  1217. return rv; /* err set by AppendHandshake. */
  1218.     }
  1219.     rv = ssl3_AppendHandshakeNumber(ss, ss->ssl3->hs.cipher_suite, 2);
  1220.     if (rv != SECSuccess) {
  1221. return rv; /* err set by AppendHandshake. */
  1222.     }
  1223.     rv = ssl3_AppendHandshakeNumber(ss, ss->ssl3->hs.compression, 1);
  1224.     if (rv != SECSuccess) {
  1225. return rv; /* err set by AppendHandshake. */
  1226.     }
  1227.     rv = ssl3_SetupPendingCipherSpec(ss, ss->ssl3);
  1228.     if (rv != SECSuccess) {
  1229. return rv; /* err set by ssl3_SetupPendingCipherSpec */
  1230.     }
  1231.     return SECSuccess;
  1232. }
  1233. static SECStatus
  1234. ssl3_SendServerKeyExchange(sslSocket *ss)
  1235. {
  1236. const ssl3KEADef *     kea_def     = ss->ssl3->hs.kea_def;
  1237.     SECStatus          rv          = SECFailure;
  1238.     int                length;
  1239.     PRBool             isTLS;
  1240.     SECItem            signed_hash = {siBuffer, NULL, 0};
  1241.     SSL3Hashes         hashes;
  1242.     SECKEYPublicKey *  sdPub; /* public key for step-down */
  1243.     SSL_TRC(3, ("%d: SSL3[%d]: send server_key_exchange handshake",
  1244. SSL_GETPID(), ss->fd));
  1245.     PORT_Assert( ssl_HaveXmitBufLock(ss));
  1246.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss));
  1247.     switch (kea_def->exchKeyType) {
  1248.     case kt_rsa:
  1249. /* Perform SSL Step-Down here. */
  1250. sdPub = ss->stepDownKeyPair->pubKey;
  1251. PORT_Assert(sdPub != NULL);
  1252. if (!sdPub) {
  1253.     PORT_SetError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE);
  1254.     return SECFailure;
  1255. }
  1256.      rv = ssl3_ComputeExportRSAKeyHash(sdPub->u.rsa.modulus,
  1257.   sdPub->u.rsa.publicExponent,
  1258.                                   &ss->ssl3->hs.client_random,
  1259.                                   &ss->ssl3->hs.server_random,
  1260.                                   &hashes);
  1261.         if (rv != SECSuccess) {
  1262.     ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE);
  1263.     return rv;
  1264. }
  1265. isTLS = (PRBool)(ss->ssl3->pwSpec->version > SSL_LIBRARY_VERSION_3_0);
  1266. rv = ssl3_SignHashes(&hashes, ss->serverKey[kt_rsa], &signed_hash, 
  1267.                      isTLS);
  1268.         if (rv != SECSuccess) {
  1269.     goto loser; /* ssl3_SignHashes has set err. */
  1270. }
  1271. if (signed_hash.data == NULL) {
  1272.     /* how can this happen and rv == SECSuccess ?? */
  1273.     PORT_SetError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE);
  1274.     goto loser;
  1275. }
  1276. length = 2 + sdPub->u.rsa.modulus.len +
  1277.          2 + sdPub->u.rsa.publicExponent.len +
  1278.          2 + signed_hash.len;
  1279. rv = ssl3_AppendHandshakeHeader(ss, server_key_exchange, length);
  1280. if (rv != SECSuccess) {
  1281.     goto loser;  /* err set by AppendHandshake. */
  1282. }
  1283. rv = ssl3_AppendHandshakeVariable(ss, sdPub->u.rsa.modulus.data,
  1284.   sdPub->u.rsa.modulus.len, 2);
  1285. if (rv != SECSuccess) {
  1286.     goto loser;  /* err set by AppendHandshake. */
  1287. }
  1288. rv = ssl3_AppendHandshakeVariable(
  1289. ss, sdPub->u.rsa.publicExponent.data,
  1290. sdPub->u.rsa.publicExponent.len, 2);
  1291. if (rv != SECSuccess) {
  1292.     goto loser;  /* err set by AppendHandshake. */
  1293. }
  1294. rv = ssl3_AppendHandshakeVariable(ss, signed_hash.data,
  1295.                                   signed_hash.len, 2);
  1296. if (rv != SECSuccess) {
  1297.     goto loser;  /* err set by AppendHandshake. */
  1298. }
  1299. PORT_Free(signed_hash.data);
  1300. return SECSuccess;
  1301.     case kt_fortezza:
  1302. /* Set server's "random" public key R_s to the email value == 1 */
  1303. PORT_Memset(ss->ssl3->fortezza.R_s, 0, sizeof(ss->ssl3->fortezza.R_s));
  1304. ss->ssl3->fortezza.R_s[127] = 1;
  1305. /* don't waste time signing the random number */
  1306. length = sizeof (ss->ssl3->fortezza.R_s) /*+ 2 + signed_hash.len*/;
  1307. rv = ssl3_AppendHandshakeHeader(ss, server_key_exchange, length);
  1308. if (rv != SECSuccess) {
  1309.     goto loser;  /* err set by AppendHandshake. */
  1310. }
  1311. rv = ssl3_AppendHandshake( ss, &ss->ssl3->fortezza.R_s,
  1312. sizeof(ss->ssl3->fortezza.R_s));
  1313. if (rv != SECSuccess) {
  1314.     goto loser;  /* err set by AppendHandshake. */
  1315. }
  1316. return SECSuccess;
  1317.     case kt_dh:
  1318.     case kt_null:
  1319.     default:
  1320. PORT_SetError(SEC_ERROR_UNSUPPORTED_KEYALG);
  1321. break;
  1322.     }
  1323. loser:
  1324.     if (signed_hash.data != NULL) 
  1325.      PORT_Free(signed_hash.data);
  1326.     return SECFailure;
  1327. }
  1328. static SECStatus
  1329. ssl3_SendCertificateRequest(sslSocket *ss)
  1330. {
  1331.     SECItem *      name;
  1332.     CERTDistNames *ca_list;
  1333. const uint8 *      certTypes;
  1334.     SECItem *      names = NULL;
  1335.     SECStatus      rv;
  1336.     int            length;
  1337.     int            i;
  1338.     int            calen = 0;
  1339.     int            nnames = 0;
  1340.     int            certTypesLength;
  1341.     SSL_TRC(3, ("%d: SSL3[%d]: send certificate_request handshake",
  1342. SSL_GETPID(), ss->fd));
  1343.     PORT_Assert( ssl_HaveXmitBufLock(ss));
  1344.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss));
  1345.     /* ssl3->ca_list is initialized to NULL, and never changed. */
  1346.     ca_list = ss->ssl3->ca_list;
  1347.     if (!ca_list) {
  1348. ca_list = ssl3_server_ca_list;
  1349.     }
  1350.     if (ca_list != NULL) {
  1351. names = ca_list->names;
  1352. nnames = ca_list->nnames;
  1353.     }
  1354.     if (!nnames) {
  1355. PORT_SetError(SSL_ERROR_NO_TRUSTED_SSL_CLIENT_CA);
  1356. return SECFailure;
  1357.     }
  1358.     for (i = 0, name = names; i < nnames; i++, name++) {
  1359. calen += 2 + name->len;
  1360.     }
  1361.     if (ss->ssl3->hs.kea_def->exchKeyType == kt_fortezza) {
  1362. certTypes       = fortezza_certificate_types;
  1363. certTypesLength = sizeof fortezza_certificate_types;
  1364.     } else {
  1365. certTypes       = certificate_types;
  1366. certTypesLength = sizeof certificate_types;
  1367.     }
  1368.     length = 1 + certTypesLength + 2 + calen;
  1369.     rv = ssl3_AppendHandshakeHeader(ss, certificate_request, length);
  1370.     if (rv != SECSuccess) {
  1371. return rv;  /* err set by AppendHandshake. */
  1372.     }
  1373.     rv = ssl3_AppendHandshakeVariable(ss, certTypes, certTypesLength, 1);
  1374.     if (rv != SECSuccess) {
  1375. return rv;  /* err set by AppendHandshake. */
  1376.     }
  1377.     rv = ssl3_AppendHandshakeNumber(ss, calen, 2);
  1378.     if (rv != SECSuccess) {
  1379. return rv;  /* err set by AppendHandshake. */
  1380.     }
  1381.     for (i = 0, name = names; i < nnames; i++, name++) {
  1382. rv = ssl3_AppendHandshakeVariable(ss, name->data, name->len, 2);
  1383. if (rv != SECSuccess) {
  1384.     return rv;  /* err set by AppendHandshake. */
  1385. }
  1386.     }
  1387.     return SECSuccess;
  1388. }
  1389. static SECStatus
  1390. ssl3_SendServerHelloDone(sslSocket *ss)
  1391. {
  1392.     SECStatus rv;
  1393.     SSL_TRC(3, ("%d: SSL3[%d]: send server_hello_done handshake",
  1394. SSL_GETPID(), ss->fd));
  1395.     PORT_Assert( ssl_HaveXmitBufLock(ss));
  1396.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss));
  1397.     rv = ssl3_AppendHandshakeHeader(ss, server_hello_done, 0);
  1398.     if (rv != SECSuccess) {
  1399. return rv;  /* err set by AppendHandshake. */
  1400.     }
  1401.     rv = ssl3_FlushHandshake(ss, 0);
  1402.     if (rv != SECSuccess) {
  1403. return rv; /* error code set by ssl3_FlushHandshake */
  1404.     }
  1405.     return SECSuccess;
  1406. }
  1407. /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete
  1408.  * ssl3 Certificate Verify message
  1409.  * Caller must hold Handshake and RecvBuf locks.
  1410.  */
  1411. static SECStatus
  1412. ssl3_HandleCertificateVerify(sslSocket *ss, SSL3Opaque *b, PRUint32 length,
  1413.      SSL3Hashes *hashes)
  1414. {
  1415.     SECItem              signed_hash = {siBuffer, NULL, 0};
  1416.     SECStatus            rv;
  1417.     int                  errCode     = SSL_ERROR_RX_MALFORMED_CERT_VERIFY;
  1418.     SSL3AlertDescription desc        = handshake_failure;
  1419.     PRBool               isTLS;
  1420.     SSL_TRC(3, ("%d: SSL3[%d]: handle certificate_verify handshake",
  1421. SSL_GETPID(), ss->fd));
  1422.     PORT_Assert( ssl_HaveRecvBufLock(ss) );
  1423.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  1424.     if (ss->ssl3->hs.ws != wait_cert_verify || ss->sec->peerCert == NULL) {
  1425. desc    = unexpected_message;
  1426. errCode = SSL_ERROR_RX_UNEXPECTED_CERT_VERIFY;
  1427. goto alert_loser;
  1428.     }
  1429.     rv = ssl3_ConsumeHandshakeVariable(ss, &signed_hash, 2, &b, &length);
  1430.     if (rv != SECSuccess) {
  1431. goto loser; /* malformed. */
  1432.     }
  1433.     isTLS = (PRBool)(ss->ssl3->prSpec->version > SSL_LIBRARY_VERSION_3_0);
  1434.     /* XXX verify that the key & kea match */
  1435.     rv = ssl3_VerifySignedHashes(hashes, ss->sec->peerCert, &signed_hash,
  1436.  isTLS, ss->pkcs11PinArg);
  1437.     if (rv != SECSuccess) {
  1438.      errCode = PORT_GetError();
  1439. desc = isTLS ? decrypt_error : handshake_failure;
  1440. goto alert_loser;
  1441.     }
  1442.     PORT_Free(signed_hash.data);
  1443.     signed_hash.data = NULL;
  1444.     if (length != 0) {
  1445. desc    = isTLS ? decode_error : illegal_parameter;
  1446. goto alert_loser; /* malformed */
  1447.     }
  1448.     ss->ssl3->hs.ws = wait_change_cipher;
  1449.     return SECSuccess;
  1450. alert_loser:
  1451.     SSL3_SendAlert(ss, alert_fatal, desc);
  1452. loser:
  1453.     if (signed_hash.data != NULL) SECITEM_FreeItem(&signed_hash, PR_FALSE);
  1454.     PORT_SetError(errCode);
  1455.     return SECFailure;
  1456. }
  1457. /*
  1458. ** Called from ssl3_HandleClientKeyExchange()
  1459. */
  1460. static SECStatus
  1461. ssl3_HandleFortezzaClientKeyExchange(sslSocket *ss, SSL3Opaque *b,
  1462.      PRUint32 length,
  1463.                                      SECKEYPrivateKey *serverKey)
  1464. {
  1465.     SECKEYPublicKey * pubKey            = NULL;
  1466.     PK11SymKey *      tek               = NULL;
  1467.     PK11SymKey *      pms;
  1468.     PK11SymKey *      Ks = NULL;
  1469.     sslSessionID *    sid  = ss->sec->ci.sid;
  1470.     ssl3CipherSpec *  pwSpec  = ss->ssl3->pwSpec;
  1471.     void *            pwArg             = ss->pkcs11PinArg;
  1472.     SECStatus         rv;
  1473.     SECItem           raItem;
  1474.     SECItem           rbItem;
  1475.     SECItem           param;
  1476.     SECItem           item;
  1477.     SECItem           enc_pms;
  1478.     SSL3FortezzaKeys  fortezza_CKE;
  1479.     PORT_Assert( ssl_HaveRecvBufLock(ss) );
  1480.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  1481.     fortezza_CKE.y_c.data = NULL;
  1482.     rv = ssl3_ConsumeHandshakeVariable(ss, &fortezza_CKE.y_c, 1, &b, &length);
  1483.     if (rv != SECSuccess) {
  1484. PORT_SetError(SSL_ERROR_RX_MALFORMED_CLIENT_KEY_EXCH);
  1485. goto fortezza_loser;
  1486.     }
  1487.     rv = ssl3_ConsumeHandshake(ss, &fortezza_CKE.r_c,
  1488.                        sizeof fortezza_CKE - sizeof fortezza_CKE.y_c,
  1489.                        &b, &length);
  1490.     if (rv != SECSuccess) {
  1491. PORT_SetError(SSL_ERROR_RX_MALFORMED_CLIENT_KEY_EXCH);
  1492. goto fortezza_loser;
  1493.     }
  1494.     /* Build a Token Encryption key (tek). TEK's can never be unloaded
  1495.      * from the card, but given these parameters, and *OUR* fortezza
  1496.      * card, we can always regenerate the same one on the fly.
  1497.      */
  1498.     if (ss->sec->peerCert != NULL) {
  1499. /* client-auth case */
  1500. pubKey = CERT_ExtractPublicKey(ss->sec->peerCert);
  1501. if (pubKey == NULL) {
  1502.     SEND_ALERT
  1503.     PORT_SetError(SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE);
  1504.     rv = SECFailure;
  1505.     goto fortezza_loser;
  1506. }
  1507. if (pubKey->keyType != fortezzaKey) {
  1508.     /* handle V3 client-auth case */
  1509.     SECItem       sigItem;
  1510.     SECItem       hashItem;
  1511.     unsigned char hash[SHA1_LENGTH];
  1512.     rv = ssl3_ComputeFortezzaPublicKeyHash(fortezza_CKE.y_c, hash);
  1513.     if (rv != SECSuccess) {
  1514. SEND_ALERT
  1515. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  1516. goto fortezza_loser;
  1517.     }
  1518.     sigItem.data  = fortezza_CKE.y_signature;
  1519.     sigItem.len   = sizeof fortezza_CKE.y_signature;
  1520.     hashItem.data = hash;
  1521.     hashItem.len  = sizeof hash;
  1522.     rv = PK11_Verify(pubKey, &sigItem, &hashItem, pwArg);
  1523.     if (rv != SECSuccess) {
  1524. SSL3_SendAlert(ss, alert_fatal, illegal_parameter);
  1525. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  1526. goto fortezza_loser;
  1527.     }
  1528.     SECKEY_DestroyPublicKey(pubKey); pubKey = NULL;
  1529. }
  1530.     }
  1531.     rv = SECFailure;
  1532.     /* Make the public key if necessary */
  1533.     if (fortezza_CKE.y_c.len != 0) {
  1534. if (pubKey != NULL) {
  1535.     /* The client is not allowed to send the public key
  1536.      * if it can be extracted from the certificate. */
  1537.     SSL3_SendAlert(ss, alert_fatal, illegal_parameter);
  1538.     PORT_SetError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  1539.     goto fortezza_loser;
  1540. }
  1541. pubKey = PK11_MakeKEAPubKey(fortezza_CKE.y_c.data,
  1542.     fortezza_CKE.y_c.len);
  1543.     }
  1544.     if (pubKey == NULL) {
  1545. /* no public Key in either the cert or the protocol message*/
  1546. SSL3_SendAlert(ss, alert_fatal, illegal_parameter);
  1547. PORT_SetError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  1548. goto fortezza_loser;
  1549.     }
  1550.     /* Now we derive the TEK.  r_c is the client's "random" public key. */
  1551.     raItem.data = fortezza_CKE.r_c;
  1552.     raItem.len  = sizeof(fortezza_CKE.r_c);
  1553.     /* R_s == server's "random" public key, sent in the Server Key Exchange */
  1554.     rbItem.data = ss->ssl3->fortezza.R_s;
  1555.     rbItem.len  = sizeof ss->ssl3->fortezza.R_s;
  1556.     tek = PK11_PubDerive(serverKey, pubKey, PR_FALSE, /* don't gen r_c */
  1557.                          &raItem, &rbItem, CKM_KEA_KEY_DERIVE,
  1558.  CKM_SKIPJACK_WRAP, CKA_WRAP, 0, pwArg);
  1559.     SECKEY_DestroyPublicKey(pubKey); pubKey = NULL;
  1560.     if (tek == NULL) {
  1561. SEND_ALERT
  1562. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  1563. goto fortezza_loser;
  1564.     }
  1565.     ss->ssl3->fortezza.tek = PK11_ReferenceSymKey(tek);
  1566.     if (pwSpec->cipher_def->calg == calg_fortezza) {
  1567. item.data = fortezza_CKE.wrapped_client_write_key;
  1568. item.len  = sizeof fortezza_CKE.wrapped_client_write_key;
  1569. pwSpec->client.write_key =
  1570. PK11_UnwrapSymKey(tek, CKM_SKIPJACK_WRAP, NULL, &item,
  1571.                   CKM_SKIPJACK_CBC64, CKA_DECRYPT, 0);
  1572. if (pwSpec->client.write_key == NULL) {
  1573.     SEND_ALERT
  1574.     ssl_MapLowLevelError(SSL_ERROR_SYM_KEY_UNWRAP_FAILURE);
  1575.     goto fortezza_loser;
  1576. }
  1577. item.data = fortezza_CKE.wrapped_server_write_key;
  1578. item.len  = sizeof fortezza_CKE.wrapped_server_write_key;
  1579. pwSpec->server.write_key =
  1580. PK11_UnwrapSymKey(tek, CKM_SKIPJACK_WRAP, NULL, &item,
  1581.                   CKM_SKIPJACK_CBC64, CKA_ENCRYPT, 0);
  1582. if (pwSpec->server.write_key == NULL) {
  1583.     PK11_FreeSymKey(pwSpec->client.write_key);
  1584.     pwSpec->client.write_key = NULL;
  1585.     SEND_ALERT
  1586.     ssl_MapLowLevelError(SSL_ERROR_SYM_KEY_UNWRAP_FAILURE);
  1587.     goto fortezza_loser;
  1588. }
  1589. /* Set a flag that says "generate 8 byte random prefix plaintext." */
  1590. PK11_SetFortezzaHack(pwSpec->server.write_key); /* can't fail */
  1591. PORT_Memcpy(pwSpec->client.write_iv, fortezza_CKE.client_write_iv,
  1592.     sizeof fortezza_CKE.client_write_iv);
  1593. PORT_Memcpy(pwSpec->server.write_iv, fortezza_CKE.server_write_iv,
  1594.     sizeof fortezza_CKE.server_write_iv);
  1595.     }
  1596.     /* decrypt the pms with the TEK */
  1597.     enc_pms.data = fortezza_CKE.encrypted_preMasterSecret;
  1598.     enc_pms.len  = sizeof fortezza_CKE.encrypted_preMasterSecret;
  1599.     param.data = fortezza_CKE.master_secret_iv;
  1600.     param.len  = sizeof fortezza_CKE.master_secret_iv;
  1601.     pms = PK11_UnwrapSymKey(tek, CKM_SKIPJACK_CBC64, &param, &enc_pms,
  1602.     CKM_SSL3_MASTER_KEY_DERIVE, CKA_DERIVE, 0);
  1603.     if (pms == NULL) {
  1604. SEND_ALERT
  1605. ssl_MapLowLevelError(SSL_ERROR_SYM_KEY_UNWRAP_FAILURE);
  1606. goto fortezza_loser;
  1607.     }
  1608.     rv = ssl3_InitPendingCipherSpec(ss,  pms);
  1609.     PK11_FreeSymKey(pms);
  1610.     if (rv != SECSuccess) {
  1611. SEND_ALERT
  1612. goto fortezza_loser;  /* err code is set. */
  1613.     }
  1614.     if (pwSpec->cipher_def->calg == calg_fortezza) {
  1615. PK11SlotInfo *    slot;
  1616. sid->u.ssl3.clientWriteKey =
  1617.     PK11_ReferenceSymKey(pwSpec->client.write_key);
  1618. sid->u.ssl3.serverWriteKey =
  1619.     PK11_ReferenceSymKey(pwSpec->server.write_key);
  1620. PORT_Memcpy(sid->u.ssl3.keys.client_write_iv, pwSpec->client.write_iv,
  1621.     sizeof sid->u.ssl3.keys.client_write_iv);
  1622. PORT_Memcpy(sid->u.ssl3.keys.server_write_iv, pwSpec->server.write_iv,
  1623.     sizeof sid->u.ssl3.keys.server_write_iv);
  1624. /* Now, wrap the client and server write keys in Ks for storage
  1625.  * in the on-disk sid.
  1626.  */
  1627. slot = PK11_GetSlotFromKey(tek);  /* get ref to the slot */
  1628. if (slot == NULL) {
  1629.     ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  1630.     goto fortezza_loser;
  1631. }
  1632. /* Look up the Token Fixed Key */
  1633. Ks = PK11_FindFixedKey(slot, CKM_SKIPJACK_WRAP, NULL, ss->pkcs11PinArg);
  1634. PK11_FreeSlot(slot);
  1635. if (Ks == NULL) {
  1636.     ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  1637.     goto fortezza_loser;
  1638. }
  1639. /* rewrap server write key with the local Ks */
  1640. item.data = sid->u.ssl3.keys.wrapped_server_write_key;
  1641. item.len  = sizeof sid->u.ssl3.keys.wrapped_server_write_key;
  1642. rv = PK11_WrapSymKey(CKM_SKIPJACK_WRAP, NULL, Ks,
  1643.                      pwSpec->server.write_key, &item);
  1644. if (rv != SECSuccess) {
  1645.     ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  1646.     goto fortezza_loser;
  1647. }
  1648. /* rewrap client write key with the local Ks */
  1649. item.data = sid->u.ssl3.keys.wrapped_client_write_key;
  1650. item.len  = sizeof sid->u.ssl3.keys.wrapped_client_write_key;
  1651. rv = PK11_WrapSymKey(CKM_SKIPJACK_WRAP, NULL, Ks,
  1652.                      pwSpec->client.write_key, &item);
  1653. if (rv != SECSuccess) {
  1654.     ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  1655.     goto fortezza_loser;
  1656. }
  1657. /* wrap the master secret later, when we handle the client's
  1658.  * finished message.
  1659.  */
  1660.     }
  1661.     sid->u.ssl3.hasFortezza = PR_TRUE;
  1662.     sid->u.ssl3.tek = tek; tek = NULL;
  1663.     rv = SECSuccess;
  1664. fortezza_loser:
  1665.     if (Ks)  PK11_FreeSymKey(Ks);
  1666.     if (tek) PK11_FreeSymKey(tek);
  1667.     if (pubKey) SECKEY_DestroyPublicKey(pubKey);
  1668.     if (fortezza_CKE.y_c.data != NULL)
  1669.      SECITEM_FreeItem(&fortezza_CKE.y_c, PR_FALSE);
  1670.     return rv;
  1671. }
  1672. /* find a slot that is able to generate a PMS and wrap it with RSA.
  1673.  * Then generate and return the PMS.
  1674.  * If the serverKeySlot parameter is non-null, this function will use
  1675.  * that slot to do the job, otherwise it will find a slot.
  1676.  *
  1677.  * Called from  ssl3_GenerateSessionKeys()         (above)
  1678.  * sendRSAClientKeyExchange()         (above)
  1679.  * ssl3_HandleRSAClientKeyExchange()  (below)
  1680.  * Caller must hold the SpecWriteLock, the SSL3HandshakeLock
  1681.  */
  1682. static PK11SymKey *
  1683. ssl3_GenerateRSAPMS(sslSocket *ss, ssl3CipherSpec *spec,
  1684.                     PK11SlotInfo * serverKeySlot)
  1685. {
  1686.     PK11SymKey *      pms = NULL;
  1687.     PK11SlotInfo *    slot = serverKeySlot;
  1688.     void *       pwArg  = ss->pkcs11PinArg;
  1689.     SECItem           param;
  1690.     CK_VERSION        version;
  1691.     CK_MECHANISM_TYPE mechanism_array[3];
  1692.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  1693.     if (slot == NULL) {
  1694. /* The specReadLock would suffice here, but we cannot assert on
  1695. ** read locks.  Also, all the callers who call with a non-null
  1696. ** slot already hold the SpecWriteLock.
  1697. */
  1698. PORT_Assert( ssl_HaveSpecWriteLock(ss));
  1699. PORT_Assert(ss->ssl3->prSpec == ss->ssl3->pwSpec);
  1700. /* First get an appropriate slot.  */
  1701. mechanism_array[0] = CKM_SSL3_PRE_MASTER_KEY_GEN;
  1702. mechanism_array[1] = CKM_RSA_PKCS;
  1703. mechanism_array[2] = (CK_MECHANISM_TYPE) spec->cipher_def->calg;
  1704. slot = PK11_GetBestSlotMultiple(mechanism_array, 3, pwArg);
  1705. if (slot == NULL) {
  1706.    /* can't find a slot with all three, find a slot with the minimum */
  1707.     slot = PK11_GetBestSlotMultiple(mechanism_array, 2, pwArg);
  1708.     if (slot == NULL) {
  1709. PORT_SetError(SSL_ERROR_TOKEN_SLOT_NOT_FOUND);
  1710. return pms; /* which is NULL */
  1711.     }
  1712. }
  1713.     }
  1714.     /* Generate the pre-master secret ...  */
  1715.     version.major = MSB(ss->clientHelloVersion);
  1716.     version.minor = LSB(ss->clientHelloVersion);
  1717.     param.data = (unsigned char *)&version;
  1718.     param.len  = sizeof version;
  1719.     pms = PK11_KeyGen(slot, CKM_SSL3_PRE_MASTER_KEY_GEN, &param, 0, pwArg);
  1720.     if (!serverKeySlot)
  1721. PK11_FreeSlot(slot);
  1722.     if (pms == NULL) {
  1723. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  1724.     }
  1725.     return pms;
  1726. }
  1727. /* Note: The Bleichenbacher attack on PKCS#1 necessitates that we NEVER
  1728.  * return any indication of failure of the Client Key Exchange message,
  1729.  * where that failure is caused by the content of the client's message.
  1730.  * This function must not return SECFailure for any reason that is directly
  1731.  * or indirectly caused by the content of the client's encrypted PMS.
  1732.  * We must not send an alert and also not drop the connection.
  1733.  * Instead, we generate a random PMS.  This will cause a failure
  1734.  * in the processing the finished message, which is exactly where
  1735.  * the failure must occur.
  1736.  *
  1737.  * Called from ssl3_HandleClientKeyExchange
  1738.  */
  1739. static SECStatus
  1740. ssl3_HandleRSAClientKeyExchange(sslSocket *ss,
  1741.                                 SSL3Opaque *b,
  1742. PRUint32 length,
  1743. SECKEYPrivateKey *serverKey)
  1744. {
  1745.     PK11SymKey *      pms;
  1746.     SECStatus         rv;
  1747.     SECItem           enc_pms;
  1748.     PORT_Assert( ssl_HaveRecvBufLock(ss) );
  1749.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  1750.     enc_pms.data = b;
  1751.     enc_pms.len  = length;
  1752.     if (ss->ssl3->prSpec->version > SSL_LIBRARY_VERSION_3_0) { /* isTLS */
  1753. PRInt32 kLen;
  1754. kLen = ssl3_ConsumeHandshakeNumber(ss, 2, &enc_pms.data, &enc_pms.len);
  1755. if (kLen < 0) {
  1756.     PORT_SetError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  1757.     return SECFailure;
  1758. }
  1759. if ((unsigned)kLen < enc_pms.len) {
  1760.     enc_pms.len = kLen;
  1761. }
  1762.     }
  1763.     /*
  1764.      * decrypt pms out of the incoming buffer
  1765.      * Note: CKM_SSL3_PRE_MASTER_KEY_GEN is NOT the mechanism used to do 
  1766.      * the unwrap.  Rather, it is the mechanism with which the unwrapped
  1767.      * pms will be used.
  1768.      */
  1769.     pms = PK11_PubUnwrapSymKey(serverKey, &enc_pms,
  1770.        CKM_SSL3_PRE_MASTER_KEY_GEN, CKA_DERIVE, 0);
  1771.     if (pms != NULL) {
  1772. PRINT_BUF(60, (ss, "decrypted premaster secret:",
  1773.        PK11_GetKeyData(pms)->data,
  1774.        PK11_GetKeyData(pms)->len));
  1775.     } else {
  1776. /* unwrap failed.  Generate a bogus pre-master secret and carry on. */
  1777. PK11SlotInfo *  slot   = PK11_GetSlotFromPrivateKey(serverKey);
  1778. ssl_GetSpecWriteLock(ss);
  1779. pms = ssl3_GenerateRSAPMS(ss, ss->ssl3->prSpec, slot);
  1780. ssl_ReleaseSpecWriteLock(ss);
  1781. PK11_FreeSlot(slot);
  1782.     }
  1783.     if (pms == NULL) {
  1784. /* last gasp.  */
  1785. ssl_MapLowLevelError(SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE);
  1786. return SECFailure;
  1787.     }
  1788.     rv = ssl3_InitPendingCipherSpec(ss,  pms);
  1789.     PK11_FreeSymKey(pms);
  1790.     if (rv != SECSuccess) {
  1791. SEND_ALERT
  1792. return SECFailure; /* error code set by ssl3_InitPendingCipherSpec */
  1793.     }
  1794.     return SECSuccess;
  1795. }
  1796. /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete
  1797.  * ssl3 ClientKeyExchange message from the remote client
  1798.  * Caller must hold Handshake and RecvBuf locks.
  1799.  */
  1800. static SECStatus
  1801. ssl3_HandleClientKeyExchange(sslSocket *ss, SSL3Opaque *b, PRUint32 length)
  1802. {
  1803.     SECKEYPrivateKey *serverKey         = NULL;
  1804.     SECStatus         rv;
  1805. const ssl3KEADef *    kea_def;
  1806.     SSL_TRC(3, ("%d: SSL3[%d]: handle client_key_exchange handshake",
  1807. SSL_GETPID(), ss->fd));
  1808.     PORT_Assert( ssl_HaveRecvBufLock(ss) );
  1809.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  1810.     if (ss->ssl3->hs.ws != wait_client_key) {
  1811. SSL3_SendAlert(ss, alert_fatal, unexpected_message);
  1812.      PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CLIENT_KEY_EXCH);
  1813. return SECFailure;
  1814.     }
  1815.     kea_def   = ss->ssl3->hs.kea_def;
  1816.     serverKey =  (ss->ssl3->hs.usedStepDownKey
  1817. #ifdef DEBUG
  1818.  && kea_def->is_limited /* XXX OR cert is signing only */
  1819.  && kea_def->exchKeyType == kt_rsa 
  1820.  && ss->stepDownKeyPair != NULL
  1821. #endif
  1822.  ) ? ss->stepDownKeyPair->privKey
  1823.    : ss->serverKey[kea_def->exchKeyType];
  1824.     if (serverKey == NULL) {
  1825.      SEND_ALERT
  1826. PORT_SetError(SSL_ERROR_NO_SERVER_KEY_FOR_ALG);
  1827. return SECFailure;
  1828.     }
  1829.     switch (kea_def->exchKeyType) {
  1830.     case kt_rsa:
  1831. rv = ssl3_HandleRSAClientKeyExchange(ss, b, length, serverKey);
  1832. if (rv != SECSuccess) {
  1833.     SEND_ALERT
  1834.     return SECFailure; /* error code set by ssl3_InitPendingCipherSpec */
  1835. }
  1836. break;
  1837.     case kt_fortezza:
  1838. rv = ssl3_HandleFortezzaClientKeyExchange(ss, b, length, serverKey);
  1839. if (rv != SECSuccess) {
  1840.     return SECFailure; /* error code set */
  1841. }
  1842. break;
  1843.     default:
  1844. (void) ssl3_HandshakeFailure(ss);
  1845. PORT_SetError(SEC_ERROR_UNSUPPORTED_KEYALG);
  1846. return SECFailure;
  1847.     }
  1848.     ss->ssl3->hs.ws = ss->sec->peerCert ? wait_cert_verify : wait_change_cipher;
  1849.     return SECSuccess;
  1850. }
  1851. /* This is TLS's equivalent of sending a no_certificate alert. */
  1852. static SECStatus
  1853. ssl3_SendEmptyCertificate(sslSocket *ss)
  1854. {
  1855.     SECStatus            rv;
  1856.     rv = ssl3_AppendHandshakeHeader(ss, certificate, 3);
  1857.     if (rv == SECSuccess) {
  1858. rv = ssl3_AppendHandshakeNumber(ss, 0, 3);
  1859.     }
  1860.     return rv; /* error, if any, set by functions called above. */
  1861. }
  1862. /*
  1863.  * Used by both client and server.
  1864.  * Called from HandleServerHelloDone and from SendServerHelloSequence.
  1865.  */
  1866. static SECStatus
  1867. ssl3_SendCertificate(sslSocket *ss)
  1868. {
  1869.     SECStatus            rv;
  1870.     CERTCertificateList *certChain;
  1871.     int                  len  = 0;
  1872.     int                  i;
  1873.     SSL_TRC(3, ("%d: SSL3[%d]: send certificate handshake",
  1874. SSL_GETPID(), ss->fd));
  1875.     PORT_Assert( ssl_HaveXmitBufLock(ss));
  1876.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss));
  1877.     certChain = (ss->sec->isServer)
  1878.       ? ss->serverCertChain[ss->ssl3->hs.kea_def->exchKeyType]
  1879.       : ss->ssl3->clientCertChain;
  1880.     if (certChain) {
  1881. for (i = 0; i < certChain->len; i++) {
  1882.     len += certChain->certs[i].len + 3;
  1883. }
  1884.     }
  1885.     rv = ssl3_AppendHandshakeHeader(ss, certificate, len + 3);
  1886.     if (rv != SECSuccess) {
  1887. return rv;  /* err set by AppendHandshake. */
  1888.     }
  1889.     rv = ssl3_AppendHandshakeNumber(ss, len, 3);
  1890.     if (rv != SECSuccess) {
  1891. return rv;  /* err set by AppendHandshake. */
  1892.     }
  1893.     for (i = 0; i < certChain->len; i++) {
  1894. rv = ssl3_AppendHandshakeVariable(ss, certChain->certs[i].data,
  1895.   certChain->certs[i].len, 3);
  1896. if (rv != SECSuccess) {
  1897.     return rv;  /* err set by AppendHandshake. */
  1898. }
  1899.     }
  1900.     return SECSuccess;
  1901. }
  1902. /* This is used to delete the CA certificates in the peer certificate chain
  1903.  * from the cert database after they've been validated.
  1904.  */
  1905. static void
  1906. ssl3_CleanupPeerCerts(ssl3State *ssl3)
  1907. {
  1908.     PRArenaPool * arena = ssl3->peerCertArena;
  1909.     ssl3CertNode *certs = (ssl3CertNode *)ssl3->peerCertChain;
  1910.     for (; certs; certs = certs->next) {
  1911. CERT_DestroyCertificate(certs->cert);
  1912.     }
  1913.     if (arena) PORT_FreeArena(arena, PR_FALSE);
  1914.     ssl3->peerCertArena = NULL;
  1915.     ssl3->peerCertChain = NULL;
  1916. }
  1917. /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete
  1918.  * ssl3 Certificate message.
  1919.  * Caller must hold Handshake and RecvBuf locks.
  1920.  */
  1921. static SECStatus
  1922. ssl3_HandleCertificate(sslSocket *ss, SSL3Opaque *b, PRUint32 length)
  1923. {
  1924.     ssl3CertNode *   c;
  1925.     ssl3CertNode *   certs  = NULL;
  1926.     PRArenaPool *    arena  = NULL;
  1927.     ssl3State *      ssl3   = ss->ssl3;
  1928.     sslSecurityInfo *sec    = ss->sec;
  1929.     CERTCertificate *cert;
  1930.     PRInt32          remaining;
  1931.     PRInt32          size;
  1932.     SECStatus        rv;
  1933.     PRBool           isServer = (PRBool)(!!sec->isServer);
  1934.     PRBool           trusted  = PR_FALSE;
  1935.     PRBool           isTLS;
  1936.     SSL3AlertDescription desc = bad_certificate;
  1937.     int              errCode    = SSL_ERROR_RX_MALFORMED_CERTIFICATE;
  1938.     SECItem          certItem;
  1939.     SSL_TRC(3, ("%d: SSL3[%d]: handle certificate handshake",
  1940. SSL_GETPID(), ss->fd));
  1941.     PORT_Assert( ssl_HaveRecvBufLock(ss) );
  1942.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  1943.     if ((ssl3->hs.ws != wait_server_cert) &&
  1944. (ssl3->hs.ws != wait_client_cert)) {
  1945. desc    = unexpected_message;
  1946. errCode = SSL_ERROR_RX_UNEXPECTED_CERTIFICATE;
  1947. goto alert_loser;
  1948.     }
  1949.     PORT_Assert(ssl3->peerCertArena == NULL);
  1950.     if (sec->peerCert != NULL) {
  1951. if (sec->peerKey) {
  1952.     SECKEY_DestroyPublicKey(sec->peerKey);
  1953.     sec->peerKey = NULL;
  1954. }
  1955. CERT_DestroyCertificate(sec->peerCert);
  1956. sec->peerCert = NULL;
  1957.     }
  1958.     remaining = ssl3_ConsumeHandshakeNumber(ss, 3, &b, &length);
  1959.     if (remaining < 0)
  1960. goto loser; /* fatal alert already sent by ConsumeHandshake. */
  1961.     isTLS = (PRBool)(ssl3->prSpec->version > SSL_LIBRARY_VERSION_3_0);
  1962.     if (!remaining && isTLS && isServer) { 
  1963.      /* This is TLS's version of a no_certificate alert. */
  1964.      /* I'm a server. I've requested a client cert. He hasn't got one. */
  1965. rv = ssl3_HandleNoCertificate(ss);
  1966. goto cert_block;
  1967.     }
  1968.     ssl3->peerCertArena = arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
  1969.     if ( arena == NULL ) {
  1970. goto loser; /* don't send alerts on memory errors */
  1971.     }
  1972.     /* First get the peer cert. */
  1973.     remaining -= 3;
  1974.     if (remaining < 0)
  1975. goto decode_loser;
  1976.     size = ssl3_ConsumeHandshakeNumber(ss, 3, &b, &length);
  1977.     if (size < 0)
  1978. goto loser; /* fatal alert already sent by ConsumeHandshake. */
  1979.     remaining -= size;
  1980.     if (remaining < 0)
  1981. goto decode_loser;
  1982.     certItem.data = (unsigned char*)PORT_ArenaAlloc(arena, size);
  1983.     if (certItem.data == NULL) {
  1984. goto loser; /* don't send alerts on memory errors */
  1985.     }
  1986.     certItem.len = size;
  1987.     rv = ssl3_ConsumeHandshake(ss, certItem.data, certItem.len, &b, &length);
  1988.     if (rv != SECSuccess)
  1989. goto loser; /* fatal alert already sent by ConsumeHandshake. */
  1990.     sec->peerCert = CERT_NewTempCertificate(ss->dbHandle, &certItem, NULL,
  1991.                                             PR_FALSE, PR_TRUE);
  1992.     if (sec->peerCert == NULL) {
  1993. /* We should report an alert if the cert was bad, but not if the
  1994.  * problem was just some local problem, like memory error.
  1995.  */
  1996. goto ambiguous_err;
  1997.     }
  1998.     /* Now get all of the CA certs. */
  1999.     while (remaining != 0) {
  2000. remaining -= 3;
  2001. if (remaining < 0)
  2002.     goto decode_loser;
  2003. size = ssl3_ConsumeHandshakeNumber(ss, 3, &b, &length);
  2004. if (size < 0)
  2005.     goto loser; /* fatal alert already sent by ConsumeHandshake. */
  2006. remaining -= size;
  2007. if (remaining < 0)
  2008.     goto decode_loser;
  2009. certItem.data = (unsigned char*)PORT_ArenaAlloc(arena, size);
  2010. if (certItem.data == NULL) {
  2011.     goto loser; /* don't send alerts on memory errors */
  2012. }
  2013. certItem.len = size;
  2014. rv = ssl3_ConsumeHandshake(ss, certItem.data, certItem.len,
  2015.    &b, &length);
  2016. if (rv != SECSuccess)
  2017.     goto loser; /* fatal alert already sent by ConsumeHandshake. */
  2018. c = PORT_ArenaNew(arena, ssl3CertNode);
  2019. if (c == NULL) {
  2020.     goto loser; /* don't send alerts on memory errors */
  2021. }
  2022. c->cert = CERT_NewTempCertificate(ss->dbHandle, &certItem, NULL,
  2023.                                   PR_FALSE, PR_TRUE);
  2024. if (c->cert == NULL) {
  2025.     goto ambiguous_err;
  2026. }
  2027. if (c->cert->trust)
  2028.     trusted = PR_TRUE;
  2029. c->next = certs;
  2030. certs = c;
  2031.     }
  2032.     if (remaining != 0)
  2033.         goto decode_loser;
  2034.     SECKEY_UpdateCertPQG(sec->peerCert);
  2035.     /*
  2036.      * We're making a fortezza connection, and the card hasn't unloaded it's
  2037.      * certs, try to  unload those certs now.
  2038.      */
  2039.     if (!trusted) {
  2040. CERTCertificate *ccert;
  2041. ccert = PK11_FindBestKEAMatch(sec->peerCert, ss->pkcs11PinArg);
  2042. if (ccert) 
  2043.     CERT_DestroyCertificate(ccert);
  2044.     }
  2045.     rv = (SECStatus)(*ss->authCertificate)(ss->authCertificateArg, ss->fd,
  2046.    PR_TRUE, isServer);
  2047.     if (rv) {
  2048. errCode = PORT_GetError();
  2049. if (!ss->handleBadCert) {
  2050.     goto bad_cert;
  2051. }
  2052. rv = (SECStatus)(*ss->handleBadCert)(ss->badCertArg, ss->fd);
  2053. if ( rv ) {
  2054.     if ( rv == SECWouldBlock ) {
  2055. /* someone will handle this connection asynchronously*/
  2056. SSL_DBG(("%d: SSL3[%d]: go to async cert handler",
  2057.  SSL_GETPID(), ss->fd));
  2058. ssl3->peerCertChain = certs;
  2059. certs               = NULL;
  2060. ssl_SetAlwaysBlock(ss);
  2061. goto cert_block;
  2062.     }
  2063.     /* cert is bad */
  2064.     goto bad_cert;
  2065. }
  2066. /* cert is good */
  2067.     }
  2068.     /* start SSL Step Up, if appropriate */
  2069.     cert = sec->peerCert;
  2070.     if (!isServer &&
  2071.      ssl3_global_policy_some_restricted &&
  2072.         ssl3->policy == SSL_ALLOWED &&
  2073. anyRestrictedEnabled(ss) &&
  2074. SECSuccess == CERT_VerifyCertNow(cert->dbhandle, cert,
  2075.                                  PR_FALSE, /* checkSig */
  2076.          certUsageSSLServerWithStepUp,
  2077. /*XXX*/          ss->authCertificateArg) ) {
  2078. ssl3->policy         = SSL_RESTRICTED;
  2079. ssl3->hs.rehandshake = PR_TRUE;
  2080.     }
  2081.     sec->ci.sid->peerCert = CERT_DupCertificate(sec->peerCert);
  2082.     /* We don't need the CA certs now that we've authenticated the peer cert. */
  2083.     ssl3->peerCertChain = certs;  certs = NULL;  arena = NULL;
  2084.     ssl3_CleanupPeerCerts(ssl3);
  2085. cert_block:
  2086.     if (sec->isServer) {
  2087. ssl3->hs.ws = wait_client_key;
  2088.     } else {
  2089. ssl3->hs.ws = wait_cert_request; /* disallow server_key_exchange */
  2090. if (ssl3->hs.kea_def->is_limited ||
  2091.     /* XXX OR server cert is signing only. */
  2092.     ssl3->hs.kea_def->kea == kea_fortezza) {
  2093.     ssl3->hs.ws = wait_server_key; /* allow server_key_exchange */
  2094. }
  2095.     }
  2096.     /* rv must normally be equal to SECSuccess here.  If we called
  2097.      * handleBadCert, it can also be SECWouldBlock.
  2098.      */
  2099.     return rv;
  2100. ambiguous_err:
  2101.     errCode = PORT_GetError();
  2102.     switch (errCode) {
  2103.     case PR_OUT_OF_MEMORY_ERROR:
  2104.     case SEC_ERROR_BAD_DATABASE:
  2105.     case SEC_ERROR_NO_MEMORY:
  2106. if (isTLS) {
  2107.     desc = internal_error;
  2108.     goto alert_loser;
  2109. }
  2110. goto loser;
  2111.     }
  2112.     /* fall through to bad_cert. */
  2113. bad_cert: /* caller has set errCode. */
  2114.     switch (errCode) {
  2115.     case SEC_ERROR_LIBRARY_FAILURE:     desc = unsupported_certificate; break;
  2116.     case SEC_ERROR_EXPIRED_CERTIFICATE: desc = certificate_expired;     break;
  2117.     case SEC_ERROR_REVOKED_CERTIFICATE: desc = certificate_revoked;     break;
  2118.     case SEC_ERROR_INADEQUATE_KEY_USAGE:
  2119.     case SEC_ERROR_INADEQUATE_CERT_TYPE:
  2120.                         desc = certificate_unknown;     break;
  2121.     case SEC_ERROR_UNTRUSTED_CERT:
  2122.     desc = isTLS ? access_denied : certificate_unknown; break;
  2123.     case SEC_ERROR_UNKNOWN_ISSUER:      
  2124.     case SEC_ERROR_UNTRUSTED_ISSUER:    
  2125.     desc = isTLS ? unknown_ca : certificate_unknown; break;
  2126.     case SEC_ERROR_EXPIRED_ISSUER_CERTIFICATE:
  2127.     desc = isTLS ? unknown_ca : certificate_expired; break;
  2128.     case SEC_ERROR_CERT_NOT_IN_NAME_SPACE:
  2129.     case SEC_ERROR_PATH_LEN_CONSTRAINT_INVALID:
  2130.     case SEC_ERROR_CA_CERT_INVALID:
  2131.     case SEC_ERROR_BAD_SIGNATURE:
  2132.     default:                            desc = bad_certificate;     break;
  2133.     }
  2134.     SSL_DBG(("%d: SSL3[%d]: peer certificate is no good: error=%d",
  2135.      SSL_GETPID(), ss->fd, errCode));
  2136.     goto alert_loser;
  2137. decode_loser:
  2138.     desc = isTLS ? decode_error : bad_certificate;
  2139. alert_loser:
  2140.     (void)SSL3_SendAlert(ss, alert_fatal, desc);
  2141. loser:
  2142.     ssl3->peerCertChain = certs;  certs = NULL;  arena = NULL;
  2143.     ssl3_CleanupPeerCerts(ssl3);
  2144.     if (sec->peerCert != NULL) {
  2145. CERT_DestroyCertificate(sec->peerCert);
  2146. sec->peerCert = NULL;
  2147.     }
  2148.     (void)ssl_MapLowLevelError(errCode);
  2149.     return SECFailure;
  2150. }
  2151. /* restart an SSL connection that we stopped to run certificate dialogs
  2152. ** XXX Need to document here how an application marks a cert to show that
  2153. ** the application has accepted it (overridden CERT_VerifyCert).
  2154.  *
  2155.  * XXX This code only works on the initial handshake on a connection, XXX
  2156.  *     It does not work on a subsequent handshake (redo).
  2157.  *
  2158.  * Return value: XXX
  2159.  *
  2160.  * Caller holds 1stHandshakeLock.
  2161. */
  2162. int
  2163. ssl3_RestartHandshakeAfterServerCert(sslSocket *ss)
  2164. {
  2165.     CERTCertificate * cert;
  2166.     ssl3State       * ssl3 = ss->ssl3;
  2167.     int               rv = SECSuccess;
  2168.     if (MSB(ss->version) != MSB(SSL_LIBRARY_VERSION_3_0)) {
  2169. SET_ERROR_CODE
  2170.      return SECFailure;
  2171.     }
  2172.     if (!ss->sec || !ss->ssl3) {
  2173. SET_ERROR_CODE
  2174.      return SECFailure;
  2175.     }
  2176.     cert = ss->sec->peerCert;
  2177.     /* Permit step up if user decided to accept the cert */
  2178.     if (!ss->sec->isServer &&
  2179.      ssl3_global_policy_some_restricted &&
  2180.         ssl3->policy == SSL_ALLOWED &&
  2181. anyRestrictedEnabled(ss) &&
  2182. (SECSuccess == CERT_VerifyCertNow(cert->dbhandle, cert,
  2183.                                   PR_FALSE, /* checksig */
  2184.           certUsageSSLServerWithStepUp,
  2185. /*XXX*/           ss->authCertificateArg) )) {
  2186. ssl3->policy         = SSL_RESTRICTED;
  2187. ssl3->hs.rehandshake = PR_TRUE;
  2188.     }
  2189.     if (ss->handshake != NULL) {
  2190. ss->handshake = ssl_GatherRecord1stHandshake;
  2191. ssl3_CleanupPeerCerts(ssl3);
  2192. ss->sec->ci.sid->peerCert = CERT_DupCertificate(ss->sec->peerCert);
  2193. ssl_GetRecvBufLock(ss);
  2194. if (ssl3->hs.msgState.buf != NULL) {
  2195.     rv = ssl3_HandleRecord(ss, NULL, &ss->gather->buf);
  2196. }
  2197. ssl_ReleaseRecvBufLock(ss);
  2198.     }
  2199.     return rv;
  2200. }
  2201. static SECStatus
  2202. ssl3_ComputeTLSFinished(ssl3CipherSpec *spec,
  2203. PRBool          isServer,
  2204.                 const   SSL3Finished *  hashes,
  2205.                         TLSFinished  *  tlsFinished)
  2206. {
  2207.     PK11Context *prf_context;
  2208.     const char * label;
  2209.     unsigned int len;
  2210.     SECStatus    rv;
  2211.     SECItem      param  = {siBuffer, NULL, 0};
  2212.     label = isServer ? "server finished" : "client finished";
  2213.     len   = 15;
  2214.     prf_context = 
  2215. PK11_CreateContextBySymKey(CKM_TLS_PRF_GENERAL, CKA_SIGN, 
  2216.                            spec->master_secret, &param);
  2217.     if (!prf_context)
  2218.      return SECFailure;
  2219.     rv  = PK11_DigestBegin(prf_context);
  2220.     rv |= PK11_DigestOp(prf_context, (const unsigned char *) label, len);
  2221.     rv |= PK11_DigestOp(prf_context, hashes->md5, sizeof *hashes);
  2222.     rv |= PK11_DigestFinal(prf_context, tlsFinished->verify_data, 
  2223.                            &len, sizeof *tlsFinished);
  2224.     PORT_Assert(rv != SECSuccess || len == sizeof *tlsFinished);
  2225.     PK11_DestroyContext(prf_context, PR_TRUE);
  2226.     return rv;
  2227. }
  2228. /* called from ssl3_HandleServerHelloDone
  2229.  *             ssl3_HandleClientHello
  2230.  *             ssl3_HandleFinished
  2231.  */
  2232. static SECStatus
  2233. ssl3_SendFinished(sslSocket *ss, PRInt32 flags)
  2234. {
  2235.     ssl3CipherSpec *cwSpec;
  2236.     PRBool          isTLS;
  2237.     PRBool          isServer = ss->sec->isServer;
  2238.     SECStatus       rv;
  2239.     SSL3Sender      sender = isServer ? sender_server : sender_client;
  2240.     SSL3Finished    hashes;
  2241.     TLSFinished     tlsFinished;
  2242.     SSL_TRC(3, ("%d: SSL3[%d]: send finished handshake", SSL_GETPID(), ss->fd));
  2243.     PORT_Assert( ssl_HaveXmitBufLock(ss));
  2244.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss));
  2245.     ssl_GetSpecReadLock(ss);
  2246.     cwSpec = ss->ssl3->cwSpec;
  2247.     isTLS = (PRBool)(cwSpec->version > SSL_LIBRARY_VERSION_3_0);
  2248.     rv = ssl3_ComputeHandshakeHashes(ss, cwSpec, &hashes, sender);
  2249.     if (isTLS && rv == SECSuccess) {
  2250. rv = ssl3_ComputeTLSFinished(cwSpec, isServer, &hashes, &tlsFinished);
  2251.     }
  2252.     ssl_ReleaseSpecReadLock(ss);
  2253.     if (rv != SECSuccess) {
  2254. goto fail; /* err code was set by ssl3_ComputeHandshakeHashes */
  2255.     }
  2256.     if (isTLS) {
  2257. rv = ssl3_AppendHandshakeHeader(ss, finished, sizeof tlsFinished);
  2258. if (rv != SECSuccess) 
  2259.     goto fail;  /* err set by AppendHandshake. */
  2260. rv = ssl3_AppendHandshake(ss, &tlsFinished, sizeof tlsFinished);
  2261. if (rv != SECSuccess) 
  2262.     goto fail;  /* err set by AppendHandshake. */
  2263.     } else {
  2264. rv = ssl3_AppendHandshakeHeader(ss, finished, sizeof hashes);
  2265. if (rv != SECSuccess) 
  2266.     goto fail;  /* err set by AppendHandshake. */
  2267. rv = ssl3_AppendHandshake(ss, &hashes, sizeof hashes);
  2268. if (rv != SECSuccess) 
  2269.     goto fail;  /* err set by AppendHandshake. */
  2270.     }
  2271.     rv = ssl3_FlushHandshake(ss, flags);
  2272.     if (rv != SECSuccess) {
  2273. goto fail; /* error code set by ssl3_FlushHandshake */
  2274.     }
  2275.     return SECSuccess;
  2276. fail:
  2277.     return rv;
  2278. }
  2279. /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete
  2280.  * ssl3 Finished message from the peer.
  2281.  * Caller must hold Handshake and RecvBuf locks.
  2282.  */
  2283. static SECStatus
  2284. ssl3_HandleFinished(sslSocket *ss, SSL3Opaque *b, PRUint32 length,
  2285.     const SSL3Hashes *hashes)
  2286. {
  2287.     sslSecurityInfo * sec    = ss->sec;
  2288.     ssl3State *       ssl3    = ss->ssl3;
  2289.     sslSessionID *    sid    = sec->ci.sid;
  2290.     PK11SymKey *      wrappingKey  = NULL;
  2291.     PK11SlotInfo *    symKeySlot;
  2292.     void *            pwArg        = ss->pkcs11PinArg;
  2293.     SECStatus         rv;
  2294.     PRBool            isServer     = sec->isServer;
  2295.     PRBool            isTLS;
  2296.     PRBool            doStepUp;
  2297.     CK_MECHANISM_TYPE mechanism;
  2298.     PORT_Assert( ssl_HaveRecvBufLock(ss) );
  2299.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  2300.     SSL_TRC(3, ("%d: SSL3[%d]: handle finished handshake",
  2301.      SSL_GETPID(), ss->fd));
  2302.     if (ssl3->hs.ws != wait_finished) {
  2303. SSL3_SendAlert(ss, alert_fatal, unexpected_message);
  2304.      PORT_SetError(SSL_ERROR_RX_UNEXPECTED_FINISHED);
  2305. return SECFailure;
  2306.     }
  2307.     isTLS = (PRBool)(ssl3->crSpec->version > SSL_LIBRARY_VERSION_3_0);
  2308.     if (isTLS) {
  2309. TLSFinished tlsFinished;
  2310. if (length != sizeof tlsFinished) {
  2311.     (void)SSL3_SendAlert(ss, alert_fatal, decode_error);
  2312.     PORT_SetError(SSL_ERROR_RX_MALFORMED_FINISHED);
  2313.     return SECFailure;
  2314. }
  2315. rv = ssl3_ComputeTLSFinished(ssl3->crSpec, !isServer, 
  2316.                              hashes, &tlsFinished);
  2317. if (rv != SECSuccess ||
  2318.     0 != PORT_Memcmp(&tlsFinished, b, length)) {
  2319.     (void)SSL3_SendAlert(ss, alert_fatal, decrypt_error);
  2320.     PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE);
  2321.     return SECFailure;
  2322. }
  2323.     } else {
  2324. if (length != sizeof(SSL3Hashes)) {
  2325.     (void)ssl3_IllegalParameter(ss);
  2326.     PORT_SetError(SSL_ERROR_RX_MALFORMED_FINISHED);
  2327.     return SECFailure;
  2328. }
  2329. if (0 != PORT_Memcmp(hashes, b, length)) {
  2330.     (void)ssl3_HandshakeFailure(ss);
  2331.     PORT_SetError(SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE);
  2332.     return SECFailure;
  2333. }
  2334.     }
  2335.     doStepUp = (PRBool)(!isServer && ssl3->hs.rehandshake);
  2336.     ssl_GetXmitBufLock(ss); /*************************************/
  2337.     if ((isServer && !ssl3->hs.isResuming) ||
  2338. (!isServer && ssl3->hs.isResuming)) {
  2339. rv = ssl3_SendChangeCipherSpecs(ss);
  2340. if (rv != SECSuccess) {
  2341.     goto xmit_loser; /* err is set. */
  2342. }
  2343. /* XXX Right here, if we knew, somehow, that this thread was in
  2344. ** SSL_SecureSend (trying to write some data) and we weren't going
  2345. ** to step up, then we could set the ssl_SEND_FLAG_FORCE_INTO_BUFFER
  2346. ** flag, so that the last two handshake messages
  2347. ** (e.g. change cipher spec and finished) would get
  2348. ** sent out in the same send/write call as the application data.
  2349. */
  2350. rv = ssl3_SendFinished(ss, 0);
  2351. if (rv != SECSuccess) {
  2352.     goto xmit_loser; /* err is set. */
  2353. }
  2354.     }
  2355.     /* Optimization: don't cache this connection if we're going to step up. */
  2356.     if (doStepUp) {
  2357. ssl_FreeSID(sid);
  2358. ss->sec->ci.sid     = sid = NULL;
  2359. ssl3->hs.rehandshake = PR_FALSE;
  2360. rv = ssl3_SendClientHello(ss);
  2361. xmit_loser:
  2362. ssl_ReleaseXmitBufLock(ss);
  2363. return rv; /* err code is set if appropriate. */
  2364.     }
  2365.     ssl_ReleaseXmitBufLock(ss); /*************************************/
  2366.     /* we're connected now. */
  2367.     ss->handshake           = NULL;
  2368.     ss->connected           = PR_TRUE;
  2369.     ss->gather->writeOffset = 0;
  2370.     ss->gather->readOffset  = 0;
  2371.   if (sid->cached == never_cached) {
  2372.     /* fill in the sid */
  2373.     sid->u.ssl3.cipherSuite = ssl3->hs.cipher_suite;
  2374.     sid->u.ssl3.compression = ssl3->hs.compression;
  2375.     sid->u.ssl3.policy      = ssl3->policy;
  2376.     sid->u.ssl3.exchKeyType = ssl3->hs.kea_def->exchKeyType;
  2377.     sid->version            = ss->version;
  2378.     ssl_GetSpecReadLock(ss); /*************************************/
  2379.     symKeySlot = PK11_GetSlotFromKey(ssl3->crSpec->master_secret);
  2380.     if (!isServer) {
  2381. int  wrapKeyIndex;
  2382. int  incarnation;
  2383. /* these next few functions are mere accessors and don't fail. */
  2384. sid->u.ssl3.masterWrapIndex  = wrapKeyIndex =
  2385.        PK11_GetCurrentWrapIndex(symKeySlot);
  2386. PORT_Assert(wrapKeyIndex == 0); /* array has only one entry! */
  2387. sid->u.ssl3.masterWrapSeries = incarnation =
  2388.        PK11_GetSlotSeries(symKeySlot);
  2389. sid->u.ssl3.masterSlotID   = PK11_GetSlotID(symKeySlot);
  2390. sid->u.ssl3.masterModuleID = PK11_GetModuleID(symKeySlot);
  2391. sid->u.ssl3.masterValid    = PR_TRUE;
  2392. /* Get the default wrapping key, for wrapping the master secret before
  2393.  * placing it in the SID cache entry. */
  2394. wrappingKey = PK11_GetWrapKey(symKeySlot, wrapKeyIndex,
  2395.       CKM_INVALID_MECHANISM, incarnation,
  2396.       pwArg);
  2397. if (wrappingKey) {
  2398.     mechanism = PK11_GetMechanism(wrappingKey); /* can't fail. */
  2399. } else {
  2400.     int keyLength;
  2401.     /* if the wrappingKey doesn't exist, attempt to create it.
  2402.      * Note: we intentionally ignore errors here.  If we cannot
  2403.      * generate a wrapping key, it is not fatal to this SSL connection,
  2404.      * but we will not be able to restart this session.
  2405.      */
  2406.     mechanism = PK11_GetBestWrapMechanism(symKeySlot);
  2407.     keyLength = PK11_GetBestKeyLength(symKeySlot, mechanism);
  2408.     /* Zero length means fixed key length algorithm, or error.
  2409.      * It's ambiguous.
  2410.      */
  2411.     wrappingKey = PK11_KeyGen(symKeySlot, mechanism, NULL,
  2412.                                       keyLength, pwArg);
  2413.     if (wrappingKey) {
  2414.      PK11_SetWrapKey(symKeySlot, wrapKeyIndex, wrappingKey);
  2415.     }
  2416. }
  2417.     } else {
  2418. /* server. */
  2419. mechanism = PK11_GetBestWrapMechanism(symKeySlot);
  2420. if (mechanism != CKM_INVALID_MECHANISM) {
  2421.     wrappingKey =
  2422.      getWrappingKey(ss, symKeySlot, ssl3->hs.kea_def->exchKeyType,
  2423.        mechanism, pwArg);
  2424.     if (wrappingKey) {
  2425. mechanism = PK11_GetMechanism(wrappingKey); /* can't fail. */
  2426.     }
  2427. }
  2428.     }
  2429.     sid->u.ssl3.masterWrapMech = mechanism;
  2430.     PK11_FreeSlot(symKeySlot);
  2431.     rv = SECFailure;
  2432.     if (wrappingKey) {
  2433. SECItem msItem;
  2434. msItem.data = sid->u.ssl3.keys.wrapped_master_secret;
  2435. msItem.len  = sizeof sid->u.ssl3.keys.wrapped_master_secret;
  2436. rv = PK11_WrapSymKey(mechanism, NULL, wrappingKey,
  2437.      ssl3->crSpec->master_secret, &msItem);
  2438. /* rv is examined below. */
  2439. sid->u.ssl3.keys.wrapped_master_secret_len = msItem.len;
  2440. PK11_FreeSymKey(wrappingKey);
  2441.     }
  2442.     ssl_ReleaseSpecReadLock(ss);  /*************************************/
  2443.     /* If the wrap failed, we don't cache the sid.
  2444.      * The connection continues normally however.
  2445.      */
  2446.     if (!ss->noCache && rv == SECSuccess) {
  2447. (*sec->cache)(sid);
  2448.     }
  2449.   }
  2450.     ss->ssl3->hs.ws = idle_handshake;
  2451.     /* Do the handshake callback for sslv3 here. */
  2452.     if (ss->handshakeCallback != NULL) {
  2453. (ss->handshakeCallback)(ss->fd, ss->handshakeCallbackData);
  2454.     }
  2455.     return SECSuccess;
  2456. }
  2457. /* Called from ssl3_HandleHandshake() when it has gathered a complete ssl3
  2458.  * hanshake message.
  2459.  * Caller must hold Handshake and RecvBuf locks.
  2460.  */
  2461. static SECStatus
  2462. ssl3_HandleHandshakeMessage(sslSocket *ss, SSL3Opaque *b, PRUint32 length)
  2463. {
  2464.     SECStatus         rv  = SECSuccess;
  2465.     SSL3HandshakeType type  = ss->ssl3->hs.msg_type;
  2466.     SSL3Hashes        hashes; /* computed hashes are put here. */
  2467.     PRUint8           hdr[4];
  2468.     PORT_Assert( ssl_HaveRecvBufLock(ss) );
  2469.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  2470.     /*
  2471.      * We have to compute the hashes before we update them with the
  2472.      * current message.
  2473.      */
  2474.     ssl_GetSpecReadLock(ss); /************************************/
  2475.     if((type == finished) || (type == certificate_verify)) {
  2476. SSL3Sender      sender = (SSL3Sender)0;
  2477. ssl3CipherSpec *rSpec  = ss->ssl3->prSpec;
  2478. if (type == finished) {
  2479.     sender = ss->sec->isServer ? sender_client : sender_server;
  2480.     rSpec  = ss->ssl3->crSpec;
  2481. }
  2482. rv = ssl3_ComputeHandshakeHashes(ss, rSpec, &hashes, sender);
  2483.     }
  2484.     ssl_ReleaseSpecReadLock(ss); /************************************/
  2485.     if (rv != SECSuccess) {
  2486. return rv; /* error code was set by ssl3_ComputeHandshakeHashes*/
  2487.     }
  2488.     SSL_TRC(30,("%d: SSL3[%d]: handle handshake message: %s", SSL_GETPID(),
  2489. ss->fd, ssl3_DecodeHandshakeType(ss->ssl3->hs.msg_type)));
  2490.     PRINT_BUF(60, (ss, "MD5 handshake hash:",
  2491.            (unsigned char*)ss->ssl3->hs.md5, MD5_LENGTH));
  2492.     PRINT_BUF(95, (ss, "SHA handshake hash:",
  2493.            (unsigned char*)ss->ssl3->hs.sha, SHA1_LENGTH));
  2494.     hdr[0] = (PRUint8)ss->ssl3->hs.msg_type;
  2495.     hdr[1] = (PRUint8)(length >> 16);
  2496.     hdr[2] = (PRUint8)(length >>  8);
  2497.     hdr[3] = (PRUint8)(length      );
  2498.     /* Start new handshake hashes when we start a new handshake */
  2499.     if (ss->ssl3->hs.msg_type == client_hello) {
  2500. SSL_TRC(30,("%d: SSL3[%d]: reset handshake hashes",
  2501. SSL_GETPID(), ss->fd ));
  2502. rv = PK11_DigestBegin(ss->ssl3->hs.md5);
  2503. if (rv != SECSuccess) {
  2504.     ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE);
  2505.     return rv;
  2506. }
  2507. rv = PK11_DigestBegin(ss->ssl3->hs.sha);
  2508. if (rv != SECSuccess) {
  2509.     ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
  2510.     return rv;
  2511. }
  2512.     }
  2513.     /* We should not include hello_request messages in the handshake hashes */
  2514.     if (ss->ssl3->hs.msg_type != hello_request) {
  2515. rv = ssl3_UpdateHandshakeHashes(ss, (unsigned char*) hdr, 4);
  2516. if (rv != SECSuccess) return rv; /* err code already set. */
  2517. rv = ssl3_UpdateHandshakeHashes(ss, b, length);
  2518. if (rv != SECSuccess) return rv; /* err code already set. */
  2519.     }
  2520.     PORT_SetError(0); /* each message starts with no error. */
  2521.     switch (ss->ssl3->hs.msg_type) {
  2522.     case hello_request:
  2523. if (length != 0) {
  2524.     (void)ssl3_DecodeError(ss);
  2525.     PORT_SetError(SSL_ERROR_RX_MALFORMED_HELLO_REQUEST);
  2526.     return SECFailure;
  2527. }
  2528. if (ss->sec->isServer) {
  2529.     (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message);
  2530.     PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HELLO_REQUEST);
  2531.     return SECFailure;
  2532. }
  2533. rv = ssl3_HandleHelloRequest(ss);
  2534. break;
  2535.     case client_hello:
  2536. if (!ss->sec->isServer) {
  2537.     (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message);
  2538.     PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CLIENT_HELLO);
  2539.     return SECFailure;
  2540. }
  2541. rv = ssl3_HandleClientHello(ss, b, length);
  2542. break;
  2543.     case server_hello:
  2544. if (ss->sec->isServer) {
  2545.     (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message);
  2546.     PORT_SetError(SSL_ERROR_RX_UNEXPECTED_SERVER_HELLO);
  2547.     return SECFailure;
  2548. }
  2549. rv = ssl3_HandleServerHello(ss, b, length);
  2550. break;
  2551.     case certificate:
  2552. rv = ssl3_HandleCertificate(ss, b, length);
  2553. break;
  2554.     case server_key_exchange:
  2555. if (ss->sec->isServer) {
  2556.     (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message);
  2557.     PORT_SetError(SSL_ERROR_RX_UNEXPECTED_SERVER_KEY_EXCH);
  2558.     return SECFailure;
  2559. }
  2560. rv = ssl3_HandleServerKeyExchange(ss, b, length);
  2561. break;
  2562.     case certificate_request:
  2563. if (ss->sec->isServer) {
  2564.     (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message);
  2565.     PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CERT_REQUEST);
  2566.     return SECFailure;
  2567. }
  2568. rv = ssl3_HandleCertificateRequest(ss, b, length);
  2569. break;
  2570.     case server_hello_done:
  2571. if (length != 0) {
  2572.     (void)ssl3_DecodeError(ss);
  2573.     PORT_SetError(SSL_ERROR_RX_MALFORMED_HELLO_DONE);
  2574.     return SECFailure;
  2575. }
  2576. if (ss->sec->isServer) {
  2577.     (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message);
  2578.     PORT_SetError(SSL_ERROR_RX_UNEXPECTED_HELLO_DONE);
  2579.     return SECFailure;
  2580. }
  2581. rv = ssl3_HandleServerHelloDone(ss);
  2582. break;
  2583.     case certificate_verify:
  2584. if (!ss->sec->isServer) {
  2585.     (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message);
  2586.     PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CERT_VERIFY);
  2587.     return SECFailure;
  2588. }
  2589. rv = ssl3_HandleCertificateVerify(ss, b, length, &hashes);
  2590. break;
  2591.     case client_key_exchange:
  2592. if (!ss->sec->isServer) {
  2593.     (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message);
  2594.     PORT_SetError(SSL_ERROR_RX_UNEXPECTED_CLIENT_KEY_EXCH);
  2595.     return SECFailure;
  2596. }
  2597. rv = ssl3_HandleClientKeyExchange(ss, b, length);
  2598. break;
  2599.     case finished:
  2600.         rv = ssl3_HandleFinished(ss, b, length, &hashes);
  2601. break;
  2602.     default:
  2603. (void)SSL3_SendAlert(ss, alert_fatal, unexpected_message);
  2604. PORT_SetError(SSL_ERROR_RX_UNKNOWN_HANDSHAKE);
  2605. rv = SECFailure;
  2606.     }
  2607.     return rv;
  2608. }
  2609. /* Called only from ssl3_HandleRecord, for each (deciphered) ssl3 record.
  2610.  * origBuf is the decrypted ssl record content.
  2611.  * Caller must hold the handshake and RecvBuf locks.
  2612.  */
  2613. static SECStatus
  2614. ssl3_HandleHandshake(sslSocket *ss, sslBuffer *origBuf)
  2615. {
  2616.     /*
  2617.      * There may be a partial handshake message already in the handshake
  2618.      * state. The incoming buffer may contain another portion, or a
  2619.      * complete message or several messages followed by another portion.
  2620.      *
  2621.      * Each message is made contiguous before being passed to the actual
  2622.      * message parser.
  2623.      */
  2624.     ssl3State *ssl3 = ss->ssl3;
  2625.     sslBuffer *buf = &ssl3->hs.msgState; /* do not lose the original buffer pointer */
  2626.     SECStatus rv;
  2627.     PORT_Assert( ssl_HaveRecvBufLock(ss) );
  2628.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  2629.     if (buf->buf == NULL) {
  2630. *buf = *origBuf;
  2631.     }
  2632.     while (buf->len > 0) {
  2633. while (ssl3->hs.header_bytes < 4) {
  2634.     uint8 t;
  2635.     t = *(buf->buf++);
  2636.     buf->len--;
  2637.     if (ssl3->hs.header_bytes++ == 0)
  2638. ssl3->hs.msg_type = (SSL3HandshakeType)t;
  2639.     else
  2640. ssl3->hs.msg_len = (ssl3->hs.msg_len << 8) + t;
  2641. #define MAX_HANDSHAKE_MSG_LEN 0x1ffff /* 128k - 1 */
  2642.     if (ssl3->hs.header_bytes == 4) {
  2643. if (ssl3->hs.msg_len > MAX_HANDSHAKE_MSG_LEN) {
  2644.     (void)ssl3_DecodeError(ss);
  2645.     PORT_SetError(SSL_ERROR_RX_RECORD_TOO_LONG);
  2646.     return SECFailure;
  2647. }
  2648.     }
  2649. #undef MAX_HANDSHAKE_MSG_LEN
  2650.     if (buf->len == 0 && ssl3->hs.msg_len > 0) {
  2651. buf->buf = NULL;
  2652. return SECSuccess;
  2653.     }
  2654. }
  2655. /*
  2656.  * Header has been gathered and there is at least one byte of new
  2657.  * data available for this message. If it can be done right out
  2658.  * of the original buffer, then use it from there.
  2659.  */
  2660. if (ssl3->hs.msg_body.len == 0 && buf->len >= ssl3->hs.msg_len) {
  2661.     /* handle it from input buffer */
  2662.     rv = ssl3_HandleHandshakeMessage(ss, buf->buf, ssl3->hs.msg_len);
  2663.     if (rv == SECFailure) {
  2664. /* This test wants to fall through on either
  2665.  * SECSuccess or SECWouldBlock.
  2666.  * ssl3_HandleHandshakeMessage MUST set the error code.
  2667.  */
  2668. return rv;
  2669.     }
  2670.     buf->buf += ssl3->hs.msg_len;
  2671.     buf->len -= ssl3->hs.msg_len;
  2672.     ssl3->hs.msg_len = 0;
  2673.     ssl3->hs.header_bytes = 0;
  2674.     if (rv != SECSuccess) { /* return if SECWouldBlock. */
  2675. return rv;
  2676.     }
  2677. } else {
  2678.     /* must be copied to msg_body and dealt with from there */
  2679.     unsigned int bytes;
  2680.     bytes = PR_MIN(buf->len, ssl3->hs.msg_len);
  2681.     /* Grow the buffer if needed */
  2682.     if (bytes > ssl3->hs.msg_body.space - ssl3->hs.msg_body.len) {
  2683. rv = sslBuffer_Grow(&ssl3->hs.msg_body,
  2684.                   ssl3->hs.msg_body.len + bytes);
  2685. if (rv != SECSuccess) {
  2686.     /* sslBuffer_Grow has set a memory error code. */
  2687.     return SECFailure;
  2688.      }
  2689.     }
  2690.     PORT_Memcpy(ssl3->hs.msg_body.buf + ssl3->hs.msg_body.len,
  2691.       buf->buf, buf->len);
  2692.     buf->buf += bytes;
  2693.     buf->len -= bytes;
  2694.     /* should not be more than one message in msg_body */
  2695.     PORT_Assert(ssl3->hs.msg_body.len <= ssl3->hs.msg_len);
  2696.     /* if we have a whole message, do it */
  2697.     if (ssl3->hs.msg_body.len == ssl3->hs.msg_len) {
  2698. rv = ssl3_HandleHandshakeMessage(
  2699.     ss, ssl3->hs.msg_body.buf, ssl3->hs.msg_len);
  2700. /*
  2701.  * XXX This appears to be wrong.  This error handling
  2702.  * should clean up after a SECWouldBlock return, like the
  2703.  * error handling used 40 lines before/above this one,
  2704.  */
  2705. if (rv != SECSuccess) {
  2706.     /* ssl3_HandleHandshakeMessage MUST set error code. */
  2707.     return rv;
  2708. }
  2709. ssl3->hs.msg_body.len = 0;
  2710. ssl3->hs.msg_len      = 0;
  2711. ssl3->hs.header_bytes = 0;
  2712.     } else {
  2713. PORT_Assert(buf->len == 0);
  2714. break;
  2715.     }
  2716. }
  2717.     } /* end loop */
  2718.     origBuf->len = 0; /* So ssl3_GatherAppDataRecord will keep looping. */
  2719.     buf->buf = NULL; /* not a leak. */
  2720.     return SECSuccess;
  2721. }
  2722. /* if cText is non-null, then decipher, check MAC, and decompress the
  2723.  * SSL record from cText->buf (typically gs->inbuf)
  2724.  * into databuf (typically gs->buf), and any previous contents of databuf
  2725.  * is lost.  Then handle databuf according to its SSL record type,
  2726.  * unless it's an application record.
  2727.  *
  2728.  * If cText is NULL, then the ciphertext has previously been deciphered and
  2729.  * checked, and is already sitting in databuf.  It is processed as an SSL
  2730.  * Handshake message.
  2731.  *
  2732.  * DOES NOT process the decrypted/decompressed application data.
  2733.  * On return, databuf contains the decrypted/decompressed record.
  2734.  *
  2735.  * Called from ssl3_GatherCompleteHandshake
  2736.  *             ssl3_RestartHandshakeAfterCertReq
  2737.  *             ssl3_RestartHandshakeAfterServerCert
  2738.  *
  2739.  * Caller must hold the RecvBufLock.
  2740.  *
  2741.  * This function aquires and releases the SSL3Handshake Lock, holding the
  2742.  * lock around any calls to functions that handle records other than
  2743.  * Application Data records.
  2744.  */
  2745. SECStatus
  2746. ssl3_HandleRecord(sslSocket *ss, SSL3Ciphertext *cText, sslBuffer *databuf)
  2747. {
  2748. const ssl3BulkCipherDef *cipher_def;
  2749.     ssl3State *          ssl3  = ss->ssl3;
  2750.     ssl3CipherSpec *     crSpec;
  2751.     SECStatus            rv;
  2752.     unsigned int         hashBytes;
  2753.     unsigned int         padding_length;
  2754.     PRBool               isTLS;
  2755.     SSL3ContentType      rType;
  2756.     SSL3Opaque           hash[MAX_MAC_LENGTH];
  2757.     PORT_Assert( ssl_HaveRecvBufLock(ss) );
  2758.     if (ssl3 == NULL) {
  2759. ssl_GetSSL3HandshakeLock(ss);
  2760. rv = ssl3_InitState(ss);
  2761. ssl_ReleaseSSL3HandshakeLock(ss);
  2762. if (rv != SECSuccess) {
  2763.     return rv; /* ssl3_InitState has set the error code. */
  2764.      }
  2765.     }
  2766.     ssl3 = ss->ssl3;
  2767.     /* cText is NULL when we're called from ssl3_RestartHandshakeAfterXXX().
  2768.      * This implies that databuf holds a previously deciphered SSL Handshake
  2769.      * message.
  2770.      */
  2771.     if (cText == NULL) {
  2772. SSL_DBG(("%d: SSL3[%d]: HandleRecord, resuming handshake",
  2773.  SSL_GETPID(), ss->fd));
  2774. rType = content_handshake;
  2775. goto process_it;
  2776.     }
  2777.     databuf->len = 0; /* filled in by decode call below. */
  2778.     if (databuf->space < MAX_FRAGMENT_LENGTH) {
  2779. rv = sslBuffer_Grow(databuf, MAX_FRAGMENT_LENGTH + 2048);
  2780. if (rv != SECSuccess) {
  2781.     SSL_DBG(("%d: SSL3[%d]: HandleRecord, tried to get %d bytes",
  2782.      SSL_GETPID(), ss->fd, MAX_FRAGMENT_LENGTH + 2048));
  2783.     /* sslBuffer_Grow has set a memory error code. */
  2784.     return SECFailure;
  2785. }
  2786.     }
  2787.     PRINT_BUF(80, (ss, "ciphertext:", cText->buf->buf, cText->buf->len));
  2788.     ssl_GetSpecReadLock(ss); /******************************************/
  2789.     crSpec = ssl3->crSpec;
  2790.     cipher_def = crSpec->cipher_def;
  2791.     isTLS = (PRBool)(crSpec->version > SSL_LIBRARY_VERSION_3_0);
  2792.     if (isTLS && cText->buf->len > (MAX_FRAGMENT_LENGTH + 2048)) {
  2793. ssl_ReleaseSpecReadLock(ss);
  2794. SSL3_SendAlert(ss, alert_fatal, record_overflow);
  2795. PORT_SetError(SSL_ERROR_RX_RECORD_TOO_LONG);
  2796. return SECFailure;
  2797.     }
  2798.     /* decrypt from cText buf to databuf. */
  2799.     rv = crSpec->decode(
  2800. crSpec->decodeContext, databuf->buf, (int *)&databuf->len,
  2801. databuf->space, cText->buf->buf, cText->buf->len);
  2802.     PRINT_BUF(80, (ss, "cleartext:", databuf->buf, databuf->len));
  2803.     if (rv != SECSuccess) {
  2804. ssl_ReleaseSpecReadLock(ss);
  2805. ssl_MapLowLevelError(SSL_ERROR_DECRYPTION_FAILURE);
  2806. if (isTLS)
  2807.     (void)SSL3_SendAlert(ss, alert_fatal, decryption_failed);
  2808. ssl_MapLowLevelError(SSL_ERROR_DECRYPTION_FAILURE);
  2809. return SECFailure;
  2810.     }
  2811.     /* If it's a block cipher, check and strip the padding. */
  2812.     if (cipher_def->type == type_block) {
  2813. padding_length = *(databuf->buf + databuf->len - 1);
  2814. /* TLS permits padding to exceed the block size, up to 255 bytes. */
  2815. if (padding_length + crSpec->mac_size >= databuf->len)
  2816.     goto bad_pad;
  2817. /* if TLS, check value of first padding byte. */
  2818. if (padding_length && isTLS && padding_length != 
  2819. *(databuf->buf + databuf->len - 1 - padding_length))
  2820.     goto bad_pad;
  2821. databuf->len -= padding_length + 1;
  2822. if (databuf->len <= 0) {
  2823. bad_pad:
  2824.     /* must not hold spec lock when calling SSL3_SendAlert. */
  2825.     ssl_ReleaseSpecReadLock(ss);
  2826.     /* SSL3 doesn't have an alert for bad padding, so use bad mac. */
  2827.     SSL3_SendAlert(ss, alert_fatal, 
  2828.    isTLS ? decryption_failed : bad_record_mac);
  2829.     PORT_SetError(SSL_ERROR_BAD_BLOCK_PADDING);
  2830.     return SECFailure;
  2831. }
  2832.     }
  2833.     /* Check the MAC. */
  2834.     if (databuf->len < crSpec->mac_size) {
  2835.      /* record is too short to have a valid mac. */
  2836. goto bad_mac;
  2837.     }
  2838.     databuf->len -= crSpec->mac_size;
  2839.     rType = cText->type;
  2840.     rv = ssl3_ComputeRecordMAC(
  2841.      crSpec, (ss->sec->isServer) ? crSpec->client.write_mac_context
  2842.     : crSpec->server.write_mac_context,
  2843. rType, cText->version, crSpec->read_seq_num, 
  2844. databuf->buf, databuf->len, hash, &hashBytes);
  2845.     if (rv != SECSuccess) {
  2846. ssl_ReleaseSpecReadLock(ss);
  2847. ssl_MapLowLevelError(SSL_ERROR_MAC_COMPUTATION_FAILURE);
  2848. return rv;
  2849.     }
  2850.     if (hashBytes != (unsigned)crSpec->mac_size ||
  2851. PORT_Memcmp(databuf->buf + databuf->len, hash, crSpec->mac_size) != 0) {
  2852. bad_mac:
  2853. /* must not hold spec lock when calling SSL3_SendAlert. */
  2854. ssl_ReleaseSpecReadLock(ss);
  2855. SSL3_SendAlert(ss, alert_fatal, bad_record_mac);
  2856. PORT_SetError(SSL_ERROR_BAD_MAC_READ);
  2857. SSL_DBG(("%d: SSL3[%d]: mac check failed", SSL_GETPID(), ss->fd));
  2858. return SECFailure;
  2859.     }
  2860.     ssl3_BumpSequenceNumber(&crSpec->read_seq_num);
  2861.     ssl_ReleaseSpecReadLock(ss); /*****************************************/
  2862.     /*
  2863.      * The decrypted data is now in databuf.
  2864.      *
  2865.      * the null decompression routine is right here
  2866.      */
  2867.     /*
  2868.     ** Having completed the decompression, check the length again. 
  2869.     */
  2870.     if (isTLS && databuf->len > (MAX_FRAGMENT_LENGTH + 1024)) {
  2871. SSL3_SendAlert(ss, alert_fatal, record_overflow);
  2872. PORT_SetError(SSL_ERROR_RX_RECORD_TOO_LONG);
  2873. return SECFailure;
  2874.     }
  2875.     /* Application data records are processed by the caller of this
  2876.     ** function, not by this function.
  2877.     */
  2878.     if (rType == content_application_data) {
  2879.      return SECSuccess;
  2880.     }
  2881.     /* It's a record that must be handled by ssl itself, not the application.
  2882.     */
  2883. process_it:
  2884.     /* XXX  Get the xmit lock here.  Odds are very high that we'll be xmiting
  2885.      * data ang getting the xmit lock here prevents deadlocks.
  2886.      */
  2887.     ssl_GetSSL3HandshakeLock(ss);
  2888.     /* All the functions called in this switch MUST set error code if
  2889.     ** they return SECFailure or SECWouldBlock.
  2890.     */
  2891.     switch (rType) {
  2892.     case content_change_cipher_spec:
  2893. rv = ssl3_HandleChangeCipherSpecs(ss, databuf);
  2894. break;
  2895.     case content_alert:
  2896. rv = ssl3_HandleAlert(ss, databuf);
  2897. break;
  2898.     case content_handshake:
  2899. rv = ssl3_HandleHandshake(ss, databuf);
  2900. break;
  2901.     case content_application_data:
  2902. rv = SECSuccess;
  2903. break;
  2904.     default:
  2905. SSL_DBG(("%d: SSL3[%d]: bogus content type=%d",
  2906.  SSL_GETPID(), ss->fd, cText->type));
  2907. /* XXX Send an alert ???  */
  2908. PORT_SetError(SSL_ERROR_RX_UNKNOWN_RECORD_TYPE);
  2909. rv = SECFailure;
  2910. break;
  2911.     }
  2912.     ssl_ReleaseSSL3HandshakeLock(ss);
  2913.     return rv;
  2914. }
  2915. /*
  2916.  * Initialization functions
  2917.  */
  2918. /* Called from ssl3_InitState, immediately below. */
  2919. /* Caller must hold the SpecWriteLock. */
  2920. static void
  2921. ssl3_InitCipherSpec(sslSocket *ss, ssl3CipherSpec *spec)
  2922. {
  2923.     spec->cipher_def               = &bulk_cipher_defs[cipher_null];
  2924.     PORT_Assert(spec->cipher_def->cipher == cipher_null);
  2925.     spec->mac_def                  = &mac_defs[mac_null];
  2926.     PORT_Assert(spec->mac_def->mac == mac_null);
  2927.     spec->encode                   = Null_Cipher;
  2928.     spec->decode                   = Null_Cipher;
  2929.     spec->destroy                  = NULL;
  2930.     spec->mac_size                 = 0;
  2931.     spec->master_secret            = NULL;
  2932.     spec->client.write_key         = NULL;
  2933.     spec->client.write_mac_key     = NULL;
  2934.     spec->client.write_mac_context = NULL;
  2935.     spec->server.write_key         = NULL;
  2936.     spec->server.write_mac_key     = NULL;
  2937.     spec->server.write_mac_context = NULL;
  2938.     spec->write_seq_num.high       = 0;
  2939.     spec->write_seq_num.low        = 0;
  2940.     spec->read_seq_num.high        = 0;
  2941.     spec->read_seq_num.low         = 0;
  2942.     spec->version                  = ss->enableTLS
  2943.                                           ? SSL_LIBRARY_VERSION_3_1_TLS
  2944.                                           : SSL_LIBRARY_VERSION_3_0;
  2945. }
  2946. /* Called from: ssl3_SendRecord
  2947. ** ssl3_StartHandshakeHash() <- ssl2_BeginClientHandshake()
  2948. ** ssl3_SendClientHello()
  2949. ** ssl3_HandleServerHello()
  2950. ** ssl3_HandleClientHello()
  2951. ** ssl3_HandleV2ClientHello()
  2952. ** ssl3_HandleRecord()
  2953. **
  2954. ** This function should perhaps acquire and release the SpecWriteLock.
  2955. **
  2956. **
  2957. */
  2958. static SECStatus
  2959. ssl3_InitState(sslSocket *ss)
  2960. {
  2961.     ssl3State *  ssl3 = NULL;
  2962.     PK11Context *md5  = NULL;
  2963.     PK11Context *sha  = NULL;
  2964.     SECStatus    rv;
  2965.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss));
  2966.     /* reinitialization for renegotiated sessions XXX */
  2967.     if (ss->ssl3 != NULL)
  2968. return SECSuccess;
  2969.     ssl3 = PORT_ZNew(ssl3State); /* zero on purpose */
  2970.     if (ssl3 == NULL)
  2971. return SECFailure; /* PORT_ZAlloc has set memory error code. */
  2972.     /* note that entire HandshakeState is zero, including the buffer */
  2973.     ssl3->policy = SSL_ALLOWED;
  2974.     ssl_GetSpecWriteLock(ss);
  2975.     ssl3->crSpec = ssl3->cwSpec = &ssl3->specs[0];
  2976.     ssl3->prSpec = ssl3->pwSpec = &ssl3->specs[1];
  2977.     ssl3->hs.rehandshake = PR_FALSE;
  2978.     ssl3_InitCipherSpec(ss, ssl3->crSpec);
  2979.     ssl3_InitCipherSpec(ss, ssl3->prSpec);
  2980.     ssl3->fortezza.tek = NULL;
  2981.     ssl3->hs.ws = (ss->sec->isServer) ? wait_client_hello : wait_server_hello;
  2982.     ssl_ReleaseSpecWriteLock(ss);
  2983.     /*
  2984.      * note: We should probably lookup an SSL3 slot for these
  2985.      * handshake hashes in hopes that we wind up with the same slots
  2986.      * that the master secret will wind up in ...
  2987.      */
  2988.     SSL_TRC(30,("%d: SSL3[%d]: start handshake hashes", SSL_GETPID(), ss->fd));
  2989.     ssl3->hs.md5 = md5 = PK11_CreateDigestContext(SEC_OID_MD5);
  2990.     if (md5 == NULL) {
  2991. ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE);
  2992. goto loser;
  2993.     }
  2994.     rv = PK11_DigestBegin(ssl3->hs.md5);
  2995.     if (rv != SECSuccess) {
  2996. ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE);
  2997. goto loser;
  2998.     }
  2999.     sha = ssl3->hs.sha = PK11_CreateDigestContext(SEC_OID_SHA1);
  3000.     if (sha == NULL) {
  3001. ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
  3002. goto loser;
  3003.     }
  3004.     rv = PK11_DigestBegin(ssl3->hs.sha);
  3005.     if (rv != SECSuccess) {
  3006. ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
  3007. goto loser;
  3008.     }
  3009.     /* Don't hide this from the rest of the world any more. */
  3010.     ss->ssl3 = ssl3;
  3011.     return SECSuccess;
  3012. loser:
  3013.     if (md5 != NULL) PK11_DestroyContext(md5, PR_TRUE);
  3014.     if (sha != NULL) PK11_DestroyContext(sha, PR_TRUE);
  3015.     if (ssl3 != NULL) PORT_Free(ssl3);
  3016.     return SECFailure;
  3017. }
  3018. /* Returns a reference counted object that contains a key pair.
  3019.  * Or NULL on failure.  Initial ref count is 1.
  3020.  * Uses the keys in the pair as input.
  3021.  */
  3022. ssl3KeyPair *
  3023. ssl3_NewKeyPair( SECKEYPrivateKey * privKey, SECKEYPublicKey * pubKey)
  3024. {
  3025.     ssl3KeyPair * pair;
  3026.     if (!privKey || !pubKey) {
  3027. PORT_SetError(PR_INVALID_ARGUMENT_ERROR);
  3028.      return NULL;
  3029.     }
  3030.     pair = PORT_ZNew(ssl3KeyPair);
  3031.     if (!pair)
  3032.      return NULL; /* error code is set. */
  3033.     pair->refCount = 1;
  3034.     pair->privKey  = privKey;
  3035.     pair->pubKey   = pubKey;
  3036.     return pair; /* success */
  3037. }
  3038. ssl3KeyPair *
  3039. ssl3_GetKeyPairRef(ssl3KeyPair * keyPair)
  3040. {
  3041.     PR_AtomicIncrement(&keyPair->refCount);
  3042.     return keyPair;
  3043. }
  3044. void
  3045. ssl3_FreeKeyPair(ssl3KeyPair * keyPair)
  3046. {
  3047.     PRInt32 newCount =  PR_AtomicDecrement(&keyPair->refCount);
  3048.     if (!newCount) {
  3049. SECKEY_DestroyPrivateKey(keyPair->privKey);
  3050. SECKEY_DestroyPublicKey( keyPair->pubKey);
  3051.      PORT_Free(keyPair);
  3052.     }
  3053. }
  3054. #define EXPORT_RSA_KEY_LENGTH 64 /* bytes */
  3055. /*
  3056.  * Creates the public and private RSA keys for SSL Step down.
  3057.  * Called from SSL_ConfigSecureServer in sslsecur.c
  3058.  */
  3059. SECStatus
  3060. ssl3_CreateRSAStepDownKeys(sslSocket *ss)
  3061. {
  3062.     SECStatus             rv    = SECSuccess;
  3063.     SECKEYPrivateKey *    privKey; /* RSA step down key */
  3064.     SECKEYPublicKey *     pubKey; /* RSA step down key */
  3065.     if (ss->stepDownKeyPair)
  3066. ssl3_FreeKeyPair(ss->stepDownKeyPair);
  3067.     ss->stepDownKeyPair = NULL;
  3068. #ifndef HACKED_EXPORT_SERVER
  3069.     /* Sigh, should have a get key strength call for private keys */
  3070.     if (PK11_GetPrivateModulusLen(ss->serverKey[kt_rsa]) >
  3071.                                                      EXPORT_RSA_KEY_LENGTH) {
  3072. /* need to ask for the key size in bits */
  3073. privKey = SECKEY_CreateRSAPrivateKey(EXPORT_RSA_KEY_LENGTH * BPB,
  3074.      &pubKey, NULL);
  3075.      if (!privKey || !pubKey ||
  3076.     !(ss->stepDownKeyPair = ssl3_NewKeyPair(privKey, pubKey))) {
  3077.     ssl_MapLowLevelError(SEC_ERROR_KEYGEN_FAIL);
  3078.     rv = SECFailure;
  3079. }
  3080.     }
  3081. #endif
  3082.     return rv;
  3083. }
  3084. /* record the export policy for this cipher suite */
  3085. SECStatus
  3086. ssl3_SetPolicy(ssl3CipherSuite which, int policy)
  3087. {
  3088.     ssl3CipherSuiteCfg *suite;
  3089.     suite = ssl_LookupCipherSuiteCfg(which, cipherSuites);
  3090.     if (suite == NULL) {
  3091. return SECFailure; /* err code was set by ssl_LookupCipherSuiteCfg */
  3092.     }
  3093.     suite->policy = policy;
  3094.     if (policy == SSL_RESTRICTED) {
  3095. ssl3_global_policy_some_restricted = PR_TRUE;
  3096.     }
  3097.     return SECSuccess;
  3098. }
  3099. SECStatus
  3100. ssl3_GetPolicy(ssl3CipherSuite which, PRInt32 *oPolicy)
  3101. {
  3102.     ssl3CipherSuiteCfg *suite;
  3103.     PRInt32             policy;
  3104.     SECStatus           rv;
  3105.     suite = ssl_LookupCipherSuiteCfg(which, cipherSuites);
  3106.     if (suite) {
  3107.      policy = suite->policy;
  3108. rv     = SECSuccess;
  3109.     } else {
  3110.      policy = SSL_NOT_ALLOWED;
  3111. rv     = SECFailure; /* err code was set by Lookup. */
  3112.     }
  3113.     *oPolicy = policy;
  3114.     return rv;
  3115. }
  3116. /* record the user preference for this suite */
  3117. SECStatus
  3118. ssl3_CipherPrefSetDefault(ssl3CipherSuite which, PRBool enabled)
  3119. {
  3120.     ssl3CipherSuiteCfg *suite;
  3121.     suite = ssl_LookupCipherSuiteCfg(which, cipherSuites);
  3122.     if (suite == NULL) {
  3123. return SECFailure; /* err code was set by ssl_LookupCipherSuiteCfg */
  3124.     }
  3125.     suite->enabled = enabled;
  3126.     return SECSuccess;
  3127. }
  3128. /* return the user preference for this suite */
  3129. SECStatus
  3130. ssl3_CipherPrefGetDefault(ssl3CipherSuite which, PRBool *enabled)
  3131. {
  3132.     ssl3CipherSuiteCfg *suite;
  3133.     PRBool              pref;
  3134.     SECStatus           rv;
  3135.     suite = ssl_LookupCipherSuiteCfg(which, cipherSuites);
  3136.     if (suite) {
  3137.      pref   = suite->enabled;
  3138. rv     = SECSuccess;
  3139.     } else {
  3140.      pref   = SSL_NOT_ALLOWED;
  3141. rv     = SECFailure; /* err code was set by Lookup. */
  3142.     }
  3143.     *enabled = pref;
  3144.     return rv;
  3145. }
  3146. SECStatus
  3147. ssl3_CipherPrefSet(sslSocket *ss, ssl3CipherSuite which, PRBool enabled)
  3148. {
  3149.     ssl3CipherSuiteCfg *suite;
  3150.     suite = ssl_LookupCipherSuiteCfg(which, ss->cipherSuites);
  3151.     if (suite == NULL) {
  3152. return SECFailure; /* err code was set by ssl_LookupCipherSuiteCfg */
  3153.     }
  3154.     suite->enabled = enabled;
  3155.     return SECSuccess;
  3156. }
  3157. SECStatus
  3158. ssl3_CipherPrefGet(sslSocket *ss, ssl3CipherSuite which, PRBool *enabled)
  3159. {
  3160.     ssl3CipherSuiteCfg *suite;
  3161.     PRBool              pref;
  3162.     SECStatus           rv;
  3163.     suite = ssl_LookupCipherSuiteCfg(which, ss->cipherSuites);
  3164.     if (suite) {
  3165.      pref   = suite->enabled;
  3166. rv     = SECSuccess;
  3167.     } else {
  3168.      pref   = SSL_NOT_ALLOWED;
  3169. rv     = SECFailure; /* err code was set by Lookup. */
  3170.     }
  3171.     *enabled = pref;
  3172.     return rv;
  3173. }
  3174. /* copy global default policy into socket. */
  3175. void
  3176. ssl3_InitSocketPolicy(sslSocket *ss)
  3177. {
  3178.     PORT_Memcpy(ss->cipherSuites, cipherSuites, sizeof cipherSuites);
  3179. }
  3180. /* ssl3_config_match_init must have already been called by
  3181.  * the caller of this function.
  3182.  */
  3183. SECStatus
  3184. ssl3_ConstructV2CipherSpecsHack(sslSocket *ss, unsigned char *cs, int *size)
  3185. {
  3186.     int i, count = 0;
  3187.     PORT_Assert(ss != 0);
  3188.     if (!ss) {
  3189. PORT_SetError(PR_INVALID_ARGUMENT_ERROR);
  3190. return SECFailure;
  3191.     }
  3192.     if (!ss->enableSSL3 && !ss->enableTLS) {
  3193.      *size = 0;
  3194. return SECSuccess;
  3195.     }
  3196.     if (cs == NULL) {
  3197. *size = count_cipher_suites(ss, SSL_ALLOWED, PR_TRUE);
  3198. return SECSuccess;
  3199.     }
  3200.     /* ssl3_config_match_init was called by the caller of this function. */
  3201.     for (i = 0; i < ssl_V3_SUITES_IMPLEMENTED; i++) {
  3202. ssl3CipherSuiteCfg *suite = &ss->cipherSuites[i];
  3203. if (config_match(suite, SSL_ALLOWED, PR_TRUE)) {
  3204.     if (cs != NULL) {
  3205. *cs++ = 0x00;
  3206. *cs++ = (suite->cipher_suite >> 8) & 0xFF;
  3207. *cs++ =  suite->cipher_suite       & 0xFF;
  3208.     }
  3209.     count++;
  3210. }
  3211.     }
  3212.     *size = count;
  3213.     return SECSuccess;
  3214. }
  3215. /*
  3216. ** If ssl3 socket is connected and in idle state, then start a new handshake.
  3217. ** If flushCache is true, the SID cache will be flushed first, forcing a
  3218. ** "Full" handshake (not a session restart handshake), to be done.
  3219. **
  3220. ** called from SSL_RedoHandshake(), which already holds the handshake locks.
  3221. */
  3222. SECStatus
  3223. ssl3_RedoHandshake(sslSocket *ss, PRBool flushCache)
  3224. {
  3225.     sslSecurityInfo *sec = ss->sec;
  3226.     sslSessionID *   sid = ss->sec->ci.sid;
  3227.     SECStatus        rv;
  3228.     PORT_Assert( ssl_HaveSSL3HandshakeLock(ss) );
  3229.     if (!ss->connected ||
  3230.         ((ss->version >= SSL_LIBRARY_VERSION_3_0) &&
  3231.  ss->ssl3 && (ss->ssl3->hs.ws != idle_handshake))) {
  3232. PORT_SetError(SSL_ERROR_HANDSHAKE_NOT_COMPLETED);
  3233. return SECFailure;
  3234.     }
  3235.     if (sid && flushCache) {
  3236. sec->uncache(sid); /* remove it from whichever cache it's in. */
  3237. ssl_FreeSID(sid); /* dec ref count and free if zero. */
  3238. ss->sec->ci.sid = NULL;
  3239.     }
  3240.     ssl_GetXmitBufLock(ss); /**************************************/
  3241.     /* start off a new handshake. */
  3242.     rv = (sec->isServer) ? ssl3_SendHelloRequest(ss)
  3243.                          : ssl3_SendClientHello(ss);
  3244.     ssl_ReleaseXmitBufLock(ss); /**************************************/
  3245.     return rv;
  3246. }
  3247. /* Called from ssl_FreeSocket() in sslsock.c */
  3248. void
  3249. ssl3_DestroySSL3Info(ssl3State *ssl3)
  3250. {
  3251.     if (ssl3 == NULL)
  3252. return; /* success the easy way. */
  3253.     if (ssl3->clientCertificate != NULL)
  3254. CERT_DestroyCertificate(ssl3->clientCertificate);
  3255.     if (ssl3->clientPrivateKey != NULL)
  3256. SECKEY_DestroyPrivateKey(ssl3->clientPrivateKey);
  3257.     if (ssl3->peerCertArena != NULL)
  3258. ssl3_CleanupPeerCerts(ssl3);
  3259.     /* clean up handshake */
  3260.     if (ssl3->hs.md5) {
  3261. PK11_DestroyContext(ssl3->hs.md5,PR_TRUE);
  3262.     }
  3263.     if (ssl3->hs.sha) {
  3264. PK11_DestroyContext(ssl3->hs.sha,PR_TRUE);
  3265.     }
  3266.     if (ssl3->fortezza.tek != NULL) {
  3267. PK11_FreeSymKey(ssl3->fortezza.tek);
  3268.     }
  3269.     /* free the SSL3Buffer (msg_body) */
  3270.     PORT_Free(ssl3->hs.msg_body.buf);
  3271.     /* free up the CipherSpecs */
  3272.     ssl3_DestroyCipherSpec(&ssl3->specs[0]);
  3273.     ssl3_DestroyCipherSpec(&ssl3->specs[1]);
  3274.     PORT_Free(ssl3);
  3275. }
  3276. /* End of ssl3con.c */