github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/encoding/asn1/asn1_test.go (about)

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package asn1
     6  
     7  import (
     8  	"bytes"
     9  	"math/big"
    10  	"reflect"
    11  	"testing"
    12  	"time"
    13  )
    14  
    15  type int64Test struct {
    16  	in  []byte
    17  	ok  bool
    18  	out int64
    19  }
    20  
    21  var int64TestData = []int64Test{
    22  	{[]byte{0x00}, true, 0},
    23  	{[]byte{0x7f}, true, 127},
    24  	{[]byte{0x00, 0x80}, true, 128},
    25  	{[]byte{0x01, 0x00}, true, 256},
    26  	{[]byte{0x80}, true, -128},
    27  	{[]byte{0xff, 0x7f}, true, -129},
    28  	{[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, true, -1},
    29  	{[]byte{0xff}, true, -1},
    30  	{[]byte{0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, true, -9223372036854775808},
    31  	{[]byte{0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, false, 0},
    32  }
    33  
    34  func TestParseInt64(t *testing.T) {
    35  	for i, test := range int64TestData {
    36  		ret, err := parseInt64(test.in)
    37  		if (err == nil) != test.ok {
    38  			t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok)
    39  		}
    40  		if test.ok && ret != test.out {
    41  			t.Errorf("#%d: Bad result: %v (expected %v)", i, ret, test.out)
    42  		}
    43  	}
    44  }
    45  
    46  type int32Test struct {
    47  	in  []byte
    48  	ok  bool
    49  	out int32
    50  }
    51  
    52  var int32TestData = []int32Test{
    53  	{[]byte{0x00}, true, 0},
    54  	{[]byte{0x7f}, true, 127},
    55  	{[]byte{0x00, 0x80}, true, 128},
    56  	{[]byte{0x01, 0x00}, true, 256},
    57  	{[]byte{0x80}, true, -128},
    58  	{[]byte{0xff, 0x7f}, true, -129},
    59  	{[]byte{0xff, 0xff, 0xff, 0xff}, true, -1},
    60  	{[]byte{0xff}, true, -1},
    61  	{[]byte{0x80, 0x00, 0x00, 0x00}, true, -2147483648},
    62  	{[]byte{0x80, 0x00, 0x00, 0x00, 0x00}, false, 0},
    63  }
    64  
    65  func TestParseInt32(t *testing.T) {
    66  	for i, test := range int32TestData {
    67  		ret, err := parseInt32(test.in)
    68  		if (err == nil) != test.ok {
    69  			t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok)
    70  		}
    71  		if test.ok && int32(ret) != test.out {
    72  			t.Errorf("#%d: Bad result: %v (expected %v)", i, ret, test.out)
    73  		}
    74  	}
    75  }
    76  
    77  var bigIntTests = []struct {
    78  	in     []byte
    79  	base10 string
    80  }{
    81  	{[]byte{0xff}, "-1"},
    82  	{[]byte{0x00}, "0"},
    83  	{[]byte{0x01}, "1"},
    84  	{[]byte{0x00, 0xff}, "255"},
    85  	{[]byte{0xff, 0x00}, "-256"},
    86  	{[]byte{0x01, 0x00}, "256"},
    87  }
    88  
    89  func TestParseBigInt(t *testing.T) {
    90  	for i, test := range bigIntTests {
    91  		ret := parseBigInt(test.in)
    92  		if ret.String() != test.base10 {
    93  			t.Errorf("#%d: bad result from %x, got %s want %s", i, test.in, ret.String(), test.base10)
    94  		}
    95  		fw := newForkableWriter()
    96  		marshalBigInt(fw, ret)
    97  		result := fw.Bytes()
    98  		if !bytes.Equal(result, test.in) {
    99  			t.Errorf("#%d: got %x from marshaling %s, want %x", i, result, ret, test.in)
   100  		}
   101  	}
   102  }
   103  
   104  type bitStringTest struct {
   105  	in        []byte
   106  	ok        bool
   107  	out       []byte
   108  	bitLength int
   109  }
   110  
   111  var bitStringTestData = []bitStringTest{
   112  	{[]byte{}, false, []byte{}, 0},
   113  	{[]byte{0x00}, true, []byte{}, 0},
   114  	{[]byte{0x07, 0x00}, true, []byte{0x00}, 1},
   115  	{[]byte{0x07, 0x01}, false, []byte{}, 0},
   116  	{[]byte{0x07, 0x40}, false, []byte{}, 0},
   117  	{[]byte{0x08, 0x00}, false, []byte{}, 0},
   118  }
   119  
   120  func TestBitString(t *testing.T) {
   121  	for i, test := range bitStringTestData {
   122  		ret, err := parseBitString(test.in)
   123  		if (err == nil) != test.ok {
   124  			t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok)
   125  		}
   126  		if err == nil {
   127  			if test.bitLength != ret.BitLength || !bytes.Equal(ret.Bytes, test.out) {
   128  				t.Errorf("#%d: Bad result: %v (expected %v %v)", i, ret, test.out, test.bitLength)
   129  			}
   130  		}
   131  	}
   132  }
   133  
   134  func TestBitStringAt(t *testing.T) {
   135  	bs := BitString{[]byte{0x82, 0x40}, 16}
   136  	if bs.At(0) != 1 {
   137  		t.Error("#1: Failed")
   138  	}
   139  	if bs.At(1) != 0 {
   140  		t.Error("#2: Failed")
   141  	}
   142  	if bs.At(6) != 1 {
   143  		t.Error("#3: Failed")
   144  	}
   145  	if bs.At(9) != 1 {
   146  		t.Error("#4: Failed")
   147  	}
   148  }
   149  
   150  type bitStringRightAlignTest struct {
   151  	in    []byte
   152  	inlen int
   153  	out   []byte
   154  }
   155  
   156  var bitStringRightAlignTests = []bitStringRightAlignTest{
   157  	{[]byte{0x80}, 1, []byte{0x01}},
   158  	{[]byte{0x80, 0x80}, 9, []byte{0x01, 0x01}},
   159  	{[]byte{}, 0, []byte{}},
   160  	{[]byte{0xce}, 8, []byte{0xce}},
   161  	{[]byte{0xce, 0x47}, 16, []byte{0xce, 0x47}},
   162  	{[]byte{0x34, 0x50}, 12, []byte{0x03, 0x45}},
   163  }
   164  
   165  func TestBitStringRightAlign(t *testing.T) {
   166  	for i, test := range bitStringRightAlignTests {
   167  		bs := BitString{test.in, test.inlen}
   168  		out := bs.RightAlign()
   169  		if !bytes.Equal(out, test.out) {
   170  			t.Errorf("#%d got: %x want: %x", i, out, test.out)
   171  		}
   172  	}
   173  }
   174  
   175  type objectIdentifierTest struct {
   176  	in  []byte
   177  	ok  bool
   178  	out []int
   179  }
   180  
   181  var objectIdentifierTestData = []objectIdentifierTest{
   182  	{[]byte{}, false, []int{}},
   183  	{[]byte{85}, true, []int{2, 5}},
   184  	{[]byte{85, 0x02}, true, []int{2, 5, 2}},
   185  	{[]byte{85, 0x02, 0xc0, 0x00}, true, []int{2, 5, 2, 0x2000}},
   186  	{[]byte{85, 0x02, 0xc0, 0x80, 0x80, 0x80, 0x80}, false, []int{}},
   187  }
   188  
   189  func TestObjectIdentifier(t *testing.T) {
   190  	for i, test := range objectIdentifierTestData {
   191  		ret, err := parseObjectIdentifier(test.in)
   192  		if (err == nil) != test.ok {
   193  			t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok)
   194  		}
   195  		if err == nil {
   196  			if !reflect.DeepEqual(test.out, ret) {
   197  				t.Errorf("#%d: Bad result: %v (expected %v)", i, ret, test.out)
   198  			}
   199  		}
   200  	}
   201  }
   202  
   203  type timeTest struct {
   204  	in  string
   205  	ok  bool
   206  	out time.Time
   207  }
   208  
   209  var utcTestData = []timeTest{
   210  	{"910506164540-0700", true, time.Date(1991, 05, 06, 16, 45, 40, 0, time.FixedZone("", -7*60*60))},
   211  	{"910506164540+0730", true, time.Date(1991, 05, 06, 16, 45, 40, 0, time.FixedZone("", 7*60*60+30*60))},
   212  	{"910506234540Z", true, time.Date(1991, 05, 06, 23, 45, 40, 0, time.UTC)},
   213  	{"9105062345Z", true, time.Date(1991, 05, 06, 23, 45, 0, 0, time.UTC)},
   214  	{"a10506234540Z", false, time.Time{}},
   215  	{"91a506234540Z", false, time.Time{}},
   216  	{"9105a6234540Z", false, time.Time{}},
   217  	{"910506a34540Z", false, time.Time{}},
   218  	{"910506334a40Z", false, time.Time{}},
   219  	{"91050633444aZ", false, time.Time{}},
   220  	{"910506334461Z", false, time.Time{}},
   221  	{"910506334400Za", false, time.Time{}},
   222  }
   223  
   224  func TestUTCTime(t *testing.T) {
   225  	for i, test := range utcTestData {
   226  		ret, err := parseUTCTime([]byte(test.in))
   227  		if err != nil {
   228  			if test.ok {
   229  				t.Errorf("#%d: parseUTCTime(%q) = error %v", i, test.in, err)
   230  			}
   231  			continue
   232  		}
   233  		if !test.ok {
   234  			t.Errorf("#%d: parseUTCTime(%q) succeeded, should have failed", i, test.in)
   235  			continue
   236  		}
   237  		const format = "Jan _2 15:04:05 -0700 2006" // ignore zone name, just offset
   238  		have := ret.Format(format)
   239  		want := test.out.Format(format)
   240  		if have != want {
   241  			t.Errorf("#%d: parseUTCTime(%q) = %s, want %s", i, test.in, have, want)
   242  		}
   243  	}
   244  }
   245  
   246  var generalizedTimeTestData = []timeTest{
   247  	{"20100102030405Z", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.UTC)},
   248  	{"20100102030405", false, time.Time{}},
   249  	{"20100102030405+0607", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", 6*60*60+7*60))},
   250  	{"20100102030405-0607", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", -6*60*60-7*60))},
   251  }
   252  
   253  func TestGeneralizedTime(t *testing.T) {
   254  	for i, test := range generalizedTimeTestData {
   255  		ret, err := parseGeneralizedTime([]byte(test.in))
   256  		if (err == nil) != test.ok {
   257  			t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok)
   258  		}
   259  		if err == nil {
   260  			if !reflect.DeepEqual(test.out, ret) {
   261  				t.Errorf("#%d: Bad result: %v (expected %v)", i, ret, test.out)
   262  			}
   263  		}
   264  	}
   265  }
   266  
   267  type tagAndLengthTest struct {
   268  	in  []byte
   269  	ok  bool
   270  	out tagAndLength
   271  }
   272  
   273  var tagAndLengthData = []tagAndLengthTest{
   274  	{[]byte{0x80, 0x01}, true, tagAndLength{2, 0, 1, false}},
   275  	{[]byte{0xa0, 0x01}, true, tagAndLength{2, 0, 1, true}},
   276  	{[]byte{0x02, 0x00}, true, tagAndLength{0, 2, 0, false}},
   277  	{[]byte{0xfe, 0x00}, true, tagAndLength{3, 30, 0, true}},
   278  	{[]byte{0x1f, 0x01, 0x00}, true, tagAndLength{0, 1, 0, false}},
   279  	{[]byte{0x1f, 0x81, 0x00, 0x00}, true, tagAndLength{0, 128, 0, false}},
   280  	{[]byte{0x1f, 0x81, 0x80, 0x01, 0x00}, true, tagAndLength{0, 0x4001, 0, false}},
   281  	{[]byte{0x00, 0x81, 0x01}, true, tagAndLength{0, 0, 1, false}},
   282  	{[]byte{0x00, 0x82, 0x01, 0x00}, true, tagAndLength{0, 0, 256, false}},
   283  	{[]byte{0x00, 0x83, 0x01, 0x00}, false, tagAndLength{}},
   284  	{[]byte{0x1f, 0x85}, false, tagAndLength{}},
   285  	{[]byte{0x30, 0x80}, false, tagAndLength{}},
   286  	// Superfluous zeros in the length should be an error.
   287  	{[]byte{0xa0, 0x82, 0x00, 0x01}, false, tagAndLength{}},
   288  	// Lengths up to the maximum size of an int should work.
   289  	{[]byte{0xa0, 0x84, 0x7f, 0xff, 0xff, 0xff}, true, tagAndLength{2, 0, 0x7fffffff, true}},
   290  	// Lengths that would overflow an int should be rejected.
   291  	{[]byte{0xa0, 0x84, 0x80, 0x00, 0x00, 0x00}, false, tagAndLength{}},
   292  }
   293  
   294  func TestParseTagAndLength(t *testing.T) {
   295  	for i, test := range tagAndLengthData {
   296  		tagAndLength, _, err := parseTagAndLength(test.in, 0)
   297  		if (err == nil) != test.ok {
   298  			t.Errorf("#%d: Incorrect error result (did pass? %v, expected: %v)", i, err == nil, test.ok)
   299  		}
   300  		if err == nil && !reflect.DeepEqual(test.out, tagAndLength) {
   301  			t.Errorf("#%d: Bad result: %v (expected %v)", i, tagAndLength, test.out)
   302  		}
   303  	}
   304  }
   305  
   306  type parseFieldParametersTest struct {
   307  	in  string
   308  	out fieldParameters
   309  }
   310  
   311  func newInt(n int) *int { return &n }
   312  
   313  func newInt64(n int64) *int64 { return &n }
   314  
   315  func newString(s string) *string { return &s }
   316  
   317  func newBool(b bool) *bool { return &b }
   318  
   319  var parseFieldParametersTestData []parseFieldParametersTest = []parseFieldParametersTest{
   320  	{"", fieldParameters{}},
   321  	{"ia5", fieldParameters{stringType: tagIA5String}},
   322  	{"printable", fieldParameters{stringType: tagPrintableString}},
   323  	{"optional", fieldParameters{optional: true}},
   324  	{"explicit", fieldParameters{explicit: true, tag: new(int)}},
   325  	{"application", fieldParameters{application: true, tag: new(int)}},
   326  	{"optional,explicit", fieldParameters{optional: true, explicit: true, tag: new(int)}},
   327  	{"default:42", fieldParameters{defaultValue: newInt64(42)}},
   328  	{"tag:17", fieldParameters{tag: newInt(17)}},
   329  	{"optional,explicit,default:42,tag:17", fieldParameters{optional: true, explicit: true, defaultValue: newInt64(42), tag: newInt(17)}},
   330  	{"optional,explicit,default:42,tag:17,rubbish1", fieldParameters{true, true, false, newInt64(42), newInt(17), 0, false, false}},
   331  	{"set", fieldParameters{set: true}},
   332  }
   333  
   334  func TestParseFieldParameters(t *testing.T) {
   335  	for i, test := range parseFieldParametersTestData {
   336  		f := parseFieldParameters(test.in)
   337  		if !reflect.DeepEqual(f, test.out) {
   338  			t.Errorf("#%d: Bad result: %v (expected %v)", i, f, test.out)
   339  		}
   340  	}
   341  }
   342  
   343  type TestObjectIdentifierStruct struct {
   344  	OID ObjectIdentifier
   345  }
   346  
   347  type TestContextSpecificTags struct {
   348  	A int `asn1:"tag:1"`
   349  }
   350  
   351  type TestContextSpecificTags2 struct {
   352  	A int `asn1:"explicit,tag:1"`
   353  	B int
   354  }
   355  
   356  type TestElementsAfterString struct {
   357  	S    string
   358  	A, B int
   359  }
   360  
   361  type TestBigInt struct {
   362  	X *big.Int
   363  }
   364  
   365  var unmarshalTestData = []struct {
   366  	in  []byte
   367  	out interface{}
   368  }{
   369  	{[]byte{0x02, 0x01, 0x42}, newInt(0x42)},
   370  	{[]byte{0x30, 0x08, 0x06, 0x06, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d}, &TestObjectIdentifierStruct{[]int{1, 2, 840, 113549}}},
   371  	{[]byte{0x03, 0x04, 0x06, 0x6e, 0x5d, 0xc0}, &BitString{[]byte{110, 93, 192}, 18}},
   372  	{[]byte{0x30, 0x09, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02, 0x01, 0x03}, &[]int{1, 2, 3}},
   373  	{[]byte{0x02, 0x01, 0x10}, newInt(16)},
   374  	{[]byte{0x13, 0x04, 't', 'e', 's', 't'}, newString("test")},
   375  	{[]byte{0x16, 0x04, 't', 'e', 's', 't'}, newString("test")},
   376  	{[]byte{0x16, 0x04, 't', 'e', 's', 't'}, &RawValue{0, 22, false, []byte("test"), []byte("\x16\x04test")}},
   377  	{[]byte{0x04, 0x04, 1, 2, 3, 4}, &RawValue{0, 4, false, []byte{1, 2, 3, 4}, []byte{4, 4, 1, 2, 3, 4}}},
   378  	{[]byte{0x30, 0x03, 0x81, 0x01, 0x01}, &TestContextSpecificTags{1}},
   379  	{[]byte{0x30, 0x08, 0xa1, 0x03, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02}, &TestContextSpecificTags2{1, 2}},
   380  	{[]byte{0x01, 0x01, 0x00}, newBool(false)},
   381  	{[]byte{0x01, 0x01, 0x01}, newBool(true)},
   382  	{[]byte{0x30, 0x0b, 0x13, 0x03, 0x66, 0x6f, 0x6f, 0x02, 0x01, 0x22, 0x02, 0x01, 0x33}, &TestElementsAfterString{"foo", 0x22, 0x33}},
   383  	{[]byte{0x30, 0x05, 0x02, 0x03, 0x12, 0x34, 0x56}, &TestBigInt{big.NewInt(0x123456)}},
   384  }
   385  
   386  func TestUnmarshal(t *testing.T) {
   387  	for i, test := range unmarshalTestData {
   388  		pv := reflect.New(reflect.TypeOf(test.out).Elem())
   389  		val := pv.Interface()
   390  		_, err := Unmarshal(test.in, val)
   391  		if err != nil {
   392  			t.Errorf("Unmarshal failed at index %d %v", i, err)
   393  		}
   394  		if !reflect.DeepEqual(val, test.out) {
   395  			t.Errorf("#%d:\nhave %#v\nwant %#v", i, val, test.out)
   396  		}
   397  	}
   398  }
   399  
   400  type Certificate struct {
   401  	TBSCertificate     TBSCertificate
   402  	SignatureAlgorithm AlgorithmIdentifier
   403  	SignatureValue     BitString
   404  }
   405  
   406  type TBSCertificate struct {
   407  	Version            int `asn1:"optional,explicit,default:0,tag:0"`
   408  	SerialNumber       RawValue
   409  	SignatureAlgorithm AlgorithmIdentifier
   410  	Issuer             RDNSequence
   411  	Validity           Validity
   412  	Subject            RDNSequence
   413  	PublicKey          PublicKeyInfo
   414  }
   415  
   416  type AlgorithmIdentifier struct {
   417  	Algorithm ObjectIdentifier
   418  }
   419  
   420  type RDNSequence []RelativeDistinguishedNameSET
   421  
   422  type RelativeDistinguishedNameSET []AttributeTypeAndValue
   423  
   424  type AttributeTypeAndValue struct {
   425  	Type  ObjectIdentifier
   426  	Value interface{}
   427  }
   428  
   429  type Validity struct {
   430  	NotBefore, NotAfter time.Time
   431  }
   432  
   433  type PublicKeyInfo struct {
   434  	Algorithm AlgorithmIdentifier
   435  	PublicKey BitString
   436  }
   437  
   438  func TestCertificate(t *testing.T) {
   439  	// This is a minimal, self-signed certificate that should parse correctly.
   440  	var cert Certificate
   441  	if _, err := Unmarshal(derEncodedSelfSignedCertBytes, &cert); err != nil {
   442  		t.Errorf("Unmarshal failed: %v", err)
   443  	}
   444  	if !reflect.DeepEqual(cert, derEncodedSelfSignedCert) {
   445  		t.Errorf("Bad result:\ngot: %+v\nwant: %+v", cert, derEncodedSelfSignedCert)
   446  	}
   447  }
   448  
   449  func TestCertificateWithNUL(t *testing.T) {
   450  	// This is the paypal NUL-hack certificate. It should fail to parse because
   451  	// NUL isn't a permitted character in a PrintableString.
   452  
   453  	var cert Certificate
   454  	if _, err := Unmarshal(derEncodedPaypalNULCertBytes, &cert); err == nil {
   455  		t.Error("Unmarshal succeeded, should not have")
   456  	}
   457  }
   458  
   459  type rawStructTest struct {
   460  	Raw RawContent
   461  	A   int
   462  }
   463  
   464  func TestRawStructs(t *testing.T) {
   465  	var s rawStructTest
   466  	input := []byte{0x30, 0x03, 0x02, 0x01, 0x50}
   467  
   468  	rest, err := Unmarshal(input, &s)
   469  	if len(rest) != 0 {
   470  		t.Errorf("incomplete parse: %x", rest)
   471  		return
   472  	}
   473  	if err != nil {
   474  		t.Error(err)
   475  		return
   476  	}
   477  	if s.A != 0x50 {
   478  		t.Errorf("bad value for A: got %d want %d", s.A, 0x50)
   479  	}
   480  	if !bytes.Equal([]byte(s.Raw), input) {
   481  		t.Errorf("bad value for Raw: got %x want %x", s.Raw, input)
   482  	}
   483  }
   484  
   485  var derEncodedSelfSignedCert = Certificate{
   486  	TBSCertificate: TBSCertificate{
   487  		Version:            0,
   488  		SerialNumber:       RawValue{Class: 0, Tag: 2, IsCompound: false, Bytes: []uint8{0x0, 0x8c, 0xc3, 0x37, 0x92, 0x10, 0xec, 0x2c, 0x98}, FullBytes: []byte{2, 9, 0x0, 0x8c, 0xc3, 0x37, 0x92, 0x10, 0xec, 0x2c, 0x98}},
   489  		SignatureAlgorithm: AlgorithmIdentifier{Algorithm: ObjectIdentifier{1, 2, 840, 113549, 1, 1, 5}},
   490  		Issuer: RDNSequence{
   491  			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 6}, Value: "XX"}},
   492  			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 8}, Value: "Some-State"}},
   493  			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 7}, Value: "City"}},
   494  			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 10}, Value: "Internet Widgits Pty Ltd"}},
   495  			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 3}, Value: "false.example.com"}},
   496  			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{1, 2, 840, 113549, 1, 9, 1}, Value: "false@example.com"}},
   497  		},
   498  		Validity: Validity{
   499  			NotBefore: time.Date(2009, 10, 8, 00, 25, 53, 0, time.UTC),
   500  			NotAfter:  time.Date(2010, 10, 8, 00, 25, 53, 0, time.UTC),
   501  		},
   502  		Subject: RDNSequence{
   503  			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 6}, Value: "XX"}},
   504  			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 8}, Value: "Some-State"}},
   505  			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 7}, Value: "City"}},
   506  			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 10}, Value: "Internet Widgits Pty Ltd"}},
   507  			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 3}, Value: "false.example.com"}},
   508  			RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{1, 2, 840, 113549, 1, 9, 1}, Value: "false@example.com"}},
   509  		},
   510  		PublicKey: PublicKeyInfo{
   511  			Algorithm: AlgorithmIdentifier{Algorithm: ObjectIdentifier{1, 2, 840, 113549, 1, 1, 1}},
   512  			PublicKey: BitString{
   513  				Bytes: []uint8{
   514  					0x30, 0x48, 0x2, 0x41, 0x0, 0xcd, 0xb7,
   515  					0x63, 0x9c, 0x32, 0x78, 0xf0, 0x6, 0xaa, 0x27, 0x7f, 0x6e, 0xaf, 0x42,
   516  					0x90, 0x2b, 0x59, 0x2d, 0x8c, 0xbc, 0xbe, 0x38, 0xa1, 0xc9, 0x2b, 0xa4,
   517  					0x69, 0x5a, 0x33, 0x1b, 0x1d, 0xea, 0xde, 0xad, 0xd8, 0xe9, 0xa5, 0xc2,
   518  					0x7e, 0x8c, 0x4c, 0x2f, 0xd0, 0xa8, 0x88, 0x96, 0x57, 0x72, 0x2a, 0x4f,
   519  					0x2a, 0xf7, 0x58, 0x9c, 0xf2, 0xc7, 0x70, 0x45, 0xdc, 0x8f, 0xde, 0xec,
   520  					0x35, 0x7d, 0x2, 0x3, 0x1, 0x0, 0x1,
   521  				},
   522  				BitLength: 592,
   523  			},
   524  		},
   525  	},
   526  	SignatureAlgorithm: AlgorithmIdentifier{Algorithm: ObjectIdentifier{1, 2, 840, 113549, 1, 1, 5}},
   527  	SignatureValue: BitString{
   528  		Bytes: []uint8{
   529  			0xa6, 0x7b, 0x6, 0xec, 0x5e, 0xce,
   530  			0x92, 0x77, 0x2c, 0xa4, 0x13, 0xcb, 0xa3, 0xca, 0x12, 0x56, 0x8f, 0xdc, 0x6c,
   531  			0x7b, 0x45, 0x11, 0xcd, 0x40, 0xa7, 0xf6, 0x59, 0x98, 0x4, 0x2, 0xdf, 0x2b,
   532  			0x99, 0x8b, 0xb9, 0xa4, 0xa8, 0xcb, 0xeb, 0x34, 0xc0, 0xf0, 0xa7, 0x8c, 0xf8,
   533  			0xd9, 0x1e, 0xde, 0x14, 0xa5, 0xed, 0x76, 0xbf, 0x11, 0x6f, 0xe3, 0x60, 0xaa,
   534  			0xfa, 0x88, 0x21, 0x49, 0x4, 0x35,
   535  		},
   536  		BitLength: 512,
   537  	},
   538  }
   539  
   540  var derEncodedSelfSignedCertBytes = []byte{
   541  	0x30, 0x82, 0x02, 0x18, 0x30,
   542  	0x82, 0x01, 0xc2, 0x02, 0x09, 0x00, 0x8c, 0xc3, 0x37, 0x92, 0x10, 0xec, 0x2c,
   543  	0x98, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
   544  	0x05, 0x05, 0x00, 0x30, 0x81, 0x92, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
   545  	0x04, 0x06, 0x13, 0x02, 0x58, 0x58, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55,
   546  	0x04, 0x08, 0x13, 0x0a, 0x53, 0x6f, 0x6d, 0x65, 0x2d, 0x53, 0x74, 0x61, 0x74,
   547  	0x65, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x04, 0x43,
   548  	0x69, 0x74, 0x79, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,
   549  	0x18, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x57, 0x69, 0x64,
   550  	0x67, 0x69, 0x74, 0x73, 0x20, 0x50, 0x74, 0x79, 0x20, 0x4c, 0x74, 0x64, 0x31,
   551  	0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x11, 0x66, 0x61, 0x6c,
   552  	0x73, 0x65, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f,
   553  	0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
   554  	0x01, 0x09, 0x01, 0x16, 0x11, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x40, 0x65, 0x78,
   555  	0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, 0x0d,
   556  	0x30, 0x39, 0x31, 0x30, 0x30, 0x38, 0x30, 0x30, 0x32, 0x35, 0x35, 0x33, 0x5a,
   557  	0x17, 0x0d, 0x31, 0x30, 0x31, 0x30, 0x30, 0x38, 0x30, 0x30, 0x32, 0x35, 0x35,
   558  	0x33, 0x5a, 0x30, 0x81, 0x92, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,
   559  	0x06, 0x13, 0x02, 0x58, 0x58, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04,
   560  	0x08, 0x13, 0x0a, 0x53, 0x6f, 0x6d, 0x65, 0x2d, 0x53, 0x74, 0x61, 0x74, 0x65,
   561  	0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x04, 0x43, 0x69,
   562  	0x74, 0x79, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18,
   563  	0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x57, 0x69, 0x64, 0x67,
   564  	0x69, 0x74, 0x73, 0x20, 0x50, 0x74, 0x79, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x1a,
   565  	0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x11, 0x66, 0x61, 0x6c, 0x73,
   566  	0x65, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d,
   567  	0x31, 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
   568  	0x09, 0x01, 0x16, 0x11, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x40, 0x65, 0x78, 0x61,
   569  	0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x5c, 0x30, 0x0d, 0x06,
   570  	0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,
   571  	0x4b, 0x00, 0x30, 0x48, 0x02, 0x41, 0x00, 0xcd, 0xb7, 0x63, 0x9c, 0x32, 0x78,
   572  	0xf0, 0x06, 0xaa, 0x27, 0x7f, 0x6e, 0xaf, 0x42, 0x90, 0x2b, 0x59, 0x2d, 0x8c,
   573  	0xbc, 0xbe, 0x38, 0xa1, 0xc9, 0x2b, 0xa4, 0x69, 0x5a, 0x33, 0x1b, 0x1d, 0xea,
   574  	0xde, 0xad, 0xd8, 0xe9, 0xa5, 0xc2, 0x7e, 0x8c, 0x4c, 0x2f, 0xd0, 0xa8, 0x88,
   575  	0x96, 0x57, 0x72, 0x2a, 0x4f, 0x2a, 0xf7, 0x58, 0x9c, 0xf2, 0xc7, 0x70, 0x45,
   576  	0xdc, 0x8f, 0xde, 0xec, 0x35, 0x7d, 0x02, 0x03, 0x01, 0x00, 0x01, 0x30, 0x0d,
   577  	0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00,
   578  	0x03, 0x41, 0x00, 0xa6, 0x7b, 0x06, 0xec, 0x5e, 0xce, 0x92, 0x77, 0x2c, 0xa4,
   579  	0x13, 0xcb, 0xa3, 0xca, 0x12, 0x56, 0x8f, 0xdc, 0x6c, 0x7b, 0x45, 0x11, 0xcd,
   580  	0x40, 0xa7, 0xf6, 0x59, 0x98, 0x04, 0x02, 0xdf, 0x2b, 0x99, 0x8b, 0xb9, 0xa4,
   581  	0xa8, 0xcb, 0xeb, 0x34, 0xc0, 0xf0, 0xa7, 0x8c, 0xf8, 0xd9, 0x1e, 0xde, 0x14,
   582  	0xa5, 0xed, 0x76, 0xbf, 0x11, 0x6f, 0xe3, 0x60, 0xaa, 0xfa, 0x88, 0x21, 0x49,
   583  	0x04, 0x35,
   584  }
   585  
   586  var derEncodedPaypalNULCertBytes = []byte{
   587  	0x30, 0x82, 0x06, 0x44, 0x30,
   588  	0x82, 0x05, 0xad, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x00, 0xf0, 0x9b,
   589  	0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,
   590  	0x05, 0x00, 0x30, 0x82, 0x01, 0x12, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
   591  	0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55,
   592  	0x04, 0x08, 0x13, 0x09, 0x42, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x6f, 0x6e, 0x61,
   593  	0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x09, 0x42, 0x61,
   594  	0x72, 0x63, 0x65, 0x6c, 0x6f, 0x6e, 0x61, 0x31, 0x29, 0x30, 0x27, 0x06, 0x03,
   595  	0x55, 0x04, 0x0a, 0x13, 0x20, 0x49, 0x50, 0x53, 0x20, 0x43, 0x65, 0x72, 0x74,
   596  	0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74,
   597  	0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x73, 0x2e, 0x6c, 0x2e, 0x31, 0x2e,
   598  	0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x14, 0x25, 0x67, 0x65, 0x6e, 0x65,
   599  	0x72, 0x61, 0x6c, 0x40, 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d,
   600  	0x20, 0x43, 0x2e, 0x49, 0x2e, 0x46, 0x2e, 0x20, 0x20, 0x42, 0x2d, 0x42, 0x36,
   601  	0x32, 0x32, 0x31, 0x30, 0x36, 0x39, 0x35, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03,
   602  	0x55, 0x04, 0x0b, 0x13, 0x25, 0x69, 0x70, 0x73, 0x43, 0x41, 0x20, 0x43, 0x4c,
   603  	0x41, 0x53, 0x45, 0x41, 0x31, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
   604  	0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72,
   605  	0x69, 0x74, 0x79, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
   606  	0x25, 0x69, 0x70, 0x73, 0x43, 0x41, 0x20, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41,
   607  	0x31, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,
   608  	0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31,
   609  	0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09,
   610  	0x01, 0x16, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x40, 0x69, 0x70,
   611  	0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39,
   612  	0x30, 0x32, 0x32, 0x34, 0x32, 0x33, 0x30, 0x34, 0x31, 0x37, 0x5a, 0x17, 0x0d,
   613  	0x31, 0x31, 0x30, 0x32, 0x32, 0x34, 0x32, 0x33, 0x30, 0x34, 0x31, 0x37, 0x5a,
   614  	0x30, 0x81, 0x94, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
   615  	0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13,
   616  	0x0a, 0x43, 0x61, 0x6c, 0x69, 0x66, 0x6f, 0x72, 0x6e, 0x69, 0x61, 0x31, 0x16,
   617  	0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0d, 0x53, 0x61, 0x6e, 0x20,
   618  	0x46, 0x72, 0x61, 0x6e, 0x63, 0x69, 0x73, 0x63, 0x6f, 0x31, 0x11, 0x30, 0x0f,
   619  	0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69,
   620  	0x74, 0x79, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0b,
   621  	0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x55, 0x6e, 0x69, 0x74, 0x31, 0x2f,
   622  	0x30, 0x2d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x26, 0x77, 0x77, 0x77, 0x2e,
   623  	0x70, 0x61, 0x79, 0x70, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x00, 0x73, 0x73,
   624  	0x6c, 0x2e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65,
   625  	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x63, 0x63, 0x30, 0x81, 0x9f, 0x30, 0x0d,
   626  	0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00,
   627  	0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xd2, 0x69,
   628  	0xfa, 0x6f, 0x3a, 0x00, 0xb4, 0x21, 0x1b, 0xc8, 0xb1, 0x02, 0xd7, 0x3f, 0x19,
   629  	0xb2, 0xc4, 0x6d, 0xb4, 0x54, 0xf8, 0x8b, 0x8a, 0xcc, 0xdb, 0x72, 0xc2, 0x9e,
   630  	0x3c, 0x60, 0xb9, 0xc6, 0x91, 0x3d, 0x82, 0xb7, 0x7d, 0x99, 0xff, 0xd1, 0x29,
   631  	0x84, 0xc1, 0x73, 0x53, 0x9c, 0x82, 0xdd, 0xfc, 0x24, 0x8c, 0x77, 0xd5, 0x41,
   632  	0xf3, 0xe8, 0x1e, 0x42, 0xa1, 0xad, 0x2d, 0x9e, 0xff, 0x5b, 0x10, 0x26, 0xce,
   633  	0x9d, 0x57, 0x17, 0x73, 0x16, 0x23, 0x38, 0xc8, 0xd6, 0xf1, 0xba, 0xa3, 0x96,
   634  	0x5b, 0x16, 0x67, 0x4a, 0x4f, 0x73, 0x97, 0x3a, 0x4d, 0x14, 0xa4, 0xf4, 0xe2,
   635  	0x3f, 0x8b, 0x05, 0x83, 0x42, 0xd1, 0xd0, 0xdc, 0x2f, 0x7a, 0xe5, 0xb6, 0x10,
   636  	0xb2, 0x11, 0xc0, 0xdc, 0x21, 0x2a, 0x90, 0xff, 0xae, 0x97, 0x71, 0x5a, 0x49,
   637  	0x81, 0xac, 0x40, 0xf3, 0x3b, 0xb8, 0x59, 0xb2, 0x4f, 0x02, 0x03, 0x01, 0x00,
   638  	0x01, 0xa3, 0x82, 0x03, 0x21, 0x30, 0x82, 0x03, 0x1d, 0x30, 0x09, 0x06, 0x03,
   639  	0x55, 0x1d, 0x13, 0x04, 0x02, 0x30, 0x00, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86,
   640  	0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x06, 0x40,
   641  	0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x03, 0xf8,
   642  	0x30, 0x13, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x0c, 0x30, 0x0a, 0x06, 0x08,
   643  	0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x30, 0x1d, 0x06, 0x03, 0x55,
   644  	0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x61, 0x8f, 0x61, 0x34, 0x43, 0x55, 0x14,
   645  	0x7f, 0x27, 0x09, 0xce, 0x4c, 0x8b, 0xea, 0x9b, 0x7b, 0x19, 0x25, 0xbc, 0x6e,
   646  	0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14,
   647  	0x0e, 0x07, 0x60, 0xd4, 0x39, 0xc9, 0x1b, 0x5b, 0x5d, 0x90, 0x7b, 0x23, 0xc8,
   648  	0xd2, 0x34, 0x9d, 0x4a, 0x9a, 0x46, 0x39, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d,
   649  	0x11, 0x04, 0x02, 0x30, 0x00, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x1d, 0x12, 0x04,
   650  	0x15, 0x30, 0x13, 0x81, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x40,
   651  	0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x72, 0x06, 0x09,
   652  	0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x0d, 0x04, 0x65, 0x16, 0x63,
   653  	0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
   654  	0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e,
   655  	0x4f, 0x54, 0x20, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x45, 0x44, 0x2e,
   656  	0x20, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 0x31, 0x20, 0x53, 0x65, 0x72, 0x76,
   657  	0x65, 0x72, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
   658  	0x65, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x68,
   659  	0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70,
   660  	0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x30, 0x2f, 0x06, 0x09, 0x60,
   661  	0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x02, 0x04, 0x22, 0x16, 0x20, 0x68,
   662  	0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70,
   663  	0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61,
   664  	0x32, 0x30, 0x30, 0x32, 0x2f, 0x30, 0x43, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01,
   665  	0x86, 0xf8, 0x42, 0x01, 0x04, 0x04, 0x36, 0x16, 0x34, 0x68, 0x74, 0x74, 0x70,
   666  	0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70, 0x73, 0x63, 0x61,
   667  	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 0x30, 0x30,
   668  	0x32, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 0x30, 0x30, 0x32, 0x43, 0x4c,
   669  	0x41, 0x53, 0x45, 0x41, 0x31, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x46, 0x06, 0x09,
   670  	0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x03, 0x04, 0x39, 0x16, 0x37,
   671  	0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69,
   672  	0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63,
   673  	0x61, 0x32, 0x30, 0x30, 0x32, 0x2f, 0x72, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74,
   674  	0x69, 0x6f, 0x6e, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 0x31, 0x2e, 0x68, 0x74,
   675  	0x6d, 0x6c, 0x3f, 0x30, 0x43, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8,
   676  	0x42, 0x01, 0x07, 0x04, 0x36, 0x16, 0x34, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a,
   677  	0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63,
   678  	0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 0x30, 0x30, 0x32, 0x2f,
   679  	0x72, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41,
   680  	0x31, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3f, 0x30, 0x41, 0x06, 0x09, 0x60, 0x86,
   681  	0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x08, 0x04, 0x34, 0x16, 0x32, 0x68, 0x74,
   682  	0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70, 0x73,
   683  	0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32,
   684  	0x30, 0x30, 0x32, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x4c, 0x41,
   685  	0x53, 0x45, 0x41, 0x31, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x30, 0x81, 0x83, 0x06,
   686  	0x03, 0x55, 0x1d, 0x1f, 0x04, 0x7c, 0x30, 0x7a, 0x30, 0x39, 0xa0, 0x37, 0xa0,
   687  	0x35, 0x86, 0x33, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
   688  	0x2e, 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70,
   689  	0x73, 0x63, 0x61, 0x32, 0x30, 0x30, 0x32, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61,
   690  	0x32, 0x30, 0x30, 0x32, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 0x31, 0x2e, 0x63,
   691  	0x72, 0x6c, 0x30, 0x3d, 0xa0, 0x3b, 0xa0, 0x39, 0x86, 0x37, 0x68, 0x74, 0x74,
   692  	0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x62, 0x61, 0x63, 0x6b, 0x2e, 0x69,
   693  	0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63,
   694  	0x61, 0x32, 0x30, 0x30, 0x32, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 0x30,
   695  	0x30, 0x32, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 0x31, 0x2e, 0x63, 0x72, 0x6c,
   696  	0x30, 0x32, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04,
   697  	0x26, 0x30, 0x24, 0x30, 0x22, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07,
   698  	0x30, 0x01, 0x86, 0x16, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63,
   699  	0x73, 0x70, 0x2e, 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
   700  	0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,
   701  	0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x68, 0xee, 0x79, 0x97, 0x97, 0xdd, 0x3b,
   702  	0xef, 0x16, 0x6a, 0x06, 0xf2, 0x14, 0x9a, 0x6e, 0xcd, 0x9e, 0x12, 0xf7, 0xaa,
   703  	0x83, 0x10, 0xbd, 0xd1, 0x7c, 0x98, 0xfa, 0xc7, 0xae, 0xd4, 0x0e, 0x2c, 0x9e,
   704  	0x38, 0x05, 0x9d, 0x52, 0x60, 0xa9, 0x99, 0x0a, 0x81, 0xb4, 0x98, 0x90, 0x1d,
   705  	0xae, 0xbb, 0x4a, 0xd7, 0xb9, 0xdc, 0x88, 0x9e, 0x37, 0x78, 0x41, 0x5b, 0xf7,
   706  	0x82, 0xa5, 0xf2, 0xba, 0x41, 0x25, 0x5a, 0x90, 0x1a, 0x1e, 0x45, 0x38, 0xa1,
   707  	0x52, 0x58, 0x75, 0x94, 0x26, 0x44, 0xfb, 0x20, 0x07, 0xba, 0x44, 0xcc, 0xe5,
   708  	0x4a, 0x2d, 0x72, 0x3f, 0x98, 0x47, 0xf6, 0x26, 0xdc, 0x05, 0x46, 0x05, 0x07,
   709  	0x63, 0x21, 0xab, 0x46, 0x9b, 0x9c, 0x78, 0xd5, 0x54, 0x5b, 0x3d, 0x0c, 0x1e,
   710  	0xc8, 0x64, 0x8c, 0xb5, 0x50, 0x23, 0x82, 0x6f, 0xdb, 0xb8, 0x22, 0x1c, 0x43,
   711  	0x96, 0x07, 0xa8, 0xbb,
   712  }