// Copyright 2023 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package x509 import ( "encoding/asn1" "math" "testing" ) func TestOID(t *testing.T) { var tests = []struct { raw []byte valid bool str string ints []uint64 }{ {[]byte{}, false, "", nil}, {[]byte{0x80, 0x01}, false, "", nil}, {[]byte{0x01, 0x80, 0x01}, false, "", nil}, {[]byte{1, 2, 3}, true, "0.1.2.3", []uint64{0, 1, 2, 3}}, {[]byte{41, 2, 3}, true, "1.1.2.3", []uint64{1, 1, 2, 3}}, {[]byte{86, 2, 3}, true, "2.6.2.3", []uint64{2, 6, 2, 3}}, {[]byte{41, 255, 255, 255, 127}, true, "1.1.268435455", []uint64{1, 1, 268435455}}, {[]byte{41, 0x87, 255, 255, 255, 127}, true, "1.1.2147483647", []uint64{1, 1, 2147483647}}, {[]byte{41, 255, 255, 255, 255, 127}, true, "1.1.34359738367", []uint64{1, 1, 34359738367}}, {[]byte{42, 255, 255, 255, 255, 255, 255, 255, 255, 127}, true, "1.2.9223372036854775807", []uint64{1, 2, 9223372036854775807}}, {[]byte{43, 0x81, 255, 255, 255, 255, 255, 255, 255, 255, 127}, true, "1.3.18446744073709551615", []uint64{1, 3, 18446744073709551615}}, {[]byte{44, 0x83, 255, 255, 255, 255, 255, 255, 255, 255, 127}, true, "1.4.36893488147419103231", nil}, {[]byte{85, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127}, true, "2.5.1180591620717411303423", nil}, {[]byte{85, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127}, true, "2.5.19342813113834066795298815", nil}, {[]byte{255, 255, 255, 127}, true, "2.268435375", []uint64{2, 268435375}}, {[]byte{0x87, 255, 255, 255, 127}, true, "2.2147483567", []uint64{2, 2147483567}}, {[]byte{255, 127}, true, "2.16303", []uint64{2, 16303}}, {[]byte{255, 255, 255, 255, 127}, true, "2.34359738287", []uint64{2, 34359738287}}, {[]byte{255, 255, 255, 255, 255, 255, 255, 255, 127}, true, "2.9223372036854775727", []uint64{2, 9223372036854775727}}, {[]byte{0x81, 255, 255, 255, 255, 255, 255, 255, 255, 127}, true, "2.18446744073709551535", []uint64{2, 18446744073709551535}}, {[]byte{0x83, 255, 255, 255, 255, 255, 255, 255, 255, 127}, true, "2.36893488147419103151", nil}, {[]byte{255, 255, 255, 255, 255, 255, 255, 255, 255, 127}, true, "2.1180591620717411303343", nil}, {[]byte{255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127}, true, "2.19342813113834066795298735", nil}, } for _, v := range tests { oid, ok := newOIDFromDER(v.raw) if ok != v.valid { if ok { t.Errorf("%v: unexpected success while parsing: %v", v.raw, oid) } else { t.Errorf("%v: unexpected failure while parsing", v.raw) } continue } if !ok { continue } if str := oid.String(); str != v.str { t.Errorf("%v: oid.String() = %v, want; %v", v.raw, str, v.str) } var asn1OID asn1.ObjectIdentifier for _, v := range v.ints { if v > math.MaxInt32 { asn1OID = nil break } asn1OID = append(asn1OID, int(v)) } o, ok := oid.toASN1OID() if shouldOk := asn1OID != nil; shouldOk != ok { if ok { t.Errorf("%v: oid.toASN1OID() unexpected success", v.raw) } else { t.Errorf("%v: oid.toASN1OID() unexpected fauilure", v.raw) } continue } if asn1OID != nil { if !o.Equal(asn1OID) { t.Errorf("%v: oid.toASN1OID(asn1OID).Equal(oid) = false, want: true", v.raw) } } if v.ints != nil { oid2, err := OIDFromInts(v.ints) if err != nil { t.Errorf("%v: OIDFromInts() unexpected error: %v", v.raw, err) } if !oid2.Equal(oid) { t.Errorf("%v: %#v.Equal(%#v) = false, want: true", v.raw, oid2, oid) } } } } func mustNewOIDFromInts(t *testing.T, ints []uint64) OID { oid, err := OIDFromInts(ints) if err != nil { t.Fatalf("OIDFromInts(%v) unexpected error: %v", ints, err) } return oid }