Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(69)

Side by Side Diff: net/third_party/nss/ssl/sslsock.c

Issue 9558017: Update net/third_party/nss to NSS 3.13.3. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Upload before checkin Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/third_party/nss/ssl/sslsnce.c ('k') | net/third_party/nss/ssl/sslt.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/third_party/nss/ssl/sslsnce.c ('k') | net/third_party/nss/ssl/sslt.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698