github.com/devops-filetransfer/sshego@v7.0.4+incompatible/_vendor/golang.org/x/crypto/cryptobyte/cryptobyte_test.go (about)

     1  // Copyright 2017 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 cryptobyte
     6  
     7  import (
     8  	"bytes"
     9  	"fmt"
    10  	"testing"
    11  )
    12  
    13  func builderBytesEq(b *Builder, want ...byte) error {
    14  	got := b.BytesOrPanic()
    15  	if !bytes.Equal(got, want) {
    16  		return fmt.Errorf("Bytes() = %v, want %v", got, want)
    17  	}
    18  	return nil
    19  }
    20  
    21  func TestBytes(t *testing.T) {
    22  	var b Builder
    23  	v := []byte("foobarbaz")
    24  	b.AddBytes(v[0:3])
    25  	b.AddBytes(v[3:4])
    26  	b.AddBytes(v[4:9])
    27  	if err := builderBytesEq(&b, v...); err != nil {
    28  		t.Error(err)
    29  	}
    30  	s := String(b.BytesOrPanic())
    31  	for _, w := range []string{"foo", "bar", "baz"} {
    32  		var got []byte
    33  		if !s.ReadBytes(&got, 3) {
    34  			t.Errorf("ReadBytes() = false, want true (w = %v)", w)
    35  		}
    36  		want := []byte(w)
    37  		if !bytes.Equal(got, want) {
    38  			t.Errorf("ReadBytes(): got = %v, want %v", got, want)
    39  		}
    40  	}
    41  	if len(s) != 0 {
    42  		t.Errorf("len(s) = %d, want 0", len(s))
    43  	}
    44  }
    45  
    46  func TestUint8(t *testing.T) {
    47  	var b Builder
    48  	b.AddUint8(42)
    49  	if err := builderBytesEq(&b, 42); err != nil {
    50  		t.Error(err)
    51  	}
    52  
    53  	var s String = b.BytesOrPanic()
    54  	var v uint8
    55  	if !s.ReadUint8(&v) {
    56  		t.Error("ReadUint8() = false, want true")
    57  	}
    58  	if v != 42 {
    59  		t.Errorf("v = %d, want 42", v)
    60  	}
    61  	if len(s) != 0 {
    62  		t.Errorf("len(s) = %d, want 0", len(s))
    63  	}
    64  }
    65  
    66  func TestUint16(t *testing.T) {
    67  	var b Builder
    68  	b.AddUint16(65534)
    69  	if err := builderBytesEq(&b, 255, 254); err != nil {
    70  		t.Error(err)
    71  	}
    72  	var s String = b.BytesOrPanic()
    73  	var v uint16
    74  	if !s.ReadUint16(&v) {
    75  		t.Error("ReadUint16() == false, want true")
    76  	}
    77  	if v != 65534 {
    78  		t.Errorf("v = %d, want 65534", v)
    79  	}
    80  	if len(s) != 0 {
    81  		t.Errorf("len(s) = %d, want 0", len(s))
    82  	}
    83  }
    84  
    85  func TestUint24(t *testing.T) {
    86  	var b Builder
    87  	b.AddUint24(0xfffefd)
    88  	if err := builderBytesEq(&b, 255, 254, 253); err != nil {
    89  		t.Error(err)
    90  	}
    91  
    92  	var s String = b.BytesOrPanic()
    93  	var v uint32
    94  	if !s.ReadUint24(&v) {
    95  		t.Error("ReadUint8() = false, want true")
    96  	}
    97  	if v != 0xfffefd {
    98  		t.Errorf("v = %d, want fffefd", v)
    99  	}
   100  	if len(s) != 0 {
   101  		t.Errorf("len(s) = %d, want 0", len(s))
   102  	}
   103  }
   104  
   105  func TestUint24Truncation(t *testing.T) {
   106  	var b Builder
   107  	b.AddUint24(0x10111213)
   108  	if err := builderBytesEq(&b, 0x11, 0x12, 0x13); err != nil {
   109  		t.Error(err)
   110  	}
   111  }
   112  
   113  func TestUint32(t *testing.T) {
   114  	var b Builder
   115  	b.AddUint32(0xfffefdfc)
   116  	if err := builderBytesEq(&b, 255, 254, 253, 252); err != nil {
   117  		t.Error(err)
   118  	}
   119  
   120  	var s String = b.BytesOrPanic()
   121  	var v uint32
   122  	if !s.ReadUint32(&v) {
   123  		t.Error("ReadUint8() = false, want true")
   124  	}
   125  	if v != 0xfffefdfc {
   126  		t.Errorf("v = %x, want fffefdfc", v)
   127  	}
   128  	if len(s) != 0 {
   129  		t.Errorf("len(s) = %d, want 0", len(s))
   130  	}
   131  }
   132  
   133  func TestUMultiple(t *testing.T) {
   134  	var b Builder
   135  	b.AddUint8(23)
   136  	b.AddUint32(0xfffefdfc)
   137  	b.AddUint16(42)
   138  	if err := builderBytesEq(&b, 23, 255, 254, 253, 252, 0, 42); err != nil {
   139  		t.Error(err)
   140  	}
   141  
   142  	var s String = b.BytesOrPanic()
   143  	var (
   144  		x uint8
   145  		y uint32
   146  		z uint16
   147  	)
   148  	if !s.ReadUint8(&x) || !s.ReadUint32(&y) || !s.ReadUint16(&z) {
   149  		t.Error("ReadUint8() = false, want true")
   150  	}
   151  	if x != 23 || y != 0xfffefdfc || z != 42 {
   152  		t.Errorf("x, y, z = %d, %d, %d; want 23, 4294901244, 5", x, y, z)
   153  	}
   154  	if len(s) != 0 {
   155  		t.Errorf("len(s) = %d, want 0", len(s))
   156  	}
   157  }
   158  
   159  func TestUint8LengthPrefixedSimple(t *testing.T) {
   160  	var b Builder
   161  	b.AddUint8LengthPrefixed(func(c *Builder) {
   162  		c.AddUint8(23)
   163  		c.AddUint8(42)
   164  	})
   165  	if err := builderBytesEq(&b, 2, 23, 42); err != nil {
   166  		t.Error(err)
   167  	}
   168  
   169  	var base, child String = b.BytesOrPanic(), nil
   170  	var x, y uint8
   171  	if !base.ReadUint8LengthPrefixed(&child) || !child.ReadUint8(&x) ||
   172  		!child.ReadUint8(&y) {
   173  		t.Error("parsing failed")
   174  	}
   175  	if x != 23 || y != 42 {
   176  		t.Errorf("want x, y == 23, 42; got %d, %d", x, y)
   177  	}
   178  	if len(base) != 0 {
   179  		t.Errorf("len(base) = %d, want 0", len(base))
   180  	}
   181  	if len(child) != 0 {
   182  		t.Errorf("len(child) = %d, want 0", len(child))
   183  	}
   184  }
   185  
   186  func TestUint8LengthPrefixedMulti(t *testing.T) {
   187  	var b Builder
   188  	b.AddUint8LengthPrefixed(func(c *Builder) {
   189  		c.AddUint8(23)
   190  		c.AddUint8(42)
   191  	})
   192  	b.AddUint8(5)
   193  	b.AddUint8LengthPrefixed(func(c *Builder) {
   194  		c.AddUint8(123)
   195  		c.AddUint8(234)
   196  	})
   197  	if err := builderBytesEq(&b, 2, 23, 42, 5, 2, 123, 234); err != nil {
   198  		t.Error(err)
   199  	}
   200  
   201  	var s, child String = b.BytesOrPanic(), nil
   202  	var u, v, w, x, y uint8
   203  	if !s.ReadUint8LengthPrefixed(&child) || !child.ReadUint8(&u) || !child.ReadUint8(&v) ||
   204  		!s.ReadUint8(&w) || !s.ReadUint8LengthPrefixed(&child) || !child.ReadUint8(&x) || !child.ReadUint8(&y) {
   205  		t.Error("parsing failed")
   206  	}
   207  	if u != 23 || v != 42 || w != 5 || x != 123 || y != 234 {
   208  		t.Errorf("u, v, w, x, y = %d, %d, %d, %d, %d; want 23, 42, 5, 123, 234",
   209  			u, v, w, x, y)
   210  	}
   211  	if len(s) != 0 {
   212  		t.Errorf("len(s) = %d, want 0", len(s))
   213  	}
   214  	if len(child) != 0 {
   215  		t.Errorf("len(child) = %d, want 0", len(child))
   216  	}
   217  }
   218  
   219  func TestUint8LengthPrefixedNested(t *testing.T) {
   220  	var b Builder
   221  	b.AddUint8LengthPrefixed(func(c *Builder) {
   222  		c.AddUint8(5)
   223  		c.AddUint8LengthPrefixed(func(d *Builder) {
   224  			d.AddUint8(23)
   225  			d.AddUint8(42)
   226  		})
   227  		c.AddUint8(123)
   228  	})
   229  	if err := builderBytesEq(&b, 5, 5, 2, 23, 42, 123); err != nil {
   230  		t.Error(err)
   231  	}
   232  
   233  	var base, child1, child2 String = b.BytesOrPanic(), nil, nil
   234  	var u, v, w, x uint8
   235  	if !base.ReadUint8LengthPrefixed(&child1) {
   236  		t.Error("parsing base failed")
   237  	}
   238  	if !child1.ReadUint8(&u) || !child1.ReadUint8LengthPrefixed(&child2) || !child1.ReadUint8(&x) {
   239  		t.Error("parsing child1 failed")
   240  	}
   241  	if !child2.ReadUint8(&v) || !child2.ReadUint8(&w) {
   242  		t.Error("parsing child2 failed")
   243  	}
   244  	if u != 5 || v != 23 || w != 42 || x != 123 {
   245  		t.Errorf("u, v, w, x = %d, %d, %d, %d, want 5, 23, 42, 123",
   246  			u, v, w, x)
   247  	}
   248  	if len(base) != 0 {
   249  		t.Errorf("len(base) = %d, want 0", len(base))
   250  	}
   251  	if len(child1) != 0 {
   252  		t.Errorf("len(child1) = %d, want 0", len(child1))
   253  	}
   254  	if len(base) != 0 {
   255  		t.Errorf("len(child2) = %d, want 0", len(child2))
   256  	}
   257  }
   258  
   259  func TestPreallocatedBuffer(t *testing.T) {
   260  	var buf [5]byte
   261  	b := NewBuilder(buf[0:0])
   262  	b.AddUint8(1)
   263  	b.AddUint8LengthPrefixed(func(c *Builder) {
   264  		c.AddUint8(3)
   265  		c.AddUint8(4)
   266  	})
   267  	b.AddUint16(1286) // Outgrow buf by one byte.
   268  	want := []byte{1, 2, 3, 4, 0}
   269  	if !bytes.Equal(buf[:], want) {
   270  		t.Errorf("buf = %v want %v", buf, want)
   271  	}
   272  	if err := builderBytesEq(b, 1, 2, 3, 4, 5, 6); err != nil {
   273  		t.Error(err)
   274  	}
   275  }
   276  
   277  func TestWriteWithPendingChild(t *testing.T) {
   278  	var b Builder
   279  	b.AddUint8LengthPrefixed(func(c *Builder) {
   280  		c.AddUint8LengthPrefixed(func(d *Builder) {
   281  			defer func() {
   282  				if recover() == nil {
   283  					t.Errorf("recover() = nil, want error; c.AddUint8() did not panic")
   284  				}
   285  			}()
   286  			c.AddUint8(2) // panics
   287  
   288  			defer func() {
   289  				if recover() == nil {
   290  					t.Errorf("recover() = nil, want error; b.AddUint8() did not panic")
   291  				}
   292  			}()
   293  			b.AddUint8(2) // panics
   294  		})
   295  
   296  		defer func() {
   297  			if recover() == nil {
   298  				t.Errorf("recover() = nil, want error; b.AddUint8() did not panic")
   299  			}
   300  		}()
   301  		b.AddUint8(2) // panics
   302  	})
   303  }
   304  
   305  // ASN.1
   306  
   307  func TestASN1Int64(t *testing.T) {
   308  	tests := []struct {
   309  		in   int64
   310  		want []byte
   311  	}{
   312  		{-0x800000, []byte{2, 3, 128, 0, 0}},
   313  		{-256, []byte{2, 2, 255, 0}},
   314  		{-129, []byte{2, 2, 255, 127}},
   315  		{-128, []byte{2, 1, 128}},
   316  		{-1, []byte{2, 1, 255}},
   317  		{0, []byte{2, 1, 0}},
   318  		{1, []byte{2, 1, 1}},
   319  		{2, []byte{2, 1, 2}},
   320  		{127, []byte{2, 1, 127}},
   321  		{128, []byte{2, 2, 0, 128}},
   322  		{256, []byte{2, 2, 1, 0}},
   323  		{0x800000, []byte{2, 4, 0, 128, 0, 0}},
   324  	}
   325  	for i, tt := range tests {
   326  		var b Builder
   327  		b.AddASN1Int64(tt.in)
   328  		if err := builderBytesEq(&b, tt.want...); err != nil {
   329  			t.Errorf("%v, (i = %d; in = %v)", err, i, tt.in)
   330  		}
   331  
   332  		var n int64
   333  		s := String(b.BytesOrPanic())
   334  		ok := s.ReadASN1Integer(&n)
   335  		if !ok || n != tt.in {
   336  			t.Errorf("s.ReadASN1Integer(&n) = %v, n = %d; want true, n = %d (i = %d)",
   337  				ok, n, tt.in, i)
   338  		}
   339  		if len(s) != 0 {
   340  			t.Errorf("len(s) = %d, want 0", len(s))
   341  		}
   342  	}
   343  }
   344  
   345  func TestASN1Uint64(t *testing.T) {
   346  	tests := []struct {
   347  		in   uint64
   348  		want []byte
   349  	}{
   350  		{0, []byte{2, 1, 0}},
   351  		{1, []byte{2, 1, 1}},
   352  		{2, []byte{2, 1, 2}},
   353  		{127, []byte{2, 1, 127}},
   354  		{128, []byte{2, 2, 0, 128}},
   355  		{256, []byte{2, 2, 1, 0}},
   356  		{0x800000, []byte{2, 4, 0, 128, 0, 0}},
   357  		{0x7fffffffffffffff, []byte{2, 8, 127, 255, 255, 255, 255, 255, 255, 255}},
   358  		{0x8000000000000000, []byte{2, 9, 0, 128, 0, 0, 0, 0, 0, 0, 0}},
   359  		{0xffffffffffffffff, []byte{2, 9, 0, 255, 255, 255, 255, 255, 255, 255, 255}},
   360  	}
   361  	for i, tt := range tests {
   362  		var b Builder
   363  		b.AddASN1Uint64(tt.in)
   364  		if err := builderBytesEq(&b, tt.want...); err != nil {
   365  			t.Errorf("%v, (i = %d; in = %v)", err, i, tt.in)
   366  		}
   367  
   368  		var n uint64
   369  		s := String(b.BytesOrPanic())
   370  		ok := s.ReadASN1Integer(&n)
   371  		if !ok || n != tt.in {
   372  			t.Errorf("s.ReadASN1Integer(&n) = %v, n = %d; want true, n = %d (i = %d)",
   373  				ok, n, tt.in, i)
   374  		}
   375  		if len(s) != 0 {
   376  			t.Errorf("len(s) = %d, want 0", len(s))
   377  		}
   378  	}
   379  }