Как вы кодируете байты потока списка отзыва сертификатов (CRL) в PDF? - PullRequest
0 голосов
/ 27 февраля 2020

Я подписываю PDF и добавляю версию обновления, в которой я пишу DSS с его CRL, Certs, VRI.

19 0 obj
    [15 0 R 16 0 R]
endobj
20 0 obj
    [13 0 R 14 0 R]
endobj
11 0 obj
    [15 0 R 16 0 R]
endobj
12 0 obj 
    [13 0 R 14 0 R]
endobj
17 0 obj
<<
    /CRL 11 0 R
    /Cert 12 0 R
>>
endobj
18 0 obj
<<
    /5F44CF6F351DFD45FB62F3D0ED046408BC892797 17 0 R
>>
endobj
21 0 obj
<<
    /VRI 18 0 R
    /CRLs 19 0 R
    /Certs 20 0 R
>>

Я не совсем понимаю, как следует Я пишу потоки сертификатов и CRL.

15 0 obj
<<
    /Length 1454
    /Filter /FlateDecode
>>
stream
xÚ3hb0hb{ÅÄÈhÀÉƪÍÇÌ$ÅÊ`àcÈä2‡²°    3…Šˆ€8\¼®y%E¥Å%:žyÉz†ªÊ
ZbXd{0%KW÷ýY¯’ó‚-ØÂÛ„OÏó½z•î    ‰`®•®   K-›2}tÖ§^_8;xÉì¥Ó®~›.g9A'Õüê½—
ZbXd{0%KW÷ýY¯’ó‚-ØÂÛ„OÏó½z•î    ‰`®•®   K-›2}tÖ§^_8;xÉì¥Ó®~›.g9A'Õüê½— 
endstream
endobj

16 0 obj
<<
    /Length 1477
    /Filter /FlateDecode
>>
stream
„kâR7Å41*!‡#8Íñ3 Ź˜@‰o=«‡çƒ#yë:X]r\~}¼)/Ñmç×£¦³äsËê]ÓÕ_+µ¥$Ô¿}¾ÜÏiÁÝT!¹ôi–Í9üÀ}Š¸|
ìŒH¿GÓø^ú¿ÔVÜK–qõ†µ®“¸»Ý*Žh¾JzåU7c~÷•ÔêýK*îú®¹¸DcÁ­³·NtV~Vóåíé5\‚&½|¶NäïŽ[K­
î›NRZbXd{0%KW÷ýY¯’ó‚-ØÂÛ„OÏó½z•î    ‰`®•®   K-›2}tÖ§^_8;xÉì¥Ó®~›.g9A'Õüê½—›oÇ:ç-¶?
endstream
endobj

13 0 obj
<<
    /Length 1240
    /Filter /FlateDecode
