@@ -5,15 +5,15 @@ use aws_lc_rs::cipher::{
5
5
} ;
6
6
7
7
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 ,
10
10
} ;
11
11
12
- use mlua:: prelude:: LuaUserData ;
13
- use mlua:: { Lua , MetaMethod , UserDataFields , UserDataMethods , Value , Error as LuaError } ;
14
12
use config:: { any_err, from_lua_value, get_or_create_sub_module} ;
15
13
use data_loader:: KeySource ;
16
14
use hex:: decode;
15
+ use mlua:: prelude:: LuaUserData ;
16
+ use mlua:: { Error as LuaError , Lua , MetaMethod , UserDataFields , UserDataMethods , Value } ;
17
17
use std:: str;
18
18
19
19
use serde:: Deserialize ;
@@ -70,7 +70,6 @@ impl AesKey {
70
70
}
71
71
}
72
72
73
-
74
73
struct EncryptResult ( Vec < u8 > ) ;
75
74
76
75
impl LuaUserData for EncryptResult {
@@ -103,9 +102,7 @@ impl LuaUserData for EncryptResult {
103
102
}
104
103
}
105
104
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 > {
109
106
let mut buf_ciphertext = plaintext. as_bytes ( ) . to_vec ( ) ;
110
107
let enc_key: PaddedBlockEncryptingKey ;
111
108
@@ -330,7 +327,8 @@ mod tests {
330
327
"Ciphertext should contain IV + data"
331
328
) ;
332
329
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 ( ) ) ?;
334
332
let decrypted_string = String :: from_utf8 ( decrypted_text) ?;
335
333
336
334
assert_eq ! ( decrypted_string, plaintext) ;
@@ -356,12 +354,139 @@ mod tests {
356
354
"Ciphertext should contain IV + data"
357
355
) ;
358
356
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 ( ) ) ?;
360
359
let decrypted_string = String :: from_utf8 ( decrypted_text) ?;
361
360
362
361
assert_eq ! ( decrypted_string, plaintext) ;
363
362
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
+
364
487
Ok ( ( ) )
365
488
}
366
489
}
367
490
}
491
+ }
492
+
0 commit comments