cryptoSign static method

int cryptoSign(
  1. Uint8List sm,
  2. int dummy,
  3. Uint8List m,
  4. int moff,
  5. int n,
  6. Uint8List sk,
)

Implementation

static int cryptoSign(Uint8List sm, int dummy, Uint8List m, final int moff,
    int /*long*/ n, Uint8List sk) {
  Uint8List d = Uint8List(64), h = Uint8List(64), r = Uint8List(64);

  int i, j;

  Uint64List x = Uint64List(64);
  List<Uint64List?> p = List<Uint64List?>.filled(4, Uint64List(0));

  p[0] = Uint64List(16);
  p[1] = Uint64List(16);
  p[2] = Uint64List(16);
  p[3] = Uint64List(16);

  Uint8List pk = Nano.pkFromSecret(sk);

  Blake2bDigest blake2b = Blake2bDigest(digestSize: 64);
  blake2b.update(sk, 0, sk.length);
  blake2b.doFinal(d, 0);
  d[0] &= 248;
  d[31] &= 127;
  d[31] |= 64;

  int smlen = n + 64;
  for (i = 0; i < n; i++) sm[64 + i] = m[i + moff];
  for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i];

  blake2b = Blake2bDigest(digestSize: 64);
  blake2b.update(sm.sublist(32), 0, sm.sublist(32).length);
  blake2b.doFinal(r, 0);

  _reduce(r);
  _scalarbase(p, r, 0);
  _pack(sm, p);

  for (i = 32; i < 64; i++) sm[i] = pk[i - 32];

  blake2b = Blake2bDigest(digestSize: 64);
  blake2b.update(sm, 0, sm.length);
  blake2b.doFinal(h, 0);

  _reduce(h);

  for (i = 0; i < 64; i++) x[i] = 0;
  for (i = 0; i < 32; i++) x[i] = r[i];
  for (i = 0; i < 32; i++) {
    for (j = 0; j < 32; j++) {
      x[i + j] += h[i] * d[j];
    }
  }
  _modL(sm, 32, x);

  return smlen;
}