use crate::elem::Scalar;
use crate::err::KeyRejected;
use crate::limb::{LIMB_BYTES, LIMB_LENGTH};
use crate::norop::{norop_limbs_less_than, parse_big_endian};
use crate::rand::SecureRandom;
use crate::sm2p256::CURVE_PARAMS;
use core::marker::PhantomData;
pub(crate) fn create_private_key(rng: &mut dyn SecureRandom) -> Result<Scalar, KeyRejected> {
let mut seed = [0; LIMB_LENGTH * LIMB_BYTES];
let mut candidate = [0; LIMB_LENGTH];
for _ in 0..100 {
rng.fill(&mut seed);
parse_big_endian(&mut candidate, &seed)?;
if norop_limbs_less_than(&candidate, &CURVE_PARAMS.n) {
return Ok(Scalar {
limbs: candidate,
m: PhantomData,
});
}
}
Err(KeyRejected::seed_error())
}