@@ -12,6 +12,7 @@ import (
12
12
mathrand "math/rand"
13
13
"testing"
14
14
15
+ "github.com/ProtonMail/go-crypto/openpgp/errors"
15
16
"github.com/ProtonMail/go-crypto/openpgp/s2k"
16
17
)
17
18
@@ -20,25 +21,12 @@ const maxPassLen = 64
20
21
// Tests against RFC vectors
21
22
func TestDecryptSymmetricKeyAndEncryptedDataPacket (t * testing.T ) {
22
23
for _ , testCase := range keyAndIpePackets () {
23
- // Key
24
- buf := readerFromHex (testCase .packets )
25
- packet , err := Read (buf )
26
- if err != nil {
27
- t .Fatalf ("failed to read SymmetricKeyEncrypted: %s" , err )
28
- }
29
- ske , ok := packet .(* SymmetricKeyEncrypted )
30
- if ! ok {
31
- t .Fatal ("didn't find SymmetricKeyEncrypted packet" )
32
- }
33
- // Decrypt key
34
- key , cipherFunc , err := ske .Decrypt ([]byte (testCase .password ))
35
- if err != nil {
36
- t .Fatal (err )
37
- }
38
- packet , err = Read (buf )
39
- if err != nil {
40
- t .Fatalf ("failed to read SymmetricallyEncrypted: %s" , err )
41
- }
24
+ // Read and verify the key packet
25
+ ske , dataPacket := readSymmetricKeyEncrypted (t , testCase .packets )
26
+ key , cipherFunc := decryptSymmetricKey (t , ske , []byte (testCase .password ))
27
+
28
+ packet := readSymmetricallyEncrypted (t , dataPacket )
29
+
42
30
// Decrypt contents
43
31
var edp EncryptedDataPacket
44
32
switch p := packet .(type ) {
@@ -49,6 +37,7 @@ func TestDecryptSymmetricKeyAndEncryptedDataPacket(t *testing.T) {
49
37
default :
50
38
t .Fatal ("no integrity protected packet" )
51
39
}
40
+
52
41
r , err := edp .Decrypt (cipherFunc , key )
53
42
if err != nil {
54
43
t .Fatal (err )
@@ -66,6 +55,110 @@ func TestDecryptSymmetricKeyAndEncryptedDataPacket(t *testing.T) {
66
55
}
67
56
}
68
57
58
+ func TestTagVerificationError (t * testing.T ) {
59
+ for _ , testCase := range keyAndIpePackets () {
60
+ ske , dataPacket := readSymmetricKeyEncrypted (t , testCase .packets )
61
+ key , cipherFunc := decryptSymmetricKey (t , ske , []byte (testCase .password ))
62
+
63
+ // Corrupt chunk
64
+ tmp := make ([]byte , len (dataPacket ))
65
+ copy (tmp , dataPacket )
66
+ tmp [38 ] += 1
67
+ packet := readSymmetricallyEncrypted (t , tmp )
68
+ // Decrypt contents and check integrity
69
+ checkIntegrityError (t , packet , cipherFunc , key )
70
+
71
+ // Corrupt final tag or mdc
72
+ dataPacket [len (dataPacket )- 1 ] += 1
73
+ packet = readSymmetricallyEncrypted (t , dataPacket )
74
+ // Decrypt contents and check integrity
75
+ checkIntegrityError (t , packet , cipherFunc , key )
76
+
77
+ if len (testCase .faultyDataPacket ) > 0 {
78
+ dataPacket , err := hex .DecodeString (testCase .faultyDataPacket )
79
+ if err != nil {
80
+ t .Fatal (err )
81
+ }
82
+ packet = readSymmetricallyEncrypted (t , dataPacket )
83
+ // Decrypt contents and check integrity
84
+ checkIntegrityError (t , packet , cipherFunc , key )
85
+ }
86
+ }
87
+ }
88
+
89
+ func readSymmetricKeyEncrypted (t * testing.T , packetHex string ) (* SymmetricKeyEncrypted , []byte ) {
90
+ t .Helper ()
91
+
92
+ buf := readerFromHex (packetHex )
93
+ packet , err := Read (buf )
94
+ if err != nil {
95
+ t .Fatalf ("failed to read SymmetricKeyEncrypted: %s" , err )
96
+ }
97
+
98
+ ske , ok := packet .(* SymmetricKeyEncrypted )
99
+ if ! ok {
100
+ t .Fatal ("didn't find SymmetricKeyEncrypted packet" )
101
+ }
102
+
103
+ dataPacket , err := io .ReadAll (buf )
104
+ if err != nil {
105
+ t .Fatalf ("failed to read data packet: %s" , err )
106
+ }
107
+ return ske , dataPacket
108
+ }
109
+
110
+ func decryptSymmetricKey (t * testing.T , ske * SymmetricKeyEncrypted , password []byte ) ([]byte , CipherFunction ) {
111
+ t .Helper ()
112
+
113
+ key , cipherFunc , err := ske .Decrypt (password )
114
+ if err != nil {
115
+ t .Fatalf ("failed to decrypt symmetric key: %s" , err )
116
+ }
117
+
118
+ return key , cipherFunc
119
+ }
120
+
121
+ func readSymmetricallyEncrypted (t * testing.T , dataPacket []byte ) Packet {
122
+ t .Helper ()
123
+ packet , err := Read (bytes .NewReader (dataPacket ))
124
+ if err != nil {
125
+ t .Fatalf ("failed to read SymmetricallyEncrypted: %s" , err )
126
+ }
127
+ return packet
128
+ }
129
+
130
+ func checkIntegrityError (t * testing.T , packet Packet , cipherFunc CipherFunction , key []byte ) {
131
+ t .Helper ()
132
+
133
+ switch p := packet .(type ) {
134
+ case * SymmetricallyEncrypted :
135
+ edp := p
136
+ data , err := edp .Decrypt (cipherFunc , key )
137
+ if err != nil {
138
+ t .Fatal (err )
139
+ }
140
+
141
+ _ , err = io .ReadAll (data )
142
+ if err == nil {
143
+ err = data .Close ()
144
+ }
145
+ if err != nil {
146
+ if edp .Version == 1 && err != errors .ErrMDCHashMismatch {
147
+ t .Fatalf ("no integrity error (expected MDC hash mismatch)" )
148
+ }
149
+ if edp .Version == 2 && err != errors .ErrAEADTagVerification {
150
+ t .Fatalf ("no integrity error (expected AEAD tag verification failure)" )
151
+ }
152
+ } else {
153
+ t .Fatalf ("no error (expected integrity check failure)" )
154
+ }
155
+ case * AEADEncrypted :
156
+ return
157
+ default :
158
+ t .Fatal ("no integrity protected packet found" )
159
+ }
160
+ }
161
+
69
162
func TestSerializeSymmetricKeyEncryptedV6RandomizeSlow (t * testing.T ) {
70
163
ciphers := map [string ]CipherFunction {
71
164
"AES128" : CipherAES128 ,
0 commit comments