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
29pub 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}