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