Skip to main content

recipher/
lib.rs

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        // Include ser/de in the test chain
21        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        // TODO: Use quickcheck for this!
28        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        // TODO: Pass as reference
56        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        // TODO: Randomize message
68        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}