commit 3c712e8a4f259ac0cfd2b40328a6bceb3ab8629a
parent b891583cd7c3a2ef7e8747e782b75ae2e710f808
Author: Zack Newman <zack@philomathiclife.com>
Date: Mon, 13 Jul 2026 12:55:34 -0600
bump msrv. new lints. update deps. move unit tests
Diffstat:
| M | Cargo.toml | | | 18 | +++++++++++------- |
| M | src/lib.rs | | | 842 | ++----------------------------------------------------------------------------- |
| A | src/tests.rs | | | 801 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
3 files changed, 824 insertions(+), 837 deletions(-)
diff --git a/Cargo.toml b/Cargo.toml
@@ -9,8 +9,8 @@ license = "MIT OR Apache-2.0"
name = "postgres_rustls"
readme = "README.md"
repository = "https://git.philomathiclife.com/repos/postgres_rustls/"
-rust-version = "1.93.1"
-version = "0.1.5"
+rust-version = "1.97.0"
+version = "0.1.6"
[lints.rust]
deprecated-safe = { level = "deny", priority = -1 }
@@ -28,12 +28,14 @@ unused = { level = "deny", priority = -1 }
warnings = { level = "deny", priority = -1 }
ambiguous-negative-literals = { level = "deny", priority = -1 }
closure-returning-async-block = { level = "deny", priority = -1 }
+dead-code-pub-in-binary = { level = "deny", priority = -1 }
deprecated-in-future = { level = "deny", priority = -1 }
+#deprecated-llvm-intrinsic = { level = "deny", priority = -1 }
deref-into-dyn-supertrait = { level = "deny", priority = -1 }
ffi-unwind-calls = { level = "deny", priority = -1 }
#fuzzy-provenance-casts = { level = "deny", priority = -1 }
impl-trait-redundant-captures = { level = "deny", priority = -1 }
-linker-messages = { level = "deny", priority = -1 }
+linker-info = { level = "deny", priority = -1 }
#lossy-provenance-casts = { level = "deny", priority = -1 }
macro-use-extern-crate = { level = "deny", priority = -1 }
meta-variable-misuse = { level = "deny", priority = -1 }
@@ -78,8 +80,10 @@ suspicious = { level = "deny", priority = -1 }
arbitrary_source_item_ordering = "allow"
blanket_clippy_restriction_lints = "allow"
implicit_return = "allow"
+inline_trait_bounds = "allow"
min_ident_chars = "allow"
missing_trait_methods = "allow"
+pub_use = "allow"
question_mark_used = "allow"
ref_patterns = "allow"
return_and_then = "allow"
@@ -105,13 +109,13 @@ targets = [
]
[dependencies]
-sha2 = { version = "0.10.9", default-features = false }
-tokio = { version = "1.50.0", default-features = false }
-tokio-postgres = { version = "0.7.16", default-features = false }
+sha2 = { version = "0.11.0", default-features = false }
+tokio = { version = "1.52.3", default-features = false }
+tokio-postgres = { version = "0.7.18", default-features = false }
tokio-rustls = { version = "0.26.4", default-features = false }
[dev-dependencies]
-tokio = { version = "1.50.0", default-features = false, features = ["rt"] }
+tokio = { version = "1.52.3", default-features = false, features = ["rt"] }
tokio-rustls = { version = "0.26.4", default-features = false, features = ["ring"] }
diff --git a/src/lib.rs b/src/lib.rs
@@ -14,19 +14,23 @@
clippy::doc_paragraphs_missing_punctuation,
reason = "false positive for crate documentation having image links"
)]
+#![cfg_attr(test, expect(dead_code_pub_in_binary, reason = "ignore for tests"))]
use core::{
pin::Pin,
task::{Context, Poll},
};
use sha2::{
Sha224, Sha256, Sha384, Sha512,
- digest::{Digest as _, OutputSizeUser, generic_array::GenericArray},
+ digest::{Digest as _, OutputSizeUser, array::Array},
};
use std::io::{self, IoSlice};
+pub use tokio;
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
+pub use tokio_postgres;
#[cfg(feature = "runtime")]
use tokio_postgres::tls::MakeTlsConnect;
use tokio_postgres::tls::{ChannelBinding, TlsConnect as PgTlsConnect, TlsStream as PgTlsStream};
+pub use tokio_rustls;
use tokio_rustls::{
Connect,
client::TlsStream as RustlsStream,
@@ -35,17 +39,20 @@ use tokio_rustls::{
pki_types::{InvalidDnsNameError, ServerName},
},
};
+/// Unit tests.
+#[cfg(test)]
+mod tests;
/// Hash for the leaf certificate provided by the PostgreSQL server.
#[expect(clippy::doc_markdown, reason = "PostgreSQL is correct")]
enum Hash {
/// SHA-256 hash.
- Sha256(GenericArray<u8, <Sha256 as OutputSizeUser>::OutputSize>),
+ Sha256(Array<u8, <Sha256 as OutputSizeUser>::OutputSize>),
/// SHA-384 hash.
- Sha384(GenericArray<u8, <Sha384 as OutputSizeUser>::OutputSize>),
+ Sha384(Array<u8, <Sha384 as OutputSizeUser>::OutputSize>),
/// SHA-512 hash.
- Sha512(GenericArray<u8, <Sha512 as OutputSizeUser>::OutputSize>),
+ Sha512(Array<u8, <Sha512 as OutputSizeUser>::OutputSize>),
/// SHA-224 hash.
- Sha224(GenericArray<u8, <Sha224 as OutputSizeUser>::OutputSize>),
+ Sha224(Array<u8, <Sha224 as OutputSizeUser>::OutputSize>),
}
impl From<Hash> for Vec<u8> {
#[inline]
@@ -512,828 +519,3 @@ pub fn set_postgresql_alpn(config: &mut ClientConfig) {
b'p', b'o', b's', b't', b'g', b'r', b'e', b's', b'q', b'l',
]);
}
-#[cfg(test)]
-mod tests {
- #[cfg(feature = "runtime")]
- extern crate alloc;
- use super::Hash;
- #[cfg(feature = "runtime")]
- use super::MakeTlsConnector;
- #[cfg(feature = "runtime")]
- use alloc::sync::Arc;
- #[cfg(feature = "runtime")]
- use core::{
- net::{IpAddr, Ipv6Addr},
- time::Duration,
- };
- use sha2::{Digest as _, Sha224, Sha256, Sha384, Sha512};
- #[cfg(feature = "runtime")]
- use std::{fs, io::Error};
- #[cfg(feature = "runtime")]
- use tokio::runtime::Builder;
- #[cfg(feature = "runtime")]
- use tokio_postgres::{
- Config,
- config::{ChannelBinding, LoadBalanceHosts, SslMode, TargetSessionAttrs},
- };
- #[cfg(feature = "runtime")]
- use tokio_rustls::rustls::{
- self, ClientConfig, RootCertStore,
- pki_types::{
- CertificateDer, PrivateKeyDer,
- pem::{Error as PemErr, PemObject as _},
- },
- version::TLS13,
- };
- #[test]
- fn parse_ed25519() {
- /// Certificate that uses Ed25519.
- const CERT: &[u8] = [
- 48, 130, 1, 125, 48, 130, 1, 47, 160, 3, 2, 1, 2, 2, 1, 29, 48, 5, 6, 3, 43, 101, 112,
- 48, 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, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 82, 111,
- 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 48, 52, 56, 48, 53, 90, 23, 13,
- 50, 53, 48, 51, 49, 54, 48, 48, 52, 56, 48, 53, 90, 48, 43, 49, 11, 48, 9, 6, 3, 85, 4,
- 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49, 13,
- 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 42, 48, 5, 6, 3, 43, 101, 112, 3,
- 33, 0, 142, 168, 95, 146, 122, 142, 177, 52, 239, 161, 27, 41, 80, 58, 167, 248, 211,
- 181, 154, 201, 26, 195, 207, 27, 132, 228, 110, 149, 95, 212, 44, 202, 163, 117, 48,
- 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 238, 12, 127, 172, 94, 237, 69, 62, 240,
- 99, 1, 2, 35, 161, 201, 129, 19, 85, 0, 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, 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, 1, 48, 31, 6, 3, 85, 29, 35, 4, 24, 48,
- 22, 128, 20, 199, 177, 144, 22, 54, 182, 183, 202, 234, 246, 98, 108, 85, 32, 30, 132,
- 146, 221, 218, 80, 48, 5, 6, 3, 43, 101, 112, 3, 65, 0, 133, 253, 192, 202, 50, 167,
- 57, 5, 246, 17, 58, 232, 188, 41, 147, 232, 35, 206, 147, 181, 0, 139, 95, 3, 24, 139,
- 17, 102, 113, 186, 146, 163, 97, 157, 255, 50, 193, 230, 159, 170, 218, 35, 56, 99, 89,
- 251, 173, 97, 106, 15, 52, 71, 209, 69, 109, 216, 140, 235, 37, 23, 185, 173, 215, 0,
- ]
- .as_slice();
- assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
- Hash::Sha256(ref sha_hash) => *sha_hash == Sha256::digest(CERT),
- Hash::Sha384(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
- }));
- }
- #[test]
- fn parse_ecdsa_sha256() {
- /// Certificate that uses ECDSA with SHA-256.
- const CERT: &[u8] = [
- 48, 130, 1, 189, 48, 130, 1, 99, 160, 3, 2, 1, 2, 2, 1, 27, 48, 10, 6, 8, 42, 134, 72,
- 206, 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, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3,
- 12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 48, 52, 49, 51,
- 48, 90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 48, 52, 49, 51, 48, 90, 48, 43, 49, 11, 48,
- 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115,
- 116, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 89, 48, 19, 6, 7,
- 42, 134, 72, 206, 61, 2, 1, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7, 3, 66, 0, 4, 195, 27,
- 22, 133, 220, 98, 146, 255, 201, 209, 114, 117, 93, 119, 207, 46, 228, 132, 210, 187,
- 134, 197, 201, 194, 147, 51, 111, 17, 187, 179, 129, 180, 129, 62, 164, 27, 199, 95,
- 59, 16, 167, 134, 233, 53, 127, 194, 187, 144, 193, 106, 100, 37, 104, 219, 164, 155,
- 58, 210, 106, 12, 192, 247, 72, 183, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4,
- 22, 4, 20, 84, 214, 179, 28, 250, 191, 223, 88, 72, 221, 229, 63, 123, 177, 146, 167,
- 224, 18, 24, 0, 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, 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, 31, 6, 3, 85, 29, 35, 4, 24, 48, 22, 128, 20, 43, 80, 133,
- 205, 3, 144, 105, 186, 141, 39, 47, 176, 39, 123, 149, 250, 100, 138, 233, 225, 48, 10,
- 6, 8, 42, 134, 72, 206, 61, 4, 3, 2, 3, 72, 0, 48, 69, 2, 32, 107, 43, 12, 27, 111,
- 216, 19, 191, 199, 1, 202, 22, 147, 43, 16, 188, 36, 156, 141, 80, 115, 124, 160, 211,
- 19, 123, 41, 216, 94, 19, 236, 0, 2, 33, 0, 164, 138, 200, 40, 159, 245, 38, 70, 207,
- 160, 121, 19, 56, 240, 18, 222, 191, 196, 217, 129, 24, 92, 238, 43, 39, 29, 57, 85,
- 56, 11, 178, 88,
- ]
- .as_slice();
- assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
- Hash::Sha256(ref sha_hash) => *sha_hash == Sha256::digest(CERT),
- Hash::Sha384(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
- }));
- }
- #[test]
- fn parse_ecdsa_sha384() {
- /// Certificate that uses ECDSA with SHA-384.
- const CERT: &[u8] = [
- 48, 130, 1, 218, 48, 130, 1, 128, 160, 3, 2, 1, 2, 2, 1, 25, 48, 10, 6, 8, 42, 134, 72,
- 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, 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3,
- 12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 48, 51, 57, 51,
- 55, 90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 48, 51, 57, 51, 55, 90, 48, 43, 49, 11, 48,
- 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115,
- 116, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 118, 48, 16, 6, 7,
- 42, 134, 72, 206, 61, 2, 1, 6, 5, 43, 129, 4, 0, 34, 3, 98, 0, 4, 246, 106, 156, 228,
- 83, 166, 254, 62, 196, 22, 127, 171, 204, 182, 154, 182, 253, 35, 95, 120, 253, 231,
- 78, 20, 146, 203, 186, 201, 147, 48, 197, 96, 195, 202, 5, 235, 201, 168, 28, 117, 62,
- 47, 121, 211, 58, 67, 32, 96, 129, 15, 215, 172, 135, 222, 180, 101, 196, 18, 41, 107,
- 6, 161, 172, 183, 217, 106, 227, 24, 140, 13, 145, 245, 137, 185, 4, 78, 210, 56, 235,
- 159, 203, 241, 203, 239, 39, 90, 98, 227, 215, 221, 119, 65, 47, 68, 2, 200, 163, 117,
- 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 88, 91, 22, 70, 200, 54, 182, 100,
- 191, 186, 73, 152, 174, 87, 56, 64, 26, 173, 27, 43, 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, 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, 31, 6, 3, 85, 29, 35,
- 4, 24, 48, 22, 128, 20, 43, 80, 133, 205, 3, 144, 105, 186, 141, 39, 47, 176, 39, 123,
- 149, 250, 100, 138, 233, 225, 48, 10, 6, 8, 42, 134, 72, 206, 61, 4, 3, 3, 3, 72, 0,
- 48, 69, 2, 33, 0, 210, 47, 45, 107, 132, 43, 161, 65, 132, 15, 148, 184, 203, 125, 234,
- 232, 111, 216, 238, 113, 187, 201, 114, 177, 218, 234, 201, 126, 204, 118, 80, 225, 2,
- 32, 67, 111, 72, 96, 182, 167, 191, 130, 118, 105, 253, 133, 58, 38, 65, 112, 234, 3,
- 23, 77, 182, 0, 195, 80, 181, 65, 76, 243, 4, 145, 200, 255,
- ]
- .as_slice();
- assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
- Hash::Sha384(ref sha_hash) => *sha_hash == Sha384::digest(CERT),
- Hash::Sha256(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
- }));
- }
- #[test]
- fn parse_ecdsa_sha512() {
- /// Certificate that uses ECDSA with SHA-512.
- const CERT: &[u8] = [
- 48, 130, 2, 1, 48, 130, 1, 166, 160, 3, 2, 1, 2, 2, 1, 24, 48, 10, 6, 8, 42, 134, 72,
- 206, 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, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3,
- 12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 48, 51, 56, 51,
- 54, 90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 48, 51, 56, 51, 54, 90, 48, 43, 49, 11, 48,
- 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115,
- 116, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 129, 155, 48, 16, 6,
- 7, 42, 134, 72, 206, 61, 2, 1, 6, 5, 43, 129, 4, 0, 35, 3, 129, 134, 0, 4, 1, 86, 143,
- 210, 217, 20, 143, 103, 172, 34, 97, 62, 173, 15, 43, 199, 93, 220, 81, 75, 137, 219,
- 111, 217, 127, 6, 8, 115, 160, 121, 146, 138, 64, 110, 14, 193, 98, 164, 226, 208, 89,
- 120, 108, 30, 107, 77, 194, 63, 41, 112, 173, 112, 44, 85, 54, 155, 168, 189, 235, 129,
- 214, 104, 152, 198, 252, 62, 1, 87, 193, 205, 162, 152, 15, 26, 111, 231, 183, 106,
- 145, 29, 251, 188, 148, 239, 192, 53, 186, 34, 13, 104, 231, 85, 127, 17, 67, 54, 116,
- 232, 85, 23, 143, 68, 171, 30, 25, 155, 201, 171, 106, 89, 20, 234, 12, 192, 68, 102,
- 166, 50, 246, 130, 117, 62, 222, 142, 98, 62, 43, 9, 109, 74, 138, 180, 163, 117, 48,
- 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 148, 160, 104, 250, 171, 155, 48, 171, 13,
- 164, 221, 144, 240, 194, 250, 9, 183, 72, 158, 141, 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, 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, 31, 6, 3, 85, 29, 35,
- 4, 24, 48, 22, 128, 20, 43, 80, 133, 205, 3, 144, 105, 186, 141, 39, 47, 176, 39, 123,
- 149, 250, 100, 138, 233, 225, 48, 10, 6, 8, 42, 134, 72, 206, 61, 4, 3, 4, 3, 73, 0,
- 48, 70, 2, 33, 0, 179, 24, 50, 50, 127, 141, 167, 197, 29, 35, 234, 81, 215, 112, 233,
- 218, 84, 151, 136, 117, 40, 106, 164, 156, 205, 75, 6, 133, 64, 52, 161, 116, 2, 33, 0,
- 141, 178, 46, 201, 22, 126, 42, 84, 96, 191, 175, 219, 140, 72, 252, 6, 152, 112, 113,
- 232, 38, 101, 11, 215, 20, 143, 22, 199, 38, 237, 179, 108,
- ]
- .as_slice();
- assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
- Hash::Sha512(ref sha_hash) => *sha_hash == Sha512::digest(CERT),
- Hash::Sha256(_) | Hash::Sha384(_) | Hash::Sha224(_) => false,
- }));
- }
- #[test]
- fn parse_ecdsa_sha224() {
- /// Certificate that uses ECDSA with SHA-224.
- const CERT: &[u8] = [
- 48, 130, 1, 178, 48, 130, 1, 88, 160, 3, 2, 1, 2, 2, 1, 28, 48, 10, 6, 8, 42, 134, 72,
- 206, 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, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3,
- 12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 48, 52, 50, 49,
- 52, 90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 48, 52, 50, 49, 52, 90, 48, 43, 49, 11, 48,
- 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115,
- 116, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 78, 48, 16, 6, 7,
- 42, 134, 72, 206, 61, 2, 1, 6, 5, 43, 129, 4, 0, 33, 3, 58, 0, 4, 235, 241, 149, 78,
- 60, 248, 123, 132, 195, 228, 188, 151, 240, 28, 76, 198, 207, 121, 165, 126, 245, 158,
- 214, 232, 69, 198, 114, 117, 86, 137, 15, 86, 40, 171, 27, 36, 8, 43, 190, 138, 193,
- 136, 118, 43, 29, 119, 182, 21, 14, 123, 110, 81, 81, 72, 44, 195, 163, 117, 48, 115,
- 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 203, 141, 20, 54, 48, 176, 180, 57, 46, 1, 91,
- 221, 116, 154, 205, 81, 187, 184, 24, 211, 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, 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, 31, 6, 3, 85, 29, 35, 4, 24, 48,
- 22, 128, 20, 43, 80, 133, 205, 3, 144, 105, 186, 141, 39, 47, 176, 39, 123, 149, 250,
- 100, 138, 233, 225, 48, 10, 6, 8, 42, 134, 72, 206, 61, 4, 3, 1, 3, 72, 0, 48, 69, 2,
- 32, 64, 186, 179, 226, 82, 176, 87, 158, 166, 22, 31, 27, 19, 190, 112, 167, 241, 159,
- 33, 198, 60, 70, 68, 120, 19, 63, 33, 244, 236, 240, 216, 181, 2, 33, 0, 252, 183, 115,
- 52, 189, 151, 44, 178, 62, 209, 159, 31, 154, 152, 69, 189, 121, 148, 57, 231, 27, 22,
- 165, 212, 65, 202, 124, 15, 53, 150, 93, 183,
- ]
- .as_slice();
- assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
- Hash::Sha224(ref sha_hash) => *sha_hash == Sha224::digest(CERT),
- Hash::Sha256(_) | Hash::Sha384(_) | Hash::Sha512(_) => false,
- }));
- }
- #[test]
- fn parse_rsa_sha256() {
- /// Certificate that uses RSA with SHA-256.
- const CERT: &[u8] = [
- 48, 130, 3, 73, 48, 130, 2, 49, 160, 3, 2, 1, 2, 2, 1, 31, 48, 13, 6, 9, 42, 134, 72,
- 134, 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, 14, 6, 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6,
- 3, 85, 4, 3, 12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49,
- 48, 51, 48, 53, 90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 49, 48, 51, 48, 53, 90, 48, 43,
- 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4,
- 84, 101, 115, 116, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130,
- 1, 34, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48,
- 130, 1, 10, 2, 130, 1, 1, 0, 157, 28, 83, 190, 61, 252, 154, 205, 112, 191, 153, 197,
- 22, 159, 92, 161, 84, 84, 181, 67, 218, 26, 189, 52, 245, 184, 150, 248, 142, 15, 214,
- 118, 205, 243, 107, 45, 103, 205, 9, 198, 129, 115, 7, 195, 115, 131, 34, 244, 217, 42,
- 234, 170, 84, 41, 128, 49, 81, 175, 208, 42, 100, 168, 44, 145, 226, 11, 98, 245, 83,
- 134, 213, 30, 76, 239, 43, 82, 222, 175, 254, 135, 124, 16, 218, 105, 159, 219, 43, 8,
- 109, 1, 228, 16, 190, 160, 28, 100, 120, 245, 100, 164, 45, 128, 181, 238, 152, 227,
- 50, 63, 162, 191, 4, 173, 210, 254, 31, 141, 66, 193, 237, 20, 92, 34, 13, 74, 135, 80,
- 201, 12, 158, 51, 54, 91, 53, 97, 115, 212, 97, 6, 160, 45, 77, 40, 165, 55, 128, 230,
- 105, 31, 76, 197, 211, 111, 197, 169, 167, 136, 2, 249, 117, 65, 127, 163, 217, 169,
- 151, 97, 209, 194, 179, 203, 81, 58, 52, 66, 11, 184, 172, 97, 70, 124, 125, 151, 159,
- 102, 224, 24, 159, 233, 169, 95, 66, 17, 180, 69, 48, 233, 5, 250, 37, 55, 35, 200,
- 212, 225, 197, 240, 19, 22, 106, 101, 171, 190, 135, 3, 75, 157, 240, 149, 107, 208,
- 94, 58, 244, 204, 105, 9, 32, 203, 162, 194, 39, 12, 97, 16, 153, 236, 60, 93, 24, 252,
- 103, 231, 164, 19, 55, 233, 181, 103, 135, 187, 40, 202, 210, 125, 88, 73, 2, 3, 1, 0,
- 1, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 91, 156, 56, 249, 82, 5,
- 5, 2, 2, 21, 57, 237, 90, 8, 188, 55, 139, 113, 229, 132, 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, 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, 31, 6, 3, 85, 29,
- 35, 4, 24, 48, 22, 128, 20, 96, 178, 34, 145, 205, 104, 56, 196, 211, 241, 34, 247,
- 125, 194, 215, 110, 191, 133, 151, 15, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1,
- 11, 5, 0, 3, 130, 1, 1, 0, 28, 109, 109, 197, 99, 197, 36, 180, 154, 215, 173, 215, 24,
- 94, 47, 218, 147, 163, 179, 123, 248, 3, 144, 109, 173, 207, 49, 113, 249, 188, 31,
- 178, 16, 88, 88, 56, 11, 86, 127, 193, 23, 165, 65, 190, 84, 170, 156, 190, 52, 87,
- 119, 213, 106, 184, 11, 204, 151, 148, 205, 100, 233, 46, 170, 45, 161, 100, 58, 46,
- 105, 25, 150, 78, 146, 41, 100, 125, 203, 214, 238, 104, 251, 25, 183, 66, 102, 241,
- 110, 56, 55, 205, 122, 234, 205, 90, 91, 247, 143, 129, 217, 6, 190, 120, 18, 190, 11,
- 121, 207, 142, 170, 57, 236, 243, 113, 53, 167, 188, 26, 134, 175, 107, 195, 48, 119,
- 78, 117, 157, 104, 247, 65, 122, 153, 234, 166, 88, 142, 228, 25, 120, 243, 51, 111, 8,
- 43, 199, 255, 162, 186, 18, 64, 54, 96, 44, 138, 144, 237, 89, 176, 189, 245, 194, 96,
- 232, 196, 0, 50, 51, 98, 32, 163, 177, 130, 113, 41, 116, 33, 40, 190, 111, 79, 108,
- 107, 159, 65, 87, 222, 173, 170, 39, 29, 97, 240, 107, 130, 101, 247, 123, 85, 123,
- 247, 221, 89, 159, 114, 157, 35, 153, 22, 127, 149, 224, 158, 236, 4, 137, 193, 135,
- 136, 97, 222, 83, 232, 205, 148, 127, 139, 78, 220, 10, 183, 139, 205, 190, 181, 36,
- 61, 155, 88, 163, 50, 120, 153, 41, 182, 75, 219, 95, 25, 40, 229, 106, 87, 215, 77,
- 50, 219, 97,
- ]
- .as_slice();
- assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
- Hash::Sha256(ref sha_hash) => *sha_hash == Sha256::digest(CERT),
- Hash::Sha384(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
- }));
- }
- #[test]
- fn parse_rsa_sha384() {
- /// Certificate that uses RSA with SHA-384.
- const CERT: &[u8] = [
- 48, 130, 3, 73, 48, 130, 2, 49, 160, 3, 2, 1, 2, 2, 1, 32, 48, 13, 6, 9, 42, 134, 72,
- 134, 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, 14, 6, 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6,
- 3, 85, 4, 3, 12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49,
- 48, 53, 52, 54, 90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 49, 48, 53, 52, 54, 90, 48, 43,
- 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4,
- 84, 101, 115, 116, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130,
- 1, 34, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48,
- 130, 1, 10, 2, 130, 1, 1, 0, 157, 28, 83, 190, 61, 252, 154, 205, 112, 191, 153, 197,
- 22, 159, 92, 161, 84, 84, 181, 67, 218, 26, 189, 52, 245, 184, 150, 248, 142, 15, 214,
- 118, 205, 243, 107, 45, 103, 205, 9, 198, 129, 115, 7, 195, 115, 131, 34, 244, 217, 42,
- 234, 170, 84, 41, 128, 49, 81, 175, 208, 42, 100, 168, 44, 145, 226, 11, 98, 245, 83,
- 134, 213, 30, 76, 239, 43, 82, 222, 175, 254, 135, 124, 16, 218, 105, 159, 219, 43, 8,
- 109, 1, 228, 16, 190, 160, 28, 100, 120, 245, 100, 164, 45, 128, 181, 238, 152, 227,
- 50, 63, 162, 191, 4, 173, 210, 254, 31, 141, 66, 193, 237, 20, 92, 34, 13, 74, 135, 80,
- 201, 12, 158, 51, 54, 91, 53, 97, 115, 212, 97, 6, 160, 45, 77, 40, 165, 55, 128, 230,
- 105, 31, 76, 197, 211, 111, 197, 169, 167, 136, 2, 249, 117, 65, 127, 163, 217, 169,
- 151, 97, 209, 194, 179, 203, 81, 58, 52, 66, 11, 184, 172, 97, 70, 124, 125, 151, 159,
- 102, 224, 24, 159, 233, 169, 95, 66, 17, 180, 69, 48, 233, 5, 250, 37, 55, 35, 200,
- 212, 225, 197, 240, 19, 22, 106, 101, 171, 190, 135, 3, 75, 157, 240, 149, 107, 208,
- 94, 58, 244, 204, 105, 9, 32, 203, 162, 194, 39, 12, 97, 16, 153, 236, 60, 93, 24, 252,
- 103, 231, 164, 19, 55, 233, 181, 103, 135, 187, 40, 202, 210, 125, 88, 73, 2, 3, 1, 0,
- 1, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 91, 156, 56, 249, 82, 5,
- 5, 2, 2, 21, 57, 237, 90, 8, 188, 55, 139, 113, 229, 132, 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, 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, 31, 6, 3, 85, 29,
- 35, 4, 24, 48, 22, 128, 20, 96, 178, 34, 145, 205, 104, 56, 196, 211, 241, 34, 247,
- 125, 194, 215, 110, 191, 133, 151, 15, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1,
- 12, 5, 0, 3, 130, 1, 1, 0, 135, 249, 101, 184, 225, 162, 164, 193, 23, 81, 98, 221,
- 134, 87, 34, 94, 229, 131, 221, 17, 38, 61, 156, 200, 113, 94, 244, 188, 226, 84, 74,
- 96, 205, 237, 230, 242, 168, 238, 178, 133, 68, 188, 80, 244, 60, 42, 169, 54, 66, 79,
- 104, 66, 251, 27, 240, 108, 16, 46, 175, 62, 240, 194, 7, 181, 238, 211, 118, 149, 150,
- 46, 97, 39, 28, 173, 225, 49, 73, 206, 147, 101, 12, 192, 218, 119, 208, 73, 20, 208,
- 229, 216, 133, 213, 28, 165, 70, 20, 158, 114, 223, 40, 121, 13, 236, 218, 165, 237,
- 164, 196, 94, 80, 120, 49, 212, 241, 213, 197, 201, 104, 67, 223, 130, 148, 197, 251,
- 199, 167, 6, 89, 146, 139, 141, 32, 78, 72, 190, 146, 94, 251, 208, 47, 118, 173, 111,
- 92, 241, 102, 26, 233, 145, 46, 220, 230, 5, 147, 220, 92, 240, 133, 24, 192, 71, 49,
- 252, 84, 163, 132, 34, 139, 12, 106, 4, 189, 151, 37, 34, 123, 26, 42, 84, 46, 232, 14,
- 129, 101, 84, 26, 25, 219, 11, 115, 214, 106, 12, 75, 199, 248, 218, 239, 209, 32, 159,
- 40, 192, 11, 2, 175, 51, 232, 20, 8, 72, 188, 184, 177, 22, 251, 238, 42, 74, 21, 25,
- 93, 77, 184, 5, 207, 101, 98, 60, 214, 173, 169, 56, 54, 211, 167, 55, 34, 14, 184, 25,
- 4, 170, 108, 94, 110, 27, 45, 11, 22, 61, 130, 63, 214, 168, 72,
- ]
- .as_slice();
- assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
- Hash::Sha384(ref sha_hash) => *sha_hash == Sha384::digest(CERT),
- Hash::Sha256(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
- }));
- }
- #[test]
- fn parse_rsa_sha512() {
- /// Certificate that uses RSA with SHA-512.
- const CERT: &[u8] = [
- 48, 130, 3, 73, 48, 130, 2, 49, 160, 3, 2, 1, 2, 2, 1, 33, 48, 13, 6, 9, 42, 134, 72,
- 134, 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, 14, 6, 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6,
- 3, 85, 4, 3, 12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49,
- 48, 54, 52, 53, 90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 49, 48, 54, 52, 53, 90, 48, 43,
- 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4,
- 84, 101, 115, 116, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130,
- 1, 34, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48,
- 130, 1, 10, 2, 130, 1, 1, 0, 157, 28, 83, 190, 61, 252, 154, 205, 112, 191, 153, 197,
- 22, 159, 92, 161, 84, 84, 181, 67, 218, 26, 189, 52, 245, 184, 150, 248, 142, 15, 214,
- 118, 205, 243, 107, 45, 103, 205, 9, 198, 129, 115, 7, 195, 115, 131, 34, 244, 217, 42,
- 234, 170, 84, 41, 128, 49, 81, 175, 208, 42, 100, 168, 44, 145, 226, 11, 98, 245, 83,
- 134, 213, 30, 76, 239, 43, 82, 222, 175, 254, 135, 124, 16, 218, 105, 159, 219, 43, 8,
- 109, 1, 228, 16, 190, 160, 28, 100, 120, 245, 100, 164, 45, 128, 181, 238, 152, 227,
- 50, 63, 162, 191, 4, 173, 210, 254, 31, 141, 66, 193, 237, 20, 92, 34, 13, 74, 135, 80,
- 201, 12, 158, 51, 54, 91, 53, 97, 115, 212, 97, 6, 160, 45, 77, 40, 165, 55, 128, 230,
- 105, 31, 76, 197, 211, 111, 197, 169, 167, 136, 2, 249, 117, 65, 127, 163, 217, 169,
- 151, 97, 209, 194, 179, 203, 81, 58, 52, 66, 11, 184, 172, 97, 70, 124, 125, 151, 159,
- 102, 224, 24, 159, 233, 169, 95, 66, 17, 180, 69, 48, 233, 5, 250, 37, 55, 35, 200,
- 212, 225, 197, 240, 19, 22, 106, 101, 171, 190, 135, 3, 75, 157, 240, 149, 107, 208,
- 94, 58, 244, 204, 105, 9, 32, 203, 162, 194, 39, 12, 97, 16, 153, 236, 60, 93, 24, 252,
- 103, 231, 164, 19, 55, 233, 181, 103, 135, 187, 40, 202, 210, 125, 88, 73, 2, 3, 1, 0,
- 1, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 91, 156, 56, 249, 82, 5,
- 5, 2, 2, 21, 57, 237, 90, 8, 188, 55, 139, 113, 229, 132, 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, 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, 31, 6, 3, 85, 29,
- 35, 4, 24, 48, 22, 128, 20, 96, 178, 34, 145, 205, 104, 56, 196, 211, 241, 34, 247,
- 125, 194, 215, 110, 191, 133, 151, 15, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1,
- 13, 5, 0, 3, 130, 1, 1, 0, 106, 7, 136, 82, 232, 55, 0, 98, 9, 211, 201, 57, 239, 67,
- 167, 139, 225, 164, 231, 255, 10, 52, 47, 234, 254, 75, 239, 241, 39, 6, 226, 209, 210,
- 169, 200, 32, 255, 83, 159, 23, 146, 9, 109, 173, 236, 216, 253, 199, 229, 23, 227, 33,
- 56, 98, 109, 59, 2, 167, 29, 118, 251, 82, 193, 39, 244, 191, 166, 194, 160, 105, 197,
- 190, 213, 141, 193, 50, 45, 245, 163, 229, 116, 221, 29, 194, 91, 198, 187, 21, 224,
- 95, 17, 203, 148, 160, 4, 15, 54, 249, 69, 12, 18, 25, 58, 190, 205, 44, 157, 184, 1,
- 25, 64, 219, 237, 196, 33, 101, 255, 146, 232, 112, 247, 214, 174, 252, 152, 146, 142,
- 231, 81, 35, 240, 216, 98, 136, 65, 179, 237, 207, 229, 198, 72, 175, 244, 31, 126,
- 106, 107, 100, 200, 81, 227, 41, 61, 26, 122, 226, 121, 219, 131, 212, 206, 238, 14,
- 210, 70, 60, 107, 115, 214, 67, 180, 133, 157, 114, 138, 63, 249, 71, 235, 41, 246, 14,
- 14, 4, 254, 208, 215, 111, 196, 248, 117, 61, 44, 67, 185, 11, 132, 10, 188, 220, 110,
- 78, 61, 171, 88, 172, 161, 1, 223, 52, 75, 101, 55, 249, 125, 178, 141, 127, 0, 246,
- 176, 34, 120, 93, 214, 37, 210, 148, 217, 149, 255, 63, 32, 58, 8, 71, 179, 62, 119,
- 14, 47, 191, 207, 137, 22, 255, 21, 71, 46, 42, 176, 31, 206, 146, 248, 105,
- ]
- .as_slice();
- assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
- Hash::Sha512(ref sha_hash) => *sha_hash == Sha512::digest(CERT),
- Hash::Sha256(_) | Hash::Sha384(_) | Hash::Sha224(_) => false,
- }));
- }
- #[test]
- fn parse_rsa_sha224() {
- /// Certificate that uses RSA with SHA-224.
- const CERT: &[u8] = [
- 48, 130, 3, 73, 48, 130, 2, 49, 160, 3, 2, 1, 2, 2, 1, 30, 48, 13, 6, 9, 42, 134, 72,
- 134, 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, 14, 6, 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6,
- 3, 85, 4, 3, 12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 48,
- 53, 57, 50, 56, 90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 48, 53, 57, 50, 56, 90, 48, 43,
- 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4,
- 84, 101, 115, 116, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130,
- 1, 34, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48,
- 130, 1, 10, 2, 130, 1, 1, 0, 157, 28, 83, 190, 61, 252, 154, 205, 112, 191, 153, 197,
- 22, 159, 92, 161, 84, 84, 181, 67, 218, 26, 189, 52, 245, 184, 150, 248, 142, 15, 214,
- 118, 205, 243, 107, 45, 103, 205, 9, 198, 129, 115, 7, 195, 115, 131, 34, 244, 217, 42,
- 234, 170, 84, 41, 128, 49, 81, 175, 208, 42, 100, 168, 44, 145, 226, 11, 98, 245, 83,
- 134, 213, 30, 76, 239, 43, 82, 222, 175, 254, 135, 124, 16, 218, 105, 159, 219, 43, 8,
- 109, 1, 228, 16, 190, 160, 28, 100, 120, 245, 100, 164, 45, 128, 181, 238, 152, 227,
- 50, 63, 162, 191, 4, 173, 210, 254, 31, 141, 66, 193, 237, 20, 92, 34, 13, 74, 135, 80,
- 201, 12, 158, 51, 54, 91, 53, 97, 115, 212, 97, 6, 160, 45, 77, 40, 165, 55, 128, 230,
- 105, 31, 76, 197, 211, 111, 197, 169, 167, 136, 2, 249, 117, 65, 127, 163, 217, 169,
- 151, 97, 209, 194, 179, 203, 81, 58, 52, 66, 11, 184, 172, 97, 70, 124, 125, 151, 159,
- 102, 224, 24, 159, 233, 169, 95, 66, 17, 180, 69, 48, 233, 5, 250, 37, 55, 35, 200,
- 212, 225, 197, 240, 19, 22, 106, 101, 171, 190, 135, 3, 75, 157, 240, 149, 107, 208,
- 94, 58, 244, 204, 105, 9, 32, 203, 162, 194, 39, 12, 97, 16, 153, 236, 60, 93, 24, 252,
- 103, 231, 164, 19, 55, 233, 181, 103, 135, 187, 40, 202, 210, 125, 88, 73, 2, 3, 1, 0,
- 1, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 91, 156, 56, 249, 82, 5,
- 5, 2, 2, 21, 57, 237, 90, 8, 188, 55, 139, 113, 229, 132, 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, 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, 31, 6, 3, 85, 29,
- 35, 4, 24, 48, 22, 128, 20, 96, 178, 34, 145, 205, 104, 56, 196, 211, 241, 34, 247,
- 125, 194, 215, 110, 191, 133, 151, 15, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1,
- 14, 5, 0, 3, 130, 1, 1, 0, 122, 121, 0, 201, 250, 195, 66, 213, 60, 117, 213, 188, 93,
- 193, 88, 130, 241, 219, 111, 238, 109, 38, 220, 131, 164, 12, 135, 169, 58, 140, 214,
- 211, 93, 51, 204, 242, 10, 119, 123, 23, 69, 67, 135, 151, 245, 23, 144, 61, 233, 229,
- 122, 189, 111, 89, 190, 100, 251, 86, 185, 246, 40, 121, 190, 192, 199, 119, 232, 209,
- 202, 23, 20, 46, 48, 235, 175, 240, 225, 106, 6, 24, 239, 172, 51, 196, 63, 189, 210,
- 167, 244, 87, 245, 193, 130, 33, 171, 165, 117, 180, 25, 250, 21, 6, 208, 124, 254, 64,
- 180, 50, 124, 234, 179, 121, 183, 0, 71, 118, 28, 115, 86, 117, 60, 96, 164, 33, 54, 1,
- 86, 234, 132, 146, 156, 221, 52, 28, 39, 237, 128, 75, 157, 169, 203, 26, 48, 74, 4,
- 129, 162, 139, 235, 16, 74, 236, 151, 0, 150, 234, 246, 204, 180, 240, 31, 92, 129, 51,
- 221, 118, 10, 192, 140, 32, 33, 21, 223, 113, 35, 86, 47, 236, 159, 252, 52, 185, 41,
- 151, 56, 126, 251, 165, 126, 214, 27, 213, 169, 211, 174, 26, 55, 21, 11, 187, 189, 96,
- 67, 141, 124, 178, 51, 37, 80, 17, 220, 210, 193, 243, 127, 46, 82, 75, 172, 187, 156,
- 222, 186, 3, 13, 194, 104, 234, 131, 96, 99, 34, 1, 61, 149, 219, 33, 227, 34, 215,
- 211, 82, 106, 57, 61, 185, 178, 1, 191, 14, 196, 52, 5, 38, 27, 232,
- ]
- .as_slice();
- assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
- Hash::Sha224(ref sha_hash) => *sha_hash == Sha224::digest(CERT),
- Hash::Sha256(_) | Hash::Sha384(_) | Hash::Sha512(_) => false,
- }));
- }
- #[test]
- fn parse_rsa_sha1() {
- /// Certificate that uses RSA with SHA-1.
- const CERT: &[u8] = [
- 48, 130, 3, 73, 48, 130, 2, 49, 160, 3, 2, 1, 2, 2, 1, 34, 48, 13, 6, 9, 42, 134, 72,
- 134, 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, 14, 6, 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6,
- 3, 85, 4, 3, 12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49,
- 48, 57, 50, 56, 90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 49, 48, 57, 50, 56, 90, 48, 43,
- 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4,
- 84, 101, 115, 116, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130,
- 1, 34, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48,
- 130, 1, 10, 2, 130, 1, 1, 0, 157, 28, 83, 190, 61, 252, 154, 205, 112, 191, 153, 197,
- 22, 159, 92, 161, 84, 84, 181, 67, 218, 26, 189, 52, 245, 184, 150, 248, 142, 15, 214,
- 118, 205, 243, 107, 45, 103, 205, 9, 198, 129, 115, 7, 195, 115, 131, 34, 244, 217, 42,
- 234, 170, 84, 41, 128, 49, 81, 175, 208, 42, 100, 168, 44, 145, 226, 11, 98, 245, 83,
- 134, 213, 30, 76, 239, 43, 82, 222, 175, 254, 135, 124, 16, 218, 105, 159, 219, 43, 8,
- 109, 1, 228, 16, 190, 160, 28, 100, 120, 245, 100, 164, 45, 128, 181, 238, 152, 227,
- 50, 63, 162, 191, 4, 173, 210, 254, 31, 141, 66, 193, 237, 20, 92, 34, 13, 74, 135, 80,
- 201, 12, 158, 51, 54, 91, 53, 97, 115, 212, 97, 6, 160, 45, 77, 40, 165, 55, 128, 230,
- 105, 31, 76, 197, 211, 111, 197, 169, 167, 136, 2, 249, 117, 65, 127, 163, 217, 169,
- 151, 97, 209, 194, 179, 203, 81, 58, 52, 66, 11, 184, 172, 97, 70, 124, 125, 151, 159,
- 102, 224, 24, 159, 233, 169, 95, 66, 17, 180, 69, 48, 233, 5, 250, 37, 55, 35, 200,
- 212, 225, 197, 240, 19, 22, 106, 101, 171, 190, 135, 3, 75, 157, 240, 149, 107, 208,
- 94, 58, 244, 204, 105, 9, 32, 203, 162, 194, 39, 12, 97, 16, 153, 236, 60, 93, 24, 252,
- 103, 231, 164, 19, 55, 233, 181, 103, 135, 187, 40, 202, 210, 125, 88, 73, 2, 3, 1, 0,
- 1, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 91, 156, 56, 249, 82, 5,
- 5, 2, 2, 21, 57, 237, 90, 8, 188, 55, 139, 113, 229, 132, 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, 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, 31, 6, 3, 85, 29,
- 35, 4, 24, 48, 22, 128, 20, 96, 178, 34, 145, 205, 104, 56, 196, 211, 241, 34, 247,
- 125, 194, 215, 110, 191, 133, 151, 15, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1,
- 5, 5, 0, 3, 130, 1, 1, 0, 12, 93, 61, 154, 152, 205, 44, 219, 157, 214, 4, 162, 93, 85,
- 60, 231, 231, 206, 193, 160, 133, 28, 61, 113, 102, 120, 137, 120, 175, 11, 244, 113,
- 217, 81, 151, 123, 210, 108, 156, 145, 99, 158, 104, 10, 25, 129, 95, 128, 140, 44,
- 153, 65, 175, 32, 37, 189, 186, 43, 101, 153, 98, 160, 95, 13, 154, 86, 221, 99, 210,
- 157, 25, 41, 98, 79, 252, 2, 8, 221, 120, 71, 54, 221, 34, 180, 109, 181, 185, 58, 2,
- 119, 167, 50, 172, 167, 192, 136, 24, 227, 40, 211, 18, 98, 2, 175, 174, 42, 100, 136,
- 83, 116, 7, 50, 50, 215, 164, 90, 49, 231, 106, 240, 246, 95, 236, 60, 198, 97, 200,
- 140, 23, 168, 183, 174, 132, 39, 251, 61, 112, 226, 66, 68, 16, 23, 213, 129, 86, 196,
- 248, 82, 141, 82, 107, 246, 224, 37, 94, 95, 134, 139, 75, 15, 70, 54, 47, 80, 19, 143,
- 48, 171, 113, 130, 226, 180, 39, 18, 44, 117, 113, 196, 20, 11, 82, 174, 251, 197, 216,
- 152, 229, 188, 148, 191, 165, 149, 50, 127, 172, 111, 95, 194, 63, 238, 112, 154, 85,
- 98, 18, 236, 13, 123, 232, 90, 47, 180, 36, 148, 77, 192, 45, 113, 150, 10, 254, 99, 0,
- 30, 87, 80, 22, 61, 78, 66, 180, 251, 220, 8, 78, 175, 251, 27, 201, 79, 197, 45, 127,
- 143, 163, 7, 252, 246, 45, 127, 87, 224, 125, 175, 245, 115,
- ]
- .as_slice();
- assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
- Hash::Sha256(ref sha_hash) => *sha_hash == Sha256::digest(CERT),
- Hash::Sha384(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
- }));
- }
- #[test]
- fn parse_dsa_sha256() {
- /// Certificate that uses DSA with SHA-256.
- const CERT: &[u8] = [
- 48, 130, 4, 162, 48, 130, 4, 79, 160, 3, 2, 1, 2, 2, 1, 37, 48, 11, 6, 9, 96, 134, 72,
- 1, 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, 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4,
- 3, 12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49, 50, 51,
- 48, 51, 90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 49, 50, 51, 48, 51, 90, 48, 43, 49, 11,
- 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101,
- 115, 116, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130, 3, 66, 48,
- 130, 2, 53, 6, 7, 42, 134, 72, 206, 56, 4, 1, 48, 130, 2, 40, 2, 130, 1, 1, 0, 172, 11,
- 194, 123, 239, 38, 183, 160, 91, 74, 179, 251, 72, 80, 38, 223, 195, 46, 238, 2, 67,
- 45, 138, 58, 62, 57, 85, 203, 148, 194, 164, 178, 195, 150, 29, 93, 245, 157, 225, 189,
- 125, 209, 186, 83, 234, 14, 179, 116, 156, 216, 112, 205, 152, 26, 168, 175, 111, 106,
- 249, 235, 49, 40, 246, 31, 152, 214, 59, 117, 64, 109, 28, 167, 222, 155, 132, 192,
- 180, 240, 8, 80, 209, 209, 119, 53, 165, 51, 189, 18, 158, 176, 171, 45, 160, 54, 8,
- 75, 146, 92, 245, 202, 188, 144, 36, 156, 127, 140, 220, 144, 56, 95, 38, 112, 44, 221,
- 159, 9, 159, 189, 153, 150, 88, 84, 73, 138, 6, 73, 141, 17, 28, 110, 159, 141, 21,
- 232, 13, 90, 130, 251, 177, 168, 242, 201, 222, 138, 182, 233, 142, 229, 24, 47, 186,
- 56, 245, 177, 250, 253, 2, 11, 115, 29, 6, 156, 168, 117, 22, 15, 152, 183, 137, 25,
- 188, 24, 22, 120, 195, 17, 97, 16, 85, 234, 95, 53, 156, 244, 146, 53, 183, 235, 71,
- 24, 163, 139, 70, 227, 235, 154, 229, 210, 144, 81, 231, 161, 120, 117, 182, 245, 175,
- 25, 252, 21, 153, 130, 211, 180, 209, 164, 34, 248, 167, 8, 98, 181, 69, 52, 74, 120,
- 227, 165, 16, 172, 42, 107, 248, 42, 225, 46, 80, 11, 117, 92, 225, 27, 86, 4, 226, 29,
- 85, 105, 208, 193, 120, 112, 39, 226, 20, 141, 2, 29, 0, 186, 229, 13, 141, 5, 89, 173,
- 164, 148, 130, 205, 229, 23, 44, 125, 234, 49, 240, 196, 213, 6, 31, 233, 8, 99, 80,
- 166, 239, 2, 130, 1, 0, 106, 152, 3, 177, 77, 235, 201, 25, 36, 150, 146, 246, 50, 67,
- 97, 96, 245, 207, 14, 200, 60, 16, 229, 114, 211, 111, 193, 226, 252, 153, 176, 159,
- 198, 41, 133, 157, 197, 38, 112, 217, 9, 205, 13, 85, 170, 94, 89, 60, 214, 117, 182,
- 163, 81, 138, 122, 250, 48, 98, 43, 60, 186, 203, 147, 60, 74, 110, 89, 216, 73, 4,
- 191, 1, 158, 174, 98, 201, 184, 25, 162, 239, 244, 139, 154, 173, 108, 135, 124, 166,
- 152, 88, 237, 68, 145, 252, 33, 40, 237, 57, 53, 155, 215, 56, 12, 202, 22, 225, 7, 89,
- 24, 245, 195, 164, 36, 172, 98, 26, 115, 10, 71, 27, 21, 255, 62, 212, 202, 71, 147,
- 229, 6, 181, 19, 107, 136, 223, 239, 164, 243, 254, 101, 208, 122, 226, 150, 17, 251,
- 218, 85, 169, 81, 177, 7, 190, 171, 230, 26, 149, 183, 181, 113, 140, 252, 212, 172,
- 154, 200, 118, 69, 156, 108, 144, 11, 201, 135, 175, 19, 201, 116, 9, 80, 20, 19, 89,
- 151, 198, 204, 253, 10, 155, 101, 159, 81, 190, 174, 58, 220, 250, 220, 212, 42, 111,
- 33, 204, 114, 7, 30, 153, 73, 248, 209, 114, 36, 225, 6, 47, 106, 45, 226, 254, 175,
- 201, 138, 254, 121, 184, 19, 143, 48, 67, 179, 99, 250, 189, 237, 58, 249, 194, 167,
- 149, 162, 219, 27, 53, 67, 135, 193, 204, 253, 176, 245, 2, 211, 58, 176, 69, 14, 186,
- 3, 130, 1, 5, 0, 2, 130, 1, 0, 97, 40, 15, 97, 210, 23, 118, 85, 75, 191, 251, 126,
- 171, 47, 188, 57, 40, 41, 85, 48, 206, 169, 253, 233, 146, 161, 39, 232, 242, 19, 219,
- 191, 172, 82, 78, 132, 153, 238, 120, 228, 99, 199, 197, 181, 74, 191, 123, 189, 80,
- 203, 219, 50, 184, 193, 49, 160, 9, 41, 167, 133, 33, 151, 52, 196, 61, 29, 102, 233,
- 163, 249, 121, 248, 55, 144, 215, 55, 89, 142, 137, 249, 67, 112, 167, 42, 255, 67, 56,
- 179, 106, 187, 79, 87, 54, 118, 186, 154, 48, 150, 204, 222, 102, 135, 254, 202, 9,
- 166, 229, 176, 130, 37, 174, 139, 240, 43, 134, 75, 141, 35, 163, 203, 71, 153, 217,
- 71, 181, 79, 35, 114, 55, 124, 20, 55, 110, 112, 223, 109, 239, 183, 210, 141, 59, 88,
- 47, 40, 167, 154, 90, 99, 250, 146, 29, 226, 10, 70, 103, 246, 209, 36, 174, 177, 164,
- 244, 126, 153, 106, 156, 92, 143, 140, 46, 49, 184, 125, 160, 246, 145, 178, 94, 11,
- 153, 128, 59, 210, 11, 210, 42, 3, 138, 136, 147, 115, 96, 190, 68, 128, 25, 47, 26,
- 231, 183, 247, 89, 28, 67, 220, 235, 88, 4, 228, 140, 148, 10, 98, 104, 101, 60, 115,
- 39, 219, 183, 111, 62, 93, 133, 141, 219, 252, 51, 66, 224, 115, 158, 85, 46, 13, 171,
- 31, 5, 210, 83, 68, 61, 92, 87, 241, 1, 215, 144, 233, 243, 68, 238, 197, 62, 54, 68,
- 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 153, 40, 244, 111, 22, 53,
- 83, 33, 46, 24, 242, 81, 89, 121, 91, 97, 190, 144, 138, 150, 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, 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, 31, 6, 3, 85, 29,
- 35, 4, 24, 48, 22, 128, 20, 230, 93, 24, 66, 42, 224, 216, 63, 210, 30, 74, 173, 48,
- 16, 195, 8, 166, 231, 232, 253, 48, 11, 6, 9, 96, 134, 72, 1, 101, 3, 4, 3, 2, 3, 64,
- 0, 48, 61, 2, 28, 116, 130, 114, 201, 119, 192, 122, 114, 52, 255, 182, 233, 56, 153,
- 169, 135, 12, 49, 236, 107, 72, 244, 178, 174, 32, 27, 13, 226, 2, 29, 0, 170, 35, 77,
- 179, 10, 59, 85, 118, 124, 99, 48, 21, 125, 235, 57, 27, 60, 222, 102, 120, 20, 16,
- 148, 80, 118, 28, 75, 176,
- ]
- .as_slice();
- assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
- Hash::Sha256(ref sha_hash) => *sha_hash == Sha256::digest(CERT),
- Hash::Sha384(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
- }));
- }
- #[test]
- fn parse_dsa_sha224() {
- /// Certificate that uses DSA with SHA-224.
- const CERT: &[u8] = [
- 48, 130, 4, 163, 48, 130, 4, 79, 160, 3, 2, 1, 2, 2, 1, 36, 48, 11, 6, 9, 96, 134, 72,
- 1, 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, 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4,
- 3, 12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49, 50, 50,
- 50, 53, 90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 49, 50, 50, 50, 53, 90, 48, 43, 49, 11,
- 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101,
- 115, 116, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130, 3, 66, 48,
- 130, 2, 53, 6, 7, 42, 134, 72, 206, 56, 4, 1, 48, 130, 2, 40, 2, 130, 1, 1, 0, 172, 11,
- 194, 123, 239, 38, 183, 160, 91, 74, 179, 251, 72, 80, 38, 223, 195, 46, 238, 2, 67,
- 45, 138, 58, 62, 57, 85, 203, 148, 194, 164, 178, 195, 150, 29, 93, 245, 157, 225, 189,
- 125, 209, 186, 83, 234, 14, 179, 116, 156, 216, 112, 205, 152, 26, 168, 175, 111, 106,
- 249, 235, 49, 40, 246, 31, 152, 214, 59, 117, 64, 109, 28, 167, 222, 155, 132, 192,
- 180, 240, 8, 80, 209, 209, 119, 53, 165, 51, 189, 18, 158, 176, 171, 45, 160, 54, 8,
- 75, 146, 92, 245, 202, 188, 144, 36, 156, 127, 140, 220, 144, 56, 95, 38, 112, 44, 221,
- 159, 9, 159, 189, 153, 150, 88, 84, 73, 138, 6, 73, 141, 17, 28, 110, 159, 141, 21,
- 232, 13, 90, 130, 251, 177, 168, 242, 201, 222, 138, 182, 233, 142, 229, 24, 47, 186,
- 56, 245, 177, 250, 253, 2, 11, 115, 29, 6, 156, 168, 117, 22, 15, 152, 183, 137, 25,
- 188, 24, 22, 120, 195, 17, 97, 16, 85, 234, 95, 53, 156, 244, 146, 53, 183, 235, 71,
- 24, 163, 139, 70, 227, 235, 154, 229, 210, 144, 81, 231, 161, 120, 117, 182, 245, 175,
- 25, 252, 21, 153, 130, 211, 180, 209, 164, 34, 248, 167, 8, 98, 181, 69, 52, 74, 120,
- 227, 165, 16, 172, 42, 107, 248, 42, 225, 46, 80, 11, 117, 92, 225, 27, 86, 4, 226, 29,
- 85, 105, 208, 193, 120, 112, 39, 226, 20, 141, 2, 29, 0, 186, 229, 13, 141, 5, 89, 173,
- 164, 148, 130, 205, 229, 23, 44, 125, 234, 49, 240, 196, 213, 6, 31, 233, 8, 99, 80,
- 166, 239, 2, 130, 1, 0, 106, 152, 3, 177, 77, 235, 201, 25, 36, 150, 146, 246, 50, 67,
- 97, 96, 245, 207, 14, 200, 60, 16, 229, 114, 211, 111, 193, 226, 252, 153, 176, 159,
- 198, 41, 133, 157, 197, 38, 112, 217, 9, 205, 13, 85, 170, 94, 89, 60, 214, 117, 182,
- 163, 81, 138, 122, 250, 48, 98, 43, 60, 186, 203, 147, 60, 74, 110, 89, 216, 73, 4,
- 191, 1, 158, 174, 98, 201, 184, 25, 162, 239, 244, 139, 154, 173, 108, 135, 124, 166,
- 152, 88, 237, 68, 145, 252, 33, 40, 237, 57, 53, 155, 215, 56, 12, 202, 22, 225, 7, 89,
- 24, 245, 195, 164, 36, 172, 98, 26, 115, 10, 71, 27, 21, 255, 62, 212, 202, 71, 147,
- 229, 6, 181, 19, 107, 136, 223, 239, 164, 243, 254, 101, 208, 122, 226, 150, 17, 251,
- 218, 85, 169, 81, 177, 7, 190, 171, 230, 26, 149, 183, 181, 113, 140, 252, 212, 172,
- 154, 200, 118, 69, 156, 108, 144, 11, 201, 135, 175, 19, 201, 116, 9, 80, 20, 19, 89,
- 151, 198, 204, 253, 10, 155, 101, 159, 81, 190, 174, 58, 220, 250, 220, 212, 42, 111,
- 33, 204, 114, 7, 30, 153, 73, 248, 209, 114, 36, 225, 6, 47, 106, 45, 226, 254, 175,
- 201, 138, 254, 121, 184, 19, 143, 48, 67, 179, 99, 250, 189, 237, 58, 249, 194, 167,
- 149, 162, 219, 27, 53, 67, 135, 193, 204, 253, 176, 245, 2, 211, 58, 176, 69, 14, 186,
- 3, 130, 1, 5, 0, 2, 130, 1, 0, 97, 40, 15, 97, 210, 23, 118, 85, 75, 191, 251, 126,
- 171, 47, 188, 57, 40, 41, 85, 48, 206, 169, 253, 233, 146, 161, 39, 232, 242, 19, 219,
- 191, 172, 82, 78, 132, 153, 238, 120, 228, 99, 199, 197, 181, 74, 191, 123, 189, 80,
- 203, 219, 50, 184, 193, 49, 160, 9, 41, 167, 133, 33, 151, 52, 196, 61, 29, 102, 233,
- 163, 249, 121, 248, 55, 144, 215, 55, 89, 142, 137, 249, 67, 112, 167, 42, 255, 67, 56,
- 179, 106, 187, 79, 87, 54, 118, 186, 154, 48, 150, 204, 222, 102, 135, 254, 202, 9,
- 166, 229, 176, 130, 37, 174, 139, 240, 43, 134, 75, 141, 35, 163, 203, 71, 153, 217,
- 71, 181, 79, 35, 114, 55, 124, 20, 55, 110, 112, 223, 109, 239, 183, 210, 141, 59, 88,
- 47, 40, 167, 154, 90, 99, 250, 146, 29, 226, 10, 70, 103, 246, 209, 36, 174, 177, 164,
- 244, 126, 153, 106, 156, 92, 143, 140, 46, 49, 184, 125, 160, 246, 145, 178, 94, 11,
- 153, 128, 59, 210, 11, 210, 42, 3, 138, 136, 147, 115, 96, 190, 68, 128, 25, 47, 26,
- 231, 183, 247, 89, 28, 67, 220, 235, 88, 4, 228, 140, 148, 10, 98, 104, 101, 60, 115,
- 39, 219, 183, 111, 62, 93, 133, 141, 219, 252, 51, 66, 224, 115, 158, 85, 46, 13, 171,
- 31, 5, 210, 83, 68, 61, 92, 87, 241, 1, 215, 144, 233, 243, 68, 238, 197, 62, 54, 68,
- 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 153, 40, 244, 111, 22, 53,
- 83, 33, 46, 24, 242, 81, 89, 121, 91, 97, 190, 144, 138, 150, 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, 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, 31, 6, 3, 85, 29,
- 35, 4, 24, 48, 22, 128, 20, 230, 93, 24, 66, 42, 224, 216, 63, 210, 30, 74, 173, 48,
- 16, 195, 8, 166, 231, 232, 253, 48, 11, 6, 9, 96, 134, 72, 1, 101, 3, 4, 3, 1, 3, 65,
- 0, 48, 62, 2, 29, 0, 178, 65, 35, 200, 113, 88, 88, 146, 71, 230, 14, 148, 101, 161,
- 118, 55, 125, 175, 226, 137, 63, 147, 215, 75, 207, 115, 150, 22, 2, 29, 0, 233, 44,
- 225, 196, 27, 225, 84, 166, 253, 231, 247, 162, 41, 134, 178, 45, 218, 17, 24, 35, 120,
- 100, 231, 84, 218, 88, 80, 255,
- ]
- .as_slice();
- assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
- Hash::Sha224(ref sha_hash) => *sha_hash == Sha224::digest(CERT),
- Hash::Sha256(_) | Hash::Sha384(_) | Hash::Sha512(_) => false,
- }));
- }
- #[test]
- fn parse_dsa_sha1() {
- /// Certificate that uses DSA with SHA-1.
- const CERT: &[u8] = [
- 48, 130, 4, 157, 48, 130, 4, 77, 160, 3, 2, 1, 2, 2, 1, 35, 48, 9, 6, 7, 42, 134, 72,
- 206, 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, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12,
- 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49, 49, 57, 48, 55,
- 90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 49, 49, 57, 48, 55, 90, 48, 43, 49, 11, 48, 9,
- 6, 3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115,
- 116, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130, 3, 66, 48, 130,
- 2, 53, 6, 7, 42, 134, 72, 206, 56, 4, 1, 48, 130, 2, 40, 2, 130, 1, 1, 0, 172, 11, 194,
- 123, 239, 38, 183, 160, 91, 74, 179, 251, 72, 80, 38, 223, 195, 46, 238, 2, 67, 45,
- 138, 58, 62, 57, 85, 203, 148, 194, 164, 178, 195, 150, 29, 93, 245, 157, 225, 189,
- 125, 209, 186, 83, 234, 14, 179, 116, 156, 216, 112, 205, 152, 26, 168, 175, 111, 106,
- 249, 235, 49, 40, 246, 31, 152, 214, 59, 117, 64, 109, 28, 167, 222, 155, 132, 192,
- 180, 240, 8, 80, 209, 209, 119, 53, 165, 51, 189, 18, 158, 176, 171, 45, 160, 54, 8,
- 75, 146, 92, 245, 202, 188, 144, 36, 156, 127, 140, 220, 144, 56, 95, 38, 112, 44, 221,
- 159, 9, 159, 189, 153, 150, 88, 84, 73, 138, 6, 73, 141, 17, 28, 110, 159, 141, 21,
- 232, 13, 90, 130, 251, 177, 168, 242, 201, 222, 138, 182, 233, 142, 229, 24, 47, 186,
- 56, 245, 177, 250, 253, 2, 11, 115, 29, 6, 156, 168, 117, 22, 15, 152, 183, 137, 25,
- 188, 24, 22, 120, 195, 17, 97, 16, 85, 234, 95, 53, 156, 244, 146, 53, 183, 235, 71,
- 24, 163, 139, 70, 227, 235, 154, 229, 210, 144, 81, 231, 161, 120, 117, 182, 245, 175,
- 25, 252, 21, 153, 130, 211, 180, 209, 164, 34, 248, 167, 8, 98, 181, 69, 52, 74, 120,
- 227, 165, 16, 172, 42, 107, 248, 42, 225, 46, 80, 11, 117, 92, 225, 27, 86, 4, 226, 29,
- 85, 105, 208, 193, 120, 112, 39, 226, 20, 141, 2, 29, 0, 186, 229, 13, 141, 5, 89, 173,
- 164, 148, 130, 205, 229, 23, 44, 125, 234, 49, 240, 196, 213, 6, 31, 233, 8, 99, 80,
- 166, 239, 2, 130, 1, 0, 106, 152, 3, 177, 77, 235, 201, 25, 36, 150, 146, 246, 50, 67,
- 97, 96, 245, 207, 14, 200, 60, 16, 229, 114, 211, 111, 193, 226, 252, 153, 176, 159,
- 198, 41, 133, 157, 197, 38, 112, 217, 9, 205, 13, 85, 170, 94, 89, 60, 214, 117, 182,
- 163, 81, 138, 122, 250, 48, 98, 43, 60, 186, 203, 147, 60, 74, 110, 89, 216, 73, 4,
- 191, 1, 158, 174, 98, 201, 184, 25, 162, 239, 244, 139, 154, 173, 108, 135, 124, 166,
- 152, 88, 237, 68, 145, 252, 33, 40, 237, 57, 53, 155, 215, 56, 12, 202, 22, 225, 7, 89,
- 24, 245, 195, 164, 36, 172, 98, 26, 115, 10, 71, 27, 21, 255, 62, 212, 202, 71, 147,
- 229, 6, 181, 19, 107, 136, 223, 239, 164, 243, 254, 101, 208, 122, 226, 150, 17, 251,
- 218, 85, 169, 81, 177, 7, 190, 171, 230, 26, 149, 183, 181, 113, 140, 252, 212, 172,
- 154, 200, 118, 69, 156, 108, 144, 11, 201, 135, 175, 19, 201, 116, 9, 80, 20, 19, 89,
- 151, 198, 204, 253, 10, 155, 101, 159, 81, 190, 174, 58, 220, 250, 220, 212, 42, 111,
- 33, 204, 114, 7, 30, 153, 73, 248, 209, 114, 36, 225, 6, 47, 106, 45, 226, 254, 175,
- 201, 138, 254, 121, 184, 19, 143, 48, 67, 179, 99, 250, 189, 237, 58, 249, 194, 167,
- 149, 162, 219, 27, 53, 67, 135, 193, 204, 253, 176, 245, 2, 211, 58, 176, 69, 14, 186,
- 3, 130, 1, 5, 0, 2, 130, 1, 0, 97, 40, 15, 97, 210, 23, 118, 85, 75, 191, 251, 126,
- 171, 47, 188, 57, 40, 41, 85, 48, 206, 169, 253, 233, 146, 161, 39, 232, 242, 19, 219,
- 191, 172, 82, 78, 132, 153, 238, 120, 228, 99, 199, 197, 181, 74, 191, 123, 189, 80,
- 203, 219, 50, 184, 193, 49, 160, 9, 41, 167, 133, 33, 151, 52, 196, 61, 29, 102, 233,
- 163, 249, 121, 248, 55, 144, 215, 55, 89, 142, 137, 249, 67, 112, 167, 42, 255, 67, 56,
- 179, 106, 187, 79, 87, 54, 118, 186, 154, 48, 150, 204, 222, 102, 135, 254, 202, 9,
- 166, 229, 176, 130, 37, 174, 139, 240, 43, 134, 75, 141, 35, 163, 203, 71, 153, 217,
- 71, 181, 79, 35, 114, 55, 124, 20, 55, 110, 112, 223, 109, 239, 183, 210, 141, 59, 88,
- 47, 40, 167, 154, 90, 99, 250, 146, 29, 226, 10, 70, 103, 246, 209, 36, 174, 177, 164,
- 244, 126, 153, 106, 156, 92, 143, 140, 46, 49, 184, 125, 160, 246, 145, 178, 94, 11,
- 153, 128, 59, 210, 11, 210, 42, 3, 138, 136, 147, 115, 96, 190, 68, 128, 25, 47, 26,
- 231, 183, 247, 89, 28, 67, 220, 235, 88, 4, 228, 140, 148, 10, 98, 104, 101, 60, 115,
- 39, 219, 183, 111, 62, 93, 133, 141, 219, 252, 51, 66, 224, 115, 158, 85, 46, 13, 171,
- 31, 5, 210, 83, 68, 61, 92, 87, 241, 1, 215, 144, 233, 243, 68, 238, 197, 62, 54, 68,
- 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 153, 40, 244, 111, 22, 53,
- 83, 33, 46, 24, 242, 81, 89, 121, 91, 97, 190, 144, 138, 150, 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, 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, 31, 6, 3, 85, 29,
- 35, 4, 24, 48, 22, 128, 20, 230, 93, 24, 66, 42, 224, 216, 63, 210, 30, 74, 173, 48,
- 16, 195, 8, 166, 231, 232, 253, 48, 9, 6, 7, 42, 134, 72, 206, 56, 4, 3, 3, 63, 0, 48,
- 60, 2, 28, 50, 39, 36, 45, 25, 91, 93, 174, 107, 192, 215, 113, 214, 88, 122, 108, 97,
- 82, 121, 182, 191, 182, 66, 173, 207, 255, 17, 86, 2, 28, 28, 133, 69, 48, 198, 204,
- 39, 177, 136, 73, 222, 95, 114, 218, 219, 54, 88, 17, 114, 204, 214, 83, 20, 137, 75,
- 203, 163, 99,
- ]
- .as_slice();
- assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
- Hash::Sha256(ref sha_hash) => *sha_hash == Sha256::digest(CERT),
- Hash::Sha384(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
- }));
- }
- #[cfg(feature = "runtime")]
- #[derive(Debug)]
- enum E {
- #[expect(dead_code, reason = "does not matter for tests")]
- Io(Error),
- #[expect(dead_code, reason = "does not matter for tests")]
- Rustls(rustls::Error),
- #[expect(dead_code, reason = "does not matter for tests")]
- Postgres(tokio_postgres::Error),
- NoRootCert,
- MultipleRootCerts,
- NoClientKey,
- MultipleClientKeys,
- #[expect(dead_code, reason = "does not matter for tests")]
- RustlsPem(PemErr),
- }
- #[cfg(feature = "runtime")]
- impl From<Error> for E {
- fn from(value: Error) -> Self {
- Self::Io(value)
- }
- }
- #[cfg(feature = "runtime")]
- impl From<rustls::Error> for E {
- fn from(value: rustls::Error) -> Self {
- Self::Rustls(value)
- }
- }
- #[cfg(feature = "runtime")]
- impl From<tokio_postgres::Error> for E {
- fn from(value: tokio_postgres::Error) -> Self {
- Self::Postgres(value)
- }
- }
- #[cfg(feature = "runtime")]
- impl From<PemErr> for E {
- fn from(value: PemErr) -> Self {
- Self::RustlsPem(value)
- }
- }
- #[cfg(feature = "runtime")]
- #[ignore = "requires proper setup and I/O"]
- #[test]
- fn mutual_tls() -> Result<(), E> {
- let root_cert_file = fs::read("test_data/ca.crt.pem")?;
- let mut cert_iter = CertificateDer::pem_slice_iter(root_cert_file.as_slice());
- let key_file = fs::read("test_data/client.key.pem")?;
- let mut key_iter = PrivateKeyDer::pem_slice_iter(key_file.as_slice());
- let mut conf = ClientConfig::builder_with_protocol_versions([&TLS13].as_slice())
- .with_root_certificates(cert_iter.next().ok_or_else(|| E::NoRootCert).and_then(
- |cert_res| {
- cert_res.map_err(E::RustlsPem).and_then(|cert| {
- cert_iter.next().map_or_else(
- || {
- let mut root_store = RootCertStore::empty();
- root_store.add(cert).map_err(E::Rustls).map(|()| root_store)
- },
- |_| Err(E::MultipleRootCerts),
- )
- })
- },
- )?)
- .with_client_auth_cert(
- CertificateDer::pem_slice_iter(fs::read("test_data/client.crt.pem")?.as_slice())
- .try_fold(Vec::with_capacity(1), |mut certs, res| {
- res.map(|cert| {
- certs.push(cert);
- certs
- })
- })?,
- key_iter
- .next()
- .ok_or_else(|| E::NoClientKey)
- .and_then(|key_res| {
- key_res.map_err(E::RustlsPem).and_then(|key| {
- key_iter
- .next()
- .map_or_else(|| Ok(key), |_| Err(E::MultipleClientKeys))
- })
- })?,
- )?;
- super::set_postgresql_alpn(&mut conf);
- let mut config = Config::new();
- let connection = config
- .application_name("test")
- .channel_binding(ChannelBinding::Disable)
- .connect_timeout(Duration::from_secs(4))
- .dbname(fs::read_to_string("test_data/dbname")?.trim_ascii_end())
- .host(fs::read_to_string("test_data/host")?.trim_ascii_end())
- .hostaddr(IpAddr::V6(Ipv6Addr::LOCALHOST))
- .keepalives(false)
- .load_balance_hosts(LoadBalanceHosts::Disable)
- .port(5432)
- .ssl_mode(SslMode::Require)
- .target_session_attrs(TargetSessionAttrs::Any)
- .user(fs::read_to_string("test_data/user")?.trim_ascii_end())
- .connect(MakeTlsConnector::new(Arc::new(conf).into()));
- Builder::new_current_thread()
- .enable_all()
- .build()?
- .block_on(async move { connection.await.map_err(E::Postgres).map(|_| ()) })
- }
- #[cfg(feature = "runtime")]
- #[ignore = "requires proper setup and I/O"]
- #[test]
- fn password_and_channel_binding() -> Result<(), E> {
- let root_cert_file = fs::read("test_data/ca.crt.pem")?;
- let mut cert_iter = CertificateDer::pem_slice_iter(root_cert_file.as_slice());
- let mut conf = ClientConfig::builder_with_protocol_versions([&TLS13].as_slice())
- .with_root_certificates(cert_iter.next().ok_or_else(|| E::NoRootCert).and_then(
- |cert_res| {
- cert_res.map_err(E::RustlsPem).and_then(|cert| {
- cert_iter.next().map_or_else(
- || {
- let mut root_store = RootCertStore::empty();
- root_store.add(cert).map_err(E::Rustls).map(|()| root_store)
- },
- |_| Err(E::MultipleRootCerts),
- )
- })
- },
- )?)
- .with_no_client_auth();
- super::set_postgresql_alpn(&mut conf);
- let mut config = Config::new();
- let connection = config
- .application_name("test")
- .channel_binding(ChannelBinding::Require)
- .connect_timeout(Duration::from_secs(4))
- .dbname(fs::read_to_string("test_data/dbname")?.trim_ascii_end())
- .host(fs::read_to_string("test_data/host")?.trim_ascii_end())
- .hostaddr(IpAddr::V6(Ipv6Addr::LOCALHOST))
- .keepalives(false)
- .load_balance_hosts(LoadBalanceHosts::Disable)
- .password(fs::read("test_data/password")?.trim_ascii_end())
- .port(5432)
- .ssl_mode(SslMode::Require)
- .target_session_attrs(TargetSessionAttrs::Any)
- .user(fs::read_to_string("test_data/user")?.trim_ascii_end())
- .connect(MakeTlsConnector::new(Arc::new(conf).into()));
- Builder::new_current_thread()
- .enable_all()
- .build()?
- .block_on(async move { connection.await.map_err(E::Postgres).map(|_| ()) })
- }
-}
diff --git a/src/tests.rs b/src/tests.rs
@@ -0,0 +1,801 @@
+#[cfg(feature = "runtime")]
+extern crate alloc;
+use super::Hash;
+#[cfg(feature = "runtime")]
+use super::MakeTlsConnector;
+#[cfg(feature = "runtime")]
+use alloc::sync::Arc;
+#[cfg(feature = "runtime")]
+use core::{
+ net::{IpAddr, Ipv6Addr},
+ time::Duration,
+};
+use sha2::{Digest as _, Sha224, Sha256, Sha384, Sha512};
+#[cfg(feature = "runtime")]
+use std::{fs, io::Error};
+#[cfg(feature = "runtime")]
+use tokio::runtime::Builder;
+#[cfg(feature = "runtime")]
+use tokio_postgres::{
+ Config,
+ config::{ChannelBinding, LoadBalanceHosts, SslMode, TargetSessionAttrs},
+};
+#[cfg(feature = "runtime")]
+use tokio_rustls::rustls::{
+ self, ClientConfig, RootCertStore,
+ pki_types::{
+ CertificateDer, PrivateKeyDer,
+ pem::{Error as PemErr, PemObject as _},
+ },
+ version::TLS13,
+};
+#[test]
+fn parse_ed25519() {
+ /// Certificate that uses Ed25519.
+ const CERT: &[u8] = [
+ 48, 130, 1, 125, 48, 130, 1, 47, 160, 3, 2, 1, 2, 2, 1, 29, 48, 5, 6, 3, 43, 101, 112, 48,
+ 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,
+ 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 82, 111, 111, 116,
+ 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 48, 52, 56, 48, 53, 90, 23, 13, 50, 53, 48, 51,
+ 49, 54, 48, 48, 52, 56, 48, 53, 90, 48, 43, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 85, 83,
+ 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49, 13, 48, 11, 6, 3, 85, 4, 3,
+ 12, 4, 84, 101, 115, 116, 48, 42, 48, 5, 6, 3, 43, 101, 112, 3, 33, 0, 142, 168, 95, 146,
+ 122, 142, 177, 52, 239, 161, 27, 41, 80, 58, 167, 248, 211, 181, 154, 201, 26, 195, 207,
+ 27, 132, 228, 110, 149, 95, 212, 44, 202, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4,
+ 22, 4, 20, 238, 12, 127, 172, 94, 237, 69, 62, 240, 99, 1, 2, 35, 161, 201, 129, 19, 85, 0,
+ 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,
+ 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,
+ 1, 48, 31, 6, 3, 85, 29, 35, 4, 24, 48, 22, 128, 20, 199, 177, 144, 22, 54, 182, 183, 202,
+ 234, 246, 98, 108, 85, 32, 30, 132, 146, 221, 218, 80, 48, 5, 6, 3, 43, 101, 112, 3, 65, 0,
+ 133, 253, 192, 202, 50, 167, 57, 5, 246, 17, 58, 232, 188, 41, 147, 232, 35, 206, 147, 181,
+ 0, 139, 95, 3, 24, 139, 17, 102, 113, 186, 146, 163, 97, 157, 255, 50, 193, 230, 159, 170,
+ 218, 35, 56, 99, 89, 251, 173, 97, 106, 15, 52, 71, 209, 69, 109, 216, 140, 235, 37, 23,
+ 185, 173, 215, 0,
+ ]
+ .as_slice();
+ assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
+ Hash::Sha256(ref sha_hash) => *sha_hash == Sha256::digest(CERT),
+ Hash::Sha384(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
+ }));
+}
+#[test]
+fn parse_ecdsa_sha256() {
+ /// Certificate that uses ECDSA with SHA-256.
+ const CERT: &[u8] = [
+ 48, 130, 1, 189, 48, 130, 1, 99, 160, 3, 2, 1, 2, 2, 1, 27, 48, 10, 6, 8, 42, 134, 72, 206,
+ 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,
+ 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 82,
+ 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 48, 52, 49, 51, 48, 90, 23, 13,
+ 50, 53, 48, 51, 49, 54, 48, 48, 52, 49, 51, 48, 90, 48, 43, 49, 11, 48, 9, 6, 3, 85, 4, 6,
+ 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49, 13, 48, 11,
+ 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 89, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1,
+ 6, 8, 42, 134, 72, 206, 61, 3, 1, 7, 3, 66, 0, 4, 195, 27, 22, 133, 220, 98, 146, 255, 201,
+ 209, 114, 117, 93, 119, 207, 46, 228, 132, 210, 187, 134, 197, 201, 194, 147, 51, 111, 17,
+ 187, 179, 129, 180, 129, 62, 164, 27, 199, 95, 59, 16, 167, 134, 233, 53, 127, 194, 187,
+ 144, 193, 106, 100, 37, 104, 219, 164, 155, 58, 210, 106, 12, 192, 247, 72, 183, 163, 117,
+ 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 84, 214, 179, 28, 250, 191, 223, 88, 72,
+ 221, 229, 63, 123, 177, 146, 167, 224, 18, 24, 0, 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, 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, 31, 6, 3, 85, 29, 35, 4, 24, 48, 22,
+ 128, 20, 43, 80, 133, 205, 3, 144, 105, 186, 141, 39, 47, 176, 39, 123, 149, 250, 100, 138,
+ 233, 225, 48, 10, 6, 8, 42, 134, 72, 206, 61, 4, 3, 2, 3, 72, 0, 48, 69, 2, 32, 107, 43,
+ 12, 27, 111, 216, 19, 191, 199, 1, 202, 22, 147, 43, 16, 188, 36, 156, 141, 80, 115, 124,
+ 160, 211, 19, 123, 41, 216, 94, 19, 236, 0, 2, 33, 0, 164, 138, 200, 40, 159, 245, 38, 70,
+ 207, 160, 121, 19, 56, 240, 18, 222, 191, 196, 217, 129, 24, 92, 238, 43, 39, 29, 57, 85,
+ 56, 11, 178, 88,
+ ]
+ .as_slice();
+ assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
+ Hash::Sha256(ref sha_hash) => *sha_hash == Sha256::digest(CERT),
+ Hash::Sha384(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
+ }));
+}
+#[test]
+fn parse_ecdsa_sha384() {
+ /// Certificate that uses ECDSA with SHA-384.
+ const CERT: &[u8] = [
+ 48, 130, 1, 218, 48, 130, 1, 128, 160, 3, 2, 1, 2, 2, 1, 25, 48, 10, 6, 8, 42, 134, 72,
+ 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,
+ 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4,
+ 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 48, 51, 57, 51, 55, 90, 23,
+ 13, 50, 53, 48, 51, 49, 54, 48, 48, 51, 57, 51, 55, 90, 48, 43, 49, 11, 48, 9, 6, 3, 85, 4,
+ 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49, 13, 48,
+ 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 118, 48, 16, 6, 7, 42, 134, 72, 206, 61,
+ 2, 1, 6, 5, 43, 129, 4, 0, 34, 3, 98, 0, 4, 246, 106, 156, 228, 83, 166, 254, 62, 196, 22,
+ 127, 171, 204, 182, 154, 182, 253, 35, 95, 120, 253, 231, 78, 20, 146, 203, 186, 201, 147,
+ 48, 197, 96, 195, 202, 5, 235, 201, 168, 28, 117, 62, 47, 121, 211, 58, 67, 32, 96, 129,
+ 15, 215, 172, 135, 222, 180, 101, 196, 18, 41, 107, 6, 161, 172, 183, 217, 106, 227, 24,
+ 140, 13, 145, 245, 137, 185, 4, 78, 210, 56, 235, 159, 203, 241, 203, 239, 39, 90, 98, 227,
+ 215, 221, 119, 65, 47, 68, 2, 200, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4,
+ 20, 88, 91, 22, 70, 200, 54, 182, 100, 191, 186, 73, 152, 174, 87, 56, 64, 26, 173, 27, 43,
+ 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,
+ 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,
+ 31, 6, 3, 85, 29, 35, 4, 24, 48, 22, 128, 20, 43, 80, 133, 205, 3, 144, 105, 186, 141, 39,
+ 47, 176, 39, 123, 149, 250, 100, 138, 233, 225, 48, 10, 6, 8, 42, 134, 72, 206, 61, 4, 3,
+ 3, 3, 72, 0, 48, 69, 2, 33, 0, 210, 47, 45, 107, 132, 43, 161, 65, 132, 15, 148, 184, 203,
+ 125, 234, 232, 111, 216, 238, 113, 187, 201, 114, 177, 218, 234, 201, 126, 204, 118, 80,
+ 225, 2, 32, 67, 111, 72, 96, 182, 167, 191, 130, 118, 105, 253, 133, 58, 38, 65, 112, 234,
+ 3, 23, 77, 182, 0, 195, 80, 181, 65, 76, 243, 4, 145, 200, 255,
+ ]
+ .as_slice();
+ assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
+ Hash::Sha384(ref sha_hash) => *sha_hash == Sha384::digest(CERT),
+ Hash::Sha256(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
+ }));
+}
+#[test]
+fn parse_ecdsa_sha512() {
+ /// Certificate that uses ECDSA with SHA-512.
+ const CERT: &[u8] = [
+ 48, 130, 2, 1, 48, 130, 1, 166, 160, 3, 2, 1, 2, 2, 1, 24, 48, 10, 6, 8, 42, 134, 72, 206,
+ 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,
+ 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 82,
+ 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 48, 51, 56, 51, 54, 90, 23, 13,
+ 50, 53, 48, 51, 49, 54, 48, 48, 51, 56, 51, 54, 90, 48, 43, 49, 11, 48, 9, 6, 3, 85, 4, 6,
+ 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49, 13, 48, 11,
+ 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 129, 155, 48, 16, 6, 7, 42, 134, 72, 206, 61,
+ 2, 1, 6, 5, 43, 129, 4, 0, 35, 3, 129, 134, 0, 4, 1, 86, 143, 210, 217, 20, 143, 103, 172,
+ 34, 97, 62, 173, 15, 43, 199, 93, 220, 81, 75, 137, 219, 111, 217, 127, 6, 8, 115, 160,
+ 121, 146, 138, 64, 110, 14, 193, 98, 164, 226, 208, 89, 120, 108, 30, 107, 77, 194, 63, 41,
+ 112, 173, 112, 44, 85, 54, 155, 168, 189, 235, 129, 214, 104, 152, 198, 252, 62, 1, 87,
+ 193, 205, 162, 152, 15, 26, 111, 231, 183, 106, 145, 29, 251, 188, 148, 239, 192, 53, 186,
+ 34, 13, 104, 231, 85, 127, 17, 67, 54, 116, 232, 85, 23, 143, 68, 171, 30, 25, 155, 201,
+ 171, 106, 89, 20, 234, 12, 192, 68, 102, 166, 50, 246, 130, 117, 62, 222, 142, 98, 62, 43,
+ 9, 109, 74, 138, 180, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 148, 160,
+ 104, 250, 171, 155, 48, 171, 13, 164, 221, 144, 240, 194, 250, 9, 183, 72, 158, 141, 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, 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, 31,
+ 6, 3, 85, 29, 35, 4, 24, 48, 22, 128, 20, 43, 80, 133, 205, 3, 144, 105, 186, 141, 39, 47,
+ 176, 39, 123, 149, 250, 100, 138, 233, 225, 48, 10, 6, 8, 42, 134, 72, 206, 61, 4, 3, 4, 3,
+ 73, 0, 48, 70, 2, 33, 0, 179, 24, 50, 50, 127, 141, 167, 197, 29, 35, 234, 81, 215, 112,
+ 233, 218, 84, 151, 136, 117, 40, 106, 164, 156, 205, 75, 6, 133, 64, 52, 161, 116, 2, 33,
+ 0, 141, 178, 46, 201, 22, 126, 42, 84, 96, 191, 175, 219, 140, 72, 252, 6, 152, 112, 113,
+ 232, 38, 101, 11, 215, 20, 143, 22, 199, 38, 237, 179, 108,
+ ]
+ .as_slice();
+ assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
+ Hash::Sha512(ref sha_hash) => *sha_hash == Sha512::digest(CERT),
+ Hash::Sha256(_) | Hash::Sha384(_) | Hash::Sha224(_) => false,
+ }));
+}
+#[test]
+fn parse_ecdsa_sha224() {
+ /// Certificate that uses ECDSA with SHA-224.
+ const CERT: &[u8] = [
+ 48, 130, 1, 178, 48, 130, 1, 88, 160, 3, 2, 1, 2, 2, 1, 28, 48, 10, 6, 8, 42, 134, 72, 206,
+ 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,
+ 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 82,
+ 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 48, 52, 50, 49, 52, 90, 23, 13,
+ 50, 53, 48, 51, 49, 54, 48, 48, 52, 50, 49, 52, 90, 48, 43, 49, 11, 48, 9, 6, 3, 85, 4, 6,
+ 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49, 13, 48, 11,
+ 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 78, 48, 16, 6, 7, 42, 134, 72, 206, 61, 2, 1,
+ 6, 5, 43, 129, 4, 0, 33, 3, 58, 0, 4, 235, 241, 149, 78, 60, 248, 123, 132, 195, 228, 188,
+ 151, 240, 28, 76, 198, 207, 121, 165, 126, 245, 158, 214, 232, 69, 198, 114, 117, 86, 137,
+ 15, 86, 40, 171, 27, 36, 8, 43, 190, 138, 193, 136, 118, 43, 29, 119, 182, 21, 14, 123,
+ 110, 81, 81, 72, 44, 195, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 203,
+ 141, 20, 54, 48, 176, 180, 57, 46, 1, 91, 221, 116, 154, 205, 81, 187, 184, 24, 211, 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, 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, 31,
+ 6, 3, 85, 29, 35, 4, 24, 48, 22, 128, 20, 43, 80, 133, 205, 3, 144, 105, 186, 141, 39, 47,
+ 176, 39, 123, 149, 250, 100, 138, 233, 225, 48, 10, 6, 8, 42, 134, 72, 206, 61, 4, 3, 1, 3,
+ 72, 0, 48, 69, 2, 32, 64, 186, 179, 226, 82, 176, 87, 158, 166, 22, 31, 27, 19, 190, 112,
+ 167, 241, 159, 33, 198, 60, 70, 68, 120, 19, 63, 33, 244, 236, 240, 216, 181, 2, 33, 0,
+ 252, 183, 115, 52, 189, 151, 44, 178, 62, 209, 159, 31, 154, 152, 69, 189, 121, 148, 57,
+ 231, 27, 22, 165, 212, 65, 202, 124, 15, 53, 150, 93, 183,
+ ]
+ .as_slice();
+ assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
+ Hash::Sha224(ref sha_hash) => *sha_hash == Sha224::digest(CERT),
+ Hash::Sha256(_) | Hash::Sha384(_) | Hash::Sha512(_) => false,
+ }));
+}
+#[test]
+fn parse_rsa_sha256() {
+ /// Certificate that uses RSA with SHA-256.
+ const CERT: &[u8] = [
+ 48, 130, 3, 73, 48, 130, 2, 49, 160, 3, 2, 1, 2, 2, 1, 31, 48, 13, 6, 9, 42, 134, 72, 134,
+ 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,
+ 14, 6, 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3,
+ 12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49, 48, 51, 48, 53,
+ 90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 49, 48, 51, 48, 53, 90, 48, 43, 49, 11, 48, 9, 6,
+ 3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49,
+ 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130, 1, 34, 48, 13, 6, 9, 42,
+ 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48, 130, 1, 10, 2, 130, 1, 1, 0,
+ 157, 28, 83, 190, 61, 252, 154, 205, 112, 191, 153, 197, 22, 159, 92, 161, 84, 84, 181, 67,
+ 218, 26, 189, 52, 245, 184, 150, 248, 142, 15, 214, 118, 205, 243, 107, 45, 103, 205, 9,
+ 198, 129, 115, 7, 195, 115, 131, 34, 244, 217, 42, 234, 170, 84, 41, 128, 49, 81, 175, 208,
+ 42, 100, 168, 44, 145, 226, 11, 98, 245, 83, 134, 213, 30, 76, 239, 43, 82, 222, 175, 254,
+ 135, 124, 16, 218, 105, 159, 219, 43, 8, 109, 1, 228, 16, 190, 160, 28, 100, 120, 245, 100,
+ 164, 45, 128, 181, 238, 152, 227, 50, 63, 162, 191, 4, 173, 210, 254, 31, 141, 66, 193,
+ 237, 20, 92, 34, 13, 74, 135, 80, 201, 12, 158, 51, 54, 91, 53, 97, 115, 212, 97, 6, 160,
+ 45, 77, 40, 165, 55, 128, 230, 105, 31, 76, 197, 211, 111, 197, 169, 167, 136, 2, 249, 117,
+ 65, 127, 163, 217, 169, 151, 97, 209, 194, 179, 203, 81, 58, 52, 66, 11, 184, 172, 97, 70,
+ 124, 125, 151, 159, 102, 224, 24, 159, 233, 169, 95, 66, 17, 180, 69, 48, 233, 5, 250, 37,
+ 55, 35, 200, 212, 225, 197, 240, 19, 22, 106, 101, 171, 190, 135, 3, 75, 157, 240, 149,
+ 107, 208, 94, 58, 244, 204, 105, 9, 32, 203, 162, 194, 39, 12, 97, 16, 153, 236, 60, 93,
+ 24, 252, 103, 231, 164, 19, 55, 233, 181, 103, 135, 187, 40, 202, 210, 125, 88, 73, 2, 3,
+ 1, 0, 1, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 91, 156, 56, 249, 82,
+ 5, 5, 2, 2, 21, 57, 237, 90, 8, 188, 55, 139, 113, 229, 132, 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, 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, 31, 6, 3, 85, 29, 35, 4,
+ 24, 48, 22, 128, 20, 96, 178, 34, 145, 205, 104, 56, 196, 211, 241, 34, 247, 125, 194, 215,
+ 110, 191, 133, 151, 15, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 11, 5, 0, 3, 130, 1,
+ 1, 0, 28, 109, 109, 197, 99, 197, 36, 180, 154, 215, 173, 215, 24, 94, 47, 218, 147, 163,
+ 179, 123, 248, 3, 144, 109, 173, 207, 49, 113, 249, 188, 31, 178, 16, 88, 88, 56, 11, 86,
+ 127, 193, 23, 165, 65, 190, 84, 170, 156, 190, 52, 87, 119, 213, 106, 184, 11, 204, 151,
+ 148, 205, 100, 233, 46, 170, 45, 161, 100, 58, 46, 105, 25, 150, 78, 146, 41, 100, 125,
+ 203, 214, 238, 104, 251, 25, 183, 66, 102, 241, 110, 56, 55, 205, 122, 234, 205, 90, 91,
+ 247, 143, 129, 217, 6, 190, 120, 18, 190, 11, 121, 207, 142, 170, 57, 236, 243, 113, 53,
+ 167, 188, 26, 134, 175, 107, 195, 48, 119, 78, 117, 157, 104, 247, 65, 122, 153, 234, 166,
+ 88, 142, 228, 25, 120, 243, 51, 111, 8, 43, 199, 255, 162, 186, 18, 64, 54, 96, 44, 138,
+ 144, 237, 89, 176, 189, 245, 194, 96, 232, 196, 0, 50, 51, 98, 32, 163, 177, 130, 113, 41,
+ 116, 33, 40, 190, 111, 79, 108, 107, 159, 65, 87, 222, 173, 170, 39, 29, 97, 240, 107, 130,
+ 101, 247, 123, 85, 123, 247, 221, 89, 159, 114, 157, 35, 153, 22, 127, 149, 224, 158, 236,
+ 4, 137, 193, 135, 136, 97, 222, 83, 232, 205, 148, 127, 139, 78, 220, 10, 183, 139, 205,
+ 190, 181, 36, 61, 155, 88, 163, 50, 120, 153, 41, 182, 75, 219, 95, 25, 40, 229, 106, 87,
+ 215, 77, 50, 219, 97,
+ ]
+ .as_slice();
+ assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
+ Hash::Sha256(ref sha_hash) => *sha_hash == Sha256::digest(CERT),
+ Hash::Sha384(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
+ }));
+}
+#[test]
+fn parse_rsa_sha384() {
+ /// Certificate that uses RSA with SHA-384.
+ const CERT: &[u8] = [
+ 48, 130, 3, 73, 48, 130, 2, 49, 160, 3, 2, 1, 2, 2, 1, 32, 48, 13, 6, 9, 42, 134, 72, 134,
+ 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,
+ 14, 6, 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3,
+ 12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49, 48, 53, 52, 54,
+ 90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 49, 48, 53, 52, 54, 90, 48, 43, 49, 11, 48, 9, 6,
+ 3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49,
+ 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130, 1, 34, 48, 13, 6, 9, 42,
+ 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48, 130, 1, 10, 2, 130, 1, 1, 0,
+ 157, 28, 83, 190, 61, 252, 154, 205, 112, 191, 153, 197, 22, 159, 92, 161, 84, 84, 181, 67,
+ 218, 26, 189, 52, 245, 184, 150, 248, 142, 15, 214, 118, 205, 243, 107, 45, 103, 205, 9,
+ 198, 129, 115, 7, 195, 115, 131, 34, 244, 217, 42, 234, 170, 84, 41, 128, 49, 81, 175, 208,
+ 42, 100, 168, 44, 145, 226, 11, 98, 245, 83, 134, 213, 30, 76, 239, 43, 82, 222, 175, 254,
+ 135, 124, 16, 218, 105, 159, 219, 43, 8, 109, 1, 228, 16, 190, 160, 28, 100, 120, 245, 100,
+ 164, 45, 128, 181, 238, 152, 227, 50, 63, 162, 191, 4, 173, 210, 254, 31, 141, 66, 193,
+ 237, 20, 92, 34, 13, 74, 135, 80, 201, 12, 158, 51, 54, 91, 53, 97, 115, 212, 97, 6, 160,
+ 45, 77, 40, 165, 55, 128, 230, 105, 31, 76, 197, 211, 111, 197, 169, 167, 136, 2, 249, 117,
+ 65, 127, 163, 217, 169, 151, 97, 209, 194, 179, 203, 81, 58, 52, 66, 11, 184, 172, 97, 70,
+ 124, 125, 151, 159, 102, 224, 24, 159, 233, 169, 95, 66, 17, 180, 69, 48, 233, 5, 250, 37,
+ 55, 35, 200, 212, 225, 197, 240, 19, 22, 106, 101, 171, 190, 135, 3, 75, 157, 240, 149,
+ 107, 208, 94, 58, 244, 204, 105, 9, 32, 203, 162, 194, 39, 12, 97, 16, 153, 236, 60, 93,
+ 24, 252, 103, 231, 164, 19, 55, 233, 181, 103, 135, 187, 40, 202, 210, 125, 88, 73, 2, 3,
+ 1, 0, 1, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 91, 156, 56, 249, 82,
+ 5, 5, 2, 2, 21, 57, 237, 90, 8, 188, 55, 139, 113, 229, 132, 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, 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, 31, 6, 3, 85, 29, 35, 4,
+ 24, 48, 22, 128, 20, 96, 178, 34, 145, 205, 104, 56, 196, 211, 241, 34, 247, 125, 194, 215,
+ 110, 191, 133, 151, 15, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 12, 5, 0, 3, 130, 1,
+ 1, 0, 135, 249, 101, 184, 225, 162, 164, 193, 23, 81, 98, 221, 134, 87, 34, 94, 229, 131,
+ 221, 17, 38, 61, 156, 200, 113, 94, 244, 188, 226, 84, 74, 96, 205, 237, 230, 242, 168,
+ 238, 178, 133, 68, 188, 80, 244, 60, 42, 169, 54, 66, 79, 104, 66, 251, 27, 240, 108, 16,
+ 46, 175, 62, 240, 194, 7, 181, 238, 211, 118, 149, 150, 46, 97, 39, 28, 173, 225, 49, 73,
+ 206, 147, 101, 12, 192, 218, 119, 208, 73, 20, 208, 229, 216, 133, 213, 28, 165, 70, 20,
+ 158, 114, 223, 40, 121, 13, 236, 218, 165, 237, 164, 196, 94, 80, 120, 49, 212, 241, 213,
+ 197, 201, 104, 67, 223, 130, 148, 197, 251, 199, 167, 6, 89, 146, 139, 141, 32, 78, 72,
+ 190, 146, 94, 251, 208, 47, 118, 173, 111, 92, 241, 102, 26, 233, 145, 46, 220, 230, 5,
+ 147, 220, 92, 240, 133, 24, 192, 71, 49, 252, 84, 163, 132, 34, 139, 12, 106, 4, 189, 151,
+ 37, 34, 123, 26, 42, 84, 46, 232, 14, 129, 101, 84, 26, 25, 219, 11, 115, 214, 106, 12, 75,
+ 199, 248, 218, 239, 209, 32, 159, 40, 192, 11, 2, 175, 51, 232, 20, 8, 72, 188, 184, 177,
+ 22, 251, 238, 42, 74, 21, 25, 93, 77, 184, 5, 207, 101, 98, 60, 214, 173, 169, 56, 54, 211,
+ 167, 55, 34, 14, 184, 25, 4, 170, 108, 94, 110, 27, 45, 11, 22, 61, 130, 63, 214, 168, 72,
+ ]
+ .as_slice();
+ assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
+ Hash::Sha384(ref sha_hash) => *sha_hash == Sha384::digest(CERT),
+ Hash::Sha256(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
+ }));
+}
+#[test]
+fn parse_rsa_sha512() {
+ /// Certificate that uses RSA with SHA-512.
+ const CERT: &[u8] = [
+ 48, 130, 3, 73, 48, 130, 2, 49, 160, 3, 2, 1, 2, 2, 1, 33, 48, 13, 6, 9, 42, 134, 72, 134,
+ 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,
+ 14, 6, 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3,
+ 12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49, 48, 54, 52, 53,
+ 90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 49, 48, 54, 52, 53, 90, 48, 43, 49, 11, 48, 9, 6,
+ 3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49,
+ 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130, 1, 34, 48, 13, 6, 9, 42,
+ 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48, 130, 1, 10, 2, 130, 1, 1, 0,
+ 157, 28, 83, 190, 61, 252, 154, 205, 112, 191, 153, 197, 22, 159, 92, 161, 84, 84, 181, 67,
+ 218, 26, 189, 52, 245, 184, 150, 248, 142, 15, 214, 118, 205, 243, 107, 45, 103, 205, 9,
+ 198, 129, 115, 7, 195, 115, 131, 34, 244, 217, 42, 234, 170, 84, 41, 128, 49, 81, 175, 208,
+ 42, 100, 168, 44, 145, 226, 11, 98, 245, 83, 134, 213, 30, 76, 239, 43, 82, 222, 175, 254,
+ 135, 124, 16, 218, 105, 159, 219, 43, 8, 109, 1, 228, 16, 190, 160, 28, 100, 120, 245, 100,
+ 164, 45, 128, 181, 238, 152, 227, 50, 63, 162, 191, 4, 173, 210, 254, 31, 141, 66, 193,
+ 237, 20, 92, 34, 13, 74, 135, 80, 201, 12, 158, 51, 54, 91, 53, 97, 115, 212, 97, 6, 160,
+ 45, 77, 40, 165, 55, 128, 230, 105, 31, 76, 197, 211, 111, 197, 169, 167, 136, 2, 249, 117,
+ 65, 127, 163, 217, 169, 151, 97, 209, 194, 179, 203, 81, 58, 52, 66, 11, 184, 172, 97, 70,
+ 124, 125, 151, 159, 102, 224, 24, 159, 233, 169, 95, 66, 17, 180, 69, 48, 233, 5, 250, 37,
+ 55, 35, 200, 212, 225, 197, 240, 19, 22, 106, 101, 171, 190, 135, 3, 75, 157, 240, 149,
+ 107, 208, 94, 58, 244, 204, 105, 9, 32, 203, 162, 194, 39, 12, 97, 16, 153, 236, 60, 93,
+ 24, 252, 103, 231, 164, 19, 55, 233, 181, 103, 135, 187, 40, 202, 210, 125, 88, 73, 2, 3,
+ 1, 0, 1, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 91, 156, 56, 249, 82,
+ 5, 5, 2, 2, 21, 57, 237, 90, 8, 188, 55, 139, 113, 229, 132, 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, 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, 31, 6, 3, 85, 29, 35, 4,
+ 24, 48, 22, 128, 20, 96, 178, 34, 145, 205, 104, 56, 196, 211, 241, 34, 247, 125, 194, 215,
+ 110, 191, 133, 151, 15, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 13, 5, 0, 3, 130, 1,
+ 1, 0, 106, 7, 136, 82, 232, 55, 0, 98, 9, 211, 201, 57, 239, 67, 167, 139, 225, 164, 231,
+ 255, 10, 52, 47, 234, 254, 75, 239, 241, 39, 6, 226, 209, 210, 169, 200, 32, 255, 83, 159,
+ 23, 146, 9, 109, 173, 236, 216, 253, 199, 229, 23, 227, 33, 56, 98, 109, 59, 2, 167, 29,
+ 118, 251, 82, 193, 39, 244, 191, 166, 194, 160, 105, 197, 190, 213, 141, 193, 50, 45, 245,
+ 163, 229, 116, 221, 29, 194, 91, 198, 187, 21, 224, 95, 17, 203, 148, 160, 4, 15, 54, 249,
+ 69, 12, 18, 25, 58, 190, 205, 44, 157, 184, 1, 25, 64, 219, 237, 196, 33, 101, 255, 146,
+ 232, 112, 247, 214, 174, 252, 152, 146, 142, 231, 81, 35, 240, 216, 98, 136, 65, 179, 237,
+ 207, 229, 198, 72, 175, 244, 31, 126, 106, 107, 100, 200, 81, 227, 41, 61, 26, 122, 226,
+ 121, 219, 131, 212, 206, 238, 14, 210, 70, 60, 107, 115, 214, 67, 180, 133, 157, 114, 138,
+ 63, 249, 71, 235, 41, 246, 14, 14, 4, 254, 208, 215, 111, 196, 248, 117, 61, 44, 67, 185,
+ 11, 132, 10, 188, 220, 110, 78, 61, 171, 88, 172, 161, 1, 223, 52, 75, 101, 55, 249, 125,
+ 178, 141, 127, 0, 246, 176, 34, 120, 93, 214, 37, 210, 148, 217, 149, 255, 63, 32, 58, 8,
+ 71, 179, 62, 119, 14, 47, 191, 207, 137, 22, 255, 21, 71, 46, 42, 176, 31, 206, 146, 248,
+ 105,
+ ]
+ .as_slice();
+ assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
+ Hash::Sha512(ref sha_hash) => *sha_hash == Sha512::digest(CERT),
+ Hash::Sha256(_) | Hash::Sha384(_) | Hash::Sha224(_) => false,
+ }));
+}
+#[test]
+fn parse_rsa_sha224() {
+ /// Certificate that uses RSA with SHA-224.
+ const CERT: &[u8] = [
+ 48, 130, 3, 73, 48, 130, 2, 49, 160, 3, 2, 1, 2, 2, 1, 30, 48, 13, 6, 9, 42, 134, 72, 134,
+ 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,
+ 14, 6, 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3,
+ 12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 48, 53, 57, 50, 56,
+ 90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 48, 53, 57, 50, 56, 90, 48, 43, 49, 11, 48, 9, 6,
+ 3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49,
+ 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130, 1, 34, 48, 13, 6, 9, 42,
+ 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48, 130, 1, 10, 2, 130, 1, 1, 0,
+ 157, 28, 83, 190, 61, 252, 154, 205, 112, 191, 153, 197, 22, 159, 92, 161, 84, 84, 181, 67,
+ 218, 26, 189, 52, 245, 184, 150, 248, 142, 15, 214, 118, 205, 243, 107, 45, 103, 205, 9,
+ 198, 129, 115, 7, 195, 115, 131, 34, 244, 217, 42, 234, 170, 84, 41, 128, 49, 81, 175, 208,
+ 42, 100, 168, 44, 145, 226, 11, 98, 245, 83, 134, 213, 30, 76, 239, 43, 82, 222, 175, 254,
+ 135, 124, 16, 218, 105, 159, 219, 43, 8, 109, 1, 228, 16, 190, 160, 28, 100, 120, 245, 100,
+ 164, 45, 128, 181, 238, 152, 227, 50, 63, 162, 191, 4, 173, 210, 254, 31, 141, 66, 193,
+ 237, 20, 92, 34, 13, 74, 135, 80, 201, 12, 158, 51, 54, 91, 53, 97, 115, 212, 97, 6, 160,
+ 45, 77, 40, 165, 55, 128, 230, 105, 31, 76, 197, 211, 111, 197, 169, 167, 136, 2, 249, 117,
+ 65, 127, 163, 217, 169, 151, 97, 209, 194, 179, 203, 81, 58, 52, 66, 11, 184, 172, 97, 70,
+ 124, 125, 151, 159, 102, 224, 24, 159, 233, 169, 95, 66, 17, 180, 69, 48, 233, 5, 250, 37,
+ 55, 35, 200, 212, 225, 197, 240, 19, 22, 106, 101, 171, 190, 135, 3, 75, 157, 240, 149,
+ 107, 208, 94, 58, 244, 204, 105, 9, 32, 203, 162, 194, 39, 12, 97, 16, 153, 236, 60, 93,
+ 24, 252, 103, 231, 164, 19, 55, 233, 181, 103, 135, 187, 40, 202, 210, 125, 88, 73, 2, 3,
+ 1, 0, 1, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 91, 156, 56, 249, 82,
+ 5, 5, 2, 2, 21, 57, 237, 90, 8, 188, 55, 139, 113, 229, 132, 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, 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, 31, 6, 3, 85, 29, 35, 4,
+ 24, 48, 22, 128, 20, 96, 178, 34, 145, 205, 104, 56, 196, 211, 241, 34, 247, 125, 194, 215,
+ 110, 191, 133, 151, 15, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 14, 5, 0, 3, 130, 1,
+ 1, 0, 122, 121, 0, 201, 250, 195, 66, 213, 60, 117, 213, 188, 93, 193, 88, 130, 241, 219,
+ 111, 238, 109, 38, 220, 131, 164, 12, 135, 169, 58, 140, 214, 211, 93, 51, 204, 242, 10,
+ 119, 123, 23, 69, 67, 135, 151, 245, 23, 144, 61, 233, 229, 122, 189, 111, 89, 190, 100,
+ 251, 86, 185, 246, 40, 121, 190, 192, 199, 119, 232, 209, 202, 23, 20, 46, 48, 235, 175,
+ 240, 225, 106, 6, 24, 239, 172, 51, 196, 63, 189, 210, 167, 244, 87, 245, 193, 130, 33,
+ 171, 165, 117, 180, 25, 250, 21, 6, 208, 124, 254, 64, 180, 50, 124, 234, 179, 121, 183, 0,
+ 71, 118, 28, 115, 86, 117, 60, 96, 164, 33, 54, 1, 86, 234, 132, 146, 156, 221, 52, 28, 39,
+ 237, 128, 75, 157, 169, 203, 26, 48, 74, 4, 129, 162, 139, 235, 16, 74, 236, 151, 0, 150,
+ 234, 246, 204, 180, 240, 31, 92, 129, 51, 221, 118, 10, 192, 140, 32, 33, 21, 223, 113, 35,
+ 86, 47, 236, 159, 252, 52, 185, 41, 151, 56, 126, 251, 165, 126, 214, 27, 213, 169, 211,
+ 174, 26, 55, 21, 11, 187, 189, 96, 67, 141, 124, 178, 51, 37, 80, 17, 220, 210, 193, 243,
+ 127, 46, 82, 75, 172, 187, 156, 222, 186, 3, 13, 194, 104, 234, 131, 96, 99, 34, 1, 61,
+ 149, 219, 33, 227, 34, 215, 211, 82, 106, 57, 61, 185, 178, 1, 191, 14, 196, 52, 5, 38, 27,
+ 232,
+ ]
+ .as_slice();
+ assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
+ Hash::Sha224(ref sha_hash) => *sha_hash == Sha224::digest(CERT),
+ Hash::Sha256(_) | Hash::Sha384(_) | Hash::Sha512(_) => false,
+ }));
+}
+#[test]
+fn parse_rsa_sha1() {
+ /// Certificate that uses RSA with SHA-1.
+ const CERT: &[u8] = [
+ 48, 130, 3, 73, 48, 130, 2, 49, 160, 3, 2, 1, 2, 2, 1, 34, 48, 13, 6, 9, 42, 134, 72, 134,
+ 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,
+ 14, 6, 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3,
+ 12, 4, 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49, 48, 57, 50, 56,
+ 90, 23, 13, 50, 53, 48, 51, 49, 54, 48, 49, 48, 57, 50, 56, 90, 48, 43, 49, 11, 48, 9, 6,
+ 3, 85, 4, 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49,
+ 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130, 1, 34, 48, 13, 6, 9, 42,
+ 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48, 130, 1, 10, 2, 130, 1, 1, 0,
+ 157, 28, 83, 190, 61, 252, 154, 205, 112, 191, 153, 197, 22, 159, 92, 161, 84, 84, 181, 67,
+ 218, 26, 189, 52, 245, 184, 150, 248, 142, 15, 214, 118, 205, 243, 107, 45, 103, 205, 9,
+ 198, 129, 115, 7, 195, 115, 131, 34, 244, 217, 42, 234, 170, 84, 41, 128, 49, 81, 175, 208,
+ 42, 100, 168, 44, 145, 226, 11, 98, 245, 83, 134, 213, 30, 76, 239, 43, 82, 222, 175, 254,
+ 135, 124, 16, 218, 105, 159, 219, 43, 8, 109, 1, 228, 16, 190, 160, 28, 100, 120, 245, 100,
+ 164, 45, 128, 181, 238, 152, 227, 50, 63, 162, 191, 4, 173, 210, 254, 31, 141, 66, 193,
+ 237, 20, 92, 34, 13, 74, 135, 80, 201, 12, 158, 51, 54, 91, 53, 97, 115, 212, 97, 6, 160,
+ 45, 77, 40, 165, 55, 128, 230, 105, 31, 76, 197, 211, 111, 197, 169, 167, 136, 2, 249, 117,
+ 65, 127, 163, 217, 169, 151, 97, 209, 194, 179, 203, 81, 58, 52, 66, 11, 184, 172, 97, 70,
+ 124, 125, 151, 159, 102, 224, 24, 159, 233, 169, 95, 66, 17, 180, 69, 48, 233, 5, 250, 37,
+ 55, 35, 200, 212, 225, 197, 240, 19, 22, 106, 101, 171, 190, 135, 3, 75, 157, 240, 149,
+ 107, 208, 94, 58, 244, 204, 105, 9, 32, 203, 162, 194, 39, 12, 97, 16, 153, 236, 60, 93,
+ 24, 252, 103, 231, 164, 19, 55, 233, 181, 103, 135, 187, 40, 202, 210, 125, 88, 73, 2, 3,
+ 1, 0, 1, 163, 117, 48, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 91, 156, 56, 249, 82,
+ 5, 5, 2, 2, 21, 57, 237, 90, 8, 188, 55, 139, 113, 229, 132, 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, 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, 31, 6, 3, 85, 29, 35, 4,
+ 24, 48, 22, 128, 20, 96, 178, 34, 145, 205, 104, 56, 196, 211, 241, 34, 247, 125, 194, 215,
+ 110, 191, 133, 151, 15, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 5, 5, 0, 3, 130, 1,
+ 1, 0, 12, 93, 61, 154, 152, 205, 44, 219, 157, 214, 4, 162, 93, 85, 60, 231, 231, 206, 193,
+ 160, 133, 28, 61, 113, 102, 120, 137, 120, 175, 11, 244, 113, 217, 81, 151, 123, 210, 108,
+ 156, 145, 99, 158, 104, 10, 25, 129, 95, 128, 140, 44, 153, 65, 175, 32, 37, 189, 186, 43,
+ 101, 153, 98, 160, 95, 13, 154, 86, 221, 99, 210, 157, 25, 41, 98, 79, 252, 2, 8, 221, 120,
+ 71, 54, 221, 34, 180, 109, 181, 185, 58, 2, 119, 167, 50, 172, 167, 192, 136, 24, 227, 40,
+ 211, 18, 98, 2, 175, 174, 42, 100, 136, 83, 116, 7, 50, 50, 215, 164, 90, 49, 231, 106,
+ 240, 246, 95, 236, 60, 198, 97, 200, 140, 23, 168, 183, 174, 132, 39, 251, 61, 112, 226,
+ 66, 68, 16, 23, 213, 129, 86, 196, 248, 82, 141, 82, 107, 246, 224, 37, 94, 95, 134, 139,
+ 75, 15, 70, 54, 47, 80, 19, 143, 48, 171, 113, 130, 226, 180, 39, 18, 44, 117, 113, 196,
+ 20, 11, 82, 174, 251, 197, 216, 152, 229, 188, 148, 191, 165, 149, 50, 127, 172, 111, 95,
+ 194, 63, 238, 112, 154, 85, 98, 18, 236, 13, 123, 232, 90, 47, 180, 36, 148, 77, 192, 45,
+ 113, 150, 10, 254, 99, 0, 30, 87, 80, 22, 61, 78, 66, 180, 251, 220, 8, 78, 175, 251, 27,
+ 201, 79, 197, 45, 127, 143, 163, 7, 252, 246, 45, 127, 87, 224, 125, 175, 245, 115,
+ ]
+ .as_slice();
+ assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
+ Hash::Sha256(ref sha_hash) => *sha_hash == Sha256::digest(CERT),
+ Hash::Sha384(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
+ }));
+}
+#[test]
+fn parse_dsa_sha256() {
+ /// Certificate that uses DSA with SHA-256.
+ const CERT: &[u8] = [
+ 48, 130, 4, 162, 48, 130, 4, 79, 160, 3, 2, 1, 2, 2, 1, 37, 48, 11, 6, 9, 96, 134, 72, 1,
+ 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,
+ 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4,
+ 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49, 50, 51, 48, 51, 90, 23,
+ 13, 50, 53, 48, 51, 49, 54, 48, 49, 50, 51, 48, 51, 90, 48, 43, 49, 11, 48, 9, 6, 3, 85, 4,
+ 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49, 13, 48,
+ 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130, 3, 66, 48, 130, 2, 53, 6, 7, 42,
+ 134, 72, 206, 56, 4, 1, 48, 130, 2, 40, 2, 130, 1, 1, 0, 172, 11, 194, 123, 239, 38, 183,
+ 160, 91, 74, 179, 251, 72, 80, 38, 223, 195, 46, 238, 2, 67, 45, 138, 58, 62, 57, 85, 203,
+ 148, 194, 164, 178, 195, 150, 29, 93, 245, 157, 225, 189, 125, 209, 186, 83, 234, 14, 179,
+ 116, 156, 216, 112, 205, 152, 26, 168, 175, 111, 106, 249, 235, 49, 40, 246, 31, 152, 214,
+ 59, 117, 64, 109, 28, 167, 222, 155, 132, 192, 180, 240, 8, 80, 209, 209, 119, 53, 165, 51,
+ 189, 18, 158, 176, 171, 45, 160, 54, 8, 75, 146, 92, 245, 202, 188, 144, 36, 156, 127, 140,
+ 220, 144, 56, 95, 38, 112, 44, 221, 159, 9, 159, 189, 153, 150, 88, 84, 73, 138, 6, 73,
+ 141, 17, 28, 110, 159, 141, 21, 232, 13, 90, 130, 251, 177, 168, 242, 201, 222, 138, 182,
+ 233, 142, 229, 24, 47, 186, 56, 245, 177, 250, 253, 2, 11, 115, 29, 6, 156, 168, 117, 22,
+ 15, 152, 183, 137, 25, 188, 24, 22, 120, 195, 17, 97, 16, 85, 234, 95, 53, 156, 244, 146,
+ 53, 183, 235, 71, 24, 163, 139, 70, 227, 235, 154, 229, 210, 144, 81, 231, 161, 120, 117,
+ 182, 245, 175, 25, 252, 21, 153, 130, 211, 180, 209, 164, 34, 248, 167, 8, 98, 181, 69, 52,
+ 74, 120, 227, 165, 16, 172, 42, 107, 248, 42, 225, 46, 80, 11, 117, 92, 225, 27, 86, 4,
+ 226, 29, 85, 105, 208, 193, 120, 112, 39, 226, 20, 141, 2, 29, 0, 186, 229, 13, 141, 5, 89,
+ 173, 164, 148, 130, 205, 229, 23, 44, 125, 234, 49, 240, 196, 213, 6, 31, 233, 8, 99, 80,
+ 166, 239, 2, 130, 1, 0, 106, 152, 3, 177, 77, 235, 201, 25, 36, 150, 146, 246, 50, 67, 97,
+ 96, 245, 207, 14, 200, 60, 16, 229, 114, 211, 111, 193, 226, 252, 153, 176, 159, 198, 41,
+ 133, 157, 197, 38, 112, 217, 9, 205, 13, 85, 170, 94, 89, 60, 214, 117, 182, 163, 81, 138,
+ 122, 250, 48, 98, 43, 60, 186, 203, 147, 60, 74, 110, 89, 216, 73, 4, 191, 1, 158, 174, 98,
+ 201, 184, 25, 162, 239, 244, 139, 154, 173, 108, 135, 124, 166, 152, 88, 237, 68, 145, 252,
+ 33, 40, 237, 57, 53, 155, 215, 56, 12, 202, 22, 225, 7, 89, 24, 245, 195, 164, 36, 172, 98,
+ 26, 115, 10, 71, 27, 21, 255, 62, 212, 202, 71, 147, 229, 6, 181, 19, 107, 136, 223, 239,
+ 164, 243, 254, 101, 208, 122, 226, 150, 17, 251, 218, 85, 169, 81, 177, 7, 190, 171, 230,
+ 26, 149, 183, 181, 113, 140, 252, 212, 172, 154, 200, 118, 69, 156, 108, 144, 11, 201, 135,
+ 175, 19, 201, 116, 9, 80, 20, 19, 89, 151, 198, 204, 253, 10, 155, 101, 159, 81, 190, 174,
+ 58, 220, 250, 220, 212, 42, 111, 33, 204, 114, 7, 30, 153, 73, 248, 209, 114, 36, 225, 6,
+ 47, 106, 45, 226, 254, 175, 201, 138, 254, 121, 184, 19, 143, 48, 67, 179, 99, 250, 189,
+ 237, 58, 249, 194, 167, 149, 162, 219, 27, 53, 67, 135, 193, 204, 253, 176, 245, 2, 211,
+ 58, 176, 69, 14, 186, 3, 130, 1, 5, 0, 2, 130, 1, 0, 97, 40, 15, 97, 210, 23, 118, 85, 75,
+ 191, 251, 126, 171, 47, 188, 57, 40, 41, 85, 48, 206, 169, 253, 233, 146, 161, 39, 232,
+ 242, 19, 219, 191, 172, 82, 78, 132, 153, 238, 120, 228, 99, 199, 197, 181, 74, 191, 123,
+ 189, 80, 203, 219, 50, 184, 193, 49, 160, 9, 41, 167, 133, 33, 151, 52, 196, 61, 29, 102,
+ 233, 163, 249, 121, 248, 55, 144, 215, 55, 89, 142, 137, 249, 67, 112, 167, 42, 255, 67,
+ 56, 179, 106, 187, 79, 87, 54, 118, 186, 154, 48, 150, 204, 222, 102, 135, 254, 202, 9,
+ 166, 229, 176, 130, 37, 174, 139, 240, 43, 134, 75, 141, 35, 163, 203, 71, 153, 217, 71,
+ 181, 79, 35, 114, 55, 124, 20, 55, 110, 112, 223, 109, 239, 183, 210, 141, 59, 88, 47, 40,
+ 167, 154, 90, 99, 250, 146, 29, 226, 10, 70, 103, 246, 209, 36, 174, 177, 164, 244, 126,
+ 153, 106, 156, 92, 143, 140, 46, 49, 184, 125, 160, 246, 145, 178, 94, 11, 153, 128, 59,
+ 210, 11, 210, 42, 3, 138, 136, 147, 115, 96, 190, 68, 128, 25, 47, 26, 231, 183, 247, 89,
+ 28, 67, 220, 235, 88, 4, 228, 140, 148, 10, 98, 104, 101, 60, 115, 39, 219, 183, 111, 62,
+ 93, 133, 141, 219, 252, 51, 66, 224, 115, 158, 85, 46, 13, 171, 31, 5, 210, 83, 68, 61, 92,
+ 87, 241, 1, 215, 144, 233, 243, 68, 238, 197, 62, 54, 68, 163, 117, 48, 115, 48, 29, 6, 3,
+ 85, 29, 14, 4, 22, 4, 20, 153, 40, 244, 111, 22, 53, 83, 33, 46, 24, 242, 81, 89, 121, 91,
+ 97, 190, 144, 138, 150, 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, 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, 31, 6, 3, 85, 29, 35, 4, 24, 48, 22, 128, 20, 230, 93, 24, 66, 42,
+ 224, 216, 63, 210, 30, 74, 173, 48, 16, 195, 8, 166, 231, 232, 253, 48, 11, 6, 9, 96, 134,
+ 72, 1, 101, 3, 4, 3, 2, 3, 64, 0, 48, 61, 2, 28, 116, 130, 114, 201, 119, 192, 122, 114,
+ 52, 255, 182, 233, 56, 153, 169, 135, 12, 49, 236, 107, 72, 244, 178, 174, 32, 27, 13, 226,
+ 2, 29, 0, 170, 35, 77, 179, 10, 59, 85, 118, 124, 99, 48, 21, 125, 235, 57, 27, 60, 222,
+ 102, 120, 20, 16, 148, 80, 118, 28, 75, 176,
+ ]
+ .as_slice();
+ assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
+ Hash::Sha256(ref sha_hash) => *sha_hash == Sha256::digest(CERT),
+ Hash::Sha384(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
+ }));
+}
+#[test]
+fn parse_dsa_sha224() {
+ /// Certificate that uses DSA with SHA-224.
+ const CERT: &[u8] = [
+ 48, 130, 4, 163, 48, 130, 4, 79, 160, 3, 2, 1, 2, 2, 1, 36, 48, 11, 6, 9, 96, 134, 72, 1,
+ 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,
+ 3, 85, 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4,
+ 82, 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49, 50, 50, 50, 53, 90, 23,
+ 13, 50, 53, 48, 51, 49, 54, 48, 49, 50, 50, 50, 53, 90, 48, 43, 49, 11, 48, 9, 6, 3, 85, 4,
+ 6, 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49, 13, 48,
+ 11, 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130, 3, 66, 48, 130, 2, 53, 6, 7, 42,
+ 134, 72, 206, 56, 4, 1, 48, 130, 2, 40, 2, 130, 1, 1, 0, 172, 11, 194, 123, 239, 38, 183,
+ 160, 91, 74, 179, 251, 72, 80, 38, 223, 195, 46, 238, 2, 67, 45, 138, 58, 62, 57, 85, 203,
+ 148, 194, 164, 178, 195, 150, 29, 93, 245, 157, 225, 189, 125, 209, 186, 83, 234, 14, 179,
+ 116, 156, 216, 112, 205, 152, 26, 168, 175, 111, 106, 249, 235, 49, 40, 246, 31, 152, 214,
+ 59, 117, 64, 109, 28, 167, 222, 155, 132, 192, 180, 240, 8, 80, 209, 209, 119, 53, 165, 51,
+ 189, 18, 158, 176, 171, 45, 160, 54, 8, 75, 146, 92, 245, 202, 188, 144, 36, 156, 127, 140,
+ 220, 144, 56, 95, 38, 112, 44, 221, 159, 9, 159, 189, 153, 150, 88, 84, 73, 138, 6, 73,
+ 141, 17, 28, 110, 159, 141, 21, 232, 13, 90, 130, 251, 177, 168, 242, 201, 222, 138, 182,
+ 233, 142, 229, 24, 47, 186, 56, 245, 177, 250, 253, 2, 11, 115, 29, 6, 156, 168, 117, 22,
+ 15, 152, 183, 137, 25, 188, 24, 22, 120, 195, 17, 97, 16, 85, 234, 95, 53, 156, 244, 146,
+ 53, 183, 235, 71, 24, 163, 139, 70, 227, 235, 154, 229, 210, 144, 81, 231, 161, 120, 117,
+ 182, 245, 175, 25, 252, 21, 153, 130, 211, 180, 209, 164, 34, 248, 167, 8, 98, 181, 69, 52,
+ 74, 120, 227, 165, 16, 172, 42, 107, 248, 42, 225, 46, 80, 11, 117, 92, 225, 27, 86, 4,
+ 226, 29, 85, 105, 208, 193, 120, 112, 39, 226, 20, 141, 2, 29, 0, 186, 229, 13, 141, 5, 89,
+ 173, 164, 148, 130, 205, 229, 23, 44, 125, 234, 49, 240, 196, 213, 6, 31, 233, 8, 99, 80,
+ 166, 239, 2, 130, 1, 0, 106, 152, 3, 177, 77, 235, 201, 25, 36, 150, 146, 246, 50, 67, 97,
+ 96, 245, 207, 14, 200, 60, 16, 229, 114, 211, 111, 193, 226, 252, 153, 176, 159, 198, 41,
+ 133, 157, 197, 38, 112, 217, 9, 205, 13, 85, 170, 94, 89, 60, 214, 117, 182, 163, 81, 138,
+ 122, 250, 48, 98, 43, 60, 186, 203, 147, 60, 74, 110, 89, 216, 73, 4, 191, 1, 158, 174, 98,
+ 201, 184, 25, 162, 239, 244, 139, 154, 173, 108, 135, 124, 166, 152, 88, 237, 68, 145, 252,
+ 33, 40, 237, 57, 53, 155, 215, 56, 12, 202, 22, 225, 7, 89, 24, 245, 195, 164, 36, 172, 98,
+ 26, 115, 10, 71, 27, 21, 255, 62, 212, 202, 71, 147, 229, 6, 181, 19, 107, 136, 223, 239,
+ 164, 243, 254, 101, 208, 122, 226, 150, 17, 251, 218, 85, 169, 81, 177, 7, 190, 171, 230,
+ 26, 149, 183, 181, 113, 140, 252, 212, 172, 154, 200, 118, 69, 156, 108, 144, 11, 201, 135,
+ 175, 19, 201, 116, 9, 80, 20, 19, 89, 151, 198, 204, 253, 10, 155, 101, 159, 81, 190, 174,
+ 58, 220, 250, 220, 212, 42, 111, 33, 204, 114, 7, 30, 153, 73, 248, 209, 114, 36, 225, 6,
+ 47, 106, 45, 226, 254, 175, 201, 138, 254, 121, 184, 19, 143, 48, 67, 179, 99, 250, 189,
+ 237, 58, 249, 194, 167, 149, 162, 219, 27, 53, 67, 135, 193, 204, 253, 176, 245, 2, 211,
+ 58, 176, 69, 14, 186, 3, 130, 1, 5, 0, 2, 130, 1, 0, 97, 40, 15, 97, 210, 23, 118, 85, 75,
+ 191, 251, 126, 171, 47, 188, 57, 40, 41, 85, 48, 206, 169, 253, 233, 146, 161, 39, 232,
+ 242, 19, 219, 191, 172, 82, 78, 132, 153, 238, 120, 228, 99, 199, 197, 181, 74, 191, 123,
+ 189, 80, 203, 219, 50, 184, 193, 49, 160, 9, 41, 167, 133, 33, 151, 52, 196, 61, 29, 102,
+ 233, 163, 249, 121, 248, 55, 144, 215, 55, 89, 142, 137, 249, 67, 112, 167, 42, 255, 67,
+ 56, 179, 106, 187, 79, 87, 54, 118, 186, 154, 48, 150, 204, 222, 102, 135, 254, 202, 9,
+ 166, 229, 176, 130, 37, 174, 139, 240, 43, 134, 75, 141, 35, 163, 203, 71, 153, 217, 71,
+ 181, 79, 35, 114, 55, 124, 20, 55, 110, 112, 223, 109, 239, 183, 210, 141, 59, 88, 47, 40,
+ 167, 154, 90, 99, 250, 146, 29, 226, 10, 70, 103, 246, 209, 36, 174, 177, 164, 244, 126,
+ 153, 106, 156, 92, 143, 140, 46, 49, 184, 125, 160, 246, 145, 178, 94, 11, 153, 128, 59,
+ 210, 11, 210, 42, 3, 138, 136, 147, 115, 96, 190, 68, 128, 25, 47, 26, 231, 183, 247, 89,
+ 28, 67, 220, 235, 88, 4, 228, 140, 148, 10, 98, 104, 101, 60, 115, 39, 219, 183, 111, 62,
+ 93, 133, 141, 219, 252, 51, 66, 224, 115, 158, 85, 46, 13, 171, 31, 5, 210, 83, 68, 61, 92,
+ 87, 241, 1, 215, 144, 233, 243, 68, 238, 197, 62, 54, 68, 163, 117, 48, 115, 48, 29, 6, 3,
+ 85, 29, 14, 4, 22, 4, 20, 153, 40, 244, 111, 22, 53, 83, 33, 46, 24, 242, 81, 89, 121, 91,
+ 97, 190, 144, 138, 150, 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, 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, 31, 6, 3, 85, 29, 35, 4, 24, 48, 22, 128, 20, 230, 93, 24, 66, 42,
+ 224, 216, 63, 210, 30, 74, 173, 48, 16, 195, 8, 166, 231, 232, 253, 48, 11, 6, 9, 96, 134,
+ 72, 1, 101, 3, 4, 3, 1, 3, 65, 0, 48, 62, 2, 29, 0, 178, 65, 35, 200, 113, 88, 88, 146, 71,
+ 230, 14, 148, 101, 161, 118, 55, 125, 175, 226, 137, 63, 147, 215, 75, 207, 115, 150, 22,
+ 2, 29, 0, 233, 44, 225, 196, 27, 225, 84, 166, 253, 231, 247, 162, 41, 134, 178, 45, 218,
+ 17, 24, 35, 120, 100, 231, 84, 218, 88, 80, 255,
+ ]
+ .as_slice();
+ assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
+ Hash::Sha224(ref sha_hash) => *sha_hash == Sha224::digest(CERT),
+ Hash::Sha256(_) | Hash::Sha384(_) | Hash::Sha512(_) => false,
+ }));
+}
+#[test]
+fn parse_dsa_sha1() {
+ /// Certificate that uses DSA with SHA-1.
+ const CERT: &[u8] = [
+ 48, 130, 4, 157, 48, 130, 4, 77, 160, 3, 2, 1, 2, 2, 1, 35, 48, 9, 6, 7, 42, 134, 72, 206,
+ 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,
+ 4, 10, 12, 7, 84, 101, 115, 116, 32, 67, 65, 49, 13, 48, 11, 6, 3, 85, 4, 3, 12, 4, 82,
+ 111, 111, 116, 48, 30, 23, 13, 50, 53, 48, 50, 49, 52, 48, 49, 49, 57, 48, 55, 90, 23, 13,
+ 50, 53, 48, 51, 49, 54, 48, 49, 49, 57, 48, 55, 90, 48, 43, 49, 11, 48, 9, 6, 3, 85, 4, 6,
+ 19, 2, 85, 83, 49, 13, 48, 11, 6, 3, 85, 4, 10, 12, 4, 84, 101, 115, 116, 49, 13, 48, 11,
+ 6, 3, 85, 4, 3, 12, 4, 84, 101, 115, 116, 48, 130, 3, 66, 48, 130, 2, 53, 6, 7, 42, 134,
+ 72, 206, 56, 4, 1, 48, 130, 2, 40, 2, 130, 1, 1, 0, 172, 11, 194, 123, 239, 38, 183, 160,
+ 91, 74, 179, 251, 72, 80, 38, 223, 195, 46, 238, 2, 67, 45, 138, 58, 62, 57, 85, 203, 148,
+ 194, 164, 178, 195, 150, 29, 93, 245, 157, 225, 189, 125, 209, 186, 83, 234, 14, 179, 116,
+ 156, 216, 112, 205, 152, 26, 168, 175, 111, 106, 249, 235, 49, 40, 246, 31, 152, 214, 59,
+ 117, 64, 109, 28, 167, 222, 155, 132, 192, 180, 240, 8, 80, 209, 209, 119, 53, 165, 51,
+ 189, 18, 158, 176, 171, 45, 160, 54, 8, 75, 146, 92, 245, 202, 188, 144, 36, 156, 127, 140,
+ 220, 144, 56, 95, 38, 112, 44, 221, 159, 9, 159, 189, 153, 150, 88, 84, 73, 138, 6, 73,
+ 141, 17, 28, 110, 159, 141, 21, 232, 13, 90, 130, 251, 177, 168, 242, 201, 222, 138, 182,
+ 233, 142, 229, 24, 47, 186, 56, 245, 177, 250, 253, 2, 11, 115, 29, 6, 156, 168, 117, 22,
+ 15, 152, 183, 137, 25, 188, 24, 22, 120, 195, 17, 97, 16, 85, 234, 95, 53, 156, 244, 146,
+ 53, 183, 235, 71, 24, 163, 139, 70, 227, 235, 154, 229, 210, 144, 81, 231, 161, 120, 117,
+ 182, 245, 175, 25, 252, 21, 153, 130, 211, 180, 209, 164, 34, 248, 167, 8, 98, 181, 69, 52,
+ 74, 120, 227, 165, 16, 172, 42, 107, 248, 42, 225, 46, 80, 11, 117, 92, 225, 27, 86, 4,
+ 226, 29, 85, 105, 208, 193, 120, 112, 39, 226, 20, 141, 2, 29, 0, 186, 229, 13, 141, 5, 89,
+ 173, 164, 148, 130, 205, 229, 23, 44, 125, 234, 49, 240, 196, 213, 6, 31, 233, 8, 99, 80,
+ 166, 239, 2, 130, 1, 0, 106, 152, 3, 177, 77, 235, 201, 25, 36, 150, 146, 246, 50, 67, 97,
+ 96, 245, 207, 14, 200, 60, 16, 229, 114, 211, 111, 193, 226, 252, 153, 176, 159, 198, 41,
+ 133, 157, 197, 38, 112, 217, 9, 205, 13, 85, 170, 94, 89, 60, 214, 117, 182, 163, 81, 138,
+ 122, 250, 48, 98, 43, 60, 186, 203, 147, 60, 74, 110, 89, 216, 73, 4, 191, 1, 158, 174, 98,
+ 201, 184, 25, 162, 239, 244, 139, 154, 173, 108, 135, 124, 166, 152, 88, 237, 68, 145, 252,
+ 33, 40, 237, 57, 53, 155, 215, 56, 12, 202, 22, 225, 7, 89, 24, 245, 195, 164, 36, 172, 98,
+ 26, 115, 10, 71, 27, 21, 255, 62, 212, 202, 71, 147, 229, 6, 181, 19, 107, 136, 223, 239,
+ 164, 243, 254, 101, 208, 122, 226, 150, 17, 251, 218, 85, 169, 81, 177, 7, 190, 171, 230,
+ 26, 149, 183, 181, 113, 140, 252, 212, 172, 154, 200, 118, 69, 156, 108, 144, 11, 201, 135,
+ 175, 19, 201, 116, 9, 80, 20, 19, 89, 151, 198, 204, 253, 10, 155, 101, 159, 81, 190, 174,
+ 58, 220, 250, 220, 212, 42, 111, 33, 204, 114, 7, 30, 153, 73, 248, 209, 114, 36, 225, 6,
+ 47, 106, 45, 226, 254, 175, 201, 138, 254, 121, 184, 19, 143, 48, 67, 179, 99, 250, 189,
+ 237, 58, 249, 194, 167, 149, 162, 219, 27, 53, 67, 135, 193, 204, 253, 176, 245, 2, 211,
+ 58, 176, 69, 14, 186, 3, 130, 1, 5, 0, 2, 130, 1, 0, 97, 40, 15, 97, 210, 23, 118, 85, 75,
+ 191, 251, 126, 171, 47, 188, 57, 40, 41, 85, 48, 206, 169, 253, 233, 146, 161, 39, 232,
+ 242, 19, 219, 191, 172, 82, 78, 132, 153, 238, 120, 228, 99, 199, 197, 181, 74, 191, 123,
+ 189, 80, 203, 219, 50, 184, 193, 49, 160, 9, 41, 167, 133, 33, 151, 52, 196, 61, 29, 102,
+ 233, 163, 249, 121, 248, 55, 144, 215, 55, 89, 142, 137, 249, 67, 112, 167, 42, 255, 67,
+ 56, 179, 106, 187, 79, 87, 54, 118, 186, 154, 48, 150, 204, 222, 102, 135, 254, 202, 9,
+ 166, 229, 176, 130, 37, 174, 139, 240, 43, 134, 75, 141, 35, 163, 203, 71, 153, 217, 71,
+ 181, 79, 35, 114, 55, 124, 20, 55, 110, 112, 223, 109, 239, 183, 210, 141, 59, 88, 47, 40,
+ 167, 154, 90, 99, 250, 146, 29, 226, 10, 70, 103, 246, 209, 36, 174, 177, 164, 244, 126,
+ 153, 106, 156, 92, 143, 140, 46, 49, 184, 125, 160, 246, 145, 178, 94, 11, 153, 128, 59,
+ 210, 11, 210, 42, 3, 138, 136, 147, 115, 96, 190, 68, 128, 25, 47, 26, 231, 183, 247, 89,
+ 28, 67, 220, 235, 88, 4, 228, 140, 148, 10, 98, 104, 101, 60, 115, 39, 219, 183, 111, 62,
+ 93, 133, 141, 219, 252, 51, 66, 224, 115, 158, 85, 46, 13, 171, 31, 5, 210, 83, 68, 61, 92,
+ 87, 241, 1, 215, 144, 233, 243, 68, 238, 197, 62, 54, 68, 163, 117, 48, 115, 48, 29, 6, 3,
+ 85, 29, 14, 4, 22, 4, 20, 153, 40, 244, 111, 22, 53, 83, 33, 46, 24, 242, 81, 89, 121, 91,
+ 97, 190, 144, 138, 150, 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, 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, 31, 6, 3, 85, 29, 35, 4, 24, 48, 22, 128, 20, 230, 93, 24, 66, 42,
+ 224, 216, 63, 210, 30, 74, 173, 48, 16, 195, 8, 166, 231, 232, 253, 48, 9, 6, 7, 42, 134,
+ 72, 206, 56, 4, 3, 3, 63, 0, 48, 60, 2, 28, 50, 39, 36, 45, 25, 91, 93, 174, 107, 192, 215,
+ 113, 214, 88, 122, 108, 97, 82, 121, 182, 191, 182, 66, 173, 207, 255, 17, 86, 2, 28, 28,
+ 133, 69, 48, 198, 204, 39, 177, 136, 73, 222, 95, 114, 218, 219, 54, 88, 17, 114, 204, 214,
+ 83, 20, 137, 75, 203, 163, 99,
+ ]
+ .as_slice();
+ assert!(Hash::from_der_cert(CERT).is_some_and(|hash| match hash {
+ Hash::Sha256(ref sha_hash) => *sha_hash == Sha256::digest(CERT),
+ Hash::Sha384(_) | Hash::Sha512(_) | Hash::Sha224(_) => false,
+ }));
+}
+#[cfg(feature = "runtime")]
+#[derive(Debug)]
+enum E {
+ #[expect(dead_code, reason = "does not matter for tests")]
+ Io(Error),
+ #[expect(dead_code, reason = "does not matter for tests")]
+ Rustls(rustls::Error),
+ #[expect(dead_code, reason = "does not matter for tests")]
+ Postgres(tokio_postgres::Error),
+ NoRootCert,
+ MultipleRootCerts,
+ NoClientKey,
+ MultipleClientKeys,
+ #[expect(dead_code, reason = "does not matter for tests")]
+ RustlsPem(PemErr),
+}
+#[cfg(feature = "runtime")]
+impl From<Error> for E {
+ fn from(value: Error) -> Self {
+ Self::Io(value)
+ }
+}
+#[cfg(feature = "runtime")]
+impl From<rustls::Error> for E {
+ fn from(value: rustls::Error) -> Self {
+ Self::Rustls(value)
+ }
+}
+#[cfg(feature = "runtime")]
+impl From<tokio_postgres::Error> for E {
+ fn from(value: tokio_postgres::Error) -> Self {
+ Self::Postgres(value)
+ }
+}
+#[cfg(feature = "runtime")]
+impl From<PemErr> for E {
+ fn from(value: PemErr) -> Self {
+ Self::RustlsPem(value)
+ }
+}
+#[cfg(feature = "runtime")]
+#[ignore = "requires proper setup and I/O"]
+#[test]
+fn mutual_tls() -> Result<(), E> {
+ let root_cert_file = fs::read("test_data/ca.crt.pem")?;
+ let mut cert_iter = CertificateDer::pem_slice_iter(root_cert_file.as_slice());
+ let key_file = fs::read("test_data/client.key.pem")?;
+ let mut key_iter = PrivateKeyDer::pem_slice_iter(key_file.as_slice());
+ let mut conf = ClientConfig::builder_with_protocol_versions([&TLS13].as_slice())
+ .with_root_certificates(cert_iter.next().ok_or_else(|| E::NoRootCert).and_then(
+ |cert_res| {
+ cert_res.map_err(E::RustlsPem).and_then(|cert| {
+ cert_iter.next().map_or_else(
+ || {
+ let mut root_store = RootCertStore::empty();
+ root_store.add(cert).map_err(E::Rustls).map(|()| root_store)
+ },
+ |_| Err(E::MultipleRootCerts),
+ )
+ })
+ },
+ )?)
+ .with_client_auth_cert(
+ CertificateDer::pem_slice_iter(fs::read("test_data/client.crt.pem")?.as_slice())
+ .try_fold(Vec::with_capacity(1), |mut certs, res| {
+ res.map(|cert| {
+ certs.push(cert);
+ certs
+ })
+ })?,
+ key_iter
+ .next()
+ .ok_or_else(|| E::NoClientKey)
+ .and_then(|key_res| {
+ key_res.map_err(E::RustlsPem).and_then(|key| {
+ key_iter
+ .next()
+ .map_or_else(|| Ok(key), |_| Err(E::MultipleClientKeys))
+ })
+ })?,
+ )?;
+ super::set_postgresql_alpn(&mut conf);
+ let mut config = Config::new();
+ let connection = config
+ .application_name("test")
+ .channel_binding(ChannelBinding::Disable)
+ .connect_timeout(Duration::from_secs(4))
+ .dbname(fs::read_to_string("test_data/dbname")?.trim_ascii_end())
+ .host(fs::read_to_string("test_data/host")?.trim_ascii_end())
+ .hostaddr(IpAddr::V6(Ipv6Addr::LOCALHOST))
+ .keepalives(false)
+ .load_balance_hosts(LoadBalanceHosts::Disable)
+ .port(5432)
+ .ssl_mode(SslMode::Require)
+ .target_session_attrs(TargetSessionAttrs::Any)
+ .user(fs::read_to_string("test_data/user")?.trim_ascii_end())
+ .connect(MakeTlsConnector::new(Arc::new(conf).into()));
+ Builder::new_current_thread()
+ .enable_all()
+ .build()?
+ .block_on(async move { connection.await.map_err(E::Postgres).map(|_| ()) })
+}
+#[cfg(feature = "runtime")]
+#[ignore = "requires proper setup and I/O"]
+#[test]
+fn password_and_channel_binding() -> Result<(), E> {
+ let root_cert_file = fs::read("test_data/ca.crt.pem")?;
+ let mut cert_iter = CertificateDer::pem_slice_iter(root_cert_file.as_slice());
+ let mut conf = ClientConfig::builder_with_protocol_versions([&TLS13].as_slice())
+ .with_root_certificates(cert_iter.next().ok_or_else(|| E::NoRootCert).and_then(
+ |cert_res| {
+ cert_res.map_err(E::RustlsPem).and_then(|cert| {
+ cert_iter.next().map_or_else(
+ || {
+ let mut root_store = RootCertStore::empty();
+ root_store.add(cert).map_err(E::Rustls).map(|()| root_store)
+ },
+ |_| Err(E::MultipleRootCerts),
+ )
+ })
+ },
+ )?)
+ .with_no_client_auth();
+ super::set_postgresql_alpn(&mut conf);
+ let mut config = Config::new();
+ let connection = config
+ .application_name("test")
+ .channel_binding(ChannelBinding::Require)
+ .connect_timeout(Duration::from_secs(4))
+ .dbname(fs::read_to_string("test_data/dbname")?.trim_ascii_end())
+ .host(fs::read_to_string("test_data/host")?.trim_ascii_end())
+ .hostaddr(IpAddr::V6(Ipv6Addr::LOCALHOST))
+ .keepalives(false)
+ .load_balance_hosts(LoadBalanceHosts::Disable)
+ .password(fs::read("test_data/password")?.trim_ascii_end())
+ .port(5432)
+ .ssl_mode(SslMode::Require)
+ .target_session_attrs(TargetSessionAttrs::Any)
+ .user(fs::read_to_string("test_data/user")?.trim_ascii_end())
+ .connect(MakeTlsConnector::new(Arc::new(conf).into()));
+ Builder::new_current_thread()
+ .enable_all()
+ .build()?
+ .block_on(async move { connection.await.map_err(E::Postgres).map(|_| ()) })
+}