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

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * vtables (and methods that call through them) for the 4 types of 
  3.  * SSLSockets supported.  Only one type is still supported.
  4.  * Various other functions.
  5.  *
  6.  * The contents of this file are subject to the Mozilla Public
  7.  * License Version 1.1 (the "License"); you may not use this file
  8.  * except in compliance with the License. You may obtain a copy of
  9.  * the License at http://www.mozilla.org/MPL/
  10.  * 
  11.  * Software distributed under the License is distributed on an "AS
  12.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  13.  * implied. See the License for the specific language governing
  14.  * rights and limitations under the License.
  15.  * 
  16.  * The Original Code is the Netscape security libraries.
  17.  * 
  18.  * The Initial Developer of the Original Code is Netscape
  19.  * Communications Corporation.  Portions created by Netscape are 
  20.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  21.  * Rights Reserved.
  22.  * 
  23.  * Contributor(s):
  24.  * 
  25.  * Alternatively, the contents of this file may be used under the
  26.  * terms of the GNU General Public License Version 2 or later (the
  27.  * "GPL"), in which case the provisions of the GPL are applicable 
  28.  * instead of those above.  If you wish to allow use of your 
  29.  * version of this file only under the terms of the GPL and not to
  30.  * allow others to use your version of this file under the MPL,
  31.  * indicate your decision by deleting the provisions above and
  32.  * replace them with the notice and other provisions required by
  33.  * the GPL.  If you do not delete the provisions above, a recipient
  34.  * may use your version of this file under either the MPL or the
  35.  * GPL.
  36.  *
  37.  * $Id: sslsock.c,v 1.5 2000/09/12 20:15:43 jgmyers%netscape.com Exp $
  38.  */
  39. #include "seccomon.h"
  40. #include "cert.h"
  41. #include "keyhi.h"
  42. #include "ssl.h"
  43. #include "sslimpl.h"
  44. #include "sslproto.h"
  45. #include "nspr.h"
  46. #define SET_ERROR_CODE   /* reminder */
  47. struct cipherPolicyStr {
  48. int cipher;
  49. unsigned char  export; /* policy value for export policy */
  50. unsigned char  france; /* policy value for france policy */
  51. };
  52. typedef struct cipherPolicyStr cipherPolicy;
  53. /* this table reflects Netscape's browser policies. */
  54. static cipherPolicy ssl_ciphers[] = {    /*   Export           France   */
  55.  {  SSL_EN_RC4_128_WITH_MD5,     SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
  56.  {  SSL_EN_RC4_128_EXPORT40_WITH_MD5,     SSL_ALLOWED,     SSL_ALLOWED },
  57.  {  SSL_EN_RC2_128_CBC_WITH_MD5,     SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
  58.  {  SSL_EN_RC2_128_CBC_EXPORT40_WITH_MD5,   SSL_ALLOWED,     SSL_ALLOWED },
  59.  {  SSL_EN_DES_64_CBC_WITH_MD5,     SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
  60.  {  SSL_EN_DES_192_EDE3_CBC_WITH_MD5,     SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
  61.  {  SSL_FORTEZZA_DMS_WITH_FORTEZZA_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
  62.  {  SSL_FORTEZZA_DMS_WITH_RC4_128_SHA,      SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
  63.  {  SSL_RSA_WITH_RC4_128_MD5,     SSL_RESTRICTED,  SSL_NOT_ALLOWED },
  64.  {  SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA,     SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
  65.  {  SSL_RSA_WITH_3DES_EDE_CBC_SHA,     SSL_RESTRICTED,  SSL_NOT_ALLOWED },
  66.  {  SSL_RSA_FIPS_WITH_DES_CBC_SHA,     SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
  67.  {  SSL_RSA_WITH_DES_CBC_SHA,     SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
  68.  {  SSL_RSA_EXPORT_WITH_RC4_40_MD5,     SSL_ALLOWED,     SSL_ALLOWED },
  69.  {  SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5,     SSL_ALLOWED,     SSL_ALLOWED },
  70.  {  SSL_FORTEZZA_DMS_WITH_NULL_SHA,     SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
  71.  {  SSL_RSA_WITH_NULL_MD5,     SSL_ALLOWED,     SSL_ALLOWED },
  72.  {  TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA,    SSL_ALLOWED,     SSL_NOT_ALLOWED },
  73.  {  TLS_RSA_EXPORT1024_WITH_RC4_56_SHA,     SSL_ALLOWED,     SSL_NOT_ALLOWED },
  74.  {  0,     SSL_NOT_ALLOWED, SSL_NOT_ALLOWED }
  75. };
  76. static
  77. sslSocketOps ssl_default_ops = { /* No SSL, No Socks. */
  78.     ssl_DefConnect,
  79.     NULL,
  80.     ssl_DefBind,
  81.     ssl_DefListen,
  82.     ssl_DefShutdown,
  83.     ssl_DefClose,
  84.     ssl_DefRecv,
  85.     ssl_DefSend,
  86.     ssl_DefRead,
  87.     ssl_DefWrite,
  88.     ssl_DefGetpeername,
  89.     ssl_DefGetsockname
  90. };
  91. static
  92. sslSocketOps ssl_socks_ops = { /* No SSL, has socks. */
  93.     ssl_SocksConnect,
  94.     ssl_SocksAccept,
  95.     ssl_SocksBind,
  96.     ssl_SocksListen,
  97.     ssl_DefShutdown,
  98.     ssl_DefClose,
  99.     ssl_SocksRecv,
  100.     ssl_SocksSend,
  101.     ssl_SocksRead,
  102.     ssl_SocksWrite,
  103.     ssl_DefGetpeername,
  104.     ssl_SocksGetsockname
  105. };
  106. static
  107. sslSocketOps ssl_secure_ops = { /* SSL, no socks. */
  108.     ssl_SecureConnect,
  109.     NULL,
  110.     ssl_DefBind,
  111.     ssl_DefListen,
  112.     ssl_SecureShutdown,
  113.     ssl_SecureClose,
  114.     ssl_SecureRecv,
  115.     ssl_SecureSend,
  116.     ssl_SecureRead,
  117.     ssl_SecureWrite,
  118.     ssl_DefGetpeername,
  119.     ssl_DefGetsockname
  120. };
  121. static
  122. sslSocketOps ssl_secure_socks_ops = { /* Both SSL and Socks. */
  123.     ssl_SecureSocksConnect,
  124.     ssl_SecureSocksAccept,
  125.     ssl_SocksBind,
  126.     ssl_SocksListen,
  127.     ssl_SecureShutdown,
  128.     ssl_SecureClose,
  129.     ssl_SecureRecv,
  130.     ssl_SecureSend,
  131.     ssl_SecureRead,
  132.     ssl_SecureWrite,
  133.     ssl_DefGetpeername,
  134.     ssl_SocksGetsockname
  135. };
  136. /*
  137. ** default settings for socket enables
  138. */
  139. static sslOptions ssl_defaults = {
  140.     PR_TRUE,  /* useSecurity        */
  141.     PR_FALSE, /* useSocks           */
  142.     PR_FALSE, /* requestCertificate */
  143.     2,         /* requireCertificate */
  144.     PR_FALSE, /* handshakeAsClient  */
  145.     PR_FALSE, /* handshakeAsServer  */
  146.     PR_TRUE, /* enableSSL2         */
  147.     PR_TRUE, /* enableSSL3         */
  148.     PR_TRUE,  /* enableTLS          */ /* now defaults to on in NSS 3.0 */
  149.     PR_FALSE, /* noCache            */
  150.     PR_FALSE, /* fdx                */
  151.     PR_TRUE, /* v2CompatibleHello  */
  152.     PR_TRUE, /* detectRollBack     */
  153. };
  154. sslSessionIDLookupFunc  ssl_sid_lookup;
  155. sslSessionIDCacheFunc   ssl_sid_cache;
  156. sslSessionIDUncacheFunc ssl_sid_uncache;
  157. static PRBool ssl_inited = PR_FALSE;
  158. static PRDescIdentity ssl_layer_id;
  159. int                     ssl_lock_readers = 1; /* default true. */
  160. char                    ssl_debug;
  161. char                    ssl_trace;
  162. /* forward declarations. */
  163. static sslSocket *ssl_NewSocket(void);
  164. static PRStatus   ssl_PushIOLayer(sslSocket *ns, PRFileDesc *stack, 
  165.                                   PRDescIdentity id);
  166. /************************************************************************/
  167. /*
  168. ** Lookup a socket structure from a file descriptor.
  169. */
  170. static sslSocket *
  171. ssl_GetPrivate(PRFileDesc *fd)
  172. {
  173.     sslSocket *ss;
  174.     PORT_Assert(fd != NULL);
  175.     PORT_Assert(fd->methods->file_type == PR_DESC_LAYERED);
  176.     PORT_Assert(fd->identity == ssl_layer_id);
  177.     ss = (sslSocket *)fd->secret;
  178.     ss->fd = fd;
  179.     return ss;
  180. }
  181. sslSocket *
  182. ssl_FindSocket(PRFileDesc *fd)
  183. {
  184.     PRFileDesc *layer;
  185.     sslSocket *ss;
  186.     PORT_Assert(fd != NULL);
  187.     PORT_Assert(ssl_layer_id != 0);
  188.     layer = PR_GetIdentitiesLayer(fd, ssl_layer_id);
  189.     if (layer == NULL)
  190. return NULL;
  191.     ss = (sslSocket *)layer->secret;
  192.     ss->fd = layer;
  193.     return ss;
  194. }
  195. #if 0 /* dead code. */
  196. PRFileDesc *
  197. ssl_FindTop(sslSocket *ss)
  198. {
  199.     PRFileDesc *fd = ss->fd;
  200.     while (fd->higher != NULL)
  201. fd = fd->higher;
  202.     return fd;
  203. }
  204. #endif
  205. sslSocket *
  206. ssl_DupSocket(sslSocket *os)
  207. {
  208.     sslSocket *ss;
  209.     SECStatus rv;
  210.     ss = ssl_NewSocket();
  211.     if (ss) {
  212. ss->useSocks           = os->useSocks;
  213. ss->useSecurity        = os->useSecurity;
  214. ss->requestCertificate = os->requestCertificate;
  215. ss->requireCertificate = os->requireCertificate;
  216. ss->handshakeAsClient  = os->handshakeAsClient;
  217. ss->handshakeAsServer  = os->handshakeAsServer;
  218. ss->enableSSL2         = os->enableSSL2;
  219. ss->enableSSL3         = os->enableSSL3;
  220. ss->enableTLS          = os->enableTLS;
  221. ss->noCache            = os->noCache;
  222. ss->fdx                = os->fdx;
  223. ss->v2CompatibleHello  = os->v2CompatibleHello;
  224. ss->detectRollBack     = os->detectRollBack;
  225. ss->peerID             = !os->peerID ? NULL : PORT_Strdup(os->peerID);
  226. ss->url                = !os->url    ? NULL : PORT_Strdup(os->url);
  227. ss->ops      = os->ops;
  228. ss->peer     = os->peer;
  229. ss->port     = os->port;
  230. ss->rTimeout = os->rTimeout;
  231. ss->wTimeout = os->wTimeout;
  232. ss->cTimeout = os->cTimeout;
  233. ss->dbHandle = os->dbHandle;
  234. /* copy ssl2&3 policy & prefs, even if it's not selected (yet) */
  235. ss->allowedByPolicy = os->allowedByPolicy;
  236. ss->maybeAllowedByPolicy= os->maybeAllowedByPolicy;
  237. ss->chosenPreference  = os->chosenPreference;
  238. PORT_Memcpy(ss->cipherSuites, os->cipherSuites, sizeof os->cipherSuites);
  239. if (os->cipherSpecs) {
  240.     ss->cipherSpecs  = (unsigned char*)PORT_Alloc(os->sizeCipherSpecs);
  241.     if (ss->cipherSpecs) 
  242.      PORT_Memcpy(ss->cipherSpecs, os->cipherSpecs, 
  243.             os->sizeCipherSpecs);
  244.     ss->sizeCipherSpecs    = os->sizeCipherSpecs;
  245.     ss->preferredCipher    = os->preferredCipher;
  246. } else {
  247.     ss->cipherSpecs        = NULL;  /* produced lazily */
  248.     ss->sizeCipherSpecs    = 0;
  249.     ss->preferredCipher    = NULL;
  250. }
  251. if (ss->useSecurity) {
  252.     /* This int should be SSLKEAType, but CC on Irix complains,
  253.      * during the for loop.
  254.      */
  255.     int i;
  256.     for (i=kt_null; i < kt_kea_size; i++) {
  257. if (os->serverCert[i] && os->serverCertChain[i]) {
  258.     ss->serverCert[i] = CERT_DupCertificate(os->serverCert[i]);
  259.     ss->serverCertChain[i] = CERT_DupCertList(
  260.                                        os->serverCertChain[i]);
  261. } else {
  262.     ss->serverCert[i]      = NULL;
  263.     ss->serverCertChain[i] = NULL;
  264. }
  265. ss->serverKey[i] = os->serverKey[i] ?
  266. SECKEY_CopyPrivateKey(os->serverKey[i]) : NULL;
  267.     }
  268.     ss->stepDownKeyPair = !os->stepDownKeyPair ? NULL :
  269.                   ssl3_GetKeyPairRef(os->stepDownKeyPair);
  270. /*
  271.  * XXX the preceeding CERT_ and SECKEY_ functions can fail and return NULL.
  272.  * XXX We should detect this, and not just march on with NULL pointers.
  273.  */
  274.     ss->authCertificate       = os->authCertificate;
  275.     ss->authCertificateArg    = os->authCertificateArg;
  276.     ss->getClientAuthData     = os->getClientAuthData;
  277.     ss->getClientAuthDataArg  = os->getClientAuthDataArg;
  278.     ss->handleBadCert         = os->handleBadCert;
  279.     ss->badCertArg            = os->badCertArg;
  280.     ss->handshakeCallback     = os->handshakeCallback;
  281.     ss->handshakeCallbackData = os->handshakeCallbackData;
  282.     ss->pkcs11PinArg          = os->pkcs11PinArg;
  283.     
  284.     /* Create security data */
  285.     rv = ssl_CopySecurityInfo(ss, os);
  286.     if (rv != SECSuccess) {
  287. goto losage;
  288.     }
  289. }
  290. if (ss->useSocks) {
  291.     /* Create security data */
  292.     rv = ssl_CopySocksInfo(ss, os);
  293.     if (rv != SECSuccess) {
  294. goto losage;
  295.     }
  296. }
  297.     }
  298.     return ss;
  299.   losage:
  300.     return NULL;
  301. }
  302. /*
  303.  * free an sslSocket struct, and all the stuff that hangs off of it
  304.  */
  305. void
  306. ssl_FreeSocket(sslSocket *ss)
  307. {
  308.     /* "i" should be of type SSLKEAType, but CC on IRIX complains during
  309.      * the for loop.
  310.      */
  311.     int        i;
  312.     sslSocket *fs;
  313.     sslSocket  lSock;
  314. /* Get every lock you can imagine!
  315. ** Caller already holds these:
  316. **  SSL_LOCK_READER(ss);
  317. **  SSL_LOCK_WRITER(ss);
  318. */
  319.     ssl_Get1stHandshakeLock(ss);
  320.     ssl_GetRecvBufLock(ss);
  321.     ssl_GetSSL3HandshakeLock(ss);
  322.     ssl_GetXmitBufLock(ss);
  323.     ssl_GetSpecWriteLock(ss);
  324. #ifdef DEBUG
  325.     fs = &lSock;
  326.     *fs = *ss; /* Copy the old socket structure, */
  327.     PORT_Memset(ss, 0x1f, sizeof *ss);  /* then blast the old struct ASAP. */
  328. #else
  329.     fs = ss;
  330. #endif
  331.     /* Free up socket */
  332.     ssl_DestroySocksInfo(fs->socks);
  333.     ssl_DestroySecurityInfo(fs->sec);
  334.     ssl3_DestroySSL3Info(fs->ssl3);
  335.     PORT_Free(fs->saveBuf.buf);
  336.     PORT_Free(fs->pendingBuf.buf);
  337.     if (fs->gather) {
  338. ssl_DestroyGather(fs->gather);
  339.     }
  340.     if (fs->peerID != NULL)
  341. PORT_Free(fs->peerID);
  342.     if (fs->url != NULL)
  343. PORT_Free((void *)fs->url); /* CONST */
  344.     /* Clean up server configuration */
  345.     for (i=kt_null; i < kt_kea_size; i++) {
  346. if (fs->serverCert[i] != NULL)
  347.     CERT_DestroyCertificate(fs->serverCert[i]);
  348. if (fs->serverCertChain[i] != NULL)
  349.     CERT_DestroyCertificateList(fs->serverCertChain[i]);
  350. if (fs->serverKey[i] != NULL)
  351.     SECKEY_DestroyPrivateKey(fs->serverKey[i]);
  352.     }
  353.     if (fs->stepDownKeyPair) {
  354. ssl3_FreeKeyPair(fs->stepDownKeyPair);
  355. fs->stepDownKeyPair = NULL;
  356.     }
  357.     /* Release all the locks acquired above.  */
  358.     SSL_UNLOCK_READER(fs);
  359.     SSL_UNLOCK_WRITER(fs);
  360.     ssl_Release1stHandshakeLock(fs);
  361.     ssl_ReleaseRecvBufLock(fs);
  362.     ssl_ReleaseSSL3HandshakeLock(fs);
  363.     ssl_ReleaseXmitBufLock(fs);
  364.     ssl_ReleaseSpecWriteLock(fs);
  365.     /* Destroy locks. */
  366.     if (fs->firstHandshakeLock) {
  367.      PR_DestroyMonitor(fs->firstHandshakeLock);
  368. fs->firstHandshakeLock = NULL;
  369.     }
  370.     if (fs->ssl3HandshakeLock) {
  371.      PR_DestroyMonitor(fs->ssl3HandshakeLock);
  372. fs->ssl3HandshakeLock = NULL;
  373.     }
  374.     if (fs->specLock) {
  375.      NSSRWLock_Destroy(fs->specLock);
  376. fs->specLock = NULL;
  377.     }
  378.     if (fs->recvLock) {
  379.      PR_DestroyLock(fs->recvLock);
  380. fs->recvLock = NULL;
  381.     }
  382.     if (fs->sendLock) {
  383.      PR_DestroyLock(fs->sendLock);
  384. fs->sendLock = NULL;
  385.     }
  386.     if (fs->xmitBufLock) {
  387.      PR_DestroyMonitor(fs->xmitBufLock);
  388. fs->xmitBufLock = NULL;
  389.     }
  390.     if (fs->recvBufLock) {
  391.      PR_DestroyMonitor(fs->recvBufLock);
  392. fs->recvBufLock = NULL;
  393.     }
  394.     if (fs->cipherSpecs) {
  395. PORT_Free(fs->cipherSpecs);
  396. fs->cipherSpecs     = NULL;
  397. fs->sizeCipherSpecs = 0;
  398.     }
  399.     PORT_Free(ss); /* free the caller's copy, not ours. */
  400.     return;
  401. }
  402. /************************************************************************/
  403. static void
  404. ssl_ChooseOps(sslSocket *ss)
  405. {
  406.     if (ss->useSocks)  {
  407.      ss->ops = ss->useSecurity ? &ssl_secure_socks_ops : &ssl_socks_ops ;
  408.     } else {
  409.      ss->ops = ss->useSecurity ? &ssl_secure_ops       : &ssl_default_ops;
  410.     }
  411. }
  412. /* Called from SSL_Enable (immediately below) */
  413. static SECStatus
  414. PrepareSocket(sslSocket *ss)
  415. {
  416.     SECStatus     rv = SECSuccess;
  417.     if (ss->useSocks) {
  418. rv = ssl_CreateSocksInfo(ss);
  419. if (rv != SECSuccess) {
  420.     return rv;
  421. }
  422.     }
  423.     if (ss->useSecurity) {
  424. rv = ssl_CreateSecurityInfo(ss);
  425. if (rv != SECSuccess) {
  426.     return rv;
  427. }
  428.     }
  429.     ssl_ChooseOps(ss);
  430.     return rv;
  431. }
  432. SECStatus
  433. SSL_Enable(PRFileDesc *fd, int which, PRBool on)
  434. {
  435.     return SSL_OptionSet(fd, which, on);
  436. }
  437. SECStatus
  438. SSL_OptionSet(PRFileDesc *fd, PRInt32 which, PRBool on)
  439. {
  440.     sslSocket *ss = ssl_FindSocket(fd);
  441.     SECStatus  rv = SECSuccess;
  442.     if (!ss) {
  443. SSL_DBG(("%d: SSL[%d]: bad socket in Enable", SSL_GETPID(), fd));
  444. PORT_SetError(PR_BAD_DESCRIPTOR_ERROR);
  445. return SECFailure;
  446.     }
  447.     ssl_Get1stHandshakeLock(ss);
  448.     ssl_GetSSL3HandshakeLock(ss);
  449.     switch (which) {
  450.       case SSL_SOCKS:
  451. ss->useSocks = on;
  452. rv = PrepareSocket(ss);
  453. break;
  454.       case SSL_SECURITY:
  455. ss->useSecurity = on;
  456. rv = PrepareSocket(ss);
  457. break;
  458.       case SSL_REQUEST_CERTIFICATE:
  459. ss->requestCertificate = on;
  460. break;
  461.       case SSL_REQUIRE_CERTIFICATE:
  462. ss->requireCertificate = on;
  463. break;
  464.       case SSL_HANDSHAKE_AS_CLIENT:
  465. if ( ss->handshakeAsServer && on ) {
  466.     PORT_SetError(SEC_ERROR_INVALID_ARGS);
  467.     rv = SECFailure;
  468.     break;
  469. }
  470. ss->handshakeAsClient = on;
  471. break;
  472.       case SSL_HANDSHAKE_AS_SERVER:
  473. if ( ss->handshakeAsClient && on ) {
  474.     PORT_SetError(SEC_ERROR_INVALID_ARGS);
  475.     rv = SECFailure;
  476.     break;
  477. }
  478. ss->handshakeAsServer = on;
  479. break;
  480.       case SSL_ENABLE_TLS:
  481. ss->enableTLS           = on;
  482. ss->preferredCipher     = NULL;
  483. if (ss->cipherSpecs) {
  484.     PORT_Free(ss->cipherSpecs);
  485.     ss->cipherSpecs     = NULL;
  486.     ss->sizeCipherSpecs = 0;
  487. }
  488. break;
  489.       case SSL_ENABLE_SSL3:
  490. ss->enableSSL3          = on;
  491. ss->preferredCipher     = NULL;
  492. if (ss->cipherSpecs) {
  493.     PORT_Free(ss->cipherSpecs);
  494.     ss->cipherSpecs     = NULL;
  495.     ss->sizeCipherSpecs = 0;
  496. }
  497. break;
  498.       case SSL_ENABLE_SSL2:
  499. ss->enableSSL2          = on;
  500. if (on) {
  501.     ss->v2CompatibleHello = on;
  502. }
  503. ss->preferredCipher     = NULL;
  504. if (ss->cipherSpecs) {
  505.     PORT_Free(ss->cipherSpecs);
  506.     ss->cipherSpecs     = NULL;
  507.     ss->sizeCipherSpecs = 0;
  508. }
  509. break;
  510.       case SSL_NO_CACHE:
  511. ss->noCache = on;
  512. break;
  513.       case SSL_ENABLE_FDX:
  514.        ss->fdx = on;
  515. break;
  516.       case SSL_V2_COMPATIBLE_HELLO:
  517.        ss->v2CompatibleHello = on;
  518. if (!on) {
  519.     ss->enableSSL2    = on;
  520. }
  521. break;
  522.       case SSL_ROLLBACK_DETECTION:  
  523. ss->detectRollBack = on;
  524.         break;
  525.       default:
  526. PORT_SetError(SEC_ERROR_INVALID_ARGS);
  527. rv = SECFailure;
  528.     }
  529.     ssl_ReleaseSSL3HandshakeLock(ss);
  530.     ssl_Release1stHandshakeLock(ss);
  531.     return rv;
  532. }
  533. SECStatus
  534. SSL_OptionGet(PRFileDesc *fd, PRInt32 which, PRBool *pOn)
  535. {
  536.     sslSocket *ss = ssl_FindSocket(fd);
  537.     SECStatus  rv = SECSuccess;
  538.     PRBool     on = PR_FALSE;
  539.     if (!pOn) {
  540. PORT_SetError(SEC_ERROR_INVALID_ARGS);
  541. return SECFailure;
  542.     }
  543.     if (!ss) {
  544. SSL_DBG(("%d: SSL[%d]: bad socket in Enable", SSL_GETPID(), fd));
  545. PORT_SetError(PR_BAD_DESCRIPTOR_ERROR);
  546. *pOn = PR_FALSE;
  547. return SECFailure;
  548.     }
  549.     ssl_Get1stHandshakeLock(ss);
  550.     ssl_GetSSL3HandshakeLock(ss);
  551.     switch (which) {
  552.     case SSL_SOCKS:               on = ss->useSocks;           break;
  553.     case SSL_SECURITY:            on = ss->useSecurity;        break;
  554.     case SSL_REQUEST_CERTIFICATE: on = ss->requestCertificate; break;
  555.     case SSL_REQUIRE_CERTIFICATE: on = ss->requireCertificate; break;
  556.     case SSL_HANDSHAKE_AS_CLIENT: on = ss->handshakeAsClient;  break;
  557.     case SSL_HANDSHAKE_AS_SERVER: on = ss->handshakeAsServer;  break;
  558.     case SSL_ENABLE_TLS:          on = ss->enableTLS;          break;
  559.     case SSL_ENABLE_SSL3:         on = ss->enableSSL3;         break;
  560.     case SSL_ENABLE_SSL2:         on = ss->enableSSL2;         break;
  561.     case SSL_NO_CACHE:            on = ss->noCache;            break;
  562.     case SSL_ENABLE_FDX:          on = ss->fdx;                break;
  563.     case SSL_V2_COMPATIBLE_HELLO: on = ss->v2CompatibleHello;  break;
  564.     case SSL_ROLLBACK_DETECTION:  on = ss->detectRollBack;     break;
  565.     default:
  566. PORT_SetError(SEC_ERROR_INVALID_ARGS);
  567. rv = SECFailure;
  568.     }
  569.     ssl_ReleaseSSL3HandshakeLock(ss);
  570.     ssl_Release1stHandshakeLock(ss);
  571.     *pOn = on;
  572.     return rv;
  573. }
  574. SECStatus
  575. SSL_OptionGetDefault(PRInt32 which, PRBool *pOn)
  576. {
  577.     SECStatus  rv = SECSuccess;
  578.     PRBool     on = PR_FALSE;
  579.     if (!pOn) {
  580. PORT_SetError(SEC_ERROR_INVALID_ARGS);
  581. return SECFailure;
  582.     }
  583.     switch (which) {
  584.     case SSL_SOCKS:               on = ssl_defaults.useSocks;           break;
  585.     case SSL_SECURITY:            on = ssl_defaults.useSecurity;        break;
  586.     case SSL_REQUEST_CERTIFICATE: on = ssl_defaults.requestCertificate; break;
  587.     case SSL_REQUIRE_CERTIFICATE: on = ssl_defaults.requireCertificate; break;
  588.     case SSL_HANDSHAKE_AS_CLIENT: on = ssl_defaults.handshakeAsClient;  break;
  589.     case SSL_HANDSHAKE_AS_SERVER: on = ssl_defaults.handshakeAsServer;  break;
  590.     case SSL_ENABLE_TLS:          on = ssl_defaults.enableTLS;          break;
  591.     case SSL_ENABLE_SSL3:         on = ssl_defaults.enableSSL3;         break;
  592.     case SSL_ENABLE_SSL2:         on = ssl_defaults.enableSSL2;         break;
  593.     case SSL_NO_CACHE:            on = ssl_defaults.noCache; break;
  594.     case SSL_ENABLE_FDX:          on = ssl_defaults.fdx;                break;
  595.     case SSL_V2_COMPATIBLE_HELLO: on = ssl_defaults.v2CompatibleHello;  break;
  596.     case SSL_ROLLBACK_DETECTION:  on = ssl_defaults.detectRollBack;     break;
  597.     default:
  598. PORT_SetError(SEC_ERROR_INVALID_ARGS);
  599. rv = SECFailure;
  600.     }
  601.     *pOn = on;
  602.     return rv;
  603. }
  604. /* XXX Use Global Lock to protect this stuff. */
  605. SECStatus
  606. SSL_EnableDefault(int which, PRBool on)
  607. {
  608.     return SSL_OptionSetDefault(which, on);
  609. }
  610. SECStatus
  611. SSL_OptionSetDefault(PRInt32 which, PRBool on)
  612. {
  613.     switch (which) {
  614.       case SSL_SOCKS:
  615. ssl_defaults.useSocks = on;
  616. break;
  617.       case SSL_SECURITY:
  618. ssl_defaults.useSecurity = on;
  619. break;
  620.       case SSL_REQUEST_CERTIFICATE:
  621. ssl_defaults.requestCertificate = on;
  622. break;
  623.       case SSL_REQUIRE_CERTIFICATE:
  624. ssl_defaults.requireCertificate = on;
  625. break;
  626.       case SSL_HANDSHAKE_AS_CLIENT:
  627. if ( ssl_defaults.handshakeAsServer && on ) {
  628.     PORT_SetError(SEC_ERROR_INVALID_ARGS);
  629.     return SECFailure;
  630. }
  631. ssl_defaults.handshakeAsClient = on;
  632. break;
  633.       case SSL_HANDSHAKE_AS_SERVER:
  634. if ( ssl_defaults.handshakeAsClient && on ) {
  635.     PORT_SetError(SEC_ERROR_INVALID_ARGS);
  636.     return SECFailure;
  637. }
  638. ssl_defaults.handshakeAsServer = on;
  639. break;
  640.       case SSL_ENABLE_TLS:
  641. ssl_defaults.enableTLS = on;
  642. break;
  643.       case SSL_ENABLE_SSL3:
  644. ssl_defaults.enableSSL3 = on;
  645. break;
  646.       case SSL_ENABLE_SSL2:
  647. ssl_defaults.enableSSL2 = on;
  648. if (on) {
  649.     ssl_defaults.v2CompatibleHello = on;
  650. }
  651. break;
  652.       case SSL_NO_CACHE:
  653. ssl_defaults.noCache = on;
  654. break;
  655.       case SSL_ENABLE_FDX:
  656.        ssl_defaults.fdx = on;
  657.       case SSL_V2_COMPATIBLE_HELLO:
  658.        ssl_defaults.v2CompatibleHello = on;
  659. if (!on) {
  660.     ssl_defaults.enableSSL2    = on;
  661. }
  662. break;
  663.       case SSL_ROLLBACK_DETECTION:  
  664. ssl_defaults.detectRollBack = on;
  665. break;
  666.       default:
  667. PORT_SetError(SEC_ERROR_INVALID_ARGS);
  668. return SECFailure;
  669.     }
  670.     return SECSuccess;
  671. }
  672. /* Part of the public NSS API.
  673.  * Since this is a global (not per-socket) setting, we cannot use the
  674.  * HandshakeLock to protect this.  Probably want a global lock.
  675.  */
  676. SECStatus
  677. SSL_SetPolicy(long which, int policy)
  678. {
  679.     if ((which & 0xfffe) == SSL_RSA_OLDFIPS_WITH_3DES_EDE_CBC_SHA) {
  680.      /* one of the two old FIPS ciphers */
  681. if (which == SSL_RSA_OLDFIPS_WITH_3DES_EDE_CBC_SHA) 
  682.     which = SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA;
  683. else if (which == SSL_RSA_OLDFIPS_WITH_DES_CBC_SHA)
  684.     which = SSL_RSA_FIPS_WITH_DES_CBC_SHA;
  685.     }
  686.     return SSL_CipherPolicySet(which, policy);
  687. }
  688. SECStatus
  689. SSL_CipherPolicySet(PRInt32 which, PRInt32 policy)
  690. {
  691.     SECStatus rv;
  692.     if (SSL_IS_SSL2_CIPHER(which)) {
  693. rv = ssl2_SetPolicy(which, policy);
  694.     } else {
  695. rv = ssl3_SetPolicy((ssl3CipherSuite)which, policy);
  696.     }
  697.     return rv;
  698. }
  699. SECStatus
  700. SSL_CipherPolicyGet(PRInt32 which, PRInt32 *oPolicy)
  701. {
  702.     SECStatus rv;
  703.     if (!oPolicy) {
  704. PORT_SetError(SEC_ERROR_INVALID_ARGS);
  705. return SECFailure;
  706.     }
  707.     if (SSL_IS_SSL2_CIPHER(which)) {
  708. rv = ssl2_GetPolicy(which, oPolicy);
  709.     } else {
  710. rv = ssl3_GetPolicy((ssl3CipherSuite)which, oPolicy);
  711.     }
  712.     return rv;
  713. }
  714. /* Part of the public NSS API.
  715.  * Since this is a global (not per-socket) setting, we cannot use the
  716.  * HandshakeLock to protect this.  Probably want a global lock.
  717.  * These changes have no effect on any sslSockets already created. 
  718.  */
  719. SECStatus
  720. SSL_EnableCipher(long which, PRBool enabled)
  721. {
  722.     if ((which & 0xfffe) == SSL_RSA_OLDFIPS_WITH_3DES_EDE_CBC_SHA) {
  723.      /* one of the two old FIPS ciphers */
  724. if (which == SSL_RSA_OLDFIPS_WITH_3DES_EDE_CBC_SHA) 
  725.     which = SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA;
  726. else if (which == SSL_RSA_OLDFIPS_WITH_DES_CBC_SHA)
  727.     which = SSL_RSA_FIPS_WITH_DES_CBC_SHA;
  728.     }
  729.     return SSL_CipherPrefSetDefault(which, enabled);
  730. }
  731. SECStatus
  732. SSL_CipherPrefSetDefault(PRInt32 which, PRBool enabled)
  733. {
  734.     SECStatus rv;
  735.     
  736.     if (SSL_IS_SSL2_CIPHER(which)) {
  737. rv = ssl2_CipherPrefSetDefault(which, enabled);
  738.     } else {
  739. rv = ssl3_CipherPrefSetDefault((ssl3CipherSuite)which, enabled);
  740.     }
  741.     return rv;
  742. }
  743. SECStatus 
  744. SSL_CipherPrefGetDefault(PRInt32 which, PRBool *enabled)
  745. {
  746.     SECStatus  rv;
  747.     
  748.     if (!enabled) {
  749. PORT_SetError(SEC_ERROR_INVALID_ARGS);
  750. return SECFailure;
  751.     }
  752.     if (SSL_IS_SSL2_CIPHER(which)) {
  753. rv = ssl2_CipherPrefGetDefault(which, enabled);
  754.     } else {
  755. rv = ssl3_CipherPrefGetDefault((ssl3CipherSuite)which, enabled);
  756.     }
  757.     return rv;
  758. }
  759. SECStatus
  760. SSL_CipherPrefSet(PRFileDesc *fd, PRInt32 which, PRBool enabled)
  761. {
  762.     SECStatus rv;
  763.     sslSocket *ss = ssl_FindSocket(fd);
  764.     
  765.     if (!ss) {
  766. SSL_DBG(("%d: SSL[%d]: bad socket in CipherPrefSet", SSL_GETPID(), fd));
  767. PORT_SetError(PR_BAD_DESCRIPTOR_ERROR);
  768. return SECFailure;
  769.     }
  770.     if (SSL_IS_SSL2_CIPHER(which)) {
  771. rv = ssl2_CipherPrefSet(ss, which, enabled);
  772.     } else {
  773. rv = ssl3_CipherPrefSet(ss, (ssl3CipherSuite)which, enabled);
  774.     }
  775.     return rv;
  776. }
  777. SECStatus 
  778. SSL_CipherPrefGet(PRFileDesc *fd, PRInt32 which, PRBool *enabled)
  779. {
  780.     SECStatus  rv;
  781.     sslSocket *ss = ssl_FindSocket(fd);
  782.     
  783.     if (!enabled) {
  784. PORT_SetError(SEC_ERROR_INVALID_ARGS);
  785. return SECFailure;
  786.     }
  787.     if (!ss) {
  788. SSL_DBG(("%d: SSL[%d]: bad socket in CipherPrefGet", SSL_GETPID(), fd));
  789. PORT_SetError(PR_BAD_DESCRIPTOR_ERROR);
  790. *enabled = PR_FALSE;
  791. return SECFailure;
  792.     }
  793.     if (SSL_IS_SSL2_CIPHER(which)) {
  794. rv = ssl2_CipherPrefGet(ss, which, enabled);
  795.     } else {
  796. rv = ssl3_CipherPrefGet(ss, (ssl3CipherSuite)which, enabled);
  797.     }
  798.     return rv;
  799. }
  800. SECStatus
  801. NSS_SetDomesticPolicy(void)
  802. {
  803. #ifndef EXPORT_VERSION
  804.     SECStatus      status = SECSuccess;
  805.     cipherPolicy * policy;
  806.     for (policy = ssl_ciphers; policy->cipher != 0; ++policy) {
  807. status = SSL_SetPolicy(policy->cipher, SSL_ALLOWED);
  808. if (status != SECSuccess)
  809.     break;
  810.     }
  811.     return status;
  812. #else
  813.     return NSS_SetExportPolicy();
  814. #endif
  815. }
  816. SECStatus
  817. NSS_SetExportPolicy(void)
  818. {
  819.     SECStatus      status = SECSuccess;
  820.     cipherPolicy * policy;
  821.     for (policy = ssl_ciphers; policy->cipher != 0; ++policy) {
  822. status = SSL_SetPolicy(policy->cipher, policy->export);
  823. if (status != SECSuccess)
  824.     break;
  825.     }
  826.     return status;
  827. }
  828. SECStatus
  829. NSS_SetFrancePolicy(void)
  830. {
  831.     SECStatus      status = SECSuccess;
  832.     cipherPolicy * policy;
  833.     for (policy = ssl_ciphers; policy->cipher != 0; ++policy) {
  834. status = SSL_SetPolicy(policy->cipher, policy->france);
  835. if (status != SECSuccess)
  836.     break;
  837.     }
  838.     return status;
  839. }
  840. /* LOCKS ??? XXX */
  841. PRFileDesc *
  842. SSL_ImportFD(PRFileDesc *model, PRFileDesc *fd)
  843. {
  844.     sslSocket * ns = NULL;
  845.     PRStatus    rv;
  846.     if (model == NULL) {
  847. /* Just create a default socket if we're given NULL for the model */
  848. ns = ssl_NewSocket();
  849.     } else {
  850. sslSocket * ss = ssl_FindSocket(model);
  851. if (ss == NULL) {
  852.     SSL_DBG(("%d: SSL[%d]: bad model socket in ssl_ImportFD", 
  853.            SSL_GETPID(), model));
  854.     SET_ERROR_CODE
  855.     return NULL;
  856. }
  857. ns = ssl_DupSocket(ss);
  858.     }
  859.     if (ns == NULL)
  860.      return NULL;
  861.     rv = ssl_PushIOLayer(ns, fd, PR_TOP_IO_LAYER);
  862.     if (rv != PR_SUCCESS) {
  863. ssl_FreeSocket(ns);
  864. SET_ERROR_CODE
  865. return NULL;
  866.     }
  867. #ifdef _WIN32
  868.     PR_Sleep(PR_INTERVAL_NO_WAIT);     /* workaround NT winsock connect bug. */
  869. #endif
  870.     return fd;
  871. }
  872. /************************************************************************/
  873. /* The following functions are the TOP LEVEL SSL functions.
  874. ** They all get called through the NSPRIOMethods table below.
  875. */
  876. static PRFileDesc * PR_CALLBACK
  877. ssl_Accept(PRFileDesc *fd, PRNetAddr *sockaddr, PRIntervalTime timeout)
  878. {
  879.     sslSocket  *ss;
  880.     sslSocket  *ns  = NULL;
  881.     PRFileDesc *newfd  = NULL;
  882.     PRFileDesc *osfd;
  883.     PRStatus    status;
  884.     ss = ssl_GetPrivate(fd);
  885.     if (!ss) {
  886. SSL_DBG(("%d: SSL[%d]: bad socket in accept", SSL_GETPID(), fd));
  887. return NULL;
  888.     }
  889.     /* IF this is a listen socket, there shouldn't be any I/O going on */
  890.     SSL_LOCK_READER(ss);
  891.     SSL_LOCK_WRITER(ss);
  892.     ssl_Get1stHandshakeLock(ss);
  893.     ssl_GetSSL3HandshakeLock(ss);
  894.     ss->cTimeout = timeout;
  895.     osfd = ss->fd->lower;
  896.     /* First accept connection */
  897.     newfd = osfd->methods->accept(osfd, sockaddr, timeout);
  898.     if (newfd == NULL) {
  899. SSL_DBG(("%d: SSL[%d]: accept failed, errno=%d",
  900.  SSL_GETPID(), ss->fd, PORT_GetError()));
  901.     } else {
  902. /* Create ssl module */
  903. ns = ssl_DupSocket(ss);
  904.     }
  905.     ssl_ReleaseSSL3HandshakeLock(ss);
  906.     ssl_Release1stHandshakeLock(ss);
  907.     SSL_UNLOCK_WRITER(ss);
  908.     SSL_UNLOCK_READER(ss); /* ss isn't used below here. */
  909.     if (ns == NULL)
  910. goto loser;
  911.     /* push ssl module onto the new socket */
  912.     status = ssl_PushIOLayer(ns, newfd, PR_TOP_IO_LAYER);
  913.     if (status != PR_SUCCESS)
  914. goto loser;
  915.     /* Now start server connection handshake with client.
  916.     ** Don't need locks here because nobody else has a reference to ns yet.
  917.     */
  918.     if ( ns->useSecurity ) {
  919. if ( ns->handshakeAsClient ) {
  920.     ns->handshake = ssl2_BeginClientHandshake;
  921. } else {
  922.     ns->handshake = ssl2_BeginServerHandshake;
  923. }
  924.     }
  925.     return newfd;
  926. loser:
  927.     if (ns != NULL)
  928. ssl_FreeSocket(ns);
  929.     if (newfd != NULL)
  930. PR_Close(newfd);
  931.     return NULL;
  932. }
  933. static PRStatus PR_CALLBACK
  934. ssl_Connect(PRFileDesc *fd, const PRNetAddr *sockaddr, PRIntervalTime timeout)
  935. {
  936.     sslSocket *ss;
  937.     PRStatus   rv;
  938.     ss = ssl_GetPrivate(fd);
  939.     if (!ss) {
  940. SSL_DBG(("%d: SSL[%d]: bad socket in connect", SSL_GETPID(), fd));
  941. return PR_FAILURE;
  942.     }
  943.     /* IF this is a listen socket, there shouldn't be any I/O going on */
  944.     SSL_LOCK_READER(ss);
  945.     SSL_LOCK_WRITER(ss);
  946.     ss->cTimeout = timeout;
  947.     rv = (PRStatus)(*ss->ops->connect)(ss, sockaddr);
  948. #ifdef _WIN32
  949.     PR_Sleep(PR_INTERVAL_NO_WAIT);     /* workaround NT winsock connect bug. */
  950. #endif
  951.     SSL_UNLOCK_WRITER(ss);
  952.     SSL_UNLOCK_READER(ss);
  953.     return rv;
  954. }
  955. static PRStatus PR_CALLBACK
  956. ssl_Bind(PRFileDesc *fd, const PRNetAddr *addr)
  957. {
  958.     sslSocket * ss = ssl_GetPrivate(fd);
  959.     PRStatus    rv;
  960.     if (!ss) {
  961. SSL_DBG(("%d: SSL[%d]: bad socket in bind", SSL_GETPID(), fd));
  962. return PR_FAILURE;
  963.     }
  964.     SSL_LOCK_READER(ss);
  965.     SSL_LOCK_WRITER(ss);
  966.     rv = (PRStatus)(*ss->ops->bind)(ss, addr);
  967.     SSL_UNLOCK_WRITER(ss);
  968.     SSL_UNLOCK_READER(ss);
  969.     return rv;
  970. }
  971. static PRStatus PR_CALLBACK
  972. ssl_Listen(PRFileDesc *fd, PRIntn backlog)
  973. {
  974.     sslSocket * ss = ssl_GetPrivate(fd);
  975.     PRStatus    rv;
  976.     if (!ss) {
  977. SSL_DBG(("%d: SSL[%d]: bad socket in listen", SSL_GETPID(), fd));
  978. return PR_FAILURE;
  979.     }
  980.     SSL_LOCK_READER(ss);
  981.     SSL_LOCK_WRITER(ss);
  982.     rv = (PRStatus)(*ss->ops->listen)(ss, backlog);
  983.     SSL_UNLOCK_WRITER(ss);
  984.     SSL_UNLOCK_READER(ss);
  985.     return rv;
  986. }
  987. static PRStatus PR_CALLBACK
  988. ssl_Shutdown(PRFileDesc *fd, PRIntn how)
  989. {
  990.     sslSocket * ss = ssl_GetPrivate(fd);
  991.     PRStatus    rv;
  992.     if (!ss) {
  993. SSL_DBG(("%d: SSL[%d]: bad socket in shutdown", SSL_GETPID(), fd));
  994. return PR_FAILURE;
  995.     }
  996.     if (how == PR_SHUTDOWN_RCV || how == PR_SHUTDOWN_BOTH) {
  997.      SSL_LOCK_READER(ss);
  998.     }
  999.     if (how == PR_SHUTDOWN_SEND || how == PR_SHUTDOWN_BOTH) {
  1000.      SSL_LOCK_WRITER(ss);
  1001.     }
  1002.     rv = (PRStatus)(*ss->ops->shutdown)(ss, how);
  1003.     if (how == PR_SHUTDOWN_SEND || how == PR_SHUTDOWN_BOTH) {
  1004.      SSL_UNLOCK_WRITER(ss);
  1005.     }
  1006.     if (how == PR_SHUTDOWN_RCV || how == PR_SHUTDOWN_BOTH) {
  1007.      SSL_UNLOCK_READER(ss);
  1008.     }
  1009.     return rv;
  1010. }
  1011. static PRStatus PR_CALLBACK
  1012. ssl_Close(PRFileDesc *fd)
  1013. {
  1014.     sslSocket *ss;
  1015.     PRStatus   rv;
  1016.     ss = ssl_GetPrivate(fd);
  1017.     if (!ss) {
  1018. SSL_DBG(("%d: SSL[%d]: bad socket in close", SSL_GETPID(), fd));
  1019. return PR_FAILURE;
  1020.     }
  1021.     /* There must not be any I/O going on */
  1022.     SSL_LOCK_READER(ss);
  1023.     SSL_LOCK_WRITER(ss);
  1024.     /* By the time this function returns, 
  1025.     ** ss is an invalid pointer, and the locks to which it points have 
  1026.     ** been unlocked and freed.  So, this is the ONE PLACE in all of SSL
  1027.     ** where the LOCK calls and the corresponding UNLOCK calls are not in
  1028.     ** the same function scope.  The unlock calls are in ssl_FreeSocket().
  1029.     */
  1030.     rv = (PRStatus)(*ss->ops->close)(ss);
  1031.     return rv;
  1032. }
  1033. static int PR_CALLBACK
  1034. ssl_Recv(PRFileDesc *fd, void *buf, PRInt32 len, PRIntn flags,
  1035.  PRIntervalTime timeout)
  1036. {
  1037.     sslSocket *ss;
  1038.     int        rv;
  1039.     ss = ssl_GetPrivate(fd);
  1040.     if (!ss) {
  1041. SSL_DBG(("%d: SSL[%d]: bad socket in recv", SSL_GETPID(), fd));
  1042. return SECFailure;
  1043.     }
  1044.     SSL_LOCK_READER(ss);
  1045.     ss->rTimeout = timeout;
  1046.     rv = (*ss->ops->recv)(ss, (unsigned char*)buf, len, flags);
  1047.     SSL_UNLOCK_READER(ss);
  1048.     return rv;
  1049. }
  1050. static int PR_CALLBACK
  1051. ssl_Send(PRFileDesc *fd, const void *buf, PRInt32 len, PRIntn flags,
  1052.  PRIntervalTime timeout)
  1053. {
  1054.     sslSocket *ss;
  1055.     int        rv;
  1056.     ss = ssl_GetPrivate(fd);
  1057.     if (!ss) {
  1058. SSL_DBG(("%d: SSL[%d]: bad socket in send", SSL_GETPID(), fd));
  1059. return SECFailure;
  1060.     }
  1061.     SSL_LOCK_WRITER(ss);
  1062.     ss->wTimeout = timeout;
  1063.     rv = (*ss->ops->send)(ss, (const unsigned char*)buf, len, flags);
  1064.     SSL_UNLOCK_WRITER(ss);
  1065.     return rv;
  1066. }
  1067. static int PR_CALLBACK
  1068. ssl_Read(PRFileDesc *fd, void *buf, PRInt32 len)
  1069. {
  1070.     sslSocket *ss;
  1071.     int        rv;
  1072.     ss = ssl_GetPrivate(fd);
  1073.     if (!ss) {
  1074. SSL_DBG(("%d: SSL[%d]: bad socket in read", SSL_GETPID(), fd));
  1075. return SECFailure;
  1076.     }
  1077.     SSL_LOCK_READER(ss);
  1078.     ss->rTimeout = PR_INTERVAL_NO_TIMEOUT;
  1079.     rv = (*ss->ops->read)(ss, (unsigned char*)buf, len);
  1080.     SSL_UNLOCK_READER(ss);
  1081.     return rv;
  1082. }
  1083. static int PR_CALLBACK
  1084. ssl_Write(PRFileDesc *fd, const void *buf, PRInt32 len)
  1085. {
  1086.     sslSocket *ss;
  1087.     int        rv;
  1088.     ss = ssl_GetPrivate(fd);
  1089.     if (!ss) {
  1090. SSL_DBG(("%d: SSL[%d]: bad socket in write", SSL_GETPID(), fd));
  1091. return SECFailure;
  1092.     }
  1093.     SSL_LOCK_WRITER(ss);
  1094.     ss->wTimeout = PR_INTERVAL_NO_TIMEOUT;
  1095.     rv = (*ss->ops->write)(ss, (const unsigned char*)buf, len);
  1096.     SSL_UNLOCK_WRITER(ss);
  1097.     return rv;
  1098. }
  1099. static PRStatus PR_CALLBACK
  1100. ssl_GetPeerName(PRFileDesc *fd, PRNetAddr *addr)
  1101. {
  1102.     sslSocket *ss;
  1103.     ss = ssl_GetPrivate(fd);
  1104.     if (!ss) {
  1105. SSL_DBG(("%d: SSL[%d]: bad socket in getpeername", SSL_GETPID(), fd));
  1106. return PR_FAILURE;
  1107.     }
  1108.     return (PRStatus)(*ss->ops->getpeername)(ss, addr);
  1109. }
  1110. /*
  1111. ** XXX this code doesn't work properly inside a Socks server.
  1112. */
  1113. SECStatus
  1114. ssl_GetPeerInfo(sslSocket *ss)
  1115. {
  1116.     sslConnectInfo *  ci;
  1117.     PRNetAddr         sin;
  1118.     int               rv;
  1119.     PRFileDesc *      osfd;
  1120.     PORT_Assert((ss->sec != 0));
  1121.     osfd = ss->fd->lower;
  1122.     ci   = &ss->sec->ci;
  1123.     /* If ssl_SocksConnect() has previously recorded the peer's IP & port,
  1124.      * use that.
  1125.      */
  1126.     if ((ss->port != 0) &&
  1127. ((ss->peer.pr_s6_addr32[0] != 0) || (ss->peer.pr_s6_addr32[1] != 0) ||
  1128.  (ss->peer.pr_s6_addr32[2] != 0) || (ss->peer.pr_s6_addr32[3] != 0))) {
  1129. /* SOCKS code has already recorded the peer's IP addr and port.
  1130.  * (NOT the proxy's addr and port) in ss->peer & port.
  1131.  */
  1132. ci->peer = ss->peer;
  1133. ci->port = ss->port;
  1134. return SECSuccess;
  1135.     }
  1136.     PORT_Memset(&sin, 0, sizeof(sin));
  1137.     rv = osfd->methods->getpeername(osfd, &sin);
  1138.     if (rv < 0) {
  1139. return SECFailure;
  1140.     }
  1141.     /* we have to mask off the high byte because AIX is lame */
  1142.     if ((sin.inet.family & 0xff) == PR_AF_INET) {
  1143.         PR_ConvertIPv4AddrToIPv6(sin.inet.ip, &ci->peer);
  1144. ci->port = sin.inet.port;
  1145.     } else {
  1146.         PORT_Assert(sin.ipv6.family == PR_AF_INET6);
  1147. ci->peer = sin.ipv6.ip;
  1148. ci->port = sin.ipv6.port;
  1149.     }
  1150.     return SECSuccess;
  1151. }
  1152. static PRStatus PR_CALLBACK
  1153. ssl_GetSockName(PRFileDesc *fd, PRNetAddr *name)
  1154. {
  1155.     sslSocket *ss;
  1156.     ss = ssl_GetPrivate(fd);
  1157.     if (!ss) {
  1158. SSL_DBG(("%d: SSL[%d]: bad socket in getsockname", SSL_GETPID(), fd));
  1159. return PR_FAILURE;
  1160.     }
  1161.     return (PRStatus)(*ss->ops->getsockname)(ss, name);
  1162. }
  1163. int PR_CALLBACK
  1164. SSL_SetSockPeerID(PRFileDesc *fd, char *peerID)
  1165. {
  1166.     sslSocket *ss;
  1167.     ss = ssl_GetPrivate(fd);
  1168.     if (!ss) {
  1169. SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetCacheIndex",
  1170.  SSL_GETPID(), fd));
  1171. return SECFailure;
  1172.     }
  1173.     ss->peerID = PORT_Strdup(peerID);
  1174.     return 0;
  1175. }
  1176. static PRInt16 PR_CALLBACK
  1177. ssl_Poll(PRFileDesc *fd, PRInt16 how_flags, PRInt16 *out_flags)
  1178. {
  1179.     sslSocket *ss;
  1180.     PRInt16    ret_flags = how_flags; /* should select on these flags. */
  1181.     *out_flags = 0;
  1182.     ss = ssl_GetPrivate(fd);
  1183.     if (!ss) {
  1184. SSL_DBG(("%d: SSL[%d]: bad socket in SSL_Poll",
  1185.  SSL_GETPID(), fd));
  1186. return 0; /* don't poll on this socket */
  1187.     }
  1188.     if ((ret_flags & PR_POLL_WRITE) && 
  1189.         ( (ss->useSocks && ss->handshake) || 
  1190.   (ss->useSecurity && !ss->connected && 
  1191.    /* XXX There needs to be a better test than the following. */
  1192.    /* Don't check ss->securityHandshake. */
  1193.    (ss->handshake || ss->nextHandshake)))) {
  1194.      /* The user is trying to write, but the handshake is blocked waiting
  1195.  * to read, so tell NSPR NOT to poll on write.
  1196.  */
  1197. ret_flags ^=  PR_POLL_WRITE; /* don't select on write. */
  1198. ret_flags |=  PR_POLL_READ; /* do    select on read. */
  1199.     }
  1200.     if ((ret_flags & PR_POLL_READ) && (SSL_DataPending(fd) > 0)) {
  1201. *out_flags = PR_POLL_READ; /* it's ready already. */
  1202.     } else if (ret_flags && (fd->lower->methods->poll != NULL)) {
  1203.         ret_flags = fd->lower->methods->poll(fd->lower, ret_flags, out_flags);
  1204.     }
  1205.     return ret_flags;
  1206. }
  1207. PRBool
  1208. ssl_FdIsBlocking(PRFileDesc *fd)
  1209. {
  1210.     PRSocketOptionData opt;
  1211.     PRStatus           status;
  1212.     opt.option             = PR_SockOpt_Nonblocking;
  1213.     opt.value.non_blocking = PR_FALSE;
  1214.     status = PR_GetSocketOption(fd, &opt);
  1215.     if (status != PR_SUCCESS)
  1216. return PR_FALSE;
  1217.     return (PRBool)!opt.value.non_blocking;
  1218. }
  1219. PRBool
  1220. ssl_SocketIsBlocking(sslSocket *ss)
  1221. {
  1222.     return ssl_FdIsBlocking(ss->fd);
  1223. }
  1224. PRInt32  sslFirstBufSize = 8 * 1024;
  1225. PRInt32  sslCopyLimit    = 1024;
  1226. static PRInt32 PR_CALLBACK
  1227. ssl_WriteV(PRFileDesc *fd, const PRIOVec *iov, PRInt32 vectors, 
  1228.            PRIntervalTime timeout)
  1229. {
  1230.     PRInt32            bufLen;
  1231.     PRInt32            left;
  1232.     PRInt32            rv;
  1233.     PRInt32            sent      =  0;
  1234.     const PRInt32      first_len = sslFirstBufSize;
  1235.     const PRInt32      limit     = sslCopyLimit;
  1236.     PRBool             blocking;
  1237.     PRIOVec            myIov  = { 0, 0 };
  1238.     char               buf[MAX_FRAGMENT_LENGTH];
  1239.     if (vectors > PR_MAX_IOVECTOR_SIZE) {
  1240.      PORT_SetError(PR_BUFFER_OVERFLOW_ERROR);
  1241. return -1;
  1242.     }
  1243.     blocking = ssl_FdIsBlocking(fd);
  1244. #define K16 sizeof(buf)
  1245. #define KILL_VECTORS while (vectors && !iov->iov_len) { ++iov; --vectors; }
  1246. #define GET_VECTOR   do { myIov = *iov++; --vectors; KILL_VECTORS } while (0)
  1247. #define HANDLE_ERR(rv, len) 
  1248.     if (rv != len) { 
  1249. if (rv < 0) { 
  1250.     if (blocking 
  1251. && (PR_GetError() == PR_WOULD_BLOCK_ERROR) 
  1252. && (sent > 0)) { 
  1253. return sent; 
  1254.     } else { 
  1255. return -1; 
  1256.     } 
  1257. /* Only a nonblocking socket can have partial sends */ 
  1258. PR_ASSERT(blocking); 
  1259. return sent; 
  1260.     } 
  1261. #define SEND(bfr, len) 
  1262.     do { 
  1263. rv = ssl_Send(fd, bfr, len, 0, timeout); 
  1264. HANDLE_ERR(rv, len) 
  1265. sent += len; 
  1266.     } while (0)
  1267.     /* Make sure the first write is at least 8 KB, if possible. */
  1268.     KILL_VECTORS
  1269.     if (!vectors)
  1270. return 0;
  1271.     GET_VECTOR;
  1272.     if (!vectors) {
  1273. return ssl_Send(fd, myIov.iov_base, myIov.iov_len, 0, timeout);
  1274.     }
  1275.     if (myIov.iov_len < first_len) {
  1276. PORT_Memcpy(buf, myIov.iov_base, myIov.iov_len);
  1277. bufLen = myIov.iov_len;
  1278. left = first_len - bufLen;
  1279. while (vectors && left) {
  1280.     int toCopy;
  1281.     GET_VECTOR;
  1282.     toCopy = PR_MIN(left, myIov.iov_len);
  1283.     PORT_Memcpy(buf + bufLen, myIov.iov_base, toCopy);
  1284.     bufLen         += toCopy;
  1285.     left           -= toCopy;
  1286.     myIov.iov_base += toCopy;
  1287.     myIov.iov_len  -= toCopy;
  1288. }
  1289. SEND( buf, bufLen );
  1290.     }
  1291.     while (vectors || myIov.iov_len) {
  1292. PRInt32   addLen;
  1293. if (!myIov.iov_len) {
  1294.     GET_VECTOR;
  1295. }
  1296. while (myIov.iov_len >= K16) {
  1297.     SEND(myIov.iov_base, K16);
  1298.     myIov.iov_base += K16;
  1299.     myIov.iov_len  -= K16;
  1300. }
  1301. if (!myIov.iov_len)
  1302.     continue;
  1303. if (!vectors || myIov.iov_len > limit) {
  1304.     addLen = 0;
  1305. } else if ((addLen = iov->iov_len % K16) + myIov.iov_len <= limit) {
  1306.     /* Addlen is already computed. */;
  1307. } else if (vectors > 1 && 
  1308.      iov[1].iov_len % K16 + addLen + myIov.iov_len <= 2 * limit) {
  1309.      addLen = limit - myIov.iov_len;
  1310. } else 
  1311.     addLen = 0;
  1312. if (!addLen) {
  1313.     SEND( myIov.iov_base, myIov.iov_len );
  1314.     myIov.iov_len = 0;
  1315.     continue;
  1316. }
  1317. PORT_Memcpy(buf, myIov.iov_base, myIov.iov_len);
  1318. bufLen = myIov.iov_len;
  1319. do {
  1320.     GET_VECTOR;
  1321.     PORT_Memcpy(buf + bufLen, myIov.iov_base, addLen);
  1322.     myIov.iov_base += addLen;
  1323.     myIov.iov_len  -= addLen;
  1324.     bufLen         += addLen;
  1325.     left = PR_MIN( limit, K16 - bufLen);
  1326.     if (!vectors  /* no more left */
  1327.     ||  myIov.iov_len > 0 /* we didn't use that one all up */
  1328.     ||  bufLen >= K16 /* it's full. */
  1329.     ) {
  1330. addLen = 0;
  1331.     } else if ((addLen = iov->iov_len % K16) <= left) {
  1332. /* Addlen is already computed. */;
  1333.     } else if (vectors > 1 && 
  1334.  iov[1].iov_len % K16 + addLen <= left + limit) {
  1335.  addLen = left;
  1336.     } else 
  1337. addLen = 0;
  1338. } while (addLen);
  1339. SEND( buf, bufLen );
  1340.     } 
  1341.     return sent;
  1342. }
  1343. /*
  1344.  * These functions aren't implemented.
  1345.  */
  1346. static PRInt32 PR_CALLBACK
  1347. ssl_Available(PRFileDesc *fd)
  1348. {
  1349.     PORT_Assert(0);
  1350.     PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
  1351.     return SECFailure;
  1352. }
  1353. static PRInt64 PR_CALLBACK
  1354. ssl_Available64(PRFileDesc *fd)
  1355. {
  1356.     PRInt64 res;
  1357.     PORT_Assert(0);
  1358.     PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
  1359.     LL_I2L(res, -1L);
  1360.     return res;
  1361. }
  1362. static PRStatus PR_CALLBACK
  1363. ssl_FSync(PRFileDesc *fd)
  1364. {
  1365.     PORT_Assert(0);
  1366.     PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
  1367.     return PR_FAILURE;
  1368. }
  1369. static PRInt32 PR_CALLBACK
  1370. ssl_Seek(PRFileDesc *fd, PRInt32 offset, PRSeekWhence how) {
  1371.     PORT_Assert(0);
  1372.     PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
  1373.     return SECFailure;
  1374. }
  1375. static PRInt64 PR_CALLBACK
  1376. ssl_Seek64(PRFileDesc *fd, PRInt64 offset, PRSeekWhence how) {
  1377.     PRInt64 res;
  1378.     PORT_Assert(0);
  1379.     PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
  1380.     LL_I2L(res, -1L);
  1381.     return res;
  1382. }
  1383. static PRStatus PR_CALLBACK
  1384. ssl_FileInfo(PRFileDesc *fd, PRFileInfo *info)
  1385. {
  1386.     PORT_Assert(0);
  1387.     PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
  1388.     return PR_FAILURE;
  1389. }
  1390. static PRStatus PR_CALLBACK
  1391. ssl_FileInfo64(PRFileDesc *fd, PRFileInfo64 *info)
  1392. {
  1393.     PORT_Assert(0);
  1394.     PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
  1395.     return PR_FAILURE;
  1396. }
  1397. static PRInt32 PR_CALLBACK
  1398. ssl_RecvFrom(PRFileDesc *fd, void *buf, PRInt32 amount, PRIntn flags,
  1399.      PRNetAddr *addr, PRIntervalTime timeout)
  1400. {
  1401.     PORT_Assert(0);
  1402.     PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
  1403.     return SECFailure;
  1404. }
  1405. static PRInt32 PR_CALLBACK
  1406. ssl_SendTo(PRFileDesc *fd, const void *buf, PRInt32 amount, PRIntn flags,
  1407.    const PRNetAddr *addr, PRIntervalTime timeout)
  1408. {
  1409.     PORT_Assert(0);
  1410.     PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0);
  1411.     return SECFailure;
  1412. }
  1413. static const PRIOMethods ssl_methods = {
  1414.     PR_DESC_LAYERED,
  1415.     ssl_Close,            /* close        */
  1416.     ssl_Read,             /* read         */
  1417.     ssl_Write,            /* write        */
  1418.     ssl_Available,        /* available    */
  1419.     ssl_Available64,      /* available64  */
  1420.     ssl_FSync,            /* fsync        */
  1421.     ssl_Seek,             /* seek         */
  1422.     ssl_Seek64,           /* seek64       */
  1423.     ssl_FileInfo,         /* fileInfo     */
  1424.     ssl_FileInfo64,       /* fileInfo64   */
  1425.     ssl_WriteV,           /* writev       */
  1426.     ssl_Connect,          /* connect      */
  1427.     ssl_Accept,           /* accept       */
  1428.     ssl_Bind,             /* bind         */
  1429.     ssl_Listen,           /* listen       */
  1430.     ssl_Shutdown,         /* shutdown     */
  1431.     ssl_Recv,             /* recv         */
  1432.     ssl_Send,             /* send         */
  1433.     ssl_RecvFrom,         /* recvfrom     */
  1434.     ssl_SendTo,           /* sendto       */
  1435.     ssl_Poll,             /* poll         */
  1436.     ssl_EmulateAcceptRead,      /* acceptread   */
  1437.     ssl_EmulateTransmitFile,    /* transmitfile */
  1438.     ssl_GetSockName,      /* getsockname  */
  1439.     ssl_GetPeerName,      /* getpeername  */
  1440.     NULL,                 /* getsockopt   OBSOLETE */
  1441.     NULL,                 /* setsockopt   OBSOLETE */
  1442.     NULL,                 /* getsocketoption   */
  1443.     NULL,                 /* setsocketoption   */
  1444.     ssl_EmulateSendFile,  /* Send a (partial) file with header/trailer*/
  1445.     NULL,                 /* reserved for future use */
  1446.     NULL,                 /* reserved for future use */
  1447.     NULL,                 /* reserved for future use */
  1448.     NULL,                 /* reserved for future use */
  1449.     NULL                  /* reserved for future use */
  1450. };
  1451. static PRIOMethods combined_methods;
  1452. static void
  1453. ssl_SetupIOMethods(void)
  1454. {
  1455.           PRIOMethods *new_methods  = &combined_methods;
  1456.     const PRIOMethods *nspr_methods = PR_GetDefaultIOMethods();
  1457.     const PRIOMethods *my_methods   = &ssl_methods;
  1458.     *new_methods = *nspr_methods;
  1459.     new_methods->file_type         = my_methods->file_type;
  1460.     new_methods->close             = my_methods->close;
  1461.     new_methods->read              = my_methods->read;
  1462.     new_methods->write             = my_methods->write;
  1463.     new_methods->available         = my_methods->available;
  1464.     new_methods->available64       = my_methods->available64;
  1465.     new_methods->fsync             = my_methods->fsync;
  1466.     new_methods->seek              = my_methods->seek;
  1467.     new_methods->seek64            = my_methods->seek64;
  1468.     new_methods->fileInfo          = my_methods->fileInfo;
  1469.     new_methods->fileInfo64        = my_methods->fileInfo64;
  1470.     new_methods->writev            = my_methods->writev;
  1471.     new_methods->connect           = my_methods->connect;
  1472.     new_methods->accept            = my_methods->accept;
  1473.     new_methods->bind              = my_methods->bind;
  1474.     new_methods->listen            = my_methods->listen;
  1475.     new_methods->shutdown          = my_methods->shutdown;
  1476.     new_methods->recv              = my_methods->recv;
  1477.     new_methods->send              = my_methods->send;
  1478.     new_methods->recvfrom          = my_methods->recvfrom;
  1479.     new_methods->sendto            = my_methods->sendto;
  1480.     new_methods->poll              = my_methods->poll;
  1481.     new_methods->acceptread        = my_methods->acceptread;
  1482.     new_methods->transmitfile      = my_methods->transmitfile;
  1483.     new_methods->getsockname       = my_methods->getsockname;
  1484.     new_methods->getpeername       = my_methods->getpeername;
  1485. /*  new_methods->getsocketoption   = my_methods->getsocketoption; */
  1486. /*  new_methods->setsocketoption   = my_methods->setsocketoption; */
  1487.     new_methods->sendfile          = my_methods->sendfile;
  1488. }
  1489. static PRCallOnceType initIoLayerOnce;
  1490. static PRStatus  
  1491. ssl_InitIOLayer(void)
  1492. {
  1493.     ssl_layer_id = PR_GetUniqueIdentity("SSL");
  1494.     ssl_SetupIOMethods();
  1495.     ssl_inited = PR_TRUE;
  1496.     return PR_SUCCESS;
  1497. }
  1498. static PRStatus
  1499. ssl_PushIOLayer(sslSocket *ns, PRFileDesc *stack, PRDescIdentity id)
  1500. {
  1501.     PRFileDesc *layer = NULL;
  1502.     PRStatus    status;
  1503.     if (!ssl_inited) {
  1504. PR_CallOnce(&initIoLayerOnce, &ssl_InitIOLayer);
  1505.     }
  1506.     if (ns == NULL)
  1507. goto loser;
  1508.     layer = PR_CreateIOLayerStub(ssl_layer_id, &combined_methods);
  1509.     if (layer == NULL)
  1510. goto loser;
  1511.     layer->secret = (PRFilePrivate *)ns;
  1512.     /* Here, "stack" points to the PRFileDesc on the top of the stack.
  1513.     ** "layer" points to a new FD that is to be inserted into the stack.
  1514.     ** If layer is being pushed onto the top of the stack, then 
  1515.     ** PR_PushIOLayer switches the contents of stack and layer, and then
  1516.     ** puts stack on top of layer, so that after it is done, the top of 
  1517.     ** stack is the same "stack" as it was before, and layer is now the 
  1518.     ** FD for the former top of stack.
  1519.     ** After this call, stack always points to the top PRFD on the stack.
  1520.     ** If this function fails, the contents of stack and layer are as 
  1521.     ** they were before the call.
  1522.     */
  1523.     status = PR_PushIOLayer(stack, id, layer);
  1524.     if (status != PR_SUCCESS)
  1525. goto loser;
  1526.     ns->fd = (id == PR_TOP_IO_LAYER) ? stack : layer;
  1527.     return PR_SUCCESS;
  1528. loser:
  1529.     if (layer) {
  1530. layer->dtor(layer); /* free layer */
  1531.     }
  1532.     return PR_FAILURE;
  1533. }
  1534. /*
  1535. ** Create a newsocket structure for a file descriptor.
  1536. */
  1537. static sslSocket *
  1538. ssl_NewSocket(void)
  1539. {
  1540.     sslSocket *ss;
  1541. #ifdef DEBUG
  1542.     static int firsttime = 1;
  1543. #endif
  1544. #ifdef DEBUG
  1545. #if defined(XP_UNIX) || defined(XP_WIN32)
  1546.     if (firsttime) {
  1547. firsttime = 0;
  1548. {
  1549.     char *ev = getenv("SSLDEBUG");
  1550.     if (ev && ev[0]) {
  1551. ssl_debug = atoi(ev);
  1552. SSL_TRACE(("SSL: debugging set to %d", ssl_debug));
  1553.     }
  1554. }
  1555. #ifdef TRACE
  1556. {
  1557.     char *ev = getenv("SSLTRACE");
  1558.     if (ev && ev[0]) {
  1559. ssl_trace = atoi(ev);
  1560. SSL_TRACE(("SSL: tracing set to %d", ssl_trace));
  1561.     }
  1562. }
  1563. #endif /* TRACE */
  1564.     }
  1565. #endif /* XP_UNIX || XP_WIN32 */
  1566. #endif /* DEBUG */
  1567.     /* Make a new socket and get it ready */
  1568.     ss = (sslSocket*) PORT_ZAlloc(sizeof(sslSocket));
  1569.     if (ss) {
  1570.         /* This should be of type SSLKEAType, but CC on IRIX
  1571.  * complains during the for loop.
  1572.  */
  1573. int i;
  1574.  
  1575. ss->useSecurity        = ssl_defaults.useSecurity;
  1576. ss->useSocks           = ssl_defaults.useSocks;
  1577. ss->requestCertificate = ssl_defaults.requestCertificate;
  1578. ss->requireCertificate = ssl_defaults.requireCertificate;
  1579. ss->handshakeAsClient  = ssl_defaults.handshakeAsClient;
  1580. ss->handshakeAsServer  = ssl_defaults.handshakeAsServer;
  1581. ss->enableSSL2         = ssl_defaults.enableSSL2;
  1582. ss->enableSSL3         = ssl_defaults.enableSSL3;
  1583. ss->enableTLS          = ssl_defaults.enableTLS ;
  1584. ss->fdx                = ssl_defaults.fdx;
  1585. ss->v2CompatibleHello  = ssl_defaults.v2CompatibleHello;
  1586. ss->detectRollBack     = ssl_defaults.detectRollBack;
  1587. memset(&ss->peer, 0, sizeof(ss->peer));
  1588. ss->port               = 0;
  1589. ss->noCache            = ssl_defaults.noCache;
  1590. ss->peerID             = NULL;
  1591. ss->rTimeout        = PR_INTERVAL_NO_TIMEOUT;
  1592. ss->wTimeout        = PR_INTERVAL_NO_TIMEOUT;
  1593. ss->cTimeout        = PR_INTERVAL_NO_TIMEOUT;
  1594. ss->cipherSpecs        = NULL;
  1595.         ss->sizeCipherSpecs    = 0;  /* produced lazily */
  1596.         ss->preferredCipher    = NULL;
  1597.         ss->url                = NULL;
  1598. for (i=kt_null; i < kt_kea_size; i++) {
  1599.     ss->serverCert[i]      = NULL;
  1600.     ss->serverCertChain[i] = NULL;
  1601.     ss->serverKey[i]       = NULL;
  1602. }
  1603. ss->stepDownKeyPair    = NULL;
  1604. ss->dbHandle           = CERT_GetDefaultCertDB();
  1605. /* Provide default implementation of hooks */
  1606. ss->authCertificate    = SSL_AuthCertificate;
  1607. ss->authCertificateArg = (void *)ss->dbHandle;
  1608. ss->getClientAuthData  = NULL;
  1609. ss->handleBadCert      = NULL;
  1610. ss->badCertArg         = NULL;
  1611. ss->pkcs11PinArg       = NULL;
  1612. ssl_ChooseOps(ss);
  1613. ssl2_InitSocketPolicy(ss);
  1614. ssl3_InitSocketPolicy(ss);
  1615. ss->firstHandshakeLock = PR_NewMonitor();
  1616. ss->ssl3HandshakeLock  = PR_NewMonitor();
  1617. ss->specLock           = NSSRWLock_New(SSL_LOCK_RANK_SPEC, NULL);
  1618. ss->recvBufLock        = PR_NewMonitor();
  1619. ss->xmitBufLock        = PR_NewMonitor();
  1620. if (ssl_lock_readers) {
  1621.     ss->recvLock       = PR_NewLock();
  1622.     ss->sendLock       = PR_NewLock();
  1623. }
  1624.     }
  1625.     return ss;
  1626. }