| Index: net/cert/x509_util_openssl.cc
|
| ===================================================================
|
| --- net/cert/x509_util_openssl.cc (revision 231602)
|
| +++ net/cert/x509_util_openssl.cc (working copy)
|
| @@ -18,11 +18,26 @@
|
|
|
| namespace net {
|
|
|
| +namespace {
|
| +
|
| +const EVP_MD* ToEVP(x509_util::DigestAlgorithm alg) {
|
| + switch (alg) {
|
| + case x509_util::DIGEST_SHA1:
|
| + return EVP_sha1();
|
| + case x509_util::DIGEST_SHA256:
|
| + return EVP_sha256();
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| namespace x509_util {
|
|
|
| namespace {
|
|
|
| X509* CreateCertificate(EVP_PKEY* key,
|
| + DigestAlgorithm alg,
|
| const std::string& common_name,
|
| uint32_t serial_number,
|
| base::Time not_valid_before,
|
| @@ -100,9 +115,19 @@
|
| return cert.release();
|
| }
|
|
|
| -bool SignAndDerEncodeCert(X509* cert, EVP_PKEY* key, std::string* der_encoded) {
|
| +bool SignAndDerEncodeCert(X509* cert,
|
| + EVP_PKEY* key,
|
| + DigestAlgorithm alg,
|
| + std::string* der_encoded) {
|
| + // Get the message digest algorithm
|
| + const EVP_MD* md = ToEVP(alg);
|
| + if (!md) {
|
| + LOG(ERROR) << "Unrecognized hash algorithm.";
|
| + return false;
|
| + }
|
| +
|
| // Sign it with the private key.
|
| - if (!X509_sign(cert, key, EVP_sha1())) {
|
| + if (!X509_sign(cert, key, md)) {
|
| LOG(ERROR) << "Could not sign certificate with key.";
|
| return false;
|
| }
|
| @@ -188,6 +213,7 @@
|
|
|
| bool CreateDomainBoundCertEC(
|
| crypto::ECPrivateKey* key,
|
| + DigestAlgorithm alg,
|
| const std::string& domain,
|
| uint32 serial_number,
|
| base::Time not_valid_before,
|
| @@ -197,6 +223,7 @@
|
| // Create certificate.
|
| crypto::ScopedOpenSSL<X509, X509_free> cert(
|
| CreateCertificate(key->key(),
|
| + alg,
|
| "CN=anonymous.invalid",
|
| serial_number,
|
| not_valid_before,
|
| @@ -237,10 +264,11 @@
|
| }
|
|
|
| // Sign and encode it.
|
| - return SignAndDerEncodeCert(cert.get(), key->key(), der_cert);
|
| + return SignAndDerEncodeCert(cert.get(), key->key(), alg, der_cert);
|
| }
|
|
|
| bool CreateSelfSignedCert(crypto::RSAPrivateKey* key,
|
| + DigestAlgorithm alg,
|
| const std::string& common_name,
|
| uint32 serial_number,
|
| base::Time not_valid_before,
|
| @@ -249,6 +277,7 @@
|
| crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
|
| crypto::ScopedOpenSSL<X509, X509_free> cert(
|
| CreateCertificate(key->key(),
|
| + alg,
|
| common_name,
|
| serial_number,
|
| not_valid_before,
|
| @@ -256,7 +285,7 @@
|
| if (!cert.get())
|
| return false;
|
|
|
| - return SignAndDerEncodeCert(cert.get(), key->key(), der_encoded);
|
| + return SignAndDerEncodeCert(cert.get(), key->key(), alg, der_encoded);
|
| }
|
|
|
| bool ParsePrincipalKeyAndValueByIndex(X509_NAME* name,
|
|
|