security/nss/lib/ssl/ssl.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

michael@0 1 /*
michael@0 2 * This file contains prototypes for the public SSL functions.
michael@0 3 *
michael@0 4 * This Source Code Form is subject to the terms of the Mozilla Public
michael@0 5 * License, v. 2.0. If a copy of the MPL was not distributed with this
michael@0 6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
michael@0 7
michael@0 8 #ifndef __ssl_h_
michael@0 9 #define __ssl_h_
michael@0 10
michael@0 11 #include "prtypes.h"
michael@0 12 #include "prerror.h"
michael@0 13 #include "prio.h"
michael@0 14 #include "seccomon.h"
michael@0 15 #include "cert.h"
michael@0 16 #include "keyt.h"
michael@0 17
michael@0 18 #include "sslt.h" /* public ssl data types */
michael@0 19
michael@0 20 #if defined(_WIN32) && !defined(IN_LIBSSL) && !defined(NSS_USE_STATIC_LIBS)
michael@0 21 #define SSL_IMPORT extern __declspec(dllimport)
michael@0 22 #else
michael@0 23 #define SSL_IMPORT extern
michael@0 24 #endif
michael@0 25
michael@0 26 SEC_BEGIN_PROTOS
michael@0 27
michael@0 28 /* constant table enumerating all implemented SSL 2 and 3 cipher suites. */
michael@0 29 SSL_IMPORT const PRUint16 SSL_ImplementedCiphers[];
michael@0 30
michael@0 31 /* the same as the above, but is a function */
michael@0 32 SSL_IMPORT const PRUint16 *SSL_GetImplementedCiphers(void);
michael@0 33
michael@0 34 /* number of entries in the above table. */
michael@0 35 SSL_IMPORT const PRUint16 SSL_NumImplementedCiphers;
michael@0 36
michael@0 37 /* the same as the above, but is a function */
michael@0 38 SSL_IMPORT PRUint16 SSL_GetNumImplementedCiphers(void);
michael@0 39
michael@0 40 /* Macro to tell which ciphers in table are SSL2 vs SSL3/TLS. */
michael@0 41 #define SSL_IS_SSL2_CIPHER(which) (((which) & 0xfff0) == 0xff00)
michael@0 42
michael@0 43 /*
michael@0 44 ** Imports fd into SSL, returning a new socket. Copies SSL configuration
michael@0 45 ** from model.
michael@0 46 */
michael@0 47 SSL_IMPORT PRFileDesc *SSL_ImportFD(PRFileDesc *model, PRFileDesc *fd);
michael@0 48
michael@0 49 /*
michael@0 50 ** Imports fd into DTLS, returning a new socket. Copies DTLS configuration
michael@0 51 ** from model.
michael@0 52 */
michael@0 53 SSL_IMPORT PRFileDesc *DTLS_ImportFD(PRFileDesc *model, PRFileDesc *fd);
michael@0 54
michael@0 55 /*
michael@0 56 ** Enable/disable an ssl mode
michael@0 57 **
michael@0 58 ** SSL_SECURITY:
michael@0 59 ** enable/disable use of SSL security protocol before connect
michael@0 60 **
michael@0 61 ** SSL_SOCKS:
michael@0 62 ** enable/disable use of socks before connect
michael@0 63 ** (No longer supported).
michael@0 64 **
michael@0 65 ** SSL_REQUEST_CERTIFICATE:
michael@0 66 ** require a certificate during secure connect
michael@0 67 */
michael@0 68 /* options */
michael@0 69 #define SSL_SECURITY 1 /* (on by default) */
michael@0 70 #define SSL_SOCKS 2 /* (off by default) */
michael@0 71 #define SSL_REQUEST_CERTIFICATE 3 /* (off by default) */
michael@0 72 #define SSL_HANDSHAKE_AS_CLIENT 5 /* force accept to hs as client */
michael@0 73 /* (off by default) */
michael@0 74 #define SSL_HANDSHAKE_AS_SERVER 6 /* force connect to hs as server */
michael@0 75 /* (off by default) */
michael@0 76
michael@0 77 /* OBSOLETE: SSL v2 is obsolete and may be removed soon. */
michael@0 78 #define SSL_ENABLE_SSL2 7 /* enable ssl v2 (off by default) */
michael@0 79
michael@0 80 /* OBSOLETE: See "SSL Version Range API" below for the replacement and a
michael@0 81 ** description of the non-obvious semantics of using SSL_ENABLE_SSL3.
michael@0 82 */
michael@0 83 #define SSL_ENABLE_SSL3 8 /* enable ssl v3 (on by default) */
michael@0 84
michael@0 85 #define SSL_NO_CACHE 9 /* don't use the session cache */
michael@0 86 /* (off by default) */
michael@0 87 #define SSL_REQUIRE_CERTIFICATE 10 /* (SSL_REQUIRE_FIRST_HANDSHAKE */
michael@0 88 /* by default) */
michael@0 89 #define SSL_ENABLE_FDX 11 /* permit simultaneous read/write */
michael@0 90 /* (off by default) */
michael@0 91
michael@0 92 /* OBSOLETE: SSL v2 compatible hellos are not accepted by some TLS servers
michael@0 93 ** and cannot negotiate extensions. SSL v2 is obsolete. This option may be
michael@0 94 ** removed soon.
michael@0 95 */
michael@0 96 #define SSL_V2_COMPATIBLE_HELLO 12 /* send v3 client hello in v2 fmt */
michael@0 97 /* (off by default) */
michael@0 98
michael@0 99 /* OBSOLETE: See "SSL Version Range API" below for the replacement and a
michael@0 100 ** description of the non-obvious semantics of using SSL_ENABLE_TLS.
michael@0 101 */
michael@0 102 #define SSL_ENABLE_TLS 13 /* enable TLS (on by default) */
michael@0 103
michael@0 104 #define SSL_ROLLBACK_DETECTION 14 /* for compatibility, default: on */
michael@0 105 #define SSL_NO_STEP_DOWN 15 /* Disable export cipher suites */
michael@0 106 /* if step-down keys are needed. */
michael@0 107 /* default: off, generate */
michael@0 108 /* step-down keys if needed. */
michael@0 109 #define SSL_BYPASS_PKCS11 16 /* use PKCS#11 for pub key only */
michael@0 110 #define SSL_NO_LOCKS 17 /* Don't use locks for protection */
michael@0 111 #define SSL_ENABLE_SESSION_TICKETS 18 /* Enable TLS SessionTicket */
michael@0 112 /* extension (off by default) */
michael@0 113 #define SSL_ENABLE_DEFLATE 19 /* Enable TLS compression with */
michael@0 114 /* DEFLATE (off by default) */
michael@0 115 #define SSL_ENABLE_RENEGOTIATION 20 /* Values below (default: never) */
michael@0 116 #define SSL_REQUIRE_SAFE_NEGOTIATION 21 /* Peer must send Signaling */
michael@0 117 /* Cipher Suite Value (SCSV) or */
michael@0 118 /* Renegotiation Info (RI) */
michael@0 119 /* extension in ALL handshakes. */
michael@0 120 /* default: off */
michael@0 121 #define SSL_ENABLE_FALSE_START 22 /* Enable SSL false start (off by */
michael@0 122 /* default, applies only to */
michael@0 123 /* clients). False start is a */
michael@0 124 /* mode where an SSL client will start sending application data before
michael@0 125 * verifying the server's Finished message. This means that we could end up
michael@0 126 * sending data to an imposter. However, the data will be encrypted and
michael@0 127 * only the true server can derive the session key. Thus, so long as the
michael@0 128 * cipher isn't broken this is safe. The advantage of false start is that
michael@0 129 * it saves a round trip for client-speaks-first protocols when performing a
michael@0 130 * full handshake.
michael@0 131 *
michael@0 132 * In addition to enabling this option, the application must register a
michael@0 133 * callback using the SSL_SetCanFalseStartCallback function.
michael@0 134 */
michael@0 135
michael@0 136 /* For SSL 3.0 and TLS 1.0, by default we prevent chosen plaintext attacks
michael@0 137 * on SSL CBC mode cipher suites (see RFC 4346 Section F.3) by splitting
michael@0 138 * non-empty application_data records into two records; the first record has
michael@0 139 * only the first byte of plaintext, and the second has the rest.
michael@0 140 *
michael@0 141 * This only prevents the attack in the sending direction; the connection may
michael@0 142 * still be vulnerable to such attacks if the peer does not implement a similar
michael@0 143 * countermeasure.
michael@0 144 *
michael@0 145 * This protection mechanism is on by default; the default can be overridden by
michael@0 146 * setting NSS_SSL_CBC_RANDOM_IV=0 in the environment prior to execution,
michael@0 147 * and/or by the application setting the option SSL_CBC_RANDOM_IV to PR_FALSE.
michael@0 148 *
michael@0 149 * The per-record IV in TLS 1.1 and later adds one block of overhead per
michael@0 150 * record, whereas this hack will add at least two blocks of overhead per
michael@0 151 * record, so TLS 1.1+ will always be more efficient.
michael@0 152 *
michael@0 153 * Other implementations (e.g. some versions of OpenSSL, in some
michael@0 154 * configurations) prevent the same attack by prepending an empty
michael@0 155 * application_data record to every application_data record they send; we do
michael@0 156 * not do that because some implementations cannot handle empty
michael@0 157 * application_data records. Also, we only split application_data records and
michael@0 158 * not other types of records, because some implementations will not accept
michael@0 159 * fragmented records of some other types (e.g. some versions of NSS do not
michael@0 160 * accept fragmented alerts).
michael@0 161 */
michael@0 162 #define SSL_CBC_RANDOM_IV 23
michael@0 163 #define SSL_ENABLE_OCSP_STAPLING 24 /* Request OCSP stapling (client) */
michael@0 164
michael@0 165 /* SSL_ENABLE_NPN controls whether the NPN extension is enabled for the initial
michael@0 166 * handshake when application layer protocol negotiation is used.
michael@0 167 * SSL_SetNextProtoCallback or SSL_SetNextProtoNego must be used to control the
michael@0 168 * application layer protocol negotiation; otherwise, the NPN extension will
michael@0 169 * not be negotiated. SSL_ENABLE_NPN is currently enabled by default but this
michael@0 170 * may change in future versions.
michael@0 171 */
michael@0 172 #define SSL_ENABLE_NPN 25
michael@0 173
michael@0 174 /* SSL_ENABLE_ALPN controls whether the ALPN extension is enabled for the
michael@0 175 * initial handshake when application layer protocol negotiation is used.
michael@0 176 * SSL_SetNextProtoNego (not SSL_SetNextProtoCallback) must be used to control
michael@0 177 * the application layer protocol negotiation; otherwise, the ALPN extension
michael@0 178 * will not be negotiated. ALPN is not negotiated for renegotiation handshakes,
michael@0 179 * even though the ALPN specification defines a way to use ALPN during
michael@0 180 * renegotiations. SSL_ENABLE_ALPN is currently disabled by default, but this
michael@0 181 * may change in future versions.
michael@0 182 */
michael@0 183 #define SSL_ENABLE_ALPN 26
michael@0 184
michael@0 185 #define SSL_ENABLE_FALLBACK_SCSV 28 /* Send fallback SCSV in
michael@0 186 * handshakes. */
michael@0 187
michael@0 188 #ifdef SSL_DEPRECATED_FUNCTION
michael@0 189 /* Old deprecated function names */
michael@0 190 SSL_IMPORT SECStatus SSL_Enable(PRFileDesc *fd, int option, PRBool on);
michael@0 191 SSL_IMPORT SECStatus SSL_EnableDefault(int option, PRBool on);
michael@0 192 #endif
michael@0 193
michael@0 194 /* New function names */
michael@0 195 SSL_IMPORT SECStatus SSL_OptionSet(PRFileDesc *fd, PRInt32 option, PRBool on);
michael@0 196 SSL_IMPORT SECStatus SSL_OptionGet(PRFileDesc *fd, PRInt32 option, PRBool *on);
michael@0 197 SSL_IMPORT SECStatus SSL_OptionSetDefault(PRInt32 option, PRBool on);
michael@0 198 SSL_IMPORT SECStatus SSL_OptionGetDefault(PRInt32 option, PRBool *on);
michael@0 199 SSL_IMPORT SECStatus SSL_CertDBHandleSet(PRFileDesc *fd, CERTCertDBHandle *dbHandle);
michael@0 200
michael@0 201 /* SSLNextProtoCallback is called during the handshake for the client, when a
michael@0 202 * Next Protocol Negotiation (NPN) extension has been received from the server.
michael@0 203 * |protos| and |protosLen| define a buffer which contains the server's
michael@0 204 * advertisement. This data is guaranteed to be well formed per the NPN spec.
michael@0 205 * |protoOut| is a buffer provided by the caller, of length 255 (the maximum
michael@0 206 * allowed by the protocol). On successful return, the protocol to be announced
michael@0 207 * to the server will be in |protoOut| and its length in |*protoOutLen|.
michael@0 208 *
michael@0 209 * The callback must return SECFailure or SECSuccess (not SECWouldBlock).
michael@0 210 */
michael@0 211 typedef SECStatus (PR_CALLBACK *SSLNextProtoCallback)(
michael@0 212 void *arg,
michael@0 213 PRFileDesc *fd,
michael@0 214 const unsigned char* protos,
michael@0 215 unsigned int protosLen,
michael@0 216 unsigned char* protoOut,
michael@0 217 unsigned int* protoOutLen,
michael@0 218 unsigned int protoMaxOut);
michael@0 219
michael@0 220 /* SSL_SetNextProtoCallback sets a callback function to handle Next Protocol
michael@0 221 * Negotiation. It causes a client to advertise NPN. */
michael@0 222 SSL_IMPORT SECStatus SSL_SetNextProtoCallback(PRFileDesc *fd,
michael@0 223 SSLNextProtoCallback callback,
michael@0 224 void *arg);
michael@0 225
michael@0 226 /* SSL_SetNextProtoNego can be used as an alternative to
michael@0 227 * SSL_SetNextProtoCallback. It also causes a client to advertise NPN and
michael@0 228 * installs a default callback function which selects the first supported
michael@0 229 * protocol in server-preference order. If no matching protocol is found it
michael@0 230 * selects the first supported protocol.
michael@0 231 *
michael@0 232 * Using this function also allows the client to transparently support ALPN.
michael@0 233 * The same set of protocols will be advertised via ALPN and, if the server
michael@0 234 * uses ALPN to select a protocol, SSL_GetNextProto will return
michael@0 235 * SSL_NEXT_PROTO_SELECTED as the state.
michael@0 236 *
michael@0 237 * Since NPN uses the first protocol as the fallback protocol, when sending an
michael@0 238 * ALPN extension, the first protocol is moved to the end of the list. This
michael@0 239 * indicates that the fallback protocol is the least preferred. The other
michael@0 240 * protocols should be in preference order.
michael@0 241 *
michael@0 242 * The supported protocols are specified in |data| in wire-format (8-bit
michael@0 243 * length-prefixed). For example: "\010http/1.1\006spdy/2". */
michael@0 244 SSL_IMPORT SECStatus SSL_SetNextProtoNego(PRFileDesc *fd,
michael@0 245 const unsigned char *data,
michael@0 246 unsigned int length);
michael@0 247
michael@0 248 typedef enum SSLNextProtoState {
michael@0 249 SSL_NEXT_PROTO_NO_SUPPORT = 0, /* No peer support */
michael@0 250 SSL_NEXT_PROTO_NEGOTIATED = 1, /* Mutual agreement */
michael@0 251 SSL_NEXT_PROTO_NO_OVERLAP = 2, /* No protocol overlap found */
michael@0 252 SSL_NEXT_PROTO_SELECTED = 3 /* Server selected proto (ALPN) */
michael@0 253 } SSLNextProtoState;
michael@0 254
michael@0 255 /* SSL_GetNextProto can be used in the HandshakeCallback or any time after
michael@0 256 * a handshake to retrieve the result of the Next Protocol negotiation.
michael@0 257 *
michael@0 258 * The length of the negotiated protocol, if any, is written into *bufLen.
michael@0 259 * If the negotiated protocol is longer than bufLenMax, then SECFailure is
michael@0 260 * returned. Otherwise, the negotiated protocol, if any, is written into buf,
michael@0 261 * and SECSuccess is returned. */
michael@0 262 SSL_IMPORT SECStatus SSL_GetNextProto(PRFileDesc *fd,
michael@0 263 SSLNextProtoState *state,
michael@0 264 unsigned char *buf,
michael@0 265 unsigned int *bufLen,
michael@0 266 unsigned int bufLenMax);
michael@0 267
michael@0 268 /*
michael@0 269 ** Control ciphers that SSL uses. If on is non-zero then the named cipher
michael@0 270 ** is enabled, otherwise it is disabled.
michael@0 271 ** The "cipher" values are defined in sslproto.h (the SSL_EN_* values).
michael@0 272 ** EnableCipher records user preferences.
michael@0 273 ** SetPolicy sets the policy according to the policy module.
michael@0 274 */
michael@0 275 #ifdef SSL_DEPRECATED_FUNCTION
michael@0 276 /* Old deprecated function names */
michael@0 277 SSL_IMPORT SECStatus SSL_EnableCipher(long which, PRBool enabled);
michael@0 278 SSL_IMPORT SECStatus SSL_SetPolicy(long which, int policy);
michael@0 279 #endif
michael@0 280
michael@0 281 /* New function names */
michael@0 282 SSL_IMPORT SECStatus SSL_CipherPrefSet(PRFileDesc *fd, PRInt32 cipher, PRBool enabled);
michael@0 283 SSL_IMPORT SECStatus SSL_CipherPrefGet(PRFileDesc *fd, PRInt32 cipher, PRBool *enabled);
michael@0 284 SSL_IMPORT SECStatus SSL_CipherPrefSetDefault(PRInt32 cipher, PRBool enabled);
michael@0 285 SSL_IMPORT SECStatus SSL_CipherPrefGetDefault(PRInt32 cipher, PRBool *enabled);
michael@0 286 SSL_IMPORT SECStatus SSL_CipherPolicySet(PRInt32 cipher, PRInt32 policy);
michael@0 287 SSL_IMPORT SECStatus SSL_CipherPolicyGet(PRInt32 cipher, PRInt32 *policy);
michael@0 288
michael@0 289 /* SSL Version Range API
michael@0 290 **
michael@0 291 ** This API should be used to control SSL 3.0 & TLS support instead of the
michael@0 292 ** older SSL_Option* API; however, the SSL_Option* API MUST still be used to
michael@0 293 ** control SSL 2.0 support. In this version of libssl, SSL 3.0 and TLS 1.0 are
michael@0 294 ** enabled by default. Future versions of libssl may change which versions of
michael@0 295 ** the protocol are enabled by default.
michael@0 296 **
michael@0 297 ** The SSLProtocolVariant enum indicates whether the protocol is of type
michael@0 298 ** stream or datagram. This must be provided to the functions that do not
michael@0 299 ** take an fd. Functions which take an fd will get the variant from the fd,
michael@0 300 ** which is typed.
michael@0 301 **
michael@0 302 ** Using the new version range API in conjunction with the older
michael@0 303 ** SSL_OptionSet-based API for controlling the enabled protocol versions may
michael@0 304 ** cause unexpected results. Going forward, we guarantee only the following:
michael@0 305 **
michael@0 306 ** SSL_OptionGet(SSL_ENABLE_TLS) will return PR_TRUE if *ANY* versions of TLS
michael@0 307 ** are enabled.
michael@0 308 **
michael@0 309 ** SSL_OptionSet(SSL_ENABLE_TLS, PR_FALSE) will disable *ALL* versions of TLS,
michael@0 310 ** including TLS 1.0 and later.
michael@0 311 **
michael@0 312 ** The above two properties provide compatibility for applications that use
michael@0 313 ** SSL_OptionSet to implement the insecure fallback from TLS 1.x to SSL 3.0.
michael@0 314 **
michael@0 315 ** SSL_OptionSet(SSL_ENABLE_TLS, PR_TRUE) will enable TLS 1.0, and may also
michael@0 316 ** enable some later versions of TLS, if it is necessary to do so in order to
michael@0 317 ** keep the set of enabled versions contiguous. For example, if TLS 1.2 is
michael@0 318 ** enabled, then after SSL_OptionSet(SSL_ENABLE_TLS, PR_TRUE), TLS 1.0,
michael@0 319 ** TLS 1.1, and TLS 1.2 will be enabled, and the call will have no effect on
michael@0 320 ** whether SSL 3.0 is enabled. If no later versions of TLS are enabled at the
michael@0 321 ** time SSL_OptionSet(SSL_ENABLE_TLS, PR_TRUE) is called, then no later
michael@0 322 ** versions of TLS will be enabled by the call.
michael@0 323 **
michael@0 324 ** SSL_OptionSet(SSL_ENABLE_SSL3, PR_FALSE) will disable SSL 3.0, and will not
michael@0 325 ** change the set of TLS versions that are enabled.
michael@0 326 **
michael@0 327 ** SSL_OptionSet(SSL_ENABLE_SSL3, PR_TRUE) will enable SSL 3.0, and may also
michael@0 328 ** enable some versions of TLS if TLS 1.1 or later is enabled at the time of
michael@0 329 ** the call, the same way SSL_OptionSet(SSL_ENABLE_TLS, PR_TRUE) works, in
michael@0 330 ** order to keep the set of enabled versions contiguous.
michael@0 331 */
michael@0 332
michael@0 333 /* Returns, in |*vrange|, the range of SSL3/TLS versions supported for the
michael@0 334 ** given protocol variant by the version of libssl linked-to at runtime.
michael@0 335 */
michael@0 336 SSL_IMPORT SECStatus SSL_VersionRangeGetSupported(
michael@0 337 SSLProtocolVariant protocolVariant, SSLVersionRange *vrange);
michael@0 338
michael@0 339 /* Returns, in |*vrange|, the range of SSL3/TLS versions enabled by default
michael@0 340 ** for the given protocol variant.
michael@0 341 */
michael@0 342 SSL_IMPORT SECStatus SSL_VersionRangeGetDefault(
michael@0 343 SSLProtocolVariant protocolVariant, SSLVersionRange *vrange);
michael@0 344
michael@0 345 /* Sets the range of enabled-by-default SSL3/TLS versions for the given
michael@0 346 ** protocol variant to |*vrange|.
michael@0 347 */
michael@0 348 SSL_IMPORT SECStatus SSL_VersionRangeSetDefault(
michael@0 349 SSLProtocolVariant protocolVariant, const SSLVersionRange *vrange);
michael@0 350
michael@0 351 /* Returns, in |*vrange|, the range of enabled SSL3/TLS versions for |fd|. */
michael@0 352 SSL_IMPORT SECStatus SSL_VersionRangeGet(PRFileDesc *fd,
michael@0 353 SSLVersionRange *vrange);
michael@0 354
michael@0 355 /* Sets the range of enabled SSL3/TLS versions for |fd| to |*vrange|. */
michael@0 356 SSL_IMPORT SECStatus SSL_VersionRangeSet(PRFileDesc *fd,
michael@0 357 const SSLVersionRange *vrange);
michael@0 358
michael@0 359
michael@0 360 /* Values for "policy" argument to SSL_CipherPolicySet */
michael@0 361 /* Values returned by SSL_CipherPolicyGet. */
michael@0 362 #define SSL_NOT_ALLOWED 0 /* or invalid or unimplemented */
michael@0 363 #define SSL_ALLOWED 1
michael@0 364 #define SSL_RESTRICTED 2 /* only with "Step-Up" certs. */
michael@0 365
michael@0 366 /* Values for "on" with SSL_REQUIRE_CERTIFICATE. */
michael@0 367 #define SSL_REQUIRE_NEVER ((PRBool)0)
michael@0 368 #define SSL_REQUIRE_ALWAYS ((PRBool)1)
michael@0 369 #define SSL_REQUIRE_FIRST_HANDSHAKE ((PRBool)2)
michael@0 370 #define SSL_REQUIRE_NO_ERROR ((PRBool)3)
michael@0 371
michael@0 372 /* Values for "on" with SSL_ENABLE_RENEGOTIATION */
michael@0 373 /* Never renegotiate at all. */
michael@0 374 #define SSL_RENEGOTIATE_NEVER ((PRBool)0)
michael@0 375 /* Renegotiate without restriction, whether or not the peer's client hello */
michael@0 376 /* bears the renegotiation info extension. Vulnerable, as in the past. */
michael@0 377 #define SSL_RENEGOTIATE_UNRESTRICTED ((PRBool)1)
michael@0 378 /* Only renegotiate if the peer's hello bears the TLS renegotiation_info */
michael@0 379 /* extension. This is safe renegotiation. */
michael@0 380 #define SSL_RENEGOTIATE_REQUIRES_XTN ((PRBool)2)
michael@0 381 /* Disallow unsafe renegotiation in server sockets only, but allow clients */
michael@0 382 /* to continue to renegotiate with vulnerable servers. */
michael@0 383 /* This value should only be used during the transition period when few */
michael@0 384 /* servers have been upgraded. */
michael@0 385 #define SSL_RENEGOTIATE_TRANSITIONAL ((PRBool)3)
michael@0 386
michael@0 387 /*
michael@0 388 ** Reset the handshake state for fd. This will make the complete SSL
michael@0 389 ** handshake protocol execute from the ground up on the next i/o
michael@0 390 ** operation.
michael@0 391 */
michael@0 392 SSL_IMPORT SECStatus SSL_ResetHandshake(PRFileDesc *fd, PRBool asServer);
michael@0 393
michael@0 394 /*
michael@0 395 ** Force the handshake for fd to complete immediately. This blocks until
michael@0 396 ** the complete SSL handshake protocol is finished.
michael@0 397 */
michael@0 398 SSL_IMPORT SECStatus SSL_ForceHandshake(PRFileDesc *fd);
michael@0 399
michael@0 400 /*
michael@0 401 ** Same as above, but with an I/O timeout.
michael@0 402 */
michael@0 403 SSL_IMPORT SECStatus SSL_ForceHandshakeWithTimeout(PRFileDesc *fd,
michael@0 404 PRIntervalTime timeout);
michael@0 405
michael@0 406 /*
michael@0 407 ** Query security status of socket. *on is set to one if security is
michael@0 408 ** enabled. *keySize will contain the stream key size used. *issuer will
michael@0 409 ** contain the RFC1485 verison of the name of the issuer of the
michael@0 410 ** certificate at the other end of the connection. For a client, this is
michael@0 411 ** the issuer of the server's certificate; for a server, this is the
michael@0 412 ** issuer of the client's certificate (if any). Subject is the subject of
michael@0 413 ** the other end's certificate. The pointers can be zero if the desired
michael@0 414 ** data is not needed. All strings returned by this function are owned
michael@0 415 ** by the caller, and need to be freed with PORT_Free.
michael@0 416 */
michael@0 417 SSL_IMPORT SECStatus SSL_SecurityStatus(PRFileDesc *fd, int *on, char **cipher,
michael@0 418 int *keySize, int *secretKeySize,
michael@0 419 char **issuer, char **subject);
michael@0 420
michael@0 421 /* Values for "on" */
michael@0 422 #define SSL_SECURITY_STATUS_NOOPT -1
michael@0 423 #define SSL_SECURITY_STATUS_OFF 0
michael@0 424 #define SSL_SECURITY_STATUS_ON_HIGH 1
michael@0 425 #define SSL_SECURITY_STATUS_ON_LOW 2
michael@0 426 #define SSL_SECURITY_STATUS_FORTEZZA 3 /* NO LONGER SUPPORTED */
michael@0 427
michael@0 428 /*
michael@0 429 ** Return the certificate for our SSL peer. If the client calls this
michael@0 430 ** it will always return the server's certificate. If the server calls
michael@0 431 ** this, it may return NULL if client authentication is not enabled or
michael@0 432 ** if the client had no certificate when asked.
michael@0 433 ** "fd" the socket "file" descriptor
michael@0 434 */
michael@0 435 SSL_IMPORT CERTCertificate *SSL_PeerCertificate(PRFileDesc *fd);
michael@0 436
michael@0 437 /*
michael@0 438 ** Return the certificates presented by the SSL peer. If the SSL peer
michael@0 439 ** did not present certificates, return NULL with the
michael@0 440 ** SSL_ERROR_NO_CERTIFICATE error. On failure, return NULL with an error
michael@0 441 ** code other than SSL_ERROR_NO_CERTIFICATE.
michael@0 442 ** "fd" the socket "file" descriptor
michael@0 443 */
michael@0 444 SSL_IMPORT CERTCertList *SSL_PeerCertificateChain(PRFileDesc *fd);
michael@0 445
michael@0 446 /* SSL_PeerStapledOCSPResponses returns the OCSP responses that were provided
michael@0 447 * by the TLS server. The return value is a pointer to an internal SECItemArray
michael@0 448 * that contains the returned OCSP responses; it is only valid until the
michael@0 449 * callback function that calls SSL_PeerStapledOCSPResponses returns.
michael@0 450 *
michael@0 451 * If no OCSP responses were given by the server then the result will be empty.
michael@0 452 * If there was an error, then the result will be NULL.
michael@0 453 *
michael@0 454 * You must set the SSL_ENABLE_OCSP_STAPLING option to enable OCSP stapling.
michael@0 455 * to be provided by a server.
michael@0 456 *
michael@0 457 * libssl does not do any validation of the OCSP response itself; the
michael@0 458 * authenticate certificate hook is responsible for doing so. The default
michael@0 459 * authenticate certificate hook, SSL_AuthCertificate, does not implement
michael@0 460 * any OCSP stapling funtionality, but this may change in future versions.
michael@0 461 */
michael@0 462 SSL_IMPORT const SECItemArray * SSL_PeerStapledOCSPResponses(PRFileDesc *fd);
michael@0 463
michael@0 464 /* SSL_SetStapledOCSPResponses stores an array of one or multiple OCSP responses
michael@0 465 * in the fd's data, which may be sent as part of a server side cert_status
michael@0 466 * handshake message. Parameter |responses| is for the server certificate of
michael@0 467 * the key exchange type |kea|.
michael@0 468 * The function will duplicate the responses array.
michael@0 469 */
michael@0 470 SSL_IMPORT SECStatus
michael@0 471 SSL_SetStapledOCSPResponses(PRFileDesc *fd, const SECItemArray *responses,
michael@0 472 SSLKEAType kea);
michael@0 473
michael@0 474 /*
michael@0 475 ** Authenticate certificate hook. Called when a certificate comes in
michael@0 476 ** (because of SSL_REQUIRE_CERTIFICATE in SSL_Enable) to authenticate the
michael@0 477 ** certificate.
michael@0 478 **
michael@0 479 ** The authenticate certificate hook must return SECSuccess to indicate the
michael@0 480 ** certificate is valid, SECFailure to indicate the certificate is invalid,
michael@0 481 ** or SECWouldBlock if the application will authenticate the certificate
michael@0 482 ** asynchronously. SECWouldBlock is only supported for non-blocking sockets.
michael@0 483 **
michael@0 484 ** If the authenticate certificate hook returns SECFailure, then the bad cert
michael@0 485 ** hook will be called. The bad cert handler is NEVER called if the
michael@0 486 ** authenticate certificate hook returns SECWouldBlock. If the application
michael@0 487 ** needs to handle and/or override a bad cert, it should do so before it
michael@0 488 ** calls SSL_AuthCertificateComplete (modifying the error it passes to
michael@0 489 ** SSL_AuthCertificateComplete as needed).
michael@0 490 **
michael@0 491 ** See the documentation for SSL_AuthCertificateComplete for more information
michael@0 492 ** about the asynchronous behavior that occurs when the authenticate
michael@0 493 ** certificate hook returns SECWouldBlock.
michael@0 494 **
michael@0 495 ** RFC 6066 says that clients should send the bad_certificate_status_response
michael@0 496 ** alert when they encounter an error processing the stapled OCSP response.
michael@0 497 ** libssl does not provide a way for the authenticate certificate hook to
michael@0 498 ** indicate that an OCSP error (SEC_ERROR_OCSP_*) that it returns is an error
michael@0 499 ** in the stapled OCSP response or an error in some other OCSP response.
michael@0 500 ** Further, NSS does not provide a convenient way to control or determine
michael@0 501 ** which OCSP response(s) were used to validate a certificate chain.
michael@0 502 ** Consequently, the current version of libssl does not ever send the
michael@0 503 ** bad_certificate_status_response alert. This may change in future releases.
michael@0 504 */
michael@0 505 typedef SECStatus (PR_CALLBACK *SSLAuthCertificate)(void *arg, PRFileDesc *fd,
michael@0 506 PRBool checkSig,
michael@0 507 PRBool isServer);
michael@0 508
michael@0 509 SSL_IMPORT SECStatus SSL_AuthCertificateHook(PRFileDesc *fd,
michael@0 510 SSLAuthCertificate f,
michael@0 511 void *arg);
michael@0 512
michael@0 513 /* An implementation of the certificate authentication hook */
michael@0 514 SSL_IMPORT SECStatus SSL_AuthCertificate(void *arg, PRFileDesc *fd,
michael@0 515 PRBool checkSig, PRBool isServer);
michael@0 516
michael@0 517 /*
michael@0 518 * Prototype for SSL callback to get client auth data from the application.
michael@0 519 * arg - application passed argument
michael@0 520 * caNames - pointer to distinguished names of CAs that the server likes
michael@0 521 * pRetCert - pointer to pointer to cert, for return of cert
michael@0 522 * pRetKey - pointer to key pointer, for return of key
michael@0 523 */
michael@0 524 typedef SECStatus (PR_CALLBACK *SSLGetClientAuthData)(void *arg,
michael@0 525 PRFileDesc *fd,
michael@0 526 CERTDistNames *caNames,
michael@0 527 CERTCertificate **pRetCert,/*return */
michael@0 528 SECKEYPrivateKey **pRetKey);/* return */
michael@0 529
michael@0 530 /*
michael@0 531 * Set the client side callback for SSL to retrieve user's private key
michael@0 532 * and certificate.
michael@0 533 * fd - the file descriptor for the connection in question
michael@0 534 * f - the application's callback that delivers the key and cert
michael@0 535 * a - application specific data
michael@0 536 */
michael@0 537 SSL_IMPORT SECStatus SSL_GetClientAuthDataHook(PRFileDesc *fd,
michael@0 538 SSLGetClientAuthData f, void *a);
michael@0 539
michael@0 540
michael@0 541 /*
michael@0 542 ** SNI extension processing callback function.
michael@0 543 ** It is called when SSL socket receives SNI extension in ClientHello message.
michael@0 544 ** Upon this callback invocation, application is responsible to reconfigure the
michael@0 545 ** socket with the data for a particular server name.
michael@0 546 ** There are three potential outcomes of this function invocation:
michael@0 547 ** * application does not recognize the name or the type and wants the
michael@0 548 ** "unrecognized_name" alert be sent to the client. In this case the callback
michael@0 549 ** function must return SSL_SNI_SEND_ALERT status.
michael@0 550 ** * application does not recognize the name, but wants to continue with
michael@0 551 ** the handshake using the current socket configuration. In this case,
michael@0 552 ** no socket reconfiguration is needed and the function should return
michael@0 553 ** SSL_SNI_CURRENT_CONFIG_IS_USED.
michael@0 554 ** * application recognizes the name and reconfigures the socket with
michael@0 555 ** appropriate certs, key, etc. There are many ways to reconfigure. NSS
michael@0 556 ** provides SSL_ReconfigFD function that can be used to update the socket
michael@0 557 ** data from model socket. To continue with the rest of the handshake, the
michael@0 558 ** implementation function should return an index of a name it has chosen.
michael@0 559 ** LibSSL will ignore any SNI extension received in a ClientHello message
michael@0 560 ** if application does not register a SSLSNISocketConfig callback.
michael@0 561 ** Each type field of SECItem indicates the name type.
michael@0 562 ** NOTE: currently RFC3546 defines only one name type: sni_host_name.
michael@0 563 ** Client is allowed to send only one name per known type. LibSSL will
michael@0 564 ** send an "unrecognized_name" alert if SNI extension name list contains more
michael@0 565 ** then one name of a type.
michael@0 566 */
michael@0 567 typedef PRInt32 (PR_CALLBACK *SSLSNISocketConfig)(PRFileDesc *fd,
michael@0 568 const SECItem *srvNameArr,
michael@0 569 PRUint32 srvNameArrSize,
michael@0 570 void *arg);
michael@0 571
michael@0 572 /*
michael@0 573 ** SSLSNISocketConfig should return an index within 0 and srvNameArrSize-1
michael@0 574 ** when it has reconfigured the socket fd to use certs and keys, etc
michael@0 575 ** for a specific name. There are two other allowed return values. One
michael@0 576 ** tells libSSL to use the default cert and key. The other tells libSSL
michael@0 577 ** to send the "unrecognized_name" alert. These values are:
michael@0 578 **/
michael@0 579 #define SSL_SNI_CURRENT_CONFIG_IS_USED -1
michael@0 580 #define SSL_SNI_SEND_ALERT -2
michael@0 581
michael@0 582 /*
michael@0 583 ** Set application implemented SNISocketConfig callback.
michael@0 584 */
michael@0 585 SSL_IMPORT SECStatus SSL_SNISocketConfigHook(PRFileDesc *fd,
michael@0 586 SSLSNISocketConfig f,
michael@0 587 void *arg);
michael@0 588
michael@0 589 /*
michael@0 590 ** Reconfigure fd SSL socket with model socket parameters. Sets
michael@0 591 ** server certs and keys, list of trust anchor, socket options
michael@0 592 ** and all SSL socket call backs and parameters.
michael@0 593 */
michael@0 594 SSL_IMPORT PRFileDesc *SSL_ReconfigFD(PRFileDesc *model, PRFileDesc *fd);
michael@0 595
michael@0 596 /*
michael@0 597 * Set the client side argument for SSL to retrieve PKCS #11 pin.
michael@0 598 * fd - the file descriptor for the connection in question
michael@0 599 * a - pkcs11 application specific data
michael@0 600 */
michael@0 601 SSL_IMPORT SECStatus SSL_SetPKCS11PinArg(PRFileDesc *fd, void *a);
michael@0 602
michael@0 603 /*
michael@0 604 ** This is a callback for dealing with server certs that are not authenticated
michael@0 605 ** by the client. The client app can decide that it actually likes the
michael@0 606 ** cert by some external means and restart the connection.
michael@0 607 **
michael@0 608 ** The bad cert hook must return SECSuccess to override the result of the
michael@0 609 ** authenticate certificate hook, SECFailure if the certificate should still be
michael@0 610 ** considered invalid, or SECWouldBlock if the application will authenticate
michael@0 611 ** the certificate asynchronously. SECWouldBlock is only supported for
michael@0 612 ** non-blocking sockets.
michael@0 613 **
michael@0 614 ** See the documentation for SSL_AuthCertificateComplete for more information
michael@0 615 ** about the asynchronous behavior that occurs when the bad cert hook returns
michael@0 616 ** SECWouldBlock.
michael@0 617 */
michael@0 618 typedef SECStatus (PR_CALLBACK *SSLBadCertHandler)(void *arg, PRFileDesc *fd);
michael@0 619 SSL_IMPORT SECStatus SSL_BadCertHook(PRFileDesc *fd, SSLBadCertHandler f,
michael@0 620 void *arg);
michael@0 621
michael@0 622 /*
michael@0 623 ** Configure SSL socket for running a secure server. Needs the
michael@0 624 ** certificate for the server and the servers private key. The arguments
michael@0 625 ** are copied.
michael@0 626 */
michael@0 627 SSL_IMPORT SECStatus SSL_ConfigSecureServer(
michael@0 628 PRFileDesc *fd, CERTCertificate *cert,
michael@0 629 SECKEYPrivateKey *key, SSLKEAType kea);
michael@0 630
michael@0 631 /*
michael@0 632 ** Allows SSL socket configuration with caller-supplied certificate chain.
michael@0 633 ** If certChainOpt is NULL, tries to find one.
michael@0 634 */
michael@0 635 SSL_IMPORT SECStatus
michael@0 636 SSL_ConfigSecureServerWithCertChain(PRFileDesc *fd, CERTCertificate *cert,
michael@0 637 const CERTCertificateList *certChainOpt,
michael@0 638 SECKEYPrivateKey *key, SSLKEAType kea);
michael@0 639
michael@0 640 /*
michael@0 641 ** Configure a secure server's session-id cache. Define the maximum number
michael@0 642 ** of entries in the cache, the longevity of the entires, and the directory
michael@0 643 ** where the cache files will be placed. These values can be zero, and
michael@0 644 ** if so, the implementation will choose defaults.
michael@0 645 ** This version of the function is for use in applications that have only one
michael@0 646 ** process that uses the cache (even if that process has multiple threads).
michael@0 647 */
michael@0 648 SSL_IMPORT SECStatus SSL_ConfigServerSessionIDCache(int maxCacheEntries,
michael@0 649 PRUint32 timeout,
michael@0 650 PRUint32 ssl3_timeout,
michael@0 651 const char * directory);
michael@0 652
michael@0 653 /* Configure a secure server's session-id cache. Depends on value of
michael@0 654 * enableMPCache, configures malti-proc or single proc cache. */
michael@0 655 SSL_IMPORT SECStatus SSL_ConfigServerSessionIDCacheWithOpt(
michael@0 656 PRUint32 timeout,
michael@0 657 PRUint32 ssl3_timeout,
michael@0 658 const char * directory,
michael@0 659 int maxCacheEntries,
michael@0 660 int maxCertCacheEntries,
michael@0 661 int maxSrvNameCacheEntries,
michael@0 662 PRBool enableMPCache);
michael@0 663
michael@0 664 /*
michael@0 665 ** Like SSL_ConfigServerSessionIDCache, with one important difference.
michael@0 666 ** If the application will run multiple processes (as opposed to, or in
michael@0 667 ** addition to multiple threads), then it must call this function, instead
michael@0 668 ** of calling SSL_ConfigServerSessionIDCache().
michael@0 669 ** This has nothing to do with the number of processORs, only processEs.
michael@0 670 ** This function sets up a Server Session ID (SID) cache that is safe for
michael@0 671 ** access by multiple processes on the same system.
michael@0 672 */
michael@0 673 SSL_IMPORT SECStatus SSL_ConfigMPServerSIDCache(int maxCacheEntries,
michael@0 674 PRUint32 timeout,
michael@0 675 PRUint32 ssl3_timeout,
michael@0 676 const char * directory);
michael@0 677
michael@0 678 /* Get and set the configured maximum number of mutexes used for the
michael@0 679 ** server's store of SSL sessions. This value is used by the server
michael@0 680 ** session ID cache initialization functions shown above. Note that on
michael@0 681 ** some platforms, these mutexes are actually implemented with POSIX
michael@0 682 ** semaphores, or with unnamed pipes. The default value varies by platform.
michael@0 683 ** An attempt to set a too-low maximum will return an error and the
michael@0 684 ** configured value will not be changed.
michael@0 685 */
michael@0 686 SSL_IMPORT PRUint32 SSL_GetMaxServerCacheLocks(void);
michael@0 687 SSL_IMPORT SECStatus SSL_SetMaxServerCacheLocks(PRUint32 maxLocks);
michael@0 688
michael@0 689 /* environment variable set by SSL_ConfigMPServerSIDCache, and queried by
michael@0 690 * SSL_InheritMPServerSIDCache when envString is NULL.
michael@0 691 */
michael@0 692 #define SSL_ENV_VAR_NAME "SSL_INHERITANCE"
michael@0 693
michael@0 694 /* called in child to inherit SID Cache variables.
michael@0 695 * If envString is NULL, this function will use the value of the environment
michael@0 696 * variable "SSL_INHERITANCE", otherwise the string value passed in will be
michael@0 697 * used.
michael@0 698 */
michael@0 699 SSL_IMPORT SECStatus SSL_InheritMPServerSIDCache(const char * envString);
michael@0 700
michael@0 701 /*
michael@0 702 ** Set the callback that gets called when a TLS handshake is complete. The
michael@0 703 ** handshake callback is called after verifying the peer's Finished message and
michael@0 704 ** before processing incoming application data.
michael@0 705 **
michael@0 706 ** For the initial handshake: If the handshake false started (see
michael@0 707 ** SSL_ENABLE_FALSE_START), then application data may already have been sent
michael@0 708 ** before the handshake callback is called. If we did not false start then the
michael@0 709 ** callback will get called before any application data is sent.
michael@0 710 */
michael@0 711 typedef void (PR_CALLBACK *SSLHandshakeCallback)(PRFileDesc *fd,
michael@0 712 void *client_data);
michael@0 713 SSL_IMPORT SECStatus SSL_HandshakeCallback(PRFileDesc *fd,
michael@0 714 SSLHandshakeCallback cb, void *client_data);
michael@0 715
michael@0 716 /* Applications that wish to enable TLS false start must set this callback
michael@0 717 ** function. NSS will invoke the functon to determine if a particular
michael@0 718 ** connection should use false start or not. SECSuccess indicates that the
michael@0 719 ** callback completed successfully, and if so *canFalseStart indicates if false
michael@0 720 ** start can be used. If the callback does not return SECSuccess then the
michael@0 721 ** handshake will be canceled. NSS's recommended criteria can be evaluated by
michael@0 722 ** calling SSL_RecommendedCanFalseStart.
michael@0 723 **
michael@0 724 ** If no false start callback is registered then false start will never be
michael@0 725 ** done, even if the SSL_ENABLE_FALSE_START option is enabled.
michael@0 726 **/
michael@0 727 typedef SECStatus (PR_CALLBACK *SSLCanFalseStartCallback)(
michael@0 728 PRFileDesc *fd, void *arg, PRBool *canFalseStart);
michael@0 729
michael@0 730 SSL_IMPORT SECStatus SSL_SetCanFalseStartCallback(
michael@0 731 PRFileDesc *fd, SSLCanFalseStartCallback callback, void *arg);
michael@0 732
michael@0 733 /* This function sets *canFalseStart according to the recommended criteria for
michael@0 734 ** false start. These criteria may change from release to release and may depend
michael@0 735 ** on which handshake features have been negotiated and/or properties of the
michael@0 736 ** certifciates/keys used on the connection.
michael@0 737 */
michael@0 738 SSL_IMPORT SECStatus SSL_RecommendedCanFalseStart(PRFileDesc *fd,
michael@0 739 PRBool *canFalseStart);
michael@0 740
michael@0 741 /*
michael@0 742 ** For the server, request a new handshake. For the client, begin a new
michael@0 743 ** handshake. If flushCache is non-zero, the SSL3 cache entry will be
michael@0 744 ** flushed first, ensuring that a full SSL handshake will be done.
michael@0 745 ** If flushCache is zero, and an SSL connection is established, it will
michael@0 746 ** do the much faster session restart handshake. This will change the
michael@0 747 ** session keys without doing another private key operation.
michael@0 748 */
michael@0 749 SSL_IMPORT SECStatus SSL_ReHandshake(PRFileDesc *fd, PRBool flushCache);
michael@0 750
michael@0 751 /*
michael@0 752 ** Same as above, but with an I/O timeout.
michael@0 753 */
michael@0 754 SSL_IMPORT SECStatus SSL_ReHandshakeWithTimeout(PRFileDesc *fd,
michael@0 755 PRBool flushCache,
michael@0 756 PRIntervalTime timeout);
michael@0 757
michael@0 758
michael@0 759 #ifdef SSL_DEPRECATED_FUNCTION
michael@0 760 /* deprecated!
michael@0 761 ** For the server, request a new handshake. For the client, begin a new
michael@0 762 ** handshake. Flushes SSL3 session cache entry first, ensuring that a
michael@0 763 ** full handshake will be done.
michael@0 764 ** This call is equivalent to SSL_ReHandshake(fd, PR_TRUE)
michael@0 765 */
michael@0 766 SSL_IMPORT SECStatus SSL_RedoHandshake(PRFileDesc *fd);
michael@0 767 #endif
michael@0 768
michael@0 769 /*
michael@0 770 * Allow the application to pass a URL or hostname into the SSL library.
michael@0 771 */
michael@0 772 SSL_IMPORT SECStatus SSL_SetURL(PRFileDesc *fd, const char *url);
michael@0 773
michael@0 774 /*
michael@0 775 * Allow an application to define a set of trust anchors for peer
michael@0 776 * cert validation.
michael@0 777 */
michael@0 778 SSL_IMPORT SECStatus SSL_SetTrustAnchors(PRFileDesc *fd, CERTCertList *list);
michael@0 779
michael@0 780 /*
michael@0 781 ** Return the number of bytes that SSL has waiting in internal buffers.
michael@0 782 ** Return 0 if security is not enabled.
michael@0 783 */
michael@0 784 SSL_IMPORT int SSL_DataPending(PRFileDesc *fd);
michael@0 785
michael@0 786 /*
michael@0 787 ** Invalidate the SSL session associated with fd.
michael@0 788 */
michael@0 789 SSL_IMPORT SECStatus SSL_InvalidateSession(PRFileDesc *fd);
michael@0 790
michael@0 791 /*
michael@0 792 ** Return a SECItem containing the SSL session ID associated with the fd.
michael@0 793 */
michael@0 794 SSL_IMPORT SECItem *SSL_GetSessionID(PRFileDesc *fd);
michael@0 795
michael@0 796 /*
michael@0 797 ** Clear out the client's SSL session cache, not the server's session cache.
michael@0 798 */
michael@0 799 SSL_IMPORT void SSL_ClearSessionCache(void);
michael@0 800
michael@0 801 /*
michael@0 802 ** Close the server's SSL session cache.
michael@0 803 */
michael@0 804 SSL_IMPORT SECStatus SSL_ShutdownServerSessionIDCache(void);
michael@0 805
michael@0 806 /*
michael@0 807 ** Set peer information so we can correctly look up SSL session later.
michael@0 808 ** You only have to do this if you're tunneling through a proxy.
michael@0 809 */
michael@0 810 SSL_IMPORT SECStatus SSL_SetSockPeerID(PRFileDesc *fd, const char *peerID);
michael@0 811
michael@0 812 /*
michael@0 813 ** Reveal the security information for the peer.
michael@0 814 */
michael@0 815 SSL_IMPORT CERTCertificate * SSL_RevealCert(PRFileDesc * socket);
michael@0 816 SSL_IMPORT void * SSL_RevealPinArg(PRFileDesc * socket);
michael@0 817 SSL_IMPORT char * SSL_RevealURL(PRFileDesc * socket);
michael@0 818
michael@0 819 /* This callback may be passed to the SSL library via a call to
michael@0 820 * SSL_GetClientAuthDataHook() for each SSL client socket.
michael@0 821 * It will be invoked when SSL needs to know what certificate and private key
michael@0 822 * (if any) to use to respond to a request for client authentication.
michael@0 823 * If arg is non-NULL, it is a pointer to a NULL-terminated string containing
michael@0 824 * the nickname of the cert/key pair to use.
michael@0 825 * If arg is NULL, this function will search the cert and key databases for
michael@0 826 * a suitable match and send it if one is found.
michael@0 827 */
michael@0 828 SSL_IMPORT SECStatus
michael@0 829 NSS_GetClientAuthData(void * arg,
michael@0 830 PRFileDesc * socket,
michael@0 831 struct CERTDistNamesStr * caNames,
michael@0 832 struct CERTCertificateStr ** pRetCert,
michael@0 833 struct SECKEYPrivateKeyStr **pRetKey);
michael@0 834
michael@0 835 /*
michael@0 836 ** Configure DTLS-SRTP (RFC 5764) cipher suite preferences.
michael@0 837 ** Input is a list of ciphers in descending preference order and a length
michael@0 838 ** of the list. As a side effect, this causes the use_srtp extension to be
michael@0 839 ** negotiated.
michael@0 840 **
michael@0 841 ** Invalid or unimplemented cipher suites in |ciphers| are ignored. If at
michael@0 842 ** least one cipher suite in |ciphers| is implemented, returns SECSuccess.
michael@0 843 ** Otherwise returns SECFailure.
michael@0 844 */
michael@0 845 SSL_IMPORT SECStatus SSL_SetSRTPCiphers(PRFileDesc *fd,
michael@0 846 const PRUint16 *ciphers,
michael@0 847 unsigned int numCiphers);
michael@0 848
michael@0 849 /*
michael@0 850 ** Get the selected DTLS-SRTP cipher suite (if any).
michael@0 851 ** To be called after the handshake completes.
michael@0 852 ** Returns SECFailure if not negotiated.
michael@0 853 */
michael@0 854 SSL_IMPORT SECStatus SSL_GetSRTPCipher(PRFileDesc *fd,
michael@0 855 PRUint16 *cipher);
michael@0 856
michael@0 857 /*
michael@0 858 * Look to see if any of the signers in the cert chain for "cert" are found
michael@0 859 * in the list of caNames.
michael@0 860 * Returns SECSuccess if so, SECFailure if not.
michael@0 861 * Used by NSS_GetClientAuthData. May be used by other callback functions.
michael@0 862 */
michael@0 863 SSL_IMPORT SECStatus NSS_CmpCertChainWCANames(CERTCertificate *cert,
michael@0 864 CERTDistNames *caNames);
michael@0 865
michael@0 866 /*
michael@0 867 * Returns key exchange type of the keys in an SSL server certificate.
michael@0 868 */
michael@0 869 SSL_IMPORT SSLKEAType NSS_FindCertKEAType(CERTCertificate * cert);
michael@0 870
michael@0 871 /* Set cipher policies to a predefined Domestic (U.S.A.) policy.
michael@0 872 * This essentially allows all supported ciphers.
michael@0 873 */
michael@0 874 SSL_IMPORT SECStatus NSS_SetDomesticPolicy(void);
michael@0 875
michael@0 876 /* Set cipher policies to a predefined Policy that is exportable from the USA
michael@0 877 * according to present U.S. policies as we understand them.
michael@0 878 * It is the same as NSS_SetDomesticPolicy now.
michael@0 879 */
michael@0 880 SSL_IMPORT SECStatus NSS_SetExportPolicy(void);
michael@0 881
michael@0 882 /* Set cipher policies to a predefined Policy that is exportable from the USA
michael@0 883 * according to present U.S. policies as we understand them, and that the
michael@0 884 * nation of France will permit to be imported into their country.
michael@0 885 * It is the same as NSS_SetDomesticPolicy now.
michael@0 886 */
michael@0 887 SSL_IMPORT SECStatus NSS_SetFrancePolicy(void);
michael@0 888
michael@0 889 SSL_IMPORT SSL3Statistics * SSL_GetStatistics(void);
michael@0 890
michael@0 891 /* Report more information than SSL_SecurityStatus.
michael@0 892 ** Caller supplies the info struct. Function fills it in.
michael@0 893 */
michael@0 894 SSL_IMPORT SECStatus SSL_GetChannelInfo(PRFileDesc *fd, SSLChannelInfo *info,
michael@0 895 PRUintn len);
michael@0 896 SSL_IMPORT SECStatus SSL_GetCipherSuiteInfo(PRUint16 cipherSuite,
michael@0 897 SSLCipherSuiteInfo *info, PRUintn len);
michael@0 898
michael@0 899 /* Returnes negotiated through SNI host info. */
michael@0 900 SSL_IMPORT SECItem *SSL_GetNegotiatedHostInfo(PRFileDesc *fd);
michael@0 901
michael@0 902 /* Export keying material according to RFC 5705.
michael@0 903 ** fd must correspond to a TLS 1.0 or higher socket and out must
michael@0 904 ** already be allocated. If hasContext is false, it uses the no-context
michael@0 905 ** construction from the RFC and ignores the context and contextLen
michael@0 906 ** arguments.
michael@0 907 */
michael@0 908 SSL_IMPORT SECStatus SSL_ExportKeyingMaterial(PRFileDesc *fd,
michael@0 909 const char *label,
michael@0 910 unsigned int labelLen,
michael@0 911 PRBool hasContext,
michael@0 912 const unsigned char *context,
michael@0 913 unsigned int contextLen,
michael@0 914 unsigned char *out,
michael@0 915 unsigned int outLen);
michael@0 916
michael@0 917 /*
michael@0 918 ** Return a new reference to the certificate that was most recently sent
michael@0 919 ** to the peer on this SSL/TLS connection, or NULL if none has been sent.
michael@0 920 */
michael@0 921 SSL_IMPORT CERTCertificate * SSL_LocalCertificate(PRFileDesc *fd);
michael@0 922
michael@0 923 /* Test an SSL configuration to see if SSL_BYPASS_PKCS11 can be turned on.
michael@0 924 ** Check the key exchange algorithm for each cipher in the list to see if
michael@0 925 ** a master secret key can be extracted after being derived with the mechanism
michael@0 926 ** required by the protocolmask argument. If the KEA will use keys from the
michael@0 927 ** specified cert make sure the extract operation is attempted from the slot
michael@0 928 ** where the private key resides.
michael@0 929 ** If MS can be extracted for all ciphers, (*pcanbypass) is set to TRUE and
michael@0 930 ** SECSuccess is returned. In all other cases but one (*pcanbypass) is
michael@0 931 ** set to FALSE and SECFailure is returned.
michael@0 932 ** In that last case Derive() has been called successfully but the MS is null,
michael@0 933 ** CanBypass sets (*pcanbypass) to FALSE and returns SECSuccess indicating the
michael@0 934 ** arguments were all valid but the slot cannot be bypassed.
michael@0 935 **
michael@0 936 ** Note: A TRUE return code from CanBypass means "Your configuration will perform
michael@0 937 ** NO WORSE with the bypass enabled than without"; it does NOT mean that every
michael@0 938 ** cipher suite listed will work properly with the selected protocols.
michael@0 939 **
michael@0 940 ** Caveat: If export cipher suites are included in the argument list Canbypass
michael@0 941 ** will return FALSE.
michael@0 942 **/
michael@0 943
michael@0 944 /* protocol mask bits */
michael@0 945 #define SSL_CBP_SSL3 0x0001 /* test SSL v3 mechanisms */
michael@0 946 #define SSL_CBP_TLS1_0 0x0002 /* test TLS v1.0 mechanisms */
michael@0 947
michael@0 948 SSL_IMPORT SECStatus SSL_CanBypass(CERTCertificate *cert,
michael@0 949 SECKEYPrivateKey *privKey,
michael@0 950 PRUint32 protocolmask,
michael@0 951 PRUint16 *ciphers, int nciphers,
michael@0 952 PRBool *pcanbypass, void *pwArg);
michael@0 953
michael@0 954 /*
michael@0 955 ** Did the handshake with the peer negotiate the given extension?
michael@0 956 ** Output parameter valid only if function returns SECSuccess
michael@0 957 */
michael@0 958 SSL_IMPORT SECStatus SSL_HandshakeNegotiatedExtension(PRFileDesc * socket,
michael@0 959 SSLExtensionType extId,
michael@0 960 PRBool *yes);
michael@0 961
michael@0 962 /*
michael@0 963 ** How long should we wait before retransmitting the next flight of
michael@0 964 ** the DTLS handshake? Returns SECFailure if not DTLS or not in a
michael@0 965 ** handshake.
michael@0 966 */
michael@0 967 SSL_IMPORT SECStatus DTLS_GetHandshakeTimeout(PRFileDesc *socket,
michael@0 968 PRIntervalTime *timeout);
michael@0 969
michael@0 970 /*
michael@0 971 * Return a boolean that indicates whether the underlying library
michael@0 972 * will perform as the caller expects.
michael@0 973 *
michael@0 974 * The only argument is a string, which should be the version
michael@0 975 * identifier of the NSS library. That string will be compared
michael@0 976 * against a string that represents the actual build version of
michael@0 977 * the SSL library.
michael@0 978 */
michael@0 979 extern PRBool NSSSSL_VersionCheck(const char *importedVersion);
michael@0 980
michael@0 981 /*
michael@0 982 * Returns a const string of the SSL library version.
michael@0 983 */
michael@0 984 extern const char *NSSSSL_GetVersion(void);
michael@0 985
michael@0 986 /* Restart an SSL connection that was paused to do asynchronous certificate
michael@0 987 * chain validation (when the auth certificate hook or bad cert handler
michael@0 988 * returned SECWouldBlock).
michael@0 989 *
michael@0 990 * This function only works for non-blocking sockets; Do not use it for
michael@0 991 * blocking sockets. Currently, this function works only for the client role of
michael@0 992 * a connection; it does not work for the server role.
michael@0 993 *
michael@0 994 * The application must call SSL_AuthCertificateComplete with 0 as the value of
michael@0 995 * the error parameter after it has successfully validated the peer's
michael@0 996 * certificate, in order to continue the SSL handshake.
michael@0 997 *
michael@0 998 * The application may call SSL_AuthCertificateComplete with a non-zero value
michael@0 999 * for error (e.g. SEC_ERROR_REVOKED_CERTIFICATE) when certificate validation
michael@0 1000 * fails, before it closes the connection. If the application does so, an
michael@0 1001 * alert corresponding to the error (e.g. certificate_revoked) will be sent to
michael@0 1002 * the peer. See the source code of the internal function
michael@0 1003 * ssl3_SendAlertForCertError for the current mapping of error to alert. This
michael@0 1004 * mapping may change in future versions of libssl.
michael@0 1005 *
michael@0 1006 * This function will not complete the entire handshake. The application must
michael@0 1007 * call SSL_ForceHandshake, PR_Recv, PR_Send, etc. after calling this function
michael@0 1008 * to force the handshake to complete.
michael@0 1009 *
michael@0 1010 * On the first handshake of a connection, libssl will wait for the peer's
michael@0 1011 * certificate to be authenticated before calling the handshake callback,
michael@0 1012 * sending a client certificate, sending any application data, or returning
michael@0 1013 * any application data to the application. On subsequent (renegotiation)
michael@0 1014 * handshakes, libssl will block the handshake unconditionally while the
michael@0 1015 * certificate is being validated.
michael@0 1016 *
michael@0 1017 * libssl may send and receive handshake messages while waiting for the
michael@0 1018 * application to call SSL_AuthCertificateComplete, and it may call other
michael@0 1019 * callbacks (e.g, the client auth data hook) before
michael@0 1020 * SSL_AuthCertificateComplete has been called.
michael@0 1021 *
michael@0 1022 * An application that uses this asynchronous mechanism will usually have lower
michael@0 1023 * handshake latency if it has to do public key operations on the certificate
michael@0 1024 * chain and/or CRL/OCSP/cert fetching during the authentication, especially if
michael@0 1025 * it does so in parallel on another thread. However, if the application can
michael@0 1026 * authenticate the peer's certificate quickly then it may be more efficient
michael@0 1027 * to use the synchronous mechanism (i.e. returning SECFailure/SECSuccess
michael@0 1028 * instead of SECWouldBlock from the authenticate certificate hook).
michael@0 1029 *
michael@0 1030 * Be careful about converting an application from synchronous cert validation
michael@0 1031 * to asynchronous certificate validation. A naive conversion is likely to
michael@0 1032 * result in deadlocks; e.g. the application will wait in PR_Poll for network
michael@0 1033 * I/O on the connection while all network I/O on the connection is blocked
michael@0 1034 * waiting for this function to be called.
michael@0 1035 *
michael@0 1036 * Returns SECFailure on failure, SECSuccess on success. Never returns
michael@0 1037 * SECWouldBlock. Note that SSL_AuthCertificateComplete will (usually) return
michael@0 1038 * SECSuccess; do not interpret the return value of SSL_AuthCertificateComplete
michael@0 1039 * as an indicator of whether it is OK to continue using the connection. For
michael@0 1040 * example, SSL_AuthCertificateComplete(fd, SEC_ERROR_REVOKED_CERTIFICATE) will
michael@0 1041 * return SECSuccess (normally), but that does not mean that the application
michael@0 1042 * should continue using the connection. If the application passes a non-zero
michael@0 1043 * value for second argument (error), or if SSL_AuthCertificateComplete returns
michael@0 1044 * anything other than SECSuccess, then the application should close the
michael@0 1045 * connection.
michael@0 1046 */
michael@0 1047 SSL_IMPORT SECStatus SSL_AuthCertificateComplete(PRFileDesc *fd,
michael@0 1048 PRErrorCode error);
michael@0 1049 SEC_END_PROTOS
michael@0 1050
michael@0 1051 #endif /* __ssl_h_ */

mercurial