diff --git a/src/keytypes/asymmetric.rs b/src/keytypes/asymmetric.rs index ab6dc70..04f1a81 100644 --- a/src/keytypes/asymmetric.rs +++ b/src/keytypes/asymmetric.rs @@ -120,7 +120,7 @@ impl RestrictableKeyType for Asymmetric { #[cfg(test)] mod tests { - use crate::keytypes::{AsymmetricRestriction, User}; + use crate::keytypes::{Asymmetric, AsymmetricRestriction, User}; use crate::tests::utils; use crate::KeyRestriction; @@ -179,4 +179,67 @@ mod tests { assert_eq!(restriction.restriction(), expected.as_ref()); } } + + #[test] + fn test_restrict_keyring_chain() { + let mut keyring = utils::new_test_keyring(); + + // Create and populate a keyring for root certificates. + let mut root = keyring.add_keyring("root-certs").unwrap(); + let root1_certificate = &include_bytes!("data/ca/ca-1.root.crt")[..]; + let root2_certificate = &include_bytes!("data/ca/ca-2.root.crt")[..]; + root.add_key::("root1", root1_certificate) + .unwrap(); + root.add_key::("root1", root2_certificate) + .unwrap(); + + // Create a keyring to restrict. + let mut chain = keyring.add_keyring("chain").unwrap(); + let restriction = AsymmetricRestriction::Keyring { + keyring: root, + chained: true, + }; + chain + .restrict_by_type::(restriction) + .unwrap(); + + // Add certificates in order. + let intermediate_a = &include_bytes!("data/ca/ca.intermediate.crt")[..]; + chain + .add_key::("intermediate_a", intermediate_a) + .unwrap(); + let intermediate_b = &include_bytes!("data/ca/intermediate.term.crt")[..]; + chain + .add_key::("intermediate_b", intermediate_b) + .unwrap(); + let terminal = &include_bytes!("data/ca/ca-1.term.crt")[..]; + chain + .add_key::("terminal", terminal) + .unwrap(); + } + + #[test] + fn test_restrict_keyring_fail() { + let mut keyring = utils::new_test_keyring(); + + // Create and populate a keyring for root certificates. + let root = keyring.add_keyring("root-certs").unwrap(); + + // Create a keyring to restrict. + let mut chain = keyring.add_keyring("chain").unwrap(); + let restriction = AsymmetricRestriction::Keyring { + keyring: root, + chained: true, + }; + chain + .restrict_by_type::(restriction) + .unwrap(); + + // Add certificates in order. + let terminal = &include_bytes!("data/ca/self.term.crt")[..]; + let err = chain + .add_key::("self", terminal) + .unwrap_err(); + assert_eq!(err, errno::Errno(libc::EINVAL)); + } } diff --git a/src/keytypes/data/ca/ca-1.root.crt b/src/keytypes/data/ca/ca-1.root.crt new file mode 100644 index 0000000..31813d2 --- /dev/null +++ b/src/keytypes/data/ca/ca-1.root.crt @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFMTCCAxmgAwIBAgIUKDx8JFc/v0TROzTp0HeNRYiCy6UwDQYJKoZIhvcNAQEL +BQAwIDEeMBwGA1UEAwwVcnVzdC1rZXl1dGlscyBDQSBjYS0xMB4XDTIwMDkyNzAz +MjA0OFoXDTIwMTAyNzAzMjA0OFowIDEeMBwGA1UEAwwVcnVzdC1rZXl1dGlscyBD +QSBjYS0xMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwBzF3e1wH764 +67xbEuyXNRxvVo3O8YPcTPKUhI9RmxsqqxeJ8e6grTou4Msfwm168ZYLDbjDugK7 +XzBqcgIJol8pYGXAq7NoBVwBTSmlG2Pfvb6bp1Fj450Vx5LRH+4gpWLoBY8m3bNC +qw6AytXYscQ2dLoRiMDoZHFurQRCc/4sSTDP2Minxb5xOGx8fVLzzi3lOJEMNqao +wmvFo9kRE9snx4mbY3G+wlApoLFbn7kEYmkuHPgsIsWiyBzPLD5qSxWTDy2tvhFi +FUzg58UWebTXzJQ3c/iZfPUNab2rZ47aX94mPCahr+QKNZUkbBrgEEUY0qVJbNIL +6ccZD9TxXn9tNf37B3GMG82XCl1/7PecQNKrN7d4My9ekLsr7iye7hXXftq9qYdn +2TnS2SwZ+wwANnfY62MR0g2yVpAgwXVKBbUKJeZOpsEdK6p6KuAvufMyB7LKIEp3 +ryruhUP1z05L/3J8VK6bHA48e3iuSAP6j0HlwGX1Hm4FRqgoY81k5nDmtAjvFKdQ +ojWxttTmNbeoqRNzehd2Ty395G91xB7PppQChrf3nPiekHn9nXmEC4JDuLq71IK0 +mHXJakr4PgOLPsu+BVvqU78Uoun0BnI4K7ZMVEY0uI3rtc1CtBkLCFv6HxYahEsM +sVtRVCytYvQXKzUTnc00rVflb36Xr4UCAwEAAaNjMGEwHQYDVR0OBBYEFIUjgvlF +3KwlVXh1PwFV8674VBOKMB8GA1UdIwQYMBaAFIUjgvlF3KwlVXh1PwFV8674VBOK +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUA +A4ICAQC44VteLwJyAHJxL9/em9moSZD5+wenqgYnb24bKst2l93ALp89Ap2nNXI1 +eVM6c2xhngurYya7j8rIq+i6i6fZdoZa9krIhqg7ADEekJL/tpQuRTV8aVJo/hq4 +EXDgELhk5yeOtAgedsiVahOpsjfwy4k2UQRl2Bbj6I0cs/qn3u/gsYRGsBUneW0q +4R4Ez1zPt7dC53XN7coTcuMVb+Jmy5lyYbsZGlw4jGSawgE09TsUXIMJF0MYbAtA +N34Ny/Tz576bfPiz4gITQyPsooTaZ21DpW01BS15G3LeBPj53JrUAHR92+iDYREO +r85Z79EBeXTUc7EUlADBl0cj+lZuXCn8ksPhOj4TXctCkPiYsDGlvJHNIHPC5MZ0 +upsd76YLlhQxsYVY2ElTR5k2bSTqSQaMV7bK5aZG4mPScwqCBwtgEKR44obqjYHx +TqEh5lqZxoYbcCozYl9f1eSINOZ9r8grOHXMACGuVjLDtR3Wd2V2ps1JTQyGPpki +F1i/bhC9vLla2ibDtDgqKER63nEvB3Vq6Tc7Xt6BWsnuhXrLItFkCkvuFffn3B0o +xf9QX4mnu+5dvVhZNeZTIfsLEngBfy2IUsr122jL39ja3qSM/Si4/deTU6hnGHTv +duXtpmDDFQELs3TgEy2GgJXj+0sEV7av+PsLae3AH+Mb6KmrZg== +-----END CERTIFICATE----- diff --git a/src/keytypes/data/ca/ca-1.term.crt b/src/keytypes/data/ca/ca-1.term.crt new file mode 100644 index 0000000..a9444f6 --- /dev/null +++ b/src/keytypes/data/ca/ca-1.term.crt @@ -0,0 +1,27 @@ +-----BEGIN CERTIFICATE----- +MIIElTCCAn0CAhACMA0GCSqGSIb3DQEBDQUAMCAxHjAcBgNVBAMMFXJ1c3Qta2V5 +dXRpbHMgQ0EgY2EtMTAeFw0yMDA5MjcwMzIwNTFaFw0zMDA5MjUwMzIwNTFaMAAw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDQ9O9x7DL96hE5g+vFtBmM +pVrJMOPkM2+Dez0oEGpWvg+RtMO+CyQoGxUPI2sr3eqftEGjRUV2kMItN/Rn9FV7 +UVmaURW2kzQvZT3tQn2nGegAKTrB+tGsuAaATgXGoCC+OadtGg7FiOkOvu3oXvHc +XyA1Nnblqi1ZaXbo6txSB7lcDHEx3VNOaLE/RNKuA1zvfxxHyQ48kT/Xn29Z/elm +ZVgak0Q6xsllW1+P0skOQA1/h5SQBGEMNtH6cwqPJRDE4BVVqRMcr8g7ioWkCl4q +MonxgJ+KaUhcKmtfmBpIZzUBQZZTeqSFvw+ulQzQLzSKB8lu2+z0kMlKdL/7j5aM +zb4AzOJOEKzCW7xST3E8ow75CaqH8mtODqRQxykhNq+uBA0XawQwXIG+nwNAv8Na ++uTO+kkFFQHgOvyFbQzKI1TNR/ZxXpKfHlwCGZ6V4CpVKxVTjf/KGrg+16wahWWl +h/R76JBVDdnxY7yc+lVAewamtZmrEyu/Yey7GfW//eGBSDP6OVLfonqc0Ar80Gei +CLrqfyJc77iexe53CeycHL/xrhrfWR+3wgG6AWomVNW2eVyNdj4UNr/N9/I/2qYi +zx6/gARqY6Ct6Jh6zfIAGgGf0oS3vX12vI2tXS2Quar6aQZQ2HMpp5hhUGl7UGBj +Cw9Dgv/H0vf8AA9YWyymswIDAQABMA0GCSqGSIb3DQEBDQUAA4ICAQAIEeguAZVu +JoCgZsudYnsqcUdH7pfq2HeFrjgxnJJ8OESaQIb9UohoR+o4ujtYBDGHf+myHxOJ +48syzGiOYePTX81hPOgFQOANnIOYH34zOn0EtNjj3ThkVF6rrsDOWqQK3bZoGnOE +ASn24DWqATEBqWXX+9nj7WbFCQu77izJsxhSB8bycTkTN1YyKIljThQ1kFwX36rM +jgstxGkBW0859Gfb4rbyCCLDl+4FCzdD+Tan4/at6FdAnOShqv45ookAJ0j5OQOm +/kYzW7xIoUy2cekqhs+qIHgBWNYrxudIXgxXMNzC9THOAE5ohlChFWvRstCyEDRv +1OfZlAGyc8ap+TEYNIewHC1V3S6AGhJbu4SM3LJU/jB2YI6DGGZ0MJw7FRLesvgs +vjieX+w//coeMZXTDhcHrGIxVCIVdRwAlmNSHF31tpcPDIkcjbnlaW6y7+s/Q0yz +ZSRBbFbUuDc6lt4DwVKj9yytCvQnh/fP+jchDkXPv58cVyr4jbMe1njQ/AbsUa1J +ayrPuxefzVkw+WLVnB3+1w0alsg0DnHYVPy4YwnoqXWXiDPbJOG9jFIkXZl1nhwe +zmnU1J+DeqlsbYItZN1cQRA1/bbzzQEJkV3wBcwGNPPaOhGhfMtIj3L3PLhPwZGb +SS7GKAEGWZ8fMaJhLXWs6+BrUS9yGOp+qw== +-----END CERTIFICATE----- diff --git a/src/keytypes/data/ca/ca-2.root.crt b/src/keytypes/data/ca/ca-2.root.crt new file mode 100644 index 0000000..c88fc83 --- /dev/null +++ b/src/keytypes/data/ca/ca-2.root.crt @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFMTCCAxmgAwIBAgIUJZDxetglWOfQl0akeSJUwrBZ7x8wDQYJKoZIhvcNAQEL +BQAwIDEeMBwGA1UEAwwVcnVzdC1rZXl1dGlscyBDQSBjYS0yMB4XDTIwMDkyNzAz +MjA0OVoXDTIwMTAyNzAzMjA0OVowIDEeMBwGA1UEAwwVcnVzdC1rZXl1dGlscyBD +QSBjYS0yMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxUdaxEeFLjP5 +E50IVyPURA5XknWC5WESAX00SJFXazULqkQPMBzbBuEIPxIJ1SQj5B1QfqdvzqhV +7fTB91Vve+2k5FaidMYOZa0okkFrf7r6Xko+sxQtyhA9v5wqsQXmbLID6/xRsiYE +0byUamjbi5OVPS/r5wzYfZ5sMUTeFx2iRAK0tGa2NZfuh6N9ILDHXf0qa9nlJhfM +pGydRxH71F35ITvz3J+wxsDYJwW7wtijzMgS4JzzredRK/OCA7NqY2Jr52jq+Pw0 +wwEXEmCoMhCCOiwUdke88MBwI3920kGRDCcZx/56OxY3Jda/syHHHFk5+rlaMx+T +3nF1XdoYU4zLPDgp/UBllQIw6+TxIuaEjGBZEET9l9SVNH9DzBooSPlEMRJjJXK9 +rFHX1bwygIlw3+fLWXkICiTWgx6oMtGpgjBN/UDmjOdktxJJlUv58dckCW0DaP/y +1yueporTQc9pZZpwWCjEI/AIlWBOazF9ZNugtH55CxiT9JUst8wz+kIfUAx7SRwg ++xMeRe71ZAYBulZ3d6AfAhnI4g1SoBKmGooszpgqKsHhlh9TLiE2lsvOwELh8YhY +JuEAhgsyd3IfatfKksQGcHL2OIUvuOp+pmENsdWMpGnrDLn3xKG5NkVfdhOPuPrG +ls5pKxNRZTHPcHUh4j1ht3YDekWR/y8CAwEAAaNjMGEwHQYDVR0OBBYEFJcFN1+Y +J3taqrEqpEawayiuF3IIMB8GA1UdIwQYMBaAFJcFN1+YJ3taqrEqpEawayiuF3II +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUA +A4ICAQAGMbqCa6k6uFy7DlMm+DQrievyxc7ZbWtGkNPdu55OnQQpYoiWorqTYbKd +7gQxNtwd0Sh0FXZVg0PeXnJh4rAB3P+90/hZwNuaKX+kwLHY0zANZKA3wpXDrRMJ +EB92BdgiYdM69Oqai0cgj0GoGIlnydwJttHWnghjmGV22MUbr1C7izOry1UTad/j +Fj3TyLo1Fi2YVLqk9gu1X9qCCHeHKMrGKVkQjjPrEfXMBaBoMaTahUGGjmgEV3AU +sb6/i3Hp252o9wZapQGcBYUNNy5UogD/rtFm9GqUIQBk8LmSixxX5toupsTa+yfv +snlfQQalzlBIexx58qnSBssry4G8lzcvyt3iIbsOWLxMsqofIzYYqjLCw2pstayJ +EYfMmi3Uh3aZpM9VrJld14dQhK8g26cDY0IGTXm/53B8GuMY+XAE9eOQIxLCwf9H +xa1RrDCj3C2g5PZLE13/r1aCwh8FIq1g+RTfIrTlP/mp3kWH4vaOYQJFq9VOsYuX +RGun90xI8IBL34ZdYaQQDdhQ83ZUFm/nwtEpiFLjRMirmcBkwULknzVkxNhXHfSc +daM81Gi6HZ052fdQN1Q0CZ+JIAjr3PpwSfjdFUzAlOwpzHTpRV7skyjHxTcJoK1j +FprB99o3TilOBo31Td/mWRYpfMC2pmYWVymGCoKDJ2LJB1eUzg== +-----END CERTIFICATE----- diff --git a/src/keytypes/data/ca/ca.intermediate.crt b/src/keytypes/data/ca/ca.intermediate.crt new file mode 100644 index 0000000..fb24f8f --- /dev/null +++ b/src/keytypes/data/ca/ca.intermediate.crt @@ -0,0 +1,27 @@ +-----BEGIN CERTIFICATE----- +MIIElTCCAn0CAhAAMA0GCSqGSIb3DQEBDQUAMCAxHjAcBgNVBAMMFXJ1c3Qta2V5 +dXRpbHMgQ0EgY2EtMTAeFw0yMDA5MjcwMzIwNDlaFw0zMDA5MjUwMzIwNDlaMAAw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDrHy7ew/T3SUhTUJjaR1GX +8s4gTcn4vHuqfGKdHyZ726DKA0cRMer6qqf+0evnSKB4NZXJXzdh8Fuh+8kWjD6i +uIMu6USbeK/4jL3LVVUdIYnaHhlpsIQbYUAukfH+ztzBfc4QylqBEe2izI9/r5rK +3P0fywC6XKl9iWx/1qEtCUT72SnbDiLhpS2yGKhkkHd0EAmFrsZRYjREXmCNlHOt +pBno6VvMaQVRad25qD569CEdcwnKPBMECtQkeOcBqk38H3qMtv68/TxTWbnihKdM +UaWKXudS2EroeCXBc4SHzYPRU+qX1kd5CrnCzq8G6ekFPaK62NziZEa6jYBq+B0k +9L0qef2QBNDY1ZhM15DukEvlL4NNtBBABSFoHv/8N8EgwaRoqWZeQFQhgidDRpft +b3x6NctbG99cRC4/PZW7gXq0BI1MrNdoJ6Y6DO5JCVxvYG2fPzEhevQatMskBFiH +rgKRGZf+2pVGQnWsOfShPpiTIDtRMhfViAfxVb4c766WJomzQ/z9ABxek+LKIrxE +z0mz8FyC7jceOCVnX6cSiOF9GQ6bZkKb2kVU56jRBPLHn9qQLiSOkvv1RdhbHGGY +nKLqe8FYbGEVCJsJ7LNN3zjJ73ZpMDarMxusTxO6o5EALW+uOHIX1Dh2TFboFLF0 +bN25BqcTEkubVztZEaIsUwIDAQABMA0GCSqGSIb3DQEBDQUAA4ICAQCOSJZgDjKG +6zAWsoQ5AWwVlFYY8LCh6f7SFqHjFb3oOlCoQxdiYL7yeHOf6bDTJ3PGO6Vg3TDZ +x0XnatrQyUfGAylKokhIcVAGcVJav+oynBB6J4slkZxJ5/nmPixYJ0qO+eZtohxV +dYKdOSa8q9z90OyOHrKZBysj7/RPNJlNnyA1HtJ2cDUlumuuMsEY2unLCNb0qVZM +UG6Mm5d07TZYuSXlbWtcZRvyQCwJLi8zeknnq77Z2Gp1/l62TcpyLah3WsxR/VD5 +tX9KBz8eIIFrDZ34WB6eudW/6XErFjCHjHDCtTNj9/1FDyhX2QX4BTuWXprUg52v +9vzUPMhQHMXq49UF+wdcWiN1n0F2RGTCPklmUNunXai6UDLWZ/iNhO1flx/dalbV +gr6btHxo4ZxUfX4JUBfThQp+bUSrNNpPUSNET9cKyfOnmz88ulFxS1mXH+b28w/M +0e8nhzdihsvBsyYSIyBIEWBPatqrgehqTKIaAnfwdxsDjvI9uKyrEvcXWLn7T7k7 +2prvX2OYt35D3OmbV5NwTXLsMYtL5KNTHpvyrgsmsnXTwSdLzYi6z+8y3tAvKRjI +4aRr9cgEQU56ZOk3DDdFxT+f39PefJwHSSIBXv1PD6p2PGFWH7POUMCFvtWFwfms +G8++7KmZxmslEFqd53kxIApy/2DPATIxiQ== +-----END CERTIFICATE----- diff --git a/src/keytypes/data/ca/intermediate.term.crt b/src/keytypes/data/ca/intermediate.term.crt new file mode 100644 index 0000000..4be762d --- /dev/null +++ b/src/keytypes/data/ca/intermediate.term.crt @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE----- +MIIEdTCCAl0CAhABMA0GCSqGSIb3DQEBDQUAMAAwHhcNMjAwOTI3MDMyMDUwWhcN +MzAwOTI1MDMyMDUwWjAAMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA +qpOB4VqMjoi2XtbfanXl6MUWQXBR7xm74N4aDqEPATzqdDRJrWWbiitkZV1jh5/Q +CCGyVV3uGEpLJz2EqbNjRvzzzWwNlu1i0/wLWn8/w3tKxzK7x+IqTn1QxifWKGzm +SJm0yfZIKKq4c87/4sEpORATAEAsC+30UyoiNdA990cV2RoBn11sFdn3UIkCJyA9 +Cvh2WvR0eOrsj+14d8A0Fw/DNFHeDOA5BXBvApLnQLmaz8mT3OiI9Yyxx3AfwRSH +WuoNLa+NB1f/wFyLODFQ/gP30bQfk/xJukW1p4zzwlw3/wipGzYyX6B6YxwnsG3N +2hG0bZ2tnFjQCjeJClWpuYK7cUUz8siputJTHJBQnnssg6llW/BawqQZxmK8/3rk +CfvQ2r1aWg20wc1Nhc7d/zvBRmk/lNvJjpdGKGvv1dtNsHZ9FW0YtQSJE/kjv2Ch +lxflxP5+E6tjyZNOyZo66LS/hxn7jC69Ygosn71pnGzL6QbLhJUUybII+O9Dv44Y +J+6tOt8SpVWnagTUMA0ylqesHcRnAGW839O+P9dgcPJQ2E3TElrCarZnzREoHYe6 +9wKlQKY/cVrb845GSJoUscMXnGTYAthon2T1+RBWMEsrQJad4V/65aHTmjx99JZF +EMXd7EclqEeBVNVENIA9vFQK6KawzcYU7ySGVc5yYiUCAwEAATANBgkqhkiG9w0B +AQ0FAAOCAgEAaSdbB/k4lU15gAdOgKBnXrV/zKS704NcIjAKXneIHmJu97trDhEt +DYexW7/lxmxzRXVqo+u2fMvFIQgHJH1uxu1g+ib6m+WXJXIlUkFFv0eN/Hw+3H22 +M5YnDh6M4Vzn3lPIJKgWqbNRQHkgiQerWK0azZKc++I4/gcESfeDZW6Mpa6rKtM9 +X3ua5EvORvuDlDNoGLyOAa9lGE56hwF6bDM88jvB2dVy6C0WgCIA6ygZQBy5ATO/ +cPLmDX0O7JWu0X2jW/E4h3lJGT3jCpkDOmAPJEcf56kC20QKF/hNipgvQ7aLrsLV +TIvD4612EEU6NDwVq2WOdnwFK9MaVsyvEKaveylooA2vOr0NT0rZ1Q6BMOn6eI8m +rYV+hBsu6V9UeLlsgHgtkwhkIckqvFL+mbfm8UvMI+uaSOZLeb9ufCYIO9QZcDoU +Aa7GXJ/FpL1kJc1/heTYaj9PGujC0Ntdat6PuivQlZJ3Pvjpax2vyW5EH01PbRSH +JIryKQg6hoOPqaQre3qN5r3TrXNSNuIIx9MB8m3usM8UxFkPhw5c2ZMhUUeOuBuC +6BdxOosuzMLV0zgD3aEggO/pC0iLSxL8MvphLRKEGps2bWh+SaDYRVw4DwdiwoH/ +4OV+unz099Rhyba0II/D17oVZ+maOWQ+add2CkABp0JFL8j547L3A0Y= +-----END CERTIFICATE----- diff --git a/src/keytypes/data/ca/self.term.crt b/src/keytypes/data/ca/self.term.crt new file mode 100644 index 0000000..e286841 --- /dev/null +++ b/src/keytypes/data/ca/self.term.crt @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIE5zCCAs8CFBWlGnDbKokrvIxdsZmrZels0CqTMA0GCSqGSIb3DQEBCwUAMDAx +LjAsBgNVBAMMJXJ1c3Qta2V5dXRpbHMgc2VsZi1zaWduZWQgQ2VydGlmaWNhdGUw +HhcNMjAwOTI3MDMyMDUxWhcNMzAwOTI1MDMyMDUxWjAwMS4wLAYDVQQDDCVydXN0 +LWtleXV0aWxzIHNlbGYtc2lnbmVkIENlcnRpZmljYXRlMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAzhtaw6fDhVE/68SHtAYu3N0HpaAC+YUciD6QUb2X +1wW7cj5VtIWEKmozOlF/vHMIOeSGqamm59xAOFboaV4RqznPl0M7duYTPmbZQfFj +cjY5mp+qX6BybVR4qB+5hH440/cVkZVclNTOiLLbN8eY5LkJ+8YJDSiEq2WzeeZd +6clKK40D5a306ScDqTL7497cbjjIuT3EFYeGKL5IY4sZRJfMvjnUa+hDI3xWlpxb +qg3gVgKw4JpNyWGn7njKIw9dy7OeX+kDq/cxw9CaPJ1rpppD4ihDe5aVvzAperRG ++misT/kNaqQzooa7g4ZeJ8wOojrxEku7Gtydf1oe/EiVikEAPiOi7hglRC6SYXZ3 +n5FBsz1vQWdkbGX7wGSJOGA/55QSU2+14CVf4P27WDLsYDmvlERcCP0Xt6jOUxBw +1e1VEYBgrpMI1YYqY1rVRWI76cXzCX6NIQDwKSWFwNMVcZEDLBRbeY+jofw2H4iR +B/TydGUV/w0fIH9gr51PKq5A4hjbQ+9nB/1hAZ1LsLxnx+lkvBtyqk97aWvP2vXG +WxXySGRknnlHObgbZSiRQmGH+4jp9ba4PbZMSx/sVsjDMYX7UkTwmeUqxW5nZBz1 +UnIThc20oytdBunIIyFhSxXh9p9wtx058a40dd6WPWbDtTcVo+ahJsU7RP/8WIMK +6EMCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAVPX4urQFDzWg9iwJ9ex+kbUf7PWo +cHTD7aCDVE8OAMJ36t2J0ThuKoBc8A/e45Msaj+OgIbfWsPCN84chJvdpgfZnvxE +wL3jnI+32ENkYXQ5esetneGv3I0rrSJ/nyvz7dvTWe889rNswQq6cjyrW/NL6wyW +s8angcyEJak37JqtHK2Kcvb1VW4jMho5cZA5hsiyEW/hrqe84OhHuTx1TelvUnfb +Y1eC8moHuukngvcuB0LA2V3Avd128r7lzmGnVwLtxdIq116hT0j2/vtZ4ymDdA9z +uSQ0ejRPVXzWgpAXXv1LtUiKiIT1RvrCEzYcl1e9Gce2Pz6Goy+zfaBsxQG2zjrO +aXdCnuITlGMLalZfXK9upBzOJS5HvelKy/WB1WrMg1/J7uahdtupkTtNZegYREGj +XypGbZnF7GJMxmfiL3cKp6TokNtZZ94dsnh5HJO+p5Nl5nZjhwjQ7hSTxNx/KVq1 +VQ8CN81O2QlBgip4dg1ZWsu7B/71uAQRkR5acKZIkg7UkK82J4x5BSlSs5JnEP4k +SlOwey9dTbOehrknpG24z7yqg76ZMe9RuIhO7nOBMvKh5C0pHqZwCLiGNpjt5UJc +9FgTPC65X7hNbJWSeWi+ru6KsRBkHNHkpbxEeHk5Ck0v/ddm+QkBkMP4VC5VsTN4 +BWzfmMAD/R6ZMIo= +-----END CERTIFICATE-----