1pub use decryptor::Sm4GcmStreamDecryptor;
2pub use encryptor::Sm4GcmStreamEncryptor;
3
4pub use crate::decryptor::sm4_gcm_aad_decrypt;
5pub use crate::decryptor::sm4_gcm_decrypt;
6pub use crate::encryptor::sm4_gcm_aad_encrypt;
7pub use crate::encryptor::sm4_gcm_encrypt;
8pub use crate::util::Sm4Key;
9
10mod util;
11mod encryptor;
12mod decryptor;
13
14#[test]
16fn test_sm4_gcm() {
17 let data = vec![
18 ([0u8; 16], [0u8; 12], &[][..], &b"A"[..], "3c0a0922976fa15e835bc96750e730d967"),
19 ([0u8; 16], [0u8; 12], &[][..], &b"hello world"[..], "1587c6137e306fed6a6a5f49539b6dd6fe2b7872c3279636db07c2"),
20 ([0u8; 16], [0xffu8; 12], &[][..], &b"Hello World!"[..], "cba3523bdf74096f3de1f9160a5adb7bf385dea4d50c910e663ec75a"),
21 ([0xffu8; 16], [0xffu8; 12], &[][..], &b"Hello World!"[..], "99eb1206b5b2a9f9c7d7ec4a81de507f5d79938a10ccd91da68d2fb1"),
22 ([0xffu8; 16], [0xffu8; 12], &[0xaau8, 0xbbu8, 0xccu8][..], &b"Hello World!"[..], "99eb1206b5b2a9f9c7d7ec4a7be091388b3049363189e64a47d20c19"),
23 ([0xffu8; 16], [0xffu8; 12], &[0u8, 1u8, 2u8, 3u8][..], &b"Hello World!"[..], "99eb1206b5b2a9f9c7d7ec4ac157a74de0381b3aa170385a113d4f31"),
24 ([0u8; 16], [0u8; 12], &[][..],
25 &b"Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!"[..],
26 "3587c6137e304fed6a6a5fc0f78e01e5ea4b604843929848601d4b1600e35c1\
27 987a30fd521f6b8f66e950cfb735ca19ab45bd8d050a06b2d560a5927a5611f76\
28 82cd8c6db56ab52dae82a6db190c54ff8299ac7d339f92db"),
29 ];
30
31 for (key, nonce, aad, message, expected) in data {
32 let encrypted = sm4_gcm_aad_encrypt(&Sm4Key(key), &nonce, aad, message);
33 let encrypted_hex = hex::encode(&encrypted);
34 assert_eq!(expected, &encrypted_hex);
35
36 let decrypted = sm4_gcm_aad_decrypt(&Sm4Key(key), &nonce, aad, &encrypted).unwrap();
37 assert_eq!(message, decrypted.as_slice());
38 }
39}