hashToFiled static method
Implementation
static (List<int>, List<int>) hashToFiled({
required String curveId,
required String domainPrefix,
required List<int> message,
}) {
final List<int> domainBytes = StringUtils.encode(domainPrefix);
final List<int> curveIdBytes = StringUtils.encode(curveId);
const int chunkLen = 64;
final totalLength = 22 + curveId.length + domainPrefix.length;
List<int> hash(List<List<int>> values) {
final b = BLAKE2b(
digestLength: chunkLen,
config: Blake2bConfig(personalization: List<int>.filled(16, 0)),
);
for (final i in values) {
b.update(i);
}
return b.digest();
}
final b0 = hash([
List<int>.filled(128, 0),
message,
[0, chunkLen * 2, 0],
domainBytes,
"-".codeUnits,
curveIdBytes,
"_XMD:BLAKE2b_SSWU_RO_".codeUnits,
[totalLength],
]);
final b1 = hash([
b0,
[1],
domainBytes,
"-".codeUnits,
curveIdBytes,
"_XMD:BLAKE2b_SSWU_RO_".codeUnits,
[totalLength],
]);
final b2 = hash([
...List.generate(b0.length, (index) => [b0[index] ^ b1[index]]),
[2],
domainBytes,
"-".codeUnits,
curveIdBytes,
"_XMD:BLAKE2b_SSWU_RO_".codeUnits,
[totalLength],
]);
return (b1.reversed.toList(), b2.reversed.toList());
}