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