robinpath_modules/modules/
crypto_mod.rs1use 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}