>>
stream
%ŸwC[í2×¾Iej©úkŽ-:ݳÔ<¼a£ƒô/5›‡~zÒ•7ü9uãcfk?ËÅ`ßÃ:Èb—’‚Ÿõ{ÏÅ—¢{]HçQ”9w(ÂB#í×g¥ìþè
^–F«š/r§š¿ì=#,^pëO€{äú=}RÎêð¦ÉŠ7or¼±Ëtë–x·˜§LÌŒŒ‹› Cd0€eùÿ³°03±>0P ñUY$
endstream
endobj

14 0 obj
<<
    /Length 1159
    /Filter /FlateDecode
>>
stream
4!>T‚êPpÎI,.V0Ò™@ûœºƒ=LÍš•ãˆ‘•¹‰‘Ÿ(ÎÅÔÄÈÈplŽ÷A¯¹7k/[‡O\}
öe™¨îö£œ¶ä'¶ÌpžªweÞª[¡$¼ØÍþþtó[½xÉO4ÞZ¥ØŸ^g ø,mu„_Rz™_PÏê.||º¶*þîÝxv½"»êôó»ø%Ü%ý
endstream
endobj

Пожалуйста, игнорируйте длину и содержание потоков выше. Я обрезал их, чтобы длины больше не соответствовали. Потоки больше этого.

Проблема в том, что мой PDF не поддерживает LTV , и я протестировал некоторый сценарий ios, из которого я пришел к выводу, что мой поток записывается неправильно way.

Я использую следующую структуру из WinCrypt.h :

typedef struct _CERT_CONTEXT {
    DWORD                   dwCertEncodingType;
    BYTE                    *pbCertEncoded;
    DWORD                   cbCertEncoded;
    PCERT_INFO              pCertInfo;
    HCERTSTORE              hCertStore;
} CERT_CONTEXT, *PCERT_CONTEXT;
typedef const CERT_CONTEXT *PCCERT_CONTEXT;

I go через них и получаю байты следующим образом:

PCCERT_CONTEXT  cngContext = (PCCERT_CONTEXT)(*itChain);
ByteArray certBytes(cngContext->pbCertEncoded, (size_t)cngContext->cbCertEncoded);

Затем я просто применяю FlateDecode к полученным байтам и записываю их в PDF как поток, как вы можете видеть во втором блоке кода.

Я что-то пропустил? Как преобразование или что-то? Я видел, что поток должен быть в кодировке BER. Так я должен преобразовать байты в BER-кодированный и затем применить FlateDecode?

Редактировать:

Вы можете найти Мой файл здесь

1 Ответ

0 голосов
/ 05 марта 2020

РЕШЕНИЕ

Проблема заключалась в потоке CRL, которые я писал в файле PDF.

Наличие структур CRL_CONTEXT из каждого Сертификат, я просто взял переменную pbCrlEncoded и записал ее прямо в поток CRL.

enter image description here

enter image description here

Это казалось правильным, но я заметил, что у меня нет CRL_ENTRY в CRL_INFO этой структуры, поэтому закодированные байты не содержат никакого списка отозванных сертификатов. Поэтому обнаружил, что сертификаты имеют URL-адрес, откуда можно загрузить обновленный CRL. Вы можете сделать это, открыв Управление сертификатами компьютера в Windows -> найдите свой сертификат и Откройте сертификат -> Подробности -> CRL Distribution Очки -> URL = ".." . Получив доступ к этому URL, браузер автоматически загружает информацию о CRL. Вы можете получить к нему доступ и увидеть некоторые сведения, такие как Следующее обновление , которое является последним днем, когда этот список действителен. После этого я предполагаю, что вам нужно скачать его снова для получения обновленной версии. Также вы можете увидеть сам список отозванных сертификатов.

Это список, который мне нужно было добавить в потоки CRL в PDF. Поэтому я нашел способ сделать этот процесс загрузки по коду. Вот фрагмент кода:

PCERT_CHAIN_ELEMENT chainElement; // this is the certification in the chain
pExtension = CertFindExtension(szOID_CRL_DIST_POINTS, chainElement->pCertContext->pCertInfo->cExtension, chainElement->pCertContext->pCertInfo->rgExtension);
if (!pExtension)
    return ByteArray();

if (!CryptDecodeObject(X509_ASN_ENCODING, szOID_CRL_DIST_POINTS, pExtension->Value.pbData, pExtension->Value.cbData, 0, 0, &cbStructInfo))
    return ByteArray();

if (!(pvStructInfo = LocalAlloc(LMEM_FIXED, cbStructInfo)))
    return ByteArray();

CryptDecodeObject(X509_ASN_ENCODING, szOID_CRL_DIST_POINTS, pExtension->Value.pbData, pExtension->Value.cbData, 0, pvStructInfo, &cbStructInfo);

pInfo = (CRL_DIST_POINTS_INFO*)pvStructInfo;

Net::HttpRequest req;
Net::HttpRequestOptions ops;
ops.verb = Net::GET;
crllist = req.send(pInfo->rgDistPoint->DistPointName.FullName.rgAltEntry->pwszURL);

Таким образом, я получил байты, которые я мог вставить в PDF после применения к ним кода FlateDecode. Теперь PDF включен LTV.

...