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