github.com/maenmax/kairep@v0.0.0-20210218001208-55bf3df36788/src/golang.org/x/crypto/openpgp/write_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 openpgp 6 7 import ( 8 "bytes" 9 "io" 10 "io/ioutil" 11 "testing" 12 "time" 13 14 "golang.org/x/crypto/openpgp/packet" 15 ) 16 17 func TestSignDetached(t *testing.T) { 18 kring, _ := ReadKeyRing(readerFromHex(testKeys1And2PrivateHex)) 19 out := bytes.NewBuffer(nil) 20 message := bytes.NewBufferString(signedInput) 21 err := DetachSign(out, kring[0], message, nil) 22 if err != nil { 23 t.Error(err) 24 } 25 26 testDetachedSignature(t, kring, out, signedInput, "check", testKey1KeyId) 27 } 28 29 func TestSignTextDetached(t *testing.T) { 30 kring, _ := ReadKeyRing(readerFromHex(testKeys1And2PrivateHex)) 31 out := bytes.NewBuffer(nil) 32 message := bytes.NewBufferString(signedInput) 33 err := DetachSignText(out, kring[0], message, nil) 34 if err != nil { 35 t.Error(err) 36 } 37 38 testDetachedSignature(t, kring, out, signedInput, "check", testKey1KeyId) 39 } 40 41 func TestSignDetachedDSA(t *testing.T) { 42 kring, _ := ReadKeyRing(readerFromHex(dsaTestKeyPrivateHex)) 43 out := bytes.NewBuffer(nil) 44 message := bytes.NewBufferString(signedInput) 45 err := DetachSign(out, kring[0], message, nil) 46 if err != nil { 47 t.Error(err) 48 } 49 50 testDetachedSignature(t, kring, out, signedInput, "check", testKey3KeyId) 51 } 52 53 func TestSignDetachedP256(t *testing.T) { 54 kring, _ := ReadKeyRing(readerFromHex(p256TestKeyPrivateHex)) 55 kring[0].PrivateKey.Decrypt([]byte("passphrase")) 56 57 out := bytes.NewBuffer(nil) 58 message := bytes.NewBufferString(signedInput) 59 err := DetachSign(out, kring[0], message, nil) 60 if err != nil { 61 t.Error(err) 62 } 63 64 testDetachedSignature(t, kring, out, signedInput, "check", testKeyP256KeyId) 65 } 66 67 func TestNewEntity(t *testing.T) { 68 if testing.Short() { 69 return 70 } 71 72 // Check bit-length with no config. 73 e, err := NewEntity("Test User", "test", "test@example.com", nil) 74 if err != nil { 75 t.Errorf("failed to create entity: %s", err) 76 return 77 } 78 bl, err := e.PrimaryKey.BitLength() 79 if err != nil { 80 t.Errorf("failed to find bit length: %s", err) 81 } 82 if int(bl) != defaultRSAKeyBits { 83 t.Errorf("BitLength %v, expected %v", defaultRSAKeyBits) 84 } 85 86 // Check bit-length with a config. 87 cfg := &packet.Config{RSABits: 1024} 88 e, err = NewEntity("Test User", "test", "test@example.com", cfg) 89 if err != nil { 90 t.Errorf("failed to create entity: %s", err) 91 return 92 } 93 bl, err = e.PrimaryKey.BitLength() 94 if err != nil { 95 t.Errorf("failed to find bit length: %s", err) 96 } 97 if int(bl) != cfg.RSABits { 98 t.Errorf("BitLength %v, expected %v", bl, cfg.RSABits) 99 } 100 101 w := bytes.NewBuffer(nil) 102 if err := e.SerializePrivate(w, nil); err != nil { 103 t.Errorf("failed to serialize entity: %s", err) 104 return 105 } 106 serialized := w.Bytes() 107 108 el, err := ReadKeyRing(w) 109 if err != nil { 110 t.Errorf("failed to reparse entity: %s", err) 111 return 112 } 113 114 if len(el) != 1 { 115 t.Errorf("wrong number of entities found, got %d, want 1", len(el)) 116 } 117 118 w = bytes.NewBuffer(nil) 119 if err := e.SerializePrivate(w, nil); err != nil { 120 t.Errorf("failed to serialize entity second time: %s", err) 121 return 122 } 123 124 if !bytes.Equal(w.Bytes(), serialized) { 125 t.Errorf("results differed") 126 } 127 } 128 129 func TestSymmetricEncryption(t *testing.T) { 130 buf := new(bytes.Buffer) 131 plaintext, err := SymmetricallyEncrypt(buf, []byte("testing"), nil, nil) 132 if err != nil { 133 t.Errorf("error writing headers: %s", err) 134 return 135 } 136 message := []byte("hello world\n") 137 _, err = plaintext.Write(message) 138 if err != nil { 139 t.Errorf("error writing to plaintext writer: %s", err) 140 } 141 err = plaintext.Close() 142 if err != nil { 143 t.Errorf("error closing plaintext writer: %s", err) 144 } 145 146 md, err := ReadMessage(buf, nil, func(keys []Key, symmetric bool) ([]byte, error) { 147 return []byte("testing"), nil 148 }, nil) 149 if err != nil { 150 t.Errorf("error rereading message: %s", err) 151 } 152 messageBuf := bytes.NewBuffer(nil) 153 _, err = io.Copy(messageBuf, md.UnverifiedBody) 154 if err != nil { 155 t.Errorf("error rereading message: %s", err) 156 } 157 if !bytes.Equal(message, messageBuf.Bytes()) { 158 t.Errorf("recovered message incorrect got '%s', want '%s'", messageBuf.Bytes(), message) 159 } 160 } 161 162 var testEncryptionTests = []struct { 163 keyRingHex string 164 isSigned bool 165 }{ 166 { 167 testKeys1And2PrivateHex, 168 false, 169 }, 170 { 171 testKeys1And2PrivateHex, 172 true, 173 }, 174 { 175 dsaElGamalTestKeysHex, 176 false, 177 }, 178 { 179 dsaElGamalTestKeysHex, 180 true, 181 }, 182 } 183 184 func TestEncryption(t *testing.T) { 185 for i, test := range testEncryptionTests { 186 kring, _ := ReadKeyRing(readerFromHex(test.keyRingHex)) 187 188 passphrase := []byte("passphrase") 189 for _, entity := range kring { 190 if entity.PrivateKey != nil && entity.PrivateKey.Encrypted { 191 err := entity.PrivateKey.Decrypt(passphrase) 192 if err != nil { 193 t.Errorf("#%d: failed to decrypt key", i) 194 } 195 } 196 for _, subkey := range entity.Subkeys { 197 if subkey.PrivateKey != nil && subkey.PrivateKey.Encrypted { 198 err := subkey.PrivateKey.Decrypt(passphrase) 199 if err != nil { 200 t.Errorf("#%d: failed to decrypt subkey", i) 201 } 202 } 203 } 204 } 205 206 var signed *Entity 207 if test.isSigned { 208 signed = kring[0] 209 } 210 211 buf := new(bytes.Buffer) 212 w, err := Encrypt(buf, kring[:1], signed, nil /* no hints */, nil) 213 if err != nil { 214 t.Errorf("#%d: error in Encrypt: %s", i, err) 215 continue 216 } 217 218 const message = "testing" 219 _, err = w.Write([]byte(message)) 220 if err != nil { 221 t.Errorf("#%d: error writing plaintext: %s", i, err) 222 continue 223 } 224 err = w.Close() 225 if err != nil { 226 t.Errorf("#%d: error closing WriteCloser: %s", i, err) 227 continue 228 } 229 230 md, err := ReadMessage(buf, kring, nil /* no prompt */, nil) 231 if err != nil { 232 t.Errorf("#%d: error reading message: %s", i, err) 233 continue 234 } 235 236 testTime, _ := time.Parse("2006-01-02", "2013-07-01") 237 if test.isSigned { 238 signKey, _ := kring[0].signingKey(testTime) 239 expectedKeyId := signKey.PublicKey.KeyId 240 if md.SignedByKeyId != expectedKeyId { 241 t.Errorf("#%d: message signed by wrong key id, got: %d, want: %d", i, *md.SignedBy, expectedKeyId) 242 } 243 if md.SignedBy == nil { 244 t.Errorf("#%d: failed to find the signing Entity", i) 245 } 246 } 247 248 plaintext, err := ioutil.ReadAll(md.UnverifiedBody) 249 if err != nil { 250 t.Errorf("#%d: error reading encrypted contents: %s", i, err) 251 continue 252 } 253 254 encryptKey, _ := kring[0].encryptionKey(testTime) 255 expectedKeyId := encryptKey.PublicKey.KeyId 256 if len(md.EncryptedToKeyIds) != 1 || md.EncryptedToKeyIds[0] != expectedKeyId { 257 t.Errorf("#%d: expected message to be encrypted to %v, but got %#v", i, expectedKeyId, md.EncryptedToKeyIds) 258 } 259 260 if string(plaintext) != message { 261 t.Errorf("#%d: got: %s, want: %s", i, string(plaintext), message) 262 } 263 264 if test.isSigned { 265 if md.SignatureError != nil { 266 t.Errorf("#%d: signature error: %s", i, md.SignatureError) 267 } 268 if md.Signature == nil { 269 t.Error("signature missing") 270 } 271 } 272 } 273 }