Skip to content

Commit 787a18a

Browse files
jellybukka
authored andcommitted
Add openssl_pkcs7_read and output P7B in openssl_pkcs7_verify
Add an optional argument to openssl_pkcs7_verify to save the P7B structure which can contain extra CA intermediate certificates send along with an S/MIME signed email. Introduce a new function called openssl_pkcs7_read, which can read a PKCS#7 structure passed as a string and returns by reference an array with PEM certificates formatted as a string.
1 parent d09edf7 commit 787a18a

File tree

5 files changed

+255
-4
lines changed

5 files changed

+255
-4
lines changed

ext/openssl/openssl.c

Lines changed: 134 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_pkcs7_verify, 0, 0, 2)
290290
ZEND_ARG_INFO(0, cainfo) /* array */
291291
ZEND_ARG_INFO(0, extracerts)
292292
ZEND_ARG_INFO(0, content)
293+
ZEND_ARG_INFO(0, pk7)
293294
ZEND_END_ARG_INFO()
294295

295296
ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_pkcs7_encrypt, 0, 0, 4)
@@ -318,6 +319,11 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_pkcs7_decrypt, 0, 0, 3)
318319
ZEND_ARG_INFO(0, recipkey)
319320
ZEND_END_ARG_INFO()
320321

322+
ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_pkcs7_read, 0, 0, 2)
323+
ZEND_ARG_INFO(0, infilename)
324+
ZEND_ARG_INFO(1, certs)
325+
ZEND_END_ARG_INFO()
326+
321327
ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_private_encrypt, 0, 0, 3)
322328
ZEND_ARG_INFO(0, data)
323329
ZEND_ARG_INFO(1, crypted)
@@ -519,6 +525,7 @@ const zend_function_entry openssl_functions[] = {
519525
PHP_FE(openssl_pkcs7_decrypt, arginfo_openssl_pkcs7_decrypt)
520526
PHP_FE(openssl_pkcs7_sign, arginfo_openssl_pkcs7_sign)
521527
PHP_FE(openssl_pkcs7_encrypt, arginfo_openssl_pkcs7_encrypt)
528+
PHP_FE(openssl_pkcs7_read, arginfo_openssl_pkcs7_read)
522529

523530
PHP_FE(openssl_private_encrypt, arginfo_openssl_private_encrypt)
524531
PHP_FE(openssl_private_decrypt, arginfo_openssl_private_decrypt)
@@ -4968,7 +4975,7 @@ PHP_FUNCTION(openssl_pbkdf2)
49684975

49694976
/* {{{ PKCS7 S/MIME functions */
49704977

4971-
/* {{{ proto bool openssl_pkcs7_verify(string filename, long flags [, string signerscerts [, array cainfo [, string extracerts [, string content]]]])
4978+
/* {{{ proto bool openssl_pkcs7_verify(string filename, long flags [, string signerscerts [, array cainfo [, string extracerts [, string content [, string pk7]]]]])
49724979
Verifys that the data block is intact, the signer is who they say they are, and returns the CERTs of the signers */
49734980
PHP_FUNCTION(openssl_pkcs7_verify)
49744981
{
@@ -4977,7 +4984,7 @@ PHP_FUNCTION(openssl_pkcs7_verify)
49774984
STACK_OF(X509) *signers= NULL;
49784985
STACK_OF(X509) *others = NULL;
49794986
PKCS7 * p7 = NULL;
4980-
BIO * in = NULL, * datain = NULL, * dataout = NULL;
4987+
BIO * in = NULL, * datain = NULL, * dataout = NULL, * p7bout = NULL;
49814988
zend_long flags = 0;
49824989
char * filename;
49834990
size_t filename_len;
@@ -4987,12 +4994,14 @@ PHP_FUNCTION(openssl_pkcs7_verify)
49874994
size_t signersfilename_len = 0;
49884995
char * datafilename = NULL;
49894996
size_t datafilename_len = 0;
4997+
char * p7bfilename = NULL;
4998+
size_t p7bfilename_len = 0;
49904999

49915000
RETVAL_LONG(-1);
49925001

4993-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "pl|papp", &filename, &filename_len,
5002+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "pl|pappp", &filename, &filename_len,
49945003
&flags, &signersfilename, &signersfilename_len, &cainfo,
4995-
&extracerts, &extracerts_len, &datafilename, &datafilename_len) == FAILURE) {
5004+
&extracerts, &extracerts_len, &datafilename, &datafilename_len, &p7bfilename, &p7bfilename_len) == FAILURE) {
49965005
return;
49975006
}
49985007

