Загрузка документов с шифрованием по публичному ключу
Документы, зашифрованные security handler'ом по публичному ключу (/Filter /Adobe.PPKLite или /Adobe.PubSec, /SubFilter adbe.pkcs7.s4/s5), теперь загружаются, если вызывающая сторона передаёт приватный ключ получателя
Ключевой материал
Присвойте THotPDF.PubSecKeyMaterial (объект THPDFPFXKeyMaterial из HPDFParsePFX) до вызова LoadFromFile. Во время prescan в ограниченном диапазоне восстанавливается file key: каждый конверт /Recipients разворачивается приватным ключом RSA-OAEP (seed и разрешения извлекаются из CMS EnvelopedData), а file key заново выводится точно так же, как это делает writer — SHA-256 от seed плюс конверты для AES-256, SHA-1 для устаревших длин ключа
Выбор получателя
PubSecRecipientQuery (reference to function(Context: Pointer; RecipientCount: Integer): Integer) выбирает, какой индекс конверта развернёт переданный ключ; без callback перебираются все получатели, пока какой-нибудь не развернётся. PubSecRecipientQueryContext переносит состояние вызывающей стороны
Исправления writer'а
Round-trip вскрыл три дефекта writer'а, все исправлены: конверты получателей портились при binary-through-Unicode round-trip строк, дайджест file key хешировал байты конверта со сдвигом в один байт, а строки /Recipients шифровались как обычные строки (любому viewer они нужны в открытом виде); теперь конверты исключаются из шифрования явным флагом SkipEncryption у строкового объекта