Skip to content
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