github.com/flyinox/gosm@v0.0.0-20171117061539-16768cb62077/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{0x05, 0x00}, &RawValue{0, 5, false, []byte{}, []byte{0x05, 0x00}}}, 483 {[]byte{0x30, 0x08, 0x06, 0x06, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d}, &TestObjectIdentifierStruct{[]int{1, 2, 840, 113549}}}, 484 {[]byte{0x03, 0x04, 0x06, 0x6e, 0x5d, 0xc0}, &BitString{[]byte{110, 93, 192}, 18}}, 485 {[]byte{0x30, 0x09, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02, 0x01, 0x03}, &[]int{1, 2, 3}}, 486 {[]byte{0x02, 0x01, 0x10}, newInt(16)}, 487 {[]byte{0x13, 0x04, 't', 'e', 's', 't'}, newString("test")}, 488 {[]byte{0x16, 0x04, 't', 'e', 's', 't'}, newString("test")}, 489 {[]byte{0x16, 0x04, 't', 'e', 's', 't'}, &RawValue{0, 22, false, []byte("test"), []byte("\x16\x04test")}}, 490 {[]byte{0x04, 0x04, 1, 2, 3, 4}, &RawValue{0, 4, false, []byte{1, 2, 3, 4}, []byte{4, 4, 1, 2, 3, 4}}}, 491 {[]byte{0x30, 0x03, 0x81, 0x01, 0x01}, &TestContextSpecificTags{1}}, 492 {[]byte{0x30, 0x08, 0xa1, 0x03, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02}, &TestContextSpecificTags2{1, 2}}, 493 {[]byte{0x30, 0x03, 0x81, 0x01, '@'}, &TestContextSpecificTags3{"@"}}, 494 {[]byte{0x01, 0x01, 0x00}, newBool(false)}, 495 {[]byte{0x01, 0x01, 0xff}, newBool(true)}, 496 {[]byte{0x30, 0x0b, 0x13, 0x03, 0x66, 0x6f, 0x6f, 0x02, 0x01, 0x22, 0x02, 0x01, 0x33}, &TestElementsAfterString{"foo", 0x22, 0x33}}, 497 {[]byte{0x30, 0x05, 0x02, 0x03, 0x12, 0x34, 0x56}, &TestBigInt{big.NewInt(0x123456)}}, 498 {[]byte{0x30, 0x0b, 0x31, 0x09, 0x02, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02, 0x01, 0x03}, &TestSet{Ints: []int{1, 2, 3}}}, 499 } 500 501 func TestUnmarshal(t *testing.T) { 502 for i, test := range unmarshalTestData { 503 pv := reflect.New(reflect.TypeOf(test.out).Elem()) 504 val := pv.Interface() 505 _, err := Unmarshal(test.in, val) 506 if err != nil { 507 t.Errorf("Unmarshal failed at index %d %v", i, err) 508 } 509 if !reflect.DeepEqual(val, test.out) { 510 t.Errorf("#%d:\nhave %#v\nwant %#v", i, val, test.out) 511 } 512 } 513 } 514 515 type Certificate struct { 516 TBSCertificate TBSCertificate 517 SignatureAlgorithm AlgorithmIdentifier 518 SignatureValue BitString 519 } 520 521 type TBSCertificate struct { 522 Version int `asn1:"optional,explicit,default:0,tag:0"` 523 SerialNumber RawValue 524 SignatureAlgorithm AlgorithmIdentifier 525 Issuer RDNSequence 526 Validity Validity 527 Subject RDNSequence 528 PublicKey PublicKeyInfo 529 } 530 531 type AlgorithmIdentifier struct { 532 Algorithm ObjectIdentifier 533 } 534 535 type RDNSequence []RelativeDistinguishedNameSET 536 537 type RelativeDistinguishedNameSET []AttributeTypeAndValue 538 539 type AttributeTypeAndValue struct { 540 Type ObjectIdentifier 541 Value interface{} 542 } 543 544 type Validity struct { 545 NotBefore, NotAfter time.Time 546 } 547 548 type PublicKeyInfo struct { 549 Algorithm AlgorithmIdentifier 550 PublicKey BitString 551 } 552 553 func TestCertificate(t *testing.T) { 554 // This is a minimal, self-signed certificate that should parse correctly. 555 var cert Certificate 556 if _, err := Unmarshal(derEncodedSelfSignedCertBytes, &cert); err != nil { 557 t.Errorf("Unmarshal failed: %v", err) 558 } 559 if !reflect.DeepEqual(cert, derEncodedSelfSignedCert) { 560 t.Errorf("Bad result:\ngot: %+v\nwant: %+v", cert, derEncodedSelfSignedCert) 561 } 562 } 563 564 func TestCertificateWithNUL(t *testing.T) { 565 // This is the paypal NUL-hack certificate. It should fail to parse because 566 // NUL isn't a permitted character in a PrintableString. 567 568 var cert Certificate 569 if _, err := Unmarshal(derEncodedPaypalNULCertBytes, &cert); err == nil { 570 t.Error("Unmarshal succeeded, should not have") 571 } 572 } 573 574 type rawStructTest struct { 575 Raw RawContent 576 A int 577 } 578 579 func TestRawStructs(t *testing.T) { 580 var s rawStructTest 581 input := []byte{0x30, 0x03, 0x02, 0x01, 0x50} 582 583 rest, err := Unmarshal(input, &s) 584 if len(rest) != 0 { 585 t.Errorf("incomplete parse: %x", rest) 586 return 587 } 588 if err != nil { 589 t.Error(err) 590 return 591 } 592 if s.A != 0x50 { 593 t.Errorf("bad value for A: got %d want %d", s.A, 0x50) 594 } 595 if !bytes.Equal([]byte(s.Raw), input) { 596 t.Errorf("bad value for Raw: got %x want %x", s.Raw, input) 597 } 598 } 599 600 type oiEqualTest struct { 601 first ObjectIdentifier 602 second ObjectIdentifier 603 same bool 604 } 605 606 var oiEqualTests = []oiEqualTest{ 607 { 608 ObjectIdentifier{1, 2, 3}, 609 ObjectIdentifier{1, 2, 3}, 610 true, 611 }, 612 { 613 ObjectIdentifier{1}, 614 ObjectIdentifier{1, 2, 3}, 615 false, 616 }, 617 { 618 ObjectIdentifier{1, 2, 3}, 619 ObjectIdentifier{10, 11, 12}, 620 false, 621 }, 622 } 623 624 func TestObjectIdentifierEqual(t *testing.T) { 625 for _, o := range oiEqualTests { 626 if s := o.first.Equal(o.second); s != o.same { 627 t.Errorf("ObjectIdentifier.Equal: got: %t want: %t", s, o.same) 628 } 629 } 630 } 631 632 var derEncodedSelfSignedCert = Certificate{ 633 TBSCertificate: TBSCertificate{ 634 Version: 0, 635 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}}, 636 SignatureAlgorithm: AlgorithmIdentifier{Algorithm: ObjectIdentifier{1, 2, 840, 113549, 1, 1, 5}}, 637 Issuer: RDNSequence{ 638 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 6}, Value: "XX"}}, 639 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 8}, Value: "Some-State"}}, 640 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 7}, Value: "City"}}, 641 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 10}, Value: "Internet Widgits Pty Ltd"}}, 642 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 3}, Value: "false.example.com"}}, 643 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{1, 2, 840, 113549, 1, 9, 1}, Value: "false@example.com"}}, 644 }, 645 Validity: Validity{ 646 NotBefore: time.Date(2009, 10, 8, 00, 25, 53, 0, time.UTC), 647 NotAfter: time.Date(2010, 10, 8, 00, 25, 53, 0, time.UTC), 648 }, 649 Subject: RDNSequence{ 650 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 6}, Value: "XX"}}, 651 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 8}, Value: "Some-State"}}, 652 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 7}, Value: "City"}}, 653 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 10}, Value: "Internet Widgits Pty Ltd"}}, 654 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{2, 5, 4, 3}, Value: "false.example.com"}}, 655 RelativeDistinguishedNameSET{AttributeTypeAndValue{Type: ObjectIdentifier{1, 2, 840, 113549, 1, 9, 1}, Value: "false@example.com"}}, 656 }, 657 PublicKey: PublicKeyInfo{ 658 Algorithm: AlgorithmIdentifier{Algorithm: ObjectIdentifier{1, 2, 840, 113549, 1, 1, 1}}, 659 PublicKey: BitString{ 660 Bytes: []uint8{ 661 0x30, 0x48, 0x2, 0x41, 0x0, 0xcd, 0xb7, 662 0x63, 0x9c, 0x32, 0x78, 0xf0, 0x6, 0xaa, 0x27, 0x7f, 0x6e, 0xaf, 0x42, 663 0x90, 0x2b, 0x59, 0x2d, 0x8c, 0xbc, 0xbe, 0x38, 0xa1, 0xc9, 0x2b, 0xa4, 664 0x69, 0x5a, 0x33, 0x1b, 0x1d, 0xea, 0xde, 0xad, 0xd8, 0xe9, 0xa5, 0xc2, 665 0x7e, 0x8c, 0x4c, 0x2f, 0xd0, 0xa8, 0x88, 0x96, 0x57, 0x72, 0x2a, 0x4f, 666 0x2a, 0xf7, 0x58, 0x9c, 0xf2, 0xc7, 0x70, 0x45, 0xdc, 0x8f, 0xde, 0xec, 667 0x35, 0x7d, 0x2, 0x3, 0x1, 0x0, 0x1, 668 }, 669 BitLength: 592, 670 }, 671 }, 672 }, 673 SignatureAlgorithm: AlgorithmIdentifier{Algorithm: ObjectIdentifier{1, 2, 840, 113549, 1, 1, 5}}, 674 SignatureValue: BitString{ 675 Bytes: []uint8{ 676 0xa6, 0x7b, 0x6, 0xec, 0x5e, 0xce, 677 0x92, 0x77, 0x2c, 0xa4, 0x13, 0xcb, 0xa3, 0xca, 0x12, 0x56, 0x8f, 0xdc, 0x6c, 678 0x7b, 0x45, 0x11, 0xcd, 0x40, 0xa7, 0xf6, 0x59, 0x98, 0x4, 0x2, 0xdf, 0x2b, 679 0x99, 0x8b, 0xb9, 0xa4, 0xa8, 0xcb, 0xeb, 0x34, 0xc0, 0xf0, 0xa7, 0x8c, 0xf8, 680 0xd9, 0x1e, 0xde, 0x14, 0xa5, 0xed, 0x76, 0xbf, 0x11, 0x6f, 0xe3, 0x60, 0xaa, 681 0xfa, 0x88, 0x21, 0x49, 0x4, 0x35, 682 }, 683 BitLength: 512, 684 }, 685 } 686 687 var derEncodedSelfSignedCertBytes = []byte{ 688 0x30, 0x82, 0x02, 0x18, 0x30, 689 0x82, 0x01, 0xc2, 0x02, 0x09, 0x00, 0x8c, 0xc3, 0x37, 0x92, 0x10, 0xec, 0x2c, 690 0x98, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 691 0x05, 0x05, 0x00, 0x30, 0x81, 0x92, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 692 0x04, 0x06, 0x13, 0x02, 0x58, 0x58, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 693 0x04, 0x08, 0x13, 0x0a, 0x53, 0x6f, 0x6d, 0x65, 0x2d, 0x53, 0x74, 0x61, 0x74, 694 0x65, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x04, 0x43, 695 0x69, 0x74, 0x79, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 696 0x18, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x57, 0x69, 0x64, 697 0x67, 0x69, 0x74, 0x73, 0x20, 0x50, 0x74, 0x79, 0x20, 0x4c, 0x74, 0x64, 0x31, 698 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x11, 0x66, 0x61, 0x6c, 699 0x73, 0x65, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 700 0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 701 0x01, 0x09, 0x01, 0x16, 0x11, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x40, 0x65, 0x78, 702 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, 0x0d, 703 0x30, 0x39, 0x31, 0x30, 0x30, 0x38, 0x30, 0x30, 0x32, 0x35, 0x35, 0x33, 0x5a, 704 0x17, 0x0d, 0x31, 0x30, 0x31, 0x30, 0x30, 0x38, 0x30, 0x30, 0x32, 0x35, 0x35, 705 0x33, 0x5a, 0x30, 0x81, 0x92, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 706 0x06, 0x13, 0x02, 0x58, 0x58, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 707 0x08, 0x13, 0x0a, 0x53, 0x6f, 0x6d, 0x65, 0x2d, 0x53, 0x74, 0x61, 0x74, 0x65, 708 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x04, 0x43, 0x69, 709 0x74, 0x79, 0x31, 0x21, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x18, 710 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x57, 0x69, 0x64, 0x67, 711 0x69, 0x74, 0x73, 0x20, 0x50, 0x74, 0x79, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x1a, 712 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x11, 0x66, 0x61, 0x6c, 0x73, 713 0x65, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 714 0x31, 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 715 0x09, 0x01, 0x16, 0x11, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x40, 0x65, 0x78, 0x61, 716 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x5c, 0x30, 0x0d, 0x06, 717 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 718 0x4b, 0x00, 0x30, 0x48, 0x02, 0x41, 0x00, 0xcd, 0xb7, 0x63, 0x9c, 0x32, 0x78, 719 0xf0, 0x06, 0xaa, 0x27, 0x7f, 0x6e, 0xaf, 0x42, 0x90, 0x2b, 0x59, 0x2d, 0x8c, 720 0xbc, 0xbe, 0x38, 0xa1, 0xc9, 0x2b, 0xa4, 0x69, 0x5a, 0x33, 0x1b, 0x1d, 0xea, 721 0xde, 0xad, 0xd8, 0xe9, 0xa5, 0xc2, 0x7e, 0x8c, 0x4c, 0x2f, 0xd0, 0xa8, 0x88, 722 0x96, 0x57, 0x72, 0x2a, 0x4f, 0x2a, 0xf7, 0x58, 0x9c, 0xf2, 0xc7, 0x70, 0x45, 723 0xdc, 0x8f, 0xde, 0xec, 0x35, 0x7d, 0x02, 0x03, 0x01, 0x00, 0x01, 0x30, 0x0d, 724 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 725 0x03, 0x41, 0x00, 0xa6, 0x7b, 0x06, 0xec, 0x5e, 0xce, 0x92, 0x77, 0x2c, 0xa4, 726 0x13, 0xcb, 0xa3, 0xca, 0x12, 0x56, 0x8f, 0xdc, 0x6c, 0x7b, 0x45, 0x11, 0xcd, 727 0x40, 0xa7, 0xf6, 0x59, 0x98, 0x04, 0x02, 0xdf, 0x2b, 0x99, 0x8b, 0xb9, 0xa4, 728 0xa8, 0xcb, 0xeb, 0x34, 0xc0, 0xf0, 0xa7, 0x8c, 0xf8, 0xd9, 0x1e, 0xde, 0x14, 729 0xa5, 0xed, 0x76, 0xbf, 0x11, 0x6f, 0xe3, 0x60, 0xaa, 0xfa, 0x88, 0x21, 0x49, 730 0x04, 0x35, 731 } 732 733 var derEncodedPaypalNULCertBytes = []byte{ 734 0x30, 0x82, 0x06, 0x44, 0x30, 735 0x82, 0x05, 0xad, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x00, 0xf0, 0x9b, 736 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 737 0x05, 0x00, 0x30, 0x82, 0x01, 0x12, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 738 0x04, 0x06, 0x13, 0x02, 0x45, 0x53, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 739 0x04, 0x08, 0x13, 0x09, 0x42, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x6f, 0x6e, 0x61, 740 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x09, 0x42, 0x61, 741 0x72, 0x63, 0x65, 0x6c, 0x6f, 0x6e, 0x61, 0x31, 0x29, 0x30, 0x27, 0x06, 0x03, 742 0x55, 0x04, 0x0a, 0x13, 0x20, 0x49, 0x50, 0x53, 0x20, 0x43, 0x65, 0x72, 0x74, 743 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 744 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x73, 0x2e, 0x6c, 0x2e, 0x31, 0x2e, 745 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x14, 0x25, 0x67, 0x65, 0x6e, 0x65, 746 0x72, 0x61, 0x6c, 0x40, 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 747 0x20, 0x43, 0x2e, 0x49, 0x2e, 0x46, 0x2e, 0x20, 0x20, 0x42, 0x2d, 0x42, 0x36, 748 0x32, 0x32, 0x31, 0x30, 0x36, 0x39, 0x35, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 749 0x55, 0x04, 0x0b, 0x13, 0x25, 0x69, 0x70, 0x73, 0x43, 0x41, 0x20, 0x43, 0x4c, 750 0x41, 0x53, 0x45, 0x41, 0x31, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 751 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 752 0x69, 0x74, 0x79, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 753 0x25, 0x69, 0x70, 0x73, 0x43, 0x41, 0x20, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 754 0x31, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 755 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 756 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 757 0x01, 0x16, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x40, 0x69, 0x70, 758 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, 759 0x30, 0x32, 0x32, 0x34, 0x32, 0x33, 0x30, 0x34, 0x31, 0x37, 0x5a, 0x17, 0x0d, 760 0x31, 0x31, 0x30, 0x32, 0x32, 0x34, 0x32, 0x33, 0x30, 0x34, 0x31, 0x37, 0x5a, 761 0x30, 0x81, 0x94, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 762 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 763 0x0a, 0x43, 0x61, 0x6c, 0x69, 0x66, 0x6f, 0x72, 0x6e, 0x69, 0x61, 0x31, 0x16, 764 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0d, 0x53, 0x61, 0x6e, 0x20, 765 0x46, 0x72, 0x61, 0x6e, 0x63, 0x69, 0x73, 0x63, 0x6f, 0x31, 0x11, 0x30, 0x0f, 766 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 767 0x74, 0x79, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x0b, 768 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x55, 0x6e, 0x69, 0x74, 0x31, 0x2f, 769 0x30, 0x2d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x26, 0x77, 0x77, 0x77, 0x2e, 770 0x70, 0x61, 0x79, 0x70, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x00, 0x73, 0x73, 771 0x6c, 0x2e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 772 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x63, 0x63, 0x30, 0x81, 0x9f, 0x30, 0x0d, 773 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 774 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xd2, 0x69, 775 0xfa, 0x6f, 0x3a, 0x00, 0xb4, 0x21, 0x1b, 0xc8, 0xb1, 0x02, 0xd7, 0x3f, 0x19, 776 0xb2, 0xc4, 0x6d, 0xb4, 0x54, 0xf8, 0x8b, 0x8a, 0xcc, 0xdb, 0x72, 0xc2, 0x9e, 777 0x3c, 0x60, 0xb9, 0xc6, 0x91, 0x3d, 0x82, 0xb7, 0x7d, 0x99, 0xff, 0xd1, 0x29, 778 0x84, 0xc1, 0x73, 0x53, 0x9c, 0x82, 0xdd, 0xfc, 0x24, 0x8c, 0x77, 0xd5, 0x41, 779 0xf3, 0xe8, 0x1e, 0x42, 0xa1, 0xad, 0x2d, 0x9e, 0xff, 0x5b, 0x10, 0x26, 0xce, 780 0x9d, 0x57, 0x17, 0x73, 0x16, 0x23, 0x38, 0xc8, 0xd6, 0xf1, 0xba, 0xa3, 0x96, 781 0x5b, 0x16, 0x67, 0x4a, 0x4f, 0x73, 0x97, 0x3a, 0x4d, 0x14, 0xa4, 0xf4, 0xe2, 782 0x3f, 0x8b, 0x05, 0x83, 0x42, 0xd1, 0xd0, 0xdc, 0x2f, 0x7a, 0xe5, 0xb6, 0x10, 783 0xb2, 0x11, 0xc0, 0xdc, 0x21, 0x2a, 0x90, 0xff, 0xae, 0x97, 0x71, 0x5a, 0x49, 784 0x81, 0xac, 0x40, 0xf3, 0x3b, 0xb8, 0x59, 0xb2, 0x4f, 0x02, 0x03, 0x01, 0x00, 785 0x01, 0xa3, 0x82, 0x03, 0x21, 0x30, 0x82, 0x03, 0x1d, 0x30, 0x09, 0x06, 0x03, 786 0x55, 0x1d, 0x13, 0x04, 0x02, 0x30, 0x00, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 787 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x06, 0x40, 788 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x03, 0xf8, 789 0x30, 0x13, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x0c, 0x30, 0x0a, 0x06, 0x08, 790 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x30, 0x1d, 0x06, 0x03, 0x55, 791 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x61, 0x8f, 0x61, 0x34, 0x43, 0x55, 0x14, 792 0x7f, 0x27, 0x09, 0xce, 0x4c, 0x8b, 0xea, 0x9b, 0x7b, 0x19, 0x25, 0xbc, 0x6e, 793 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 794 0x0e, 0x07, 0x60, 0xd4, 0x39, 0xc9, 0x1b, 0x5b, 0x5d, 0x90, 0x7b, 0x23, 0xc8, 795 0xd2, 0x34, 0x9d, 0x4a, 0x9a, 0x46, 0x39, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d, 796 0x11, 0x04, 0x02, 0x30, 0x00, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x1d, 0x12, 0x04, 797 0x15, 0x30, 0x13, 0x81, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x40, 798 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x72, 0x06, 0x09, 799 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x0d, 0x04, 0x65, 0x16, 0x63, 800 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 801 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, 802 0x4f, 0x54, 0x20, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x45, 0x44, 0x2e, 803 0x20, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 0x31, 0x20, 0x53, 0x65, 0x72, 0x76, 804 0x65, 0x72, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 805 0x65, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x68, 806 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70, 807 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x30, 0x2f, 0x06, 0x09, 0x60, 808 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x02, 0x04, 0x22, 0x16, 0x20, 0x68, 809 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70, 810 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 811 0x32, 0x30, 0x30, 0x32, 0x2f, 0x30, 0x43, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 812 0x86, 0xf8, 0x42, 0x01, 0x04, 0x04, 0x36, 0x16, 0x34, 0x68, 0x74, 0x74, 0x70, 813 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70, 0x73, 0x63, 0x61, 814 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 0x30, 0x30, 815 0x32, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 0x30, 0x30, 0x32, 0x43, 0x4c, 816 0x41, 0x53, 0x45, 0x41, 0x31, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x46, 0x06, 0x09, 817 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x03, 0x04, 0x39, 0x16, 0x37, 818 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 819 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 820 0x61, 0x32, 0x30, 0x30, 0x32, 0x2f, 0x72, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 821 0x69, 0x6f, 0x6e, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 0x31, 0x2e, 0x68, 0x74, 822 0x6d, 0x6c, 0x3f, 0x30, 0x43, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 823 0x42, 0x01, 0x07, 0x04, 0x36, 0x16, 0x34, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 824 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 825 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 0x30, 0x30, 0x32, 0x2f, 826 0x72, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 827 0x31, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3f, 0x30, 0x41, 0x06, 0x09, 0x60, 0x86, 828 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01, 0x08, 0x04, 0x34, 0x16, 0x32, 0x68, 0x74, 829 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x70, 0x73, 830 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 831 0x30, 0x30, 0x32, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x4c, 0x41, 832 0x53, 0x45, 0x41, 0x31, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x30, 0x81, 0x83, 0x06, 833 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x7c, 0x30, 0x7a, 0x30, 0x39, 0xa0, 0x37, 0xa0, 834 0x35, 0x86, 0x33, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 835 0x2e, 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 836 0x73, 0x63, 0x61, 0x32, 0x30, 0x30, 0x32, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 837 0x32, 0x30, 0x30, 0x32, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 0x31, 0x2e, 0x63, 838 0x72, 0x6c, 0x30, 0x3d, 0xa0, 0x3b, 0xa0, 0x39, 0x86, 0x37, 0x68, 0x74, 0x74, 839 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x62, 0x61, 0x63, 0x6b, 0x2e, 0x69, 840 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x70, 0x73, 0x63, 841 0x61, 0x32, 0x30, 0x30, 0x32, 0x2f, 0x69, 0x70, 0x73, 0x63, 0x61, 0x32, 0x30, 842 0x30, 0x32, 0x43, 0x4c, 0x41, 0x53, 0x45, 0x41, 0x31, 0x2e, 0x63, 0x72, 0x6c, 843 0x30, 0x32, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 844 0x26, 0x30, 0x24, 0x30, 0x22, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 845 0x30, 0x01, 0x86, 0x16, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 846 0x73, 0x70, 0x2e, 0x69, 0x70, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 847 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 848 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x68, 0xee, 0x79, 0x97, 0x97, 0xdd, 0x3b, 849 0xef, 0x16, 0x6a, 0x06, 0xf2, 0x14, 0x9a, 0x6e, 0xcd, 0x9e, 0x12, 0xf7, 0xaa, 850 0x83, 0x10, 0xbd, 0xd1, 0x7c, 0x98, 0xfa, 0xc7, 0xae, 0xd4, 0x0e, 0x2c, 0x9e, 851 0x38, 0x05, 0x9d, 0x52, 0x60, 0xa9, 0x99, 0x0a, 0x81, 0xb4, 0x98, 0x90, 0x1d, 852 0xae, 0xbb, 0x4a, 0xd7, 0xb9, 0xdc, 0x88, 0x9e, 0x37, 0x78, 0x41, 0x5b, 0xf7, 853 0x82, 0xa5, 0xf2, 0xba, 0x41, 0x25, 0x5a, 0x90, 0x1a, 0x1e, 0x45, 0x38, 0xa1, 854 0x52, 0x58, 0x75, 0x94, 0x26, 0x44, 0xfb, 0x20, 0x07, 0xba, 0x44, 0xcc, 0xe5, 855 0x4a, 0x2d, 0x72, 0x3f, 0x98, 0x47, 0xf6, 0x26, 0xdc, 0x05, 0x46, 0x05, 0x07, 856 0x63, 0x21, 0xab, 0x46, 0x9b, 0x9c, 0x78, 0xd5, 0x54, 0x5b, 0x3d, 0x0c, 0x1e, 857 0xc8, 0x64, 0x8c, 0xb5, 0x50, 0x23, 0x82, 0x6f, 0xdb, 0xb8, 0x22, 0x1c, 0x43, 858 0x96, 0x07, 0xa8, 0xbb, 859 } 860 861 var stringSliceTestData = [][]string{ 862 {"foo", "bar"}, 863 {"foo", "\\bar"}, 864 {"foo", "\"bar\""}, 865 {"foo", "åäö"}, 866 } 867 868 func TestStringSlice(t *testing.T) { 869 for _, test := range stringSliceTestData { 870 bs, err := Marshal(test) 871 if err != nil { 872 t.Error(err) 873 } 874 875 var res []string 876 _, err = Unmarshal(bs, &res) 877 if err != nil { 878 t.Error(err) 879 } 880 881 if fmt.Sprintf("%v", res) != fmt.Sprintf("%v", test) { 882 t.Errorf("incorrect marshal/unmarshal; %v != %v", res, test) 883 } 884 } 885 } 886 887 type explicitTaggedTimeTest struct { 888 Time time.Time `asn1:"explicit,tag:0"` 889 } 890 891 var explicitTaggedTimeTestData = []struct { 892 in []byte 893 out explicitTaggedTimeTest 894 }{ 895 {[]byte{0x30, 0x11, 0xa0, 0xf, 0x17, 0xd, '9', '1', '0', '5', '0', '6', '1', '6', '4', '5', '4', '0', 'Z'}, 896 explicitTaggedTimeTest{time.Date(1991, 05, 06, 16, 45, 40, 0, time.UTC)}}, 897 {[]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'}, 898 explicitTaggedTimeTest{time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", 6*60*60+7*60))}}, 899 } 900 901 func TestExplicitTaggedTime(t *testing.T) { 902 // Test that a time.Time will match either tagUTCTime or 903 // tagGeneralizedTime. 904 for i, test := range explicitTaggedTimeTestData { 905 var got explicitTaggedTimeTest 906 _, err := Unmarshal(test.in, &got) 907 if err != nil { 908 t.Errorf("Unmarshal failed at index %d %v", i, err) 909 } 910 if !got.Time.Equal(test.out.Time) { 911 t.Errorf("#%d: got %v, want %v", i, got.Time, test.out.Time) 912 } 913 } 914 } 915 916 type implicitTaggedTimeTest struct { 917 Time time.Time `asn1:"tag:24"` 918 } 919 920 func TestImplicitTaggedTime(t *testing.T) { 921 // An implicitly tagged time value, that happens to have an implicit 922 // tag equal to a GENERALIZEDTIME, should still be parsed as a UTCTime. 923 // (There's no "timeType" in fieldParameters to determine what type of 924 // time should be expected when implicitly tagged.) 925 der := []byte{0x30, 0x0f, 0x80 | 24, 0xd, '9', '1', '0', '5', '0', '6', '1', '6', '4', '5', '4', '0', 'Z'} 926 var result implicitTaggedTimeTest 927 if _, err := Unmarshal(der, &result); err != nil { 928 t.Fatalf("Error while parsing: %s", err) 929 } 930 if expected := time.Date(1991, 05, 06, 16, 45, 40, 0, time.UTC); !result.Time.Equal(expected) { 931 t.Errorf("Wrong result. Got %v, want %v", result.Time, expected) 932 } 933 } 934 935 type truncatedExplicitTagTest struct { 936 Test int `asn1:"explicit,tag:0"` 937 } 938 939 func TestTruncatedExplicitTag(t *testing.T) { 940 // This crashed Unmarshal in the past. See #11154. 941 der := []byte{ 942 0x30, // SEQUENCE 943 0x02, // two bytes long 944 0xa0, // context-specific, tag 0 945 0x30, // 48 bytes long 946 } 947 948 var result truncatedExplicitTagTest 949 if _, err := Unmarshal(der, &result); err == nil { 950 t.Error("Unmarshal returned without error") 951 } 952 } 953 954 type invalidUTF8Test struct { 955 Str string `asn1:"utf8"` 956 } 957 958 func TestUnmarshalInvalidUTF8(t *testing.T) { 959 data := []byte("0\x05\f\x03a\xc9c") 960 var result invalidUTF8Test 961 _, err := Unmarshal(data, &result) 962 963 const expectedSubstring = "UTF" 964 if err == nil { 965 t.Fatal("Successfully unmarshaled invalid UTF-8 data") 966 } else if !strings.Contains(err.Error(), expectedSubstring) { 967 t.Fatalf("Expected error to mention %q but error was %q", expectedSubstring, err.Error()) 968 } 969 } 970 971 func TestMarshalNilValue(t *testing.T) { 972 nilValueTestData := []interface{}{ 973 nil, 974 struct{ V interface{} }{}, 975 } 976 for i, test := range nilValueTestData { 977 if _, err := Marshal(test); err == nil { 978 t.Fatalf("#%d: successfully marshaled nil value", i) 979 } 980 } 981 } 982 983 type unexported struct { 984 X int 985 y int 986 } 987 988 type exported struct { 989 X int 990 Y int 991 } 992 993 func TestUnexportedStructField(t *testing.T) { 994 want := StructuralError{"struct contains unexported fields"} 995 996 _, err := Marshal(unexported{X: 5, y: 1}) 997 if err != want { 998 t.Errorf("got %v, want %v", err, want) 999 } 1000 1001 bs, err := Marshal(exported{X: 5, Y: 1}) 1002 if err != nil { 1003 t.Fatal(err) 1004 } 1005 var u unexported 1006 _, err = Unmarshal(bs, &u) 1007 if err != want { 1008 t.Errorf("got %v, want %v", err, want) 1009 } 1010 } 1011 1012 func TestNull(t *testing.T) { 1013 marshaled, err := Marshal(NullRawValue) 1014 if err != nil { 1015 t.Fatal(err) 1016 } 1017 if !bytes.Equal(NullBytes, marshaled) { 1018 t.Errorf("Expected Marshal of NullRawValue to yeild %x, got %x", NullBytes, marshaled) 1019 } 1020 1021 unmarshaled := RawValue{} 1022 if _, err := Unmarshal(NullBytes, &unmarshaled); err != nil { 1023 t.Fatal(err) 1024 } 1025 1026 unmarshaled.FullBytes = NullRawValue.FullBytes 1027 if len(unmarshaled.Bytes) == 0 { 1028 // DeepEqual considers a nil slice and an empty slice to be different. 1029 unmarshaled.Bytes = NullRawValue.Bytes 1030 } 1031 1032 if !reflect.DeepEqual(NullRawValue, unmarshaled) { 1033 t.Errorf("Expected Unmarshal of NullBytes to yield %v, got %v", NullRawValue, unmarshaled) 1034 } 1035 }