Commit c9a01a0f authored by Michael Catanzaro's avatar Michael Catanzaro
Browse files

WIP: tls: make private-key and private-key-pem properties readable

This implements glib!2087, allowing applications to read the private-key
and private-key-pem properties, but only if the key is backed by memory
and not something like a PKCS #11 smartcard.
parent 5a60ad10
Pipeline #289214 failed with stage
in 5 minutes and 37 seconds
......@@ -86,6 +86,45 @@ g_tls_certificate_gnutls_finalize (GObject *object)
G_OBJECT_CLASS (g_tls_certificate_gnutls_parent_class)->finalize (object);
}
static void
export_privkey (GTlsCertificateGnutls *gnutls,
gnutls_x509_crt_fmt_t format,
void **output_data,
size_t *output_data_size)
{
gnutls_x509_privkey_t x509_privkey;
int status;
if (!gnutls->key)
goto err;
status = gnutls_privkey_export_x509 (gnutls->key, &x509_privkey);
if (status != 0)
goto err;
*output_data_size = 0;
status = gnutls_x509_privkey_export_pkcs8 (x509_privkey,
format,
NULL, GNUTLS_PKCS_PLAIN,
NULL, output_data_size);
if (status != GNUTLS_E_SHORT_MEMORY_BUFFER)
goto err;
*output_data = g_malloc (*output_data_size);
status = gnutls_x509_privkey_export_pkcs8 (x509_privkey,
format,
NULL, GNUTLS_PKCS_PLAIN,
*output_data, output_data_size);
if (status == 0)
return;
g_free (*output_data);
err:
*output_data = NULL;
*output_data_size = 0;
}
static void
g_tls_certificate_gnutls_get_property (GObject *object,
guint prop_id,
......@@ -93,8 +132,9 @@ g_tls_certificate_gnutls_get_property (GObject *object,
GParamSpec *pspec)
{
GTlsCertificateGnutls *gnutls = G_TLS_CERTIFICATE_GNUTLS (object);
GByteArray *certificate;
char *certificate_pem;
GByteArray *byte_array;
char *pem;
guint8 *der;
int status;
size_t size;
......@@ -106,21 +146,21 @@ g_tls_certificate_gnutls_get_property (GObject *object,
GNUTLS_X509_FMT_DER,
NULL, &size);
if (status != GNUTLS_E_SHORT_MEMORY_BUFFER)
certificate = NULL;
byte_array = NULL;
else
{
certificate = g_byte_array_sized_new (size);
certificate->len = size;
byte_array = g_byte_array_sized_new (size);
byte_array->len = size;
status = gnutls_x509_crt_export (gnutls->cert,
GNUTLS_X509_FMT_DER,
certificate->data, &size);
byte_array->data, &size);
if (status != 0)
{
g_byte_array_free (certificate, TRUE);
certificate = NULL;
g_byte_array_free (byte_array, TRUE);
byte_array = NULL;
}
}
g_value_take_boxed (value, certificate);
g_value_take_boxed (value, byte_array);
break;
case PROP_CERTIFICATE_PEM:
......@@ -129,20 +169,32 @@ g_tls_certificate_gnutls_get_property (GObject *object,
GNUTLS_X509_FMT_PEM,
NULL, &size);
if (status != GNUTLS_E_SHORT_MEMORY_BUFFER)
certificate_pem = NULL;
pem = NULL;
else
{
certificate_pem = g_malloc (size);
pem = g_malloc (size);
status = gnutls_x509_crt_export (gnutls->cert,
GNUTLS_X509_FMT_PEM,
certificate_pem, &size);
pem, &size);
if (status != 0)
{
g_free (certificate_pem);
certificate_pem = NULL;
}
g_clear_pointer (&pem, g_free);
}
g_value_take_string (value, certificate_pem);
g_value_take_string (value, pem);
break;
case PROP_PRIVATE_KEY:
export_privkey (gnutls, GNUTLS_X509_FMT_DER, (void **)&der, &size);
if (size > 0 && size <= G_MAXUINT)
{
byte_array = g_byte_array_new_take (der, size);
g_value_take_boxed (value, byte_array);
}
break;
case PROP_PRIVATE_KEY_PEM:
export_privkey (gnutls, GNUTLS_X509_FMT_PEM, (void **)&pem, &size);
if (size > 0)
g_value_take_string (value, pem);
break;
case PROP_ISSUER:
......
......@@ -65,7 +65,10 @@ typedef struct {
GByteArray *cert_der;
gchar *key_pem;
gsize key_pem_length;
gchar *key_pem_pkcs8;
gsize key_pem_pkcs8_length;
GByteArray *key_der;
GByteArray *key_der_pkcs8;
} TestCertificate;
static void
......@@ -94,6 +97,10 @@ setup_certificate (TestCertificate *test, gconstpointer data)
&test->key_pem_length, &error);
g_assert_no_error (error);
g_file_get_contents (tls_test_file_path ("server-key-pkcs8.pem"), &test->key_pem_pkcs8,
&test->key_pem_pkcs8_length, &error);
g_assert_no_error (error);
g_file_get_contents (tls_test_file_path ("server-key.der"),
&contents, &length, &error);
g_assert_no_error (error);
......@@ -101,6 +108,14 @@ setup_certificate (TestCertificate *test, gconstpointer data)
test->key_der = g_byte_array_new ();
g_byte_array_append (test->key_der, (guint8 *)contents, length);
g_free (contents);
g_file_get_contents (tls_test_file_path ("server-key-pkcs8.der"),
&contents, &length, &error);
g_assert_no_error (error);
test->key_der_pkcs8 = g_byte_array_new ();
g_byte_array_append (test->key_der_pkcs8, (guint8 *)contents, length);
g_free (contents);
}
static void
......@@ -111,7 +126,9 @@ teardown_certificate (TestCertificate *test,
g_byte_array_free (test->cert_der, TRUE);
g_free (test->key_pem);
g_free (test->key_pem_pkcs8);
g_byte_array_free (test->key_der, TRUE);
g_byte_array_free (test->key_der_pkcs8, TRUE);
}
static void
......@@ -267,6 +284,63 @@ test_create_certificate_pkcs11 (TestCertificate *test,
#endif
}
static void
test_private_key (TestCertificate *test,
gconstpointer data)
{
GTlsCertificate *cert;
GByteArray *der;
char *pem;
GError *error = NULL;
cert = g_tls_certificate_new_from_file (tls_test_file_path ("server-and-key.pem"), &error);
g_assert_no_error (error);
g_assert_true (G_IS_TLS_CERTIFICATE (cert));
g_object_get (cert,
"private-key", &der,
"private-key-pem", &pem,
NULL);
g_assert_cmpmem (der->data, der->len, test->key_der_pkcs8->data, test->key_der_pkcs8->len);
g_assert_cmpstr (pem, ==, test->key_pem_pkcs8);
g_byte_array_unref (der);
g_free (pem);
g_object_unref (cert);
}
static void
test_private_key_pkcs11 (TestCertificate *test,
gconstpointer data)
{
#if !defined (BACKEND_IS_GNUTLS)
g_test_skip ("This backend does not support PKCS #11");
#else
GTlsCertificate *cert;
GByteArray *der;
char *pem;
GError *error = NULL;
cert = g_initable_new (test->cert_gtype, NULL, &error,
"pkcs11-uri", "pkcs11:model=mock;token=Mock%20Certificate;object=Mock%20Certificate",
NULL);
g_assert_no_error (error);
g_assert_true (G_IS_TLS_CERTIFICATE (cert));
/* Cannot access private key because the GTlsCertificate only knows its
* PKCS #11 handle. It doesn't actually have the private key in memory.
*/
g_object_get (cert,
"private-key", &der,
"private-key-pem", &pem,
NULL);
g_assert_null (der);
g_assert_null (pem);
g_object_unref (cert);
#endif
}
static void
test_create_certificate_chain (void)
{
......@@ -613,6 +687,10 @@ main (int argc,
setup_certificate, test_create_certificate_with_garbage_input, teardown_certificate);
g_test_add ("/tls/" BACKEND "/certificate/pkcs11", TestCertificate, NULL,
setup_certificate, test_create_certificate_pkcs11, teardown_certificate);
g_test_add ("/tls/" BACKEND "/certificate/private-key", TestCertificate, NULL,
setup_certificate, test_private_key, teardown_certificate);
g_test_add ("/tls/" BACKEND "/certificate/private-key-pkcs11", TestCertificate, NULL,
setup_certificate, test_private_key_pkcs11, teardown_certificate);
g_test_add_func ("/tls/" BACKEND "/certificate/create-chain", test_create_certificate_chain);
g_test_add_func ("/tls/" BACKEND "/certificate/create-no-chain", test_create_certificate_no_chain);
......
......@@ -2635,7 +2635,7 @@ test_connection_binding_match_tls_unique (TestConnection *test,
* please make sure the string below matches the output of
* openssl x509 -outform der -in files/server.pem | openssl sha256 -binary | base64
**/
#define SERVER_CERT_DIGEST_B64 "kGOeAZnSeNtf5yzBZzUhbKFpW9qsPV+lIB/4t96OV+E="
#define SERVER_CERT_DIGEST_B64 "84UyyAeH0nwpcbGCbMZiAnU/UP/g3l65n5gBKDAGGxI="
static void
test_connection_binding_match_tls_server_end_point (TestConnection *test,
gconstpointer data)
......
......@@ -3,27 +3,27 @@ MIIFAjCCA+qgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBnzETMBEGCgmSJomT8ixk
ARkWA0NPTTEXMBUGCgmSJomT8ixkARkWB0VYQU1QTEUxLDAqBgNVBAsMI09sZCBV
bnRydXN0ZWQgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSIwIAYDVQQDDBlvbmNlLndh
cy5hLmNhLmV4YW1wbGUuY29tMR0wGwYJKoZIhvcNAQkBFg5jYUBleGFtcGxlLmNv
bTAgFw0yMDEwMTIxNzQ5NDRaGA8yMDUwMTAwNTE3NDk0NFowgYYxEzARBgoJkiaJ
bTAgFw0yMTA2MTAyMzM4NTlaGA8yMDUxMDYwMzIzMzg1OVowgYYxEzARBgoJkiaJ
k/IsZAEZFgNDT00xFzAVBgoJkiaJk/IsZAEZFgdFWEFNUExFMR4wHAYDVQQLDBVD
ZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDmNhLmV4YW1wbGUuY29tMR0w
GwYJKoZIhvcNAQkBFg5jYUBleGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAKWFJia5M5GJSnjxTbIW/h5Rl0/uS7jek4Rfk5fsy+2lxPk6
/a+rdVXNHtLKmF8ouG8QocYr+MQNvGedhqSv8L+ViZXlz/zh/DMk5mzQUOSi5yrj
jQbOJ8oeEAK2mXF42x4mNiNmBdUsavnaemXAoCX2f05wci0sGDS1fxUyGMV5Bay3
2YCrFVyhfYUKbs9ItpMuyngIfBOVH7wa9N+XQuQIvT/ZZ2x/0PgbQWv+JFmIfMV4
KuIZXuJYM0zmoLQEjgF1kdOpyoLot4u1EmgqceZakTTRZvst4rAZqib6F5lBgsZm
4ige4KAQjGfJlVjiPBiAo/KyJjeu/d0iwLNdsHcCAwEAAaOCAVwwggFYMB0GA1Ud
DgQWBBSLcFF+Oi4WrdNajz7wc6U4i2X3OzCB3wYDVR0jBIHXMIHUgBQJPzDGBIUp
4KIn7BhZJbgPBpUEe6GBpaSBojCBnzETMBEGCgmSJomT8ixkARkWA0NPTTEXMBUG
ggEPADCCAQoCggEBAL1BbHsj/VMqC/OwaRJLIgfMcYrLHjZL0QUkXzohuo0gqvE1
pcbch7c0BsRmUc06PUaX4QSFtbBgdgBWXx9s7bPdPANj640WWihvPGb2/jN4qCQZ
XY15GITs6c3DlF55wG2f2Em9q73borp2ZtHwn8T2pjJVDLNyvsNclz9Hxy7iNtLg
NEwm7+HfpYljVxMUxzkACZ0M1Tn3wf3pKH4D1Bz0d4SswEsUd0/Dyxo3XIB9+N6+
p34wo9p++O0TtRzfBSMhYtvH789yD06EC1Ci/id+cVwnhCeo0rG5mAOcHZgtp5RX
k7fPuHKmFwccuKZvdlcjB+OTKGczT7dxwTZEUp8CAwEAAaOCAVwwggFYMB0GA1Ud
DgQWBBRQOF6Z1qO4oMHq2kSzjiDm9kh0AjCB3wYDVR0jBIHXMIHUgBSQteaZ9OoG
P/woJzTfbUd4KkntqKGBpaSBojCBnzETMBEGCgmSJomT8ixkARkWA0NPTTEXMBUG
CgmSJomT8ixkARkWB0VYQU1QTEUxLDAqBgNVBAsMI09sZCBVbnRydXN0ZWQgQ2Vy
dGlmaWNhdGUgQXV0aG9yaXR5MSIwIAYDVQQDDBlvbmNlLndhcy5hLmNhLmV4YW1w
bGUuY29tMR0wGwYJKoZIhvcNAQkBFg5jYUBleGFtcGxlLmNvbYIUJMXPCPBYU7Ju
V+eZvzCqQcLy6H8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwGQYD
bGUuY29tMR0wGwYJKoZIhvcNAQkBFg5jYUBleGFtcGxlLmNvbYIUT0ZuqS3GYxNL
XPUfTCpGF9MdpyswDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwGQYD
VR0RBBIwEIEOY2FAZXhhbXBsZS5jb20wGQYDVR0SBBIwEIEOY2FAZXhhbXBsZS5j
b20wDQYJKoZIhvcNAQELBQADggEBABSrlQqoWp6reJsOYmlxUbDQJ5OuqcZuKEkn
gscxFXeprhDD7eJmD8qHqFmfgM8e/tbnQw1xSOBgYpifVQRSij+TBWrJpX7980e7
FKLPI5oOS/3geInW3Rs3EzfpGK1fKNR8mtTZj4hb0FnMpFXgiTYmRAeqQf3PCRge
5Is8VP8eTtnzLi8gK8i8A97SOWyuqy/dzIz0UPthc0qvq5u7LR8sJZ901kWjBazq
0KbZ/pyUrmLHaa07q8aU5Z1FPSH5l2PmtXtSfTvHBn8onG1LYF0WhjZ0qxsGvuRR
9JX4dzGE2D8ub9f7B+ouF9hS6FIFujBNelk9dyirIgx+994qhPU=
b20wDQYJKoZIhvcNAQELBQADggEBAG3gt5Ev4tenoIio+c0VE6iUZonMxYLU7EZ2
MvcUAts5c19u+XD8HO6JUvdn2tG8XbIkD3u6+qlZ+IV4dQCScmDWpUK/rswpOVBs
T1ZmpdWVqt2XSfw7SkzXi8CvNmdwPwvNpzLDFupwYxWdpClhnUdSYBKO9gXaYvNy
KktmOt1vHtdkV3H3fSVUmrA0aON07ey7iKnT67BXnAoZQSFoQSxE9IZF+Bcacwbj
KZLDVAPIq3HXirPpBEKAbgpTq9+yQzHVNTIXWpoGSaG7WLFBoAfKZgsgo6KSYX3S
74Q8SQgA3cDhmwzBb5/GNW3Qbn/hVgHBO6lkeRwSjbcYaIiGRFw=
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEApYUmJrkzkYlKePFNshb+HlGXT+5LuN6ThF+Tl+zL7aXE+Tr9
r6t1Vc0e0sqYXyi4bxChxiv4xA28Z52GpK/wv5WJleXP/OH8MyTmbNBQ5KLnKuON
Bs4nyh4QAraZcXjbHiY2I2YF1Sxq+dp6ZcCgJfZ/TnByLSwYNLV/FTIYxXkFrLfZ
gKsVXKF9hQpuz0i2ky7KeAh8E5UfvBr035dC5Ai9P9lnbH/Q+BtBa/4kWYh8xXgq
4hle4lgzTOagtASOAXWR06nKgui3i7USaCpx5lqRNNFm+y3isBmqJvoXmUGCxmbi
KB7goBCMZ8mVWOI8GICj8rImN6793SLAs12wdwIDAQABAoIBAQCRsbUWStj4lyeF
c6nXQ+PlHh6ZjgD7NngVAegxx47tnYfXdbSN59d9cfNaylf7EyXdJX+wp03ujMS1
U/SLjA7XJLKZzlMYnnbXMfjd+TPrPPVMTEX7ooVlpLalHMPOHPqK/EmVOR2TOejk
CwrH/Bk7sVD344Ss/G5GHyhAqPsi/eyGJjQZO+5hRcBrp/VyrtazoXhQNJm4snV9
ab1no4zSbjDXeKBHV4R4ox+LeUPvP9P4yxwvfc5qY2NsIuDMjZxVYjy5ChU2HwWp
FiK0FSs7BZ3EX1a6lokskE+g8uNu+8mJ1jX8rULHiXVMOCBLdnxRxhNgdTqXAnGK
MFNlo2uRAoGBANUFFt58SbzAD1l7Ewpe7/Q2atzHM+JW1xOhRL3SQjWElWHahJcg
FQNfrXsRmdCXXq4OrUmxqZICrBCKoHzPzKnq2V9c0KfPKE+8DyYMtuEn6CEkURTW
wf4/fNe8rQzAwdr86csViOElapWs5XTiK+Ns2hAKmegFZueoDjA/JLCJAoGBAMbq
mZl2+LOTVdi3IBhHqQS9cfoZoMyR/iiT9H15EUbpppSmDJu4ZI47j96CbzqZPnNs
KH+S79aiyZcEOfMz/mjO0Xnm2460/jzPFeAHOUGr4VQ3udnu3HYOGNVx754JiykA
oPGEONoomQvXgPjZjhn5Ev//rtwU0bvzItZ/3Rj/AoGAGY7FwqXY1vuYG91HWIwx
b/SDd7+yuuo+Xc2QiNHMPc2NerMUC2m++6ukDcr70GoI4wtBwUC+npURfd6UCMWJ
wa06rVVed3PEW2St0Jvf6T23fRp1W/G0TsPhP6UUgh4yZArKJiKMTK8HjbOzyAVG
zL+HnjsXYh4bzZl9Mk6xITkCgYBpA5u5uGSOMX+F3Q/1oYdquDU/C16oAX9DnvDZ
eRwU6u+F1LAdWdjEek928jeUoSimOPiceU9jaiexMYsCiXWLkXxnteg9y/HY2p86
2bVxpTNdidn1YzRCoyibLv6I2ZL9P5a4SszU58/8v3YYaoqpzaQpQKvpBpi/eBnx
UinAswKBgQCbs6bIkFrVlBc+d0qdy2SIsO/FN8BILKF4KPo6CWCtOuYGU1nMVsoq
lIcXpWxwlmkWHgu2v5mIJHN6qxCN+m7OZGuz3aaSPyclyOj8rGHpyRQofQFD9IdZ
YU70Pt2UKnX1vsFUgU4Ov5KjR5qh9fQbIzhz0//wXlWm4mvAg+F80A==
MIIEogIBAAKCAQEAvUFseyP9UyoL87BpEksiB8xxisseNkvRBSRfOiG6jSCq8TWl
xtyHtzQGxGZRzTo9RpfhBIW1sGB2AFZfH2zts908A2PrjRZaKG88Zvb+M3ioJBld
jXkYhOzpzcOUXnnAbZ/YSb2rvduiunZm0fCfxPamMlUMs3K+w1yXP0fHLuI20uA0
TCbv4d+liWNXExTHOQAJnQzVOffB/ekofgPUHPR3hKzASxR3T8PLGjdcgH343r6n
fjCj2n747RO1HN8FIyFi28fvz3IPToQLUKL+J35xXCeEJ6jSsbmYA5wdmC2nlFeT
t8+4cqYXBxy4pm92VyMH45MoZzNPt3HBNkRSnwIDAQABAoIBABX+RF0LEaVYfYsU
NSGrGYlOeONoN1qX9PJkB6z5vnQoF7VwRpOVjS/9G8w3F8qBuh06CSw9XZ/hldT0
NJmyTu1YCGFce0MqFdAdHSfaDDBvFRsc14JZUEAiSAlhcRyJiZMzwC7Rm+O0YnTI
zaoYDHkXMLkoqRExhHmviOQRs1P/QrRSwJiXwKFWg7sZGQYmt3u+mpYWCPBQ995e
eq8rolkdOnd/wzgdvZ3xlg9WjKqAS2JeP8+P0I/hNxHyF2QGloB8Km/zReULA1oo
Wx05VgkIwRz1gVV/vVIB/gSqt+oSxpurDRbgYMDsgpPgT7HmJNfHVn4Zks3UpQlU
mHwJGAECgYEA4KlZyoy9UvfdmwmwHMBWUPRxh/dCldD0m8Ljw/0cZtOs1g5YygpE
CWwFkxdPaplbwLpww5BkhFXK1Kz2EoJDNafOnVzrsevcLNUf83NwTNqyVmn/vt/2
hF4PViCynkMCQYuOYD6yAwLu5y83EiSr2iEzYMb8z194hLe2YEK+UjECgYEA16e6
anEmE3c2k5ZlGye6PS05204a8+cQ238cNt5FflYznHaFnlMRT+rC7K+onffoeapv
KWFwsL0dUdvGMf61zz515m7Nhjbqk8eEuQVictVxaUZer2XHL5zUvm+Gp4H8lfPB
YJW0lAxPzwYNVCWZ+MjjV1UOQAq0x9cScZoxbc8CgYBqGpF1wBKKZNYcqu6qJYye
n1QfSv//kbh0+A5qOdh4F/DBB/WXNlH7wTDAz3mKdvOGiodHVaKjfYFWAHoXM75a
UO6cE46dcS+DXQTCDfsz0PX5KgbHNy9ORL4phzfU1wDxw99yRSn9kh0SwpHX18ny
M0v4oQI1Tnm09K8Ft3/7gQKBgBlcTSzVT4/8dfuXNR6jZmBpYCNtJPhH1RCq+wts
yilYQ8uDmKUMyb1nMzMYWTDyhXFBXL82CUWPh9InkUAx3vmXM9A8eYjuDloAnZgQ
jQpKFYM21k20H193BwG6JdCvFaAgwT31fP3oEL6czJZ3sYqzPSD5DKr1V1sk7LNV
Wbi7AoGALVx5iVnQDeSTRG7credYNL3xzo9jBxiYM56ocbb9/iM9iSMhW2iDyjek
m5PT8yA/RR3fnaCPhhUESNUCv0Q5u/XnxB6h2GHXv6z86bcavxCzMUmyq474fVTZ
k+Acpnc1f87UiVyUEPpAw6AAQc7PcEhOh4WvIbZhLDIxQSHMvmI=
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
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
MbJ0cWIRVg==
EjAQgQ5jYUBleGFtcGxlLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAXsT7fVgTUxfr
d5biXTAR1iP+TieFYECgsk2kxt8kkfnfF93Vf3AojtKmh98EAiVVKgmLjhTQF9l+
dNtg2K+HS1fhC1GQandc5wUPR0Wp0CbpRSZwVKejuxajzNvp72E/uuvSnuN9+l+x
JS+774LGRc1yeimjhLZdSW6GnmqVtVKZ6+GZgyzAoW7cGjOfKBx+S3cmluCUQAku
wCmZDo+DqVSy0ufLwdxxe4iex+p0zwLWfp/8RvvSEGByn/IGIajmnM3op4H0jYJH
M8Y85rnMnLnbU++5iU5AjPsMFBHEGAcGHjK2QqTfN8Z4pgu1ahz2phTNIba8bV/m
H2Kcj00tbQ==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290
......
These are some CA certificates
-----BEGIN CERTIFICATE-----
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
MbJ0cWIRVg==
EjAQgQ5jYUBleGFtcGxlLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAXsT7fVgTUxfr
d5biXTAR1iP+TieFYECgsk2kxt8kkfnfF93Vf3AojtKmh98EAiVVKgmLjhTQF9l+
dNtg2K+HS1fhC1GQandc5wUPR0Wp0CbpRSZwVKejuxajzNvp72E/uuvSnuN9+l+x
JS+774LGRc1yeimjhLZdSW6GnmqVtVKZ6+GZgyzAoW7cGjOfKBx+S3cmluCUQAku
wCmZDo+DqVSy0ufLwdxxe4iex+p0zwLWfp/8RvvSEGByn/IGIajmnM3op4H0jYJH
M8Y85rnMnLnbU++5iU5AjPsMFBHEGAcGHjK2QqTfN8Z4pgu1ahz2phTNIba8bV/m
H2Kcj00tbQ==
-----END CERTIFICATE-----
GLib shouldn't care about this comment
......
-----BEGIN CERTIFICATE-----
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
MbJ0cWIRVg==
EjAQgQ5jYUBleGFtcGxlLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAXsT7fVgTUxfr
d5biXTAR1iP+TieFYECgsk2kxt8kkfnfF93Vf3AojtKmh98EAiVVKgmLjhTQF9l+
dNtg2K+HS1fhC1GQandc5wUPR0Wp0CbpRSZwVKejuxajzNvp72E/uuvSnuN9+l+x
JS+774LGRc1yeimjhLZdSW6GnmqVtVKZ6+GZgyzAoW7cGjOfKBx+S3cmluCUQAku
wCmZDo+DqVSy0ufLwdxxe4iex+p0zwLWfp/8RvvSEGByn/IGIajmnM3op4H0jYJH
M8Y85rnMnLnbU++5iU5AjPsMFBHEGAcGHjK2QqTfN8Z4pgu1ahz2phTNIba8bV/m
H2Kcj00tbQ==
-----END CERTIFICATE-----
......@@ -3,78 +3,78 @@ MIIDuzCCAqOgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBrTETMBEGCgmSJomT8ixk
ARkWA0NPTTEXMBUGCgmSJomT8ixkARkWB0VYQU1QTEUxKzApBgNVBAsMIkludGVy
bWVkaWF0ZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxJDAiBgNVBAMMG2ludGVybWVk
aWF0ZS1jYS5leGFtcGxlLmNvbTEqMCgGCSqGSIb3DQEJARYbaW50ZXJtZWRpYXRl
LWNhQGV4YW1wbGUuY29tMB4XDTIwMTAxMjE3NDk1MVoXDTQ1MTAwNjE3NDk1MVow
LWNhQGV4YW1wbGUuY29tMB4XDTIxMDYxMDIzMzkxMloXDTQ2MDYwNDIzMzkxMlow
SzETMBEGCgmSJomT8ixkARkWA0NPTTEXMBUGCgmSJomT8ixkARkWB0VYQU1QTEUx
GzAZBgNVBAMMEnNlcnZlci5leGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAN4t3FBzYQk48Bzm7S9JiZqmWVY/FagC9aim8foydtzXXcXj
IEWc6AChko8FhLJAp5ZJCxm7MbYc5pZfyGgecBawG13fKYoPo+59dUJAw8xkENKC
i57K0fsfwZf4v0SqawmYUj9AtIsy8Q6xTRfVHA+Pj2qbNNTMIUzgIg3b7TpGnhjN
DlxYzXLPThiKD8Vm+SrXOm8W+hCpIivyGDNWCxTo1MHj2UUmHPGHfwZXCJ9dt8sc
QTV1B0TeTJ3Xm/w+aAzUfbdlkCufsk6nLsj+gYMRkGGsYo/GmAv4/PPUop+yNK6V
LL1nNgp0hP+VwvGU2cpn6BRBmpUu5xHrXkHjU+ECAwEAAaNHMEUwCQYDVR0TBAIw
ggEPADCCAQoCggEBAKaRoBEvmktpxV+gX10QnkfonkCYdrXp6Pdgwy7nm8XP8PdY
CpGbzc6XW9tX6KTM/MSISGSz4glnh4dK7hSbA9w86iO7s5S4Wfsy6Frdkfk5kQa7
cuzXmNe/GAiUWAa/hTeiy2H6S7Vs9dLN/OdCN3wkx/a5gFnAFs/nfK0wkkSkq+qU
c9N38qxh73ByQ+hwWqQenvV6WdUG6dMCWW+GiReM2A0k/9EBgGNi6zMMQykVKdMa
ZFchFog7RFkm+92Cf4HxZvJD3vhGUTiDo+kZ3q9rh3Q9OIUERfAywUf6gduLGyL5
9F0urI3cCPjPXPkKQcXz2wnVBBk4wBGfAQhxpQsCAwEAAaNHMEUwCQYDVR0TBAIw
ADATBgNVHSUEDDAKBggrBgEFBQcDATAjBgNVHREEHDAahwTAqAEWghJzZXJ2ZXIu
ZXhhbXBsZS5jb20wDQYJKoZIhvcNAQELBQADggEBAHxnwEN8Xr9TUrHefXPdcDU2
yd4F3u4bPL4RSSRFIKdqrAaHK0wnzLoF3HneUjKzU/l36kNHBa7dUo8Q2SGd3V4d
zDR0uT9uUdsZVwmUbAcZs1Z9d1vPMWDqS1zwBKYtLTw2Z7sl9xaLYhxLZSyf1Pxe
aC8+gNaqJ25aKAbDSMNCyF32vRy4OYy7Hi8Itexkva6XMlF4H4gSXs4QZP9WGhp7
6YRdcy6Z6lJfkJ9SW6nsoNJvbYGOGbxHg9brxWJV8T7cFBQQVvZKasydS6+6IK/2
/+n38vEog/7hGQ85iOsu0xOcdkKl/SIj1ckJtGAVif2kbCSzugSafA2jRELyiI0=
ZXhhbXBsZS5jb20wDQYJKoZIhvcNAQELBQADggEBACDND9sBatFK8AG8Tkelofty
pgm1cwTfawm7McVx24Pktc/XjJ/L/N2xo9ZQmpZH6j5IhZSiVLz8iFhev75vcJ0B
WbRweU079HV0/J7sNuMBNkIJB7NL0wUJSSfMOnhpKPExTHxWopmCRpGut0igYx78
GxBSpneEH5Oel7BBZrsu3L4ujzyyTRIdqyKqJ/IE7im9RDE70ktdopA9lRFuNiFf
HCx1gdpBNgFzBQskhiF1XGf3JmkGP84iFR10BEc63Ab2v1jyTMh6sf4f0FEiUXIq
rp23rUCVwBGjHHSKrtI4HbaAMi0UgfYuKvw7ImyS3Pck8Sxhwed6rbJfaA5ICnY=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFAjCCA+qgAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBhjETMBEGCgmSJomT8ixk
ARkWA0NPTTEXMBUGCgmSJomT8ixkARkWB0VYQU1QTEUxHjAcBgNVBAsMFUNlcnRp
ZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOY2EuZXhhbXBsZS5jb20xHTAbBgkq
hkiG9w0BCQEWDmNhQGV4YW1wbGUuY29tMB4XDTIwMTAxMjE3NDk1MVoXDTQ1MTAw
NjE3NDk1MVowga0xEzARBgoJkiaJk/IsZAEZFgNDT00xFzAVBgoJkiaJk/IsZAEZ
hkiG9w0BCQEWDmNhQGV4YW1wbGUuY29tMB4XDTIxMDYxMDIzMzkxMloXDTQ2MDYw
NDIzMzkxMlowga0xEzARBgoJkiaJk/IsZAEZFgNDT00xFzAVBgoJkiaJk/IsZAEZ
FgdFWEFNUExFMSswKQYDVQQLDCJJbnRlcm1lZGlhdGUgQ2VydGlmaWNhdGUgQXV0
aG9yaXR5MSQwIgYDVQQDDBtpbnRlcm1lZGlhdGUtY2EuZXhhbXBsZS5jb20xKjAo
BgkqhkiG9w0BCQEWG2ludGVybWVkaWF0ZS1jYUBleGFtcGxlLmNvbTCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBANEiR6aaGVdhIBCTJDbB0KBjAYu1f5on
K3d+meKkp/K5V2DeatnupjqEkK8qEzzl8a81YblGg/k0mghDQMA+Rm9POPVNugUw
uOlzlfOshVuNRVGMh+Svu7Sa8y++eMiQnWYk3nQETGa0C+4Lwx/khIfXJ4QQ0SWE
3RDkNLS052zRXeyTsOnvFRtnLw3Z4rQWJrdJtvcHIL534jEsR8B/6sheYm3uL+Nu
pH+NdiWnqWFglrvObG4Diyki1A7u1SHIBMwdc1sHu7yDrKsrTijqPbQpdRrip3jH
RAMjH+KFzeUaJR8hlnIUgwctdw6kgG7OfQPq1hWtfpI8mJ4CFhux3/cCAwEAAaOC
AVAwggFMMB0GA1UdDgQWBBRwLIOiczD2pbLEqglbtvsAlJFwtjCBxgYDVR0jBIG+
MIG7gBSLcFF+Oi4WrdNajz7wc6U4i2X3O6GBjKSBiTCBhjETMBEGCgmSJomT8ixk
KoZIhvcNAQEBBQADggEPADCCAQoCggEBALsubRO/TkL3AS5+wzYtjLBDHfGETRiI
wsl1JfWm+7EOmcfT/SElLJE6z4T9LVQQcycTN+jrO/QW+AzYl336VrZLnOPm4ju4
IOwnPZaajjJX9LYks9bCUGMum6q90zLJr9KmxlKVxIC0Bc418J77QAMp3dC8lVay
4NusTan0W1o55ipd6rw4VtlcV+QbBRWilwh6X4+Gl/lfmllqjfIT0Qk/r3dR4tYw
nS5kmaBiEXzTi4V84o/mbr8YHCQOKlGiKhy4J1wrAI4sJKUWEBafTbPZcP4zfq4I
JJtKx4L/yO7KovGCNLsdr0XIJ5WhQXczoa9/8tcBMfpw4x8VBUUKFoECAwEAAaOC
AVAwggFMMB0GA1UdDgQWBBT1FBWBa0YSfQgZGywHzY83zP/0cTCBxgYDVR0jBIG+
MIG7gBRQOF6Z1qO4oMHq2kSzjiDm9kh0AqGBjKSBiTCBhjETMBEGCgmSJomT8ixk
ARkWA0NPTTEXMBUGCgmSJomT8ixkARkWB0VYQU1QTEUxHjAcBgNVBAsMFUNlcnRp
ZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOY2EuZXhhbXBsZS5jb20xHTAbBgkq
hkiG9w0BCQEWDmNhQGV4YW1wbGUuY29tghQ+s67jByiORo59Mf4YWphlAh5esDAP
hkiG9w0BCQEWDmNhQGV4YW1wbGUuY29tghQk1yZyXpu/SEN1m3GMqLKXciDO5DAP
BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAmBgNVHREEHzAdgRtpbnRl
cm1lZGlhdGUtY2FAZXhhbXBsZS5jb20wGQYDVR0SBBIwEIEOY2FAZXhhbXBsZS5j
b20wDQYJKoZIhvcNAQELBQADggEBADb+0KoGV/ZzUQ2moJnOQQRUL9HLtG9OC8Hh
MZhGO0IhpwOkiT1Jy05n1tXu6x+XC3XI8WmzP6uuuNGmWoq38+AdtofPDXKnnLBN
L3WU+JGI2cZ9eBv/yv1QeFxPFR9IuVMXc+Pt+2TVoV2ancDeH31GKqkktPO2G50g
1F8AxaAV/PYIFQVGxH2+Cra3HKOcGWk7qHZBUh/Llvy+UWL6oa2MPBPmawNFq0Jm
pIIO7SJzIieGTZL/X9GDOyGA4q9onvIJ2NHekIflYDG7hu440rG2evrnkjg63sBA
QWp62b4ftpTxkvg1aLN92ciNVnajHv6Zc6HP1dBClWI26Hu8TRI=
b20wDQYJKoZIhvcNAQELBQADggEBAHWS+/zPkH34q4uN8L1EvIvDI06f4OkgfSCe
dDSUCMKS5kUx0Z8K0v/QWIEsxC/dq4ibLIQIpH3aAkJlBBGvWTDyWR5Z/rkWVvUO
TIFFbKlWc8ItxzwFI4z6QnVlju0+cO2og3hWHKVet93rUeSOKTVST1/2mKmnsuno
1312W4yxMcy1UF2x6+3l9QnmLN9nLnpQTDxunGPbxxip+FbqaNeVg63eg2Yw8nX0
+pe5cgeKCTwmOMCIwwUOCO7teIvju9KcjBuWrYu61Bihg6uIHdf/m/mjD/ajHi1W
U/ddSys6Lj7mwi7BczXktw6ovDULJ7toR+oM7Vrfa6J2do7rcrE=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIE4zCCA8ugAwIBAgIUPrOu4wcojkaOfTH+GFqYZQIeXrAwDQYJKoZIhvcNAQEL
MIIE4zCCA8ugAwIBAgIUJNcmcl6bv0hDdZtxjKiyl3IgzuQwDQYJKoZIhvcNAQEL
BQAwgYYxEzARBgoJkiaJk/IsZAEZFgNDT00xFzAVBgoJkiaJk/IsZAEZFgdFWEFN
UExFMR4wHAYDVQQLDBVDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDmNh
LmV4YW1wbGUuY29tMR0wGwYJKoZIhvcNAQkBFg5jYUBleGFtcGxlLmNvbTAgFw0y
MDEwMTIxNzQ5NDRaGA8yMDUwMTAwNTE3NDk0NFowgYYxEzARBgoJkiaJk/IsZAEZ
MTA2MTAyMzM4NTlaGA8yMDUxMDYwMzIzMzg1OVowgYYxEzARBgoJkiaJk/IsZAEZ
FgNDT00xFzAVBgoJkiaJk/IsZAEZFgdFWEFNUExFMR4wHAYDVQQLDBVDZXJ0aWZp
Y2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDmNhLmV4YW1wbGUuY29tMR0wGwYJKoZI
hvcNAQkBFg5jYUBleGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBAKWFJia5M5GJSnjxTbIW/h5Rl0/uS7jek4Rfk5fsy+2lxPk6/a+rdVXN
HtLKmF8ouG8QocYr+MQNvGedhqSv8L+ViZXlz/zh/DMk5mzQUOSi5yrjjQbOJ8oe
EAK2mXF42x4mNiNmBdUsavnaemXAoCX2f05wci0sGDS1fxUyGMV5Bay32YCrFVyh
fYUKbs9ItpMuyngIfBOVH7wa9N+XQuQIvT/ZZ2x/0PgbQWv+JFmIfMV4KuIZXuJY
M0zmoLQEjgF1kdOpyoLot4u1EmgqceZakTTRZvst4rAZqib6F5lBgsZm4ige4KAQ
jGfJlVjiPBiAo/KyJjeu/d0iwLNdsHcCAwEAAaOCAUMwggE/MB0GA1UdDgQWBBSL
cFF+Oi4WrdNajz7wc6U4i2X3OzCBxgYDVR0jBIG+MIG7gBSLcFF+Oi4WrdNajz7w
c6U4i2X3O6GBjKSBiTCBhjETMBEGCgmSJomT8ixkARkWA0NPTTEXMBUGCgmSJomT
AQoCggEBAL1BbHsj/VMqC/OwaRJLIgfMcYrLHjZL0QUkXzohuo0gqvE1pcbch7c0