| OLD | NEW |
| 1 /* | 1 /* |
| 2 * vtables (and methods that call through them) for the 4 types of | 2 * vtables (and methods that call through them) for the 4 types of |
| 3 * SSLSockets supported. Only one type is still supported. | 3 * SSLSockets supported. Only one type is still supported. |
| 4 * Various other functions. | 4 * Various other functions. |
| 5 * | 5 * |
| 6 * ***** BEGIN LICENSE BLOCK ***** | 6 * ***** BEGIN LICENSE BLOCK ***** |
| 7 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | 7 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 |
| 8 * | 8 * |
| 9 * The contents of this file are subject to the Mozilla Public License Version | 9 * The contents of this file are subject to the Mozilla Public License Version |
| 10 * 1.1 (the "License"); you may not use this file except in compliance with | 10 * 1.1 (the "License"); you may not use this file except in compliance with |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 * in which case the provisions of the GPL or the LGPL are applicable instead | 33 * in which case the provisions of the GPL or the LGPL are applicable instead |
| 34 * of those above. If you wish to allow use of your version of this file only | 34 * of those above. If you wish to allow use of your version of this file only |
| 35 * under the terms of either the GPL or the LGPL, and not to allow others to | 35 * under the terms of either the GPL or the LGPL, and not to allow others to |
| 36 * use your version of this file under the terms of the MPL, indicate your | 36 * use your version of this file under the terms of the MPL, indicate your |
| 37 * decision by deleting the provisions above and replace them with the notice | 37 * decision by deleting the provisions above and replace them with the notice |
| 38 * and other provisions required by the GPL or the LGPL. If you do not delete | 38 * and other provisions required by the GPL or the LGPL. If you do not delete |
| 39 * the provisions above, a recipient may use your version of this file under | 39 * the provisions above, a recipient may use your version of this file under |
| 40 * the terms of any one of the MPL, the GPL or the LGPL. | 40 * the terms of any one of the MPL, the GPL or the LGPL. |
| 41 * | 41 * |
| 42 * ***** END LICENSE BLOCK ***** */ | 42 * ***** END LICENSE BLOCK ***** */ |
| 43 /* $Id: sslsock.c,v 1.67.2.1 2010/07/31 04:33:52 wtc%google.com Exp $ */ | 43 /* $Id: sslsock.c,v 1.82 2012/02/15 21:52:08 kaie%kuix.de Exp $ */ |
| 44 #include "seccomon.h" | 44 #include "seccomon.h" |
| 45 #include "cert.h" | 45 #include "cert.h" |
| 46 #include "keyhi.h" | 46 #include "keyhi.h" |
| 47 #include "ssl.h" | 47 #include "ssl.h" |
| 48 #include "sslimpl.h" | 48 #include "sslimpl.h" |
| 49 #include "sslproto.h" | 49 #include "sslproto.h" |
| 50 #include "nspr.h" | 50 #include "nspr.h" |
| 51 #include "private/pprio.h" | 51 #include "private/pprio.h" |
| 52 #include "blapi.h" | 52 #include "blapi.h" |
| 53 #include "nss.h" | 53 #include "nss.h" |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 ssl_SecureRead, | 156 ssl_SecureRead, |
| 157 ssl_SecureWrite, | 157 ssl_SecureWrite, |
| 158 ssl_DefGetpeername, | 158 ssl_DefGetpeername, |
| 159 ssl_DefGetsockname | 159 ssl_DefGetsockname |
| 160 }; | 160 }; |
| 161 | 161 |
| 162 /* | 162 /* |
| 163 ** default settings for socket enables | 163 ** default settings for socket enables |
| 164 */ | 164 */ |
| 165 static sslOptions ssl_defaults = { | 165 static sslOptions ssl_defaults = { |
| 166 { siBuffer, NULL, 0 },» /* nextProtoNego */ | 166 { siBuffer, NULL, 0 }, /* nextProtoNego */ |
| 167 PR_TRUE, /* useSecurity */ | 167 PR_TRUE, /* useSecurity */ |
| 168 PR_FALSE, /* useSocks */ | 168 PR_FALSE, /* useSocks */ |
| 169 PR_FALSE, /* requestCertificate */ | 169 PR_FALSE, /* requestCertificate */ |
| 170 2, /* requireCertificate */ | 170 2, /* requireCertificate */ |
| 171 PR_FALSE, /* handshakeAsClient */ | 171 PR_FALSE, /* handshakeAsClient */ |
| 172 PR_FALSE, /* handshakeAsServer */ | 172 PR_FALSE, /* handshakeAsServer */ |
| 173 PR_TRUE,» /* enableSSL2 */ | 173 PR_FALSE,» /* enableSSL2 */ /* now defaults to off in NSS 3.13 */ |
| 174 PR_TRUE, /* enableSSL3 */ | 174 PR_TRUE, /* enableSSL3 */ |
| 175 PR_TRUE, /* enableTLS */ /* now defaults to on in NSS 3.0 */ | 175 PR_TRUE, /* enableTLS */ /* now defaults to on in NSS 3.0 */ |
| 176 PR_FALSE, /* noCache */ | 176 PR_FALSE, /* noCache */ |
| 177 PR_FALSE, /* fdx */ | 177 PR_FALSE, /* fdx */ |
| 178 PR_TRUE,» /* v2CompatibleHello */ | 178 PR_FALSE,» /* v2CompatibleHello */ /* now defaults to off in NSS 3.13 */ |
| 179 PR_TRUE, /* detectRollBack */ | 179 PR_TRUE, /* detectRollBack */ |
| 180 PR_FALSE, /* noStepDown */ | 180 PR_FALSE, /* noStepDown */ |
| 181 PR_FALSE, /* bypassPKCS11 */ | 181 PR_FALSE, /* bypassPKCS11 */ |
| 182 PR_FALSE, /* noLocks */ | 182 PR_FALSE, /* noLocks */ |
| 183 PR_FALSE, /* enableSessionTickets */ | 183 PR_FALSE, /* enableSessionTickets */ |
| 184 PR_FALSE, /* enableDeflate */ | 184 PR_FALSE, /* enableDeflate */ |
| 185 2, /* enableRenegotiation (default: requires extension) */ | 185 2, /* enableRenegotiation (default: requires extension) */ |
| 186 PR_FALSE, /* requireSafeNegotiation */ | 186 PR_FALSE, /* requireSafeNegotiation */ |
| 187 PR_FALSE, /* enableFalseStart */ | 187 PR_FALSE, /* enableFalseStart */ |
| 188 PR_TRUE, /* cbcRandomIV */ |
| 188 PR_FALSE, /* enableOCSPStapling */ | 189 PR_FALSE, /* enableOCSPStapling */ |
| 189 PR_FALSE, /* enableCachedInfo */ | |
| 190 PR_FALSE, /* enableOBCerts */ | 190 PR_FALSE, /* enableOBCerts */ |
| 191 PR_FALSE, /* encryptClientCerts */ | 191 PR_FALSE, /* encryptClientCerts */ |
| 192 }; | 192 }; |
| 193 | 193 |
| 194 sslSessionIDLookupFunc ssl_sid_lookup; | 194 sslSessionIDLookupFunc ssl_sid_lookup; |
| 195 sslSessionIDCacheFunc ssl_sid_cache; | 195 sslSessionIDCacheFunc ssl_sid_cache; |
| 196 sslSessionIDUncacheFunc ssl_sid_uncache; | 196 sslSessionIDUncacheFunc ssl_sid_uncache; |
| 197 | 197 |
| 198 static PRBool ssl_inited = PR_FALSE; | 198 static PRBool ssl_inited = PR_FALSE; |
| 199 static PRDescIdentity ssl_layer_id; | 199 static PRDescIdentity ssl_layer_id; |
| 200 | 200 |
| 201 PRBool locksEverDisabled; /* implicitly PR_FALSE */ | 201 PRBool locksEverDisabled; /* implicitly PR_FALSE */ |
| 202 PRBool ssl_force_locks; /* implicitly PR_FALSE */ | 202 PRBool ssl_force_locks; /* implicitly PR_FALSE */ |
| 203 int ssl_lock_readers = 1; /* default true. */ | 203 int ssl_lock_readers = 1; /* default true. */ |
| 204 char ssl_debug; | 204 char ssl_debug; |
| 205 char ssl_trace; | 205 char ssl_trace; |
| 206 FILE * ssl_trace_iob; | 206 FILE * ssl_trace_iob; |
| 207 FILE * ssl_keylog_iob; | 207 FILE * ssl_keylog_iob; |
| 208 char lockStatus[] = "Locks are ENABLED. "; | 208 char lockStatus[] = "Locks are ENABLED. "; |
| 209 #define LOCKSTATUS_OFFSET 10 /* offset of ENABLED */ | 209 #define LOCKSTATUS_OFFSET 10 /* offset of ENABLED */ |
| 210 | 210 |
| 211 /* forward declarations. */ | 211 /* forward declarations. */ |
| 212 static sslSocket *ssl_NewSocket(PRBool makeLocks); | 212 static sslSocket *ssl_NewSocket(PRBool makeLocks); |
| 213 static SECStatus ssl_MakeLocks(sslSocket *ss); | 213 static SECStatus ssl_MakeLocks(sslSocket *ss); |
| 214 static void ssl_SetDefaultsFromEnvironment(void); |
| 214 static PRStatus ssl_PushIOLayer(sslSocket *ns, PRFileDesc *stack, | 215 static PRStatus ssl_PushIOLayer(sslSocket *ns, PRFileDesc *stack, |
| 215 PRDescIdentity id); | 216 PRDescIdentity id); |
| 216 | 217 |
| 217 /************************************************************************/ | 218 /************************************************************************/ |
| 218 | 219 |
| 219 /* | 220 /* |
| 220 ** Lookup a socket structure from a file descriptor. | 221 ** Lookup a socket structure from a file descriptor. |
| 221 ** Only functions called through the PRIOMethods table should use this. | 222 ** Only functions called through the PRIOMethods table should use this. |
| 222 ** Other app-callable functions should use ssl_FindSocket. | 223 ** Other app-callable functions should use ssl_FindSocket. |
| 223 */ | 224 */ |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 440 ssl3_FreeKeyPair(sc->serverKeyPair); | 441 ssl3_FreeKeyPair(sc->serverKeyPair); |
| 441 } | 442 } |
| 442 if (ss->stepDownKeyPair) { | 443 if (ss->stepDownKeyPair) { |
| 443 ssl3_FreeKeyPair(ss->stepDownKeyPair); | 444 ssl3_FreeKeyPair(ss->stepDownKeyPair); |
| 444 ss->stepDownKeyPair = NULL; | 445 ss->stepDownKeyPair = NULL; |
| 445 } | 446 } |
| 446 if (ss->ephemeralECDHKeyPair) { | 447 if (ss->ephemeralECDHKeyPair) { |
| 447 ssl3_FreeKeyPair(ss->ephemeralECDHKeyPair); | 448 ssl3_FreeKeyPair(ss->ephemeralECDHKeyPair); |
| 448 ss->ephemeralECDHKeyPair = NULL; | 449 ss->ephemeralECDHKeyPair = NULL; |
| 449 } | 450 } |
| 450 if (ss->opt.nextProtoNego.data) { | 451 SECITEM_FreeItem(&ss->opt.nextProtoNego, PR_FALSE); |
| 451 » PORT_Free(ss->opt.nextProtoNego.data); | |
| 452 » ss->opt.nextProtoNego.data = NULL; | |
| 453 } | |
| 454 PORT_Assert(!ss->xtnData.sniNameArr); | 452 PORT_Assert(!ss->xtnData.sniNameArr); |
| 455 if (ss->xtnData.sniNameArr) { | 453 if (ss->xtnData.sniNameArr) { |
| 456 PORT_Free(ss->xtnData.sniNameArr); | 454 PORT_Free(ss->xtnData.sniNameArr); |
| 457 ss->xtnData.sniNameArr = NULL; | 455 ss->xtnData.sniNameArr = NULL; |
| 458 } | 456 } |
| 459 } | 457 } |
| 460 | 458 |
| 461 /* | 459 /* |
| 462 * free an sslSocket struct, and all the stuff that hangs off of it | 460 * free an sslSocket struct, and all the stuff that hangs off of it |
| 463 */ | 461 */ |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 739 break; | 737 break; |
| 740 | 738 |
| 741 case SSL_REQUIRE_SAFE_NEGOTIATION: | 739 case SSL_REQUIRE_SAFE_NEGOTIATION: |
| 742 ss->opt.requireSafeNegotiation = on; | 740 ss->opt.requireSafeNegotiation = on; |
| 743 break; | 741 break; |
| 744 | 742 |
| 745 case SSL_ENABLE_FALSE_START: | 743 case SSL_ENABLE_FALSE_START: |
| 746 ss->opt.enableFalseStart = on; | 744 ss->opt.enableFalseStart = on; |
| 747 break; | 745 break; |
| 748 | 746 |
| 747 case SSL_CBC_RANDOM_IV: |
| 748 ss->opt.cbcRandomIV = on; |
| 749 break; |
| 750 |
| 749 case SSL_ENABLE_OCSP_STAPLING: | 751 case SSL_ENABLE_OCSP_STAPLING: |
| 750 ss->opt.enableOCSPStapling = on; | 752 ss->opt.enableOCSPStapling = on; |
| 751 break; | 753 break; |
| 752 | 754 |
| 753 case SSL_ENABLE_CACHED_INFO: | |
| 754 ss->opt.enableCachedInfo = on; | |
| 755 break; | |
| 756 | |
| 757 case SSL_ENABLE_OB_CERTS: | 755 case SSL_ENABLE_OB_CERTS: |
| 758 ss->opt.enableOBCerts = on; | 756 ss->opt.enableOBCerts = on; |
| 759 break; | 757 break; |
| 760 | 758 |
| 761 case SSL_ENCRYPT_CLIENT_CERTS: | 759 case SSL_ENCRYPT_CLIENT_CERTS: |
| 762 ss->opt.encryptClientCerts = on; | 760 ss->opt.encryptClientCerts = on; |
| 763 break; | 761 break; |
| 764 | 762 |
| 765 default: | 763 default: |
| 766 PORT_SetError(SEC_ERROR_INVALID_ARGS); | 764 PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 819 case SSL_NO_LOCKS: on = ss->opt.noLocks; break; | 817 case SSL_NO_LOCKS: on = ss->opt.noLocks; break; |
| 820 case SSL_ENABLE_SESSION_TICKETS: | 818 case SSL_ENABLE_SESSION_TICKETS: |
| 821 on = ss->opt.enableSessionTickets; | 819 on = ss->opt.enableSessionTickets; |
| 822 break; | 820 break; |
| 823 case SSL_ENABLE_DEFLATE: on = ss->opt.enableDeflate; break; | 821 case SSL_ENABLE_DEFLATE: on = ss->opt.enableDeflate; break; |
| 824 case SSL_ENABLE_RENEGOTIATION: | 822 case SSL_ENABLE_RENEGOTIATION: |
| 825 on = ss->opt.enableRenegotiation; break; | 823 on = ss->opt.enableRenegotiation; break; |
| 826 case SSL_REQUIRE_SAFE_NEGOTIATION: | 824 case SSL_REQUIRE_SAFE_NEGOTIATION: |
| 827 on = ss->opt.requireSafeNegotiation; break; | 825 on = ss->opt.requireSafeNegotiation; break; |
| 828 case SSL_ENABLE_FALSE_START: on = ss->opt.enableFalseStart; break; | 826 case SSL_ENABLE_FALSE_START: on = ss->opt.enableFalseStart; break; |
| 827 case SSL_CBC_RANDOM_IV: on = ss->opt.cbcRandomIV; break; |
| 829 case SSL_ENABLE_OCSP_STAPLING: on = ss->opt.enableOCSPStapling; break; | 828 case SSL_ENABLE_OCSP_STAPLING: on = ss->opt.enableOCSPStapling; break; |
| 830 case SSL_ENABLE_CACHED_INFO: on = ss->opt.enableCachedInfo; break; | |
| 831 case SSL_ENABLE_OB_CERTS: on = ss->opt.enableOBCerts; break; | 829 case SSL_ENABLE_OB_CERTS: on = ss->opt.enableOBCerts; break; |
| 832 case SSL_ENCRYPT_CLIENT_CERTS: | 830 case SSL_ENCRYPT_CLIENT_CERTS: |
| 833 on = ss->opt.encryptClientCerts; break; | 831 on = ss->opt.encryptClientCerts; break; |
| 834 | 832 |
| 835 default: | 833 default: |
| 836 PORT_SetError(SEC_ERROR_INVALID_ARGS); | 834 PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| 837 rv = SECFailure; | 835 rv = SECFailure; |
| 838 } | 836 } |
| 839 | 837 |
| 840 ssl_ReleaseSSL3HandshakeLock(ss); | 838 ssl_ReleaseSSL3HandshakeLock(ss); |
| 841 ssl_Release1stHandshakeLock(ss); | 839 ssl_Release1stHandshakeLock(ss); |
| 842 | 840 |
| 843 *pOn = on; | 841 *pOn = on; |
| 844 return rv; | 842 return rv; |
| 845 } | 843 } |
| 846 | 844 |
| 847 SECStatus | 845 SECStatus |
| 848 SSL_OptionGetDefault(PRInt32 which, PRBool *pOn) | 846 SSL_OptionGetDefault(PRInt32 which, PRBool *pOn) |
| 849 { | 847 { |
| 850 SECStatus rv = SECSuccess; | 848 SECStatus rv = SECSuccess; |
| 851 PRBool on = PR_FALSE; | 849 PRBool on = PR_FALSE; |
| 852 | 850 |
| 853 if (!pOn) { | 851 if (!pOn) { |
| 854 PORT_SetError(SEC_ERROR_INVALID_ARGS); | 852 PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| 855 return SECFailure; | 853 return SECFailure; |
| 856 } | 854 } |
| 857 | 855 |
| 856 ssl_SetDefaultsFromEnvironment(); |
| 857 |
| 858 switch (which) { | 858 switch (which) { |
| 859 case SSL_SOCKS: on = PR_FALSE; break; | 859 case SSL_SOCKS: on = PR_FALSE; break; |
| 860 case SSL_SECURITY: on = ssl_defaults.useSecurity; break; | 860 case SSL_SECURITY: on = ssl_defaults.useSecurity; break; |
| 861 case SSL_REQUEST_CERTIFICATE: on = ssl_defaults.requestCertificate; break; | 861 case SSL_REQUEST_CERTIFICATE: on = ssl_defaults.requestCertificate; break; |
| 862 case SSL_REQUIRE_CERTIFICATE: on = ssl_defaults.requireCertificate; break; | 862 case SSL_REQUIRE_CERTIFICATE: on = ssl_defaults.requireCertificate; break; |
| 863 case SSL_HANDSHAKE_AS_CLIENT: on = ssl_defaults.handshakeAsClient; break; | 863 case SSL_HANDSHAKE_AS_CLIENT: on = ssl_defaults.handshakeAsClient; break; |
| 864 case SSL_HANDSHAKE_AS_SERVER: on = ssl_defaults.handshakeAsServer; break; | 864 case SSL_HANDSHAKE_AS_SERVER: on = ssl_defaults.handshakeAsServer; break; |
| 865 case SSL_ENABLE_TLS: on = ssl_defaults.enableTLS; break; | 865 case SSL_ENABLE_TLS: on = ssl_defaults.enableTLS; break; |
| 866 case SSL_ENABLE_SSL3: on = ssl_defaults.enableSSL3; break; | 866 case SSL_ENABLE_SSL3: on = ssl_defaults.enableSSL3; break; |
| 867 case SSL_ENABLE_SSL2: on = ssl_defaults.enableSSL2; break; | 867 case SSL_ENABLE_SSL2: on = ssl_defaults.enableSSL2; break; |
| 868 case SSL_NO_CACHE: on = ssl_defaults.noCache; break; | 868 case SSL_NO_CACHE: on = ssl_defaults.noCache; break; |
| 869 case SSL_ENABLE_FDX: on = ssl_defaults.fdx; break; | 869 case SSL_ENABLE_FDX: on = ssl_defaults.fdx; break; |
| 870 case SSL_V2_COMPATIBLE_HELLO: on = ssl_defaults.v2CompatibleHello; break; | 870 case SSL_V2_COMPATIBLE_HELLO: on = ssl_defaults.v2CompatibleHello; break; |
| 871 case SSL_ROLLBACK_DETECTION: on = ssl_defaults.detectRollBack; break; | 871 case SSL_ROLLBACK_DETECTION: on = ssl_defaults.detectRollBack; break; |
| 872 case SSL_NO_STEP_DOWN: on = ssl_defaults.noStepDown; break; | 872 case SSL_NO_STEP_DOWN: on = ssl_defaults.noStepDown; break; |
| 873 case SSL_BYPASS_PKCS11: on = ssl_defaults.bypassPKCS11; break; | 873 case SSL_BYPASS_PKCS11: on = ssl_defaults.bypassPKCS11; break; |
| 874 case SSL_NO_LOCKS: on = ssl_defaults.noLocks; break; | 874 case SSL_NO_LOCKS: on = ssl_defaults.noLocks; break; |
| 875 case SSL_ENABLE_SESSION_TICKETS: | 875 case SSL_ENABLE_SESSION_TICKETS: |
| 876 on = ssl_defaults.enableSessionTickets; | 876 on = ssl_defaults.enableSessionTickets; |
| 877 break; | 877 break; |
| 878 case SSL_ENABLE_DEFLATE: on = ssl_defaults.enableDeflate; break; | 878 case SSL_ENABLE_DEFLATE: on = ssl_defaults.enableDeflate; break; |
| 879 case SSL_ENABLE_RENEGOTIATION: | 879 case SSL_ENABLE_RENEGOTIATION: |
| 880 on = ssl_defaults.enableRenegotiation; break; | 880 on = ssl_defaults.enableRenegotiation; break; |
| 881 case SSL_REQUIRE_SAFE_NEGOTIATION: | 881 case SSL_REQUIRE_SAFE_NEGOTIATION: |
| 882 on = ssl_defaults.requireSafeNegotiation; | 882 on = ssl_defaults.requireSafeNegotiation; |
| 883 break; | 883 break; |
| 884 case SSL_ENABLE_FALSE_START: on = ssl_defaults.enableFalseStart; break; | 884 case SSL_ENABLE_FALSE_START: on = ssl_defaults.enableFalseStart; break; |
| 885 case SSL_CBC_RANDOM_IV: on = ssl_defaults.cbcRandomIV; break; |
| 885 case SSL_ENABLE_OCSP_STAPLING: | 886 case SSL_ENABLE_OCSP_STAPLING: |
| 886 on = ssl_defaults.enableOCSPStapling; | 887 on = ssl_defaults.enableOCSPStapling; |
| 887 break; | 888 break; |
| 888 case SSL_ENABLE_CACHED_INFO: on = ssl_defaults.enableCachedInfo; break; | |
| 889 case SSL_ENABLE_OB_CERTS: on = ssl_defaults.enableOBCerts; break; | 889 case SSL_ENABLE_OB_CERTS: on = ssl_defaults.enableOBCerts; break; |
| 890 case SSL_ENCRYPT_CLIENT_CERTS: | 890 case SSL_ENCRYPT_CLIENT_CERTS: |
| 891 on = ssl_defaults.encryptClientCerts; break; | 891 on = ssl_defaults.encryptClientCerts; break; |
| 892 | 892 |
| 893 default: | 893 default: |
| 894 PORT_SetError(SEC_ERROR_INVALID_ARGS); | 894 PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| 895 rv = SECFailure; | 895 rv = SECFailure; |
| 896 } | 896 } |
| 897 | 897 |
| 898 *pOn = on; | 898 *pOn = on; |
| 899 return rv; | 899 return rv; |
| 900 } | 900 } |
| 901 | 901 |
| 902 /* XXX Use Global Lock to protect this stuff. */ | 902 /* XXX Use Global Lock to protect this stuff. */ |
| 903 SECStatus | 903 SECStatus |
| 904 SSL_EnableDefault(int which, PRBool on) | 904 SSL_EnableDefault(int which, PRBool on) |
| 905 { | 905 { |
| 906 return SSL_OptionSetDefault(which, on); | 906 return SSL_OptionSetDefault(which, on); |
| 907 } | 907 } |
| 908 | 908 |
| 909 SECStatus | 909 SECStatus |
| 910 SSL_OptionSetDefault(PRInt32 which, PRBool on) | 910 SSL_OptionSetDefault(PRInt32 which, PRBool on) |
| 911 { | 911 { |
| 912 SECStatus status = ssl_Init(); |
| 913 |
| 914 if (status != SECSuccess) { |
| 915 return status; |
| 916 } |
| 917 |
| 918 ssl_SetDefaultsFromEnvironment(); |
| 919 |
| 912 switch (which) { | 920 switch (which) { |
| 913 case SSL_SOCKS: | 921 case SSL_SOCKS: |
| 914 ssl_defaults.useSocks = PR_FALSE; | 922 ssl_defaults.useSocks = PR_FALSE; |
| 915 if (on) { | 923 if (on) { |
| 916 PORT_SetError(SEC_ERROR_INVALID_ARGS); | 924 PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| 917 return SECFailure; | 925 return SECFailure; |
| 918 } | 926 } |
| 919 break; | 927 break; |
| 920 | 928 |
| 921 case SSL_SECURITY: | 929 case SSL_SECURITY: |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1029 break; | 1037 break; |
| 1030 | 1038 |
| 1031 case SSL_REQUIRE_SAFE_NEGOTIATION: | 1039 case SSL_REQUIRE_SAFE_NEGOTIATION: |
| 1032 ssl_defaults.requireSafeNegotiation = on; | 1040 ssl_defaults.requireSafeNegotiation = on; |
| 1033 break; | 1041 break; |
| 1034 | 1042 |
| 1035 case SSL_ENABLE_FALSE_START: | 1043 case SSL_ENABLE_FALSE_START: |
| 1036 ssl_defaults.enableFalseStart = on; | 1044 ssl_defaults.enableFalseStart = on; |
| 1037 break; | 1045 break; |
| 1038 | 1046 |
| 1047 case SSL_CBC_RANDOM_IV: |
| 1048 ssl_defaults.cbcRandomIV = on; |
| 1049 break; |
| 1050 |
| 1039 case SSL_ENABLE_OCSP_STAPLING: | 1051 case SSL_ENABLE_OCSP_STAPLING: |
| 1040 ssl_defaults.enableOCSPStapling = on; | 1052 ssl_defaults.enableOCSPStapling = on; |
| 1041 break; | 1053 break; |
| 1042 | 1054 |
| 1043 case SSL_ENABLE_CACHED_INFO: | |
| 1044 ssl_defaults.enableCachedInfo = on; | |
| 1045 break; | |
| 1046 | |
| 1047 case SSL_ENABLE_OB_CERTS: | 1055 case SSL_ENABLE_OB_CERTS: |
| 1048 ssl_defaults.enableOBCerts = on; | 1056 ssl_defaults.enableOBCerts = on; |
| 1049 break; | 1057 break; |
| 1050 | 1058 |
| 1051 case SSL_ENCRYPT_CLIENT_CERTS: | 1059 case SSL_ENCRYPT_CLIENT_CERTS: |
| 1052 ssl_defaults.encryptClientCerts = on; | 1060 ssl_defaults.encryptClientCerts = on; |
| 1053 break; | 1061 break; |
| 1054 | 1062 |
| 1055 default: | 1063 default: |
| 1056 PORT_SetError(SEC_ERROR_INVALID_ARGS); | 1064 PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1088 which = SSL_RSA_FIPS_WITH_DES_CBC_SHA; | 1096 which = SSL_RSA_FIPS_WITH_DES_CBC_SHA; |
| 1089 } | 1097 } |
| 1090 if (ssl_IsRemovedCipherSuite(which)) | 1098 if (ssl_IsRemovedCipherSuite(which)) |
| 1091 return SECSuccess; | 1099 return SECSuccess; |
| 1092 return SSL_CipherPolicySet(which, policy); | 1100 return SSL_CipherPolicySet(which, policy); |
| 1093 } | 1101 } |
| 1094 | 1102 |
| 1095 SECStatus | 1103 SECStatus |
| 1096 SSL_CipherPolicySet(PRInt32 which, PRInt32 policy) | 1104 SSL_CipherPolicySet(PRInt32 which, PRInt32 policy) |
| 1097 { | 1105 { |
| 1098 SECStatus rv; | 1106 SECStatus rv = ssl_Init(); |
| 1107 |
| 1108 if (rv != SECSuccess) { |
| 1109 » return rv; |
| 1110 } |
| 1099 | 1111 |
| 1100 if (ssl_IsRemovedCipherSuite(which)) { | 1112 if (ssl_IsRemovedCipherSuite(which)) { |
| 1101 rv = SECSuccess; | 1113 rv = SECSuccess; |
| 1102 } else if (SSL_IS_SSL2_CIPHER(which)) { | 1114 } else if (SSL_IS_SSL2_CIPHER(which)) { |
| 1103 rv = ssl2_SetPolicy(which, policy); | 1115 rv = ssl2_SetPolicy(which, policy); |
| 1104 } else { | 1116 } else { |
| 1105 rv = ssl3_SetPolicy((ssl3CipherSuite)which, policy); | 1117 rv = ssl3_SetPolicy((ssl3CipherSuite)which, policy); |
| 1106 } | 1118 } |
| 1107 return rv; | 1119 return rv; |
| 1108 } | 1120 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1143 which = SSL_RSA_FIPS_WITH_DES_CBC_SHA; | 1155 which = SSL_RSA_FIPS_WITH_DES_CBC_SHA; |
| 1144 } | 1156 } |
| 1145 if (ssl_IsRemovedCipherSuite(which)) | 1157 if (ssl_IsRemovedCipherSuite(which)) |
| 1146 return SECSuccess; | 1158 return SECSuccess; |
| 1147 return SSL_CipherPrefSetDefault(which, enabled); | 1159 return SSL_CipherPrefSetDefault(which, enabled); |
| 1148 } | 1160 } |
| 1149 | 1161 |
| 1150 SECStatus | 1162 SECStatus |
| 1151 SSL_CipherPrefSetDefault(PRInt32 which, PRBool enabled) | 1163 SSL_CipherPrefSetDefault(PRInt32 which, PRBool enabled) |
| 1152 { | 1164 { |
| 1153 SECStatus rv; | 1165 SECStatus rv = ssl_Init(); |
| 1166 |
| 1167 if (rv != SECSuccess) { |
| 1168 » return rv; |
| 1169 } |
| 1154 | 1170 |
| 1155 if (ssl_IsRemovedCipherSuite(which)) | 1171 if (ssl_IsRemovedCipherSuite(which)) |
| 1156 return SECSuccess; | 1172 return SECSuccess; |
| 1157 if (enabled && ssl_defaults.noStepDown && SSL_IsExportCipherSuite(which)) { | 1173 if (enabled && ssl_defaults.noStepDown && SSL_IsExportCipherSuite(which)) { |
| 1158 PORT_SetError(SEC_ERROR_INVALID_ALGORITHM); | 1174 PORT_SetError(SEC_ERROR_INVALID_ALGORITHM); |
| 1159 return SECFailure; | 1175 return SECFailure; |
| 1160 } | 1176 } |
| 1161 if (SSL_IS_SSL2_CIPHER(which)) { | 1177 if (SSL_IS_SSL2_CIPHER(which)) { |
| 1162 rv = ssl2_CipherPrefSetDefault(which, enabled); | 1178 rv = ssl2_CipherPrefSetDefault(which, enabled); |
| 1163 } else { | 1179 } else { |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1232 rv = ssl2_CipherPrefGet(ss, which, enabled); | 1248 rv = ssl2_CipherPrefGet(ss, which, enabled); |
| 1233 } else { | 1249 } else { |
| 1234 rv = ssl3_CipherPrefGet(ss, (ssl3CipherSuite)which, enabled); | 1250 rv = ssl3_CipherPrefGet(ss, (ssl3CipherSuite)which, enabled); |
| 1235 } | 1251 } |
| 1236 return rv; | 1252 return rv; |
| 1237 } | 1253 } |
| 1238 | 1254 |
| 1239 SECStatus | 1255 SECStatus |
| 1240 NSS_SetDomesticPolicy(void) | 1256 NSS_SetDomesticPolicy(void) |
| 1241 { | 1257 { |
| 1242 #ifndef EXPORT_VERSION | |
| 1243 SECStatus status = SECSuccess; | 1258 SECStatus status = SECSuccess; |
| 1244 cipherPolicy * policy; | 1259 cipherPolicy * policy; |
| 1245 | 1260 |
| 1246 for (policy = ssl_ciphers; policy->cipher != 0; ++policy) { | 1261 for (policy = ssl_ciphers; policy->cipher != 0; ++policy) { |
| 1247 status = SSL_SetPolicy(policy->cipher, SSL_ALLOWED); | 1262 status = SSL_SetPolicy(policy->cipher, SSL_ALLOWED); |
| 1248 if (status != SECSuccess) | 1263 if (status != SECSuccess) |
| 1249 break; | 1264 break; |
| 1250 } | 1265 } |
| 1251 return status; | 1266 return status; |
| 1252 #else | |
| 1253 return NSS_SetExportPolicy(); | |
| 1254 #endif | |
| 1255 } | |
| 1256 | |
| 1257 SECStatus | |
| 1258 NSS_SetExportPolicy(void) | |
| 1259 { | |
| 1260 SECStatus status = SECSuccess; | |
| 1261 cipherPolicy * policy; | |
| 1262 | |
| 1263 for (policy = ssl_ciphers; policy->cipher != 0; ++policy) { | |
| 1264 status = SSL_SetPolicy(policy->cipher, policy->export); | |
| 1265 if (status != SECSuccess) | |
| 1266 break; | |
| 1267 } | |
| 1268 return status; | |
| 1269 } | 1267 } |
| 1270 | 1268 |
| 1271 SECStatus | 1269 SECStatus |
| 1270 NSS_SetExportPolicy(void) |
| 1271 { |
| 1272 return NSS_SetDomesticPolicy(); |
| 1273 } |
| 1274 |
| 1275 SECStatus |
| 1272 NSS_SetFrancePolicy(void) | 1276 NSS_SetFrancePolicy(void) |
| 1273 { | 1277 { |
| 1274 SECStatus status = SECSuccess; | 1278 return NSS_SetDomesticPolicy(); |
| 1275 cipherPolicy * policy; | |
| 1276 | |
| 1277 for (policy = ssl_ciphers; policy->cipher != 0; ++policy) { | |
| 1278 » status = SSL_SetPolicy(policy->cipher, policy->france); | |
| 1279 » if (status != SECSuccess) | |
| 1280 » break; | |
| 1281 } | |
| 1282 return status; | |
| 1283 } | 1279 } |
| 1284 | 1280 |
| 1285 | 1281 |
| 1286 | 1282 |
| 1287 /* LOCKS ??? XXX */ | 1283 /* LOCKS ??? XXX */ |
| 1288 PRFileDesc * | 1284 PRFileDesc * |
| 1289 SSL_ImportFD(PRFileDesc *model, PRFileDesc *fd) | 1285 SSL_ImportFD(PRFileDesc *model, PRFileDesc *fd) |
| 1290 { | 1286 { |
| 1291 sslSocket * ns = NULL; | 1287 sslSocket * ns = NULL; |
| 1292 PRStatus rv; | 1288 PRStatus rv; |
| 1293 PRNetAddr addr; | 1289 PRNetAddr addr; |
| 1290 SECStatus status = ssl_Init(); |
| 1291 |
| 1292 if (status != SECSuccess) { |
| 1293 return NULL; |
| 1294 } |
| 1294 | 1295 |
| 1295 if (model == NULL) { | 1296 if (model == NULL) { |
| 1296 /* Just create a default socket if we're given NULL for the model */ | 1297 /* Just create a default socket if we're given NULL for the model */ |
| 1297 ns = ssl_NewSocket((PRBool)(!ssl_defaults.noLocks)); | 1298 ns = ssl_NewSocket((PRBool)(!ssl_defaults.noLocks)); |
| 1298 } else { | 1299 } else { |
| 1299 sslSocket * ss = ssl_FindSocket(model); | 1300 sslSocket * ss = ssl_FindSocket(model); |
| 1300 if (ss == NULL) { | 1301 if (ss == NULL) { |
| 1301 SSL_DBG(("%d: SSL[%d]: bad model socket in ssl_ImportFD", | 1302 SSL_DBG(("%d: SSL[%d]: bad model socket in ssl_ImportFD", |
| 1302 SSL_GETPID(), model)); | 1303 SSL_GETPID(), model)); |
| 1303 return NULL; | 1304 return NULL; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1317 PR_Sleep(PR_INTERVAL_NO_WAIT); /* workaround NT winsock connect bug. */ | 1318 PR_Sleep(PR_INTERVAL_NO_WAIT); /* workaround NT winsock connect bug. */ |
| 1318 #endif | 1319 #endif |
| 1319 ns = ssl_FindSocket(fd); | 1320 ns = ssl_FindSocket(fd); |
| 1320 PORT_Assert(ns); | 1321 PORT_Assert(ns); |
| 1321 if (ns) | 1322 if (ns) |
| 1322 ns->TCPconnected = (PR_SUCCESS == ssl_DefGetpeername(ns, &addr)); | 1323 ns->TCPconnected = (PR_SUCCESS == ssl_DefGetpeername(ns, &addr)); |
| 1323 return fd; | 1324 return fd; |
| 1324 } | 1325 } |
| 1325 | 1326 |
| 1326 SECStatus | 1327 SECStatus |
| 1327 SSL_SetNextProtoCallback(PRFileDesc *fd, | 1328 SSL_SetNextProtoCallback(PRFileDesc *fd, SSLNextProtoCallback callback, |
| 1328 SSLNextProtoCallback callback, | 1329 » » » void *arg) |
| 1329 void *arg) { | 1330 { |
| 1330 sslSocket *ss = ssl_FindSocket(fd); | 1331 sslSocket *ss = ssl_FindSocket(fd); |
| 1331 | 1332 |
| 1332 if (!ss) { | 1333 if (!ss) { |
| 1333 » SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetNextProtoNego", SSL_GETPID()
, | 1334 » SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetNextProtoCallback", SSL_GETP
ID(), |
| 1334 » » fd)); | 1335 » » fd)); |
| 1335 » PORT_SetError(SEC_ERROR_INVALID_ARGS); | |
| 1336 return SECFailure; | 1336 return SECFailure; |
| 1337 } | 1337 } |
| 1338 | 1338 |
| 1339 ssl_GetSSL3HandshakeLock(ss); | 1339 ssl_GetSSL3HandshakeLock(ss); |
| 1340 ss->nextProtoCallback = callback; | 1340 ss->nextProtoCallback = callback; |
| 1341 ss->nextProtoArg = arg; | 1341 ss->nextProtoArg = arg; |
| 1342 ssl_ReleaseSSL3HandshakeLock(ss); | 1342 ssl_ReleaseSSL3HandshakeLock(ss); |
| 1343 |
| 1343 return SECSuccess; | 1344 return SECSuccess; |
| 1344 } | 1345 } |
| 1345 | 1346 |
| 1346 /* NextProtoStandardCallback is set as an NPN callback for the case when the | 1347 /* NextProtoStandardCallback is set as an NPN callback for the case when |
| 1347 * user of the sockets wants the standard selection algorithm. */ | 1348 * SSL_SetNextProtoNego is used. |
| 1349 */ |
| 1348 static SECStatus | 1350 static SECStatus |
| 1349 NextProtoStandardCallback(void *arg, | 1351 ssl_NextProtoNegoCallback(void *arg, PRFileDesc *fd, |
| 1350 » » » PRFileDesc *fd, | 1352 » » » const unsigned char *protos, unsigned int protos_len, |
| 1351 » » » const unsigned char *protos, | 1353 » » » unsigned char *protoOut, unsigned int *protoOutLen, |
| 1352 » » » unsigned int protos_len, | 1354 » » » unsigned int protoMaxLen) |
| 1353 » » » unsigned char *protoOut, | |
| 1354 » » » unsigned int *protoOutLen) | |
| 1355 { | 1355 { |
| 1356 unsigned int i, j; | 1356 unsigned int i, j; |
| 1357 const unsigned char *result; | 1357 const unsigned char *result; |
| 1358 sslSocket *ss = ssl_FindSocket(fd); |
| 1358 | 1359 |
| 1359 sslSocket *ss = ssl_FindSocket(fd); | 1360 if (!ss) { |
| 1360 PORT_Assert(ss); | 1361 » SSL_DBG(("%d: SSL[%d]: bad socket in ssl_NextProtoNegoCallback", |
| 1362 » » SSL_GETPID(), fd)); |
| 1363 » return SECFailure; |
| 1364 } |
| 1361 | 1365 |
| 1362 if (protos_len == 0) { | 1366 if (protos_len == 0) { |
| 1363 /* The server supports the extension, but doesn't have any protocols | 1367 /* The server supports the extension, but doesn't have any protocols |
| 1364 * configured. In this case we request our favoured protocol. */ | 1368 * configured. In this case we request our favoured protocol. */ |
| 1365 goto pick_first; | 1369 goto pick_first; |
| 1366 } | 1370 } |
| 1367 | 1371 |
| 1368 /* For each protocol in server preference, see if we support it. */ | 1372 /* For each protocol in server preference, see if we support it. */ |
| 1369 for (i = 0; i < protos_len; ) { | 1373 for (i = 0; i < protos_len; ) { |
| 1370 for (j = 0; j < ss->opt.nextProtoNego.len; ) { | 1374 for (j = 0; j < ss->opt.nextProtoNego.len; ) { |
| 1371 if (protos[i] == ss->opt.nextProtoNego.data[j] && | 1375 if (protos[i] == ss->opt.nextProtoNego.data[j] && |
| 1372 » » memcmp(&protos[i+1], &ss->opt.nextProtoNego.data[j+1], | 1376 » » PORT_Memcmp(&protos[i+1], &ss->opt.nextProtoNego.data[j+1], |
| 1373 » » protos[i]) == 0) { | 1377 » » » protos[i]) == 0) { |
| 1374 /* We found a match. */ | 1378 /* We found a match. */ |
| 1375 ss->ssl3.nextProtoState = SSL_NEXT_PROTO_NEGOTIATED; | 1379 ss->ssl3.nextProtoState = SSL_NEXT_PROTO_NEGOTIATED; |
| 1376 result = &protos[i]; | 1380 result = &protos[i]; |
| 1377 goto found; | 1381 goto found; |
| 1378 } | 1382 } |
| 1379 » j += (unsigned int)ss->opt.nextProtoNego.data[j] + 1; | 1383 » j += 1 + (unsigned int)ss->opt.nextProtoNego.data[j]; |
| 1380 } | 1384 } |
| 1381 » i += (unsigned int)protos[i] + 1; | 1385 » i += 1 + (unsigned int)protos[i]; |
| 1382 } | 1386 } |
| 1383 | 1387 |
| 1384 pick_first: | 1388 pick_first: |
| 1385 ss->ssl3.nextProtoState = SSL_NEXT_PROTO_NO_OVERLAP; | 1389 ss->ssl3.nextProtoState = SSL_NEXT_PROTO_NO_OVERLAP; |
| 1386 result = ss->opt.nextProtoNego.data; | 1390 result = ss->opt.nextProtoNego.data; |
| 1387 | 1391 |
| 1388 found: | 1392 found: |
| 1393 *protoOutLen = result[0]; |
| 1394 if (protoMaxLen < result[0]) { |
| 1395 PORT_SetError(SEC_ERROR_OUTPUT_LEN); |
| 1396 return SECFailure; |
| 1397 } |
| 1389 memcpy(protoOut, result + 1, result[0]); | 1398 memcpy(protoOut, result + 1, result[0]); |
| 1390 *protoOutLen = result[0]; | |
| 1391 return SECSuccess; | 1399 return SECSuccess; |
| 1392 } | 1400 } |
| 1393 | 1401 |
| 1394 SECStatus | 1402 SECStatus |
| 1395 SSL_SetNextProtoNego(PRFileDesc *fd, const unsigned char *data, | 1403 SSL_SetNextProtoNego(PRFileDesc *fd, const unsigned char *data, |
| 1396 unsigned int length) | 1404 unsigned int length) |
| 1397 { | 1405 { |
| 1406 sslSocket *ss; |
| 1398 SECStatus rv; | 1407 SECStatus rv; |
| 1408 SECItem dataItem = { siBuffer, (unsigned char *) data, length }; |
| 1399 | 1409 |
| 1400 sslSocket *ss = ssl_FindSocket(fd); | 1410 ss = ssl_FindSocket(fd); |
| 1401 | |
| 1402 if (!ss) { | 1411 if (!ss) { |
| 1403 SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetNextProtoNego", | 1412 SSL_DBG(("%d: SSL[%d]: bad socket in SSL_SetNextProtoNego", |
| 1404 SSL_GETPID(), fd)); | 1413 SSL_GETPID(), fd)); |
| 1405 PORT_SetError(SEC_ERROR_INVALID_ARGS); | |
| 1406 return SECFailure; | 1414 return SECFailure; |
| 1407 } | 1415 } |
| 1408 | 1416 |
| 1409 if (ssl3_ValidateNextProtoNego(data, length) != SECSuccess) | 1417 if (ssl3_ValidateNextProtoNego(data, length) != SECSuccess) |
| 1410 return SECFailure; | 1418 return SECFailure; |
| 1411 | 1419 |
| 1412 ssl_GetSSL3HandshakeLock(ss); | 1420 ssl_GetSSL3HandshakeLock(ss); |
| 1413 if (ss->opt.nextProtoNego.data) | 1421 SECITEM_FreeItem(&ss->opt.nextProtoNego, PR_FALSE); |
| 1414 » PORT_Free(ss->opt.nextProtoNego.data); | 1422 rv = SECITEM_CopyItem(NULL, &ss->opt.nextProtoNego, &dataItem); |
| 1415 ss->opt.nextProtoNego.data = PORT_Alloc(length); | |
| 1416 if (!ss->opt.nextProtoNego.data) { | |
| 1417 » ssl_ReleaseSSL3HandshakeLock(ss); | |
| 1418 » return SECFailure; | |
| 1419 } | |
| 1420 memcpy(ss->opt.nextProtoNego.data, data, length); | |
| 1421 ss->opt.nextProtoNego.len = length; | |
| 1422 ss->opt.nextProtoNego.type = siBuffer; | |
| 1423 ssl_ReleaseSSL3HandshakeLock(ss); | 1423 ssl_ReleaseSSL3HandshakeLock(ss); |
| 1424 | 1424 |
| 1425 return SSL_SetNextProtoCallback(fd, NextProtoStandardCallback, NULL); | 1425 if (rv != SECSuccess) |
| 1426 » return rv; |
| 1427 |
| 1428 return SSL_SetNextProtoCallback(fd, ssl_NextProtoNegoCallback, NULL); |
| 1426 } | 1429 } |
| 1427 | 1430 |
| 1428 SECStatus | 1431 SECStatus |
| 1429 SSL_GetNextProto(PRFileDesc *fd, int *state, unsigned char *buf, | 1432 SSL_GetNextProto(PRFileDesc *fd, SSLNextProtoState *state, unsigned char *buf, |
| 1430 » » unsigned int *length, unsigned int buf_len) | 1433 » » unsigned int *bufLen, unsigned int bufLenMax) |
| 1431 { | 1434 { |
| 1432 sslSocket *ss = ssl_FindSocket(fd); | 1435 sslSocket *ss = ssl_FindSocket(fd); |
| 1433 | 1436 |
| 1434 if (!ss) { | 1437 if (!ss) { |
| 1435 SSL_DBG(("%d: SSL[%d]: bad socket in SSL_GetNextProto", SSL_GETPID(), | 1438 SSL_DBG(("%d: SSL[%d]: bad socket in SSL_GetNextProto", SSL_GETPID(), |
| 1436 » » fd)); | 1439 » » fd)); |
| 1440 » return SECFailure; |
| 1441 } |
| 1442 |
| 1443 if (!state || !buf || !bufLen) { |
| 1444 » PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| 1437 return SECFailure; | 1445 return SECFailure; |
| 1438 } | 1446 } |
| 1439 | 1447 |
| 1440 *state = ss->ssl3.nextProtoState; | 1448 *state = ss->ssl3.nextProtoState; |
| 1441 | 1449 |
| 1442 if (ss->ssl3.nextProtoState != SSL_NEXT_PROTO_NO_SUPPORT && | 1450 if (ss->ssl3.nextProtoState != SSL_NEXT_PROTO_NO_SUPPORT && |
| 1443 ss->ssl3.nextProto.data) { | 1451 ss->ssl3.nextProto.data) { |
| 1444 » *length = ss->ssl3.nextProto.len; | 1452 » *bufLen = ss->ssl3.nextProto.len; |
| 1445 » if (*length > buf_len) | 1453 » if (*bufLen > bufLenMax) { |
| 1446 » *length = buf_len; | 1454 » PORT_SetError(SEC_ERROR_OUTPUT_LEN); |
| 1447 » PORT_Memcpy(buf, ss->ssl3.nextProto.data, *length); | 1455 » *bufLen = 0; |
| 1456 » return SECFailure; |
| 1457 » } |
| 1458 » PORT_Memcpy(buf, ss->ssl3.nextProto.data, ss->ssl3.nextProto.len); |
| 1448 } else { | 1459 } else { |
| 1449 » *length = 0; | 1460 » *bufLen = 0; |
| 1450 } | 1461 } |
| 1451 | 1462 |
| 1452 return SECSuccess; | 1463 return SECSuccess; |
| 1453 } | 1464 } |
| 1454 | 1465 |
| 1455 PRFileDesc * | 1466 PRFileDesc * |
| 1456 SSL_ReconfigFD(PRFileDesc *model, PRFileDesc *fd) | 1467 SSL_ReconfigFD(PRFileDesc *model, PRFileDesc *fd) |
| 1457 { | 1468 { |
| 1458 PORT_SetError(PR_NOT_IMPLEMENTED_ERROR); | 1469 PORT_SetError(PR_NOT_IMPLEMENTED_ERROR); |
| 1459 PR_NOT_REACHED("not implemented"); | 1470 PR_NOT_REACHED("not implemented"); |
| 1460 return NULL; | 1471 return NULL; |
| 1461 | 1472 |
| 1462 #if 0 | 1473 #if 0 |
| 1463 sslSocket * sm = NULL, *ss = NULL; | 1474 sslSocket * sm = NULL, *ss = NULL; |
| 1464 int i; | 1475 int i; |
| 1465 sslServerCerts * mc = sm->serverCerts; | 1476 sslServerCerts * mc = NULL; |
| 1466 sslServerCerts * sc = ss->serverCerts; | 1477 sslServerCerts * sc = NULL; |
| 1467 | 1478 |
| 1468 if (model == NULL) { | 1479 if (model == NULL) { |
| 1469 PR_SetError(SEC_ERROR_INVALID_ARGS, 0); | 1480 PR_SetError(SEC_ERROR_INVALID_ARGS, 0); |
| 1470 return NULL; | 1481 return NULL; |
| 1471 } | 1482 } |
| 1472 sm = ssl_FindSocket(model); | 1483 sm = ssl_FindSocket(model); |
| 1473 if (sm == NULL) { | 1484 if (sm == NULL) { |
| 1474 SSL_DBG(("%d: SSL[%d]: bad model socket in ssl_ReconfigFD", | 1485 SSL_DBG(("%d: SSL[%d]: bad model socket in ssl_ReconfigFD", |
| 1475 SSL_GETPID(), model)); | 1486 SSL_GETPID(), model)); |
| 1476 return NULL; | 1487 return NULL; |
| 1477 } | 1488 } |
| 1478 ss = ssl_FindSocket(fd); | 1489 ss = ssl_FindSocket(fd); |
| 1479 PORT_Assert(ss); | 1490 PORT_Assert(ss); |
| 1480 if (ss == NULL) { | 1491 if (ss == NULL) { |
| 1481 PORT_SetError(SEC_ERROR_INVALID_ARGS); | 1492 PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| 1482 return NULL; | 1493 return NULL; |
| 1483 } | 1494 } |
| 1484 | 1495 |
| 1485 ss->opt = sm->opt; | 1496 ss->opt = sm->opt; |
| 1486 PORT_Memcpy(ss->cipherSuites, sm->cipherSuites, sizeof sm->cipherSuites); | 1497 PORT_Memcpy(ss->cipherSuites, sm->cipherSuites, sizeof sm->cipherSuites); |
| 1487 | 1498 |
| 1488 if (!ss->opt.useSecurity) { | 1499 if (!ss->opt.useSecurity) { |
| 1489 PORT_SetError(SEC_ERROR_INVALID_ARGS); | 1500 PORT_SetError(SEC_ERROR_INVALID_ARGS); |
| 1490 return NULL; | 1501 return NULL; |
| 1491 } | 1502 } |
| 1492 /* This int should be SSLKEAType, but CC on Irix complains, | 1503 /* This int should be SSLKEAType, but CC on Irix complains, |
| 1493 * during the for loop. | 1504 * during the for loop. |
| 1494 */ | 1505 */ |
| 1495 for (i=kt_null; i < kt_kea_size; i++, mc++, sc++) { | 1506 for (i=kt_null; i < kt_kea_size; i++) { |
| 1507 mc = &(sm->serverCerts[i]); |
| 1508 sc = &(ss->serverCerts[i]); |
| 1496 if (mc->serverCert && mc->serverCertChain) { | 1509 if (mc->serverCert && mc->serverCertChain) { |
| 1497 if (sc->serverCert) { | 1510 if (sc->serverCert) { |
| 1498 CERT_DestroyCertificate(sc->serverCert); | 1511 CERT_DestroyCertificate(sc->serverCert); |
| 1499 } | 1512 } |
| 1500 sc->serverCert = CERT_DupCertificate(mc->serverCert); | 1513 sc->serverCert = CERT_DupCertificate(mc->serverCert); |
| 1501 if (sc->serverCertChain) { | 1514 if (sc->serverCertChain) { |
| 1502 CERT_DestroyCertificateList(sc->serverCertChain); | 1515 CERT_DestroyCertificateList(sc->serverCertChain); |
| 1503 } | 1516 } |
| 1504 sc->serverCertChain = CERT_DupCertList(mc->serverCertChain); | 1517 sc->serverCertChain = CERT_DupCertList(mc->serverCertChain); |
| 1505 if (!sc->serverCertChain) | 1518 if (!sc->serverCertChain) |
| (...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2046 new_flags ^= PR_POLL_WRITE; /* don't select on write. */ | 2059 new_flags ^= PR_POLL_WRITE; /* don't select on write. */ |
| 2047 new_flags |= PR_POLL_READ; /* do select on read. */ | 2060 new_flags |= PR_POLL_READ; /* do select on read. */ |
| 2048 } | 2061 } |
| 2049 } | 2062 } |
| 2050 } else if ((new_flags & PR_POLL_READ) && (SSL_DataPending(fd) > 0)) { | 2063 } else if ((new_flags & PR_POLL_READ) && (SSL_DataPending(fd) > 0)) { |
| 2051 *p_out_flags = PR_POLL_READ; /* it's ready already. */ | 2064 *p_out_flags = PR_POLL_READ; /* it's ready already. */ |
| 2052 return new_flags; | 2065 return new_flags; |
| 2053 } else if ((ss->lastWriteBlocked) && (how_flags & PR_POLL_READ) && | 2066 } else if ((ss->lastWriteBlocked) && (how_flags & PR_POLL_READ) && |
| 2054 (ss->pendingBuf.len != 0)) { /* write data waiting to be sent */ | 2067 (ss->pendingBuf.len != 0)) { /* write data waiting to be sent */ |
| 2055 new_flags |= PR_POLL_WRITE; /* also select on write. */ | 2068 new_flags |= PR_POLL_WRITE; /* also select on write. */ |
| 2056 } | 2069 } |
| 2070 |
| 2071 if (ss->version >= SSL_LIBRARY_VERSION_3_0 && |
| 2072 » ss->ssl3.hs.restartTarget != NULL) { |
| 2073 » /* Read and write will block until the asynchronous callback completes |
| 2074 » * (e.g. until SSL_AuthCertificateComplete is called), so don't tell |
| 2075 » * the caller to poll the socket unless there is pending write data. |
| 2076 » */ |
| 2077 » if (ss->lastWriteBlocked && ss->pendingBuf.len != 0) { |
| 2078 » /* Ignore any newly-received data on the socket, but do wait for |
| 2079 » * the socket to become writable again. Here, it is OK for an error |
| 2080 » * to be detected, because our logic for sending pending write data |
| 2081 » * will allow us to report the error to the caller without the risk |
| 2082 » * of the application spinning. |
| 2083 » */ |
| 2084 » new_flags &= (PR_POLL_WRITE | PR_POLL_EXCEPT); |
| 2085 » } else { |
| 2086 » /* Unfortunately, clearing new_flags will make it impossible for |
| 2087 » * the application to detect errors that it would otherwise be |
| 2088 » * able to detect with PR_POLL_EXCEPT, until the asynchronous |
| 2089 » * callback completes. However, we must clear all the flags to |
| 2090 » * prevent the application from spinning (alternating between |
| 2091 » * calling PR_Poll that would return PR_POLL_EXCEPT, and send/recv |
| 2092 » * which won't actually report the I/O error while we are waiting |
| 2093 » * for the asynchronous callback to complete). |
| 2094 » */ |
| 2095 » new_flags = 0; |
| 2096 » } |
| 2097 } |
| 2098 |
| 2057 if (new_flags && (fd->lower->methods->poll != NULL)) { | 2099 if (new_flags && (fd->lower->methods->poll != NULL)) { |
| 2058 PRInt16 lower_out_flags = 0; | 2100 PRInt16 lower_out_flags = 0; |
| 2059 PRInt16 lower_new_flags; | 2101 PRInt16 lower_new_flags; |
| 2060 lower_new_flags = fd->lower->methods->poll(fd->lower, new_flags, | 2102 lower_new_flags = fd->lower->methods->poll(fd->lower, new_flags, |
| 2061 &lower_out_flags); | 2103 &lower_out_flags); |
| 2062 if ((lower_new_flags & lower_out_flags) && (how_flags != new_flags)) { | 2104 if ((lower_new_flags & lower_out_flags) && (how_flags != new_flags)) { |
| 2063 PRInt16 out_flags = lower_out_flags & ~PR_POLL_RW; | 2105 PRInt16 out_flags = lower_out_flags & ~PR_POLL_RW; |
| 2064 if (lower_out_flags & PR_POLL_READ) | 2106 if (lower_out_flags & PR_POLL_READ) |
| 2065 out_flags |= PR_POLL_WRITE; | 2107 out_flags |= PR_POLL_WRITE; |
| 2066 if (lower_out_flags & PR_POLL_WRITE) | 2108 if (lower_out_flags & PR_POLL_WRITE) |
| (...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2421 return PR_SUCCESS; | 2463 return PR_SUCCESS; |
| 2422 } | 2464 } |
| 2423 | 2465 |
| 2424 static PRStatus | 2466 static PRStatus |
| 2425 ssl_PushIOLayer(sslSocket *ns, PRFileDesc *stack, PRDescIdentity id) | 2467 ssl_PushIOLayer(sslSocket *ns, PRFileDesc *stack, PRDescIdentity id) |
| 2426 { | 2468 { |
| 2427 PRFileDesc *layer = NULL; | 2469 PRFileDesc *layer = NULL; |
| 2428 PRStatus status; | 2470 PRStatus status; |
| 2429 | 2471 |
| 2430 if (!ssl_inited) { | 2472 if (!ssl_inited) { |
| 2431 » PR_CallOnce(&initIoLayerOnce, &ssl_InitIOLayer); | 2473 » status = PR_CallOnce(&initIoLayerOnce, &ssl_InitIOLayer); |
| 2474 » if (status != PR_SUCCESS) |
| 2475 » goto loser; |
| 2432 } | 2476 } |
| 2433 | 2477 |
| 2434 if (ns == NULL) | 2478 if (ns == NULL) |
| 2435 goto loser; | 2479 goto loser; |
| 2436 | 2480 |
| 2437 layer = PR_CreateIOLayerStub(ssl_layer_id, &combined_methods); | 2481 layer = PR_CreateIOLayerStub(ssl_layer_id, &combined_methods); |
| 2438 if (layer == NULL) | 2482 if (layer == NULL) |
| 2439 goto loser; | 2483 goto loser; |
| 2440 layer->secret = (PRFilePrivate *)ns; | 2484 layer->secret = (PRFilePrivate *)ns; |
| 2441 | 2485 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2497 ssl_DestroyLocks(ss); | 2541 ssl_DestroyLocks(ss); |
| 2498 return SECFailure; | 2542 return SECFailure; |
| 2499 } | 2543 } |
| 2500 | 2544 |
| 2501 #if (defined(XP_UNIX) || defined(XP_WIN32) || defined(XP_BEOS)) && !defined(_WIN
32_WCE) | 2545 #if (defined(XP_UNIX) || defined(XP_WIN32) || defined(XP_BEOS)) && !defined(_WIN
32_WCE) |
| 2502 #define NSS_HAVE_GETENV 1 | 2546 #define NSS_HAVE_GETENV 1 |
| 2503 #endif | 2547 #endif |
| 2504 | 2548 |
| 2505 #define LOWER(x) (x | 0x20) /* cheap ToLower function ignores LOCALE */ | 2549 #define LOWER(x) (x | 0x20) /* cheap ToLower function ignores LOCALE */ |
| 2506 | 2550 |
| 2507 /* | 2551 static void |
| 2508 ** Create a newsocket structure for a file descriptor. | 2552 ssl_SetDefaultsFromEnvironment(void) |
| 2509 */ | |
| 2510 static sslSocket * | |
| 2511 ssl_NewSocket(PRBool makeLocks) | |
| 2512 { | 2553 { |
| 2513 sslSocket *ss; | |
| 2514 #if defined( NSS_HAVE_GETENV ) | 2554 #if defined( NSS_HAVE_GETENV ) |
| 2515 static int firsttime = 1; | 2555 static int firsttime = 1; |
| 2516 | 2556 |
| 2517 if (firsttime) { | 2557 if (firsttime) { |
| 2518 char * ev; | 2558 char * ev; |
| 2519 firsttime = 0; | 2559 firsttime = 0; |
| 2520 #ifdef DEBUG | 2560 #ifdef DEBUG |
| 2521 ev = getenv("SSLDEBUGFILE"); | 2561 ev = getenv("SSLDEBUGFILE"); |
| 2522 if (ev && ev[0]) { | 2562 if (ev && ev[0]) { |
| 2523 ssl_trace_iob = fopen(ev, "w"); | 2563 ssl_trace_iob = fopen(ev, "w"); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2572 ssl_defaults.enableRenegotiation = SSL_RENEGOTIATE_TRANSITIONAL; | 2612 ssl_defaults.enableRenegotiation = SSL_RENEGOTIATE_TRANSITIONAL; |
| 2573 SSL_TRACE(("SSL: enableRenegotiation set to %d", | 2613 SSL_TRACE(("SSL: enableRenegotiation set to %d", |
| 2574 ssl_defaults.enableRenegotiation)); | 2614 ssl_defaults.enableRenegotiation)); |
| 2575 } | 2615 } |
| 2576 ev = getenv("NSS_SSL_REQUIRE_SAFE_NEGOTIATION"); | 2616 ev = getenv("NSS_SSL_REQUIRE_SAFE_NEGOTIATION"); |
| 2577 if (ev && ev[0] == '1') { | 2617 if (ev && ev[0] == '1') { |
| 2578 ssl_defaults.requireSafeNegotiation = PR_TRUE; | 2618 ssl_defaults.requireSafeNegotiation = PR_TRUE; |
| 2579 SSL_TRACE(("SSL: requireSafeNegotiation set to %d", | 2619 SSL_TRACE(("SSL: requireSafeNegotiation set to %d", |
| 2580 PR_TRUE)); | 2620 PR_TRUE)); |
| 2581 } | 2621 } |
| 2622 ev = getenv("NSS_SSL_CBC_RANDOM_IV"); |
| 2623 if (ev && ev[0] == '0') { |
| 2624 ssl_defaults.cbcRandomIV = PR_FALSE; |
| 2625 SSL_TRACE(("SSL: cbcRandomIV set to 0")); |
| 2626 } |
| 2582 } | 2627 } |
| 2583 #endif /* NSS_HAVE_GETENV */ | 2628 #endif /* NSS_HAVE_GETENV */ |
| 2629 } |
| 2630 |
| 2631 /* |
| 2632 ** Create a newsocket structure for a file descriptor. |
| 2633 */ |
| 2634 static sslSocket * |
| 2635 ssl_NewSocket(PRBool makeLocks) |
| 2636 { |
| 2637 sslSocket *ss; |
| 2638 |
| 2639 ssl_SetDefaultsFromEnvironment(); |
| 2640 |
| 2584 if (ssl_force_locks) | 2641 if (ssl_force_locks) |
| 2585 makeLocks = PR_TRUE; | 2642 makeLocks = PR_TRUE; |
| 2586 | 2643 |
| 2587 /* Make a new socket and get it ready */ | 2644 /* Make a new socket and get it ready */ |
| 2588 ss = (sslSocket*) PORT_ZAlloc(sizeof(sslSocket)); | 2645 ss = (sslSocket*) PORT_ZAlloc(sizeof(sslSocket)); |
| 2589 if (ss) { | 2646 if (ss) { |
| 2590 /* This should be of type SSLKEAType, but CC on IRIX | 2647 /* This should be of type SSLKEAType, but CC on IRIX |
| 2591 * complains during the for loop. | 2648 * complains during the for loop. |
| 2592 */ | 2649 */ |
| 2593 int i; | 2650 int i; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2647 if (status != SECSuccess) { | 2704 if (status != SECSuccess) { |
| 2648 loser: | 2705 loser: |
| 2649 ssl_DestroySocketContents(ss); | 2706 ssl_DestroySocketContents(ss); |
| 2650 ssl_DestroyLocks(ss); | 2707 ssl_DestroyLocks(ss); |
| 2651 PORT_Free(ss); | 2708 PORT_Free(ss); |
| 2652 ss = NULL; | 2709 ss = NULL; |
| 2653 } | 2710 } |
| 2654 } | 2711 } |
| 2655 return ss; | 2712 return ss; |
| 2656 } | 2713 } |
| 2714 |
| OLD | NEW |