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 implementiert SHA-1 in purem Pascal, ohne Abhängigkeit über SysUtils hinaus, sodass die Bibliothek auf jedem unterstützten Compiler in sich geschlossen bleibt. Die Kompressionsfunktion folgt FIPS 180-4 6.1, und die Padding-Regel aus FIPS 180-4 5.1.1 padet die Nachricht auf 56 mod 64 Bytes, bevor acht Bytes Bitlänge im Big-Endian-Format folgen. Lade- und Speicheroperationen sind byteexplizit Big-Endian, wodurch die Ergebnisse auf jeder CPU, die die Bibliothek ansteuert, identisch ausfallen
Die inkrementelle API SHA1Init/SHA1Update/SHA1Final hasht Eingaben, die in Blöcken angeliefert werden. SHA1Update reicht ganze 64-Byte-Blöcke direkt an die Transformation durch und puffert nur den Rest in TSHA1Context, sodass ein einzelner großer Block und dieselben Bytes in kleinen Häppchen denselben Digest ergeben
SHA1Bytes und SHA1Of sind Ein-Durchlauf-Helfer über ein Byte-Array beziehungsweise einen untypisierten Puffer gegebener Länge; ein leeres TBytes wird akzeptiert und hasht als leere Nachricht. SHA1Hex gibt einen TSHA1Digest als kleingeschriebenen 40-Zeichen-Hex-String aus, der Form, in der ein Zertifikats-Fingerprint üblicherweise verglichen wird
| Funktion | Beschreibung |
|---|---|
SHA1Init | Initialisiert einen Hashing-Kontext auf den Anfangszustand aus FIPS 180-4 5.3.1 und leert Puffer und Zähler |
SHA1Update | Speist BufLen Bytes eines untypisierten Puffers in einen offenen Kontext; eine Länge von null ist ein No-Op |
SHA1Final | Wendet den Padding- und Längenblock an und liefert danach den 20-Byte-Digest |
SHA1Bytes | Ein-Durchlauf-Hash eines Byte-Arrays |
SHA1Of | Ein-Durchlauf-Hash eines untypisierten Puffers gegebener Länge |
SHA1Hex | Formatiert einen Digest als kleingeschriebenen 40-Zeichen-Hex-String |
| Typ | Beschreibung |
|---|---|
TSHA1Digest | 20-Byte-SHA-1-Digest, der Ergebnistyp aller Hashing-Einstiegspunkte der Unit |
TSHA1Context | Inkrementeller Hashing-Kontext: State hält die fünf Arbeitswörter, Buffer den unvollständigen 64-Byte-Nachrichtenblock, BufCnt zählt die derzeit im Puffer liegenden Bytes, und Length summiert die Gesamtnachrichtenlänge in Bytes |
SHA-1 ist in dieser Bibliothek kein Signatur-Digest und darf keiner werden. Der PAdES-Stack signiert durchgängig SHA-256, gleichermaßen für den Nachrichten-Digest, die signierten Attribute und die Zeitstempelanforderung. Nichts aus dem Signaturpfad sollte auf diese Unit verschoben werden
FPdfSha1 existiert für genau eine Aufgabe: ein Zertifikat gegen den SHA-1-Fingerprint abzugleichen, den TPadesSignerOptions mitbringt. Ein Token-Backend erhält den Zertifikats-DER und muss diesen Vergleich selbst führen, also hasht es den DER mit SHA1Bytes und vergleicht SHA1Hex ohne Rücksicht auf Groß- und Kleinschreibung mit dem konfigurierten Fingerprint. Unter Windows löst der Zertifikatsspeicher den Fingerprint bereits bei der Zertifikatssuche auf, deshalb brauchte das Windows-Backend nie eine eigene Implementierung
Wer einen Hash für neuen Code sucht, sollte hier nicht zugreifen: SHA-1 ist ungeeignet, wo Kollisionsresistenz zählt, etwa bei Dokument-Digests, signierten Attributen und Integritätsprüfungen. Verwenden Sie stattdessen FPdfSha256, oder FPdfSha512 beziehungsweise FPdfSha3, wenn eine längere oder eine andere Digest-Familie gewünscht ist