MGF
Mask Generation Function マスク生成関数
PKCS #1 の RSASSA-PSS, RSAES-OAEPで使われるmgfSeedからマスクを生成する関数
RFC 8017 付録 B.2.にハッシュ関数を使ったMGF1がある
IEEE 1363, ANSI X9.44 でも同じ定義あり?
RFC 8692 8702 RSASSA-PSSでXOFを使える? XOFはそのまま出力長を指定して使ってもいい。
SHAKE128, SHAKE256 のみの想定か?
RSASSA-PSSではXOFも利用可能
RSAES-OAEPでは現状MGF1のみかもしれない
関係なさそう
ECDSAではMGFではなくハッシュ関数として固定長出力でSHAKE128, SHAKE256を使用する
EdDSAではEd448でSHAKE256を利用する
将来的に付録BにXOFも追加されそう
マスク関数なので出力結果はすぐにXOR される。そこまで含めてみてもいいかも。
MGF1
RFC 4055 Additional Algorithms and Identifiers for RSA Cryptography for use in the Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile
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; // 繰り返し数
byte[] mgf = new bytehLen * (int)cn;
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;
}
https://github.com/okomeki/SoftLibCrypto/blob/master/src/main/java/net/siisise/security/padding/MGF1.java
code:id-mgf1
sha1Identifier AlgorithmIdentifier ::= { id-sha1, NULL }
sha224Identifier AlgorithmIdentifier ::= { id-sha224, NULL }
sha256Identifier AlgorithmIdentifier ::= { id-sha256, NULL }
sha384Identifier AlgorithmIdentifier ::= { id-sha384, NULL }
sha512Identifier AlgorithmIdentifier ::= { id-sha512, NULL }
id-mgf1 OBJECT IDENTIFIER ::= { pkcs-1 8 }
mgf1SHA1Identifier AlgorithmIdentifier ::=
{ id-mgf1, sha1Identifier }
mgf1SHA224Identifier AlgorithmIdentifier ::=
{ id-mgf1, sha224Identifier }
mgf1SHA256Identifier AlgorithmIdentifier ::=
{ id-mgf1, sha256Identifier }
mgf1SHA384Identifier AlgorithmIdentifier ::=
{ id-mgf1, sha384Identifier }
mgf1SHA512Identifier AlgorithmIdentifier ::=
{ id-mgf1, sha512Identifier }
CTRモード的な動作かな
MGFXOF (仮名)
RSASSA-PSSだけでMGFの代わりに使えるので未定義
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();
}
https://github.com/okomeki/SoftLibCrypto/blob/master/src/main/java/net/siisise/security/padding/MGFXOF.java
注意: 出力長によって内容が変化するもの(KMAC,TupleHash,ParallelHashのXOFがつかないもの)はXOFではない