#![cfg(test)]
use crate::*;
use clap::Parser;
const SEED: &str = "0xe5be9a5092b81bca64be81d212e7f2f9eba183bb7a90954f7b76361f6edb5c0a";
const ALICE: &str = "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY";
const BOB: &str = "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty";
fn sign(msg: &str, hex: bool, stdin: bool) -> String {
sign_raw(msg.as_bytes(), hex, stdin)
}
fn sign_raw(msg: &[u8], hex: bool, stdin: bool) -> String {
let mut args = vec!["sign", "--suri", SEED];
if !stdin {
args.push("--message");
args.push(std::str::from_utf8(msg).expect("Can only pass valid UTF-8 as arg"));
}
if hex {
args.push("--hex");
}
let cmd = SignCmd::parse_from(&args);
cmd.sign(|| msg).expect("Static data is good; Must sign; qed")
}
fn verify(msg: &str, hex: bool, stdin: bool, who: &str, sig: &str) -> bool {
verify_raw(msg.as_bytes(), hex, stdin, who, sig)
}
fn verify_raw(msg: &[u8], hex: bool, stdin: bool, who: &str, sig: &str) -> bool {
let mut args = vec!["verify", sig, who];
if !stdin {
args.push("--message");
args.push(std::str::from_utf8(msg).expect("Can only pass valid UTF-8 as arg"));
}
if hex {
args.push("--hex");
}
let cmd = VerifyCmd::parse_from(&args);
cmd.verify(|| msg).is_ok()
}
#[test]
fn sig_verify_arg_utf8_work() {
let sig = sign("Something", false, false);
assert!(verify("Something", false, false, ALICE, &sig));
assert!(!verify("Something", false, false, BOB, &sig));
assert!(!verify("Wrong", false, false, ALICE, &sig));
assert!(!verify("Not hex", true, false, ALICE, &sig));
assert!(!verify("0x1234", true, false, ALICE, &sig));
assert!(!verify("Wrong", false, false, BOB, &sig));
assert!(!verify("Not hex", true, false, BOB, &sig));
assert!(!verify("0x1234", true, false, BOB, &sig));
}
#[test]
fn sig_verify_stdin_utf8_work() {
let sig = sign("Something", false, true);
assert!(verify("Something", false, true, ALICE, &sig));
assert!(!verify("Something", false, true, BOB, &sig));
assert!(!verify("Wrong", false, true, ALICE, &sig));
assert!(!verify("Not hex", true, true, ALICE, &sig));
assert!(!verify("0x1234", true, true, ALICE, &sig));
assert!(!verify("Wrong", false, true, BOB, &sig));
assert!(!verify("Not hex", true, true, BOB, &sig));
assert!(!verify("0x1234", true, true, BOB, &sig));
}
#[test]
fn sig_verify_arg_hex_work() {
let sig = sign("0xaabbcc", true, false);
assert!(verify("0xaabbcc", true, false, ALICE, &sig));
assert!(verify("aabBcc", true, false, ALICE, &sig));
assert!(verify("0xaAbbCC", true, false, ALICE, &sig));
assert!(!verify("0xaabbcc", true, false, BOB, &sig));
assert!(!verify("0xaabbcc", false, false, ALICE, &sig));
}
#[test]
fn sig_verify_stdin_hex_work() {
let sig = sign("0xaabbcc", true, true);
assert!(verify("0xaabbcc", true, true, ALICE, &sig));
assert!(verify("aabBcc", true, true, ALICE, &sig));
assert!(verify("0xaAbbCC", true, true, ALICE, &sig));
assert!(!verify("0xaabbcc", true, true, BOB, &sig));
assert!(!verify("0xaabbcc", false, true, ALICE, &sig));
}
#[test]
fn sig_verify_stdin_non_utf8_work() {
use rand::RngCore;
let mut rng = rand::thread_rng();
for _ in 0..100 {
let mut raw = [0u8; 32];
rng.fill_bytes(&mut raw);
let sig = sign_raw(&raw, false, true);
assert!(verify_raw(&raw, false, true, ALICE, &sig));
assert!(!verify_raw(&raw, false, true, BOB, &sig));
}
}
#[test]
fn sig_verify_stdin_invalid_utf8_work() {
let raw = vec![192u8, 193];
assert!(String::from_utf8(raw.clone()).is_err(), "Must be invalid UTF-8");
let sig = sign_raw(&raw, false, true);
assert!(verify_raw(&raw, false, true, ALICE, &sig));
assert!(!verify_raw(&raw, false, true, BOB, &sig));
}