Main content


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