Source file src/encoding/asn1/asn1_test.go

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

View as plain text