From 2b698959c183822659df203ddb973a7ebbf4d586 Mon Sep 17 00:00:00 2001 From: Karsten Ohme Date: Sat, 30 May 2020 05:53:13 +0200 Subject: [PATCH] Update to BouncyCastle 1.64 --- pom.xml | 18 +++++++++++++++--- .../crypto/AsymmetricSignatureImpl.java | 15 ++------------- .../com/licel/jcardsim/crypto/ECKeyImpl.java | 2 +- .../licel/jcardsim/crypto/ECPublicKeyImpl.java | 2 +- .../jcardsim/crypto/KeyAgreementImpl.java | 7 ++++++- 5 files changed, 25 insertions(+), 19 deletions(-) diff --git a/pom.xml b/pom.xml index 9ae63e27..51c3a279 100644 --- a/pom.xml +++ b/pom.xml @@ -129,8 +129,20 @@ org.bouncycastle - bcprov-jdk14 - 1.46 + bcprov-debug-jdk15on + 1.64 + + + + + + + + oracle.javacard + api_classic + ${jcApiVersion} + ${env.JC_CLASSIC_HOME}/lib/api_classic-${jcApiVersion}.jar + system org.ow2.asm @@ -180,7 +192,7 @@ api_classic ${jcApiVersion} jar - ${env.JC_CLASSIC_HOME}/lib/api_classic.jar + ${env.JC_CLASSIC_HOME}/lib/api_classic-${jcApiVersion}.jar diff --git a/src/main/java/com/licel/jcardsim/crypto/AsymmetricSignatureImpl.java b/src/main/java/com/licel/jcardsim/crypto/AsymmetricSignatureImpl.java index a3bd927c..dd043a58 100644 --- a/src/main/java/com/licel/jcardsim/crypto/AsymmetricSignatureImpl.java +++ b/src/main/java/com/licel/jcardsim/crypto/AsymmetricSignatureImpl.java @@ -61,7 +61,7 @@ public AsymmetricSignatureImpl(byte algorithm) { engine = new ISO9796d2Signer(new RSAEngine(), new SHA1Digest()); break; case ALG_RSA_SHA_ISO9796_MR: - engine = new ISO9796d2Signer(new RSAEngine(), new SHA1Digest()); + engine = new ISO9796d2Signer(new RSAEngine(), new SHA1Digest(), true); isRecovery = true; break; case ALG_RSA_SHA_PKCS1: @@ -254,18 +254,7 @@ public short sign(byte[] inBuff, short inOffset, short inLength, byte[] sigBuff, try { sig = engine.generateSignature(); Util.arrayCopyNonAtomic(sig, (short) 0, sigBuff, sigOffset, (short) sig.length); - // there is no direct way to obtain encoded message length - int keyBits = key.getSize(); - Field messageLengthField = engine.getClass().getDeclaredField("messageLength"); - messageLengthField.setAccessible(true); - int messageLength = messageLengthField.getInt(engine); - int digSize = 20; - int x = (digSize + messageLength) * 8 + 16 + 4 - keyBits; - int mR = messageLength; - if (x > 0) { - mR = messageLength - ((x + 7) / 8); - } - recMsgLen[recMsgLenOffset] = (short) mR; + recMsgLen[recMsgLenOffset] = (short) ((SignerWithRecovery)engine).getRecoveredMessage().length; return (short) sig.length; } catch (org.bouncycastle.crypto.CryptoException ex) { CryptoException.throwIt(CryptoException.ILLEGAL_USE); diff --git a/src/main/java/com/licel/jcardsim/crypto/ECKeyImpl.java b/src/main/java/com/licel/jcardsim/crypto/ECKeyImpl.java index 206d00bb..192ec9aa 100644 --- a/src/main/java/com/licel/jcardsim/crypto/ECKeyImpl.java +++ b/src/main/java/com/licel/jcardsim/crypto/ECKeyImpl.java @@ -191,7 +191,7 @@ final void setDomainParameters(ECDomainParameters parameters) { a.setBigInteger(parameters.getCurve().getA().toBigInteger()); b.setBigInteger(parameters.getCurve().getB().toBigInteger()); // generator - g.setBytes(parameters.getG().getEncoded()); + g.setBytes(parameters.getG().getEncoded(false)); // order r.setBigInteger(parameters.getN()); // cofactor diff --git a/src/main/java/com/licel/jcardsim/crypto/ECPublicKeyImpl.java b/src/main/java/com/licel/jcardsim/crypto/ECPublicKeyImpl.java index 335919d4..380a560d 100644 --- a/src/main/java/com/licel/jcardsim/crypto/ECPublicKeyImpl.java +++ b/src/main/java/com/licel/jcardsim/crypto/ECPublicKeyImpl.java @@ -55,7 +55,7 @@ public ECPublicKeyImpl(ECPublicKeyParameters params) { } public void setParameters(CipherParameters params){ - w.setBytes(((ECPublicKeyParameters)params).getQ().getEncoded()); + w.setBytes(((ECPublicKeyParameters)params).getQ().getEncoded(false)); } diff --git a/src/main/java/com/licel/jcardsim/crypto/KeyAgreementImpl.java b/src/main/java/com/licel/jcardsim/crypto/KeyAgreementImpl.java index 9298c7a3..eb506bcd 100644 --- a/src/main/java/com/licel/jcardsim/crypto/KeyAgreementImpl.java +++ b/src/main/java/com/licel/jcardsim/crypto/KeyAgreementImpl.java @@ -168,10 +168,15 @@ public void init(CipherParameters privateKey) { this.key = (ECPrivateKeyParameters)privateKey; } + @Override + public int getFieldSize() { + return (key.getParameters().getCurve().getFieldSize() + 7) / 8; + } + public BigInteger calculateAgreement(CipherParameters publicKey) { ECPublicKeyParameters pub = (ECPublicKeyParameters)publicKey; ECPoint result = pub.getQ().multiply(this.key.getD()); - return new BigInteger(1, result.getEncoded()); + return new BigInteger(1, result.getEncoded(false)); } } }