verifySignatureOfHash method
Verify the validity of a signature
Implementation
bool verifySignatureOfHash(
Uint8List signature,
Uint8List hash,
HashAlgorithm digestAlgorithm,
) {
// Decrypt the signature and remove the PKCS1 padding
final param = PublicKeyParameter<RSAPublicKey>(publicKey);
final rsa = PKCS1Encoding(RSAEngine());
rsa.init(false, param);
final Uint8List sig;
try {
sig = rsa.process(signature);
} catch (_) {
return false;
}
// Expected encoded hash bytes
final expected = derEncode(hash, digestAlgorithm);
if (sig.length == expected.length) {
for (var i = 0; i < sig.length; i++) {
if (sig[i] != expected[i]) {
return false;
}
}
return true;
} else if (sig.length == expected.length - 2) {
// NULL left out
final sigOffset = sig.length - hash.length - 2;
final expectedOffset = expected.length - hash.length - 2;
expected[1] -= 2; // adjust lengths
expected[3] -= 2;
var nonEqual = 0;
for (var i = 0; i < hash.length; i++) {
nonEqual |= sig[sigOffset + i] ^ expected[expectedOffset + i];
}
for (var i = 0; i < sigOffset; i++) {
nonEqual |= sig[i] ^ expected[i]; // check header less NULL
}
return nonEqual == 0;
} else {
return false;
}
}