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 |
jochen (gone - plz use gerrit)
2014/05/15 10:10:51
i'm not sure I understand the reason for this chan
| |
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 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
462 std::string ProcessGeneralName(PRArenaPool* arena, | 468 std::string ProcessGeneralName(PRArenaPool* arena, |
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); |
478 // g_dynamic_oid_registerer.Get() will have been run by GetOIDText. | |
472 SECOidTag oid_tag = SECOID_FindOIDTag(¤t->name.OthName.oid); | 479 SECOidTag oid_tag = SECOID_FindOIDTag(¤t->name.OthName.oid); |
473 if (oid_tag == ms_nt_principal_name) { | 480 if (oid_tag == ms_nt_principal_name) { |
474 // The type of this name is apparently nowhere explicitly | 481 // The type of this name is apparently nowhere explicitly |
475 // documented. However, in the generated templates, it is always | 482 // 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 | 483 // UTF-8. So try to decode this as UTF-8; if that fails, dump the |
477 // raw data. | 484 // raw data. |
478 SECItem decoded; | 485 SECItem decoded; |
479 if (SEC_ASN1DecodeItem(arena, &decoded, | 486 if (SEC_ASN1DecodeItem(arena, &decoded, |
480 SEC_ASN1_GET(SEC_UTF8StringTemplate), | 487 SEC_ASN1_GET(SEC_UTF8StringTemplate), |
481 ¤t->name.OthName.name) == SECSuccess) { | 488 ¤t->name.OthName.name) == SECSuccess) { |
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
978 else | 985 else |
979 rv += l10n_util::GetStringFUTF8(IDS_CERT_EXT_KEY_USAGE_FORMAT, | 986 rv += l10n_util::GetStringFUTF8(IDS_CERT_EXT_KEY_USAGE_FORMAT, |
980 base::UTF8ToUTF16(oid_text), | 987 base::UTF8ToUTF16(oid_text), |
981 base::UTF8ToUTF16(oid_dump)); | 988 base::UTF8ToUTF16(oid_dump)); |
982 rv += '\n'; | 989 rv += '\n'; |
983 } | 990 } |
984 CERT_DestroyOidSequence(extension_key_usage); | 991 CERT_DestroyOidSequence(extension_key_usage); |
985 return rv; | 992 return rv; |
986 } | 993 } |
987 | 994 |
988 std::string ProcessExtensionData(SECOidTag oid_tag, SECItem* extension_data) { | 995 std::string ProcessExtensionData(CERTCertExtension* extension) { |
996 g_dynamic_oid_registerer.Get(); | |
997 SECOidTag oid_tag = SECOID_FindOIDTag(&extension->id); | |
998 SECItem* extension_data = &extension->value; | |
999 | |
989 // This (and its sub-functions) are based on the same-named functions in | 1000 // This (and its sub-functions) are based on the same-named functions in |
990 // security/manager/ssl/src/nsNSSCertHelper.cpp. | 1001 // security/manager/ssl/src/nsNSSCertHelper.cpp. |
991 switch (oid_tag) { | 1002 switch (oid_tag) { |
992 case SEC_OID_NS_CERT_EXT_CERT_TYPE: | 1003 case SEC_OID_NS_CERT_EXT_CERT_TYPE: |
993 return ProcessNSCertTypeExtension(extension_data); | 1004 return ProcessNSCertTypeExtension(extension_data); |
994 case SEC_OID_X509_KEY_USAGE: | 1005 case SEC_OID_X509_KEY_USAGE: |
995 return ProcessKeyUsageExtension(extension_data); | 1006 return ProcessKeyUsageExtension(extension_data); |
996 case SEC_OID_X509_BASIC_CONSTRAINTS: | 1007 case SEC_OID_X509_BASIC_CONSTRAINTS: |
997 return ProcessBasicConstraints(extension_data); | 1008 return ProcessBasicConstraints(extension_data); |
998 case SEC_OID_X509_EXT_KEY_USAGE: | 1009 case SEC_OID_X509_EXT_KEY_USAGE: |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1063 return net::USER_CERT; | 1074 return net::USER_CERT; |
1064 if ((all_flags & CERTDB_VALID_CA) || CERT_IsCACert(cert, NULL)) | 1075 if ((all_flags & CERTDB_VALID_CA) || CERT_IsCACert(cert, NULL)) |
1065 return net::CA_CERT; | 1076 return net::CA_CERT; |
1066 // TODO(mattm): http://crbug.com/128633. | 1077 // TODO(mattm): http://crbug.com/128633. |
1067 if (trust.sslFlags & CERTDB_TERMINAL_RECORD) | 1078 if (trust.sslFlags & CERTDB_TERMINAL_RECORD) |
1068 return net::SERVER_CERT; | 1079 return net::SERVER_CERT; |
1069 return net::OTHER_CERT; | 1080 return net::OTHER_CERT; |
1070 } | 1081 } |
1071 | 1082 |
1072 } // namespace mozilla_security_manager | 1083 } // namespace mozilla_security_manager |
OLD | NEW |