| Index: chrome/common/net/x509_certificate_model_openssl.cc
|
| diff --git a/chrome/common/net/x509_certificate_model_openssl.cc b/chrome/common/net/x509_certificate_model_openssl.cc
|
| index 6dbd4cd4da98ae3a89e6823b2fda0f88c5625644..044a5eec53f2204d5f2ff174b257a99259790aba 100644
|
| --- a/chrome/common/net/x509_certificate_model_openssl.cc
|
| +++ b/chrome/common/net/x509_certificate_model_openssl.cc
|
| @@ -45,6 +45,13 @@ std::string ProcessRawAsn1Type(ASN1_TYPE* data) {
|
| return ProcessRawBytes(buf.get(), len);
|
| }
|
|
|
| +std::string ProcessRawBignum(BIGNUM* n) {
|
| + int len = BN_num_bytes(n);
|
| + scoped_ptr<unsigned char[]> buf(new unsigned char[len]);
|
| + len = BN_bn2bin(n, buf.get());
|
| + return ProcessRawBytes(buf.get(), len);
|
| +}
|
| +
|
| std::string Asn1StringToUTF8(ASN1_STRING* asn1_string) {
|
| std::string rv;
|
| unsigned char* buf = NULL;
|
| @@ -1184,8 +1191,29 @@ std::string ProcessSecAlgorithmSignatureWrap(
|
|
|
| std::string ProcessSubjectPublicKeyInfo(
|
| net::X509Certificate::OSCertHandle cert_handle) {
|
| - // TODO(bulach): implement me.
|
| - return "";
|
| + std::string rv;
|
| + crypto::ScopedOpenSSL<EVP_PKEY, EVP_PKEY_free> public_key(
|
| + X509_get_pubkey(cert_handle));
|
| + if (!public_key.get())
|
| + return rv;
|
| + switch (EVP_PKEY_type(public_key.get()->type)) {
|
| + case EVP_PKEY_RSA: {
|
| + crypto::ScopedOpenSSL<RSA, RSA_free> rsa_key(
|
| + EVP_PKEY_get1_RSA(public_key.get()));
|
| + if (!rsa_key.get())
|
| + return rv;
|
| + rv = l10n_util::GetStringFUTF8(
|
| + IDS_CERT_RSA_PUBLIC_KEY_DUMP_FORMAT,
|
| + base::UintToString16(BN_num_bits(rsa_key.get()->n)),
|
| + base::UTF8ToUTF16(ProcessRawBignum(rsa_key.get()->n)),
|
| + base::UintToString16(BN_num_bits(rsa_key.get()->e)),
|
| + base::UTF8ToUTF16(ProcessRawBignum(rsa_key.get()->e)));
|
| + return rv;
|
| + }
|
| + default:
|
| + rv = ProcessRawAsn1String(X509_get_X509_PUBKEY(cert_handle)->public_key);
|
| + return rv;
|
| + }
|
| }
|
|
|
| std::string ProcessRawBitsSignatureWrap(
|
|
|