use crate::{g, marker::*, Point, Scalar, G};
#[derive(Clone, Debug, PartialEq)]
pub struct KeyPair {
sk: Scalar,
pk: Point,
}
impl KeyPair {
pub fn new(secret_key: Scalar) -> Self {
Self {
pk: g!(secret_key * G).normalize(),
sk: secret_key,
}
}
pub fn secret_key(&self) -> &Scalar {
&self.sk
}
pub fn public_key(&self) -> Point {
self.pk
}
pub fn as_tuple(&self) -> (&Scalar, Point) {
(&self.sk, self.pk)
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct XOnlyKeyPair {
sk: Scalar,
pk: Point<EvenY>,
}
impl XOnlyKeyPair {
pub fn new(mut secret_key: Scalar) -> Self {
let pk = Point::even_y_from_scalar_mul(&G, &mut secret_key);
Self { sk: secret_key, pk }
}
pub fn secret_key(&self) -> &Scalar {
&self.sk
}
pub fn public_key(&self) -> Point<EvenY> {
self.pk
}
pub fn as_tuple(&self) -> (&Scalar, Point<EvenY>) {
(&self.sk, self.pk)
}
}
impl From<XOnlyKeyPair> for (Scalar, Point<EvenY>) {
fn from(kp: XOnlyKeyPair) -> Self {
(kp.sk, kp.pk)
}
}
impl From<XOnlyKeyPair> for KeyPair {
fn from(xonly: XOnlyKeyPair) -> Self {
Self {
sk: xonly.sk,
pk: xonly.pk.normalize(),
}
}
}
impl From<KeyPair> for XOnlyKeyPair {
fn from(kp: KeyPair) -> Self {
let mut sk = kp.sk;
let (pk, needs_negation) = kp.pk.into_point_with_even_y();
sk.conditional_negate(needs_negation);
Self { sk, pk }
}
}