verify method

Future<bool> verify(
  1. Uint8List publicKey,
  2. Uint8List message,
  3. Uint8List sig
)

Implementation

Future<bool> verify(
    Uint8List publicKey, Uint8List message, Uint8List sig) async {
  if (publicKey.length != PublicKeySize) {
    throw ("bad publicKey length");
  }
  if (sig.length != SignatureSize || sig[63] & 224 != 0) {
    return false;
  }

  var A = ExtendedGroupElement();
  var publicKeyBytes = Uint8List.fromList(publicKey);
  if (!A.FromBytes(publicKeyBytes)) {
    return false;
  }
  FeNeg(A.X, A.X);
  FeNeg(A.T, A.T);

  var input = Sha512().newHashSink();
  input.add(sig.sublist(0, 32));
  //input.add(publicKeyBytes);
  input.add(message);
  input.close();

  var hash = await input.hash();

  Uint8List digest = Uint8List.fromList(hash.bytes);

  var hReduced = Uint8List(32);
  ScReduce(hReduced, digest as Uint8List);

  var R = ProjectiveGroupElement();
  var s = sig.sublist(32);

  if (!ScMinimal(s)) {
    return false;
  }

  GeDoubleScalarMultVartime(R, hReduced, A, s);

  var checkR = Uint8List(32);
  R.ToBytes(checkR);
  Function eq = const ListEquality().equals;
  return eq(sig.sublist(0, 32), checkR);
}