diff options
| -rw-r--r-- | common/src/test/java/cz/crcs/ectester/common/CardIntegerPaddingTests.java | 7 | ||||
| -rw-r--r-- | reader/src/main/java/cz/crcs/ectester/reader/command/Command.java | 24 |
2 files changed, 28 insertions, 3 deletions
diff --git a/common/src/test/java/cz/crcs/ectester/common/CardIntegerPaddingTests.java b/common/src/test/java/cz/crcs/ectester/common/CardIntegerPaddingTests.java index 560935f..fb8ed5f 100644 --- a/common/src/test/java/cz/crcs/ectester/common/CardIntegerPaddingTests.java +++ b/common/src/test/java/cz/crcs/ectester/common/CardIntegerPaddingTests.java @@ -94,6 +94,13 @@ public class CardIntegerPaddingTests { } catch (AssertionFailedError e) { errors.add(e); } + byte[][] field = curve.getParam(EC_Consts.PARAMETER_FP); + byte[] p = field[0]; + try { + assertEquals(bytes, p.length, "Curve: " + category.getName() + "/" + curve.getId() + " (p)"); + } catch (AssertionFailedError e) { + errors.add(e); + } } } } diff --git a/reader/src/main/java/cz/crcs/ectester/reader/command/Command.java b/reader/src/main/java/cz/crcs/ectester/reader/command/Command.java index 2bd4c77..451dda0 100644 --- a/reader/src/main/java/cz/crcs/ectester/reader/command/Command.java +++ b/reader/src/main/java/cz/crcs/ectester/reader/command/Command.java @@ -1,12 +1,12 @@ package cz.crcs.ectester.reader.command; +import cz.crcs.ectester.common.ec.EC_Consts; import cz.crcs.ectester.common.ec.EC_Curve; import cz.crcs.ectester.common.ec.EC_Params; -import cz.crcs.ectester.common.ec.EC_Consts; import cz.crcs.ectester.common.util.ByteUtil; +import cz.crcs.ectester.common.util.CardConsts; import cz.crcs.ectester.common.util.CardUtil; import cz.crcs.ectester.common.util.ECUtil; -import cz.crcs.ectester.common.util.CardConsts; import cz.crcs.ectester.data.EC_Store; import cz.crcs.ectester.reader.CardMngr; import cz.crcs.ectester.reader.ECTesterReader; @@ -19,7 +19,6 @@ import javax.smartcardio.ResponseAPDU; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; /** @@ -372,6 +371,25 @@ public abstract class Command implements Cloneable { ByteUtil.setShort(data, 0, params); if (external != null) { System.arraycopy(external, 0, data, 2, external.length); + if ((params & EC_Consts.PARAMETER_FP) != 0) { + EC_Params par = new EC_Params(params); + par.readBytes(external); + byte[][] prime = par.getParam(EC_Consts.PARAMETER_FP); + byte[] p = prime[0]; + int bytes = p.length; + if ((params & EC_Consts.PARAMETER_G) != 0) { + byte[][] generator = par.getParam(EC_Consts.PARAMETER_G); + if (generator[0].length != bytes || generator[1].length != bytes) { + throw new IllegalArgumentException("Generator point does not match prime field size."); + } + } + if ((params & EC_Consts.PARAMETER_W) != 0) { + byte[][] w = par.getParam(EC_Consts.PARAMETER_W); + if (w[0].length != bytes || w[1].length != bytes) { + throw new IllegalArgumentException("Public key point does not match prime field size."); + } + } + } } this.cmd = new CommandAPDU(CardConsts.CLA_ECTESTERAPPLET, CardConsts.INS_SET, keyPair, curve, data); |
