summaryrefslogtreecommitdiffstats
path: root/net/base
diff options
context:
space:
mode:
authorwtc@chromium.org <wtc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-02 01:45:55 +0000
committerwtc@chromium.org <wtc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-02 01:45:55 +0000
commit7548cebee69f8c560e0e3e14e220f237e3112a55 (patch)
treebed2cc6da8a63177342c06b4c30e8ca30b9782ca /net/base
parent1858aad0023b6a6f34852f99f6ce4b51ec077e6f (diff)
downloadchromium_src-7548cebee69f8c560e0e3e14e220f237e3112a55.zip
chromium_src-7548cebee69f8c560e0e3e14e220f237e3112a55.tar.gz
chromium_src-7548cebee69f8c560e0e3e14e220f237e3112a55.tar.bz2
Map SEC_ERROR_OCSP_BAD_HTTP_RESPONSE (-8073) to
CERT_STATUS_UNABLE_TO_CHECK_REVOCATION. Change ParsePrincipal to take the decoded CERTName as argument. Use the NSS functions for getting the common name, locality name, state or province name, and country name because they escape the strings properly. R=dank BUG=none TEST=none (covered by existing unit tests) Review URL: http://codereview.chromium.org/248028 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@27819 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base')
-rw-r--r--net/base/x509_certificate_nss.cc58
1 files changed, 20 insertions, 38 deletions
diff --git a/net/base/x509_certificate_nss.cc b/net/base/x509_certificate_nss.cc
index 9b63b1e..84fc8f5 100644
--- a/net/base/x509_certificate_nss.cc
+++ b/net/base/x509_certificate_nss.cc
@@ -156,6 +156,7 @@ int MapCertErrorToCertStatus(int err) {
case SEC_ERROR_CA_CERT_INVALID:
return CERT_STATUS_AUTHORITY_INVALID;
// TODO(port): map CERT_STATUS_NO_REVOCATION_MECHANISM.
+ case SEC_ERROR_OCSP_BAD_HTTP_RESPONSE:
case SEC_ERROR_OCSP_SERVER_ERROR:
return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION;
case SEC_ERROR_REVOKED_CERTIFICATE:
@@ -227,49 +228,29 @@ base::Time PRTimeToBaseTime(PRTime prtime) {
return base::Time::FromUTCExploded(exploded);
}
-void ParsePrincipal(SECItem* der_name,
- X509Certificate::Principal* principal) {
- CERTName name;
- PRArenaPool* arena = NULL;
-
- arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
- DCHECK(arena != NULL);
- if (arena == NULL)
- return;
-
- // TODO(dkegel): is CERT_NameTemplate what we always want here?
- SECStatus rv;
- rv = SEC_QuickDERDecodeItem(arena, &name, CERT_NameTemplate, der_name);
- DCHECK(rv == SECSuccess);
- if ( rv != SECSuccess ) {
- PORT_FreeArena(arena, PR_FALSE);
- return;
- }
-
- std::vector<std::string> common_names, locality_names, state_names,
- country_names;
+typedef char* (*CERTGetNameFunc)(CERTName* name);
+void ParsePrincipal(CERTName* name,
+ X509Certificate::Principal* principal) {
// TODO(jcampan): add business_category and serial_number.
+ // TODO(wtc): NSS has the CERT_GetOrgName, CERT_GetOrgUnitName, and
+ // CERT_GetDomainComponentName functions, but they return only the most
+ // general (the first) RDN. NSS doesn't have a function for the street
+ // address.
static const SECOidTag kOIDs[] = {
- SEC_OID_AVA_COMMON_NAME,
- SEC_OID_AVA_LOCALITY,
- SEC_OID_AVA_STATE_OR_PROVINCE,
- SEC_OID_AVA_COUNTRY_NAME,
SEC_OID_AVA_STREET_ADDRESS,
SEC_OID_AVA_ORGANIZATION_NAME,
SEC_OID_AVA_ORGANIZATIONAL_UNIT_NAME,
SEC_OID_AVA_DC };
std::vector<std::string>* values[] = {
- &common_names, &locality_names,
- &state_names, &country_names,
&principal->street_addresses,
&principal->organization_names,
&principal->organization_unit_names,
&principal->domain_components };
DCHECK(arraysize(kOIDs) == arraysize(values));
- CERTRDN** rdns = name.rdns;
+ CERTRDN** rdns = name->rdns;
for (size_t rdn = 0; rdns[rdn]; ++rdn) {
CERTAVA** avas = rdns[rdn]->avas;
for (size_t pair = 0; avas[pair] != 0; ++pair) {
@@ -279,6 +260,7 @@ void ParsePrincipal(SECItem* der_name,
SECItem* decode_item = CERT_DecodeAVAValue(&avas[pair]->value);
if (!decode_item)
break;
+ // TODO(wtc): Pass decode_item to CERT_RFC1485_EscapeAndQuote.
std::string value(reinterpret_cast<char*>(decode_item->data),
decode_item->len);
values[oid]->push_back(value);
@@ -289,18 +271,18 @@ void ParsePrincipal(SECItem* der_name,
}
}
- // We don't expect to have more than one CN, L, S, and C.
- std::vector<std::string>* single_value_lists[4] = {
- &common_names, &locality_names, &state_names, &country_names };
+ // CN, L, S, and C.
+ CERTGetNameFunc get_name_funcs[4] = {
+ CERT_GetCommonName, CERT_GetLocalityName,
+ CERT_GetStateName, CERT_GetCountryName };
std::string* single_values[4] = {
&principal->common_name, &principal->locality_name,
&principal->state_or_province_name, &principal->country_name };
- for (size_t i = 0; i < arraysize(single_value_lists); ++i) {
- DCHECK(single_value_lists[i]->size() <= 1);
- if (single_value_lists[i]->size() > 0)
- *(single_values[i]) = (*(single_value_lists[i]))[0];
+ for (size_t i = 0; i < arraysize(get_name_funcs); ++i) {
+ char* value = get_name_funcs[i](name);
+ single_values[i]->assign(value);
+ PORT_Free(value);
}
- PORT_FreeArena(arena, PR_FALSE);
}
void ParseDate(SECItem* der_date, base::Time* result) {
@@ -471,8 +453,8 @@ bool CheckCertPolicies(X509Certificate::OSCertHandle cert_handle,
} // namespace
void X509Certificate::Initialize() {
- ParsePrincipal(&cert_handle_->derSubject, &subject_);
- ParsePrincipal(&cert_handle_->derIssuer, &issuer_);
+ ParsePrincipal(&cert_handle_->subject, &subject_);
+ ParsePrincipal(&cert_handle_->issuer, &issuer_);
ParseDate(&cert_handle_->validity.notBefore, &valid_start_);
ParseDate(&cert_handle_->validity.notAfter, &valid_expiry_);