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 implementuje SHA-1 w czystym Pascalu, bez zależności poza SysUtils, więc biblioteka pozostaje samowystarczalna na każdym obsługiwanym kompilatorze. Funkcja kompresji trzyma się FIPS 180-4 6.1, a reguła dopełnienia z FIPS 180-4 5.1.1 uzupełnia komunikat do 56 mod 64 bajtów przed ośmioma bajtami długości w bitach zapisanymi big-endian. Odczyty i zapisy są bajt po bajcie jawnie big-endian, co utrzymuje identyczne wyniki na każdym procesorze, na który celuje biblioteka
Inkrementalne API SHA1Init / SHA1Update / SHA1Final haszuje wejście dostarczane fragmentami. SHA1Update przekazuje pełne bloki 64-bajtowe wprost do transformacji i buforuje w TSHA1Context tylko resztę, więc podanie jednego dużego bloku i podanie tych samych bajtów po kilka naraz daje ten sam skrót
SHA1Bytes i SHA1Of to jednorazowe funkcje pomocnicze działające na tablicy bajtów albo na nietypowanym buforze o podanej długości; puste TBytes jest akceptowane i haszowane jako pusty komunikat. SHA1Hex renderuje TSHA1Digest jako 40-znakowy szesnastkowy napis małymi literami, bo w tej postaci zwykle porównuje się odcisk certyfikatu
| Function | Description |
|---|---|
SHA1Init | Inicjalizuje kontekst haszujący do stanu początkowego z FIPS 180-4 5.3.1 i czyści jego bufor oraz liczniki |
SHA1Update | Podaje BufLen bajtów z nietypowanego bufora do otwartego kontekstu; zerowa długość jest operacją pustą |
SHA1Final | Nakłada dopełnienie i blok długości, po czym zwraca 20-bajtowy skrót |
SHA1Bytes | Jednorazowy skrót tablicy bajtów |
SHA1Of | Jednorazowy skrót nietypowanego bufora o podanej długości |
SHA1Hex | Formatuje skrót jako 40-znakowy szesnastkowy napis małymi literami |
| Type | Description |
|---|---|
TSHA1Digest | 20-bajtowy skrót SHA-1, typ wyniku każdego punktu wejścia haszującego w tym module |
TSHA1Context | Inkrementalny kontekst haszujący: State przechowuje pięć słów roboczych, Buffer przechowuje częściowy 64-bajtowy blok komunikatu, BufCnt liczy bajty obecne aktualnie w tym buforze, a Length akumuluje łączną długość komunikatu w bajtach |
SHA-1 nie jest w tej bibliotece skrótem podpisu i nie może się nim stać. Stos PAdES podpisuje konsekwentnie SHA-256: zarówno dla skrótu komunikatu, jak i dla atrybutów podpisanych oraz żądania znacznika czasu. Nic ze ścieżki podpisywania nie powinno być przenoszone do tego modułu
FPdfSha1 istnieje dla jednego zadania: dopasowania certyfikatu do odcisku SHA-1, który niesie TPadesSignerOptions. Zaplecze tokenów otrzymuje certyfikat DER i musi samo wykonać to porównanie, więc haszuje DER przez SHA1Bytes i porównuje SHA1Hex ze skonfigurowanym odciskiem, bez rozróżniania wielkości liter. Na Windows magazyn certyfikatów rozwiązuje odcisk podczas wyszukiwania certyfikatu, więc zaplecze Windows nigdy nie potrzebowało własnej implementacji
Jeśli szukasz hasza do nowego kodu, to nie jest wybór ogólnego przeznaczenia. SHA-1 nie nadaje się tam, gdzie odporność na kolizje ma znaczenie, także dla skrótów dokumentów, atrybutów podpisanych i kontroli integralności. Użyj zamiast tego FPdfSha256, a tam, gdzie pożądany jest dłuższy skrót albo inna rodzina skrótów, FPdfSha512 lub FPdfSha3