postgres_rustls

Rustls-based library for postgres.
git clone https://git.philomathiclife.com/repos/postgres_rustls
Log | Files | Refs | README

tests.rs (57874B)


      1 #[cfg(feature = "runtime")]
      2 extern crate alloc;
      3 use super::Hash;
      4 #[cfg(feature = "runtime")]
      5 use super::MakeTlsConnector;
      6 #[cfg(feature = "runtime")]
      7 use alloc::sync::Arc;
      8 #[cfg(feature = "runtime")]
      9 use core::{
     10     net::{IpAddr, Ipv6Addr},
     11     time::Duration,
     12 };
     13 use sha2::{Digest as _, Sha224, Sha256, Sha384, Sha512};
     14 #[cfg(feature = "runtime")]
     15 use std::{fs, io::Error};
     16 #[cfg(feature = "runtime")]
     17 use tokio::runtime::Builder;
     18 #[cfg(feature = "runtime")]
     19 use tokio_postgres::{
     20     Config,
     21     config::{ChannelBinding, LoadBalanceHosts, SslMode, TargetSessionAttrs},
     22 };
     23 #[cfg(feature = "runtime")]
     24 use tokio_rustls::rustls::{
     25     self, ClientConfig, RootCertStore,
     26     pki_types::{
     27         CertificateDer, PrivateKeyDer,
     28         pem::{Error as PemErr, PemObject as _},
     29     },
     30     version::TLS13,
     31 };
     32 #[test]
     33 fn parse_ed25519() {
     34     /// Certificate that uses Ed25519.
     35     const CERT: &[u8] = [
     36         48, 130, 1, 125, 48, 130, 1, 47, 160, 3, 2, 1, 2, 2, 1, 29, 48, 5, 6, 3, 43, 101, 112, 48,
     37         46, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 16, 48, 14, 6, 3, 85, 4, 10, 12, 7,
     38         84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 82, 111, 111, 116,
     39         48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 48, 52, 56, 48, 53, 90, 23, 13, 50, 53, 48, 51,
     40         49, 54, 48, 48, 52, 56, 48, 53, 90, 48, 43, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83,
     41         49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49, 13, 48, 11, 6, 3, 85, 4, 3,
     42         12, 4, 84, 101, 115, 116, 48, 42, 48, 5, 6, 3, 43, 101, 112, 3, 33, 0, 142, 168, 95, 146,
     43         122, 142, 177, 52, 239, 161, 27, 41, 80, 58, 167, 248, 211, 181, 154, 201, 26, 195, 207,
     44         27, 132, 228, 110, 149, 95, 212, 44, 202, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4,
     45         22, 4, 20, 238, 12, 127, 172, 94, 237, 69, 62, 240, 99, 1, 2, 35, 161, 201, 129, 19, 85, 0,
     46         227, 48, 12, 6, 3, 85, 29, 19, 1, 1, 255, 4, 2, 48, 0, 48, 11, 6, 3, 85, 29, 15, 4, 4, 3,
     47         2, 7, 128, 48, 22, 6, 3, 85, 29, 37, 1, 1, 255, 4, 12, 48, 10, 6, 8, 43, 6, 1, 5, 5, 7, 3,
     48         1, 48, 31, 6, 3, 85, 29, 35, 4, 24, 48, 22, 128, 20, 199, 177, 144, 22, 54, 182, 183, 202,
     49         234, 246, 98, 108, 85, 32, 30, 132, 146, 221, 218, 80, 48, 5, 6, 3, 43, 101, 112, 3, 65, 0,
     50         133, 253, 192, 202, 50, 167, 57, 5, 246, 17, 58, 232, 188, 41, 147, 232, 35, 206, 147, 181,
     51         0, 139, 95, 3, 24, 139, 17, 102, 113, 186, 146, 163, 97, 157, 255, 50, 193, 230, 159, 170,
     52         218, 35, 56, 99, 89, 251, 173, 97, 106, 15, 52, 71, 209, 69, 109, 216, 140, 235, 37, 23,
     53         185, 173, 215, 0,
     54     ]
     55     .as_slice();
     56     assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
     57         Hash::Sha256(ref sha_hash) => *sha_hash == Sha256::digest(CERT),
     58         Hash::Sha384(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
     59     }));
     60 }
     61 #[test]
     62 fn parse_ecdsa_sha256() {
     63     /// Certificate that uses ECDSA with SHA-256.
     64     const CERT: &[u8] = [
     65         48, 130, 1, 189, 48, 130, 1, 99, 160, 3, 2, 1, 2, 2, 1, 27, 48, 10, 6, 8, 42, 134, 72, 206,
     66         61, 4, 3, 2, 48, 46, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 16, 48, 14, 6, 3,
     67         85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 82,
     68         111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 48, 52, 49, 51, 48, 90, 23, 13,
     69         50, 53, 48, 51, 49, 54, 48, 48, 52, 49, 51, 48, 90, 48, 43, 49, 11, 48, 9, 6, 3, 85, 4, 6,
     70         19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49, 13, 48, 11,
     71         6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 89, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1,
     72         6, 8, 42, 134, 72, 206, 61, 3, 1, 7, 3, 66, 0, 4, 195, 27, 22, 133, 220, 98, 146, 255, 201,
     73         209, 114, 117, 93, 119, 207, 46, 228, 132, 210, 187, 134, 197, 201, 194, 147, 51, 111, 17,
     74         187, 179, 129, 180, 129, 62, 164, 27, 199, 95, 59, 16, 167, 134, 233, 53, 127, 194, 187,
     75         144, 193, 106, 100, 37, 104, 219, 164, 155, 58, 210, 106, 12, 192, 247, 72, 183, 163, 117,
     76         48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 84, 214, 179, 28, 250, 191, 223, 88, 72,
     77         221, 229, 63, 123, 177, 146, 167, 224, 18, 24, 0, 48, 12, 6, 3, 85, 29, 19, 1, 1, 255, 4,
     78         2, 48, 0, 48, 11, 6, 3, 85, 29, 15, 4, 4, 3, 2, 7, 128, 48, 22, 6, 3, 85, 29, 37, 1, 1,
     79         255, 4, 12, 48, 10, 6, 8, 43, 6, 1, 5, 5, 7, 3, 1, 48, 31, 6, 3, 85, 29, 35, 4, 24, 48, 22,
     80         128, 20, 43, 80, 133, 205, 3, 144, 105, 186, 141, 39, 47, 176, 39, 123, 149, 250, 100, 138,
     81         233, 225, 48, 10, 6, 8, 42, 134, 72, 206, 61, 4, 3, 2, 3, 72, 0, 48, 69, 2, 32, 107, 43,
     82         12, 27, 111, 216, 19, 191, 199, 1, 202, 22, 147, 43, 16, 188, 36, 156, 141, 80, 115, 124,
     83         160, 211, 19, 123, 41, 216, 94, 19, 236, 0, 2, 33, 0, 164, 138, 200, 40, 159, 245, 38, 70,
     84         207, 160, 121, 19, 56, 240, 18, 222, 191, 196, 217, 129, 24, 92, 238, 43, 39, 29, 57, 85,
     85         56, 11, 178, 88,
     86     ]
     87     .as_slice();
     88     assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
     89         Hash::Sha256(ref sha_hash) => *sha_hash == Sha256::digest(CERT),
     90         Hash::Sha384(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
     91     }));
     92 }
     93 #[test]
     94 fn parse_ecdsa_sha384() {
     95     /// Certificate that uses ECDSA with SHA-384.
     96     const CERT: &[u8] = [
     97         48, 130, 1, 218, 48, 130, 1, 128, 160, 3, 2, 1, 2, 2, 1, 25, 48, 10, 6, 8, 42, 134, 72,
     98         206, 61, 4, 3, 3, 48, 46, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 16, 48, 14, 6,
     99         3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4,
    100         82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 48, 51, 57, 51, 55, 90, 23,
    101         13, 50, 53, 48, 51, 49, 54, 48, 48, 51, 57, 51, 55, 90, 48, 43, 49, 11, 48, 9, 6, 3, 85, 4,
    102         6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49, 13, 48,
    103         11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 118, 48, 16, 6, 7, 42, 134, 72, 206, 61,
    104         2, 1, 6, 5, 43, 129, 4, 0, 34, 3, 98, 0, 4, 246, 106, 156, 228, 83, 166, 254, 62, 196, 22,
    105         127, 171, 204, 182, 154, 182, 253, 35, 95, 120, 253, 231, 78, 20, 146, 203, 186, 201, 147,
    106         48, 197, 96, 195, 202, 5, 235, 201, 168, 28, 117, 62, 47, 121, 211, 58, 67, 32, 96, 129,
    107         15, 215, 172, 135, 222, 180, 101, 196, 18, 41, 107, 6, 161, 172, 183, 217, 106, 227, 24,
    108         140, 13, 145, 245, 137, 185, 4, 78, 210, 56, 235, 159, 203, 241, 203, 239, 39, 90, 98, 227,
    109         215, 221, 119, 65, 47, 68, 2, 200, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4,
    110         20, 88, 91, 22, 70, 200, 54, 182, 100, 191, 186, 73, 152, 174, 87, 56, 64, 26, 173, 27, 43,
    111         48, 12, 6, 3, 85, 29, 19, 1, 1, 255, 4, 2, 48, 0, 48, 11, 6, 3, 85, 29, 15, 4, 4, 3, 2, 7,
    112         128, 48, 22, 6, 3, 85, 29, 37, 1, 1, 255, 4, 12, 48, 10, 6, 8, 43, 6, 1, 5, 5, 7, 3, 1, 48,
    113         31, 6, 3, 85, 29, 35, 4, 24, 48, 22, 128, 20, 43, 80, 133, 205, 3, 144, 105, 186, 141, 39,
    114         47, 176, 39, 123, 149, 250, 100, 138, 233, 225, 48, 10, 6, 8, 42, 134, 72, 206, 61, 4, 3,
    115         3, 3, 72, 0, 48, 69, 2, 33, 0, 210, 47, 45, 107, 132, 43, 161, 65, 132, 15, 148, 184, 203,
    116         125, 234, 232, 111, 216, 238, 113, 187, 201, 114, 177, 218, 234, 201, 126, 204, 118, 80,
    117         225, 2, 32, 67, 111, 72, 96, 182, 167, 191, 130, 118, 105, 253, 133, 58, 38, 65, 112, 234,
    118         3, 23, 77, 182, 0, 195, 80, 181, 65, 76, 243, 4, 145, 200, 255,
    119     ]
    120     .as_slice();
    121     assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
    122         Hash::Sha384(ref sha_hash) => *sha_hash == Sha384::digest(CERT),
    123         Hash::Sha256(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
    124     }));
    125 }
    126 #[test]
    127 fn parse_ecdsa_sha512() {
    128     /// Certificate that uses ECDSA with SHA-512.
    129     const CERT: &[u8] = [
    130         48, 130, 2, 1, 48, 130, 1, 166, 160, 3, 2, 1, 2, 2, 1, 24, 48, 10, 6, 8, 42, 134, 72, 206,
    131         61, 4, 3, 4, 48, 46, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 16, 48, 14, 6, 3,
    132         85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 82,
    133         111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 48, 51, 56, 51, 54, 90, 23, 13,
    134         50, 53, 48, 51, 49, 54, 48, 48, 51, 56, 51, 54, 90, 48, 43, 49, 11, 48, 9, 6, 3, 85, 4, 6,
    135         19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49, 13, 48, 11,
    136         6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 129, 155, 48, 16, 6, 7, 42, 134, 72, 206, 61,
    137         2, 1, 6, 5, 43, 129, 4, 0, 35, 3, 129, 134, 0, 4, 1, 86, 143, 210, 217, 20, 143, 103, 172,
    138         34, 97, 62, 173, 15, 43, 199, 93, 220, 81, 75, 137, 219, 111, 217, 127, 6, 8, 115, 160,
    139         121, 146, 138, 64, 110, 14, 193, 98, 164, 226, 208, 89, 120, 108, 30, 107, 77, 194, 63, 41,
    140         112, 173, 112, 44, 85, 54, 155, 168, 189, 235, 129, 214, 104, 152, 198, 252, 62, 1, 87,
    141         193, 205, 162, 152, 15, 26, 111, 231, 183, 106, 145, 29, 251, 188, 148, 239, 192, 53, 186,
    142         34, 13, 104, 231, 85, 127, 17, 67, 54, 116, 232, 85, 23, 143, 68, 171, 30, 25, 155, 201,
    143         171, 106, 89, 20, 234, 12, 192, 68, 102, 166, 50, 246, 130, 117, 62, 222, 142, 98, 62, 43,
    144         9, 109, 74, 138, 180, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 148, 160,
    145         104, 250, 171, 155, 48, 171, 13, 164, 221, 144, 240, 194, 250, 9, 183, 72, 158, 141, 48,
    146         12, 6, 3, 85, 29, 19, 1, 1, 255, 4, 2, 48, 0, 48, 11, 6, 3, 85, 29, 15, 4, 4, 3, 2, 7, 128,
    147         48, 22, 6, 3, 85, 29, 37, 1, 1, 255, 4, 12, 48, 10, 6, 8, 43, 6, 1, 5, 5, 7, 3, 1, 48, 31,
    148         6, 3, 85, 29, 35, 4, 24, 48, 22, 128, 20, 43, 80, 133, 205, 3, 144, 105, 186, 141, 39, 47,
    149         176, 39, 123, 149, 250, 100, 138, 233, 225, 48, 10, 6, 8, 42, 134, 72, 206, 61, 4, 3, 4, 3,
    150         73, 0, 48, 70, 2, 33, 0, 179, 24, 50, 50, 127, 141, 167, 197, 29, 35, 234, 81, 215, 112,
    151         233, 218, 84, 151, 136, 117, 40, 106, 164, 156, 205, 75, 6, 133, 64, 52, 161, 116, 2, 33,
    152         0, 141, 178, 46, 201, 22, 126, 42, 84, 96, 191, 175, 219, 140, 72, 252, 6, 152, 112, 113,
    153         232, 38, 101, 11, 215, 20, 143, 22, 199, 38, 237, 179, 108,
    154     ]
    155     .as_slice();
    156     assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
    157         Hash::Sha512(ref sha_hash) => *sha_hash == Sha512::digest(CERT),
    158         Hash::Sha256(_) | Hash::Sha384(_) | Hash::Sha224(_) => false,
    159     }));
    160 }
    161 #[test]
    162 fn parse_ecdsa_sha224() {
    163     /// Certificate that uses ECDSA with SHA-224.
    164     const CERT: &[u8] = [
    165         48, 130, 1, 178, 48, 130, 1, 88, 160, 3, 2, 1, 2, 2, 1, 28, 48, 10, 6, 8, 42, 134, 72, 206,
    166         61, 4, 3, 1, 48, 46, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 16, 48, 14, 6, 3,
    167         85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 82,
    168         111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 48, 52, 50, 49, 52, 90, 23, 13,
    169         50, 53, 48, 51, 49, 54, 48, 48, 52, 50, 49, 52, 90, 48, 43, 49, 11, 48, 9, 6, 3, 85, 4, 6,
    170         19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49, 13, 48, 11,
    171         6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 78, 48, 16, 6, 7, 42, 134, 72, 206, 61, 2, 1,
    172         6, 5, 43, 129, 4, 0, 33, 3, 58, 0, 4, 235, 241, 149, 78, 60, 248, 123, 132, 195, 228, 188,
    173         151, 240, 28, 76, 198, 207, 121, 165, 126, 245, 158, 214, 232, 69, 198, 114, 117, 86, 137,
    174         15, 86, 40, 171, 27, 36, 8, 43, 190, 138, 193, 136, 118, 43, 29, 119, 182, 21, 14, 123,
    175         110, 81, 81, 72, 44, 195, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 203,
    176         141, 20, 54, 48, 176, 180, 57, 46, 1, 91, 221, 116, 154, 205, 81, 187, 184, 24, 211, 48,
    177         12, 6, 3, 85, 29, 19, 1, 1, 255, 4, 2, 48, 0, 48, 11, 6, 3, 85, 29, 15, 4, 4, 3, 2, 7, 128,
    178         48, 22, 6, 3, 85, 29, 37, 1, 1, 255, 4, 12, 48, 10, 6, 8, 43, 6, 1, 5, 5, 7, 3, 1, 48, 31,
    179         6, 3, 85, 29, 35, 4, 24, 48, 22, 128, 20, 43, 80, 133, 205, 3, 144, 105, 186, 141, 39, 47,
    180         176, 39, 123, 149, 250, 100, 138, 233, 225, 48, 10, 6, 8, 42, 134, 72, 206, 61, 4, 3, 1, 3,
    181         72, 0, 48, 69, 2, 32, 64, 186, 179, 226, 82, 176, 87, 158, 166, 22, 31, 27, 19, 190, 112,
    182         167, 241, 159, 33, 198, 60, 70, 68, 120, 19, 63, 33, 244, 236, 240, 216, 181, 2, 33, 0,
    183         252, 183, 115, 52, 189, 151, 44, 178, 62, 209, 159, 31, 154, 152, 69, 189, 121, 148, 57,
    184         231, 27, 22, 165, 212, 65, 202, 124, 15, 53, 150, 93, 183,
    185     ]
    186     .as_slice();
    187     assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
    188         Hash::Sha224(ref sha_hash) => *sha_hash == Sha224::digest(CERT),
    189         Hash::Sha256(_) | Hash::Sha384(_) | Hash::Sha512(_) => false,
    190     }));
    191 }
    192 #[test]
    193 fn parse_rsa_sha256() {
    194     /// Certificate that uses RSA with SHA-256.
    195     const CERT: &[u8] = [
    196         48, 130, 3, 73, 48, 130, 2, 49, 160, 3, 2, 1, 2, 2, 1, 31, 48, 13, 6, 9, 42, 134, 72, 134,
    197         247, 13, 1, 1, 11, 5, 0, 48, 46, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 16, 48,
    198         14, 6, 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3,
    199         12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49, 48, 51, 48, 53,
    200         90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 49, 48, 51, 48, 53, 90, 48, 43, 49, 11, 48, 9, 6,
    201         3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49,
    202         13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130, 1, 34, 48, 13, 6, 9, 42,
    203         134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48, 130, 1, 10, 2, 130, 1, 1, 0,
    204         157, 28, 83, 190, 61, 252, 154, 205, 112, 191, 153, 197, 22, 159, 92, 161, 84, 84, 181, 67,
    205         218, 26, 189, 52, 245, 184, 150, 248, 142, 15, 214, 118, 205, 243, 107, 45, 103, 205, 9,
    206         198, 129, 115, 7, 195, 115, 131, 34, 244, 217, 42, 234, 170, 84, 41, 128, 49, 81, 175, 208,
    207         42, 100, 168, 44, 145, 226, 11, 98, 245, 83, 134, 213, 30, 76, 239, 43, 82, 222, 175, 254,
    208         135, 124, 16, 218, 105, 159, 219, 43, 8, 109, 1, 228, 16, 190, 160, 28, 100, 120, 245, 100,
    209         164, 45, 128, 181, 238, 152, 227, 50, 63, 162, 191, 4, 173, 210, 254, 31, 141, 66, 193,
    210         237, 20, 92, 34, 13, 74, 135, 80, 201, 12, 158, 51, 54, 91, 53, 97, 115, 212, 97, 6, 160,
    211         45, 77, 40, 165, 55, 128, 230, 105, 31, 76, 197, 211, 111, 197, 169, 167, 136, 2, 249, 117,
    212         65, 127, 163, 217, 169, 151, 97, 209, 194, 179, 203, 81, 58, 52, 66, 11, 184, 172, 97, 70,
    213         124, 125, 151, 159, 102, 224, 24, 159, 233, 169, 95, 66, 17, 180, 69, 48, 233, 5, 250, 37,
    214         55, 35, 200, 212, 225, 197, 240, 19, 22, 106, 101, 171, 190, 135, 3, 75, 157, 240, 149,
    215         107, 208, 94, 58, 244, 204, 105, 9, 32, 203, 162, 194, 39, 12, 97, 16, 153, 236, 60, 93,
    216         24, 252, 103, 231, 164, 19, 55, 233, 181, 103, 135, 187, 40, 202, 210, 125, 88, 73, 2, 3,
    217         1, 0, 1, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 91, 156, 56, 249, 82,
    218         5, 5, 2, 2, 21, 57, 237, 90, 8, 188, 55, 139, 113, 229, 132, 48, 12, 6, 3, 85, 29, 19, 1,
    219         1, 255, 4, 2, 48, 0, 48, 11, 6, 3, 85, 29, 15, 4, 4, 3, 2, 7, 128, 48, 22, 6, 3, 85, 29,
    220         37, 1, 1, 255, 4, 12, 48, 10, 6, 8, 43, 6, 1, 5, 5, 7, 3, 1, 48, 31, 6, 3, 85, 29, 35, 4,
    221         24, 48, 22, 128, 20, 96, 178, 34, 145, 205, 104, 56, 196, 211, 241, 34, 247, 125, 194, 215,
    222         110, 191, 133, 151, 15, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 11, 5, 0, 3, 130, 1,
    223         1, 0, 28, 109, 109, 197, 99, 197, 36, 180, 154, 215, 173, 215, 24, 94, 47, 218, 147, 163,
    224         179, 123, 248, 3, 144, 109, 173, 207, 49, 113, 249, 188, 31, 178, 16, 88, 88, 56, 11, 86,
    225         127, 193, 23, 165, 65, 190, 84, 170, 156, 190, 52, 87, 119, 213, 106, 184, 11, 204, 151,
    226         148, 205, 100, 233, 46, 170, 45, 161, 100, 58, 46, 105, 25, 150, 78, 146, 41, 100, 125,
    227         203, 214, 238, 104, 251, 25, 183, 66, 102, 241, 110, 56, 55, 205, 122, 234, 205, 90, 91,
    228         247, 143, 129, 217, 6, 190, 120, 18, 190, 11, 121, 207, 142, 170, 57, 236, 243, 113, 53,
    229         167, 188, 26, 134, 175, 107, 195, 48, 119, 78, 117, 157, 104, 247, 65, 122, 153, 234, 166,
    230         88, 142, 228, 25, 120, 243, 51, 111, 8, 43, 199, 255, 162, 186, 18, 64, 54, 96, 44, 138,
    231         144, 237, 89, 176, 189, 245, 194, 96, 232, 196, 0, 50, 51, 98, 32, 163, 177, 130, 113, 41,
    232         116, 33, 40, 190, 111, 79, 108, 107, 159, 65, 87, 222, 173, 170, 39, 29, 97, 240, 107, 130,
    233         101, 247, 123, 85, 123, 247, 221, 89, 159, 114, 157, 35, 153, 22, 127, 149, 224, 158, 236,
    234         4, 137, 193, 135, 136, 97, 222, 83, 232, 205, 148, 127, 139, 78, 220, 10, 183, 139, 205,
    235         190, 181, 36, 61, 155, 88, 163, 50, 120, 153, 41, 182, 75, 219, 95, 25, 40, 229, 106, 87,
    236         215, 77, 50, 219, 97,
    237     ]
    238     .as_slice();
    239     assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
    240         Hash::Sha256(ref sha_hash) => *sha_hash == Sha256::digest(CERT),
    241         Hash::Sha384(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
    242     }));
    243 }
    244 #[test]
    245 fn parse_rsa_sha384() {
    246     /// Certificate that uses RSA with SHA-384.
    247     const CERT: &[u8] = [
    248         48, 130, 3, 73, 48, 130, 2, 49, 160, 3, 2, 1, 2, 2, 1, 32, 48, 13, 6, 9, 42, 134, 72, 134,
    249         247, 13, 1, 1, 12, 5, 0, 48, 46, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 16, 48,
    250         14, 6, 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3,
    251         12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49, 48, 53, 52, 54,
    252         90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 49, 48, 53, 52, 54, 90, 48, 43, 49, 11, 48, 9, 6,
    253         3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49,
    254         13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130, 1, 34, 48, 13, 6, 9, 42,
    255         134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48, 130, 1, 10, 2, 130, 1, 1, 0,
    256         157, 28, 83, 190, 61, 252, 154, 205, 112, 191, 153, 197, 22, 159, 92, 161, 84, 84, 181, 67,
    257         218, 26, 189, 52, 245, 184, 150, 248, 142, 15, 214, 118, 205, 243, 107, 45, 103, 205, 9,
    258         198, 129, 115, 7, 195, 115, 131, 34, 244, 217, 42, 234, 170, 84, 41, 128, 49, 81, 175, 208,
    259         42, 100, 168, 44, 145, 226, 11, 98, 245, 83, 134, 213, 30, 76, 239, 43, 82, 222, 175, 254,
    260         135, 124, 16, 218, 105, 159, 219, 43, 8, 109, 1, 228, 16, 190, 160, 28, 100, 120, 245, 100,
    261         164, 45, 128, 181, 238, 152, 227, 50, 63, 162, 191, 4, 173, 210, 254, 31, 141, 66, 193,
    262         237, 20, 92, 34, 13, 74, 135, 80, 201, 12, 158, 51, 54, 91, 53, 97, 115, 212, 97, 6, 160,
    263         45, 77, 40, 165, 55, 128, 230, 105, 31, 76, 197, 211, 111, 197, 169, 167, 136, 2, 249, 117,
    264         65, 127, 163, 217, 169, 151, 97, 209, 194, 179, 203, 81, 58, 52, 66, 11, 184, 172, 97, 70,
    265         124, 125, 151, 159, 102, 224, 24, 159, 233, 169, 95, 66, 17, 180, 69, 48, 233, 5, 250, 37,
    266         55, 35, 200, 212, 225, 197, 240, 19, 22, 106, 101, 171, 190, 135, 3, 75, 157, 240, 149,
    267         107, 208, 94, 58, 244, 204, 105, 9, 32, 203, 162, 194, 39, 12, 97, 16, 153, 236, 60, 93,
    268         24, 252, 103, 231, 164, 19, 55, 233, 181, 103, 135, 187, 40, 202, 210, 125, 88, 73, 2, 3,
    269         1, 0, 1, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 91, 156, 56, 249, 82,
    270         5, 5, 2, 2, 21, 57, 237, 90, 8, 188, 55, 139, 113, 229, 132, 48, 12, 6, 3, 85, 29, 19, 1,
    271         1, 255, 4, 2, 48, 0, 48, 11, 6, 3, 85, 29, 15, 4, 4, 3, 2, 7, 128, 48, 22, 6, 3, 85, 29,
    272         37, 1, 1, 255, 4, 12, 48, 10, 6, 8, 43, 6, 1, 5, 5, 7, 3, 1, 48, 31, 6, 3, 85, 29, 35, 4,
    273         24, 48, 22, 128, 20, 96, 178, 34, 145, 205, 104, 56, 196, 211, 241, 34, 247, 125, 194, 215,
    274         110, 191, 133, 151, 15, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 12, 5, 0, 3, 130, 1,
    275         1, 0, 135, 249, 101, 184, 225, 162, 164, 193, 23, 81, 98, 221, 134, 87, 34, 94, 229, 131,
    276         221, 17, 38, 61, 156, 200, 113, 94, 244, 188, 226, 84, 74, 96, 205, 237, 230, 242, 168,
    277         238, 178, 133, 68, 188, 80, 244, 60, 42, 169, 54, 66, 79, 104, 66, 251, 27, 240, 108, 16,
    278         46, 175, 62, 240, 194, 7, 181, 238, 211, 118, 149, 150, 46, 97, 39, 28, 173, 225, 49, 73,
    279         206, 147, 101, 12, 192, 218, 119, 208, 73, 20, 208, 229, 216, 133, 213, 28, 165, 70, 20,
    280         158, 114, 223, 40, 121, 13, 236, 218, 165, 237, 164, 196, 94, 80, 120, 49, 212, 241, 213,
    281         197, 201, 104, 67, 223, 130, 148, 197, 251, 199, 167, 6, 89, 146, 139, 141, 32, 78, 72,
    282         190, 146, 94, 251, 208, 47, 118, 173, 111, 92, 241, 102, 26, 233, 145, 46, 220, 230, 5,
    283         147, 220, 92, 240, 133, 24, 192, 71, 49, 252, 84, 163, 132, 34, 139, 12, 106, 4, 189, 151,
    284         37, 34, 123, 26, 42, 84, 46, 232, 14, 129, 101, 84, 26, 25, 219, 11, 115, 214, 106, 12, 75,
    285         199, 248, 218, 239, 209, 32, 159, 40, 192, 11, 2, 175, 51, 232, 20, 8, 72, 188, 184, 177,
    286         22, 251, 238, 42, 74, 21, 25, 93, 77, 184, 5, 207, 101, 98, 60, 214, 173, 169, 56, 54, 211,
    287         167, 55, 34, 14, 184, 25, 4, 170, 108, 94, 110, 27, 45, 11, 22, 61, 130, 63, 214, 168, 72,
    288     ]
    289     .as_slice();
    290     assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
    291         Hash::Sha384(ref sha_hash) => *sha_hash == Sha384::digest(CERT),
    292         Hash::Sha256(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
    293     }));
    294 }
    295 #[test]
    296 fn parse_rsa_sha512() {
    297     /// Certificate that uses RSA with SHA-512.
    298     const CERT: &[u8] = [
    299         48, 130, 3, 73, 48, 130, 2, 49, 160, 3, 2, 1, 2, 2, 1, 33, 48, 13, 6, 9, 42, 134, 72, 134,
    300         247, 13, 1, 1, 13, 5, 0, 48, 46, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 16, 48,
    301         14, 6, 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3,
    302         12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49, 48, 54, 52, 53,
    303         90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 49, 48, 54, 52, 53, 90, 48, 43, 49, 11, 48, 9, 6,
    304         3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49,
    305         13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130, 1, 34, 48, 13, 6, 9, 42,
    306         134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48, 130, 1, 10, 2, 130, 1, 1, 0,
    307         157, 28, 83, 190, 61, 252, 154, 205, 112, 191, 153, 197, 22, 159, 92, 161, 84, 84, 181, 67,
    308         218, 26, 189, 52, 245, 184, 150, 248, 142, 15, 214, 118, 205, 243, 107, 45, 103, 205, 9,
    309         198, 129, 115, 7, 195, 115, 131, 34, 244, 217, 42, 234, 170, 84, 41, 128, 49, 81, 175, 208,
    310         42, 100, 168, 44, 145, 226, 11, 98, 245, 83, 134, 213, 30, 76, 239, 43, 82, 222, 175, 254,
    311         135, 124, 16, 218, 105, 159, 219, 43, 8, 109, 1, 228, 16, 190, 160, 28, 100, 120, 245, 100,
    312         164, 45, 128, 181, 238, 152, 227, 50, 63, 162, 191, 4, 173, 210, 254, 31, 141, 66, 193,
    313         237, 20, 92, 34, 13, 74, 135, 80, 201, 12, 158, 51, 54, 91, 53, 97, 115, 212, 97, 6, 160,
    314         45, 77, 40, 165, 55, 128, 230, 105, 31, 76, 197, 211, 111, 197, 169, 167, 136, 2, 249, 117,
    315         65, 127, 163, 217, 169, 151, 97, 209, 194, 179, 203, 81, 58, 52, 66, 11, 184, 172, 97, 70,
    316         124, 125, 151, 159, 102, 224, 24, 159, 233, 169, 95, 66, 17, 180, 69, 48, 233, 5, 250, 37,
    317         55, 35, 200, 212, 225, 197, 240, 19, 22, 106, 101, 171, 190, 135, 3, 75, 157, 240, 149,
    318         107, 208, 94, 58, 244, 204, 105, 9, 32, 203, 162, 194, 39, 12, 97, 16, 153, 236, 60, 93,
    319         24, 252, 103, 231, 164, 19, 55, 233, 181, 103, 135, 187, 40, 202, 210, 125, 88, 73, 2, 3,
    320         1, 0, 1, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 91, 156, 56, 249, 82,
    321         5, 5, 2, 2, 21, 57, 237, 90, 8, 188, 55, 139, 113, 229, 132, 48, 12, 6, 3, 85, 29, 19, 1,
    322         1, 255, 4, 2, 48, 0, 48, 11, 6, 3, 85, 29, 15, 4, 4, 3, 2, 7, 128, 48, 22, 6, 3, 85, 29,
    323         37, 1, 1, 255, 4, 12, 48, 10, 6, 8, 43, 6, 1, 5, 5, 7, 3, 1, 48, 31, 6, 3, 85, 29, 35, 4,
    324         24, 48, 22, 128, 20, 96, 178, 34, 145, 205, 104, 56, 196, 211, 241, 34, 247, 125, 194, 215,
    325         110, 191, 133, 151, 15, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 13, 5, 0, 3, 130, 1,
    326         1, 0, 106, 7, 136, 82, 232, 55, 0, 98, 9, 211, 201, 57, 239, 67, 167, 139, 225, 164, 231,
    327         255, 10, 52, 47, 234, 254, 75, 239, 241, 39, 6, 226, 209, 210, 169, 200, 32, 255, 83, 159,
    328         23, 146, 9, 109, 173, 236, 216, 253, 199, 229, 23, 227, 33, 56, 98, 109, 59, 2, 167, 29,
    329         118, 251, 82, 193, 39, 244, 191, 166, 194, 160, 105, 197, 190, 213, 141, 193, 50, 45, 245,
    330         163, 229, 116, 221, 29, 194, 91, 198, 187, 21, 224, 95, 17, 203, 148, 160, 4, 15, 54, 249,
    331         69, 12, 18, 25, 58, 190, 205, 44, 157, 184, 1, 25, 64, 219, 237, 196, 33, 101, 255, 146,
    332         232, 112, 247, 214, 174, 252, 152, 146, 142, 231, 81, 35, 240, 216, 98, 136, 65, 179, 237,
    333         207, 229, 198, 72, 175, 244, 31, 126, 106, 107, 100, 200, 81, 227, 41, 61, 26, 122, 226,
    334         121, 219, 131, 212, 206, 238, 14, 210, 70, 60, 107, 115, 214, 67, 180, 133, 157, 114, 138,
    335         63, 249, 71, 235, 41, 246, 14, 14, 4, 254, 208, 215, 111, 196, 248, 117, 61, 44, 67, 185,
    336         11, 132, 10, 188, 220, 110, 78, 61, 171, 88, 172, 161, 1, 223, 52, 75, 101, 55, 249, 125,
    337         178, 141, 127, 0, 246, 176, 34, 120, 93, 214, 37, 210, 148, 217, 149, 255, 63, 32, 58, 8,
    338         71, 179, 62, 119, 14, 47, 191, 207, 137, 22, 255, 21, 71, 46, 42, 176, 31, 206, 146, 248,
    339         105,
    340     ]
    341     .as_slice();
    342     assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
    343         Hash::Sha512(ref sha_hash) => *sha_hash == Sha512::digest(CERT),
    344         Hash::Sha256(_) | Hash::Sha384(_) | Hash::Sha224(_) => false,
    345     }));
    346 }
    347 #[test]
    348 fn parse_rsa_sha224() {
    349     /// Certificate that uses RSA with SHA-224.
    350     const CERT: &[u8] = [
    351         48, 130, 3, 73, 48, 130, 2, 49, 160, 3, 2, 1, 2, 2, 1, 30, 48, 13, 6, 9, 42, 134, 72, 134,
    352         247, 13, 1, 1, 14, 5, 0, 48, 46, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 16, 48,
    353         14, 6, 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3,
    354         12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 48, 53, 57, 50, 56,
    355         90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 48, 53, 57, 50, 56, 90, 48, 43, 49, 11, 48, 9, 6,
    356         3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49,
    357         13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130, 1, 34, 48, 13, 6, 9, 42,
    358         134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48, 130, 1, 10, 2, 130, 1, 1, 0,
    359         157, 28, 83, 190, 61, 252, 154, 205, 112, 191, 153, 197, 22, 159, 92, 161, 84, 84, 181, 67,
    360         218, 26, 189, 52, 245, 184, 150, 248, 142, 15, 214, 118, 205, 243, 107, 45, 103, 205, 9,
    361         198, 129, 115, 7, 195, 115, 131, 34, 244, 217, 42, 234, 170, 84, 41, 128, 49, 81, 175, 208,
    362         42, 100, 168, 44, 145, 226, 11, 98, 245, 83, 134, 213, 30, 76, 239, 43, 82, 222, 175, 254,
    363         135, 124, 16, 218, 105, 159, 219, 43, 8, 109, 1, 228, 16, 190, 160, 28, 100, 120, 245, 100,
    364         164, 45, 128, 181, 238, 152, 227, 50, 63, 162, 191, 4, 173, 210, 254, 31, 141, 66, 193,
    365         237, 20, 92, 34, 13, 74, 135, 80, 201, 12, 158, 51, 54, 91, 53, 97, 115, 212, 97, 6, 160,
    366         45, 77, 40, 165, 55, 128, 230, 105, 31, 76, 197, 211, 111, 197, 169, 167, 136, 2, 249, 117,
    367         65, 127, 163, 217, 169, 151, 97, 209, 194, 179, 203, 81, 58, 52, 66, 11, 184, 172, 97, 70,
    368         124, 125, 151, 159, 102, 224, 24, 159, 233, 169, 95, 66, 17, 180, 69, 48, 233, 5, 250, 37,
    369         55, 35, 200, 212, 225, 197, 240, 19, 22, 106, 101, 171, 190, 135, 3, 75, 157, 240, 149,
    370         107, 208, 94, 58, 244, 204, 105, 9, 32, 203, 162, 194, 39, 12, 97, 16, 153, 236, 60, 93,
    371         24, 252, 103, 231, 164, 19, 55, 233, 181, 103, 135, 187, 40, 202, 210, 125, 88, 73, 2, 3,
    372         1, 0, 1, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 91, 156, 56, 249, 82,
    373         5, 5, 2, 2, 21, 57, 237, 90, 8, 188, 55, 139, 113, 229, 132, 48, 12, 6, 3, 85, 29, 19, 1,
    374         1, 255, 4, 2, 48, 0, 48, 11, 6, 3, 85, 29, 15, 4, 4, 3, 2, 7, 128, 48, 22, 6, 3, 85, 29,
    375         37, 1, 1, 255, 4, 12, 48, 10, 6, 8, 43, 6, 1, 5, 5, 7, 3, 1, 48, 31, 6, 3, 85, 29, 35, 4,
    376         24, 48, 22, 128, 20, 96, 178, 34, 145, 205, 104, 56, 196, 211, 241, 34, 247, 125, 194, 215,
    377         110, 191, 133, 151, 15, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 14, 5, 0, 3, 130, 1,
    378         1, 0, 122, 121, 0, 201, 250, 195, 66, 213, 60, 117, 213, 188, 93, 193, 88, 130, 241, 219,
    379         111, 238, 109, 38, 220, 131, 164, 12, 135, 169, 58, 140, 214, 211, 93, 51, 204, 242, 10,
    380         119, 123, 23, 69, 67, 135, 151, 245, 23, 144, 61, 233, 229, 122, 189, 111, 89, 190, 100,
    381         251, 86, 185, 246, 40, 121, 190, 192, 199, 119, 232, 209, 202, 23, 20, 46, 48, 235, 175,
    382         240, 225, 106, 6, 24, 239, 172, 51, 196, 63, 189, 210, 167, 244, 87, 245, 193, 130, 33,
    383         171, 165, 117, 180, 25, 250, 21, 6, 208, 124, 254, 64, 180, 50, 124, 234, 179, 121, 183, 0,
    384         71, 118, 28, 115, 86, 117, 60, 96, 164, 33, 54, 1, 86, 234, 132, 146, 156, 221, 52, 28, 39,
    385         237, 128, 75, 157, 169, 203, 26, 48, 74, 4, 129, 162, 139, 235, 16, 74, 236, 151, 0, 150,
    386         234, 246, 204, 180, 240, 31, 92, 129, 51, 221, 118, 10, 192, 140, 32, 33, 21, 223, 113, 35,
    387         86, 47, 236, 159, 252, 52, 185, 41, 151, 56, 126, 251, 165, 126, 214, 27, 213, 169, 211,
    388         174, 26, 55, 21, 11, 187, 189, 96, 67, 141, 124, 178, 51, 37, 80, 17, 220, 210, 193, 243,
    389         127, 46, 82, 75, 172, 187, 156, 222, 186, 3, 13, 194, 104, 234, 131, 96, 99, 34, 1, 61,
    390         149, 219, 33, 227, 34, 215, 211, 82, 106, 57, 61, 185, 178, 1, 191, 14, 196, 52, 5, 38, 27,
    391         232,
    392     ]
    393     .as_slice();
    394     assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
    395         Hash::Sha224(ref sha_hash) => *sha_hash == Sha224::digest(CERT),
    396         Hash::Sha256(_) | Hash::Sha384(_) | Hash::Sha512(_) => false,
    397     }));
    398 }
    399 #[test]
    400 fn parse_rsa_sha1() {
    401     /// Certificate that uses RSA with SHA-1.
    402     const CERT: &[u8] = [
    403         48, 130, 3, 73, 48, 130, 2, 49, 160, 3, 2, 1, 2, 2, 1, 34, 48, 13, 6, 9, 42, 134, 72, 134,
    404         247, 13, 1, 1, 5, 5, 0, 48, 46, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 16, 48,
    405         14, 6, 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3,
    406         12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49, 48, 57, 50, 56,
    407         90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 49, 48, 57, 50, 56, 90, 48, 43, 49, 11, 48, 9, 6,
    408         3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49,
    409         13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130, 1, 34, 48, 13, 6, 9, 42,
    410         134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48, 130, 1, 10, 2, 130, 1, 1, 0,
    411         157, 28, 83, 190, 61, 252, 154, 205, 112, 191, 153, 197, 22, 159, 92, 161, 84, 84, 181, 67,
    412         218, 26, 189, 52, 245, 184, 150, 248, 142, 15, 214, 118, 205, 243, 107, 45, 103, 205, 9,
    413         198, 129, 115, 7, 195, 115, 131, 34, 244, 217, 42, 234, 170, 84, 41, 128, 49, 81, 175, 208,
    414         42, 100, 168, 44, 145, 226, 11, 98, 245, 83, 134, 213, 30, 76, 239, 43, 82, 222, 175, 254,
    415         135, 124, 16, 218, 105, 159, 219, 43, 8, 109, 1, 228, 16, 190, 160, 28, 100, 120, 245, 100,
    416         164, 45, 128, 181, 238, 152, 227, 50, 63, 162, 191, 4, 173, 210, 254, 31, 141, 66, 193,
    417         237, 20, 92, 34, 13, 74, 135, 80, 201, 12, 158, 51, 54, 91, 53, 97, 115, 212, 97, 6, 160,
    418         45, 77, 40, 165, 55, 128, 230, 105, 31, 76, 197, 211, 111, 197, 169, 167, 136, 2, 249, 117,
    419         65, 127, 163, 217, 169, 151, 97, 209, 194, 179, 203, 81, 58, 52, 66, 11, 184, 172, 97, 70,
    420         124, 125, 151, 159, 102, 224, 24, 159, 233, 169, 95, 66, 17, 180, 69, 48, 233, 5, 250, 37,
    421         55, 35, 200, 212, 225, 197, 240, 19, 22, 106, 101, 171, 190, 135, 3, 75, 157, 240, 149,
    422         107, 208, 94, 58, 244, 204, 105, 9, 32, 203, 162, 194, 39, 12, 97, 16, 153, 236, 60, 93,
    423         24, 252, 103, 231, 164, 19, 55, 233, 181, 103, 135, 187, 40, 202, 210, 125, 88, 73, 2, 3,
    424         1, 0, 1, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 91, 156, 56, 249, 82,
    425         5, 5, 2, 2, 21, 57, 237, 90, 8, 188, 55, 139, 113, 229, 132, 48, 12, 6, 3, 85, 29, 19, 1,
    426         1, 255, 4, 2, 48, 0, 48, 11, 6, 3, 85, 29, 15, 4, 4, 3, 2, 7, 128, 48, 22, 6, 3, 85, 29,
    427         37, 1, 1, 255, 4, 12, 48, 10, 6, 8, 43, 6, 1, 5, 5, 7, 3, 1, 48, 31, 6, 3, 85, 29, 35, 4,
    428         24, 48, 22, 128, 20, 96, 178, 34, 145, 205, 104, 56, 196, 211, 241, 34, 247, 125, 194, 215,
    429         110, 191, 133, 151, 15, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 5, 5, 0, 3, 130, 1,
    430         1, 0, 12, 93, 61, 154, 152, 205, 44, 219, 157, 214, 4, 162, 93, 85, 60, 231, 231, 206, 193,
    431         160, 133, 28, 61, 113, 102, 120, 137, 120, 175, 11, 244, 113, 217, 81, 151, 123, 210, 108,
    432         156, 145, 99, 158, 104, 10, 25, 129, 95, 128, 140, 44, 153, 65, 175, 32, 37, 189, 186, 43,
    433         101, 153, 98, 160, 95, 13, 154, 86, 221, 99, 210, 157, 25, 41, 98, 79, 252, 2, 8, 221, 120,
    434         71, 54, 221, 34, 180, 109, 181, 185, 58, 2, 119, 167, 50, 172, 167, 192, 136, 24, 227, 40,
    435         211, 18, 98, 2, 175, 174, 42, 100, 136, 83, 116, 7, 50, 50, 215, 164, 90, 49, 231, 106,
    436         240, 246, 95, 236, 60, 198, 97, 200, 140, 23, 168, 183, 174, 132, 39, 251, 61, 112, 226,
    437         66, 68, 16, 23, 213, 129, 86, 196, 248, 82, 141, 82, 107, 246, 224, 37, 94, 95, 134, 139,
    438         75, 15, 70, 54, 47, 80, 19, 143, 48, 171, 113, 130, 226, 180, 39, 18, 44, 117, 113, 196,
    439         20, 11, 82, 174, 251, 197, 216, 152, 229, 188, 148, 191, 165, 149, 50, 127, 172, 111, 95,
    440         194, 63, 238, 112, 154, 85, 98, 18, 236, 13, 123, 232, 90, 47, 180, 36, 148, 77, 192, 45,
    441         113, 150, 10, 254, 99, 0, 30, 87, 80, 22, 61, 78, 66, 180, 251, 220, 8, 78, 175, 251, 27,
    442         201, 79, 197, 45, 127, 143, 163, 7, 252, 246, 45, 127, 87, 224, 125, 175, 245, 115,
    443     ]
    444     .as_slice();
    445     assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
    446         Hash::Sha256(ref sha_hash) => *sha_hash == Sha256::digest(CERT),
    447         Hash::Sha384(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
    448     }));
    449 }
    450 #[test]
    451 fn parse_dsa_sha256() {
    452     /// Certificate that uses DSA with SHA-256.
    453     const CERT: &[u8] = [
    454         48, 130, 4, 162, 48, 130, 4, 79, 160, 3, 2, 1, 2, 2, 1, 37, 48, 11, 6, 9, 96, 134, 72, 1,
    455         101, 3, 4, 3, 2, 48, 46, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 16, 48, 14, 6,
    456         3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4,
    457         82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49, 50, 51, 48, 51, 90, 23,
    458         13, 50, 53, 48, 51, 49, 54, 48, 49, 50, 51, 48, 51, 90, 48, 43, 49, 11, 48, 9, 6, 3, 85, 4,
    459         6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49, 13, 48,
    460         11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130, 3, 66, 48, 130, 2, 53, 6, 7, 42,
    461         134, 72, 206, 56, 4, 1, 48, 130, 2, 40, 2, 130, 1, 1, 0, 172, 11, 194, 123, 239, 38, 183,
    462         160, 91, 74, 179, 251, 72, 80, 38, 223, 195, 46, 238, 2, 67, 45, 138, 58, 62, 57, 85, 203,
    463         148, 194, 164, 178, 195, 150, 29, 93, 245, 157, 225, 189, 125, 209, 186, 83, 234, 14, 179,
    464         116, 156, 216, 112, 205, 152, 26, 168, 175, 111, 106, 249, 235, 49, 40, 246, 31, 152, 214,
    465         59, 117, 64, 109, 28, 167, 222, 155, 132, 192, 180, 240, 8, 80, 209, 209, 119, 53, 165, 51,
    466         189, 18, 158, 176, 171, 45, 160, 54, 8, 75, 146, 92, 245, 202, 188, 144, 36, 156, 127, 140,
    467         220, 144, 56, 95, 38, 112, 44, 221, 159, 9, 159, 189, 153, 150, 88, 84, 73, 138, 6, 73,
    468         141, 17, 28, 110, 159, 141, 21, 232, 13, 90, 130, 251, 177, 168, 242, 201, 222, 138, 182,
    469         233, 142, 229, 24, 47, 186, 56, 245, 177, 250, 253, 2, 11, 115, 29, 6, 156, 168, 117, 22,
    470         15, 152, 183, 137, 25, 188, 24, 22, 120, 195, 17, 97, 16, 85, 234, 95, 53, 156, 244, 146,
    471         53, 183, 235, 71, 24, 163, 139, 70, 227, 235, 154, 229, 210, 144, 81, 231, 161, 120, 117,
    472         182, 245, 175, 25, 252, 21, 153, 130, 211, 180, 209, 164, 34, 248, 167, 8, 98, 181, 69, 52,
    473         74, 120, 227, 165, 16, 172, 42, 107, 248, 42, 225, 46, 80, 11, 117, 92, 225, 27, 86, 4,
    474         226, 29, 85, 105, 208, 193, 120, 112, 39, 226, 20, 141, 2, 29, 0, 186, 229, 13, 141, 5, 89,
    475         173, 164, 148, 130, 205, 229, 23, 44, 125, 234, 49, 240, 196, 213, 6, 31, 233, 8, 99, 80,
    476         166, 239, 2, 130, 1, 0, 106, 152, 3, 177, 77, 235, 201, 25, 36, 150, 146, 246, 50, 67, 97,
    477         96, 245, 207, 14, 200, 60, 16, 229, 114, 211, 111, 193, 226, 252, 153, 176, 159, 198, 41,
    478         133, 157, 197, 38, 112, 217, 9, 205, 13, 85, 170, 94, 89, 60, 214, 117, 182, 163, 81, 138,
    479         122, 250, 48, 98, 43, 60, 186, 203, 147, 60, 74, 110, 89, 216, 73, 4, 191, 1, 158, 174, 98,
    480         201, 184, 25, 162, 239, 244, 139, 154, 173, 108, 135, 124, 166, 152, 88, 237, 68, 145, 252,
    481         33, 40, 237, 57, 53, 155, 215, 56, 12, 202, 22, 225, 7, 89, 24, 245, 195, 164, 36, 172, 98,
    482         26, 115, 10, 71, 27, 21, 255, 62, 212, 202, 71, 147, 229, 6, 181, 19, 107, 136, 223, 239,
    483         164, 243, 254, 101, 208, 122, 226, 150, 17, 251, 218, 85, 169, 81, 177, 7, 190, 171, 230,
    484         26, 149, 183, 181, 113, 140, 252, 212, 172, 154, 200, 118, 69, 156, 108, 144, 11, 201, 135,
    485         175, 19, 201, 116, 9, 80, 20, 19, 89, 151, 198, 204, 253, 10, 155, 101, 159, 81, 190, 174,
    486         58, 220, 250, 220, 212, 42, 111, 33, 204, 114, 7, 30, 153, 73, 248, 209, 114, 36, 225, 6,
    487         47, 106, 45, 226, 254, 175, 201, 138, 254, 121, 184, 19, 143, 48, 67, 179, 99, 250, 189,
    488         237, 58, 249, 194, 167, 149, 162, 219, 27, 53, 67, 135, 193, 204, 253, 176, 245, 2, 211,
    489         58, 176, 69, 14, 186, 3, 130, 1, 5, 0, 2, 130, 1, 0, 97, 40, 15, 97, 210, 23, 118, 85, 75,
    490         191, 251, 126, 171, 47, 188, 57, 40, 41, 85, 48, 206, 169, 253, 233, 146, 161, 39, 232,
    491         242, 19, 219, 191, 172, 82, 78, 132, 153, 238, 120, 228, 99, 199, 197, 181, 74, 191, 123,
    492         189, 80, 203, 219, 50, 184, 193, 49, 160, 9, 41, 167, 133, 33, 151, 52, 196, 61, 29, 102,
    493         233, 163, 249, 121, 248, 55, 144, 215, 55, 89, 142, 137, 249, 67, 112, 167, 42, 255, 67,
    494         56, 179, 106, 187, 79, 87, 54, 118, 186, 154, 48, 150, 204, 222, 102, 135, 254, 202, 9,
    495         166, 229, 176, 130, 37, 174, 139, 240, 43, 134, 75, 141, 35, 163, 203, 71, 153, 217, 71,
    496         181, 79, 35, 114, 55, 124, 20, 55, 110, 112, 223, 109, 239, 183, 210, 141, 59, 88, 47, 40,
    497         167, 154, 90, 99, 250, 146, 29, 226, 10, 70, 103, 246, 209, 36, 174, 177, 164, 244, 126,
    498         153, 106, 156, 92, 143, 140, 46, 49, 184, 125, 160, 246, 145, 178, 94, 11, 153, 128, 59,
    499         210, 11, 210, 42, 3, 138, 136, 147, 115, 96, 190, 68, 128, 25, 47, 26, 231, 183, 247, 89,
    500         28, 67, 220, 235, 88, 4, 228, 140, 148, 10, 98, 104, 101, 60, 115, 39, 219, 183, 111, 62,
    501         93, 133, 141, 219, 252, 51, 66, 224, 115, 158, 85, 46, 13, 171, 31, 5, 210, 83, 68, 61, 92,
    502         87, 241, 1, 215, 144, 233, 243, 68, 238, 197, 62, 54, 68, 163, 117, 48, 115, 48, 29, 6, 3,
    503         85, 29, 14, 4, 22, 4, 20, 153, 40, 244, 111, 22, 53, 83, 33, 46, 24, 242, 81, 89, 121, 91,
    504         97, 190, 144, 138, 150, 48, 12, 6, 3, 85, 29, 19, 1, 1, 255, 4, 2, 48, 0, 48, 11, 6, 3, 85,
    505         29, 15, 4, 4, 3, 2, 7, 128, 48, 22, 6, 3, 85, 29, 37, 1, 1, 255, 4, 12, 48, 10, 6, 8, 43,
    506         6, 1, 5, 5, 7, 3, 1, 48, 31, 6, 3, 85, 29, 35, 4, 24, 48, 22, 128, 20, 230, 93, 24, 66, 42,
    507         224, 216, 63, 210, 30, 74, 173, 48, 16, 195, 8, 166, 231, 232, 253, 48, 11, 6, 9, 96, 134,
    508         72, 1, 101, 3, 4, 3, 2, 3, 64, 0, 48, 61, 2, 28, 116, 130, 114, 201, 119, 192, 122, 114,
    509         52, 255, 182, 233, 56, 153, 169, 135, 12, 49, 236, 107, 72, 244, 178, 174, 32, 27, 13, 226,
    510         2, 29, 0, 170, 35, 77, 179, 10, 59, 85, 118, 124, 99, 48, 21, 125, 235, 57, 27, 60, 222,
    511         102, 120, 20, 16, 148, 80, 118, 28, 75, 176,
    512     ]
    513     .as_slice();
    514     assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
    515         Hash::Sha256(ref sha_hash) => *sha_hash == Sha256::digest(CERT),
    516         Hash::Sha384(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
    517     }));
    518 }
    519 #[test]
    520 fn parse_dsa_sha224() {
    521     /// Certificate that uses DSA with SHA-224.
    522     const CERT: &[u8] = [
    523         48, 130, 4, 163, 48, 130, 4, 79, 160, 3, 2, 1, 2, 2, 1, 36, 48, 11, 6, 9, 96, 134, 72, 1,
    524         101, 3, 4, 3, 1, 48, 46, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 16, 48, 14, 6,
    525         3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4,
    526         82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49, 50, 50, 50, 53, 90, 23,
    527         13, 50, 53, 48, 51, 49, 54, 48, 49, 50, 50, 50, 53, 90, 48, 43, 49, 11, 48, 9, 6, 3, 85, 4,
    528         6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49, 13, 48,
    529         11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130, 3, 66, 48, 130, 2, 53, 6, 7, 42,
    530         134, 72, 206, 56, 4, 1, 48, 130, 2, 40, 2, 130, 1, 1, 0, 172, 11, 194, 123, 239, 38, 183,
    531         160, 91, 74, 179, 251, 72, 80, 38, 223, 195, 46, 238, 2, 67, 45, 138, 58, 62, 57, 85, 203,
    532         148, 194, 164, 178, 195, 150, 29, 93, 245, 157, 225, 189, 125, 209, 186, 83, 234, 14, 179,
    533         116, 156, 216, 112, 205, 152, 26, 168, 175, 111, 106, 249, 235, 49, 40, 246, 31, 152, 214,
    534         59, 117, 64, 109, 28, 167, 222, 155, 132, 192, 180, 240, 8, 80, 209, 209, 119, 53, 165, 51,
    535         189, 18, 158, 176, 171, 45, 160, 54, 8, 75, 146, 92, 245, 202, 188, 144, 36, 156, 127, 140,
    536         220, 144, 56, 95, 38, 112, 44, 221, 159, 9, 159, 189, 153, 150, 88, 84, 73, 138, 6, 73,
    537         141, 17, 28, 110, 159, 141, 21, 232, 13, 90, 130, 251, 177, 168, 242, 201, 222, 138, 182,
    538         233, 142, 229, 24, 47, 186, 56, 245, 177, 250, 253, 2, 11, 115, 29, 6, 156, 168, 117, 22,
    539         15, 152, 183, 137, 25, 188, 24, 22, 120, 195, 17, 97, 16, 85, 234, 95, 53, 156, 244, 146,
    540         53, 183, 235, 71, 24, 163, 139, 70, 227, 235, 154, 229, 210, 144, 81, 231, 161, 120, 117,
    541         182, 245, 175, 25, 252, 21, 153, 130, 211, 180, 209, 164, 34, 248, 167, 8, 98, 181, 69, 52,
    542         74, 120, 227, 165, 16, 172, 42, 107, 248, 42, 225, 46, 80, 11, 117, 92, 225, 27, 86, 4,
    543         226, 29, 85, 105, 208, 193, 120, 112, 39, 226, 20, 141, 2, 29, 0, 186, 229, 13, 141, 5, 89,
    544         173, 164, 148, 130, 205, 229, 23, 44, 125, 234, 49, 240, 196, 213, 6, 31, 233, 8, 99, 80,
    545         166, 239, 2, 130, 1, 0, 106, 152, 3, 177, 77, 235, 201, 25, 36, 150, 146, 246, 50, 67, 97,
    546         96, 245, 207, 14, 200, 60, 16, 229, 114, 211, 111, 193, 226, 252, 153, 176, 159, 198, 41,
    547         133, 157, 197, 38, 112, 217, 9, 205, 13, 85, 170, 94, 89, 60, 214, 117, 182, 163, 81, 138,
    548         122, 250, 48, 98, 43, 60, 186, 203, 147, 60, 74, 110, 89, 216, 73, 4, 191, 1, 158, 174, 98,
    549         201, 184, 25, 162, 239, 244, 139, 154, 173, 108, 135, 124, 166, 152, 88, 237, 68, 145, 252,
    550         33, 40, 237, 57, 53, 155, 215, 56, 12, 202, 22, 225, 7, 89, 24, 245, 195, 164, 36, 172, 98,
    551         26, 115, 10, 71, 27, 21, 255, 62, 212, 202, 71, 147, 229, 6, 181, 19, 107, 136, 223, 239,
    552         164, 243, 254, 101, 208, 122, 226, 150, 17, 251, 218, 85, 169, 81, 177, 7, 190, 171, 230,
    553         26, 149, 183, 181, 113, 140, 252, 212, 172, 154, 200, 118, 69, 156, 108, 144, 11, 201, 135,
    554         175, 19, 201, 116, 9, 80, 20, 19, 89, 151, 198, 204, 253, 10, 155, 101, 159, 81, 190, 174,
    555         58, 220, 250, 220, 212, 42, 111, 33, 204, 114, 7, 30, 153, 73, 248, 209, 114, 36, 225, 6,
    556         47, 106, 45, 226, 254, 175, 201, 138, 254, 121, 184, 19, 143, 48, 67, 179, 99, 250, 189,
    557         237, 58, 249, 194, 167, 149, 162, 219, 27, 53, 67, 135, 193, 204, 253, 176, 245, 2, 211,
    558         58, 176, 69, 14, 186, 3, 130, 1, 5, 0, 2, 130, 1, 0, 97, 40, 15, 97, 210, 23, 118, 85, 75,
    559         191, 251, 126, 171, 47, 188, 57, 40, 41, 85, 48, 206, 169, 253, 233, 146, 161, 39, 232,
    560         242, 19, 219, 191, 172, 82, 78, 132, 153, 238, 120, 228, 99, 199, 197, 181, 74, 191, 123,
    561         189, 80, 203, 219, 50, 184, 193, 49, 160, 9, 41, 167, 133, 33, 151, 52, 196, 61, 29, 102,
    562         233, 163, 249, 121, 248, 55, 144, 215, 55, 89, 142, 137, 249, 67, 112, 167, 42, 255, 67,
    563         56, 179, 106, 187, 79, 87, 54, 118, 186, 154, 48, 150, 204, 222, 102, 135, 254, 202, 9,
    564         166, 229, 176, 130, 37, 174, 139, 240, 43, 134, 75, 141, 35, 163, 203, 71, 153, 217, 71,
    565         181, 79, 35, 114, 55, 124, 20, 55, 110, 112, 223, 109, 239, 183, 210, 141, 59, 88, 47, 40,
    566         167, 154, 90, 99, 250, 146, 29, 226, 10, 70, 103, 246, 209, 36, 174, 177, 164, 244, 126,
    567         153, 106, 156, 92, 143, 140, 46, 49, 184, 125, 160, 246, 145, 178, 94, 11, 153, 128, 59,
    568         210, 11, 210, 42, 3, 138, 136, 147, 115, 96, 190, 68, 128, 25, 47, 26, 231, 183, 247, 89,
    569         28, 67, 220, 235, 88, 4, 228, 140, 148, 10, 98, 104, 101, 60, 115, 39, 219, 183, 111, 62,
    570         93, 133, 141, 219, 252, 51, 66, 224, 115, 158, 85, 46, 13, 171, 31, 5, 210, 83, 68, 61, 92,
    571         87, 241, 1, 215, 144, 233, 243, 68, 238, 197, 62, 54, 68, 163, 117, 48, 115, 48, 29, 6, 3,
    572         85, 29, 14, 4, 22, 4, 20, 153, 40, 244, 111, 22, 53, 83, 33, 46, 24, 242, 81, 89, 121, 91,
    573         97, 190, 144, 138, 150, 48, 12, 6, 3, 85, 29, 19, 1, 1, 255, 4, 2, 48, 0, 48, 11, 6, 3, 85,
    574         29, 15, 4, 4, 3, 2, 7, 128, 48, 22, 6, 3, 85, 29, 37, 1, 1, 255, 4, 12, 48, 10, 6, 8, 43,
    575         6, 1, 5, 5, 7, 3, 1, 48, 31, 6, 3, 85, 29, 35, 4, 24, 48, 22, 128, 20, 230, 93, 24, 66, 42,
    576         224, 216, 63, 210, 30, 74, 173, 48, 16, 195, 8, 166, 231, 232, 253, 48, 11, 6, 9, 96, 134,
    577         72, 1, 101, 3, 4, 3, 1, 3, 65, 0, 48, 62, 2, 29, 0, 178, 65, 35, 200, 113, 88, 88, 146, 71,
    578         230, 14, 148, 101, 161, 118, 55, 125, 175, 226, 137, 63, 147, 215, 75, 207, 115, 150, 22,
    579         2, 29, 0, 233, 44, 225, 196, 27, 225, 84, 166, 253, 231, 247, 162, 41, 134, 178, 45, 218,
    580         17, 24, 35, 120, 100, 231, 84, 218, 88, 80, 255,
    581     ]
    582     .as_slice();
    583     assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
    584         Hash::Sha224(ref sha_hash) => *sha_hash == Sha224::digest(CERT),
    585         Hash::Sha256(_) | Hash::Sha384(_) | Hash::Sha512(_) => false,
    586     }));
    587 }
    588 #[test]
    589 fn parse_dsa_sha1() {
    590     /// Certificate that uses DSA with SHA-1.
    591     const CERT: &[u8] = [
    592         48, 130, 4, 157, 48, 130, 4, 77, 160, 3, 2, 1, 2, 2, 1, 35, 48, 9, 6, 7, 42, 134, 72, 206,
    593         56, 4, 3, 48, 46, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 16, 48, 14, 6, 3, 85,
    594         4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 82,
    595         111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49, 49, 57, 48, 55, 90, 23, 13,
    596         50, 53, 48, 51, 49, 54, 48, 49, 49, 57, 48, 55, 90, 48, 43, 49, 11, 48, 9, 6, 3, 85, 4, 6,
    597         19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49, 13, 48, 11,
    598         6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130, 3, 66, 48, 130, 2, 53, 6, 7, 42, 134,
    599         72, 206, 56, 4, 1, 48, 130, 2, 40, 2, 130, 1, 1, 0, 172, 11, 194, 123, 239, 38, 183, 160,
    600         91, 74, 179, 251, 72, 80, 38, 223, 195, 46, 238, 2, 67, 45, 138, 58, 62, 57, 85, 203, 148,
    601         194, 164, 178, 195, 150, 29, 93, 245, 157, 225, 189, 125, 209, 186, 83, 234, 14, 179, 116,
    602         156, 216, 112, 205, 152, 26, 168, 175, 111, 106, 249, 235, 49, 40, 246, 31, 152, 214, 59,
    603         117, 64, 109, 28, 167, 222, 155, 132, 192, 180, 240, 8, 80, 209, 209, 119, 53, 165, 51,
    604         189, 18, 158, 176, 171, 45, 160, 54, 8, 75, 146, 92, 245, 202, 188, 144, 36, 156, 127, 140,
    605         220, 144, 56, 95, 38, 112, 44, 221, 159, 9, 159, 189, 153, 150, 88, 84, 73, 138, 6, 73,
    606         141, 17, 28, 110, 159, 141, 21, 232, 13, 90, 130, 251, 177, 168, 242, 201, 222, 138, 182,
    607         233, 142, 229, 24, 47, 186, 56, 245, 177, 250, 253, 2, 11, 115, 29, 6, 156, 168, 117, 22,
    608         15, 152, 183, 137, 25, 188, 24, 22, 120, 195, 17, 97, 16, 85, 234, 95, 53, 156, 244, 146,
    609         53, 183, 235, 71, 24, 163, 139, 70, 227, 235, 154, 229, 210, 144, 81, 231, 161, 120, 117,
    610         182, 245, 175, 25, 252, 21, 153, 130, 211, 180, 209, 164, 34, 248, 167, 8, 98, 181, 69, 52,
    611         74, 120, 227, 165, 16, 172, 42, 107, 248, 42, 225, 46, 80, 11, 117, 92, 225, 27, 86, 4,
    612         226, 29, 85, 105, 208, 193, 120, 112, 39, 226, 20, 141, 2, 29, 0, 186, 229, 13, 141, 5, 89,
    613         173, 164, 148, 130, 205, 229, 23, 44, 125, 234, 49, 240, 196, 213, 6, 31, 233, 8, 99, 80,
    614         166, 239, 2, 130, 1, 0, 106, 152, 3, 177, 77, 235, 201, 25, 36, 150, 146, 246, 50, 67, 97,
    615         96, 245, 207, 14, 200, 60, 16, 229, 114, 211, 111, 193, 226, 252, 153, 176, 159, 198, 41,
    616         133, 157, 197, 38, 112, 217, 9, 205, 13, 85, 170, 94, 89, 60, 214, 117, 182, 163, 81, 138,
    617         122, 250, 48, 98, 43, 60, 186, 203, 147, 60, 74, 110, 89, 216, 73, 4, 191, 1, 158, 174, 98,
    618         201, 184, 25, 162, 239, 244, 139, 154, 173, 108, 135, 124, 166, 152, 88, 237, 68, 145, 252,
    619         33, 40, 237, 57, 53, 155, 215, 56, 12, 202, 22, 225, 7, 89, 24, 245, 195, 164, 36, 172, 98,
    620         26, 115, 10, 71, 27, 21, 255, 62, 212, 202, 71, 147, 229, 6, 181, 19, 107, 136, 223, 239,
    621         164, 243, 254, 101, 208, 122, 226, 150, 17, 251, 218, 85, 169, 81, 177, 7, 190, 171, 230,
    622         26, 149, 183, 181, 113, 140, 252, 212, 172, 154, 200, 118, 69, 156, 108, 144, 11, 201, 135,
    623         175, 19, 201, 116, 9, 80, 20, 19, 89, 151, 198, 204, 253, 10, 155, 101, 159, 81, 190, 174,
    624         58, 220, 250, 220, 212, 42, 111, 33, 204, 114, 7, 30, 153, 73, 248, 209, 114, 36, 225, 6,
    625         47, 106, 45, 226, 254, 175, 201, 138, 254, 121, 184, 19, 143, 48, 67, 179, 99, 250, 189,
    626         237, 58, 249, 194, 167, 149, 162, 219, 27, 53, 67, 135, 193, 204, 253, 176, 245, 2, 211,
    627         58, 176, 69, 14, 186, 3, 130, 1, 5, 0, 2, 130, 1, 0, 97, 40, 15, 97, 210, 23, 118, 85, 75,
    628         191, 251, 126, 171, 47, 188, 57, 40, 41, 85, 48, 206, 169, 253, 233, 146, 161, 39, 232,
    629         242, 19, 219, 191, 172, 82, 78, 132, 153, 238, 120, 228, 99, 199, 197, 181, 74, 191, 123,
    630         189, 80, 203, 219, 50, 184, 193, 49, 160, 9, 41, 167, 133, 33, 151, 52, 196, 61, 29, 102,
    631         233, 163, 249, 121, 248, 55, 144, 215, 55, 89, 142, 137, 249, 67, 112, 167, 42, 255, 67,
    632         56, 179, 106, 187, 79, 87, 54, 118, 186, 154, 48, 150, 204, 222, 102, 135, 254, 202, 9,
    633         166, 229, 176, 130, 37, 174, 139, 240, 43, 134, 75, 141, 35, 163, 203, 71, 153, 217, 71,
    634         181, 79, 35, 114, 55, 124, 20, 55, 110, 112, 223, 109, 239, 183, 210, 141, 59, 88, 47, 40,
    635         167, 154, 90, 99, 250, 146, 29, 226, 10, 70, 103, 246, 209, 36, 174, 177, 164, 244, 126,
    636         153, 106, 156, 92, 143, 140, 46, 49, 184, 125, 160, 246, 145, 178, 94, 11, 153, 128, 59,
    637         210, 11, 210, 42, 3, 138, 136, 147, 115, 96, 190, 68, 128, 25, 47, 26, 231, 183, 247, 89,
    638         28, 67, 220, 235, 88, 4, 228, 140, 148, 10, 98, 104, 101, 60, 115, 39, 219, 183, 111, 62,
    639         93, 133, 141, 219, 252, 51, 66, 224, 115, 158, 85, 46, 13, 171, 31, 5, 210, 83, 68, 61, 92,
    640         87, 241, 1, 215, 144, 233, 243, 68, 238, 197, 62, 54, 68, 163, 117, 48, 115, 48, 29, 6, 3,
    641         85, 29, 14, 4, 22, 4, 20, 153, 40, 244, 111, 22, 53, 83, 33, 46, 24, 242, 81, 89, 121, 91,
    642         97, 190, 144, 138, 150, 48, 12, 6, 3, 85, 29, 19, 1, 1, 255, 4, 2, 48, 0, 48, 11, 6, 3, 85,
    643         29, 15, 4, 4, 3, 2, 7, 128, 48, 22, 6, 3, 85, 29, 37, 1, 1, 255, 4, 12, 48, 10, 6, 8, 43,
    644         6, 1, 5, 5, 7, 3, 1, 48, 31, 6, 3, 85, 29, 35, 4, 24, 48, 22, 128, 20, 230, 93, 24, 66, 42,
    645         224, 216, 63, 210, 30, 74, 173, 48, 16, 195, 8, 166, 231, 232, 253, 48, 9, 6, 7, 42, 134,
    646         72, 206, 56, 4, 3, 3, 63, 0, 48, 60, 2, 28, 50, 39, 36, 45, 25, 91, 93, 174, 107, 192, 215,
    647         113, 214, 88, 122, 108, 97, 82, 121, 182, 191, 182, 66, 173, 207, 255, 17, 86, 2, 28, 28,
    648         133, 69, 48, 198, 204, 39, 177, 136, 73, 222, 95, 114, 218, 219, 54, 88, 17, 114, 204, 214,
    649         83, 20, 137, 75, 203, 163, 99,
    650     ]
    651     .as_slice();
    652     assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
    653         Hash::Sha256(ref sha_hash) => *sha_hash == Sha256::digest(CERT),
    654         Hash::Sha384(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
    655     }));
    656 }
    657 #[cfg(feature = "runtime")]
    658 #[derive(Debug)]
    659 enum E {
    660     #[expect(dead_code, reason = "does not matter for tests")]
    661     Io(Error),
    662     #[expect(dead_code, reason = "does not matter for tests")]
    663     Rustls(rustls::Error),
    664     #[expect(dead_code, reason = "does not matter for tests")]
    665     Postgres(tokio_postgres::Error),
    666     NoRootCert,
    667     MultipleRootCerts,
    668     NoClientKey,
    669     MultipleClientKeys,
    670     #[expect(dead_code, reason = "does not matter for tests")]
    671     RustlsPem(PemErr),
    672 }
    673 #[cfg(feature = "runtime")]
    674 impl From<Error> for E {
    675     fn from(value: Error) -> Self {
    676         Self::Io(value)
    677     }
    678 }
    679 #[cfg(feature = "runtime")]
    680 impl From<rustls::Error> for E {
    681     fn from(value: rustls::Error) -> Self {
    682         Self::Rustls(value)
    683     }
    684 }
    685 #[cfg(feature = "runtime")]
    686 impl From<tokio_postgres::Error> for E {
    687     fn from(value: tokio_postgres::Error) -> Self {
    688         Self::Postgres(value)
    689     }
    690 }
    691 #[cfg(feature = "runtime")]
    692 impl From<PemErr> for E {
    693     fn from(value: PemErr) -> Self {
    694         Self::RustlsPem(value)
    695     }
    696 }
    697 #[cfg(feature = "runtime")]
    698 #[ignore = "requires proper setup and I/O"]
    699 #[test]
    700 fn mutual_tls() -> Result<(), E> {
    701     let root_cert_file = fs::read("test_data/ca.crt.pem")?;
    702     let mut cert_iter = CertificateDer::pem_slice_iter(root_cert_file.as_slice());
    703     let key_file = fs::read("test_data/client.key.pem")?;
    704     let mut key_iter = PrivateKeyDer::pem_slice_iter(key_file.as_slice());
    705     let mut conf = ClientConfig::builder_with_protocol_versions([&TLS13].as_slice())
    706         .with_root_certificates(cert_iter.next().ok_or_else(|| E::NoRootCert).and_then(
    707             |cert_res| {
    708                 cert_res.map_err(E::RustlsPem).and_then(|cert| {
    709                     cert_iter.next().map_or_else(
    710                         || {
    711                             let mut root_store = RootCertStore::empty();
    712                             root_store.add(cert).map_err(E::Rustls).map(|()| root_store)
    713                         },
    714                         |_| Err(E::MultipleRootCerts),
    715                     )
    716                 })
    717             },
    718         )?)
    719         .with_client_auth_cert(
    720             CertificateDer::pem_slice_iter(fs::read("test_data/client.crt.pem")?.as_slice())
    721                 .try_fold(Vec::with_capacity(1), |mut certs, res| {
    722                     res.map(|cert| {
    723                         certs.push(cert);
    724                         certs
    725                     })
    726                 })?,
    727             key_iter
    728                 .next()
    729                 .ok_or_else(|| E::NoClientKey)
    730                 .and_then(|key_res| {
    731                     key_res.map_err(E::RustlsPem).and_then(|key| {
    732                         key_iter
    733                             .next()
    734                             .map_or_else(|| Ok(key), |_| Err(E::MultipleClientKeys))
    735                     })
    736                 })?,
    737         )?;
    738     super::set_postgresql_alpn(&mut conf);
    739     let mut config = Config::new();
    740     let connection = config
    741         .application_name("test")
    742         .channel_binding(ChannelBinding::Disable)
    743         .connect_timeout(Duration::from_secs(4))
    744         .dbname(fs::read_to_string("test_data/dbname")?.trim_ascii_end())
    745         .host(fs::read_to_string("test_data/host")?.trim_ascii_end())
    746         .hostaddr(IpAddr::V6(Ipv6Addr::LOCALHOST))
    747         .keepalives(false)
    748         .load_balance_hosts(LoadBalanceHosts::Disable)
    749         .port(5432)
    750         .ssl_mode(SslMode::Require)
    751         .target_session_attrs(TargetSessionAttrs::Any)
    752         .user(fs::read_to_string("test_data/user")?.trim_ascii_end())
    753         .connect(MakeTlsConnector::new(Arc::new(conf).into()));
    754     Builder::new_current_thread()
    755         .enable_all()
    756         .build()?
    757         .block_on(async move { connection.await.map_err(E::Postgres).map(|_| ()) })
    758 }
    759 #[cfg(feature = "runtime")]
    760 #[ignore = "requires proper setup and I/O"]
    761 #[test]
    762 fn password_and_channel_binding() -> Result<(), E> {
    763     let root_cert_file = fs::read("test_data/ca.crt.pem")?;
    764     let mut cert_iter = CertificateDer::pem_slice_iter(root_cert_file.as_slice());
    765     let mut conf = ClientConfig::builder_with_protocol_versions([&TLS13].as_slice())
    766         .with_root_certificates(cert_iter.next().ok_or_else(|| E::NoRootCert).and_then(
    767             |cert_res| {
    768                 cert_res.map_err(E::RustlsPem).and_then(|cert| {
    769                     cert_iter.next().map_or_else(
    770                         || {
    771                             let mut root_store = RootCertStore::empty();
    772                             root_store.add(cert).map_err(E::Rustls).map(|()| root_store)
    773                         },
    774                         |_| Err(E::MultipleRootCerts),
    775                     )
    776                 })
    777             },
    778         )?)
    779         .with_no_client_auth();
    780     super::set_postgresql_alpn(&mut conf);
    781     let mut config = Config::new();
    782     let connection = config
    783         .application_name("test")
    784         .channel_binding(ChannelBinding::Require)
    785         .connect_timeout(Duration::from_secs(4))
    786         .dbname(fs::read_to_string("test_data/dbname")?.trim_ascii_end())
    787         .host(fs::read_to_string("test_data/host")?.trim_ascii_end())
    788         .hostaddr(IpAddr::V6(Ipv6Addr::LOCALHOST))
    789         .keepalives(false)
    790         .load_balance_hosts(LoadBalanceHosts::Disable)
    791         .password(fs::read("test_data/password")?.trim_ascii_end())
    792         .port(5432)
    793         .ssl_mode(SslMode::Require)
    794         .target_session_attrs(TargetSessionAttrs::Any)
    795         .user(fs::read_to_string("test_data/user")?.trim_ascii_end())
    796         .connect(MakeTlsConnector::new(Arc::new(conf).into()));
    797     Builder::new_current_thread()
    798         .enable_all()
    799         .build()?
    800         .block_on(async move { connection.await.map_err(E::Postgres).map(|_| ()) })
    801 }