verifySignatureOfHash method

bool verifySignatureOfHash(
  1. Uint8List signature,
  2. Uint8List hash,
  3. HashAlgorithm digestAlgorithm
)

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 sig = rsa.process(signature);

  // 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;
  }
}