Skip to content

Commit 633ce7b

Browse files
author
Dario Maiocchi
committed
add tests for encrypt
1 parent 1cd3de0 commit 633ce7b

File tree

3 files changed

+137
-10
lines changed

3 files changed

+137
-10
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/mod-crypto/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@ serde.workspace = true
1414
rand.workspace = true
1515
aws-lc-rs = "1.13.1"
1616
hex.workspace = true
17+
tokio = {workspace=true, features=["full"]}

crates/mod-crypto/src/lib.rs

Lines changed: 135 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ use aws_lc_rs::cipher::{
55
};
66

77
use data_encoding::{
8-
BASE32, BASE32HEX, BASE32HEX_NOPAD, BASE32_NOPAD, BASE64, BASE64URL, BASE64URL_NOPAD,
9-
BASE64_NOPAD, HEXLOWER,
8+
BASE32, BASE32_NOPAD, BASE32HEX, BASE32HEX_NOPAD, BASE64, BASE64_NOPAD, BASE64URL,
9+
BASE64URL_NOPAD, HEXLOWER,
1010
};
1111

12-
use mlua::prelude::LuaUserData;
13-
use mlua::{Lua, MetaMethod, UserDataFields, UserDataMethods, Value, Error as LuaError};
1412
use config::{any_err, from_lua_value, get_or_create_sub_module};
1513
use data_loader::KeySource;
1614
use hex::decode;
15+
use mlua::prelude::LuaUserData;
16+
use mlua::{Error as LuaError, Lua, MetaMethod, UserDataFields, UserDataMethods, Value};
1717
use std::str;
1818

1919
use serde::Deserialize;
@@ -70,7 +70,6 @@ impl AesKey {
7070
}
7171
}
7272

73-
7473
struct EncryptResult(Vec<u8>);
7574

7675
impl LuaUserData for EncryptResult {
@@ -103,9 +102,7 @@ impl LuaUserData for EncryptResult {
103102
}
104103
}
105104

