1pub use cfx_crypto::crypto::*;
27
28pub use cfx_crypto::crypto::{KEY_ITERATIONS, KEY_LENGTH, KEY_LENGTH_AES};
30
31pub mod ecies {
32 use super::Error;
33 use crate::{Public, Random, Secret};
34
35 pub fn encrypt(
40 public: &Public, auth_data: &[u8], plain: &[u8],
41 ) -> Result<Vec<u8>, Error> {
42 let mut generator = Random;
43 cfx_crypto::crypto::ecies::encrypt(
44 &mut generator,
45 public,
46 auth_data,
47 plain,
48 )
49 }
50
51 pub fn decrypt(
54 secret: &Secret, auth_data: &[u8], encrypted: &[u8],
55 ) -> Result<Vec<u8>, Error> {
56 cfx_crypto::crypto::ecies::decrypt(secret, auth_data, encrypted)
57 }
58}
59
60#[cfg(test)]
61mod tests {
62 use super::{ecdh, ecies};
63 use crate::{
64 crypto::scrypt::derive_key, KeyPairGenerator, Public, Random, Secret,
65 };
66 use std::{io::Error, str::FromStr};
67
68 #[test]
69 fn ecies_shared() {
70 let kp = Random.generate().unwrap();
71 let message = b"So many books, so little time";
72
73 let shared = b"shared";
74 let wrong_shared = b"incorrect";
75 let encrypted = ecies::encrypt(kp.public(), shared, message).unwrap();
76 assert_ne!(encrypted[..], message[..]);
77 assert_eq!(encrypted[0], 0x04);
78
79 assert!(ecies::decrypt(kp.secret(), wrong_shared, &encrypted).is_err());
80 let decrypted =
81 ecies::decrypt(kp.secret(), shared, &encrypted).unwrap();
82 assert_eq!(decrypted[..message.len()], message[..]);
83 }
84
85 #[test]
86 fn ecdh_agree() {
87 let secret = Secret::from_str(
92 "3d6c3a910832105febef6f8111b51b11e6cb190fb45b5fc70ee6290c411e9a09",
93 )
94 .unwrap();
95 let publ = Public::from_str("4cf74522f3c86d88cd2ba56b378d3fccd4ba3fe93fe4e11ebecc24b06085fc37ee63073aa998693cf2573dc9a437ac0a94d9093054419d23390bad2329ee5eee").unwrap();
96
97 let agree_secret = ecdh::agree(&secret, &publ).unwrap();
98
99 let expected = Secret::from_str(
100 "c6440592fa14256dbbc39639b77524e51bac84b64fa1b1726130a49263f1fb6f",
101 )
102 .unwrap();
103 assert_eq!(agree_secret, expected);
104 }
105 #[test]
108 pub fn test_derive() -> Result<(), Error> {
109 let pass = [109, 121, 112, 97, 115, 115, 10];
110 let salt = [
111 109, 121, 115, 97, 108, 116, 115, 104, 111, 117, 108, 100, 102,
112 105, 108, 108, 115, 111, 109, 109, 101, 98, 121, 116, 101, 108,
113 101, 110, 103, 116, 104, 10,
114 ];
115 let r1 = [
116 93, 134, 79, 68, 223, 27, 44, 174, 236, 184, 179, 203, 74, 139, 73,
117 66,
118 ];
119 let r2 = [
120 2, 24, 239, 131, 172, 164, 18, 171, 132, 207, 22, 217, 150, 20,
121 203, 37,
122 ];
123 let l1 = [
124 6, 90, 119, 45, 67, 2, 99, 151, 81, 88, 166, 210, 244, 19, 123, 208,
125 ];
126 let l2 = [
127 253, 123, 132, 12, 188, 89, 196, 2, 107, 224, 239, 231, 135, 177,
128 125, 62,
129 ];
130
131 let (l, r) = derive_key(&pass[..], &salt, 262, 1, 8).unwrap();
132 assert_eq!(l, r1);
133 assert_eq!(r, l1);
134 let (l, r) = derive_key(&pass[..], &salt, 144, 4, 4).unwrap();
135 assert_eq!(l, r2);
136 assert_eq!(r, l2);
137 Ok(())
138 }
139}