verify method

  1. @override
bool verify(
  1. Uint8List bytes,
  2. Encrypted signature
)
override

Verify encrypted signature.

Implementation

@override
bool verify(Uint8List bytes, Encrypted signature) {
  if (publicKey == null) {
    throw StateError("Can't verify without a public key, null given.");
  }

  final hash = Uint8List(_digestCipher.digestSize);

  _digestCipher
    ..reset()
    ..update(bytes, 0, bytes.length)
    ..doFinal(hash, 0);

  _cipher
    ..reset()
    ..init(false, _publicKeyParams!);

  var signature0 = Uint8List(_cipher.outputBlockSize);

  try {
    final length = _cipher.processBlock(signature.bytes, 0, signature.bytes.length, signature0, 0);
    signature0 = signature0.sublist(0, length);
  } on ArgumentError {
    return false;
  }

  final expected = _encode(hash);

  if (signature0.length == expected.length) {
    for (var i = 0; i < signature0.length; i++) {
      if (signature0[i] != expected[i]) {
        return false;
      }
    }

    return true;
  } else if (signature0.length == expected.length - 2) {
    final sigOffset = signature0.length - hash.length - 2;
    final expectedOffset = expected.length - hash.length - 2;

    expected[1] -= 2;
    expected[3] -= 2;

    var nonEqual = 0;

    for (var i = 0; i < hash.length; i++) {
      nonEqual |= signature0[sigOffset + i] ^ expected[expectedOffset + i];
    }

    for (int i = 0; i < sigOffset; i++) {
      nonEqual |= signature0[i] ^ expected[i];
    }

    return nonEqual == 0;
  } else {
    return false;
  }
}