PDFium Delphi Component Docs

Модуль FPdfSha1

Модуль: FPdfSha1
Реализация SHA-1 на чистом Pascal с инкрементальным контекстом init/update/final и одношаговыми помощниками, включённая для сопоставления сертификата по его отпечатку SHA-1

Syntax

TSHA1Digest = array[0..19] of Byte;

TSHA1Context = record
  State: array[0..4] of Cardinal;
  Buffer: array[0..63] of Byte;
  BufCnt: Cardinal;
  Length: UInt64;
end;

procedure SHA1Init(out Ctx: TSHA1Context);
procedure SHA1Update(var Ctx: TSHA1Context; const Buf; BufLen: Cardinal);
procedure SHA1Final(var Ctx: TSHA1Context; out Digest: TSHA1Digest);
function SHA1Bytes(const B: TBytes): TSHA1Digest;
function SHA1Of(const Buf; BufLen: Cardinal): TSHA1Digest;
function SHA1Hex(const Digest: TSHA1Digest): string;

Description

FPdfSha1 реализует SHA-1 на чистом Pascal без зависимостей помимо SysUtils, поэтому библиотека остаётся самодостаточной на каждом поддерживаемом компиляторе. Функция сжатия следует FIPS 180-4 6.1, а правило дополнения FIPS 180-4 5.1.1 дополняет сообщение до 56 mod 64 байт перед восемью байтами битовой длины в порядке big-endian. Загрузки и сохранения выполняются с явно побайтовым big-endian, что сохраняет результаты идентичными на всех процессорах, на которые нацелена библиотека

Инкрементальный API SHA1Init / SHA1Update / SHA1Final хеширует вход, подаваемый частями. SHA1Update передаёт целые 64-байтовые блоки прямо в преобразование и буферизует в TSHA1Context только остаток, поэтому подача одного большого блока и подача тех же байт по немного дают один и тот же дайджест

SHA1Bytes и SHA1Of — одношаговые помощники над байтовым массивом или нетипизированным буфером заданной длины; пустой TBytes принимается и хешируется как пустое сообщение. SHA1Hex представляет TSHA1Digest как шестнадцатеричную строку из 40 строчных символов — в таком виде обычно сравнивают отпечаток сертификата

Functions

FunctionDescription
SHA1InitИнициализирует контекст хеширования начальным состоянием из FIPS 180-4 5.3.1 и очищает его буфер и счётчики
SHA1UpdateПодаёт BufLen байт нетипизированного буфера в открытый контекст; нулевая длина — пустая операция
SHA1FinalПрименяет блок дополнения и длины, затем возвращает 20-байтовый дайджест
SHA1BytesОдношаговый хеш байтового массива
SHA1OfОдношаговый хеш нетипизированного буфера заданной длины
SHA1HexФорматирует дайджест как шестнадцатеричную строку из 40 строчных символов

Types

TypeDescription
TSHA1Digest20-байтовый дайджест SHA-1, тип результата каждой точки входа хеширования в модуле
TSHA1ContextИнкрементальный контекст хеширования: State хранит пять рабочих слов, Buffer — частичный 64-байтовый блок сообщения, BufCnt считает байты, находящиеся в буфере сейчас, а Length накапливает общую длину сообщения в байтах

Remarks

SHA-1 в этой библиотеке не является подписным дайджестом и не должен им стать. Стек PAdES на всём пути подписывает SHA-256 — и для дайджеста сообщения, и для подписанных атрибутов, и для запроса метки времени. Ничего из пути подписи переносить на этот модуль не следует

FPdfSha1 существует ради одной задачи: сопоставить сертификат с отпечатком SHA-1, который несёт TPadesSignerOptions. Токеновый бэкенд получает DER сертификата и должен выполнить это сравнение сам, поэтому он хеширует DER через SHA1Bytes и сравнивает SHA1Hex с настроенным отпечатком без учёта регистра. На Windows хранилище сертификатов разрешает отпечаток ещё при поиске сертификата, поэтому бэкенду Windows собственная реализация никогда не требовалась

Если вы ищете хеш для нового кода, это не универсальный выбор. SHA-1 непригоден везде, где важна стойкость к коллизиям, включая дайджесты документов, подписанные атрибуты и проверки целостности. Используйте вместо него FPdfSha256, либо FPdfSha512 или FPdfSha3, где нужна более длинная или иная семья дайджестов

See Also

FPdfSha256, FPdfSha512, FPdfSha3, FPdfCrypto, FPdfCryptoWin, FPdfPkcs11