Skip to main content

robinpath_modules/modules/
crypto_mod.rs

1use hmac::{Hmac, Mac};
2use md5::Md5;
3use robinpath::{RobinPath, Value};
4use sha1::Sha1;
5use sha2::{Digest, Sha256, Sha512};
6
7pub fn register(rp: &mut RobinPath) {
8    rp.register_builtin("crypto.md5", |args, _| {
9        let s = args.first().map(|v| v.to_display_string()).unwrap_or_default();
10        let mut hasher = Md5::new();
11        hasher.update(s.as_bytes());
12        Ok(Value::String(hex::encode(hasher.finalize())))
13    });
14
15    rp.register_builtin("crypto.sha1", |args, _| {
16        let s = args.first().map(|v| v.to_display_string()).unwrap_or_default();
17        let mut hasher = Sha1::new();
18        hasher.update(s.as_bytes());
19        Ok(Value::String(hex::encode(hasher.finalize())))
20    });
21
22    rp.register_builtin("crypto.sha256", |args, _| {
23        let s = args.first().map(|v| v.to_display_string()).unwrap_or_default();
24        let mut hasher = Sha256::new();
25        hasher.update(s.as_bytes());
26        Ok(Value::String(hex::encode(hasher.finalize())))
27    });
28
29    rp.register_builtin("crypto.sha512", |args, _| {
30        let s = args.first().map(|v| v.to_display_string()).unwrap_or_default();
31        let mut hasher = Sha512::new();
32        hasher.update(s.as_bytes());
33        Ok(Value::String(hex::encode(hasher.finalize())))
34    });
35
36    rp.register_builtin("crypto.hmac", |args, _| {
37        let algo = args.first().map(|v| v.to_display_string()).unwrap_or_default();
38        let msg = args.get(1).map(|v| v.to_display_string()).unwrap_or_default();
39        let key = args.get(2).map(|v| v.to_display_string()).unwrap_or_default();
40
41        match algo.to_lowercase().as_str() {
42            "md5" => {
43                let mut mac =
44                    Hmac::<Md5>::new_from_slice(key.as_bytes()).map_err(|e| e.to_string())?;
45                mac.update(msg.as_bytes());
46                Ok(Value::String(hex::encode(mac.finalize().into_bytes())))
47            }
48            "sha1" => {
49                let mut mac =
50                    Hmac::<Sha1>::new_from_slice(key.as_bytes()).map_err(|e| e.to_string())?;
51                mac.update(msg.as_bytes());
52                Ok(Value::String(hex::encode(mac.finalize().into_bytes())))
53            }
54            "sha256" => {
55                let mut mac =
56                    Hmac::<Sha256>::new_from_slice(key.as_bytes()).map_err(|e| e.to_string())?;
57                mac.update(msg.as_bytes());
58                Ok(Value::String(hex::encode(mac.finalize().into_bytes())))
59            }
60            "sha512" => {
61                let mut mac =
62                    Hmac::<Sha512>::new_from_slice(key.as_bytes()).map_err(|e| e.to_string())?;
63                mac.update(msg.as_bytes());
64                Ok(Value::String(hex::encode(mac.finalize().into_bytes())))
65            }
66            _ => Err(format!("unsupported hmac algorithm: {}", algo)),
67        }
68    });
69}