| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/common/net/x509_certificate_model.h" |
| |
| #include <openssl/obj_mac.h> |
| #include <openssl/sha.h> |
| #include <openssl/x509v3.h> |
| |
| #include "base/logging.h" |
| #include "base/string_number_conversions.h" |
| #include "net/base/x509_openssl_util.h" |
| |
| namespace nxou = net::x509_openssl_util; |
| |
| namespace { |
| |
| std::string AlternativeWhenEmpty(const std::string& text, |
| const std::string& alternative) { |
| return text.empty() ? alternative : text; |
| } |
| |
| std::string GetKeyValuesFromName(X509_NAME* name) { |
| std::string ret; |
| int rdns = X509_NAME_entry_count(name) - 1; |
| for (int i = rdns; i >= 0; --i) { |
| std::string key; |
| std::string value; |
| if (!nxou::ParsePrincipalKeyAndValueByIndex(name, i, &key, &value)) |
| break; |
| ret += key; |
| ret += " = "; |
| ret += value; |
| ret += '\n'; |
| } |
| return ret; |
| } |
| |
| } // namepsace |
| |
| namespace x509_certificate_model { |
| |
| using net::X509Certificate; |
| |
| std::string GetCertNameOrNickname(X509Certificate::OSCertHandle cert_handle) { |
| // TODO(bulach): implement me. |
| return ""; |
| } |
| |
| std::string GetNickname(X509Certificate::OSCertHandle cert_handle) { |
| // TODO(jamescook): implement me. |
| return ""; |
| } |
| |
| std::string GetTokenName(X509Certificate::OSCertHandle cert_handle) { |
| // TODO(bulach): implement me. |
| return ""; |
| } |
| |
| std::string GetVersion(net::X509Certificate::OSCertHandle cert_handle) { |
| unsigned long version = X509_get_version(cert_handle); |
| if (version != ULONG_MAX) |
| return base::UintToString(version + 1); |
| return ""; |
| } |
| |
| net::CertType GetType(X509Certificate::OSCertHandle os_cert) { |
| // TODO(bulach): implement me. |
| return net::UNKNOWN_CERT; |
| } |
| |
| std::string GetEmailAddress(X509Certificate::OSCertHandle os_cert) { |
| // TODO(bulach): implement me. |
| return ""; |
| } |
| |
| void GetUsageStrings(X509Certificate::OSCertHandle cert_handle, |
| std::vector<std::string>* usages) { |
| // TODO(bulach): implement me. |
| } |
| |
| std::string GetKeyUsageString(X509Certificate::OSCertHandle cert_handle) { |
| // TODO(bulach): implement me. |
| return ""; |
| } |
| |
| std::string GetSerialNumberHexified( |
| X509Certificate::OSCertHandle cert_handle, |
| const std::string& alternative_text) { |
| ASN1_INTEGER* num = X509_get_serialNumber(cert_handle); |
| const char kSerialNumberSeparator = ':'; |
| std::string hex_string = ProcessRawBytesWithSeparators( |
| num->data, num->length, kSerialNumberSeparator, kSerialNumberSeparator); |
| return AlternativeWhenEmpty(hex_string, alternative_text); |
| } |
| |
| std::string GetIssuerCommonName( |
| X509Certificate::OSCertHandle cert_handle, |
| const std::string& alternative_text) { |
| std::string ret; |
| nxou::ParsePrincipalValueByNID(X509_get_issuer_name(cert_handle), |
| NID_commonName, &ret); |
| return AlternativeWhenEmpty(ret, alternative_text); |
| } |
| |
| std::string GetIssuerOrgName( |
| X509Certificate::OSCertHandle cert_handle, |
| const std::string& alternative_text) { |
| std::string ret; |
| nxou::ParsePrincipalValueByNID(X509_get_issuer_name(cert_handle), |
| NID_organizationName, &ret); |
| return AlternativeWhenEmpty(ret, alternative_text); |
| } |
| |
| std::string GetIssuerOrgUnitName( |
| X509Certificate::OSCertHandle cert_handle, |
| const std::string& alternative_text) { |
| std::string ret; |
| nxou::ParsePrincipalValueByNID(X509_get_issuer_name(cert_handle), |
| NID_organizationalUnitName, &ret); |
| return AlternativeWhenEmpty(ret, alternative_text); |
| } |
| |
| std::string GetSubjectOrgName( |
| X509Certificate::OSCertHandle cert_handle, |
| const std::string& alternative_text) { |
| std::string ret; |
| nxou::ParsePrincipalValueByNID(X509_get_subject_name(cert_handle), |
| NID_organizationName, &ret); |
| return AlternativeWhenEmpty(ret, alternative_text); |
| } |
| |
| std::string GetSubjectOrgUnitName( |
| X509Certificate::OSCertHandle cert_handle, |
| const std::string& alternative_text) { |
| std::string ret; |
| nxou::ParsePrincipalValueByNID(X509_get_subject_name(cert_handle), |
| NID_organizationalUnitName, &ret); |
| return AlternativeWhenEmpty(ret, alternative_text); |
| } |
| |
| std::string GetSubjectCommonName(X509Certificate::OSCertHandle cert_handle, |
| const std::string& alternative_text) { |
| std::string ret; |
| nxou::ParsePrincipalValueByNID(X509_get_subject_name(cert_handle), |
| NID_commonName, &ret); |
| return AlternativeWhenEmpty(ret, alternative_text); |
| } |
| |
| bool GetTimes(X509Certificate::OSCertHandle cert_handle, |
| base::Time* issued, base::Time* expires) { |
| return nxou::ParseDate(X509_get_notBefore(cert_handle), issued) && |
| nxou::ParseDate(X509_get_notAfter(cert_handle), expires); |
| } |
| |
| std::string GetTitle(net::X509Certificate::OSCertHandle cert_handle) { |
| // TODO(bulach): implement me. |
| return ""; |
| } |
| |
| std::string GetIssuerName(net::X509Certificate::OSCertHandle cert_handle) { |
| return GetKeyValuesFromName(X509_get_issuer_name(cert_handle)); |
| } |
| |
| std::string GetSubjectName(net::X509Certificate::OSCertHandle cert_handle) { |
| return GetKeyValuesFromName(X509_get_subject_name(cert_handle)); |
| } |
| |
| void GetEmailAddresses(net::X509Certificate::OSCertHandle cert_handle, |
| std::vector<std::string>* email_addresses) { |
| // TODO(bulach): implement me. |
| } |
| |
| void GetNicknameStringsFromCertList( |
| const std::vector<scoped_refptr<net::X509Certificate> >& certs, |
| const std::string& cert_expired, |
| const std::string& cert_not_yet_valid, |
| std::vector<std::string>* nick_names) { |
| // TODO(bulach): implement me. |
| } |
| |
| std::string GetPkcs11Id(net::X509Certificate::OSCertHandle cert_handle) { |
| // TODO(jamescook): implement me. |
| return ""; |
| } |
| |
| void GetExtensions( |
| const std::string& critical_label, |
| const std::string& non_critical_label, |
| net::X509Certificate::OSCertHandle cert_handle, |
| Extensions* extensions) { |
| // TODO(bulach): implement me. |
| } |
| |
| std::string HashCertSHA256(net::X509Certificate::OSCertHandle cert_handle) { |
| unsigned char sha256_data[SHA256_DIGEST_LENGTH] = {0}; |
| unsigned int sha256_size = sizeof(sha256_data); |
| int ret = X509_digest(cert_handle, EVP_sha256(), sha256_data, &sha256_size); |
| CHECK(ret); |
| CHECK_EQ(sha256_size, sizeof(sha256_data)); |
| return ProcessRawBytes(sha256_data, sha256_size); |
| } |
| |
| std::string HashCertSHA1(net::X509Certificate::OSCertHandle cert_handle) { |
| unsigned char sha1_data[SHA_DIGEST_LENGTH] = {0}; |
| unsigned int sha1_size = sizeof(sha1_data); |
| int ret = X509_digest(cert_handle, EVP_sha1(), sha1_data, &sha1_size); |
| CHECK(ret); |
| CHECK_EQ(sha1_size, sizeof(sha1_data)); |
| return ProcessRawBytes(sha1_data, sha1_size); |
| } |
| |
| void GetCertChainFromCert(net::X509Certificate::OSCertHandle cert_handle, |
| net::X509Certificate::OSCertHandles* cert_handles) { |
| // TODO(bulach): how to get the chain out of a certificate? |
| cert_handles->push_back(net::X509Certificate::DupOSCertHandle(cert_handle)); |
| } |
| |
| void DestroyCertChain(net::X509Certificate::OSCertHandles* cert_handles) { |
| for (net::X509Certificate::OSCertHandles::iterator i = cert_handles->begin(); |
| i != cert_handles->end(); ++i) |
| X509_free(*i); |
| cert_handles->clear(); |
| } |
| |
| std::string GetDerString(net::X509Certificate::OSCertHandle cert_handle) { |
| // TODO(bulach): implement me. |
| return ""; |
| } |
| |
| std::string GetCMSString(const net::X509Certificate::OSCertHandles& cert_chain, |
| size_t start, size_t end) { |
| // TODO(bulach): implement me. |
| return ""; |
| } |
| |
| std::string ProcessSecAlgorithmSignature( |
| net::X509Certificate::OSCertHandle cert_handle) { |
| // TODO(bulach): implement me. |
| return ""; |
| } |
| |
| std::string ProcessSecAlgorithmSubjectPublicKey( |
| net::X509Certificate::OSCertHandle cert_handle) { |
| // TODO(bulach): implement me. |
| return ""; |
| } |
| |
| std::string ProcessSecAlgorithmSignatureWrap( |
| net::X509Certificate::OSCertHandle cert_handle) { |
| // TODO(bulach): implement me. |
| return ""; |
| } |
| |
| std::string ProcessSubjectPublicKeyInfo( |
| net::X509Certificate::OSCertHandle cert_handle) { |
| // TODO(bulach): implement me. |
| return ""; |
| } |
| |
| std::string ProcessRawBitsSignatureWrap( |
| net::X509Certificate::OSCertHandle cert_handle) { |
| // TODO(bulach): implement me. |
| return ""; |
| } |
| |
| void RegisterDynamicOids() { |
| } |
| |
| } // namespace x509_certificate_model |