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 implémente SHA-1 en pur Pascal, sans autre dépendance que SysUtils, si bien que la bibliothèque reste autonome sur chaque compilateur pris en charge. La fonction de compression suit FIPS 180-4 6.1, et la règle de remplissage de FIPS 180-4 5.1.1 comble le message à 56 mod 64 octets avant huit octets de longueur en bits gros boutiste. Les chargements et stockages sont gros boutistes explicites à l’octet, ce qui garde des résultats identiques sur chaque CPU ciblé par la bibliothèque
L’API incrémentale SHA1Init / SHA1Update / SHA1Final hache une entrée fournie par morceaux. SHA1Update passe les blocs entiers de 64 octets directement à la transformation et ne met en tampon que le reste dans TSHA1Context, de sorte que fournir un grand bloc d’un coup ou fournir les mêmes octets quelques-uns à la fois produit le même condensé
SHA1Bytes et SHA1Of sont des aides en un seul appel sur un tableau d’octets ou un tampon non typé d’une longueur donnée ; un TBytes vide est accepté et se hache comme le message vide. SHA1Hex rend un TSHA1Digest sous forme de chaîne hexadécimale minuscule de 40 caractères, qui est la forme sous laquelle une empreinte de certificat est normalement comparée
| Function | Description |
|---|---|
SHA1Init | Initialise un contexte de hachage à l’état initial de FIPS 180-4 5.3.1 et efface son tampon et ses compteurs |
SHA1Update | Injecte BufLen octets d’un tampon non typé dans un contexte ouvert ; une longueur nulle est un no-op |
SHA1Final | Applique le bloc de remplissage et de longueur, puis renvoie le condensé de 20 octets |
SHA1Bytes | Hachage en un seul appel d’un tableau d’octets |
SHA1Of | Hachage en un seul appel d’un tampon non typé d’une longueur donnée |
SHA1Hex | Met en forme un condensé sous forme de chaîne hexadécimale minuscule de 40 caractères |
| Type | Description |
|---|---|
TSHA1Digest | Condensé SHA-1 de 20 octets, le type de résultat de chaque point d’entrée de hachage de l’unité |
TSHA1Context | Contexte de hachage incrémental : State contient les cinq mots de travail, Buffer contient le bloc de message partiel de 64 octets, BufCnt compte les octets actuellement dans ce tampon, et Length accumule la longueur totale du message en octets |
SHA-1 n’est pas un condensé de signature dans cette bibliothèque et ne doit pas le devenir. La pile PAdES signe en SHA-256 partout, tant pour le condensé de message que pour les attributs signés et la demande d’horodatage. Rien du chemin de signature ne doit être déplacé vers cette unité
FPdfSha1 existe pour un unique travail : rapprocher un certificat de l’empreinte SHA-1 que porte TPadesSignerOptions. Un backend de jeton reçoit le DER du certificat et doit faire cette comparaison lui-même, il hache donc le DER avec SHA1Bytes et compare SHA1Hex à l’empreinte configurée, sans tenir compte de la casse. Sous Windows, le magasin de certificats résout l’empreinte pendant la recherche du certificat, si bien que le backend Windows n’a jamais eu besoin de sa propre implémentation
Si vous cherchez un hachage pour du code nouveau, ce n’est pas le choix généraliste. SHA-1 ne convient pas partout où la résistance aux collisions compte, y compris les condensés de document, les attributs signés et les contrôles d’intégrité. Utilisez FPdfSha256 à la place, ou FPdfSha512 ou FPdfSha3 lorsqu’une famille de condensés plus longue ou différente est voulue