mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-08 19:28:01 +00:00
subkey: only decode hex if requested, CLI 0x prefixed hex for all stdout (#13258)
* Only decode hex if requested Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Cleanup code Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Add some tests Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Add license Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Docs Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Clippy Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * bump version, breaking (tiny) change in output. * Move integration tests to own folder Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> --------- Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Co-authored-by: Dan Shields <nukemandan@protonmail.com>
This commit is contained in:
committed by
GitHub
parent
d73348b2ca
commit
eeb3e95701
@@ -0,0 +1,21 @@
|
||||
// This file is part of Substrate.
|
||||
|
||||
// Copyright (C) 2023 Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
//! Integration tests for subkey commands.
|
||||
|
||||
mod sig_verify;
|
||||
@@ -0,0 +1,152 @@
|
||||
// This file is part of Substrate.
|
||||
|
||||
// Copyright (C) 2023 Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
#![cfg(test)]
|
||||
|
||||
//! Integration test that the `sign` and `verify` sub-commands work together.
|
||||
|
||||
use crate::*;
|
||||
use clap::Parser;
|
||||
|
||||
const SEED: &str = "0xe5be9a5092b81bca64be81d212e7f2f9eba183bb7a90954f7b76361f6edb5c0a";
|
||||
const ALICE: &str = "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY";
|
||||
const BOB: &str = "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty";
|
||||
|
||||
/// Sign a valid UFT-8 message which can be `hex` and passed either via `stdin` or as an argument.
|
||||
fn sign(msg: &str, hex: bool, stdin: bool) -> String {
|
||||
sign_raw(msg.as_bytes(), hex, stdin)
|
||||
}
|
||||
|
||||
/// Sign a raw message which can be `hex` and passed either via `stdin` or as an argument.
|
||||
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")
|
||||
}
|
||||
|
||||
/// Verify a valid UFT-8 message which can be `hex` and passed either via `stdin` or as an argument.
|
||||
fn verify(msg: &str, hex: bool, stdin: bool, who: &str, sig: &str) -> bool {
|
||||
verify_raw(msg.as_bytes(), hex, stdin, who, sig)
|
||||
}
|
||||
|
||||
/// Verify a raw message which can be `hex` and passed either via `stdin` or as an argument.
|
||||
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 that sig/verify works with UTF-8 bytes passed as arg.
|
||||
#[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 that sig/verify works with UTF-8 bytes passed via stdin.
|
||||
#[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 that sig/verify works with hex bytes passed as arg.
|
||||
#[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 that sig/verify works with hex bytes passed via stdin.
|
||||
#[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 that sig/verify works with random bytes.
|
||||
#[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 that sig/verify works with invalid UTF-8 bytes.
|
||||
#[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));
|
||||
}
|
||||
Reference in New Issue
Block a user