11use crate :: api:: * ;
22// use crate::config::*;
3- use crate :: config:: MAX_SERIALIZED_KEY_LENGTH ;
43use crate :: error:: Error ;
54use crate :: key;
65use crate :: service:: * ;
@@ -16,95 +15,6 @@ const TOTAL_LEN: usize = KEY_LEN + NONCE_LEN;
1615const TAG_LEN : usize = 16 ;
1716const KIND : key:: Kind = key:: Kind :: Symmetric ( KEY_LEN ) ;
1817const KIND_NONCE : key:: Kind = key:: Kind :: Symmetric32Nonce ( NONCE_LEN ) ;
19- const WRAPPED_TO_FILE_LEN : usize = MAX_SERIALIZED_KEY_LENGTH + NONCE_LEN + TAG_LEN ;
20-
21- #[ cfg( feature = "chacha8-poly1305" ) ]
22- impl super :: Chacha8Poly1305 {
23- pub fn wrap_key_to_file (
24- keystore : & mut impl Keystore ,
25- filestore : & mut impl Filestore ,
26- request : & request:: WrapKeyToFile ,
27- ) -> Result < reply:: WrapKeyToFile , Error > {
28- use chacha20poly1305:: aead:: { AeadMutInPlace , KeyInit } ;
29- use chacha20poly1305:: ChaCha8Poly1305 ;
30- use rand_core:: RngCore as _;
31-
32- let serialized_key = keystore. load_key ( key:: Secrecy :: Secret , None , & request. key ) ?;
33-
34- let mut data =
35- Bytes :: < WRAPPED_TO_FILE_LEN > :: from_slice ( & serialized_key. serialize ( ) ) . unwrap ( ) ;
36- let material_len = data. len ( ) ;
37- data. resize_default ( material_len + NONCE_LEN ) . unwrap ( ) ;
38- let ( material, nonce) = data. split_at_mut ( material_len) ;
39- keystore. rng ( ) . fill_bytes ( nonce) ;
40- let nonce = ( & * nonce) . try_into ( ) . unwrap ( ) ;
41-
42- let key = keystore. load_key ( key:: Secrecy :: Secret , Some ( KIND ) , & request. wrapping_key ) ?;
43- let chachakey: [ u8 ; KEY_LEN ] = ( & * key. material ) . try_into ( ) . unwrap ( ) ;
44- let mut aead = ChaCha8Poly1305 :: new ( & GenericArray :: clone_from_slice ( & chachakey) ) ;
45- let tag = aead
46- . encrypt_in_place_detached (
47- <& GenericArray < _ , _ > as From < & [ u8 ; NONCE_LEN ] > >:: from ( nonce) ,
48- & request. associated_data ,
49- material,
50- )
51- . unwrap ( ) ;
52- data. extend_from_slice ( & tag) . unwrap ( ) ;
53- filestore. write ( & request. path , request. location , & data) ?;
54- Ok ( reply:: WrapKeyToFile { } )
55- }
56-
57- pub fn unwrap_key_from_file (
58- keystore : & mut impl Keystore ,
59- filestore : & mut impl Filestore ,
60- request : & request:: UnwrapKeyFromFile ,
61- ) -> Result < reply:: UnwrapKeyFromFile , Error > {
62- use chacha20poly1305:: aead:: { AeadMutInPlace , KeyInit } ;
63- use chacha20poly1305:: ChaCha8Poly1305 ;
64- let mut data: Bytes < WRAPPED_TO_FILE_LEN > =
65- filestore. read ( & request. path , request. file_location ) ?;
66-
67- let data_len = data. len ( ) ;
68- if data_len < TAG_LEN + NONCE_LEN {
69- error ! ( "Attempt to unwrap file that doesn't contain a key" ) ;
70- return Err ( Error :: InvalidSerializedKey ) ;
71- }
72- let ( tmp, tag) = data. split_at_mut ( data_len - TAG_LEN ) ;
73- let tmp_len = tmp. len ( ) ;
74- let ( material, nonce) = tmp. split_at_mut ( tmp_len - NONCE_LEN ) ;
75-
76- // Coerce to array
77- let nonce = ( & * nonce) . try_into ( ) . unwrap ( ) ;
78- let tag = ( & * tag) . try_into ( ) . unwrap ( ) ;
79-
80- let key = keystore. load_key ( key:: Secrecy :: Secret , Some ( KIND ) , & request. key ) ?;
81- let chachakey: [ u8 ; KEY_LEN ] = ( & * key. material ) . try_into ( ) . unwrap ( ) ;
82- let mut aead = ChaCha8Poly1305 :: new ( & GenericArray :: clone_from_slice ( & chachakey) ) ;
83- if aead
84- . decrypt_in_place_detached (
85- <& GenericArray < _ , _ > as From < & [ u8 ; NONCE_LEN ] > >:: from ( nonce) ,
86- & request. associated_data ,
87- material,
88- <& GenericArray < _ , _ > as From < & [ u8 ; TAG_LEN ] > >:: from ( tag) ,
89- )
90- . is_err ( )
91- {
92- return Ok ( reply:: UnwrapKeyFromFile { key : None } ) ;
93- }
94- let key = key:: Key :: try_deserialize ( material) ?;
95- let info = key:: Info {
96- flags : key. flags ,
97- kind : key. kind ,
98- } ;
99- let key = keystore. store_key (
100- request. key_location ,
101- key:: Secrecy :: Secret ,
102- info,
103- & key. material ,
104- ) ?;
105- Ok ( reply:: UnwrapKeyFromFile { key : Some ( key) } )
106- }
107- }
10818
10919#[ cfg( feature = "chacha8-poly1305" ) ]
11020impl GenerateKey for super :: Chacha8Poly1305 {
0 commit comments