crypto_sign function

int crypto_sign(
  1. Uint8List sm,
  2. Uint8List m,
  3. int n,
  4. Uint8List sk,
  5. String hashMode,
)

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