use aws_lc_rs::signature;
use pki_types::{
AlgorithmIdentifier, FipsStatus, InvalidSignature, SignatureVerificationAlgorithm, alg_id,
};
#[cfg(all(feature = "unstable", not(feature = "fips")))]
use unstable;
pub static ALL_VERIFICATION_ALGS: &[&dyn SignatureVerificationAlgorithm] = &[
ECDSA_P256_SHA256,
ECDSA_P256_SHA384,
ECDSA_P256_SHA512,
ECDSA_P384_SHA256,
ECDSA_P384_SHA384,
ECDSA_P384_SHA512,
ECDSA_P521_SHA256,
ECDSA_P521_SHA384,
ECDSA_P521_SHA512,
ED25519,
RSA_PKCS1_2048_8192_SHA256,
RSA_PKCS1_2048_8192_SHA384,
RSA_PKCS1_2048_8192_SHA512,
RSA_PKCS1_2048_8192_SHA256_ABSENT_PARAMS,
RSA_PKCS1_2048_8192_SHA384_ABSENT_PARAMS,
RSA_PKCS1_2048_8192_SHA512_ABSENT_PARAMS,
RSA_PKCS1_3072_8192_SHA384,
RSA_PSS_2048_8192_SHA256_LEGACY_KEY,
RSA_PSS_2048_8192_SHA384_LEGACY_KEY,
RSA_PSS_2048_8192_SHA512_LEGACY_KEY,
#[cfg(all(feature = "unstable", not(feature = "fips")))]
ML_DSA_44,
#[cfg(all(feature = "unstable", not(feature = "fips")))]
ML_DSA_65,
#[cfg(all(feature = "unstable", not(feature = "fips")))]
ML_DSA_87,
];
#[derive(Debug)]
struct AwsLcRsAlgorithm {
public_key_alg_id: AlgorithmIdentifier,
signature_alg_id: AlgorithmIdentifier,
verification_alg: &'static dyn signature::VerificationAlgorithm,
in_fips_submission: bool,
}
impl SignatureVerificationAlgorithm for AwsLcRsAlgorithm {
fn public_key_alg_id(&self) -> AlgorithmIdentifier {
self.public_key_alg_id
}
fn signature_alg_id(&self) -> AlgorithmIdentifier {
self.signature_alg_id
}
fn verify_signature(
&self,
public_key: &[u8],
message: &[u8],
signature: &[u8],
) -> Result<(), InvalidSignature> {
if matches!(
self.public_key_alg_id,
alg_id::ECDSA_P256 | alg_id::ECDSA_P384 | alg_id::ECDSA_P521
) {
match public_key.first() {
Some(0x04) | Some(0x02) | Some(0x03) => {}
_ => return Err(InvalidSignature),
};
}
signature::UnparsedPublicKey::new(self.verification_alg, public_key)
.verify(message, signature)
.map_err(|_| InvalidSignature)
}
fn fips_status(&self) -> FipsStatus {
match self.in_fips_submission {
true => super::fips(),
false => FipsStatus::Unvalidated,
}
}
}
#[cfg(all(feature = "unstable", not(feature = "fips")))]
pub static ML_DSA_44: &dyn SignatureVerificationAlgorithm = &AwsLcRsAlgorithm {
public_key_alg_id: alg_id::ML_DSA_44,
signature_alg_id: alg_id::ML_DSA_44,
verification_alg: &unstable::signature::ML_DSA_44,
in_fips_submission: false,
};
#[cfg(all(feature = "unstable", not(feature = "fips")))]
pub static ML_DSA_65: &dyn SignatureVerificationAlgorithm = &AwsLcRsAlgorithm {
public_key_alg_id: alg_id::ML_DSA_65,
signature_alg_id: alg_id::ML_DSA_65,
verification_alg: &unstable::signature::ML_DSA_65,
in_fips_submission: false,
};
#[cfg(all(feature = "unstable", not(feature = "fips")))]
pub static ML_DSA_87: &dyn SignatureVerificationAlgorithm = &AwsLcRsAlgorithm {
public_key_alg_id: alg_id::ML_DSA_87,
signature_alg_id: alg_id::ML_DSA_87,
verification_alg: &unstable::signature::ML_DSA_87,
in_fips_submission: false,
};
pub static ECDSA_P256_SHA256: &dyn SignatureVerificationAlgorithm = &AwsLcRsAlgorithm {
public_key_alg_id: alg_id::ECDSA_P256,
signature_alg_id: alg_id::ECDSA_SHA256,
verification_alg: &signature::ECDSA_P256_SHA256_ASN1,
in_fips_submission: true,
};
pub static ECDSA_P256_SHA384: &dyn SignatureVerificationAlgorithm = &AwsLcRsAlgorithm {
public_key_alg_id: alg_id::ECDSA_P256,
signature_alg_id: alg_id::ECDSA_SHA384,
verification_alg: &signature::ECDSA_P256_SHA384_ASN1,
in_fips_submission: true,
};
pub static ECDSA_P256_SHA512: &dyn SignatureVerificationAlgorithm = &AwsLcRsAlgorithm {
public_key_alg_id: alg_id::ECDSA_P256,
signature_alg_id: alg_id::ECDSA_SHA512,
verification_alg: &signature::ECDSA_P256_SHA512_ASN1,
in_fips_submission: true,
};
pub static ECDSA_P384_SHA256: &dyn SignatureVerificationAlgorithm = &AwsLcRsAlgorithm {
public_key_alg_id: alg_id::ECDSA_P384,
signature_alg_id: alg_id::ECDSA_SHA256,
verification_alg: &signature::ECDSA_P384_SHA256_ASN1,
in_fips_submission: true,
};
pub static ECDSA_P384_SHA384: &dyn SignatureVerificationAlgorithm = &AwsLcRsAlgorithm {
public_key_alg_id: alg_id::ECDSA_P384,
signature_alg_id: alg_id::ECDSA_SHA384,
verification_alg: &signature::ECDSA_P384_SHA384_ASN1,
in_fips_submission: true,
};
pub static ECDSA_P384_SHA512: &dyn SignatureVerificationAlgorithm = &AwsLcRsAlgorithm {
public_key_alg_id: alg_id::ECDSA_P384,
signature_alg_id: alg_id::ECDSA_SHA512,
verification_alg: &signature::ECDSA_P384_SHA512_ASN1,
in_fips_submission: true,
};
pub static ECDSA_P521_SHA256: &dyn SignatureVerificationAlgorithm = &AwsLcRsAlgorithm {
public_key_alg_id: alg_id::ECDSA_P521,
signature_alg_id: alg_id::ECDSA_SHA256,
verification_alg: &signature::ECDSA_P521_SHA256_ASN1,
in_fips_submission: true,
};
pub static ECDSA_P521_SHA384: &dyn SignatureVerificationAlgorithm = &AwsLcRsAlgorithm {
public_key_alg_id: alg_id::ECDSA_P521,
signature_alg_id: alg_id::ECDSA_SHA384,
verification_alg: &signature::ECDSA_P521_SHA384_ASN1,
in_fips_submission: true,
};
pub static ECDSA_P521_SHA512: &dyn SignatureVerificationAlgorithm = &AwsLcRsAlgorithm {
public_key_alg_id: alg_id::ECDSA_P521,
signature_alg_id: alg_id::ECDSA_SHA512,
verification_alg: &signature::ECDSA_P521_SHA512_ASN1,
in_fips_submission: true,
};
pub static RSA_PKCS1_2048_8192_SHA256: &dyn SignatureVerificationAlgorithm = &AwsLcRsAlgorithm {
public_key_alg_id: alg_id::RSA_ENCRYPTION,
signature_alg_id: alg_id::RSA_PKCS1_SHA256,
verification_alg: &signature::RSA_PKCS1_2048_8192_SHA256,
in_fips_submission: true,
};
pub static RSA_PKCS1_2048_8192_SHA384: &dyn SignatureVerificationAlgorithm = &AwsLcRsAlgorithm {
public_key_alg_id: alg_id::RSA_ENCRYPTION,
signature_alg_id: alg_id::RSA_PKCS1_SHA384,
verification_alg: &signature::RSA_PKCS1_2048_8192_SHA384,
in_fips_submission: true,
};
pub static RSA_PKCS1_2048_8192_SHA512: &dyn SignatureVerificationAlgorithm = &AwsLcRsAlgorithm {
public_key_alg_id: alg_id::RSA_ENCRYPTION,
signature_alg_id: alg_id::RSA_PKCS1_SHA512,
verification_alg: &signature::RSA_PKCS1_2048_8192_SHA512,
in_fips_submission: true,
};
pub static RSA_PKCS1_2048_8192_SHA256_ABSENT_PARAMS: &dyn SignatureVerificationAlgorithm =
&AwsLcRsAlgorithm {
public_key_alg_id: alg_id::RSA_ENCRYPTION,
signature_alg_id: AlgorithmIdentifier::from_slice(include_bytes!(
"data/alg-rsa-pkcs1-sha256-absent-params.der"
)),
verification_alg: &signature::RSA_PKCS1_2048_8192_SHA256,
in_fips_submission: true,
};
pub static RSA_PKCS1_2048_8192_SHA384_ABSENT_PARAMS: &dyn SignatureVerificationAlgorithm =
&AwsLcRsAlgorithm {
public_key_alg_id: alg_id::RSA_ENCRYPTION,
signature_alg_id: AlgorithmIdentifier::from_slice(include_bytes!(
"data/alg-rsa-pkcs1-sha384-absent-params.der"
)),
verification_alg: &signature::RSA_PKCS1_2048_8192_SHA384,
in_fips_submission: true,
};
pub static RSA_PKCS1_2048_8192_SHA512_ABSENT_PARAMS: &dyn SignatureVerificationAlgorithm =
&AwsLcRsAlgorithm {
public_key_alg_id: alg_id::RSA_ENCRYPTION,
signature_alg_id: AlgorithmIdentifier::from_slice(include_bytes!(
"data/alg-rsa-pkcs1-sha512-absent-params.der"
)),
verification_alg: &signature::RSA_PKCS1_2048_8192_SHA512,
in_fips_submission: true,
};
pub static RSA_PKCS1_3072_8192_SHA384: &dyn SignatureVerificationAlgorithm = &AwsLcRsAlgorithm {
public_key_alg_id: alg_id::RSA_ENCRYPTION,
signature_alg_id: alg_id::RSA_PKCS1_SHA384,
verification_alg: &signature::RSA_PKCS1_3072_8192_SHA384,
in_fips_submission: true,
};
pub static RSA_PSS_2048_8192_SHA256_LEGACY_KEY: &dyn SignatureVerificationAlgorithm =
&AwsLcRsAlgorithm {
public_key_alg_id: alg_id::RSA_ENCRYPTION,
signature_alg_id: alg_id::RSA_PSS_SHA256,
verification_alg: &signature::RSA_PSS_2048_8192_SHA256,
in_fips_submission: true,
};
pub static RSA_PSS_2048_8192_SHA384_LEGACY_KEY: &dyn SignatureVerificationAlgorithm =
&AwsLcRsAlgorithm {
public_key_alg_id: alg_id::RSA_ENCRYPTION,
signature_alg_id: alg_id::RSA_PSS_SHA384,
verification_alg: &signature::RSA_PSS_2048_8192_SHA384,
in_fips_submission: true,
};
pub static RSA_PSS_2048_8192_SHA512_LEGACY_KEY: &dyn SignatureVerificationAlgorithm =
&AwsLcRsAlgorithm {
public_key_alg_id: alg_id::RSA_ENCRYPTION,
signature_alg_id: alg_id::RSA_PSS_SHA512,
verification_alg: &signature::RSA_PSS_2048_8192_SHA512,
in_fips_submission: true,
};
pub static ED25519: &dyn SignatureVerificationAlgorithm = &AwsLcRsAlgorithm {
public_key_alg_id: alg_id::ED25519,
signature_alg_id: alg_id::ED25519,
verification_alg: &signature::ED25519,
in_fips_submission: true,
};