defuse_crypto/curve/
mod.rs1#[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 type Message: AsRef<[u8]> + ?Sized;
22
23 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}