Chromium Code Reviews| 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 |