@@ -55,11 +55,24 @@ impl Handle {
55
55
/// Attempt to create a [`Handle`] from an encrypted keyset obtained via a
56
56
/// [`Reader`](crate::keyset::Reader).
57
57
pub fn read < T > ( reader : & mut T , master_key : Box < dyn crate :: Aead > ) -> Result < Self , TinkError >
58
+ where
59
+ T : crate :: keyset:: Reader ,
60
+ {
61
+ Self :: read_with_associated_data ( reader, master_key, & [ ] )
62
+ }
63
+
64
+ /// Attempt to create a [`Handle`] from an encrypted keyset obtained via a
65
+ /// [`Reader`](crate::keyset::Reader) using the provided associated data.
66
+ pub fn read_with_associated_data < T > (
67
+ reader : & mut T ,
68
+ master_key : Box < dyn crate :: Aead > ,
69
+ associated_data : & [ u8 ] ,
70
+ ) -> Result < Self , TinkError >
58
71
where
59
72
T : crate :: keyset:: Reader ,
60
73
{
61
74
let encrypted_keyset = reader. read_encrypted ( ) ?;
62
- let ks = decrypt ( & encrypted_keyset, master_key) ?;
75
+ let ks = decrypt ( & encrypted_keyset, master_key, associated_data ) ?;
63
76
Ok ( Handle {
64
77
ks : validate_keyset ( ks) ?,
65
78
} )
@@ -109,7 +122,20 @@ impl Handle {
109
122
where
110
123
T : super :: Writer ,
111
124
{
112
- let encrypted = encrypt ( & self . ks , master_key) ?;
125
+ self . write_with_associated_data ( writer, master_key, & [ ] )
126
+ }
127
+
128
+ /// Encrypts and writes the enclosed [`Keyset`] using the provided associated data.
129
+ pub fn write_with_associated_data < T > (
130
+ & self ,
131
+ writer : & mut T ,
132
+ master_key : Box < dyn crate :: Aead > ,
133
+ associated_data : & [ u8 ] ,
134
+ ) -> Result < ( ) , TinkError >
135
+ where
136
+ T : super :: Writer ,
137
+ {
138
+ let encrypted = encrypt ( & self . ks , master_key, associated_data) ?;
113
139
writer. write_encrypted ( & encrypted)
114
140
}
115
141
@@ -271,9 +297,10 @@ fn public_key_data(priv_key_data: &tink_proto::KeyData) -> Result<tink_proto::Ke
271
297
fn decrypt (
272
298
encrypted_keyset : & tink_proto:: EncryptedKeyset ,
273
299
master_key : Box < dyn crate :: Aead > ,
300
+ associated_data : & [ u8 ] ,
274
301
) -> Result < Keyset , TinkError > {
275
302
let decrypted = master_key
276
- . decrypt ( & encrypted_keyset. encrypted_keyset , & [ ] )
303
+ . decrypt ( & encrypted_keyset. encrypted_keyset , associated_data )
277
304
. map_err ( |e| wrap_err ( "keyset::Handle: decryption failed" , e) ) ?;
278
305
Keyset :: decode ( & decrypted[ ..] ) . map_err ( |_| TinkError :: new ( "keyset::Handle:: invalid keyset" ) )
279
306
}
@@ -282,13 +309,14 @@ fn decrypt(
282
309
fn encrypt (
283
310
keyset : & Keyset ,
284
311
master_key : Box < dyn crate :: Aead > ,
312
+ associated_data : & [ u8 ] ,
285
313
) -> Result < tink_proto:: EncryptedKeyset , TinkError > {
286
314
let mut serialized_keyset = vec ! [ ] ;
287
315
keyset
288
316
. encode ( & mut serialized_keyset)
289
317
. map_err ( |e| wrap_err ( "keyset::Handle: invalid keyset" , e) ) ?;
290
318
let encrypted = master_key
291
- . encrypt ( & serialized_keyset, & [ ] )
319
+ . encrypt ( & serialized_keyset, associated_data )
292
320
. map_err ( |e| wrap_err ( "keyset::Handle: encrypted failed" , e) ) ?;
293
321
Ok ( tink_proto:: EncryptedKeyset {
294
322
encrypted_keyset : encrypted,
0 commit comments