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  }