pub use crate::rsa::signature::{RsaEncoding, RsaSignatureEncoding};
pub use crate::rsa::{
KeyPair as RsaKeyPair, PublicKey as RsaSubjectPublicKey,
PublicKeyComponents as RsaPublicKeyComponents, RsaParameters,
};
use crate::wolfcrypt_rs::EVP_PKEY;
use core::any::{Any, TypeId};
use core::fmt::{Debug, Formatter};
#[cfg(feature = "ring-sig-verify")]
use untrusted::Input;
use crate::rsa::signature::RsaSigningAlgorithmId;
use crate::rsa::RsaVerificationAlgorithmId;
pub use crate::ec::key_pair::{EcdsaKeyPair, PrivateKey as EcdsaPrivateKey};
use crate::ec::signature::EcdsaSignatureFormat;
pub use crate::ec::signature::{
EcdsaSigningAlgorithm, EcdsaVerificationAlgorithm, PublicKey as EcdsaPublicKey,
};
pub use crate::ed25519::{
Ed25519KeyPair, EdDSAParameters, PublicKey as Ed25519PublicKey, Seed as Ed25519Seed,
ED25519_PUBLIC_KEY_LEN,
};
use crate::digest::Digest;
use crate::ec::encoding::parse_ec_public_key;
use crate::ed25519::parse_ed25519_public_key;
use crate::encoding::{AsDer, PublicKeyX509Der};
use crate::error::{KeyRejected, Unspecified};
use crate::ptr::LcPtr;
use crate::rsa::key::parse_rsa_public_key;
use crate::{digest, ec, error, hex, rsa, sealed};
#[cfg(not(feature = "std"))]
use crate::prelude::*;
pub(crate) const MAX_LEN: usize = 1024;
#[derive(Clone, Copy)]
pub struct Signature {
value: [u8; MAX_LEN],
len: usize,
}
impl Signature {
pub(crate) fn new<F>(fill: F) -> Self
where
F: FnOnce(&mut [u8; MAX_LEN]) -> usize,
{
let mut r = Self {
value: [0; MAX_LEN],
len: 0,
};
r.len = fill(&mut r.value);
r
}
}
impl AsRef<[u8]> for Signature {
#[inline]
fn as_ref(&self) -> &[u8] {
&self.value[..self.len]
}
}
pub trait KeyPair: Debug + Send + Sized + Sync {
type PublicKey: AsRef<[u8]> + Debug + Clone + Send + Sized + Sync;
fn public_key(&self) -> &Self::PublicKey;
}
pub(crate) trait ParsedVerificationAlgorithm: Debug + Sync {
fn parsed_verify_sig(
&self,
public_key: &ParsedPublicKey,
msg: &[u8],
signature: &[u8],
) -> Result<(), error::Unspecified>;
fn parsed_verify_digest_sig(
&self,
public_key: &ParsedPublicKey,
digest: &Digest,
signature: &[u8],
) -> Result<(), error::Unspecified>;
}
pub trait VerificationAlgorithm: Debug + Sync + Any + sealed::Sealed {
#[cfg(feature = "ring-sig-verify")]
#[deprecated(note = "please use `VerificationAlgorithm::verify_sig` instead")]
fn verify(
&self,
public_key: Input<'_>,
msg: Input<'_>,
signature: Input<'_>,
) -> Result<(), error::Unspecified>;
fn verify_sig(
&self,
public_key: &[u8],
msg: &[u8],
signature: &[u8],
) -> Result<(), error::Unspecified>;
fn verify_digest_sig(
&self,
public_key: &[u8],
digest: &Digest,
signature: &[u8],
) -> Result<(), error::Unspecified>;
}
#[derive(Clone)]
pub struct UnparsedPublicKey<B: AsRef<[u8]>> {
algorithm: &'static dyn VerificationAlgorithm,
bytes: B,
}
#[derive(Clone)]
pub struct ParsedPublicKey {
algorithm: &'static dyn VerificationAlgorithm,
parsed_algorithm: &'static dyn ParsedVerificationAlgorithm,
key: LcPtr<EVP_PKEY>,
bytes: Box<[u8]>,
}
unsafe impl Send for ParsedPublicKey {}
unsafe impl Sync for ParsedPublicKey {}
impl ParsedPublicKey {
pub fn new<B: AsRef<[u8]>>(
algorithm: &'static dyn VerificationAlgorithm,
bytes: B,
) -> Result<Self, KeyRejected> {
parse_public_key(bytes.as_ref(), algorithm)
}
#[must_use]
pub fn algorithm(&self) -> &'static dyn VerificationAlgorithm {
self.algorithm
}
pub(crate) fn key(&self) -> &LcPtr<EVP_PKEY> {
&self.key
}
#[inline]
pub fn verify_sig(&self, message: &[u8], signature: &[u8]) -> Result<(), error::Unspecified> {
self.parsed_algorithm
.parsed_verify_sig(self, message, signature)
}
#[inline]
pub fn verify_digest_sig(
&self,
digest: &Digest,
signature: &[u8],
) -> Result<(), error::Unspecified> {
self.parsed_algorithm
.parsed_verify_digest_sig(self, digest, signature)
}
}
impl AsDer<PublicKeyX509Der<'static>> for ParsedPublicKey {
fn as_der(&self) -> Result<PublicKeyX509Der<'static>, Unspecified> {
Ok(PublicKeyX509Der::new(
self.key.as_const().marshal_rfc5280_public_key()?,
))
}
}
impl AsRef<[u8]> for ParsedPublicKey {
fn as_ref(&self) -> &[u8] {
&self.bytes
}
}
impl Debug for ParsedPublicKey {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
f.write_str(&format!(
"ParsedPublicKey {{ algorithm: {:?}, bytes: \"{}\" }}",
self.algorithm,
hex::encode(self.bytes.as_ref())
))
}
}
impl<B: AsRef<[u8]>> AsRef<[u8]> for UnparsedPublicKey<B> {
#[inline]
fn as_ref(&self) -> &[u8] {
self.bytes.as_ref()
}
}
impl<B: Copy + AsRef<[u8]>> Copy for UnparsedPublicKey<B> {}
impl<B: AsRef<[u8]>> Debug for UnparsedPublicKey<B> {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
f.write_str(&format!(
"UnparsedPublicKey {{ algorithm: {:?}, bytes: \"{}\" }}",
self.algorithm,
hex::encode(self.bytes.as_ref())
))
}
}
impl<B: AsRef<[u8]>> UnparsedPublicKey<B> {
#[inline]
pub fn new(algorithm: &'static dyn VerificationAlgorithm, bytes: B) -> Self {
Self { algorithm, bytes }
}
#[inline]
pub fn verify(&self, message: &[u8], signature: &[u8]) -> Result<(), error::Unspecified> {
self.algorithm
.verify_sig(self.bytes.as_ref(), message, signature)
}
#[inline]
pub fn verify_digest(
&self,
digest: &Digest,
signature: &[u8],
) -> Result<(), error::Unspecified> {
self.algorithm
.verify_digest_sig(self.bytes.as_ref(), digest, signature)
}
pub fn parse(&self) -> Result<ParsedPublicKey, KeyRejected> {
parse_public_key(self.bytes.as_ref(), self.algorithm)
}
}
pub(crate) fn parse_public_key(
bytes: &[u8],
algorithm: &'static dyn VerificationAlgorithm,
) -> Result<ParsedPublicKey, KeyRejected> {
let parsed_algorithm: &'static dyn ParsedVerificationAlgorithm;
let key = if algorithm.type_id() == TypeId::of::<EcdsaVerificationAlgorithm>() {
#[allow(clippy::cast_ptr_alignment)]
let ec_alg = unsafe {
&*(algorithm as *const dyn VerificationAlgorithm).cast::<EcdsaVerificationAlgorithm>()
};
parsed_algorithm = ec_alg;
parse_ec_public_key(bytes, ec_alg.id.nid())?
} else if algorithm.type_id() == TypeId::of::<EdDSAParameters>() {
#[allow(clippy::cast_ptr_alignment)]
let ed_alg =
unsafe { &*(algorithm as *const dyn VerificationAlgorithm).cast::<EdDSAParameters>() };
parsed_algorithm = ed_alg;
parse_ed25519_public_key(bytes)?
} else if algorithm.type_id() == TypeId::of::<RsaParameters>() {
#[allow(clippy::cast_ptr_alignment)]
let rsa_alg =
unsafe { &*(algorithm as *const dyn VerificationAlgorithm).cast::<RsaParameters>() };
parsed_algorithm = rsa_alg;
parse_rsa_public_key(bytes)?
} else {
unreachable!()
};
let bytes = bytes.to_vec().into_boxed_slice();
Ok(ParsedPublicKey {
algorithm,
parsed_algorithm,
key,
bytes,
})
}
pub const RSA_PKCS1_1024_8192_SHA1_FOR_LEGACY_USE_ONLY: RsaParameters = RsaParameters::new(
&digest::SHA1_FOR_LEGACY_USE_ONLY,
&rsa::signature::RsaPadding::RSA_PKCS1_PADDING,
1024..=8192,
&RsaVerificationAlgorithmId::RSA_PKCS1_1024_8192_SHA1_FOR_LEGACY_USE_ONLY,
);
pub const RSA_PKCS1_1024_8192_SHA256_FOR_LEGACY_USE_ONLY: RsaParameters = RsaParameters::new(
&digest::SHA256,
&rsa::signature::RsaPadding::RSA_PKCS1_PADDING,
1024..=8192,
&RsaVerificationAlgorithmId::RSA_PKCS1_1024_8192_SHA256_FOR_LEGACY_USE_ONLY,
);
pub const RSA_PKCS1_1024_8192_SHA512_FOR_LEGACY_USE_ONLY: RsaParameters = RsaParameters::new(
&digest::SHA512,
&rsa::signature::RsaPadding::RSA_PKCS1_PADDING,
1024..=8192,
&RsaVerificationAlgorithmId::RSA_PKCS1_1024_8192_SHA512_FOR_LEGACY_USE_ONLY,
);
pub const RSA_PKCS1_2048_8192_SHA1_FOR_LEGACY_USE_ONLY: RsaParameters = RsaParameters::new(
&digest::SHA1_FOR_LEGACY_USE_ONLY,
&rsa::signature::RsaPadding::RSA_PKCS1_PADDING,
2048..=8192,
&RsaVerificationAlgorithmId::RSA_PKCS1_2048_8192_SHA1_FOR_LEGACY_USE_ONLY,
);
pub const RSA_PKCS1_2048_8192_SHA256: RsaParameters = RsaParameters::new(
&digest::SHA256,
&rsa::signature::RsaPadding::RSA_PKCS1_PADDING,
2048..=8192,
&RsaVerificationAlgorithmId::RSA_PKCS1_2048_8192_SHA256,
);
pub const RSA_PKCS1_2048_8192_SHA384: RsaParameters = RsaParameters::new(
&digest::SHA384,
&rsa::signature::RsaPadding::RSA_PKCS1_PADDING,
2048..=8192,
&RsaVerificationAlgorithmId::RSA_PKCS1_2048_8192_SHA384,
);
pub const RSA_PKCS1_2048_8192_SHA512: RsaParameters = RsaParameters::new(
&digest::SHA512,
&rsa::signature::RsaPadding::RSA_PKCS1_PADDING,
2048..=8192,
&RsaVerificationAlgorithmId::RSA_PKCS1_2048_8192_SHA512,
);
pub const RSA_PKCS1_3072_8192_SHA384: RsaParameters = RsaParameters::new(
&digest::SHA384,
&rsa::signature::RsaPadding::RSA_PKCS1_PADDING,
3072..=8192,
&RsaVerificationAlgorithmId::RSA_PKCS1_3072_8192_SHA384,
);
pub const RSA_PSS_2048_8192_SHA256: RsaParameters = RsaParameters::new(
&digest::SHA256,
&rsa::signature::RsaPadding::RSA_PKCS1_PSS_PADDING,
2048..=8192,
&RsaVerificationAlgorithmId::RSA_PSS_2048_8192_SHA256,
);
pub const RSA_PSS_2048_8192_SHA384: RsaParameters = RsaParameters::new(
&digest::SHA384,
&rsa::signature::RsaPadding::RSA_PKCS1_PSS_PADDING,
2048..=8192,
&RsaVerificationAlgorithmId::RSA_PSS_2048_8192_SHA384,
);
pub const RSA_PSS_2048_8192_SHA512: RsaParameters = RsaParameters::new(
&digest::SHA512,
&rsa::signature::RsaPadding::RSA_PKCS1_PSS_PADDING,
2048..=8192,
&RsaVerificationAlgorithmId::RSA_PSS_2048_8192_SHA512,
);
pub const RSA_PSS_SHA256: RsaSignatureEncoding = RsaSignatureEncoding::new(
&digest::SHA256,
&rsa::signature::RsaPadding::RSA_PKCS1_PSS_PADDING,
&RsaSigningAlgorithmId::RSA_PSS_SHA256,
);
pub const RSA_PSS_SHA384: RsaSignatureEncoding = RsaSignatureEncoding::new(
&digest::SHA384,
&rsa::signature::RsaPadding::RSA_PKCS1_PSS_PADDING,
&RsaSigningAlgorithmId::RSA_PSS_SHA384,
);
pub const RSA_PSS_SHA512: RsaSignatureEncoding = RsaSignatureEncoding::new(
&digest::SHA512,
&rsa::signature::RsaPadding::RSA_PKCS1_PSS_PADDING,
&RsaSigningAlgorithmId::RSA_PSS_SHA512,
);
pub const RSA_PKCS1_SHA256: RsaSignatureEncoding = RsaSignatureEncoding::new(
&digest::SHA256,
&rsa::signature::RsaPadding::RSA_PKCS1_PADDING,
&RsaSigningAlgorithmId::RSA_PKCS1_SHA256,
);
pub const RSA_PKCS1_SHA384: RsaSignatureEncoding = RsaSignatureEncoding::new(
&digest::SHA384,
&rsa::signature::RsaPadding::RSA_PKCS1_PADDING,
&RsaSigningAlgorithmId::RSA_PKCS1_SHA384,
);
pub const RSA_PKCS1_SHA512: RsaSignatureEncoding = RsaSignatureEncoding::new(
&digest::SHA512,
&rsa::signature::RsaPadding::RSA_PKCS1_PADDING,
&RsaSigningAlgorithmId::RSA_PKCS1_SHA512,
);
pub const ECDSA_P256_SHA256_FIXED: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P256,
digest: &digest::SHA256,
sig_format: EcdsaSignatureFormat::Fixed,
};
pub const ECDSA_P384_SHA384_FIXED: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P384,
digest: &digest::SHA384,
sig_format: EcdsaSignatureFormat::Fixed,
};
pub const ECDSA_P384_SHA3_384_FIXED: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P384,
digest: &digest::SHA3_384,
sig_format: EcdsaSignatureFormat::Fixed,
};
pub const ECDSA_P521_SHA1_FIXED: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P521,
digest: &digest::SHA1_FOR_LEGACY_USE_ONLY,
sig_format: EcdsaSignatureFormat::Fixed,
};
pub const ECDSA_P521_SHA224_FIXED: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P521,
digest: &digest::SHA224,
sig_format: EcdsaSignatureFormat::Fixed,
};
pub const ECDSA_P521_SHA256_FIXED: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P521,
digest: &digest::SHA256,
sig_format: EcdsaSignatureFormat::Fixed,
};
pub const ECDSA_P521_SHA384_FIXED: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P521,
digest: &digest::SHA384,
sig_format: EcdsaSignatureFormat::Fixed,
};
pub const ECDSA_P521_SHA512_FIXED: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P521,
digest: &digest::SHA512,
sig_format: EcdsaSignatureFormat::Fixed,
};
pub const ECDSA_P521_SHA3_512_FIXED: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P521,
digest: &digest::SHA3_512,
sig_format: EcdsaSignatureFormat::Fixed,
};
pub const ECDSA_P256K1_SHA256_FIXED: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P256K1,
digest: &digest::SHA256,
sig_format: EcdsaSignatureFormat::Fixed,
};
pub const ECDSA_P256K1_SHA3_256_FIXED: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P256K1,
digest: &digest::SHA3_256,
sig_format: EcdsaSignatureFormat::Fixed,
};
pub const ECDSA_P256_SHA256_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P256,
digest: &digest::SHA256,
sig_format: EcdsaSignatureFormat::ASN1,
};
pub const ECDSA_P256_SHA384_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P256,
digest: &digest::SHA384,
sig_format: EcdsaSignatureFormat::ASN1,
};
pub const ECDSA_P256_SHA512_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P256,
digest: &digest::SHA512,
sig_format: EcdsaSignatureFormat::ASN1,
};
pub const ECDSA_P384_SHA256_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P384,
digest: &digest::SHA256,
sig_format: EcdsaSignatureFormat::ASN1,
};
pub const ECDSA_P384_SHA384_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P384,
digest: &digest::SHA384,
sig_format: EcdsaSignatureFormat::ASN1,
};
pub const ECDSA_P384_SHA512_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P384,
digest: &digest::SHA512,
sig_format: EcdsaSignatureFormat::ASN1,
};
pub const ECDSA_P384_SHA3_384_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P384,
digest: &digest::SHA3_384,
sig_format: EcdsaSignatureFormat::ASN1,
};
pub const ECDSA_P521_SHA1_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P521,
digest: &digest::SHA1_FOR_LEGACY_USE_ONLY,
sig_format: EcdsaSignatureFormat::ASN1,
};
pub const ECDSA_P521_SHA224_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P521,
digest: &digest::SHA224,
sig_format: EcdsaSignatureFormat::ASN1,
};
pub const ECDSA_P521_SHA256_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P521,
digest: &digest::SHA256,
sig_format: EcdsaSignatureFormat::ASN1,
};
pub const ECDSA_P521_SHA384_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P521,
digest: &digest::SHA384,
sig_format: EcdsaSignatureFormat::ASN1,
};
pub const ECDSA_P521_SHA512_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P521,
digest: &digest::SHA512,
sig_format: EcdsaSignatureFormat::ASN1,
};
pub const ECDSA_P521_SHA3_512_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P521,
digest: &digest::SHA3_512,
sig_format: EcdsaSignatureFormat::ASN1,
};
pub const ECDSA_P256K1_SHA256_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P256K1,
digest: &digest::SHA256,
sig_format: EcdsaSignatureFormat::ASN1,
};
pub const ECDSA_P256K1_SHA3_256_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm {
id: &ec::signature::AlgorithmID::ECDSA_P256K1,
digest: &digest::SHA3_256,
sig_format: EcdsaSignatureFormat::ASN1,
};
pub const ECDSA_P256_SHA256_FIXED_SIGNING: EcdsaSigningAlgorithm =
EcdsaSigningAlgorithm(&ECDSA_P256_SHA256_FIXED);
pub const ECDSA_P384_SHA384_FIXED_SIGNING: EcdsaSigningAlgorithm =
EcdsaSigningAlgorithm(&ECDSA_P384_SHA384_FIXED);
pub const ECDSA_P384_SHA3_384_FIXED_SIGNING: EcdsaSigningAlgorithm =
EcdsaSigningAlgorithm(&ECDSA_P384_SHA3_384_FIXED);
pub const ECDSA_P521_SHA224_FIXED_SIGNING: EcdsaSigningAlgorithm =
EcdsaSigningAlgorithm(&ECDSA_P521_SHA224_FIXED);
pub const ECDSA_P521_SHA256_FIXED_SIGNING: EcdsaSigningAlgorithm =
EcdsaSigningAlgorithm(&ECDSA_P521_SHA256_FIXED);
pub const ECDSA_P521_SHA384_FIXED_SIGNING: EcdsaSigningAlgorithm =
EcdsaSigningAlgorithm(&ECDSA_P521_SHA384_FIXED);
pub const ECDSA_P521_SHA512_FIXED_SIGNING: EcdsaSigningAlgorithm =
EcdsaSigningAlgorithm(&ECDSA_P521_SHA512_FIXED);
pub const ECDSA_P521_SHA3_512_FIXED_SIGNING: EcdsaSigningAlgorithm =
EcdsaSigningAlgorithm(&ECDSA_P521_SHA3_512_FIXED);
pub const ECDSA_P256K1_SHA256_FIXED_SIGNING: EcdsaSigningAlgorithm =
EcdsaSigningAlgorithm(&ECDSA_P256K1_SHA256_FIXED);
pub const ECDSA_P256K1_SHA3_256_FIXED_SIGNING: EcdsaSigningAlgorithm =
EcdsaSigningAlgorithm(&ECDSA_P256K1_SHA3_256_FIXED);
pub const ECDSA_P256_SHA256_ASN1_SIGNING: EcdsaSigningAlgorithm =
EcdsaSigningAlgorithm(&ECDSA_P256_SHA256_ASN1);
pub const ECDSA_P384_SHA384_ASN1_SIGNING: EcdsaSigningAlgorithm =
EcdsaSigningAlgorithm(&ECDSA_P384_SHA384_ASN1);
pub const ECDSA_P384_SHA3_384_ASN1_SIGNING: EcdsaSigningAlgorithm =
EcdsaSigningAlgorithm(&ECDSA_P384_SHA3_384_ASN1);
pub const ECDSA_P521_SHA224_ASN1_SIGNING: EcdsaSigningAlgorithm =
EcdsaSigningAlgorithm(&ECDSA_P521_SHA224_ASN1);
pub const ECDSA_P521_SHA256_ASN1_SIGNING: EcdsaSigningAlgorithm =
EcdsaSigningAlgorithm(&ECDSA_P521_SHA256_ASN1);
pub const ECDSA_P521_SHA384_ASN1_SIGNING: EcdsaSigningAlgorithm =
EcdsaSigningAlgorithm(&ECDSA_P521_SHA384_ASN1);
pub const ECDSA_P521_SHA512_ASN1_SIGNING: EcdsaSigningAlgorithm =
EcdsaSigningAlgorithm(&ECDSA_P521_SHA512_ASN1);
pub const ECDSA_P521_SHA3_512_ASN1_SIGNING: EcdsaSigningAlgorithm =
EcdsaSigningAlgorithm(&ECDSA_P521_SHA3_512_ASN1);
pub const ECDSA_P256K1_SHA256_ASN1_SIGNING: EcdsaSigningAlgorithm =
EcdsaSigningAlgorithm(&ECDSA_P256K1_SHA256_ASN1);
pub const ECDSA_P256K1_SHA3_256_ASN1_SIGNING: EcdsaSigningAlgorithm =
EcdsaSigningAlgorithm(&ECDSA_P256K1_SHA3_256_ASN1);
pub const ED25519: EdDSAParameters = EdDSAParameters {};
#[cfg(test)]
mod tests {
use crate::rand::{generate, SystemRandom};
use crate::signature::{ParsedPublicKey, UnparsedPublicKey, ED25519};
use crate::test;
use regex::Regex;
#[cfg(feature = "fips")]
mod fips;
#[test]
fn test_unparsed_public_key() {
let random_pubkey: [u8; 32] = generate(&SystemRandom::new()).unwrap().expose();
let unparsed_pubkey = UnparsedPublicKey::new(&ED25519, random_pubkey);
let unparsed_pubkey_debug = format!("{:?}", &unparsed_pubkey);
#[allow(clippy::clone_on_copy)]
let unparsed_pubkey_clone = unparsed_pubkey.clone();
assert_eq!(unparsed_pubkey_debug, format!("{unparsed_pubkey_clone:?}"));
let pubkey_re = Regex::new(
"UnparsedPublicKey \\{ algorithm: EdDSAParameters, bytes: \"[0-9a-f]{64}\" \\}",
)
.unwrap();
assert!(pubkey_re.is_match(&unparsed_pubkey_debug));
}
#[test]
fn test_types() {
test::compile_time_assert_send::<UnparsedPublicKey<&[u8]>>();
test::compile_time_assert_sync::<UnparsedPublicKey<&[u8]>>();
test::compile_time_assert_send::<UnparsedPublicKey<Vec<u8>>>();
test::compile_time_assert_sync::<UnparsedPublicKey<Vec<u8>>>();
test::compile_time_assert_clone::<UnparsedPublicKey<&[u8]>>();
test::compile_time_assert_clone::<UnparsedPublicKey<Vec<u8>>>();
test::compile_time_assert_send::<ParsedPublicKey>();
test::compile_time_assert_sync::<ParsedPublicKey>();
test::compile_time_assert_clone::<ParsedPublicKey>();
}
}