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 implementa SHA-1 in puro Pascal, senza dipendenze oltre SysUtils, così la libreria resta autonoma su ogni compilatore supportato. La funzione di compressione segue FIPS 180-4 6.1, e la regola di padding di FIPS 180-4 5.1.1 porta il messaggio a 56 mod 64 byte prima di otto byte di lunghezza in bit big-endian. Load e store sono big-endian espliciti a livello di byte, il che mantiene risultati identici su ogni CPU a cui la libreria punta
L'API incrementale SHA1Init / SHA1Update / SHA1Final calcola l'hash di un input presentato a blocchi. SHA1Update passa i blocchi interi da 64 byte direttamente alla trasformazione e bufferizza solo il resto in TSHA1Context, così fornire un grande blocco in una volta o fornire gli stessi byte pochi alla volta produce lo stesso digest
SHA1Bytes e SHA1Of sono helper a chiamata singola su un array di byte o un buffer non tipizzato di una data lunghezza; un TBytes vuoto è accettato e viene calcolato come messaggio vuoto. SHA1Hex rende un TSHA1Digest come stringa esadecimale minuscola di 40 caratteri, che è la forma in cui un thumbprint di certificato viene normalmente confrontato
| Function | Description |
|---|---|
SHA1Init | Inizializza un contesto di hashing allo stato iniziale di FIPS 180-4 5.3.1 e azzera il suo buffer e i suoi contatori |
SHA1Update | Introduce BufLen byte di un buffer non tipizzato in un contesto aperto; una lunghezza zero è un no-op |
SHA1Final | Applica il blocco di padding e lunghezza, poi restituisce il digest di 20 byte |
SHA1Bytes | Hash a chiamata singola di un array di byte |
SHA1Of | Hash a chiamata singola di un buffer non tipizzato di una data lunghezza |
SHA1Hex | Formatta un digest come stringa esadecimale minuscola di 40 caratteri |
| Type | Description |
|---|---|
TSHA1Digest | Digest SHA-1 di 20 byte, il tipo di risultato di ogni entry point di hashing dell'unità |
TSHA1Context | Contesto di hashing incrementale: State contiene le cinque parole di lavoro, Buffer contiene il blocco di messaggio parziale da 64 byte, BufCnt conta i byte attualmente in quel buffer, e Length accumula la lunghezza totale del messaggio in byte |
SHA-1 non è un digest di firma in questa libreria e non deve diventarlo. Lo stack PAdES firma SHA-256 ovunque, per il digest del messaggio, gli attributi firmati e la richiesta di timestamp allo stesso modo. Nulla del percorso di firma deve essere spostato su questa unità
FPdfSha1 esiste per un solo compito: abbinare un certificato al thumbprint SHA-1 che TPadesSignerOptions porta. Un backend di token riceve il DER del certificato e deve fare quel confronto da sé, quindi calcola l'hash del DER con SHA1Bytes e confronta SHA1Hex con il thumbprint configurato, senza distinguere maiuscole e minuscole. Su Windows lo store dei certificati risolve il thumbprint durante la ricerca del certificato, così il backend Windows non ha mai avuto bisogno di una propria implementazione
Se state cercando un hash per codice nuovo, questa non è la scelta generale. SHA-1 non è adatto ovunque la resistenza alle collisioni conti, compresi i digest dei documenti, gli attributi firmati e i controlli di integrità. Usate FPdfSha256 al suo posto, o FPdfSha512 oppure FPdfSha3 quando si vuole una famiglia di digest più lunga o diversa