OLD | NEW |
---|---|
1 /* ***** BEGIN LICENSE BLOCK ***** | 1 /* ***** BEGIN LICENSE BLOCK ***** |
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | 2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 |
3 * | 3 * |
4 * The contents of this file are subject to the Mozilla Public License Version | 4 * The contents of this file are subject to the Mozilla Public License Version |
5 * 1.1 (the "License"); you may not use this file except in compliance with | 5 * 1.1 (the "License"); you may not use this file except in compliance with |
6 * the License. You may obtain a copy of the License at | 6 * the License. You may obtain a copy of the License at |
7 * http://www.mozilla.org/MPL/ | 7 * http://www.mozilla.org/MPL/ |
8 * | 8 * |
9 * Software distributed under the License is distributed on an "AS IS" basis, | 9 * Software distributed under the License is distributed on an "AS IS" basis, |
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | 10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License |
(...skipping 28 matching lines...) Expand all Loading... | |
39 * ***** END LICENSE BLOCK ***** */ | 39 * ***** END LICENSE BLOCK ***** */ |
40 | 40 |
41 #include "chrome/third_party/mozilla_security_manager/nsNSSCertHelper.h" | 41 #include "chrome/third_party/mozilla_security_manager/nsNSSCertHelper.h" |
42 | 42 |
43 #include <certdb.h> | 43 #include <certdb.h> |
44 #include <keyhi.h> | 44 #include <keyhi.h> |
45 #include <prprf.h> | 45 #include <prprf.h> |
46 #include <unicode/uidna.h> | 46 #include <unicode/uidna.h> |
47 | 47 |
48 #include "base/i18n/number_formatting.h" | 48 #include "base/i18n/number_formatting.h" |
49 #include "base/lazy_instance.h" | |
49 #include "base/strings/string_number_conversions.h" | 50 #include "base/strings/string_number_conversions.h" |
50 #include "base/strings/stringprintf.h" | 51 #include "base/strings/stringprintf.h" |
51 #include "base/strings/utf_string_conversions.h" | 52 #include "base/strings/utf_string_conversions.h" |
52 #include "chrome/common/net/x509_certificate_model.h" | 53 #include "chrome/common/net/x509_certificate_model.h" |
53 #include "crypto/scoped_nss_types.h" | 54 #include "crypto/scoped_nss_types.h" |
54 #include "grit/generated_resources.h" | 55 #include "grit/generated_resources.h" |
55 #include "net/base/ip_endpoint.h" | 56 #include "net/base/ip_endpoint.h" |
56 #include "net/base/net_util.h" | 57 #include "net/base/net_util.h" |
57 #include "ui/base/l10n/l10n_util.h" | 58 #include "ui/base/l10n/l10n_util.h" |
58 | 59 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
97 } | 98 } |
98 DCHECK_NE(rv, SEC_OID_UNKNOWN) << oid_string; | 99 DCHECK_NE(rv, SEC_OID_UNKNOWN) << oid_string; |
99 return rv; | 100 return rv; |
100 } | 101 } |
101 | 102 |
102 // Format a SECItem as a space separated string, with 16 bytes on each line. | 103 // Format a SECItem as a space separated string, with 16 bytes on each line. |
103 std::string ProcessRawBytes(SECItem* data) { | 104 std::string ProcessRawBytes(SECItem* data) { |
104 return x509_certificate_model::ProcessRawBytes(data->data, data->len); | 105 return x509_certificate_model::ProcessRawBytes(data->data, data->len); |
105 } | 106 } |
106 | 107 |
107 } // namespace | |
108 | |
109 namespace mozilla_security_manager { | |
110 | |
111 SECOidTag ms_cert_ext_certtype = SEC_OID_UNKNOWN; | 108 SECOidTag ms_cert_ext_certtype = SEC_OID_UNKNOWN; |
112 SECOidTag ms_certsrv_ca_version = SEC_OID_UNKNOWN; | 109 SECOidTag ms_certsrv_ca_version = SEC_OID_UNKNOWN; |
113 SECOidTag ms_nt_principal_name = SEC_OID_UNKNOWN; | 110 SECOidTag ms_nt_principal_name = SEC_OID_UNKNOWN; |
114 SECOidTag ms_ntds_replication = SEC_OID_UNKNOWN; | 111 SECOidTag ms_ntds_replication = SEC_OID_UNKNOWN; |
115 SECOidTag eku_ms_individual_code_signing = SEC_OID_UNKNOWN; | 112 SECOidTag eku_ms_individual_code_signing = SEC_OID_UNKNOWN; |
116 SECOidTag eku_ms_commercial_code_signing = SEC_OID_UNKNOWN; | 113 SECOidTag eku_ms_commercial_code_signing = SEC_OID_UNKNOWN; |
117 SECOidTag eku_ms_trust_list_signing = SEC_OID_UNKNOWN; | 114 SECOidTag eku_ms_trust_list_signing = SEC_OID_UNKNOWN; |
118 SECOidTag eku_ms_time_stamping = SEC_OID_UNKNOWN; | 115 SECOidTag eku_ms_time_stamping = SEC_OID_UNKNOWN; |
119 SECOidTag eku_ms_server_gated_crypto = SEC_OID_UNKNOWN; | 116 SECOidTag eku_ms_server_gated_crypto = SEC_OID_UNKNOWN; |
120 SECOidTag eku_ms_encrypting_file_system = SEC_OID_UNKNOWN; | 117 SECOidTag eku_ms_encrypting_file_system = SEC_OID_UNKNOWN; |
121 SECOidTag eku_ms_file_recovery = SEC_OID_UNKNOWN; | 118 SECOidTag eku_ms_file_recovery = SEC_OID_UNKNOWN; |
122 SECOidTag eku_ms_windows_hardware_driver_verification = SEC_OID_UNKNOWN; | 119 SECOidTag eku_ms_windows_hardware_driver_verification = SEC_OID_UNKNOWN; |
123 SECOidTag eku_ms_qualified_subordination = SEC_OID_UNKNOWN; | 120 SECOidTag eku_ms_qualified_subordination = SEC_OID_UNKNOWN; |
124 SECOidTag eku_ms_key_recovery = SEC_OID_UNKNOWN; | 121 SECOidTag eku_ms_key_recovery = SEC_OID_UNKNOWN; |
125 SECOidTag eku_ms_document_signing = SEC_OID_UNKNOWN; | 122 SECOidTag eku_ms_document_signing = SEC_OID_UNKNOWN; |
126 SECOidTag eku_ms_lifetime_signing = SEC_OID_UNKNOWN; | 123 SECOidTag eku_ms_lifetime_signing = SEC_OID_UNKNOWN; |
127 SECOidTag eku_ms_smart_card_logon = SEC_OID_UNKNOWN; | 124 SECOidTag eku_ms_smart_card_logon = SEC_OID_UNKNOWN; |
128 SECOidTag eku_ms_key_recovery_agent = SEC_OID_UNKNOWN; | 125 SECOidTag eku_ms_key_recovery_agent = SEC_OID_UNKNOWN; |
129 SECOidTag eku_netscape_international_step_up = SEC_OID_UNKNOWN; | 126 SECOidTag eku_netscape_international_step_up = SEC_OID_UNKNOWN; |
130 SECOidTag cert_attribute_business_category = SEC_OID_UNKNOWN; | 127 SECOidTag cert_attribute_business_category = SEC_OID_UNKNOWN; |
131 SECOidTag cert_attribute_ev_incorporation_country = SEC_OID_UNKNOWN; | 128 SECOidTag cert_attribute_ev_incorporation_country = SEC_OID_UNKNOWN; |
132 | 129 |
133 void RegisterDynamicOids() { | 130 class DynamicOidRegisterer { |
134 if (ms_cert_ext_certtype != SEC_OID_UNKNOWN) | 131 public: |
135 return; | 132 DynamicOidRegisterer() { |
133 ms_cert_ext_certtype = RegisterDynamicOid("1.3.6.1.4.1.311.20.2"); | |
134 ms_certsrv_ca_version = RegisterDynamicOid("1.3.6.1.4.1.311.21.1"); | |
135 ms_nt_principal_name = RegisterDynamicOid("1.3.6.1.4.1.311.20.2.3"); | |
136 ms_ntds_replication = RegisterDynamicOid("1.3.6.1.4.1.311.25.1"); | |
136 | 137 |
137 ms_cert_ext_certtype = RegisterDynamicOid("1.3.6.1.4.1.311.20.2"); | 138 eku_ms_individual_code_signing = RegisterDynamicOid("1.3.6.1.4.1.311.2.1.21" ); |
138 ms_certsrv_ca_version = RegisterDynamicOid("1.3.6.1.4.1.311.21.1"); | 139 eku_ms_commercial_code_signing = RegisterDynamicOid("1.3.6.1.4.1.311.2.1.22" ); |
139 ms_nt_principal_name = RegisterDynamicOid("1.3.6.1.4.1.311.20.2.3"); | 140 eku_ms_trust_list_signing = RegisterDynamicOid("1.3.6.1.4.1.311.10.3.1"); |
140 ms_ntds_replication = RegisterDynamicOid("1.3.6.1.4.1.311.25.1"); | 141 eku_ms_time_stamping = RegisterDynamicOid("1.3.6.1.4.1.311.10.3.2"); |
142 eku_ms_server_gated_crypto = RegisterDynamicOid("1.3.6.1.4.1.311.10.3.3"); | |
143 eku_ms_encrypting_file_system = RegisterDynamicOid("1.3.6.1.4.1.311.10.3.4") ; | |
144 eku_ms_file_recovery = RegisterDynamicOid("1.3.6.1.4.1.311.10.3.4.1"); | |
145 eku_ms_windows_hardware_driver_verification = RegisterDynamicOid( | |
146 "1.3.6.1.4.1.311.10.3.5"); | |
147 eku_ms_qualified_subordination = RegisterDynamicOid( | |
148 "1.3.6.1.4.1.311.10.3.10"); | |
149 eku_ms_key_recovery = RegisterDynamicOid("1.3.6.1.4.1.311.10.3.11"); | |
150 eku_ms_document_signing = RegisterDynamicOid("1.3.6.1.4.1.311.10.3.12"); | |
151 eku_ms_lifetime_signing = RegisterDynamicOid("1.3.6.1.4.1.311.10.3.13"); | |
152 eku_ms_smart_card_logon = RegisterDynamicOid("1.3.6.1.4.1.311.20.2.2"); | |
153 eku_ms_key_recovery_agent = RegisterDynamicOid("1.3.6.1.4.1.311.21.6"); | |
154 eku_netscape_international_step_up = RegisterDynamicOid( | |
155 "2.16.840.1.113730.4.1"); | |
141 | 156 |
142 eku_ms_individual_code_signing = RegisterDynamicOid("1.3.6.1.4.1.311.2.1.21"); | 157 // These two OIDs will be built-in as SEC_OID_BUSINESS_CATEGORY and |
143 eku_ms_commercial_code_signing = RegisterDynamicOid("1.3.6.1.4.1.311.2.1.22"); | 158 // SEC_OID_EV_INCORPORATION_COUNTRY starting in NSS 3.13. Until then, |
144 eku_ms_trust_list_signing = RegisterDynamicOid("1.3.6.1.4.1.311.10.3.1"); | 159 // we need to add them dynamically. |
145 eku_ms_time_stamping = RegisterDynamicOid("1.3.6.1.4.1.311.10.3.2"); | 160 cert_attribute_business_category = RegisterDynamicOid("2.5.4.15"); |
146 eku_ms_server_gated_crypto = RegisterDynamicOid("1.3.6.1.4.1.311.10.3.3"); | 161 cert_attribute_ev_incorporation_country = RegisterDynamicOid( |
147 eku_ms_encrypting_file_system = RegisterDynamicOid("1.3.6.1.4.1.311.10.3.4"); | 162 "1.3.6.1.4.1.311.60.2.1.3"); |
148 eku_ms_file_recovery = RegisterDynamicOid("1.3.6.1.4.1.311.10.3.4.1"); | 163 } |
149 eku_ms_windows_hardware_driver_verification = RegisterDynamicOid( | 164 }; |
150 "1.3.6.1.4.1.311.10.3.5"); | |
151 eku_ms_qualified_subordination = RegisterDynamicOid( | |
152 "1.3.6.1.4.1.311.10.3.10"); | |
153 eku_ms_key_recovery = RegisterDynamicOid("1.3.6.1.4.1.311.10.3.11"); | |
154 eku_ms_document_signing = RegisterDynamicOid("1.3.6.1.4.1.311.10.3.12"); | |
155 eku_ms_lifetime_signing = RegisterDynamicOid("1.3.6.1.4.1.311.10.3.13"); | |
156 eku_ms_smart_card_logon = RegisterDynamicOid("1.3.6.1.4.1.311.20.2.2"); | |
157 eku_ms_key_recovery_agent = RegisterDynamicOid("1.3.6.1.4.1.311.21.6"); | |
158 eku_netscape_international_step_up = RegisterDynamicOid( | |
159 "2.16.840.1.113730.4.1"); | |
160 | 165 |
161 // These two OIDs will be built-in as SEC_OID_BUSINESS_CATEGORY and | 166 static base::LazyInstance<DynamicOidRegisterer>::Leaky |
162 // SEC_OID_EV_INCORPORATION_COUNTRY starting in NSS 3.13. Until then, | 167 g_dynamic_oid_registerer = LAZY_INSTANCE_INITIALIZER; |
163 // we need to add them dynamically. | 168 |
164 cert_attribute_business_category = RegisterDynamicOid("2.5.4.15"); | 169 } // namespace |
165 cert_attribute_ev_incorporation_country = RegisterDynamicOid( | 170 |
166 "1.3.6.1.4.1.311.60.2.1.3"); | 171 namespace mozilla_security_manager { |
167 } | |
168 | 172 |
169 std::string DumpOidString(SECItem* oid) { | 173 std::string DumpOidString(SECItem* oid) { |
170 char* pr_string = CERT_GetOidString(oid); | 174 char* pr_string = CERT_GetOidString(oid); |
171 if (pr_string) { | 175 if (pr_string) { |
172 std::string rv = pr_string; | 176 std::string rv = pr_string; |
173 PR_smprintf_free(pr_string); | 177 PR_smprintf_free(pr_string); |
174 return rv; | 178 return rv; |
175 } | 179 } |
176 | 180 |
177 return ProcessRawBytes(oid); | 181 return ProcessRawBytes(oid); |
178 } | 182 } |
179 | 183 |
180 std::string GetOIDText(SECItem* oid) { | 184 std::string GetOIDText(SECItem* oid) { |
185 g_dynamic_oid_registerer.Get(); | |
186 | |
181 int string_id; | 187 int string_id; |
182 SECOidTag oid_tag = SECOID_FindOIDTag(oid); | 188 SECOidTag oid_tag = SECOID_FindOIDTag(oid); |
183 switch (oid_tag) { | 189 switch (oid_tag) { |
184 case SEC_OID_AVA_COMMON_NAME: | 190 case SEC_OID_AVA_COMMON_NAME: |
185 string_id = IDS_CERT_OID_AVA_COMMON_NAME; | 191 string_id = IDS_CERT_OID_AVA_COMMON_NAME; |
186 break; | 192 break; |
187 case SEC_OID_AVA_STATE_OR_PROVINCE: | 193 case SEC_OID_AVA_STATE_OR_PROVINCE: |
188 string_id = IDS_CERT_OID_AVA_STATE_OR_PROVINCE; | 194 string_id = IDS_CERT_OID_AVA_STATE_OR_PROVINCE; |
189 break; | 195 break; |
190 case SEC_OID_AVA_ORGANIZATION_NAME: | 196 case SEC_OID_AVA_ORGANIZATION_NAME: |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
463 CERTGeneralName* current) { | 469 CERTGeneralName* current) { |
464 DCHECK(current); | 470 DCHECK(current); |
465 | 471 |
466 std::string key; | 472 std::string key; |
467 std::string value; | 473 std::string value; |
468 | 474 |
469 switch (current->type) { | 475 switch (current->type) { |
470 case certOtherName: { | 476 case certOtherName: { |
471 key = GetOIDText(¤t->name.OthName.oid); | 477 key = GetOIDText(¤t->name.OthName.oid); |
472 SECOidTag oid_tag = SECOID_FindOIDTag(¤t->name.OthName.oid); | 478 SECOidTag oid_tag = SECOID_FindOIDTag(¤t->name.OthName.oid); |
473 if (oid_tag == ms_nt_principal_name) { | 479 if (oid_tag == ms_nt_principal_name) { |
Ryan Sleevi
2014/05/13 01:12:12
Need to call the lazy instance before here
mattm
2014/05/13 01:52:33
The GetOIDText should do it already, so I'll just
| |
474 // The type of this name is apparently nowhere explicitly | 480 // The type of this name is apparently nowhere explicitly |
475 // documented. However, in the generated templates, it is always | 481 // documented. However, in the generated templates, it is always |
476 // UTF-8. So try to decode this as UTF-8; if that fails, dump the | 482 // UTF-8. So try to decode this as UTF-8; if that fails, dump the |
477 // raw data. | 483 // raw data. |
478 SECItem decoded; | 484 SECItem decoded; |
479 if (SEC_ASN1DecodeItem(arena, &decoded, | 485 if (SEC_ASN1DecodeItem(arena, &decoded, |
480 SEC_ASN1_GET(SEC_UTF8StringTemplate), | 486 SEC_ASN1_GET(SEC_UTF8StringTemplate), |
481 ¤t->name.OthName.name) == SECSuccess) { | 487 ¤t->name.OthName.name) == SECSuccess) { |
482 value = std::string(reinterpret_cast<char*>(decoded.data), | 488 value = std::string(reinterpret_cast<char*>(decoded.data), |
483 decoded.len); | 489 decoded.len); |
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1015 case SEC_OID_NS_CERT_EXT_CA_REVOCATION_URL: | 1021 case SEC_OID_NS_CERT_EXT_CA_REVOCATION_URL: |
1016 case SEC_OID_NS_CERT_EXT_CA_CERT_URL: | 1022 case SEC_OID_NS_CERT_EXT_CA_CERT_URL: |
1017 case SEC_OID_NS_CERT_EXT_CERT_RENEWAL_URL: | 1023 case SEC_OID_NS_CERT_EXT_CERT_RENEWAL_URL: |
1018 case SEC_OID_NS_CERT_EXT_CA_POLICY_URL: | 1024 case SEC_OID_NS_CERT_EXT_CA_POLICY_URL: |
1019 case SEC_OID_NS_CERT_EXT_HOMEPAGE_URL: | 1025 case SEC_OID_NS_CERT_EXT_HOMEPAGE_URL: |
1020 case SEC_OID_NS_CERT_EXT_COMMENT: | 1026 case SEC_OID_NS_CERT_EXT_COMMENT: |
1021 case SEC_OID_NS_CERT_EXT_SSL_SERVER_NAME: | 1027 case SEC_OID_NS_CERT_EXT_SSL_SERVER_NAME: |
1022 case SEC_OID_NS_CERT_EXT_LOST_PASSWORD_URL: | 1028 case SEC_OID_NS_CERT_EXT_LOST_PASSWORD_URL: |
1023 return ProcessIA5String(extension_data); | 1029 return ProcessIA5String(extension_data); |
1024 default: | 1030 default: |
1025 if (oid_tag == ms_cert_ext_certtype) | 1031 if (oid_tag == ms_cert_ext_certtype) |
Ryan Sleevi
2014/05/13 01:12:12
Need to call the lazy instance before here
mattm
2014/05/13 01:52:33
Ah, right. I guess it actually needs to be done be
| |
1026 return ProcessBMPString(extension_data); | 1032 return ProcessBMPString(extension_data); |
1027 return ProcessRawBytes(extension_data); | 1033 return ProcessRawBytes(extension_data); |
1028 } | 1034 } |
1029 } | 1035 } |
1030 | 1036 |
1031 std::string ProcessSubjectPublicKeyInfo(CERTSubjectPublicKeyInfo* spki) { | 1037 std::string ProcessSubjectPublicKeyInfo(CERTSubjectPublicKeyInfo* spki) { |
1032 std::string rv; | 1038 std::string rv; |
1033 SECKEYPublicKey* key = SECKEY_ExtractPublicKey(spki); | 1039 SECKEYPublicKey* key = SECKEY_ExtractPublicKey(spki); |
1034 if (key) { | 1040 if (key) { |
1035 switch (key->keyType) { | 1041 switch (key->keyType) { |
(...skipping 27 matching lines...) Expand all Loading... | |
1063 return net::USER_CERT; | 1069 return net::USER_CERT; |
1064 if ((all_flags & CERTDB_VALID_CA) || CERT_IsCACert(cert, NULL)) | 1070 if ((all_flags & CERTDB_VALID_CA) || CERT_IsCACert(cert, NULL)) |
1065 return net::CA_CERT; | 1071 return net::CA_CERT; |
1066 // TODO(mattm): http://crbug.com/128633. | 1072 // TODO(mattm): http://crbug.com/128633. |
1067 if (trust.sslFlags & CERTDB_TERMINAL_RECORD) | 1073 if (trust.sslFlags & CERTDB_TERMINAL_RECORD) |
1068 return net::SERVER_CERT; | 1074 return net::SERVER_CERT; |
1069 return net::OTHER_CERT; | 1075 return net::OTHER_CERT; |
1070 } | 1076 } |
1071 | 1077 |
1072 } // namespace mozilla_security_manager | 1078 } // namespace mozilla_security_manager |
OLD | NEW |