libes/key/
secp256k1.rs

1use k256::elliptic_curve::sec1::{FromEncodedPoint, ToEncodedPoint};
2use super::conversion::{PublicKeyFrom, SecretKeyFrom, TryPublicKeyFrom};
3use super::generics::{GenerateEphemeralKey, Key, KeyExchange};
4use crate::KeyError;
5use rand_core::OsRng;
6use crate::key::conversion::SecretKeyFromRef;
7
8#[cfg(feature = "ECIES-MAC")]
9use crate::markers::{EciesMacDecryptionSupport, EciesMacEncryptionSupport};
10#[cfg(feature = "ECIES-MAC")]
11impl EciesMacEncryptionSupport for Secp256k1 {}
12#[cfg(feature = "ECIES-MAC")]
13impl EciesMacDecryptionSupport for Secp256k1 {}
14
15#[cfg(feature = "ECIES-AEAD")]
16use crate::markers::{EciesAeadDecryptionSupport, EciesAeadEncryptionSupport};
17#[cfg(feature = "ECIES-AEAD")]
18impl EciesAeadEncryptionSupport for Secp256k1 {}
19#[cfg(feature = "ECIES-AEAD")]
20impl EciesAeadDecryptionSupport for Secp256k1 {}
21
22#[cfg(feature = "ECIES-SYN")]
23use crate::markers::{EciesSynDecryptionSupport, EciesSynEncryptionSupport};
24#[cfg(feature = "ECIES-SYN")]
25impl EciesSynEncryptionSupport for Secp256k1 {}
26#[cfg(feature = "ECIES-SYN")]
27impl EciesSynDecryptionSupport for Secp256k1 {}
28
29/// Marker for using the `K-256/secp256k1` algorithm for elliptic curve operations
30///
31/// K-256/secp256k1 is provided by [k256](https://crates.io/crates/k256)
32pub struct Secp256k1(k256::PublicKey);
33
34impl PublicKeyFrom<k256::PublicKey> for Secp256k1 {
35    fn pk_from(x: k256::PublicKey) -> Self {
36        Self(x)
37    }
38}
39
40impl PublicKeyFrom<[u8; 33]> for Secp256k1 {
41    fn pk_from(x: [u8; 33]) -> Self {
42        Self(k256::PublicKey::from_encoded_point(&k256::EncodedPoint::from_bytes(x).expect("key initialization error")).unwrap())
43    }
44}
45
46impl TryPublicKeyFrom<&[u8]> for Secp256k1 {
47    fn try_pk_from(x: &[u8]) -> Result<Self, KeyError> {
48        let bytes: [u8; 33] = x.try_into().map_err(|_| KeyError::BadData)?;
49        Ok(Self::pk_from(bytes))
50    }
51}
52
53impl TryPublicKeyFrom<Vec<u8>> for Secp256k1 {
54    fn try_pk_from(x: Vec<u8>) -> Result<Self, KeyError> {
55        Self::try_pk_from(x.as_slice())
56    }
57}
58
59impl SecretKeyFrom<k256::ecdh::EphemeralSecret> for Secp256k1 {
60    fn sk_from(x: k256::ecdh::EphemeralSecret) -> Self::SecretKey {
61        x
62    }
63}
64
65impl SecretKeyFromRef<k256::ecdh::EphemeralSecret> for Secp256k1 {
66    fn sk_from_ref(x: &k256::ecdh::EphemeralSecret) -> &Self::SecretKey {
67        x
68    }
69}
70
71impl Key for Secp256k1 {
72    const EC_PUBLIC_KEY_LEN: usize = 33;
73    type SecretKey = k256::ecdh::EphemeralSecret;
74
75    fn as_bytes(&self) -> Vec<u8> {
76        self.0.to_encoded_point(true).as_bytes().to_vec()
77    }
78
79    fn from_bytes(x: &[u8]) -> Self {
80        let fixed_arr: [u8; 33] = x.try_into().expect("invalid length");
81        Self(k256::PublicKey::from_encoded_point(&k256::EncodedPoint::from_bytes(fixed_arr).expect("key initialization error")).unwrap())
82    }
83}
84
85impl GenerateEphemeralKey for Secp256k1 {
86    fn get_ephemeral_key() -> (Self, Self::SecretKey) {
87        let sk = Self::SecretKey::random(&mut OsRng);
88        (Self(sk.public_key()), sk)
89    }
90}
91
92impl KeyExchange for Secp256k1 {
93    fn key_exchange(&self, sk: &Self::SecretKey) -> Vec<u8> {
94        sk.diffie_hellman(&self.0).raw_secret_bytes().to_vec()
95    }
96}