1
1
package tkn
2
2
3
3
import (
4
+ "bytes"
4
5
"crypto/subtle"
5
6
"fmt"
6
7
"io"
@@ -20,6 +21,9 @@ import (
20
21
// for our output size of 256 bits.
21
22
const macKeySeedSize = 72
22
23
24
+ // As of v1.3.8, ciphertexts are prefixed with this string.
25
+ const CiphertextVersion = "v1.3.8"
26
+
23
27
func blakeEncrypt (key []byte , msg []byte ) ([]byte , error ) {
24
28
xof , err := blake2b .NewXOF (blake2b .OutputLengthUnknown , key )
25
29
if err != nil {
@@ -117,39 +121,51 @@ func EncryptCCA(rand io.Reader, public *PublicParams, policy *Policy, msg []byte
117
121
if err != nil {
118
122
return nil , err
119
123
}
120
- macData := appendLenPrefixed (nil , C1 )
121
- macData = appendLenPrefixed (macData , env )
124
+ macData := appendLen32Prefixed (nil , C1 )
125
+ macData = appendLen32Prefixed (macData , env )
122
126
123
127
tag , err := blakeMac (macKey , macData )
124
128
if err != nil {
125
129
return nil , err
126
130
}
127
131
128
- ret := appendLenPrefixed (nil , id )
129
- ret = appendLenPrefixed (ret , macData )
132
+ ret := append ([]byte {}, []byte (CiphertextVersion )... )
133
+ ret = appendLenPrefixed (ret , id )
134
+ ret = appendLen32Prefixed (ret , macData )
130
135
ret = appendLenPrefixed (ret , tag )
131
136
132
137
return ret , nil
133
138
}
134
139
140
+ type rmLenPref = func ([]byte ) ([]byte , []byte , error )
141
+
142
+ func checkCiphertextFormat (ciphertext []byte ) (ct []byte , fn rmLenPref ) {
143
+ const N = len (CiphertextVersion )
144
+ if bytes .Equal (ciphertext [0 :N ], []byte (CiphertextVersion )) {
145
+ return ciphertext [N :], removeLen32Prefixed
146
+ }
147
+ return ciphertext , removeLenPrefixed
148
+ }
149
+
135
150
func DecryptCCA (ciphertext []byte , key * AttributesKey ) ([]byte , error ) {
136
- id , rest , err := removeLenPrefixed (ciphertext )
151
+ rest , removeLenPrefixedVar := checkCiphertextFormat (ciphertext )
152
+ id , rest , err := removeLenPrefixed (rest )
137
153
if err != nil {
138
154
return nil , err
139
155
}
140
- macData , rest , err := removeLenPrefixed (rest )
156
+ macData , rest , err := removeLenPrefixedVar (rest )
141
157
if err != nil {
142
158
return nil , err
143
159
}
144
160
tag , _ , err := removeLenPrefixed (rest )
145
161
if err != nil {
146
162
return nil , err
147
163
}
148
- C1 , envRaw , err := removeLenPrefixed (macData )
164
+ C1 , envRaw , err := removeLenPrefixedVar (macData )
149
165
if err != nil {
150
166
return nil , err
151
167
}
152
- env , _ , err := removeLenPrefixed (envRaw )
168
+ env , _ , err := removeLenPrefixedVar (envRaw )
153
169
if err != nil {
154
170
return nil , err
155
171
}
@@ -208,15 +224,16 @@ func DecryptCCA(ciphertext []byte, key *AttributesKey) ([]byte, error) {
208
224
}
209
225
210
226
func CouldDecrypt (ciphertext []byte , a * Attributes ) bool {
211
- id , rest , err := removeLenPrefixed (ciphertext )
227
+ rest , removeLenPrefixedVar := checkCiphertextFormat (ciphertext )
228
+ id , rest , err := removeLenPrefixed (rest )
212
229
if err != nil {
213
230
return false
214
231
}
215
- macData , _ , err := removeLenPrefixed (rest )
232
+ macData , _ , err := removeLenPrefixedVar (rest )
216
233
if err != nil {
217
234
return false
218
235
}
219
- C1 , _ , err := removeLenPrefixed (macData )
236
+ C1 , _ , err := removeLenPrefixedVar (macData )
220
237
if err != nil {
221
238
return false
222
239
}
@@ -237,15 +254,16 @@ func CouldDecrypt(ciphertext []byte, a *Attributes) bool {
237
254
}
238
255
239
256
func (p * Policy ) ExtractFromCiphertext (ct []byte ) error {
240
- _ , rest , err := removeLenPrefixed (ct )
257
+ rest , removeLenPrefixedVar := checkCiphertextFormat (ct )
258
+ _ , rest , err := removeLenPrefixed (rest )
241
259
if err != nil {
242
260
return fmt .Errorf ("invalid ciphertext" )
243
261
}
244
- macData , _ , err := removeLenPrefixed (rest )
262
+ macData , _ , err := removeLenPrefixedVar (rest )
245
263
if err != nil {
246
264
return fmt .Errorf ("invalid ciphertext" )
247
265
}
248
- C1 , _ , err := removeLenPrefixed (macData )
266
+ C1 , _ , err := removeLenPrefixedVar (macData )
249
267
if err != nil {
250
268
return fmt .Errorf ("invalid ciphertext" )
251
269
}
0 commit comments