symmetrically_encrypted_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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. package packet
  5. import (
  6. "bytes"
  7. "code.google.com/p/go.crypto/openpgp/errors"
  8. "crypto/rand"
  9. "crypto/sha1"
  10. "encoding/hex"
  11. "io"
  12. "io/ioutil"
  13. "testing"
  14. )
  15. // TestReader wraps a []byte and returns reads of a specific length.
  16. type testReader struct {
  17. data []byte
  18. stride int
  19. }
  20. func (t *testReader) Read(buf []byte) (n int, err error) {
  21. n = t.stride
  22. if n > len(t.data) {
  23. n = len(t.data)
  24. }
  25. if n > len(buf) {
  26. n = len(buf)
  27. }
  28. copy(buf, t.data)
  29. t.data = t.data[n:]
  30. if len(t.data) == 0 {
  31. err = io.EOF
  32. }
  33. return
  34. }
  35. func testMDCReader(t *testing.T) {
  36. mdcPlaintext, _ := hex.DecodeString(mdcPlaintextHex)
  37. for stride := 1; stride < len(mdcPlaintext)/2; stride++ {
  38. r := &testReader{data: mdcPlaintext, stride: stride}
  39. mdcReader := &seMDCReader{in: r, h: sha1.New()}
  40. body, err := ioutil.ReadAll(mdcReader)
  41. if err != nil {
  42. t.Errorf("stride: %d, error: %s", stride, err)
  43. continue
  44. }
  45. if !bytes.Equal(body, mdcPlaintext[:len(mdcPlaintext)-22]) {
  46. t.Errorf("stride: %d: bad contents %x", stride, body)
  47. continue
  48. }
  49. err = mdcReader.Close()
  50. if err != nil {
  51. t.Errorf("stride: %d, error on Close: %s", stride, err)
  52. }
  53. }
  54. mdcPlaintext[15] ^= 80
  55. r := &testReader{data: mdcPlaintext, stride: 2}
  56. mdcReader := &seMDCReader{in: r, h: sha1.New()}
  57. _, err := ioutil.ReadAll(mdcReader)
  58. if err != nil {
  59. t.Errorf("corruption test, error: %s", err)
  60. return
  61. }
  62. err = mdcReader.Close()
  63. if err == nil {
  64. t.Error("corruption: no error")
  65. } else if _, ok := err.(*errors.SignatureError); !ok {
  66. t.Errorf("corruption: expected SignatureError, got: %s", err)
  67. }
  68. }
  69. const mdcPlaintextHex = "a302789c3b2d93c4e0eb9aba22283539b3203335af44a134afb800c849cb4c4de10200aff40b45d31432c80cb384299a0655966d6939dfdeed1dddf980"
  70. func TestSerialize(t *testing.T) {
  71. buf := bytes.NewBuffer(nil)
  72. c := CipherAES128
  73. key := make([]byte, c.KeySize())
  74. w, err := SerializeSymmetricallyEncrypted(buf, rand.Reader, c, key)
  75. if err != nil {
  76. t.Errorf("error from SerializeSymmetricallyEncrypted: %s", err)
  77. return
  78. }
  79. contents := []byte("hello world\n")
  80. w.Write(contents)
  81. w.Close()
  82. p, err := Read(buf)
  83. if err != nil {
  84. t.Errorf("error from Read: %s", err)
  85. return
  86. }
  87. se, ok := p.(*SymmetricallyEncrypted)
  88. if !ok {
  89. t.Errorf("didn't read a *SymmetricallyEncrypted")
  90. return
  91. }
  92. r, err := se.Decrypt(c, key)
  93. if err != nil {
  94. t.Errorf("error from Decrypt: %s", err)
  95. return
  96. }
  97. contentsCopy := bytes.NewBuffer(nil)
  98. _, err = io.Copy(contentsCopy, r)
  99. if err != nil {
  100. t.Errorf("error from io.Copy: %s", err)
  101. return
  102. }
  103. if !bytes.Equal(contentsCopy.Bytes(), contents) {
  104. t.Errorf("contents not equal got: %x want: %x", contentsCopy.Bytes(), contents)
  105. }
  106. }