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 |
| 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 |