pink/chain_extension/
signing.rs

1use alloc::vec::Vec;
2
3use crate::{EcdsaPublicKey, EcdsaSignature, Hash};
4
5#[derive(scale::Encode, scale::Decode)]
6#[cfg_attr(feature = "std", derive(scale_info::TypeInfo))]
7pub enum SigType {
8    Ed25519,
9    Sr25519,
10    Ecdsa,
11}
12
13/// Sign a message with a private key.
14///
15/// # Examples
16/// ```ignore
17/// let (privkey, pubkey) = derive_sr25519_pair(b"a spoon of salt");
18/// let message = b"hello world";
19/// let signature = sign(message, &privkey, SigType::Sr25519);
20/// let pass = verify(message, &pubkey, &signature, SigType::Sr25519);
21/// assert!(pass);
22/// ```
23pub fn sign(message: &[u8], key: &[u8], sigtype: SigType) -> Vec<u8> {
24    crate::ext().sign(sigtype, key, message)
25}
26
27/// Verify a message with a pubkey and signature.
28///
29/// # Examples
30/// ```ignore
31/// let (privkey, pubkey) = derive_sr25519_pair(b"a spoon of salt");
32/// let message = b"hello world";
33/// let signature = sign(message, &privkey, SigType::Sr25519);
34/// let pass = verify(message, &pubkey, &signature, SigType::Sr25519);
35/// assert!(pass);
36/// ```
37pub fn verify(message: &[u8], pubkey: &[u8], signature: &[u8], sigtype: SigType) -> bool {
38    crate::ext().verify(sigtype, pubkey, message, signature)
39}
40
41/// Sign a prehashed message with a ECDSA priviate key
42pub fn ecdsa_sign_prehashed(key: &[u8], message_hash: Hash) -> EcdsaSignature {
43    crate::ext().ecdsa_sign_prehashed(key, message_hash)
44}
45
46/// Verify a prehashed message with a ECDSA pubkey and signature.
47pub fn ecdsa_verify_prehashed(
48    signature: EcdsaSignature,
49    message_hash: Hash,
50    pubkey: EcdsaPublicKey,
51) -> bool {
52    crate::ext().ecdsa_verify_prehashed(signature, message_hash, pubkey)
53}
54
55/// Derive a key pair from the contract key
56///
57/// # Examples
58/// ```ignore
59/// let privkey = derive_sr25519_key(b"a spoon of salt");
60/// let pubkey = get_public_key(&privkey, SigType::Sr25519);
61/// let message = b"hello world";
62/// let signature = sign(message, &privkey, SigType::Sr25519);
63/// let pass = verify(message, &pubkey, &signature, SigType::Sr25519);
64/// assert!(pass);
65/// ```
66pub fn derive_sr25519_key(salt: &[u8]) -> Vec<u8> {
67    crate::ext().derive_sr25519_key(salt.into())
68}
69
70/// Get the public key from a private key
71///
72/// # Examples
73/// ```ignore
74/// let privkey = derive_sr25519_key(b"a spoon of salt");
75/// let pubkey = get_public_key(&privkey, SigType::Sr25519);
76/// let message = b"hello world";
77/// let signature = sign(message, &privkey, SigType::Sr25519);
78/// let pass = verify(message, &pubkey, &signature, SigType::Sr25519);
79/// assert!(pass);
80/// ```
81pub fn get_public_key(key: &[u8], sigtype: SigType) -> Vec<u8> {
82    crate::ext().get_public_key(sigtype, key)
83}