// Voorbeeld code voor het verifiëren van de EP/EI handtekening
// Ten behoeve van de eenvoud zijn elementaire sanity checks en de afhandeling daarvan buiten beschouwing gelaten.
// mes: de ondertekende data
// Signature: R en S waarden van de handtekening
// used_gen: Y of Z (IPP/PPP) uit de metadata, afhankelijk van VI of VP
// VerKey: idd of pdd
private static boolean verifyECSchnorr_V1(byte[] mes, BigInteger[] Signature, ECPoint used_gen, ECPoint VerKey) throws Exception {
        ECPoint Q = used_gen.multiply(Signature[1]).add(VerKey.multiply(Signature[0]));
        if (Q.isInfinity()) {
            return false;
        }
        MessageDigest md = MessageDigest.getInstance("SHA384");
        md.update(mes);
        md.update(Q.normalize().getXCoord().getEncoded());
        byte[] hash = md.digest();
        BigInteger r = new BigInteger(1, Arrays.copyOfRange(hash, 0, 40));/* use only 320 MSB bits of hash */
        return r.equals(Signature[0]);
    }
    private static boolean verifyECSDSA_V2(byte[] mes, BigInteger[] Signature, ECPoint used_gen, ECPoint VerKey) throws Exception {
        // Q = used_gen_G * s - auth_pub_key_Pa * r
        ECPoint Q = used_gen.multiply(Signature[1]).subtract(VerKey.multiply(Signature[0]));
        if (Q.isInfinity()) {
            return false;
        }
        MessageDigest md = MessageDigest.getInstance("SHA384");
        /* md.update(mes); place in TR-3111 v2.0 */
        byte[] x = Q.normalize().getXCoord().getEncoded();
        byte[] y = Q.normalize().getYCoord().getEncoded();
        md.update(x);
        md.update(y);
        /* new in TR-3111 v2.1 */
        md.update(mes);
        /* new place in TR-3111 v2.1 */
       byte[] hash = md.digest();
        BigInteger r = new BigInteger(1, Arrays.copyOfRange(hash, 0, 40));/* use only 320 MSB bits of hash */
        return (r.compareTo(Signature[0]) == 0);
    }
// msg: de ondertekende data
// oid: signature oid
// signature: R en S waarden van de handtekening
// used_gen: Y of Z (IPP/PPP) uit de metadata, afhankelijk van VI of VP
// ver_key: idd of pdd
    public static boolean VerifySignature(byte[] msg, String oid, BigInteger[] signature, ECPoint used_gen, ECPoint ver_key) throws Exception {
        switch (oid) {
            case "1.0.14888.3.0.11":                                // ISO ECDSA (not used in firmware anymore)
            case "0.4.0.127.0.7.1.1.4.4.3":     // BSI as ISO Used in R3 release BSNk
                return verifyECSDSA_V2(msg, signature, used_gen, ver_key);
            case "0.4.0.127.0.7.1.1.4.3.3":  // BSI legacy (used in R2 release BSNk)
                return verifyECSchnorr_V1(msg, signature, used_gen, ver_key);
        }
        return false;
    }