ed25519Verify function

bool ed25519Verify(
  1. Uint8List publicKey32,
  2. Uint8List message,
  3. Uint8List signature64
)

Verifies a 64-byte Ed25519 signature64 over message under publicKey32.

Implementation

bool ed25519Verify(
  Uint8List publicKey32,
  Uint8List message,
  Uint8List signature64,
) {
  if (publicKey32.length != 32) return false;
  if (signature64.length != 64) return false;

  final rEnc = Uint8List.fromList(signature64.sublist(0, 32));
  final sEnc = Uint8List.fromList(signature64.sublist(32, 64));

  final sScalar = edBytesToBigInt(sEnc);
  // Reject non-canonical S (S must be < L).
  if (sScalar >= ed25519L) return false;

  EdPoint aPoint;
  EdPoint rPoint;
  try {
    aPoint = edBytesToPoint(publicKey32);
    rPoint = edBytesToPoint(rEnc);
  } on ArgumentError {
    return false;
  }

  // k = SHA-512(Renc || A || msg) reduced mod L.
  final k = _hashToScalar(sha512(_concat([rEnc, publicKey32, message])));

  // Check [S]B == R + [k]A.
  final lhs = edScalarMult(sScalar, ed25519G);
  final rhs = edPointAdd(rPoint, edScalarMult(k, aPoint));

  return _bytesEqual(edPointToBytes(lhs), edPointToBytes(rhs));
}