@@ -5040,6 +5049,19 @@ PHP_FUNCTION(openssl_pkcs7_verify)
50405049
goto clean_exit;
50415050
}
50425051
}
5052+
5053+
if (p7bfilename) {
5054+
5055+
if (php_openssl_open_base_dir_chk(p7bfilename)) {
5056+
goto clean_exit;
5057+
}
5058+
5059+
p7bout = BIO_new_file(p7bfilename, "w");
5060+
if (p7bout == NULL) {
5061+
php_openssl_store_errors();
5062+
goto clean_exit;
5063+
}
5064+
}
50435065
#if DEBUG_SMIME
50445066
zend_printf("Calling PKCS7 verify\n");
50455067
#endif
@@ -5081,12 +5103,19 @@ PHP_FUNCTION(openssl_pkcs7_verify)
50815103
php_error_docref(NULL, E_WARNING, "signature OK, but cannot open %s for writing", signersfilename);
50825104
RETVAL_LONG(-1);
50835105
}
5106+
5107+
if (p7bout) {
5108+
PEM_write_bio_PKCS7(p7bout, p7);
5109+
}
50845110
}
50855111
} else {
50865112
php_openssl_store_errors();
50875113
RETVAL_FALSE;
50885114
}
50895115
clean_exit:
5116+
if (p7bout) {
5117+
BIO_free(p7bout);
5118+
}
50905119
X509_STORE_free(store);
50915120
BIO_free(datain);
50925121
BIO_free(in);
@@ -5230,6 +5259,107 @@ PHP_FUNCTION(openssl_pkcs7_encrypt)
52305259
}
52315260
/* }}} */
52325261

5262+
/* {{{ proto bool openssl_pkcs7_read(string P7B, array &certs)
5263+
Exports the PKCS7 file to an array of PEM certificates */
5264+
PHP_FUNCTION(openssl_pkcs7_read)
5265+
{
5266+
zval * zout = NULL, zcert;
5267+
char *p7b;
5268+
size_t p7b_len;
5269+
STACK_OF(X509) *certs = NULL;
5270+
STACK_OF(X509_CRL) *crls = NULL;
5271+
BIO * bio_in = NULL, * bio_out = NULL;
5272+
PKCS7 * p7 = NULL;
5273+
int i;
5274+
5275+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/", &p7b, &p7b_len,
5276+
&zout) == FAILURE) {
5277+
return;
5278+
}
5279+
5280+
RETVAL_FALSE;
5281+
5282+
PHP_OPENSSL_CHECK_SIZE_T_TO_INT(p7b_len, p7b);
5283+
5284+
bio_in = BIO_new(BIO_s_mem());
5285+
if (bio_in == NULL) {
5286+
goto clean_exit;
5287+
}
5288+
5289+
if (0 >= BIO_write(bio_in, p7b, (int)p7b_len)) {
5290+
php_openssl_store_errors();
5291+
goto clean_exit;
5292+
}
5293+
5294+
p7 = PEM_read_bio_PKCS7(bio_in, NULL, NULL, NULL);
5295+
if (p7 == NULL) {
5296+
php_openssl_store_errors();
5297+
goto clean_exit;
5298+
}
5299+
5300+
switch (OBJ_obj2nid(p7->type)) {
5301+
case NID_pkcs7_signed:
5302+
if (p7->d.sign != NULL) {
5303+
certs = p7->d.sign->cert;
5304+
crls = p7->d.sign->crl;
5305+
}
5306+
break;
5307+
case NID_pkcs7_signedAndEnveloped:
5308+
if (p7->d.signed_and_enveloped != NULL) {
5309+
certs = p7->d.signed_and_enveloped->cert;
5310+
crls = p7->d.signed_and_enveloped->crl;
5311+
}
5312+
break;
5313+
default:
5314+
break;
5315+
}
5316+
5317+
zval_dtor(zout);
5318+
array_init(zout);
5319+
5320+
if (certs != NULL) {
5321+
for (i = 0; i < sk_X509_num(certs); i++) {
5322+
X509* ca = sk_X509_value(certs, i);
5323+
5324+
bio_out = BIO_new(BIO_s_mem());
5325+
if (bio_out && PEM_write_bio_X509(bio_out, ca)) {
5326+
BUF_MEM *bio_buf;
5327+
BIO_get_mem_ptr(bio_out, &bio_buf);
5328+
ZVAL_STRINGL(&zcert, bio_buf->data, bio_buf->length);
5329+
add_index_zval(zout, i, &zcert);
5330+
BIO_free(bio_out);
5331+
}
5332+
}
5333+
}
5334+
5335+
if (crls != NULL) {
5336+
for (i = 0; i < sk_X509_CRL_num(crls); i++) {
5337+
X509_CRL* crl = sk_X509_CRL_value(crls, i);
5338+
5339+
bio_out = BIO_new(BIO_s_mem());
5340+
if (bio_out && PEM_write_bio_X509_CRL(bio_out, crl)) {
5341+
BUF_MEM *bio_buf;
5342+
BIO_get_mem_ptr(bio_out, &bio_buf);
5343+
ZVAL_STRINGL(&zcert, bio_buf->data, bio_buf->length);
5344+
add_index_zval(zout, i, &zcert);
5345+
BIO_free(bio_out);
5346+
}
5347+
}
5348+
}
5349+
5350+
RETVAL_TRUE;
5351+
5352+
clean_exit:
5353+
if (bio_in != NULL) {
5354+
BIO_free(bio_in);
5355+
}
5356+
5357+
if (p7 != NULL) {
5358+
PKCS7_free(p7);
5359+
}
5360+
}
5361+
/* }}} */
5362+
52335363
/* {{{ proto bool openssl_pkcs7_sign(string infile, string outfile, mixed signcert, mixed signkey, array headers [, long flags [, string extracertsfilename]])
52345364
Signs the MIME message in the file named infile with signcert/signkey and output the result to file name outfile. headers lists plain text headers to exclude from the signed portion of the message, and should include to, from and subject as a minimum */
52355365

