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;
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 строчных символов — в таком виде обычно сравнивают отпечаток сертификата
| Function | Description |
|---|---|
SHA1Init | Инициализирует контекст хеширования начальным состоянием из FIPS 180-4 5.3.1 и очищает его буфер и счётчики |
SHA1Update | Подаёт BufLen байт нетипизированного буфера в открытый контекст; нулевая длина — пустая операция |
SHA1Final | Применяет блок дополнения и длины, затем возвращает 20-байтовый дайджест |
SHA1Bytes | Одношаговый хеш байтового массива |
SHA1Of | Одношаговый хеш нетипизированного буфера заданной длины |
SHA1Hex | Форматирует дайджест как шестнадцатеричную строку из 40 строчных символов |
| Type | Description |
|---|---|
TSHA1Digest | 20-байтовый дайджест SHA-1, тип результата каждой точки входа хеширования в модуле |
TSHA1Context | Инкрементальный контекст хеширования: State хранит пять рабочих слов, Buffer — частичный 64-байтовый блок сообщения, BufCnt считает байты, находящиеся в буфере сейчас, а Length накапливает общую длину сообщения в байтах |
SHA-1 в этой библиотеке не является подписным дайджестом и не должен им стать. Стек PAdES на всём пути подписывает SHA-256 — и для дайджеста сообщения, и для подписанных атрибутов, и для запроса метки времени. Ничего из пути подписи переносить на этот модуль не следует
FPdfSha1 существует ради одной задачи: сопоставить сертификат с отпечатком SHA-1, который несёт TPadesSignerOptions. Токеновый бэкенд получает DER сертификата и должен выполнить это сравнение сам, поэтому он хеширует DER через SHA1Bytes и сравнивает SHA1Hex с настроенным отпечатком без учёта регистра. На Windows хранилище сертификатов разрешает отпечаток ещё при поиске сертификата, поэтому бэкенду Windows собственная реализация никогда не требовалась
Если вы ищете хеш для нового кода, это не универсальный выбор. SHA-1 непригоден везде, где важна стойкость к коллизиям, включая дайджесты документов, подписанные атрибуты и проверки целостности. Используйте вместо него FPdfSha256, либо FPdfSha512 или FPdfSha3, где нужна более длинная или иная семья дайджестов