| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/cert/x509_certificate.h" | 5 #include "net/cert/x509_certificate.h" |
| 6 | 6 |
| 7 #include <CommonCrypto/CommonDigest.h> | 7 #include <CommonCrypto/CommonDigest.h> |
| 8 #include <CoreServices/CoreServices.h> | 8 #include <CoreServices/CoreServices.h> |
| 9 #include <Security/Security.h> | 9 #include <Security/Security.h> |
| 10 | 10 |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 } | 199 } |
| 200 } | 200 } |
| 201 | 201 |
| 202 struct CSSMOIDString { | 202 struct CSSMOIDString { |
| 203 const CSSM_OID* oid_; | 203 const CSSM_OID* oid_; |
| 204 std::string string_; | 204 std::string string_; |
| 205 }; | 205 }; |
| 206 | 206 |
| 207 typedef std::vector<CSSMOIDString> CSSMOIDStringVector; | 207 typedef std::vector<CSSMOIDString> CSSMOIDStringVector; |
| 208 | 208 |
| 209 bool CERTNameToCSSMOIDVector(CERTName* name, CSSMOIDStringVector* out_values) { | |
| 210 struct OIDCSSMMap { | |
| 211 SECOidTag sec_OID_; | |
| 212 const CSSM_OID* cssm_OID_; | |
| 213 }; | |
| 214 | |
| 215 const OIDCSSMMap kOIDs[] = { | |
| 216 { SEC_OID_AVA_COMMON_NAME, &CSSMOID_CommonName }, | |
| 217 { SEC_OID_AVA_COUNTRY_NAME, &CSSMOID_CountryName }, | |
| 218 { SEC_OID_AVA_LOCALITY, &CSSMOID_LocalityName }, | |
| 219 { SEC_OID_AVA_STATE_OR_PROVINCE, &CSSMOID_StateProvinceName }, | |
| 220 { SEC_OID_AVA_STREET_ADDRESS, &CSSMOID_StreetAddress }, | |
| 221 { SEC_OID_AVA_ORGANIZATION_NAME, &CSSMOID_OrganizationName }, | |
| 222 { SEC_OID_AVA_ORGANIZATIONAL_UNIT_NAME, &CSSMOID_OrganizationalUnitName }, | |
| 223 { SEC_OID_AVA_DN_QUALIFIER, &CSSMOID_DNQualifier }, | |
| 224 { SEC_OID_RFC1274_UID, &CSSMOID_UniqueIdentifier }, | |
| 225 { SEC_OID_PKCS9_EMAIL_ADDRESS, &CSSMOID_EmailAddress }, | |
| 226 }; | |
| 227 | |
| 228 CERTRDN** rdns = name->rdns; | |
| 229 for (size_t rdn = 0; rdns[rdn]; ++rdn) { | |
| 230 CERTAVA** avas = rdns[rdn]->avas; | |
| 231 for (size_t pair = 0; avas[pair] != 0; ++pair) { | |
| 232 SECOidTag tag = CERT_GetAVATag(avas[pair]); | |
| 233 if (tag == SEC_OID_UNKNOWN) { | |
| 234 return false; | |
| 235 } | |
| 236 CSSMOIDString oidString; | |
| 237 bool found_oid = false; | |
| 238 for (size_t oid = 0; oid < ARRAYSIZE_UNSAFE(kOIDs); ++oid) { | |
| 239 if (kOIDs[oid].sec_OID_ == tag) { | |
| 240 SECItem* decode_item = CERT_DecodeAVAValue(&avas[pair]->value); | |
| 241 if (!decode_item) | |
| 242 return false; | |
| 243 | |
| 244 // TODO(wtc): Pass decode_item to CERT_RFC1485_EscapeAndQuote. | |
| 245 std::string value(reinterpret_cast<char*>(decode_item->data), | |
| 246 decode_item->len); | |
| 247 oidString.oid_ = kOIDs[oid].cssm_OID_; | |
| 248 oidString.string_ = value; | |
| 249 out_values->push_back(oidString); | |
| 250 SECITEM_FreeItem(decode_item, PR_TRUE); | |
| 251 found_oid = true; | |
| 252 break; | |
| 253 } | |
| 254 } | |
| 255 if (!found_oid) { | |
| 256 DLOG(ERROR) << "Unrecognized OID: " << tag; | |
| 257 } | |
| 258 } | |
| 259 } | |
| 260 return true; | |
| 261 } | |
| 262 | |
| 263 class ScopedCertName { | 209 class ScopedCertName { |
| 264 public: | 210 public: |
| 265 explicit ScopedCertName(CERTName* name) : name_(name) { } | 211 explicit ScopedCertName(CERTName* name) : name_(name) { } |
| 266 ~ScopedCertName() { | 212 ~ScopedCertName() { |
| 267 if (name_) CERT_DestroyName(name_); | 213 if (name_) CERT_DestroyName(name_); |
| 268 } | 214 } |
| 269 operator CERTName*() { return name_; } | 215 operator CERTName*() { return name_; } |
| 270 | 216 |
| 271 private: | 217 private: |
| 272 CERTName* name_; | 218 CERTName* name_; |
| (...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 602 *type = kPublicKeyTypeDH; | 548 *type = kPublicKeyTypeDH; |
| 603 break; | 549 break; |
| 604 default: | 550 default: |
| 605 *type = kPublicKeyTypeUnknown; | 551 *type = kPublicKeyTypeUnknown; |
| 606 *size_bits = 0; | 552 *size_bits = 0; |
| 607 break; | 553 break; |
| 608 } | 554 } |
| 609 } | 555 } |
| 610 | 556 |
| 611 } // namespace net | 557 } // namespace net |
| OLD | NEW |