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

     1  // Copyright 2012 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 clearsign
     6  
     7  import (
     8  	"bytes"
     9  	"golang.org/x/crypto/openpgp"
    10  	"testing"
    11  )
    12  
    13  func testParse(t *testing.T, input []byte, expected, expectedPlaintext string) {
    14  	b, rest := Decode(input)
    15  	if b == nil {
    16  		t.Fatal("failed to decode clearsign message")
    17  	}
    18  	if !bytes.Equal(rest, []byte("trailing")) {
    19  		t.Errorf("unexpected remaining bytes returned: %s", string(rest))
    20  	}
    21  	if b.ArmoredSignature.Type != "PGP SIGNATURE" {
    22  		t.Errorf("bad armor type, got:%s, want:PGP SIGNATURE", b.ArmoredSignature.Type)
    23  	}
    24  	if !bytes.Equal(b.Bytes, []byte(expected)) {
    25  		t.Errorf("bad body, got:%x want:%x", b.Bytes, expected)
    26  	}
    27  
    28  	if !bytes.Equal(b.Plaintext, []byte(expectedPlaintext)) {
    29  		t.Errorf("bad plaintext, got:%x want:%x", b.Plaintext, expectedPlaintext)
    30  	}
    31  
    32  	keyring, err := openpgp.ReadArmoredKeyRing(bytes.NewBufferString(signingKey))
    33  	if err != nil {
    34  		t.Errorf("failed to parse public key: %s", err)
    35  	}
    36  
    37  	if _, err := openpgp.CheckDetachedSignature(keyring, bytes.NewBuffer(b.Bytes), b.ArmoredSignature.Body); err != nil {
    38  		t.Errorf("failed to check signature: %s", err)
    39  	}
    40  }
    41  
    42  func TestParse(t *testing.T) {
    43  	testParse(t, clearsignInput, "Hello world\r\nline 2", "Hello world\nline 2\n")
    44  	testParse(t, clearsignInput2, "\r\n\r\n(This message has a couple of blank lines at the start and end.)\r\n\r\n", "\n\n(This message has a couple of blank lines at the start and end.)\n\n\n")
    45  }
    46  
    47  func TestParseInvalid(t *testing.T) {
    48  	if b, _ := Decode(clearsignInput3); b != nil {
    49  		t.Fatal("decoded a bad clearsigned message without any error")
    50  	}
    51  }
    52  
    53  func TestParseWithNoNewlineAtEnd(t *testing.T) {
    54  	input := clearsignInput
    55  	input = input[:len(input)-len("trailing")-1]
    56  	b, rest := Decode(input)
    57  	if b == nil {
    58  		t.Fatal("failed to decode clearsign message")
    59  	}
    60  	if len(rest) > 0 {
    61  		t.Errorf("unexpected remaining bytes returned: %s", string(rest))
    62  	}
    63  }
    64  
    65  var signingTests = []struct {
    66  	in, signed, plaintext string
    67  }{
    68  	{"", "", ""},
    69  	{"a", "a", "a\n"},
    70  	{"a\n", "a", "a\n"},
    71  	{"-a\n", "-a", "-a\n"},
    72  	{"--a\nb", "--a\r\nb", "--a\nb\n"},
    73  	// leading whitespace
    74  	{" a\n", " a", " a\n"},
    75  	{"  a\n", "  a", "  a\n"},
    76  	// trailing whitespace (should be stripped)
    77  	{"a \n", "a", "a\n"},
    78  	{"a ", "a", "a\n"},
    79  	// whitespace-only lines (should be stripped)
    80  	{"  \n", "", "\n"},
    81  	{"  ", "", "\n"},
    82  	{"a\n  \n  \nb\n", "a\r\n\r\n\r\nb", "a\n\n\nb\n"},
    83  }
    84  
    85  func TestSigning(t *testing.T) {
    86  	keyring, err := openpgp.ReadArmoredKeyRing(bytes.NewBufferString(signingKey))
    87  	if err != nil {
    88  		t.Errorf("failed to parse public key: %s", err)
    89  	}
    90  
    91  	for i, test := range signingTests {
    92  		var buf bytes.Buffer
    93  
    94  		plaintext, err := Encode(&buf, keyring[0].PrivateKey, nil)
    95  		if err != nil {
    96  			t.Errorf("#%d: error from Encode: %s", i, err)
    97  			continue
    98  		}
    99  		if _, err := plaintext.Write([]byte(test.in)); err != nil {
   100  			t.Errorf("#%d: error from Write: %s", i, err)
   101  			continue
   102  		}
   103  		if err := plaintext.Close(); err != nil {
   104  			t.Fatalf("#%d: error from Close: %s", i, err)
   105  			continue
   106  		}
   107  
   108  		b, _ := Decode(buf.Bytes())
   109  		if b == nil {
   110  			t.Errorf("#%d: failed to decode clearsign message", i)
   111  			continue
   112  		}
   113  		if !bytes.Equal(b.Bytes, []byte(test.signed)) {
   114  			t.Errorf("#%d: bad result, got:%x, want:%x", i, b.Bytes, test.signed)
   115  			continue
   116  		}
   117  		if !bytes.Equal(b.Plaintext, []byte(test.plaintext)) {
   118  			t.Errorf("#%d: bad result, got:%x, want:%x", i, b.Plaintext, test.plaintext)
   119  			continue
   120  		}
   121  
   122  		if _, err := openpgp.CheckDetachedSignature(keyring, bytes.NewBuffer(b.Bytes), b.ArmoredSignature.Body); err != nil {
   123  			t.Errorf("#%d: failed to check signature: %s", i, err)
   124  		}
   125  	}
   126  }
   127  
   128  var clearsignInput = []byte(`
   129  ;lasjlkfdsa
   130  
   131  -----BEGIN PGP SIGNED MESSAGE-----
   132  Hash: SHA1
   133  
   134  Hello world
   135  line 2
   136  -----BEGIN PGP SIGNATURE-----
   137  Version: GnuPG v1.4.10 (GNU/Linux)
   138  
   139  iJwEAQECAAYFAk8kMuEACgkQO9o98PRieSpMsAQAhmY/vwmNpflrPgmfWsYhk5O8
   140  pjnBUzZwqTDoDeINjZEoPDSpQAHGhjFjgaDx/Gj4fAl0dM4D0wuUEBb6QOrwflog
   141  2A2k9kfSOMOtk0IH/H5VuFN1Mie9L/erYXjTQIptv9t9J7NoRBMU0QOOaFU0JaO9
   142  MyTpno24AjIAGb+mH1U=
   143  =hIJ6
   144  -----END PGP SIGNATURE-----
   145  trailing`)
   146  
   147  var clearsignInput2 = []byte(`
   148  asdlfkjasdlkfjsadf
   149  
   150  -----BEGIN PGP SIGNED MESSAGE-----
   151  Hash: SHA256
   152  
   153  
   154  
   155  (This message has a couple of blank lines at the start and end.)
   156  
   157  
   158  -----BEGIN PGP SIGNATURE-----
   159  Version: GnuPG v1.4.11 (GNU/Linux)
   160  
   161  iJwEAQEIAAYFAlPpSREACgkQO9o98PRieSpZTAP+M8QUoCt/7Rf3YbXPcdzIL32v
   162  pt1I+cMNeopzfLy0u4ioEFi8s5VkwpL1AFmirvgViCwlf82inoRxzZRiW05JQ5LI
   163  ESEzeCoy2LIdRCQ2hcrG8pIUPzUO4TqO5D/dMbdHwNH4h5nNmGJUAEG6FpURlPm+
   164  qZg6BaTvOxepqOxnhVU=
   165  =e+C6
   166  -----END PGP SIGNATURE-----
   167  
   168  trailing`)
   169  
   170  var clearsignInput3 = []byte(`
   171  -----BEGIN PGP SIGNED MESSAGE-----
   172  Hash: SHA256
   173  
   174  (This message was truncated.)
   175  `)
   176  
   177  var signingKey = `-----BEGIN PGP PRIVATE KEY BLOCK-----
   178  Version: GnuPG v1.4.10 (GNU/Linux)
   179  
   180  lQHYBE2rFNoBBADFwqWQIW/DSqcB4yCQqnAFTJ27qS5AnB46ccAdw3u4Greeu3Bp
   181  idpoHdjULy7zSKlwR1EA873dO/k/e11Ml3dlAFUinWeejWaK2ugFP6JjiieSsrKn
   182  vWNicdCS4HTWn0X4sjl0ZiAygw6GNhqEQ3cpLeL0g8E9hnYzJKQ0LWJa0QARAQAB
   183  AAP/TB81EIo2VYNmTq0pK1ZXwUpxCrvAAIG3hwKjEzHcbQznsjNvPUihZ+NZQ6+X
   184  0HCfPAdPkGDCLCb6NavcSW+iNnLTrdDnSI6+3BbIONqWWdRDYJhqZCkqmG6zqSfL
   185  IdkJgCw94taUg5BWP/AAeQrhzjChvpMQTVKQL5mnuZbUCeMCAN5qrYMP2S9iKdnk
   186  VANIFj7656ARKt/nf4CBzxcpHTyB8+d2CtPDKCmlJP6vL8t58Jmih+kHJMvC0dzn
   187  gr5f5+sCAOOe5gt9e0am7AvQWhdbHVfJU0TQJx+m2OiCJAqGTB1nvtBLHdJnfdC9
   188  TnXXQ6ZXibqLyBies/xeY2sCKL5qtTMCAKnX9+9d/5yQxRyrQUHt1NYhaXZnJbHx
   189  q4ytu0eWz+5i68IYUSK69jJ1NWPM0T6SkqpB3KCAIv68VFm9PxqG1KmhSrQIVGVz
   190  dCBLZXmIuAQTAQIAIgUCTasU2gIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AA
   191  CgkQO9o98PRieSoLhgQAkLEZex02Qt7vGhZzMwuN0R22w3VwyYyjBx+fM3JFETy1
   192  ut4xcLJoJfIaF5ZS38UplgakHG0FQ+b49i8dMij0aZmDqGxrew1m4kBfjXw9B/v+
   193  eIqpODryb6cOSwyQFH0lQkXC040pjq9YqDsO5w0WYNXYKDnzRV0p4H1pweo2VDid
   194  AdgETasU2gEEAN46UPeWRqKHvA99arOxee38fBt2CI08iiWyI8T3J6ivtFGixSqV
   195  bRcPxYO/qLpVe5l84Nb3X71GfVXlc9hyv7CD6tcowL59hg1E/DC5ydI8K8iEpUmK
   196  /UnHdIY5h8/kqgGxkY/T/hgp5fRQgW1ZoZxLajVlMRZ8W4tFtT0DeA+JABEBAAEA
   197  A/0bE1jaaZKj6ndqcw86jd+QtD1SF+Cf21CWRNeLKnUds4FRRvclzTyUMuWPkUeX
   198  TaNNsUOFqBsf6QQ2oHUBBK4VCHffHCW4ZEX2cd6umz7mpHW6XzN4DECEzOVksXtc
   199  lUC1j4UB91DC/RNQqwX1IV2QLSwssVotPMPqhOi0ZLNY7wIA3n7DWKInxYZZ4K+6
   200  rQ+POsz6brEoRHwr8x6XlHenq1Oki855pSa1yXIARoTrSJkBtn5oI+f8AzrnN0BN
   201  oyeQAwIA/7E++3HDi5aweWrViiul9cd3rcsS0dEnksPhvS0ozCJiHsq/6GFmy7J8
   202  QSHZPteedBnZyNp5jR+H7cIfVN3KgwH/Skq4PsuPhDq5TKK6i8Pc1WW8MA6DXTdU
   203  nLkX7RGmMwjC0DBf7KWAlPjFaONAX3a8ndnz//fy1q7u2l9AZwrj1qa1iJ8EGAEC
   204  AAkFAk2rFNoCGwwACgkQO9o98PRieSo2/QP/WTzr4ioINVsvN1akKuekmEMI3LAp
   205  BfHwatufxxP1U+3Si/6YIk7kuPB9Hs+pRqCXzbvPRrI8NHZBmc8qIGthishdCYad
   206  AHcVnXjtxrULkQFGbGvhKURLvS9WnzD/m1K2zzwxzkPTzT9/Yf06O6Mal5AdugPL
   207  VrM0m72/jnpKo04=
   208  =zNCn
   209  -----END PGP PRIVATE KEY BLOCK-----
   210  `