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

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

Issue 23880010: Also check if the backup handshake hash should be used on the NSS client (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Tweak a comment Created 7 years, 3 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/patches/tls12backuphash.patch ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* 2 /*
3 * SSL3 Protocol 3 * SSL3 Protocol
4 * 4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public 5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this 6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
8 8
9 /* TODO(ekr): Implement HelloVerifyRequest on server side. OK for now. */ 9 /* TODO(ekr): Implement HelloVerifyRequest on server side. OK for now. */
10 10
(...skipping 6834 matching lines...) Expand 10 before | Expand all | Expand 10 after
6845 loser: 6845 loser:
6846 PORT_SetError( errCode ); 6846 PORT_SetError( errCode );
6847 return SECFailure; 6847 return SECFailure;
6848 6848
6849 no_memory: /* no-memory error has already been set. */ 6849 no_memory: /* no-memory error has already been set. */
6850 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE); 6850 ssl_MapLowLevelError(SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE);
6851 return SECFailure; 6851 return SECFailure;
6852 } 6852 }
6853 6853
6854 6854
6855 /*
6856 * Returns true if the client authentication key is an RSA or DSA key that
6857 * may be able to sign only SHA-1 hashes.
6858 */
6859 static PRBool
6860 ssl3_ClientKeyPrefersSHA1(sslSocket *ss)
6861 {
6862 SECKEYPublicKey *pubk;
6863 PRBool prefer_sha1 = PR_FALSE;
6864
6865 #if defined(NSS_PLATFORM_CLIENT_AUTH) && defined(_WIN32)
6866 /* If the key is in CAPI, assume conservatively that the CAPI service
6867 * provider may be unable to sign SHA-256 hashes.
6868 */
6869 if (ss->ssl3.platformClientKey->dwKeySpec != CERT_NCRYPT_KEY_SPEC) {
6870 /* CAPI only supports RSA and DSA signatures, so we don't need to
6871 * check the key type. */
6872 return PR_TRUE;
6873 }
6874 #endif /* NSS_PLATFORM_CLIENT_AUTH && _WIN32 */
6875
6876 /* If the key is a 1024-bit RSA or DSA key, assume conservatively that
6877 * it may be unable to sign SHA-256 hashes. This is the case for older
6878 * Estonian ID cards that have 1024-bit RSA keys. In FIPS 186-2 and
6879 * older, DSA key size is at most 1024 bits and the hash function must
6880 * be SHA-1.
6881 */
6882 pubk = CERT_ExtractPublicKey(ss->ssl3.clientCertificate);
6883 if (pubk == NULL) {
6884 return PR_FALSE;
6885 }
6886 if (pubk->keyType == rsaKey || pubk->keyType == dsaKey) {
6887 prefer_sha1 = SECKEY_PublicKeyStrength(pubk) <= 128;
6888 }
6889 SECKEY_DestroyPublicKey(pubk);
6890 return prefer_sha1;
6891 }
6892
6893 /* Destroys the backup handshake hash context if we don't need it. */
6894 static void
6895 ssl3_DestroyBackupHandshakeHashIfNotNeeded(sslSocket *ss,
6896 const SECItem *algorithms)
6897 {
6898 PRBool need_backup_hash = PR_FALSE;
6899 unsigned int i;
6900
6901 PORT_Assert(ss->ssl3.hs.md5);
6902 if (ssl3_ClientKeyPrefersSHA1(ss)) {
6903 /* Use SHA-1 if the server supports it. */
6904 for (i = 0; i < algorithms->len; i += 2) {
6905 if (algorithms->data[i] == tls_hash_sha1 &&
6906 (algorithms->data[i+1] == tls_sig_rsa ||
6907 algorithms->data[i+1] == tls_sig_dsa)) {
6908 need_backup_hash = PR_TRUE;
6909 break;
6910 }
6911 }
6912 }
6913 if (!need_backup_hash) {
6914 PK11_DestroyContext(ss->ssl3.hs.md5, PR_TRUE);
6915 ss->ssl3.hs.md5 = NULL;
6916 }
6917 }
6918
6855 typedef struct dnameNode { 6919 typedef struct dnameNode {
6856 struct dnameNode *next; 6920 struct dnameNode *next;
6857 SECItem name; 6921 SECItem name;
6858 } dnameNode; 6922 } dnameNode;
6859 6923
6860 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete 6924 /* Called from ssl3_HandleHandshakeMessage() when it has deciphered a complete
6861 * ssl3 Certificate Request message. 6925 * ssl3 Certificate Request message.
6862 * Caller must hold Handshake and RecvBuf locks. 6926 * Caller must hold Handshake and RecvBuf locks.
6863 */ 6927 */
6864 static SECStatus 6928 static SECStatus
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
7037 if (ss->ssl3.clientCertificate != NULL) { 7101 if (ss->ssl3.clientCertificate != NULL) {
7038 CERT_DestroyCertificate(ss->ssl3.clientCertificate); 7102 CERT_DestroyCertificate(ss->ssl3.clientCertificate);
7039 ss->ssl3.clientCertificate = NULL; 7103 ss->ssl3.clientCertificate = NULL;
7040 } 7104 }
7041 if (ss->ssl3.platformClientKey) { 7105 if (ss->ssl3.platformClientKey) {
7042 ssl_FreePlatformKey(ss->ssl3.platformClientKey); 7106 ssl_FreePlatformKey(ss->ssl3.platformClientKey);
7043 ss->ssl3.platformClientKey = (PlatformKey)NULL; 7107 ss->ssl3.platformClientKey = (PlatformKey)NULL;
7044 } 7108 }
7045 goto send_no_certificate; 7109 goto send_no_certificate;
7046 } 7110 }
7047 7111 » if (isTLS12) {
7048 » if (isTLS12 && ss->ssl3.hs.md5) { 7112 » » ssl3_DestroyBackupHandshakeHashIfNotNeeded(ss, &algorithms);
7049 » » PRBool need_backup_hash = PR_FALSE;
7050 » » PRBool prefer_sha1 = PR_FALSE;
7051 #ifdef _WIN32
7052 » » /* If the key is in CAPI, assume conservatively that the CAPI
7053 » » * service provider may be unable to sign SHA-256 hashes.
7054 » » */
7055 » » if (ss->ssl3.platformClientKey->dwKeySpec !=
7056 » » CERT_NCRYPT_KEY_SPEC) {
7057 » » /* CAPI only supports RSA and DSA signatures, so we don't
7058 » » * need to check the key type. */
7059 » » prefer_sha1 = PR_TRUE;
7060 » » }
7061 #endif /* _WIN32 */
7062 » » /* If the key is a 1024-bit RSA or DSA key, assume
7063 » » * conservatively that it may be unable to sign SHA-256
7064 » » * hashes. This is the case for older Estonian ID cards that
7065 » » * have 1024-bit RSA keys. In FIPS 186-2 and older, DSA key
7066 » » * size is at most 1024 bits and the hash function must be
7067 » » * SHA-1.
7068 » » */
7069 » » if (!prefer_sha1) {
7070 » » SECKEYPublicKey *pubk =
7071 » » » CERT_ExtractPublicKey(ss->ssl3.clientCertificate);
7072 » » if (pubk == NULL) {
7073 » » » errCode = SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE;
7074 » » » goto loser;
7075 » » }
7076 » » if (pubk->keyType == rsaKey || pubk->keyType == dsaKey) {
7077 » » » prefer_sha1 = SECKEY_PublicKeyStrength(pubk) <= 128;
7078 » » }
7079 » » SECKEY_DestroyPublicKey(pubk);
7080 » » }
7081 » » /* Use SHA-1 if the server supports it. */
7082 » » if (prefer_sha1) {
7083 » » for (i = 0; i < algorithms.len; i += 2) {
7084 » » » if (algorithms.data[i] == tls_hash_sha1 &&
7085 » » » (algorithms.data[i+1] == tls_sig_rsa ||
7086 » » » algorithms.data[i+1] == tls_sig_dsa)) {
7087 » » » need_backup_hash = PR_TRUE;
7088 » » » break;
7089 » » » }
7090 » » }
7091 » » }
7092 » » if (!need_backup_hash) {
7093 » » PK11_DestroyContext(ss->ssl3.hs.md5, PR_TRUE);
7094 » » ss->ssl3.hs.md5 = NULL;
7095 » » }
7096 } 7113 }
7097 break; /* not an error */ 7114 break; /* not an error */
7098 } 7115 }
7099 #endif /* NSS_PLATFORM_CLIENT_AUTH */ 7116 #endif /* NSS_PLATFORM_CLIENT_AUTH */
7100 /* check what the callback function returned */ 7117 /* check what the callback function returned */
7101 if ((!ss->ssl3.clientCertificate) || (!ss->ssl3.clientPrivateKey)) { 7118 if ((!ss->ssl3.clientCertificate) || (!ss->ssl3.clientPrivateKey)) {
7102 /* we are missing either the key or cert */ 7119 /* we are missing either the key or cert */
7103 if (ss->ssl3.clientCertificate) { 7120 if (ss->ssl3.clientCertificate) {
7104 /* got a cert, but no key - free it */ 7121 /* got a cert, but no key - free it */
7105 CERT_DestroyCertificate(ss->ssl3.clientCertificate); 7122 CERT_DestroyCertificate(ss->ssl3.clientCertificate);
(...skipping 16 matching lines...) Expand all
7122 if (ss->ssl3.clientCertificate != NULL) { 7139 if (ss->ssl3.clientCertificate != NULL) {
7123 CERT_DestroyCertificate(ss->ssl3.clientCertificate); 7140 CERT_DestroyCertificate(ss->ssl3.clientCertificate);
7124 ss->ssl3.clientCertificate = NULL; 7141 ss->ssl3.clientCertificate = NULL;
7125 } 7142 }
7126 if (ss->ssl3.clientPrivateKey != NULL) { 7143 if (ss->ssl3.clientPrivateKey != NULL) {
7127 SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey); 7144 SECKEY_DestroyPrivateKey(ss->ssl3.clientPrivateKey);
7128 ss->ssl3.clientPrivateKey = NULL; 7145 ss->ssl3.clientPrivateKey = NULL;
7129 } 7146 }
7130 goto send_no_certificate; 7147 goto send_no_certificate;
7131 } 7148 }
7149 if (isTLS12) {
7150 ssl3_DestroyBackupHandshakeHashIfNotNeeded(ss, &algorithms);
7151 }
7132 break; /* not an error */ 7152 break; /* not an error */
7133 7153
7134 case SECFailure: 7154 case SECFailure:
7135 default: 7155 default:
7136 send_no_certificate: 7156 send_no_certificate:
7137 if (isTLS) { 7157 if (isTLS) {
7138 ss->ssl3.sendEmptyCert = PR_TRUE; 7158 ss->ssl3.sendEmptyCert = PR_TRUE;
7139 } else { 7159 } else {
7140 (void)SSL3_SendAlert(ss, alert_warning, no_certificate); 7160 (void)SSL3_SendAlert(ss, alert_warning, no_certificate);
7141 } 7161 }
(...skipping 5229 matching lines...) Expand 10 before | Expand all | Expand 10 after
12371 PORT_Free(ss->ssl3.hs.recvdFragments.buf); 12391 PORT_Free(ss->ssl3.hs.recvdFragments.buf);
12372 } 12392 }
12373 } 12393 }
12374 12394
12375 ss->ssl3.initialized = PR_FALSE; 12395 ss->ssl3.initialized = PR_FALSE;
12376 12396
12377 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE); 12397 SECITEM_FreeItem(&ss->ssl3.nextProto, PR_FALSE);
12378 } 12398 }
12379 12399
12380 /* End of ssl3con.c */ 12400 /* End of ssl3con.c */
OLDNEW
« no previous file with comments | « net/third_party/nss/patches/tls12backuphash.patch ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698