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 以純 Pascal 實作 SHA-1,除 SysUtils 之外沒有其他相依,因此本程式庫在所有支援的編譯器上保持自包含。壓縮函式遵循 FIPS 180-4 6.1,FIPS 180-4 5.1.1 的填充規則先把訊息填充到 56 mod 64 位元組,再附加八個位元組的大尾序位元長度。載入與儲存都是逐位元組顯式的大尾序,因此結果在程式庫面向的所有 CPU 上都一致
遞增式 SHA1Init / SHA1Update / SHA1Final API 對分塊提交的輸入做雜湊。SHA1Update 把完整的 64 位元組區塊直接交給變換,只把剩餘部分緩衝在 TSHA1Context 中,因此一次餵入一個大區塊與分幾次餵入相同位元組得到相同的摘要
SHA1Bytes 與 SHA1Of 是針對位元組陣列或給定長度不具型別緩衝區的一次性輔助函式;空的 TBytes 會被接受並按空訊息雜湊。SHA1Hex 把 TSHA1Digest 輸出為小寫的 40 字元十六進位字串,憑證指紋通常以這種形式進行比對
| Function | Description |
|---|---|
SHA1Init | 把雜湊上下文初始化為 FIPS 180-4 5.3.1 的初始狀態,並清空其緩衝區與計數器 |
SHA1Update | 把不具型別緩衝區的 BufLen 個位元組餵入開啟的上下文;長度為零時不產生任何作用 |
SHA1Final | 套用填充與長度區塊,然後傳回 20 位元組摘要 |
SHA1Bytes | 對位元組陣列做一次性雜湊 |
SHA1Of | 對給定長度的不具型別緩衝區做一次性雜湊 |
SHA1Hex | 把摘要格式化為小寫的 40 字元十六進位字串 |
| Type | Description |
|---|---|
TSHA1Digest | 20 位元組 SHA-1 摘要,單元中所有雜湊進入點的結果型別 |
TSHA1Context | 遞增雜湊上下文:State 保存五個工作字詞,Buffer 保存未滿的 64 位元組訊息區塊,BufCnt 統計緩衝區中目前的位元組數,Length 以位元組累加訊息總長度 |
在本程式庫中 SHA-1 不是簽章摘要,也絕不能變成簽章摘要。PAdES 堆疊全程使用 SHA-256 簽章,訊息摘要、已簽屬性與時間戳記請求概莫能外。簽章路徑上的任何環節都不應移到本單元上
FPdfSha1 只為一件事而存在:把憑證與 TPadesSignerOptions 攜帶的 SHA-1 指紋進行比對。權杖後端拿到的是憑證 DER,必須自己做這一比對,因此它用 SHA1Bytes 對 DER 做雜湊,再把 SHA1Hex 的結果與設定的指紋做不分大小寫的比對。在 Windows 上,憑證存放區在憑證查詢期間就完成了指紋解析,因此 Windows 後端從來不需要自己的實作
如果你在為新程式碼尋找雜湊,這裡不是通用之選。凡是在意抗碰撞性的場景,包括文件摘要、已簽屬性與完整性檢查,SHA-1 都不適用。請改用 FPdfSha256;需要更長或其他摘要族時可用 FPdfSha512 或 FPdfSha3