Files
turso/extensions/crypto/src/lib.rs
2025-06-29 12:14:08 +03:00

121 lines
2.8 KiB
Rust

use crypto::{blake3, decode, encode, md5, sha1, sha256, sha384, sha512};
use turso_ext::{register_extension, scalar, ResultCode, Value};
mod crypto;
#[derive(Debug)]
enum Error {
InvalidType,
UnknownOperation,
DecodeFailed,
InvalidUtf8,
}
#[scalar(name = "crypto_sha256", alias = "crypto_sha256")]
fn crypto_sha256(args: &[Value]) -> Value {
if args.len() != 1 {
return Value::error(ResultCode::Error);
}
let Ok(hash) = sha256(&args[0]) else {
return Value::error(ResultCode::Error);
};
Value::from_blob(hash)
}
#[scalar(name = "crypto_sha512", alias = "crypto_sha512")]
fn crypto_sha512(args: &[Value]) -> Value {
if args.len() != 1 {
return Value::error(ResultCode::Error);
}
let Ok(hash) = sha512(&args[0]) else {
return Value::error(ResultCode::Error);
};
Value::from_blob(hash)
}
#[scalar(name = "crypto_sha384", alias = "crypto_sha384")]
fn crypto_sha384(args: &[Value]) -> Value {
if args.len() != 1 {
return Value::error(ResultCode::Error);
}
let Ok(hash) = sha384(&args[0]) else {
return Value::error(ResultCode::Error);
};
Value::from_blob(hash)
}
#[scalar(name = "crypto_blake3", alias = "crypto_blake3")]
fn crypto_blake3(args: &[Value]) -> Value {
if args.len() != 1 {
return Value::error(ResultCode::Error);
}
let Ok(hash) = blake3(&args[0]) else {
return Value::error(ResultCode::Error);
};
Value::from_blob(hash)
}
#[scalar(name = "crypto_sha1", alias = "crypto_sha1")]
fn crypto_sha1(args: &[Value]) -> Value {
if args.len() != 1 {
return Value::error(ResultCode::Error);
}
let Ok(hash) = sha1(&args[0]) else {
return Value::error(ResultCode::Error);
};
Value::from_blob(hash)
}
#[scalar(name = "crypto_md5", alias = "crypto_md5")]
fn crypto_md5(args: &[Value]) -> Value {
if args.len() != 1 {
return Value::error(ResultCode::Error);
}
let Ok(hash) = md5(&args[0]) else {
return Value::error(ResultCode::Error);
};
Value::from_blob(hash)
}
#[scalar(name = "crypto_encode", alias = "crypto_encode")]
fn crypto_encode(args: &[Value]) -> Value {
if args.len() != 2 {
return Value::error(ResultCode::Error);
}
let Ok(payload) = encode(&args[0], &args[1]) else {
return Value::error(ResultCode::Error);
};
payload
}
#[scalar(name = "crypto_decode", alias = "crypto_decode")]
fn crypto_decode(args: &[Value]) -> Value {
if args.len() != 2 {
return Value::error(ResultCode::Error);
}
let Ok(payload) = decode(&args[0], &args[1]) else {
return Value::error(ResultCode::Error);
};
payload
}
register_extension! {
scalars: { crypto_sha256, crypto_sha512, crypto_sha384, crypto_blake3, crypto_sha1, crypto_md5, crypto_encode, crypto_decode },
}