github.com/sbinet/go@v0.0.0-20160827155028-54d7de7dd62b/src/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 "fmt" 10 "math/big" 11 "reflect" 12 "strings" 13 "testing" 14 "time" 15 ) 16 17 type boolTest struct { 18 in []byte 19 ok bool 20 out bool 21 } 22 23 var boolTestData = []boolTest{ 24 {[]byte{0x00}, true, false}, 25 {[]byte{0xff}, true, true}, 26 {[]byte{0x00, 0x00}, false, false}, 27 {[]byte{0xff, 0xff}, false, false}, 28 {[]byte{0x01}, false, false}, 29 } 30 31 func TestParseBool(t *testing.T) { 32 for i, test := range boolTestData { 33 ret, err := parseBool(test.in) 34 if (err == nil) != test.ok { 35 t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok) 36 } 37 if test.ok && ret != test.out { 38 t.Errorf("#%d: Bad result: %v (expected %v)", i, ret, test.out) 39 } 40 } 41 } 42 43 type int64Test struct { 44 in []byte 45 ok bool 46 out int64 47 } 48 49 var int64TestData = []int64Test{ 50 {[]byte{0x00}, true, 0}, 51 {[]byte{0x7f}, true, 127}, 52 {[]byte{0x00, 0x80}, true, 128}, 53 {[]byte{0x01, 0x00}, true, 256}, 54 {[]byte{0x80}, true, -128}, 55 {[]byte{0xff, 0x7f}, true, -129}, 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}, 59 {[]byte{}, false, 0}, 60 {[]byte{0x00, 0x7f}, false, 0}, 61 {[]byte{0xff, 0xf0}, false, 0}, 62 } 63 64 func TestParseInt64(t *testing.T) { 65 for i, test := range int64TestData { 66 ret, err := parseInt64(test.in) 67 if (err == nil) != test.ok { 68 t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok) 69 } 70 if test.ok && ret != test.out { 71 t.Errorf("#%d: Bad result: %v (expected %v)", i, ret, test.out) 72 } 73 } 74 } 75 76 type int32Test struct { 77 in []byte 78 ok bool 79 out int32 80 } 81 82 var int32TestData = []int32Test{ 83 {[]byte{0x00}, true, 0}, 84 {[]byte{0x7f}, true, 127}, 85 {[]byte{0x00, 0x80}, true, 128}, 86 {[]byte{0x01, 0x00}, true, 256}, 87 {[]byte{0x80}, true, -128}, 88 {[]byte{0xff, 0x7f}, true, -129}, 89 {[]byte{0xff}, true, -1}, 90 {[]byte{0x80, 0x00, 0x00, 0x00}, true, -2147483648}, 91 {[]byte{0x80, 0x00, 0x00, 0x00, 0x00}, false, 0}, 92 {[]byte{}, false, 0}, 93 {[]byte{0x00, 0x7f}, false, 0}, 94 {[]byte{0xff, 0xf0}, false, 0}, 95 } 96 97 func TestParseInt32(t *testing.T) { 98 for i, test := range int32TestData { 99 ret, err := parseInt32(test.in) 100 if (err == nil) != test.ok { 101 t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok) 102 } 103 if test.ok && int32(ret) != test.out { 104 t.Errorf("#%d: Bad result: %v (expected %v)", i, ret, test.out) 105 } 106 } 107 } 108 109 var bigIntTests = []struct { 110 in []byte 111 ok bool 112 base10 string 113 }{ 114 {[]byte{0xff}, true, "-1"}, 115 {[]byte{0x00}, true, "0"}, 116 {[]byte{0x01}, true, "1"}, 117 {[]byte{0x00, 0xff}, true, "255"}, 118 {[]byte{0xff, 0x00}, true, "-256"}, 119 {[]byte{0x01, 0x00}, true, "256"}, 120 {[]byte{}, false, ""}, 121 {[]byte{0x00, 0x7f}, false, ""}, 122 {[]byte{0xff, 0xf0}, false, ""}, 123 } 124 125 func TestParseBigInt(t *testing.T) { 126 for i, test := range bigIntTests { 127 ret, err := parseBigInt(test.in) 128 if (err == nil) != test.ok { 129 t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok) 130 } 131 if test.ok { 132 if ret.String() != test.base10 { 133 t.Errorf("#%d: bad result from %x, got %s want %s", i, test.in, ret.String(), test.base10) 134 } 135 fw := newForkableWriter() 136 marshalBigInt(fw, ret) 137 result := fw.Bytes() 138 if !bytes.Equal(result, test.in) { 139 t.Errorf("#%d: got %x from marshaling %s, want %x", i, result, ret, test.in) 140 } 141 } 142 } 143 } 144 145 type bitStringTest struct { 146 in []byte 147 ok bool 148 out []byte 149 bitLength int 150 } 151 152 var bitStringTestData = []bitStringTest{ 153 {[]byte{}, false, []byte{}, 0}, 154 {[]byte{0x00}, true, []byte{}, 0}, 155 {[]byte{0x07, 0x00}, true, []byte{0x00}, 1}, 156 {[]byte{0x07, 0x01}, false, []byte{}, 0}, 157 {[]byte{0x07, 0x40}, false, []byte{}, 0}, 158 {[]byte{0x08, 0x00}, false, []byte{}, 0}, 159 } 160 161 func TestBitString(t *testing.T) { 162 for i, test := range bitStringTestData { 163 ret, err := parseBitString(test.in) 164 if (err == nil) != test.ok { 165 t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok) 166 } 167 if err == nil { 168 if test.bitLength != ret.BitLength || !bytes.Equal(ret.Bytes, test.out) { 169 t.Errorf("#%d: Bad result: %v (expected %v %v)", i, ret, test.out, test.bitLength) 170 } 171 } 172 } 173 } 174 175 func TestBitStringAt(t *testing.T) { 176 bs := BitString{[]byte{0x82, 0x40}, 16} 177 if bs.At(0) != 1 { 178 t.Error("#1: Failed") 179 } 180 if bs.At(1) != 0 { 181 t.Error("#2: Failed") 182 } 183 if bs.At(6) != 1 { 184 t.Error("#3: Failed") 185 } 186 if bs.At(9) != 1 { 187 t.Error("#4: Failed") 188 } 189 if bs.At(-1) != 0 { 190 t.Error("#5: Failed") 191 } 192 if bs.At(17) != 0 { 193 t.Error("#6: Failed") 194 } 195 } 196 197 type bitStringRightAlignTest struct { 198 in []byte 199 inlen int 200 out []byte 201 } 202 203 var bitStringRightAlignTests = []bitStringRightAlignTest{ 204 {[]byte{0x80}, 1, []byte{0x01}}, 205 {[]byte{0x80, 0x80}, 9, []byte{0x01, 0x01}}, 206 {[]byte{}, 0, []byte{}}, 207 {[]byte{0xce}, 8, []byte{0xce}}, 208 {[]byte{0xce, 0x47}, 16, []byte{0xce, 0x47}}, 209 {[]byte{0x34, 0x50}, 12, []byte{0x03, 0x45}}, 210 } 211 212 func TestBitStringRightAlign(t *testing.T) { 213 for i, test := range bitStringRightAlignTests { 214 bs := BitString{test.in, test.inlen} 215 out := bs.RightAlign() 216 if !bytes.Equal(out, test.out) { 217 t.Errorf("#%d got: %x want: %x", i, out, test.out) 218 } 219 } 220 } 221 222 type objectIdentifierTest struct { 223 in []byte 224 ok bool 225 out []int 226 } 227 228 var objectIdentifierTestData = []objectIdentifierTest{ 229 {[]byte{}, false, []int{}}, 230 {[]byte{85}, true, []int{2, 5}}, 231 {[]byte{85, 0x02}, true, []int{2, 5, 2}}, 232 {[]byte{85, 0x02, 0xc0, 0x00}, true, []int{2, 5, 2, 0x2000}}, 233 {[]byte{0x81, 0x34, 0x03}, true, []int{2, 100, 3}}, 234 {[]byte{85, 0x02, 0xc0, 0x80, 0x80, 0x80, 0x80}, false, []int{}}, 235 } 236 237 func TestObjectIdentifier(t *testing.T) { 238 for i, test := range objectIdentifierTestData { 239 ret, err := parseObjectIdentifier(test.in) 240 if (err == nil) != test.ok { 241 t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok) 242 } 243 if err == nil { 244 if !reflect.DeepEqual(test.out, ret) { 245 t.Errorf("#%d: Bad result: %v (expected %v)", i, ret, test.out) 246 } 247 } 248 } 249 250 if s := ObjectIdentifier([]int{1, 2, 3, 4}).String(); s != "1.2.3.4" { 251 t.Errorf("bad ObjectIdentifier.String(). Got %s, want 1.2.3.4", s) 252 } 253 } 254 255 type timeTest struct { 256 in string 257 ok bool 258 out time.Time 259 } 260 261 var utcTestData = []timeTest{ 262 {"910506164540-0700", true, time.Date(1991, 05, 06, 16, 45, 40, 0, time.FixedZone("", -7*60*60))}, 263 {"910506164540+0730", true, time.Date(1991, 05, 06, 16, 45, 40, 0, time.FixedZone("", 7*60*60+30*60))}, 264 {"910506234540Z", true, time.Date(1991, 05, 06, 23, 45, 40, 0, time.UTC)}, 265 {"9105062345Z", true, time.Date(1991, 05, 06, 23, 45, 0, 0, time.UTC)}, 266 {"5105062345Z", true, time.Date(1951, 05, 06, 23, 45, 0, 0, time.UTC)}, 267 {"a10506234540Z", false, time.Time{}}, 268 {"91a506234540Z", false, time.Time{}}, 269 {"9105a6234540Z", false, time.Time{}}, 270 {"910506a34540Z", false, time.Time{}}, 271 {"910506334a40Z", false, time.Time{}}, 272 {"91050633444aZ", false, time.Time{}}, 273 {"910506334461Z", false, time.Time{}}, 274 {"910506334400Za", false, time.Time{}}, 275 /* These are invalid times. However, the time package normalises times 276 * and they were accepted in some versions. See #11134. */ 277 {"000100000000Z", false, time.Time{}}, 278 {"101302030405Z", false, time.Time{}}, 279 {"100002030405Z", false, time.Time{}}, 280 {"100100030405Z", false, time.Time{}}, 281 {"100132030405Z", false, time.Time{}}, 282 {"100231030405Z", false, time.Time{}}, 283 {"100102240405Z", false, time.Time{}}, 284 {"100102036005Z", false, time.Time{}}, 285 {"100102030460Z", false, time.Time{}}, 286 {"-100102030410Z", false, time.Time{}}, 287 {"10-0102030410Z", false, time.Time{}}, 288 {"10-0002030410Z", false, time.Time{}}, 289 {"1001-02030410Z", false, time.Time{}}, 290 {"100102-030410Z", false, time.Time{}}, 291 {"10010203-0410Z", false, time.Time{}}, 292 {"1001020304-10Z", false, time.Time{}}, 293 } 294 295 func TestUTCTime(t *testing.T) { 296 for i, test := range utcTestData { 297 ret, err := parseUTCTime([]byte(test.in)) 298 if err != nil { 299 if test.ok { 300 t.Errorf("#%d: parseUTCTime(%q) = error %v", i, test.in, err) 301 } 302 continue 303 } 304 if !test.ok { 305 t.Errorf("#%d: parseUTCTime(%q) succeeded, should have failed", i, test.in) 306 continue 307 } 308 const format = "Jan _2 15:04:05 -0700 2006" // ignore zone name, just offset 309 have := ret.Format(format) 310 want := test.out.Format(format) 311 if have != want { 312 t.Errorf("#%d: parseUTCTime(%q) = %s, want %s", i, test.in, have, want) 313 } 314 } 315 } 316 317 var generalizedTimeTestData = []timeTest{ 318 {"20100102030405Z", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.UTC)}, 319 {"20100102030405", false, time.Time{}}, 320 {"20100102030405+0607", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", 6*60*60+7*60))}, 321 {"20100102030405-0607", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", -6*60*60-7*60))}, 322 /* These are invalid times. However, the time package normalises times 323 * and they were accepted in some versions. See #11134. */ 324 {"00000100000000Z", false, time.Time{}}, 325 {"20101302030405Z", false, time.Time{}}, 326 {"20100002030405Z", false, time.Time{}}, 327 {"20100100030405Z", false, time.Time{}}, 328 {"20100132030405Z", false, time.Time{}}, 329 {"20100231030405Z", false, time.Time{}}, 330 {"20100102240405Z", false, time.Time{}}, 331 {"20100102036005Z", false, time.Time{}}, 332 {"20100102030460Z", false, time.Time{}}, 333 {"-20100102030410Z", false, time.Time{}}, 334 {"2010-0102030410Z", false, time.Time{}}, 335 {"2010-0002030410Z", false, time.Time{}}, 336 {"201001-02030410Z", false, time.Time{}}, 337 {"20100102-030410Z", false, time.Time{}}, 338 {"2010010203-0410Z", false, time.Time{}}, 339 {"201001020304-10Z", false, time.Time{}}, 340 } 341 342 func TestGeneralizedTime(t *testing.T) { 343 for i, test := range generalizedTimeTestData { 344 ret, err := parseGeneralizedTime([]byte(test.in)) 345 if (err == nil) != test.ok { 346 t.Errorf("#%d: Incorrect error result (did fail? %v, expected: %v)", i, err == nil, test.ok) 347 } 348 if err == nil { 349 if !reflect.DeepEqual(test.out, ret) { 350 t.Errorf("#%d: Bad result: %q → %v (expected %v)", i, test.in, ret, test.out) 351 } 352 } 353 } 354 } 355 356 type tagAndLengthTest struct { 357 in []byte 358 ok bool 359 out tagAndLength 360 } 361 362 var tagAndLengthData = []tagAndLengthTest{ 363 {[]byte{0x80, 0x01}, true, tagAndLength{2, 0, 1, false}}, 364 {[]byte{0xa0, 0x01}, true, tagAndLength{2, 0, 1, true}}, 365 {[]byte{0x02, 0x00}, true, tagAndLength{0, 2, 0, false}}, 366 {[]byte{0xfe, 0x00}, true, tagAndLength{3, 30, 0, true}}, 367 {[]byte{0x1f, 0x1f, 0x00}, true, tagAndLength{0, 31, 0, false}}, 368 {[]byte{0x1f, 0x81, 0x00, 0x00}, true, tagAndLength{0, 128, 0, false}}, 369 {[]byte{0x1f, 0x81, 0x80, 0x01, 0x00}, true, tagAndLength{0, 0x4001, 0, false}}, 370 {[]byte{0x00, 0x81, 0x80}, true, tagAndLength{0, 0, 128, false}}, 371 {[]byte{0x00, 0x82, 0x01, 0x00}, true, tagAndLength{0, 0, 256, false}}, 372 {[]byte{0x00, 0x83, 0x01, 0x00}, false, tagAndLength{}}, 373 {[]byte{0x1f, 0x85}, false, tagAndLength{}}, 374 {[]byte{0x30, 0x80}, false, tagAndLength{}}, 375 // Superfluous zeros in the length should be an error. 376 {[]byte{0xa0, 0x82, 0x00, 0xff}, false, tagAndLength{}}, 377 // Lengths up to the maximum size of an int should work. 378 {[]byte{0xa0, 0x84, 0x7f, 0xff, 0xff, 0xff}, true, tagAndLength{2, 0, 0x7fffffff, true}}, 379 // Lengths that would overflow an int should be rejected. 380 {[]byte{0xa0, 0x84, 0x80, 0x00, 0x00, 0x00}, false, tagAndLength{}}, 381 // Long length form may not be used for lengths that fit in short form. 382 {[]byte{0xa0, 0x81, 0x7f}, false, tagAndLength{}}, 383 // Tag numbers which would overflow int32 are rejected. (The value below is 2^31.) 384 {[]byte{0x1f, 0x88, 0x80, 0x80, 0x80, 0x00, 0x00}, false, tagAndLength{}}, 385 // Long tag number form may not be used for tags that fit in short form. 386 {[]byte{0x1f, 0x1e, 0x00}, false, tagAndLength{}}, 387 } 388 389 func TestParseTagAndLength(t *testing.T) { 390 for i, test := range tagAndLengthData { 391 tagAndLength, _, err := parseTagAndLength(test.in, 0) 392 if (err == nil) != test.ok { 393 t.Errorf("#%d: Incorrect error result (did pass? %v, expected: %v)", i, err == nil, test.ok) 394 } 395 if err == nil && !reflect.DeepEqual(test.out, tagAndLength) { 396 t.Errorf("#%d: Bad result: %v (expected %v)", i, tagAndLength, test.out) 397 } 398 } 399 } 400 401 type parseFieldParametersTest struct { 402 in string 403 out fieldParameters 404 } 405 406 func newInt(n int) *int { return &n } 407 408 func newInt64(n int64) *int64 { return &n } 409 410 func newString(s string) *string { return &s } 411 412 func newBool(b bool) *bool { return &b } 413 414 var parseFieldParametersTestData []parseFieldParametersTest = []parseFieldParametersTest{ 415 {"", fieldParameters{}}, 416 {"ia5", fieldParameters{stringType: TagIA5String}}, 417 {"generalized", fieldParameters{timeType: TagGeneralizedTime}}, 418 {"utc", fieldParameters{timeType: TagUTCTime}}, 419 {"printable", fieldParameters{stringType: TagPrintableString}}, 420 {"optional", fieldParameters{optional: true}}, 421 {"explicit", fieldParameters{explicit: true, tag: new(int)}}, 422 {"application", fieldParameters{application: true, tag: new(int)}}, 423 {"optional,explicit", fieldParameters{optional: true, explicit: true, tag: new(int)}}, 424 {"default:42", fieldParameters{defaultValue: newInt64(42)}}, 425 {"tag:17", fieldParameters{tag: newInt(17)}}, 426 {"optional,explicit,default:42,tag:17", fieldParameters{optional: true, explicit: true, defaultValue: newInt64(42), tag: newInt(17)}}, 427 {"optional,explicit,default:42,tag:17,rubbish1", fieldParameters{true, true, false, newInt64(42), newInt(17), 0, 0, false, false}}, 428 {"set", fieldParameters{set: true}}, 429 } 430 431 func TestParseFieldParameters(t *testing.T) { 432 for i, test := range parseFieldParametersTestData { 433 f := parseFieldParameters(test.in) 434 if !reflect.DeepEqual(f, test.out) { 435 t.Errorf("#%d: Bad result: %v (expected %v)", i, f, test.out) 436 } 437 } 438 } 439 440 type TestObjectIdentifierStruct struct { 441 OID ObjectIdentifier 442 } 443 444 type TestContextSpecificTags struct { 445 A int `asn1:"tag:1"` 446 } 447 448 type TestContextSpecificTags2 struct { 449 A int `asn1:"explicit,tag:1"` 450 B int 451 } 452 453 type TestContextSpecificTags3 struct { 454 S string `asn1:"tag:1,utf8"` 455 } 456 457 type TestElementsAfterString struct { 458 S string 459 A, B int 460 } 461 462 type TestBigInt struct { 463 X *big.Int 464 } 465 466 type TestSet struct { 467 Ints []int `asn1:"set"` 468 } 469 470 var unmarshalTestData = []struct { 471 in []byte 472 out interface{} 473 }{ 474 {[]byte{0x02, 0x01, 0x42}, newInt(0x42)}, 475 {[]byte{0x30, 0x08, 0x06, 0x06, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d}, &TestObjectIdentifierStruct{[]int{1, 2, 840, 113549}}}, 476 {[]byte{0x03, 0x04, 0x06, 0x6e, 0x5d, 0xc0}, &BitString{[]byte{110, 93, 192}, 18}}, 477 {[]byte{0x30, 0x09, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02, 0x01, 0x03}, &[]int{1, 2, 3}}, 478 {[]byte{0x02, 0x01, 0x10}, newInt(16)}, 479 {[]byte{0x13, 0x04, 't', 'e', 's', 't'}, newString("test")}, 480 {[]byte{0x16, 0x04, 't', 'e', 's', 't'}, newString("test")}, 481 {[]byte{0x16, 0x04, 't', 'e', 's', 't'}, &RawValue{0, 22, false, []byte("test"), []byte("\x16\x04test")}}, 482 {[]byte{0x04, 0x04, 1, 2, 3, 4}, &RawValue{0, 4, false, []byte{1, 2, 3, 4}, []byte{4, 4, 1, 2, 3, 4}}}, 483 {[]byte{0x30, 0x03, 0x81, 0x01, 0x01}, &TestContextSpecificTags{1}}, 484 {[]byte{0x30, 0x08, 0xa1, 0x03, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02}, &TestContextSpecificTags2{1, 2}}, 485 {[]byte{0x30, 0x03, 0x81, 0x01, '@'}, &TestContextSpecificTags3{"@"}}, 486 {[]byte{0x01, 0x01, 0x00}, newBool(false)}, 487 {[]byte{0x01, 0x01, 0xff}, newBool(true)}, 488 {[]byte{0x30, 0x0b, 0x13, 0x03, 0x66, 0x6f, 0x6f, 0x02, 0x01, 0x22, 0x02, 0x01, 0x33}, &TestElementsAfterString{"foo", 0x22, 0x33}}, 489 {[]byte{0x30, 0x05, 0x02, 0x03, 0x12, 0x34, 0x56}, &TestBigInt{big.NewInt(0x123456)}}, 490 {[]byte{0x30, 0x0b, 0x31, 0x09, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02, 0x01, 0x03}, &TestSet{Ints: []int{1, 2, 3}}}, 491 } 492 493 func TestUnmarshal(t *testing.T) { 494 for i, test := range unmarshalTestData { 495 pv := reflect.New(reflect.TypeOf(test.out).Elem()) 496 val := pv.Interface() 497 _, err := Unmarshal(test.in, val) 498 if err != nil { 499 t.Errorf("Unmarshal failed at index %d %v", i, err) 500 } 501 if !reflect.DeepEqual(val, test.out) { 502 t.Errorf("#%d:\nhave %#v\nwant %#v", i, val, test.out) 503 } 504 } 505 } 506 507 type Certificate struct { 508 TBSCertificate TBSCertificate 509 SignatureAlgorithm AlgorithmIdentifier 510 SignatureValue BitString 511 } 512 513 type TBSCertificate struct { 514 Version int `asn1:"optional,explicit,default:0,tag:0"` 515 SerialNumber RawValue 516 SignatureAlgorithm AlgorithmIdentifier 517 Issuer RDNSequence 518 Validity Validity 519 Subject RDNSequence 520 PublicKey PublicKeyInfo 521 } 522 523 type AlgorithmIdentifier struct { 524 Algorithm ObjectIdentifier 525 } 526 527 type RDNSequence []RelativeDistinguishedNameSET 528 529 type RelativeDistinguishedNameSET []AttributeTypeAndValue 530 531 type AttributeTypeAndValue struct { 532 Type ObjectIdentifier 533 Value interface{} 534 } 535 536 type Validity struct { 537 NotBefore, NotAfter time.Time 538 } 539 540 type PublicKeyInfo struct { 541 Algorithm AlgorithmIdentifier 542 PublicKey BitString 543 } 544 545 func TestCertificate(t *testing.T) { 546 // This is a minimal, self-signed certificate that should parse correctly. 547 var cert Certificate 548 if _, err := Unmarshal(derEncodedSelfSignedCertBytes, &cert); err != nil { 549 t.Errorf("Unmarshal failed: %v", err) 550 } 551 if !reflect.DeepEqual(cert, derEncodedSelfSignedCert) { 552 t.Errorf("Bad result:\ngot: %+v\nwant: %+v", cert, derEncodedSelfSignedCert) 553 } 554 } 555 556 func TestCertificateWithNUL(t *testing.T) { 557 // This is the paypal NUL-hack certificate. It should fail to parse because 558 // NUL isn't a permitted character in a PrintableString. 559 560 var cert Certificate 561 if _, err := Unmarshal(derEncodedPaypalNULCertBytes, &cert); err == nil { 562 t.Error("Unmarshal succeeded, should not have") 563 } 564 } 565 566 type rawStructTest struct { 567 Raw RawContent 568 A int 569 } 570 571 func TestRawStructs(t *testing.T) { 572 var s rawStructTest 573 input := []byte{0x30, 0x03, 0x02, 0x01, 0x50} 574 575 rest, err := Unmarshal(input, &s) 576 if len(rest) != 0 { 577 t.Errorf("incomplete parse: %x", rest) 578 return 579 } 580 if err != nil { 581 t.Error(err) 582 return 583 } 584 if s.A != 0x50 { 585 t.Errorf("bad value for A: got %d want %d", s.A, 0x50) 586 } 587 if !bytes.Equal([]byte(s.Raw), input) { 588 t.Errorf("bad value for Raw: got %x want %x", s.Raw, input) 589 } 590 } 591 592 type oiEqualTest struct { 593 first ObjectIdentifier 594 second ObjectIdentifier 595 same bool 596 } 597 598 var oiEqualTests = []oiEqualTest{ 599 { 600 ObjectIdentifier{1, 2, 3}, 601 ObjectIdentifier{1, 2, 3}, 602 true, 603 }, 604 { 605 ObjectIdentifier{1}, 606 ObjectIdentifier{1, 2, 3}, 607 false, 608 }, 609 { 610 ObjectIdentifier{1, 2, 3}, 611 ObjectIdentifier{10, 11, 12}, 612 false, 613 }, 614 } 615 616 func TestObjectIdentifierEqual(t *testing.T) { 617 for _, o := range oiEqualTests { 618 if s := o.first.Equal(o.second); s != o.same { 619 t.Errorf("ObjectIdentifier.Equal: got: %t want: %t", s, o.same) 620 } 621 } 622 } 623 624 var derEncodedSelfSignedCert = Certificate{ 625 TBSCertificate: TBSCertificate{ 626 Version: 0, 627 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}}, 628 SignatureAlgorithm: AlgorithmIdentifier{Algorithm: ObjectIdentifier{1, 2, 840, 113549, 1, 1, 5}}, 629 Issuer: RDNSequence{ 630 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 6}, Value: "XX"}}, 631 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 8}, Value: "Some-State"}}, 632 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 7}, Value: "City"}}, 633 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 10}, Value: "Internet Widgits Pty Ltd"}}, 634 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 3}, Value: "false.example.com"}}, 635 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{1, 2, 840, 113549, 1, 9, 1}, Value: "false@example.com"}}, 636 }, 637 Validity: Validity{ 638 NotBefore: time.Date(2009, 10, 8, 00, 25, 53, 0, time.UTC), 639 NotAfter: time.Date(2010, 10, 8, 00, 25, 53, 0, time.UTC), 640 }, 641 Subject: RDNSequence{ 642 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 6}, Value: "XX"}}, 643 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 8}, Value: "Some-State"}}, 644 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 7}, Value: "City"}}, 645 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 10}, Value: "Internet Widgits Pty Ltd"}}, 646 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 3}, Value: "false.example.com"}}, 647 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{1, 2, 840, 113549, 1, 9, 1}, Value: "false@example.com"}}, 648 }, 649 PublicKey: PublicKeyInfo{ 650 Algorithm: AlgorithmIdentifier{Algorithm: ObjectIdentifier{1, 2, 840, 113549, 1, 1, 1}}, 651 PublicKey: BitString{ 652 Bytes: []uint8{ 653 0x30, 0x48, 0x2, 0x41, 0x0, 0xcd, 0xb7, 654 0x63, 0x9c, 0x32, 0x78, 0xf0, 0x6, 0xaa, 0x27, 0x7f, 0x6e, 0xaf, 0x42, 655 0x90, 0x2b, 0x59, 0x2d, 0x8c, 0xbc, 0xbe, 0x38, 0xa1, 0xc9, 0x2b, 0xa4, 656 0x69, 0x5a, 0x33, 0x1b, 0x1d, 0xea, 0xde, 0xad, 0xd8, 0xe9, 0xa5, 0xc2, 657 0x7e, 0x8c, 0x4c, 0x2f, 0xd0, 0xa8, 0x88, 0x96, 0x57, 0x72, 0x2a, 0x4f, 658 0x2a, 0xf7, 0x58, 0x9c, 0xf2, 0xc7, 0x70, 0x45, 0xdc, 0x8f, 0xde, 0xec, 659 0x35, 0x7d, 0x2, 0x3, 0x1, 0x0, 0x1, 660 }, 661 BitLength: 592, 662 }, 663 }, 664 }, 665 SignatureAlgorithm: AlgorithmIdentifier{Algorithm: ObjectIdentifier{1, 2, 840, 113549, 1, 1, 5}}, 666 SignatureValue: BitString{ 667 Bytes: []uint8{ 668 0xa6, 0x7b, 0x6, 0xec, 0x5e, 0xce, 669 0x92, 0x77, 0x2c, 0xa4, 0x13, 0xcb, 0xa3, 0xca, 0x12, 0x56, 0x8f, 0xdc, 0x6c, 670 0x7b, 0x45, 0x11, 0xcd, 0x40, 0xa7, 0xf6, 0x59, 0x98, 0x4, 0x2, 0xdf, 0x2b, 671 0x99, 0x8b, 0xb9, 0xa4, 0xa8, 0xcb, 0xeb, 0x34, 0xc0, 0xf0, 0xa7, 0x8c, 0xf8, 672 0xd9, 0x1e, 0xde, 0x14, 0xa5, 0xed, 0x76, 0xbf, 0x11, 0x6f, 0xe3, 0x60, 0xaa, 673 0xfa, 0x88, 0x21, 0x49, 0x4, 0x35, 674 }, 675 BitLength: 512, 676 }, 677 } 678 679 var derEncodedSelfSignedCertBytes = []byte{ 680 0x30, 0x82, 0x02, 0x18, 0x30, 681 0x82, 0x01, 0xc2, 0x02, 0x09, 0x00, 0x8c, 0xc3, 0x37, 0x92, 0x10, 0xec, 0x2c, 682 0x98, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 683 0x05, 0x05, 0x00, 0x30, 0x81, 0x92, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 684 0x04, 0x06, 0x13, 0x02, 0x58, 0x58, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 685 0x04, 0x08, 0x13, 0x0a, 0x53, 0x6f, 0x6d, 0x65, 0x2d, 0x53, 0x74, 0x61, 0x74, 686 0x65, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x04, 0x43, 687 0x69, 0x74, 0x79, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 688 0x18, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x57, 0x69, 0x64, 689 0x67, 0x69, 0x74, 0x73, 0x20, 0x50, 0x74, 0x79, 0x20, 0x4c, 0x74, 0x64, 0x31, 690 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x11, 0x66, 0x61, 0x6c, 691 0x73, 0x65, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 692 0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 693 0x01, 0x09, 0x01, 0x16, 0x11, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x40, 0x65, 0x78, 694 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, 0x0d, 695 0x30, 0x39, 0x31, 0x30, 0x30, 0x38, 0x30, 0x30, 0x32, 0x35, 0x35, 0x33, 0x5a, 696 0x17, 0x0d, 0x31, 0x30, 0x31, 0x30, 0x30, 0x38, 0x30, 0x30, 0x32, 0x35, 0x35, 697 0x33, 0x5a, 0x30, 0x81, 0x92, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 698 0x06, 0x13, 0x02, 0x58, 0x58, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 699 0x08, 0x13, 0x0a, 0x53, 0x6f, 0x6d, 0x65, 0x2d, 0x53, 0x74, 0x61, 0x74, 0x65, 700 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x04, 0x43, 0x69, 701 0x74, 0x79, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 702 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x57, 0x69, 0x64, 0x67, 703 0x69, 0x74, 0x73, 0x20, 0x50, 0x74, 0x79, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x1a, 704 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x11, 0x66, 0x61, 0x6c, 0x73, 705 0x65, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 706 0x31, 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 707 0x09, 0x01, 0x16, 0x11, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x40, 0x65, 0x78, 0x61, 708 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x5c, 0x30, 0x0d, 0x06, 709 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 710 0x4b, 0x00, 0x30, 0x48, 0x02, 0x41, 0x00, 0xcd, 0xb7, 0x63, 0x9c, 0x32, 0x78, 711 0xf0, 0x06, 0xaa, 0x27, 0x7f, 0x6e, 0xaf, 0x42, 0x90, 0x2b, 0x59, 0x2d, 0x8c, 712 0xbc, 0xbe, 0x38, 0xa1, 0xc9, 0x2b, 0xa4, 0x69, 0x5a, 0x33, 0x1b, 0x1d, 0xea, 713 0xde, 0xad, 0xd8, 0xe9, 0xa5, 0xc2, 0x7e, 0x8c, 0x4c, 0x2f, 0xd0, 0xa8, 0x88, 714 0x96, 0x57, 0x72, 0x2a, 0x4f, 0x2a, 0xf7, 0x58, 0x9c, 0xf2, 0xc7, 0x70, 0x45, 715 0xdc, 0x8f, 0xde, 0xec, 0x35, 0x7d, 0x02, 0x03, 0x01, 0x00, 0x01, 0x30, 0x0d, 716 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 717 0x03, 0x41, 0x00, 0xa6, 0x7b, 0x06, 0xec, 0x5e, 0xce, 0x92, 0x77, 0x2c, 0xa4, 718 0x13, 0xcb, 0xa3, 0xca, 0x12, 0x56, 0x8f, 0xdc, 0x6c, 0x7b, 0x45, 0x11, 0xcd, 719 0x40, 0xa7, 0xf6, 0x59, 0x98, 0x04, 0x02, 0xdf, 0x2b, 0x99, 0x8b, 0xb9, 0xa4, 720 0xa8, 0xcb, 0xeb, 0x34, 0xc0, 0xf0, 0xa7, 0x8c, 0xf8, 0xd9, 0x1e, 0xde, 0x14, 721 0xa5, 0xed, 0x76, 0xbf, 0x11, 0x6f, 0xe3, 0x60, 0xaa, 0xfa, 0x88, 0x21, 0x49, 722 0x04, 0x35, 723 } 724 725 var derEncodedPaypalNULCertBytes = []byte{ 726 0x30, 0x82, 0x06, 0x44, 0x30, 727 0x82, 0x05, 0xad, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x00, 0xf0, 0x9b, 728 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 729 0x05, 0x00, 0x30, 0x82, 0x01, 0x12, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 730 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 731 0x04, 0x08, 0x13, 0x09, 0x42, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x6f, 0x6e, 0x61, 732 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x09, 0x42, 0x61, 733 0x72, 0x63, 0x65, 0x6c, 0x6f, 0x6e, 0x61, 0x31, 0x29, 0x30, 0x27, 0x06, 0x03, 734 0x55, 0x04, 0x0a, 0x13, 0x20, 0x49, 0x50, 0x53, 0x20, 0x43, 0x65, 0x72, 0x74, 735 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 736 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x73, 0x2e, 0x6c, 0x2e, 0x31, 0x2e, 737 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x14, 0x25, 0x67, 0x65, 0x6e, 0x65, 738 0x72, 0x61, 0x6c, 0x40, 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 739 0x20, 0x43, 0x2e, 0x49, 0x2e, 0x46, 0x2e, 0x20, 0x20, 0x42, 0x2d, 0x42, 0x36, 740 0x32, 0x32, 0x31, 0x30, 0x36, 0x39, 0x35, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 741 0x55, 0x04, 0x0b, 0x13, 0x25, 0x69, 0x70, 0x73, 0x43, 0x41, 0x20, 0x43, 0x4c, 742 0x41, 0x53, 0x45, 0x41, 0x31, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 743 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 744 0x69, 0x74, 0x79, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 745 0x25, 0x69, 0x70, 0x73, 0x43, 0x41, 0x20, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 746 0x31, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 747 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 748 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 749 0x01, 0x16, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x40, 0x69, 0x70, 750 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, 751 0x30, 0x32, 0x32, 0x34, 0x32, 0x33, 0x30, 0x34, 0x31, 0x37, 0x5a, 0x17, 0x0d, 752 0x31, 0x31, 0x30, 0x32, 0x32, 0x34, 0x32, 0x33, 0x30, 0x34, 0x31, 0x37, 0x5a, 753 0x30, 0x81, 0x94, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 754 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 755 0x0a, 0x43, 0x61, 0x6c, 0x69, 0x66, 0x6f, 0x72, 0x6e, 0x69, 0x61, 0x31, 0x16, 756 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0d, 0x53, 0x61, 0x6e, 0x20, 757 0x46, 0x72, 0x61, 0x6e, 0x63, 0x69, 0x73, 0x63, 0x6f, 0x31, 0x11, 0x30, 0x0f, 758 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 759 0x74, 0x79, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0b, 760 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x55, 0x6e, 0x69, 0x74, 0x31, 0x2f, 761 0x30, 0x2d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x26, 0x77, 0x77, 0x77, 0x2e, 762 0x70, 0x61, 0x79, 0x70, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x00, 0x73, 0x73, 763 0x6c, 0x2e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 764 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x63, 0x63, 0x30, 0x81, 0x9f, 0x30, 0x0d, 765 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 766 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xd2, 0x69, 767 0xfa, 0x6f, 0x3a, 0x00, 0xb4, 0x21, 0x1b, 0xc8, 0xb1, 0x02, 0xd7, 0x3f, 0x19, 768 0xb2, 0xc4, 0x6d, 0xb4, 0x54, 0xf8, 0x8b, 0x8a, 0xcc, 0xdb, 0x72, 0xc2, 0x9e, 769 0x3c, 0x60, 0xb9, 0xc6, 0x91, 0x3d, 0x82, 0xb7, 0x7d, 0x99, 0xff, 0xd1, 0x29, 770 0x84, 0xc1, 0x73, 0x53, 0x9c, 0x82, 0xdd, 0xfc, 0x24, 0x8c, 0x77, 0xd5, 0x41, 771 0xf3, 0xe8, 0x1e, 0x42, 0xa1, 0xad, 0x2d, 0x9e, 0xff, 0x5b, 0x10, 0x26, 0xce, 772 0x9d, 0x57, 0x17, 0x73, 0x16, 0x23, 0x38, 0xc8, 0xd6, 0xf1, 0xba, 0xa3, 0x96, 773 0x5b, 0x16, 0x67, 0x4a, 0x4f, 0x73, 0x97, 0x3a, 0x4d, 0x14, 0xa4, 0xf4, 0xe2, 774 0x3f, 0x8b, 0x05, 0x83, 0x42, 0xd1, 0xd0, 0xdc, 0x2f, 0x7a, 0xe5, 0xb6, 0x10, 775 0xb2, 0x11, 0xc0, 0xdc, 0x21, 0x2a, 0x90, 0xff, 0xae, 0x97, 0x71, 0x5a, 0x49, 776 0x81, 0xac, 0x40, 0xf3, 0x3b, 0xb8, 0x59, 0xb2, 0x4f, 0x02, 0x03, 0x01, 0x00, 777 0x01, 0xa3, 0x82, 0x03, 0x21, 0x30, 0x82, 0x03, 0x1d, 0x30, 0x09, 0x06, 0x03, 778 0x55, 0x1d, 0x13, 0x04, 0x02, 0x30, 0x00, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 779 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x06, 0x40, 780 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x03, 0xf8, 781 0x30, 0x13, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x0c, 0x30, 0x0a, 0x06, 0x08, 782 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x30, 0x1d, 0x06, 0x03, 0x55, 783 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x61, 0x8f, 0x61, 0x34, 0x43, 0x55, 0x14, 784 0x7f, 0x27, 0x09, 0xce, 0x4c, 0x8b, 0xea, 0x9b, 0x7b, 0x19, 0x25, 0xbc, 0x6e, 785 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 786 0x0e, 0x07, 0x60, 0xd4, 0x39, 0xc9, 0x1b, 0x5b, 0x5d, 0x90, 0x7b, 0x23, 0xc8, 787 0xd2, 0x34, 0x9d, 0x4a, 0x9a, 0x46, 0x39, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d, 788 0x11, 0x04, 0x02, 0x30, 0x00, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x1d, 0x12, 0x04, 789 0x15, 0x30, 0x13, 0x81, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x40, 790 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x72, 0x06, 0x09, 791 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x0d, 0x04, 0x65, 0x16, 0x63, 792 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 793 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, 794 0x4f, 0x54, 0x20, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x45, 0x44, 0x2e, 795 0x20, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 0x31, 0x20, 0x53, 0x65, 0x72, 0x76, 796 0x65, 0x72, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 797 0x65, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x68, 798 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70, 799 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x30, 0x2f, 0x06, 0x09, 0x60, 800 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x02, 0x04, 0x22, 0x16, 0x20, 0x68, 801 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70, 802 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 803 0x32, 0x30, 0x30, 0x32, 0x2f, 0x30, 0x43, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 804 0x86, 0xf8, 0x42, 0x01, 0x04, 0x04, 0x36, 0x16, 0x34, 0x68, 0x74, 0x74, 0x70, 805 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70, 0x73, 0x63, 0x61, 806 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 0x30, 0x30, 807 0x32, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 0x30, 0x30, 0x32, 0x43, 0x4c, 808 0x41, 0x53, 0x45, 0x41, 0x31, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x46, 0x06, 0x09, 809 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x03, 0x04, 0x39, 0x16, 0x37, 810 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 811 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 812 0x61, 0x32, 0x30, 0x30, 0x32, 0x2f, 0x72, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 813 0x69, 0x6f, 0x6e, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 0x31, 0x2e, 0x68, 0x74, 814 0x6d, 0x6c, 0x3f, 0x30, 0x43, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 815 0x42, 0x01, 0x07, 0x04, 0x36, 0x16, 0x34, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 816 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 817 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 0x30, 0x30, 0x32, 0x2f, 818 0x72, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 819 0x31, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3f, 0x30, 0x41, 0x06, 0x09, 0x60, 0x86, 820 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x08, 0x04, 0x34, 0x16, 0x32, 0x68, 0x74, 821 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70, 0x73, 822 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 823 0x30, 0x30, 0x32, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x4c, 0x41, 824 0x53, 0x45, 0x41, 0x31, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x30, 0x81, 0x83, 0x06, 825 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x7c, 0x30, 0x7a, 0x30, 0x39, 0xa0, 0x37, 0xa0, 826 0x35, 0x86, 0x33, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 827 0x2e, 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 828 0x73, 0x63, 0x61, 0x32, 0x30, 0x30, 0x32, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 829 0x32, 0x30, 0x30, 0x32, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 0x31, 0x2e, 0x63, 830 0x72, 0x6c, 0x30, 0x3d, 0xa0, 0x3b, 0xa0, 0x39, 0x86, 0x37, 0x68, 0x74, 0x74, 831 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x62, 0x61, 0x63, 0x6b, 0x2e, 0x69, 832 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 833 0x61, 0x32, 0x30, 0x30, 0x32, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 0x30, 834 0x30, 0x32, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 0x31, 0x2e, 0x63, 0x72, 0x6c, 835 0x30, 0x32, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 836 0x26, 0x30, 0x24, 0x30, 0x22, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 837 0x30, 0x01, 0x86, 0x16, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 838 0x73, 0x70, 0x2e, 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 839 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 840 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x68, 0xee, 0x79, 0x97, 0x97, 0xdd, 0x3b, 841 0xef, 0x16, 0x6a, 0x06, 0xf2, 0x14, 0x9a, 0x6e, 0xcd, 0x9e, 0x12, 0xf7, 0xaa, 842 0x83, 0x10, 0xbd, 0xd1, 0x7c, 0x98, 0xfa, 0xc7, 0xae, 0xd4, 0x0e, 0x2c, 0x9e, 843 0x38, 0x05, 0x9d, 0x52, 0x60, 0xa9, 0x99, 0x0a, 0x81, 0xb4, 0x98, 0x90, 0x1d, 844 0xae, 0xbb, 0x4a, 0xd7, 0xb9, 0xdc, 0x88, 0x9e, 0x37, 0x78, 0x41, 0x5b, 0xf7, 845 0x82, 0xa5, 0xf2, 0xba, 0x41, 0x25, 0x5a, 0x90, 0x1a, 0x1e, 0x45, 0x38, 0xa1, 846 0x52, 0x58, 0x75, 0x94, 0x26, 0x44, 0xfb, 0x20, 0x07, 0xba, 0x44, 0xcc, 0xe5, 847 0x4a, 0x2d, 0x72, 0x3f, 0x98, 0x47, 0xf6, 0x26, 0xdc, 0x05, 0x46, 0x05, 0x07, 848 0x63, 0x21, 0xab, 0x46, 0x9b, 0x9c, 0x78, 0xd5, 0x54, 0x5b, 0x3d, 0x0c, 0x1e, 849 0xc8, 0x64, 0x8c, 0xb5, 0x50, 0x23, 0x82, 0x6f, 0xdb, 0xb8, 0x22, 0x1c, 0x43, 850 0x96, 0x07, 0xa8, 0xbb, 851 } 852 853 var stringSliceTestData = [][]string{ 854 {"foo", "bar"}, 855 {"foo", "\\bar"}, 856 {"foo", "\"bar\""}, 857 {"foo", "åäö"}, 858 } 859 860 func TestStringSlice(t *testing.T) { 861 for _, test := range stringSliceTestData { 862 bs, err := Marshal(test) 863 if err != nil { 864 t.Error(err) 865 } 866 867 var res []string 868 _, err = Unmarshal(bs, &res) 869 if err != nil { 870 t.Error(err) 871 } 872 873 if fmt.Sprintf("%v", res) != fmt.Sprintf("%v", test) { 874 t.Errorf("incorrect marshal/unmarshal; %v != %v", res, test) 875 } 876 } 877 } 878 879 type explicitTaggedTimeTest struct { 880 Time time.Time `asn1:"explicit,tag:0"` 881 } 882 883 var explicitTaggedTimeTestData = []struct { 884 in []byte 885 out explicitTaggedTimeTest 886 }{ 887 {[]byte{0x30, 0x11, 0xa0, 0xf, 0x17, 0xd, '9', '1', '0', '5', '0', '6', '1', '6', '4', '5', '4', '0', 'Z'}, 888 explicitTaggedTimeTest{time.Date(1991, 05, 06, 16, 45, 40, 0, time.UTC)}}, 889 {[]byte{0x30, 0x17, 0xa0, 0xf, 0x18, 0x13, '2', '0', '1', '0', '0', '1', '0', '2', '0', '3', '0', '4', '0', '5', '+', '0', '6', '0', '7'}, 890 explicitTaggedTimeTest{time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", 6*60*60+7*60))}}, 891 } 892 893 func TestExplicitTaggedTime(t *testing.T) { 894 // Test that a time.Time will match either tagUTCTime or 895 // tagGeneralizedTime. 896 for i, test := range explicitTaggedTimeTestData { 897 var got explicitTaggedTimeTest 898 _, err := Unmarshal(test.in, &got) 899 if err != nil { 900 t.Errorf("Unmarshal failed at index %d %v", i, err) 901 } 902 if !got.Time.Equal(test.out.Time) { 903 t.Errorf("#%d: got %v, want %v", i, got.Time, test.out.Time) 904 } 905 } 906 } 907 908 type implicitTaggedTimeTest struct { 909 Time time.Time `asn1:"tag:24"` 910 } 911 912 func TestImplicitTaggedTime(t *testing.T) { 913 // An implicitly tagged time value, that happens to have an implicit 914 // tag equal to a GENERALIZEDTIME, should still be parsed as a UTCTime. 915 // (There's no "timeType" in fieldParameters to determine what type of 916 // time should be expected when implicitly tagged.) 917 der := []byte{0x30, 0x0f, 0x80 | 24, 0xd, '9', '1', '0', '5', '0', '6', '1', '6', '4', '5', '4', '0', 'Z'} 918 var result implicitTaggedTimeTest 919 if _, err := Unmarshal(der, &result); err != nil { 920 t.Fatalf("Error while parsing: %s", err) 921 } 922 if expected := time.Date(1991, 05, 06, 16, 45, 40, 0, time.UTC); !result.Time.Equal(expected) { 923 t.Errorf("Wrong result. Got %v, want %v", result.Time, expected) 924 } 925 } 926 927 type truncatedExplicitTagTest struct { 928 Test int `asn1:"explicit,tag:0"` 929 } 930 931 func TestTruncatedExplicitTag(t *testing.T) { 932 // This crashed Unmarshal in the past. See #11154. 933 der := []byte{ 934 0x30, // SEQUENCE 935 0x02, // two bytes long 936 0xa0, // context-specific, tag 0 937 0x30, // 48 bytes long 938 } 939 940 var result truncatedExplicitTagTest 941 if _, err := Unmarshal(der, &result); err == nil { 942 t.Error("Unmarshal returned without error") 943 } 944 } 945 946 type invalidUTF8Test struct { 947 Str string `asn1:"utf8"` 948 } 949 950 func TestUnmarshalInvalidUTF8(t *testing.T) { 951 data := []byte("0\x05\f\x03a\xc9c") 952 var result invalidUTF8Test 953 _, err := Unmarshal(data, &result) 954 955 const expectedSubstring = "UTF" 956 if err == nil { 957 t.Fatal("Successfully unmarshaled invalid UTF-8 data") 958 } else if !strings.Contains(err.Error(), expectedSubstring) { 959 t.Fatalf("Expected error to mention %q but error was %q", expectedSubstring, err.Error()) 960 } 961 } 962 963 func TestMarshalNilValue(t *testing.T) { 964 nilValueTestData := []interface{}{ 965 nil, 966 struct{ v interface{} }{}, 967 } 968 for i, test := range nilValueTestData { 969 if _, err := Marshal(test); err == nil { 970 t.Fatalf("#%d: successfully marshaled nil value", i) 971 } 972 } 973 }