crypto_sign function
Implementation
int crypto_sign(
Uint8List sm, Uint8List m, int n, Uint8List sk, String hashMode) {
var tweetNacl = tweet_nacl.TweetNaCl();
var d = Uint8List(64);
var h = Uint8List(64);
var r = Uint8List(64);
var i = 0;
var j = 0;
var x = Int32List(64);
var p = [gf(), gf(), gf(), gf()];
crypto_hash(d, sk, 32, hashMode);
d[0] &= 248;
d[31] &= 127;
d[31] |= 64;
var smlen = n + 64;
for (i = 0; i < n; i++) {
sm[64 + i] = m[i];
}
for (i = 0; i < 32; i++) {
sm[32 + i] = d[32 + i];
}
crypto_hash(r, sm.sublist(32, sm.length), n + 32, hashMode);
tweet_nacl.TweetNaCl.reduce(r);
tweet_nacl.TweetNaCl.scalarbase(p, r, 0);
var longArr = Uint8List(sm.length);
for (var k = 0; k < longArr.length; k++) {
longArr[k] = sm[k];
}
tweetNacl.pack(longArr, p);
for (var k = 0; k < longArr.length; k++) {
sm[k] = longArr[k];
}
for (i = 32; i < 64; i++) {
sm[i] = sk[i];
}
crypto_hash(h, sm, n + 64, hashMode);
tweet_nacl.TweetNaCl.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];
}
}
var range = Uint8List.fromList(sm.sublist(32, sm.length));
tweet_nacl.TweetNaCl.modL(range, 0, x);
for (var k = 0; k < range.length; k++) {
sm[k + 32] = range[k];
}
return smlen;
}