Voorbeeldcode voor het verifiëren van de EP/EI handtekening
Hoofdinhoud
// 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 privatestaticbooleanverifyECSchnorr_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()) { returnfalse;
}
MessageDigest md = MessageDigest.getInstance("SHA384");
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]);
}
privatestaticbooleanverifyECSDSA_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()) { returnfalse;
}
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
publicstaticbooleanVerifySignature(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);
}