cryptoSignOpen function

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

Implementation

int cryptoSignOpen(
    Uint8List m, Uint8List sm, int n, Uint8List pk, String hashMode) {
  var tweetNacl = tweet_nacl.TweetNaCl();
  int i;
  var t = Uint8List(32);
  var h = Uint8List(64);
  var p = [gf(), gf(), gf(), gf()];
  var q = [gf(), gf(), gf(), gf()];

  if (64 > n) {
    return -1;
  }

  if (tweet_nacl.TweetNaCl.unpackneg(q, pk) != 0) {
    return -1;
  }

  for (i = 0; i < n; i++) {
    m[i] = sm[i];
  }

  for (i = 0; 32 > i; i++) {
    m[i + 32] = pk[i];
  }

  crypto_hash(h, m, n, hashMode);
  tweet_nacl.TweetNaCl.reduce(h);
  tweetNacl.scalarmult(p, q, h, 0);

  tweet_nacl.TweetNaCl.scalarbase(q, sm.sublist(32, sm.length), 0);
  tweet_nacl.TweetNaCl.add(p, q);
  tweetNacl.pack(t, p);
  n -= 64;
  var longArr = Uint8List(sm.length);
  for (var k = 0; k < longArr.length; k++) {
    longArr[k] = sm[k];
  }

  if (tweet_nacl.TweetNaCl.crypto_verify_32(longArr, t) != 0) {
    for (i = 0; i < n; i++) {
      m[i] = 0;
    }
    return -1;
  }
  for (var k = 0; k < longArr.length; k++) {
    sm[k] = longArr[k];
  }

  for (i = 0; i < n; i++) {
    m[i] = sm[i + 64];
  }
  return n;
}