use rustls::SignatureScheme;
use rustls::crypto::WebPkiSupportedAlgorithms;
use rustls::pki_types::{AlgorithmIdentifier, InvalidSignature, SignatureVerificationAlgorithm};
use ferritls_core::sign::{ecdsa, ed25519, rsa};
macro_rules! verifier {
($name:ident, $pk_alg_id:expr, $sig_alg_id:expr, $verify:expr, $doc:expr) => {
#[doc = $doc]
#[derive(Debug)]
pub struct $name;
impl SignatureVerificationAlgorithm for $name {
fn verify_signature(
&self,
public_key: &[u8],
message: &[u8],
signature: &[u8],
) -> Result<(), InvalidSignature> {
$verify(public_key, message, signature).map_err(|_| InvalidSignature)
}
fn public_key_alg_id(&self) -> AlgorithmIdentifier {
AlgorithmIdentifier::from_slice($pk_alg_id)
}
fn signature_alg_id(&self) -> AlgorithmIdentifier {
AlgorithmIdentifier::from_slice($sig_alg_id)
}
fn fips(&self) -> bool {
false
}
}
};
}
const PK_EC_P256: &[u8] = &[
0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d,
0x03, 0x01, 0x07,
];
const PK_EC_P384: &[u8] = &[
0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22,
];
const SIG_ECDSA_SHA256: &[u8] = &[0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02];
const SIG_ECDSA_SHA384: &[u8] = &[0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x03];
const ID_ED25519: &[u8] = &[0x06, 0x03, 0x2b, 0x65, 0x70];
const PK_RSA: &[u8] = &[
0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00,
];
const SIG_RSA_PKCS1_SHA256: &[u8] = &[
0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00,
];
const SIG_RSA_PKCS1_SHA384: &[u8] = &[
0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00,
];
const SIG_RSA_PKCS1_SHA512: &[u8] = &[
0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0d, 0x05, 0x00,
];
const SIG_RSA_PSS_SHA256: &[u8] = &[
0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0a, 0x30, 0x34, 0xa0, 0x0f, 0x30,
0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0xa1, 0x1c,
0x30, 0x1a, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x08, 0x30, 0x0d, 0x06,
0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0xa2, 0x03, 0x02, 0x01,
0x20,
];
const SIG_RSA_PSS_SHA384: &[u8] = &[
0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0a, 0x30, 0x34, 0xa0, 0x0f, 0x30,
0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, 0x00, 0xa1, 0x1c,
0x30, 0x1a, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x08, 0x30, 0x0d, 0x06,
0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, 0x00, 0xa2, 0x03, 0x02, 0x01,
0x30,
];
const SIG_RSA_PSS_SHA512: &[u8] = &[
0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0a, 0x30, 0x34, 0xa0, 0x0f, 0x30,
0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0xa1, 0x1c,
0x30, 0x1a, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x08, 0x30, 0x0d, 0x06,
0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0xa2, 0x03, 0x02, 0x01,
0x40,
];
fn v_ecdsa_p256(
public_key: &[u8],
message: &[u8],
signature: &[u8],
) -> Result<(), ferritls_core::Error> {
ecdsa::p256::VerifyKey::from_sec1_point(public_key)?.verify(message, signature)
}
fn v_ecdsa_p384(
public_key: &[u8],
message: &[u8],
signature: &[u8],
) -> Result<(), ferritls_core::Error> {
ecdsa::p384::VerifyKey::from_sec1_point(public_key)?.verify(message, signature)
}
fn v_ed25519(
public_key: &[u8],
message: &[u8],
signature: &[u8],
) -> Result<(), ferritls_core::Error> {
ed25519::VerifyKey::from_raw_bytes(public_key)?.verify(message, signature)
}
fn v_rsa_pkcs1_256(
public_key: &[u8],
message: &[u8],
signature: &[u8],
) -> Result<(), ferritls_core::Error> {
rsa::VerifyKey::from_rsapublickey_der(public_key)?.verify_pkcs1v15(256, message, signature)
}
fn v_rsa_pkcs1_384(
public_key: &[u8],
message: &[u8],
signature: &[u8],
) -> Result<(), ferritls_core::Error> {
rsa::VerifyKey::from_rsapublickey_der(public_key)?.verify_pkcs1v15(384, message, signature)
}
fn v_rsa_pkcs1_512(
public_key: &[u8],
message: &[u8],
signature: &[u8],
) -> Result<(), ferritls_core::Error> {
rsa::VerifyKey::from_rsapublickey_der(public_key)?.verify_pkcs1v15(512, message, signature)
}
fn v_rsa_pss_256(
public_key: &[u8],
message: &[u8],
signature: &[u8],
) -> Result<(), ferritls_core::Error> {
rsa::VerifyKey::from_rsapublickey_der(public_key)?.verify_pss(256, message, signature)
}
fn v_rsa_pss_384(
public_key: &[u8],
message: &[u8],
signature: &[u8],
) -> Result<(), ferritls_core::Error> {
rsa::VerifyKey::from_rsapublickey_der(public_key)?.verify_pss(384, message, signature)
}
fn v_rsa_pss_512(
public_key: &[u8],
message: &[u8],
signature: &[u8],
) -> Result<(), ferritls_core::Error> {
rsa::VerifyKey::from_rsapublickey_der(public_key)?.verify_pss(512, message, signature)
}
verifier!(
EcdsaP256Sha256,
PK_EC_P256,
SIG_ECDSA_SHA256,
v_ecdsa_p256,
"ECDSA P-256/SHA-256(批准)。"
);
verifier!(
EcdsaP384Sha384,
PK_EC_P384,
SIG_ECDSA_SHA384,
v_ecdsa_p384,
"ECDSA P-384/SHA-384(批准)。"
);
verifier!(
Ed25519,
ID_ED25519,
ID_ED25519,
v_ed25519,
"Ed25519(非批准)。"
);
verifier!(
RsaPkcs1Sha256,
PK_RSA,
SIG_RSA_PKCS1_SHA256,
v_rsa_pkcs1_256,
"RSA PKCS#1 v1.5/SHA-256(批准;仅证书链验证遗留用途)。"
);
verifier!(
RsaPkcs1Sha384,
PK_RSA,
SIG_RSA_PKCS1_SHA384,
v_rsa_pkcs1_384,
"RSA PKCS#1 v1.5/SHA-384(批准;遗留用途)。"
);
verifier!(
RsaPkcs1Sha512,
PK_RSA,
SIG_RSA_PKCS1_SHA512,
v_rsa_pkcs1_512,
"RSA PKCS#1 v1.5/SHA-512(批准;遗留用途)。"
);
verifier!(
RsaPssSha256,
PK_RSA,
SIG_RSA_PSS_SHA256,
v_rsa_pss_256,
"RSA-PSS/SHA-256(批准)。"
);
verifier!(
RsaPssSha384,
PK_RSA,
SIG_RSA_PSS_SHA384,
v_rsa_pss_384,
"RSA-PSS/SHA-384(批准)。"
);
verifier!(
RsaPssSha512,
PK_RSA,
SIG_RSA_PSS_SHA512,
v_rsa_pss_512,
"RSA-PSS/SHA-512(批准)。"
);
pub static ALL_VERIFIERS: &[&dyn SignatureVerificationAlgorithm] = &[
&EcdsaP256Sha256,
&EcdsaP384Sha384,
&Ed25519,
&RsaPkcs1Sha256,
&RsaPkcs1Sha384,
&RsaPkcs1Sha512,
&RsaPssSha256,
&RsaPssSha384,
&RsaPssSha512,
];
pub static SCHEME_MAP: &[(SignatureScheme, &[&dyn SignatureVerificationAlgorithm])] = &[
(SignatureScheme::ECDSA_NISTP256_SHA256, &[&EcdsaP256Sha256]),
(SignatureScheme::ECDSA_NISTP384_SHA384, &[&EcdsaP384Sha384]),
(SignatureScheme::ED25519, &[&Ed25519]),
(SignatureScheme::RSA_PKCS1_SHA256, &[&RsaPkcs1Sha256]),
(SignatureScheme::RSA_PKCS1_SHA384, &[&RsaPkcs1Sha384]),
(SignatureScheme::RSA_PKCS1_SHA512, &[&RsaPkcs1Sha512]),
(SignatureScheme::RSA_PSS_SHA256, &[&RsaPssSha256]),
(SignatureScheme::RSA_PSS_SHA384, &[&RsaPssSha384]),
(SignatureScheme::RSA_PSS_SHA512, &[&RsaPssSha512]),
];
pub static SUPPORTED_ALGORITHMS: WebPkiSupportedAlgorithms = WebPkiSupportedAlgorithms {
all: ALL_VERIFIERS,
mapping: SCHEME_MAP,
};
pub static FIPS_SUPPORTED_ALGORITHMS: WebPkiSupportedAlgorithms = WebPkiSupportedAlgorithms {
all: FIPS_ALL_VERIFIERS,
mapping: FIPS_SCHEME_MAP,
};
static FIPS_ALL_VERIFIERS: &[&dyn SignatureVerificationAlgorithm] = &[
&EcdsaP256Sha256,
&EcdsaP384Sha384,
&RsaPkcs1Sha256,
&RsaPkcs1Sha384,
&RsaPkcs1Sha512,
&RsaPssSha256,
&RsaPssSha384,
&RsaPssSha512,
];
static FIPS_SCHEME_MAP: &[(SignatureScheme, &[&dyn SignatureVerificationAlgorithm])] = &[
(SignatureScheme::ECDSA_NISTP256_SHA256, &[&EcdsaP256Sha256]),
(SignatureScheme::ECDSA_NISTP384_SHA384, &[&EcdsaP384Sha384]),
(SignatureScheme::RSA_PKCS1_SHA256, &[&RsaPkcs1Sha256]),
(SignatureScheme::RSA_PKCS1_SHA384, &[&RsaPkcs1Sha384]),
(SignatureScheme::RSA_PKCS1_SHA512, &[&RsaPkcs1Sha512]),
(SignatureScheme::RSA_PSS_SHA256, &[&RsaPssSha256]),
(SignatureScheme::RSA_PSS_SHA384, &[&RsaPssSha384]),
(SignatureScheme::RSA_PSS_SHA512, &[&RsaPssSha512]),
];