Skip to content

Update to mbedtls-sys 2.28, update test keys, and make sure async tests are run #225

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Mar 15, 2023
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions ct.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ if [ $TRAVIS_RUST_VERSION = "stable" ] || [ $TRAVIS_RUST_VERSION = "beta" ] || [
cargo test --features pkcs12_rc2
cargo test --features force_aesni_support
cargo test --features dsa
# without these, tests marked with tokio::test do not run, but report OK.
cargo test --features=std,threading,tokio,tokio/net,tokio/io-util,tokio/macros,tokio/rt

elif [ $TRAVIS_RUST_VERSION = $CORE_IO_NIGHTLY ]; then
cargo +$CORE_IO_NIGHTLY test --no-default-features --features core_io,rdrand,time,custom_time,custom_gmtime_r
Expand Down
4 changes: 2 additions & 2 deletions mbedtls/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ tokio = { version = "0.3", optional = true }
rs-libc = "0.1.0"

[dependencies.mbedtls-sys-auto]
version = "2.25.2"
version = "2.28.0"
default-features = false
features = ["custom_printf", "trusted_cert_callback"]

Expand Down Expand Up @@ -92,7 +92,7 @@ required-features = ["std"]
[[test]]
name = "async_session"
path = "tests/async_session.rs"
required-features = ["std", "threading", "tokio", "tokio/net", "tokio/io-util", "tokio/macros"]
required-features = ["std", "threading", "tokio", "tokio/net", "tokio/io-util", "tokio/macros", "tokio/rt"]

[[test]]
name = "client_server"
Expand Down
2 changes: 1 addition & 1 deletion mbedtls/src/bignum/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ impl Mpi {
mpi_write_string(
&self.inner,
radix,
buf.as_mut_ptr() as *mut i8,
buf.as_mut_ptr() as *mut _,
buf.len(),
&mut olen,
)
Expand Down
40 changes: 26 additions & 14 deletions mbedtls/src/pk/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ extern "C" fn alloc_custom_pk_ctx() -> *mut c_void {
}

unsafe extern "C" fn free_custom_pk_ctx(p: *mut c_void) {
Box::from_raw(p as *mut CustomPkContext);
let _ = Box::from_raw(p as *mut CustomPkContext);
}

extern "C" fn custom_pk_can_do(_t: u32) -> i32 {
Expand All @@ -129,7 +129,7 @@ const CUSTOM_PK_INFO: pk_info_t = {
sign_func: None,
verify_func: None,
get_bitlen: None,
name: b"\0" as *const u8 as *const i8,
name: b"\0" as *const u8 as *const _,
ctx_alloc_func: Some(alloc_custom_pk_ctx),
ctx_free_func: Some(free_custom_pk_ctx),
}
Expand Down Expand Up @@ -953,7 +953,7 @@ impl Pk {
#[cfg(test)]
mod tests {
use super::*;
use crate::hash::Type;
use crate::hash::{Type, MdInfo};
use crate::pk::Type as PkType;

// This is test data that must match library output *exactly*
Expand Down Expand Up @@ -1155,7 +1155,7 @@ iy6KC991zzvaWY/Ys+q/84Afqa+0qJKQnPuy/7F5GkVdQA/lfbhi
fn rsa_sign_verify_pkcs1v15() {
let mut pk =
Pk::generate_rsa(&mut crate::test_support::rand::test_rng(), 2048, 0x10001).unwrap();
let data = b"SIGNATURE TEST SIGNATURE TEST SI";
let data = b"SIGNATURE TEST SIGNATURE TEST SIGNATURE TEST SIGNATURE TEST SIGN";
let mut signature = vec![0u8; (pk.len() + 7) / 8];

let digests = [
Expand All @@ -1171,24 +1171,30 @@ iy6KC991zzvaWY/Ys+q/84Afqa+0qJKQnPuy/7F5GkVdQA/lfbhi
Type::Ripemd,
];

for digest in &digests {
for &digest in &digests {
let data = if let Some(md @ MdInfo { .. }) = digest.into() {
&data[..md.size()]
} else {
&data[..]
};

let len = pk
.sign(
*digest,
digest,
data,
&mut signature,
&mut crate::test_support::rand::test_rng(),
)
.unwrap();
pk.verify(*digest, data, &signature[0..len]).unwrap();
pk.verify(digest, data, &signature[0..len]).unwrap();
}
}

#[test]
fn rsa_sign_verify_pss() {
let mut pk =
Pk::generate_rsa(&mut crate::test_support::rand::test_rng(), 2048, 0x10001).unwrap();
let data = b"SIGNATURE TEST SIGNATURE TEST SI";
let data = b"SIGNATURE TEST SIGNATURE TEST SIGNATURE TEST SIGNATURE TEST SIGN";
let mut signature = vec![0u8; (pk.len() + 7) / 8];

let digests = [
Expand All @@ -1204,15 +1210,21 @@ iy6KC991zzvaWY/Ys+q/84Afqa+0qJKQnPuy/7F5GkVdQA/lfbhi
Type::Ripemd,
];

for digest in &digests {
for &digest in &digests {
let data = if let Some(md @ MdInfo { .. }) = digest.into() {
&data[..md.size()]
} else {
&data[..]
};

pk.set_options(Options::Rsa {
padding: RsaPadding::Pkcs1V21 { mgf: *digest },
padding: RsaPadding::Pkcs1V21 { mgf: digest },
});

if *digest == Type::None {
if digest == Type::None {
assert!(pk
.sign(
*digest,
digest,
data,
&mut signature,
&mut crate::test_support::rand::test_rng()
Expand All @@ -1221,13 +1233,13 @@ iy6KC991zzvaWY/Ys+q/84Afqa+0qJKQnPuy/7F5GkVdQA/lfbhi
} else {
let len = pk
.sign(
*digest,
digest,
data,
&mut signature,
&mut crate::test_support::rand::test_rng(),
)
.unwrap();
pk.verify(*digest, data, &signature[0..len]).unwrap();
pk.verify(digest, data, &signature[0..len]).unwrap();
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions mbedtls/src/pkcs12/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,7 @@ impl BERDecodable for EncryptedData {

// EncryptedContentInfo from PKCS7 see RFC 2315 section 10.1
#[derive(Debug, Clone)]
#[allow(dead_code)]
struct EncryptedContentInfo {
content_type: ObjectIdentifier,
encryption_algo: AlgorithmIdentifier,
Expand Down Expand Up @@ -458,6 +459,7 @@ enum Pkcs12BagSet {
}

#[derive(Debug, Clone)]
#[allow(dead_code)]
struct SafeBag {
bag_id: ObjectIdentifier,
bag_value: Pkcs12BagSet,
Expand Down
3 changes: 3 additions & 0 deletions mbedtls/src/ssl/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ use crate::ssl::context::HandshakeContext;
use crate::ssl::ticket::TicketCallback;
use crate::x509::{certificate, Crl, LinkedCertificate, Profile, VerifyError};

#[cfg(not(feature = "std"))]
use crate::alloc_prelude::*;

extern "C" {
fn calloc(n: usize, size: usize) -> *mut c_void;
fn free(ptr: *mut c_void);
Expand Down
8 changes: 5 additions & 3 deletions mbedtls/src/x509/certificate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -940,17 +940,19 @@ cYp0bH/RcPTC0Z+ZaqSWMtfxRrk63MJQF9EXpDCdvQRcTMD9D85DJrMKn8aumq0M
let mut c_int2 = Certificate::from_pem(C_INT2.as_bytes()).unwrap();
let mut c_root = Certificate::from_pem(C_ROOT.as_bytes()).unwrap();

let mut err_str = String::new();
{
let mut chain = List::from(&mut c_leaf);
chain.push_back(&mut c_int1);

// incomplete chain
let err = LinkedCertificate::verify((&mut chain).into(), &mut c_root, None).unwrap_err();
assert_eq!(err, Error::X509CertVerifyFailed);
let res = LinkedCertificate::verify((&mut chain).into(), &mut c_root, Some(&mut err_str));
assert_eq!(res, Err(Error::X509CertVerifyFailed), "{}", err_str);

// try again after fixing the chain
chain.push_back(&mut c_int2);
LinkedCertificate::verify((&mut chain).into(), &mut c_root, None).unwrap();
let res = LinkedCertificate::verify((&mut chain).into(), &mut c_root, Some(&mut err_str));
assert_eq!(res, Ok(()), "{}", err_str);
}

#[cfg(feature = "std")]
Expand Down
2 changes: 0 additions & 2 deletions mbedtls/src/x509/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ pub use self::profile::Profile;
use mbedtls_sys::*;
use mbedtls_sys::types::raw_types::c_uint;
bitflags! {
#[doc(inline)]
pub struct KeyUsage: c_uint {
const DIGITAL_SIGNATURE = X509_KU_DIGITAL_SIGNATURE as c_uint;
const NON_REPUDIATION = X509_KU_NON_REPUDIATION as c_uint;
Expand All @@ -43,7 +42,6 @@ bitflags! {
}

bitflags! {
#[doc(inline)]
pub struct VerifyError: u32 {
const CERT_BAD_KEY = X509_BADCERT_BAD_KEY as u32;
const CERT_BAD_MD = X509_BADCERT_BAD_MD as u32;
Expand Down
5 changes: 4 additions & 1 deletion mbedtls/tests/alpn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
extern crate mbedtls;

use std::net::TcpStream;
use std::thread;

use mbedtls::pk::Pk;
use mbedtls::rng::CtrDrbg;
Expand Down Expand Up @@ -83,8 +82,10 @@ fn server(mut conn: TcpStream, alpn_list: Option<&[&str]>, expected: Expected<'_
Ok(())
}

#[cfg(unix)]
#[test]
fn alpn() {
use std::thread;
#[derive(Clone)]
struct TestConfig {
client_list: Option<&'static [&'static str]>,
Expand Down Expand Up @@ -119,8 +120,10 @@ fn alpn() {
}
}

#[cfg(unix)]
#[test]
fn nothing_in_common() {
use std::thread;
let (c, s) = support::net::create_tcp_pair().unwrap();
let c = thread::spawn(move || client(c, Some(&["a1\0", "a2\0"]), Expected::FailedHandshake(Error::SslFatalAlertMessage)).unwrap());
let s = thread::spawn(move || server(s, Some(&["b1\0", "b2\0"]), Expected::FailedHandshake(Error::SslBadHsClientHello)).unwrap());
Expand Down
64 changes: 26 additions & 38 deletions mbedtls/tests/data/chain-int1.crt
Original file line number Diff line number Diff line change
@@ -1,39 +1,27 @@
-----BEGIN CERTIFICATE-----
MIIGzzCCBLegAwIBAgIQZoWHPbepRCfYecs3K24LwjANBgkqhkiG9w0BAQsFADBg
MQswCQYDVQQGEwJOTDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMTEw
LwYDVQQDDChTdGFhdCBkZXIgTmVkZXJsYW5kZW4gRVYgSW50ZXJtZWRpYWlyIENB
MB4XDTE1MDMwNTAwMDAwMFoXDTIyMTIwNTIzNTk1OVowUjELMAkGA1UEBhMCTkwx
HjAcBgNVBAoMFVF1b1ZhZGlzIFRydXN0bGluayBCVjEjMCEGA1UEAwwaUXVvVmFk
aXMgUEtJb3ZlcmhlaWQgRVYgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
AoICAQDbVZ64lpUM4W3Y99gDgvHNhmKSbILLYyLJ1Aws+DklXLkTnrjYhe1tZ6ev
q+mf7Q9K+kHmbi85g02yGgGD1/6NRs1PePkykoZ7NbZysLvemGcBAG1Qu1xM7V5g
Xu4iXJNr2MWQ03ey8l4UeKIlPLXlNNBR9y5+eD2p66oXIzxs9oglIt/lfazMpgBv
OfYjwRY6ZwVIkCga1QM7HaafTKKBXY6dF9NlkMbEjMLr4ZtkmD11lHIAeTWi+nDA
QlPp7m1CcPcNhgs0EfHUZ16uxyMysEFncdIuGxdLPYBM92/Dk0Fdf6IKZJ/DUHg9
Rxk1nU5Lg/hAy+IDw39Ph90XOIQNVL/FY3dNijwvrSOOw1GOc+nBPsgwakq12FMK
3KPZePpiSvz4cExS+UkAoKL+R6m9t5Y5R/iyyP0vUqiHwzwS0d0EICORfIBuc/5h
KqPoGiMkDdAHDLW7sryMHxow8jHrtKX4AKhYOYLx8+ICQVPVlESiZJmBpQpeFCCX
lNV8KYLOlzLlToK3jQnYEJHYSBAyMxw8qOrUBeAeUVGEKWGiEExV1QvINqY2Je8/
sGzxCTywh7U6eanhk3kBSjm7XEtUaZRgWESu8XT/2Prx8nwo7Qg2ceZt7GyFoRC3
lkjninibjU/FVLNxVDzoJWVluwMLfQ/q/e8Ypqv2qA7PeG14yQIDAQABo4IBkTCC
AY0wEgYDVR0TAQH/BAgwBgEB/wIBADBGBgNVHR8EPzA9MDugOaA3hjVodHRwOi8v
Y3JsLnBraW92ZXJoZWlkLm5sL0VWSW50ZXJtZWRpYWlyTGF0ZXN0Q1JMLmNybDAO
BgNVHQ8BAf8EBAMCAQYwQAYDVR0gBDkwNzA1BglghBABh2sBAgcwKDAmBggrBgEF
BQcCARYaaHR0cHM6Ly9jcHMucGtpb3ZlcmhlaWQubmwwHQYDVR0OBBYEFJT/524L
qW/j4ZFZyghezbfFCDxpMB8GA1UdIwQYMBaAFCWA69ifpsMRQTfHeFmIHmnvsdPq
MCcGA1UdJQQgMB4GCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwkwdAYIKwYB
BQUHAQEEaDBmMCYGCCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2lvdmVyaGVpZC5u
bDA8BggrBgEFBQcwAoYwaHR0cHM6Ly9jZXJ0LnBraW92ZXJoZWlkLm5sL0VWSW50
ZXJtZWRpYWlyQ0EuY2VyMA0GCSqGSIb3DQEBCwUAA4ICAQBG13UeK3Vqtf6oKaKq
rWB4eq/vW0cXwwha4dt/pZvbctUIVh8bmI7MUG3Y+aRijIGX9VVRFcHHtZpf3agl
mmTC0A81m9OdS7E4fOeDNkobQVbn1QIf/w4sY+IWL+lz0Zz+WYYI6t0HdbKB+lM2
PqQ+gyn59z5D6Y9dH4Ad5PTGSIMb/KBuYtIjybOEs2ojSkjQjY+gP+FWQ4sT23Bx
5krw9DfQ0P7AYqiiwJxeUJQakJnVKGPvi+klNo8Bz8pRcNIlcKeP8rcThtSlc2Pq
S0HnUdPMh2xMXLz2a86D5CUIePQ8bUFlHcDD/ZbkOwlS7b32Ir9VlFTcGislMew+
FcfI9HSxxDDUIgvYoidUCfNTGtdlm5BrrojsWlbHmqkeIZjw2cAot7TBx2HPOht6
x7F1nqYu67hgkaKkSPzcmpPPxJm4Zij4sAtlWbkbm4go51II3llIyYZ9oU14lwnh
majXgGrGjne8ImxgwDwiRGC9ncLOaecRiJ8N4yFvQagHh0wjAybA5de5BdgleTht
8TtMnGOu0nrokTg3mxTl6M/X6E2lX/5SCW3aDpUvZxdDxr3K+OeueN3qRXAMG3dm
3IjbWjDBFOP7sARzw7Mh9OjqOWhuZyBpFrw+WsNp76RiOuhKrowBv2GrdP1ISC4h
K9QIuNKeITRwULvrY75Z565vAg==
-----END CERTIFICATE-----
MIIEkjCCA3qgAwIBAgITBn+USionzfP6wq4rAfkI7rnExjANBgkqhkiG9w0BAQsF
ADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNj
b3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4x
OzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1
dGhvcml0eSAtIEcyMB4XDTE1MDUyNTEyMDAwMFoXDTM3MTIzMTAxMDAwMFowOTEL
MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6
VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L
93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm
jgSubJrIqg0CAwEAAaOCATEwggEtMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
BAQDAgGGMB0GA1UdDgQWBBSEGMyFNOy8DJSULghZnMeyEE4KCDAfBgNVHSMEGDAW
gBScXwDfqgHXMCs4iKK4bUqc8hGRgzB4BggrBgEFBQcBAQRsMGowLgYIKwYBBQUH
MAGGImh0dHA6Ly9vY3NwLnJvb3RnMi5hbWF6b250cnVzdC5jb20wOAYIKwYBBQUH
MAKGLGh0dHA6Ly9jcnQucm9vdGcyLmFtYXpvbnRydXN0LmNvbS9yb290ZzIuY2Vy
MD0GA1UdHwQ2MDQwMqAwoC6GLGh0dHA6Ly9jcmwucm9vdGcyLmFtYXpvbnRydXN0
LmNvbS9yb290ZzIuY3JsMBEGA1UdIAQKMAgwBgYEVR0gADANBgkqhkiG9w0BAQsF
AAOCAQEAYjdCXLwQtT6LLOkMm2xF4gcAevnFWAu5CIw+7bMlPLVvUOTNNWqnkzSW
MiGpSESrnO09tKpzbeR/FoCJbM8oAxiDR3mjEH4wW6w7sGDgd9QIpuEdfF7Au/ma
eyKdpwAJfqxGF4PcnCZXmTA5YpaP7dreqsXMGz7KQ2hsVxa81Q4gLv7/wmpdLqBK
bRRYh5TmOTFffHPLkIhqhBGWJ6bt2YFGpn6jcgAKUj6DiAdjd4lpFw85hdKrCEVN
0FE6/V1dN2RMfjCyVSRCnTawXZwXgWHxyvkQAiSr6w10kY17RSlQOYiypok1JR4U
akcjMS9cmvqtmg5iUaQqqcT5NJ0hGA==
-----END CERTIFICATE-----
62 changes: 25 additions & 37 deletions mbedtls/tests/data/chain-int2.crt
Original file line number Diff line number Diff line change
@@ -1,38 +1,26 @@
-----BEGIN CERTIFICATE-----
MIIGtjCCBJ6gAwIBAgIEAJiY6DANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO
TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh
dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xNDAyMjcxMDEzMzNaFw0y
MjEyMDYyMzAwMDBaMGAxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg
TmVkZXJsYW5kZW4xMTAvBgNVBAMMKFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBJ
bnRlcm1lZGlhaXIgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC5
Rzy6N7i3d9dae5wh792y9H+4DvtSgoZFO9PdtH+EXv1eGzfSmibssm+Z/azvJCSe
6UsfgCJDuznSHJs65he19XqqsOEnZtmlpb1YzHIKYLQs6KNoh2Nlfhl8X1KTrmNl
so19ltcC26uqzERSKe+poM20JOjItX3UHacawphbHSvRDg9ksMyw9v3RHim2hZUu
AaPNRnKI0QHIdF3cNldy7h/qY7tZj5FDKOSyz3Yl0bt/3XgzUoEQqq6SZZcqvgLN
41gsretJvEoTmg1pZ2LLrhVFLaGwW3NWZ139NVsw2Vc/6gX9t7FRkJZIu21C9o6x
EC2agJ98DjvDqJ6tpqdmmpbZYnRijAHApDYcdqiOOeJjshO0MU3Qr0T6fOdFeEgC
2MuTGrFmgqWuOM89zh6MTa5dGlpAY1cdAY114BsFxzbSgylhE2PowjHWt9qZDBP+
mFR0sY0KWJfKHUPAoNdlQpsuQxBaqIKYPzVrpBKAbKRt2ieHWh+oN2ml552Fj/Db
naTN7eg9WxZkaRYkXIBFHBlcI6VRD5od7DwFE72Tg3kdKY76DPE7GJqoJOWRtAPd
n0h2qTjWDZlb/Vi2GfAFlKwbv/NEBcPOxZvT1cX6U+QjJNfxxpl+tDhSKcJC0nQS
gRgaWIdthEB7p95mHCnd+aPyaxr7THNWnrunmcgeCQIDAQABo4IBfjCCAXowDwYD
VR0TAQH/BAUwAwEB/zBABgNVHSAEOTA3MDUGCWCEEAGHawECBzAoMCYGCCsGAQUF
BwIBFhpodHRwczovL2Nwcy5wa2lvdmVyaGVpZC5ubDAiBgNVHREEGzAZpBcwFTET
MBEGA1UEAwwKUEtJbzQwOTYtMTBxBggrBgEFBQcBAQRlMGMwLAYIKwYBBQUHMAGG
IGh0dHA6Ly9ldnJvb3RvY3NwLnBraW92ZXJoZWlkLm5sMDMGCCsGAQUFBzAChido
dHRwOi8vY2VydC5wa2lvdmVyaGVpZC5ubC9FVlJvb3RDQS5jZXIwDgYDVR0PAQH/
BAQDAgEGMB8GA1UdIwQYMBaAFP6rAJCYniT8qcwaivsnuL8wbqg7MD4GA1UdHwQ3
MDUwM6AxoC+GLWh0dHA6Ly9jcmwucGtpb3ZlcmhlaWQubmwvRVZSb290TGF0ZXN0
Q1JMLmNybDAdBgNVHQ4EFgQUJYDr2J+mwxFBN8d4WYgeae+x0+owDQYJKoZIhvcN
AQELBQADggIBADBPL5cBEhj13IZtpnvYecm6p+vyfDKElr5zsIcodEp3NPNQp3Jr
Hu0gO7Kend+bLK9TbP+SSEnqrDzA+2shxvrPbYu1K/5z7T2AVpegXJ/RlXIijU5H
MJB3njUik533OSQmHVp9M0ukMGTbkqeG11vH3l0TvF5IstSXebwXc2882B5LcVSw
mJsDNNb6OlIBZcOJ8YosHg/68fgSmYYBvfzqCXTpHQxrYJY54JSauudrgMYE1dFw
Fcx9qAl9uCsRF3MqkccNfIlp04fPc25CysKYrRH68bbMSa89Y40Pbm0U8T+wWXa9
NuH4a1WMdC96cQRnKlKbtxqeaCC+0timmFwFrkzj7Umg8DTNMfWHQL2ZquHJpeL5
RrvhBoG5DyWGnmPJIMwEvLyT6rmMHzvbeJRqyGZ/WCOWPUheH4YL3TElhNOww/H8
toqa0ywsdQN9vQJHla6ZpIFYFhU+TBFleTznoqXAAcuq6uElZq2eT9pQuYtezcTw
vBbcuO/Rg1/MaaCW3wg4MlJ8mOpKk8i/pWNqQ87yCbfKNbJtmlqVDslhugKYTqGy
1yj/aNVFFpI4gbEUXFC7qiu3pQK3tX77Fx66dK8S+Ni8HuaUVfIXJD15durfhGe0
RpNCkC7QKfTKpoXoS8wr26lvWCCPtghUMuXUzRvqKm7aF0JepBqDK9x/
-----END CERTIFICATE-----
MIIEdTCCA12gAwIBAgIJAKcOSkw0grd/MA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV
BAYTAlVTMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTIw
MAYDVQQLEylTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
eTAeFw0wOTA5MDIwMDAwMDBaFw0zNDA2MjgxNzM5MTZaMIGYMQswCQYDVQQGEwJV
UzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UE
ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjE7MDkGA1UEAxMyU3RhcmZp
ZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVDDrEKvlO4vW+GZdfjohTsR8/
y8+fIBNtKTrID30892t2OGPZNmCom15cAICyL1l/9of5JUOG52kbUpqQ4XHj2C0N
Tm/2yEnZtvMaVq4rtnQU68/7JuMauh2WLmo7WJSJR1b/JaCTcFOD2oR0FMNnngRo
Ot+OQFodSk7PQ5E751bWAHDLUu57fa4657wx+UX2wmDPE1kCK4DMNEffud6QZW0C
zyyRpqbn3oUYSXxmTqM6bam17jQuug0DuDPfR+uxa40l2ZvOgdFFRjKWcIfeAg5J
Q4W2bHO7ZOphQazJ1FTfhy/HIrImzJ9ZVGif/L4qL8RVHHVAYBeFAlU5i38FAgMB
AAGjgfAwge0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0O
BBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMB8GA1UdIwQYMBaAFL9ft9HO3R+G9FtV
rNzXEMIOqYjnME8GCCsGAQUFBwEBBEMwQTAcBggrBgEFBQcwAYYQaHR0cDovL28u
c3MyLnVzLzAhBggrBgEFBQcwAoYVaHR0cDovL3guc3MyLnVzL3guY2VyMCYGA1Ud
HwQfMB0wG6AZoBeGFWh0dHA6Ly9zLnNzMi51cy9yLmNybDARBgNVHSAECjAIMAYG
BFUdIAAwDQYJKoZIhvcNAQELBQADggEBACMd44pXyn3pF3lM8R5V/cxTbj5HD9/G
VfKyBDbtgB9TxF00KGu+x1X8Z+rLP3+QsjPNG1gQggL4+C/1E2DUBc7xgQjB3ad1
l08YuW3e95ORCLp+QCztweq7dp4zBncdDQh/U90bZKuCJ/Fp1U1ervShw3WnWEQt
8jxwmKy6abaVd38PMV4s/KCHOkdp8Hlf9BRUpJVeEXgSYCfOn8J3/yNTd126/+pZ
59vPr5KW7ySaNRB6nJHGDn2Z9j8Z3/VyVOEVqQdZe4O/Ui5GjLIAZHYcSNPYeehu
VsyuLAOQ1xk4meTKCRlb/weWsKh/NEnfVqn3sF/tM+2MR7cwA130A4w=
-----END CERTIFICATE-----
Loading