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

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * This file is PRIVATE to SSL and should be the first thing included by
  3.  * any SSL implementation file.
  4.  *
  5.  * The contents of this file are subject to the Mozilla Public
  6.  * License Version 1.1 (the "License"); you may not use this file
  7.  * except in compliance with the License. You may obtain a copy of
  8.  * the License at http://www.mozilla.org/MPL/
  9.  * 
  10.  * Software distributed under the License is distributed on an "AS
  11.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  12.  * implied. See the License for the specific language governing
  13.  * rights and limitations under the License.
  14.  * 
  15.  * The Original Code is the Netscape security libraries.
  16.  * 
  17.  * The Initial Developer of the Original Code is Netscape
  18.  * Communications Corporation.  Portions created by Netscape are 
  19.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  20.  * Rights Reserved.
  21.  * 
  22.  * Contributor(s):
  23.  * 
  24.  * Alternatively, the contents of this file may be used under the
  25.  * terms of the GNU General Public License Version 2 or later (the
  26.  * "GPL"), in which case the provisions of the GPL are applicable 
  27.  * instead of those above.  If you wish to allow use of your 
  28.  * version of this file only under the terms of the GPL and not to
  29.  * allow others to use your version of this file under the MPL,
  30.  * indicate your decision by deleting the provisions above and
  31.  * replace them with the notice and other provisions required by
  32.  * the GPL.  If you do not delete the provisions above, a recipient
  33.  * may use your version of this file under either the MPL or the
  34.  * GPL.
  35.  *
  36.  * $Id: sslimpl.h,v 1.4 2000/09/12 20:15:43 jgmyers%netscape.com Exp $
  37.  */
  38. #ifndef __sslimpl_h_
  39. #define __sslimpl_h_
  40. #ifdef DEBUG
  41. #undef NDEBUG
  42. #else
  43. #undef NDEBUG
  44. #define NDEBUG
  45. #endif
  46. #include "secport.h"
  47. #include "secerr.h"
  48. #include "sslerr.h"
  49. #include "ssl3prot.h"
  50. #include "hasht.h"
  51. #include "prlock.h"
  52. #include "pkcs11t.h"
  53. #ifdef XP_UNIX
  54. #include "unistd.h"
  55. #endif
  56. #include "nssrwlk.h"
  57. #if defined(DEBUG) || defined(TRACE)
  58. #ifdef __cplusplus
  59. #define Debug 1
  60. #else
  61. extern int Debug;
  62. #endif
  63. #else
  64. #undef Debug
  65. #endif
  66. #if defined(DEBUG)
  67. #define TRACE
  68. #endif
  69. #ifdef TRACE
  70. #define SSL_TRC(a,b) if (ssl_trace >= (a)) ssl_Trace b
  71. #define PRINT_BUF(a,b) if (ssl_trace >= (a)) ssl_PrintBuf b
  72. #define DUMP_MSG(a,b) if (ssl_trace >= (a)) ssl_DumpMsg b
  73. #else
  74. #define SSL_TRC(a,b)
  75. #define PRINT_BUF(a,b)
  76. #define DUMP_MSG(a,b)
  77. #endif
  78. #ifdef DEBUG
  79. #define SSL_DBG(b) if (ssl_debug) ssl_Trace b
  80. #else
  81. #define SSL_DBG(b)
  82. #endif
  83. #if defined (DEBUG)
  84. #ifdef macintosh
  85. #include "pprthred.h"
  86. #else
  87. #include "private/pprthred.h" /* for PR_InMonitor() */
  88. #endif
  89. #define ssl_InMonitor(m) PR_InMonitor(m)
  90. #endif
  91. #define LSB(x) ((unsigned char) (x & 0xff))
  92. #define MSB(x) ((unsigned char) (((unsigned)(x)) >> 8))
  93. /************************************************************************/
  94. typedef enum { SSLAppOpRead = 0,
  95.        SSLAppOpWrite,
  96.        SSLAppOpRDWR,
  97.        SSLAppOpPost,
  98.        SSLAppOpHeader
  99. } SSLAppOperation;
  100. #define SSL_MIN_MASTER_KEY_BYTES 5
  101. #define SSL_MAX_MASTER_KEY_BYTES 64
  102. #define SSL_SESSIONID_BYTES 16
  103. #define SSL3_SESSIONID_BYTES 32
  104. #define SSL_MIN_CHALLENGE_BYTES 16
  105. #define SSL_MAX_CHALLENGE_BYTES 32
  106. #define SSL_CHALLENGE_BYTES 16
  107. #define SSL_CONNECTIONID_BYTES 16
  108. #define SSL_MIN_CYPHER_ARG_BYTES 0
  109. #define SSL_MAX_CYPHER_ARG_BYTES 32
  110. #define SSL_MAX_MAC_BYTES 16
  111. /* number of wrap mechanisms potentially used to wrap master secrets. */
  112. #define SSL_NUM_WRAP_MECHS              13
  113. /* This makes the cert cache entry exactly 4k. */
  114. #define SSL_MAX_CACHED_CERT_LEN 4060
  115. typedef struct sslBufferStr             sslBuffer;
  116. typedef struct sslConnectInfoStr        sslConnectInfo;
  117. typedef struct sslGatherStr             sslGather;
  118. typedef struct sslSecurityInfoStr       sslSecurityInfo;
  119. typedef struct sslSessionIDStr          sslSessionID;
  120. typedef struct sslSocketStr             sslSocket;
  121. typedef struct sslSocketOpsStr          sslSocketOps;
  122. typedef struct sslSocksInfoStr          sslSocksInfo;
  123. typedef struct ssl3StateStr             ssl3State;
  124. typedef struct ssl3CertNodeStr          ssl3CertNode;
  125. typedef struct ssl3BulkCipherDefStr     ssl3BulkCipherDef;
  126. typedef struct ssl3MACDefStr            ssl3MACDef;
  127. typedef struct ssl3KeyPairStr ssl3KeyPair;
  128. struct ssl3CertNodeStr {
  129.     struct ssl3CertNodeStr *next;
  130.     CERTCertificate *       cert;
  131. };
  132. typedef SECStatus (*sslHandshakeFunc)(sslSocket *ss);
  133. /* This type points to the low layer send func, 
  134. ** e.g. ssl2_SendStream or ssl3_SendPlainText.
  135. ** These functions return the same values as PR_Send, 
  136. ** i.e.  >= 0 means number of bytes sent, < 0 means error.
  137. */
  138. typedef PRInt32       (*sslSendFunc)(sslSocket *ss, const unsigned char *buf,
  139.              PRInt32 n, PRInt32 flags);
  140. typedef void          (*sslSessionIDCacheFunc)  (sslSessionID *sid);
  141. typedef void          (*sslSessionIDUncacheFunc)(sslSessionID *sid);
  142. typedef sslSessionID *(*sslSessionIDLookupFunc)(const PRIPv6Addr    *addr,
  143. unsigned char* sid,
  144. unsigned int   sidLen,
  145.                                                 CERTCertDBHandle * dbHandle);
  146. /* Socket ops */
  147. struct sslSocketOpsStr {
  148.     int         (*connect) (sslSocket *, const PRNetAddr *);
  149.     PRFileDesc *(*accept)  (sslSocket *, PRNetAddr *);
  150.     int         (*bind)    (sslSocket *, const PRNetAddr *);
  151.     int         (*listen)  (sslSocket *, int);
  152.     int         (*shutdown)(sslSocket *, int);
  153.     int         (*close)   (sslSocket *);
  154.     int         (*recv)    (sslSocket *, unsigned char *, int, int);
  155.     /* points to the higher-layer send func, e.g. ssl_SecureSend. */
  156.     int         (*send)    (sslSocket *, const unsigned char *, int, int);
  157.     int         (*read)    (sslSocket *, unsigned char *, int);
  158.     int         (*write)   (sslSocket *, const unsigned char *, int);
  159.     int         (*getpeername)(sslSocket *, PRNetAddr *);
  160.     int         (*getsockname)(sslSocket *, PRNetAddr *);
  161. };
  162. /* Flags interpreted by ssl send functions. */
  163. #define ssl_SEND_FLAG_FORCE_INTO_BUFFER 0x40000000
  164. #define ssl_SEND_FLAG_NO_BUFFER 0x20000000
  165. #define ssl_SEND_FLAG_MASK 0x7f000000
  166. /*
  167. ** A buffer object.
  168. */
  169. struct sslBufferStr {
  170.     unsigned char * buf;
  171.     unsigned int  len;
  172.     unsigned int  space;
  173. };
  174. /*
  175. ** SSL3 cipher suite policy and preference struct.
  176. */
  177. typedef struct {
  178. #ifdef AIX
  179.     unsigned int    cipher_suite : 16;
  180.     unsigned int    policy       :  8;
  181.     unsigned int    enabled      :  1;
  182.     unsigned int    isPresent    :  1;
  183. #else
  184.     ssl3CipherSuite cipher_suite;
  185.     PRUint8         policy;
  186.     unsigned char   enabled   : 1;
  187.     unsigned char   isPresent : 1;
  188. #endif
  189. } ssl3CipherSuiteCfg;
  190. #define ssl_V3_SUITES_IMPLEMENTED 13
  191. typedef struct sslOptionsStr {
  192.     unsigned int useSecurity : 1;  /*  1 */
  193.     unsigned int useSocks : 1;  /*  2 */
  194.     unsigned int requestCertificate : 1;  /*  3 */
  195.     unsigned int requireCertificate : 2;  /*  4-5 */
  196.     unsigned int handshakeAsClient : 1;  /*  6 */
  197.     unsigned int handshakeAsServer : 1;  /*  7 */
  198.     unsigned int enableSSL2 : 1;  /*  8 */
  199.     unsigned int enableSSL3 : 1;  /*  9 */
  200.     unsigned int enableTLS : 1;  /* 10 */
  201.     unsigned int noCache : 1;  /* 11 */
  202.     unsigned int fdx : 1;  /* 12 */
  203.     unsigned int v2CompatibleHello : 1;  /* 13 */
  204.     unsigned int detectRollBack   : 1;  /* 14 */
  205. } sslOptions;
  206. /*
  207. ** SSL Socket struct
  208. **
  209. ** Protection:  XXX
  210. */
  211. struct sslSocketStr {
  212.     PRFileDesc * fd;
  213.     /* Pointer to operations vector for this socket */
  214.     sslSocketOps * ops;
  215.     /* State flags */
  216.     unsigned int     useSocks : 1;
  217.     unsigned int     useSecurity : 1;
  218.     unsigned int     requestCertificate : 1;
  219.     unsigned int     requireCertificate : 2;
  220.     unsigned int     handshakeAsClient : 1;
  221.     unsigned int     handshakeAsServer : 1;
  222.     unsigned int     enableSSL2 : 1;
  223.     unsigned int     enableSSL3 : 1;
  224.     unsigned int     enableTLS : 1;
  225.     unsigned int     clientAuthRequested: 1;
  226.     unsigned int     noCache : 1;
  227.     unsigned int     fdx : 1; /* simultaneous read/write threads */
  228.     unsigned int     v2CompatibleHello : 1; /* Send v3+ client hello in v2 format */
  229.     unsigned int     detectRollBack    : 1; /* Detect rollback to SSL v3 */
  230.     unsigned int     connected : 1; /* initial handshake is complete. */
  231.     unsigned int     recvdCloseNotify : 1; /* received SSL EOF. */
  232.     /* version of the protocol to use */
  233.     SSL3ProtocolVersion version;
  234.     SSL3ProtocolVersion clientHelloVersion; /* version sent in client hello. */
  235.     /* Non-zero if socks is enabled */
  236.     sslSocksInfo *   socks;
  237.     /* Non-zero if security is enabled */
  238.     sslSecurityInfo *sec;
  239.     /* protected by firstHandshakeLock AND (in ssl3) ssl3HandshakeLock. */
  240.     const char      *url; /* ssl 2 & 3 */
  241.     /* Gather object used for gathering data */
  242.     sslGather *      gather; /*recvBufLock*/
  243.     sslHandshakeFunc handshake; /*firstHandshakeLock*/
  244.     sslHandshakeFunc nextHandshake; /*firstHandshakeLock*/
  245.     sslHandshakeFunc securityHandshake; /*firstHandshakeLock*/
  246.     sslBuffer        saveBuf; /*xmitBufLock*/
  247.     sslBuffer        pendingBuf; /*xmitBufLock*/
  248.     /* the following 3 variables are only used with socks or other proxies. */
  249.     PRIPv6Addr       peer; /* Target server IP address */
  250.     int              port; /* Target server port number. */
  251.     char *           peerID; /* String uniquely identifies target server. */
  252.     /* End of socks variables. */
  253.     ssl3State *      ssl3;
  254.     unsigned char *  cipherSpecs;
  255.     unsigned int     sizeCipherSpecs;
  256. const unsigned char *  preferredCipher;
  257.     /* Configuration state for server sockets */
  258.     CERTCertificate *     serverCert[kt_kea_size];
  259.     CERTCertificateList * serverCertChain[kt_kea_size];
  260.     SECKEYPrivateKey *    serverKey[kt_kea_size];
  261.     ssl3KeyPair *         stepDownKeyPair; /* RSA step down keys */
  262.     /* Callbacks */
  263.     SSLAuthCertificate        authCertificate;
  264.     void                     *authCertificateArg;
  265.     SSLGetClientAuthData      getClientAuthData;
  266.     void                     *getClientAuthDataArg;
  267.     SSLBadCertHandler         handleBadCert;
  268.     void                     *badCertArg;
  269.     SSLHandshakeCallback      handshakeCallback;
  270.     void                     *handshakeCallbackData;
  271.     void                     *pkcs11PinArg;
  272.     PRIntervalTime            rTimeout; /* timeout for NSPR I/O */
  273.     PRIntervalTime            wTimeout; /* timeout for NSPR I/O */
  274.     PRIntervalTime            cTimeout; /* timeout for NSPR I/O */
  275.     PRLock *      recvLock; /* lock against multiple reader threads. */
  276.     PRLock *      sendLock; /* lock against multiple sender threads. */
  277.     PRMonitor *   recvBufLock; /* locks low level recv buffers. */
  278.     PRMonitor *   xmitBufLock; /* locks low level xmit buffers. */
  279.     /* Only one thread may operate on the socket until the initial handshake
  280.     ** is complete.  This Monitor ensures that.  Since SSL2 handshake is
  281.     ** only done once, this is also effectively the SSL2 handshake lock.
  282.     */
  283.     PRMonitor *   firstHandshakeLock; 
  284.     /* This monitor protects the ssl3 handshake state machine data.
  285.     ** Only one thread (reader or writer) may be in the ssl3 handshake state
  286.     ** machine at any time.  */
  287.     PRMonitor *   ssl3HandshakeLock;
  288.     /* reader/writer lock, protects the secret data needed to encrypt and MAC
  289.     ** outgoing records, and to decrypt and MAC check incoming ciphertext 
  290.     ** records.  */
  291.     NSSRWLock *   specLock;
  292.     /* handle to perm cert db (and implicitly to the temp cert db) used 
  293.     ** with this socket. 
  294.     */
  295.     CERTCertDBHandle * dbHandle;
  296.     PRUint16 shutdownHow;  /* See ssl_SHUTDOWN defines below. */
  297.     PRUint16 allowedByPolicy;          /* copy of global policy bits. */
  298.     PRUint16 maybeAllowedByPolicy;     /* copy of global policy bits. */
  299.     PRUint16 chosenPreference;         /* SSL2 cipher preferences. */
  300.     ssl3CipherSuiteCfg cipherSuites[ssl_V3_SUITES_IMPLEMENTED];
  301. };
  302. #define SSL_LOCK_RANK_SPEC  255
  303. #define SSL_LOCK_RANK_GLOBAL  NSS_RWLOCK_RANK_NONE
  304. /* These are the valid values for shutdownHow. 
  305. ** These values are each 1 greater than the NSPR values, and the code
  306. ** depends on that relation to efficiently convert PR_SHUTDOWN values 
  307. ** into ssl_SHUTDOWN values.  These values use one bit for read, and 
  308. ** another bit for write, and can be used as bitmasks.
  309. */
  310. #define ssl_SHUTDOWN_NONE 0 /* NOT shutdown at all */
  311. #define ssl_SHUTDOWN_RCV 1 /* PR_SHUTDOWN_RCV  +1 */
  312. #define ssl_SHUTDOWN_SEND 2 /* PR_SHUTDOWN_SEND +1 */
  313. #define ssl_SHUTDOWN_BOTH 3 /* PR_SHUTDOWN_BOTH +1 */
  314. /*
  315. ** A gather object. Used to read some data until a count has been
  316. ** satisfied. Primarily for support of async sockets.
  317. ** Everything in here is protected by the recvBufLock.
  318. */
  319. struct sslGatherStr {
  320.     int           state; /* see GS_ values below. */     /* ssl 2 & 3 */
  321.     /* "buf" holds received plaintext SSL records, after decrypt and MAC check.
  322.      * SSL2: recv'd ciphertext records are put here, then decrypted in place.
  323.      * SSL3: recv'd ciphertext records are put in inbuf (see below), then 
  324.      *       decrypted into buf.
  325.      */
  326.     sslBuffer     buf; /*recvBufLock*/ /* ssl 2 & 3 */
  327.     /* number of bytes previously read into hdr or buf(ssl2) or inbuf (ssl3). 
  328.     ** (offset - writeOffset) is the number of ciphertext bytes read in but 
  329.     **     not yet deciphered.
  330.     */
  331.     unsigned int  offset;                                       /* ssl 2 & 3 */
  332.     /* number of bytes to read in next call to ssl_DefRecv (recv) */
  333.     unsigned int  remainder;                                    /* ssl 2 & 3 */
  334.     /* Number of ciphertext bytes to read in after 2-byte SSL record header. */
  335.     unsigned int  count; /* ssl2 only */
  336.     /* size of the final plaintext record. 
  337.     ** == count - (recordPadding + MAC size)
  338.     */
  339.     unsigned int  recordLen; /* ssl2 only */
  340.     /* number of bytes of padding to be removed after decrypting. */
  341.     /* This value is taken from the record's hdr[2], which means a too large
  342.      * value could crash us.
  343.      */
  344.     unsigned int  recordPadding; /* ssl2 only */
  345.     /* plaintext DATA begins this many bytes into "buf".  */
  346.     unsigned int  recordOffset; /* ssl2 only */
  347.     int           encrypted;    /* SSL2 session is now encrypted.  ssl2 only */
  348.     /* These next two values are used by SSL2 and SSL3.  
  349.     ** DoRecv uses them to extract application data.
  350.     ** The difference between writeOffset and readOffset is the amount of 
  351.     ** data available to the application.   Note that the actual offset of 
  352.     ** the data in "buf" is recordOffset (above), not readOffset.
  353.     ** In the current implementation, this is made available before the 
  354.     ** MAC is checked!!
  355.     */
  356.     unsigned int  readOffset;  /* Spot where DATA reader (e.g. application
  357.                                ** or handshake code) will read next.
  358.                                ** Always zero for SSl3 application data.
  359.        */
  360.     /* offset in buf/inbuf/hdr into which new data will be read from socket. */
  361.     unsigned int  writeOffset; 
  362.     /* Buffer for ssl3 to read (encrypted) data from the socket */
  363.     sslBuffer     inbuf; /*recvBufLock*/ /* ssl3 only */
  364.     /* The ssl[23]_GatherData functions read data into this buffer, rather
  365.     ** than into buf or inbuf, while in the GS_HEADER state.  
  366.     ** The portion of the SSL record header put here always comes off the wire 
  367.     ** as plaintext, never ciphertext.
  368.     ** For SSL2, the plaintext portion is two bytes long.  For SSl3 it is 5.
  369.     */
  370.     unsigned char hdr[5]; /* ssl 2 & 3 */
  371. };
  372. /* sslGather.state */
  373. #define GS_INIT 0
  374. #define GS_HEADER 1
  375. #define GS_MAC 2
  376. #define GS_DATA 3
  377. #define GS_PAD 4
  378. typedef SECStatus (*SSLCipher)(void *               context, 
  379.                                unsigned char *      out,
  380.        int *                outlen, 
  381.        int                  maxout, 
  382.        const unsigned char *in,
  383.        int                  inlen);
  384. typedef SECStatus (*SSLDestroy)(void *context, PRBool freeit);
  385. /*
  386.  * SSL2 buffers used in SSL3.
  387.  *     writeBuf in the SecurityInfo maintained by sslsecur.c is used
  388.  *              to hold the data just about to be passed to the kernel
  389.  *     sendBuf in the ConnectInfo maintained by sslcon.c is used
  390.  *              to hold handshake messages as they are accumulated
  391.  */
  392. /*
  393. ** This is "ci", as in "ss->sec.ci".
  394. **
  395. ** Protection:  All the variables in here are protected by 
  396. ** firstHandshakeLock AND (in ssl3) ssl3HandshakeLock 
  397. */
  398. struct sslConnectInfoStr {
  399.     /* outgoing handshakes appended to this. */
  400.     sslBuffer       sendBuf;                 /*xmitBufLock*/ /* ssl 2 & 3 */
  401.     PRIPv6Addr      peer;                                       /* ssl 2 & 3 */
  402.     unsigned short  port;                                       /* ssl 2 & 3 */
  403.     sslSessionID   *sid;                                        /* ssl 2 & 3 */
  404.     /* see CIS_HAVE defines below for the bit values in *elements. */
  405.     char            elements; /* ssl2 only */
  406.     char            requiredElements; /* ssl2 only */
  407.     char            sentElements;                               /* ssl2 only */
  408.     char            sentFinished;                               /* ssl2 only */
  409.     /* Length of server challenge.  Used by client when saving challenge */
  410.     int             serverChallengeLen;                         /* ssl2 only */
  411.     /* type of authentication requested by server */
  412.     unsigned char   authType;                                   /* ssl2 only */
  413.     /* Challenge sent by client to server in client-hello message */
  414.     /* SSL3 gets a copy of this.  See ssl3_StartHandshakeHash().  */
  415.     unsigned char   clientChallenge[SSL_MAX_CHALLENGE_BYTES];   /* ssl 2 & 3 */
  416.     /* Connection-id sent by server to client in server-hello message */
  417.     unsigned char   connectionID[SSL_CONNECTIONID_BYTES]; /* ssl2 only */
  418.     /* Challenge sent by server to client in request-certificate message */
  419.     unsigned char   serverChallenge[SSL_MAX_CHALLENGE_BYTES]; /* ssl2 only */
  420.     /* Information kept to handle a request-certificate message */
  421.     unsigned char   readKey[SSL_MAX_MASTER_KEY_BYTES]; /* ssl2 only */
  422.     unsigned char   writeKey[SSL_MAX_MASTER_KEY_BYTES]; /* ssl2 only */
  423.     unsigned        keySize; /* ssl2 only */
  424. };
  425. /* bit values for ci->elements, ci->requiredElements, sentElements. */
  426. #define CIS_HAVE_MASTER_KEY 0x01
  427. #define CIS_HAVE_CERTIFICATE 0x02
  428. #define CIS_HAVE_FINISHED 0x04
  429. #define CIS_HAVE_VERIFY 0x08
  430. /* Note: The entire content of this struct and whatever it points to gets
  431.  * blown away by SSL_ResetHandshake().  This is "sec" as in "ss->sec".
  432.  *
  433.  * Unless otherwise specified below, the contents of this struct are 
  434.  * protected by firstHandshakeLock AND (in ssl3) ssl3HandshakeLock.
  435.  */
  436. struct sslSecurityInfoStr {
  437.     sslSendFunc      send; /*xmitBufLock*/ /* ssl 2 & 3 */
  438.     int              isServer; /* Spec Lock?*/ /* ssl 2 & 3 */
  439.     sslBuffer        writeBuf; /*xmitBufLock*/ /* ssl 2 & 3 */
  440.     int              cipherType; /* ssl 2 & 3 */
  441.     int              keyBits; /* ssl 2 & 3 */
  442.     int              secretKeyBits; /* ssl 2 & 3 */
  443.     CERTCertificate *peerCert; /* ssl 2 & 3 */
  444.     SECKEYPublicKey *peerKey; /* ssl3 only */
  445.     /*
  446.     ** Procs used for SID cache (nonce) management. 
  447.     ** Different implementations exist for clients/servers 
  448.     ** The lookup proc is only used for servers.  Baloney!
  449.     */
  450.     sslSessionIDCacheFunc     cache; /* ssl 2 & 3 */
  451.     sslSessionIDUncacheFunc   uncache; /* ssl 2 & 3 */
  452.     /*
  453.     ** everything below here is for ssl2 only.
  454.     ** This stuff is equivalent to SSL3's "spec", and is protected by the 
  455.     ** same "Spec Lock" as used for SSL3's specs.
  456.     */
  457.     uint32           sendSequence; /*xmitBufLock*/ /* ssl2 only */
  458.     uint32           rcvSequence; /*recvBufLock*/ /* ssl2 only */
  459.     /* Hash information; used for one-way-hash functions (MD2, MD5, etc.) */
  460.     SECHashObject   *hash; /* Spec Lock */ /* ssl2 only */
  461.     void            *hashcx; /* Spec Lock */ /* ssl2 only */
  462.     SECItem          sendSecret; /* Spec Lock */ /* ssl2 only */
  463.     SECItem          rcvSecret; /* Spec Lock */ /* ssl2 only */
  464.     /* Session cypher contexts; one for each direction */
  465.     void            *readcx; /* Spec Lock */ /* ssl2 only */
  466.     void            *writecx; /* Spec Lock */ /* ssl2 only */
  467.     SSLCipher        enc; /* Spec Lock */ /* ssl2 only */
  468.     SSLCipher        dec; /* Spec Lock */ /* ssl2 only */
  469.     void           (*destroy)(void *, PRBool); /* Spec Lock */ /* ssl2 only */
  470.     /* Blocking information for the session cypher */
  471.     int              blockShift; /* Spec Lock */ /* ssl2 only */
  472.     int              blockSize; /* Spec Lock */ /* ssl2 only */
  473.     /* These are used during a connection handshake */
  474.     sslConnectInfo   ci; /* ssl 2 & 3 */
  475. };
  476. /*
  477. ** ssl3State and CipherSpec structs
  478. */
  479. /* The SSL bulk cipher definition */
  480. typedef enum {
  481.     cipher_null,
  482.     cipher_rc4, 
  483.     cipher_rc4_40,
  484.     cipher_rc4_56,
  485.     cipher_rc2, 
  486.     cipher_rc2_40,
  487.     cipher_des, 
  488.     cipher_3des, 
  489.     cipher_des40,
  490.     cipher_idea, 
  491.     cipher_fortezza,
  492.     cipher_missing              /* reserved for no such supported cipher */
  493. } SSL3BulkCipher;
  494. /* The specific cipher algorithm */
  495. typedef enum {
  496.     calg_null     = (int)0x80000000L, 
  497.     calg_rc4      = CKM_RC4, 
  498.     calg_rc2      = CKM_RC2_CBC,
  499.     calg_des      = CKM_DES_CBC, 
  500.     calg_3des     = CKM_DES3_CBC, 
  501.     calg_idea     = CKM_IDEA_CBC,
  502.     calg_fortezza = CKM_SKIPJACK_CBC64, 
  503.     calg_init     = (int) 0x7fffffffL
  504. } CipherAlgorithm;
  505. /* hmac added to help TLS conversion by rjr... */
  506. typedef enum {
  507.     malg_null     = (int)0x80000000L, 
  508.     malg_md5      = CKM_SSL3_MD5_MAC, 
  509.     malg_sha      = CKM_SSL3_SHA1_MAC, 
  510.     malg_md5_hmac = CKM_MD5_HMAC,
  511.     malg_sha_hmac = CKM_SHA_1_HMAC
  512. } MACAlgorithm;
  513. /* Key Exchange values moved to ssl.h */
  514. typedef SSLKEAType SSL3KEAType;
  515. typedef enum { 
  516. mac_null, 
  517. mac_md5, 
  518. mac_sha, 
  519. hmac_md5,  /* TLS HMAC version of mac_md5 */
  520. hmac_sha  /* TLS HMAC version of mac_sha */
  521. } SSL3MACAlgorithm;
  522. typedef enum { type_stream, type_block } CipherType;
  523. #define MAX_IV_LENGTH 64
  524. /*
  525.  * Do not depend upon 64 bit arithmetic in the underlying machine. 
  526.  */
  527. typedef struct {
  528.     uint32         high;
  529.     uint32         low;
  530. } SSL3SequenceNumber;
  531. typedef struct {
  532.     SSL3Opaque write_iv[MAX_IV_LENGTH];
  533.     PK11SymKey *write_key;
  534.     PK11SymKey *write_mac_key;
  535.     PK11Context *write_mac_context;
  536. } ssl3KeyMaterial;
  537. typedef struct {
  538.     SSL3Opaque        wrapped_client_write_key[12]; /* wrapped with Ks */
  539.     SSL3Opaque        wrapped_server_write_key[12]; /* wrapped with Ks */
  540.     SSL3Opaque        client_write_iv         [24];
  541.     SSL3Opaque        server_write_iv         [24];
  542.     SSL3Opaque        wrapped_master_secret   [48];
  543.     PRUint16          wrapped_master_secret_len;
  544. } ssl3SidKeys;
  545. /*
  546. ** These are the "specs" in the "ssl3" struct.
  547. ** Access to the pointers to these specs, and all the specs' contents
  548. ** (direct and indirect) is protected by the reader/writer lock ss->specLock.
  549. */
  550. typedef struct {
  551.     const ssl3BulkCipherDef *cipher_def;
  552.     const ssl3MACDef * mac_def;
  553.     int                mac_size;
  554.     SSLCipher          encode;
  555.     void *             encodeContext;
  556.     SSLCipher          decode;
  557.     void *             decodeContext;
  558.     SSLDestroy         destroy;
  559.     PK11SymKey *       master_secret;
  560.     ssl3KeyMaterial    client;
  561.     ssl3KeyMaterial    server;
  562.     SSL3SequenceNumber write_seq_num;
  563.     SSL3SequenceNumber read_seq_num;
  564.     SSL3ProtocolVersion version;
  565. } ssl3CipherSpec;
  566. typedef enum { never_cached, 
  567. in_client_cache, 
  568. in_server_cache, 
  569. invalid_cache /* no longer in any cache. */
  570. } Cached;
  571. struct sslSessionIDStr {
  572.     sslSessionID *        next;   /* chain used for client sockets, only */
  573.     CERTCertificate *     peerCert;
  574.     const char *          peerID;     /* client only */
  575.     const char *          urlSvrName; /* client only */
  576.     PRIPv6Addr            addr;
  577.     PRUint16              port;
  578.     SSL3ProtocolVersion   version;
  579.     PRUint32              time;
  580.     Cached                cached;
  581.     int                   references;
  582.     union {
  583. struct {
  584.     /* the V2 code depends upon the size of sessionID.  */
  585.     unsigned char         sessionID[SSL_SESSIONID_BYTES];
  586.     /* Stuff used to recreate key and read/write cipher objects */
  587.     SECItem               masterKey;
  588.     int                   cipherType;
  589.     SECItem               cipherArg;
  590.     int                   keyBits;
  591.     int                   secretKeyBits;
  592. } ssl2;
  593. struct {
  594.     /* values that are copied into the server's on-disk SID cache. */
  595.     uint8                 sessionIDLength;
  596.     SSL3Opaque            sessionID[SSL3_SESSIONID_BYTES];
  597.     ssl3CipherSuite       cipherSuite;
  598.     SSL3CompressionMethod compression;
  599.     PRBool                resumable;
  600.     int                   policy;
  601.     PRBool                hasFortezza;
  602.     ssl3SidKeys           keys;
  603.     CK_MECHANISM_TYPE     masterWrapMech;
  604.   /* mechanism used to wrap master secret */
  605.             SSL3KEAType           exchKeyType;
  606.   /* key type used in exchange algorithm,
  607.    * and to wrap the sym wrapping key. */
  608.     /* The following values are NOT restored from the server's on-disk
  609.      * session cache, but are restored from the client's cache.
  610.      */
  611.       PK11SymKey *      clientWriteKey;
  612.     PK11SymKey *      serverWriteKey;
  613.     PK11SymKey *      tek;
  614.     /* The following values pertain to the slot that wrapped the 
  615.     ** master secret. (used only in client)
  616.     */
  617.     SECMODModuleID    masterModuleID;
  618.     /* what module wrapped the master secret */
  619.     CK_SLOT_ID        masterSlotID;
  620.     PRUint16       masterWrapIndex;
  621. /* what's the key index for the wrapping key */
  622.     PRUint16          masterWrapSeries;
  623.                         /* keep track of the slot series, so we don't 
  624.  * accidently try to use new keys after the 
  625.  * card gets removed and replaced.*/
  626.     /* The following values pertain to the slot that did the signature
  627.     ** for client auth.   (used only in client)
  628.     */
  629.     SECMODModuleID    clAuthModuleID;
  630.     CK_SLOT_ID        clAuthSlotID;
  631.     PRUint16          clAuthSeries;
  632.             char              masterValid;
  633.     char              clAuthValid;
  634.     /* the following values are used only in the client, and only 
  635.      * with fortezza.
  636.      */
  637.     SSL3Opaque       clientWriteSave[80]; 
  638.     int              clientWriteSaveLen;  
  639. } ssl3;
  640.     } u;
  641. };
  642. typedef struct ssl3CipherSuiteDefStr {
  643.     ssl3CipherSuite          cipher_suite;
  644.     SSL3BulkCipher           bulk_cipher_alg;
  645.     SSL3MACAlgorithm         mac_alg;
  646.     SSL3KeyExchangeAlgorithm key_exchange_alg;
  647. } ssl3CipherSuiteDef;
  648. /*
  649. ** There are tables of these, all const.
  650. */
  651. typedef struct {
  652.     SSL3KeyExchangeAlgorithm kea;
  653.     SSL3KEAType              exchKeyType;
  654.     SSL3SignType             signKeyType;
  655.     PRBool                   is_limited;
  656.     int                      key_size_limit;
  657.     PRBool                   tls_keygen;
  658. } ssl3KEADef;
  659. typedef enum { kg_null, kg_strong, kg_export } SSL3KeyGenMode;
  660. /*
  661. ** There are tables of these, all const.
  662. */
  663. struct ssl3BulkCipherDefStr {
  664.     SSL3BulkCipher  cipher;
  665.     CipherAlgorithm calg;
  666.     int             key_size;
  667.     int             secret_key_size;
  668.     CipherType      type;
  669.     int             iv_size;
  670.     int             block_size;
  671.     SSL3KeyGenMode  keygen_mode;
  672. };
  673. /*
  674. ** There are tables of these, all const.
  675. */
  676. struct ssl3MACDefStr {
  677.     SSL3MACAlgorithm mac;
  678.     MACAlgorithm     malg;
  679.     int              pad_size;
  680.     int              mac_size;
  681. };
  682. typedef enum {
  683.     wait_client_hello, 
  684.     wait_client_cert, 
  685.     wait_client_key,
  686.     wait_cert_verify, 
  687.     wait_change_cipher, 
  688.     wait_finished,
  689.     wait_server_hello, 
  690.     wait_server_cert, 
  691.     wait_server_key,
  692.     wait_cert_request, 
  693.     wait_hello_done,
  694.     idle_handshake
  695. } SSL3WaitState;
  696. /*
  697. ** This is the "hs" member of the "ssl3" struct.
  698. ** This entire struct is protected by ssl3HandshakeLock
  699. */
  700. typedef struct SSL3HandshakeStateStr {
  701.     SSL3Random            server_random;
  702.     SSL3Random            client_random;
  703.     SSL3WaitState         ws;
  704.     PK11Context *         md5;            /* handshake running hashes */
  705.     PK11Context *         sha;
  706. const ssl3KEADef *        kea_def;
  707.     ssl3CipherSuite       cipher_suite;
  708. const ssl3CipherSuiteDef *suite_def;
  709.     SSL3CompressionMethod compression;
  710.     sslBuffer             msg_body;    /* protected by recvBufLock */
  711.                                /* partial handshake message from record layer */
  712.     unsigned int          header_bytes; 
  713.                                /* number of bytes consumed from handshake */
  714.                                /* message for message type and header length */
  715.     SSL3HandshakeType     msg_type;
  716.     unsigned long         msg_len;
  717.     SECItem               ca_list;     /* used only by client */
  718.     PRBool                isResuming;  /* are we resuming a session */
  719.     PRBool                rehandshake; /* immediately start another handshake 
  720.                                         * when this one finishes */
  721.     PRBool                usedStepDownKey;  /* we did a server key exchange. */
  722.     sslBuffer             msgState;    /* current state for handshake messages*/
  723.                                        /* protected by recvBufLock */
  724. } SSL3HandshakeState;
  725. struct SSL3FortezzaKEAParamsStr {
  726.     unsigned char R_s[128]; /* server's "random" public key */
  727.     PK11SymKey *  tek;
  728. };
  729. typedef struct SSL3FortezzaKEAParamsStr SSL3FortezzaKEAParams;
  730. /*
  731. ** This is the "ssl3" struct, as in "ss->ssl3".
  732. ** note:
  733. ** usually,   crSpec == cwSpec and prSpec == pwSpec.  
  734. ** Sometimes, crSpec == pwSpec and prSpec == cwSpec.
  735. ** But there are never more than 2 actual specs.  
  736. ** No spec must ever be modified if either "current" pointer points to it.
  737. */
  738. struct ssl3StateStr {
  739.     /*
  740.     ** The following Specs and Spec pointers must be protected using the 
  741.     ** Spec Lock.
  742.     */
  743.     ssl3CipherSpec *     crSpec;  /* current read spec. */
  744.     ssl3CipherSpec *     prSpec;  /* pending read spec. */
  745.     ssl3CipherSpec *     cwSpec;  /* current write spec. */
  746.     ssl3CipherSpec *     pwSpec;  /* pending write spec. */
  747.     ssl3CipherSpec       specs[2]; /* one is current, one is pending. */
  748.     SSL3HandshakeState   hs;
  749.     CERTCertificate *    clientCertificate;  /* used by client */
  750.     SECKEYPrivateKey *   clientPrivateKey;   /* used by client */
  751.     CERTCertificateList *clientCertChain;    /* used by client */
  752.     PRBool               sendEmptyCert;      /* used by client */
  753.     int                  policy;
  754. /* This says what cipher suites we can do, and should 
  755.  * be either SSL_ALLOWED or SSL_RESTRICTED 
  756.  */
  757.     PRArenaPool *        peerCertArena;  
  758.     /* These are used to keep track of the peer CA */
  759.     void *               peerCertChain;     
  760.     /* chain while we are trying to validate it.   */
  761.     CERTDistNames *      ca_list; 
  762.     /* used by server.  trusted CAs for this socket. */
  763.     SSL3FortezzaKEAParams fortezza;
  764. };
  765. typedef struct {
  766.     SSL3ContentType      type;
  767.     SSL3ProtocolVersion  version;
  768.     sslBuffer *          buf;
  769. } SSL3Ciphertext;
  770. struct ssl3KeyPairStr {
  771.     SECKEYPrivateKey *    privKey; /* RSA step down key */
  772.     SECKEYPublicKey *     pubKey; /* RSA step down key */
  773.     PRInt32               refCount; /* use PR_Atomic calls for this. */
  774. };
  775. typedef struct SSLWrappedSymWrappingKeyStr {
  776.     SSL3Opaque        wrappedSymmetricWrappingkey[512];
  777.     SSL3Opaque        wrapIV[24];
  778.     CK_MECHANISM_TYPE symWrapMechanism;  
  779.     /* unwrapped symmetric wrapping key uses this mechanism */
  780.     CK_MECHANISM_TYPE asymWrapMechanism; 
  781.     /* mechanism used to wrap the SymmetricWrappingKey using
  782.      * server's public and/or private keys. */
  783.     SSL3KEAType       exchKeyType;   /* type of keys used to wrap SymWrapKey*/
  784.     PRInt32           symWrapMechIndex;
  785.     PRUint16          wrappedSymKeyLen;
  786.     PRUint16          wrapIVLen;
  787. } SSLWrappedSymWrappingKey;
  788. /* All the global data items declared here should be protected using the 
  789. ** ssl_global_data_lock, which is a reader/writer lock.
  790. */
  791. extern NSSRWLock *             ssl_global_data_lock;
  792. extern char                    ssl_debug;
  793. extern char                    ssl_trace;
  794. extern CERTDistNames *         ssl3_server_ca_list;
  795. extern PRUint32                ssl_sid_timeout;
  796. extern PRUint32                ssl3_sid_timeout;
  797. extern PRBool                  ssl3_global_policy_some_restricted;
  798. extern const char * const      ssl_cipherName[];
  799. extern const char * const      ssl3_cipherName[];
  800. extern sslSessionIDLookupFunc  ssl_sid_lookup;
  801. extern sslSessionIDCacheFunc   ssl_sid_cache;
  802. extern sslSessionIDUncacheFunc ssl_sid_uncache;
  803. /************************************************************************/
  804. SEC_BEGIN_PROTOS
  805. /* Implementation of ops for default (non socks, non secure) case */
  806. extern int ssl_DefConnect(sslSocket *ss, const PRNetAddr *addr);
  807. extern PRFileDesc *ssl_DefAccept(sslSocket *ss, PRNetAddr *addr);
  808. extern int ssl_DefBind(sslSocket *ss, const PRNetAddr *addr);
  809. extern int ssl_DefListen(sslSocket *ss, int backlog);
  810. extern int ssl_DefShutdown(sslSocket *ss, int how);
  811. extern int ssl_DefClose(sslSocket *ss);
  812. extern int ssl_DefRecv(sslSocket *ss, unsigned char *buf, int len, int flags);
  813. extern int ssl_DefSend(sslSocket *ss, const unsigned char *buf,
  814.        int len, int flags);
  815. extern int ssl_DefRead(sslSocket *ss, unsigned char *buf, int len);
  816. extern int ssl_DefWrite(sslSocket *ss, const unsigned char *buf, int len);
  817. extern int ssl_DefGetpeername(sslSocket *ss, PRNetAddr *name);
  818. extern int ssl_DefGetsockname(sslSocket *ss, PRNetAddr *name);
  819. extern int ssl_DefGetsockopt(sslSocket *ss, PRSockOption optname,
  820.      void *optval, PRInt32 *optlen);
  821. extern int ssl_DefSetsockopt(sslSocket *ss, PRSockOption optname,
  822.      const void *optval, PRInt32 optlen);
  823. /* Implementation of ops for socks only case */
  824. extern int ssl_SocksConnect(sslSocket *ss, const PRNetAddr *addr);
  825. extern PRFileDesc *ssl_SocksAccept(sslSocket *ss, PRNetAddr *addr);
  826. extern int ssl_SocksBind(sslSocket *ss, const PRNetAddr *addr);
  827. extern int ssl_SocksListen(sslSocket *ss, int backlog);
  828. extern int ssl_SocksGetsockname(sslSocket *ss, PRNetAddr *name);
  829. extern int ssl_SocksRecv(sslSocket *ss, unsigned char *buf, int len, int flags);
  830. extern int ssl_SocksSend(sslSocket *ss, const unsigned char *buf,
  831.  int len, int flags);
  832. extern int ssl_SocksRead(sslSocket *ss, unsigned char *buf, int len);
  833. extern int ssl_SocksWrite(sslSocket *ss, const unsigned char *buf, int len);
  834. /* Implementation of ops for secure only case */
  835. extern int ssl_SecureConnect(sslSocket *ss, const PRNetAddr *addr);
  836. extern PRFileDesc *ssl_SecureAccept(sslSocket *ss, PRNetAddr *addr);
  837. extern int ssl_SecureRecv(sslSocket *ss, unsigned char *buf,
  838.   int len, int flags);
  839. extern int ssl_SecureSend(sslSocket *ss, const unsigned char *buf,
  840.   int len, int flags);
  841. extern int ssl_SecureRead(sslSocket *ss, unsigned char *buf, int len);
  842. extern int ssl_SecureWrite(sslSocket *ss, const unsigned char *buf, int len);
  843. extern int ssl_SecureShutdown(sslSocket *ss, int how);
  844. extern int ssl_SecureClose(sslSocket *ss);
  845. /* Implementation of ops for secure socks case */
  846. extern int ssl_SecureSocksConnect(sslSocket *ss, const PRNetAddr *addr);
  847. extern PRFileDesc *ssl_SecureSocksAccept(sslSocket *ss, PRNetAddr *addr);
  848. extern PRFileDesc *ssl_FindTop(sslSocket *ss);
  849. /* Gather funcs. */
  850. extern sslGather * ssl_NewGather(void);
  851. extern void        ssl_DestroyGather(sslGather *gs);
  852. extern int         ssl2_GatherData(sslSocket *ss, sslGather *gs, int flags);
  853. extern int         ssl2_GatherRecord(sslSocket *ss, int flags);
  854. extern SECStatus   ssl_GatherRecord1stHandshake(sslSocket *ss);
  855. extern SECStatus   ssl2_HandleClientHelloMessage(sslSocket *ss);
  856. extern SECStatus   ssl2_HandleServerHelloMessage(sslSocket *ss);
  857. extern int         ssl2_StartGatherBytes(sslSocket *ss, sslGather *gs, 
  858.                                          unsigned int count);
  859. extern SECStatus   ssl_CreateSecurityInfo(sslSocket *ss);
  860. extern SECStatus   ssl_CopySecurityInfo(sslSocket *ss, sslSocket *os);
  861. extern void        ssl_DestroySecurityInfo(sslSecurityInfo *sec);
  862. extern SECStatus   ssl_CreateSocksInfo(sslSocket *ss);
  863. extern SECStatus   ssl_CopySocksInfo(sslSocket *ss, sslSocket *os);
  864. extern void        ssl_DestroySocksInfo(sslSocksInfo *si);
  865. extern sslSocket * ssl_DupSocket(sslSocket *old);
  866. extern void        ssl_PrintBuf(sslSocket *ss, const char *msg, const void *cp, int len);
  867. extern void        ssl_DumpMsg(sslSocket *ss, unsigned char *bp, unsigned len);
  868. extern int         ssl_SendSavedWriteData(sslSocket *ss, sslBuffer *buf,
  869.           sslSendFunc fp);
  870. extern SECStatus ssl_SaveWriteData(sslSocket *ss, sslBuffer *buf, 
  871.                                    const void* p, unsigned int l);
  872. extern SECStatus ssl2_BeginClientHandshake(sslSocket *ss);
  873. extern SECStatus ssl2_BeginServerHandshake(sslSocket *ss);
  874. extern int       ssl_Do1stHandshake(sslSocket *ss);
  875. extern SECStatus sslBuffer_Grow(sslBuffer *b, unsigned int newLen);
  876. extern void      ssl2_UseClearSendFunc(sslSocket *ss);
  877. extern void      ssl_ChooseSessionIDProcs(sslSecurityInfo *sec);
  878. extern sslSessionID *ssl_LookupSID(const PRIPv6Addr *addr, PRUint16 port, 
  879.                                    const char *peerID, const char *urlSvrName);
  880. extern void      ssl_FreeSID(sslSessionID *sid);
  881. extern int       ssl3_SendApplicationData(sslSocket *ss, const PRUint8 *in,
  882.           int len, int flags);
  883. extern PRBool    ssl_FdIsBlocking(PRFileDesc *fd);
  884. extern PRBool    ssl_SocketIsBlocking(sslSocket *ss);
  885. extern void      ssl_SetAlwaysBlock(sslSocket *ss);
  886. #define SSL_LOCK_READER(ss) if (ss->recvLock) PR_Lock(ss->recvLock)
  887. #define SSL_UNLOCK_READER(ss) if (ss->recvLock) PR_Unlock(ss->recvLock)
  888. #define SSL_LOCK_WRITER(ss) if (ss->sendLock) PR_Lock(ss->sendLock)
  889. #define SSL_UNLOCK_WRITER(ss) if (ss->sendLock) PR_Unlock(ss->sendLock)
  890. #define ssl_Get1stHandshakeLock(ss)    PR_EnterMonitor((ss)->firstHandshakeLock)
  891. #define ssl_Release1stHandshakeLock(ss) PR_ExitMonitor((ss)->firstHandshakeLock)
  892. #define ssl_Have1stHandshakeLock(ss) PR_InMonitor(  (ss)->firstHandshakeLock)
  893. #define ssl_GetSSL3HandshakeLock(ss) PR_EnterMonitor((ss)->ssl3HandshakeLock)
  894. #define ssl_ReleaseSSL3HandshakeLock(ss) PR_ExitMonitor((ss)->ssl3HandshakeLock)
  895. #define ssl_HaveSSL3HandshakeLock(ss) PR_InMonitor(   (ss)->ssl3HandshakeLock)
  896. #define ssl_GetSpecReadLock(ss) NSSRWLock_LockRead(     (ss)->specLock)
  897. #define ssl_ReleaseSpecReadLock(ss) NSSRWLock_UnlockRead(   (ss)->specLock)
  898. #define ssl_GetSpecWriteLock(ss) NSSRWLock_LockWrite(  (ss)->specLock)
  899. #define ssl_ReleaseSpecWriteLock(ss) NSSRWLock_UnlockWrite((ss)->specLock)
  900. #define ssl_HaveSpecWriteLock(ss) NSSRWLock_HaveWriteLock((ss)->specLock)
  901. #define ssl_GetRecvBufLock(ss) PR_EnterMonitor((ss)->recvBufLock)
  902. #define ssl_ReleaseRecvBufLock(ss) PR_ExitMonitor( (ss)->recvBufLock)
  903. #define ssl_HaveRecvBufLock(ss) PR_InMonitor(   (ss)->recvBufLock)
  904. #define ssl_GetXmitBufLock(ss) PR_EnterMonitor((ss)->xmitBufLock)
  905. #define ssl_ReleaseXmitBufLock(ss) PR_ExitMonitor( (ss)->xmitBufLock)
  906. #define ssl_HaveXmitBufLock(ss) PR_InMonitor(   (ss)->xmitBufLock)
  907. /* These functions are called from secnav, even though they're "private". */
  908. extern int ssl2_SendErrorMessage(struct sslSocketStr *ss, int error);
  909. extern int SSL_RestartHandshakeAfterServerCert(struct sslSocketStr *ss);
  910. extern int SSL_RestartHandshakeAfterCertReq(struct sslSocketStr *ss,
  911.     CERTCertificate *cert,
  912.     SECKEYPrivateKey *key,
  913.     CERTCertificateList *certChain);
  914. extern sslSocket *ssl_FindSocket(PRFileDesc *fd);
  915. extern void ssl_FreeSocket(struct sslSocketStr *ssl);
  916. extern SECStatus SSL3_SendAlert(sslSocket *ss, SSL3AlertLevel level,
  917. SSL3AlertDescription desc);
  918. extern int ssl2_RestartHandshakeAfterCertReq(sslSocket *          ss,
  919.      CERTCertificate *    cert, 
  920.      SECKEYPrivateKey *   key);
  921. extern SECStatus ssl3_RestartHandshakeAfterCertReq(sslSocket *    ss,
  922.      CERTCertificate *    cert, 
  923.      SECKEYPrivateKey *   key,
  924.      CERTCertificateList *certChain);
  925. extern int ssl2_RestartHandshakeAfterServerCert(sslSocket *ss);
  926. extern int ssl3_RestartHandshakeAfterServerCert(sslSocket *ss);
  927. /*
  928.  * for dealing with SSL 3.0 clients sending SSL 2.0 format hellos
  929.  */
  930. extern SECStatus ssl3_HandleV2ClientHello(
  931.     sslSocket *ss, unsigned char *buffer, int length);
  932. extern SECStatus ssl3_StartHandshakeHash(
  933.     sslSocket *ss, unsigned char *buf, int length);
  934. /*
  935.  * SSL3 specific routines
  936.  */
  937. SECStatus ssl3_SendClientHello(sslSocket *ss);
  938. /*
  939.  * input into the SSL3 machinery from the actualy network reading code
  940.  */
  941. SECStatus ssl3_HandleRecord(
  942.     sslSocket *ss, SSL3Ciphertext *cipher, sslBuffer *out);
  943. int ssl3_GatherAppDataRecord(sslSocket *ss, int flags);
  944. int ssl3_GatherCompleteHandshake(sslSocket *ss, int flags);
  945. /*
  946.  * When talking to export clients or using export cipher suites, servers 
  947.  * with public RSA keys larger than 512 bits need to use a 512-bit public
  948.  * key, signed by the larger key.  The smaller key is a "step down" key.
  949.  * Generate that key pair and keep it around.
  950.  */
  951. extern SECStatus ssl3_CreateRSAStepDownKeys(sslSocket *ss);
  952. extern SECStatus ssl3_CipherPrefSetDefault(ssl3CipherSuite which, PRBool on);
  953. extern SECStatus ssl3_CipherPrefGetDefault(ssl3CipherSuite which, PRBool *on);
  954. extern SECStatus ssl2_CipherPrefSetDefault(PRInt32 which, PRBool enabled);
  955. extern SECStatus ssl2_CipherPrefGetDefault(PRInt32 which, PRBool *enabled);
  956. extern SECStatus ssl3_CipherPrefSet(sslSocket *ss, ssl3CipherSuite which, PRBool on);
  957. extern SECStatus ssl3_CipherPrefGet(sslSocket *ss, ssl3CipherSuite which, PRBool *on);
  958. extern SECStatus ssl2_CipherPrefSet(sslSocket *ss, PRInt32 which, PRBool enabled);
  959. extern SECStatus ssl2_CipherPrefGet(sslSocket *ss, PRInt32 which, PRBool *enabled);
  960. extern SECStatus ssl3_SetPolicy(ssl3CipherSuite which, PRInt32 policy);
  961. extern SECStatus ssl3_GetPolicy(ssl3CipherSuite which, PRInt32 *policy);
  962. extern SECStatus ssl2_SetPolicy(PRInt32 which, PRInt32 policy);
  963. extern SECStatus ssl2_GetPolicy(PRInt32 which, PRInt32 *policy);
  964. extern void      ssl2_InitSocketPolicy(sslSocket *ss);
  965. extern void      ssl3_InitSocketPolicy(sslSocket *ss);
  966. extern SECStatus ssl3_ConstructV2CipherSpecsHack(sslSocket *ss,
  967.  unsigned char *cs, int *size);
  968. extern SECStatus ssl3_RedoHandshake(sslSocket *ss, PRBool flushCache);
  969. extern void ssl3_DestroySSL3Info(ssl3State *ssl3);
  970. extern SECStatus ssl3_NegotiateVersion(sslSocket *ss, 
  971.                                        SSL3ProtocolVersion peerVersion);
  972. extern SECStatus ssl_GetPeerInfo(sslSocket *ss);
  973. /* Construct a new NSPR socket for the app to use */
  974. extern PRFileDesc *ssl_NewPRSocket(sslSocket *ss, PRFileDesc *fd);
  975. extern void ssl_FreePRSocket(PRFileDesc *fd);
  976. /* Internal config function so SSL2 can initialize the present state of 
  977.  * various ciphers */
  978. extern int ssl3_config_match_init(sslSocket *);
  979. /* Create a new ref counted key pair object from two keys. */
  980. extern ssl3KeyPair * ssl3_NewKeyPair( SECKEYPrivateKey * privKey, 
  981.                                       SECKEYPublicKey * pubKey);
  982. /* get a new reference (bump ref count) to an ssl3KeyPair. */
  983. extern ssl3KeyPair * ssl3_GetKeyPairRef(ssl3KeyPair * keyPair);
  984. /* Decrement keypair's ref count and free if zero. */
  985. extern void ssl3_FreeKeyPair(ssl3KeyPair * keyPair);
  986. /* calls for accessing wrapping keys across processes. */
  987. extern PRBool
  988. ssl_GetWrappingKey( PRInt32                   symWrapMechIndex,
  989.                     SSL3KEAType               exchKeyType, 
  990.     SSLWrappedSymWrappingKey *wswk);
  991. /* The caller passes in the new value it wants
  992.  * to set.  This code tests the wrapped sym key entry in the file on disk.  
  993.  * If it is uninitialized, this function writes the caller's value into 
  994.  * the disk entry, and returns false.  
  995.  * Otherwise, it overwrites the caller's wswk with the value obtained from 
  996.  * the disk, and returns PR_TRUE.  
  997.  * This is all done while holding the locks/semaphores necessary to make 
  998.  * the operation atomic.
  999.  */
  1000. extern PRBool
  1001. ssl_SetWrappingKey(SSLWrappedSymWrappingKey *wswk);
  1002. /********************** misc calls *********************/
  1003. extern int ssl_MapLowLevelError(int hiLevelError);
  1004. extern PRUint32 ssl_Time(void);
  1005. /* emulation of NSPR routines. */
  1006. extern PRInt32 
  1007. ssl_EmulateAcceptRead( PRFileDesc *   sd, 
  1008. PRFileDesc **  nd,
  1009. PRNetAddr **   raddr, 
  1010. void *         buf, 
  1011. PRInt32        amount, 
  1012. PRIntervalTime timeout);
  1013. extern PRInt32 
  1014. ssl_EmulateTransmitFile(    PRFileDesc *        sd, 
  1015.     PRFileDesc *        fd,
  1016.     const void *        headers, 
  1017.     PRInt32             hlen, 
  1018.     PRTransmitFileFlags flags,
  1019.     PRIntervalTime      timeout);
  1020. extern PRInt32 
  1021. ssl_EmulateSendFile( PRFileDesc *        sd, 
  1022.      PRSendFileData *    sfd,
  1023.                      PRTransmitFileFlags flags, 
  1024.      PRIntervalTime      timeout);
  1025. #ifdef TRACE
  1026. #define SSL_TRACE(msg) ssl_Trace msg
  1027. #else
  1028. #define SSL_TRACE(msg)
  1029. #endif
  1030. void ssl_Trace(const char *format, ...);
  1031. SEC_END_PROTOS
  1032. #ifdef XP_UNIX
  1033. #define SSL_GETPID() getpid()
  1034. #else
  1035. #define SSL_GETPID() 0
  1036. #endif
  1037. #endif /* __sslimpl_h_ */