MGF
Mask Generation Function マスク生成関数
RFC 8017 付録 B.2.にハッシュ関数を使ったMGF1がある RFC 8692 8702 RSASSA-PSSでXOFを使える? XOFはそのまま出力長を指定して使ってもいい。 SHAKE128, SHAKE256 のみの想定か?
関係なさそう
ECDSAではMGFではなくハッシュ関数として固定長出力でSHAKE128, SHAKE256を使用する EdDSAではEd448でSHAKE256を利用する 将来的に付録BにXOFも追加されそう
マスク関数なので出力結果はすぐにXOR される。そこまで含めてみてもいいかも。
MGF1
Hash ハッシュ関数
入力 byte[] mgfSeed seed値
int 出力長(バイト単位)
int c = 0;
mgfSeed に 4バイトc++ を繋げてHashを計算する
出力長になるまでHashを繋げてくり返す
不要な末尾を切り取り返す
たぶんこんなかんじ
code:MGF1
byte[] generate(MessageDigest hash, byte[] mgfSeed, long maskLen) {
// maskLen が出力可能範囲であること
int hLen = hash.getDigestLength();
long cn = (maskLen + hLen - 1) / hLen; // 繰り返し数
for ( long c = 0; c < cn; c++ ) {
hash.update(mfgSeed);
hash.update((int)c); // c を 4バイトにしたもの (要変換)
int len = (c < cn - 1) ? hLen : (mgf.length - hLen * c);
System.arraycopy(hash.digest(), 0, mgf, hLen * c, len); // mgf の頭から詰める
}
return mgf;
}
CTRモード的な動作かな
MGFXOF (仮名)
XOF XOF CMSで使えるのはSHAKE128, SHAKE256
入力 byte[] mgfSeed seed値
int 出力長
XOFに出力長を指定する
mgfSeedからXOFを計算する
code:MGFXOF
byte[] generate(XOF xof, byte[] mgfSeed, int maskLen) {
xof.setDigestLength(maskLen);
xof.update(mgfSeed);
return xof.digest();
}
注意: 出力長によって内容が変化するもの(KMAC,TupleHash,ParallelHashのXOFがつかないもの)はXOFではない