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 implementeert SHA-1 in pure Pascal, zonder andere afhankelijkheid dan SysUtils, zodat de bibliotheek zelfstandig blijft op elke ondersteunde compiler. De compressiefunctie volgt FIPS 180-4 6.1, en de paddingregel van FIPS 180-4 5.1.1 vult de boodschap aan tot 56 mod 64 bytes vóór acht bytes big-endian bitlengte. Loads en stores zijn byte-explicitiek big-endian, waardoor de resultaten op elke CPU waarop de bibliotheek zich richt identiek blijven
De incrementele SHA1Init / SHA1Update / SHA1Final-API hasht invoer die in delen wordt aangeboden. SHA1Update geeft hele 64-byte-blokken rechtstreeks door aan de transformatie en buffert alleen de rest in TSHA1Context, zodat één groot blok aanvoeren en dezelfde bytes een paar tegelijk aanvoeren dezelfde digest opleveren
SHA1Bytes en SHA1Of zijn one-shot-hulpfuncties over een byte-array of een niet-getypeerde buffer van een gegeven lengte; een lege TBytes wordt geaccepteerd en gehasht als de lege boodschap. SHA1Hex zet een TSHA1Digest om in een hexadecimale string van 40 kleine letters, de vorm waarin een certificaat-thumbprint normaal wordt vergeleken
| Function | Description |
|---|---|
SHA1Init | Initialiseert een hashcontext naar de begintoestand van FIPS 180-4 5.3.1 en wist zijn buffer en tellers |
SHA1Update | Voert BufLen bytes van een niet-getypeerde buffer in een open context in; een lengte van nul is een no-op |
SHA1Final | Past het padding- en lengteblok toe en geeft vervolgens de 20-byte digest terug |
SHA1Bytes | One-shot-hash van een byte-array |
SHA1Of | One-shot-hash van een niet-getypeerde buffer van een gegeven lengte |
SHA1Hex | Formatteert een digest als hexadecimale string van 40 kleine letters |
| Type | Description |
|---|---|
TSHA1Digest | 20-byte SHA-1-digest, het resultaattype van elk hash-entry point in de unit |
TSHA1Context | Incrementele hashcontext: State bevat de vijf werkvariabelen, Buffer bevat het gedeeltelijke 64-byte-boodschapsblok, BufCnt telt de bytes die zich momenteel in die buffer bevinden, en Length houdt de totale boodschapslengte in bytes bij |
SHA-1 is in deze bibliotheek geen ondertekeningsdigest en dat moet het ook niet worden. De PAdES-stack ondertekent doorlopend met SHA-256, zowel voor de message digest als voor de signed attributes en het timestamp-verzoek. Niets uit het ondertekeningspad zou naar deze unit moeten worden verplaatst
FPdfSha1 bestaat voor één taak: een certificaat vergelijken met de SHA-1-thumbprint die TPadesSignerOptions meedraagt. Een tokenbackend ontvangt certificaat-DER en moet die vergelijking zelf uitvoeren, dus hij hasht de DER met SHA1Bytes en vergelijkt SHA1Hex met de geconfigureerde thumbprint, zonder onderscheid van hoofdletters. Op Windows lost de certificaatstore de thumbprint al op tijdens het certificaatopzoeken, dus de Windows-backend had nooit een eigen implementatie nodig
Wie een hash voor nieuwe code zoekt, zit hier niet goed. SHA-1 is ongeschikt waar botsingsweerstand ertoe doet, waaronder documentdigests, signed attributes en integriteitscontroles. Gebruik in plaats daarvan FPdfSha256, of FPdfSha512 of FPdfSha3 waar een langere of een andere digestfamilie gewenst is