use num_bigint::BigUint;
pub use crate::crypto::pk::Pk;
use crate::error::Error;
fn map_crypto_err(e: crate::crypto::CryptoError) -> Error {
Error::KeyParse(e.to_string())
}
pub fn sm2_secret_from_pkcs8_pem_with_pass(pem: &str, pass: &str) -> Result<BigUint, Error> {
crate::crypto::key_parse::sm2_secret_from_pkcs8_pem_with_pass(pem, pass).map_err(map_crypto_err)
}
pub fn sm2_secret_from_pkcs8_pem(pem: &str) -> Result<BigUint, Error> {
for block in pem::parse_many(pem).map_err(|e| Error::KeyParse(e.to_string()))? {
if block.tag() == "PRIVATE KEY" {
let scalar = crate::crypto::key_parse::sm2_scalar_from_pkcs8_der(block.contents())
.map_err(map_crypto_err)?;
return Ok(BigUint::from_bytes_be(&scalar));
}
}
Err(Error::KeyParse("no PRIVATE KEY block in PEM".into()))
}
pub fn sm2_pk_from_pkcs8_pem_with_pass(pem: &str, pass: &str) -> Result<Pk, Error> {
crate::crypto::key::sm2_pk_from_pkcs8_pem_with_pass(pem, pass).map_err(map_crypto_err)
}