github.com/maenmax/kairep@v0.0.0-20210218001208-55bf3df36788/src/golang.org/x/crypto/openpgp/packet/packet_test.go (about)

     1  // Copyright 2011 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 packet
     6  
     7  import (
     8  	"bytes"
     9  	"encoding/hex"
    10  	"fmt"
    11  	"golang.org/x/crypto/openpgp/errors"
    12  	"io"
    13  	"io/ioutil"
    14  	"testing"
    15  )
    16  
    17  func TestReadFull(t *testing.T) {
    18  	var out [4]byte
    19  
    20  	b := bytes.NewBufferString("foo")
    21  	n, err := readFull(b, out[:3])
    22  	if n != 3 || err != nil {
    23  		t.Errorf("full read failed n:%d err:%s", n, err)
    24  	}
    25  
    26  	b = bytes.NewBufferString("foo")
    27  	n, err = readFull(b, out[:4])
    28  	if n != 3 || err != io.ErrUnexpectedEOF {
    29  		t.Errorf("partial read failed n:%d err:%s", n, err)
    30  	}
    31  
    32  	b = bytes.NewBuffer(nil)
    33  	n, err = readFull(b, out[:3])
    34  	if n != 0 || err != io.ErrUnexpectedEOF {
    35  		t.Errorf("empty read failed n:%d err:%s", n, err)
    36  	}
    37  }
    38  
    39  func readerFromHex(s string) io.Reader {
    40  	data, err := hex.DecodeString(s)
    41  	if err != nil {
    42  		panic("readerFromHex: bad input")
    43  	}
    44  	return bytes.NewBuffer(data)
    45  }
    46  
    47  var readLengthTests = []struct {
    48  	hexInput  string
    49  	length    int64
    50  	isPartial bool
    51  	err       error
    52  }{
    53  	{"", 0, false, io.ErrUnexpectedEOF},
    54  	{"1f", 31, false, nil},
    55  	{"c0", 0, false, io.ErrUnexpectedEOF},
    56  	{"c101", 256 + 1 + 192, false, nil},
    57  	{"e0", 1, true, nil},
    58  	{"e1", 2, true, nil},
    59  	{"e2", 4, true, nil},
    60  	{"ff", 0, false, io.ErrUnexpectedEOF},
    61  	{"ff00", 0, false, io.ErrUnexpectedEOF},
    62  	{"ff0000", 0, false, io.ErrUnexpectedEOF},
    63  	{"ff000000", 0, false, io.ErrUnexpectedEOF},
    64  	{"ff00000000", 0, false, nil},
    65  	{"ff01020304", 16909060, false, nil},
    66  }
    67  
    68  func TestReadLength(t *testing.T) {
    69  	for i, test := range readLengthTests {
    70  		length, isPartial, err := readLength(readerFromHex(test.hexInput))
    71  		if test.err != nil {
    72  			if err != test.err {
    73  				t.Errorf("%d: expected different error got:%s want:%s", i, err, test.err)
    74  			}
    75  			continue
    76  		}
    77  		if err != nil {
    78  			t.Errorf("%d: unexpected error: %s", i, err)
    79  			continue
    80  		}
    81  		if length != test.length || isPartial != test.isPartial {
    82  			t.Errorf("%d: bad result got:(%d,%t) want:(%d,%t)", i, length, isPartial, test.length, test.isPartial)
    83  		}
    84  	}
    85  }
    86  
    87  var partialLengthReaderTests = []struct {
    88  	hexInput  string
    89  	err       error
    90  	hexOutput string
    91  }{
    92  	{"e0", io.ErrUnexpectedEOF, ""},
    93  	{"e001", io.ErrUnexpectedEOF, ""},
    94  	{"e0010102", nil, "0102"},
    95  	{"ff00000000", nil, ""},
    96  	{"e10102e1030400", nil, "01020304"},
    97  	{"e101", io.ErrUnexpectedEOF, ""},
    98  }
    99  
   100  func TestPartialLengthReader(t *testing.T) {
   101  	for i, test := range partialLengthReaderTests {
   102  		r := &partialLengthReader{readerFromHex(test.hexInput), 0, true}
   103  		out, err := ioutil.ReadAll(r)
   104  		if test.err != nil {
   105  			if err != test.err {
   106  				t.Errorf("%d: expected different error got:%s want:%s", i, err, test.err)
   107  			}
   108  			continue
   109  		}
   110  		if err != nil {
   111  			t.Errorf("%d: unexpected error: %s", i, err)
   112  			continue
   113  		}
   114  
   115  		got := fmt.Sprintf("%x", out)
   116  		if got != test.hexOutput {
   117  			t.Errorf("%d: got:%s want:%s", i, test.hexOutput, got)
   118  		}
   119  	}
   120  }
   121  
   122  var readHeaderTests = []struct {
   123  	hexInput        string
   124  	structuralError bool
   125  	unexpectedEOF   bool
   126  	tag             int
   127  	length          int64
   128  	hexOutput       string
   129  }{
   130  	{"", false, false, 0, 0, ""},
   131  	{"7f", true, false, 0, 0, ""},
   132  
   133  	// Old format headers
   134  	{"80", false, true, 0, 0, ""},
   135  	{"8001", false, true, 0, 1, ""},
   136  	{"800102", false, false, 0, 1, "02"},
   137  	{"81000102", false, false, 0, 1, "02"},
   138  	{"820000000102", false, false, 0, 1, "02"},
   139  	{"860000000102", false, false, 1, 1, "02"},
   140  	{"83010203", false, false, 0, -1, "010203"},
   141  
   142  	// New format headers
   143  	{"c0", false, true, 0, 0, ""},
   144  	{"c000", false, false, 0, 0, ""},
   145  	{"c00102", false, false, 0, 1, "02"},
   146  	{"c0020203", false, false, 0, 2, "0203"},
   147  	{"c00202", false, true, 0, 2, ""},
   148  	{"c3020203", false, false, 3, 2, "0203"},
   149  }
   150  
   151  func TestReadHeader(t *testing.T) {
   152  	for i, test := range readHeaderTests {
   153  		tag, length, contents, err := readHeader(readerFromHex(test.hexInput))
   154  		if test.structuralError {
   155  			if _, ok := err.(errors.StructuralError); ok {
   156  				continue
   157  			}
   158  			t.Errorf("%d: expected StructuralError, got:%s", i, err)
   159  			continue
   160  		}
   161  		if err != nil {
   162  			if len(test.hexInput) == 0 && err == io.EOF {
   163  				continue
   164  			}
   165  			if !test.unexpectedEOF || err != io.ErrUnexpectedEOF {
   166  				t.Errorf("%d: unexpected error from readHeader: %s", i, err)
   167  			}
   168  			continue
   169  		}
   170  		if int(tag) != test.tag || length != test.length {
   171  			t.Errorf("%d: got:(%d,%d) want:(%d,%d)", i, int(tag), length, test.tag, test.length)
   172  			continue
   173  		}
   174  
   175  		body, err := ioutil.ReadAll(contents)
   176  		if err != nil {
   177  			if !test.unexpectedEOF || err != io.ErrUnexpectedEOF {
   178  				t.Errorf("%d: unexpected error from contents: %s", i, err)
   179  			}
   180  			continue
   181  		}
   182  		if test.unexpectedEOF {
   183  			t.Errorf("%d: expected ErrUnexpectedEOF from contents but got no error", i)
   184  			continue
   185  		}
   186  		got := fmt.Sprintf("%x", body)
   187  		if got != test.hexOutput {
   188  			t.Errorf("%d: got:%s want:%s", i, got, test.hexOutput)
   189  		}
   190  	}
   191  }
   192  
   193  func TestSerializeHeader(t *testing.T) {
   194  	tag := packetTypePublicKey
   195  	lengths := []int{0, 1, 2, 64, 192, 193, 8000, 8384, 8385, 10000}
   196  
   197  	for _, length := range lengths {
   198  		buf := bytes.NewBuffer(nil)
   199  		serializeHeader(buf, tag, length)
   200  		tag2, length2, _, err := readHeader(buf)
   201  		if err != nil {
   202  			t.Errorf("length %d, err: %s", length, err)
   203  		}
   204  		if tag2 != tag {
   205  			t.Errorf("length %d, tag incorrect (got %d, want %d)", length, tag2, tag)
   206  		}
   207  		if int(length2) != length {
   208  			t.Errorf("length %d, length incorrect (got %d)", length, length2)
   209  		}
   210  	}
   211  }
   212  
   213  func TestPartialLengths(t *testing.T) {
   214  	buf := bytes.NewBuffer(nil)
   215  	w := new(partialLengthWriter)
   216  	w.w = noOpCloser{buf}
   217  
   218  	const maxChunkSize = 64
   219  
   220  	var b [maxChunkSize]byte
   221  	var n uint8
   222  	for l := 1; l <= maxChunkSize; l++ {
   223  		for i := 0; i < l; i++ {
   224  			b[i] = n
   225  			n++
   226  		}
   227  		m, err := w.Write(b[:l])
   228  		if m != l {
   229  			t.Errorf("short write got: %d want: %d", m, l)
   230  		}
   231  		if err != nil {
   232  			t.Errorf("error from write: %s", err)
   233  		}
   234  	}
   235  	w.Close()
   236  
   237  	want := (maxChunkSize * (maxChunkSize + 1)) / 2
   238  	copyBuf := bytes.NewBuffer(nil)
   239  	r := &partialLengthReader{buf, 0, true}
   240  	m, err := io.Copy(copyBuf, r)
   241  	if m != int64(want) {
   242  		t.Errorf("short copy got: %d want: %d", m, want)
   243  	}
   244  	if err != nil {
   245  		t.Errorf("error from copy: %s", err)
   246  	}
   247  
   248  	copyBytes := copyBuf.Bytes()
   249  	for i := 0; i < want; i++ {
   250  		if copyBytes[i] != uint8(i) {
   251  			t.Errorf("bad pattern in copy at %d", i)
   252  			break
   253  		}
   254  	}
   255  }