1mod aont;
2pub mod cipher;
3pub mod errors;
4pub mod key;
5pub mod keyset;
6mod permutation;
7
8#[cfg(test)]
9mod tests {
10 use crate::{
11 cipher::{ProxyCipher, SymmetricCipher},
12 key::{GenRandom, Iv},
13 keyset::{EncryptionKeySet, ProxyKeySet},
14 };
15 use hex_literal::hex;
16 use rand::thread_rng;
17 use std::error::Error;
18
19 fn target_keyset() -> Result<EncryptionKeySet, Box<dyn Error>> {
20 let keyset = EncryptionKeySet::generate()?;
22 Ok(EncryptionKeySet::from_bytes(&keyset.to_bytes()?)?)
23 }
24
25 #[test]
26 fn round_trip_test() -> Result<(), Box<dyn Error>> {
27 let kset_enc = EncryptionKeySet::generate()?;
29
30 let message = hex!(
31 "97f1c20d8e45c476ca524a507c1b79cea389ee462e611e5036d3ccdacfdabb411fd2d0b12b91d46f79bd163f6425a23f37dad7dfa2a11ba5b07da1681a11029b53ac079f45ec54f5293312e762f6628d0710b273e40395967e136dbc1b8307087d39ed24c3be12bb6f0787248b226236f2024c2fc94f92b5c04a6caf6f5a5b042c1cdff3de47fe196917daa136aeedcab8f564731f9a9f5c47ff74902bfca92da61159b784bdee9e41f5079e9c19422903cc2d0436d6e533aa7d7d8af1ce73b6c4893967a4ac630476ba46996a3f7a62324dffa9112846245848197684689b65ebe3113be3786df69cc161951d90459c966f3f837e5463422c3d550d568a55c3036e47a2c160c5122729fa4338243960823f9ba5d1749023d187d912ac5144536910a93fa891b298d2ca268f2f3a5978ab8be227ae46fb5c420166d489b7bc544c347820c4f61b60dae976612cbd984432149fa129a2568a581aaed55e1763981dea766ff231935c82575e2524cd670cd2fb11dac92a0ad45125f72f256ed85463bac0f74bceeb1a7e0ea906c85457902cc2825cd6f454d0b2f7d72e7d9bd92a3fb1e1193eef86137a8f326abdac51dcf0fa2aa92ad404d07a39b40cfd1e33fc58d69225d4ee8b133a38505e68d61fedb738d84f9f580e11818597f9eedd43856660a681d609036dff5e4cfe869408b87447456fa104e8f72c24881f209be044"
32 ).to_vec();
33 let cipher = SymmetricCipher::new(&kset_enc);
34 let iv: Iv = GenRandom::gen_random(&mut thread_rng())?;
35
36 assert_eq!(
37 message.to_vec(),
38 cipher.decrypt::<16>(&iv, &cipher.encrypt::<16>(&iv, &message))
39 );
40
41 Ok(())
42 }
43
44 #[test]
45 fn rencryption_round_trip_test() -> Result<(), Box<dyn Error>> {
46 let kset_enc = EncryptionKeySet::generate()?;
47 let kset_target = target_keyset()?;
48 let kset_proxy = ProxyKeySet::generate(&kset_enc, &kset_target);
49
50 let message = hex!("97f1c20d8e45c476ca524a507c1b79cea389ee462e611e5036d3ccdacfdabb411fd2d0b12b91d46f79bd163f6425a23f37dad7dfa2a11ba5b07da1681a11029b53ac079f45ec54f5293312e762f6628d0710b273e40395967e136dbc1b8307087d39ed24c3be12bb6f0787248b226236f2024c2fc94f92b5c04a6caf6f5a5b042c1cdff3de47fe196917daa136aeedcab8f564731f9a9f5c47ff74902bfca92da61159b784bdee9e41f5079e9c19422903cc2d0436d6e533aa7d7d8af1ce73b6c4893967a4ac630476ba46996a3f7a62324dffa9112846245848197684689b65ebe3113be3786df69cc161951d90459c966f3f837e5463422c3d550d568a55c3036e47a2c160c5122729fa4338243960823f9ba5d1749023d187d912ac5144536910a93fa891b298d2ca268f2f3a5978ab8be227ae46fb5c420166d489b7bc544c347820c4f61b60dae976612cbd984432149fa129a2568a581aaed55e1763981dea766ff231935c82575e2524cd670cd2fb11dac92a0ad45125f72f256ed85463bac0f74bceeb1a7e0ea906c85457902cc2825cd6f454d0b2f7d72e7d9bd92a3fb1e1193eef86137a8f326abdac51dcf0fa2aa92ad404d07a39b40cfd1e33fc58d69225d4ee8b133a38505e68d61fedb738d84f9f580e11818597f9eedd43856660a681d609036dff5e4cfe869408b87447456fa104e8f72c24881f209be044");
51 let cipher = SymmetricCipher::new(&kset_enc);
52 let iv: Iv = GenRandom::gen_random(&mut thread_rng()).unwrap();
53 let ct: Vec<u8> = cipher.encrypt::<16>(&iv, message.as_ref());
54
55 let re = ProxyCipher::new(&kset_proxy);
57 let rct = re.reencrypt::<16>(&iv, &ct);
58 let target_cipher = SymmetricCipher::new(&kset_target);
59
60 assert_eq!(message.to_vec(), target_cipher.decrypt::<16>(&iv, &rct));
61
62 Ok(())
63 }
64
65 #[test]
66 fn homomorphism_test() -> Result<(), Box<dyn Error>> {
67 let message = hex!("97f1c20d8e45c476ca524a507c1b79cea389ee462e611e5036d3ccdacfdabb411fd2d0b12b91d46f79bd163f6425a23f37dad7dfa2a11ba5b07da1681a11029b53ac079f45ec54f5293312e762f6628d0710b273e40395967e136dbc1b8307087d39ed24c3be12bb6f0787248b226236f2024c2fc94f92b5c04a6caf6f5a5b042c1cdff3de47fe196917daa136aeedcab8f564731f9a9f5c47ff74902bfca92da61159b784bdee9e41f5079e9c19422903cc2d0436d6e533aa7d7d8af1ce73b6c4893967a4ac630476ba46996a3f7a62324dffa9112846245848197684689b65ebe3113be3786df69cc161951d90459c966f3f837e5463422c3d550d568a55c3036e47a2c160c5122729fa4338243960823f9ba5d1749023d187d912ac5144536910a93fa891b298d2ca268f2f3a5978ab8be227ae46fb5c420166d489b7bc544c347820c4f61b60dae976612cbd984432149fa129a2568a581aaed55e1763981dea766ff231935c82575e2524cd670cd2fb11dac92a0ad45125f72f256ed85463bac0f74bceeb1a7e0ea906c85457902cc2825cd6f454d0b2f7d72e7d9bd92a3fb1e1193eef86137a8f326abdac51dcf0fa2aa92ad404d07a39b40cfd1e33fc58d69225d4ee8b133a38505e68d61fedb738d84f9f580e11818597f9eedd43856660a681d609036dff5e4cfe869408b87447456fa104e8f72c24881f209be044");
69
70 let kset_target = EncryptionKeySet::generate()?;
71
72 let kset_enc_1 = EncryptionKeySet::generate()?;
73 let kset_enc_2 = EncryptionKeySet::generate()?;
74 let kset_proxy_1 = ProxyKeySet::generate(&kset_enc_1, &kset_target);
75 let kset_proxy_2 = ProxyKeySet::generate(&kset_enc_2, &kset_target);
76
77 let iv: Iv = GenRandom::gen_random(&mut thread_rng()).unwrap();
78 let ct1: Vec<u8> = SymmetricCipher::new(&kset_enc_1).encrypt::<16>(&iv, message.as_ref());
79 let rct1 = ProxyCipher::new(&kset_proxy_1).reencrypt::<16>(&iv, &ct1);
80
81 let ct2: Vec<u8> = SymmetricCipher::new(&kset_enc_2).encrypt::<16>(&iv, message.as_ref());
82 let rct2 = ProxyCipher::new(&kset_proxy_2).reencrypt::<16>(&iv, &ct2);
83
84 assert_eq!(rct1, rct2);
85
86 Ok(())
87 }
88}