Home | History | Annotate | Download | only in ssl
      1 /*
      2  * SSL v2 handshake functions, and functions common to SSL2 and SSL3.
      3  *
      4  * This Source Code Form is subject to the terms of the Mozilla Public
      5  * License, v. 2.0. If a copy of the MPL was not distributed with this
      6  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      7 
      8 #include "nssrenam.h"
      9 #include "cert.h"
     10 #include "secitem.h"
     11 #include "sechash.h"
     12 #include "cryptohi.h"		/* for SGN_ funcs */
     13 #include "keyhi.h" 		/* for SECKEY_ high level functions. */
     14 #include "ssl.h"
     15 #include "sslimpl.h"
     16 #include "sslproto.h"
     17 #include "ssl3prot.h"
     18 #include "sslerr.h"
     19 #include "pk11func.h"
     20 #include "prinit.h"
     21 #include "prtime.h" 	/* for PR_Now() */
     22 
     23 #define XXX
     24 static PRBool policyWasSet;
     25 
     26 /* This ordered list is indexed by (SSL_CK_xx * 3)   */
     27 /* Second and third bytes are MSB and LSB of master key length. */
     28 static const PRUint8 allCipherSuites[] = {
     29     0,						0,    0,
     30     SSL_CK_RC4_128_WITH_MD5,			0x00, 0x80,
     31     SSL_CK_RC4_128_EXPORT40_WITH_MD5,		0x00, 0x80,
     32     SSL_CK_RC2_128_CBC_WITH_MD5,		0x00, 0x80,
     33     SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5,	0x00, 0x80,
     34     SSL_CK_IDEA_128_CBC_WITH_MD5,		0x00, 0x80,
     35     SSL_CK_DES_64_CBC_WITH_MD5,			0x00, 0x40,
     36     SSL_CK_DES_192_EDE3_CBC_WITH_MD5,		0x00, 0xC0,
     37     0,						0,    0
     38 };
     39 
     40 #define ssl2_NUM_SUITES_IMPLEMENTED 6
     41 
     42 /* This list is sent back to the client when the client-hello message
     43  * contains no overlapping ciphers, so the client can report what ciphers
     44  * are supported by the server.  Unlike allCipherSuites (above), this list
     45  * is sorted by descending preference, not by cipherSuite number.
     46  */
     47 static const PRUint8 implementedCipherSuites[ssl2_NUM_SUITES_IMPLEMENTED * 3] = {
     48     SSL_CK_RC4_128_WITH_MD5,			0x00, 0x80,
     49     SSL_CK_RC2_128_CBC_WITH_MD5,		0x00, 0x80,
     50     SSL_CK_DES_192_EDE3_CBC_WITH_MD5,		0x00, 0xC0,
     51     SSL_CK_DES_64_CBC_WITH_MD5,			0x00, 0x40,
     52     SSL_CK_RC4_128_EXPORT40_WITH_MD5,		0x00, 0x80,
     53     SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5,	0x00, 0x80
     54 };
     55 
     56 typedef struct ssl2SpecsStr {
     57     PRUint8           nkm; /* do this many hashes to generate key material. */
     58     PRUint8           nkd; /* size of readKey and writeKey in bytes. */
     59     PRUint8           blockSize;
     60     PRUint8           blockShift;
     61     CK_MECHANISM_TYPE mechanism;
     62     PRUint8           keyLen;	/* cipher symkey size in bytes. */
     63     PRUint8           pubLen;	/* publicly reveal this many bytes of key. */
     64     PRUint8           ivLen;	/* length of IV data at *ca.	*/
     65 } ssl2Specs;
     66 
     67 static const ssl2Specs ssl_Specs[] = {
     68 /* NONE                                 */
     69 				{  0,  0, 0, 0, },
     70 /* SSL_CK_RC4_128_WITH_MD5		*/
     71 				{  2, 16, 1, 0, CKM_RC4,       16,   0, 0, },
     72 /* SSL_CK_RC4_128_EXPORT40_WITH_MD5	*/
     73 				{  2, 16, 1, 0, CKM_RC4,       16,  11, 0, },
     74 /* SSL_CK_RC2_128_CBC_WITH_MD5		*/
     75 				{  2, 16, 8, 3, CKM_RC2_CBC,   16,   0, 8, },
     76 /* SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5	*/
     77 				{  2, 16, 8, 3, CKM_RC2_CBC,   16,  11, 8, },
     78 /* SSL_CK_IDEA_128_CBC_WITH_MD5		*/
     79 				{  0,  0, 0, 0, },
     80 /* SSL_CK_DES_64_CBC_WITH_MD5		*/
     81 				{  1,  8, 8, 3, CKM_DES_CBC,    8,   0, 8, },
     82 /* SSL_CK_DES_192_EDE3_CBC_WITH_MD5	*/
     83 				{  3, 24, 8, 3, CKM_DES3_CBC,  24,   0, 8, },
     84 };
     85 
     86 #define SET_ERROR_CODE	  /* reminder */
     87 #define TEST_FOR_FAILURE  /* reminder */
     88 
     89 /*
     90 ** Put a string tag in the library so that we can examine an executable
     91 ** and see what kind of security it supports.
     92 */
     93 const char *ssl_version = "SECURITY_VERSION:"
     94 			" +us"
     95 			" +export"
     96 #ifdef TRACE
     97 			" +trace"
     98 #endif
     99 #ifdef DEBUG
    100 			" +debug"
    101 #endif
    102 			;
    103 
    104 const char * const ssl_cipherName[] = {
    105     "unknown",
    106     "RC4",
    107     "RC4-Export",
    108     "RC2-CBC",
    109     "RC2-CBC-Export",
    110     "IDEA-CBC",
    111     "DES-CBC",
    112     "DES-EDE3-CBC",
    113     "unknown",
    114     "unknown", /* was fortezza, NO LONGER USED */
    115 };
    116 
    117 
    118 /* bit-masks, showing which SSLv2 suites are allowed.
    119  * lsb corresponds to first cipher suite in allCipherSuites[].
    120  */
    121 static PRUint16	allowedByPolicy;          /* all off by default */
    122 static PRUint16	maybeAllowedByPolicy;     /* all off by default */
    123 static PRUint16	chosenPreference = 0xff;  /* all on  by default */
    124 
    125 /* bit values for the above two bit masks */
    126 #define SSL_CB_RC4_128_WITH_MD5              (1 << SSL_CK_RC4_128_WITH_MD5)
    127 #define SSL_CB_RC4_128_EXPORT40_WITH_MD5     (1 << SSL_CK_RC4_128_EXPORT40_WITH_MD5)
    128 #define SSL_CB_RC2_128_CBC_WITH_MD5          (1 << SSL_CK_RC2_128_CBC_WITH_MD5)
    129 #define SSL_CB_RC2_128_CBC_EXPORT40_WITH_MD5 (1 << SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5)
    130 #define SSL_CB_IDEA_128_CBC_WITH_MD5         (1 << SSL_CK_IDEA_128_CBC_WITH_MD5)
    131 #define SSL_CB_DES_64_CBC_WITH_MD5           (1 << SSL_CK_DES_64_CBC_WITH_MD5)
    132 #define SSL_CB_DES_192_EDE3_CBC_WITH_MD5     (1 << SSL_CK_DES_192_EDE3_CBC_WITH_MD5)
    133 #define SSL_CB_IMPLEMENTED \
    134    (SSL_CB_RC4_128_WITH_MD5              | \
    135     SSL_CB_RC4_128_EXPORT40_WITH_MD5     | \
    136     SSL_CB_RC2_128_CBC_WITH_MD5          | \
    137     SSL_CB_RC2_128_CBC_EXPORT40_WITH_MD5 | \
    138     SSL_CB_DES_64_CBC_WITH_MD5           | \
    139     SSL_CB_DES_192_EDE3_CBC_WITH_MD5)
    140 
    141 
    142 /* Construct a socket's list of cipher specs from the global default values.
    143  */
    144 static SECStatus
    145 ssl2_ConstructCipherSpecs(sslSocket *ss)
    146 {
    147     PRUint8 *	        cs		= NULL;
    148     unsigned int	allowed;
    149     unsigned int	count;
    150     int 		ssl3_count	= 0;
    151     int 		final_count;
    152     int 		i;
    153     SECStatus 		rv;
    154 
    155     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
    156 
    157     count = 0;
    158     PORT_Assert(ss != 0);
    159     allowed = !ss->opt.enableSSL2 ? 0 :
    160     	(ss->allowedByPolicy & ss->chosenPreference & SSL_CB_IMPLEMENTED);
    161     while (allowed) {
    162     	if (allowed & 1)
    163 	    ++count;
    164 	allowed >>= 1;
    165     }
    166 
    167     /* Call ssl3_config_match_init() once here,
    168      * instead of inside ssl3_ConstructV2CipherSpecsHack(),
    169      * because the latter gets called twice below,
    170      * and then again in ssl2_BeginClientHandshake().
    171      */
    172     ssl3_config_match_init(ss);
    173 
    174     /* ask SSL3 how many cipher suites it has. */
    175     rv = ssl3_ConstructV2CipherSpecsHack(ss, NULL, &ssl3_count);
    176     if (rv < 0)
    177 	return rv;
    178     count += ssl3_count;
    179 
    180     /* Allocate memory to hold cipher specs */
    181     if (count > 0)
    182 	cs = (PRUint8*) PORT_Alloc(count * 3);
    183     else
    184 	PORT_SetError(SSL_ERROR_SSL_DISABLED);
    185     if (cs == NULL)
    186     	return SECFailure;
    187 
    188     if (ss->cipherSpecs != NULL) {
    189 	PORT_Free(ss->cipherSpecs);
    190     }
    191     ss->cipherSpecs     = cs;
    192     ss->sizeCipherSpecs = count * 3;
    193 
    194     /* fill in cipher specs for SSL2 cipher suites */
    195     allowed = !ss->opt.enableSSL2 ? 0 :
    196     	(ss->allowedByPolicy & ss->chosenPreference & SSL_CB_IMPLEMENTED);
    197     for (i = 0; i < ssl2_NUM_SUITES_IMPLEMENTED * 3; i += 3) {
    198 	const PRUint8 * hs = implementedCipherSuites + i;
    199 	int             ok = allowed & (1U << hs[0]);
    200 	if (ok) {
    201 	    cs[0] = hs[0];
    202 	    cs[1] = hs[1];
    203 	    cs[2] = hs[2];
    204 	    cs += 3;
    205 	}
    206     }
    207 
    208     /* now have SSL3 add its suites onto the end */
    209     rv = ssl3_ConstructV2CipherSpecsHack(ss, cs, &final_count);
    210 
    211     /* adjust for any difference between first pass and second pass */
    212     ss->sizeCipherSpecs -= (ssl3_count - final_count) * 3;
    213 
    214     return rv;
    215 }
    216 
    217 /* This function is called immediately after ssl2_ConstructCipherSpecs()
    218 ** at the beginning of a handshake.  It detects cases where a protocol
    219 ** (e.g. SSL2 or SSL3) is logically enabled, but all its cipher suites
    220 ** for that protocol have been disabled.  If such cases, it clears the
    221 ** enable bit for the protocol.  If no protocols remain enabled, or
    222 ** if no cipher suites are found, it sets the error code and returns
    223 ** SECFailure, otherwise it returns SECSuccess.
    224 */
    225 static SECStatus
    226 ssl2_CheckConfigSanity(sslSocket *ss)
    227 {
    228     unsigned int      allowed;
    229     int               ssl3CipherCount = 0;
    230     SECStatus         rv;
    231 
    232     /* count the SSL2 and SSL3 enabled ciphers.
    233      * if either is zero, clear the socket's enable for that protocol.
    234      */
    235     if (!ss->cipherSpecs)
    236     	goto disabled;
    237 
    238     allowed = ss->allowedByPolicy & ss->chosenPreference;
    239     if (! allowed)
    240 	ss->opt.enableSSL2 = PR_FALSE; /* not really enabled if no ciphers */
    241 
    242     /* ssl3_config_match_init was called in ssl2_ConstructCipherSpecs(). */
    243     /* Ask how many ssl3 CipherSuites were enabled. */
    244     rv = ssl3_ConstructV2CipherSpecsHack(ss, NULL, &ssl3CipherCount);
    245     if (rv != SECSuccess || ssl3CipherCount <= 0) {
    246 	/* SSL3/TLS not really enabled if no ciphers */
    247 	ss->vrange.min = SSL_LIBRARY_VERSION_NONE;
    248 	ss->vrange.max = SSL_LIBRARY_VERSION_NONE;
    249     }
    250 
    251     if (!ss->opt.enableSSL2 && SSL3_ALL_VERSIONS_DISABLED(&ss->vrange)) {
    252 	SSL_DBG(("%d: SSL[%d]: Can't handshake! all versions disabled.",
    253 		 SSL_GETPID(), ss->fd));
    254 disabled:
    255 	PORT_SetError(SSL_ERROR_SSL_DISABLED);
    256 	return SECFailure;
    257     }
    258     return SECSuccess;
    259 }
    260 
    261 /*
    262  * Since this is a global (not per-socket) setting, we cannot use the
    263  * HandshakeLock to protect this.  Probably want a global lock.
    264  */
    265 SECStatus
    266 ssl2_SetPolicy(PRInt32 which, PRInt32 policy)
    267 {
    268     PRUint32  bitMask;
    269     SECStatus rv       = SECSuccess;
    270 
    271     which &= 0x000f;
    272     bitMask = 1 << which;
    273 
    274     if (!(bitMask & SSL_CB_IMPLEMENTED)) {
    275     	PORT_SetError(SSL_ERROR_UNKNOWN_CIPHER_SUITE);
    276     	return SECFailure;
    277     }
    278 
    279     if (policy == SSL_ALLOWED) {
    280 	allowedByPolicy 	|= bitMask;
    281 	maybeAllowedByPolicy 	|= bitMask;
    282     } else if (policy == SSL_RESTRICTED) {
    283     	allowedByPolicy 	&= ~bitMask;
    284 	maybeAllowedByPolicy 	|= bitMask;
    285     } else {
    286     	allowedByPolicy 	&= ~bitMask;
    287     	maybeAllowedByPolicy 	&= ~bitMask;
    288     }
    289     allowedByPolicy 		&= SSL_CB_IMPLEMENTED;
    290     maybeAllowedByPolicy 	&= SSL_CB_IMPLEMENTED;
    291 
    292     policyWasSet = PR_TRUE;
    293     return rv;
    294 }
    295 
    296 SECStatus
    297 ssl2_GetPolicy(PRInt32 which, PRInt32 *oPolicy)
    298 {
    299     PRUint32     bitMask;
    300     PRInt32      policy;
    301 
    302     which &= 0x000f;
    303     bitMask = 1 << which;
    304 
    305     /* Caller assures oPolicy is not null. */
    306     if (!(bitMask & SSL_CB_IMPLEMENTED)) {
    307     	PORT_SetError(SSL_ERROR_UNKNOWN_CIPHER_SUITE);
    308 	*oPolicy = SSL_NOT_ALLOWED;
    309     	return SECFailure;
    310     }
    311 
    312     if (maybeAllowedByPolicy & bitMask) {
    313     	policy = (allowedByPolicy & bitMask) ? SSL_ALLOWED : SSL_RESTRICTED;
    314     } else {
    315 	policy = SSL_NOT_ALLOWED;
    316     }
    317 
    318     *oPolicy = policy;
    319     return SECSuccess;
    320 }
    321 
    322 /*
    323  * Since this is a global (not per-socket) setting, we cannot use the
    324  * HandshakeLock to protect this.  Probably want a global lock.
    325  * Called from SSL_CipherPrefSetDefault in sslsock.c
    326  * These changes have no effect on any sslSockets already created.
    327  */
    328 SECStatus
    329 ssl2_CipherPrefSetDefault(PRInt32 which, PRBool enabled)
    330 {
    331     PRUint32     bitMask;
    332 
    333     which &= 0x000f;
    334     bitMask = 1 << which;
    335 
    336     if (!(bitMask & SSL_CB_IMPLEMENTED)) {
    337     	PORT_SetError(SSL_ERROR_UNKNOWN_CIPHER_SUITE);
    338     	return SECFailure;
    339     }
    340 
    341     if (enabled)
    342 	chosenPreference |= bitMask;
    343     else
    344     	chosenPreference &= ~bitMask;
    345     chosenPreference &= SSL_CB_IMPLEMENTED;
    346 
    347     return SECSuccess;
    348 }
    349 
    350 SECStatus
    351 ssl2_CipherPrefGetDefault(PRInt32 which, PRBool *enabled)
    352 {
    353     PRBool       rv       = PR_FALSE;
    354     PRUint32     bitMask;
    355 
    356     which &= 0x000f;
    357     bitMask = 1 << which;
    358 
    359     if (!(bitMask & SSL_CB_IMPLEMENTED)) {
    360     	PORT_SetError(SSL_ERROR_UNKNOWN_CIPHER_SUITE);
    361 	*enabled = PR_FALSE;
    362     	return SECFailure;
    363     }
    364 
    365     rv = (PRBool)((chosenPreference & bitMask) != 0);
    366     *enabled = rv;
    367     return SECSuccess;
    368 }
    369 
    370 SECStatus
    371 ssl2_CipherPrefSet(sslSocket *ss, PRInt32 which, PRBool enabled)
    372 {
    373     PRUint32     bitMask;
    374 
    375     which &= 0x000f;
    376     bitMask = 1 << which;
    377 
    378     if (!(bitMask & SSL_CB_IMPLEMENTED)) {
    379     	PORT_SetError(SSL_ERROR_UNKNOWN_CIPHER_SUITE);
    380     	return SECFailure;
    381     }
    382 
    383     if (enabled)
    384 	ss->chosenPreference |= bitMask;
    385     else
    386     	ss->chosenPreference &= ~bitMask;
    387     ss->chosenPreference &= SSL_CB_IMPLEMENTED;
    388 
    389     return SECSuccess;
    390 }
    391 
    392 SECStatus
    393 ssl2_CipherPrefGet(sslSocket *ss, PRInt32 which, PRBool *enabled)
    394 {
    395     PRBool       rv       = PR_FALSE;
    396     PRUint32     bitMask;
    397 
    398     which &= 0x000f;
    399     bitMask = 1 << which;
    400 
    401     if (!(bitMask & SSL_CB_IMPLEMENTED)) {
    402     	PORT_SetError(SSL_ERROR_UNKNOWN_CIPHER_SUITE);
    403 	*enabled = PR_FALSE;
    404     	return SECFailure;
    405     }
    406 
    407     rv = (PRBool)((ss->chosenPreference & bitMask) != 0);
    408     *enabled = rv;
    409     return SECSuccess;
    410 }
    411 
    412 
    413 /* copy global default policy into socket. */
    414 void
    415 ssl2_InitSocketPolicy(sslSocket *ss)
    416 {
    417     ss->allowedByPolicy		= allowedByPolicy;
    418     ss->maybeAllowedByPolicy	= maybeAllowedByPolicy;
    419     ss->chosenPreference 	= chosenPreference;
    420 }
    421 
    422 
    423 /************************************************************************/
    424 
    425 /* Called from ssl2_CreateSessionCypher(), which already holds handshake lock.
    426  */
    427 static SECStatus
    428 ssl2_CreateMAC(sslSecurityInfo *sec, SECItem *readKey, SECItem *writeKey,
    429           int cipherChoice)
    430 {
    431     switch (cipherChoice) {
    432 
    433       case SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5:
    434       case SSL_CK_RC2_128_CBC_WITH_MD5:
    435       case SSL_CK_RC4_128_EXPORT40_WITH_MD5:
    436       case SSL_CK_RC4_128_WITH_MD5:
    437       case SSL_CK_DES_64_CBC_WITH_MD5:
    438       case SSL_CK_DES_192_EDE3_CBC_WITH_MD5:
    439 	sec->hash = HASH_GetHashObject(HASH_AlgMD5);
    440 	SECITEM_CopyItem(0, &sec->sendSecret, writeKey);
    441 	SECITEM_CopyItem(0, &sec->rcvSecret, readKey);
    442 	break;
    443 
    444       default:
    445 	PORT_SetError(SSL_ERROR_NO_CYPHER_OVERLAP);
    446 	return SECFailure;
    447     }
    448     sec->hashcx = (*sec->hash->create)();
    449     if (sec->hashcx == NULL)
    450 	return SECFailure;
    451     return SECSuccess;
    452 }
    453 
    454 /************************************************************************
    455  * All the Send functions below must acquire and release the socket's
    456  * xmitBufLock.
    457  */
    458 
    459 /* Called from all the Send* functions below. */
    460 static SECStatus
    461 ssl2_GetSendBuffer(sslSocket *ss, unsigned int len)
    462 {
    463     SECStatus rv = SECSuccess;
    464 
    465     PORT_Assert(ss->opt.noLocks || ssl_HaveXmitBufLock(ss));
    466 
    467     if (len < 128) {
    468 	len = 128;
    469     }
    470     if (len > ss->sec.ci.sendBuf.space) {
    471 	rv = sslBuffer_Grow(&ss->sec.ci.sendBuf, len);
    472 	if (rv != SECSuccess) {
    473 	    SSL_DBG(("%d: SSL[%d]: ssl2_GetSendBuffer failed, tried to get %d bytes",
    474 		     SSL_GETPID(), ss->fd, len));
    475 	    rv = SECFailure;
    476 	}
    477     }
    478     return rv;
    479 }
    480 
    481 /* Called from:
    482  * ssl2_ClientSetupSessionCypher() <- ssl2_HandleServerHelloMessage()
    483  * ssl2_HandleRequestCertificate()     <- ssl2_HandleMessage() <-
    484  					ssl_Do1stHandshake()
    485  * ssl2_HandleMessage()                <- ssl_Do1stHandshake()
    486  * ssl2_HandleServerHelloMessage() <- ssl_Do1stHandshake()
    487                                      after ssl2_BeginClientHandshake()
    488  * ssl2_HandleClientHelloMessage() <- ssl_Do1stHandshake()
    489                                      after ssl2_BeginServerHandshake()
    490  *
    491  * Acquires and releases the socket's xmitBufLock.
    492  */
    493 int
    494 ssl2_SendErrorMessage(sslSocket *ss, int error)
    495 {
    496     int rv;
    497     PRUint8 msg[SSL_HL_ERROR_HBYTES];
    498 
    499     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
    500 
    501     msg[0] = SSL_MT_ERROR;
    502     msg[1] = MSB(error);
    503     msg[2] = LSB(error);
    504 
    505     ssl_GetXmitBufLock(ss);    /***************************************/
    506 
    507     SSL_TRC(3, ("%d: SSL[%d]: sending error %d", SSL_GETPID(), ss->fd, error));
    508 
    509     ss->handshakeBegun = 1;
    510     rv = (*ss->sec.send)(ss, msg, sizeof(msg), 0);
    511     if (rv >= 0) {
    512 	rv = SECSuccess;
    513     }
    514     ssl_ReleaseXmitBufLock(ss);    /***************************************/
    515     return rv;
    516 }
    517 
    518 /* Called from ssl2_TryToFinish().
    519  * Acquires and releases the socket's xmitBufLock.
    520  */
    521 static SECStatus
    522 ssl2_SendClientFinishedMessage(sslSocket *ss)
    523 {
    524     SECStatus        rv    = SECSuccess;
    525     int              sent;
    526     PRUint8    msg[1 + SSL_CONNECTIONID_BYTES];
    527 
    528     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
    529 
    530     ssl_GetXmitBufLock(ss);    /***************************************/
    531 
    532     if (ss->sec.ci.sentFinished == 0) {
    533 	ss->sec.ci.sentFinished = 1;
    534 
    535 	SSL_TRC(3, ("%d: SSL[%d]: sending client-finished",
    536 		    SSL_GETPID(), ss->fd));
    537 
    538 	msg[0] = SSL_MT_CLIENT_FINISHED;
    539 	PORT_Memcpy(msg+1, ss->sec.ci.connectionID,
    540 	            sizeof(ss->sec.ci.connectionID));
    541 
    542 	DUMP_MSG(29, (ss, msg, 1 + sizeof(ss->sec.ci.connectionID)));
    543 	sent = (*ss->sec.send)(ss, msg, 1 + sizeof(ss->sec.ci.connectionID), 0);
    544 	rv = (sent >= 0) ? SECSuccess : (SECStatus)sent;
    545     }
    546     ssl_ReleaseXmitBufLock(ss);    /***************************************/
    547     return rv;
    548 }
    549 
    550 /* Called from
    551  * ssl2_HandleClientSessionKeyMessage() <- ssl2_HandleClientHelloMessage()
    552  * ssl2_HandleClientHelloMessage()  <- ssl_Do1stHandshake()
    553                                       after ssl2_BeginServerHandshake()
    554  * Acquires and releases the socket's xmitBufLock.
    555  */
    556 static SECStatus
    557 ssl2_SendServerVerifyMessage(sslSocket *ss)
    558 {
    559     PRUint8 *        msg;
    560     int              sendLen;
    561     int              sent;
    562     SECStatus        rv;
    563 
    564     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
    565 
    566     ssl_GetXmitBufLock(ss);    /***************************************/
    567 
    568     sendLen = 1 + SSL_CHALLENGE_BYTES;
    569     rv = ssl2_GetSendBuffer(ss, sendLen);
    570     if (rv != SECSuccess) {
    571 	goto done;
    572     }
    573 
    574     msg = ss->sec.ci.sendBuf.buf;
    575     msg[0] = SSL_MT_SERVER_VERIFY;
    576     PORT_Memcpy(msg+1, ss->sec.ci.clientChallenge, SSL_CHALLENGE_BYTES);
    577 
    578     DUMP_MSG(29, (ss, msg, sendLen));
    579     sent = (*ss->sec.send)(ss, msg, sendLen, 0);
    580 
    581     rv = (sent >= 0) ? SECSuccess : (SECStatus)sent;
    582 
    583 done:
    584     ssl_ReleaseXmitBufLock(ss);    /***************************************/
    585     return rv;
    586 }
    587 
    588 /* Called from ssl2_TryToFinish().
    589  * Acquires and releases the socket's xmitBufLock.
    590  */
    591 static SECStatus
    592 ssl2_SendServerFinishedMessage(sslSocket *ss)
    593 {
    594     sslSessionID *   sid;
    595     PRUint8 *        msg;
    596     int              sendLen, sent;
    597     SECStatus        rv    = SECSuccess;
    598 
    599     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
    600 
    601     ssl_GetXmitBufLock(ss);    /***************************************/
    602 
    603     if (ss->sec.ci.sentFinished == 0) {
    604 	ss->sec.ci.sentFinished = 1;
    605 	PORT_Assert(ss->sec.ci.sid != 0);
    606 	sid = ss->sec.ci.sid;
    607 
    608 	SSL_TRC(3, ("%d: SSL[%d]: sending server-finished",
    609 		    SSL_GETPID(), ss->fd));
    610 
    611 	sendLen = 1 + sizeof(sid->u.ssl2.sessionID);
    612 	rv = ssl2_GetSendBuffer(ss, sendLen);
    613 	if (rv != SECSuccess) {
    614 	    goto done;
    615 	}
    616 
    617 	msg = ss->sec.ci.sendBuf.buf;
    618 	msg[0] = SSL_MT_SERVER_FINISHED;
    619 	PORT_Memcpy(msg+1, sid->u.ssl2.sessionID,
    620 		    sizeof(sid->u.ssl2.sessionID));
    621 
    622 	DUMP_MSG(29, (ss, msg, sendLen));
    623 	sent = (*ss->sec.send)(ss, msg, sendLen, 0);
    624 
    625 	if (sent < 0) {
    626 	    /* If send failed, it is now a bogus  session-id */
    627 	    if (ss->sec.uncache)
    628 		(*ss->sec.uncache)(sid);
    629 	    rv = (SECStatus)sent;
    630 	} else if (!ss->opt.noCache) {
    631 	    /* Put the sid in session-id cache, (may already be there) */
    632 	    (*ss->sec.cache)(sid);
    633 	    rv = SECSuccess;
    634 	}
    635 	ssl_FreeSID(sid);
    636 	ss->sec.ci.sid = 0;
    637     }
    638 done:
    639     ssl_ReleaseXmitBufLock(ss);    /***************************************/
    640     return rv;
    641 }
    642 
    643 /* Called from ssl2_ClientSetupSessionCypher() <-
    644  *						ssl2_HandleServerHelloMessage()
    645  *                                           after ssl2_BeginClientHandshake()
    646  * Acquires and releases the socket's xmitBufLock.
    647  */
    648 static SECStatus
    649 ssl2_SendSessionKeyMessage(sslSocket *ss, int cipher, int keySize,
    650 		      PRUint8 *ca, int caLen,
    651 		      PRUint8 *ck, int ckLen,
    652 		      PRUint8 *ek, int ekLen)
    653 {
    654     PRUint8 *        msg;
    655     int              sendLen;
    656     int              sent;
    657     SECStatus        rv;
    658 
    659     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
    660 
    661     ssl_GetXmitBufLock(ss);    /***************************************/
    662 
    663     sendLen = SSL_HL_CLIENT_MASTER_KEY_HBYTES + ckLen + ekLen + caLen;
    664     rv = ssl2_GetSendBuffer(ss, sendLen);
    665     if (rv != SECSuccess)
    666 	goto done;
    667 
    668     SSL_TRC(3, ("%d: SSL[%d]: sending client-session-key",
    669 		SSL_GETPID(), ss->fd));
    670 
    671     msg = ss->sec.ci.sendBuf.buf;
    672     msg[0] = SSL_MT_CLIENT_MASTER_KEY;
    673     msg[1] = cipher;
    674     msg[2] = MSB(keySize);
    675     msg[3] = LSB(keySize);
    676     msg[4] = MSB(ckLen);
    677     msg[5] = LSB(ckLen);
    678     msg[6] = MSB(ekLen);
    679     msg[7] = LSB(ekLen);
    680     msg[8] = MSB(caLen);
    681     msg[9] = LSB(caLen);
    682     PORT_Memcpy(msg+SSL_HL_CLIENT_MASTER_KEY_HBYTES, ck, ckLen);
    683     PORT_Memcpy(msg+SSL_HL_CLIENT_MASTER_KEY_HBYTES+ckLen, ek, ekLen);
    684     PORT_Memcpy(msg+SSL_HL_CLIENT_MASTER_KEY_HBYTES+ckLen+ekLen, ca, caLen);
    685 
    686     DUMP_MSG(29, (ss, msg, sendLen));
    687     sent = (*ss->sec.send)(ss, msg, sendLen, 0);
    688     rv = (sent >= 0) ? SECSuccess : (SECStatus)sent;
    689 done:
    690     ssl_ReleaseXmitBufLock(ss);    /***************************************/
    691     return rv;
    692 }
    693 
    694 /* Called from ssl2_TriggerNextMessage() <- ssl2_HandleMessage()
    695  * Acquires and releases the socket's xmitBufLock.
    696  */
    697 static SECStatus
    698 ssl2_SendCertificateRequestMessage(sslSocket *ss)
    699 {
    700     PRUint8 *        msg;
    701     int              sent;
    702     int              sendLen;
    703     SECStatus        rv;
    704 
    705     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
    706 
    707     ssl_GetXmitBufLock(ss);    /***************************************/
    708 
    709     sendLen = SSL_HL_REQUEST_CERTIFICATE_HBYTES + SSL_CHALLENGE_BYTES;
    710     rv = ssl2_GetSendBuffer(ss, sendLen);
    711     if (rv != SECSuccess)
    712 	goto done;
    713 
    714     SSL_TRC(3, ("%d: SSL[%d]: sending certificate request",
    715 		SSL_GETPID(), ss->fd));
    716 
    717     /* Generate random challenge for client to encrypt */
    718     PK11_GenerateRandom(ss->sec.ci.serverChallenge, SSL_CHALLENGE_BYTES);
    719 
    720     msg = ss->sec.ci.sendBuf.buf;
    721     msg[0] = SSL_MT_REQUEST_CERTIFICATE;
    722     msg[1] = SSL_AT_MD5_WITH_RSA_ENCRYPTION;
    723     PORT_Memcpy(msg + SSL_HL_REQUEST_CERTIFICATE_HBYTES,
    724                 ss->sec.ci.serverChallenge, SSL_CHALLENGE_BYTES);
    725 
    726     DUMP_MSG(29, (ss, msg, sendLen));
    727     sent = (*ss->sec.send)(ss, msg, sendLen, 0);
    728     rv = (sent >= 0) ? SECSuccess : (SECStatus)sent;
    729 done:
    730     ssl_ReleaseXmitBufLock(ss);    /***************************************/
    731     return rv;
    732 }
    733 
    734 /* Called from ssl2_HandleRequestCertificate() <- ssl2_HandleMessage()
    735  * Acquires and releases the socket's xmitBufLock.
    736  */
    737 static int
    738 ssl2_SendCertificateResponseMessage(sslSocket *ss, SECItem *cert,
    739                                     SECItem *encCode)
    740 {
    741     PRUint8 *msg;
    742     int rv, sendLen;
    743 
    744     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
    745 
    746     ssl_GetXmitBufLock(ss);    /***************************************/
    747 
    748     sendLen = SSL_HL_CLIENT_CERTIFICATE_HBYTES + encCode->len + cert->len;
    749     rv = ssl2_GetSendBuffer(ss, sendLen);
    750     if (rv)
    751     	goto done;
    752 
    753     SSL_TRC(3, ("%d: SSL[%d]: sending certificate response",
    754 		SSL_GETPID(), ss->fd));
    755 
    756     msg = ss->sec.ci.sendBuf.buf;
    757     msg[0] = SSL_MT_CLIENT_CERTIFICATE;
    758     msg[1] = SSL_CT_X509_CERTIFICATE;
    759     msg[2] = MSB(cert->len);
    760     msg[3] = LSB(cert->len);
    761     msg[4] = MSB(encCode->len);
    762     msg[5] = LSB(encCode->len);
    763     PORT_Memcpy(msg + SSL_HL_CLIENT_CERTIFICATE_HBYTES, cert->data, cert->len);
    764     PORT_Memcpy(msg + SSL_HL_CLIENT_CERTIFICATE_HBYTES + cert->len,
    765 	      encCode->data, encCode->len);
    766 
    767     DUMP_MSG(29, (ss, msg, sendLen));
    768     rv = (*ss->sec.send)(ss, msg, sendLen, 0);
    769     if (rv >= 0) {
    770 	rv = SECSuccess;
    771     }
    772 done:
    773     ssl_ReleaseXmitBufLock(ss);    /***************************************/
    774     return rv;
    775 }
    776 
    777 /********************************************************************
    778 **  Send functions above this line must aquire & release the socket's
    779 **	xmitBufLock.
    780 ** All the ssl2_Send functions below this line are called vis ss->sec.send
    781 **	and require that the caller hold the xmitBufLock.
    782 */
    783 
    784 /*
    785 ** Called from ssl2_SendStream, ssl2_SendBlock, but not from ssl2_SendClear.
    786 */
    787 static SECStatus
    788 ssl2_CalcMAC(PRUint8             * result,
    789 	     sslSecurityInfo     * sec,
    790 	     const PRUint8       * data,
    791 	     unsigned int          dataLen,
    792 	     unsigned int          paddingLen)
    793 {
    794     const PRUint8 *      secret		= sec->sendSecret.data;
    795     unsigned int         secretLen	= sec->sendSecret.len;
    796     unsigned long        sequenceNumber = sec->sendSequence;
    797     unsigned int         nout;
    798     PRUint8              seq[4];
    799     PRUint8              padding[32];/* XXX max blocksize? */
    800 
    801     if (!sec->hash || !sec->hash->length)
    802     	return SECSuccess;
    803     if (!sec->hashcx)
    804     	return SECFailure;
    805 
    806     /* Reset hash function */
    807     (*sec->hash->begin)(sec->hashcx);
    808 
    809     /* Feed hash the data */
    810     (*sec->hash->update)(sec->hashcx, secret, secretLen);
    811     (*sec->hash->update)(sec->hashcx, data, dataLen);
    812     PORT_Memset(padding, paddingLen, paddingLen);
    813     (*sec->hash->update)(sec->hashcx, padding, paddingLen);
    814 
    815     seq[0] = (PRUint8) (sequenceNumber >> 24);
    816     seq[1] = (PRUint8) (sequenceNumber >> 16);
    817     seq[2] = (PRUint8) (sequenceNumber >> 8);
    818     seq[3] = (PRUint8) (sequenceNumber);
    819 
    820     PRINT_BUF(60, (0, "calc-mac secret:", secret, secretLen));
    821     PRINT_BUF(60, (0, "calc-mac data:", data, dataLen));
    822     PRINT_BUF(60, (0, "calc-mac padding:", padding, paddingLen));
    823     PRINT_BUF(60, (0, "calc-mac seq:", seq, 4));
    824 
    825     (*sec->hash->update)(sec->hashcx, seq, 4);
    826 
    827     /* Get result */
    828     (*sec->hash->end)(sec->hashcx, result, &nout, sec->hash->length);
    829 
    830     return SECSuccess;
    831 }
    832 
    833 /*
    834 ** Maximum transmission amounts. These are tiny bit smaller than they
    835 ** need to be (they account for the MAC length plus some padding),
    836 ** assuming the MAC is 16 bytes long and the padding is a max of 7 bytes
    837 ** long. This gives an additional 9 bytes of slop to work within.
    838 */
    839 #define MAX_STREAM_CYPHER_LEN	0x7fe0
    840 #define MAX_BLOCK_CYPHER_LEN	0x3fe0
    841 
    842 /*
    843 ** Send some data in the clear.
    844 ** Package up data with the length header and send it.
    845 **
    846 ** Return count of bytes successfully written, or negative number (failure).
    847 */
    848 static PRInt32
    849 ssl2_SendClear(sslSocket *ss, const PRUint8 *in, PRInt32 len, PRInt32 flags)
    850 {
    851     PRUint8         * out;
    852     int               rv;
    853     int               amount;
    854     int               count	= 0;
    855 
    856     PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss) );
    857 
    858     SSL_TRC(10, ("%d: SSL[%d]: sending %d bytes in the clear",
    859 		 SSL_GETPID(), ss->fd, len));
    860     PRINT_BUF(50, (ss, "clear data:", (PRUint8*) in, len));
    861 
    862     while (len) {
    863 	amount = PR_MIN( len, MAX_STREAM_CYPHER_LEN );
    864 	if (amount + 2 > ss->sec.writeBuf.space) {
    865 	    rv = sslBuffer_Grow(&ss->sec.writeBuf, amount + 2);
    866 	    if (rv != SECSuccess) {
    867 		count = rv;
    868 		break;
    869 	    }
    870 	}
    871 	out = ss->sec.writeBuf.buf;
    872 
    873 	/*
    874 	** Construct message.
    875 	*/
    876 	out[0] = 0x80 | MSB(amount);
    877 	out[1] = LSB(amount);
    878 	PORT_Memcpy(&out[2], in, amount);
    879 
    880 	/* Now send the data */
    881 	rv = ssl_DefSend(ss, out, amount + 2, flags & ~ssl_SEND_FLAG_MASK);
    882 	if (rv < 0) {
    883 	    if (PORT_GetError() == PR_WOULD_BLOCK_ERROR) {
    884 		rv = 0;
    885 	    } else {
    886 		/* Return short write if some data already went out... */
    887 		if (count == 0)
    888 		    count = rv;
    889 		break;
    890 	    }
    891 	}
    892 
    893 	if ((unsigned)rv < (amount + 2)) {
    894 	    /* Short write.  Save the data and return. */
    895 	    if (ssl_SaveWriteData(ss, out + rv, amount + 2 - rv)
    896 	        == SECFailure) {
    897 		count = SECFailure;
    898 	    } else {
    899 		count += amount;
    900 		ss->sec.sendSequence++;
    901 	    }
    902 	    break;
    903 	}
    904 
    905 	ss->sec.sendSequence++;
    906 	in    += amount;
    907 	count += amount;
    908 	len   -= amount;
    909     }
    910 
    911     return count;
    912 }
    913 
    914 /*
    915 ** Send some data, when using a stream cipher. Stream ciphers have a
    916 ** block size of 1. Package up the data with the length header
    917 ** and send it.
    918 */
    919 static PRInt32
    920 ssl2_SendStream(sslSocket *ss, const PRUint8 *in, PRInt32 len, PRInt32 flags)
    921 {
    922     PRUint8       *  out;
    923     int              rv;
    924     int              count	= 0;
    925 
    926     int              amount;
    927     PRUint8          macLen;
    928     int              nout;
    929     int              buflen;
    930 
    931     PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss) );
    932 
    933     SSL_TRC(10, ("%d: SSL[%d]: sending %d bytes using stream cipher",
    934 		 SSL_GETPID(), ss->fd, len));
    935     PRINT_BUF(50, (ss, "clear data:", (PRUint8*) in, len));
    936 
    937     while (len) {
    938 	ssl_GetSpecReadLock(ss);  /*************************************/
    939 
    940 	macLen = ss->sec.hash->length;
    941 	amount = PR_MIN( len, MAX_STREAM_CYPHER_LEN );
    942 	buflen = amount + 2 + macLen;
    943 	if (buflen > ss->sec.writeBuf.space) {
    944 	    rv = sslBuffer_Grow(&ss->sec.writeBuf, buflen);
    945 	    if (rv != SECSuccess) {
    946 		goto loser;
    947 	    }
    948 	}
    949 	out    = ss->sec.writeBuf.buf;
    950 	nout   = amount + macLen;
    951 	out[0] = 0x80 | MSB(nout);
    952 	out[1] = LSB(nout);
    953 
    954 	/* Calculate MAC */
    955 	rv = ssl2_CalcMAC(out+2, 		/* put MAC here */
    956 	                  &ss->sec,
    957 		          in, amount, 		/* input addr & length */
    958 			  0); 			/* no padding */
    959 	if (rv != SECSuccess)
    960 	    goto loser;
    961 
    962 	/* Encrypt MAC */
    963 	rv = (*ss->sec.enc)(ss->sec.writecx, out+2, &nout, macLen, out+2, macLen);
    964 	if (rv) goto loser;
    965 
    966 	/* Encrypt data from caller */
    967 	rv = (*ss->sec.enc)(ss->sec.writecx, out+2+macLen, &nout, amount, in, amount);
    968 	if (rv) goto loser;
    969 
    970 	ssl_ReleaseSpecReadLock(ss);  /*************************************/
    971 
    972 	PRINT_BUF(50, (ss, "encrypted data:", out, buflen));
    973 
    974 	rv = ssl_DefSend(ss, out, buflen, flags & ~ssl_SEND_FLAG_MASK);
    975 	if (rv < 0) {
    976 	    if (PORT_GetError() == PR_WOULD_BLOCK_ERROR) {
    977 		SSL_TRC(50, ("%d: SSL[%d]: send stream would block, "
    978 			     "saving data", SSL_GETPID(), ss->fd));
    979 		rv = 0;
    980 	    } else {
    981 		SSL_TRC(10, ("%d: SSL[%d]: send stream error %d",
    982 			     SSL_GETPID(), ss->fd, PORT_GetError()));
    983 		/* Return short write if some data already went out... */
    984 		if (count == 0)
    985 		    count = rv;
    986 		goto done;
    987 	    }
    988 	}
    989 
    990 	if ((unsigned)rv < buflen) {
    991 	    /* Short write.  Save the data and return. */
    992 	    if (ssl_SaveWriteData(ss, out + rv, buflen - rv) == SECFailure) {
    993 		count = SECFailure;
    994 	    } else {
    995 	    	count += amount;
    996 		ss->sec.sendSequence++;
    997 	    }
    998 	    goto done;
    999 	}
   1000 
   1001 	ss->sec.sendSequence++;
   1002 	in    += amount;
   1003 	count += amount;
   1004 	len   -= amount;
   1005     }
   1006 
   1007 done:
   1008     return count;
   1009 
   1010 loser:
   1011     ssl_ReleaseSpecReadLock(ss);
   1012     return SECFailure;
   1013 }
   1014 
   1015 /*
   1016 ** Send some data, when using a block cipher. Package up the data with
   1017 ** the length header and send it.
   1018 */
   1019 /* XXX assumes blocksize is > 7 */
   1020 static PRInt32
   1021 ssl2_SendBlock(sslSocket *ss, const PRUint8 *in, PRInt32 len, PRInt32 flags)
   1022 {
   1023     PRUint8       *  out;  		    /* begining of output buffer.    */
   1024     PRUint8       *  op;		    /* next output byte goes here.   */
   1025     int              rv;		    /* value from funcs we called.   */
   1026     int              count	= 0;        /* this function's return value. */
   1027 
   1028     unsigned int     hlen;		    /* output record hdr len, 2 or 3 */
   1029     unsigned int     macLen;		    /* MAC is this many bytes long.  */
   1030     int              amount;		    /* of plaintext to go in record. */
   1031     unsigned int     padding;		    /* add this many padding byte.   */
   1032     int              nout;		    /* ciphertext size after header. */
   1033     int              buflen;		    /* size of generated record.     */
   1034 
   1035     PORT_Assert( ss->opt.noLocks || ssl_HaveXmitBufLock(ss) );
   1036 
   1037     SSL_TRC(10, ("%d: SSL[%d]: sending %d bytes using block cipher",
   1038 		 SSL_GETPID(), ss->fd, len));
   1039     PRINT_BUF(50, (ss, "clear data:", in, len));
   1040 
   1041     while (len) {
   1042 	ssl_GetSpecReadLock(ss);  /*************************************/
   1043 
   1044 	macLen = ss->sec.hash->length;
   1045 	/* Figure out how much to send, including mac and padding */
   1046 	amount  = PR_MIN( len, MAX_BLOCK_CYPHER_LEN );
   1047 	nout    = amount + macLen;
   1048 	padding = nout & (ss->sec.blockSize - 1);
   1049 	if (padding) {
   1050 	    hlen    = 3;
   1051 	    padding = ss->sec.blockSize - padding;
   1052 	    nout   += padding;
   1053 	} else {
   1054 	    hlen = 2;
   1055 	}
   1056 	buflen = hlen + nout;
   1057 	if (buflen > ss->sec.writeBuf.space) {
   1058 	    rv = sslBuffer_Grow(&ss->sec.writeBuf, buflen);
   1059 	    if (rv != SECSuccess) {
   1060 		goto loser;
   1061 	    }
   1062 	}
   1063 	out = ss->sec.writeBuf.buf;
   1064 
   1065 	/* Construct header */
   1066 	op = out;
   1067 	if (padding) {
   1068 	    *op++ = MSB(nout);
   1069 	    *op++ = LSB(nout);
   1070 	    *op++ = padding;
   1071 	} else {
   1072 	    *op++ = 0x80 | MSB(nout);
   1073 	    *op++ = LSB(nout);
   1074 	}
   1075 
   1076 	/* Calculate MAC */
   1077 	rv = ssl2_CalcMAC(op, 		/* MAC goes here. */
   1078 	                  &ss->sec,
   1079 		          in, amount, 	/* intput addr, len */
   1080 			  padding);
   1081 	if (rv != SECSuccess)
   1082 	    goto loser;
   1083 	op += macLen;
   1084 
   1085 	/* Copy in the input data */
   1086 	/* XXX could eliminate the copy by folding it into the encryption */
   1087 	PORT_Memcpy(op, in, amount);
   1088 	op += amount;
   1089 	if (padding) {
   1090 	    PORT_Memset(op, padding, padding);
   1091 	    op += padding;
   1092 	}
   1093 
   1094 	/* Encrypt result */
   1095 	rv = (*ss->sec.enc)(ss->sec.writecx, out+hlen, &nout, buflen-hlen,
   1096 			 out+hlen, op - (out + hlen));
   1097 	if (rv)
   1098 	    goto loser;
   1099 
   1100 	ssl_ReleaseSpecReadLock(ss);  /*************************************/
   1101 
   1102 	PRINT_BUF(50, (ss, "final xmit data:", out, op - out));
   1103 
   1104 	rv = ssl_DefSend(ss, out, op - out, flags & ~ssl_SEND_FLAG_MASK);
   1105 	if (rv < 0) {
   1106 	    if (PORT_GetError() == PR_WOULD_BLOCK_ERROR) {
   1107 		rv = 0;
   1108 	    } else {
   1109 		SSL_TRC(10, ("%d: SSL[%d]: send block error %d",
   1110 			     SSL_GETPID(), ss->fd, PORT_GetError()));
   1111 		/* Return short write if some data already went out... */
   1112 		if (count == 0)
   1113 		    count = rv;
   1114 		goto done;
   1115 	    }
   1116 	}
   1117 
   1118 	if (rv < (op - out)) {
   1119 	    /* Short write.  Save the data and return. */
   1120 	    if (ssl_SaveWriteData(ss, out + rv, op - out - rv) == SECFailure) {
   1121 		count = SECFailure;
   1122 	    } else {
   1123 		count += amount;
   1124 		ss->sec.sendSequence++;
   1125 	    }
   1126 	    goto done;
   1127 	}
   1128 
   1129 	ss->sec.sendSequence++;
   1130 	in    += amount;
   1131 	count += amount;
   1132 	len   -= amount;
   1133     }
   1134 
   1135 done:
   1136     return count;
   1137 
   1138 loser:
   1139     ssl_ReleaseSpecReadLock(ss);
   1140     return SECFailure;
   1141 }
   1142 
   1143 /*
   1144 ** Called from: ssl2_HandleServerHelloMessage,
   1145 **              ssl2_HandleClientSessionKeyMessage,
   1146 **              ssl2_HandleClientHelloMessage,
   1147 **
   1148 */
   1149 static void
   1150 ssl2_UseEncryptedSendFunc(sslSocket *ss)
   1151 {
   1152     ssl_GetXmitBufLock(ss);
   1153     PORT_Assert(ss->sec.hashcx != 0);
   1154 
   1155     ss->gs.encrypted = 1;
   1156     ss->sec.send = (ss->sec.blockSize > 1) ? ssl2_SendBlock : ssl2_SendStream;
   1157     ssl_ReleaseXmitBufLock(ss);
   1158 }
   1159 
   1160 /* Called while initializing socket in ssl_CreateSecurityInfo().
   1161 ** This function allows us to keep the name of ssl2_SendClear static.
   1162 */
   1163 void
   1164 ssl2_UseClearSendFunc(sslSocket *ss)
   1165 {
   1166     ss->sec.send = ssl2_SendClear;
   1167 }
   1168 
   1169 /************************************************************************
   1170 ** 			END of Send functions.                          *
   1171 *************************************************************************/
   1172 
   1173 /***********************************************************************
   1174  * For SSL3, this gathers in and handles records/messages until either
   1175  *	the handshake is complete or application data is available.
   1176  *
   1177  * For SSL2, this gathers in only the next SSLV2 record.
   1178  *
   1179  * Called from ssl_Do1stHandshake() via function pointer ss->handshake.
   1180  * Caller must hold handshake lock.
   1181  * This function acquires and releases the RecvBufLock.
   1182  *
   1183  * returns SECSuccess for success.
   1184  * returns SECWouldBlock when that value is returned by ssl2_GatherRecord() or
   1185  *	ssl3_GatherCompleteHandshake().
   1186  * returns SECFailure on all other errors.
   1187  *
   1188  * The gather functions called by ssl_GatherRecord1stHandshake are expected
   1189  * 	to return values interpreted as follows:
   1190  *  1 : the function completed without error.
   1191  *  0 : the function read EOF.
   1192  * -1 : read error, or PR_WOULD_BLOCK_ERROR, or handleRecord error.
   1193  * -2 : the function wants ssl_GatherRecord1stHandshake to be called again
   1194  *	immediately, by ssl_Do1stHandshake.
   1195  *
   1196  * This code is similar to, and easily confused with, DoRecv() in sslsecur.c
   1197  *
   1198  * This function is called from ssl_Do1stHandshake().
   1199  * The following functions put ssl_GatherRecord1stHandshake into ss->handshake:
   1200  *	ssl2_HandleMessage
   1201  *	ssl2_HandleVerifyMessage
   1202  *	ssl2_HandleServerHelloMessage
   1203  *	ssl2_BeginClientHandshake
   1204  *	ssl2_HandleClientSessionKeyMessage
   1205  *	ssl3_RestartHandshakeAfterCertReq
   1206  *	ssl3_RestartHandshakeAfterServerCert
   1207  *	ssl2_HandleClientHelloMessage
   1208  *	ssl2_BeginServerHandshake
   1209  */
   1210 SECStatus
   1211 ssl_GatherRecord1stHandshake(sslSocket *ss)
   1212 {
   1213     int rv;
   1214 
   1215     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
   1216 
   1217     ssl_GetRecvBufLock(ss);
   1218 
   1219     /* The special case DTLS logic is needed here because the SSL/TLS
   1220      * version wants to auto-detect SSL2 vs. SSL3 on the initial handshake
   1221      * (ss->version == 0) but with DTLS it gets confused, so we force the
   1222      * SSL3 version.
   1223      */
   1224     if ((ss->version >= SSL_LIBRARY_VERSION_3_0) || IS_DTLS(ss)) {
   1225 	/* Wait for handshake to complete, or application data to arrive.  */
   1226 	rv = ssl3_GatherCompleteHandshake(ss, 0);
   1227     } else {
   1228 	/* See if we have a complete record */
   1229 	rv = ssl2_GatherRecord(ss, 0);
   1230     }
   1231     SSL_TRC(10, ("%d: SSL[%d]: handshake gathering, rv=%d",
   1232 		 SSL_GETPID(), ss->fd, rv));
   1233 
   1234     ssl_ReleaseRecvBufLock(ss);
   1235 
   1236     if (rv <= 0) {
   1237 	if (rv == SECWouldBlock) {
   1238 	    /* Progress is blocked waiting for callback completion.  */
   1239 	    SSL_TRC(10, ("%d: SSL[%d]: handshake blocked (need %d)",
   1240 			 SSL_GETPID(), ss->fd, ss->gs.remainder));
   1241 	    return SECWouldBlock;
   1242 	}
   1243 	if (rv == 0) {
   1244 	    /* EOF. Loser  */
   1245 	    PORT_SetError(PR_END_OF_FILE_ERROR);
   1246 	}
   1247 	return SECFailure;	/* rv is < 0 here. */
   1248     }
   1249 
   1250     SSL_TRC(10, ("%d: SSL[%d]: got handshake record of %d bytes",
   1251 		 SSL_GETPID(), ss->fd, ss->gs.recordLen));
   1252 
   1253     ss->handshake = 0;	/* makes ssl_Do1stHandshake call ss->nextHandshake.*/
   1254     return SECSuccess;
   1255 }
   1256 
   1257 /************************************************************************/
   1258 
   1259 /* Called from ssl2_ServerSetupSessionCypher()
   1260  *             ssl2_ClientSetupSessionCypher()
   1261  */
   1262 static SECStatus
   1263 ssl2_FillInSID(sslSessionID * sid,
   1264           int            cipher,
   1265 	  PRUint8       *keyData,
   1266 	  int            keyLen,
   1267 	  PRUint8       *ca,
   1268 	  int            caLen,
   1269 	  int            keyBits,
   1270 	  int            secretKeyBits,
   1271 	  SSLSignType    authAlgorithm,
   1272 	  PRUint32       authKeyBits,
   1273 	  SSLKEAType     keaType,
   1274 	  PRUint32       keaKeyBits)
   1275 {
   1276     PORT_Assert(sid->references == 1);
   1277     PORT_Assert(sid->cached == never_cached);
   1278     PORT_Assert(sid->u.ssl2.masterKey.data == 0);
   1279     PORT_Assert(sid->u.ssl2.cipherArg.data == 0);
   1280 
   1281     sid->version = SSL_LIBRARY_VERSION_2;
   1282 
   1283     sid->u.ssl2.cipherType = cipher;
   1284     sid->u.ssl2.masterKey.data = (PRUint8*) PORT_Alloc(keyLen);
   1285     if (!sid->u.ssl2.masterKey.data) {
   1286 	return SECFailure;
   1287     }
   1288     PORT_Memcpy(sid->u.ssl2.masterKey.data, keyData, keyLen);
   1289     sid->u.ssl2.masterKey.len = keyLen;
   1290     sid->u.ssl2.keyBits       = keyBits;
   1291     sid->u.ssl2.secretKeyBits = secretKeyBits;
   1292     sid->authAlgorithm        = authAlgorithm;
   1293     sid->authKeyBits          = authKeyBits;
   1294     sid->keaType              = keaType;
   1295     sid->keaKeyBits           = keaKeyBits;
   1296     sid->lastAccessTime = sid->creationTime = ssl_Time();
   1297     sid->expirationTime = sid->creationTime + ssl_sid_timeout;
   1298 
   1299     if (caLen) {
   1300 	sid->u.ssl2.cipherArg.data = (PRUint8*) PORT_Alloc(caLen);
   1301 	if (!sid->u.ssl2.cipherArg.data) {
   1302 	    return SECFailure;
   1303 	}
   1304 	sid->u.ssl2.cipherArg.len = caLen;
   1305 	PORT_Memcpy(sid->u.ssl2.cipherArg.data, ca, caLen);
   1306     }
   1307     return SECSuccess;
   1308 }
   1309 
   1310 /*
   1311 ** Construct session keys given the masterKey (tied to the session-id),
   1312 ** the client's challenge and the server's nonce.
   1313 **
   1314 ** Called from ssl2_CreateSessionCypher() <-
   1315 */
   1316 static SECStatus
   1317 ssl2_ProduceKeys(sslSocket *    ss,
   1318             SECItem *      readKey,
   1319 	    SECItem *      writeKey,
   1320 	    SECItem *      masterKey,
   1321 	    PRUint8 *      challenge,
   1322 	    PRUint8 *      nonce,
   1323 	    int            cipherType)
   1324 {
   1325     PK11Context * cx        = 0;
   1326     unsigned      nkm       = 0; /* number of hashes to generate key mat. */
   1327     unsigned      nkd       = 0; /* size of readKey and writeKey. */
   1328     unsigned      part;
   1329     unsigned      i;
   1330     unsigned      off;
   1331     SECStatus     rv;
   1332     PRUint8       countChar;
   1333     PRUint8       km[3*16];	/* buffer for key material. */
   1334 
   1335     readKey->data = 0;
   1336     writeKey->data = 0;
   1337 
   1338     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
   1339 
   1340     rv = SECSuccess;
   1341     cx = PK11_CreateDigestContext(SEC_OID_MD5);
   1342     if (cx == NULL) {
   1343 	ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE);
   1344 	return SECFailure;
   1345     }
   1346 
   1347     nkm = ssl_Specs[cipherType].nkm;
   1348     nkd = ssl_Specs[cipherType].nkd;
   1349 
   1350     readKey->data = (PRUint8*) PORT_Alloc(nkd);
   1351     if (!readKey->data)
   1352     	goto loser;
   1353     readKey->len = nkd;
   1354 
   1355     writeKey->data = (PRUint8*) PORT_Alloc(nkd);
   1356     if (!writeKey->data)
   1357     	goto loser;
   1358     writeKey->len = nkd;
   1359 
   1360     /* Produce key material */
   1361     countChar = '0';
   1362     for (i = 0, off = 0; i < nkm; i++, off += 16) {
   1363 	rv  = PK11_DigestBegin(cx);
   1364 	rv |= PK11_DigestOp(cx, masterKey->data, masterKey->len);
   1365 	rv |= PK11_DigestOp(cx, &countChar,      1);
   1366 	rv |= PK11_DigestOp(cx, challenge,       SSL_CHALLENGE_BYTES);
   1367 	rv |= PK11_DigestOp(cx, nonce,           SSL_CONNECTIONID_BYTES);
   1368 	rv |= PK11_DigestFinal(cx, km+off, &part, MD5_LENGTH);
   1369 	if (rv != SECSuccess) {
   1370 	    ssl_MapLowLevelError(SSL_ERROR_MD5_DIGEST_FAILURE);
   1371 	    rv = SECFailure;
   1372 	    goto loser;
   1373 	}
   1374 	countChar++;
   1375     }
   1376 
   1377     /* Produce keys */
   1378     PORT_Memcpy(readKey->data,  km,       nkd);
   1379     PORT_Memcpy(writeKey->data, km + nkd, nkd);
   1380 
   1381 loser:
   1382     PK11_DestroyContext(cx, PR_TRUE);
   1383     return rv;
   1384 }
   1385 
   1386 /* Called from ssl2_ServerSetupSessionCypher()
   1387 **                  <- ssl2_HandleClientSessionKeyMessage()
   1388 **                          <- ssl2_HandleClientHelloMessage()
   1389 ** and from    ssl2_ClientSetupSessionCypher()
   1390 **                  <- ssl2_HandleServerHelloMessage()
   1391 */
   1392 static SECStatus
   1393 ssl2_CreateSessionCypher(sslSocket *ss, sslSessionID *sid, PRBool isClient)
   1394 {
   1395     SECItem         * rk = NULL;
   1396     SECItem         * wk = NULL;
   1397     SECItem *         param;
   1398     SECStatus         rv;
   1399     int               cipherType  = sid->u.ssl2.cipherType;
   1400     PK11SlotInfo *    slot        = NULL;
   1401     CK_MECHANISM_TYPE mechanism;
   1402     SECItem           readKey;
   1403     SECItem           writeKey;
   1404 
   1405     void *readcx = 0;
   1406     void *writecx = 0;
   1407     readKey.data = 0;
   1408     writeKey.data = 0;
   1409 
   1410     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
   1411     if (ss->sec.ci.sid == 0)
   1412     	goto sec_loser;	/* don't crash if asserts are off */
   1413 
   1414     /* Trying to cut down on all these switch statements that should be tables.
   1415      * So, test cipherType once, here, and then use tables below.
   1416      */
   1417     switch (cipherType) {
   1418     case SSL_CK_RC4_128_EXPORT40_WITH_MD5:
   1419     case SSL_CK_RC4_128_WITH_MD5:
   1420     case SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5:
   1421     case SSL_CK_RC2_128_CBC_WITH_MD5:
   1422     case SSL_CK_DES_64_CBC_WITH_MD5:
   1423     case SSL_CK_DES_192_EDE3_CBC_WITH_MD5:
   1424 	break;
   1425 
   1426     default:
   1427 	SSL_DBG(("%d: SSL[%d]: ssl2_CreateSessionCypher: unknown cipher=%d",
   1428 		 SSL_GETPID(), ss->fd, cipherType));
   1429 	PORT_SetError(isClient ? SSL_ERROR_BAD_SERVER : SSL_ERROR_BAD_CLIENT);
   1430 	goto sec_loser;
   1431     }
   1432 
   1433     rk = isClient ? &readKey  : &writeKey;
   1434     wk = isClient ? &writeKey : &readKey;
   1435 
   1436     /* Produce the keys for this session */
   1437     rv = ssl2_ProduceKeys(ss, &readKey, &writeKey, &sid->u.ssl2.masterKey,
   1438 		     ss->sec.ci.clientChallenge, ss->sec.ci.connectionID,
   1439 		     cipherType);
   1440     if (rv != SECSuccess)
   1441 	goto loser;
   1442     PRINT_BUF(7, (ss, "Session read-key: ", rk->data, rk->len));
   1443     PRINT_BUF(7, (ss, "Session write-key: ", wk->data, wk->len));
   1444 
   1445     PORT_Memcpy(ss->sec.ci.readKey, readKey.data, readKey.len);
   1446     PORT_Memcpy(ss->sec.ci.writeKey, writeKey.data, writeKey.len);
   1447     ss->sec.ci.keySize = readKey.len;
   1448 
   1449     /* Setup the MAC */
   1450     rv = ssl2_CreateMAC(&ss->sec, rk, wk, cipherType);
   1451     if (rv != SECSuccess)
   1452     	goto loser;
   1453 
   1454     /* First create the session key object */
   1455     SSL_TRC(3, ("%d: SSL[%d]: using %s", SSL_GETPID(), ss->fd,
   1456 	    ssl_cipherName[cipherType]));
   1457 
   1458 
   1459     mechanism  = ssl_Specs[cipherType].mechanism;
   1460 
   1461     /* set destructer before we call loser... */
   1462     ss->sec.destroy = (void (*)(void*, PRBool)) PK11_DestroyContext;
   1463     slot = PK11_GetBestSlot(mechanism, ss->pkcs11PinArg);
   1464     if (slot == NULL)
   1465 	goto loser;
   1466 
   1467     param = PK11_ParamFromIV(mechanism, &sid->u.ssl2.cipherArg);
   1468     if (param == NULL)
   1469 	goto loser;
   1470     readcx = PK11_CreateContextByRawKey(slot, mechanism, PK11_OriginUnwrap,
   1471 					CKA_DECRYPT, rk, param,
   1472 					ss->pkcs11PinArg);
   1473     SECITEM_FreeItem(param, PR_TRUE);
   1474     if (readcx == NULL)
   1475 	goto loser;
   1476 
   1477     /* build the client context */
   1478     param = PK11_ParamFromIV(mechanism, &sid->u.ssl2.cipherArg);
   1479     if (param == NULL)
   1480 	goto loser;
   1481     writecx = PK11_CreateContextByRawKey(slot, mechanism, PK11_OriginUnwrap,
   1482 					 CKA_ENCRYPT, wk, param,
   1483 					 ss->pkcs11PinArg);
   1484     SECITEM_FreeItem(param,PR_TRUE);
   1485     if (writecx == NULL)
   1486 	goto loser;
   1487     PK11_FreeSlot(slot);
   1488 
   1489     rv = SECSuccess;
   1490     ss->sec.enc           = (SSLCipher) PK11_CipherOp;
   1491     ss->sec.dec           = (SSLCipher) PK11_CipherOp;
   1492     ss->sec.readcx        = (void *) readcx;
   1493     ss->sec.writecx       = (void *) writecx;
   1494     ss->sec.blockSize     = ssl_Specs[cipherType].blockSize;
   1495     ss->sec.blockShift    = ssl_Specs[cipherType].blockShift;
   1496     ss->sec.cipherType    = sid->u.ssl2.cipherType;
   1497     ss->sec.keyBits       = sid->u.ssl2.keyBits;
   1498     ss->sec.secretKeyBits = sid->u.ssl2.secretKeyBits;
   1499     goto done;
   1500 
   1501   loser:
   1502     if (ss->sec.destroy) {
   1503 	if (readcx)  (*ss->sec.destroy)(readcx, PR_TRUE);
   1504 	if (writecx) (*ss->sec.destroy)(writecx, PR_TRUE);
   1505     }
   1506     ss->sec.destroy = NULL;
   1507     if (slot) PK11_FreeSlot(slot);
   1508 
   1509   sec_loser:
   1510     rv = SECFailure;
   1511 
   1512   done:
   1513     if (rk) {
   1514 	SECITEM_ZfreeItem(rk, PR_FALSE);
   1515     }
   1516     if (wk) {
   1517 	SECITEM_ZfreeItem(wk, PR_FALSE);
   1518     }
   1519     return rv;
   1520 }
   1521 
   1522 /*
   1523 ** Setup the server ciphers given information from a CLIENT-MASTER-KEY
   1524 ** message.
   1525 ** 	"ss"      pointer to the ssl-socket object
   1526 ** 	"cipher"  the cipher type to use
   1527 ** 	"keyBits" the size of the final cipher key
   1528 ** 	"ck"      the clear-key data
   1529 ** 	"ckLen"   the number of bytes of clear-key data
   1530 ** 	"ek"      the encrypted-key data
   1531 ** 	"ekLen"   the number of bytes of encrypted-key data
   1532 ** 	"ca"      the cipher-arg data
   1533 ** 	"caLen"   the number of bytes of cipher-arg data
   1534 **
   1535 ** The MASTER-KEY is constructed by first decrypting the encrypted-key
   1536 ** data. This produces the SECRET-KEY-DATA. The MASTER-KEY is composed by
   1537 ** concatenating the clear-key data with the SECRET-KEY-DATA. This code
   1538 ** checks to make sure that the client didn't send us an improper amount
   1539 ** of SECRET-KEY-DATA (it restricts the length of that data to match the
   1540 ** spec).
   1541 **
   1542 ** Called from ssl2_HandleClientSessionKeyMessage().
   1543 */
   1544 static SECStatus
   1545 ssl2_ServerSetupSessionCypher(sslSocket *ss, int cipher, unsigned int keyBits,
   1546 			 PRUint8 *ck, unsigned int ckLen,
   1547 			 PRUint8 *ek, unsigned int ekLen,
   1548 			 PRUint8 *ca, unsigned int caLen)
   1549 {
   1550     PRUint8      *    dk   = NULL; /* decrypted master key */
   1551     sslSessionID *    sid;
   1552     sslServerCerts *  sc   = ss->serverCerts + kt_rsa;
   1553     PRUint8       *   kbuf = 0;	/* buffer for RSA decrypted data. */
   1554     unsigned int      ddLen;	/* length of RSA decrypted data in kbuf */
   1555     unsigned int      keySize;
   1556     unsigned int      dkLen;    /* decrypted key length in bytes */
   1557     int               modulusLen;
   1558     SECStatus         rv;
   1559     PRUint16          allowed;  /* cipher kinds enabled and allowed by policy */
   1560     PRUint8           mkbuf[SSL_MAX_MASTER_KEY_BYTES];
   1561 
   1562     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
   1563     PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss)   );
   1564     PORT_Assert((sc->SERVERKEY != 0));
   1565     PORT_Assert((ss->sec.ci.sid != 0));
   1566     sid = ss->sec.ci.sid;
   1567 
   1568     /* Trying to cut down on all these switch statements that should be tables.
   1569      * So, test cipherType once, here, and then use tables below.
   1570      */
   1571     switch (cipher) {
   1572     case SSL_CK_RC4_128_EXPORT40_WITH_MD5:
   1573     case SSL_CK_RC4_128_WITH_MD5:
   1574     case SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5:
   1575     case SSL_CK_RC2_128_CBC_WITH_MD5:
   1576     case SSL_CK_DES_64_CBC_WITH_MD5:
   1577     case SSL_CK_DES_192_EDE3_CBC_WITH_MD5:
   1578 	break;
   1579 
   1580     default:
   1581 	SSL_DBG(("%d: SSL[%d]: ssl2_ServerSetupSessionCypher: unknown cipher=%d",
   1582 		 SSL_GETPID(), ss->fd, cipher));
   1583 	PORT_SetError(SSL_ERROR_BAD_CLIENT);
   1584 	goto loser;
   1585     }
   1586 
   1587     allowed = ss->allowedByPolicy & ss->chosenPreference & SSL_CB_IMPLEMENTED;
   1588     if (!(allowed & (1 << cipher))) {
   1589     	/* client chose a kind we don't allow! */
   1590 	SSL_DBG(("%d: SSL[%d]: disallowed cipher=%d",
   1591 		 SSL_GETPID(), ss->fd, cipher));
   1592 	PORT_SetError(SSL_ERROR_BAD_CLIENT);
   1593 	goto loser;
   1594     }
   1595 
   1596     keySize = ssl_Specs[cipher].keyLen;
   1597     if (keyBits != keySize * BPB) {
   1598 	SSL_DBG(("%d: SSL[%d]: invalid master secret key length=%d (bits)!",
   1599 		 SSL_GETPID(), ss->fd, keyBits));
   1600 	PORT_SetError(SSL_ERROR_BAD_CLIENT);
   1601 	goto loser;
   1602     }
   1603 
   1604     if (ckLen != ssl_Specs[cipher].pubLen) {
   1605 	SSL_DBG(("%d: SSL[%d]: invalid clear key length, ckLen=%d (bytes)!",
   1606 		 SSL_GETPID(), ss->fd, ckLen));
   1607 	PORT_SetError(SSL_ERROR_BAD_CLIENT);
   1608 	goto loser;
   1609     }
   1610 
   1611     if (caLen != ssl_Specs[cipher].ivLen) {
   1612 	SSL_DBG(("%d: SSL[%d]: invalid key args length, caLen=%d (bytes)!",
   1613 		 SSL_GETPID(), ss->fd, caLen));
   1614 	PORT_SetError(SSL_ERROR_BAD_CLIENT);
   1615 	goto loser;
   1616     }
   1617 
   1618     modulusLen = PK11_GetPrivateModulusLen(sc->SERVERKEY);
   1619     if (modulusLen == -1) {
   1620 	/* XXX If the key is bad, then PK11_PubDecryptRaw will fail below. */
   1621 	modulusLen = ekLen;
   1622     }
   1623     if (ekLen > modulusLen || ekLen + ckLen < keySize) {
   1624 	SSL_DBG(("%d: SSL[%d]: invalid encrypted key length, ekLen=%d (bytes)!",
   1625 		 SSL_GETPID(), ss->fd, ekLen));
   1626 	PORT_SetError(SSL_ERROR_BAD_CLIENT);
   1627 	goto loser;
   1628     }
   1629 
   1630     /* allocate the buffer to hold the decrypted portion of the key. */
   1631     kbuf = (PRUint8*)PORT_Alloc(modulusLen);
   1632     if (!kbuf) {
   1633 	goto loser;
   1634     }
   1635     dkLen = keySize - ckLen;
   1636     dk    = kbuf + modulusLen - dkLen;
   1637 
   1638     /* Decrypt encrypted half of the key.
   1639     ** NOTE: PK11_PubDecryptRaw will barf on a non-RSA key. This is
   1640     ** desired behavior here.
   1641     */
   1642     rv = PK11_PubDecryptRaw(sc->SERVERKEY, kbuf, &ddLen, modulusLen, ek, ekLen);
   1643     if (rv != SECSuccess)
   1644 	goto hide_loser;
   1645 
   1646     /* Is the length of the decrypted data (ddLen) the expected value? */
   1647     if (modulusLen != ddLen)
   1648 	goto hide_loser;
   1649 
   1650     /* Cheaply verify that PKCS#1 was used to format the encryption block */
   1651     if ((kbuf[0] != 0x00) || (kbuf[1] != 0x02) || (dk[-1] != 0x00)) {
   1652 	SSL_DBG(("%d: SSL[%d]: strange encryption block",
   1653 		 SSL_GETPID(), ss->fd));
   1654 	PORT_SetError(SSL_ERROR_BAD_CLIENT);
   1655 	goto hide_loser;
   1656     }
   1657 
   1658     /* Make sure we're not subject to a version rollback attack. */
   1659     if (!SSL3_ALL_VERSIONS_DISABLED(&ss->vrange)) {
   1660 	static const PRUint8 threes[8] = { 0x03, 0x03, 0x03, 0x03,
   1661 			                   0x03, 0x03, 0x03, 0x03 };
   1662 
   1663 	if (PORT_Memcmp(dk - 8 - 1, threes, 8) == 0) {
   1664 	    PORT_SetError(SSL_ERROR_BAD_CLIENT);
   1665 	    goto hide_loser;
   1666 	}
   1667     }
   1668     if (0) {
   1669 hide_loser:
   1670 	/* Defense against the Bleichenbacher attack.
   1671 	 * Provide the client with NO CLUES that the decrypted master key
   1672 	 * was erroneous.  Don't send any error messages.
   1673 	 * Instead, Generate a completely bogus master key .
   1674 	 */
   1675 	PK11_GenerateRandom(dk, dkLen);
   1676     }
   1677 
   1678     /*
   1679     ** Construct master key out of the pieces.
   1680     */
   1681     if (ckLen) {
   1682 	PORT_Memcpy(mkbuf, ck, ckLen);
   1683     }
   1684     PORT_Memcpy(mkbuf + ckLen, dk, dkLen);
   1685 
   1686     /* Fill in session-id */
   1687     rv = ssl2_FillInSID(sid, cipher, mkbuf, keySize, ca, caLen,
   1688 		   keyBits, keyBits - (ckLen<<3),
   1689 		   ss->sec.authAlgorithm, ss->sec.authKeyBits,
   1690 		   ss->sec.keaType,       ss->sec.keaKeyBits);
   1691     if (rv != SECSuccess) {
   1692 	goto loser;
   1693     }
   1694 
   1695     /* Create session ciphers */
   1696     rv = ssl2_CreateSessionCypher(ss, sid, PR_FALSE);
   1697     if (rv != SECSuccess) {
   1698 	goto loser;
   1699     }
   1700 
   1701     SSL_TRC(1, ("%d: SSL[%d]: server, using %s cipher, clear=%d total=%d",
   1702 		SSL_GETPID(), ss->fd, ssl_cipherName[cipher],
   1703 		ckLen<<3, keySize<<3));
   1704     rv = SECSuccess;
   1705     goto done;
   1706 
   1707   loser:
   1708     rv = SECFailure;
   1709 
   1710   done:
   1711     PORT_Free(kbuf);
   1712     return rv;
   1713 }
   1714 
   1715 /************************************************************************/
   1716 
   1717 /*
   1718 ** Rewrite the incoming cipher specs, comparing to list of specs we support,
   1719 ** (ss->cipherSpecs) and eliminating anything we don't support
   1720 **
   1721 *  Note: Our list may contain SSL v3 ciphers.
   1722 *  We MUST NOT match on any of those.
   1723 *  Fortunately, this is easy to detect because SSLv3 ciphers have zero
   1724 *  in the first byte, and none of the SSLv2 ciphers do.
   1725 *
   1726 *  Called from ssl2_HandleClientHelloMessage().
   1727 *  Returns the number of bytes of "qualified cipher specs",
   1728 *  which is typically a multiple of 3, but will be zero if there are none.
   1729 */
   1730 static int
   1731 ssl2_QualifyCypherSpecs(sslSocket *ss,
   1732                         PRUint8 *  cs, /* cipher specs in client hello msg. */
   1733 		        int        csLen)
   1734 {
   1735     PRUint8 *    ms;
   1736     PRUint8 *    hs;
   1737     PRUint8 *    qs;
   1738     int          mc;
   1739     int          hc;
   1740     PRUint8      qualifiedSpecs[ssl2_NUM_SUITES_IMPLEMENTED * 3];
   1741 
   1742     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
   1743     PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss)   );
   1744 
   1745     if (!ss->cipherSpecs) {
   1746 	SECStatus rv = ssl2_ConstructCipherSpecs(ss);
   1747 	if (rv != SECSuccess || !ss->cipherSpecs)
   1748 	    return 0;
   1749     }
   1750 
   1751     PRINT_BUF(10, (ss, "specs from client:", cs, csLen));
   1752     qs = qualifiedSpecs;
   1753     ms = ss->cipherSpecs;
   1754     for (mc = ss->sizeCipherSpecs; mc > 0; mc -= 3, ms += 3) {
   1755 	if (ms[0] == 0)
   1756 	    continue;
   1757 	for (hs = cs, hc = csLen; hc > 0; hs += 3, hc -= 3) {
   1758 	    if ((hs[0] == ms[0]) &&
   1759 		(hs[1] == ms[1]) &&
   1760 		(hs[2] == ms[2])) {
   1761 		/* Copy this cipher spec into the "keep" section */
   1762 		qs[0] = hs[0];
   1763 		qs[1] = hs[1];
   1764 		qs[2] = hs[2];
   1765 		qs   += 3;
   1766 		break;
   1767 	    }
   1768 	}
   1769     }
   1770     hc = qs - qualifiedSpecs;
   1771     PRINT_BUF(10, (ss, "qualified specs from client:", qualifiedSpecs, hc));
   1772     PORT_Memcpy(cs, qualifiedSpecs, hc);
   1773     return hc;
   1774 }
   1775 
   1776 /*
   1777 ** Pick the best cipher we can find, given the array of server cipher
   1778 ** specs.  Returns cipher number (e.g. SSL_CK_*), or -1 for no overlap.
   1779 ** If successful, stores the master key size (bytes) in *pKeyLen.
   1780 **
   1781 ** This is correct only for the client side, but presently
   1782 ** this function is only called from
   1783 **	ssl2_ClientSetupSessionCypher() <- ssl2_HandleServerHelloMessage()
   1784 **
   1785 ** Note that most servers only return a single cipher suite in their
   1786 ** ServerHello messages.  So, the code below for finding the "best" cipher
   1787 ** suite usually has only one choice.  The client and server should send
   1788 ** their cipher suite lists sorted in descending order by preference.
   1789 */
   1790 static int
   1791 ssl2_ChooseSessionCypher(sslSocket *ss,
   1792                          int        hc,    /* number of cs's in hs. */
   1793 		         PRUint8 *  hs,    /* server hello's cipher suites. */
   1794 		         int *      pKeyLen) /* out: sym key size in bytes. */
   1795 {
   1796     PRUint8 *       ms;
   1797     unsigned int    i;
   1798     int             bestKeySize;
   1799     int             bestRealKeySize;
   1800     int             bestCypher;
   1801     int             keySize;
   1802     int             realKeySize;
   1803     PRUint8 *       ohs               = hs;
   1804     const PRUint8 * preferred;
   1805     static const PRUint8 noneSuch[3] = { 0, 0, 0 };
   1806 
   1807     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
   1808     PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss)   );
   1809 
   1810     if (!ss->cipherSpecs) {
   1811 	SECStatus rv = ssl2_ConstructCipherSpecs(ss);
   1812 	if (rv != SECSuccess || !ss->cipherSpecs)
   1813 	    goto loser;
   1814     }
   1815 
   1816     if (!ss->preferredCipher) {
   1817     	unsigned int allowed = ss->allowedByPolicy & ss->chosenPreference &
   1818 	                       SSL_CB_IMPLEMENTED;
   1819 	if (allowed) {
   1820 	    preferred = implementedCipherSuites;
   1821 	    for (i = ssl2_NUM_SUITES_IMPLEMENTED; i > 0; --i) {
   1822 		if (0 != (allowed & (1U << preferred[0]))) {
   1823 		    ss->preferredCipher = preferred;
   1824 		    break;
   1825 		}
   1826 		preferred += 3;
   1827 	    }
   1828 	}
   1829     }
   1830     preferred = ss->preferredCipher ? ss->preferredCipher : noneSuch;
   1831     /*
   1832     ** Scan list of ciphers received from peer and look for a match in
   1833     ** our list.
   1834     *  Note: Our list may contain SSL v3 ciphers.
   1835     *  We MUST NOT match on any of those.
   1836     *  Fortunately, this is easy to detect because SSLv3 ciphers have zero
   1837     *  in the first byte, and none of the SSLv2 ciphers do.
   1838     */
   1839     bestKeySize = bestRealKeySize = 0;
   1840     bestCypher = -1;
   1841     while (--hc >= 0) {
   1842 	for (i = 0, ms = ss->cipherSpecs; i < ss->sizeCipherSpecs; i += 3, ms += 3) {
   1843 	    if ((hs[0] == preferred[0]) &&
   1844 		(hs[1] == preferred[1]) &&
   1845 		(hs[2] == preferred[2]) &&
   1846 		 hs[0] != 0) {
   1847 		/* Pick this cipher immediately! */
   1848 		*pKeyLen = (((hs[1] << 8) | hs[2]) + 7) >> 3;
   1849 		return hs[0];
   1850 	    }
   1851 	    if ((hs[0] == ms[0]) && (hs[1] == ms[1]) && (hs[2] == ms[2]) &&
   1852 	         hs[0] != 0) {
   1853 		/* Found a match */
   1854 
   1855 		/* Use secret keySize to determine which cipher is best */
   1856 		realKeySize = (hs[1] << 8) | hs[2];
   1857 		switch (hs[0]) {
   1858 		  case SSL_CK_RC4_128_EXPORT40_WITH_MD5:
   1859 		  case SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5:
   1860 		    keySize = 40;
   1861 		    break;
   1862 		  default:
   1863 		    keySize = realKeySize;
   1864 		    break;
   1865 		}
   1866 		if (keySize > bestKeySize) {
   1867 		    bestCypher = hs[0];
   1868 		    bestKeySize = keySize;
   1869 		    bestRealKeySize = realKeySize;
   1870 		}
   1871 	    }
   1872 	}
   1873 	hs += 3;
   1874     }
   1875     if (bestCypher < 0) {
   1876 	/*
   1877 	** No overlap between server and client. Re-examine server list
   1878 	** to see what kind of ciphers it does support so that we can set
   1879 	** the error code appropriately.
   1880 	*/
   1881 	if ((ohs[0] == SSL_CK_RC4_128_WITH_MD5) ||
   1882 	    (ohs[0] == SSL_CK_RC2_128_CBC_WITH_MD5)) {
   1883 	    PORT_SetError(SSL_ERROR_US_ONLY_SERVER);
   1884 	} else if ((ohs[0] == SSL_CK_RC4_128_EXPORT40_WITH_MD5) ||
   1885 		   (ohs[0] == SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5)) {
   1886 	    PORT_SetError(SSL_ERROR_EXPORT_ONLY_SERVER);
   1887 	} else {
   1888 	    PORT_SetError(SSL_ERROR_NO_CYPHER_OVERLAP);
   1889 	}
   1890 	SSL_DBG(("%d: SSL[%d]: no cipher overlap", SSL_GETPID(), ss->fd));
   1891 	goto loser;
   1892     }
   1893     *pKeyLen = (bestRealKeySize + 7) >> 3;
   1894     return bestCypher;
   1895 
   1896   loser:
   1897     return -1;
   1898 }
   1899 
   1900 static SECStatus
   1901 ssl2_ClientHandleServerCert(sslSocket *ss, PRUint8 *certData, int certLen)
   1902 {
   1903     CERTCertificate *cert      = NULL;
   1904     SECItem          certItem;
   1905 
   1906     certItem.data = certData;
   1907     certItem.len  = certLen;
   1908 
   1909     /* decode the certificate */
   1910     cert = CERT_NewTempCertificate(ss->dbHandle, &certItem, NULL,
   1911 				   PR_FALSE, PR_TRUE);
   1912 
   1913     if (cert == NULL) {
   1914 	SSL_DBG(("%d: SSL[%d]: decode of server certificate fails",
   1915 		 SSL_GETPID(), ss->fd));
   1916 	PORT_SetError(SSL_ERROR_BAD_CERTIFICATE);
   1917 	return SECFailure;
   1918     }
   1919 
   1920 #ifdef TRACE
   1921     {
   1922 	if (ssl_trace >= 1) {
   1923 	    char *issuer;
   1924 	    char *subject;
   1925 	    issuer = CERT_NameToAscii(&cert->issuer);
   1926 	    subject = CERT_NameToAscii(&cert->subject);
   1927 	    SSL_TRC(1,("%d: server certificate issuer: '%s'",
   1928 		       SSL_GETPID(), issuer ? issuer : "OOPS"));
   1929 	    SSL_TRC(1,("%d: server name: '%s'",
   1930 		       SSL_GETPID(), subject ? subject : "OOPS"));
   1931 	    PORT_Free(issuer);
   1932 	    PORT_Free(subject);
   1933 	}
   1934     }
   1935 #endif
   1936 
   1937     ss->sec.peerCert = cert;
   1938     return SECSuccess;
   1939 }
   1940 
   1941 
   1942 /*
   1943  * Format one block of data for public/private key encryption using
   1944  * the rules defined in PKCS #1. SSL2 does this itself to handle the
   1945  * rollback detection.
   1946  */
   1947 #define RSA_BLOCK_MIN_PAD_LEN           8
   1948 #define RSA_BLOCK_FIRST_OCTET           0x00
   1949 #define RSA_BLOCK_AFTER_PAD_OCTET       0x00
   1950 #define RSA_BLOCK_PUBLIC_OCTET       	0x02
   1951 unsigned char *
   1952 ssl_FormatSSL2Block(unsigned modulusLen, SECItem *data)
   1953 {
   1954     unsigned char *block;
   1955     unsigned char *bp;
   1956     int padLen;
   1957     SECStatus rv;
   1958     int i;
   1959 
   1960     if (modulusLen < data->len + (3 + RSA_BLOCK_MIN_PAD_LEN)) {
   1961 	PORT_SetError(SEC_ERROR_BAD_KEY);
   1962     	return NULL;
   1963     }
   1964     block = (unsigned char *) PORT_Alloc(modulusLen);
   1965     if (block == NULL)
   1966 	return NULL;
   1967 
   1968     bp = block;
   1969 
   1970     /*
   1971      * All RSA blocks start with two octets:
   1972      *	0x00 || BlockType
   1973      */
   1974     *bp++ = RSA_BLOCK_FIRST_OCTET;
   1975     *bp++ = RSA_BLOCK_PUBLIC_OCTET;
   1976 
   1977     /*
   1978      * 0x00 || BT || Pad || 0x00 || ActualData
   1979      *   1      1   padLen    1      data->len
   1980      * Pad is all non-zero random bytes.
   1981      */
   1982     padLen = modulusLen - data->len - 3;
   1983     PORT_Assert (padLen >= RSA_BLOCK_MIN_PAD_LEN);
   1984     rv = PK11_GenerateRandom(bp, padLen);
   1985     if (rv == SECFailure) goto loser;
   1986     /* replace all the 'zero' bytes */
   1987     for (i = 0; i < padLen; i++) {
   1988 	while (bp[i] == RSA_BLOCK_AFTER_PAD_OCTET) {
   1989     	    rv = PK11_GenerateRandom(bp+i, 1);
   1990 	    if (rv == SECFailure) goto loser;
   1991 	}
   1992     }
   1993     bp += padLen;
   1994     *bp++ = RSA_BLOCK_AFTER_PAD_OCTET;
   1995     PORT_Memcpy (bp, data->data, data->len);
   1996 
   1997     return block;
   1998 loser:
   1999     if (block) PORT_Free(block);
   2000     return NULL;
   2001 }
   2002 
   2003 /*
   2004 ** Given the server's public key and cipher specs, generate a session key
   2005 ** that is ready to use for encrypting/decrypting the byte stream. At
   2006 ** the same time, generate the SSL_MT_CLIENT_MASTER_KEY message and
   2007 ** send it to the server.
   2008 **
   2009 ** Called from ssl2_HandleServerHelloMessage()
   2010 */
   2011 static SECStatus
   2012 ssl2_ClientSetupSessionCypher(sslSocket *ss, PRUint8 *cs, int csLen)
   2013 {
   2014     sslSessionID *    sid;
   2015     PRUint8 *         ca;	/* points to iv data, or NULL if none. */
   2016     PRUint8 *         ekbuf 		= 0;
   2017     CERTCertificate * cert 		= 0;
   2018     SECKEYPublicKey * serverKey 	= 0;
   2019     unsigned          modulusLen 	= 0;
   2020     SECStatus         rv;
   2021     int               cipher;
   2022     int               keyLen;	/* cipher symkey size in bytes. */
   2023     int               ckLen;	/* publicly reveal this many bytes of key. */
   2024     int               caLen;	/* length of IV data at *ca.	*/
   2025     int               nc;
   2026 
   2027     unsigned char *eblock;	/* holds unencrypted PKCS#1 formatted key. */
   2028     SECItem           rek;	/* holds portion of symkey to be encrypted. */
   2029 
   2030     PRUint8           keyData[SSL_MAX_MASTER_KEY_BYTES];
   2031     PRUint8           iv     [8];
   2032 
   2033     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
   2034 
   2035     eblock = NULL;
   2036 
   2037     sid = ss->sec.ci.sid;
   2038     PORT_Assert(sid != 0);
   2039 
   2040     cert = ss->sec.peerCert;
   2041 
   2042     serverKey = CERT_ExtractPublicKey(cert);
   2043     if (!serverKey) {
   2044 	SSL_DBG(("%d: SSL[%d]: extract public key failed: error=%d",
   2045 		 SSL_GETPID(), ss->fd, PORT_GetError()));
   2046 	PORT_SetError(SSL_ERROR_BAD_CERTIFICATE);
   2047 	rv = SECFailure;
   2048 	goto loser2;
   2049     }
   2050 
   2051     ss->sec.authAlgorithm = ssl_sign_rsa;
   2052     ss->sec.keaType       = ssl_kea_rsa;
   2053     ss->sec.keaKeyBits    = \
   2054     ss->sec.authKeyBits   = SECKEY_PublicKeyStrengthInBits(serverKey);
   2055 
   2056     /* Choose a compatible cipher with the server */
   2057     nc = csLen / 3;
   2058     cipher = ssl2_ChooseSessionCypher(ss, nc, cs, &keyLen);
   2059     if (cipher < 0) {
   2060 	/* ssl2_ChooseSessionCypher has set error code. */
   2061 	ssl2_SendErrorMessage(ss, SSL_PE_NO_CYPHERS);
   2062 	goto loser;
   2063     }
   2064 
   2065     /* Generate the random keys */
   2066     PK11_GenerateRandom(keyData, sizeof(keyData));
   2067 
   2068     /*
   2069     ** Next, carve up the keys into clear and encrypted portions. The
   2070     ** clear data is taken from the start of keyData and the encrypted
   2071     ** portion from the remainder. Note that each of these portions is
   2072     ** carved in half, one half for the read-key and one for the
   2073     ** write-key.
   2074     */
   2075     ca = 0;
   2076 
   2077     /* We know that cipher is a legit value here, because
   2078      * ssl2_ChooseSessionCypher doesn't return bogus values.
   2079      */
   2080     ckLen = ssl_Specs[cipher].pubLen;	/* cleartext key length. */
   2081     caLen = ssl_Specs[cipher].ivLen;	/* IV length.		*/
   2082     if (caLen) {
   2083 	PORT_Assert(sizeof iv >= caLen);
   2084     	PK11_GenerateRandom(iv, caLen);
   2085 	ca = iv;
   2086     }
   2087 
   2088     /* Fill in session-id */
   2089     rv = ssl2_FillInSID(sid, cipher, keyData, keyLen,
   2090 		   ca, caLen, keyLen << 3, (keyLen - ckLen) << 3,
   2091 		   ss->sec.authAlgorithm, ss->sec.authKeyBits,
   2092 		   ss->sec.keaType,       ss->sec.keaKeyBits);
   2093     if (rv != SECSuccess) {
   2094 	goto loser;
   2095     }
   2096 
   2097     SSL_TRC(1, ("%d: SSL[%d]: client, using %s cipher, clear=%d total=%d",
   2098 		SSL_GETPID(), ss->fd, ssl_cipherName[cipher],
   2099 		ckLen<<3, keyLen<<3));
   2100 
   2101     /* Now setup read and write ciphers */
   2102     rv = ssl2_CreateSessionCypher(ss, sid, PR_TRUE);
   2103     if (rv != SECSuccess) {
   2104 	goto loser;
   2105     }
   2106 
   2107     /*
   2108     ** Fill in the encryption buffer with some random bytes. Then
   2109     ** copy in the portion of the session key we are encrypting.
   2110     */
   2111     modulusLen = SECKEY_PublicKeyStrength(serverKey);
   2112     rek.data   = keyData + ckLen;
   2113     rek.len    = keyLen  - ckLen;
   2114     eblock = ssl_FormatSSL2Block(modulusLen, &rek);
   2115     if (eblock == NULL)
   2116     	goto loser;
   2117 
   2118     /* Set up the padding for version 2 rollback detection. */
   2119     /* XXX We should really use defines here */
   2120     if (!SSL3_ALL_VERSIONS_DISABLED(&ss->vrange)) {
   2121 	PORT_Assert((modulusLen - rek.len) > 12);
   2122 	PORT_Memset(eblock + modulusLen - rek.len - 8 - 1, 0x03, 8);
   2123     }
   2124     ekbuf = (PRUint8*) PORT_Alloc(modulusLen);
   2125     if (!ekbuf)
   2126 	goto loser;
   2127     PRINT_BUF(10, (ss, "master key encryption block:",
   2128 		   eblock, modulusLen));
   2129 
   2130     /* Encrypt ekitem */
   2131     rv = PK11_PubEncryptRaw(serverKey, ekbuf, eblock, modulusLen,
   2132 						ss->pkcs11PinArg);
   2133     if (rv)
   2134     	goto loser;
   2135 
   2136     /*  Now we have everything ready to send */
   2137     rv = ssl2_SendSessionKeyMessage(ss, cipher, keyLen << 3, ca, caLen,
   2138 			       keyData, ckLen, ekbuf, modulusLen);
   2139     if (rv != SECSuccess) {
   2140 	goto loser;
   2141     }
   2142     rv = SECSuccess;
   2143     goto done;
   2144 
   2145   loser:
   2146     rv = SECFailure;
   2147 
   2148   loser2:
   2149   done:
   2150     PORT_Memset(keyData, 0, sizeof(keyData));
   2151     PORT_ZFree(ekbuf, modulusLen);
   2152     PORT_ZFree(eblock, modulusLen);
   2153     SECKEY_DestroyPublicKey(serverKey);
   2154     return rv;
   2155 }
   2156 
   2157 /************************************************************************/
   2158 
   2159 /*
   2160  * Called from ssl2_HandleMessage in response to SSL_MT_SERVER_FINISHED message.
   2161  * Caller holds recvBufLock and handshakeLock
   2162  */
   2163 static void
   2164 ssl2_ClientRegSessionID(sslSocket *ss, PRUint8 *s)
   2165 {
   2166     sslSessionID *sid = ss->sec.ci.sid;
   2167 
   2168     /* Record entry in nonce cache */
   2169     if (sid->peerCert == NULL) {
   2170 	PORT_Memcpy(sid->u.ssl2.sessionID, s, sizeof(sid->u.ssl2.sessionID));
   2171 	sid->peerCert = CERT_DupCertificate(ss->sec.peerCert);
   2172 
   2173     }
   2174     if (!ss->opt.noCache)
   2175 	(*ss->sec.cache)(sid);
   2176 }
   2177 
   2178 /* Called from ssl2_HandleMessage() */
   2179 static SECStatus
   2180 ssl2_TriggerNextMessage(sslSocket *ss)
   2181 {
   2182     SECStatus        rv;
   2183 
   2184     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
   2185 
   2186     if ((ss->sec.ci.requiredElements & CIS_HAVE_CERTIFICATE) &&
   2187 	!(ss->sec.ci.sentElements & CIS_HAVE_CERTIFICATE)) {
   2188 	ss->sec.ci.sentElements |= CIS_HAVE_CERTIFICATE;
   2189 	rv = ssl2_SendCertificateRequestMessage(ss);
   2190 	return rv;
   2191     }
   2192     return SECSuccess;
   2193 }
   2194 
   2195 /* See if it's time to send our finished message, or if the handshakes are
   2196 ** complete.  Send finished message if appropriate.
   2197 ** Returns SECSuccess unless anything goes wrong.
   2198 **
   2199 ** Called from ssl2_HandleMessage,
   2200 **             ssl2_HandleVerifyMessage
   2201 **             ssl2_HandleServerHelloMessage
   2202 **             ssl2_HandleClientSessionKeyMessage
   2203 */
   2204 static SECStatus
   2205 ssl2_TryToFinish(sslSocket *ss)
   2206 {
   2207     SECStatus        rv;
   2208     char             e, ef;
   2209 
   2210     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
   2211 
   2212     e = ss->sec.ci.elements;
   2213     ef = e | CIS_HAVE_FINISHED;
   2214     if ((ef & ss->sec.ci.requiredElements) == ss->sec.ci.requiredElements) {
   2215 	if (ss->sec.isServer) {
   2216 	    /* Send server finished message if we already didn't */
   2217 	    rv = ssl2_SendServerFinishedMessage(ss);
   2218 	} else {
   2219 	    /* Send client finished message if we already didn't */
   2220 	    rv = ssl2_SendClientFinishedMessage(ss);
   2221 	}
   2222 	if (rv != SECSuccess) {
   2223 	    return rv;
   2224 	}
   2225 	if ((e & ss->sec.ci.requiredElements) == ss->sec.ci.requiredElements) {
   2226 	    /* Totally finished */
   2227 	    ss->handshake = 0;
   2228 	    return SECSuccess;
   2229 	}
   2230     }
   2231     return SECSuccess;
   2232 }
   2233 
   2234 /*
   2235 ** Called from ssl2_HandleRequestCertificate
   2236 */
   2237 static SECStatus
   2238 ssl2_SignResponse(sslSocket *ss,
   2239 	     SECKEYPrivateKey *key,
   2240 	     SECItem *response)
   2241 {
   2242     SGNContext *     sgn = NULL;
   2243     PRUint8 *        challenge;
   2244     unsigned int     len;
   2245     SECStatus        rv		= SECFailure;
   2246 
   2247     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
   2248 
   2249     challenge = ss->sec.ci.serverChallenge;
   2250     len = ss->sec.ci.serverChallengeLen;
   2251 
   2252     /* Sign the expected data... */
   2253     sgn = SGN_NewContext(SEC_OID_PKCS1_MD5_WITH_RSA_ENCRYPTION,key);
   2254     if (!sgn)
   2255     	goto done;
   2256     rv = SGN_Begin(sgn);
   2257     if (rv != SECSuccess)
   2258     	goto done;
   2259     rv = SGN_Update(sgn, ss->sec.ci.readKey, ss->sec.ci.keySize);
   2260     if (rv != SECSuccess)
   2261     	goto done;
   2262     rv = SGN_Update(sgn, ss->sec.ci.writeKey, ss->sec.ci.keySize);
   2263     if (rv != SECSuccess)
   2264     	goto done;
   2265     rv = SGN_Update(sgn, challenge, len);
   2266     if (rv != SECSuccess)
   2267     	goto done;
   2268     rv = SGN_Update(sgn, ss->sec.peerCert->derCert.data,
   2269                          ss->sec.peerCert->derCert.len);
   2270     if (rv != SECSuccess)
   2271     	goto done;
   2272     rv = SGN_End(sgn, response);
   2273     if (rv != SECSuccess)
   2274     	goto done;
   2275 
   2276 done:
   2277     SGN_DestroyContext(sgn, PR_TRUE);
   2278     return rv == SECSuccess ? SECSuccess : SECFailure;
   2279 }
   2280 
   2281 /*
   2282 ** Try to handle a request-certificate message. Get client's certificate
   2283 ** and private key and sign a message for the server to see.
   2284 ** Caller must hold handshakeLock
   2285 **
   2286 ** Called from ssl2_HandleMessage().
   2287 */
   2288 static int
   2289 ssl2_HandleRequestCertificate(sslSocket *ss)
   2290 {
   2291     CERTCertificate * cert	= NULL;	/* app-selected client cert. */
   2292     SECKEYPrivateKey *key	= NULL;	/* priv key for cert. */
   2293     SECStatus         rv;
   2294     SECItem           response;
   2295     int               ret	= 0;
   2296     PRUint8           authType;
   2297 
   2298 
   2299     /*
   2300      * These things all need to be initialized before we can "goto loser".
   2301      */
   2302     response.data = NULL;
   2303 
   2304     /* get challenge info from connectionInfo */
   2305     authType = ss->sec.ci.authType;
   2306 
   2307     if (authType != SSL_AT_MD5_WITH_RSA_ENCRYPTION) {
   2308 	SSL_TRC(7, ("%d: SSL[%d]: unsupported auth type 0x%x", SSL_GETPID(),
   2309 		    ss->fd, authType));
   2310 	goto no_cert_error;
   2311     }
   2312 
   2313     /* Get certificate and private-key from client */
   2314     if (!ss->getClientAuthData) {
   2315 	SSL_TRC(7, ("%d: SSL[%d]: client doesn't support client-auth",
   2316 		    SSL_GETPID(), ss->fd));
   2317 	goto no_cert_error;
   2318     }
   2319     ret = (*ss->getClientAuthData)(ss->getClientAuthDataArg, ss->fd,
   2320 				   NULL, &cert, &key);
   2321     if ( ret == SECWouldBlock ) {
   2322 	PORT_SetError(SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_SSL2);
   2323 	ret = -1;
   2324 	goto loser;
   2325     }
   2326 
   2327     if (ret) {
   2328 	goto no_cert_error;
   2329     }
   2330 
   2331     /* check what the callback function returned */
   2332     if ((!cert) || (!key)) {
   2333         /* we are missing either the key or cert */
   2334         if (cert) {
   2335             /* got a cert, but no key - free it */
   2336             CERT_DestroyCertificate(cert);
   2337             cert = NULL;
   2338         }
   2339         if (key) {
   2340             /* got a key, but no cert - free it */
   2341             SECKEY_DestroyPrivateKey(key);
   2342             key = NULL;
   2343         }
   2344         goto no_cert_error;
   2345     }
   2346 
   2347     rv = ssl2_SignResponse(ss, key, &response);
   2348     if ( rv != SECSuccess ) {
   2349 	ret = -1;
   2350 	goto loser;
   2351     }
   2352 
   2353     /* Send response message */
   2354     ret = ssl2_SendCertificateResponseMessage(ss, &cert->derCert, &response);
   2355 
   2356     /* Now, remember the cert we sent. But first, forget any previous one. */
   2357     if (ss->sec.localCert) {
   2358 	CERT_DestroyCertificate(ss->sec.localCert);
   2359     }
   2360     ss->sec.localCert = CERT_DupCertificate(cert);
   2361     PORT_Assert(!ss->sec.ci.sid->localCert);
   2362     if (ss->sec.ci.sid->localCert) {
   2363 	CERT_DestroyCertificate(ss->sec.ci.sid->localCert);
   2364     }
   2365     ss->sec.ci.sid->localCert = cert;
   2366     cert = NULL;
   2367 
   2368     goto done;
   2369 
   2370   no_cert_error:
   2371     SSL_TRC(7, ("%d: SSL[%d]: no certificate (ret=%d)", SSL_GETPID(),
   2372 		ss->fd, ret));
   2373     ret = ssl2_SendErrorMessage(ss, SSL_PE_NO_CERTIFICATE);
   2374 
   2375   loser:
   2376   done:
   2377     if ( cert ) {
   2378 	CERT_DestroyCertificate(cert);
   2379     }
   2380     if ( key ) {
   2381 	SECKEY_DestroyPrivateKey(key);
   2382     }
   2383     if ( response.data ) {
   2384 	PORT_Free(response.data);
   2385     }
   2386 
   2387     return ret;
   2388 }
   2389 
   2390 /*
   2391 ** Called from ssl2_HandleMessage for SSL_MT_CLIENT_CERTIFICATE message.
   2392 ** Caller must hold HandshakeLock and RecvBufLock, since cd and response
   2393 ** are contained in the gathered input data.
   2394 */
   2395 static SECStatus
   2396 ssl2_HandleClientCertificate(sslSocket *    ss,
   2397                              PRUint8        certType,	/* XXX unused */
   2398 			     PRUint8 *      cd,
   2399 			     unsigned int   cdLen,
   2400 			     PRUint8 *      response,
   2401 			     unsigned int   responseLen)
   2402 {
   2403     CERTCertificate *cert	= NULL;
   2404     SECKEYPublicKey *pubKey	= NULL;
   2405     VFYContext *     vfy	= NULL;
   2406     SECItem *        derCert;
   2407     SECStatus        rv		= SECFailure;
   2408     SECItem          certItem;
   2409     SECItem          rep;
   2410 
   2411     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
   2412     PORT_Assert( ss->opt.noLocks || ssl_HaveRecvBufLock(ss)   );
   2413 
   2414     /* Extract the certificate */
   2415     certItem.data = cd;
   2416     certItem.len  = cdLen;
   2417 
   2418     cert = CERT_NewTempCertificate(ss->dbHandle, &certItem, NULL,
   2419 			 	   PR_FALSE, PR_TRUE);
   2420     if (cert == NULL) {
   2421 	goto loser;
   2422     }
   2423 
   2424     /* save the certificate, since the auth routine will need it */
   2425     ss->sec.peerCert = cert;
   2426 
   2427     /* Extract the public key */
   2428     pubKey = CERT_ExtractPublicKey(cert);
   2429     if (!pubKey)
   2430     	goto loser;
   2431 
   2432     /* Verify the response data... */
   2433     rep.data = response;
   2434     rep.len = responseLen;
   2435     /* SSL 2.0 only supports RSA certs, so we don't have to worry about
   2436      * DSA here. */
   2437     vfy = VFY_CreateContext(pubKey, &rep, SEC_OID_PKCS1_RSA_ENCRYPTION,
   2438 			    ss->pkcs11PinArg);
   2439     if (!vfy)
   2440     	goto loser;
   2441     rv = VFY_Begin(vfy);
   2442     if (rv)
   2443     	goto loser;
   2444 
   2445     rv = VFY_Update(vfy, ss->sec.ci.readKey, ss->sec.ci.keySize);
   2446     if (rv)
   2447     	goto loser;
   2448     rv = VFY_Update(vfy, ss->sec.ci.writeKey, ss->sec.ci.keySize);
   2449     if (rv)
   2450     	goto loser;
   2451     rv = VFY_Update(vfy, ss->sec.ci.serverChallenge, SSL_CHALLENGE_BYTES);
   2452     if (rv)
   2453     	goto loser;
   2454 
   2455     derCert = &ss->serverCerts[kt_rsa].serverCert->derCert;
   2456     rv = VFY_Update(vfy, derCert->data, derCert->len);
   2457     if (rv)
   2458     	goto loser;
   2459     rv = VFY_End(vfy);
   2460     if (rv)
   2461     	goto loser;
   2462 
   2463     /* Now ask the server application if it likes the certificate... */
   2464     rv = (SECStatus) (*ss->authCertificate)(ss->authCertificateArg,
   2465 					    ss->fd, PR_TRUE, PR_TRUE);
   2466     /* Hey, it liked it. */
   2467     if (SECSuccess == rv)
   2468 	goto done;
   2469 
   2470 loser:
   2471     ss->sec.peerCert = NULL;
   2472     CERT_DestroyCertificate(cert);
   2473 
   2474 done:
   2475     VFY_DestroyContext(vfy, PR_TRUE);
   2476     SECKEY_DestroyPublicKey(pubKey);
   2477     return rv;
   2478 }
   2479 
   2480 /*
   2481 ** Handle remaining messages between client/server. Process finished
   2482 ** messages from either side and any authentication requests.
   2483 ** This should only be called for SSLv2 handshake messages,
   2484 ** not for application data records.
   2485 ** Caller must hold handshake lock.
   2486 **
   2487 ** Called from ssl_Do1stHandshake().
   2488 **
   2489 */
   2490 static SECStatus
   2491 ssl2_HandleMessage(sslSocket *ss)
   2492 {
   2493     PRUint8 *        data;
   2494     PRUint8 *        cid;
   2495     unsigned         len, certType, certLen, responseLen;
   2496     int              rv;
   2497     int              rv2;
   2498 
   2499     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
   2500 
   2501     ssl_GetRecvBufLock(ss);
   2502 
   2503     data = ss->gs.buf.buf + ss->gs.recordOffset;
   2504 
   2505     if (ss->gs.recordLen < 1) {
   2506 	goto bad_peer;
   2507     }
   2508     SSL_TRC(3, ("%d: SSL[%d]: received %d message",
   2509 		SSL_GETPID(), ss->fd, data[0]));
   2510     DUMP_MSG(29, (ss, data, ss->gs.recordLen));
   2511 
   2512     switch (data[0]) {
   2513     case SSL_MT_CLIENT_FINISHED:
   2514 	if (ss->sec.ci.elements & CIS_HAVE_FINISHED) {
   2515 	    SSL_DBG(("%d: SSL[%d]: dup client-finished message",
   2516 		     SSL_GETPID(), ss->fd));
   2517 	    goto bad_peer;
   2518 	}
   2519 
   2520 	/* See if nonce matches */
   2521 	len = ss->gs.recordLen - 1;
   2522 	cid = data + 1;
   2523 	if ((len != sizeof(ss->sec.ci.connectionID)) ||
   2524 	    (PORT_Memcmp(ss->sec.ci.connectionID, cid, len) != 0)) {
   2525 	    SSL_DBG(("%d: SSL[%d]: bad connection-id", SSL_GETPID(), ss->fd));
   2526 	    PRINT_BUF(5, (ss, "sent connection-id",
   2527 			  ss->sec.ci.connectionID,
   2528 			  sizeof(ss->sec.ci.connectionID)));
   2529 	    PRINT_BUF(5, (ss, "rcvd connection-id", cid, len));
   2530 	    goto bad_peer;
   2531 	}
   2532 
   2533 	SSL_TRC(5, ("%d: SSL[%d]: got client finished, waiting for 0x%d",
   2534 		    SSL_GETPID(), ss->fd,
   2535 		    ss->sec.ci.requiredElements ^ ss->sec.ci.elements));
   2536 	ss->sec.ci.elements |= CIS_HAVE_FINISHED;
   2537 	break;
   2538 
   2539     case SSL_MT_SERVER_FINISHED:
   2540 	if (ss->sec.ci.elements & CIS_HAVE_FINISHED) {
   2541 	    SSL_DBG(("%d: SSL[%d]: dup server-finished message",
   2542 		     SSL_GETPID(), ss->fd));
   2543 	    goto bad_peer;
   2544 	}
   2545 
   2546 	if (ss->gs.recordLen - 1 != SSL2_SESSIONID_BYTES) {
   2547 	    SSL_DBG(("%d: SSL[%d]: bad server-finished message, len=%d",
   2548 		     SSL_GETPID(), ss->fd, ss->gs.recordLen));
   2549 	    goto bad_peer;
   2550 	}
   2551 	ssl2_ClientRegSessionID(ss, data+1);
   2552 	SSL_TRC(5, ("%d: SSL[%d]: got server finished, waiting for 0x%d",
   2553 		    SSL_GETPID(), ss->fd,
   2554 		    ss->sec.ci.requiredElements ^ ss->sec.ci.elements));
   2555 	ss->sec.ci.elements |= CIS_HAVE_FINISHED;
   2556 	break;
   2557 
   2558     case SSL_MT_REQUEST_CERTIFICATE:
   2559 	len = ss->gs.recordLen - 2;
   2560 	if ((len < SSL_MIN_CHALLENGE_BYTES) ||
   2561 	    (len > SSL_MAX_CHALLENGE_BYTES)) {
   2562 	    /* Bad challenge */
   2563 	    SSL_DBG(("%d: SSL[%d]: bad cert request message: code len=%d",
   2564 		     SSL_GETPID(), ss->fd, len));
   2565 	    goto bad_peer;
   2566 	}
   2567 
   2568 	/* save auth request info */
   2569 	ss->sec.ci.authType           = data[1];
   2570 	ss->sec.ci.serverChallengeLen = len;
   2571 	PORT_Memcpy(ss->sec.ci.serverChallenge, data + 2, len);
   2572 
   2573 	rv = ssl2_HandleRequestCertificate(ss);
   2574 	if (rv == SECWouldBlock) {
   2575 	    SSL_TRC(3, ("%d: SSL[%d]: async cert request",
   2576 			SSL_GETPID(), ss->fd));
   2577 	    /* someone is handling this asynchronously */
   2578 	    ssl_ReleaseRecvBufLock(ss);
   2579 	    return SECWouldBlock;
   2580 	}
   2581 	if (rv) {
   2582 	    SET_ERROR_CODE
   2583 	    goto loser;
   2584 	}
   2585 	break;
   2586 
   2587     case SSL_MT_CLIENT_CERTIFICATE:
   2588 	if (!ss->authCertificate) {
   2589 	    /* Server asked for authentication and can't handle it */
   2590 	    PORT_SetError(SSL_ERROR_BAD_SERVER);
   2591 	    goto loser;
   2592 	}
   2593 	if (ss->gs.recordLen < SSL_HL_CLIENT_CERTIFICATE_HBYTES) {
   2594 	    SET_ERROR_CODE
   2595 	    goto loser;
   2596 	}
   2597 	certType    = data[1];
   2598 	certLen     = (data[2] << 8) | data[3];
   2599 	responseLen = (data[4] << 8) | data[5];
   2600 	if (certType != SSL_CT_X509_CERTIFICATE) {
   2601 	    PORT_SetError(SSL_ERROR_UNSUPPORTED_CERTIFICATE_TYPE);
   2602 	    goto loser;
   2603 	}
   2604 	if (certLen + responseLen + SSL_HL_CLIENT_CERTIFICATE_HBYTES
   2605 	    > ss->gs.recordLen) {
   2606 	    /* prevent overflow crash. */
   2607 	    rv = SECFailure;
   2608 	} else
   2609 	rv = ssl2_HandleClientCertificate(ss, data[1],
   2610 		data + SSL_HL_CLIENT_CERTIFICATE_HBYTES,
   2611 		certLen,
   2612 		data + SSL_HL_CLIENT_CERTIFICATE_HBYTES + certLen,
   2613 		responseLen);
   2614 	if (rv) {
   2615 	    rv2 = ssl2_SendErrorMessage(ss, SSL_PE_BAD_CERTIFICATE);
   2616 	    SET_ERROR_CODE
   2617 	    goto loser;
   2618 	}
   2619 	ss->sec.ci.elements |= CIS_HAVE_CERTIFICATE;
   2620 	break;
   2621 
   2622     case SSL_MT_ERROR:
   2623 	rv = (data[1] << 8) | data[2];
   2624 	SSL_TRC(2, ("%d: SSL[%d]: got error message, error=0x%x",
   2625 		    SSL_GETPID(), ss->fd, rv));
   2626 
   2627 	/* Convert protocol error number into API error number */
   2628 	switch (rv) {
   2629 	  case SSL_PE_NO_CYPHERS:
   2630 	    rv = SSL_ERROR_NO_CYPHER_OVERLAP;
   2631 	    break;
   2632 	  case SSL_PE_NO_CERTIFICATE:
   2633 	    rv = SSL_ERROR_NO_CERTIFICATE;
   2634 	    break;
   2635 	  case SSL_PE_BAD_CERTIFICATE:
   2636 	    rv = SSL_ERROR_BAD_CERTIFICATE;
   2637 	    break;
   2638 	  case SSL_PE_UNSUPPORTED_CERTIFICATE_TYPE:
   2639 	    rv = SSL_ERROR_UNSUPPORTED_CERTIFICATE_TYPE;
   2640 	    break;
   2641 	  default:
   2642 	    goto bad_peer;
   2643 	}
   2644 	/* XXX make certificate-request optionally fail... */
   2645 	PORT_SetError(rv);
   2646 	goto loser;
   2647 
   2648     default:
   2649 	SSL_DBG(("%d: SSL[%d]: unknown message %d",
   2650 		 SSL_GETPID(), ss->fd, data[0]));
   2651 	goto loser;
   2652     }
   2653 
   2654     SSL_TRC(3, ("%d: SSL[%d]: handled %d message, required=0x%x got=0x%x",
   2655 		SSL_GETPID(), ss->fd, data[0],
   2656 		ss->sec.ci.requiredElements, ss->sec.ci.elements));
   2657 
   2658     rv = ssl2_TryToFinish(ss);
   2659     if (rv != SECSuccess)
   2660 	goto loser;
   2661 
   2662     ss->gs.recordLen = 0;
   2663     ssl_ReleaseRecvBufLock(ss);
   2664 
   2665     if (ss->handshake == 0) {
   2666 	return SECSuccess;
   2667     }
   2668 
   2669     ss->handshake     = ssl_GatherRecord1stHandshake;
   2670     ss->nextHandshake = ssl2_HandleMessage;
   2671     return ssl2_TriggerNextMessage(ss);
   2672 
   2673   bad_peer:
   2674     PORT_SetError(ss->sec.isServer ? SSL_ERROR_BAD_CLIENT : SSL_ERROR_BAD_SERVER);
   2675     /* FALL THROUGH */
   2676 
   2677   loser:
   2678     ssl_ReleaseRecvBufLock(ss);
   2679     return SECFailure;
   2680 }
   2681 
   2682 /************************************************************************/
   2683 
   2684 /* Called from ssl_Do1stHandshake, after ssl2_HandleServerHelloMessage.
   2685 */
   2686 static SECStatus
   2687 ssl2_HandleVerifyMessage(sslSocket *ss)
   2688 {
   2689     PRUint8 *        data;
   2690     SECStatus        rv;
   2691 
   2692     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
   2693     ssl_GetRecvBufLock(ss);
   2694 
   2695     data = ss->gs.buf.buf + ss->gs.recordOffset;
   2696     DUMP_MSG(29, (ss, data, ss->gs.recordLen));
   2697     if ((ss->gs.recordLen != 1 + SSL_CHALLENGE_BYTES) ||
   2698 	(data[0] != SSL_MT_SERVER_VERIFY) ||
   2699 	NSS_SecureMemcmp(data+1, ss->sec.ci.clientChallenge,
   2700 	                 SSL_CHALLENGE_BYTES)) {
   2701 	/* Bad server */
   2702 	PORT_SetError(SSL_ERROR_BAD_SERVER);
   2703 	goto loser;
   2704     }
   2705     ss->sec.ci.elements |= CIS_HAVE_VERIFY;
   2706 
   2707     SSL_TRC(5, ("%d: SSL[%d]: got server-verify, required=0x%d got=0x%x",
   2708 		SSL_GETPID(), ss->fd, ss->sec.ci.requiredElements,
   2709 		ss->sec.ci.elements));
   2710 
   2711     rv = ssl2_TryToFinish(ss);
   2712     if (rv)
   2713 	goto loser;
   2714 
   2715     ss->gs.recordLen = 0;
   2716     ssl_ReleaseRecvBufLock(ss);
   2717 
   2718     if (ss->handshake == 0) {
   2719 	return SECSuccess;
   2720     }
   2721     ss->handshake         = ssl_GatherRecord1stHandshake;
   2722     ss->nextHandshake     = ssl2_HandleMessage;
   2723     return SECSuccess;
   2724 
   2725 
   2726   loser:
   2727     ssl_ReleaseRecvBufLock(ss);
   2728     return SECFailure;
   2729 }
   2730 
   2731 /* Not static because ssl2_GatherData() tests ss->nextHandshake for this value.
   2732  * ICK!
   2733  * Called from ssl_Do1stHandshake after ssl2_BeginClientHandshake()
   2734  */
   2735 SECStatus
   2736 ssl2_HandleServerHelloMessage(sslSocket *ss)
   2737 {
   2738     sslSessionID *   sid;
   2739     PRUint8 *        cert;
   2740     PRUint8 *        cs;
   2741     PRUint8 *        data;
   2742     SECStatus        rv;
   2743     int              needed, sidHit, certLen, csLen, cidLen, certType, err;
   2744 
   2745     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
   2746 
   2747     if (!ss->opt.enableSSL2) {
   2748 	PORT_SetError(SSL_ERROR_SSL2_DISABLED);
   2749 	return SECFailure;
   2750     }
   2751 
   2752     ssl_GetRecvBufLock(ss);
   2753 
   2754     PORT_Assert(ss->sec.ci.sid != 0);
   2755     sid = ss->sec.ci.sid;
   2756 
   2757     data = ss->gs.buf.buf + ss->gs.recordOffset;
   2758     DUMP_MSG(29, (ss, data, ss->gs.recordLen));
   2759 
   2760     /* Make sure first message has some data and is the server hello message */
   2761     if ((ss->gs.recordLen < SSL_HL_SERVER_HELLO_HBYTES)
   2762 	|| (data[0] != SSL_MT_SERVER_HELLO)) {
   2763 	if ((data[0] == SSL_MT_ERROR) && (ss->gs.recordLen == 3)) {
   2764 	    err = (data[1] << 8) | data[2];
   2765 	    if (err == SSL_PE_NO_CYPHERS) {
   2766 		PORT_SetError(SSL_ERROR_NO_CYPHER_OVERLAP);
   2767 		goto loser;
   2768 	    }
   2769 	}
   2770 	goto bad_server;
   2771     }
   2772 
   2773     sidHit      = data[1];
   2774     certType    = data[2];
   2775     ss->version = (data[3] << 8) | data[4];
   2776     certLen     = (data[5] << 8) | data[6];
   2777     csLen       = (data[7] << 8) | data[8];
   2778     cidLen      = (data[9] << 8) | data[10];
   2779     cert        = data + SSL_HL_SERVER_HELLO_HBYTES;
   2780     cs          = cert + certLen;
   2781 
   2782     SSL_TRC(5,
   2783 	    ("%d: SSL[%d]: server-hello, hit=%d vers=%x certLen=%d csLen=%d cidLen=%d",
   2784 	     SSL_GETPID(), ss->fd, sidHit, ss->version, certLen,
   2785 	     csLen, cidLen));
   2786     if (ss->version != SSL_LIBRARY_VERSION_2) {
   2787         if (ss->version < SSL_LIBRARY_VERSION_2) {
   2788 	  SSL_TRC(3, ("%d: SSL[%d]: demoting self (%x) to server version (%x)",
   2789 		      SSL_GETPID(), ss->fd, SSL_LIBRARY_VERSION_2,
   2790 		      ss->version));
   2791 	} else {
   2792 	  SSL_TRC(1, ("%d: SSL[%d]: server version is %x (we are %x)",
   2793 		    SSL_GETPID(), ss->fd, ss->version, SSL_LIBRARY_VERSION_2));
   2794 	  /* server claims to be newer but does not follow protocol */
   2795 	  PORT_SetError(SSL_ERROR_UNSUPPORTED_VERSION);
   2796 	  goto loser;
   2797 	}
   2798     }
   2799 
   2800     if ((SSL_HL_SERVER_HELLO_HBYTES + certLen + csLen + cidLen
   2801                                                   > ss->gs.recordLen)
   2802 	|| (csLen % 3) != 0
   2803 	/* || cidLen < SSL_CONNECTIONID_BYTES || cidLen > 32  */
   2804 	) {
   2805 	goto bad_server;
   2806     }
   2807 
   2808     /* Save connection-id.
   2809     ** This code only saves the first 16 byte of the connectionID.
   2810     ** If the connectionID is shorter than 16 bytes, it is zero-padded.
   2811     */
   2812     if (cidLen < sizeof ss->sec.ci.connectionID)
   2813 	memset(ss->sec.ci.connectionID, 0, sizeof ss->sec.ci.connectionID);
   2814     cidLen = PR_MIN(cidLen, sizeof ss->sec.ci.connectionID);
   2815     PORT_Memcpy(ss->sec.ci.connectionID, cs + csLen, cidLen);
   2816 
   2817     /* See if session-id hit */
   2818     needed = CIS_HAVE_MASTER_KEY | CIS_HAVE_FINISHED | CIS_HAVE_VERIFY;
   2819     if (sidHit) {
   2820 	if (certLen || csLen) {
   2821 	    /* Uh oh - bogus server */
   2822 	    SSL_DBG(("%d: SSL[%d]: client, huh? hit=%d certLen=%d csLen=%d",
   2823 		     SSL_GETPID(), ss->fd, sidHit, certLen, csLen));
   2824 	    goto bad_server;
   2825 	}
   2826 
   2827 	/* Total winner. */
   2828 	SSL_TRC(1, ("%d: SSL[%d]: client, using nonce for peer=0x%08x "
   2829 		    "port=0x%04x",
   2830 		    SSL_GETPID(), ss->fd, ss->sec.ci.peer, ss->sec.ci.port));
   2831 	ss->sec.peerCert = CERT_DupCertificate(sid->peerCert);
   2832         ss->sec.authAlgorithm = sid->authAlgorithm;
   2833 	ss->sec.authKeyBits   = sid->authKeyBits;
   2834 	ss->sec.keaType       = sid->keaType;
   2835 	ss->sec.keaKeyBits    = sid->keaKeyBits;
   2836 	rv = ssl2_CreateSessionCypher(ss, sid, PR_TRUE);
   2837 	if (rv != SECSuccess) {
   2838 	    goto loser;
   2839 	}
   2840     } else {
   2841 	if (certType != SSL_CT_X509_CERTIFICATE) {
   2842 	    PORT_SetError(SSL_ERROR_UNSUPPORTED_CERTIFICATE_TYPE);
   2843 	    goto loser;
   2844 	}
   2845 	if (csLen == 0) {
   2846 	    PORT_SetError(SSL_ERROR_NO_CYPHER_OVERLAP);
   2847 	    SSL_DBG(("%d: SSL[%d]: no cipher overlap",
   2848 		     SSL_GETPID(), ss->fd));
   2849 	    goto loser;
   2850 	}
   2851 	if (certLen == 0) {
   2852 	    SSL_DBG(("%d: SSL[%d]: client, huh? certLen=%d csLen=%d",
   2853 		     SSL_GETPID(), ss->fd, certLen, csLen));
   2854 	    goto bad_server;
   2855 	}
   2856 
   2857 	if (sid->cached != never_cached) {
   2858 	    /* Forget our session-id - server didn't like it */
   2859 	    SSL_TRC(7, ("%d: SSL[%d]: server forgot me, uncaching session-id",
   2860 			SSL_GETPID(), ss->fd));
   2861 	    if (ss->sec.uncache)
   2862 		(*ss->sec.uncache)(sid);
   2863 	    ssl_FreeSID(sid);
   2864 	    ss->sec.ci.sid = sid = PORT_ZNew(sslSessionID);
   2865 	    if (!sid) {
   2866 		goto loser;
   2867 	    }
   2868 	    sid->references = 1;
   2869 	    sid->addr = ss->sec.ci.peer;
   2870 	    sid->port = ss->sec.ci.port;
   2871 	}
   2872 
   2873 	/* decode the server's certificate */
   2874 	rv = ssl2_ClientHandleServerCert(ss, cert, certLen);
   2875 	if (rv != SECSuccess) {
   2876 	    if (PORT_GetError() == SSL_ERROR_BAD_CERTIFICATE) {
   2877 		(void) ssl2_SendErrorMessage(ss, SSL_PE_BAD_CERTIFICATE);
   2878 	    }
   2879 	    goto loser;
   2880 	}
   2881 
   2882 	/* Setup new session cipher */
   2883 	rv = ssl2_ClientSetupSessionCypher(ss, cs, csLen);
   2884 	if (rv != SECSuccess) {
   2885 	    if (PORT_GetError() == SSL_ERROR_BAD_CERTIFICATE) {
   2886 		(void) ssl2_SendErrorMessage(ss, SSL_PE_BAD_CERTIFICATE);
   2887 	    }
   2888 	    goto loser;
   2889 	}
   2890     }
   2891 
   2892     /* Build up final list of required elements */
   2893     ss->sec.ci.elements         = CIS_HAVE_MASTER_KEY;
   2894     ss->sec.ci.requiredElements = needed;
   2895 
   2896   if (!sidHit) {
   2897     /* verify the server's certificate. if sidHit, don't check signatures */
   2898     rv = (* ss->authCertificate)(ss->authCertificateArg, ss->fd,
   2899 				 (PRBool)(!sidHit), PR_FALSE);
   2900     if (rv) {
   2901 	if (ss->handleBadCert) {
   2902 	    rv = (*ss->handleBadCert)(ss->badCertArg, ss->fd);
   2903 	    if ( rv ) {
   2904 		if ( rv == SECWouldBlock ) {
   2905 		    SSL_DBG(("%d: SSL[%d]: SSL2 bad cert handler returned "
   2906 			     "SECWouldBlock", SSL_GETPID(), ss->fd));
   2907 		    PORT_SetError(SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_SSL2);
   2908 		    rv = SECFailure;
   2909 		} else {
   2910 		    /* cert is bad */
   2911 		    SSL_DBG(("%d: SSL[%d]: server certificate is no good: error=%d",
   2912 			     SSL_GETPID(), ss->fd, PORT_GetError()));
   2913 		}
   2914 		goto loser;
   2915 	    }
   2916 	    /* cert is good */
   2917 	} else {
   2918 	    SSL_DBG(("%d: SSL[%d]: server certificate is no good: error=%d",
   2919 		     SSL_GETPID(), ss->fd, PORT_GetError()));
   2920 	    goto loser;
   2921 	}
   2922     }
   2923   }
   2924     /*
   2925     ** At this point we have a completed session key and our session
   2926     ** cipher is setup and ready to go. Switch to encrypted write routine
   2927     ** as all future message data is to be encrypted.
   2928     */
   2929     ssl2_UseEncryptedSendFunc(ss);
   2930 
   2931     rv = ssl2_TryToFinish(ss);
   2932     if (rv != SECSuccess)
   2933 	goto loser;
   2934 
   2935     ss->gs.recordLen = 0;
   2936 
   2937     ssl_ReleaseRecvBufLock(ss);
   2938 
   2939     if (ss->handshake == 0) {
   2940 	return SECSuccess;
   2941     }
   2942 
   2943     SSL_TRC(5, ("%d: SSL[%d]: got server-hello, required=0x%d got=0x%x",
   2944 		SSL_GETPID(), ss->fd, ss->sec.ci.requiredElements,
   2945 		ss->sec.ci.elements));
   2946     ss->handshake     = ssl_GatherRecord1stHandshake;
   2947     ss->nextHandshake = ssl2_HandleVerifyMessage;
   2948     return SECSuccess;
   2949 
   2950   bad_server:
   2951     PORT_SetError(SSL_ERROR_BAD_SERVER);
   2952     /* FALL THROUGH */
   2953 
   2954   loser:
   2955     ssl_ReleaseRecvBufLock(ss);
   2956     return SECFailure;
   2957 }
   2958 
   2959 /* Sends out the initial client Hello message on the connection.
   2960  * Acquires and releases the socket's xmitBufLock.
   2961  */
   2962 SECStatus
   2963 ssl2_BeginClientHandshake(sslSocket *ss)
   2964 {
   2965     sslSessionID      *sid;
   2966     PRUint8           *msg;
   2967     PRUint8           *cp;
   2968     PRUint8           *localCipherSpecs = NULL;
   2969     unsigned int      localCipherSize;
   2970     unsigned int      i;
   2971     int               sendLen, sidLen = 0;
   2972     SECStatus         rv;
   2973     TLSExtensionData  *xtnData;
   2974 
   2975     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
   2976 
   2977     ss->sec.isServer     = 0;
   2978     ss->sec.sendSequence = 0;
   2979     ss->sec.rcvSequence  = 0;
   2980     ssl_ChooseSessionIDProcs(&ss->sec);
   2981 
   2982     if (!ss->cipherSpecs) {
   2983 	rv = ssl2_ConstructCipherSpecs(ss);
   2984 	if (rv != SECSuccess)
   2985 	    goto loser;
   2986     }
   2987 
   2988     /* count the SSL2 and SSL3 enabled ciphers.
   2989      * if either is zero, clear the socket's enable for that protocol.
   2990      */
   2991     rv = ssl2_CheckConfigSanity(ss);
   2992     if (rv != SECSuccess)
   2993 	goto loser;
   2994 
   2995     /* Get peer name of server */
   2996     rv = ssl_GetPeerInfo(ss);
   2997     if (rv < 0) {
   2998 #ifdef HPUX11
   2999         /*
   3000          * On some HP-UX B.11.00 systems, getpeername() occasionally
   3001          * fails with ENOTCONN after a successful completion of
   3002          * non-blocking connect.  I found that if we do a write()
   3003          * and then retry getpeername(), it will work.
   3004          */
   3005         if (PR_GetError() == PR_NOT_CONNECTED_ERROR) {
   3006             char dummy;
   3007             (void) PR_Write(ss->fd->lower, &dummy, 0);
   3008             rv = ssl_GetPeerInfo(ss);
   3009             if (rv < 0) {
   3010                 goto loser;
   3011             }
   3012         }
   3013 #else
   3014 	goto loser;
   3015 #endif
   3016     }
   3017 
   3018     SSL_TRC(3, ("%d: SSL[%d]: sending client-hello", SSL_GETPID(), ss->fd));
   3019 
   3020     /* Try to find server in our session-id cache */
   3021     if (ss->opt.noCache) {
   3022 	sid = NULL;
   3023     } else {
   3024 	sid = ssl_LookupSID(&ss->sec.ci.peer, ss->sec.ci.port, ss->peerID,
   3025 	                    ss->url);
   3026     }
   3027     while (sid) {  /* this isn't really a loop */
   3028 	PRBool sidVersionEnabled =
   3029 	    (!SSL3_ALL_VERSIONS_DISABLED(&ss->vrange) &&
   3030 	     sid->version >= ss->vrange.min &&
   3031 	     sid->version <= ss->vrange.max) ||
   3032 	    (sid->version < SSL_LIBRARY_VERSION_3_0 && ss->opt.enableSSL2);
   3033 
   3034 	/* if we're not doing this SID's protocol any more, drop it. */
   3035 	if (!sidVersionEnabled) {
   3036 	    if (ss->sec.uncache)
   3037 		ss->sec.uncache(sid);
   3038 	    ssl_FreeSID(sid);
   3039 	    sid = NULL;
   3040 	    break;
   3041 	}
   3042 	if (sid->version < SSL_LIBRARY_VERSION_3_0) {
   3043 	    /* If the cipher in this sid is not enabled, drop it. */
   3044 	    for (i = 0; i < ss->sizeCipherSpecs; i += 3) {
   3045 		if (ss->cipherSpecs[i] == sid->u.ssl2.cipherType)
   3046 		    break;
   3047 	    }
   3048 	    if (i >= ss->sizeCipherSpecs) {
   3049 		if (ss->sec.uncache)
   3050 		    ss->sec.uncache(sid);
   3051 		ssl_FreeSID(sid);
   3052 		sid = NULL;
   3053 		break;
   3054 	    }
   3055 	}
   3056 	sidLen = sizeof(sid->u.ssl2.sessionID);
   3057 	PRINT_BUF(4, (ss, "client, found session-id:", sid->u.ssl2.sessionID,
   3058 		      sidLen));
   3059 	ss->version = sid->version;
   3060 	PORT_Assert(!ss->sec.localCert);
   3061 	if (ss->sec.localCert) {
   3062 	    CERT_DestroyCertificate(ss->sec.localCert);
   3063 	}
   3064 	ss->sec.localCert     = CERT_DupCertificate(sid->localCert);
   3065 	break;  /* this isn't really a loop */
   3066     }
   3067     if (!sid) {
   3068 	sidLen = 0;
   3069 	sid = PORT_ZNew(sslSessionID);
   3070 	if (!sid) {
   3071 	    goto loser;
   3072 	}
   3073 	sid->references = 1;
   3074 	sid->cached     = never_cached;
   3075 	sid->addr       = ss->sec.ci.peer;
   3076 	sid->port       = ss->sec.ci.port;
   3077 	if (ss->peerID != NULL) {
   3078 	    sid->peerID = PORT_Strdup(ss->peerID);
   3079 	}
   3080 	if (ss->url != NULL) {
   3081 	    sid->urlSvrName = PORT_Strdup(ss->url);
   3082 	}
   3083     }
   3084     ss->sec.ci.sid = sid;
   3085 
   3086     PORT_Assert(sid != NULL);
   3087 
   3088     if ((sid->version >= SSL_LIBRARY_VERSION_3_0 || !ss->opt.v2CompatibleHello) &&
   3089 	!SSL3_ALL_VERSIONS_DISABLED(&ss->vrange)) {
   3090 	ss->gs.state      = GS_INIT;
   3091 	ss->handshake     = ssl_GatherRecord1stHandshake;
   3092 
   3093 	/* ssl3_SendClientHello will override this if it succeeds. */
   3094 	ss->version       = SSL_LIBRARY_VERSION_3_0;
   3095 
   3096 	ssl_GetSSL3HandshakeLock(ss);
   3097 	ssl_GetXmitBufLock(ss);
   3098 	rv =  ssl3_SendClientHello(ss, PR_FALSE);
   3099 	ssl_ReleaseXmitBufLock(ss);
   3100 	ssl_ReleaseSSL3HandshakeLock(ss);
   3101 
   3102 	return rv;
   3103     }
   3104 #if defined(NSS_ENABLE_ECC)
   3105     /* ensure we don't neogtiate ECC cipher suites with SSL2 hello */
   3106     ssl3_DisableECCSuites(ss, NULL); /* disable all ECC suites */
   3107     if (ss->cipherSpecs != NULL) {
   3108 	PORT_Free(ss->cipherSpecs);
   3109 	ss->cipherSpecs     = NULL;
   3110 	ss->sizeCipherSpecs = 0;
   3111     }
   3112 #endif
   3113 
   3114     if (!ss->cipherSpecs) {
   3115         rv = ssl2_ConstructCipherSpecs(ss);
   3116 	if (rv < 0) {
   3117 	    return rv;
   3118     	}
   3119     }
   3120     localCipherSpecs = ss->cipherSpecs;
   3121     localCipherSize  = ss->sizeCipherSpecs;
   3122 
   3123     /* Add 3 for SCSV */
   3124     sendLen = SSL_HL_CLIENT_HELLO_HBYTES + localCipherSize + 3 + sidLen +
   3125 	SSL_CHALLENGE_BYTES;
   3126 
   3127     /* Generate challenge bytes for server */
   3128     PK11_GenerateRandom(ss->sec.ci.clientChallenge, SSL_CHALLENGE_BYTES);
   3129 
   3130     ssl_GetXmitBufLock(ss);    /***************************************/
   3131 
   3132     rv = ssl2_GetSendBuffer(ss, sendLen);
   3133     if (rv)
   3134     	goto unlock_loser;
   3135 
   3136     /* Construct client-hello message */
   3137     cp = msg = ss->sec.ci.sendBuf.buf;
   3138     msg[0] = SSL_MT_CLIENT_HELLO;
   3139     ss->clientHelloVersion = SSL3_ALL_VERSIONS_DISABLED(&ss->vrange) ?
   3140 	SSL_LIBRARY_VERSION_2 : ss->vrange.max;
   3141 
   3142     msg[1] = MSB(ss->clientHelloVersion);
   3143     msg[2] = LSB(ss->clientHelloVersion);
   3144     /* Add 3 for SCSV */
   3145     msg[3] = MSB(localCipherSize + 3);
   3146     msg[4] = LSB(localCipherSize + 3);
   3147     msg[5] = MSB(sidLen);
   3148     msg[6] = LSB(sidLen);
   3149     msg[7] = MSB(SSL_CHALLENGE_BYTES);
   3150     msg[8] = LSB(SSL_CHALLENGE_BYTES);
   3151     cp += SSL_HL_CLIENT_HELLO_HBYTES;
   3152     PORT_Memcpy(cp, localCipherSpecs, localCipherSize);
   3153     cp += localCipherSize;
   3154     /*
   3155      * Add SCSV.  SSL 2.0 cipher suites are listed before SSL 3.0 cipher
   3156      * suites in localCipherSpecs for compatibility with SSL 2.0 servers.
   3157      * Since SCSV looks like an SSL 3.0 cipher suite, we can't add it at
   3158      * the beginning.
   3159      */
   3160     cp[0] = 0x00;
   3161     cp[1] = 0x00;
   3162     cp[2] = 0xff;
   3163     cp += 3;
   3164     if (sidLen) {
   3165 	PORT_Memcpy(cp, sid->u.ssl2.sessionID, sidLen);
   3166 	cp += sidLen;
   3167     }
   3168     PORT_Memcpy(cp, ss->sec.ci.clientChallenge, SSL_CHALLENGE_BYTES);
   3169 
   3170     /* Send it to the server */
   3171     DUMP_MSG(29, (ss, msg, sendLen));
   3172     ss->handshakeBegun = 1;
   3173     rv = (*ss->sec.send)(ss, msg, sendLen, 0);
   3174 
   3175     ssl_ReleaseXmitBufLock(ss);    /***************************************/
   3176 
   3177     if (rv < 0) {
   3178 	goto loser;
   3179     }
   3180 
   3181     rv = ssl3_StartHandshakeHash(ss, msg, sendLen);
   3182     if (rv < 0) {
   3183 	goto loser;
   3184     }
   3185 
   3186     /*
   3187      * Since we sent the SCSV, pretend we sent empty RI extension.  We need
   3188      * to record the extension has been advertised after ssl3_InitState has
   3189      * been called, which ssl3_StartHandshakeHash took care for us above.
   3190      */
   3191     xtnData = &ss->xtnData;
   3192     xtnData->advertised[xtnData->numAdvertised++] = ssl_renegotiation_info_xtn;
   3193 
   3194     /* Setup to receive servers hello message */
   3195     ssl_GetRecvBufLock(ss);
   3196     ss->gs.recordLen = 0;
   3197     ssl_ReleaseRecvBufLock(ss);
   3198 
   3199     ss->handshake     = ssl_GatherRecord1stHandshake;
   3200     ss->nextHandshake = ssl2_HandleServerHelloMessage;
   3201     return SECSuccess;
   3202 
   3203 unlock_loser:
   3204     ssl_ReleaseXmitBufLock(ss);
   3205 loser:
   3206     return SECFailure;
   3207 }
   3208 
   3209 /************************************************************************/
   3210 
   3211 /* Handle the CLIENT-MASTER-KEY message.
   3212 ** Acquires and releases RecvBufLock.
   3213 ** Called from ssl2_HandleClientHelloMessage().
   3214 */
   3215 static SECStatus
   3216 ssl2_HandleClientSessionKeyMessage(sslSocket *ss)
   3217 {
   3218     PRUint8 *        data;
   3219     unsigned int     caLen;
   3220     unsigned int     ckLen;
   3221     unsigned int     ekLen;
   3222     unsigned int     keyBits;
   3223     int              cipher;
   3224     SECStatus        rv;
   3225 
   3226 
   3227     ssl_GetRecvBufLock(ss);
   3228 
   3229     data = ss->gs.buf.buf + ss->gs.recordOffset;
   3230     DUMP_MSG(29, (ss, data, ss->gs.recordLen));
   3231 
   3232     if ((ss->gs.recordLen < SSL_HL_CLIENT_MASTER_KEY_HBYTES)
   3233 	|| (data[0] != SSL_MT_CLIENT_MASTER_KEY)) {
   3234 	goto bad_client;
   3235     }
   3236     cipher  = data[1];
   3237     keyBits = (data[2] << 8) | data[3];
   3238     ckLen   = (data[4] << 8) | data[5];
   3239     ekLen   = (data[6] << 8) | data[7];
   3240     caLen   = (data[8] << 8) | data[9];
   3241 
   3242     SSL_TRC(5, ("%d: SSL[%d]: session-key, cipher=%d keyBits=%d ckLen=%d ekLen=%d caLen=%d",
   3243 		SSL_GETPID(), ss->fd, cipher, keyBits, ckLen, ekLen, caLen));
   3244 
   3245     if (ss->gs.recordLen <
   3246     	    SSL_HL_CLIENT_MASTER_KEY_HBYTES + ckLen + ekLen + caLen) {
   3247 	SSL_DBG(("%d: SSL[%d]: protocol size mismatch dataLen=%d",
   3248 		 SSL_GETPID(), ss->fd, ss->gs.recordLen));
   3249 	goto bad_client;
   3250     }
   3251 
   3252     /* Use info from client to setup session key */
   3253     rv = ssl2_ServerSetupSessionCypher(ss, cipher, keyBits,
   3254 		data + SSL_HL_CLIENT_MASTER_KEY_HBYTES,                 ckLen,
   3255 		data + SSL_HL_CLIENT_MASTER_KEY_HBYTES + ckLen,         ekLen,
   3256 		data + SSL_HL_CLIENT_MASTER_KEY_HBYTES + ckLen + ekLen, caLen);
   3257     ss->gs.recordLen = 0;	/* we're done with this record. */
   3258 
   3259     ssl_ReleaseRecvBufLock(ss);
   3260 
   3261     if (rv != SECSuccess) {
   3262 	goto loser;
   3263     }
   3264     ss->sec.ci.elements |= CIS_HAVE_MASTER_KEY;
   3265     ssl2_UseEncryptedSendFunc(ss);
   3266 
   3267     /* Send server verify message now that keys are established */
   3268     rv = ssl2_SendServerVerifyMessage(ss);
   3269     if (rv != SECSuccess)
   3270 	goto loser;
   3271 
   3272     rv = ssl2_TryToFinish(ss);
   3273     if (rv != SECSuccess)
   3274 	goto loser;
   3275     if (ss->handshake == 0) {
   3276 	return SECSuccess;
   3277     }
   3278 
   3279     SSL_TRC(5, ("%d: SSL[%d]: server: waiting for elements=0x%d",
   3280 		SSL_GETPID(), ss->fd,
   3281 		ss->sec.ci.requiredElements ^ ss->sec.ci.elements));
   3282     ss->handshake         = ssl_GatherRecord1stHandshake;
   3283     ss->nextHandshake     = ssl2_HandleMessage;
   3284 
   3285     return ssl2_TriggerNextMessage(ss);
   3286 
   3287 bad_client:
   3288     ssl_ReleaseRecvBufLock(ss);
   3289     PORT_SetError(SSL_ERROR_BAD_CLIENT);
   3290     /* FALLTHROUGH */
   3291 
   3292 loser:
   3293     return SECFailure;
   3294 }
   3295 
   3296 /*
   3297 ** Handle the initial hello message from the client
   3298 **
   3299 ** not static because ssl2_GatherData() tests ss->nextHandshake for this value.
   3300 */
   3301 SECStatus
   3302 ssl2_HandleClientHelloMessage(sslSocket *ss)
   3303 {
   3304     sslSessionID    *sid;
   3305     sslServerCerts * sc;
   3306     CERTCertificate *serverCert;
   3307     PRUint8         *msg;
   3308     PRUint8         *data;
   3309     PRUint8         *cs;
   3310     PRUint8         *sd;
   3311     PRUint8         *cert = NULL;
   3312     PRUint8         *challenge;
   3313     unsigned int    challengeLen;
   3314     SECStatus       rv;
   3315     int             csLen;
   3316     int             sendLen;
   3317     int             sdLen;
   3318     int             certLen;
   3319     int             pid;
   3320     int             sent;
   3321     int             gotXmitBufLock = 0;
   3322 #if defined(SOLARIS) && defined(i386)
   3323     volatile PRUint8 hit;
   3324 #else
   3325     int             hit;
   3326 #endif
   3327     PRUint8         csImpl[sizeof implementedCipherSuites];
   3328 
   3329     PORT_Assert( ss->opt.noLocks || ssl_Have1stHandshakeLock(ss) );
   3330 
   3331     sc = ss->serverCerts + kt_rsa;
   3332     serverCert = sc->serverCert;
   3333 
   3334     ssl_GetRecvBufLock(ss);
   3335 
   3336 
   3337     data = ss->gs.buf.buf + ss->gs.recordOffset;
   3338     DUMP_MSG(29, (ss, data, ss->gs.recordLen));
   3339 
   3340     /* Make sure first message has some data and is the client hello message */
   3341     if ((ss->gs.recordLen < SSL_HL_CLIENT_HELLO_HBYTES)
   3342 	|| (data[0] != SSL_MT_CLIENT_HELLO)) {
   3343 	goto bad_client;
   3344     }
   3345 
   3346     /* Get peer name of client */
   3347     rv = ssl_GetPeerInfo(ss);
   3348     if (rv != SECSuccess) {
   3349 	goto loser;
   3350     }
   3351 
   3352     /* Examine version information */
   3353     /*
   3354      * See if this might be a V2 client hello asking to use the V3 protocol
   3355      */
   3356     if ((data[0] == SSL_MT_CLIENT_HELLO) &&
   3357         (data[1] >= MSB(SSL_LIBRARY_VERSION_3_0)) &&
   3358 	!SSL3_ALL_VERSIONS_DISABLED(&ss->vrange)) {
   3359 	rv = ssl3_HandleV2ClientHello(ss, data, ss->gs.recordLen);
   3360 	if (rv != SECFailure) { /* Success */
   3361 	    ss->handshake             = NULL;
   3362 	    ss->nextHandshake         = ssl_GatherRecord1stHandshake;
   3363 	    ss->securityHandshake     = NULL;
   3364 	    ss->gs.state              = GS_INIT;
   3365 
   3366 	    /* ssl3_HandleV3ClientHello has set ss->version,
   3367 	    ** and has gotten us a brand new sid.
   3368 	    */
   3369 	    ss->sec.ci.sid->version  = ss->version;
   3370 	}
   3371 	ssl_ReleaseRecvBufLock(ss);
   3372 	return rv;
   3373     }
   3374     /* Previously, there was a test here to see if SSL2 was enabled.
   3375     ** If not, an error code was set, and SECFailure was returned,
   3376     ** without sending any error code to the other end of the connection.
   3377     ** That test has been removed.  If SSL2 has been disabled, there
   3378     ** should be no SSL2 ciphers enabled, and consequently, the code
   3379     ** below should send the ssl2 error message SSL_PE_NO_CYPHERS.
   3380     ** We now believe this is the correct thing to do, even when SSL2
   3381     ** has been explicitly disabled by the application.
   3382     */
   3383 
   3384     /* Extract info from message */
   3385     ss->version = (data[1] << 8) | data[2];
   3386 
   3387     /* If some client thinks ssl v2 is 2.0 instead of 0.2, we'll allow it.  */
   3388     if (ss->version >= SSL_LIBRARY_VERSION_3_0) {
   3389 	ss->version = SSL_LIBRARY_VERSION_2;
   3390     }
   3391 
   3392     csLen        = (data[3] << 8) | data[4];
   3393     sdLen        = (data[5] << 8) | data[6];
   3394     challengeLen = (data[7] << 8) | data[8];
   3395     cs           = data + SSL_HL_CLIENT_HELLO_HBYTES;
   3396     sd           = cs + csLen;
   3397     challenge    = sd + sdLen;
   3398     PRINT_BUF(7, (ss, "server, client session-id value:", sd, sdLen));
   3399 
   3400     if (!csLen || (csLen % 3) != 0 ||
   3401         (sdLen != 0 && sdLen != SSL2_SESSIONID_BYTES) ||
   3402 	challengeLen < SSL_MIN_CHALLENGE_BYTES ||
   3403 	challengeLen > SSL_MAX_CHALLENGE_BYTES ||
   3404         (unsigned)ss->gs.recordLen !=
   3405             SSL_HL_CLIENT_HELLO_HBYTES + csLen + sdLen + challengeLen) {
   3406 	SSL_DBG(("%d: SSL[%d]: bad client hello message, len=%d should=%d",
   3407 		 SSL_GETPID(), ss->fd, ss->gs.recordLen,
   3408 		 SSL_HL_CLIENT_HELLO_HBYTES+csLen+sdLen+challengeLen));
   3409 	goto bad_client;
   3410     }
   3411 
   3412     SSL_TRC(3, ("%d: SSL[%d]: client version is %x",
   3413 		SSL_GETPID(), ss->fd, ss->version));
   3414     if (ss->version != SSL_LIBRARY_VERSION_2) {
   3415 	if (ss->version > SSL_LIBRARY_VERSION_2) {
   3416 	    /*
   3417 	    ** Newer client than us. Things are ok because new clients
   3418 	    ** are required to be backwards compatible with old servers.
   3419 	    ** Change version number to our version number so that client
   3420 	    ** knows whats up.
   3421 	    */
   3422 	    ss->version = SSL_LIBRARY_VERSION_2;
   3423 	} else {
   3424 	    SSL_TRC(1, ("%d: SSL[%d]: client version is %x (we are %x)",
   3425 		SSL_GETPID(), ss->fd, ss->version, SSL_LIBRARY_VERSION_2));
   3426 	    PORT_SetError(SSL_ERROR_UNSUPPORTED_VERSION);
   3427 	    goto loser;
   3428 	}
   3429     }
   3430 
   3431     /* Qualify cipher specs before returning them to client */
   3432     csLen = ssl2_QualifyCypherSpecs(ss, cs, csLen);
   3433     if (csLen == 0) {
   3434 	/* no overlap, send client our list of supported SSL v2 ciphers. */
   3435         cs    = csImpl;
   3436 	csLen = sizeof implementedCipherSuites;
   3437     	PORT_Memcpy(cs, implementedCipherSuites, csLen);
   3438 	csLen = ssl2_QualifyCypherSpecs(ss, cs, csLen);
   3439 	if (csLen == 0) {
   3440 	  /* We don't support any SSL v2 ciphers! */
   3441 	  ssl2_SendErrorMessage(ss, SSL_PE_NO_CYPHERS);
   3442 	  PORT_SetError(SSL_ERROR_NO_CYPHER_OVERLAP);
   3443 	  goto loser;
   3444 	}
   3445 	/* Since this handhsake is going to fail, don't cache it. */
   3446 	ss->opt.noCache = 1;
   3447     }
   3448 
   3449     /* Squirrel away the challenge for later */
   3450     PORT_Memcpy(ss->sec.ci.clientChallenge, challenge, challengeLen);
   3451 
   3452     /* Examine message and see if session-id is good */
   3453     ss->sec.ci.elements = 0;
   3454     if (sdLen > 0 && !ss->opt.noCache) {
   3455 	SSL_TRC(7, ("%d: SSL[%d]: server, lookup client session-id for 0x%08x%08x%08x%08x",
   3456 		    SSL_GETPID(), ss->fd, ss->sec.ci.peer.pr_s6_addr32[0],
   3457 		    ss->sec.ci.peer.pr_s6_addr32[1],
   3458 		    ss->sec.ci.peer.pr_s6_addr32[2],
   3459 		    ss->sec.ci.peer.pr_s6_addr32[3]));
   3460 	sid = (*ssl_sid_lookup)(&ss->sec.ci.peer, sd, sdLen, ss->dbHandle);
   3461     } else {
   3462 	sid = NULL;
   3463     }
   3464     if (sid) {
   3465 	/* Got a good session-id. Short cut! */
   3466 	SSL_TRC(1, ("%d: SSL[%d]: server, using session-id for 0x%08x (age=%d)",
   3467 		    SSL_GETPID(), ss->fd, ss->sec.ci.peer,
   3468 		    ssl_Time() - sid->creationTime));
   3469 	PRINT_BUF(1, (ss, "session-id value:", sd, sdLen));
   3470 	ss->sec.ci.sid = sid;
   3471 	ss->sec.ci.elements = CIS_HAVE_MASTER_KEY;
   3472 	hit = 1;
   3473 	certLen = 0;
   3474 	csLen = 0;
   3475 
   3476         ss->sec.authAlgorithm = sid->authAlgorithm;
   3477 	ss->sec.authKeyBits   = sid->authKeyBits;
   3478 	ss->sec.keaType       = sid->keaType;
   3479 	ss->sec.keaKeyBits    = sid->keaKeyBits;
   3480 
   3481 	rv = ssl2_CreateSessionCypher(ss, sid, PR_FALSE);
   3482 	if (rv != SECSuccess) {
   3483 	    goto loser;
   3484 	}
   3485     } else {
   3486 	SECItem * derCert   = &serverCert->derCert;
   3487 
   3488 	SSL_TRC(7, ("%d: SSL[%d]: server, lookup nonce missed",
   3489 		    SSL_GETPID(), ss->fd));
   3490 	if (!serverCert) {
   3491 	    SET_ERROR_CODE
   3492 	    goto loser;
   3493 	}
   3494 	hit = 0;
   3495 	sid = PORT_ZNew(sslSessionID);
   3496 	if (!sid) {
   3497 	    goto loser;
   3498 	}
   3499 	sid->references = 1;
   3500 	sid->addr = ss->sec.ci.peer;
   3501 	sid->port = ss->sec.ci.port;
   3502 
   3503 	/* Invent a session-id */
   3504 	ss->sec.ci.sid = sid;
   3505 	PK11_GenerateRandom(sid->u.ssl2.sessionID+2, SSL2_SESSIONID_BYTES-2);
   3506 
   3507 	pid = SSL_GETPID();
   3508 	sid->u.ssl2.sessionID[0] = MSB(pid);
   3509 	sid->u.ssl2.sessionID[1] = LSB(pid);
   3510 	cert    = derCert->data;
   3511 	certLen = derCert->len;
   3512 
   3513 	/* pretend that server sids remember the local cert. */
   3514 	PORT_Assert(!sid->localCert);
   3515 	if (sid->localCert) {
   3516 	    CERT_DestroyCertificate(sid->localCert);
   3517 	}
   3518 	sid->localCert     = CERT_DupCertificate(serverCert);
   3519 
   3520 	ss->sec.authAlgorithm = ssl_sign_rsa;
   3521 	ss->sec.keaType       = ssl_kea_rsa;
   3522 	ss->sec.keaKeyBits    = \
   3523 	ss->sec.authKeyBits   = ss->serverCerts[kt_rsa].serverKeyBits;
   3524     }
   3525 
   3526     /* server sids don't remember the local cert, so whether we found
   3527     ** a sid or not, just "remember" we used the rsa server cert.
   3528     */
   3529     if (ss->sec.localCert) {
   3530 	CERT_DestroyCertificate(ss->sec.localCert);
   3531     }
   3532     ss->sec.localCert     = CERT_DupCertificate(serverCert);
   3533 
   3534     /* Build up final list of required elements */
   3535     ss->sec.ci.requiredElements = CIS_HAVE_MASTER_KEY | CIS_HAVE_FINISHED;
   3536     if (ss->opt.requestCertificate) {
   3537 	ss->sec.ci.requiredElements |= CIS_HAVE_CERTIFICATE;
   3538     }
   3539     ss->sec.ci.sentElements = 0;
   3540 
   3541     /* Send hello message back to client */
   3542     sendLen = SSL_HL_SERVER_HELLO_HBYTES + certLen + csLen
   3543 	    + SSL_CONNECTIONID_BYTES;
   3544 
   3545     ssl_GetXmitBufLock(ss); gotXmitBufLock = 1;
   3546     rv = ssl2_GetSendBuffer(ss, sendLen);
   3547     if (rv != SECSuccess) {
   3548 	goto loser;
   3549     }
   3550 
   3551     SSL_TRC(3, ("%d: SSL[%d]: sending server-hello (%d)",
   3552 		SSL_GETPID(), ss->fd, sendLen));
   3553 
   3554     msg = ss->sec.ci.sendBuf.buf;
   3555     msg[0] = SSL_MT_SERVER_HELLO;
   3556     msg[1] = hit;
   3557     msg[2] = SSL_CT_X509_CERTIFICATE;
   3558     msg[3] = MSB(ss->version);
   3559     msg[4] = LSB(ss->version);
   3560     msg[5] = MSB(certLen);
   3561     msg[6] = LSB(certLen);
   3562     msg[7] = MSB(csLen);
   3563     msg[8] = LSB(csLen);
   3564     msg[9] = MSB(SSL_CONNECTIONID_BYTES);
   3565     msg[10] = LSB(SSL_CONNECTIONID_BYTES);
   3566     if (certLen) {
   3567 	PORT_Memcpy(msg+SSL_HL_SERVER_HELLO_HBYTES, cert, certLen);
   3568     }
   3569     if (csLen) {
   3570 	PORT_Memcpy(msg+SSL_HL_SERVER_HELLO_HBYTES+certLen, cs, csLen);
   3571     }
   3572     PORT_Memcpy(msg+SSL_HL_SERVER_HELLO_HBYTES+certLen+csLen,
   3573                 ss->sec.ci.connectionID, SSL_CONNECTIONID_BYTES);
   3574 
   3575     DUMP_MSG(29, (ss, msg, sendLen));
   3576 
   3577     ss->handshakeBegun = 1;
   3578     sent = (*ss->sec.send)(ss, msg, sendLen, 0);
   3579     if (sent < 0) {
   3580 	goto loser;
   3581     }
   3582     ssl_ReleaseXmitBufLock(ss); gotXmitBufLock = 0;
   3583 
   3584     ss->gs.recordLen = 0;
   3585     ss->handshake = ssl_GatherRecord1stHandshake;
   3586     if (hit) {
   3587 	/* Old SID Session key is good. Go encrypted */
   3588 	ssl2_UseEncryptedSendFunc(ss);
   3589 
   3590 	/* Send server verify message now that keys are established */
   3591 	rv = ssl2_SendServerVerifyMessage(ss);
   3592 	if (rv != SECSuccess)
   3593 	    goto loser;
   3594 
   3595 	ss->nextHandshake = ssl2_HandleMessage;
   3596 	ssl_ReleaseRecvBufLock(ss);
   3597 	rv = ssl2_TriggerNextMessage(ss);
   3598 	return rv;
   3599     }
   3600     ss->nextHandshake = ssl2_HandleClientSessionKeyMessage;
   3601     ssl_ReleaseRecvBufLock(ss);
   3602     return SECSuccess;
   3603 
   3604   bad_client:
   3605     PORT_SetError(SSL_ERROR_BAD_CLIENT);
   3606     /* FALLTHROUGH */
   3607 
   3608   loser:
   3609     if (gotXmitBufLock) {
   3610     	ssl_ReleaseXmitBufLock(ss); gotXmitBufLock = 0;
   3611     }
   3612     SSL_TRC(10, ("%d: SSL[%d]: server, wait for client-hello lossage",
   3613 		 SSL_GETPID(), ss->fd));
   3614     ssl_ReleaseRecvBufLock(ss);
   3615     return SECFailure;
   3616 }
   3617 
   3618 SECStatus
   3619 ssl2_BeginServerHandshake(sslSocket *ss)
   3620 {
   3621     SECStatus        rv;
   3622     sslServerCerts * rsaAuth = ss->serverCerts + kt_rsa;
   3623 
   3624     ss->sec.isServer = 1;
   3625     ssl_ChooseSessionIDProcs(&ss->sec);
   3626     ss->sec.sendSequence = 0;
   3627     ss->sec.rcvSequence = 0;
   3628 
   3629     /* don't turn on SSL2 if we don't have an RSA key and cert */
   3630     if (!rsaAuth->serverKeyPair || !rsaAuth->SERVERKEY ||
   3631         !rsaAuth->serverCert) {
   3632 	ss->opt.enableSSL2 = PR_FALSE;
   3633     }
   3634 
   3635     if (!ss->cipherSpecs) {
   3636 	rv = ssl2_ConstructCipherSpecs(ss);
   3637 	if (rv != SECSuccess)
   3638 	    goto loser;
   3639     }
   3640 
   3641     /* count the SSL2 and SSL3 enabled ciphers.
   3642      * if either is zero, clear the socket's enable for that protocol.
   3643      */
   3644     rv = ssl2_CheckConfigSanity(ss);
   3645     if (rv != SECSuccess)
   3646 	goto loser;
   3647 
   3648     /*
   3649     ** Generate connection-id. Always do this, even if things fail
   3650     ** immediately. This way the random number generator is always
   3651     ** rolling around, every time we get a connection.
   3652     */
   3653     PK11_GenerateRandom(ss->sec.ci.connectionID,
   3654                         sizeof(ss->sec.ci.connectionID));
   3655 
   3656     ss->gs.recordLen = 0;
   3657     ss->handshake     = ssl_GatherRecord1stHandshake;
   3658     ss->nextHandshake = ssl2_HandleClientHelloMessage;
   3659     return SECSuccess;
   3660 
   3661 loser:
   3662     return SECFailure;
   3663 }
   3664 
   3665 /* This function doesn't really belong in this file.
   3666 ** It's here to keep AIX compilers from optimizing it away,
   3667 ** and not including it in the DSO.
   3668 */
   3669 
   3670 #include "nss.h"
   3671 extern const char __nss_ssl_rcsid[];
   3672 extern const char __nss_ssl_sccsid[];
   3673 
   3674 PRBool
   3675 NSSSSL_VersionCheck(const char *importedVersion)
   3676 {
   3677     /*
   3678      * This is the secret handshake algorithm.
   3679      *
   3680      * This release has a simple version compatibility
   3681      * check algorithm.  This release is not backward
   3682      * compatible with previous major releases.  It is
   3683      * not compatible with future major, minor, or
   3684      * patch releases.
   3685      */
   3686     volatile char c; /* force a reference that won't get optimized away */
   3687 
   3688     c = __nss_ssl_rcsid[0] + __nss_ssl_sccsid[0];
   3689     return NSS_VersionCheck(importedVersion);
   3690 }
   3691 
   3692 const char *
   3693 NSSSSL_GetVersion(void)
   3694 {
   3695     return NSS_VERSION;
   3696 }
   3697