7.1.3. DeriveKeyPair (鍵ペアの導出)
7.1.3. DeriveKeyPair (鍵ペアの導出)
DeriveKeyPair() が生成する鍵は, 提供された入力鍵素材と同じだけのエントロピーしか持ちません。特定の KEM に対して, DeriveKeyPair() に与えられる ikm パラメータは少なくとも Nsk の長さを持つべきであり, 少なくとも Nsk バイトのエントロピーを持つべきです。
任意の DHKEM の DeriveKeyPair() 関数における KDF 関数 (LabeledExtract や LabeledExpand など) のすべての呼び出しは, DHKEM の関連 KDF を使用します (暗号スイートの KDF ではありません)。
P-256, P-384, および P-521 の場合, KEM の DeriveKeyPair() 関数は体要素に対してリジェクションサンプリングを実行します:
def DeriveKeyPair(ikm):
dkp_prk = LabeledExtract("", "dkp_prk", ikm)
sk = 0
counter = 0
while sk == 0 or sk >= order:
if counter > 255:
raise DeriveKeyPairError
bytes = LabeledExpand(dkp_prk, "candidate",
I2OSP(counter, 1), Nsk)
bytes[0] = bytes[0] & bitmask
sk = OS2IP(bytes)
counter = counter + 1
return (sk, pk(sk))
order は使用される曲線の位数です ([NISTCurves] のセクション D.1.2 を参照)。完全を期すため以下にリストします。
P-256:
0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551
P-384:
0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf
581a0db248b0a77aecec196accc52973
P-521:
0x01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409
bitmask は P-256 および P-384 に対して 0xFF, P-521 に対して 0x01 と定義されます。DeriveKeyPairError で DeriveKeyPair() が失敗する正確な可能性は使用されるグループに依存しますが, すべての場合で無視できるほど小さいです。このような失敗の処理に関する情報についてはセクション 8.2 を参照してください。
X25519 および X448 の場合, DeriveKeyPair() 関数は入力に KDF を適用します:
def DeriveKeyPair(ikm):
dkp_prk = LabeledExtract("", "dkp_prk", ikm)
sk = LabeledExpand(dkp_prk, "sk", "", Nsk)
return (sk, pk(sk))