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 は SHA-1 を Pure-Pascal で実装し、SysUtils 以外に依存しないため、ライブラリは対応するすべてのコンパイラで自己完結しています。圧縮関数は FIPS 180-4 6.1 に従い、FIPS 180-4 5.1.1 のパディング規則はビッグエンディアンのビット長 8 バイトの前にメッセージを 56 mod 64 バイトへパディングします。ロードとストアはバイト単位で明示的なビッグエンディアンなので、ライブラリが対象とするすべての CPU で同じ結果になります
インクリメンタルな SHA1Init / SHA1Update / SHA1Final API は、分割して渡された入力をハッシュします。SHA1Update は 64 バイトの完全なブロックをそのまま変換に渡し、残りだけを TSHA1Context にバッファします。大きなブロックを 1 回で渡しても、同じバイトを少しずつ渡しても、同じダイジェストになります
SHA1Bytes と SHA1Of は、バイト配列または指定長の非型付きバッファに対する 1 回呼び出しのヘルパーです。空の TBytes も受け付け、空のメッセージとしてハッシュします。SHA1Hex は TSHA1Digest を小文字の 40 文字の 16 進文字列にレンダリングします。証明書サムプリントの比較は通常この形式で行われます
| 関数 | 説明 |
|---|---|
SHA1Init | ハッシュコンテキストを FIPS 180-4 5.3.1 の初期状態に初期化し、バッファとカウンタをクリアします |
SHA1Update | 非型付きバッファの BufLen バイトを開いているコンテキストに供給します。長さ 0 は何もしません |
SHA1Final | パディングと長さのブロックを適用し、20 バイトのダイジェストを返します |
SHA1Bytes | バイト配列の 1 回呼び出しハッシュです |
SHA1Of | 指定長の非型付きバッファの 1 回呼び出しハッシュです |
SHA1Hex | ダイジェストを小文字の 40 文字の 16 進文字列に整形します |
| 型 | 説明 |
|---|---|
TSHA1Digest | 20 バイトの SHA-1 ダイジェストです。このユニットのすべてのハッシュ用エントリポイントの結果型です |
TSHA1Context | インクリメンタルなハッシュコンテキストです。State は 5 つの作業ワードを保持し、Buffer は 64 バイトの部分メッセージブロックを保持し、BufCnt はそのバッファ内の現在のバイト数を数え、Length はメッセージの総長をバイト単位で累積します |
SHA-1 はこのライブラリでは署名用のダイジェストではなく、そうなってはいけません。PAdES スタックは、メッセージダイジェスト、signed attributes、タイムスタンプ要求のいずれにも SHA-256 で署名します。署名経路の何もこのユニットに移してはいけません
FPdfSha1 が存在するのは 1 つの仕事のためです。TPadesSignerOptions が運ぶ SHA-1 サムプリントに対して証明書を照合することです。トークンバックエンドは証明書の DER を受け取り、その比較を自分で行う必要があるため、SHA1Bytes で DER をハッシュし、SHA1Hex を設定されたサムプリントと大文字小文字を無視して比較します。Windows では証明書ストアが証明書の検索中にサムプリントを解決するため、Windows バックエンドは独自の実装を必要としたことがありません
新しいコード向けのハッシュを探しているなら、これは汎用の選択ではありません。SHA-1 は、文書ダイジェスト、signed attributes、完全性チェックをはじめ、衝突耐性が重要なすべての場面で不適切です。代わりに FPdfSha256 を使い、より長い、あるいは異なるダイジェスト族が必要なら FPdfSha512 や FPdfSha3 を使ってください