Index: net/ssl/openssl_platform_key_win.cc |
diff --git a/net/ssl/openssl_platform_key_win.cc b/net/ssl/openssl_platform_key_win.cc |
index 8c9589afe0d0247edd887dfa7a897d6f4f6a38c6..c625bff3b4202f0f6b1dd0e0e0a9a3f17b8210c8 100644 |
--- a/net/ssl/openssl_platform_key_win.cc |
+++ b/net/ssl/openssl_platform_key_win.cc |
@@ -190,24 +190,19 @@ size_t RsaMethodSize(const RSA* rsa) { |
return (ex_data->key_length + 7) / 8; |
} |
-// Signs |in| using |rsa| with PKCS #1 padding. If |hash_nid| is NID_md5_sha1, |
-// |in| is a TLS MD5/SHA-1 concatenation and should be signed as-is. Otherwise |
-// |in| is a standard hash function and should be prefixed with the |
-// corresponding DigestInfo before signing. The signature is written to |out| |
-// and its length written to |*out_len|. This function returns true on success |
-// and false on failure. |
-bool RsaSignPKCS1(const RSA* rsa, |
- int hash_nid, |
+int RsaMethodSign(int hash_nid, |
const uint8_t* in, |
- size_t in_len, |
+ unsigned in_len, |
uint8_t* out, |
- size_t max_out, |
- size_t* out_len) { |
+ unsigned* out_len, |
+ const RSA* rsa) { |
+ // TODO(davidben): Switch BoringSSL's sign hook to using size_t rather than |
+ // unsigned. |
const KeyExData* ex_data = RsaGetExData(rsa); |
if (!ex_data) { |
NOTREACHED(); |
OPENSSL_PUT_ERROR(RSA, RSA_sign, ERR_R_INTERNAL_ERROR); |
- return false; |
+ return 0; |
} |
if (ex_data->key->dwKeySpec == CERT_NCRYPT_KEY_SPEC) { |
@@ -230,19 +225,19 @@ bool RsaSignPKCS1(const RSA* rsa, |
break; |
default: |
OPENSSL_PUT_ERROR(RSA, RSA_sign, RSA_R_UNKNOWN_ALGORITHM_TYPE); |
- return false; |
+ return 0; |
} |
DWORD signature_len; |
SECURITY_STATUS ncrypt_status = g_cng_functions.Get().ncrypt_sign_hash()( |
ex_data->key->hNCryptKey, &rsa_padding_info, const_cast<PBYTE>(in), |
- in_len, out, max_out, &signature_len, BCRYPT_PAD_PKCS1); |
+ in_len, out, RSA_size(rsa), &signature_len, BCRYPT_PAD_PKCS1); |
if (FAILED(ncrypt_status) || signature_len == 0) { |
OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED); |
- return false; |
+ return 0; |
} |
*out_len = signature_len; |
- return true; |
+ return 1; |
} |
ALG_ID hash_alg; |
@@ -264,14 +259,14 @@ bool RsaSignPKCS1(const RSA* rsa, |
break; |
default: |
OPENSSL_PUT_ERROR(RSA, RSA_sign, RSA_R_UNKNOWN_ALGORITHM_TYPE); |
- return false; |
+ return 0; |
} |
HCRYPTHASH hash; |
if (!CryptCreateHash(ex_data->key->hCryptProv, hash_alg, 0, 0, &hash)) { |
PLOG(ERROR) << "CreateCreateHash failed"; |
OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED); |
- return false; |
+ return 0; |
} |
DWORD hash_len; |
DWORD arg_len = sizeof(hash_len); |
@@ -279,43 +274,28 @@ bool RsaSignPKCS1(const RSA* rsa, |
&arg_len, 0)) { |
PLOG(ERROR) << "CryptGetHashParam HP_HASHSIZE failed"; |
OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED); |
- return false; |
+ return 0; |
} |
if (hash_len != in_len) { |
OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED); |
- return false; |
+ return 0; |
} |
if (!CryptSetHashParam(hash, HP_HASHVAL, const_cast<BYTE*>(in), 0)) { |
PLOG(ERROR) << "CryptSetHashParam HP_HASHVAL failed"; |
OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED); |
- return false; |
+ return 0; |
} |
- DWORD signature_len = max_out; |
+ DWORD signature_len = RSA_size(rsa); |
if (!CryptSignHash(hash, ex_data->key->dwKeySpec, nullptr, 0, out, |
&signature_len)) { |
PLOG(ERROR) << "CryptSignHash failed"; |
OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED); |
- return false; |
+ return 0; |
} |
/* CryptoAPI signs in little-endian, so reverse it. */ |
std::reverse(out, out + signature_len); |
*out_len = signature_len; |
- return true; |
-} |
- |
-int RsaMethodSign(int hash_nid, |
- const uint8_t* in, |
- unsigned in_len, |
- uint8_t* out, |
- unsigned* out_len, |
- const RSA* rsa) { |
- // TOD(davidben): Switch BoringSSL's sign hook to using size_t rather than |
- // unsigned. |
- size_t len; |
- if (!RsaSignPKCS1(rsa, hash_nid, in, in_len, out, RSA_size(rsa), &len)) |
- return 0; |
- *out_len = len; |
return 1; |
} |
@@ -338,24 +318,9 @@ int RsaMethodSignRaw(RSA* rsa, |
const uint8_t* in, |
size_t in_len, |
int padding) { |
- DCHECK_EQ(RSA_PKCS1_PADDING, padding); |
- if (padding != RSA_PKCS1_PADDING) { |
- OPENSSL_PUT_ERROR(RSA, sign_raw, RSA_R_UNKNOWN_PADDING_TYPE); |
- return 0; |
- } |
- |
- // BoringSSL calls only sign_raw, not sign, in pre-TLS-1.2 MD5/SHA1 |
- // signatures. This hook is implemented only for that case. |
- // |
- // TODO(davidben): Make client auth in BoringSSL call RSA_sign with |
- // NID_md5_sha1. https://crbug.com/437023 |
- if (in_len != MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH) { |
- OPENSSL_PUT_ERROR(RSA, sign_raw, RSA_R_INVALID_MESSAGE_LENGTH); |
- return 0; |
- } |
- if (!RsaSignPKCS1(rsa, NID_md5_sha1, in, in_len, out, max_out, out_len)) |
- return 0; |
- return 1; |
+ NOTIMPLEMENTED(); |
+ OPENSSL_PUT_ERROR(RSA, encrypt, RSA_R_UNKNOWN_ALGORITHM_TYPE); |
+ return 0; |
} |
int RsaMethodDecrypt(RSA* rsa, |
@@ -506,7 +471,7 @@ int EcdsaMethodSign(const uint8_t* digest, |
// Ensure the DER-encoded signature fits in the bounds. |
int len = i2d_ECDSA_SIG(sig.get(), nullptr); |
- if (len < 0 || len > ECDSA_size(ec_key)) { |
+ if (len < 0 || static_cast<size_t>(len) > ECDSA_size(ec_key)) { |
OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED); |
return 0; |
} |