1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
use super::{generate_seed, Ecdsa};
use crate::{AsymmetricKey, Payload};
use p256::{
ecdsa::{signature::Signer, signature::Verifier, Signature, SigningKey, VerifyKey},
EncodedPoint,
};
use std::convert::TryFrom;
pub type P256KeyPair = AsymmetricKey<VerifyKey, SigningKey>;
impl std::fmt::Debug for P256KeyPair {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_fmt(format_args!("{:?}", self.public_key))
}
}
impl P256KeyPair {
pub fn from_seed(seed: &[u8]) -> Self {
let secret_seed = generate_seed(&seed.to_vec()).expect("invalid seed");
let sk = SigningKey::new(&secret_seed).expect("Couldn't create key");
let pk = VerifyKey::from(&sk);
P256KeyPair {
public_key: pk,
secret_key: Some(sk),
}
}
pub fn from_public_key(public_key: &[u8]) -> Self {
let pk: Vec<u8> = match public_key.len() == 65 {
true => public_key.to_vec(),
false => {
let mut pkk = public_key.to_vec();
pkk.insert(0, 0x04);
pkk
}
};
P256KeyPair {
secret_key: None,
public_key: VerifyKey::from_encoded_point(&EncodedPoint::from_bytes(pk.as_slice()).expect("invalid key"))
.expect("invalid point"),
}
}
}
impl Ecdsa for P256KeyPair {
type Err = String;
fn sign(&self, payload: Payload) -> Vec<u8> {
match payload {
Payload::Buffer(payload) => {
let signature = match &self.secret_key {
Some(sig) => sig.sign(&payload),
None => panic!("secret key not found"),
};
signature.as_ref().to_vec()
}
_ => unimplemented!("payload type not supported for this key"),
}
}
fn verify(&self, payload: Payload, signature: &[u8]) -> Result<(), Self::Err> {
match payload {
Payload::Buffer(payload) => match self
.public_key
.verify(&payload, &Signature::try_from(signature).unwrap())
.is_ok()
{
true => Ok(()),
false => Err("invalid signature".to_string()),
},
_ => unimplemented!("payload type not supported for this key"),
}
}
}
#[cfg(test)]
pub mod test {
use super::*;
#[test]
fn test_demo() {
let key = P256KeyPair::from_seed(vec![].as_slice());
let message = b"super secret message".to_vec();
let signature = key.sign(Payload::Buffer(message.clone()));
let is_valud = key.verify(Payload::Buffer(message), signature.as_slice());
assert!(is_valud.map_or(false, |_| true));
}
}