confium_tc_ecies_p256/
keys.rs1use 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#[derive(Debug, Clone)]
10pub struct Keypair {
11 pub secret_scalar: Scalar,
13 pub public_key: AffinePoint,
15}
16
17pub 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}