use crypto_core::CryptoError;
use p521::ecdsa::SigningKey;
use p521::elliptic_curve::Generate;
use p521::SecretKey;
use zeroize::{Zeroize, Zeroizing};
pub fn generate_p521_keypair() -> Result<(Vec<u8>, Zeroizing<Vec<u8>>), CryptoError> {
let secret_key = SecretKey::generate();
let signing_key = SigningKey::from(&secret_key);
let verifying_key = signing_key.verifying_key();
let mut secret_stack = secret_key.to_bytes();
let secret_bytes = Zeroizing::new(secret_stack.to_vec());
secret_stack.zeroize();
let public_bytes = verifying_key.to_sec1_point(true).as_bytes().to_vec();
Ok((public_bytes, secret_bytes))
}
pub fn generate_p521_keypair_from_secret_key(
secret_key: &[u8; 66],
) -> Result<(Vec<u8>, Zeroizing<Vec<u8>>), CryptoError> {
let secret = SecretKey::from_slice(secret_key).map_err(|_| CryptoError::InvalidKey)?;
let signing_key = SigningKey::from(&secret);
let verifying_key = signing_key.verifying_key();
let mut secret_stack = secret.to_bytes();
let secret_bytes = Zeroizing::new(secret_stack.to_vec());
secret_stack.zeroize();
let public_bytes = verifying_key.to_sec1_point(true).as_bytes().to_vec();
Ok((public_bytes, secret_bytes))
}