@@ -14,6 +14,12 @@ pub struct AesNonce {
14
14
pub length : usize
15
15
}
16
16
17
+ #[ repr( C ) ]
18
+ pub struct AesKeyResult {
19
+ pub key : * mut c_uchar ,
20
+ pub length : usize
21
+ }
22
+
17
23
#[ repr( C ) ]
18
24
pub struct AesBytesEncrypt {
19
25
pub ciphertext : * mut c_uchar ,
@@ -28,7 +34,8 @@ pub struct AesBytesDecrypt {
28
34
29
35
#[ repr( C ) ]
30
36
pub struct AesNonceAndKeyFromX25519DiffieHellman {
31
- pub aes_key_ptr : * mut c_char ,
37
+ pub aes_key_ptr : * mut c_uchar ,
38
+ pub aes_key_ptr_length : usize ,
32
39
pub aes_nonce_ptr : * mut c_uchar ,
33
40
pub aes_nonce_ptr_length : usize
34
41
}
@@ -41,18 +48,24 @@ pub extern "C" fn aes_256_key_and_nonce_from_x25519_diffie_hellman_shared_secret
41
48
let shared_secret_slice: & [ u8 ] =
42
49
unsafe { std:: slice:: from_raw_parts ( shared_secret, shared_secret_length) } ;
43
50
44
- let aes_key = Key :: < Aes256Gcm > :: from_slice ( & shared_secret_slice) ;
45
- let mut aes_nonce = Vec :: with_capacity ( 12 ) ;
46
- aes_nonce. resize ( 12 , 0 ) ;
47
- aes_nonce. copy_from_slice ( & shared_secret_slice[ ..12 ] ) ;
48
- let capacity = aes_nonce. capacity ( ) ;
49
- aes_nonce. reserve_exact ( capacity) ;
51
+ let mut aes_nonce = Vec :: with_capacity ( 12 ) ;
52
+ aes_nonce. resize ( 12 , 0 ) ;
53
+ aes_nonce. copy_from_slice ( & shared_secret_slice[ ..12 ] ) ;
54
+ let capacity = aes_nonce. capacity ( ) ;
55
+ aes_nonce. reserve_exact ( capacity) ;
56
+
57
+ let mut aes_key = Key :: < Aes256Gcm > :: from_slice ( & shared_secret_slice) . to_vec ( ) ;
58
+ let aes_key_capacity = aes_key. capacity ( ) ;
59
+ aes_key. reserve_exact ( aes_key_capacity) ;
60
+
50
61
let result = AesNonceAndKeyFromX25519DiffieHellman {
51
- aes_key_ptr : CString :: new ( base64:: encode ( aes_key) ) . unwrap ( ) . into_raw ( ) ,
62
+ aes_key_ptr : aes_key. as_mut_ptr ( ) ,
63
+ aes_key_ptr_length : aes_key. len ( ) ,
52
64
aes_nonce_ptr : aes_nonce. as_mut_ptr ( ) ,
53
65
aes_nonce_ptr_length : aes_nonce. len ( )
54
66
} ;
55
67
std:: mem:: forget ( aes_nonce) ;
68
+ std:: mem:: forget ( aes_key) ;
56
69
result
57
70
}
58
71
@@ -98,16 +111,11 @@ pub fn aes_256_key_and_nonce_from_x25519_diffie_hellman_shared_secret_test() {
98
111
bob_shared_secret. shared_secret_length ,
99
112
) ;
100
113
101
-
102
-
103
- let alice_public_key_cstr = unsafe { CString :: from_raw ( alice_aes. aes_key_ptr ) } ;
104
- let alice_public_key_ptr = alice_public_key_cstr. as_bytes_with_nul ( ) . as_ptr ( ) as * const c_char ;
105
-
106
114
let password = "DontUseThisPassword" ;
107
115
let password_cstr = password. as_bytes ( ) ;
108
116
let password_ptr = password. as_ptr ( ) ;
109
- let cipher_text_result = aes_256_encrypt_bytes_with_key ( alice_aes. aes_nonce_ptr , alice_aes. aes_nonce_ptr_length , alice_public_key_ptr , password_ptr, password_cstr. len ( ) ) ;
110
- let plain_text_result = aes_256_decrypt_bytes_with_key ( bob_aes. aes_nonce_ptr , bob_aes. aes_nonce_ptr_length , bob_aes. aes_key_ptr , cipher_text_result. ciphertext , cipher_text_result. length ) ;
117
+ let cipher_text_result = aes_256_encrypt_bytes_with_key ( alice_aes. aes_nonce_ptr , alice_aes. aes_nonce_ptr_length , alice_aes . aes_key_ptr , alice_aes . aes_key_ptr_length , password_ptr, password_cstr. len ( ) ) ;
118
+ let plain_text_result = aes_256_decrypt_bytes_with_key ( bob_aes. aes_nonce_ptr , bob_aes. aes_nonce_ptr_length , bob_aes. aes_key_ptr , bob_aes . aes_key_ptr_length , cipher_text_result. ciphertext , cipher_text_result. length ) ;
111
119
let plain_text_result_slice: & [ u8 ] = unsafe {
112
120
std:: slice:: from_raw_parts (
113
121
plain_text_result. plaintext ,
@@ -127,18 +135,24 @@ pub extern "C" fn aes_128_key_and_nonce_from_x25519_diffie_hellman_shared_secret
127
135
128
136
let mut shorted_shared_secret: [ u8 ; 16 ] = Default :: default ( ) ;
129
137
shorted_shared_secret. copy_from_slice ( & shared_secret_slice[ ..16 ] ) ;
130
- let aes_key = Key :: < Aes128Gcm > :: from_slice ( & shorted_shared_secret) ;
131
138
let mut aes_nonce = Vec :: with_capacity ( 12 ) ;
132
139
aes_nonce. resize ( 12 , 0 ) ;
133
140
aes_nonce. copy_from_slice ( & shared_secret_slice[ ..12 ] ) ;
134
141
let capacity = aes_nonce. capacity ( ) ;
135
142
aes_nonce. reserve_exact ( capacity) ;
143
+
144
+ let mut aes_key = Key :: < Aes128Gcm > :: from_slice ( & shorted_shared_secret) . to_vec ( ) ;
145
+ let aes_key_capacity = aes_key. capacity ( ) ;
146
+ aes_key. reserve_exact ( aes_key_capacity) ;
147
+
136
148
let result = AesNonceAndKeyFromX25519DiffieHellman {
137
- aes_key_ptr : CString :: new ( base64:: encode ( aes_key) ) . unwrap ( ) . into_raw ( ) ,
149
+ aes_key_ptr : aes_key. as_mut_ptr ( ) ,
150
+ aes_key_ptr_length : aes_key. len ( ) ,
138
151
aes_nonce_ptr : aes_nonce. as_mut_ptr ( ) ,
139
152
aes_nonce_ptr_length : aes_nonce. len ( )
140
153
} ;
141
154
std:: mem:: forget ( aes_nonce) ;
155
+ std:: mem:: forget ( aes_key) ;
142
156
result
143
157
}
144
158
@@ -184,15 +198,11 @@ pub fn aes_128_key_and_nonce_from_x25519_diffie_hellman_shared_secret_test() {
184
198
bob_shared_secret. shared_secret_length ,
185
199
) ;
186
200
187
-
188
- let alice_public_key_cstr = unsafe { CString :: from_raw ( alice_aes. aes_key_ptr ) } ;
189
- let alice_public_key_ptr = alice_public_key_cstr. as_bytes_with_nul ( ) . as_ptr ( ) as * const c_char ;
190
-
191
201
let password = "DontUseThisPassword" ;
192
202
let password_cstr = password. as_bytes ( ) ;
193
203
let password_ptr = password. as_ptr ( ) ;
194
- let cipher_text_result = aes_128_encrypt_bytes_with_key ( alice_aes. aes_nonce_ptr , alice_aes. aes_nonce_ptr_length , alice_public_key_ptr , password_ptr, password_cstr. len ( ) ) ;
195
- let plain_text_result = aes_128_decrypt_bytes_with_key ( bob_aes. aes_nonce_ptr , bob_aes. aes_nonce_ptr_length , bob_aes. aes_key_ptr , cipher_text_result. ciphertext , cipher_text_result. length ) ;
204
+ let cipher_text_result = aes_128_encrypt_bytes_with_key ( alice_aes. aes_nonce_ptr , alice_aes. aes_nonce_ptr_length , alice_aes . aes_key_ptr , alice_aes . aes_key_ptr_length , password_ptr, password_cstr. len ( ) ) ;
205
+ let plain_text_result = aes_128_decrypt_bytes_with_key ( bob_aes. aes_nonce_ptr , bob_aes. aes_nonce_ptr_length , bob_aes. aes_key_ptr , bob_aes . aes_key_ptr_length , cipher_text_result. ciphertext , cipher_text_result. length ) ;
196
206
let plain_text_result_slice: & [ u8 ] = unsafe {
197
207
std:: slice:: from_raw_parts (
198
208
plain_text_result. plaintext ,
@@ -219,38 +229,45 @@ pub extern "C" fn aes_nonce() -> AesNonce {
219
229
}
220
230
221
231
#[ no_mangle]
222
- pub extern "C" fn aes_256_key ( ) -> * mut c_char {
223
- return CString :: new ( base64:: encode ( Aes256Gcm :: generate_key ( & mut OsRng ) ) )
224
- . unwrap ( )
225
- . into_raw ( ) ;
232
+ pub extern "C" fn aes_256_key ( ) -> AesKeyResult {
233
+ let mut key = Aes256Gcm :: generate_key ( & mut OsRng ) . to_vec ( ) ;
234
+ let capacity = key. capacity ( ) ;
235
+ key. reserve_exact ( capacity) ;
236
+ let result = AesKeyResult {
237
+ key : key. as_mut_ptr ( ) ,
238
+ length : key. len ( )
239
+ } ;
240
+ std:: mem:: forget ( key) ;
241
+ result
226
242
}
227
243
228
244
#[ no_mangle]
229
- pub extern "C" fn aes_128_key ( ) -> * mut c_char {
230
- return CString :: new ( base64:: encode ( Aes128Gcm :: generate_key ( & mut OsRng ) ) )
231
- . unwrap ( )
232
- . into_raw ( ) ;
245
+ pub extern "C" fn aes_128_key ( ) -> AesKeyResult {
246
+ let mut key = Aes128Gcm :: generate_key ( & mut OsRng ) . to_vec ( ) ;
247
+ let capacity = key. capacity ( ) ;
248
+ key. reserve_exact ( capacity) ;
249
+ let result = AesKeyResult {
250
+ key : key. as_mut_ptr ( ) ,
251
+ length : key. len ( )
252
+ } ;
253
+ std:: mem:: forget ( key) ;
254
+ result
233
255
}
234
256
235
257
#[ no_mangle]
236
258
pub extern "C" fn aes_128_encrypt_bytes_with_key (
237
259
nonce_key : * const c_uchar ,
238
260
nonce_key_length : usize ,
239
- key : * const c_char ,
261
+ key : * const c_uchar ,
262
+ key_length : usize ,
240
263
to_encrypt : * const c_uchar ,
241
264
to_encrypt_length : usize ,
242
265
) -> AesBytesEncrypt {
243
266
let nonce_slice = unsafe { std:: slice:: from_raw_parts ( nonce_key, nonce_key_length) } ;
244
- let key_string = unsafe {
245
- assert ! ( !key. is_null( ) ) ;
246
- CStr :: from_ptr ( key)
247
- }
248
- . to_str ( )
249
- . unwrap ( ) ;
267
+ let key_slice = unsafe { std:: slice:: from_raw_parts ( key, key_length) } ;
250
268
let to_encrypt_slice: & [ u8 ] =
251
269
unsafe { std:: slice:: from_raw_parts ( to_encrypt, to_encrypt_length) } ;
252
- let mut decoded_string_key = base64:: decode ( key_string) . unwrap ( ) ;
253
- let key = GenericArray :: from_slice ( decoded_string_key. as_byte_slice_mut ( ) ) ;
270
+ let key = GenericArray :: from_slice ( key_slice) ;
254
271
let mut cipher = Aes128Gcm :: new ( & key) ;
255
272
let nonce = Nonce :: from_slice ( nonce_slice) ; // 96-bits; unique per message
256
273
let mut ciphertext: Vec < u8 > = cipher. encrypt ( nonce, to_encrypt_slice. as_ref ( ) ) . unwrap ( ) ;
@@ -268,20 +285,15 @@ pub extern "C" fn aes_128_encrypt_bytes_with_key(
268
285
pub extern "C" fn aes_256_encrypt_bytes_with_key (
269
286
nonce_key : * const c_uchar ,
270
287
nonce_key_length : usize ,
271
- key : * const c_char ,
288
+ key : * const c_uchar ,
289
+ key_length : usize ,
272
290
to_decrypt : * const c_uchar ,
273
291
to_decrypt_length : usize ,
274
292
) -> AesBytesEncrypt {
275
293
let nonce_slice = unsafe { std:: slice:: from_raw_parts ( nonce_key, nonce_key_length) } ;
276
- let key_string = unsafe {
277
- assert ! ( !key. is_null( ) ) ;
278
- CStr :: from_ptr ( key)
279
- }
280
- . to_str ( )
281
- . unwrap ( ) ;
294
+ let key_slice = unsafe { std:: slice:: from_raw_parts ( key, key_length) } ;
282
295
let to_decrypt_slice = unsafe { std:: slice:: from_raw_parts ( to_decrypt, to_decrypt_length) } ;
283
- let mut decoded_string_key = base64:: decode ( key_string) . unwrap ( ) ;
284
- let key = GenericArray :: from_slice ( decoded_string_key. as_byte_slice_mut ( ) ) ;
296
+ let key = GenericArray :: from_slice ( key_slice) ;
285
297
let mut cipher = Aes256Gcm :: new ( & key) ;
286
298
let nonce = Nonce :: from_slice ( nonce_slice) ; // 96-bits; unique per message
287
299
let mut ciphertext = cipher. encrypt ( nonce, to_decrypt_slice) . unwrap ( ) ;
@@ -299,20 +311,15 @@ pub extern "C" fn aes_256_encrypt_bytes_with_key(
299
311
pub extern "C" fn aes_128_decrypt_bytes_with_key (
300
312
nonce_key : * const c_uchar ,
301
313
nonce_key_length : usize ,
302
- key : * const c_char ,
314
+ key : * const c_uchar ,
315
+ key_length : usize ,
303
316
to_decrypt : * const c_uchar ,
304
317
to_decrypt_length : usize ,
305
318
) -> AesBytesDecrypt {
306
319
let nonce_slice = unsafe { std:: slice:: from_raw_parts ( nonce_key, nonce_key_length) } ;
307
- let key_string = unsafe {
308
- assert ! ( !key. is_null( ) ) ;
309
- CStr :: from_ptr ( key)
310
- }
311
- . to_str ( )
312
- . unwrap ( ) ;
320
+ let key_slice = unsafe { std:: slice:: from_raw_parts ( key, key_length) } ;
313
321
let to_decrypt_slice = unsafe { std:: slice:: from_raw_parts ( to_decrypt, to_decrypt_length) } ;
314
- let mut decoded_string_key = base64:: decode ( key_string) . unwrap ( ) ;
315
- let key = GenericArray :: from_slice ( decoded_string_key. as_byte_slice_mut ( ) ) ;
322
+ let key = GenericArray :: from_slice ( key_slice) ;
316
323
let mut cipher = Aes128Gcm :: new ( & key) ;
317
324
let nonce = Nonce :: from_slice ( nonce_slice) ; // 96-bits; unique per message
318
325
let mut plaintext = cipher. decrypt ( nonce, to_decrypt_slice) . unwrap ( ) ;
@@ -330,20 +337,15 @@ pub extern "C" fn aes_128_decrypt_bytes_with_key(
330
337
pub extern "C" fn aes_256_decrypt_bytes_with_key (
331
338
nonce_key : * const c_uchar ,
332
339
nonce_key_length : usize ,
333
- key : * const c_char ,
340
+ key : * const c_uchar ,
341
+ key_length : usize ,
334
342
to_decrypt : * const c_uchar ,
335
343
to_decrypt_length : usize ,
336
344
) -> AesBytesDecrypt {
337
345
let nonce_slice = unsafe { std:: slice:: from_raw_parts ( nonce_key, nonce_key_length) } ;
338
- let key_string = unsafe {
339
- assert ! ( !key. is_null( ) ) ;
340
- CStr :: from_ptr ( key)
341
- }
342
- . to_str ( )
343
- . unwrap ( ) ;
346
+ let key_slice = unsafe { std:: slice:: from_raw_parts ( key, key_length) } ;
344
347
let to_decrypt_slice = unsafe { std:: slice:: from_raw_parts ( to_decrypt, to_decrypt_length) } ;
345
- let mut decoded_string_key = base64:: decode ( key_string) . unwrap ( ) ;
346
- let key = GenericArray :: from_slice ( decoded_string_key. as_byte_slice_mut ( ) ) ;
348
+ let key = GenericArray :: from_slice ( key_slice) ;
347
349
let mut cipher = Aes256Gcm :: new ( & key) ;
348
350
let nonce = Nonce :: from_slice ( nonce_slice) ; // 96-bits; unique per message
349
351
let mut plaintext = cipher. decrypt ( nonce, to_decrypt_slice) . unwrap ( ) ;
0 commit comments