106-
107-
108-
fn aes_encrypt_block(plaintext: &str, params: AesParams) -> anyhow::Result<EncryptResult> {
105+
fn aes_encrypt_block(plaintext: &str, params: AesParams) -> anyhow::Result<EncryptResult> {
109106
let mut buf_ciphertext = plaintext.as_bytes().to_vec();
110107
let enc_key: PaddedBlockEncryptingKey;
111108

@@ -330,7 +327,8 @@ mod tests {
330327
"Ciphertext should contain IV + data"
331328
);
332329

333-
let decrypted_text = aes_decrypt_block(ciphertext_with_iv.0.as_slice(), params.clone())?;
330+
let decrypted_text =
331+
aes_decrypt_block(ciphertext_with_iv.0.as_slice(), params.clone())?;
334332
let decrypted_string = String::from_utf8(decrypted_text)?;
335333

336334
assert_eq!(decrypted_string, plaintext);
@@ -356,12 +354,139 @@ mod tests {
356354
"Ciphertext should contain IV + data"
357355
);
358356

359-
let decrypted_text = aes_decrypt_block(ciphertext_with_iv.0.as_slice(), params.clone())?;
357+
let decrypted_text =
358+
aes_decrypt_block(ciphertext_with_iv.0.as_slice(), params.clone())?;
360359
let decrypted_string = String::from_utf8(decrypted_text)?;
361360

362361
assert_eq!(decrypted_string, plaintext);
363362

363+
Ok(())
364+
}
365+
}
366+
#[cfg(test)]
367+
mod tests {
368+
use super::*;
369+
use anyhow::Result;
370+
use hex;
371+
use mlua::Lua;
372+
373+
mod encrypt_result_lua_tests {
374+
use super::*;
375+
376+
#[tokio::test]
377+
async fn test_encrypt_result_hex_field() -> Result<()> {
378+
let lua = Lua::new();
379+
super::register(&lua)?;
380+
381+
let plaintext = "testdata";
382+
let key_hex = "2b7e151628aed2a6abf7158809cf4f3c"; // AES-128 key
383+
let key_bytes = hex::decode(key_hex)?;
384+
385+
let params = AesParams {
386+
key: AesKey::Aes128(key_bytes.try_into().unwrap()),
387+
algorithm: AesAlgo::Ecb(),
388+
};
389+
390+
let encrypted_data_result = aes_encrypt_block(plaintext, params)?; // This is EncryptResult
391+
let expected_cipher_bytes = encrypted_data_result.0.clone(); // Get the actual encrypted bytes
392+
393+
let lua_encrypt_result = lua.create_userdata(encrypted_data_result)?;
394+
lua.globals().set("encrypted_obj", lua_encrypt_result)?;
395+
396+
let lua_script = r#"
397+
return encrypted_obj.hex
398+
"#;
399+
let hex_output: String = lua.load(lua_script).eval()?;
400+
assert_eq!(hex_output, HEXLOWER.encode(&expected_cipher_bytes)); // Compare with hex of actual encrypted bytes
401+
402+
Ok(())
403+
}
404+
405+
#[tokio::test]
406+
async fn test_encrypt_result_base64_field() -> Result<()> {
407+
let lua = Lua::new();
408+
super::register(&lua)?;
409+
410+
let plaintext = "another test string for base64";
411+
let key_hex = "603deb1015ca71be2b73aef0857d7781a5b6b8e5b62c65e9f1f63b7ee7ec6f2f"; // AES-256 key
412+
let key_bytes = hex::decode(key_hex)?;
413+
414+
let params = AesParams {
415+
key: AesKey::Aes256(key_bytes.try_into().unwrap()),
416+
algorithm: AesAlgo::Ecb(),
417+
};
418+
419+
let encrypted_data_result = aes_encrypt_block(plaintext, params)?; // This is EncryptResult
420+
let expected_cipher_bytes = encrypted_data_result.0.clone(); // Get the actual encrypted bytes
421+
422+
let lua_encrypt_result = lua.create_userdata(encrypted_data_result)?;
423+
lua.globals().set("encrypted_obj", lua_encrypt_result)?;
424+
425+
let lua_script = r#"
426+
return encrypted_obj.base64
427+
"#;
428+
let base64_output: String = lua.load(lua_script).eval()?;
429+
assert_eq!(base64_output, BASE64.encode(&expected_cipher_bytes)); // Compare with base64 of actual encrypted bytes
430+
431+
Ok(())
432+
}
433+
434+
#[tokio::test]
435+
async fn test_encrypt_result_bytes_field() -> Result<()> {
436+
let lua = Lua::new();
437+
super::register(&lua)?;
438+
439+
let plaintext = "raw bytes test";
440+
let key_hex = "2b7e151628aed2a6abf7158809cf4f3c";
441+
let key_bytes = hex::decode(key_hex)?;
442+
443+
let params = AesParams {
444+
key: AesKey::Aes128(key_bytes.try_into().unwrap()),
445+
algorithm: AesAlgo::Ecb(),
446+
};
447+
448+
let encrypted_data = aes_encrypt_block(plaintext, params)?;
449+
let expected_bytes = encrypted_data.0.clone(); // Clone the internal bytes before moving `encrypted_data`
450+
let lua_encrypt_result = lua.create_userdata(encrypted_data)?;
451+
lua.globals().set("encrypted_obj", lua_encrypt_result)?;
452+
453+
let lua_script = r#"
454+
return encrypted_obj.bytes
455+
"#;
456+
let bytes_output: mlua::String = lua.load(lua_script).eval()?;
457+
assert_eq!(bytes_output.as_bytes(), expected_bytes.as_slice());
458+
459+
Ok(())
460+
}
461+
462+
#[tokio::test]
463+
async fn test_encrypt_result_tostring_method() -> Result<()> {
464+
let lua = Lua::new();
465+
super::register(&lua)?;
466+
467+
let plaintext = "tostring method test";
468+
let key_hex = "603deb1015ca71be2b73aef0857d7781a5b6b8e5b62c65e9f1f63b7ee7ec6f2f";
469+
let key_bytes = hex::decode(key_hex)?;
470+
471+
let params = AesParams {
472+
key: AesKey::Aes256(key_bytes.try_into().unwrap()),
473+
algorithm: AesAlgo::Ecb(),
474+
};
475+
476+
let encrypted_data = aes_encrypt_block(plaintext, params)?;
477+
let expected_hex = HEXLOWER.encode(&encrypted_data.0); // Get expected hex before moving
478+
let lua_encrypt_result = lua.create_userdata(encrypted_data)?;
479+
lua.globals().set("encrypted_obj", lua_encrypt_result)?;
480+
481+
let lua_script = r#"
482+
return tostring(encrypted_obj)
483+
"#;
484+
let tostring_output: String = lua.load(lua_script).eval()?;
485+
assert_eq!(tostring_output, expected_hex);
486+
364487
Ok(())
365488
}
366489
}
367490
}
491+
}
492+

0 commit comments

Comments
 (0)