ext/openssl/php_openssl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ PHP_FUNCTION(openssl_pkcs7_verify);
9797
PHP_FUNCTION(openssl_pkcs7_decrypt);
9898
PHP_FUNCTION(openssl_pkcs7_sign);
9999
PHP_FUNCTION(openssl_pkcs7_encrypt);
100+
PHP_FUNCTION(openssl_pkcs7_read);
100101

101102
PHP_FUNCTION(openssl_error_string);
102103

ext/openssl/tests/cert.p7b

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
-----BEGIN PKCS7-----
2+
MIIDnQYJKoZIhvcNAQcCoIIDjjCCA4oCAQExADALBgkqhkiG9w0BBwGgggNwMIID
3+
bDCCAtWgAwIBAgIJAK7FVsxyN1CiMA0GCSqGSIb3DQEBBQUAMIGBMQswCQYDVQQG
4+
EwJCUjEaMBgGA1UECBMRUmlvIEdyYW5kZSBkbyBTdWwxFTATBgNVBAcTDFBvcnRv
5+
IEFsZWdyZTEeMBwGA1UEAxMVSGVucmlxdWUgZG8gTi4gQW5nZWxvMR8wHQYJKoZI
6+
hvcNAQkBFhBobmFuZ2Vsb0BwaHAubmV0MB4XDTA4MDYzMDEwMjg0M1oXDTA4MDcz
7+
MDEwMjg0M1owgYExCzAJBgNVBAYTAkJSMRowGAYDVQQIExFSaW8gR3JhbmRlIGRv
8+
IFN1bDEVMBMGA1UEBxMMUG9ydG8gQWxlZ3JlMR4wHAYDVQQDExVIZW5yaXF1ZSBk
9+
byBOLiBBbmdlbG8xHzAdBgkqhkiG9w0BCQEWEGhuYW5nZWxvQHBocC5uZXQwgZ8w
10+
DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMteno+QK1ulX4/WDAVBYfoTPRTze4SZ
11+
Lwgael4jwWTytj+8c5nNllrFELD6WjJzfjaoIMhCF4w4I2bkWR6/PTqrvnv+iiiI
12+
tHfKvJgYqIobUhkiKmWa2wL3mgqvNRIqTrTC4jWZuCkxQ/ksqL9O/F6zk+aRS1d+
13+
KbPaqCR5Rw+lAgMBAAGjgekwgeYwHQYDVR0OBBYEFNt+QHK9XDWF7CkpgRLoYmhq
14+
tz99MIG2BgNVHSMEga4wgauAFNt+QHK9XDWF7CkpgRLoYmhqtz99oYGHpIGEMIGB
15+
MQswCQYDVQQGEwJCUjEaMBgGA1UECBMRUmlvIEdyYW5kZSBkbyBTdWwxFTATBgNV
16+
BAcTDFBvcnRvIEFsZWdyZTEeMBwGA1UEAxMVSGVucmlxdWUgZG8gTi4gQW5nZWxv
17+
MR8wHQYJKoZIhvcNAQkBFhBobmFuZ2Vsb0BwaHAubmV0ggkArsVWzHI3UKIwDAYD
18+
VR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCP1GUnStC0TBqngr3Kx+zSUW8K
19+
utKO0ORc5R8aV/x9LlaJrzPyQJgiPpu5hXogLSKRIHxQS3X2+Y0VvIpW72LWPVKP
20+
hYlNtO3oKnfoJGKin0eEhXRZMjfEW/kznY+ZZmNifV2r8s+KhNAqI4PbClvn4vh8
21+
xF/9+eVEj+hM+0OflKEAMQA=
22+
-----END PKCS7-----
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
--TEST--
2+
openssl_pkcs7_read() tests
3+
--SKIPIF--
4+
<?php if (!extension_loaded("openssl")) print "skip"; ?>
5+
--FILE--
6+
<?php
7+
$infile = file_get_contents(dirname(__FILE__) . "/cert.p7b");
8+
$certfile = file_get_contents(dirname(__FILE__) . "/cert.crt");
9+
$result = [];
10+
11+
var_dump(openssl_pkcs7_read());
12+
var_dump(openssl_pkcs7_read(""));
13+
var_dump(openssl_pkcs7_read("", $result));
14+
var_dump(openssl_pkcs7_read($certfile, $result));
15+
var_dump(openssl_pkcs7_read($infile, $result));
16+
var_dump($result);
17+
?>
18+
--EXPECTF--
19+
20+
Warning: openssl_pkcs7_read() expects exactly 2 parameters, 0 given in %s on line %d
21+
NULL
22+
23+
Warning: openssl_pkcs7_read() expects exactly 2 parameters, 1 given in %s on line %d
24+
NULL
25+
bool(false)
26+
bool(false)
27+
bool(true)
28+
array(1) {
29+
[0]=>
30+
string(1249) "-----BEGIN CERTIFICATE-----
31+
MIIDbDCCAtWgAwIBAgIJAK7FVsxyN1CiMA0GCSqGSIb3DQEBBQUAMIGBMQswCQYD
32+
VQQGEwJCUjEaMBgGA1UECBMRUmlvIEdyYW5kZSBkbyBTdWwxFTATBgNVBAcTDFBv
33+
cnRvIEFsZWdyZTEeMBwGA1UEAxMVSGVucmlxdWUgZG8gTi4gQW5nZWxvMR8wHQYJ
34+
KoZIhvcNAQkBFhBobmFuZ2Vsb0BwaHAubmV0MB4XDTA4MDYzMDEwMjg0M1oXDTA4
35+
MDczMDEwMjg0M1owgYExCzAJBgNVBAYTAkJSMRowGAYDVQQIExFSaW8gR3JhbmRl
36+
IGRvIFN1bDEVMBMGA1UEBxMMUG9ydG8gQWxlZ3JlMR4wHAYDVQQDExVIZW5yaXF1
37+
ZSBkbyBOLiBBbmdlbG8xHzAdBgkqhkiG9w0BCQEWEGhuYW5nZWxvQHBocC5uZXQw
38+
gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMteno+QK1ulX4/WDAVBYfoTPRTz
39+
e4SZLwgael4jwWTytj+8c5nNllrFELD6WjJzfjaoIMhCF4w4I2bkWR6/PTqrvnv+
40+
iiiItHfKvJgYqIobUhkiKmWa2wL3mgqvNRIqTrTC4jWZuCkxQ/ksqL9O/F6zk+aR
41+
S1d+KbPaqCR5Rw+lAgMBAAGjgekwgeYwHQYDVR0OBBYEFNt+QHK9XDWF7CkpgRLo
42+
Ymhqtz99MIG2BgNVHSMEga4wgauAFNt+QHK9XDWF7CkpgRLoYmhqtz99oYGHpIGE
43+
MIGBMQswCQYDVQQGEwJCUjEaMBgGA1UECBMRUmlvIEdyYW5kZSBkbyBTdWwxFTAT
44+
BgNVBAcTDFBvcnRvIEFsZWdyZTEeMBwGA1UEAxMVSGVucmlxdWUgZG8gTi4gQW5n
45+
ZWxvMR8wHQYJKoZIhvcNAQkBFhBobmFuZ2Vsb0BwaHAubmV0ggkArsVWzHI3UKIw
46+
DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCP1GUnStC0TBqngr3Kx+zS
47+
UW8KutKO0ORc5R8aV/x9LlaJrzPyQJgiPpu5hXogLSKRIHxQS3X2+Y0VvIpW72LW
48+
PVKPhYlNtO3oKnfoJGKin0eEhXRZMjfEW/kznY+ZZmNifV2r8s+KhNAqI4PbClvn
49+
4vh8xF/9+eVEj+hM+0OflA==
50+
-----END CERTIFICATE-----
51+
"
52+
}

