verify method
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);
}