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 |