extern crate alloc;
use tee_crypto::hash::{DigestBytes, HashAlgorithm};
use tee_crypto::material::{SignatureAlgorithm, SignatureBytes, SignatureEncoding};
#[cfg(feature = "std")]
use tee_crypto::rsa::RsaKeypair;
use tee_crypto::rsa::RsaPublic;
use tee_crypto::tee_ops::ecc::{self, EccCurve, EccHashAlgo};
use tee_crypto::tee_ops::rsa::{self, RsaHashAlgo, RsaSignPadding};
use super::map::map_tee_err;
#[cfg(feature = "std")]
use super::map::TasignRngAdapter;
#[cfg(feature = "std")]
use super::rng::CryptoRng;
use crate::crypto::CryptoError;
#[cfg(feature = "std")]
pub fn rsa_sign_digest(
key: &RsaKeypair,
digest: &[u8; 32],
rng: &mut dyn CryptoRng,
) -> Result<alloc::vec::Vec<u8>, CryptoError> {
let digest = DigestBytes::new(digest.to_vec(), HashAlgorithm::Sha256);
let mut adapter = TasignRngAdapter(rng);
let sig = rsa::rsa_sign(
key,
RsaHashAlgo::Sha256,
RsaSignPadding::Pkcs1v15,
&digest,
&mut adapter,
None,
)
.map_err(map_tee_err)?;
Ok(sig.as_bytes().to_vec())
}
pub fn rsa_verify_digest(
key: &RsaPublic,
digest: &[u8; 32],
sig: &[u8],
) -> Result<(), CryptoError> {
let digest = DigestBytes::new(digest.to_vec(), HashAlgorithm::Sha256);
let sig = SignatureBytes::new(
sig.to_vec(),
SignatureAlgorithm::RsaPkcs1v15,
SignatureEncoding::Raw,
);
rsa::rsa_verify(
key,
RsaHashAlgo::Sha256,
RsaSignPadding::Pkcs1v15,
&digest,
&sig,
)
.map_err(map_tee_err)
}
#[cfg(feature = "std")]
pub fn ecdsa_sign_digest(
scalar: &[u8; 32],
digest: &[u8; 32],
rng: &mut dyn CryptoRng,
) -> Result<alloc::vec::Vec<u8>, CryptoError> {
let mut adapter = TasignRngAdapter(rng);
ecc::ecc_sign_p256_prehash_der(scalar, digest, &mut adapter).map_err(map_tee_err)
}
pub fn ecdsa_verify_digest(
public_x: &[u8],
public_y: &[u8],
digest: &[u8; 32],
sig: &[u8],
) -> Result<(), CryptoError> {
let digest = DigestBytes::new(digest.to_vec(), HashAlgorithm::Sha256);
let sig = SignatureBytes::new(
sig.to_vec(),
SignatureAlgorithm::Ecdsa(EccCurve::P256),
SignatureEncoding::Der,
);
ecc::ecc_verify(
EccCurve::P256,
EccHashAlgo::Sha256,
public_x,
public_y,
&digest,
&sig,
)
.map_err(map_tee_err)
}
pub fn rsa_pub_key_bits(key: &RsaPublic) -> usize {
rsa::rsa_public_key_bits(key)
}
#[cfg(feature = "std")]
pub fn rsa_key_bits(key: &RsaKeypair) -> usize {
rsa::rsa_private_key_bits(key)
}