Chromium Code Reviews| Index: net/third_party/nss/ssl/sslsock.c |
| =================================================================== |
| --- net/third_party/nss/ssl/sslsock.c (revision 127709) |
| +++ net/third_party/nss/ssl/sslsock.c (working copy) |
| @@ -194,11 +194,20 @@ |
| /* |
| * default range of enabled SSL/TLS protocols |
| */ |
| -static SSLVersionRange versions_defaults = { |
| +static SSLVersionRange versions_defaults_stream = { |
| SSL_LIBRARY_VERSION_3_0, |
| SSL_LIBRARY_VERSION_TLS_1_0 |
| }; |
| +static SSLVersionRange versions_defaults_datagram = { |
| + SSL_LIBRARY_VERSION_TLS_1_1, |
| + SSL_LIBRARY_VERSION_TLS_1_1 |
| +}; |
| + |
| +#define VERSIONS_DEFAULTS(variant) \ |
| + (variant == ssl_variant_stream ? &versions_defaults_stream : \ |
| + &versions_defaults_datagram) |
| + |
| sslSessionIDLookupFunc ssl_sid_lookup; |
| sslSessionIDCacheFunc ssl_sid_cache; |
| sslSessionIDUncacheFunc ssl_sid_uncache; |
| @@ -217,7 +226,7 @@ |
| #define LOCKSTATUS_OFFSET 10 /* offset of ENABLED */ |
| /* forward declarations. */ |
| -static sslSocket *ssl_NewSocket(PRBool makeLocks); |
| +static sslSocket *ssl_NewSocket(PRBool makeLocks, SSLProtocolVariant variant); |
| static SECStatus ssl_MakeLocks(sslSocket *ss); |
| static void ssl_SetDefaultsFromEnvironment(void); |
| static PRStatus ssl_PushIOLayer(sslSocket *ns, PRFileDesc *stack, |
| @@ -281,7 +290,13 @@ |
| sslSocket *ss; |
| SECStatus rv; |
| - ss = ssl_NewSocket((PRBool)(!os->opt.noLocks)); |
| + /* Not implemented for datagram */ |
| + if (os->protocolVariant != ssl_variant_stream) { |
|
Ryan Sleevi
2012/03/22 22:26:37
!IS_DTLS(os) ?
ekr
2012/03/23 12:46:41
Yes.
|
| + PORT_SetError(PR_NOT_IMPLEMENTED_ERROR); |
| + return NULL; |
| + } |
| + |
| + ss = ssl_NewSocket((PRBool)(!os->opt.noLocks), os->protocolVariant); |
| if (ss) { |
| ss->opt = os->opt; |
| ss->opt.useSocks = PR_FALSE; |
| @@ -698,6 +713,13 @@ |
| break; |
| case SSL_ENABLE_TLS: |
| + if (IS_DTLS(ss)) { |
| + if (on) { |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + rv = SECFailure; /* not allowed */ |
| + } |
| + break; |
| + } |
| ssl_EnableTLS(&ss->vrange, on); |
| ss->preferredCipher = NULL; |
| if (ss->cipherSpecs) { |
| @@ -708,6 +730,13 @@ |
| break; |
| case SSL_ENABLE_SSL3: |
| + if (IS_DTLS(ss)) { |
| + if (on) { |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + rv = SECFailure; /* not allowed */ |
| + } |
| + break; |
| + } |
| ssl_EnableSSL3(&ss->vrange, on); |
| ss->preferredCipher = NULL; |
| if (ss->cipherSpecs) { |
| @@ -718,6 +747,13 @@ |
| break; |
| case SSL_ENABLE_SSL2: |
| + if (IS_DTLS(ss)) { |
| + if (on) { |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + rv = SECFailure; /* not allowed */ |
| + } |
| + break; |
| + } |
| ss->opt.enableSSL2 = on; |
| if (on) { |
| ss->opt.v2CompatibleHello = on; |
| @@ -743,6 +779,13 @@ |
| break; |
| case SSL_V2_COMPATIBLE_HELLO: |
| + if (IS_DTLS(ss)) { |
| + if (on) { |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + rv = SECFailure; /* not allowed */ |
| + } |
| + break; |
| + } |
| ss->opt.v2CompatibleHello = on; |
| if (!on) { |
| ss->opt.enableSSL2 = on; |
| @@ -938,10 +981,10 @@ |
| case SSL_HANDSHAKE_AS_CLIENT: on = ssl_defaults.handshakeAsClient; break; |
| case SSL_HANDSHAKE_AS_SERVER: on = ssl_defaults.handshakeAsServer; break; |
| case SSL_ENABLE_TLS: |
| - on = versions_defaults.max >= SSL_LIBRARY_VERSION_TLS_1_0; |
| + on = versions_defaults_stream.max >= SSL_LIBRARY_VERSION_TLS_1_0; |
| break; |
| case SSL_ENABLE_SSL3: |
| - on = versions_defaults.min == SSL_LIBRARY_VERSION_3_0; |
| + on = versions_defaults_stream.min == SSL_LIBRARY_VERSION_3_0; |
| break; |
| case SSL_ENABLE_SSL2: on = ssl_defaults.enableSSL2; break; |
| case SSL_NO_CACHE: on = ssl_defaults.noCache; break; |
| @@ -1034,11 +1077,11 @@ |
| break; |
| case SSL_ENABLE_TLS: |
| - ssl_EnableTLS(&versions_defaults, on); |
| + ssl_EnableTLS(&versions_defaults_stream, on); |
| break; |
| case SSL_ENABLE_SSL3: |
| - ssl_EnableSSL3(&versions_defaults, on); |
| + ssl_EnableSSL3(&versions_defaults_stream, on); |
| break; |
| case SSL_ENABLE_SSL2: |
| @@ -1360,8 +1403,8 @@ |
| /* LOCKS ??? XXX */ |
| -PRFileDesc * |
| -SSL_ImportFD(PRFileDesc *model, PRFileDesc *fd) |
| +static PRFileDesc * |
| +ssl_ImportFD(PRFileDesc *model, PRFileDesc *fd, SSLProtocolVariant variant) |
| { |
| sslSocket * ns = NULL; |
| PRStatus rv; |
| @@ -1374,10 +1417,10 @@ |
| if (model == NULL) { |
| /* Just create a default socket if we're given NULL for the model */ |
| - ns = ssl_NewSocket((PRBool)(!ssl_defaults.noLocks)); |
| + ns = ssl_NewSocket((PRBool)(!ssl_defaults.noLocks), variant); |
| } else { |
| sslSocket * ss = ssl_FindSocket(model); |
| - if (ss == NULL) { |
| + if (ss == NULL || ss->protocolVariant != variant) { |
| SSL_DBG(("%d: SSL[%d]: bad model socket in ssl_ImportFD", |
| SSL_GETPID(), model)); |
| return NULL; |
| @@ -1403,6 +1446,18 @@ |
| return fd; |
| } |
| +PRFileDesc * |
| +SSL_ImportFD(PRFileDesc *model, PRFileDesc *fd) |
| +{ |
| + return ssl_ImportFD(model, fd, ssl_variant_stream); |
| +} |
| + |
| +PRFileDesc * |
| +DTLS_ImportFD(PRFileDesc *model, PRFileDesc *fd) |
| +{ |
| + return ssl_ImportFD(model, fd, ssl_variant_datagram); |
| +} |
| + |
| SECStatus |
| SSL_SetNextProtoCallback(PRFileDesc *fd, SSLNextProtoCallback callback, |
| void *arg) |
| @@ -1667,9 +1722,18 @@ |
| ssl3_VersionIsSupported(SSLProtocolVariant protocolVariant, |
| SSL3ProtocolVersion version) |
| { |
| - return protocolVariant == ssl_variant_stream && |
| - version >= SSL_LIBRARY_VERSION_3_0 && |
| - version <= SSL_LIBRARY_VERSION_MAX_SUPPORTED; |
| + switch (protocolVariant) { |
| + case ssl_variant_stream: |
| + return (version >= SSL_LIBRARY_VERSION_3_0 && |
| + version <= SSL_LIBRARY_VERSION_MAX_SUPPORTED); |
| + case ssl_variant_datagram: |
| + return (version >= SSL_LIBRARY_VERSION_TLS_1_1 && |
| + version <= SSL_LIBRARY_VERSION_MAX_SUPPORTED); |
| + default: |
| + /* Can't get here */ |
| + PORT_Assert(PR_FALSE); |
| + return PR_FALSE; |
| + } |
| } |
| /* Returns PR_TRUE if the given version range is valid and |
| @@ -1689,13 +1753,24 @@ |
| SSL_VersionRangeGetSupported(SSLProtocolVariant protocolVariant, |
| SSLVersionRange *vrange) |
| { |
| - if (protocolVariant != ssl_variant_stream || !vrange) { |
| + if (!vrange) { |
| PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| return SECFailure; |
| } |
| - vrange->min = SSL_LIBRARY_VERSION_3_0; |
| - vrange->max = SSL_LIBRARY_VERSION_MAX_SUPPORTED; |
| + switch (protocolVariant) { |
| + case ssl_variant_stream: |
| + vrange->min = SSL_LIBRARY_VERSION_3_0; |
| + vrange->max = SSL_LIBRARY_VERSION_MAX_SUPPORTED; |
| + break; |
| + case ssl_variant_datagram: |
| + vrange->min = SSL_LIBRARY_VERSION_TLS_1_1; |
| + vrange->max = SSL_LIBRARY_VERSION_MAX_SUPPORTED; |
| + break; |
| + default: |
| + PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| + return SECFailure; |
| + } |
| return SECSuccess; |
| } |
| @@ -1704,12 +1779,13 @@ |
| SSL_VersionRangeGetDefault(SSLProtocolVariant protocolVariant, |
| SSLVersionRange *vrange) |
| { |
| - if (protocolVariant != ssl_variant_stream || !vrange) { |
| + if ((protocolVariant != ssl_variant_stream && |
| + protocolVariant != ssl_variant_datagram) || !vrange) { |
| PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| return SECFailure; |
| } |
| - *vrange = versions_defaults; |
| + *vrange = *VERSIONS_DEFAULTS(protocolVariant); |
| return SECSuccess; |
| } |
| @@ -1723,7 +1799,7 @@ |
| return SECFailure; |
| } |
| - versions_defaults = *vrange; |
| + *VERSIONS_DEFAULTS(protocolVariant) = *vrange; |
| return SECSuccess; |
| } |
| @@ -2830,7 +2906,7 @@ |
| ** Create a newsocket structure for a file descriptor. |
| */ |
| static sslSocket * |
| -ssl_NewSocket(PRBool makeLocks) |
| +ssl_NewSocket(PRBool makeLocks, SSLProtocolVariant protocolVariant) |
| { |
| sslSocket *ss; |
| @@ -2851,7 +2927,7 @@ |
| ss->opt = ssl_defaults; |
| ss->opt.useSocks = PR_FALSE; |
| ss->opt.noLocks = !makeLocks; |
| - ss->vrange = versions_defaults; |
| + ss->vrange = *VERSIONS_DEFAULTS(protocolVariant); |
| ss->peerID = NULL; |
| ss->rTimeout = PR_INTERVAL_NO_TIMEOUT; |
| @@ -2907,6 +2983,7 @@ |
| PORT_Free(ss); |
| ss = NULL; |
| } |
| + ss->protocolVariant = protocolVariant; |
| } |
| return ss; |
| } |