cryptoSign static method
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;
}