diff --git a/applet/src/main/java/jcmint/JCMint.java b/applet/src/main/java/jcmint/JCMint.java index ae584b9..f3125df 100755 --- a/applet/src/main/java/jcmint/JCMint.java +++ b/applet/src/main/java/jcmint/JCMint.java @@ -73,7 +73,7 @@ public void process(APDU apdu) { redeemSingle(apdu); break; case Consts.INS_NOP: - apdu.setOutgoing(); + nop(apdu); break; default: ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); @@ -370,6 +370,12 @@ private void redeemSingle(APDU apdu) { apdu.setOutgoing(); } + private void nop(APDU apdu) { + byte[] apduBuffer = loadApdu(apdu); + short p1 = (short) (apduBuffer[ISO7816.OFFSET_P1] & 0xff); + apdu.setOutgoingAndSend((short) 0, p1); + } + private byte[] loadApdu(APDU apdu) { byte[] apduBuffer = apdu.getBuffer(); short recvLen = (short) (apdu.setIncomingAndReceive() + apdu.getOffsetCdata()); diff --git a/applet/src/test/java/tests/PerformanceTest.java b/applet/src/test/java/tests/PerformanceTest.java index a7b84d7..f032c57 100644 --- a/applet/src/test/java/tests/PerformanceTest.java +++ b/applet/src/test/java/tests/PerformanceTest.java @@ -108,13 +108,30 @@ public void measureVerifyRedeemPrecomputed() throws Exception { @Test public void measureNop() throws Exception { - String fileName = "nop.csv"; + String fileName = "nop_0b.csv"; PrintWriter file = new PrintWriter(new FileWriter(fileName, false)); ProtocolManager pm = new ProtocolManager(connect(), (byte) 0); for (int i = 0; i < REPEAT; ++i) { - pm.nop(); + pm.nop(new byte[0]); file.printf("%d\n", pm.cm.getLastTransmitTime()); } + file.close(); + fileName = "nop_768b.csv"; + file = new PrintWriter(new FileWriter(fileName, false)); + pm = new ProtocolManager(connect(), (byte) 0); + for (int i = 0; i < REPEAT; ++i) { + pm.nop(new byte[768]); + file.printf("%d\n", pm.cm.getLastTransmitTime()); + } + file.close(); + fileName = "nop_768b_250b.csv"; + file = new PrintWriter(new FileWriter(fileName, false)); + pm = new ProtocolManager(connect(), (byte) 0); + for (int i = 0; i < REPEAT; ++i) { + pm.nop(new byte[768], 250); + file.printf("%d\n", pm.cm.getLastTransmitTime()); + } + file.close(); } public void verifySwap(boolean precomputed, int parties) throws Exception { diff --git a/applet/src/test/java/tests/ProtocolManager.java b/applet/src/test/java/tests/ProtocolManager.java index 1e2ae95..45de1a9 100644 --- a/applet/src/test/java/tests/ProtocolManager.java +++ b/applet/src/test/java/tests/ProtocolManager.java @@ -176,17 +176,21 @@ public boolean redeemSingle(byte[] message, ECPoint token, ECPoint precomputed) return true; } - public void nop() throws Exception { + public void nop(byte[] data) throws Exception { + nop(data, 0); + } + + public void nop(byte[] data, int outputSize) throws Exception { CommandAPDU cmd = new CommandAPDU( Consts.CLA_JCMINT, Consts.INS_NOP, + (byte) (outputSize & 0xff), (byte) 0, - (byte) 0 + data ); ResponseAPDU responseAPDU = cm.transmit(cmd); Assertions.assertNotNull(responseAPDU); Assertions.assertEquals(ISO7816.SW_NO_ERROR & 0xffff, responseAPDU.getSW()); - Assertions.assertArrayEquals(new byte[0], responseAPDU.getData()); } public static byte[] computeProof(BigInteger secret, ECPoint hashedPoint) throws Exception {