Skip to main content

confium_tc_ecies_p256/
keys.rs

1//! Keypair generation for threshold ECIES-P256.
2
3use p256::elliptic_curve::PrimeField;
4use p256::elliptic_curve::rand_core;
5use p256::elliptic_curve::rand_core::Rng;
6use p256::{AffinePoint, FieldBytes, ProjectivePoint, Scalar};
7
8/// A P-256 keypair.
9#[derive(Debug, Clone)]
10pub struct Keypair {
11    /// Secret scalar.
12    pub secret_scalar: Scalar,
13    /// Public key (affine point).
14    pub public_key: AffinePoint,
15}
16
17/// Generate a fresh random keypair.
18pub fn generate_keypair() -> Keypair {
19    let secret = loop {
20        let mut buf = [0u8; 32];
21        rand_core::UnwrapErr(getrandom::SysRng).fill_bytes(&mut buf);
22        if let Some(s) = Option::<Scalar>::from(Scalar::from_repr(FieldBytes::from(buf))) {
23            if s != Scalar::ZERO {
24                break s;
25            }
26        }
27    };
28    let public = (ProjectivePoint::GENERATOR * secret).to_affine();
29    Keypair {
30        secret_scalar: secret,
31        public_key: public,
32    }
33}