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