@@ -22,69 +22,74 @@ type EncAlg = cbc::Encryptor<aes::Aes128>;
22
22
type DecAlg = cbc:: Decryptor < aes:: Aes128 > ;
23
23
type MacAlg = hmac:: Hmac < sha2:: Sha256 > ;
24
24
25
- pub fn encrypt ( data : impl AsRef < [ u8 ] > , key : & Key , iv : impl AsRef < [ u8 ] > ) -> Vec < u8 > {
25
+ pub fn encrypt (
26
+ data : impl AsRef < [ u8 ] > ,
27
+ key : & Key ,
28
+ iv : impl AsRef < [ u8 ] > ,
29
+ ) -> Result < Vec < u8 > , super :: Error > {
26
30
let mut blob = vec ! [ 0 ; data. as_ref( ) . len( ) + EncAlg :: block_size( ) ] ;
27
31
28
32
// Unwrapping since adding `CIPHER_BLOCK_SIZE` to array is enough space for
29
33
// PKCS7
30
34
let encrypted_len = EncAlg :: new_from_slices ( key. as_ref ( ) , iv. as_ref ( ) )
31
35
. expect ( "Invalid key length" )
32
- . encrypt_padded_b2b_mut :: < Pkcs7 > ( data. as_ref ( ) , & mut blob)
33
- . unwrap ( )
36
+ . encrypt_padded_b2b_mut :: < Pkcs7 > ( data. as_ref ( ) , & mut blob) ?
34
37
. len ( ) ;
35
38
36
39
blob. truncate ( encrypted_len) ;
37
40
38
- blob
41
+ Ok ( blob)
39
42
}
40
43
41
- pub fn decrypt ( blob : impl AsRef < [ u8 ] > , key : & Key , iv : impl AsRef < [ u8 ] > ) -> Zeroizing < Vec < u8 > > {
44
+ pub fn decrypt (
45
+ blob : impl AsRef < [ u8 ] > ,
46
+ key : & Key ,
47
+ iv : impl AsRef < [ u8 ] > ,
48
+ ) -> Result < Zeroizing < Vec < u8 > > , super :: Error > {
42
49
let mut data = blob. as_ref ( ) . to_vec ( ) ;
43
50
44
- DecAlg :: new_from_slices ( key. as_ref ( ) , iv. as_ref ( ) )
51
+ Ok ( DecAlg :: new_from_slices ( key. as_ref ( ) , iv. as_ref ( ) )
45
52
. expect ( "Invalid key length" )
46
- . decrypt_padded_mut :: < Pkcs7 > ( & mut data)
47
- . unwrap ( )
53
+ . decrypt_padded_mut :: < Pkcs7 > ( & mut data) ?
48
54
. to_vec ( )
49
- . into ( )
55
+ . into ( ) )
50
56
}
51
57
52
58
pub ( crate ) fn decrypt_no_padding (
53
59
blob : impl AsRef < [ u8 ] > ,
54
60
key : & Key ,
55
61
iv : impl AsRef < [ u8 ] > ,
56
- ) -> Zeroizing < Vec < u8 > > {
62
+ ) -> Result < Zeroizing < Vec < u8 > > , super :: Error > {
57
63
let mut data = blob. as_ref ( ) . to_vec ( ) ;
58
64
59
- DecAlg :: new_from_slices ( key. as_ref ( ) , iv. as_ref ( ) )
65
+ Ok ( DecAlg :: new_from_slices ( key. as_ref ( ) , iv. as_ref ( ) )
60
66
. expect ( "Invalid key length" )
61
- . decrypt_padded_mut :: < NoPadding > ( & mut data)
62
- . unwrap ( )
67
+ . decrypt_padded_mut :: < NoPadding > ( & mut data) ?
63
68
. to_vec ( )
64
- . into ( )
69
+ . into ( ) )
65
70
}
66
71
67
72
pub ( crate ) fn iv_len ( ) -> usize {
68
73
DecAlg :: iv_size ( )
69
74
}
70
75
71
- pub ( crate ) fn generate_private_key ( ) -> Zeroizing < Vec < u8 > > {
76
+ pub ( crate ) fn generate_private_key ( ) -> Result < Zeroizing < Vec < u8 > > , super :: Error > {
72
77
let generic_array = EncAlg :: generate_key ( cipher:: rand_core:: OsRng ) ;
73
- Zeroizing :: new ( generic_array. to_vec ( ) )
78
+ Ok ( Zeroizing :: new ( generic_array. to_vec ( ) ) )
74
79
}
75
80
76
- pub ( crate ) fn generate_public_key ( private_key : impl AsRef < [ u8 ] > ) -> Vec < u8 > {
81
+ pub ( crate ) fn generate_public_key ( private_key : impl AsRef < [ u8 ] > ) -> Result < Vec < u8 > , super :: Error > {
77
82
let private_key_uint = BigUint :: from_bytes_be ( private_key. as_ref ( ) ) ;
78
83
static DH_GENERATOR : LazyLock < BigUint > = LazyLock :: new ( || BigUint :: from_u64 ( 0x2 ) . unwrap ( ) ) ;
79
84
let public_key_uint = powm ( & DH_GENERATOR , private_key_uint) ;
80
85
81
- public_key_uint. to_bytes_be ( )
86
+ Ok ( public_key_uint. to_bytes_be ( ) )
82
87
}
83
88
84
89
pub ( crate ) fn generate_aes_key (
85
90
private_key : impl AsRef < [ u8 ] > ,
86
91
server_public_key : impl AsRef < [ u8 ] > ,
87
- ) -> Zeroizing < Vec < u8 > > {
92
+ ) -> Result < Zeroizing < Vec < u8 > > , super :: Error > {
88
93
let server_public_key_uint = BigUint :: from_bytes_be ( server_public_key. as_ref ( ) ) ;
89
94
let private_key_uint = BigUint :: from_bytes_be ( private_key. as_ref ( ) ) ;
90
95
let common_secret = powm ( & server_public_key_uint, private_key_uint) ;
@@ -107,27 +112,31 @@ pub(crate) fn generate_aes_key(
107
112
hk. expand ( & info, okm. as_mut ( ) )
108
113
. expect ( "hkdf expand should never fail" ) ;
109
114
110
- okm
115
+ Ok ( okm)
111
116
}
112
117
113
- pub fn generate_iv ( ) -> Vec < u8 > {
114
- EncAlg :: generate_iv ( cipher:: rand_core:: OsRng ) . to_vec ( )
118
+ pub fn generate_iv ( ) -> Result < Vec < u8 > , super :: Error > {
119
+ Ok ( EncAlg :: generate_iv ( cipher:: rand_core:: OsRng ) . to_vec ( ) )
115
120
}
116
121
117
122
pub ( crate ) fn mac_len ( ) -> usize {
118
123
MacAlg :: output_size ( )
119
124
}
120
125
121
- pub ( crate ) fn compute_mac ( data : impl AsRef < [ u8 ] > , key : & Key ) -> Vec < u8 > {
126
+ pub ( crate ) fn compute_mac ( data : impl AsRef < [ u8 ] > , key : & Key ) -> Result < Vec < u8 > , super :: Error > {
122
127
let mut mac = MacAlg :: new_from_slice ( key. as_ref ( ) ) . unwrap ( ) ;
123
128
mac. update ( data. as_ref ( ) ) ;
124
- mac. finalize ( ) . into_bytes ( ) . to_vec ( )
129
+ Ok ( mac. finalize ( ) . into_bytes ( ) . to_vec ( ) )
125
130
}
126
131
127
- pub ( crate ) fn verify_mac ( data : impl AsRef < [ u8 ] > , key : & Key , expected : impl AsRef < [ u8 ] > ) -> bool {
132
+ pub ( crate ) fn verify_mac (
133
+ data : impl AsRef < [ u8 ] > ,
134
+ key : & Key ,
135
+ expected : impl AsRef < [ u8 ] > ,
136
+ ) -> Result < bool , super :: Error > {
128
137
let mut mac = MacAlg :: new_from_slice ( key. as_ref ( ) ) . unwrap ( ) ;
129
138
mac. update ( data. as_ref ( ) ) ;
130
- mac. verify_slice ( expected. as_ref ( ) ) . is_ok ( )
139
+ Ok ( mac. verify_slice ( expected. as_ref ( ) ) . is_ok ( ) )
131
140
}
132
141
133
142
pub ( crate ) fn verify_checksum_md5 ( digest : impl AsRef < [ u8 ] > , content : impl AsRef < [ u8 ] > ) -> bool {
@@ -141,7 +150,7 @@ pub(crate) fn derive_key(
141
150
key_strength : Result < ( ) , file:: WeakKeyError > ,
142
151
salt : impl AsRef < [ u8 ] > ,
143
152
iteration_count : usize ,
144
- ) -> Key {
153
+ ) -> Result < Key , super :: Error > {
145
154
let mut key = Key :: new_with_strength ( vec ! [ 0 ; EncAlg :: block_size( ) ] , key_strength) ;
146
155
147
156
pbkdf2:: pbkdf2 :: < hmac:: Hmac < sha2:: Sha256 > > (
@@ -152,15 +161,15 @@ pub(crate) fn derive_key(
152
161
)
153
162
. expect ( "HMAC can be initialized with any key length" ) ;
154
163
155
- key
164
+ Ok ( key)
156
165
}
157
166
158
167
pub ( crate ) fn legacy_derive_key_and_iv (
159
168
secret : impl AsRef < [ u8 ] > ,
160
169
key_strength : Result < ( ) , file:: WeakKeyError > ,
161
170
salt : impl AsRef < [ u8 ] > ,
162
171
iteration_count : usize ,
163
- ) -> ( Key , Vec < u8 > ) {
172
+ ) -> Result < ( Key , Vec < u8 > ) , super :: Error > {
164
173
let mut buffer = vec ! [ 0 ; EncAlg :: key_size( ) + EncAlg :: iv_size( ) ] ;
165
174
let mut hasher = Sha256 :: new ( ) ;
166
175
let mut digest_buffer = vec ! [ 0 ; <Sha256 as Digest >:: output_size( ) ] ;
@@ -198,7 +207,7 @@ pub(crate) fn legacy_derive_key_and_iv(
198
207
}
199
208
200
209
let iv = buffer. split_off ( EncAlg :: key_size ( ) ) ;
201
- ( Key :: new_with_strength ( buffer, key_strength) , iv)
210
+ Ok ( ( Key :: new_with_strength ( buffer, key_strength) , iv) )
202
211
}
203
212
204
213
/// from https://github.com/plietar/librespot/blob/master/core/src/util/mod.rs#L53
0 commit comments