1use pki_types::{AlgorithmIdentifier, InvalidSignature, SignatureVerificationAlgorithm, alg_id};
2use ring::signature;
3
4pub static ALL_VERIFICATION_ALGS: &[&dyn SignatureVerificationAlgorithm] = &[
8 ECDSA_P256_SHA256,
9 ECDSA_P256_SHA384,
10 ECDSA_P384_SHA256,
11 ECDSA_P384_SHA384,
12 ED25519,
13 RSA_PKCS1_2048_8192_SHA256,
14 RSA_PKCS1_2048_8192_SHA384,
15 RSA_PKCS1_2048_8192_SHA512,
16 RSA_PKCS1_2048_8192_SHA256_ABSENT_PARAMS,
17 RSA_PKCS1_2048_8192_SHA384_ABSENT_PARAMS,
18 RSA_PKCS1_2048_8192_SHA512_ABSENT_PARAMS,
19 RSA_PKCS1_3072_8192_SHA384,
20 RSA_PSS_2048_8192_SHA256_LEGACY_KEY,
21 RSA_PSS_2048_8192_SHA384_LEGACY_KEY,
22 RSA_PSS_2048_8192_SHA512_LEGACY_KEY,
23];
24
25#[derive(Debug)]
27struct RingAlgorithm {
28 public_key_alg_id: AlgorithmIdentifier,
29 signature_alg_id: AlgorithmIdentifier,
30 verification_alg: &'static dyn signature::VerificationAlgorithm,
31}
32
33impl SignatureVerificationAlgorithm for RingAlgorithm {
34 fn public_key_alg_id(&self) -> AlgorithmIdentifier {
35 self.public_key_alg_id
36 }
37
38 fn signature_alg_id(&self) -> AlgorithmIdentifier {
39 self.signature_alg_id
40 }
41
42 fn verify_signature(
43 &self,
44 public_key: &[u8],
45 message: &[u8],
46 signature: &[u8],
47 ) -> Result<(), InvalidSignature> {
48 signature::UnparsedPublicKey::new(self.verification_alg, public_key)
49 .verify(message, signature)
50 .map_err(|_| InvalidSignature)
51 }
52}
53
54pub static ECDSA_P256_SHA256: &dyn SignatureVerificationAlgorithm = &RingAlgorithm {
56 public_key_alg_id: alg_id::ECDSA_P256,
57 signature_alg_id: alg_id::ECDSA_SHA256,
58 verification_alg: &signature::ECDSA_P256_SHA256_ASN1,
59};
60
61pub static ECDSA_P256_SHA384: &dyn SignatureVerificationAlgorithm = &RingAlgorithm {
63 public_key_alg_id: alg_id::ECDSA_P256,
64 signature_alg_id: alg_id::ECDSA_SHA384,
65 verification_alg: &signature::ECDSA_P256_SHA384_ASN1,
66};
67
68pub static ECDSA_P384_SHA256: &dyn SignatureVerificationAlgorithm = &RingAlgorithm {
70 public_key_alg_id: alg_id::ECDSA_P384,
71 signature_alg_id: alg_id::ECDSA_SHA256,
72 verification_alg: &signature::ECDSA_P384_SHA256_ASN1,
73};
74
75pub static ECDSA_P384_SHA384: &dyn SignatureVerificationAlgorithm = &RingAlgorithm {
77 public_key_alg_id: alg_id::ECDSA_P384,
78 signature_alg_id: alg_id::ECDSA_SHA384,
79 verification_alg: &signature::ECDSA_P384_SHA384_ASN1,
80};
81
82pub static RSA_PKCS1_2048_8192_SHA256: &dyn SignatureVerificationAlgorithm = &RingAlgorithm {
84 public_key_alg_id: alg_id::RSA_ENCRYPTION,
85 signature_alg_id: alg_id::RSA_PKCS1_SHA256,
86 verification_alg: &signature::RSA_PKCS1_2048_8192_SHA256,
87};
88
89pub static RSA_PKCS1_2048_8192_SHA384: &dyn SignatureVerificationAlgorithm = &RingAlgorithm {
91 public_key_alg_id: alg_id::RSA_ENCRYPTION,
92 signature_alg_id: alg_id::RSA_PKCS1_SHA384,
93 verification_alg: &signature::RSA_PKCS1_2048_8192_SHA384,
94};
95
96pub static RSA_PKCS1_2048_8192_SHA512: &dyn SignatureVerificationAlgorithm = &RingAlgorithm {
98 public_key_alg_id: alg_id::RSA_ENCRYPTION,
99 signature_alg_id: alg_id::RSA_PKCS1_SHA512,
100 verification_alg: &signature::RSA_PKCS1_2048_8192_SHA512,
101};
102
103pub static RSA_PKCS1_2048_8192_SHA256_ABSENT_PARAMS: &dyn SignatureVerificationAlgorithm =
115 &RingAlgorithm {
116 public_key_alg_id: alg_id::RSA_ENCRYPTION,
117 signature_alg_id: AlgorithmIdentifier::from_slice(include_bytes!(
118 "data/alg-rsa-pkcs1-sha256-absent-params.der"
119 )),
120 verification_alg: &signature::RSA_PKCS1_2048_8192_SHA256,
121 };
122
123pub static RSA_PKCS1_2048_8192_SHA384_ABSENT_PARAMS: &dyn SignatureVerificationAlgorithm =
135 &RingAlgorithm {
136 public_key_alg_id: alg_id::RSA_ENCRYPTION,
137 signature_alg_id: AlgorithmIdentifier::from_slice(include_bytes!(
138 "data/alg-rsa-pkcs1-sha384-absent-params.der"
139 )),
140 verification_alg: &signature::RSA_PKCS1_2048_8192_SHA384,
141 };
142
143pub static RSA_PKCS1_2048_8192_SHA512_ABSENT_PARAMS: &dyn SignatureVerificationAlgorithm =
155 &RingAlgorithm {
156 public_key_alg_id: alg_id::RSA_ENCRYPTION,
157 signature_alg_id: AlgorithmIdentifier::from_slice(include_bytes!(
158 "data/alg-rsa-pkcs1-sha512-absent-params.der"
159 )),
160 verification_alg: &signature::RSA_PKCS1_2048_8192_SHA512,
161 };
162
163pub static RSA_PKCS1_3072_8192_SHA384: &dyn SignatureVerificationAlgorithm = &RingAlgorithm {
165 public_key_alg_id: alg_id::RSA_ENCRYPTION,
166 signature_alg_id: alg_id::RSA_PKCS1_SHA384,
167 verification_alg: &signature::RSA_PKCS1_3072_8192_SHA384,
168};
169
170pub static RSA_PSS_2048_8192_SHA256_LEGACY_KEY: &dyn SignatureVerificationAlgorithm =
175 &RingAlgorithm {
176 public_key_alg_id: alg_id::RSA_ENCRYPTION,
177 signature_alg_id: alg_id::RSA_PSS_SHA256,
178 verification_alg: &signature::RSA_PSS_2048_8192_SHA256,
179 };
180
181pub static RSA_PSS_2048_8192_SHA384_LEGACY_KEY: &dyn SignatureVerificationAlgorithm =
186 &RingAlgorithm {
187 public_key_alg_id: alg_id::RSA_ENCRYPTION,
188 signature_alg_id: alg_id::RSA_PSS_SHA384,
189 verification_alg: &signature::RSA_PSS_2048_8192_SHA384,
190 };
191
192pub static RSA_PSS_2048_8192_SHA512_LEGACY_KEY: &dyn SignatureVerificationAlgorithm =
197 &RingAlgorithm {
198 public_key_alg_id: alg_id::RSA_ENCRYPTION,
199 signature_alg_id: alg_id::RSA_PSS_SHA512,
200 verification_alg: &signature::RSA_PSS_2048_8192_SHA512,
201 };
202
203pub static ED25519: &dyn SignatureVerificationAlgorithm = &RingAlgorithm {
205 public_key_alg_id: alg_id::ED25519,
206 signature_alg_id: alg_id::ED25519,
207 verification_alg: &signature::ED25519,
208};