Skip to content

Commit 6c66ba3

Browse files
authored
Merge pull request #51 from Cryptographic-API-Services/#50-aes-key-in-bytes
#50 aes key in bytes
2 parents 7288534 + 116bef8 commit 6c66ba3

File tree

1 file changed

+69
-67
lines changed

1 file changed

+69
-67
lines changed

src/aes.rs

Lines changed: 69 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ pub struct AesNonce {
1414
pub length: usize
1515
}
1616

17+
#[repr(C)]
18+
pub struct AesKeyResult {
19+
pub key: *mut c_uchar,
20+
pub length: usize
21+
}
22+
1723
#[repr(C)]
1824
pub struct AesBytesEncrypt {
1925
pub ciphertext: *mut c_uchar,
@@ -28,7 +34,8 @@ pub struct AesBytesDecrypt {
2834

2935
#[repr(C)]
3036
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,
3239
pub aes_nonce_ptr: *mut c_uchar,
3340
pub aes_nonce_ptr_length: usize
3441
}
@@ -41,18 +48,24 @@ pub extern "C" fn aes_256_key_and_nonce_from_x25519_diffie_hellman_shared_secret
4148
let shared_secret_slice: &[u8] =
4249
unsafe { std::slice::from_raw_parts(shared_secret, shared_secret_length) };
4350

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+
5061
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(),
5264
aes_nonce_ptr: aes_nonce.as_mut_ptr(),
5365
aes_nonce_ptr_length: aes_nonce.len()
5466
};
5567
std::mem::forget(aes_nonce);
68+
std::mem::forget(aes_key);
5669
result
5770
}
5871

@@ -98,16 +111,11 @@ pub fn aes_256_key_and_nonce_from_x25519_diffie_hellman_shared_secret_test() {
98111
bob_shared_secret.shared_secret_length,
99112
);
100113

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-
106114
let password = "DontUseThisPassword";
107115
let password_cstr = password.as_bytes();
108116
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);
111119
let plain_text_result_slice: &[u8] = unsafe {
112120
std::slice::from_raw_parts(
113121
plain_text_result.plaintext,
@@ -127,18 +135,24 @@ pub extern "C" fn aes_128_key_and_nonce_from_x25519_diffie_hellman_shared_secret
127135

128136
let mut shorted_shared_secret: [u8; 16] = Default::default();
129137
shorted_shared_secret.copy_from_slice(&shared_secret_slice[..16]);
130-
let aes_key = Key::<Aes128Gcm>::from_slice(&shorted_shared_secret);
131138
let mut aes_nonce = Vec::with_capacity(12);
132139
aes_nonce.resize(12, 0);
133140
aes_nonce.copy_from_slice(&shared_secret_slice[..12]);
134141
let capacity = aes_nonce.capacity();
135142
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+
136148
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(),
138151
aes_nonce_ptr: aes_nonce.as_mut_ptr(),
139152
aes_nonce_ptr_length: aes_nonce.len()
140153
};
141154
std::mem::forget(aes_nonce);
155+
std::mem::forget(aes_key);
142156
result
143157
}
144158

@@ -184,15 +198,11 @@ pub fn aes_128_key_and_nonce_from_x25519_diffie_hellman_shared_secret_test() {
184198
bob_shared_secret.shared_secret_length,
185199
);
186200

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-
191201
let password = "DontUseThisPassword";
192202
let password_cstr = password.as_bytes();
193203
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);
196206
let plain_text_result_slice: &[u8] = unsafe {
197207
std::slice::from_raw_parts(
198208
plain_text_result.plaintext,
@@ -219,38 +229,45 @@ pub extern "C" fn aes_nonce() -> AesNonce {
219229
}
220230

221231
#[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
226242
}
227243

228244
#[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
233255
}
234256

235257
#[no_mangle]
236258
pub extern "C" fn aes_128_encrypt_bytes_with_key(
237259
nonce_key: *const c_uchar,
238260
nonce_key_length: usize,
239-
key: *const c_char,
261+
key: *const c_uchar,
262+
key_length: usize,
240263
to_encrypt: *const c_uchar,
241264
to_encrypt_length: usize,
242265
) -> AesBytesEncrypt {
243266
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)};
250268
let to_encrypt_slice: &[u8] =
251269
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);
254271
let mut cipher = Aes128Gcm::new(&key);
255272
let nonce = Nonce::from_slice(nonce_slice); // 96-bits; unique per message
256273
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(
268285
pub extern "C" fn aes_256_encrypt_bytes_with_key(
269286
nonce_key: *const c_uchar,
270287
nonce_key_length: usize,
271-
key: *const c_char,
288+
key: *const c_uchar,
289+
key_length: usize,
272290
to_decrypt: *const c_uchar,
273291
to_decrypt_length: usize,
274292
) -> AesBytesEncrypt {
275293
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)};
282295
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);
285297
let mut cipher = Aes256Gcm::new(&key);
286298
let nonce = Nonce::from_slice(nonce_slice); // 96-bits; unique per message
287299
let mut ciphertext = cipher.encrypt(nonce, to_decrypt_slice).unwrap();
@@ -299,20 +311,15 @@ pub extern "C" fn aes_256_encrypt_bytes_with_key(
299311
pub extern "C" fn aes_128_decrypt_bytes_with_key(
300312
nonce_key: *const c_uchar,
301313
nonce_key_length: usize,
302-
key: *const c_char,
314+
key: *const c_uchar,
315+
key_length: usize,
303316
to_decrypt: *const c_uchar,
304317
to_decrypt_length: usize,
305318
) -> AesBytesDecrypt {
306319
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)};
313321
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);
316323
let mut cipher = Aes128Gcm::new(&key);
317324
let nonce = Nonce::from_slice(nonce_slice); // 96-bits; unique per message
318325
let mut plaintext = cipher.decrypt(nonce, to_decrypt_slice).unwrap();
@@ -330,20 +337,15 @@ pub extern "C" fn aes_128_decrypt_bytes_with_key(
330337
pub extern "C" fn aes_256_decrypt_bytes_with_key(
331338
nonce_key: *const c_uchar,
332339
nonce_key_length: usize,
333-
key: *const c_char,
340+
key: *const c_uchar,
341+
key_length: usize,
334342
to_decrypt: *const c_uchar,
335343
to_decrypt_length: usize,
336344
) -> AesBytesDecrypt {
337345
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)};
344347
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);
347349
let mut cipher = Aes256Gcm::new(&key);
348350
let nonce = Nonce::from_slice(nonce_slice); // 96-bits; unique per message
349351
let mut plaintext = cipher.decrypt(nonce, to_decrypt_slice).unwrap();

0 commit comments

Comments
 (0)