Verify RSA-SHA256 (RS256) signature using a DER-encoded public key. Supports both PKCS#1 (RSAPublicKey) and PKCS#8 (SubjectPublicKeyInfo) formats.
(public_key_der: &[u8], message: &[u8], signature: &[u8])
| 271 | /// |
| 272 | /// Supports both PKCS#1 (RSAPublicKey) and PKCS#8 (SubjectPublicKeyInfo) formats. |
| 273 | fn verify_rsa_sha256(public_key_der: &[u8], message: &[u8], signature: &[u8]) -> bool { |
| 274 | use rsa::Pkcs1v15Sign; |
| 275 | |
| 276 | // Try PKCS#8 first, then PKCS#1. |
| 277 | let rsa_key = if let Ok(key) = |
| 278 | <rsa::RsaPublicKey as rsa::pkcs8::DecodePublicKey>::from_public_key_der(public_key_der) |
| 279 | { |
| 280 | key |
| 281 | } else if let Ok(key) = |
| 282 | <rsa::RsaPublicKey as rsa::pkcs1::DecodeRsaPublicKey>::from_pkcs1_der(public_key_der) |
| 283 | { |
| 284 | key |
| 285 | } else { |
| 286 | return false; |
| 287 | }; |
| 288 | |
| 289 | // Hash the message with SHA-256. |
| 290 | use sha2::Digest; |
| 291 | let digest = sha2::Sha256::digest(message); |
| 292 | |
| 293 | // Verify PKCS#1 v1.5 signature. |
| 294 | let scheme = Pkcs1v15Sign::new::<sha2::Sha256>(); |
| 295 | rsa_key.verify(scheme, &digest, signature).is_ok() |
| 296 | } |
| 297 | |
| 298 | /// Load an RSA public key from a PEM file (for JwtConfig initialization). |
| 299 | /// |