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 |