1use pki_types::{AlgorithmIdentifier, InvalidSignature, SignatureVerificationAlgorithm};
16use ring::signature;
17
18use crate::signed_data::alg_id;
19
20#[derive(Debug)]
22struct RingAlgorithm {
23 public_key_alg_id: AlgorithmIdentifier,
24 signature_alg_id: AlgorithmIdentifier,
25 verification_alg: &'static dyn signature::VerificationAlgorithm,
26}
27
28impl SignatureVerificationAlgorithm for RingAlgorithm {
29 fn public_key_alg_id(&self) -> AlgorithmIdentifier {
30 self.public_key_alg_id
31 }
32
33 fn signature_alg_id(&self) -> AlgorithmIdentifier {
34 self.signature_alg_id
35 }
36
37 fn verify_signature(
38 &self,
39 public_key: &[u8],
40 message: &[u8],
41 signature: &[u8],
42 ) -> Result<(), InvalidSignature> {
43 signature::UnparsedPublicKey::new(self.verification_alg, public_key)
44 .verify(message, signature)
45 .map_err(|_| InvalidSignature)
46 }
47}
48
49pub static ECDSA_P256_SHA256: &dyn SignatureVerificationAlgorithm = &RingAlgorithm {
51 public_key_alg_id: alg_id::ECDSA_P256,
52 signature_alg_id: alg_id::ECDSA_SHA256,
53 verification_alg: &signature::ECDSA_P256_SHA256_ASN1,
54};
55
56pub static ECDSA_P256_SHA384: &dyn SignatureVerificationAlgorithm = &RingAlgorithm {
58 public_key_alg_id: alg_id::ECDSA_P256,
59 signature_alg_id: alg_id::ECDSA_SHA384,
60 verification_alg: &signature::ECDSA_P256_SHA384_ASN1,
61};
62
63pub static ECDSA_P384_SHA256: &dyn SignatureVerificationAlgorithm = &RingAlgorithm {
65 public_key_alg_id: alg_id::ECDSA_P384,
66 signature_alg_id: alg_id::ECDSA_SHA256,
67 verification_alg: &signature::ECDSA_P384_SHA256_ASN1,
68};
69
70pub static ECDSA_P384_SHA384: &dyn SignatureVerificationAlgorithm = &RingAlgorithm {
72 public_key_alg_id: alg_id::ECDSA_P384,
73 signature_alg_id: alg_id::ECDSA_SHA384,
74 verification_alg: &signature::ECDSA_P384_SHA384_ASN1,
75};
76
77#[cfg(feature = "alloc")]
79pub static RSA_PKCS1_2048_8192_SHA256: &dyn SignatureVerificationAlgorithm = &RingAlgorithm {
80 public_key_alg_id: alg_id::RSA_ENCRYPTION,
81 signature_alg_id: alg_id::RSA_PKCS1_SHA256,
82 verification_alg: &signature::RSA_PKCS1_2048_8192_SHA256,
83};
84
85#[cfg(feature = "alloc")]
87pub static RSA_PKCS1_2048_8192_SHA384: &dyn SignatureVerificationAlgorithm = &RingAlgorithm {
88 public_key_alg_id: alg_id::RSA_ENCRYPTION,
89 signature_alg_id: alg_id::RSA_PKCS1_SHA384,
90 verification_alg: &signature::RSA_PKCS1_2048_8192_SHA384,
91};
92
93#[cfg(feature = "alloc")]
95pub static RSA_PKCS1_2048_8192_SHA512: &dyn SignatureVerificationAlgorithm = &RingAlgorithm {
96 public_key_alg_id: alg_id::RSA_ENCRYPTION,
97 signature_alg_id: alg_id::RSA_PKCS1_SHA512,
98 verification_alg: &signature::RSA_PKCS1_2048_8192_SHA512,
99};
100
101#[cfg(feature = "alloc")]
103pub static RSA_PKCS1_3072_8192_SHA384: &dyn SignatureVerificationAlgorithm = &RingAlgorithm {
104 public_key_alg_id: alg_id::RSA_ENCRYPTION,
105 signature_alg_id: alg_id::RSA_PKCS1_SHA384,
106 verification_alg: &signature::RSA_PKCS1_3072_8192_SHA384,
107};
108
109#[cfg(feature = "alloc")]
114pub static RSA_PSS_2048_8192_SHA256_LEGACY_KEY: &dyn SignatureVerificationAlgorithm =
115 &RingAlgorithm {
116 public_key_alg_id: alg_id::RSA_ENCRYPTION,
117 signature_alg_id: alg_id::RSA_PSS_SHA256,
118 verification_alg: &signature::RSA_PSS_2048_8192_SHA256,
119 };
120
121#[cfg(feature = "alloc")]
126pub static RSA_PSS_2048_8192_SHA384_LEGACY_KEY: &dyn SignatureVerificationAlgorithm =
127 &RingAlgorithm {
128 public_key_alg_id: alg_id::RSA_ENCRYPTION,
129 signature_alg_id: alg_id::RSA_PSS_SHA384,
130 verification_alg: &signature::RSA_PSS_2048_8192_SHA384,
131 };
132
133#[cfg(feature = "alloc")]
138pub static RSA_PSS_2048_8192_SHA512_LEGACY_KEY: &dyn SignatureVerificationAlgorithm =
139 &RingAlgorithm {
140 public_key_alg_id: alg_id::RSA_ENCRYPTION,
141 signature_alg_id: alg_id::RSA_PSS_SHA512,
142 verification_alg: &signature::RSA_PSS_2048_8192_SHA512,
143 };
144
145pub static ED25519: &dyn SignatureVerificationAlgorithm = &RingAlgorithm {
147 public_key_alg_id: alg_id::ED25519,
148 signature_alg_id: alg_id::ED25519,
149 verification_alg: &signature::ED25519,
150};
151
152#[cfg(test)]
153#[path = "."]
154mod tests {
155 use crate::Error;
156
157 static SUPPORTED_ALGORITHMS_IN_TESTS: &[&dyn super::SignatureVerificationAlgorithm] = &[
158 super::ECDSA_P256_SHA256,
160 super::ECDSA_P384_SHA384,
161 super::ED25519,
162 #[cfg(feature = "alloc")]
163 super::RSA_PKCS1_2048_8192_SHA256,
164 #[cfg(feature = "alloc")]
165 super::RSA_PKCS1_2048_8192_SHA384,
166 #[cfg(feature = "alloc")]
167 super::RSA_PKCS1_2048_8192_SHA512,
168 #[cfg(feature = "alloc")]
169 super::RSA_PKCS1_3072_8192_SHA384,
170 #[cfg(feature = "alloc")]
171 super::RSA_PSS_2048_8192_SHA256_LEGACY_KEY,
172 #[cfg(feature = "alloc")]
173 super::RSA_PSS_2048_8192_SHA384_LEGACY_KEY,
174 #[cfg(feature = "alloc")]
175 super::RSA_PSS_2048_8192_SHA512_LEGACY_KEY,
176 super::ECDSA_P256_SHA384, super::ECDSA_P384_SHA256, ];
180
181 const UNSUPPORTED_SIGNATURE_ALGORITHM_FOR_RSA_KEY: Error = if cfg!(feature = "alloc") {
182 Error::UnsupportedSignatureAlgorithmForPublicKey
183 } else {
184 Error::UnsupportedSignatureAlgorithm
185 };
186
187 const UNSUPPORTED_ECDSA_SHA512_SIGNATURE: Error = Error::UnsupportedSignatureAlgorithm;
188
189 const INVALID_SIGNATURE_FOR_RSA_KEY: Error = if cfg!(feature = "alloc") {
190 Error::InvalidSignatureForPublicKey
191 } else {
192 Error::UnsupportedSignatureAlgorithm
193 };
194
195 const OK_IF_RSA_AVAILABLE: Result<(), Error> = if cfg!(feature = "alloc") {
196 Ok(())
197 } else {
198 Err(Error::UnsupportedSignatureAlgorithm)
199 };
200
201 const OK_IF_POINT_COMPRESSION_SUPPORTED: Result<(), Error> =
202 Err(Error::InvalidSignatureForPublicKey);
203
204 #[path = "alg_tests.rs"]
205 mod alg_tests;
206}