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.
14 "golang.org/x/crypto/openpgp/packet"
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)
26 testDetachedSignature(t, kring, out, signedInput, "check", testKey1KeyId)
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)
38 testDetachedSignature(t, kring, out, signedInput, "check", testKey1KeyId)
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)
50 testDetachedSignature(t, kring, out, signedInput, "check", testKey3KeyId)
53 func TestSignDetachedP256(t *testing.T) {
54 kring, _ := ReadKeyRing(readerFromHex(p256TestKeyPrivateHex))
55 kring[0].PrivateKey.Decrypt([]byte("passphrase"))
57 out := bytes.NewBuffer(nil)
58 message := bytes.NewBufferString(signedInput)
59 err := DetachSign(out, kring[0], message, nil)
64 testDetachedSignature(t, kring, out, signedInput, "check", testKeyP256KeyId)
67 func TestNewEntity(t *testing.T) {
72 // Check bit-length with no config.
73 e, err := NewEntity("Test User", "test", "test@example.com", nil)
75 t.Errorf("failed to create entity: %s", err)
78 bl, err := e.PrimaryKey.BitLength()
80 t.Errorf("failed to find bit length: %s", err)
82 if int(bl) != defaultRSAKeyBits {
83 t.Errorf("BitLength %v, expected %v", int(bl), defaultRSAKeyBits)
86 // Check bit-length with a config.
87 cfg := &packet.Config{RSABits: 1024}
88 e, err = NewEntity("Test User", "test", "test@example.com", cfg)
90 t.Errorf("failed to create entity: %s", err)
93 bl, err = e.PrimaryKey.BitLength()
95 t.Errorf("failed to find bit length: %s", err)
97 if int(bl) != cfg.RSABits {
98 t.Errorf("BitLength %v, expected %v", bl, cfg.RSABits)
101 w := bytes.NewBuffer(nil)
102 if err := e.SerializePrivate(w, nil); err != nil {
103 t.Errorf("failed to serialize entity: %s", err)
106 serialized := w.Bytes()
108 el, err := ReadKeyRing(w)
110 t.Errorf("failed to reparse entity: %s", err)
115 t.Errorf("wrong number of entities found, got %d, want 1", len(el))
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)
124 if !bytes.Equal(w.Bytes(), serialized) {
125 t.Errorf("results differed")
129 func TestSymmetricEncryption(t *testing.T) {
130 buf := new(bytes.Buffer)
131 plaintext, err := SymmetricallyEncrypt(buf, []byte("testing"), nil, nil)
133 t.Errorf("error writing headers: %s", err)
136 message := []byte("hello world\n")
137 _, err = plaintext.Write(message)
139 t.Errorf("error writing to plaintext writer: %s", err)
141 err = plaintext.Close()
143 t.Errorf("error closing plaintext writer: %s", err)
146 md, err := ReadMessage(buf, nil, func(keys []Key, symmetric bool) ([]byte, error) {
147 return []byte("testing"), nil
150 t.Errorf("error rereading message: %s", err)
152 messageBuf := bytes.NewBuffer(nil)
153 _, err = io.Copy(messageBuf, md.UnverifiedBody)
155 t.Errorf("error rereading message: %s", err)
157 if !bytes.Equal(message, messageBuf.Bytes()) {
158 t.Errorf("recovered message incorrect got '%s', want '%s'", messageBuf.Bytes(), message)
162 var testEncryptionTests = []struct {
167 testKeys1And2PrivateHex,
171 testKeys1And2PrivateHex,
175 dsaElGamalTestKeysHex,
179 dsaElGamalTestKeysHex,
184 func TestEncryption(t *testing.T) {
185 for i, test := range testEncryptionTests {
186 kring, _ := ReadKeyRing(readerFromHex(test.keyRingHex))
188 passphrase := []byte("passphrase")
189 for _, entity := range kring {
190 if entity.PrivateKey != nil && entity.PrivateKey.Encrypted {
191 err := entity.PrivateKey.Decrypt(passphrase)
193 t.Errorf("#%d: failed to decrypt key", i)
196 for _, subkey := range entity.Subkeys {
197 if subkey.PrivateKey != nil && subkey.PrivateKey.Encrypted {
198 err := subkey.PrivateKey.Decrypt(passphrase)
200 t.Errorf("#%d: failed to decrypt subkey", i)
211 buf := new(bytes.Buffer)
212 w, err := Encrypt(buf, kring[:1], signed, nil /* no hints */, nil)
214 t.Errorf("#%d: error in Encrypt: %s", i, err)
218 const message = "testing"
219 _, err = w.Write([]byte(message))
221 t.Errorf("#%d: error writing plaintext: %s", i, err)
226 t.Errorf("#%d: error closing WriteCloser: %s", i, err)
230 md, err := ReadMessage(buf, kring, nil /* no prompt */, nil)
232 t.Errorf("#%d: error reading message: %s", i, err)
236 testTime, _ := time.Parse("2006-01-02", "2013-07-01")
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: %v, want: %v", i, *md.SignedBy, expectedKeyId)
243 if md.SignedBy == nil {
244 t.Errorf("#%d: failed to find the signing Entity", i)
248 plaintext, err := ioutil.ReadAll(md.UnverifiedBody)
250 t.Errorf("#%d: error reading encrypted contents: %s", i, err)
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)
260 if string(plaintext) != message {
261 t.Errorf("#%d: got: %s, want: %s", i, string(plaintext), message)
265 if md.SignatureError != nil {
266 t.Errorf("#%d: signature error: %s", i, md.SignatureError)
268 if md.Signature == nil {
269 t.Error("signature missing")