2011-04-19 09:57:58 -04:00
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package x509
import (
2011-10-14 15:06:54 -04:00
"crypto/x509/pkix"
2011-04-19 09:57:58 -04:00
"encoding/pem"
2011-11-01 22:04:37 -04:00
"errors"
2016-08-28 14:11:31 -05:00
"fmt"
2012-03-07 13:12:35 -05:00
"runtime"
2011-04-19 09:57:58 -04:00
"strings"
"testing"
2011-11-30 12:01:46 -05:00
"time"
2011-04-19 09:57:58 -04:00
)
2015-03-29 17:36:05 -07:00
var supportSHA2 = true
2011-04-19 09:57:58 -04:00
type verifyTest struct {
2013-01-21 11:25:28 -05:00
leaf string
intermediates [ ] string
roots [ ] string
currentTime int64
dnsName string
systemSkip bool
keyUsages [ ] ExtKeyUsage
testSystemRootsError bool
2015-03-29 17:36:05 -07:00
sha2 bool
2011-04-19 09:57:58 -04:00
2011-11-01 22:04:37 -04:00
errorCallback func ( * testing . T , int , error ) bool
2011-04-19 09:57:58 -04:00
expectedChains [ ] [ ] string
}
var verifyTests = [ ] verifyTest {
2013-01-21 11:25:28 -05:00
{
leaf : googleLeaf ,
2014-03-27 17:56:02 -04:00
intermediates : [ ] string { giag2Intermediate } ,
currentTime : 1395785200 ,
2013-01-21 11:25:28 -05:00
dnsName : "www.google.com" ,
testSystemRootsError : true ,
// Without any roots specified we should get a system roots
// error.
errorCallback : expectSystemRootsError ,
} ,
2011-04-19 09:57:58 -04:00
{
leaf : googleLeaf ,
2014-03-27 17:56:02 -04:00
intermediates : [ ] string { giag2Intermediate } ,
roots : [ ] string { geoTrustRoot } ,
currentTime : 1395785200 ,
2011-04-19 09:57:58 -04:00
dnsName : "www.google.com" ,
expectedChains : [ ] [ ] string {
2014-03-27 17:56:02 -04:00
{ "Google" , "Google Internet Authority" , "GeoTrust" } ,
2011-04-19 09:57:58 -04:00
} ,
} ,
2012-01-31 11:00:16 -05:00
{
leaf : googleLeaf ,
2014-03-27 17:56:02 -04:00
intermediates : [ ] string { giag2Intermediate } ,
roots : [ ] string { geoTrustRoot } ,
currentTime : 1395785200 ,
2012-01-31 11:00:16 -05:00
dnsName : "WwW.GooGLE.coM" ,
expectedChains : [ ] [ ] string {
2014-03-27 17:56:02 -04:00
{ "Google" , "Google Internet Authority" , "GeoTrust" } ,
2012-01-31 11:00:16 -05:00
} ,
} ,
2011-04-19 09:57:58 -04:00
{
leaf : googleLeaf ,
2014-03-27 17:56:02 -04:00
intermediates : [ ] string { giag2Intermediate } ,
roots : [ ] string { geoTrustRoot } ,
currentTime : 1395785200 ,
2011-04-19 09:57:58 -04:00
dnsName : "www.example.com" ,
errorCallback : expectHostnameError ,
} ,
{
leaf : googleLeaf ,
2014-03-27 17:56:02 -04:00
intermediates : [ ] string { giag2Intermediate } ,
roots : [ ] string { geoTrustRoot } ,
2011-04-19 09:57:58 -04:00
currentTime : 1 ,
dnsName : "www.example.com" ,
errorCallback : expectExpired ,
} ,
{
leaf : googleLeaf ,
2014-03-27 17:56:02 -04:00
roots : [ ] string { geoTrustRoot } ,
currentTime : 1395785200 ,
2011-04-19 09:57:58 -04:00
dnsName : "www.google.com" ,
2012-03-07 13:12:35 -05:00
// Skip when using systemVerify, since Windows
// *will* find the missing intermediate cert.
systemSkip : true ,
2011-04-19 09:57:58 -04:00
errorCallback : expectAuthorityUnknown ,
} ,
{
leaf : googleLeaf ,
2014-03-27 17:56:02 -04:00
intermediates : [ ] string { geoTrustRoot , giag2Intermediate } ,
roots : [ ] string { geoTrustRoot } ,
currentTime : 1395785200 ,
2011-04-19 09:57:58 -04:00
dnsName : "www.google.com" ,
expectedChains : [ ] [ ] string {
2014-03-27 17:56:02 -04:00
{ "Google" , "Google Internet Authority" , "GeoTrust" } ,
// TODO(agl): this is ok, but it would be nice if the
// chain building didn't visit the same SPKI
// twice.
{ "Google" , "Google Internet Authority" , "GeoTrust" , "GeoTrust" } ,
2011-04-19 09:57:58 -04:00
} ,
2014-03-28 10:36:52 -04:00
// CAPI doesn't build the chain with the duplicated GeoTrust
// entry so the results don't match. Thus we skip this test
// until that's fixed.
systemSkip : true ,
2011-04-19 09:57:58 -04:00
} ,
{
2011-07-07 18:06:50 -04:00
leaf : dnssecExpLeaf ,
intermediates : [ ] string { startComIntermediate } ,
roots : [ ] string { startComRoot } ,
2011-04-19 09:57:58 -04:00
currentTime : 1302726541 ,
expectedChains : [ ] [ ] string {
2011-09-06 16:04:55 -07:00
{ "dnssec-exp" , "StartCom Class 1" , "StartCom Certification Authority" } ,
2011-04-19 09:57:58 -04:00
} ,
} ,
{
leaf : dnssecExpLeaf ,
2011-07-07 18:06:50 -04:00
intermediates : [ ] string { startComIntermediate , startComRoot } ,
2011-04-19 09:57:58 -04:00
roots : [ ] string { startComRoot } ,
currentTime : 1302726541 ,
2012-03-07 13:12:35 -05:00
// Skip when using systemVerify, since Windows
// can only return a single chain to us (for now).
systemSkip : true ,
2011-04-19 09:57:58 -04:00
expectedChains : [ ] [ ] string {
2011-09-06 16:04:55 -07:00
{ "dnssec-exp" , "StartCom Class 1" , "StartCom Certification Authority" } ,
{ "dnssec-exp" , "StartCom Class 1" , "StartCom Certification Authority" , "StartCom Certification Authority" } ,
2011-04-19 09:57:58 -04:00
} ,
} ,
2013-05-20 14:20:26 -04:00
{
leaf : googleLeafWithInvalidHash ,
2014-03-27 17:56:02 -04:00
intermediates : [ ] string { giag2Intermediate } ,
roots : [ ] string { geoTrustRoot } ,
currentTime : 1395785200 ,
2013-05-20 14:20:26 -04:00
dnsName : "www.google.com" ,
// The specific error message may not occur when using system
// verification.
systemSkip : true ,
errorCallback : expectHashError ,
} ,
2012-06-20 16:18:56 -04:00
{
// The default configuration should reject an S/MIME chain.
leaf : smimeLeaf ,
roots : [ ] string { smimeIntermediate } ,
currentTime : 1339436154 ,
// Key usage not implemented for Windows yet.
systemSkip : true ,
errorCallback : expectUsageError ,
} ,
{
leaf : smimeLeaf ,
roots : [ ] string { smimeIntermediate } ,
currentTime : 1339436154 ,
keyUsages : [ ] ExtKeyUsage { ExtKeyUsageServerAuth } ,
// Key usage not implemented for Windows yet.
systemSkip : true ,
errorCallback : expectUsageError ,
} ,
{
leaf : smimeLeaf ,
roots : [ ] string { smimeIntermediate } ,
currentTime : 1339436154 ,
keyUsages : [ ] ExtKeyUsage { ExtKeyUsageEmailProtection } ,
// Key usage not implemented for Windows yet.
systemSkip : true ,
expectedChains : [ ] [ ] string {
{ "Ryan Hurst" , "GlobalSign PersonalSign 2 CA - G2" } ,
} ,
} ,
2013-02-09 13:20:25 -05:00
{
leaf : megaLeaf ,
intermediates : [ ] string { comodoIntermediate1 } ,
roots : [ ] string { comodoRoot } ,
currentTime : 1360431182 ,
2013-02-09 13:51:39 -05:00
// CryptoAPI can find alternative validation paths so we don't
// perform this test with system validation.
systemSkip : true ,
2013-02-09 13:20:25 -05:00
expectedChains : [ ] [ ] string {
{ "mega.co.nz" , "EssentialSSL CA" , "COMODO Certification Authority" } ,
} ,
} ,
2013-10-21 19:01:24 -04:00
{
// Check that a name constrained intermediate works even when
// it lists multiple constraints.
leaf : nameConstraintsLeaf ,
intermediates : [ ] string { nameConstraintsIntermediate1 , nameConstraintsIntermediate2 } ,
roots : [ ] string { globalSignRoot } ,
currentTime : 1382387896 ,
dnsName : "secure.iddl.vt.edu" ,
expectedChains : [ ] [ ] string {
{
"Technology-enhanced Learning and Online Strategies" ,
"Virginia Tech Global Qualified Server CA" ,
"Trusted Root CA G2" ,
"GlobalSign Root CA" ,
} ,
} ,
} ,
2014-04-14 12:12:06 -07:00
{
// Check that SHA-384 intermediates (which are popping up)
// work.
leaf : moipLeafCert ,
2014-04-14 13:23:58 -07:00
intermediates : [ ] string { comodoIntermediateSHA384 , comodoRSAAuthority } ,
roots : [ ] string { addTrustRoot } ,
2014-04-14 12:12:06 -07:00
currentTime : 1397502195 ,
dnsName : "api.moip.com.br" ,
2015-07-22 13:11:54 -04:00
// CryptoAPI can find alternative validation paths so we don't
// perform this test with system validation.
systemSkip : true ,
2015-03-29 17:36:05 -07:00
sha2 : true ,
2014-04-14 12:12:06 -07:00
expectedChains : [ ] [ ] string {
{
"api.moip.com.br" ,
"COMODO RSA Extended Validation Secure Server CA" ,
"COMODO RSA Certification Authority" ,
2014-04-14 13:23:58 -07:00
"AddTrust External CA Root" ,
2014-04-14 12:12:06 -07:00
} ,
} ,
} ,
2016-08-18 16:44:08 -07:00
{
// Putting a certificate as a root directly should work as a
// way of saying “exactly this”.
leaf : selfSigned ,
roots : [ ] string { selfSigned } ,
currentTime : 1471624472 ,
dnsName : "foo.example" ,
systemSkip : true ,
expectedChains : [ ] [ ] string {
{ "Acme Co" } ,
} ,
} ,
{
// Putting a certificate as a root directly should not skip
// other checks however.
leaf : selfSigned ,
roots : [ ] string { selfSigned } ,
currentTime : 1471624472 ,
dnsName : "notfoo.example" ,
systemSkip : true ,
errorCallback : expectHostnameError ,
} ,
2011-04-19 09:57:58 -04:00
}
2011-11-01 22:04:37 -04:00
func expectHostnameError ( t * testing . T , i int , err error ) ( ok bool ) {
2011-04-19 09:57:58 -04:00
if _ , ok := err . ( HostnameError ) ; ! ok {
t . Errorf ( "#%d: error was not a HostnameError: %s" , i , err )
return false
}
return true
}
2011-11-01 22:04:37 -04:00
func expectExpired ( t * testing . T , i int , err error ) ( ok bool ) {
2011-04-19 09:57:58 -04:00
if inval , ok := err . ( CertificateInvalidError ) ; ! ok || inval . Reason != Expired {
t . Errorf ( "#%d: error was not Expired: %s" , i , err )
return false
}
return true
}
2012-06-20 16:18:56 -04:00
func expectUsageError ( t * testing . T , i int , err error ) ( ok bool ) {
if inval , ok := err . ( CertificateInvalidError ) ; ! ok || inval . Reason != IncompatibleUsage {
t . Errorf ( "#%d: error was not IncompatibleUsage: %s" , i , err )
return false
}
return true
}
2011-11-01 22:04:37 -04:00
func expectAuthorityUnknown ( t * testing . T , i int , err error ) ( ok bool ) {
2011-04-19 09:57:58 -04:00
if _ , ok := err . ( UnknownAuthorityError ) ; ! ok {
t . Errorf ( "#%d: error was not UnknownAuthorityError: %s" , i , err )
return false
}
return true
}
2013-01-21 11:25:28 -05:00
func expectSystemRootsError ( t * testing . T , i int , err error ) bool {
if _ , ok := err . ( SystemRootsError ) ; ! ok {
t . Errorf ( "#%d: error was not SystemRootsError: %s" , i , err )
return false
}
return true
}
2013-05-20 14:20:26 -04:00
func expectHashError ( t * testing . T , i int , err error ) bool {
if err == nil {
t . Errorf ( "#%d: no error resulted from invalid hash" , i )
return false
}
if expected := "algorithm unimplemented" ; ! strings . Contains ( err . Error ( ) , expected ) {
t . Errorf ( "#%d: error resulting from invalid hash didn't contain '%s', rather it was: %s" , i , expected , err )
return false
}
return true
}
2011-11-01 22:04:37 -04:00
func certificateFromPEM ( pemBytes string ) ( * Certificate , error ) {
2011-04-19 09:57:58 -04:00
block , _ := pem . Decode ( [ ] byte ( pemBytes ) )
if block == nil {
2011-11-01 22:04:37 -04:00
return nil , errors . New ( "failed to decode PEM" )
2011-04-19 09:57:58 -04:00
}
return ParseCertificate ( block . Bytes )
}
2012-03-07 13:12:35 -05:00
func testVerify ( t * testing . T , useSystemRoots bool ) {
2011-04-19 09:57:58 -04:00
for i , test := range verifyTests {
2012-03-07 13:12:35 -05:00
if useSystemRoots && test . systemSkip {
continue
}
2013-01-24 01:20:17 +08:00
if runtime . GOOS == "windows" && test . testSystemRootsError {
continue
}
2015-03-29 17:36:05 -07:00
if useSystemRoots && ! supportSHA2 && test . sha2 {
continue
}
2012-03-07 13:12:35 -05:00
2011-04-19 09:57:58 -04:00
opts := VerifyOptions {
Intermediates : NewCertPool ( ) ,
DNSName : test . dnsName ,
2011-11-30 12:01:46 -05:00
CurrentTime : time . Unix ( test . currentTime , 0 ) ,
2012-06-20 16:18:56 -04:00
KeyUsages : test . keyUsages ,
2011-04-19 09:57:58 -04:00
}
2012-03-07 13:12:35 -05:00
if ! useSystemRoots {
opts . Roots = NewCertPool ( )
for j , root := range test . roots {
ok := opts . Roots . AppendCertsFromPEM ( [ ] byte ( root ) )
if ! ok {
t . Errorf ( "#%d: failed to parse root #%d" , i , j )
return
}
2011-04-19 09:57:58 -04:00
}
}
for j , intermediate := range test . intermediates {
ok := opts . Intermediates . AppendCertsFromPEM ( [ ] byte ( intermediate ) )
if ! ok {
2011-04-26 10:26:22 -04:00
t . Errorf ( "#%d: failed to parse intermediate #%d" , i , j )
2011-04-19 09:57:58 -04:00
return
}
}
leaf , err := certificateFromPEM ( test . leaf )
if err != nil {
t . Errorf ( "#%d: failed to parse leaf: %s" , i , err )
return
}
2013-01-21 11:25:28 -05:00
var oldSystemRoots * CertPool
if test . testSystemRootsError {
oldSystemRoots = systemRootsPool ( )
systemRoots = nil
opts . Roots = nil
}
2011-04-19 09:57:58 -04:00
chains , err := leaf . Verify ( opts )
2013-01-21 11:25:28 -05:00
if test . testSystemRootsError {
systemRoots = oldSystemRoots
}
2011-04-19 09:57:58 -04:00
if test . errorCallback == nil && err != nil {
t . Errorf ( "#%d: unexpected error: %s" , i , err )
}
if test . errorCallback != nil {
if ! test . errorCallback ( t , i , err ) {
return
}
}
if len ( chains ) != len ( test . expectedChains ) {
t . Errorf ( "#%d: wanted %d chains, got %d" , i , len ( test . expectedChains ) , len ( chains ) )
}
// We check that each returned chain matches a chain from
// expectedChains but an entry in expectedChains can't match
// two chains.
seenChains := make ( [ ] bool , len ( chains ) )
NextOutputChain :
for _ , chain := range chains {
TryNextExpected :
for j , expectedChain := range test . expectedChains {
if seenChains [ j ] {
continue
}
if len ( chain ) != len ( expectedChain ) {
continue
}
for k , cert := range chain {
2016-04-01 03:49:43 +02:00
if ! strings . Contains ( nameToKey ( & cert . Subject ) , expectedChain [ k ] ) {
2011-04-19 09:57:58 -04:00
continue TryNextExpected
}
}
// we matched
seenChains [ j ] = true
continue NextOutputChain
}
t . Errorf ( "#%d: No expected chain matched %s" , i , chainToDebugString ( chain ) )
}
}
}
2012-03-07 13:12:35 -05:00
func TestGoVerify ( t * testing . T ) {
testVerify ( t , false )
}
func TestSystemVerify ( t * testing . T ) {
if runtime . GOOS != "windows" {
2013-01-24 17:32:10 +11:00
t . Skipf ( "skipping verify test using system APIs on %q" , runtime . GOOS )
2012-03-07 13:12:35 -05:00
}
testVerify ( t , true )
}
2011-04-19 09:57:58 -04:00
func chainToDebugString ( chain [ ] * Certificate ) string {
var chainStr string
for _ , cert := range chain {
if len ( chainStr ) > 0 {
chainStr += " -> "
}
chainStr += nameToKey ( & cert . Subject )
}
return chainStr
}
2011-10-14 15:06:54 -04:00
func nameToKey ( name * pkix . Name ) string {
return strings . Join ( name . Country , "," ) + "/" + strings . Join ( name . Organization , "," ) + "/" + strings . Join ( name . OrganizationalUnit , "," ) + "/" + name . CommonName
}
2014-03-27 17:56:02 -04:00
const geoTrustRoot = ` -- -- - BEGIN CERTIFICATE -- -- -
MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
9 BcjGlZ + W988bDjkcbd4kdS8odhM + KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
fnGk5sRgprDvgOSJKA + eJdbtg / OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
iS2Aelet8u5fa9IAjbkU + BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
1 XupGc1V3sjs0l44U + VcT4wt / lAjNvxm5suOpDkZALeVAjmRCw7 + OC7RHQWa9k0 +
bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
MPRfwCvocWvk + QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH / MB0GA1UdDgQWBBTA
ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
Z57QzxpeR + nBsqTP3UEaBU6bS + 5 Kb1VSsyShNwrrZHYqLizz / Tt1kL / 6 cdjHPTfS
tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk / IH2uSrW4nOQdtqvmlKXBx4Ot2 / Un
hw4EbNX / 3 aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
5 fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw ==
2011-04-19 09:57:58 -04:00
-- -- - END CERTIFICATE -- -- -
`
2014-03-27 17:56:02 -04:00
const giag2Intermediate = ` -- -- - BEGIN CERTIFICATE -- -- -
MIIEBDCCAuygAwIBAgIDAjppMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
YWwgQ0EwHhcNMTMwNDA1MTUxNTU1WhcNMTUwNDA0MTUxNTU1WjBJMQswCQYDVQQG
EwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzElMCMGA1UEAxMcR29vZ2xlIEludGVy
bmV0IEF1dGhvcml0eSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AJwqBHdc2FCROgajguDYUEi8iT / xGXAaiEZ + 4 I / F8YnOIe5a / mENtzJEiaB0C1NP
VaTOgmKV7utZX8bhBYASxF6UP7xbSDj0U / ck5vuR6RXEz / RTDfRK / J9U3n2 + oGtv
h8DQUB8oMANA2ghzUWx //zo8pzcGjr1LEQTrfSTe5vn8MXH7lNVg8y5Kr0LSy+rE
ahqyzFPdFUuLH8gZYR / Nnag + YyuENWllhMgZxUYi + FOVvuOAShDGKuy6lyARxzmZ
EASg8GF6lSWMTlJ14rbtCMoU / M4iarNOz0YDl5cDfsCx3nuvRTPPuj5xt970JSXC
DTWJnZ37DhF5iR43xa + OcmkCAwEAAaOB + zCB + DAfBgNVHSMEGDAWgBTAephojYn7
qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUSt0GFhu89mi1dvWBtrtiGrpagS8wEgYD
VR0TAQH / BAgwBgEB / wIBADAOBgNVHQ8BAf8EBAMCAQYwOgYDVR0fBDMwMTAvoC2g
K4YpaHR0cDovL2NybC5nZW90cnVzdC5jb20vY3Jscy9ndGdsb2JhbC5jcmwwPQYI
KwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwOi8vZ3RnbG9iYWwtb2NzcC5n
ZW90cnVzdC5jb20wFwYDVR0gBBAwDjAMBgorBgEEAdZ5AgUBMA0GCSqGSIb3DQEB
BQUAA4IBAQA21waAESetKhSbOHezI6B1WLuxfoNCunLaHtiONgaX4PCVOzf9G0JY
/ iLIa704XtE7JW4S615ndkZAkNoUyHgN7ZVm2o6Gb4ChulYylYbc3GrKBIxbf / a /
zG + FA1jDaFETzf3I93k9mTXwVqO94FntT0QJo544evZG0R0SnU ++ 0 ED8Vf4GXjza
HFa9llF7b1cq26KqltyMdMKVvvBulRP / F / A8rLIQjcxz ++ iPAsbw + zOzlTvjwsto
WHPbqCRiOwY1nQ2pM714A5AuTHhdUDqB1O6gyHA43LL5Z / qHQF1hwFGPa4NrzQU6
yuGnBXj8ytqU0CwIPX4WecigUCAkVDNx
2011-04-19 09:57:58 -04:00
-- -- - END CERTIFICATE -- -- -
`
const googleLeaf = ` -- -- - BEGIN CERTIFICATE -- -- -
2014-03-27 17:56:02 -04:00
MIIEdjCCA16gAwIBAgIIcR5k4dkoe04wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE
BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl
cm5ldCBBdXRob3JpdHkgRzIwHhcNMTQwMzEyMDkzODMwWhcNMTQwNjEwMDAwMDAw
WjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN
TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEXMBUGA1UEAwwOd3d3
Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4zYCe
m0oUBhwE0EwBr65eBOcgcQO2PaSIAB2dEP / c1EMX2tOy0ov8rk83ePhJ + MWdT1z6
jge9X4zQQI8ZyA9qIiwrKBZOi8DNUvrqNZC7fJAVRrb9aX / 99 uYOJCypIbpmWG1q
fhbHjJewhwf8xYPj71eU4rLG80a + DapWmphtfq3h52lDQIBzLVf1yYbyrTaELaz4
NXF7HXb5YkId / gxIsSzM0aFUVu2o8sJcLYAsJqwfFKBKOMxUcn545nlspf0mTcWZ
0 APlbwsKznNs4 / xCDwIxxWjjqgHrYAFl6y07i1gzbAOqdNEyR24p + 3 JWI8WZBlBI
dk2KGj0W1fIfsvyxAgMBAAGjggFBMIIBPTAdBgNVHSUEFjAUBggrBgEFBQcDAQYI
KwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdvb2dsZS5jb20waAYIKwYBBQUHAQEE
XDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3J0
MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9vY3NwMB0G
A1UdDgQWBBTXD5Bx6iqT + dmEhbFL4OUoHyZn8zAMBgNVHRMBAf8EAjAAMB8GA1Ud
IwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMBcGA1UdIAQQMA4wDAYKKwYBBAHW
eQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lB
RzIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCR3RJtHzgDh33b / MI1ugiki + nl8Ikj
5 larbJRE / rcA5oite + QJyAr6SU1gJJ / rRrK3ItVEHr9L621BCM7GSdoNMjB9MMcf
tJAW0kYGJ + wqKm53wG / JaOADTnnq2Mt / j6F2uvjgN / ouns1nRHufIvd370N0LeH +
orKqTuAPzXK7imQk6 + OycYABbqCtC / 9 qmwRd8wwn7sF97DtYfK8WuNHtFalCAwyi
8 LxJJYJCLWoMhZ + V8GZm + FOex5qkQAjnZrtNlbQJ8ro4r + rpKXtmMFFhfa + 7 L + PA
Kom08eUK8skxAzfDDijZPh10VtJ66uBoiDPdT + uCBehcBIcmSTrKjFGX
-- -- - END CERTIFICATE -- -- -
`
2011-04-19 09:57:58 -04:00
2013-05-20 14:20:26 -04:00
// googleLeafWithInvalidHash is the same as googleLeaf, but the signature
// algorithm in the certificate contains a nonsense OID.
const googleLeafWithInvalidHash = ` -- -- - BEGIN CERTIFICATE -- -- -
2014-03-27 17:56:02 -04:00
MIIEdjCCA16gAwIBAgIIcR5k4dkoe04wDQYJKoZIhvcNAWAFBQAwSTELMAkGA1UE
BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl
cm5ldCBBdXRob3JpdHkgRzIwHhcNMTQwMzEyMDkzODMwWhcNMTQwNjEwMDAwMDAw
WjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN
TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEXMBUGA1UEAwwOd3d3
Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4zYCe
m0oUBhwE0EwBr65eBOcgcQO2PaSIAB2dEP / c1EMX2tOy0ov8rk83ePhJ + MWdT1z6
jge9X4zQQI8ZyA9qIiwrKBZOi8DNUvrqNZC7fJAVRrb9aX / 99 uYOJCypIbpmWG1q
fhbHjJewhwf8xYPj71eU4rLG80a + DapWmphtfq3h52lDQIBzLVf1yYbyrTaELaz4
NXF7HXb5YkId / gxIsSzM0aFUVu2o8sJcLYAsJqwfFKBKOMxUcn545nlspf0mTcWZ
0 APlbwsKznNs4 / xCDwIxxWjjqgHrYAFl6y07i1gzbAOqdNEyR24p + 3 JWI8WZBlBI
dk2KGj0W1fIfsvyxAgMBAAGjggFBMIIBPTAdBgNVHSUEFjAUBggrBgEFBQcDAQYI
KwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdvb2dsZS5jb20waAYIKwYBBQUHAQEE
XDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3J0
MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9vY3NwMB0G
A1UdDgQWBBTXD5Bx6iqT + dmEhbFL4OUoHyZn8zAMBgNVHRMBAf8EAjAAMB8GA1Ud
IwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMBcGA1UdIAQQMA4wDAYKKwYBBAHW
eQIFATAwBgNVHR8EKTAnMCWgI6Ahhh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lB
RzIuY3JsMA0GCSqGSIb3DQFgBQUAA4IBAQCR3RJtHzgDh33b / MI1ugiki + nl8Ikj
5 larbJRE / rcA5oite + QJyAr6SU1gJJ / rRrK3ItVEHr9L621BCM7GSdoNMjB9MMcf
tJAW0kYGJ + wqKm53wG / JaOADTnnq2Mt / j6F2uvjgN / ouns1nRHufIvd370N0LeH +
orKqTuAPzXK7imQk6 + OycYABbqCtC / 9 qmwRd8wwn7sF97DtYfK8WuNHtFalCAwyi
8 LxJJYJCLWoMhZ + V8GZm + FOex5qkQAjnZrtNlbQJ8ro4r + rpKXtmMFFhfa + 7 L + PA
Kom08eUK8skxAzfDDijZPh10VtJ66uBoiDPdT + uCBehcBIcmSTrKjFGX
-- -- - END CERTIFICATE -- -- -
`
2013-05-20 14:20:26 -04:00
2011-04-19 09:57:58 -04:00
const dnssecExpLeaf = ` -- -- - BEGIN CERTIFICATE -- -- -
MIIGzTCCBbWgAwIBAgIDAdD6MA0GCSqGSIb3DQEBBQUAMIGMMQswCQYDVQQGEwJJ
TDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0
YWwgQ2VydGlmaWNhdGUgU2lnbmluZzE4MDYGA1UEAxMvU3RhcnRDb20gQ2xhc3Mg
MSBQcmltYXJ5IEludGVybWVkaWF0ZSBTZXJ2ZXIgQ0EwHhcNMTAwNzA0MTQ1MjQ1
WhcNMTEwNzA1MTA1NzA0WjCBwTEgMB4GA1UEDRMXMjIxMTM3LWxpOWE5dHhJRzZM
NnNyVFMxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVQZXJzb25hIE5vdCBWYWxpZGF0
ZWQxKTAnBgNVBAsTIFN0YXJ0Q29tIEZyZWUgQ2VydGlmaWNhdGUgTWVtYmVyMRsw
GQYDVQQDExJ3d3cuZG5zc2VjLWV4cC5vcmcxKDAmBgkqhkiG9w0BCQEWGWhvc3Rt
YXN0ZXJAZG5zc2VjLWV4cC5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDEdF / 22 vaxrPbqpgVYMWi + alfpzBctpbfLBdPGuqOazJdCT0NbWcK8 / + B4
X6OlSOURNIlwLzhkmwVsWdVv6dVSaN7d4yI / fJkvgfDB9 + au + iBJb6Pcz8ULBfe6
D8HVvqKdORp6INzHz71z0sghxrQ0EAEkoWAZLh + kcn2ZHdcmZaBNUfjmGbyU6PRt
RjdqoP + owIaC1aktBN7zl4uO7cRjlYFdusINrh2kPP02KAx2W84xjxX1uyj6oS6e
7 eBfvcwe8czW / N1rbE0CoR7h9 + HnIrjnVG9RhBiZEiw3mUmF ++ Up26 + 4 KTdRKbu3
+ BL4yMpfd66z0 + zzqu + HkvyLpFn5AgMBAAGjggL / MIIC + zAJBgNVHRMEAjAAMAsG
A1UdDwQEAwIDqDATBgNVHSUEDDAKBggrBgEFBQcDATAdBgNVHQ4EFgQUy04I5guM
drzfh2JQaXhgV86 + 4 jUwHwYDVR0jBBgwFoAU60I00Jiwq5 / 0 G2sI98xkLu8OLEUw
LQYDVR0RBCYwJIISd3d3LmRuc3NlYy1leHAub3Jngg5kbnNzZWMtZXhwLm9yZzCC
AUIGA1UdIASCATkwggE1MIIBMQYLKwYBBAGBtTcBAgIwggEgMC4GCCsGAQUFBwIB
FiJodHRwOi8vd3d3LnN0YXJ0c3NsLmNvbS9wb2xpY3kucGRmMDQGCCsGAQUFBwIB
FihodHRwOi8vd3d3LnN0YXJ0c3NsLmNvbS9pbnRlcm1lZGlhdGUucGRmMIG3Bggr
BgEFBQcCAjCBqjAUFg1TdGFydENvbSBMdGQuMAMCAQEagZFMaW1pdGVkIExpYWJp
bGl0eSwgc2VlIHNlY3Rpb24gKkxlZ2FsIExpbWl0YXRpb25zKiBvZiB0aGUgU3Rh
cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUG9saWN5IGF2YWlsYWJsZSBh
dCBodHRwOi8vd3d3LnN0YXJ0c3NsLmNvbS9wb2xpY3kucGRmMGEGA1UdHwRaMFgw
KqAooCaGJGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2NydDEtY3JsLmNybDAqoCig
JoYkaHR0cDovL2NybC5zdGFydHNzbC5jb20vY3J0MS1jcmwuY3JsMIGOBggrBgEF
BQcBAQSBgTB / MDkGCCsGAQUFBzABhi1odHRwOi8vb2NzcC5zdGFydHNzbC5jb20v
c3ViL2NsYXNzMS9zZXJ2ZXIvY2EwQgYIKwYBBQUHMAKGNmh0dHA6Ly93d3cuc3Rh
cnRzc2wuY29tL2NlcnRzL3N1Yi5jbGFzczEuc2VydmVyLmNhLmNydDAjBgNVHRIE
HDAahhhodHRwOi8vd3d3LnN0YXJ0c3NsLmNvbS8wDQYJKoZIhvcNAQEFBQADggEB
ACXj6SB59KRJPenn6gUdGEqcta97U769SATyiQ87i9er64qLwvIGLMa3o2Rcgl2Y
kghUeyLdN / EXyFBYA8L8uvZREPoc7EZukpT / ZDLXy9i2S0jkOxvF2fD / XLbcjGjM
iEYG1 / 6 ASw0ri9C0k4oDDoJLCoeH9 ++ yqF7SFCCMcDkJqiAGXNb4euDpa8vCCtEQ
CSS + ObZbfkreRt3cNCf5LfCXe9OsTnCfc8Cuq81c0oLaG + SmaLUQNBuToq8e9 / Zm
+ b + / a3RVjxmkV5OCcGVBxsXNDn54Q6wsdw0TBMcjwoEndzpLS7yWgFbbkq5ZiGpw
Qibb2 + CfKuQ + WFV1GkVQmVA =
-- -- - END CERTIFICATE -- -- - `
const startComIntermediate = ` -- -- - BEGIN CERTIFICATE -- -- -
MIIGNDCCBBygAwIBAgIBGDANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW
MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkwHhcNMDcxMDI0MjA1NDE3WhcNMTcxMDI0MjA1NDE3WjCB
jDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xKzApBgNVBAsT
IlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25pbmcxODA2BgNVBAMTL1N0
YXJ0Q29tIENsYXNzIDEgUHJpbWFyeSBJbnRlcm1lZGlhdGUgU2VydmVyIENBMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtonGrO8JUngHrJJj0PREGBiE
gFYfka7hh / oyULTTRwbw5gdfcA4Q9x3AzhA2NIVaD5Ksg8asWFI / ujjo / OenJOJA
pgh2wJJuniptTT9uYSAK21ne0n1jsz5G / vohURjXzTCm7QduO3CHtPn66 + 6 CPAVv
kvek3AowHpNz / gfK11 + AnSJYUq4G2ouHI2mw5CrY6oPSvfNx23BaKA + vWjhwRRI /
ME3NO68X5Q / LoKldSKqxYVDLNM08XMML6BDAjJvwAwNi / rJsPnIO7hxDKslIDlc5
xDEhyBDBLIf + VJVSH1I8MRKbf + fAoKVZ1eKPPvDVqOHXcDGpxLPPr21TLwb0pwID
AQABo4IBrTCCAakwDwYDVR0TAQH / BAUwAwEB / zAOBgNVHQ8BAf8EBAMCAQYwHQYD
VR0OBBYEFOtCNNCYsKuf9BtrCPfMZC7vDixFMB8GA1UdIwQYMBaAFE4L7xqkQFul
F2mHMMo0aEPQQa7yMGYGCCsGAQUFBwEBBFowWDAnBggrBgEFBQcwAYYbaHR0cDov
L29jc3Auc3RhcnRzc2wuY29tL2NhMC0GCCsGAQUFBzAChiFodHRwOi8vd3d3LnN0
YXJ0c3NsLmNvbS9zZnNjYS5jcnQwWwYDVR0fBFQwUjAnoCWgI4YhaHR0cDovL3d3
dy5zdGFydHNzbC5jb20vc2ZzY2EuY3JsMCegJaAjhiFodHRwOi8vY3JsLnN0YXJ0
c3NsLmNvbS9zZnNjYS5jcmwwgYAGA1UdIAR5MHcwdQYLKwYBBAGBtTcBAgEwZjAu
BggrBgEFBQcCARYiaHR0cDovL3d3dy5zdGFydHNzbC5jb20vcG9saWN5LnBkZjA0
BggrBgEFBQcCARYoaHR0cDovL3d3dy5zdGFydHNzbC5jb20vaW50ZXJtZWRpYXRl
LnBkZjANBgkqhkiG9w0BAQUFAAOCAgEAIQlJPqWIbuALi0jaMU2P91ZXouHTYlfp
tVbzhUV1O + VQHwSL5qBaPucAroXQ + / 8 gA2TLrQLhxpFy + KNN1t7ozD + hiqLjfDen
xk + PNdb01m4Ge90h2c9W / 8 swIkn + iQTzheWq8ecf6HWQTd35RvdCNPdFWAwRDYSw
xtpdPvkBnufh2lWVvnQce / xNFE + sflVHfXv0pQ1JHpXo9xLBzP92piVH0PN1Nb6X
t1gW66pceG / sUzCv6gRNzKkC4 / C2BBL2MLERPZBOVmTX3DxDX3M570uvh + v2 / miI
RHLq0gfGabDBoYvvF0nXYbFFSF87ICHpW7LM9NfpMfULFWE7epTj69m8f5SuauNi
YpaoZHy4h / OZMn6SolK + u / hlz8nyMPyLwcKmltdfieFcNID1j0cHL7SRv7Gifl9L
WtBbnySGBVFaaQNlQ0lxxeBvlDRr9hvYqbBMflPrj0jfyjO1SPo2ShpTpjMM0InN
SRXNiTE8kMBy12VLUjWKRhFEuT2OKGWmPnmeXAhEKa2wNREuIU640ucQPl2Eg7PD
wuTSxv0JS3QJ3fGz0xk + gA2iCxnwOOfFwq / iI9th4p1cbiCJSS4jarJiwUW0n6 + L
p / EiO / h94pDQehn7Skzj0n1fSoMD7SfWI55rjbRZotnvbIIp3XUZPD9MEI3vu3Un
0 q6Dp6jOW6c =
-- -- - END CERTIFICATE -- -- - `
const startComRoot = ` -- -- - BEGIN CERTIFICATE -- -- -
MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW
MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9
MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y + v / uqwQVlntsQGfQqedIXWeUyAN3rf
OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp / Ho / u7TTQEceWzVI9ujPW3U3eCztKS5 / C
Ji / 6 tRYccjV3yjxd5srhJosaNnZcAdt0FCX + 7 bWgiA / deMotHweXMAEtcnn6RtYT
Kqi5pquDSR3l8u / d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK + F2PrRt2PZE4XNi
HzvEvqBTViVsUQn3qqvKv3b9bZvzndu / PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
Av + Z6 + hsTXBbKWWc3apdzK8BMewM69KN6Oqce + Zu9ydmDBpI125C4z / eIT574Q1w
+ 2 OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ / GP / 89 PrNbpHoNkm +
Gkhpi8KWTRoSsmkXwQqQ1vp5Iki / untp + HDH + no32NgN0nZPV / + Qt + OR0t3vwmC3
Zzrd / qqc8NSLf3Iizsafl7b4r4qgEKjZ + xjGtrVcUjyJthkqcwEKDwOzEmDyei + B
26 Nu / yYwl / WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB / zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j
ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js
LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM
BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0
Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy
dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh
cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh
YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg
dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp
bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ
YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG + EIBDQQrFilTdGFydENvbSBGcmVlIFNT
TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ
9 GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8
jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW
FjgKXlf2Ysd6AgXmvB618p70qSmD + LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz
ewT4F + irsfMuXGRuczE6Eri8sxHkfY + BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1
ny + v8OqCQ5j4aZyJecRDjkZy42Q2Eq / 3 JR44iZB3fsNrarnDy0RLrHiQi + fHLB5L
EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo + 2 EuvoSoOMCZEoalHmdkrQYu
L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu + Pwq
yvqCUqDvr0tVk + vBtfAii6w0TiYiBKGHLHVKt + V9E9e4DGTANtLJL4YSjCMJwRuC
O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V
um0ABj6y6koQOdjQK / W / 7 HW / lwLFCRsI3FU34oH7N4RDYiDK51ZLZer + bMEkkySh
NOsF / 5 oirpt9P / FlUQqmMGqz9IgcgA38corog14 =
-- -- - END CERTIFICATE -- -- - `
2012-06-20 16:18:56 -04:00
const smimeLeaf = ` -- -- - BEGIN CERTIFICATE -- -- -
MIIFBjCCA + 6 gAwIBAgISESFvrjT8XcJTEe6rBlPptILlMA0GCSqGSIb3DQEBBQUA
MFQxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMSowKAYD
VQQDEyFHbG9iYWxTaWduIFBlcnNvbmFsU2lnbiAyIENBIC0gRzIwHhcNMTIwMTIz
MTYzNjU5WhcNMTUwMTIzMTYzNjU5WjCBlDELMAkGA1UEBhMCVVMxFjAUBgNVBAgT
DU5ldyBIYW1zcGhpcmUxEzARBgNVBAcTClBvcnRzbW91dGgxGTAXBgNVBAoTEEds
b2JhbFNpZ24sIEluYy4xEzARBgNVBAMTClJ5YW4gSHVyc3QxKDAmBgkqhkiG9w0B
CQEWGXJ5YW4uaHVyc3RAZ2xvYmFsc2lnbi5jb20wggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQC4ASSTvavmsFQAob60ukSSwOAL9nT / s99ltNUCAf5fPH5j
NceMKxaQse2miOmRRIXaykcq1p / TbI70Ztce38r2mbOwqDHHPVi13GxJEyUXWgaR
BteDMu5OGyWNG1kchVsGWpbstT0Z4v0md5m1BYFnxB20ebJyOR2lXDxsFK28nnKV
+ 5 eMj76U8BpPQ4SCH7yTMG6y0XXsB3cCrBKr2o3TOYgEKv + oNnbaoMt3UxMt9nSf
9 jyIshjqfnT5Aew3CUNMatO55g5FXXdIukAweg1YSb1ls05qW3sW00T3d7dQs9 / 7
NuxCg / A2elmVJSoy8 + MLR8JSFEf / aMgjO / TyLg / jAgMBAAGjggGPMIIBizAOBgNV
HQ8BAf8EBAMCBaAwTQYDVR0gBEYwRDBCBgorBgEEAaAyASgKMDQwMgYIKwYBBQUH
AgEWJmh0dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMCQGA1Ud
EQQdMBuBGXJ5YW4uaHVyc3RAZ2xvYmFsc2lnbi5jb20wCQYDVR0TBAIwADAdBgNV
HSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwQwYDVR0fBDwwOjA4oDagNIYyaHR0
cDovL2NybC5nbG9iYWxzaWduLmNvbS9ncy9nc3BlcnNvbmFsc2lnbjJnMi5jcmww
VQYIKwYBBQUHAQEESTBHMEUGCCsGAQUFBzAChjlodHRwOi8vc2VjdXJlLmdsb2Jh
bHNpZ24uY29tL2NhY2VydC9nc3BlcnNvbmFsc2lnbjJnMi5jcnQwHQYDVR0OBBYE
FFWiECe0 / L72eVYqcWYnLV6SSjzhMB8GA1UdIwQYMBaAFD8V0m18L + cxnkMKBqiU
bCw7xe5lMA0GCSqGSIb3DQEBBQUAA4IBAQAhQi6hLPeudmf3IBF4IDzCvRI0FaYd
BKfprSk / H0PDea4vpsLbWpA0t0SaijiJYtxKjlM4bPd + 2 chb7ejatDdyrZIzmDVy
q4c30 / xMninGKokpYA11 / Ve + i2dvjulu65qasrtQRGybAuuZ67lrp / K3OMFgjV5N
C3AHYLzvNU4Dwc4QQ1BaMOg6KzYSrKbABRZajfrpC9uiePsv7mDIXLx / toBPxWNl
a5vJm5DrZdn7uHdvBCE6kMykbOLN5pmEK0UIlwKh6Qi5XD0pzlVkEZliFkBMJgub
d / eF7xeg7TKPWC5xyOFp9SdMolJM7LTC3wnSO3frBAev + q / nGs9Xxyvs
-- -- - END CERTIFICATE -- -- - `
const smimeIntermediate = ` -- -- - BEGIN CERTIFICATE -- -- -
MIIEFjCCAv6gAwIBAgILBAAAAAABL07hL1IwDQYJKoZIhvcNAQEFBQAwVzELMAkG
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xMTA0MTMxMDAw
MDBaFw0xOTA0MTMxMDAwMDBaMFQxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
YWxTaWduIG52LXNhMSowKAYDVQQDEyFHbG9iYWxTaWduIFBlcnNvbmFsU2lnbiAy
IENBIC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBa0H5Nez4
En3dIlFpX7e5E0YndxQ74xOBbz7kdBd + DLX0LOQMjVPU3DAgKL9ujhH + ZhHkURbH
3 X / 94 TQSUL / z2JjsaQvS0NqyZXHhM5eeuquzOJRzEQ8 + odETzHg2G0Erv7yjSeww
gkwDWDJnYUDlOjYTDUEG6 + i + 8 Mn425reo4I0E277wD542kmVWeW7 + oHv5dZo9e1Q
yWwiKTEP6BEQVVSBgThXMG4traSSDRUt3T1eQTZx5EObpiBEBO4OTqiBTJfg4vEI
YgkXzKLpnfszTB6YMDpR9 / QS6p3ANB3kfAb + t6udSO3WCst0DGrwHDLBFGDR4UeY
T5KGGnI7cWL7AgMBAAGjgeUwgeIwDgYDVR0PAQH / BAQDAgEGMBIGA1UdEwEB / wQI
MAYBAf8CAQAwHQYDVR0OBBYEFD8V0m18L + cxnkMKBqiUbCw7xe5lMEcGA1UdIARA
MD4wPAYEVR0gADA0MDIGCCsGAQUFBwIBFiZodHRwczovL3d3dy5nbG9iYWxzaWdu
LmNvbS9yZXBvc2l0b3J5LzAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8vY3JsLmds
b2JhbHNpZ24ubmV0L3Jvb3QuY3JsMB8GA1UdIwQYMBaAFGB7ZhpFDZfKiVAvfQTN
NKj //P1LMA0GCSqGSIb3DQEBBQUAA4IBAQBDc3nMpMxJMQMcYUCB3+C73UpvwDE8
eCOr7t2F / uaQKKcyqqstqLZc6vPwI / rcE9oDHugY5QEjQzIBIEaTnN6P0vege2IX
eCOr7t2F / uaQKKcyqqstqLZc6vPwI / rcE9oDHugY5QEjQzIBIEaTnN6P0vege2IX
YEvTWbWwGdPytDFPYIl3 / 6 OqNSXSnZ7DxPcdLJq2uyiga8PB / TTIIHYkdM2 + 1 DE0
7 y3rH / 7 TjwDVD7SLu5 / SdOfKskuMPTjOEvz3K161mymW06klVhubCIWOro / Gx1Q2
2 FQOZ7 / 2 k4uYoOdBTSlb8kTAuzZNgIE0rB2BIYCTz / P6zZIKW0ogbRSH
-- -- - END CERTIFICATE -- -- - `
2013-02-09 13:20:25 -05:00
var megaLeaf = ` -- -- - BEGIN CERTIFICATE -- -- -
MIIFOjCCBCKgAwIBAgIQWYE8Dup170kZ + k11Lg51OjANBgkqhkiG9w0BAQUFADBy
MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYD
VQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEYMBYGA1UE
AxMPRXNzZW50aWFsU1NMIENBMB4XDTEyMTIxNDAwMDAwMFoXDTE0MTIxNDIzNTk1
OVowfzEhMB8GA1UECxMYRG9tYWluIENvbnRyb2wgVmFsaWRhdGVkMS4wLAYDVQQL
EyVIb3N0ZWQgYnkgSW5zdHJhIENvcnBvcmF0aW9uIFB0eS4gTFREMRUwEwYDVQQL
EwxFc3NlbnRpYWxTU0wxEzARBgNVBAMTCm1lZ2EuY28ubnowggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQDcxMCClae8BQIaJHBUIVttlLvhbK4XhXPk3RQ3
G5XA6tLZMBQ33l3F9knYJ0YErXtr8IdfYoulRQFmKFMJl9GtWyg4cGQi2Rcr5VN5
S5dA1vu4oyJBxE9fPELcK6Yz1vqaf + n6za + mYTiQYKggVdS8 / s8hmNuXP9Zk1pIn
+ q0pGsf8NAcSHMJgLqPQrTDw + zae4V03DvcYfNKjuno88d2226ld7MAmQZ7uRNsI
/ CnkdelVs + akZsXf0szefSqMJlf08SY32t2jj4Ra7RApVYxOftD9nij / aLfuqOU6
ow6IgIcIG2ZvXLZwK87c5fxL7UAsTTV + M1sVv8jA33V2oKLhAgMBAAGjggG9MIIB
uTAfBgNVHSMEGDAWgBTay + qtWwhdzP / 8 JlTOSeVVxjj0 + DAdBgNVHQ4EFgQUmP9l
6 zhyrZ06Qj4zogt + 6 LKFk4AwDgYDVR0PAQH / BAQDAgWgMAwGA1UdEwEB / wQCMAAw
NAYDVR0lBC0wKwYIKwYBBQUHAwEGCCsGAQUFBwMCBgorBgEEAYI3CgMDBglghkgB
hvhCBAEwTwYDVR0gBEgwRjA6BgsrBgEEAbIxAQICBzArMCkGCCsGAQUFBwIBFh1o
dHRwczovL3NlY3VyZS5jb21vZG8uY29tL0NQUzAIBgZngQwBAgEwOwYDVR0fBDQw
MjAwoC6gLIYqaHR0cDovL2NybC5jb21vZG9jYS5jb20vRXNzZW50aWFsU1NMQ0Eu
Y3JsMG4GCCsGAQUFBwEBBGIwYDA4BggrBgEFBQcwAoYsaHR0cDovL2NydC5jb21v
ZG9jYS5jb20vRXNzZW50aWFsU1NMQ0FfMi5jcnQwJAYIKwYBBQUHMAGGGGh0dHA6
Ly9vY3NwLmNvbW9kb2NhLmNvbTAlBgNVHREEHjAcggptZWdhLmNvLm56gg53d3cu
bWVnYS5jby5uejANBgkqhkiG9w0BAQUFAAOCAQEAcYhrsPSvDuwihMOh0ZmRpbOE
Gw6LqKgLNTmaYUPQhzi2cyIjhUhNvugXQQlP5f0lp5j8cixmArafg1dTn4kQGgD3
ivtuhBTgKO1VYB / VRoAt6Lmswg3YqyiS7JiLDZxjoV7KoS5xdiaINfHDUaBBY4ZH
j2BUlPniNBjCqXe / HndUTVUewlxbVps9FyCmH + C4o9DWzdGBzDpCkcmo5nM + cp7q
ZhTIFTvZfo3zGuBoyu8BzuopCJcFRm3cRiXkpI7iOMUIixO1szkJS6WpL1sKdT73
UXp08U0LBqoqG130FbzEJBBV3ixbvY6BWMHoCWuaoF12KJnC5kHt2RoWAAgMXA ==
-- -- - END CERTIFICATE -- -- - `
var comodoIntermediate1 = ` -- -- - BEGIN CERTIFICATE -- -- -
MIIFAzCCA + ugAwIBAgIQGLLLuqME8aAPwfLzJkYqSjANBgkqhkiG9w0BAQUFADCB
gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
MDBaFw0xOTEyMzEyMzU5NTlaMHIxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVh
dGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9E
TyBDQSBMaW1pdGVkMRgwFgYDVQQDEw9Fc3NlbnRpYWxTU0wgQ0EwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCt8AiwcsargxIxF3CJhakgEtSYau2A1NHf
5 I5ZLdOWIY120j8YC0YZYwvHIPPlC92AGvFaoL0dds23Izp0XmEbdaqb1IX04XiR
0 y3hr / yYLgbSeT1awB8hLRyuIVPGOqchfr7tZ291HRqfalsGs2rjsQuqag7nbWzD
ypWMN84hHzWQfdvaGlyoiBSyD8gSIF / F03 / o4Tjg27z5H6Gq1huQByH6RSRQXScq
oChBRVt9vKCiL6qbfltTxfEFFld + Edc7tNkBdtzffRDPUanlOPJ7FAB1WfnwWdsX
Pvev5gItpHnBXaIcw5rIp6gLSApqLn8tl2X2xQScRMiZln5 + pN0vAgMBAAGjggGD
MIIBfzAfBgNVHSMEGDAWgBQLWOWLxkwVN6RAqTCpIb5HNlpW / zAdBgNVHQ4EFgQU
2 svqrVsIXcz //CZUzknlVcY49PgwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQI
MAYBAf8CAQAwIAYDVR0lBBkwFwYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMD4GA1Ud
IAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwczovL3NlY3VyZS5jb21v
ZG8uY29tL0NQUzBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9kb2Nh
LmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBsBggrBgEFBQcB
AQRgMF4wNgYIKwYBBQUHMAKGKmh0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NvbW9k
b1VUTlNHQ0NBLmNydDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2Eu
Y29tMA0GCSqGSIb3DQEBBQUAA4IBAQAtlzR6QDLqcJcvgTtLeRJ3rvuq1xqo2l / z
odueTZbLN3qo6u6bldudu + Ennv1F7Q5Slqz0J790qpL0pcRDAB8OtXj5isWMcL2a
ejGjKdBZa0wztSz4iw + SY1dWrCRnilsvKcKxudokxeRiDn55w / 65 g + onO7wdQ7Vu
F6r7yJiIatnyfKH2cboZT7g440LX8NqxwCPf3dfxp + 0 Jj1agq8MLy6SSgIGSH6lv
+ Wwz3D5XxqfyH8wqfOQsTEZf6 / Nh9yvENZ + NWPU6g0QO2JOsTGvMd / QDzczc4BxL
XSXaPV7Od4rhPsbXlM1wSTz / Dr0ISKvlUhQVnQ6cGodWaK2cCQBk
-- -- - END CERTIFICATE -- -- - `
var comodoRoot = ` -- -- - BEGIN CERTIFICATE -- -- -
MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
UcEbVASY06m / weaKXTuH + 7 uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B / qnI
2 GqGd0S7WWaXUF601CxwRM / aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
Q5sVW7euNJH + 1 GImGEaaP + vB + fGQV + useg2L23IwambV4EajcNxo2f8ESIl33rXp
+ 2 dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX +
DT + nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
/ zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH / BAUwAwEB / zBJBgNVHR8EQjBAMD6g
PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem / Yb6dc5t3iuHXIY
SdOH5EOC6z / JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc + IlP8zwFboJIYmuNg4ON8qa90SzMc /
RxdMosIGlgnW2 / 4 / PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
zJVSk / BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa + 5 Acr5Pr5RzUZ5dd
BA6 + C4OmF4O5MBKgxTMVBbkN + 8 cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO + IB
ZQ ==
-- -- - END CERTIFICATE -- -- - `
2013-10-21 19:01:24 -04:00
var nameConstraintsLeaf = ` -- -- - BEGIN CERTIFICATE -- -- -
MIIHMTCCBRmgAwIBAgIIIZaV / 3 ezOJkwDQYJKoZIhvcNAQEFBQAwgcsxCzAJBgNV
BAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTETMBEGA1UEBxMKQmxhY2tzYnVyZzEj
MCEGA1UECxMaR2xvYmFsIFF1YWxpZmllZCBTZXJ2ZXIgQ0ExPDA6BgNVBAoTM1Zp
cmdpbmlhIFBvbHl0ZWNobmljIEluc3RpdHV0ZSBhbmQgU3RhdGUgVW5pdmVyc2l0
eTExMC8GA1UEAxMoVmlyZ2luaWEgVGVjaCBHbG9iYWwgUXVhbGlmaWVkIFNlcnZl
ciBDQTAeFw0xMzA5MTkxNDM2NTVaFw0xNTA5MTkxNDM2NTVaMIHNMQswCQYDVQQG
EwJVUzERMA8GA1UECAwIVmlyZ2luaWExEzARBgNVBAcMCkJsYWNrc2J1cmcxPDA6
BgNVBAoMM1ZpcmdpbmlhIFBvbHl0ZWNobmljIEluc3RpdHV0ZSBhbmQgU3RhdGUg
VW5pdmVyc2l0eTE7MDkGA1UECwwyVGVjaG5vbG9neS1lbmhhbmNlZCBMZWFybmlu
ZyBhbmQgT25saW5lIFN0cmF0ZWdpZXMxGzAZBgNVBAMMEnNlY3VyZS5pZGRsLnZ0
LmVkdTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkOyPpsOK / 6 IuPG
WnIBlVwlHzeYf + cUlggqkLq0b0 + vZbiTXgio9 / VCuNQ8opSoss7J7o3ygV9to + 9 Y
YwJKVC5WDT / y5JWpQey0CWILymViJnpNSwnxBc8A + Q8w5NUGDd / UhtPx / U8 / hqbd
WPDYj2hbOqyq8UlRhfS5pwtnv6BbCTaY11I6FhCLK7zttISyTuWCf9p9o / ggiipP
ii / 5 oh4dkl + r5SfuSp5GPNHlYO8lWqys5NAPoDD4fc / kuflcK7Exx7XJ + Oqu0W0 /
psjEY / tES1ZgDWU / ParcxxFpFmKHbD5DXsfPOObzkVWXIY6tGMutSlE1Froy / Nn0
OZsAOrcCAwEAAaOCAhMwggIPMIG4BggrBgEFBQcBAQSBqzCBqDBYBggrBgEFBQcw
AoZMaHR0cDovL3d3dy5wa2kudnQuZWR1L2dsb2JhbHF1YWxpZmllZHNlcnZlci9j
YWNlcnQvZ2xvYmFscXVhbGlmaWVkc2VydmVyLmNydDBMBggrBgEFBQcwAYZAaHR0
cDovL3Z0Y2EtcC5lcHJvdi5zZXRpLnZ0LmVkdTo4MDgwL2VqYmNhL3B1YmxpY3dl
Yi9zdGF0dXMvb2NzcDAdBgNVHQ4EFgQUp7xbO6iHkvtZbPE4jmndmnAbSEcwDAYD
VR0TAQH / BAIwADAfBgNVHSMEGDAWgBS8YmAn1eM1SBfpS6tFatDIqHdxjDBqBgNV
HSAEYzBhMA4GDCsGAQQBtGgFAgICATAOBgwrBgEEAbRoBQICAQEwPwYMKwYBBAG0
aAUCAgMBMC8wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucGtpLnZ0LmVkdS9nbG9i
YWwvY3BzLzBKBgNVHR8EQzBBMD + gPaA7hjlodHRwOi8vd3d3LnBraS52dC5lZHUv
Z2xvYmFscXVhbGlmaWVkc2VydmVyL2NybC9jYWNybC5jcmwwDgYDVR0PAQH / BAQD
AgTwMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAdBgNVHREEFjAUghJz
ZWN1cmUuaWRkbC52dC5lZHUwDQYJKoZIhvcNAQEFBQADggIBAEgoYo4aUtatY3gI
OyyKp7QlIOaLbTJZywESHqy + L5EGDdJW2DJV + mcE0LDGvqa2 / 1 Lo + AR1ntsZwfOi
Y718JwgVVaX / RCd5 + QKP25c5 / x72xI8hb / L1bgS0ED9b0YAhd7Qm1K1ot82 + 6 mqX
DW6WiGeDr8Z07MQ3143qQe2rBlq + QI69DYzm2GOqAIAnUIWv7tCyLUm31b4DwmrJ
TeudVreTKUbBNB1TWRFHEPkWhjjXKZnNGRO11wHXcyBu6YekIvVZ + vmx8ePee4jJ
3 GFOi7lMuWOeq57jTVL7KOKaKLVXBb6gqo5aq + Wwt8RUD5MakrCAEeQZj7DKaFmZ
oQCO0Pxrsl3InCGvxnGzT + bFVO9nJ / BAMj7hknFdm9Jr6Bg5q33Z + gnf909AD9QF
ESqUSykaHu2LVdJx2MaCH1CyKnRgMw5tEwE15EXpUjCm24m8FMOYC + rNtf18pgrz
5 D8Jhh + oxK9PjcBYqXNtnioIxiMCYcV0q5d4w4BYFEh71tk7 / bYB0R55CsBUVPmp
timWNOdRd57Tfpk3USaVsumWZAf9MP3wPiC7gb4d5tYEEAG5BuDT8ruFw838wU8G
1 VvAVutSiYBg7k3NYO7AUqZ + Ax4klQX3aM9lgonmJ78Qt94UPtbptrfZ4 / lSqEf8
GBUwDrQNTb + gsXsDkjd5lcYxNx6l
-- -- - END CERTIFICATE -- -- - `
var nameConstraintsIntermediate1 = ` -- -- - BEGIN CERTIFICATE -- -- -
MIINLjCCDBagAwIBAgIRIqpyf / YoGgvHc8HiDAxAI8owDQYJKoZIhvcNAQEFBQAw
XDELMAkGA1UEBhMCQkUxFTATBgNVBAsTDFRydXN0ZWQgUm9vdDEZMBcGA1UEChMQ
R2xvYmFsU2lnbiBudi1zYTEbMBkGA1UEAxMSVHJ1c3RlZCBSb290IENBIEcyMB4X
DTEyMTIxMzAwMDAwMFoXDTE3MTIxMzAwMDAwMFowgcsxCzAJBgNVBAYTAlVTMREw
DwYDVQQIEwhWaXJnaW5pYTETMBEGA1UEBxMKQmxhY2tzYnVyZzEjMCEGA1UECxMa
R2xvYmFsIFF1YWxpZmllZCBTZXJ2ZXIgQ0ExPDA6BgNVBAoTM1ZpcmdpbmlhIFBv
bHl0ZWNobmljIEluc3RpdHV0ZSBhbmQgU3RhdGUgVW5pdmVyc2l0eTExMC8GA1UE
AxMoVmlyZ2luaWEgVGVjaCBHbG9iYWwgUXVhbGlmaWVkIFNlcnZlciBDQTCCAiIw
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALgIZhEaptBWADBqdJ45ueFGzMXa
GHnzNxoxR1fQIaaRQNdCg4cw3A4dWKMeEgYLtsp65ai3Xfw62Qaus0 + KJ3RhgV + r
ihqK81NUzkls78fJlADVDI4fCTlothsrE1CTOMiy97jKHai5mVTiWxmcxpmjv7fm
5 Nhc + uHgh2hIz6npryq495mD51ZrUTIaqAQN6Pw / VHfAmR524vgriTOjtp1t4lA9
pXGWjF / vkhAKFFheOQSQ00rngo2wHgCqMla64UTN0oz70AsCYNZ3jDLx0kOP0YmM
R3Ih91VA63kLqPXA0R6yxmmhhxLZ5bcyAy1SLjr1N302MIxLM / pSy6aquEnbELhz
qyp9yGgRyGJay96QH7c4RJY6gtcoPDbldDcHI9nXngdAL4DrZkJ9OkDkJLyqG66W
ZTF5q4EIs6yMdrywz0x7QP + OXPJrjYpbeFs6tGZCFnWPFfmHCRJF8 / unofYrheq +
9 J7Jx3U55S / k57NXbAM1RAJOuMTlfn9Etf9Dpoac9poI4Liav6rBoUQk3N3JWqnV
HNx / NdCyJ1 / 6 UbKMJUZsStAVglsi6lVPo289HHOE4f7iwl3SyekizVOp01wUin3y
cnbZB / rXmZbwapSxTTSBf0EIOr9i4EGfnnhCAVA9U5uLrI5OEB69IY8PNX0071s3
Z2a2fio5c8m3JkdrAgMBAAGjggh5MIIIdTAOBgNVHQ8BAf8EBAMCAQYwTAYDVR0g
BEUwQzBBBgkrBgEEAaAyATwwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xv
YmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wEgYDVR0TAQH / BAgwBgEB / wIBADCCBtAG
A1UdHgSCBscwggbDoIIGvzASghAzZGJsYWNrc2J1cmcub3JnMBiCFmFjY2VsZXJh
dGV2aXJnaW5pYS5jb20wGIIWYWNjZWxlcmF0ZXZpcmdpbmlhLm9yZzALgglhY3Zj
cC5vcmcwCYIHYmV2Lm5ldDAJggdiZXYub3JnMAuCCWNsaWdzLm9yZzAMggpjbWl3
ZWIub3JnMBeCFWVhc3Rlcm5icm9va3Ryb3V0Lm5ldDAXghVlYXN0ZXJuYnJvb2t0
cm91dC5vcmcwEYIPZWNvcnJpZG9ycy5pbmZvMBOCEWVkZ2FycmVzZWFyY2gub3Jn
MBKCEGdldC1lZHVjYXRlZC5jb20wE4IRZ2V0LWVkdWNhdGVkLmluZm8wEYIPZ2V0
ZWR1Y2F0ZWQubmV0MBKCEGdldC1lZHVjYXRlZC5uZXQwEYIPZ2V0ZWR1Y2F0ZWQu
b3JnMBKCEGdldC1lZHVjYXRlZC5vcmcwD4INaG9raWVjbHViLmNvbTAQgg5ob2tp
ZXBob3RvLmNvbTAPgg1ob2tpZXNob3AuY29tMBGCD2hva2llc3BvcnRzLmNvbTAS
ghBob2tpZXRpY2tldHMuY29tMBKCEGhvdGVscm9hbm9rZS5jb20wE4IRaHVtYW53
aWxkbGlmZS5vcmcwF4IVaW5uYXR2aXJnaW5pYXRlY2guY29tMA + CDWlzY2hwMjAx
MS5vcmcwD4INbGFuZHJlaGFiLm9yZzAggh5uYXRpb25hbHRpcmVyZXNlYXJjaGNl
bnRlci5jb20wFYITbmV0d29ya3ZpcmdpbmlhLm5ldDAMggpwZHJjdnQuY29tMBiC
FnBldGVkeWVyaXZlcmNvdXJzZS5jb20wDYILcmFkaW9pcS5vcmcwFYITcml2ZXJj
b3Vyc2Vnb2xmLmNvbTALgglzZGltaS5vcmcwEIIOc292YW1vdGlvbi5jb20wHoIc
c3VzdGFpbmFibGUtYmlvbWF0ZXJpYWxzLmNvbTAeghxzdXN0YWluYWJsZS1iaW9t
YXRlcmlhbHMub3JnMBWCE3RoaXNpc3RoZWZ1dHVyZS5jb20wGIIWdGhpcy1pcy10
aGUtZnV0dXJlLmNvbTAVghN0aGlzaXN0aGVmdXR1cmUubmV0MBiCFnRoaXMtaXMt
dGhlLWZ1dHVyZS5uZXQwCoIIdmFkcy5vcmcwDIIKdmFsZWFmLm9yZzANggt2YXRl
Y2guaW5mbzANggt2YXRlY2gubW9iaTAcghp2YXRlY2hsaWZlbG9uZ2xlYXJuaW5n
LmNvbTAcghp2YXRlY2hsaWZlbG9uZ2xlYXJuaW5nLm5ldDAcghp2YXRlY2hsaWZl
bG9uZ2xlYXJuaW5nLm9yZzAKggh2Y29tLmVkdTASghB2aXJnaW5pYXZpZXcubmV0
MDSCMnZpcmdpbmlhcG9seXRlY2huaWNpbnN0aXR1dGVhbmRzdGF0ZXVuaXZlcnNp
dHkuY29tMDWCM3ZpcmdpbmlhcG9seXRlY2huaWNpbnN0aXR1dGVhbmRzdGF0ZXVu
aXZlcnNpdHkuaW5mbzA0gjJ2aXJnaW5pYXBvbHl0ZWNobmljaW5zdGl0dXRlYW5k
c3RhdGV1bml2ZXJzaXR5Lm5ldDA0gjJ2aXJnaW5pYXBvbHl0ZWNobmljaW5zdGl0
dXRlYW5kc3RhdGV1bml2ZXJzaXR5Lm9yZzAZghd2aXJnaW5pYXB1YmxpY3JhZGlv
Lm9yZzASghB2aXJnaW5pYXRlY2guZWR1MBOCEXZpcmdpbmlhdGVjaC5tb2JpMByC
GnZpcmdpbmlhdGVjaGZvdW5kYXRpb24ub3JnMAiCBnZ0LmVkdTALggl2dGFyYy5v
cmcwDIIKdnQtYXJjLm9yZzALggl2dGNyYy5jb20wCoIIdnRpcC5vcmcwDIIKdnRs
ZWFuLm9yZzAWghR2dGtub3dsZWRnZXdvcmtzLmNvbTAYghZ2dGxpZmVsb25nbGVh
cm5pbmcuY29tMBiCFnZ0bGlmZWxvbmdsZWFybmluZy5uZXQwGIIWdnRsaWZlbG9u
Z2xlYXJuaW5nLm9yZzATghF2dHNwb3J0c21lZGlhLmNvbTALggl2dHdlaS5jb20w
D4INd2l3YXR3ZXJjLmNvbTAKggh3dnRmLm9yZzAIgQZ2dC5lZHUwd6R1MHMxCzAJ
BgNVBAYTAlVTMREwDwYDVQQIEwhWaXJnaW5pYTETMBEGA1UEBxMKQmxhY2tzYnVy
ZzE8MDoGA1UEChMzVmlyZ2luaWEgUG9seXRlY2huaWMgSW5zdGl0dXRlIGFuZCBT
dGF0ZSBVbml2ZXJzaXR5MCcGA1UdJQQgMB4GCCsGAQUFBwMCBggrBgEFBQcDAQYI
KwYBBQUHAwkwPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL2NybC5nbG9iYWxzaWdu
LmNvbS9ncy90cnVzdHJvb3RnMi5jcmwwgYQGCCsGAQUFBwEBBHgwdjAzBggrBgEF
BQcwAYYnaHR0cDovL29jc3AyLmdsb2JhbHNpZ24uY29tL3RydXN0cm9vdGcyMD8G
CCsGAQUFBzAChjNodHRwOi8vc2VjdXJlLmdsb2JhbHNpZ24uY29tL2NhY2VydC90
cnVzdHJvb3RnMi5jcnQwHQYDVR0OBBYEFLxiYCfV4zVIF + lLq0Vq0Miod3GMMB8G
A1UdIwQYMBaAFBT25YsxtkWASkxt / MKHico2w5BiMA0GCSqGSIb3DQEBBQUAA4IB
AQAyJm / lOB2Er4tHXhc / + fSufSzgjohJgYfMkvG4LknkvnZ1BjliefR8tTXX49d2
SCDFWfGjqyJZwavavkl / 4 p3oXPG / nAMDMvxh4YAT + CfEK9HH + 6 ICV087kD4BLegi
+ aFJMj8MMdReWCzn5sLnSR1rdse2mo2arX3Uod14SW + PGrbUmTuWNyvRbz3fVmxp
UdbGmj3laknO9YPsBGgHfv73pVVsTJkW4ZfY / 7 KdD / yaVv6ophpOB3coXfjl2 + kd
Z4ypn2zK + cx9IL / LSewqd / 7 W9cD55PCUy4X9OTbEmAccwiz3LB66mQoUGfdHdkoB
jUY + v9vLQXmaVwI0AYL7g9LN
-- -- - END CERTIFICATE -- -- - `
var nameConstraintsIntermediate2 = ` -- -- - BEGIN CERTIFICATE -- -- -
MIIEXTCCA0WgAwIBAgILBAAAAAABNuk6OrMwDQYJKoZIhvcNAQEFBQAwVzELMAkG
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xMjA0MjUxMTAw
MDBaFw0yNzA0MjUxMTAwMDBaMFwxCzAJBgNVBAYTAkJFMRUwEwYDVQQLEwxUcnVz
dGVkIFJvb3QxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExGzAZBgNVBAMTElRy
dXN0ZWQgUm9vdCBDQSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AKyuvqrtcMr7g7EuNbu4sKwxM127UsCmx1RxbxxgcArGS7rjiefpBH / w4LYrymjf
vcw1ueyMNoqLo9nJMz / ORXupb35NNfE667prQYHa + tTjl1IiKpB7QUwt3wXPuTMF
Ja1tXtjKzkqJyuJlNuPKT76HcjgNqgV1s9qG44MD5I2JvI12du8zI1bgdQ + l / KsX
kTfbGjUvhOLOlVNWVQDpL + YMIrGqgBYxy5TUNgrAcRtwpNdS2KkF5otSmMweVb5k
hoUVv3u8UxQH / WWbNhHq1RrIlg / 0 rBUfi / ziShYFSB7U + aLx5DxPphTFBiDquQGp
tB + FC4JvnukDStFihZCZ1R8CAwEAAaOCASMwggEfMA4GA1UdDwEB / wQEAwIBBjAP
BgNVHRMBAf8EBTADAQH / MEcGA1UdIARAMD4wPAYEVR0gADA0MDIGCCsGAQUFBwIB
FiZodHRwczovL3d3dy5nbG9iYWxzaWduLmNvbS9yZXBvc2l0b3J5LzAdBgNVHQ4E
FgQUFPblizG2RYBKTG38woeJyjbDkGIwMwYDVR0fBCwwKjAooCagJIYiaHR0cDov
L2NybC5nbG9iYWxzaWduLm5ldC9yb290LmNybDA + BggrBgEFBQcBAQQyMDAwLgYI
KwYBBQUHMAGGImh0dHA6Ly9vY3NwMi5nbG9iYWxzaWduLmNvbS9yb290cjEwHwYD
VR0jBBgwFoAUYHtmGkUNl8qJUC99BM00qP / 8 / UswDQYJKoZIhvcNAQEFBQADggEB
AL7IG0l + k4LkcpI + a / kvZsSRwSM4uA6zGX34e78A2oytr8RG8bJwVb8 + AHMUD + Xe
2 kYdh / Uj / waQXfqR0OgxQXL9Ct4ZM + JlR1avsNKXWL5AwYXAXCOB3J5PW2XOck7H
Zw0vRbGQhjWjQx + B4KOUFg1b3ov / z6Xkr3yaCfRQhXh7KC0Bc0RXPPG5Nv5lCW + z
tbbg0zMm3kyfQITRusMSg6IBsDJqOnjaiaKQRcXiD0Sk43ZXb2bUKMxC7 + Td3QL4
RyHcWJbQ7YylLTS / x + jxWIcOQ0oO5 / 54 t5PTQ14neYhOz9x4gUk2AYAW6d1vePwb
hcC8roQwkHT7HvfYBoc74FM =
-- -- - END CERTIFICATE -- -- - `
var globalSignRoot = ` -- -- - BEGIN CERTIFICATE -- -- -
MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
jc6j40 + Kfvvxi4Mla + pIH / EqsLmVEQS98GPR4mdmzxzdzxtIK + 6 NiY6arymAZavp
xy0Sy6scTHAHoT0KMM0VjU / 43 dSMUBUc71DuxC73 / OlS8pF94G3VNTCOXkNz8kHp
1 Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm / k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT / LCrBbBlDSgeF59N8
9i Fo7 + ryUp9 / k5DPAgMBAAGjQjBAMA4GA1UdDwEB / wQEAwIBBjAPBgNVHRMBAf8E
BTADAQH / MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo //z9SzANBgkqhkiG9w0B
AQUFAAOCAQEA1nPnfE920I2 / 7 LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
yj1hTdNGCbM + w6DjY1Ub8rrvrTnhQ7k4o + YviiY776BQVvnGCv04zcQLcFGUl5gE
38 NflNUVyRRBnMRddWQVDf9VMOyGj / 8 N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr + WymXUad
DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU / Qr6cf9tveCX4XSQRjbgbME
HMUfpIBvFSDJ3gyICh3WZlXi / EjJKSZp4A ==
-- -- - END CERTIFICATE -- -- - `
2014-04-14 12:12:06 -07:00
var moipLeafCert = ` -- -- - BEGIN CERTIFICATE -- -- -
MIIGQDCCBSigAwIBAgIRAPe / cwh7CUWizo8mYSDavLIwDQYJKoZIhvcNAQELBQAw
gZIxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMTgwNgYD
VQQDEy9DT01PRE8gUlNBIEV4dGVuZGVkIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZl
ciBDQTAeFw0xMzA4MTUwMDAwMDBaFw0xNDA4MTUyMzU5NTlaMIIBQjEXMBUGA1UE
BRMOMDg3MTg0MzEwMDAxMDgxEzARBgsrBgEEAYI3PAIBAxMCQlIxGjAYBgsrBgEE
AYI3PAIBAhMJU2FvIFBhdWxvMR0wGwYDVQQPExRQcml2YXRlIE9yZ2FuaXphdGlv
bjELMAkGA1UEBhMCQlIxETAPBgNVBBETCDAxNDUyMDAwMRIwEAYDVQQIEwlTYW8g
UGF1bG8xEjAQBgNVBAcTCVNhbyBQYXVsbzEtMCsGA1UECRMkQXZlbmlkYSBCcmln
YWRlaXJvIEZhcmlhIExpbWEgLCAyOTI3MR0wGwYDVQQKExRNb2lwIFBhZ2FtZW50
b3MgUy5BLjENMAsGA1UECxMETU9JUDEYMBYGA1UECxMPU1NMIEJsaW5kYWRvIEVW
MRgwFgYDVQQDEw9hcGkubW9pcC5jb20uYnIwggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQDN0b9x6TrXXA9hPCF8 / NjqGJ ++ 2 D4LO4ZiMFTjs0VwpXy2Y1Oe
s74 / HuiLGnAHxTmAtV7IpZMibiOcTxcnDYp9oEWkf + gR + hZvwFZwyOBC7wyb3SR3
UvV0N1ZbEVRYpN9kuX / 3 vjDghjDmzzBwu8a / T + y5JTym5uiJlngVAWyh / RjtIvYi
+ NVkQMbyVlPGkoCe6c30pH8DKYuUCZU6DHjUsPTX3jAskqbhDSAnclX9iX0p2bmw
KVBc + 5 Vh / 2 geyzDuquF0w + mNIYdU5h7uXvlmJnf3d2Cext5dxdL8 / jezD3U0dAqI
pYSKERbyxSkJWxdvRlhdpM9YXMJcpc88xNp1AgMBAAGjggHcMIIB2DAfBgNVHSME
GDAWgBQ52v / KKBSKqHQTCLnkDqnS + n6daTAdBgNVHQ4EFgQU / lXuOa7DMExzZjRj
LQWcMWGZY7swDgYDVR0PAQH / BAQDAgWgMAwGA1UdEwEB / wQCMAAwHQYDVR0lBBYw
FAYIKwYBBQUHAwEGCCsGAQUFBwMCMEYGA1UdIAQ / MD0wOwYMKwYBBAGyMQECAQUB
MCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5jb20vQ1BTMFYG
A1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JT
QUV4dGVuZGVkVmFsaWRhdGlvblNlY3VyZVNlcnZlckNBLmNybDCBhwYIKwYBBQUH
AQEEezB5MFEGCCsGAQUFBzAChkVodHRwOi8vY3J0LmNvbW9kb2NhLmNvbS9DT01P
RE9SU0FFeHRlbmRlZFZhbGlkYXRpb25TZWN1cmVTZXJ2ZXJDQS5jcnQwJAYIKwYB
BQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTAvBgNVHREEKDAmgg9hcGku
bW9pcC5jb20uYnKCE3d3dy5hcGkubW9pcC5jb20uYnIwDQYJKoZIhvcNAQELBQAD
ggEBAFoTmPlaDcf + nudhjXHwud8g7 / LRyA8ucb + 3 / vfmgbn7FUc1eprF5sJS1mA +
pbiTyXw4IxcJq2KUj0Nw3IPOe9k84mzh + XMmdCKH + QK3NWkE9Udz + VpBOBc0dlqC
1 RH5umStYDmuZg / 8 / r652eeQ5kUDcJyADfpKWBgDPYaGtwzKVT4h3Aok9SLXRHx6
z / gOaMjEDMarMCMw4VUIG1pvNraZrG5oTaALPaIXXpd8VqbQYPudYJ6fR5eY3FeW
H / ofbYFdRcuD26MfBFWE9VGGral9Fgo8sEHffho + UWhgApuQV4 / l5fMzxB5YBXyQ
jhuy8PqqZS9OuLilTeLu4a8z2JI =
-- -- - END CERTIFICATE -- -- - `
var comodoIntermediateSHA384 = ` -- -- - BEGIN CERTIFICATE -- -- -
MIIGDjCCA / agAwIBAgIQBqdDgNTr / tQ1taP34Wq92DANBgkqhkiG9w0BAQwFADCB
hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTIwMjEy
MDAwMDAwWhcNMjcwMjExMjM1OTU5WjCBkjELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
Q09NT0RPIENBIExpbWl0ZWQxODA2BgNVBAMTL0NPTU9ETyBSU0EgRXh0ZW5kZWQg
VmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAlVbeVLTf1QJJe9FbXKKyHo + cK2JMK40SKPMalaPGEP0p3uGf
CzhAk9HvbpUQ / OGQF3cs7nU + e2PsYZJuTzurgElr3wDqAwB / L3XVKC / sVmePgIOj
vdwDmZOLlJFWW6G4ajo / Br0OksxgnP214J9mMF / b5pTwlWqvyIqvgNnmiDkBfBzA
xSr3e5Wg8narbZtyOTDr0VdVAZ1YEZ18bYSPSeidCfw8 / QpKdhQhXBZzQCMZdMO6
WAqmli7eNuWf0MLw4eDBYuPCGEUZUaoXHugjddTI0JYT / 8 ck0YwLJ66eetw6YWNg
iJctXQUL5Tvrrs46R3N2qPos3cCHF + msMJn4HwIDAQABo4IBaTCCAWUwHwYDVR0j
BBgwFoAUu69 + Aj36pvE8hI6t7jiY7NkyMtQwHQYDVR0OBBYEFDna / 8 ooFIqodBMI
ueQOqdL6fp1pMA4GA1UdDwEB / wQEAwIBBjASBgNVHRMBAf8ECDAGAQH / AgEAMD4G
A1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwczovL3NlY3VyZS5j
b21vZG8uY29tL0NQUzBMBgNVHR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9k
b2NhLmNvbS9DT01PRE9SU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggr
BgEFBQcBAQRlMGMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29t
L0NPTU9ET1JTQUFkZFRydXN0Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz
cC5jb21vZG9jYS5jb20wDQYJKoZIhvcNAQEMBQADggIBAERCnUFRK0iIXZebeV4R
AUpSGXtBLMeJPNBy3IX6WK / VJeQT + FhlZ58N / 1 eLqYVeyqZLsKeyLeCMIs37 / 3 mk
jCuN / gI9JN6pXV / kD0fQ22YlPodHDK4ixVAihNftSlka9pOlk7DgG4HyVsTIEFPk
1 Hax0VtpS3ey4E / EhOfUoFDuPPpE / NBXueEoU / 1 Tzdy5H3pAvTA / 2 GzS8 + cHnx8i
teoiccsq8FZ8 / qyo0QYPFBRSTP5kKwxpKrgNUG4 + BAe / eiCL + O5lCeHHSQgyPQ0o
fkkdt0rvAucNgBfIXOBhYsvss2B5JdoaZXOcOBCgJjqwyBZ9kzEi7nQLiMBciUEA
KKlHMd99SUWa9eanRRrSjhMQ34Ovmw2tfn6dNVA0BM7pINae253UqNpktNEvWS5e
ojZh1CSggjMziqHRbO9haKPl0latxf1eYusVqHQSTC8xjOnB3xBLAer2VBvNfzu9
XJ / B288ByvK6YBIhMe2pZLiySVgXbVrXzYxtvp5 / 4 gJYp9vDLVj2dAZqmvZh + fYA
tmnYOosxWd2R5nwnI4fdAw + PKowegwFOAWEMUnNt / AiiuSpm5HZNMaBWm9lTjaK2
jwLI5jqmBNFI + 8 NKAnb9L9K8E7bobTQk + p0pisehKxTxlgBzuRPpwLk6R1YCcYAn
pLwltum95OmYdBbxN4SBB7SC
-- -- - END CERTIFICATE -- -- - `
2014-04-14 13:23:58 -07:00
const comodoRSAAuthority = ` -- -- - BEGIN CERTIFICATE -- -- -
2014-04-14 12:12:06 -07:00
MIIFdDCCBFygAwIBAgIQJ2buVutJ846r13Ci / ITeIjANBgkqhkiG9w0BAQwFADBv
MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk
ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF
eHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFow
gYUxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYD
VQQDEyJDT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkq
hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkehUktIKVrGsDSTdxc9EZ3SZKzejfSNw
AHG8U9 / E + ioSj0t / EFa9n3Byt2F / yUsPF6c947AEYe7 / EZfH9IY + Cvo + XPmT5jR6
2 RRr55yzhaCCenavcZDX7P0N + pxs + t + wgvQUfvm + xKYvT3 + Zf7X8Z0NyvQwA1onr
ayzT7Y + YHBSrfuXjbvzYqOSSJNpDa2K4Vf3qwbxstovzDo2a5JtsaZn4eEgwRdWt
4 Q08RWD8MpZRJ7xnw8outmvqRsfHIKCxH2XeSAi6pE6p8oNGN4Tr6MyBSENnTnIq
m1y9TBsoilwie7SrmNnu4FGDwwlGTm0 + mfqVF9p8M1dBPI1R7Qu2XK8sYxrfV8g /
vOldxJuvRZnio1oktLqpVj3Pb6r / SVi + 8 Kj / 9 Lit6Tf7urj0Czr56ENCHonYhMsT
8 dm74YlguIwoVqwUHZwK53Hrzw7dPamWoUi9PPevtQ0iTMARgexWO / bTouJbt7IE
IlKVgJNp6I5MZfGRAy1wdALqi2cVKWlSArvX31BqVUa / oKMoYX9w0MOiqiwhqkfO
KJwGRXa / ghgntNWutMtQ5mv0TIZxMOmm3xaG4Nj / QN370EKIf6MzOi5cHkERgWPO
GHFrK + ymircxXDpqR + DDeVnWIBqv8mqYqnK8V0rSS527EPywTEHl7R09XiidnMy /
s1Hap0flhFMCAwEAAaOB9DCB8TAfBgNVHSMEGDAWgBStvZh6NLQm9 / rEJlTvA73g
JMtUGjAdBgNVHQ4EFgQUu69 + Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH / BAQD
AgGGMA8GA1UdEwEB / wQFMAMBAf8wEQYDVR0gBAowCDAGBgRVHSAAMEQGA1UdHwQ9
MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9BZGRUcnVzdEV4dGVy
bmFsQ0FSb290LmNybDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6
Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggEBAGS / g / FfmoXQ
zbihKVcN6Fr30ek + 8 nYEbvFScLsePP9NDXRqzIGCJdPDoCpdTPW6i6FtxFQJdcfj
Jw5dhHk3QBN39bSsHNA7qxcS1u80GH4r6XnTq1dFDK8o + tDb5VCViLvfhVdpfZLY
Uspzgb8c8 + a4bmYRBbMelC1 / kZWSWfFMzqORcUx8Rww7Cxn2obFshj5cqsQugsv5
B5a6SE2Q8pTIqXOi6wZ7I53eovNNVZ96YUWYGGjHXkBrI / V5eu + MtWuLt29G9Hvx
PUsE2JOAWVrgQSQdso8VYFhH2 + 9 uRv0V9dlfmrPb2LjkQLPNlzmuhbsdjrzch5vR
pu / xO28QOG8 =
-- -- - END CERTIFICATE -- -- - `
2014-04-14 13:23:58 -07:00
const addTrustRoot = ` -- -- - BEGIN CERTIFICATE -- -- -
MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
H7xsD821 + iO2zt6bETOXpClMfZOfvUq8k + 0 DGuOPz + VtUFrWlymUWoCwSXrbLpX9
uMq / NzgtHj6RQa1wVsfwTz / oMp50ysiQVOnGXw94nZpAPA6sYapeFI + eh6FqUNzX
mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp / haW + 710 LX
a0Tkx63ubUFfclpxCDezeWWkWaCUN / cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
E0S3ySvdQwAl + mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77 + ldU9U0
WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
VR0PBAQDAgEGMA8GA1UdEwEB / wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
AQEFBQADggEBALCb4IUlwtYj4g + WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
YINRsPkyPef89iYTx4AWpb9a / IfPeHmJIZriTAcKhjW88t5RxNKWt9x + Tu5w / Rw5
6 wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
c4g / VhsxOBi0cQ + azcgOno4uG + GMmIPLHzHxREzGBHNJdmAPx / i9F4BrLunMTA5a
mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ =
-- -- - END CERTIFICATE -- -- - `
2016-08-18 16:44:08 -07:00
const selfSigned = ` -- -- - BEGIN CERTIFICATE -- -- -
MIIC / DCCAeSgAwIBAgIRAK0SWRVmi67xU3z0gkgY + PkwDQYJKoZIhvcNAQELBQAw
EjEQMA4GA1UEChMHQWNtZSBDbzAeFw0xNjA4MTkxNjMzNDdaFw0xNzA4MTkxNjMz
NDdaMBIxEDAOBgNVBAoTB0FjbWUgQ28wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQDWkm1kdCwxyKEt6OTmZitkmLGH8cQu9z7rUdrhW8lWNm4kh2SuaUWP
pscBjda5iqg51aoKuWJR2rw6ElDne + X5eit2FT8zJgAU8v39lMFjbaVZfS9TFOYF
w0Tk0Luo / PyKJpZnwhsP ++ iiGQiteJbndy8aLKmJ2MpLfpDGIgxEIyNb5dgoDi0D
WReDCpE6K9WDYqvKVGnQ2Jvqqra6Gfx0tFkuqJxQuqA8aUOlPHcCH4KBZdNEoXdY
YL3E4dCAh0YiDs80wNZx4cHqEM3L8gTEFqW2Tn1TSuPZO6gjJ9QPsuUZVjaMZuuO
NVxqLGujZkDzARhC3fBpptMuaAfi20 + BAgMBAAGjTTBLMA4GA1UdDwEB / wQEAwIF
oDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBYGA1UdEQQPMA2C
C2Zvby5leGFtcGxlMA0GCSqGSIb3DQEBCwUAA4IBAQBPvvfnDhsHWt + / cfwdAVim
4 EDn + hYOMkTQwU0pouYIvY8QXYkZ8MBxpBtBMK4JhFU + ewSWoBAEH2dCCvx / BDxN
UGTSJHMbsvJHcFvdmsvvRxOqQ / cJz7behx0cfoeHMwcs0 / vWv8ms5wHesb5Ek7L0
pl01FCBGTcncVqr6RK1r4fTpeCCfRIERD + YRJz8TtPH6ydesfLL8jIV40H8NiDfG
vRAvOtNiKtPzFeQVdbRPOskC4rcHyPeiDAMAMixeLi63 + CFty4da3r5lRezeedCE
cw3ESZzThBwWqvPOtJdpXdm + r57pDW8qD + / 0 lY8wfImMNkQAyCUCLg / 1 Lxt / hrBj
-- -- - END CERTIFICATE -- -- - `
2016-08-28 14:11:31 -05:00
var unknownAuthorityErrorTests = [ ] struct {
cert string
expected string
} {
{ selfSignedWithCommonName , "x509: certificate signed by unknown authority (possibly because of \"empty\" while trying to verify candidate authority certificate \"test\")" } ,
{ selfSignedNoCommonNameWithOrgName , "x509: certificate signed by unknown authority (possibly because of \"empty\" while trying to verify candidate authority certificate \"ca\")" } ,
{ selfSignedNoCommonNameNoOrgName , "x509: certificate signed by unknown authority (possibly because of \"empty\" while trying to verify candidate authority certificate \"serial:0\")" } ,
}
func TestUnknownAuthorityError ( t * testing . T ) {
for i , tt := range unknownAuthorityErrorTests {
der , _ := pem . Decode ( [ ] byte ( tt . cert ) )
if der == nil {
t . Errorf ( "#%d: Unable to decode PEM block" , i )
}
c , err := ParseCertificate ( der . Bytes )
if err != nil {
t . Errorf ( "#%d: Unable to parse certificate -> %s" , i , err )
}
uae := & UnknownAuthorityError {
cert : c ,
hintErr : fmt . Errorf ( "empty" ) ,
hintCert : c ,
}
actual := uae . Error ( )
if strings . Compare ( actual , tt . expected ) != 0 {
t . Errorf ( "#%d: UnknownAuthorityError.Error() response invalid actual: %s expected: %s" , i , actual , tt . expected )
}
}
}
const selfSignedWithCommonName = ` -- -- - BEGIN CERTIFICATE -- -- -
MIIDCjCCAfKgAwIBAgIBADANBgkqhkiG9w0BAQsFADAaMQswCQYDVQQKEwJjYTEL
MAkGA1UEAxMCY2EwHhcNMTYwODI4MTcwOTE4WhcNMjEwODI3MTcwOTE4WjAcMQsw
CQYDVQQKEwJjYTENMAsGA1UEAxMEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAOH55PfRsbvmcabfLLko1w / yuapY / hk13Cgmc3WE / Z1ZStxGiVxY
gQVH9n4W / TbUsrep / TmcC4MV7xEm5252ArcgaH6BeQ4QOTFj / 6 Jx0RT7U / ix + 79 x
8 RRysf7OlzNpGIctwZEM7i / G + 0 ZfqX9ULxL / EW9tppSxMX1jlXZQarnU7BERL5cH
+ G2jcbU9H28FXYishqpVYE9L7xrXMm61BAwvGKB0jcVW6JdhoAOSfQbbgp7JjIlq
czXqUsv1UdORO / horIoJptynTvuARjZzyWatya6as7wyOgEBllE6BjPK9zpn + lp3
tQ8dwKVqm / qBPhIrVqYG / Ec7pIv8mJfYabMCAwEAAaNZMFcwDgYDVR0PAQH / BAQD
AgOoMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAMBgNVHRMBAf8EAjAA
MAoGA1UdDgQDBAEAMAwGA1UdIwQFMAOAAQAwDQYJKoZIhvcNAQELBQADggEBAAAM
XMFphzq4S5FBcRdB2fRrmcoz + jEROBWvIH / 1 QUJeBEBz3ZqBaJYfBtQTvqCA5Rjw
dxyIwVd1W3q3aSulM0tO62UCU6L6YeeY / eq8FmpD7nMJo7kCrXUUAMjxbYvS3zkT
v / NErK6SgWnkQiPJBZNX1Q9 + aSbLT / sbaCTdbWqcGNRuLGJkmqfIyoxRt0Hhpqsx
jP5cBaVl50t4qoCuVIE9cOucnxYXnI7X5HpXWvu8Pfxo4SwVjb1az8Fk5s8ZnxGe
fPB6Q3L / pKBe0SEe5GywpwtokPLB3lAygcuHbxp / 1 FlQ1NQZqq + vgXRIla26bNJf
IuYkJwt6w + LH / 9 HZgf8 =
-- -- - END CERTIFICATE -- -- - `
const selfSignedNoCommonNameWithOrgName = ` -- -- - BEGIN CERTIFICATE -- -- -
MIIC + zCCAeOgAwIBAgIBADANBgkqhkiG9w0BAQsFADAaMQswCQYDVQQKEwJjYTEL
MAkGA1UEAxMCY2EwHhcNMTYwODI4MTgxMzQ4WhcNMjEwODI3MTgxMzQ4WjANMQsw
CQYDVQQKEwJjYTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL5EjrUa
7 EtOMxWiIgTzp2FlQvncPsG329O3l3uNGnbigb8TmNMw2M8UhoDjd84pnU5RAfqd
8 t5TJyw / ybnIKBN131Q2xX + gPQ0dFyMvcO + i1CUgCxmYZomKVA2MXO1RD1hLTYGS
gOVjc3no3MBwd8uVQp0NStqJ1QvLtNG4Uy + B28qe + ZFGGbjGqx8 / CU4A8Szlpf7 /
xAZR8w5qFUUlpA2LQYeHHJ5fQVXw7kyL1diNrKNi0G3qcY0IrBh ++ hT + hnEEXyXu
g8a0Ux18hoE8D6rAr34rCZl6AWfqW5wjwm + N5Ns2ugr9U4N8uCKJYMPHb2CtdubU
46 IzVucpTfGLdaMCAwEAAaNZMFcwDgYDVR0PAQH / BAQDAgOoMB0GA1UdJQQWMBQG
CCsGAQUFBwMCBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMAoGA1UdDgQDBAEAMAwG
A1UdIwQFMAOAAQAwDQYJKoZIhvcNAQELBQADggEBAEn5SgVpJ3zjsdzPqK7Qd / sB
bYd1qtPHlrszjhbHBg35C6mDgKhcv4o6N + fuC + FojZb8lIxWzJtvT9pQbfy / V6u3
wOb816Hm71uiP89sioIOKCvSAstj / p9doKDOUaKOcZBTw0PS2m9eja8bnleZzBvK
rD8cNkHf74v98KvBhcwBlDifVzmkWzMG6TL1EkRXUyLKiWgoTUFSkCDV927oXXMR
DKnszq + AVw + K8hbeV2A7GqT7YfeqOAvSbatTDnDtKOPmlCnQui8A149VgZzXv7eU
29 ssJSqjUPyp58dlV6ZuynxPho1QVZUOQgnJToXIQ3 / 5 vIvJRXy52GJCs4 / Gh / w =
-- -- - END CERTIFICATE -- -- - `
const selfSignedNoCommonNameNoOrgName = ` -- -- - BEGIN CERTIFICATE -- -- -
MIIC7jCCAdagAwIBAgIBADANBgkqhkiG9w0BAQsFADAaMQswCQYDVQQKEwJjYTEL
MAkGA1UEAxMCY2EwHhcNMTYwODI4MTgxOTQ1WhcNMjEwODI3MTgxOTQ1WjAAMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp3E + Jl6DpgzogHUW / i / AAcCM
fnNJLOamNVKFGmmxhb4XTHxRaWoTzrlsyzIMS0WzivvJeZVe6mWbvuP2kZanKgIz
35 YXRTR9HbqkNTMuvnpUESzWxbGWE2jmt2 + a / Jnz89FS4WIYRhF7nI2z8PvZOfrI
2 gETTT2tEpoF2S4soaYfm0DBeT8K0 / rogAaf + oeUS6V + v3miRcAooJgpNJGu9kqm
S0xKPn1RCFVjpiRd6YNS0xZirjYQIBMFBvoSoHjaOdgJptNRBprYPOxVJ / ItzGf0
kPmzPFCx2tKfxV9HLYBPgxi + fP3IIx8aIYuJn8yReWtYEMYU11hDPeAFN5Gm + wID
AQABo1kwVzAOBgNVHQ8BAf8EBAMCA6gwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsG
AQUFBwMBMAwGA1UdEwEB / wQCMAAwCgYDVR0OBAMEAQAwDAYDVR0jBAUwA4ABADAN
BgkqhkiG9w0BAQsFAAOCAQEATZVOFeiCpPM5QysToLv + 8 k7Rjoqt6L5IxMUJGEpq
4 ENmldmwkhEKr9VnYEJY3njydnnTm97d9vOfnLj9nA9wMBODeOO3KL2uJR2oDnmM
9 z1NSe2aQKnyBb ++ DM3ZdikpHn / xEpGV19pYKFQVn35x3lpPh2XijqRDO / erKemb
w67CoNRb81dy + 4 Q1lGpA8ORoLWh5fIq2t2eNGc4qB8vlTIKiESzAwu7u3sRfuWQi
4 R + gnfLd37FWflMHwztFbVTuNtPOljCX0LN7KcuoXYlr05RhQrmoN7fQHsrZMNLs
8 FVjHdKKu + uPstwd04Uy4BR / H2y1yerN9j / L6ZkMl98iiA ==
-- -- - END CERTIFICATE -- -- - `