libgo: Merge to master revision 19184.
[official-gcc.git] / libgo / go / encoding / asn1 / asn1_test.go
blobb553f78e0a6fe659b0f77a541694895976e8c7cd
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.
5 package asn1
7 import (
8 "bytes"
9 "fmt"
10 "math/big"
11 "reflect"
12 "testing"
13 "time"
16 type boolTest struct {
17 in []byte
18 ok bool
19 out bool
22 var boolTestData = []boolTest{
23 {[]byte{0x00}, true, false},
24 {[]byte{0xff}, true, true},
25 {[]byte{0x00, 0x00}, false, false},
26 {[]byte{0xff, 0xff}, false, false},
27 {[]byte{0x01}, false, false},
30 func TestParseBool(t *testing.T) {
31 for i, test := range boolTestData {
32 ret, err := parseBool(test.in)
33 if (err == nil) != test.ok {
34 t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok)
36 if test.ok && ret != test.out {
37 t.Errorf("#%d: Bad result: %v (expected %v)", i, ret, test.out)
42 type int64Test struct {
43 in []byte
44 ok bool
45 out int64
48 var int64TestData = []int64Test{
49 {[]byte{0x00}, true, 0},
50 {[]byte{0x7f}, true, 127},
51 {[]byte{0x00, 0x80}, true, 128},
52 {[]byte{0x01, 0x00}, true, 256},
53 {[]byte{0x80}, true, -128},
54 {[]byte{0xff, 0x7f}, true, -129},
55 {[]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, true, -1},
56 {[]byte{0xff}, true, -1},
57 {[]byte{0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, true, -9223372036854775808},
58 {[]byte{0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, false, 0},
61 func TestParseInt64(t *testing.T) {
62 for i, test := range int64TestData {
63 ret, err := parseInt64(test.in)
64 if (err == nil) != test.ok {
65 t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok)
67 if test.ok && ret != test.out {
68 t.Errorf("#%d: Bad result: %v (expected %v)", i, ret, test.out)
73 type int32Test struct {
74 in []byte
75 ok bool
76 out int32
79 var int32TestData = []int32Test{
80 {[]byte{0x00}, true, 0},
81 {[]byte{0x7f}, true, 127},
82 {[]byte{0x00, 0x80}, true, 128},
83 {[]byte{0x01, 0x00}, true, 256},
84 {[]byte{0x80}, true, -128},
85 {[]byte{0xff, 0x7f}, true, -129},
86 {[]byte{0xff, 0xff, 0xff, 0xff}, true, -1},
87 {[]byte{0xff}, true, -1},
88 {[]byte{0x80, 0x00, 0x00, 0x00}, true, -2147483648},
89 {[]byte{0x80, 0x00, 0x00, 0x00, 0x00}, false, 0},
92 func TestParseInt32(t *testing.T) {
93 for i, test := range int32TestData {
94 ret, err := parseInt32(test.in)
95 if (err == nil) != test.ok {
96 t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok)
98 if test.ok && int32(ret) != test.out {
99 t.Errorf("#%d: Bad result: %v (expected %v)", i, ret, test.out)
104 var bigIntTests = []struct {
105 in []byte
106 base10 string
108 {[]byte{0xff}, "-1"},
109 {[]byte{0x00}, "0"},
110 {[]byte{0x01}, "1"},
111 {[]byte{0x00, 0xff}, "255"},
112 {[]byte{0xff, 0x00}, "-256"},
113 {[]byte{0x01, 0x00}, "256"},
116 func TestParseBigInt(t *testing.T) {
117 for i, test := range bigIntTests {
118 ret := parseBigInt(test.in)
119 if ret.String() != test.base10 {
120 t.Errorf("#%d: bad result from %x, got %s want %s", i, test.in, ret.String(), test.base10)
122 fw := newForkableWriter()
123 marshalBigInt(fw, ret)
124 result := fw.Bytes()
125 if !bytes.Equal(result, test.in) {
126 t.Errorf("#%d: got %x from marshaling %s, want %x", i, result, ret, test.in)
131 type bitStringTest struct {
132 in []byte
133 ok bool
134 out []byte
135 bitLength int
138 var bitStringTestData = []bitStringTest{
139 {[]byte{}, false, []byte{}, 0},
140 {[]byte{0x00}, true, []byte{}, 0},
141 {[]byte{0x07, 0x00}, true, []byte{0x00}, 1},
142 {[]byte{0x07, 0x01}, false, []byte{}, 0},
143 {[]byte{0x07, 0x40}, false, []byte{}, 0},
144 {[]byte{0x08, 0x00}, false, []byte{}, 0},
147 func TestBitString(t *testing.T) {
148 for i, test := range bitStringTestData {
149 ret, err := parseBitString(test.in)
150 if (err == nil) != test.ok {
151 t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok)
153 if err == nil {
154 if test.bitLength != ret.BitLength || !bytes.Equal(ret.Bytes, test.out) {
155 t.Errorf("#%d: Bad result: %v (expected %v %v)", i, ret, test.out, test.bitLength)
161 func TestBitStringAt(t *testing.T) {
162 bs := BitString{[]byte{0x82, 0x40}, 16}
163 if bs.At(0) != 1 {
164 t.Error("#1: Failed")
166 if bs.At(1) != 0 {
167 t.Error("#2: Failed")
169 if bs.At(6) != 1 {
170 t.Error("#3: Failed")
172 if bs.At(9) != 1 {
173 t.Error("#4: Failed")
175 if bs.At(-1) != 0 {
176 t.Error("#5: Failed")
178 if bs.At(17) != 0 {
179 t.Error("#6: Failed")
183 type bitStringRightAlignTest struct {
184 in []byte
185 inlen int
186 out []byte
189 var bitStringRightAlignTests = []bitStringRightAlignTest{
190 {[]byte{0x80}, 1, []byte{0x01}},
191 {[]byte{0x80, 0x80}, 9, []byte{0x01, 0x01}},
192 {[]byte{}, 0, []byte{}},
193 {[]byte{0xce}, 8, []byte{0xce}},
194 {[]byte{0xce, 0x47}, 16, []byte{0xce, 0x47}},
195 {[]byte{0x34, 0x50}, 12, []byte{0x03, 0x45}},
198 func TestBitStringRightAlign(t *testing.T) {
199 for i, test := range bitStringRightAlignTests {
200 bs := BitString{test.in, test.inlen}
201 out := bs.RightAlign()
202 if !bytes.Equal(out, test.out) {
203 t.Errorf("#%d got: %x want: %x", i, out, test.out)
208 type objectIdentifierTest struct {
209 in []byte
210 ok bool
211 out []int
214 var objectIdentifierTestData = []objectIdentifierTest{
215 {[]byte{}, false, []int{}},
216 {[]byte{85}, true, []int{2, 5}},
217 {[]byte{85, 0x02}, true, []int{2, 5, 2}},
218 {[]byte{85, 0x02, 0xc0, 0x00}, true, []int{2, 5, 2, 0x2000}},
219 {[]byte{0x81, 0x34, 0x03}, true, []int{2, 100, 3}},
220 {[]byte{85, 0x02, 0xc0, 0x80, 0x80, 0x80, 0x80}, false, []int{}},
223 func TestObjectIdentifier(t *testing.T) {
224 for i, test := range objectIdentifierTestData {
225 ret, err := parseObjectIdentifier(test.in)
226 if (err == nil) != test.ok {
227 t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok)
229 if err == nil {
230 if !reflect.DeepEqual(test.out, ret) {
231 t.Errorf("#%d: Bad result: %v (expected %v)", i, ret, test.out)
236 if s := ObjectIdentifier([]int{1, 2, 3, 4}).String(); s != "1.2.3.4" {
237 t.Errorf("bad ObjectIdentifier.String(). Got %s, want 1.2.3.4", s)
241 type timeTest struct {
242 in string
243 ok bool
244 out time.Time
247 var utcTestData = []timeTest{
248 {"910506164540-0700", true, time.Date(1991, 05, 06, 16, 45, 40, 0, time.FixedZone("", -7*60*60))},
249 {"910506164540+0730", true, time.Date(1991, 05, 06, 16, 45, 40, 0, time.FixedZone("", 7*60*60+30*60))},
250 {"910506234540Z", true, time.Date(1991, 05, 06, 23, 45, 40, 0, time.UTC)},
251 {"9105062345Z", true, time.Date(1991, 05, 06, 23, 45, 0, 0, time.UTC)},
252 {"5105062345Z", true, time.Date(1951, 05, 06, 23, 45, 0, 0, time.UTC)},
253 {"a10506234540Z", false, time.Time{}},
254 {"91a506234540Z", false, time.Time{}},
255 {"9105a6234540Z", false, time.Time{}},
256 {"910506a34540Z", false, time.Time{}},
257 {"910506334a40Z", false, time.Time{}},
258 {"91050633444aZ", false, time.Time{}},
259 {"910506334461Z", false, time.Time{}},
260 {"910506334400Za", false, time.Time{}},
263 func TestUTCTime(t *testing.T) {
264 for i, test := range utcTestData {
265 ret, err := parseUTCTime([]byte(test.in))
266 if err != nil {
267 if test.ok {
268 t.Errorf("#%d: parseUTCTime(%q) = error %v", i, test.in, err)
270 continue
272 if !test.ok {
273 t.Errorf("#%d: parseUTCTime(%q) succeeded, should have failed", i, test.in)
274 continue
276 const format = "Jan _2 15:04:05 -0700 2006" // ignore zone name, just offset
277 have := ret.Format(format)
278 want := test.out.Format(format)
279 if have != want {
280 t.Errorf("#%d: parseUTCTime(%q) = %s, want %s", i, test.in, have, want)
285 var generalizedTimeTestData = []timeTest{
286 {"20100102030405Z", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.UTC)},
287 {"20100102030405", false, time.Time{}},
288 {"20100102030405+0607", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", 6*60*60+7*60))},
289 {"20100102030405-0607", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", -6*60*60-7*60))},
292 func TestGeneralizedTime(t *testing.T) {
293 for i, test := range generalizedTimeTestData {
294 ret, err := parseGeneralizedTime([]byte(test.in))
295 if (err == nil) != test.ok {
296 t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok)
298 if err == nil {
299 if !reflect.DeepEqual(test.out, ret) {
300 t.Errorf("#%d: Bad result: %v (expected %v)", i, ret, test.out)
306 type tagAndLengthTest struct {
307 in []byte
308 ok bool
309 out tagAndLength
312 var tagAndLengthData = []tagAndLengthTest{
313 {[]byte{0x80, 0x01}, true, tagAndLength{2, 0, 1, false}},
314 {[]byte{0xa0, 0x01}, true, tagAndLength{2, 0, 1, true}},
315 {[]byte{0x02, 0x00}, true, tagAndLength{0, 2, 0, false}},
316 {[]byte{0xfe, 0x00}, true, tagAndLength{3, 30, 0, true}},
317 {[]byte{0x1f, 0x01, 0x00}, true, tagAndLength{0, 1, 0, false}},
318 {[]byte{0x1f, 0x81, 0x00, 0x00}, true, tagAndLength{0, 128, 0, false}},
319 {[]byte{0x1f, 0x81, 0x80, 0x01, 0x00}, true, tagAndLength{0, 0x4001, 0, false}},
320 {[]byte{0x00, 0x81, 0x01}, true, tagAndLength{0, 0, 1, false}},
321 {[]byte{0x00, 0x82, 0x01, 0x00}, true, tagAndLength{0, 0, 256, false}},
322 {[]byte{0x00, 0x83, 0x01, 0x00}, false, tagAndLength{}},
323 {[]byte{0x1f, 0x85}, false, tagAndLength{}},
324 {[]byte{0x30, 0x80}, false, tagAndLength{}},
325 // Superfluous zeros in the length should be an error.
326 {[]byte{0xa0, 0x82, 0x00, 0x01}, false, tagAndLength{}},
327 // Lengths up to the maximum size of an int should work.
328 {[]byte{0xa0, 0x84, 0x7f, 0xff, 0xff, 0xff}, true, tagAndLength{2, 0, 0x7fffffff, true}},
329 // Lengths that would overflow an int should be rejected.
330 {[]byte{0xa0, 0x84, 0x80, 0x00, 0x00, 0x00}, false, tagAndLength{}},
333 func TestParseTagAndLength(t *testing.T) {
334 for i, test := range tagAndLengthData {
335 tagAndLength, _, err := parseTagAndLength(test.in, 0)
336 if (err == nil) != test.ok {
337 t.Errorf("#%d: Incorrect error result (did pass? %v, expected: %v)", i, err == nil, test.ok)
339 if err == nil && !reflect.DeepEqual(test.out, tagAndLength) {
340 t.Errorf("#%d: Bad result: %v (expected %v)", i, tagAndLength, test.out)
345 type parseFieldParametersTest struct {
346 in string
347 out fieldParameters
350 func newInt(n int) *int { return &n }
352 func newInt64(n int64) *int64 { return &n }
354 func newString(s string) *string { return &s }
356 func newBool(b bool) *bool { return &b }
358 var parseFieldParametersTestData []parseFieldParametersTest = []parseFieldParametersTest{
359 {"", fieldParameters{}},
360 {"ia5", fieldParameters{stringType: tagIA5String}},
361 {"printable", fieldParameters{stringType: tagPrintableString}},
362 {"optional", fieldParameters{optional: true}},
363 {"explicit", fieldParameters{explicit: true, tag: new(int)}},
364 {"application", fieldParameters{application: true, tag: new(int)}},
365 {"optional,explicit", fieldParameters{optional: true, explicit: true, tag: new(int)}},
366 {"default:42", fieldParameters{defaultValue: newInt64(42)}},
367 {"tag:17", fieldParameters{tag: newInt(17)}},
368 {"optional,explicit,default:42,tag:17", fieldParameters{optional: true, explicit: true, defaultValue: newInt64(42), tag: newInt(17)}},
369 {"optional,explicit,default:42,tag:17,rubbish1", fieldParameters{true, true, false, newInt64(42), newInt(17), 0, false, false}},
370 {"set", fieldParameters{set: true}},
373 func TestParseFieldParameters(t *testing.T) {
374 for i, test := range parseFieldParametersTestData {
375 f := parseFieldParameters(test.in)
376 if !reflect.DeepEqual(f, test.out) {
377 t.Errorf("#%d: Bad result: %v (expected %v)", i, f, test.out)
382 type TestObjectIdentifierStruct struct {
383 OID ObjectIdentifier
386 type TestContextSpecificTags struct {
387 A int `asn1:"tag:1"`
390 type TestContextSpecificTags2 struct {
391 A int `asn1:"explicit,tag:1"`
392 B int
395 type TestElementsAfterString struct {
396 S string
397 A, B int
400 type TestBigInt struct {
401 X *big.Int
404 type TestSet struct {
405 Ints []int `asn1:"set"`
408 var unmarshalTestData = []struct {
409 in []byte
410 out interface{}
412 {[]byte{0x02, 0x01, 0x42}, newInt(0x42)},
413 {[]byte{0x30, 0x08, 0x06, 0x06, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d}, &TestObjectIdentifierStruct{[]int{1, 2, 840, 113549}}},
414 {[]byte{0x03, 0x04, 0x06, 0x6e, 0x5d, 0xc0}, &BitString{[]byte{110, 93, 192}, 18}},
415 {[]byte{0x30, 0x09, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02, 0x01, 0x03}, &[]int{1, 2, 3}},
416 {[]byte{0x02, 0x01, 0x10}, newInt(16)},
417 {[]byte{0x13, 0x04, 't', 'e', 's', 't'}, newString("test")},
418 {[]byte{0x16, 0x04, 't', 'e', 's', 't'}, newString("test")},
419 {[]byte{0x16, 0x04, 't', 'e', 's', 't'}, &RawValue{0, 22, false, []byte("test"), []byte("\x16\x04test")}},
420 {[]byte{0x04, 0x04, 1, 2, 3, 4}, &RawValue{0, 4, false, []byte{1, 2, 3, 4}, []byte{4, 4, 1, 2, 3, 4}}},
421 {[]byte{0x30, 0x03, 0x81, 0x01, 0x01}, &TestContextSpecificTags{1}},
422 {[]byte{0x30, 0x08, 0xa1, 0x03, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02}, &TestContextSpecificTags2{1, 2}},
423 {[]byte{0x01, 0x01, 0x00}, newBool(false)},
424 {[]byte{0x01, 0x01, 0xff}, newBool(true)},
425 {[]byte{0x30, 0x0b, 0x13, 0x03, 0x66, 0x6f, 0x6f, 0x02, 0x01, 0x22, 0x02, 0x01, 0x33}, &TestElementsAfterString{"foo", 0x22, 0x33}},
426 {[]byte{0x30, 0x05, 0x02, 0x03, 0x12, 0x34, 0x56}, &TestBigInt{big.NewInt(0x123456)}},
427 {[]byte{0x30, 0x0b, 0x31, 0x09, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02, 0x01, 0x03}, &TestSet{Ints: []int{1, 2, 3}}},
430 func TestUnmarshal(t *testing.T) {
431 for i, test := range unmarshalTestData {
432 pv := reflect.New(reflect.TypeOf(test.out).Elem())
433 val := pv.Interface()
434 _, err := Unmarshal(test.in, val)
435 if err != nil {
436 t.Errorf("Unmarshal failed at index %d %v", i, err)
438 if !reflect.DeepEqual(val, test.out) {
439 t.Errorf("#%d:\nhave %#v\nwant %#v", i, val, test.out)
444 type Certificate struct {
445 TBSCertificate TBSCertificate
446 SignatureAlgorithm AlgorithmIdentifier
447 SignatureValue BitString
450 type TBSCertificate struct {
451 Version int `asn1:"optional,explicit,default:0,tag:0"`
452 SerialNumber RawValue
453 SignatureAlgorithm AlgorithmIdentifier
454 Issuer RDNSequence
455 Validity Validity
456 Subject RDNSequence
457 PublicKey PublicKeyInfo
460 type AlgorithmIdentifier struct {
461 Algorithm ObjectIdentifier
464 type RDNSequence []RelativeDistinguishedNameSET
466 type RelativeDistinguishedNameSET []AttributeTypeAndValue
468 type AttributeTypeAndValue struct {
469 Type ObjectIdentifier
470 Value interface{}
473 type Validity struct {
474 NotBefore, NotAfter time.Time
477 type PublicKeyInfo struct {
478 Algorithm AlgorithmIdentifier
479 PublicKey BitString
482 func TestCertificate(t *testing.T) {
483 // This is a minimal, self-signed certificate that should parse correctly.
484 var cert Certificate
485 if _, err := Unmarshal(derEncodedSelfSignedCertBytes, &cert); err != nil {
486 t.Errorf("Unmarshal failed: %v", err)
488 if !reflect.DeepEqual(cert, derEncodedSelfSignedCert) {
489 t.Errorf("Bad result:\ngot: %+v\nwant: %+v", cert, derEncodedSelfSignedCert)
493 func TestCertificateWithNUL(t *testing.T) {
494 // This is the paypal NUL-hack certificate. It should fail to parse because
495 // NUL isn't a permitted character in a PrintableString.
497 var cert Certificate
498 if _, err := Unmarshal(derEncodedPaypalNULCertBytes, &cert); err == nil {
499 t.Error("Unmarshal succeeded, should not have")
503 type rawStructTest struct {
504 Raw RawContent
505 A int
508 func TestRawStructs(t *testing.T) {
509 var s rawStructTest
510 input := []byte{0x30, 0x03, 0x02, 0x01, 0x50}
512 rest, err := Unmarshal(input, &s)
513 if len(rest) != 0 {
514 t.Errorf("incomplete parse: %x", rest)
515 return
517 if err != nil {
518 t.Error(err)
519 return
521 if s.A != 0x50 {
522 t.Errorf("bad value for A: got %d want %d", s.A, 0x50)
524 if !bytes.Equal([]byte(s.Raw), input) {
525 t.Errorf("bad value for Raw: got %x want %x", s.Raw, input)
529 type oiEqualTest struct {
530 first ObjectIdentifier
531 second ObjectIdentifier
532 same bool
535 var oiEqualTests = []oiEqualTest{
537 ObjectIdentifier{1, 2, 3},
538 ObjectIdentifier{1, 2, 3},
539 true,
542 ObjectIdentifier{1},
543 ObjectIdentifier{1, 2, 3},
544 false,
547 ObjectIdentifier{1, 2, 3},
548 ObjectIdentifier{10, 11, 12},
549 false,
553 func TestObjectIdentifierEqual(t *testing.T) {
554 for _, o := range oiEqualTests {
555 if s := o.first.Equal(o.second); s != o.same {
556 t.Errorf("ObjectIdentifier.Equal: got: %t want: %t", s, o.same)
561 var derEncodedSelfSignedCert = Certificate{
562 TBSCertificate: TBSCertificate{
563 Version: 0,
564 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}},
565 SignatureAlgorithm: AlgorithmIdentifier{Algorithm: ObjectIdentifier{1, 2, 840, 113549, 1, 1, 5}},
566 Issuer: RDNSequence{
567 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 6}, Value: "XX"}},
568 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 8}, Value: "Some-State"}},
569 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 7}, Value: "City"}},
570 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 10}, Value: "Internet Widgits Pty Ltd"}},
571 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 3}, Value: "false.example.com"}},
572 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{1, 2, 840, 113549, 1, 9, 1}, Value: "false@example.com"}},
574 Validity: Validity{
575 NotBefore: time.Date(2009, 10, 8, 00, 25, 53, 0, time.UTC),
576 NotAfter: time.Date(2010, 10, 8, 00, 25, 53, 0, time.UTC),
578 Subject: RDNSequence{
579 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 6}, Value: "XX"}},
580 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 8}, Value: "Some-State"}},
581 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 7}, Value: "City"}},
582 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 10}, Value: "Internet Widgits Pty Ltd"}},
583 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 3}, Value: "false.example.com"}},
584 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{1, 2, 840, 113549, 1, 9, 1}, Value: "false@example.com"}},
586 PublicKey: PublicKeyInfo{
587 Algorithm: AlgorithmIdentifier{Algorithm: ObjectIdentifier{1, 2, 840, 113549, 1, 1, 1}},
588 PublicKey: BitString{
589 Bytes: []uint8{
590 0x30, 0x48, 0x2, 0x41, 0x0, 0xcd, 0xb7,
591 0x63, 0x9c, 0x32, 0x78, 0xf0, 0x6, 0xaa, 0x27, 0x7f, 0x6e, 0xaf, 0x42,
592 0x90, 0x2b, 0x59, 0x2d, 0x8c, 0xbc, 0xbe, 0x38, 0xa1, 0xc9, 0x2b, 0xa4,
593 0x69, 0x5a, 0x33, 0x1b, 0x1d, 0xea, 0xde, 0xad, 0xd8, 0xe9, 0xa5, 0xc2,
594 0x7e, 0x8c, 0x4c, 0x2f, 0xd0, 0xa8, 0x88, 0x96, 0x57, 0x72, 0x2a, 0x4f,
595 0x2a, 0xf7, 0x58, 0x9c, 0xf2, 0xc7, 0x70, 0x45, 0xdc, 0x8f, 0xde, 0xec,
596 0x35, 0x7d, 0x2, 0x3, 0x1, 0x0, 0x1,
598 BitLength: 592,
602 SignatureAlgorithm: AlgorithmIdentifier{Algorithm: ObjectIdentifier{1, 2, 840, 113549, 1, 1, 5}},
603 SignatureValue: BitString{
604 Bytes: []uint8{
605 0xa6, 0x7b, 0x6, 0xec, 0x5e, 0xce,
606 0x92, 0x77, 0x2c, 0xa4, 0x13, 0xcb, 0xa3, 0xca, 0x12, 0x56, 0x8f, 0xdc, 0x6c,
607 0x7b, 0x45, 0x11, 0xcd, 0x40, 0xa7, 0xf6, 0x59, 0x98, 0x4, 0x2, 0xdf, 0x2b,
608 0x99, 0x8b, 0xb9, 0xa4, 0xa8, 0xcb, 0xeb, 0x34, 0xc0, 0xf0, 0xa7, 0x8c, 0xf8,
609 0xd9, 0x1e, 0xde, 0x14, 0xa5, 0xed, 0x76, 0xbf, 0x11, 0x6f, 0xe3, 0x60, 0xaa,
610 0xfa, 0x88, 0x21, 0x49, 0x4, 0x35,
612 BitLength: 512,
616 var derEncodedSelfSignedCertBytes = []byte{
617 0x30, 0x82, 0x02, 0x18, 0x30,
618 0x82, 0x01, 0xc2, 0x02, 0x09, 0x00, 0x8c, 0xc3, 0x37, 0x92, 0x10, 0xec, 0x2c,
619 0x98, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
620 0x05, 0x05, 0x00, 0x30, 0x81, 0x92, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
621 0x04, 0x06, 0x13, 0x02, 0x58, 0x58, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55,
622 0x04, 0x08, 0x13, 0x0a, 0x53, 0x6f, 0x6d, 0x65, 0x2d, 0x53, 0x74, 0x61, 0x74,
623 0x65, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x04, 0x43,
624 0x69, 0x74, 0x79, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,
625 0x18, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x57, 0x69, 0x64,
626 0x67, 0x69, 0x74, 0x73, 0x20, 0x50, 0x74, 0x79, 0x20, 0x4c, 0x74, 0x64, 0x31,
627 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x11, 0x66, 0x61, 0x6c,
628 0x73, 0x65, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f,
629 0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
630 0x01, 0x09, 0x01, 0x16, 0x11, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x40, 0x65, 0x78,
631 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, 0x0d,
632 0x30, 0x39, 0x31, 0x30, 0x30, 0x38, 0x30, 0x30, 0x32, 0x35, 0x35, 0x33, 0x5a,
633 0x17, 0x0d, 0x31, 0x30, 0x31, 0x30, 0x30, 0x38, 0x30, 0x30, 0x32, 0x35, 0x35,
634 0x33, 0x5a, 0x30, 0x81, 0x92, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,
635 0x06, 0x13, 0x02, 0x58, 0x58, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04,
636 0x08, 0x13, 0x0a, 0x53, 0x6f, 0x6d, 0x65, 0x2d, 0x53, 0x74, 0x61, 0x74, 0x65,
637 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x04, 0x43, 0x69,
638 0x74, 0x79, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18,
639 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x57, 0x69, 0x64, 0x67,
640 0x69, 0x74, 0x73, 0x20, 0x50, 0x74, 0x79, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x1a,
641 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x11, 0x66, 0x61, 0x6c, 0x73,
642 0x65, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d,
643 0x31, 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
644 0x09, 0x01, 0x16, 0x11, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x40, 0x65, 0x78, 0x61,
645 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x5c, 0x30, 0x0d, 0x06,
646 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,
647 0x4b, 0x00, 0x30, 0x48, 0x02, 0x41, 0x00, 0xcd, 0xb7, 0x63, 0x9c, 0x32, 0x78,
648 0xf0, 0x06, 0xaa, 0x27, 0x7f, 0x6e, 0xaf, 0x42, 0x90, 0x2b, 0x59, 0x2d, 0x8c,
649 0xbc, 0xbe, 0x38, 0xa1, 0xc9, 0x2b, 0xa4, 0x69, 0x5a, 0x33, 0x1b, 0x1d, 0xea,
650 0xde, 0xad, 0xd8, 0xe9, 0xa5, 0xc2, 0x7e, 0x8c, 0x4c, 0x2f, 0xd0, 0xa8, 0x88,
651 0x96, 0x57, 0x72, 0x2a, 0x4f, 0x2a, 0xf7, 0x58, 0x9c, 0xf2, 0xc7, 0x70, 0x45,
652 0xdc, 0x8f, 0xde, 0xec, 0x35, 0x7d, 0x02, 0x03, 0x01, 0x00, 0x01, 0x30, 0x0d,
653 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00,
654 0x03, 0x41, 0x00, 0xa6, 0x7b, 0x06, 0xec, 0x5e, 0xce, 0x92, 0x77, 0x2c, 0xa4,
655 0x13, 0xcb, 0xa3, 0xca, 0x12, 0x56, 0x8f, 0xdc, 0x6c, 0x7b, 0x45, 0x11, 0xcd,
656 0x40, 0xa7, 0xf6, 0x59, 0x98, 0x04, 0x02, 0xdf, 0x2b, 0x99, 0x8b, 0xb9, 0xa4,
657 0xa8, 0xcb, 0xeb, 0x34, 0xc0, 0xf0, 0xa7, 0x8c, 0xf8, 0xd9, 0x1e, 0xde, 0x14,
658 0xa5, 0xed, 0x76, 0xbf, 0x11, 0x6f, 0xe3, 0x60, 0xaa, 0xfa, 0x88, 0x21, 0x49,
659 0x04, 0x35,
662 var derEncodedPaypalNULCertBytes = []byte{
663 0x30, 0x82, 0x06, 0x44, 0x30,
664 0x82, 0x05, 0xad, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x00, 0xf0, 0x9b,
665 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,
666 0x05, 0x00, 0x30, 0x82, 0x01, 0x12, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
667 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55,
668 0x04, 0x08, 0x13, 0x09, 0x42, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x6f, 0x6e, 0x61,
669 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x09, 0x42, 0x61,
670 0x72, 0x63, 0x65, 0x6c, 0x6f, 0x6e, 0x61, 0x31, 0x29, 0x30, 0x27, 0x06, 0x03,
671 0x55, 0x04, 0x0a, 0x13, 0x20, 0x49, 0x50, 0x53, 0x20, 0x43, 0x65, 0x72, 0x74,
672 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74,
673 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x73, 0x2e, 0x6c, 0x2e, 0x31, 0x2e,
674 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x14, 0x25, 0x67, 0x65, 0x6e, 0x65,
675 0x72, 0x61, 0x6c, 0x40, 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d,
676 0x20, 0x43, 0x2e, 0x49, 0x2e, 0x46, 0x2e, 0x20, 0x20, 0x42, 0x2d, 0x42, 0x36,
677 0x32, 0x32, 0x31, 0x30, 0x36, 0x39, 0x35, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03,
678 0x55, 0x04, 0x0b, 0x13, 0x25, 0x69, 0x70, 0x73, 0x43, 0x41, 0x20, 0x43, 0x4c,
679 0x41, 0x53, 0x45, 0x41, 0x31, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
680 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72,
681 0x69, 0x74, 0x79, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
682 0x25, 0x69, 0x70, 0x73, 0x43, 0x41, 0x20, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41,
683 0x31, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,
684 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31,
685 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09,
686 0x01, 0x16, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x40, 0x69, 0x70,
687 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39,
688 0x30, 0x32, 0x32, 0x34, 0x32, 0x33, 0x30, 0x34, 0x31, 0x37, 0x5a, 0x17, 0x0d,
689 0x31, 0x31, 0x30, 0x32, 0x32, 0x34, 0x32, 0x33, 0x30, 0x34, 0x31, 0x37, 0x5a,
690 0x30, 0x81, 0x94, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
691 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13,
692 0x0a, 0x43, 0x61, 0x6c, 0x69, 0x66, 0x6f, 0x72, 0x6e, 0x69, 0x61, 0x31, 0x16,
693 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0d, 0x53, 0x61, 0x6e, 0x20,
694 0x46, 0x72, 0x61, 0x6e, 0x63, 0x69, 0x73, 0x63, 0x6f, 0x31, 0x11, 0x30, 0x0f,
695 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69,
696 0x74, 0x79, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0b,
697 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x55, 0x6e, 0x69, 0x74, 0x31, 0x2f,
698 0x30, 0x2d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x26, 0x77, 0x77, 0x77, 0x2e,
699 0x70, 0x61, 0x79, 0x70, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x00, 0x73, 0x73,
700 0x6c, 0x2e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65,
701 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x63, 0x63, 0x30, 0x81, 0x9f, 0x30, 0x0d,
702 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00,
703 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xd2, 0x69,
704 0xfa, 0x6f, 0x3a, 0x00, 0xb4, 0x21, 0x1b, 0xc8, 0xb1, 0x02, 0xd7, 0x3f, 0x19,
705 0xb2, 0xc4, 0x6d, 0xb4, 0x54, 0xf8, 0x8b, 0x8a, 0xcc, 0xdb, 0x72, 0xc2, 0x9e,
706 0x3c, 0x60, 0xb9, 0xc6, 0x91, 0x3d, 0x82, 0xb7, 0x7d, 0x99, 0xff, 0xd1, 0x29,
707 0x84, 0xc1, 0x73, 0x53, 0x9c, 0x82, 0xdd, 0xfc, 0x24, 0x8c, 0x77, 0xd5, 0x41,
708 0xf3, 0xe8, 0x1e, 0x42, 0xa1, 0xad, 0x2d, 0x9e, 0xff, 0x5b, 0x10, 0x26, 0xce,
709 0x9d, 0x57, 0x17, 0x73, 0x16, 0x23, 0x38, 0xc8, 0xd6, 0xf1, 0xba, 0xa3, 0x96,
710 0x5b, 0x16, 0x67, 0x4a, 0x4f, 0x73, 0x97, 0x3a, 0x4d, 0x14, 0xa4, 0xf4, 0xe2,
711 0x3f, 0x8b, 0x05, 0x83, 0x42, 0xd1, 0xd0, 0xdc, 0x2f, 0x7a, 0xe5, 0xb6, 0x10,
712 0xb2, 0x11, 0xc0, 0xdc, 0x21, 0x2a, 0x90, 0xff, 0xae, 0x97, 0x71, 0x5a, 0x49,
713 0x81, 0xac, 0x40, 0xf3, 0x3b, 0xb8, 0x59, 0xb2, 0x4f, 0x02, 0x03, 0x01, 0x00,
714 0x01, 0xa3, 0x82, 0x03, 0x21, 0x30, 0x82, 0x03, 0x1d, 0x30, 0x09, 0x06, 0x03,
715 0x55, 0x1d, 0x13, 0x04, 0x02, 0x30, 0x00, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86,
716 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x06, 0x40,
717 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x03, 0xf8,
718 0x30, 0x13, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x0c, 0x30, 0x0a, 0x06, 0x08,
719 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x30, 0x1d, 0x06, 0x03, 0x55,
720 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x61, 0x8f, 0x61, 0x34, 0x43, 0x55, 0x14,
721 0x7f, 0x27, 0x09, 0xce, 0x4c, 0x8b, 0xea, 0x9b, 0x7b, 0x19, 0x25, 0xbc, 0x6e,
722 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14,
723 0x0e, 0x07, 0x60, 0xd4, 0x39, 0xc9, 0x1b, 0x5b, 0x5d, 0x90, 0x7b, 0x23, 0xc8,
724 0xd2, 0x34, 0x9d, 0x4a, 0x9a, 0x46, 0x39, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d,
725 0x11, 0x04, 0x02, 0x30, 0x00, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x1d, 0x12, 0x04,
726 0x15, 0x30, 0x13, 0x81, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x40,
727 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x72, 0x06, 0x09,
728 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x0d, 0x04, 0x65, 0x16, 0x63,
729 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
730 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e,
731 0x4f, 0x54, 0x20, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x45, 0x44, 0x2e,
732 0x20, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 0x31, 0x20, 0x53, 0x65, 0x72, 0x76,
733 0x65, 0x72, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
734 0x65, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x68,
735 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70,
736 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x30, 0x2f, 0x06, 0x09, 0x60,
737 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x02, 0x04, 0x22, 0x16, 0x20, 0x68,
738 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70,
739 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61,
740 0x32, 0x30, 0x30, 0x32, 0x2f, 0x30, 0x43, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01,
741 0x86, 0xf8, 0x42, 0x01, 0x04, 0x04, 0x36, 0x16, 0x34, 0x68, 0x74, 0x74, 0x70,
742 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70, 0x73, 0x63, 0x61,
743 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 0x30, 0x30,
744 0x32, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 0x30, 0x30, 0x32, 0x43, 0x4c,
745 0x41, 0x53, 0x45, 0x41, 0x31, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x46, 0x06, 0x09,
746 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x03, 0x04, 0x39, 0x16, 0x37,
747 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69,
748 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63,
749 0x61, 0x32, 0x30, 0x30, 0x32, 0x2f, 0x72, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74,
750 0x69, 0x6f, 0x6e, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 0x31, 0x2e, 0x68, 0x74,
751 0x6d, 0x6c, 0x3f, 0x30, 0x43, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8,
752 0x42, 0x01, 0x07, 0x04, 0x36, 0x16, 0x34, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a,
753 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63,
754 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 0x30, 0x30, 0x32, 0x2f,
755 0x72, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41,
756 0x31, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3f, 0x30, 0x41, 0x06, 0x09, 0x60, 0x86,
757 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x08, 0x04, 0x34, 0x16, 0x32, 0x68, 0x74,
758 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70, 0x73,
759 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32,
760 0x30, 0x30, 0x32, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x4c, 0x41,
761 0x53, 0x45, 0x41, 0x31, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x30, 0x81, 0x83, 0x06,
762 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x7c, 0x30, 0x7a, 0x30, 0x39, 0xa0, 0x37, 0xa0,
763 0x35, 0x86, 0x33, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
764 0x2e, 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70,
765 0x73, 0x63, 0x61, 0x32, 0x30, 0x30, 0x32, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61,
766 0x32, 0x30, 0x30, 0x32, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 0x31, 0x2e, 0x63,
767 0x72, 0x6c, 0x30, 0x3d, 0xa0, 0x3b, 0xa0, 0x39, 0x86, 0x37, 0x68, 0x74, 0x74,
768 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x62, 0x61, 0x63, 0x6b, 0x2e, 0x69,
769 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63,
770 0x61, 0x32, 0x30, 0x30, 0x32, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 0x30,
771 0x30, 0x32, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 0x31, 0x2e, 0x63, 0x72, 0x6c,
772 0x30, 0x32, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04,
773 0x26, 0x30, 0x24, 0x30, 0x22, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07,
774 0x30, 0x01, 0x86, 0x16, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63,
775 0x73, 0x70, 0x2e, 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
776 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,
777 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x68, 0xee, 0x79, 0x97, 0x97, 0xdd, 0x3b,
778 0xef, 0x16, 0x6a, 0x06, 0xf2, 0x14, 0x9a, 0x6e, 0xcd, 0x9e, 0x12, 0xf7, 0xaa,
779 0x83, 0x10, 0xbd, 0xd1, 0x7c, 0x98, 0xfa, 0xc7, 0xae, 0xd4, 0x0e, 0x2c, 0x9e,
780 0x38, 0x05, 0x9d, 0x52, 0x60, 0xa9, 0x99, 0x0a, 0x81, 0xb4, 0x98, 0x90, 0x1d,
781 0xae, 0xbb, 0x4a, 0xd7, 0xb9, 0xdc, 0x88, 0x9e, 0x37, 0x78, 0x41, 0x5b, 0xf7,
782 0x82, 0xa5, 0xf2, 0xba, 0x41, 0x25, 0x5a, 0x90, 0x1a, 0x1e, 0x45, 0x38, 0xa1,
783 0x52, 0x58, 0x75, 0x94, 0x26, 0x44, 0xfb, 0x20, 0x07, 0xba, 0x44, 0xcc, 0xe5,
784 0x4a, 0x2d, 0x72, 0x3f, 0x98, 0x47, 0xf6, 0x26, 0xdc, 0x05, 0x46, 0x05, 0x07,
785 0x63, 0x21, 0xab, 0x46, 0x9b, 0x9c, 0x78, 0xd5, 0x54, 0x5b, 0x3d, 0x0c, 0x1e,
786 0xc8, 0x64, 0x8c, 0xb5, 0x50, 0x23, 0x82, 0x6f, 0xdb, 0xb8, 0x22, 0x1c, 0x43,
787 0x96, 0x07, 0xa8, 0xbb,
790 var stringSliceTestData = [][]string{
791 {"foo", "bar"},
792 {"foo", "\\bar"},
793 {"foo", "\"bar\""},
794 {"foo", "åäö"},
797 func TestStringSlice(t *testing.T) {
798 for _, test := range stringSliceTestData {
799 bs, err := Marshal(test)
800 if err != nil {
801 t.Error(err)
804 var res []string
805 _, err = Unmarshal(bs, &res)
806 if err != nil {
807 t.Error(err)
810 if fmt.Sprintf("%v", res) != fmt.Sprintf("%v", test) {
811 t.Errorf("incorrect marshal/unmarshal; %v != %v", res, test)