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  }