--- nss/lib/ssl/ssl3con.prekai 2016-03-23 08:29:25.000000000 -0400
+++ nss/lib/ssl/ssl3con.c 2016-03-29 15:00:44.457697131 -0400
@@ -204,6 +204,7 @@
{ssl_hash_sha512, ssl_sign_ecdsa},
{ssl_hash_sha1, ssl_sign_ecdsa},
#endif
+ {ssl_hash_sha384, ssl_sign_dsa},
{ssl_hash_sha256, ssl_sign_dsa},
{ssl_hash_sha1, ssl_sign_dsa}
};
@@ -270,27 +271,6 @@
ct_DSS_sign,
};
-/* This block is the contents of the supported_signature_algorithms field of
- * our TLS 1.2 CertificateRequest message, in wire format. See
- * https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1
- *
- * We only support TLS 1.2
- * CertificateVerify messages that use the handshake PRF hash. */
-static const PRUint8 supported_signature_algorithms_sha256[] = {
- tls_hash_sha256, tls_sig_rsa,
-#ifndef NSS_DISABLE_ECC
- tls_hash_sha256, tls_sig_ecdsa,
-#endif
- tls_hash_sha256, tls_sig_dsa,
-};
-static const PRUint8 supported_signature_algorithms_sha384[] = {
- tls_hash_sha384, tls_sig_rsa,
-#ifndef NSS_DISABLE_ECC
- tls_hash_sha384, tls_sig_ecdsa,
-#endif
- tls_hash_sha384, tls_sig_dsa,
-};
-
#define EXPORT_RSA_KEY_LENGTH 64 /* bytes */
@@ -9561,7 +9541,8 @@
}
static SECStatus
-ssl3_EncodeCertificateRequestSigAlgs(sslSocket *ss, PRUint8 *buf,
+ssl3_EncodeCertificateRequestSigAlgs(sslSocket *ss, PRUint8 allowedHashAlg,
+ PRUint8 *buf,
unsigned maxLen, PRUint32 *len)
{
unsigned int i;
@@ -9578,7 +9559,7 @@
/* Note that we don't support a handshake hash with anything other than
* SHA-256, so asking for a signature from clients for something else
* would be inviting disaster. */
- if (alg->hashAlg == ssl_hash_sha256 || alg->hashAlg == ssl_hash_sha384) {
+ if (alg->hashAlg == allowedHashAlg) {
buf[(*len)++] = (PRUint8)alg->hashAlg;
buf[(*len)++] = (PRUint8)alg->sigAlg;
}
@@ -9608,6 +9589,7 @@
PRUint8 sigAlgs[MAX_SIGNATURE_ALGORITHMS * 2];
unsigned int sigAlgsLength = 0;
SECOidData *hashOid;
+ PRUint8 allowedHashAlg;
SSL_TRC(3, ("%d: SSL3[%d]: send certificate_request handshake",
SSL_GETPID(), ss->fd));
@@ -9639,19 +9621,19 @@
if (hashOid == NULL) {
return SECFailure; /* err set by AppendHandshake. */
}
+
if (hashOid->offset == SEC_OID_SHA256) {
- sigAlgsLength = sizeof supported_signature_algorithms_sha256;
- PORT_Memcpy(sigAlgs, supported_signature_algorithms_sha256, sigAlgsLength);
+ allowedHashAlg = ssl_hash_sha256;
} else if (hashOid->offset == SEC_OID_SHA384) {
- sigAlgsLength = sizeof supported_signature_algorithms_sha384;
- PORT_Memcpy(sigAlgs, supported_signature_algorithms_sha384, sigAlgsLength);
+ allowedHashAlg = ssl_hash_sha384;
} else {
return SECFailure; /* err set by AppendHandshake. */
}
length = 1 + certTypesLength + 2 + calen;
if (isTLS12) {
- rv = ssl3_EncodeCertificateRequestSigAlgs(ss, sigAlgs, sizeof(sigAlgs),
+ rv = ssl3_EncodeCertificateRequestSigAlgs(ss, allowedHashAlg,
+ sigAlgs, sizeof(sigAlgs),
&sigAlgsLength);
if (rv != SECSuccess) {
return rv;