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 }