ext/openssl/tests/openssl_pkcs7_verify_basic.phpt

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ if ($contentfile === false) {
1414
die("failed to get a temporary filename!");
1515
}
1616

17+
$pkcsfile = dirname(__FILE__) . "/openssl_pkcs7_verify__pkcsfile.tmp";
18+
1719
$infile = dirname(__FILE__) . "/cert.crt";
1820
$eml = dirname(__FILE__) . "/signed.eml";
1921
$wrong = "wrong";
@@ -26,6 +28,8 @@ var_dump(openssl_pkcs7_verify($eml, 0));
2628
var_dump(openssl_pkcs7_verify($eml, 0, $empty));
2729
var_dump(openssl_pkcs7_verify($eml, PKCS7_NOVERIFY, $outfile));
2830
var_dump(openssl_pkcs7_verify($eml, PKCS7_NOVERIFY, $outfile, $cainfo, $outfile, $contentfile));
31+
var_dump(openssl_pkcs7_verify($eml, PKCS7_NOVERIFY, $outfile, $cainfo, $outfile, $contentfile, $pkcsfile));
32+
var_dump(file_get_contents($pkcsfile));
2933

3034
if (file_exists($outfile)) {
3135
echo "true\n";
@@ -37,12 +41,54 @@ if (file_exists($contentfile)) {
3741
unlink($contentfile);
3842
}
3943
?>
44+
--CLEAN--
45+
<?php
46+
if (file_exists($pkcsfile)) {
47+
unlink($pkcsfile);
48+
}
49+
?>
4050
--EXPECTF--
4151
int(-1)
4252
int(-1)
4353
bool(false)
4454
bool(false)
4555
bool(true)
4656
bool(true)
57+
bool(true)
58+
string(2062) "-----BEGIN PKCS7-----
59+
MIIFzQYJKoZIhvcNAQcCoIIFvjCCBboCAQExDzANBglghkgBZQMEAgEFADALBgkq
60+
hkiG9w0BBwGgggNwMIIDbDCCAtWgAwIBAgIJAK7FVsxyN1CiMA0GCSqGSIb3DQEB
61+
BQUAMIGBMQswCQYDVQQGEwJCUjEaMBgGA1UECBMRUmlvIEdyYW5kZSBkbyBTdWwx
62+
FTATBgNVBAcTDFBvcnRvIEFsZWdyZTEeMBwGA1UEAxMVSGVucmlxdWUgZG8gTi4g
63+
QW5nZWxvMR8wHQYJKoZIhvcNAQkBFhBobmFuZ2Vsb0BwaHAubmV0MB4XDTA4MDYz
64+
MDEwMjg0M1oXDTA4MDczMDEwMjg0M1owgYExCzAJBgNVBAYTAkJSMRowGAYDVQQI
65+
ExFSaW8gR3JhbmRlIGRvIFN1bDEVMBMGA1UEBxMMUG9ydG8gQWxlZ3JlMR4wHAYD
66+
VQQDExVIZW5yaXF1ZSBkbyBOLiBBbmdlbG8xHzAdBgkqhkiG9w0BCQEWEGhuYW5n
67+
ZWxvQHBocC5uZXQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMteno+QK1ul
68+
X4/WDAVBYfoTPRTze4SZLwgael4jwWTytj+8c5nNllrFELD6WjJzfjaoIMhCF4w4
69+
I2bkWR6/PTqrvnv+iiiItHfKvJgYqIobUhkiKmWa2wL3mgqvNRIqTrTC4jWZuCkx
70+
Q/ksqL9O/F6zk+aRS1d+KbPaqCR5Rw+lAgMBAAGjgekwgeYwHQYDVR0OBBYEFNt+
71+
QHK9XDWF7CkpgRLoYmhqtz99MIG2BgNVHSMEga4wgauAFNt+QHK9XDWF7CkpgRLo
72+
Ymhqtz99oYGHpIGEMIGBMQswCQYDVQQGEwJCUjEaMBgGA1UECBMRUmlvIEdyYW5k
73+
ZSBkbyBTdWwxFTATBgNVBAcTDFBvcnRvIEFsZWdyZTEeMBwGA1UEAxMVSGVucmlx
74+
dWUgZG8gTi4gQW5nZWxvMR8wHQYJKoZIhvcNAQkBFhBobmFuZ2Vsb0BwaHAubmV0
75+
ggkArsVWzHI3UKIwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQCP1GUn
76+
StC0TBqngr3Kx+zSUW8KutKO0ORc5R8aV/x9LlaJrzPyQJgiPpu5hXogLSKRIHxQ
77+
S3X2+Y0VvIpW72LWPVKPhYlNtO3oKnfoJGKin0eEhXRZMjfEW/kznY+ZZmNifV2r
78+
8s+KhNAqI4PbClvn4vh8xF/9+eVEj+hM+0OflDGCAiEwggIdAgEBMIGPMIGBMQsw
79+
CQYDVQQGEwJCUjEaMBgGA1UECBMRUmlvIEdyYW5kZSBkbyBTdWwxFTATBgNVBAcT
80+
DFBvcnRvIEFsZWdyZTEeMBwGA1UEAxMVSGVucmlxdWUgZG8gTi4gQW5nZWxvMR8w
81+
HQYJKoZIhvcNAQkBFhBobmFuZ2Vsb0BwaHAubmV0AgkArsVWzHI3UKIwDQYJYIZI
82+
AWUDBAIBBQCggeQwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0B
83+
CQUxDxcNMTcwNTIyMTAxMDU1WjAvBgkqhkiG9w0BCQQxIgQg37MSoxw91phVhwUO
84+
MeurwtXAXK1ADEeYYl/7Bfmz4CsweQYJKoZIhvcNAQkPMWwwajALBglghkgBZQME
85+
ASowCwYJYIZIAWUDBAEWMAsGCWCGSAFlAwQBAjAKBggqhkiG9w0DBzAOBggqhkiG
86+
9w0DAgICAIAwDQYIKoZIhvcNAwICAUAwBwYFKw4DAgcwDQYIKoZIhvcNAwICASgw
87+
DQYJKoZIhvcNAQEBBQAEgYAw4XcsQ4BIhEuRNspG8RqPE9ODCrTWwXPSQ4B9fzks
88+
KUAsqcefO8AfifY+uuq3/k6Prhl23U5ILth/0fUAIGFLTcIZziaGTwbpgcmRSmNi
89+
jBxatHyKVaGJNGqij5KRk8vhEpy5mwOzmkUzYa0r4teXjyfnKhI/h1vUrO3kKybC
90+
5Q==
91+
-----END PKCS7-----
92+
"
4793
true
4894
true

0 commit comments

Comments
 (0)