defuse_crypto/curve/
mod.rs

1#[cfg(feature = "ed25519")]
2mod ed25519;
3#[cfg(feature = "ed25519")]
4pub use self::ed25519::*;
5
6#[cfg(feature = "secp256k1")]
7mod secp256k1;
8#[cfg(feature = "secp256k1")]
9pub use self::secp256k1::*;
10
11#[cfg(feature = "p256")]
12mod p256;
13#[cfg(feature = "p256")]
14pub use self::p256::*;
15
16pub trait Curve {
17    type PublicKey;
18    type Signature;
19
20    /// Message that can be signed by this curve
21    type Message: AsRef<[u8]> + ?Sized;
22
23    /// Public key that should be known prior to verification
24    type VerifyingKey;
25
26    fn verify(
27        signature: &Self::Signature,
28        message: &Self::Message,
29        verifying_key: &Self::VerifyingKey,
30    ) -> Option<Self::PublicKey>;
31}
32
33#[cfg(any(feature = "ed25519", feature = "secp256k1", feature = "p256"))]
34#[derive(strum::Display, strum::IntoStaticStr, strum::EnumString)]
35#[strum(serialize_all = "snake_case", ascii_case_insensitive)]
36#[repr(u8)]
37pub enum CurveType {
38    #[cfg(feature = "ed25519")]
39    Ed25519 = 0,
40    #[cfg(feature = "secp256k1")]
41    Secp256k1 = 1,
42    #[cfg(feature = "p256")]
43    P256 = 2,
44}
45
46#[cfg(any(feature = "ed25519", feature = "secp256k1", feature = "p256"))]
47pub trait TypedCurve: Curve {
48    const CURVE_TYPE: CurveType;
49
50    #[inline]
51    fn to_base58(bytes: impl AsRef<[u8]>) -> String {
52        format!(
53            "{}:{}",
54            Self::CURVE_TYPE,
55            near_sdk::bs58::encode(bytes.as_ref()).into_string()
56        )
57    }
58
59    fn parse_base58<const N: usize>(s: impl AsRef<str>) -> Result<[u8; N], crate::ParseCurveError> {
60        let s = s.as_ref();
61        let data = if let Some((curve, data)) = s.split_once(':') {
62            if !curve.eq_ignore_ascii_case(Self::CURVE_TYPE.into()) {
63                return Err(crate::ParseCurveError::WrongCurveType);
64            }
65            data
66        } else {
67            s
68        };
69        crate::parse::checked_base58_decode_array(data)
70    }
71}