From ebcf7b83d62e0b3be8c1eace162049820b121a10 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Wed, 22 Jan 2025 01:40:00 +0800 Subject: [PATCH] feat: init commit --- .gitignore | 1 + Cargo.toml | 22 +++++ src/keymap.rs | 25 ++++++ src/lib.rs | 205 +++++++++++++++++++++++++++++++++++++++++++++++ src/sign.rs | 51 ++++++++++++ src/signature.rs | 108 +++++++++++++++++++++++++ src/util.rs | 5 ++ 7 files changed, 417 insertions(+) create mode 100644 Cargo.toml create mode 100644 src/keymap.rs create mode 100644 src/lib.rs create mode 100644 src/sign.rs create mode 100644 src/signature.rs create mode 100644 src/util.rs diff --git a/.gitignore b/.gitignore index 3bf25c0..409abaa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.idea/ # ---> Rust # Generated by Cargo # will have compiled files and executables diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..01c862f --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "script-sign" +version = "0.1.0" +edition = "2021" +authors = ["Hatter Jiang "] +description = "Script Sign" +license = "MIT" +readme = "README.md" + +[dependencies] +base64 = "0.22" +digest = "0.10" +ecdsa = "0.16" +hex = "0.4" +p256 = "0.13" +p384 = "0.13" +sha2 = "0.10" +regex = "1.11" +rust_util = "0.6" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +simpledateformat = "0.1" diff --git a/src/keymap.rs b/src/keymap.rs new file mode 100644 index 0000000..f5a3139 --- /dev/null +++ b/src/keymap.rs @@ -0,0 +1,25 @@ +use rust_util::XResult; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +#[derive(Debug, Serialize, Deserialize)] +pub struct KeyMap { + key_map: HashMap, +} + +impl KeyMap { + pub fn system() -> XResult { + let signing_keys = r##" +{ + "yk-r1": "04dd3eebd906c9cf00b08ec29f7ed61804d1cc1d1352d9257b628191e08fc3717c4fae3298cd5c4829cec8bf3a946e7db60b7857e1287f6a0bae6b3f2342f007d0" +} +"##; + // unwrap should not happen + let key_map: HashMap = serde_json::from_str(signing_keys).unwrap(); + Ok(KeyMap { key_map }) + } + + pub fn find(&self, key_id: &str) -> Option<&String> { + self.key_map.get(key_id) + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..1ea323d --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,205 @@ +mod keymap; +mod sign; +mod signature; +mod util; + +pub use crate::keymap::KeyMap; +use crate::sign::{ecdsaverify, EcdsaAlgorithm}; +use crate::signature::{ + CardEcSignResult, ScriptSignature, ScriptSignatureAlgorithm, SIGNATURE_PREFIX, +}; +use crate::util::current_time; +use digest::Digest; +use rust_util::{debugging, opt_result, simple_error, util_cmd, XResult}; +use sha2::Sha256; +use std::fs; + +#[derive(Debug)] +pub struct Script { + pub content_lines: Vec, + pub signature: Option, +} + +impl Script { + pub fn verify_script_file_with_system_key_map(script_file: &str) -> XResult { + Self::verify_script_file(script_file, &KeyMap::system()?) + } + + pub fn verify_script_file(script_file: &str, key_map: &KeyMap) -> XResult { + let script_content = opt_result!( + fs::read_to_string(script_file), + "Read script file: {script_file} failed: {}" + ); + let script = opt_result!( + Script::parse(&script_content), + "Parse script file: {script_file} failed: {}" + ); + match &script.signature { + None => Ok(false), + Some(_) => script.verify(key_map), + } + } + + pub fn parse(script: &str) -> XResult