メインコンテンツまでスキップ

3.6. Variants (バリアント)

3.6. Variants (バリアント)

決定論的 (EC)DSA の仕様の多くの部分はかなり恣意的ですが, 相互運用性の理由で選択が行われました。このセクションでは, いくつかの可能なバリアントについて説明します。

使用されるハッシュ関数 H は, 署名生成プロセスで2つの異なる目的に使用されます: 最初に入力メッセージを処理し, 次に HMAC の基礎として (それ自体もハッシュ関数です)。この文書では, 両方の用途に同じハッシュ関数を使用することを指定しています。ただし, これは必須ではありません。これら2つの役割に異なる関数を使用することは可能です。主な欠点は, テストベクトルがすべての組み合わせをカバーできないことです。単一のハッシュ関数を使用すると, 相互運用性テストが簡素化されます。

int2octetsbits2octets の定義は rlen ビット (つまり qlen を次の 8 の倍数に切り上げたもの) の出力につながり, 使用時に実際に最大で qlen ビットのエントロピーを生成します。正確に qlen ビットを出力するように同じ関数を定義することは可能でしょう。ただし, 多くのプログラミング言語やフレームワークはビットシーケンスではなくオクテットのシーケンスで動作する傾向があるため, 実装がわずかに複雑になります。一方, qlen の切り上げは最大で 7 ビットを追加し, PRNG シードのコンテキストでは無視できます。

この仕様では, k (bits2int を介して T から取得) が適切な範囲にない場合, または r のゼロ値を生成する場合の特殊なケースでループするプロセスを規定しています。ただし, これらのケースはどちらも実際には発生しません。後者のケース (計算された r がゼロ) は, ソフトウェアバグ (たとえば, プログラム実行中に楕円曲線パラメータが破損する) によってのみ発生する可能性があります。したがって, 実装はループする代わりに, そのようなケースを回復不可能なエラーとして扱い, 署名計算を単純に中止することを選択できます。