security/certverifier/ExtendedValidation.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/security/certverifier/ExtendedValidation.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,1053 @@
     1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
     1.5 + *
     1.6 + * This Source Code Form is subject to the terms of the Mozilla Public
     1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.9 +
    1.10 +#include "ExtendedValidation.h"
    1.11 +
    1.12 +#include "cert.h"
    1.13 +#include "certdb.h"
    1.14 +#include "base64.h"
    1.15 +#include "pkix/nullptr.h"
    1.16 +#include "pk11pub.h"
    1.17 +#include "secerr.h"
    1.18 +#include "prerror.h"
    1.19 +#include "prinit.h"
    1.20 +
    1.21 +#ifdef PR_LOGGING
    1.22 +extern PRLogModuleInfo* gPIPNSSLog;
    1.23 +#endif
    1.24 +
    1.25 +#define CONST_OID static const unsigned char
    1.26 +#define OI(x) { siDEROID, (unsigned char*) x, sizeof x }
    1.27 +
    1.28 +struct nsMyTrustedEVInfo
    1.29 +{
    1.30 +  const char* dotted_oid;
    1.31 +  const char* oid_name; // Set this to null to signal an invalid structure,
    1.32 +                  // (We can't have an empty list, so we'll use a dummy entry)
    1.33 +  SECOidTag oid_tag;
    1.34 +  const unsigned char ev_root_sha1_fingerprint[20];
    1.35 +  const char* issuer_base64;
    1.36 +  const char* serial_base64;
    1.37 +  CERTCertificate* cert;
    1.38 +};
    1.39 +
    1.40 +// HOWTO enable additional CA root certificates for EV:
    1.41 +//
    1.42 +// For each combination of "root certificate" and "policy OID",
    1.43 +// one entry must be added to the array named myTrustedEVInfos.
    1.44 +//
    1.45 +// We use the combination of "issuer name" and "serial number" to
    1.46 +// uniquely identify the certificate. In order to avoid problems
    1.47 +// because of encodings when comparing certificates, we don't
    1.48 +// use plain text representation, we rather use the original encoding
    1.49 +// as it can be found in the root certificate (in base64 format).
    1.50 +//
    1.51 +// We can use the NSS utility named "pp" to extract the encoding.
    1.52 +//
    1.53 +// Build standalone NSS including the NSS tools, then run
    1.54 +//   pp -t certificate-identity -i the-cert-filename
    1.55 +//
    1.56 +// You will need the output from sections "Issuer", "Fingerprint (SHA1)",
    1.57 +// "Issuer DER Base64" and "Serial DER Base64".
    1.58 +//
    1.59 +// The new section consists of 8 lines:
    1.60 +//
    1.61 +// - a comment that should contain the human readable issuer name
    1.62 +//   of the certificate, as printed by the pp tool
    1.63 +// - the EV policy OID that is associated to the EV grant
    1.64 +// - a text description of the EV policy OID. The array can contain
    1.65 +//   multiple entries with the same OID.
    1.66 +//   Please make sure to use the identical OID text description for
    1.67 +//   all entries with the same policy OID (use the text search
    1.68 +//   feature of your text editor to find duplicates).
    1.69 +//   When adding a new policy OID that is not yet contained in the array,
    1.70 +//   please make sure that your new description is different from
    1.71 +//   all the other descriptions (again use the text search feature
    1.72 +//   to be sure).
    1.73 +// - the constant SEC_OID_UNKNOWN
    1.74 +//   (it will be replaced at runtime with another identifier)
    1.75 +// - the SHA1 fingerprint
    1.76 +// - the "Issuer DER Base64" as printed by the pp tool.
    1.77 +//   Remove all whitespaces. If you use multiple lines, make sure that
    1.78 +//   only the final line will be followed by a comma.
    1.79 +// - the "Serial DER Base64" (as printed by pp)
    1.80 +// - nullptr
    1.81 +//
    1.82 +// After adding an entry, test it locally against the test site that
    1.83 +// has been provided by the CA. Note that you must use a version of NSS
    1.84 +// where the root certificate has already been added and marked as trusted
    1.85 +// for issueing SSL server certificates (at least).
    1.86 +//
    1.87 +// If you are able to connect to the site without certificate errors,
    1.88 +// but you don't see the EV status indicator, then most likely the CA
    1.89 +// has a problem in their infrastructure. The most common problems are
    1.90 +// related to the CA's OCSP infrastructure, either they use an incorrect
    1.91 +// OCSP signing certificate, or OCSP for the intermediate certificates
    1.92 +// isn't working, or OCSP isn't working at all.
    1.93 +
    1.94 +static struct nsMyTrustedEVInfo myTrustedEVInfos[] = {
    1.95 +  // IMPORTANT! When extending this list,
    1.96 +  // pairs of dotted_oid and oid_name should always be unique pairs.
    1.97 +  // In other words, if you add another list, that uses the same dotted_oid
    1.98 +  // as an existing entry, then please use the same oid_name.
    1.99 +#ifdef DEBUG
   1.100 +  // Debug EV certificates should all use the OID (repeating EV OID is OK):
   1.101 +  // 1.3.6.1.4.1.13769.666.666.666.1.500.9.1.
   1.102 +  // If you add or remove debug EV certs you must also modify IdentityInfoInit
   1.103 +  // (there is another #ifdef DEBUG section there) so that the correct number of
   1.104 +  // certs are skipped as these debug EV certs are NOT part of the default trust
   1.105 +  // store.
   1.106 +  {
   1.107 +    // This is the testing EV signature (xpcshell) (RSA)
   1.108 +    // CN=XPCShell EV Testing (untrustworthy) CA,OU=Security Engineering,O=Mozilla - EV debug test CA,L=Mountain View,ST=CA,C=US"
   1.109 +    "1.3.6.1.4.1.13769.666.666.666.1.500.9.1",
   1.110 +    "DEBUGtesting EV OID",
   1.111 +    SEC_OID_UNKNOWN,
   1.112 +    { 0x9C, 0x62, 0xEF, 0xDB, 0xAE, 0xF9, 0xEB, 0x36, 0x58, 0xFB,
   1.113 +      0x3B, 0xD3, 0x47, 0x64, 0x93, 0x9D, 0x86, 0x29, 0x6A, 0xE0 },
   1.114 +    "MIGnMQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExFjAUBgNVBAcMDU1vdW50YWlu"
   1.115 +    "IFZpZXcxIzAhBgNVBAoMGk1vemlsbGEgLSBFViBkZWJ1ZyB0ZXN0IENBMR0wGwYD"
   1.116 +    "VQQLDBRTZWN1cml0eSBFbmdpbmVlcmluZzEvMC0GA1UEAwwmWFBDU2hlbGwgRVYg"
   1.117 +    "VGVzdGluZyAodW50cnVzdHdvcnRoeSkgQ0E=",
   1.118 +    "At+3zdo=",
   1.119 +    nullptr
   1.120 +  },
   1.121 +#endif
   1.122 +  {
   1.123 +    // OU=Security Communication EV RootCA1,O="SECOM Trust Systems CO.,LTD.",C=JP
   1.124 +    "1.2.392.200091.100.721.1",
   1.125 +    "SECOM EV OID",
   1.126 +    SEC_OID_UNKNOWN,
   1.127 +    { 0xFE, 0xB8, 0xC4, 0x32, 0xDC, 0xF9, 0x76, 0x9A, 0xCE, 0xAE,
   1.128 +      0x3D, 0xD8, 0x90, 0x8F, 0xFD, 0x28, 0x86, 0x65, 0x64, 0x7D },
   1.129 +    "MGAxCzAJBgNVBAYTAkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENP"
   1.130 +    "LixMVEQuMSowKAYDVQQLEyFTZWN1cml0eSBDb21tdW5pY2F0aW9uIEVWIFJvb3RD"
   1.131 +    "QTE=",
   1.132 +    "AA==",
   1.133 +    nullptr
   1.134 +  },
   1.135 +  {
   1.136 +    // CN=Cybertrust Global Root,O=Cybertrust, Inc
   1.137 +    "1.3.6.1.4.1.6334.1.100.1",
   1.138 +    "Cybertrust EV OID",
   1.139 +    SEC_OID_UNKNOWN,
   1.140 +    { 0x5F, 0x43, 0xE5, 0xB1, 0xBF, 0xF8, 0x78, 0x8C, 0xAC, 0x1C,
   1.141 +      0xC7, 0xCA, 0x4A, 0x9A, 0xC6, 0x22, 0x2B, 0xCC, 0x34, 0xC6 },
   1.142 +    "MDsxGDAWBgNVBAoTD0N5YmVydHJ1c3QsIEluYzEfMB0GA1UEAxMWQ3liZXJ0cnVz"
   1.143 +    "dCBHbG9iYWwgUm9vdA==",
   1.144 +    "BAAAAAABD4WqLUg=",
   1.145 +    nullptr
   1.146 +  },
   1.147 +  {
   1.148 +    // CN=SwissSign Gold CA - G2,O=SwissSign AG,C=CH
   1.149 +    "2.16.756.1.89.1.2.1.1",
   1.150 +    "SwissSign EV OID",
   1.151 +    SEC_OID_UNKNOWN,
   1.152 +    { 0xD8, 0xC5, 0x38, 0x8A, 0xB7, 0x30, 0x1B, 0x1B, 0x6E, 0xD4,
   1.153 +      0x7A, 0xE6, 0x45, 0x25, 0x3A, 0x6F, 0x9F, 0x1A, 0x27, 0x61 },
   1.154 +    "MEUxCzAJBgNVBAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMT"
   1.155 +    "FlN3aXNzU2lnbiBHb2xkIENBIC0gRzI=",
   1.156 +    "ALtAHEP1Xk+w",
   1.157 +    nullptr
   1.158 +  },
   1.159 +  {
   1.160 +    // CN=StartCom Certification Authority,OU=Secure Digital Certificate Signing,O=StartCom Ltd.,C=IL
   1.161 +    "1.3.6.1.4.1.23223.1.1.1",
   1.162 +    "StartCom EV OID",
   1.163 +    SEC_OID_UNKNOWN,
   1.164 +    { 0x3E, 0x2B, 0xF7, 0xF2, 0x03, 0x1B, 0x96, 0xF3, 0x8C, 0xE6,
   1.165 +      0xC4, 0xD8, 0xA8, 0x5D, 0x3E, 0x2D, 0x58, 0x47, 0x6A, 0x0F },
   1.166 +    "MH0xCzAJBgNVBAYTAklMMRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMSswKQYDVQQL"
   1.167 +    "EyJTZWN1cmUgRGlnaXRhbCBDZXJ0aWZpY2F0ZSBTaWduaW5nMSkwJwYDVQQDEyBT"
   1.168 +    "dGFydENvbSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQ==",
   1.169 +    "AQ==",
   1.170 +    nullptr
   1.171 +  },
   1.172 +  {
   1.173 +    // CN=StartCom Certification Authority,OU=Secure Digital Certificate Signing,O=StartCom Ltd.,C=IL
   1.174 +    "1.3.6.1.4.1.23223.1.1.1",
   1.175 +    "StartCom EV OID",
   1.176 +    SEC_OID_UNKNOWN,
   1.177 +    { 0xA3, 0xF1, 0x33, 0x3F, 0xE2, 0x42, 0xBF, 0xCF, 0xC5, 0xD1,
   1.178 +      0x4E, 0x8F, 0x39, 0x42, 0x98, 0x40, 0x68, 0x10, 0xD1, 0xA0 },
   1.179 +    "MH0xCzAJBgNVBAYTAklMMRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMSswKQYDVQQL"
   1.180 +    "EyJTZWN1cmUgRGlnaXRhbCBDZXJ0aWZpY2F0ZSBTaWduaW5nMSkwJwYDVQQDEyBT"
   1.181 +    "dGFydENvbSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQ==",
   1.182 +    "LQ==",
   1.183 +    nullptr
   1.184 +  },
   1.185 +  {
   1.186 +    // CN=StartCom Certification Authority G2,O=StartCom Ltd.,C=IL
   1.187 +    "1.3.6.1.4.1.23223.1.1.1",
   1.188 +    "StartCom EV OID",
   1.189 +    SEC_OID_UNKNOWN,
   1.190 +    { 0x31, 0xF1, 0xFD, 0x68, 0x22, 0x63, 0x20, 0xEE, 0xC6, 0x3B,
   1.191 +      0x3F, 0x9D, 0xEA, 0x4A, 0x3E, 0x53, 0x7C, 0x7C, 0x39, 0x17 },
   1.192 +    "MFMxCzAJBgNVBAYTAklMMRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMSwwKgYDVQQD"
   1.193 +    "EyNTdGFydENvbSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBHMg==",
   1.194 +    "Ow==",
   1.195 +    nullptr
   1.196 +  },
   1.197 +  {
   1.198 +    // CN=VeriSign Class 3 Public Primary Certification Authority - G5,OU="(c) 2006 VeriSign, Inc. - For authorized use only",OU=VeriSign Trust Network,O="VeriSign, Inc.",C=US
   1.199 +    "2.16.840.1.113733.1.7.23.6",
   1.200 +    "VeriSign EV OID",
   1.201 +    SEC_OID_UNKNOWN,
   1.202 +    { 0x4E, 0xB6, 0xD5, 0x78, 0x49, 0x9B, 0x1C, 0xCF, 0x5F, 0x58,
   1.203 +      0x1E, 0xAD, 0x56, 0xBE, 0x3D, 0x9B, 0x67, 0x44, 0xA5, 0xE5 },
   1.204 +    "MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV"
   1.205 +    "BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA2IFZl"
   1.206 +    "cmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMT"
   1.207 +    "PFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB"
   1.208 +    "dXRob3JpdHkgLSBHNQ==",
   1.209 +    "GNrRniZ96LtKIVjNzGs7Sg==",
   1.210 +    nullptr
   1.211 +  },
   1.212 +  {
   1.213 +    // CN=GeoTrust Primary Certification Authority,O=GeoTrust Inc.,C=US
   1.214 +    "1.3.6.1.4.1.14370.1.6",
   1.215 +    "GeoTrust EV OID",
   1.216 +    SEC_OID_UNKNOWN,
   1.217 +    { 0x32, 0x3C, 0x11, 0x8E, 0x1B, 0xF7, 0xB8, 0xB6, 0x52, 0x54,
   1.218 +      0xE2, 0xE2, 0x10, 0x0D, 0xD6, 0x02, 0x90, 0x37, 0xF0, 0x96 },
   1.219 +    "MFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQD"
   1.220 +    "EyhHZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5",
   1.221 +    "GKy1av1pthU6Y2yv2vrEoQ==",
   1.222 +    nullptr
   1.223 +  },
   1.224 +  {
   1.225 +    // CN=thawte Primary Root CA,OU="(c) 2006 thawte, Inc. - For authorized use only",OU=Certification Services Division,O="thawte, Inc.",C=US
   1.226 +    "2.16.840.1.113733.1.7.48.1",
   1.227 +    "Thawte EV OID",
   1.228 +    SEC_OID_UNKNOWN,
   1.229 +    { 0x91, 0xC6, 0xD6, 0xEE, 0x3E, 0x8A, 0xC8, 0x63, 0x84, 0xE5,
   1.230 +      0x48, 0xC2, 0x99, 0x29, 0x5C, 0x75, 0x6C, 0x81, 0x7B, 0x81 },
   1.231 +    "MIGpMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3RlLCBJbmMuMSgwJgYDVQQL"
   1.232 +    "Ex9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYDVQQLEy8oYykg"
   1.233 +    "MjAwNiB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0G"
   1.234 +    "A1UEAxMWdGhhd3RlIFByaW1hcnkgUm9vdCBDQQ==",
   1.235 +    "NE7VVyDV7exJ9C/ON9srbQ==",
   1.236 +    nullptr
   1.237 +  },
   1.238 +  {
   1.239 +    // CN=XRamp Global Certification Authority,O=XRamp Security Services Inc,OU=www.xrampsecurity.com,C=US
   1.240 +    "2.16.840.1.114404.1.1.2.4.1",
   1.241 +    "Trustwave EV OID",
   1.242 +    SEC_OID_UNKNOWN,
   1.243 +    { 0xB8, 0x01, 0x86, 0xD1, 0xEB, 0x9C, 0x86, 0xA5, 0x41, 0x04,
   1.244 +      0xCF, 0x30, 0x54, 0xF3, 0x4C, 0x52, 0xB7, 0xE5, 0x58, 0xC6 },
   1.245 +    "MIGCMQswCQYDVQQGEwJVUzEeMBwGA1UECxMVd3d3LnhyYW1wc2VjdXJpdHkuY29t"
   1.246 +    "MSQwIgYDVQQKExtYUmFtcCBTZWN1cml0eSBTZXJ2aWNlcyBJbmMxLTArBgNVBAMT"
   1.247 +    "JFhSYW1wIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQ==",
   1.248 +    "UJRs7Bjq1ZxN1ZfvdY+grQ==",
   1.249 +    nullptr
   1.250 +  },
   1.251 +  {
   1.252 +    // CN=SecureTrust CA,O=SecureTrust Corporation,C=US
   1.253 +    "2.16.840.1.114404.1.1.2.4.1",
   1.254 +    "Trustwave EV OID",
   1.255 +    SEC_OID_UNKNOWN,
   1.256 +    { 0x87, 0x82, 0xC6, 0xC3, 0x04, 0x35, 0x3B, 0xCF, 0xD2, 0x96,
   1.257 +      0x92, 0xD2, 0x59, 0x3E, 0x7D, 0x44, 0xD9, 0x34, 0xFF, 0x11 },
   1.258 +    "MEgxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdTZWN1cmVUcnVzdCBDb3Jwb3JhdGlv"
   1.259 +    "bjEXMBUGA1UEAxMOU2VjdXJlVHJ1c3QgQ0E=",
   1.260 +    "DPCOXAgWpa1Cf/DrJxhZ0A==",
   1.261 +    nullptr
   1.262 +  },
   1.263 +  {
   1.264 +    // CN=Secure Global CA,O=SecureTrust Corporation,C=US
   1.265 +    "2.16.840.1.114404.1.1.2.4.1",
   1.266 +    "Trustwave EV OID",
   1.267 +    SEC_OID_UNKNOWN,
   1.268 +    { 0x3A, 0x44, 0x73, 0x5A, 0xE5, 0x81, 0x90, 0x1F, 0x24, 0x86,
   1.269 +      0x61, 0x46, 0x1E, 0x3B, 0x9C, 0xC4, 0x5F, 0xF5, 0x3A, 0x1B },
   1.270 +    "MEoxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdTZWN1cmVUcnVzdCBDb3Jwb3JhdGlv"
   1.271 +    "bjEZMBcGA1UEAxMQU2VjdXJlIEdsb2JhbCBDQQ==",
   1.272 +    "B1YipOjUiolN9BPI8PjqpQ==",
   1.273 +    nullptr
   1.274 +  },
   1.275 +  {
   1.276 +    // CN=COMODO ECC Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB
   1.277 +    "1.3.6.1.4.1.6449.1.2.1.5.1",
   1.278 +    "Comodo EV OID",
   1.279 +    SEC_OID_UNKNOWN,
   1.280 +    { 0x9F, 0x74, 0x4E, 0x9F, 0x2B, 0x4D, 0xBA, 0xEC, 0x0F, 0x31,
   1.281 +      0x2C, 0x50, 0xB6, 0x56, 0x3B, 0x8E, 0x2D, 0x93, 0xC3, 0x11 },
   1.282 +    "MIGFMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAw"
   1.283 +    "DgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDErMCkG"
   1.284 +    "A1UEAxMiQ09NT0RPIEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQ==",
   1.285 +    "H0evqmIAcFBUTAGem2OZKg==",
   1.286 +    nullptr
   1.287 +  },
   1.288 +  {
   1.289 +    // CN=COMODO Certification Authority,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB
   1.290 +    "1.3.6.1.4.1.6449.1.2.1.5.1",
   1.291 +    "Comodo EV OID",
   1.292 +    SEC_OID_UNKNOWN,
   1.293 +    { 0x66, 0x31, 0xBF, 0x9E, 0xF7, 0x4F, 0x9E, 0xB6, 0xC9, 0xD5,
   1.294 +      0xA6, 0x0C, 0xBA, 0x6A, 0xBE, 0xD1, 0xF7, 0xBD, 0xEF, 0x7B },
   1.295 +    "MIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAw"
   1.296 +    "DgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEnMCUG"
   1.297 +    "A1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5",
   1.298 +    "ToEtioJl4AsC7j41AkblPQ==",
   1.299 +    nullptr
   1.300 +  },
   1.301 +  {
   1.302 +    // CN=AddTrust External CA Root,OU=AddTrust External TTP Network,O=AddTrust AB,C=SE
   1.303 +    "1.3.6.1.4.1.6449.1.2.1.5.1",
   1.304 +    "Comodo EV OID",
   1.305 +    SEC_OID_UNKNOWN,
   1.306 +    { 0x02, 0xFA, 0xF3, 0xE2, 0x91, 0x43, 0x54, 0x68, 0x60, 0x78,
   1.307 +      0x57, 0x69, 0x4D, 0xF5, 0xE4, 0x5B, 0x68, 0x85, 0x18, 0x68 },
   1.308 +    "MG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMd"
   1.309 +    "QWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0"
   1.310 +    "IEV4dGVybmFsIENBIFJvb3Q=",
   1.311 +    "AQ==",
   1.312 +    nullptr
   1.313 +  },
   1.314 +  {
   1.315 +    // CN=UTN - DATACorp SGC,OU=http://www.usertrust.com,O=The USERTRUST Network,L=Salt Lake City,ST=UT,C=US
   1.316 +    "1.3.6.1.4.1.6449.1.2.1.5.1",
   1.317 +    "Comodo EV OID",
   1.318 +    SEC_OID_UNKNOWN,
   1.319 +    { 0x58, 0x11, 0x9F, 0x0E, 0x12, 0x82, 0x87, 0xEA, 0x50, 0xFD,
   1.320 +      0xD9, 0x87, 0x45, 0x6F, 0x4F, 0x78, 0xDC, 0xFA, 0xD6, 0xD4 },
   1.321 +    "MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFr"
   1.322 +    "ZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsT"
   1.323 +    "GGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNv"
   1.324 +    "cnAgU0dD",
   1.325 +    "RL4Mi1AAIbQR0ypoBqmtaQ==",
   1.326 +    nullptr
   1.327 +  },
   1.328 +  {
   1.329 +    // CN=UTN-USERFirst-Hardware,OU=http://www.usertrust.com,O=The USERTRUST Network,L=Salt Lake City,ST=UT,C=US
   1.330 +    "1.3.6.1.4.1.6449.1.2.1.5.1",
   1.331 +    "Comodo EV OID",
   1.332 +    SEC_OID_UNKNOWN,
   1.333 +    { 0x04, 0x83, 0xED, 0x33, 0x99, 0xAC, 0x36, 0x08, 0x05, 0x87,
   1.334 +      0x22, 0xED, 0xBC, 0x5E, 0x46, 0x00, 0xE3, 0xBE, 0xF9, 0xD7 },
   1.335 +    "MIGXMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFr"
   1.336 +    "ZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsT"
   1.337 +    "GGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEfMB0GA1UEAxMWVVROLVVTRVJGaXJz"
   1.338 +    "dC1IYXJkd2FyZQ==",
   1.339 +    "RL4Mi1AAJLQR0zYq/mUK/Q==",
   1.340 +    nullptr
   1.341 +  },
   1.342 +  {
   1.343 +    // OU=Go Daddy Class 2 Certification Authority,O=\"The Go Daddy Group, Inc.\",C=US
   1.344 +    "2.16.840.1.114413.1.7.23.3",
   1.345 +    "Go Daddy EV OID a",
   1.346 +    SEC_OID_UNKNOWN,
   1.347 +    { 0x27, 0x96, 0xBA, 0xE6, 0x3F, 0x18, 0x01, 0xE2, 0x77, 0x26,
   1.348 +      0x1B, 0xA0, 0xD7, 0x77, 0x70, 0x02, 0x8F, 0x20, 0xEE, 0xE4 },
   1.349 +    "MGMxCzAJBgNVBAYTAlVTMSEwHwYDVQQKExhUaGUgR28gRGFkZHkgR3JvdXAsIElu"
   1.350 +    "Yy4xMTAvBgNVBAsTKEdvIERhZGR5IENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRo"
   1.351 +    "b3JpdHk=",
   1.352 +    "AA==",
   1.353 +    nullptr
   1.354 +  },
   1.355 +  {
   1.356 +    // CN=Go Daddy Root Certificate Authority - G2,O="GoDaddy.com, Inc.",L=Scottsdale,ST=Arizona,C=US
   1.357 +    "2.16.840.1.114413.1.7.23.3",
   1.358 +    "Go Daddy EV OID a",
   1.359 +    SEC_OID_UNKNOWN,
   1.360 +    { 0x47, 0xBE, 0xAB, 0xC9, 0x22, 0xEA, 0xE8, 0x0E, 0x78, 0x78,
   1.361 +      0x34, 0x62, 0xA7, 0x9F, 0x45, 0xC2, 0x54, 0xFD, 0xE6, 0x8B },
   1.362 +    "MIGDMQswCQYDVQQGEwJVUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2Nv"
   1.363 +    "dHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5jb20sIEluYy4xMTAvBgNVBAMTKEdv"
   1.364 +    "IERhZGR5IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzI=",
   1.365 +    "AA==",
   1.366 +    nullptr
   1.367 +  },
   1.368 +  {
   1.369 +    // OU=Starfield Class 2 Certification Authority,O=\"Starfield Technologies, Inc.\",C=US
   1.370 +    "2.16.840.1.114414.1.7.23.3",
   1.371 +    "Go Daddy EV OID b",
   1.372 +    SEC_OID_UNKNOWN,
   1.373 +    { 0xAD, 0x7E, 0x1C, 0x28, 0xB0, 0x64, 0xEF, 0x8F, 0x60, 0x03,
   1.374 +      0x40, 0x20, 0x14, 0xC3, 0xD0, 0xE3, 0x37, 0x0E, 0xB5, 0x8A },
   1.375 +    "MGgxCzAJBgNVBAYTAlVTMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVz"
   1.376 +    "LCBJbmMuMTIwMAYDVQQLEylTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9u"
   1.377 +    "IEF1dGhvcml0eQ==",
   1.378 +    "AA==",
   1.379 +    nullptr
   1.380 +  },
   1.381 +  {
   1.382 +    // CN=Starfield Root Certificate Authority - G2,O="Starfield Technologies, Inc.",L=Scottsdale,ST=Arizona,C=US
   1.383 +    "2.16.840.1.114414.1.7.23.3",
   1.384 +    "Go Daddy EV OID b",
   1.385 +    SEC_OID_UNKNOWN,
   1.386 +    { 0xB5, 0x1C, 0x06, 0x7C, 0xEE, 0x2B, 0x0C, 0x3D, 0xF8, 0x55,
   1.387 +      0xAB, 0x2D, 0x92, 0xF4, 0xFE, 0x39, 0xD4, 0xE7, 0x0F, 0x0E },
   1.388 +    "MIGPMQswCQYDVQQGEwJVUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2Nv"
   1.389 +    "dHRzZGFsZTElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEy"
   1.390 +    "MDAGA1UEAxMpU3RhcmZpZWxkIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0g"
   1.391 +    "RzI=",
   1.392 +    "AA==",
   1.393 +    nullptr
   1.394 +  },
   1.395 +  {
   1.396 +    // CN=DigiCert High Assurance EV Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
   1.397 +    "2.16.840.1.114412.2.1",
   1.398 +    "DigiCert EV OID",
   1.399 +    SEC_OID_UNKNOWN,
   1.400 +    { 0x5F, 0xB7, 0xEE, 0x06, 0x33, 0xE2, 0x59, 0xDB, 0xAD, 0x0C,
   1.401 +      0x4C, 0x9A, 0xE6, 0xD3, 0X8F, 0x1A, 0x61, 0xC7, 0xDC, 0x25 },
   1.402 +    "MGwxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsT"
   1.403 +    "EHd3dy5kaWdpY2VydC5jb20xKzApBgNVBAMTIkRpZ2lDZXJ0IEhpZ2ggQXNzdXJh"
   1.404 +    "bmNlIEVWIFJvb3QgQ0E=",
   1.405 +    "AqxcJmoLQJuPC3nyrkYldw==",
   1.406 +    nullptr
   1.407 +  },
   1.408 +  {
   1.409 +    // CN=QuoVadis Root CA 2,O=QuoVadis Limited,C=BM
   1.410 +    "1.3.6.1.4.1.8024.0.2.100.1.2",
   1.411 +    "Quo Vadis EV OID",
   1.412 +    SEC_OID_UNKNOWN,
   1.413 +    { 0xCA, 0x3A, 0xFB, 0xCF, 0x12, 0x40, 0x36, 0x4B, 0x44, 0xB2,
   1.414 +      0x16, 0x20, 0x88, 0x80, 0x48, 0x39, 0x19, 0x93, 0x7C, 0xF7 },
   1.415 +    "MEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYD"
   1.416 +    "VQQDExJRdW9WYWRpcyBSb290IENBIDI=",
   1.417 +    "BQk=",
   1.418 +    nullptr
   1.419 +  },
   1.420 +  {
   1.421 +    // CN=Network Solutions Certificate Authority,O=Network Solutions L.L.C.,C=US
   1.422 +    "1.3.6.1.4.1.782.1.2.1.8.1",
   1.423 +    "Network Solutions EV OID",
   1.424 +    SEC_OID_UNKNOWN,
   1.425 +    { 0x74, 0xF8, 0xA3, 0xC3, 0xEF, 0xE7, 0xB3, 0x90, 0x06, 0x4B,
   1.426 +      0x83, 0x90, 0x3C, 0x21, 0x64, 0x60, 0x20, 0xE5, 0xDF, 0xCE },
   1.427 +    "MGIxCzAJBgNVBAYTAlVTMSEwHwYDVQQKExhOZXR3b3JrIFNvbHV0aW9ucyBMLkwu"
   1.428 +    "Qy4xMDAuBgNVBAMTJ05ldHdvcmsgU29sdXRpb25zIENlcnRpZmljYXRlIEF1dGhv"
   1.429 +    "cml0eQ==",
   1.430 +    "V8szb8JcFuZHFhfjkDFo4A==",
   1.431 +    nullptr
   1.432 +  },
   1.433 +  {
   1.434 +    // CN=Entrust Root Certification Authority,OU="(c) 2006 Entrust, Inc.",OU=www.entrust.net/CPS is incorporated by reference,O="Entrust, Inc.",C=US
   1.435 +    "2.16.840.1.114028.10.1.2",
   1.436 +    "Entrust EV OID",
   1.437 +    SEC_OID_UNKNOWN,
   1.438 +    { 0xB3, 0x1E, 0xB1, 0xB7, 0x40, 0xE3, 0x6C, 0x84, 0x02, 0xDA,
   1.439 +      0xDC, 0x37, 0xD4, 0x4D, 0xF5, 0xD4, 0x67, 0x49, 0x52, 0xF9 },
   1.440 +    "MIGwMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNRW50cnVzdCwgSW5jLjE5MDcGA1UE"
   1.441 +    "CxMwd3d3LmVudHJ1c3QubmV0L0NQUyBpcyBpbmNvcnBvcmF0ZWQgYnkgcmVmZXJl"
   1.442 +    "bmNlMR8wHQYDVQQLExYoYykgMjAwNiBFbnRydXN0LCBJbmMuMS0wKwYDVQQDEyRF"
   1.443 +    "bnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHk=",
   1.444 +    "RWtQVA==",
   1.445 +    nullptr
   1.446 +  },
   1.447 +  {
   1.448 +    // CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE
   1.449 +    "1.3.6.1.4.1.4146.1.1",
   1.450 +    "GlobalSign EV OID",
   1.451 +    SEC_OID_UNKNOWN,
   1.452 +    { 0xB1, 0xBC, 0x96, 0x8B, 0xD4, 0xF4, 0x9D, 0x62, 0x2A, 0xA8,
   1.453 +      0x9A, 0x81, 0xF2, 0x15, 0x01, 0x52, 0xA4, 0x1D, 0x82, 0x9C },
   1.454 +    "MFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYD"
   1.455 +    "VQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxTaWduIFJvb3QgQ0E=",
   1.456 +    "BAAAAAABFUtaw5Q=",
   1.457 +    nullptr
   1.458 +  },
   1.459 +  {
   1.460 +    // CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R2
   1.461 +    "1.3.6.1.4.1.4146.1.1",
   1.462 +    "GlobalSign EV OID",
   1.463 +    SEC_OID_UNKNOWN,
   1.464 +    { 0x75, 0xE0, 0xAB, 0xB6, 0x13, 0x85, 0x12, 0x27, 0x1C, 0x04,
   1.465 +      0xF8, 0x5F, 0xDD, 0xDE, 0x38, 0xE4, 0xB7, 0x24, 0x2E, 0xFE },
   1.466 +    "MEwxIDAeBgNVBAsTF0dsb2JhbFNpZ24gUm9vdCBDQSAtIFIyMRMwEQYDVQQKEwpH"
   1.467 +    "bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu",
   1.468 +    "BAAAAAABD4Ym5g0=",
   1.469 +    nullptr
   1.470 +  },
   1.471 +  {
   1.472 +    // CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R3
   1.473 +    "1.3.6.1.4.1.4146.1.1",
   1.474 +    "GlobalSign EV OID",
   1.475 +    SEC_OID_UNKNOWN,
   1.476 +    { 0xD6, 0x9B, 0x56, 0x11, 0x48, 0xF0, 0x1C, 0x77, 0xC5, 0x45,
   1.477 +      0x78, 0xC1, 0x09, 0x26, 0xDF, 0x5B, 0x85, 0x69, 0x76, 0xAD },
   1.478 +    "MEwxIDAeBgNVBAsTF0dsb2JhbFNpZ24gUm9vdCBDQSAtIFIzMRMwEQYDVQQKEwpH"
   1.479 +    "bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu",
   1.480 +    "BAAAAAABIVhTCKI=",
   1.481 +    nullptr
   1.482 +  },
   1.483 +  {
   1.484 +    // CN=Buypass Class 3 CA 1,O=Buypass AS-983163327,C=NO
   1.485 +    "2.16.578.1.26.1.3.3",
   1.486 +    "Buypass EV OID",
   1.487 +    SEC_OID_UNKNOWN,
   1.488 +    { 0x61, 0x57, 0x3A, 0x11, 0xDF, 0x0E, 0xD8, 0x7E, 0xD5, 0x92,
   1.489 +      0x65, 0x22, 0xEA, 0xD0, 0x56, 0xD7, 0x44, 0xB3, 0x23, 0x71 },
   1.490 +    "MEsxCzAJBgNVBAYTAk5PMR0wGwYDVQQKDBRCdXlwYXNzIEFTLTk4MzE2MzMyNzEd"
   1.491 +    "MBsGA1UEAwwUQnV5cGFzcyBDbGFzcyAzIENBIDE=",
   1.492 +    "Ag==",
   1.493 +    nullptr
   1.494 +  },
   1.495 +  {
   1.496 +    // CN=Buypass Class 3 Root CA,O=Buypass AS-983163327,C=NO
   1.497 +    "2.16.578.1.26.1.3.3",
   1.498 +    "Buypass EV OID",
   1.499 +    SEC_OID_UNKNOWN,
   1.500 +    { 0xDA, 0xFA, 0xF7, 0xFA, 0x66, 0x84, 0xEC, 0x06, 0x8F, 0x14,
   1.501 +      0x50, 0xBD, 0xC7, 0xC2, 0x81, 0xA5, 0xBC, 0xA9, 0x64, 0x57 },
   1.502 +    "ME4xCzAJBgNVBAYTAk5PMR0wGwYDVQQKDBRCdXlwYXNzIEFTLTk4MzE2MzMyNzEg"
   1.503 +    "MB4GA1UEAwwXQnV5cGFzcyBDbGFzcyAzIFJvb3QgQ0E=",
   1.504 +    "Ag==",
   1.505 +    nullptr
   1.506 +  },
   1.507 +  {
   1.508 +    // CN=Class 2 Primary CA,O=Certplus,C=FR
   1.509 +    "1.3.6.1.4.1.22234.2.5.2.3.1",
   1.510 +    "Certplus EV OID",
   1.511 +    SEC_OID_UNKNOWN,
   1.512 +    { 0x74, 0x20, 0x74, 0x41, 0x72, 0x9C, 0xDD, 0x92, 0xEC, 0x79,
   1.513 +      0x31, 0xD8, 0x23, 0x10, 0x8D, 0xC2, 0x81, 0x92, 0xE2, 0xBB },
   1.514 +    "MD0xCzAJBgNVBAYTAkZSMREwDwYDVQQKEwhDZXJ0cGx1czEbMBkGA1UEAxMSQ2xh"
   1.515 +    "c3MgMiBQcmltYXJ5IENB",
   1.516 +    "AIW9S/PY2uNp9pTXX8OlRCM=",
   1.517 +    nullptr
   1.518 +  },
   1.519 +  {
   1.520 +    // CN=Chambers of Commerce Root - 2008,O=AC Camerfirma S.A.,serialNumber=A82743287,L=Madrid (see current address at www.camerfirma.com/address),C=EU
   1.521 +    "1.3.6.1.4.1.17326.10.14.2.1.2",
   1.522 +    "Camerfirma EV OID a",
   1.523 +    SEC_OID_UNKNOWN,
   1.524 +    { 0x78, 0x6A, 0x74, 0xAC, 0x76, 0xAB, 0x14, 0x7F, 0x9C, 0x6A,
   1.525 +      0x30, 0x50, 0xBA, 0x9E, 0xA8, 0x7E, 0xFE, 0x9A, 0xCE, 0x3C },
   1.526 +    "MIGuMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBh"
   1.527 +    "ZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ"
   1.528 +    "QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMT"
   1.529 +    "IENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4",
   1.530 +    "AKPaQn6ksa7a",
   1.531 +    nullptr
   1.532 +  },
   1.533 +  {
   1.534 +    // CN=Global Chambersign Root - 2008,O=AC Camerfirma S.A.,serialNumber=A82743287,L=Madrid (see current address at www.camerfirma.com/address),C=EU
   1.535 +    "1.3.6.1.4.1.17326.10.8.12.1.2",
   1.536 +    "Camerfirma EV OID b",
   1.537 +    SEC_OID_UNKNOWN,
   1.538 +    { 0x4A, 0xBD, 0xEE, 0xEC, 0x95, 0x0D, 0x35, 0x9C, 0x89, 0xAE,
   1.539 +      0xC7, 0x52, 0xA1, 0x2C, 0x5B, 0x29, 0xF6, 0xD6, 0xAA, 0x0C },
   1.540 +    "MIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBh"
   1.541 +    "ZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ"
   1.542 +    "QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMT"
   1.543 +    "Hkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwOA==",
   1.544 +    "AMnN0+nVfSPO",
   1.545 +    nullptr
   1.546 +  },
   1.547 +  {
   1.548 +    // CN=TC TrustCenter Universal CA III,OU=TC TrustCenter Universal CA,O=TC TrustCenter GmbH,C=DE
   1.549 +    "1.2.276.0.44.1.1.1.4",
   1.550 +    "TC TrustCenter EV OID",
   1.551 +    SEC_OID_UNKNOWN,
   1.552 +    { 0x96, 0x56, 0xCD, 0x7B, 0x57, 0x96, 0x98, 0x95, 0xD0, 0xE1,
   1.553 +      0x41, 0x46, 0x68, 0x06, 0xFB, 0xB8, 0xC6, 0x11, 0x06, 0x87 },
   1.554 +    "MHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNUQyBUcnVzdENlbnRlciBHbWJIMSQw"
   1.555 +    "IgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0ExKDAmBgNVBAMTH1RD"
   1.556 +    "IFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUk=",
   1.557 +    "YyUAAQACFI0zFQLkbPQ=",
   1.558 +    nullptr
   1.559 +  },
   1.560 +  {
   1.561 +    // CN=AffirmTrust Commercial,O=AffirmTrust,C=US
   1.562 +    "1.3.6.1.4.1.34697.2.1",
   1.563 +    "AffirmTrust EV OID a",
   1.564 +    SEC_OID_UNKNOWN,
   1.565 +    { 0xF9, 0xB5, 0xB6, 0x32, 0x45, 0x5F, 0x9C, 0xBE, 0xEC, 0x57,
   1.566 +      0x5F, 0x80, 0xDC, 0xE9, 0x6E, 0x2C, 0xC7, 0xB2, 0x78, 0xB7 },
   1.567 +    "MEQxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEfMB0GA1UEAwwW"
   1.568 +    "QWZmaXJtVHJ1c3QgQ29tbWVyY2lhbA==",
   1.569 +    "d3cGJyapsXw=",
   1.570 +    nullptr
   1.571 +  },
   1.572 +  {
   1.573 +    // CN=AffirmTrust Networking,O=AffirmTrust,C=US
   1.574 +    "1.3.6.1.4.1.34697.2.2",
   1.575 +    "AffirmTrust EV OID b",
   1.576 +    SEC_OID_UNKNOWN,
   1.577 +    { 0x29, 0x36, 0x21, 0x02, 0x8B, 0x20, 0xED, 0x02, 0xF5, 0x66,
   1.578 +      0xC5, 0x32, 0xD1, 0xD6, 0xED, 0x90, 0x9F, 0x45, 0x00, 0x2F },
   1.579 +    "MEQxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEfMB0GA1UEAwwW"
   1.580 +    "QWZmaXJtVHJ1c3QgTmV0d29ya2luZw==",
   1.581 +    "fE8EORzUmS0=",
   1.582 +    nullptr
   1.583 +  },
   1.584 +  {
   1.585 +    // CN=AffirmTrust Premium,O=AffirmTrust,C=US
   1.586 +    "1.3.6.1.4.1.34697.2.3",
   1.587 +    "AffirmTrust EV OID c",
   1.588 +    SEC_OID_UNKNOWN,
   1.589 +    { 0xD8, 0xA6, 0x33, 0x2C, 0xE0, 0x03, 0x6F, 0xB1, 0x85, 0xF6,
   1.590 +      0x63, 0x4F, 0x7D, 0x6A, 0x06, 0x65, 0x26, 0x32, 0x28, 0x27 },
   1.591 +    "MEExCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEcMBoGA1UEAwwT"
   1.592 +    "QWZmaXJtVHJ1c3QgUHJlbWl1bQ==",
   1.593 +    "bYwURrGmCu4=",
   1.594 +    nullptr
   1.595 +  },
   1.596 +  {
   1.597 +    // CN=AffirmTrust Premium ECC,O=AffirmTrust,C=US
   1.598 +    "1.3.6.1.4.1.34697.2.4",
   1.599 +    "AffirmTrust EV OID d",
   1.600 +    SEC_OID_UNKNOWN,
   1.601 +    { 0xB8, 0x23, 0x6B, 0x00, 0x2F, 0x1D, 0x16, 0x86, 0x53, 0x01,
   1.602 +      0x55, 0x6C, 0x11, 0xA4, 0x37, 0xCA, 0xEB, 0xFF, 0xC3, 0xBB },
   1.603 +    "MEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwX"
   1.604 +    "QWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0M=",
   1.605 +    "dJclisc/elQ=",
   1.606 +    nullptr
   1.607 +  },
   1.608 +  {
   1.609 +    // CN=Certum Trusted Network CA,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL
   1.610 +    "1.2.616.1.113527.2.5.1.1",
   1.611 +    "Certum EV OID",
   1.612 +    SEC_OID_UNKNOWN,
   1.613 +    { 0x07, 0xE0, 0x32, 0xE0, 0x20, 0xB7, 0x2C, 0x3F, 0x19, 0x2F,
   1.614 +      0x06, 0x28, 0xA2, 0x59, 0x3A, 0x19, 0xA7, 0x0F, 0x06, 0x9E },
   1.615 +    "MH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBT"
   1.616 +    "LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAg"
   1.617 +    "BgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0E=",
   1.618 +    "BETA",
   1.619 +    nullptr
   1.620 +  },
   1.621 +  {
   1.622 +    // CN=Izenpe.com,O=IZENPE S.A.,C=ES
   1.623 +    "1.3.6.1.4.1.14777.6.1.1",
   1.624 +    "Izenpe EV OID 1",
   1.625 +    SEC_OID_UNKNOWN,
   1.626 +    { 0x2F, 0x78, 0x3D, 0x25, 0x52, 0x18, 0xA7, 0x4A, 0x65, 0x39,
   1.627 +      0x71, 0xB5, 0x2C, 0xA2, 0x9C, 0x45, 0x15, 0x6F, 0xE9, 0x19 },
   1.628 +    "MDgxCzAJBgNVBAYTAkVTMRQwEgYDVQQKDAtJWkVOUEUgUy5BLjETMBEGA1UEAwwK"
   1.629 +    "SXplbnBlLmNvbQ==",
   1.630 +    "ALC3WhZIX7/hy/WL1xnmfQ==",
   1.631 +    nullptr
   1.632 +  },
   1.633 +  {
   1.634 +    // CN=Izenpe.com,O=IZENPE S.A.,C=ES
   1.635 +    "1.3.6.1.4.1.14777.6.1.2",
   1.636 +    "Izenpe EV OID 2",
   1.637 +    SEC_OID_UNKNOWN,
   1.638 +    { 0x2F, 0x78, 0x3D, 0x25, 0x52, 0x18, 0xA7, 0x4A, 0x65, 0x39,
   1.639 +      0x71, 0xB5, 0x2C, 0xA2, 0x9C, 0x45, 0x15, 0x6F, 0xE9, 0x19 },
   1.640 +    "MDgxCzAJBgNVBAYTAkVTMRQwEgYDVQQKDAtJWkVOUEUgUy5BLjETMBEGA1UEAwwK"
   1.641 +    "SXplbnBlLmNvbQ==",
   1.642 +    "ALC3WhZIX7/hy/WL1xnmfQ==",
   1.643 +    nullptr
   1.644 +  },
   1.645 +  {
   1.646 +    // CN=A-Trust-nQual-03,OU=A-Trust-nQual-03,O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH,C=AT
   1.647 +    "1.2.40.0.17.1.22",
   1.648 +    "A-Trust EV OID",
   1.649 +    SEC_OID_UNKNOWN,
   1.650 +    { 0xD3, 0xC0, 0x63, 0xF2, 0x19, 0xED, 0x07, 0x3E, 0x34, 0xAD,
   1.651 +      0x5D, 0x75, 0x0B, 0x32, 0x76, 0x29, 0xFF, 0xD5, 0x9A, 0xF2 },
   1.652 +    "MIGNMQswCQYDVQQGEwJBVDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hl"
   1.653 +    "cmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYD"
   1.654 +    "VQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAz",
   1.655 +    "AWwe",
   1.656 +    nullptr
   1.657 +  },
   1.658 +  {
   1.659 +    // CN=T-TeleSec GlobalRoot Class 3,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE
   1.660 +    "1.3.6.1.4.1.7879.13.24.1",
   1.661 +    "T-Systems EV OID",
   1.662 +    SEC_OID_UNKNOWN,
   1.663 +    { 0x55, 0xA6, 0x72, 0x3E, 0xCB, 0xF2, 0xEC, 0xCD, 0xC3, 0x23,
   1.664 +      0x74, 0x70, 0x19, 0x9D, 0x2A, 0xBE, 0x11, 0xE3, 0x81, 0xD1 },
   1.665 +    "MIGCMQswCQYDVQQGEwJERTErMCkGA1UECgwiVC1TeXN0ZW1zIEVudGVycHJpc2Ug"
   1.666 +    "U2VydmljZXMgR21iSDEfMB0GA1UECwwWVC1TeXN0ZW1zIFRydXN0IENlbnRlcjEl"
   1.667 +    "MCMGA1UEAwwcVC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMw==",
   1.668 +    "AQ==",
   1.669 +    nullptr
   1.670 +  },
   1.671 +  {
   1.672 +    // CN=TURKTRUST Elektronik Sertifika Hizmet Saglayicisi,O=TURKTRUST Bilgi Illetisim ve Bilisim Guvenligi Hizmetleri A.S.,C=TR
   1.673 +    "2.16.792.3.0.3.1.1.5",
   1.674 +    "TurkTrust EV OID",
   1.675 +    SEC_OID_UNKNOWN,
   1.676 +    { 0xF1, 0x7F, 0x6F, 0xB6, 0x31, 0xDC, 0x99, 0xE3, 0xA3, 0xC8,
   1.677 +      0x7F, 0xFE, 0x1C, 0xF1, 0x81, 0x10, 0x88, 0xD9, 0x60, 0x33 },
   1.678 +    "MIG/MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlmaWthIEhp"
   1.679 +    "em1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmth"
   1.680 +    "cmExXjBcBgNVBAoMVVTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxp"
   1.681 +    "xZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uIChjKSBBcmFsxLFrIDIw"
   1.682 +    "MDc=",
   1.683 +    "AQ==",
   1.684 +    nullptr
   1.685 +  },
   1.686 +  {
   1.687 +    // CN=China Internet Network Information Center EV Certificates Root,O=China Internet Network Information Center,C=CN
   1.688 +    "1.3.6.1.4.1.29836.1.10",
   1.689 +    "CNNIC EV OID",
   1.690 +    SEC_OID_UNKNOWN,
   1.691 +    { 0x4F, 0x99, 0xAA, 0x93, 0xFB, 0x2B, 0xD1, 0x37, 0x26, 0xA1,
   1.692 +      0x99, 0x4A, 0xCE, 0x7F, 0xF0, 0x05, 0xF2, 0x93, 0x5D, 0x1E },
   1.693 +    "MIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29y"
   1.694 +    "ayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNoaW5hIEludGVybmV0IE5l"
   1.695 +    "dHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRlcyBSb290",
   1.696 +    "SJ8AAQ==",
   1.697 +    nullptr
   1.698 +  },
   1.699 +  {
   1.700 +    // CN=TWCA Root Certification Authority,OU=Root CA,O=TAIWAN-CA,C=TW
   1.701 +    "1.3.6.1.4.1.40869.1.1.22.3",
   1.702 +    "TWCA EV OID",
   1.703 +    SEC_OID_UNKNOWN,
   1.704 +    { 0xCF, 0x9E, 0x87, 0x6D, 0xD3, 0xEB, 0xFC, 0x42, 0x26, 0x97,
   1.705 +      0xA3, 0xB5, 0xA3, 0x7A, 0xA0, 0x76, 0xA9, 0x06, 0x23, 0x48 },
   1.706 +    "MF8xCzAJBgNVBAYTAlRXMRIwEAYDVQQKDAlUQUlXQU4tQ0ExEDAOBgNVBAsMB1Jv"
   1.707 +    "b3QgQ0ExKjAoBgNVBAMMIVRXQ0EgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0"
   1.708 +    "eQ==",
   1.709 +    "AQ==",
   1.710 +    nullptr
   1.711 +  },
   1.712 +  {
   1.713 +    // CN=D-TRUST Root Class 3 CA 2 EV 2009,O=D-Trust GmbH,C=DE
   1.714 +    "1.3.6.1.4.1.4788.2.202.1",
   1.715 +    "D-TRUST EV OID",
   1.716 +    SEC_OID_UNKNOWN,
   1.717 +    { 0x96, 0xC9, 0x1B, 0x0B, 0x95, 0xB4, 0x10, 0x98, 0x42, 0xFA,
   1.718 +      0xD0, 0xD8, 0x22, 0x79, 0xFE, 0x60, 0xFA, 0xB9, 0x16, 0x83 },
   1.719 +    "MFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMM"
   1.720 +    "IUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOQ==",
   1.721 +    "CYP0",
   1.722 +    nullptr
   1.723 +  },
   1.724 +  {
   1.725 +    // CN=Swisscom Root EV CA 2,OU=Digital Certificate Services,O=Swisscom,C=ch
   1.726 +    "2.16.756.1.83.21.0",
   1.727 +    "Swisscom  EV OID",
   1.728 +    SEC_OID_UNKNOWN,
   1.729 +    { 0xE7, 0xA1, 0x90, 0x29, 0xD3, 0xD5, 0x52, 0xDC, 0x0D, 0x0F,
   1.730 +      0xC6, 0x92, 0xD3, 0xEA, 0x88, 0x0D, 0x15, 0x2E, 0x1A, 0x6B },
   1.731 +    "MGcxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln"
   1.732 +    "aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEeMBwGA1UEAxMVU3dpc3Njb20gUm9v"
   1.733 +    "dCBFViBDQSAy",
   1.734 +    "APL6ZOJ0Y9ON/RAdBB92ylg=",
   1.735 +    nullptr
   1.736 +  },
   1.737 +  {
   1.738 +    // CN=VeriSign Universal Root Certification Authority,OU="(c) 2008 VeriSign, Inc. - For authorized use only",OU=VeriSign Trust Network,O="VeriSign, Inc.",C=US
   1.739 +    "2.16.840.1.113733.1.7.23.6",
   1.740 +    "VeriSign EV OID",
   1.741 +    SEC_OID_UNKNOWN,
   1.742 +    { 0x36, 0x79, 0xCA, 0x35, 0x66, 0x87, 0x72, 0x30, 0x4D, 0x30,
   1.743 +      0xA5, 0xFB, 0x87, 0x3B, 0x0F, 0xA7, 0x7B, 0xB7, 0x0D, 0x54 },
   1.744 +    "MIG9MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV"
   1.745 +    "BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZl"
   1.746 +    "cmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMT"
   1.747 +    "L1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5",
   1.748 +    "QBrEZCGzEyEDDrvkEhrFHQ==",
   1.749 +    nullptr
   1.750 +  },
   1.751 +  {
   1.752 +    // CN=GeoTrust Primary Certification Authority - G3,OU=(c) 2008 GeoTrust Inc. - For authorized use only,O=GeoTrust Inc.,C=US
   1.753 +    "1.3.6.1.4.1.14370.1.6",
   1.754 +    "GeoTrust EV OID",
   1.755 +    SEC_OID_UNKNOWN,
   1.756 +    { 0x03, 0x9E, 0xED, 0xB8, 0x0B, 0xE7, 0xA0, 0x3C, 0x69, 0x53,
   1.757 +      0x89, 0x3B, 0x20, 0xD2, 0xD9, 0x32, 0x3A, 0x4C, 0x2A, 0xFD },
   1.758 +    "MIGYMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjE5MDcGA1UE"
   1.759 +    "CxMwKGMpIDIwMDggR2VvVHJ1c3QgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBv"
   1.760 +    "bmx5MTYwNAYDVQQDEy1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0"
   1.761 +    "aG9yaXR5IC0gRzM=",
   1.762 +    "FaxulBmyeUtB9iepwxgPHw==",
   1.763 +    nullptr
   1.764 +  },
   1.765 +  {
   1.766 +    // CN=thawte Primary Root CA - G3,OU="(c) 2008 thawte, Inc. - For authorized use only",OU=Certification Services Division,O="thawte, Inc.",C=US
   1.767 +    "2.16.840.1.113733.1.7.48.1",
   1.768 +    "Thawte EV OID",
   1.769 +    SEC_OID_UNKNOWN,
   1.770 +    { 0xF1, 0x8B, 0x53, 0x8D, 0x1B, 0xE9, 0x03, 0xB6, 0xA6, 0xF0,
   1.771 +      0x56, 0x43, 0x5B, 0x17, 0x15, 0x89, 0xCA, 0xF3, 0x6B, 0xF2 },
   1.772 +    "MIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3RlLCBJbmMuMSgwJgYDVQQL"
   1.773 +    "Ex9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYDVQQLEy8oYykg"
   1.774 +    "MjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG"
   1.775 +    "A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz",
   1.776 +    "YAGXt0an6rS0mtZLL/eQ+w==",
   1.777 +    nullptr
   1.778 +  },
   1.779 +  {
   1.780 +    // CN = Autoridad de Certificacion Firmaprofesional CIF A62634068, C = ES
   1.781 +    "1.3.6.1.4.1.13177.10.1.3.10",
   1.782 +    "Firmaprofesional EV OID",
   1.783 +    SEC_OID_UNKNOWN,
   1.784 +    { 0xAE, 0xC5, 0xFB, 0x3F, 0xC8, 0xE1, 0xBF, 0xC4, 0xE5, 0x4F,
   1.785 +      0x03, 0x07, 0x5A, 0x9A, 0xE8, 0x00, 0xB7, 0xF7, 0xB6, 0xFA },
   1.786 +    "MFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNh"
   1.787 +    "Y2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjg=",
   1.788 +    "U+w77vuySF8=",
   1.789 +    nullptr
   1.790 +  },
   1.791 +  {
   1.792 +    // CN = TWCA Global Root CA, OU = Root CA, O = TAIWAN-CA, C = TW
   1.793 +    "1.3.6.1.4.1.40869.1.1.22.3",
   1.794 +    "TWCA EV OID",
   1.795 +    SEC_OID_UNKNOWN,
   1.796 +    { 0x9C, 0xBB, 0x48, 0x53, 0xF6, 0xA4, 0xF6, 0xD3, 0x52, 0xA4,
   1.797 +      0xE8, 0x32, 0x52, 0x55, 0x60, 0x13, 0xF5, 0xAD, 0xAF, 0x65 },
   1.798 +    "MFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jv"
   1.799 +    "b3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0E=",
   1.800 +    "DL4=",
   1.801 +    nullptr
   1.802 +  },
   1.803 +  {
   1.804 +    // CN = E-Tugra Certification Authority, OU = E-Tugra Sertifikasyon Merkezi, O = E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş., L = Ankara, C = TR
   1.805 +    "2.16.792.3.0.4.1.1.4",
   1.806 +    "ETugra EV OID",
   1.807 +    SEC_OID_UNKNOWN,
   1.808 +    { 0x51, 0xC6, 0xE7, 0x08, 0x49, 0x06, 0x6E, 0xF3, 0x92, 0xD4,
   1.809 +      0x5C, 0xA0, 0x0D, 0x6D, 0xA3, 0x62, 0x8F, 0xC3, 0x52, 0x39 },
   1.810 +    "MIGyMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMUAwPgYDVQQKDDdFLVR1"
   1.811 +    "xJ9yYSBFQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEu"
   1.812 +    "xZ4uMSYwJAYDVQQLDB1FLVR1Z3JhIFNlcnRpZmlrYXN5b24gTWVya2V6aTEoMCYG"
   1.813 +    "A1UEAwwfRS1UdWdyYSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQ==",
   1.814 +    "amg+nFGby1M=",
   1.815 +    nullptr
   1.816 +  }
   1.817 +};
   1.818 +
   1.819 +static SECOidTag
   1.820 +register_oid(const SECItem* oid_item, const char* oid_name)
   1.821 +{
   1.822 +  if (!oid_item)
   1.823 +    return SEC_OID_UNKNOWN;
   1.824 +
   1.825 +  SECOidData od;
   1.826 +  od.oid.len = oid_item->len;
   1.827 +  od.oid.data = oid_item->data;
   1.828 +  od.offset = SEC_OID_UNKNOWN;
   1.829 +  od.desc = oid_name;
   1.830 +  od.mechanism = CKM_INVALID_MECHANISM;
   1.831 +  od.supportedExtension = INVALID_CERT_EXTENSION;
   1.832 +  return SECOID_AddEntry(&od);
   1.833 +}
   1.834 +
   1.835 +#ifndef NSS_NO_LIBPKIX
   1.836 +static void
   1.837 +addToCertListIfTrusted(CERTCertList* certList, CERTCertificate* cert) {
   1.838 +  CERTCertTrust nssTrust;
   1.839 +  if (CERT_GetCertTrust(cert, &nssTrust) != SECSuccess) {
   1.840 +    return;
   1.841 +  }
   1.842 +  unsigned int flags = SEC_GET_TRUST_FLAGS(&nssTrust, trustSSL);
   1.843 +
   1.844 +  if (flags & CERTDB_TRUSTED_CA) {
   1.845 +    CERT_AddCertToListTail(certList, CERT_DupCertificate(cert));
   1.846 +  }
   1.847 +}
   1.848 +#endif
   1.849 +
   1.850 +static bool
   1.851 +isEVPolicy(SECOidTag policyOIDTag)
   1.852 +{
   1.853 +  for (size_t iEV = 0; iEV < PR_ARRAY_SIZE(myTrustedEVInfos); ++iEV) {
   1.854 +    nsMyTrustedEVInfo& entry = myTrustedEVInfos[iEV];
   1.855 +    if (policyOIDTag == entry.oid_tag) {
   1.856 +      return true;
   1.857 +    }
   1.858 +  }
   1.859 +
   1.860 +  return false;
   1.861 +}
   1.862 +
   1.863 +namespace mozilla { namespace psm {
   1.864 +
   1.865 +#ifndef NSS_NO_LIBPKIX
   1.866 +CERTCertList*
   1.867 +GetRootsForOid(SECOidTag oid_tag)
   1.868 +{
   1.869 +  CERTCertList* certList = CERT_NewCertList();
   1.870 +  if (!certList)
   1.871 +    return nullptr;
   1.872 +
   1.873 +  for (size_t iEV = 0; iEV < PR_ARRAY_SIZE(myTrustedEVInfos); ++iEV) {
   1.874 +    nsMyTrustedEVInfo& entry = myTrustedEVInfos[iEV];
   1.875 +    if (entry.oid_tag == oid_tag) {
   1.876 +      addToCertListIfTrusted(certList, entry.cert);
   1.877 +    }
   1.878 +  }
   1.879 +
   1.880 +  return certList;
   1.881 +}
   1.882 +#endif
   1.883 +
   1.884 +bool
   1.885 +CertIsAuthoritativeForEVPolicy(const CERTCertificate* cert,
   1.886 +                               SECOidTag policyOidTag)
   1.887 +{
   1.888 +  PR_ASSERT(cert);
   1.889 +  PR_ASSERT(policyOidTag != SEC_OID_UNKNOWN);
   1.890 +  if (!cert || !policyOidTag) {
   1.891 +    return false;
   1.892 +  }
   1.893 +
   1.894 +  for (size_t iEV = 0; iEV < PR_ARRAY_SIZE(myTrustedEVInfos); ++iEV) {
   1.895 +    nsMyTrustedEVInfo& entry = myTrustedEVInfos[iEV];
   1.896 +    if (entry.oid_tag == policyOidTag && entry.cert &&
   1.897 +        CERT_CompareCerts(cert, entry.cert)) {
   1.898 +      return true;
   1.899 +    }
   1.900 +  }
   1.901 +
   1.902 +  return false;
   1.903 +}
   1.904 +
   1.905 +static PRStatus
   1.906 +IdentityInfoInit()
   1.907 +{
   1.908 +  for (size_t iEV = 0; iEV < PR_ARRAY_SIZE(myTrustedEVInfos); ++iEV) {
   1.909 +    nsMyTrustedEVInfo& entry = myTrustedEVInfos[iEV];
   1.910 +
   1.911 +    SECStatus rv;
   1.912 +    CERTIssuerAndSN ias;
   1.913 +
   1.914 +    rv = ATOB_ConvertAsciiToItem(&ias.derIssuer, const_cast<char*>(entry.issuer_base64));
   1.915 +    PR_ASSERT(rv == SECSuccess);
   1.916 +    if (rv != SECSuccess) {
   1.917 +      return PR_FAILURE;
   1.918 +    }
   1.919 +    rv = ATOB_ConvertAsciiToItem(&ias.serialNumber,
   1.920 +                                 const_cast<char*>(entry.serial_base64));
   1.921 +    PR_ASSERT(rv == SECSuccess);
   1.922 +    if (rv != SECSuccess) {
   1.923 +      SECITEM_FreeItem(&ias.derIssuer, false);
   1.924 +      return PR_FAILURE;
   1.925 +    }
   1.926 +
   1.927 +    ias.serialNumber.type = siUnsignedInteger;
   1.928 +
   1.929 +    entry.cert = CERT_FindCertByIssuerAndSN(nullptr, &ias);
   1.930 +
   1.931 +    SECITEM_FreeItem(&ias.derIssuer, false);
   1.932 +    SECITEM_FreeItem(&ias.serialNumber, false);
   1.933 +
   1.934 +    // If an entry is missing in the NSS root database, it may be because the
   1.935 +    // root database is out of sync with what we expect (e.g. a different
   1.936 +    // version of system NSS is installed). We will just silently avoid
   1.937 +    // treating that root cert as EV.
   1.938 +    if (!entry.cert) {
   1.939 +#ifdef DEBUG
   1.940 +      // The debug CA info is at position 0, and is NOT on the NSS root db
   1.941 +      if (iEV == 0) {
   1.942 +        continue;
   1.943 +      }
   1.944 +#endif
   1.945 +      PR_NOT_REACHED("Could not find EV root in NSS storage");
   1.946 +      continue;
   1.947 +    }
   1.948 +
   1.949 +    unsigned char certFingerprint[20];
   1.950 +    rv = PK11_HashBuf(SEC_OID_SHA1, certFingerprint,
   1.951 +                      entry.cert->derCert.data, entry.cert->derCert.len);
   1.952 +    PR_ASSERT(rv == SECSuccess);
   1.953 +    if (rv == SECSuccess) {
   1.954 +      bool same = !memcmp(certFingerprint, entry.ev_root_sha1_fingerprint, 20);
   1.955 +      PR_ASSERT(same);
   1.956 +      if (same) {
   1.957 +
   1.958 +        SECItem ev_oid_item;
   1.959 +        ev_oid_item.data = nullptr;
   1.960 +        ev_oid_item.len = 0;
   1.961 +        rv = SEC_StringToOID(nullptr, &ev_oid_item, entry.dotted_oid, 0);
   1.962 +        PR_ASSERT(rv == SECSuccess);
   1.963 +        if (rv == SECSuccess) {
   1.964 +          entry.oid_tag = register_oid(&ev_oid_item, entry.oid_name);
   1.965 +          if (entry.oid_tag == SEC_OID_UNKNOWN) {
   1.966 +            rv = SECFailure;
   1.967 +          }
   1.968 +          SECITEM_FreeItem(&ev_oid_item, false);
   1.969 +        }
   1.970 +      } else {
   1.971 +        PR_SetError(SEC_ERROR_BAD_DATA, 0);
   1.972 +        rv = SECFailure;
   1.973 +      }
   1.974 +    }
   1.975 +
   1.976 +    if (rv != SECSuccess) {
   1.977 +      CERT_DestroyCertificate(entry.cert);
   1.978 +      entry.cert = nullptr;
   1.979 +      entry.oid_tag = SEC_OID_UNKNOWN;
   1.980 +      return PR_FAILURE;
   1.981 +    }
   1.982 +  }
   1.983 +
   1.984 +  return PR_SUCCESS;
   1.985 +}
   1.986 +
   1.987 +static PRCallOnceType sIdentityInfoCallOnce;
   1.988 +
   1.989 +void
   1.990 +EnsureIdentityInfoLoaded()
   1.991 +{
   1.992 +  (void) PR_CallOnce(&sIdentityInfoCallOnce, IdentityInfoInit);
   1.993 +}
   1.994 +
   1.995 +void
   1.996 +CleanupIdentityInfo()
   1.997 +{
   1.998 +  for (size_t iEV = 0; iEV < PR_ARRAY_SIZE(myTrustedEVInfos); ++iEV) {
   1.999 +    nsMyTrustedEVInfo &entry = myTrustedEVInfos[iEV];
  1.1000 +    if (entry.cert) {
  1.1001 +      CERT_DestroyCertificate(entry.cert);
  1.1002 +      entry.cert = nullptr;
  1.1003 +    }
  1.1004 +  }
  1.1005 +
  1.1006 +  memset(&sIdentityInfoCallOnce, 0, sizeof(PRCallOnceType));
  1.1007 +}
  1.1008 +
  1.1009 +// Find the first policy OID that is known to be an EV policy OID.
  1.1010 +SECStatus
  1.1011 +GetFirstEVPolicy(CERTCertificate* cert, SECOidTag& outOidTag)
  1.1012 +{
  1.1013 +  if (!cert)
  1.1014 +    return SECFailure;
  1.1015 +
  1.1016 +  if (cert->extensions) {
  1.1017 +    for (int i=0; cert->extensions[i]; i++) {
  1.1018 +      const SECItem* oid = &cert->extensions[i]->id;
  1.1019 +
  1.1020 +      SECOidTag oidTag = SECOID_FindOIDTag(oid);
  1.1021 +      if (oidTag != SEC_OID_X509_CERTIFICATE_POLICIES)
  1.1022 +        continue;
  1.1023 +
  1.1024 +      SECItem* value = &cert->extensions[i]->value;
  1.1025 +
  1.1026 +      CERTCertificatePolicies* policies;
  1.1027 +      CERTPolicyInfo** policyInfos;
  1.1028 +
  1.1029 +      policies = CERT_DecodeCertificatePoliciesExtension(value);
  1.1030 +      if (!policies)
  1.1031 +        continue;
  1.1032 +
  1.1033 +      policyInfos = policies->policyInfos;
  1.1034 +
  1.1035 +      bool found = false;
  1.1036 +      while (*policyInfos) {
  1.1037 +        const CERTPolicyInfo* policyInfo = *policyInfos++;
  1.1038 +
  1.1039 +        SECOidTag oid_tag = policyInfo->oid;
  1.1040 +        if (oid_tag != SEC_OID_UNKNOWN && isEVPolicy(oid_tag)) {
  1.1041 +          // in our list of OIDs accepted for EV
  1.1042 +          outOidTag = oid_tag;
  1.1043 +          found = true;
  1.1044 +          break;
  1.1045 +        }
  1.1046 +      }
  1.1047 +      CERT_DestroyCertificatePoliciesExtension(policies);
  1.1048 +      if (found)
  1.1049 +        return SECSuccess;
  1.1050 +    }
  1.1051 +  }
  1.1052 +
  1.1053 +  return SECFailure;
  1.1054 +}
  1.1055 +
  1.1056 +} } // namespace mozilla::psm

mercurial