hashToFiled static method

(List<int>, List<int>) hashToFiled({
  1. required String curveId,
  2. required String domainPrefix,
  3. required List<int> message,
})

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());
}