1 package openpgp
2
3 import (
4 "bytes"
5 "io/ioutil"
6 "strings"
7 "testing"
8
9 "github.com/ProtonMail/go-crypto/openpgp/armor"
10 "github.com/ProtonMail/go-crypto/openpgp/packet"
11 )
12
13 var foreignKeys = []string{
14 v5PrivKey,
15 }
16
17 func TestReadPrivateForeignV5Key(t *testing.T) {
18 for _, str := range foreignKeys {
19 kring, err := ReadArmoredKeyRing(strings.NewReader(str))
20 if err != nil {
21 t.Fatal(err)
22 }
23 checkV5Key(t, kring[0])
24 }
25 }
26
27
28 func testV5ForeignSignedMessage(t *testing.T) {
29 kring, err := ReadArmoredKeyRing(strings.NewReader(v5PrivKey))
30 if err != nil {
31 t.Fatal(err)
32 }
33 msg := strings.NewReader(v5PrivKeyMsg)
34
35 block, err := armor.Decode(msg)
36 if err != nil {
37 return
38 }
39 md, err := ReadMessage(block.Body, kring, nil, nil)
40 if md.SignedBy == nil {
41 t.Fatal("incorrect signer")
42 }
43 if err != nil {
44 t.Fatal(err)
45 }
46
47 body, err := ioutil.ReadAll(md.UnverifiedBody)
48 if err != nil {
49 t.Fatal(err)
50 }
51 if !bytes.Equal(body, []byte("test")) {
52 t.Fatal("bad body")
53 }
54 if md.SignatureError != nil {
55 t.Fatal(md.SignatureError)
56 }
57 if err != nil {
58 t.Fatal(err)
59 }
60 }
61
62 func TestReadPrivateEncryptedV5Key(t *testing.T) {
63 c := &packet.Config{V5Keys: true}
64 e, err := NewEntity("V5 Key Owner", "V5 Key", "v5@pm.me", c)
65 if err != nil {
66 t.Fatal(err)
67 }
68 password := []byte("test v5 key # password")
69
70 if err = e.PrivateKey.Encrypt(password); err != nil {
71 t.Fatal(err)
72 }
73
74 for _, sub := range e.Subkeys {
75 if err = sub.PrivateKey.Encrypt(password); err != nil {
76 t.Fatal(err)
77 }
78 }
79
80 serializedEntity := bytes.NewBuffer(nil)
81 err = e.SerializePrivateWithoutSigning(serializedEntity, nil)
82 if err != nil {
83 t.Fatal(err)
84 }
85 el, err := ReadKeyRing(serializedEntity)
86 if err != nil {
87 t.Fatal(err)
88 }
89
90
91 if el[0].PrivateKey == nil {
92 t.Fatal("No private key found")
93 }
94 if err = el[0].PrivateKey.Decrypt(password); err != nil {
95 t.Error(err)
96 }
97
98
99 for _, sub := range e.Subkeys {
100 if err = sub.PrivateKey.Decrypt(password); err != nil {
101 t.Error(err)
102 }
103 }
104
105 checkV5Key(t, el[0])
106 }
107
108 func TestReadPrivateSerializeForeignV5Key(t *testing.T) {
109 for _, str := range foreignKeys {
110 el, err := ReadArmoredKeyRing(strings.NewReader(str))
111 if err != nil {
112 t.Fatal(err)
113 }
114 checkSerializeRead(t, el[0])
115 }
116 }
117
118 func TestNewEntitySerializeV5Key(t *testing.T) {
119 c := &packet.Config{V5Keys: true}
120 e, err := NewEntity("V5 Key Owner", "V5 Key", "v5@pm.me", c)
121 if err != nil {
122 t.Fatal(err)
123 }
124 checkSerializeRead(t, e)
125 }
126
127 func TestNewEntityV5Key(t *testing.T) {
128 c := &packet.Config{
129 V5Keys: true,
130 }
131 e, err := NewEntity("V5 Key Owner", "V5 Key", "v5@pm.me", c)
132 if err != nil {
133 t.Fatal(err)
134 }
135 checkV5Key(t, e)
136 }
137
138 func checkV5Key(t *testing.T, ent *Entity) {
139 key := ent.PrimaryKey
140 if key.Version != 5 {
141 t.Errorf("wrong key version %d", key.Version)
142 }
143 if len(key.Fingerprint) != 32 {
144 t.Errorf("Wrong fingerprint length: %d", len(key.Fingerprint))
145 }
146 signatures := ent.Revocations
147 for _, id := range ent.Identities {
148 signatures = append(signatures, id.SelfSignature)
149 signatures = append(signatures, id.Signatures...)
150 }
151 for _, sig := range signatures {
152 if sig == nil {
153 continue
154 }
155 if sig.Version != 5 {
156 t.Errorf("wrong signature version %d", sig.Version)
157 }
158 fgptLen := len(sig.IssuerFingerprint)
159 if fgptLen != 32 {
160 t.Errorf("Wrong fingerprint length in signature: %d", fgptLen)
161 }
162 }
163 }
164
165 func checkSerializeRead(t *testing.T, e *Entity) {
166
167 serializedEntity := bytes.NewBuffer(nil)
168 err := e.Serialize(serializedEntity)
169 if err != nil {
170 t.Fatal(err)
171 }
172 el, err := ReadKeyRing(serializedEntity)
173 if err != nil {
174 t.Fatal(err)
175 }
176 checkV5Key(t, el[0])
177
178
179 serializedEntity = bytes.NewBuffer(nil)
180 err = e.SerializePrivateWithoutSigning(serializedEntity, nil)
181 if err != nil {
182 t.Fatal(err)
183 }
184 el, err = ReadKeyRing(serializedEntity)
185 if err != nil {
186 t.Fatal(err)
187 }
188 checkV5Key(t, el[0])
189
190
191 serializedEntity = bytes.NewBuffer(nil)
192 err = e.SerializePrivate(serializedEntity, nil)
193 if err != nil {
194 t.Fatal(err)
195 }
196 el, err = ReadKeyRing(serializedEntity)
197 if err != nil {
198 t.Fatal(err)
199 }
200 checkV5Key(t, el[0])
201 }
202
View as plain text