1use anyhow::Result;
2use pbkdf2::pbkdf2_hmac;
3use rust_tokio_kcp::NoneBlockCrypt;
4use sha1::Sha1;
5use std::sync::Arc;
6
7pub use rust_tokio_kcp::BlockCrypt;
8
9pub const SALT: &[u8] = b"kcp-go";
10
11pub fn derive_key(password: &str) -> Vec<u8> {
13 let mut key = vec![0u8; 32];
14 pbkdf2_hmac::<Sha1>(password.as_bytes(), SALT, 4096, &mut key);
15 key
16}
17
18pub fn create_block_crypt(crypt: &str, key: &[u8]) -> Result<Option<Arc<dyn BlockCrypt>>> {
20 match crypt.to_lowercase().as_str() {
21 "auto" => {
22 Ok(None)
23 }
24
25 "none" => {
26 let crypt = NoneBlockCrypt::new(b"dummy_key").map_err(|e| anyhow::anyhow!("Failed to create None: {}", e))?;
28 Ok(Some(crypt))
29 }
30 "aes" | "aes-128" => {
31 let crypt = rust_tokio_kcp::Aes128BlockCrypt::new(&key[..16])
32 .map_err(|e| anyhow::anyhow!("Failed to create AES-128: {}", e))?;
33 Ok(Some(Arc::new(crypt)))
34 }
35 "aes-192" => {
36 let crypt = rust_tokio_kcp::Aes192BlockCrypt::new(&key[..24])
37 .map_err(|e| anyhow::anyhow!("Failed to create AES-192: {}", e))?;
38 Ok(Some(Arc::new(crypt)))
39 }
40 "aes-256" => {
41 let crypt = rust_tokio_kcp::Aes256BlockCrypt::new(&key[..32])
42 .map_err(|e| anyhow::anyhow!("Failed to create AES-256: {}", e))?;
43 Ok(Some(Arc::new(crypt)))
44 }
45 "tea" => {
46 let crypt = rust_tokio_kcp::TeaBlockCrypt::new(&key[..16])
47 .map_err(|e| anyhow::anyhow!("Failed to create TEA: {}", e))?;
48 Ok(Some(Arc::new(crypt)))
49 }
50 "xtea" => {
51 let crypt = rust_tokio_kcp::XteaBlockCrypt::new(&key[..16])
52 .map_err(|e| anyhow::anyhow!("Failed to create XTEA: {}", e))?;
53 Ok(Some(Arc::new(crypt)))
54 }
55 "xor" | "simple_xor" => {
56 let crypt = rust_tokio_kcp::SimpleXorBlockCrypt::new(key)
57 .map_err(|e| anyhow::anyhow!("Failed to create SimpleXOR: {}", e))?;
58 Ok(Some(Arc::new(crypt)))
59 }
60 "blowfish" => {
61 let crypt = rust_tokio_kcp::BlowfishBlockCrypt::new(key)
62 .map_err(|e| anyhow::anyhow!("Failed to create Blowfish: {}", e))?;
63 Ok(Some(Arc::new(crypt)))
64 }
65 "cast5" => {
66 let crypt = rust_tokio_kcp::Cast5BlockCrypt::new(&key[..16])
67 .map_err(|e| anyhow::anyhow!("Failed to create CAST5: {}", e))?;
68 Ok(Some(Arc::new(crypt)))
69 }
70 "3des" | "triple_des" => {
71 let crypt = rust_tokio_kcp::TripleDesBlockCrypt::new(&key[..24])
72 .map_err(|e| anyhow::anyhow!("Failed to create 3DES: {}", e))?;
73 Ok(Some(Arc::new(crypt)))
74 }
75 "twofish" => {
76 let crypt = rust_tokio_kcp::TwofishBlockCrypt::new(key)
77 .map_err(|e| anyhow::anyhow!("Failed to create Twofish: {}", e))?;
78 Ok(Some(Arc::new(crypt)))
79 }
80 "salsa20" => {
81 let crypt = rust_tokio_kcp::Salsa20BlockCrypt::new(key)
82 .map_err(|e| anyhow::anyhow!("Failed to create Salsa20: {}", e))?;
83 Ok(Some(Arc::new(crypt)))
84 }
85 "sm4" => {
86 let crypt = rust_tokio_kcp::Sm4BlockCrypt::new(&key[..16])
87 .map_err(|e| anyhow::anyhow!("Failed to create SM4: {}", e))?;
88 Ok(Some(Arc::new(crypt)))
89 }
90 "aes-128-gcm" => {
91 let crypt = rust_tokio_kcp::AesGcmBlockCrypt::new(&key[..16])
92 .map_err(|e| anyhow::anyhow!("Failed to create AES-128-GCM: {}", e))?;
93 Ok(Some(Arc::new(crypt)))
94 }
95 _ => {
96 match key.len(){
97 16 => {
98 let crypt = rust_tokio_kcp::Aes128BlockCrypt::new(&key[..16])
99 .map_err(|e| anyhow::anyhow!("Failed to create AES-128: {}", e))?;
100 Ok(Some(Arc::new(crypt)))
101 }
102 24 => {
103 let crypt = rust_tokio_kcp::Aes192BlockCrypt::new(&key[..24])
104 .map_err(|e| anyhow::anyhow!("Failed to create AES-192: {}", e))?;
105 Ok(Some(Arc::new(crypt)))
106 }
107 32 => {
108 let crypt = rust_tokio_kcp::Aes256BlockCrypt::new(&key[..32])
109 .map_err(|e| anyhow::anyhow!("Failed to create AES-256: {}", e))?;
110 Ok(Some(Arc::new(crypt)))
111 }
112 _ => {
113 anyhow::bail!("Unsupported key length: {}", key.len())
114 }
115 }
116 }
118 }
119}