aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorquapka2024-06-19 16:44:30 +0200
committerquapka2024-06-19 16:44:30 +0200
commitc051ef2ecfa92723d6dea675ac8c345be92cf165 (patch)
treec88b20a3614ad9ad62ff5cd7652230ddcf226839
parent84c71b38c0c74cbb5bbdc85c8864118722f257a4 (diff)
parent56a5614fa6627873bb215ca8eba1fc68785c79f4 (diff)
downloadECTester-c051ef2ecfa92723d6dea675ac8c345be92cf165.tar.gz
ECTester-c051ef2ecfa92723d6dea675ac8c345be92cf165.tar.zst
ECTester-c051ef2ecfa92723d6dea675ac8c345be92cf165.zip
Merge branch 'master' into build-with-nix
-rwxr-xr-x.appveyor.yml18
-rw-r--r--.gitattributes9
-rw-r--r--.github/workflows/build.yml206
-rw-r--r--.gitignore6
-rw-r--r--.gitmodules6
-rw-r--r--.travis.yml63
-rw-r--r--README.md239
-rw-r--r--applet/GPPcScConnectionPlugin.dllbin15360 -> 0 bytes
-rw-r--r--applet/GPShell.exebin33280 -> 0 bytes
-rw-r--r--applet/GlobalPlatform.dllbin117248 -> 0 bytes
-rw-r--r--applet/build.gradle.kts164
-rw-r--r--applet/gp.exebin908346 -> 0 bytes
-rw-r--r--applet/gp.jarbin894200 -> 0 bytes
-rw-r--r--applet/gppro_upload.bat14
-rwxr-xr-xapplet/gppro_upload.sh10
-rw-r--r--applet/gppro_upload_emv.bat15
-rwxr-xr-xapplet/gppro_upload_emv.sh10
-rw-r--r--applet/libeay32.dllbin1017344 -> 0 bytes
-rw-r--r--applet/openkms-gp.jarbin78142 -> 0 bytes
-rw-r--r--applet/src/main/java/cz/crcs/ectester/applet/AppletBase.java (renamed from src/cz/crcs/ectester/applet/AppletBase.java)200
-rw-r--r--applet/src/main/java/cz/crcs/ectester/applet/AppletUtil.java (renamed from src/cz/crcs/ectester/applet/AppletUtil.java)8
-rw-r--r--applet/src/main/java/cz/crcs/ectester/applet/CardConsts.java65
-rw-r--r--applet/src/main/java/cz/crcs/ectester/applet/ECKeyGenerator.java (renamed from src/cz/crcs/ectester/applet/ECKeyGenerator.java)0
-rw-r--r--applet/src/main/java/cz/crcs/ectester/applet/ECKeyTester.java (renamed from src/cz/crcs/ectester/applet/ECKeyTester.java)4
-rw-r--r--applet/src/main/java/cz/crcs/ectester/applet/ECTesterApplet.java (renamed from src/cz/crcs/ectester/applet/ECTesterApplet.java)6
-rw-r--r--applet/src/main/java/cz/crcs/ectester/applet/ECTesterAppletExtended.java (renamed from src/cz/crcs/ectester/applet/ECTesterAppletExtended.java)6
-rw-r--r--applet/src/main/java/cz/crcs/ectester/applet/EC_Consts.java (renamed from src/cz/crcs/ectester/applet/EC_Consts.java)1
-rw-r--r--applet/ssleay32.dllbin200704 -> 0 bytes
-rw-r--r--applet/zlib1.dllbin75264 -> 0 bytes
-rw-r--r--build-applet.xml107
-rw-r--r--build-reader.xml89
-rw-r--r--build-standalone.xml224
-rw-r--r--build.xml47
-rw-r--r--common/build.gradle.kts27
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/cli/Argument.java (renamed from src/cz/crcs/ectester/common/cli/Argument.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/cli/CLITools.java (renamed from src/cz/crcs/ectester/common/cli/CLITools.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/cli/Colors.java (renamed from src/cz/crcs/ectester/common/cli/Colors.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/cli/ParserOptions.java (renamed from src/cz/crcs/ectester/common/cli/ParserOptions.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/cli/TreeCommandLine.java (renamed from src/cz/crcs/ectester/common/cli/TreeCommandLine.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/cli/TreeParser.java (renamed from src/cz/crcs/ectester/common/cli/TreeParser.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/ec/CustomECFieldF2m.java (renamed from src/cz/crcs/ectester/common/ec/CustomECFieldF2m.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/ec/CustomECFieldFp.java (renamed from src/cz/crcs/ectester/common/ec/CustomECFieldFp.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/ec/CustomECParameterSpec.java (renamed from src/cz/crcs/ectester/common/ec/CustomECParameterSpec.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/ec/CustomEllipticCurve.java (renamed from src/cz/crcs/ectester/common/ec/CustomEllipticCurve.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/ec/EC_Category.java (renamed from src/cz/crcs/ectester/common/ec/EC_Category.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/ec/EC_Consts.java1403
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/ec/EC_Curve.java (renamed from src/cz/crcs/ectester/common/ec/EC_Curve.java)16
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/ec/EC_Data.java (renamed from src/cz/crcs/ectester/common/ec/EC_Data.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/ec/EC_KAResult.java (renamed from src/cz/crcs/ectester/common/ec/EC_KAResult.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/ec/EC_Key.java (renamed from src/cz/crcs/ectester/common/ec/EC_Key.java)2
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/ec/EC_Keypair.java (renamed from src/cz/crcs/ectester/common/ec/EC_Keypair.java)2
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/ec/EC_Params.java (renamed from src/cz/crcs/ectester/common/ec/EC_Params.java)1
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/ec/EC_SigResult.java (renamed from src/cz/crcs/ectester/common/ec/EC_SigResult.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/ec/RawECPrivateKey.java (renamed from src/cz/crcs/ectester/common/ec/RawECPrivateKey.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/ec/RawECPublicKey.java (renamed from src/cz/crcs/ectester/common/ec/RawECPublicKey.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/output/BaseFileTestWriter.java30
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/output/BaseTextTestWriter.java (renamed from src/cz/crcs/ectester/common/output/BaseTextTestWriter.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/output/BaseXMLTestWriter.java (renamed from src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java (renamed from src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/output/OutputLogger.java (renamed from src/cz/crcs/ectester/common/output/OutputLogger.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/output/TeeOutputStream.java (renamed from src/cz/crcs/ectester/common/output/TeeOutputStream.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/output/TeeTestWriter.java (renamed from src/cz/crcs/ectester/common/output/TeeTestWriter.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/output/TestWriter.java (renamed from src/cz/crcs/ectester/common/output/TestWriter.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/test/BaseTestable.java (renamed from src/cz/crcs/ectester/common/test/BaseTestable.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/test/CompoundTest.java (renamed from src/cz/crcs/ectester/common/test/CompoundTest.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/test/Result.java (renamed from src/cz/crcs/ectester/common/test/Result.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/test/SimpleTest.java (renamed from src/cz/crcs/ectester/common/test/SimpleTest.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/test/Test.java (renamed from src/cz/crcs/ectester/common/test/Test.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/test/TestCallback.java (renamed from src/cz/crcs/ectester/common/test/TestCallback.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/test/TestException.java (renamed from src/cz/crcs/ectester/common/test/TestException.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/test/TestSuite.java (renamed from src/cz/crcs/ectester/common/test/TestSuite.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/test/TestSuiteException.java (renamed from src/cz/crcs/ectester/common/test/TestSuiteException.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/test/Testable.java (renamed from src/cz/crcs/ectester/common/test/Testable.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/util/ByteUtil.java (renamed from src/cz/crcs/ectester/common/util/ByteUtil.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/util/CardConsts.java65
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/util/CardUtil.java (renamed from src/cz/crcs/ectester/common/util/CardUtil.java)95
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/util/ECUtil.java (renamed from src/cz/crcs/ectester/common/util/ECUtil.java)56
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/util/FileUtil.java (renamed from src/cz/crcs/ectester/common/util/FileUtil.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/common/util/Util.java (renamed from src/cz/crcs/ectester/common/util/Util.java)0
-rw-r--r--common/src/main/java/cz/crcs/ectester/data/EC_Store.java (renamed from src/cz/crcs/ectester/data/EC_Store.java)5
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous112.csv (renamed from src/cz/crcs/ectester/data/anomalous/anomalous112.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous128.csv (renamed from src/cz/crcs/ectester/data/anomalous/anomalous128.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous160.csv (renamed from src/cz/crcs/ectester/data/anomalous/anomalous160.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous192.csv (renamed from src/cz/crcs/ectester/data/anomalous/anomalous192.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous224.csv (renamed from src/cz/crcs/ectester/data/anomalous/anomalous224.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous256.csv (renamed from src/cz/crcs/ectester/data/anomalous/anomalous256.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous320.csv (renamed from src/cz/crcs/ectester/data/anomalous/anomalous320.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous384.csv (renamed from src/cz/crcs/ectester/data/anomalous/anomalous384.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous512.csv (renamed from src/cz/crcs/ectester/data/anomalous/anomalous512.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous521.csv (renamed from src/cz/crcs/ectester/data/anomalous/anomalous521.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/anomalous/curves.xml (renamed from src/cz/crcs/ectester/data/anomalous/curves.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/anomalous/miyaji128a1.csv (renamed from src/cz/crcs/ectester/data/anomalous/miyaji128a1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/anomalous/miyaji128a2.csv (renamed from src/cz/crcs/ectester/data/anomalous/miyaji128a2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/anomalous/miyaji128b1.csv (renamed from src/cz/crcs/ectester/data/anomalous/miyaji128b1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/anomalous/miyaji128b2.csv (renamed from src/cz/crcs/ectester/data/anomalous/miyaji128b2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/anssi/curves.xml (renamed from src/cz/crcs/ectester/data/anssi/curves.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/anssi/frp256v1.csv (renamed from src/cz/crcs/ectester/data/anssi/frp256v1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/bn/bn158.csv (renamed from src/cz/crcs/ectester/data/bn/bn158.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/bn/bn190.csv (renamed from src/cz/crcs/ectester/data/bn/bn190.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/bn/bn222.csv (renamed from src/cz/crcs/ectester/data/bn/bn222.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/bn/bn254.csv (renamed from src/cz/crcs/ectester/data/bn/bn254.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/bn/bn286.csv (renamed from src/cz/crcs/ectester/data/bn/bn286.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/bn/bn318.csv (renamed from src/cz/crcs/ectester/data/bn/bn318.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/bn/bn350.csv (renamed from src/cz/crcs/ectester/data/bn/bn350.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/bn/bn382.csv (renamed from src/cz/crcs/ectester/data/bn/bn382.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/bn/bn414.csv (renamed from src/cz/crcs/ectester/data/bn/bn414.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/bn/bn446.csv (renamed from src/cz/crcs/ectester/data/bn/bn446.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/bn/bn478.csv (renamed from src/cz/crcs/ectester/data/bn/bn478.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/bn/bn510.csv (renamed from src/cz/crcs/ectester/data/bn/bn510.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/bn/bn542.csv (renamed from src/cz/crcs/ectester/data/bn/bn542.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/bn/bn574.csv (renamed from src/cz/crcs/ectester/data/bn/bn574.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/bn/bn606.csv (renamed from src/cz/crcs/ectester/data/bn/bn606.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/bn/bn638.csv (renamed from src/cz/crcs/ectester/data/bn/bn638.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/bn/curves.xml (renamed from src/cz/crcs/ectester/data/bn/curves.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP160r1.csv (renamed from src/cz/crcs/ectester/data/brainpool/brainpoolP160r1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP160t1.csv (renamed from src/cz/crcs/ectester/data/brainpool/brainpoolP160t1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP192r1.csv (renamed from src/cz/crcs/ectester/data/brainpool/brainpoolP192r1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP192t1.csv (renamed from src/cz/crcs/ectester/data/brainpool/brainpoolP192t1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP224r1.csv (renamed from src/cz/crcs/ectester/data/brainpool/brainpoolP224r1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP224t1.csv (renamed from src/cz/crcs/ectester/data/brainpool/brainpoolP224t1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP256r1.csv (renamed from src/cz/crcs/ectester/data/brainpool/brainpoolP256r1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP256t1.csv (renamed from src/cz/crcs/ectester/data/brainpool/brainpoolP256t1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP320r1.csv (renamed from src/cz/crcs/ectester/data/brainpool/brainpoolP320r1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP320t1.csv (renamed from src/cz/crcs/ectester/data/brainpool/brainpoolP320t1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP384r1.csv (renamed from src/cz/crcs/ectester/data/brainpool/brainpoolP384r1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP384t1.csv (renamed from src/cz/crcs/ectester/data/brainpool/brainpoolP384t1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP512r1.csv (renamed from src/cz/crcs/ectester/data/brainpool/brainpoolP512r1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP512t1.csv (renamed from src/cz/crcs/ectester/data/brainpool/brainpoolP512t1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/brainpool/curves.xml (renamed from src/cz/crcs/ectester/data/brainpool/curves.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/categories.xml (renamed from src/cz/crcs/ectester/data/categories.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p128.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor128p128.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p16.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor128p16.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p2.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor128p2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p32.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor128p32.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p4.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor128p4.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p56467.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor128p56467.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p64.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor128p64.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p65521.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor128p65521.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p65535.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor128p65535.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p8.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor128p8.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p16.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor160p16.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p2.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor160p2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p32.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor160p32.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p4.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor160p4.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p56467.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor160p56467.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p64.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor160p64.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p65521.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor160p65521.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p65535.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor160p65535.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p8.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor160p8.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t128.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor163t128.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t16.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor163t16.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t2.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor163t2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t32.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor163t32.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t4.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor163t4.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t64.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor163t64.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t8.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor163t8.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor192p2.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor192p2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor192p4.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor192p4.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor192p8.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor192p8.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t128.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor233t128.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t16.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor233t16.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t2.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor233t2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t32.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor233t32.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t4.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor233t4.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t64.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor233t64.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t8.csv (renamed from src/cz/crcs/ectester/data/cofactor/cofactor233t8.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/curves.xml (renamed from src/cz/crcs/ectester/data/cofactor/curves.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/keys.xml (renamed from src/cz/crcs/ectester/data/cofactor/keys.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/cofactor/secg_keys.xml (renamed from src/cz/crcs/ectester/data/cofactor/secg_keys.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_128.csv (renamed from src/cz/crcs/ectester/data/composite/carmichael_128.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_192.csv (renamed from src/cz/crcs/ectester/data/composite/carmichael_192.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_224.csv (renamed from src/cz/crcs/ectester/data/composite/carmichael_224.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_256.csv (renamed from src/cz/crcs/ectester/data/composite/carmichael_256.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_384.csv (renamed from src/cz/crcs/ectester/data/composite/carmichael_384.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_512.csv (renamed from src/cz/crcs/ectester/data/composite/carmichael_512.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_521.csv (renamed from src/cz/crcs/ectester/data/composite/carmichael_521.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite128.csv (renamed from src/cz/crcs/ectester/data/composite/composite128.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite128_pq.csv (renamed from src/cz/crcs/ectester/data/composite/composite128_pq.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite128_pq1.csv (renamed from src/cz/crcs/ectester/data/composite/composite128_pq1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite128_pq2.csv (renamed from src/cz/crcs/ectester/data/composite/composite128_pq2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite128_rg0.csv (renamed from src/cz/crcs/ectester/data/composite/composite128_rg0.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite128_small.csv (renamed from src/cz/crcs/ectester/data/composite/composite128_small.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite160.csv (renamed from src/cz/crcs/ectester/data/composite/composite160.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite160_pq.csv (renamed from src/cz/crcs/ectester/data/composite/composite160_pq.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite160_pq1.csv (renamed from src/cz/crcs/ectester/data/composite/composite160_pq1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite160_pq2.csv (renamed from src/cz/crcs/ectester/data/composite/composite160_pq2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite160_rg0.csv (renamed from src/cz/crcs/ectester/data/composite/composite160_rg0.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite160_small.csv (renamed from src/cz/crcs/ectester/data/composite/composite160_small.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite192.csv (renamed from src/cz/crcs/ectester/data/composite/composite192.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite192_pq.csv (renamed from src/cz/crcs/ectester/data/composite/composite192_pq.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite192_pq1.csv (renamed from src/cz/crcs/ectester/data/composite/composite192_pq1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite192_pq2.csv (renamed from src/cz/crcs/ectester/data/composite/composite192_pq2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite192_rg0.csv (renamed from src/cz/crcs/ectester/data/composite/composite192_rg0.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite192_small.csv (renamed from src/cz/crcs/ectester/data/composite/composite192_small.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite224.csv (renamed from src/cz/crcs/ectester/data/composite/composite224.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite224_pq.csv (renamed from src/cz/crcs/ectester/data/composite/composite224_pq.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite224_pq1.csv (renamed from src/cz/crcs/ectester/data/composite/composite224_pq1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite224_pq2.csv (renamed from src/cz/crcs/ectester/data/composite/composite224_pq2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite224_rg0.csv (renamed from src/cz/crcs/ectester/data/composite/composite224_rg0.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite224_small.csv (renamed from src/cz/crcs/ectester/data/composite/composite224_small.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite256.csv (renamed from src/cz/crcs/ectester/data/composite/composite256.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite256_pq.csv (renamed from src/cz/crcs/ectester/data/composite/composite256_pq.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite256_pq1.csv (renamed from src/cz/crcs/ectester/data/composite/composite256_pq1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite256_pq2.csv (renamed from src/cz/crcs/ectester/data/composite/composite256_pq2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite256_rg0.csv (renamed from src/cz/crcs/ectester/data/composite/composite256_rg0.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite256_small.csv (renamed from src/cz/crcs/ectester/data/composite/composite256_small.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite384.csv (renamed from src/cz/crcs/ectester/data/composite/composite384.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite384_small.csv (renamed from src/cz/crcs/ectester/data/composite/composite384_small.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite521.csv (renamed from src/cz/crcs/ectester/data/composite/composite521.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/composite521_small.csv (renamed from src/cz/crcs/ectester/data/composite/composite521_small.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/curves.xml (renamed from src/cz/crcs/ectester/data/composite/curves.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/keys.xml (renamed from src/cz/crcs/ectester/data/composite/keys.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/10.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/10.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/112.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/112.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/12.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/12.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/128.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/128.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/135.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/135.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/14.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/14.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/140.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/140.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/144.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/144.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/146.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/146.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/148.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/148.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/150.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/150.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/152.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/152.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/152_cofactor.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/152_cofactor.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/16.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/16.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/20.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/20.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/25.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/25.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/2a.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/2a.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/2b.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/2b.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/3.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/3.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/32.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/32.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/4.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/4.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/48.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/48.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/5.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/5.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/6.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/6.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/64.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/64.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/7.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/7.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/70.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/70.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/8.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/8.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/80.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/80.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/90.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/90.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/96.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/first/96.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/140.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/second/140.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/141.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/second/141.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/142.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/second/142.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/143.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/second/143.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/144.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/second/144.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/145.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/second/145.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/146.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/second/146.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/147.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/second/147.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/148.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/second/148.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/149.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/second/149.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/150.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/second/150.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/151.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/second/151.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/152.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/second/152.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/153.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/second/153.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/154.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/second/154.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/155.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/second/155.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/156.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/second/156.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/157.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/second/157.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/158.csv (renamed from src/cz/crcs/ectester/data/composite/varying/160/second/158.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/degenerate/brainpool.xml (renamed from src/cz/crcs/ectester/data/degenerate/brainpool.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/degenerate/cofactor.xml (renamed from src/cz/crcs/ectester/data/degenerate/cofactor.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/degenerate/keys.xml (renamed from src/cz/crcs/ectester/data/degenerate/keys.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/degenerate/secg.xml (renamed from src/cz/crcs/ectester/data/degenerate/secg.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/gost/curves.xml (renamed from src/cz/crcs/ectester/data/gost/curves.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/gost/gost256.csv (renamed from src/cz/crcs/ectester/data/gost/gost256.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/gost/gost512.csv (renamed from src/cz/crcs/ectester/data/gost/gost512.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP160r1.xml (renamed from src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP160r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP160t1.xml (renamed from src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP160t1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP192r1.xml (renamed from src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP192r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP192t1.xml (renamed from src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP192t1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP224r1.xml (renamed from src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP224r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP224t1.xml (renamed from src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP224t1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP256r1.xml (renamed from src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP256r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP256t1.xml (renamed from src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP256t1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/keys.xml (renamed from src/cz/crcs/ectester/data/invalid/keys.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/nist/b163.xml (renamed from src/cz/crcs/ectester/data/invalid/nist/b163.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/nist/b233.xml (renamed from src/cz/crcs/ectester/data/invalid/nist/b233.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/nist/b283.xml (renamed from src/cz/crcs/ectester/data/invalid/nist/b283.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/nist/k163.xml (renamed from src/cz/crcs/ectester/data/invalid/nist/k163.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/nist/k233.xml (renamed from src/cz/crcs/ectester/data/invalid/nist/k233.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/nist/k283.xml (renamed from src/cz/crcs/ectester/data/invalid/nist/k283.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp112r1.xml (renamed from src/cz/crcs/ectester/data/invalid/secg/secp112r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp112r2.xml (renamed from src/cz/crcs/ectester/data/invalid/secg/secp112r2.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp128r1.xml (renamed from src/cz/crcs/ectester/data/invalid/secg/secp128r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp128r2.xml (renamed from src/cz/crcs/ectester/data/invalid/secg/secp128r2.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp160r1.xml (renamed from src/cz/crcs/ectester/data/invalid/secg/secp160r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp160r2.xml (renamed from src/cz/crcs/ectester/data/invalid/secg/secp160r2.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp192r1.xml (renamed from src/cz/crcs/ectester/data/invalid/secg/secp192r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp224r1.xml (renamed from src/cz/crcs/ectester/data/invalid/secg/secp224r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp256r1.xml (renamed from src/cz/crcs/ectester/data/invalid/secg/secp256r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/misc/keys.xml (renamed from src/cz/crcs/ectester/data/misc/keys.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/misc/results.xml (renamed from src/cz/crcs/ectester/data/misc/results.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/mnt/curves.xml (renamed from src/cz/crcs/ectester/data/mnt/curves.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/mnt/mnt1.csv (renamed from src/cz/crcs/ectester/data/mnt/mnt1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/mnt/mnt2_1.csv (renamed from src/cz/crcs/ectester/data/mnt/mnt2_1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/mnt/mnt2_2.csv (renamed from src/cz/crcs/ectester/data/mnt/mnt2_2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/mnt/mnt3_1.csv (renamed from src/cz/crcs/ectester/data/mnt/mnt3_1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/mnt/mnt3_2.csv (renamed from src/cz/crcs/ectester/data/mnt/mnt3_2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/mnt/mnt3_3.csv (renamed from src/cz/crcs/ectester/data/mnt/mnt3_3.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/mnt/mnt4.csv (renamed from src/cz/crcs/ectester/data/mnt/mnt4.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/mnt/mnt5_1.csv (renamed from src/cz/crcs/ectester/data/mnt/mnt5_1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/mnt/mnt5_2.csv (renamed from src/cz/crcs/ectester/data/mnt/mnt5_2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/mnt/mnt5_3.csv (renamed from src/cz/crcs/ectester/data/mnt/mnt5_3.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/nist/b163.csv (renamed from src/cz/crcs/ectester/data/nist/b163.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/nist/b233.csv (renamed from src/cz/crcs/ectester/data/nist/b233.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/nist/b283.csv (renamed from src/cz/crcs/ectester/data/nist/b283.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/nist/b409.csv (renamed from src/cz/crcs/ectester/data/nist/b409.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/nist/b571.csv (renamed from src/cz/crcs/ectester/data/nist/b571.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/nist/curves.xml (renamed from src/cz/crcs/ectester/data/nist/curves.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/nist/k163.csv (renamed from src/cz/crcs/ectester/data/nist/k163.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/nist/k233.csv (renamed from src/cz/crcs/ectester/data/nist/k233.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/nist/k283.csv (renamed from src/cz/crcs/ectester/data/nist/k283.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/nist/k409.csv (renamed from src/cz/crcs/ectester/data/nist/k409.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/nist/k571.csv (renamed from src/cz/crcs/ectester/data/nist/k571.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/nist/p192.csv (renamed from src/cz/crcs/ectester/data/nist/p192.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/nist/p224.csv (renamed from src/cz/crcs/ectester/data/nist/p224.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/nist/p256.csv (renamed from src/cz/crcs/ectester/data/nist/p256.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/nist/p384.csv (renamed from src/cz/crcs/ectester/data/nist/p384.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/nist/p521.csv (renamed from src/cz/crcs/ectester/data/nist/p521.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/other/curve25519.csv (renamed from src/cz/crcs/ectester/data/other/curve25519.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/other/curves.xml (renamed from src/cz/crcs/ectester/data/other/curves.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/other/m221.csv (renamed from src/cz/crcs/ectester/data/other/m221.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/other/m383.csv (renamed from src/cz/crcs/ectester/data/other/m383.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/other/m511.csv (renamed from src/cz/crcs/ectester/data/other/m511.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/schema.xsd (renamed from src/cz/crcs/ectester/data/schema.xsd)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/curves.xml (renamed from src/cz/crcs/ectester/data/secg/curves.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/secp112r1.csv (renamed from src/cz/crcs/ectester/data/secg/secp112r1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/secp112r2.csv (renamed from src/cz/crcs/ectester/data/secg/secp112r2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/secp128r1.csv (renamed from src/cz/crcs/ectester/data/secg/secp128r1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/secp128r2.csv (renamed from src/cz/crcs/ectester/data/secg/secp128r2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/secp160k1.csv (renamed from src/cz/crcs/ectester/data/secg/secp160k1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/secp160r1.csv (renamed from src/cz/crcs/ectester/data/secg/secp160r1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/secp160r2.csv (renamed from src/cz/crcs/ectester/data/secg/secp160r2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/secp192k1.csv (renamed from src/cz/crcs/ectester/data/secg/secp192k1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/secp192r1.csv (renamed from src/cz/crcs/ectester/data/secg/secp192r1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/secp224r1.csv (renamed from src/cz/crcs/ectester/data/secg/secp224r1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/secp256k1.csv (renamed from src/cz/crcs/ectester/data/secg/secp256k1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/secp256r1.csv (renamed from src/cz/crcs/ectester/data/secg/secp256r1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/secp384r1.csv (renamed from src/cz/crcs/ectester/data/secg/secp384r1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/secp521r1.csv (renamed from src/cz/crcs/ectester/data/secg/secp521r1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/sect163k1.csv (renamed from src/cz/crcs/ectester/data/secg/sect163k1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/sect163r1.csv (renamed from src/cz/crcs/ectester/data/secg/sect163r1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/sect163r2.csv (renamed from src/cz/crcs/ectester/data/secg/sect163r2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/sect233k1.csv (renamed from src/cz/crcs/ectester/data/secg/sect233k1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/sect233r1.csv (renamed from src/cz/crcs/ectester/data/secg/sect233r1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/sect239k1.csv (renamed from src/cz/crcs/ectester/data/secg/sect239k1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/sect283k1.csv (renamed from src/cz/crcs/ectester/data/secg/sect283k1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/sect283r1.csv (renamed from src/cz/crcs/ectester/data/secg/sect283r1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/sect409k1.csv (renamed from src/cz/crcs/ectester/data/secg/sect409k1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/sect409r1.csv (renamed from src/cz/crcs/ectester/data/secg/sect409r1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/sect571k1.csv (renamed from src/cz/crcs/ectester/data/secg/sect571k1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/secg/sect571r1.csv (renamed from src/cz/crcs/ectester/data/secg/sect571r1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/supersingular/curves.xml (renamed from src/cz/crcs/ectester/data/supersingular/curves.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/supersingular/ss128.csv (renamed from src/cz/crcs/ectester/data/supersingular/ss128.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/supersingular/ss192.csv (renamed from src/cz/crcs/ectester/data/supersingular/ss192.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/supersingular/ss224.csv (renamed from src/cz/crcs/ectester/data/supersingular/ss224.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/supersingular/ss256.csv (renamed from src/cz/crcs/ectester/data/supersingular/ss256.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-dh-raw.csv (renamed from src/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-dh-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-dh-sha1.csv (renamed from src/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-dh-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-keyA.csv (renamed from src/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-keyA.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-keyB.csv (renamed from src/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-keyB.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-dh-raw.csv (renamed from src/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-dh-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-dh-sha1.csv (renamed from src/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-dh-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-keyA.csv (renamed from src/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-keyA.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-keyB.csv (renamed from src/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-keyB.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-dh-raw.csv (renamed from src/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-dh-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-dh-sha1.csv (renamed from src/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-dh-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-keyA.csv (renamed from src/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-keyA.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-keyB.csv (renamed from src/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-keyB.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-dh-raw.csv (renamed from src/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-dh-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-dh-sha1.csv (renamed from src/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-dh-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-keyA.csv (renamed from src/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-keyA.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-keyB.csv (renamed from src/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-keyB.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/keys.xml (renamed from src/cz/crcs/ectester/data/test/keys.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/b163-dhc-raw.csv (renamed from src/cz/crcs/ectester/data/test/nist/b163-dhc-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/b163-dhc-sha1.csv (renamed from src/cz/crcs/ectester/data/test/nist/b163-dhc-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/b163-keyCAVS.csv (renamed from src/cz/crcs/ectester/data/test/nist/b163-keyCAVS.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/b163-keyIUT.csv (renamed from src/cz/crcs/ectester/data/test/nist/b163-keyIUT.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/b233-dhc-raw.csv (renamed from src/cz/crcs/ectester/data/test/nist/b233-dhc-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/b233-dhc-sha1.csv (renamed from src/cz/crcs/ectester/data/test/nist/b233-dhc-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/b233-keyCAVS.csv (renamed from src/cz/crcs/ectester/data/test/nist/b233-keyCAVS.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/b233-keyIUT.csv (renamed from src/cz/crcs/ectester/data/test/nist/b233-keyIUT.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/b283-dhc-raw.csv (renamed from src/cz/crcs/ectester/data/test/nist/b283-dhc-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/b283-dhc-sha1.csv (renamed from src/cz/crcs/ectester/data/test/nist/b283-dhc-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/b283-keyCAVS.csv (renamed from src/cz/crcs/ectester/data/test/nist/b283-keyCAVS.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/b283-keyIUT.csv (renamed from src/cz/crcs/ectester/data/test/nist/b283-keyIUT.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/b409-dhc-raw.csv (renamed from src/cz/crcs/ectester/data/test/nist/b409-dhc-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/b409-dhc-sha1.csv (renamed from src/cz/crcs/ectester/data/test/nist/b409-dhc-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/b409-keyCAVS.csv (renamed from src/cz/crcs/ectester/data/test/nist/b409-keyCAVS.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/b409-keyIUT.csv (renamed from src/cz/crcs/ectester/data/test/nist/b409-keyIUT.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/b571-dhc-raw.csv (renamed from src/cz/crcs/ectester/data/test/nist/b571-dhc-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/b571-dhc-sha1.csv (renamed from src/cz/crcs/ectester/data/test/nist/b571-dhc-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/b571-keyCAVS.csv (renamed from src/cz/crcs/ectester/data/test/nist/b571-keyCAVS.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/b571-keyIUT.csv (renamed from src/cz/crcs/ectester/data/test/nist/b571-keyIUT.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/k163-dhc-raw.csv (renamed from src/cz/crcs/ectester/data/test/nist/k163-dhc-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/k163-dhc-sha1.csv (renamed from src/cz/crcs/ectester/data/test/nist/k163-dhc-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/k163-keyCAVS.csv (renamed from src/cz/crcs/ectester/data/test/nist/k163-keyCAVS.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/k163-keyIUT.csv (renamed from src/cz/crcs/ectester/data/test/nist/k163-keyIUT.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/k233-dhc-raw.csv (renamed from src/cz/crcs/ectester/data/test/nist/k233-dhc-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/k233-dhc-sha1.csv (renamed from src/cz/crcs/ectester/data/test/nist/k233-dhc-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/k233-keyCAVS.csv (renamed from src/cz/crcs/ectester/data/test/nist/k233-keyCAVS.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/k233-keyIUT.csv (renamed from src/cz/crcs/ectester/data/test/nist/k233-keyIUT.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/k283-dhc-raw.csv (renamed from src/cz/crcs/ectester/data/test/nist/k283-dhc-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/k283-dhc-sha1.csv (renamed from src/cz/crcs/ectester/data/test/nist/k283-dhc-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/k283-keyCAVS.csv (renamed from src/cz/crcs/ectester/data/test/nist/k283-keyCAVS.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/k283-keyIUT.csv (renamed from src/cz/crcs/ectester/data/test/nist/k283-keyIUT.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/k409-dhc-raw.csv (renamed from src/cz/crcs/ectester/data/test/nist/k409-dhc-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/k409-dhc-sha1.csv (renamed from src/cz/crcs/ectester/data/test/nist/k409-dhc-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/k409-keyCAVS.csv (renamed from src/cz/crcs/ectester/data/test/nist/k409-keyCAVS.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/k409-keyIUT.csv (renamed from src/cz/crcs/ectester/data/test/nist/k409-keyIUT.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/k571-dhc-raw.csv (renamed from src/cz/crcs/ectester/data/test/nist/k571-dhc-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/k571-dhc-sha1.csv (renamed from src/cz/crcs/ectester/data/test/nist/k571-dhc-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/k571-keyCAVS.csv (renamed from src/cz/crcs/ectester/data/test/nist/k571-keyCAVS.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/k571-keyIUT.csv (renamed from src/cz/crcs/ectester/data/test/nist/k571-keyIUT.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/p192-dhc-raw.csv (renamed from src/cz/crcs/ectester/data/test/nist/p192-dhc-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/p192-dhc-sha1.csv (renamed from src/cz/crcs/ectester/data/test/nist/p192-dhc-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/p192-keyCAVS.csv (renamed from src/cz/crcs/ectester/data/test/nist/p192-keyCAVS.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/p192-keyIUT.csv (renamed from src/cz/crcs/ectester/data/test/nist/p192-keyIUT.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/p224-dhc-raw.csv (renamed from src/cz/crcs/ectester/data/test/nist/p224-dhc-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/p224-dhc-sha1.csv (renamed from src/cz/crcs/ectester/data/test/nist/p224-dhc-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/p224-keyCAVS.csv (renamed from src/cz/crcs/ectester/data/test/nist/p224-keyCAVS.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/p224-keyIUT.csv (renamed from src/cz/crcs/ectester/data/test/nist/p224-keyIUT.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/p256-dhc-raw.csv (renamed from src/cz/crcs/ectester/data/test/nist/p256-dhc-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/p256-dhc-sha1.csv (renamed from src/cz/crcs/ectester/data/test/nist/p256-dhc-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/p256-keyCAVS.csv (renamed from src/cz/crcs/ectester/data/test/nist/p256-keyCAVS.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/p256-keyIUT.csv (renamed from src/cz/crcs/ectester/data/test/nist/p256-keyIUT.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/p384-dhc-raw.csv (renamed from src/cz/crcs/ectester/data/test/nist/p384-dhc-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/p384-dhc-sha1.csv (renamed from src/cz/crcs/ectester/data/test/nist/p384-dhc-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/p384-keyCAVS.csv (renamed from src/cz/crcs/ectester/data/test/nist/p384-keyCAVS.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/p384-keyIUT.csv (renamed from src/cz/crcs/ectester/data/test/nist/p384-keyIUT.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/p521-dhc-raw.csv (renamed from src/cz/crcs/ectester/data/test/nist/p521-dhc-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/p521-dhc-sha1.csv (renamed from src/cz/crcs/ectester/data/test/nist/p521-dhc-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/p521-keyCAVS.csv (renamed from src/cz/crcs/ectester/data/test/nist/p521-keyCAVS.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/nist/p521-keyIUT.csv (renamed from src/cz/crcs/ectester/data/test/nist/p521-keyIUT.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/results.xml (renamed from src/cz/crcs/ectester/data/test/results.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/secg/secp160r1-dh-kdf.csv (renamed from src/cz/crcs/ectester/data/test/secg/secp160r1-dh-kdf.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/secg/secp160r1-dh-raw.csv (renamed from src/cz/crcs/ectester/data/test/secg/secp160r1-dh-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/secg/secp160r1-dh-sha1.csv (renamed from src/cz/crcs/ectester/data/test/secg/secp160r1-dh-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/secg/secp160r1-keyU.csv (renamed from src/cz/crcs/ectester/data/test/secg/secp160r1-keyU.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/secg/secp160r1-keyV.csv (renamed from src/cz/crcs/ectester/data/test/secg/secp160r1-keyV.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-dh-kdf.csv (renamed from src/cz/crcs/ectester/data/test/secg/sect163k1-dh-kdf.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-dh-raw.csv (renamed from src/cz/crcs/ectester/data/test/secg/sect163k1-dh-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-dh-sha1.csv (renamed from src/cz/crcs/ectester/data/test/secg/sect163k1-dh-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-dhc-kdf.csv (renamed from src/cz/crcs/ectester/data/test/secg/sect163k1-dhc-kdf.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-dhc-raw.csv (renamed from src/cz/crcs/ectester/data/test/secg/sect163k1-dhc-raw.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-dhc-sha1.csv (renamed from src/cz/crcs/ectester/data/test/secg/sect163k1-dhc-sha1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-keyU.csv (renamed from src/cz/crcs/ectester/data/test/secg/sect163k1-keyU.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-keyV.csv (renamed from src/cz/crcs/ectester/data/test/secg/sect163k1-keyV.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/cofactor/cofactor128p4.xml (renamed from src/cz/crcs/ectester/data/twist/cofactor/cofactor128p4.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/cofactor/cofactor160p4.xml (renamed from src/cz/crcs/ectester/data/twist/cofactor/cofactor160p4.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/keys.xml (renamed from src/cz/crcs/ectester/data/twist/keys.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/nist/b163.xml (renamed from src/cz/crcs/ectester/data/twist/nist/b163.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/nist/b233.xml (renamed from src/cz/crcs/ectester/data/twist/nist/b233.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/nist/b283.xml (renamed from src/cz/crcs/ectester/data/twist/nist/b283.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/nist/k163.xml (renamed from src/cz/crcs/ectester/data/twist/nist/k163.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/nist/k233.xml (renamed from src/cz/crcs/ectester/data/twist/nist/k233.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/nist/k283.xml (renamed from src/cz/crcs/ectester/data/twist/nist/k283.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/nist/p192.xml (renamed from src/cz/crcs/ectester/data/twist/nist/p192.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/nist/p224.xml (renamed from src/cz/crcs/ectester/data/twist/nist/p224.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/nist/p256.xml (renamed from src/cz/crcs/ectester/data/twist/nist/p256.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/nist/p384.xml (renamed from src/cz/crcs/ectester/data/twist/nist/p384.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/nist/p521.xml (renamed from src/cz/crcs/ectester/data/twist/nist/p521.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp112r1.xml (renamed from src/cz/crcs/ectester/data/twist/secg/secp112r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp112r2.xml (renamed from src/cz/crcs/ectester/data/twist/secg/secp112r2.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp128r1.xml (renamed from src/cz/crcs/ectester/data/twist/secg/secp128r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp128r2.xml (renamed from src/cz/crcs/ectester/data/twist/secg/secp128r2.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp160k1.xml (renamed from src/cz/crcs/ectester/data/twist/secg/secp160k1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp160r1.xml (renamed from src/cz/crcs/ectester/data/twist/secg/secp160r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp160r2.xml (renamed from src/cz/crcs/ectester/data/twist/secg/secp160r2.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp192k1.xml (renamed from src/cz/crcs/ectester/data/twist/secg/secp192k1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp192r1.xml (renamed from src/cz/crcs/ectester/data/twist/secg/secp192r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp224r1.xml (renamed from src/cz/crcs/ectester/data/twist/secg/secp224r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp256k1.xml (renamed from src/cz/crcs/ectester/data/twist/secg/secp256k1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp256r1.xml (renamed from src/cz/crcs/ectester/data/twist/secg/secp256r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp384r1.xml (renamed from src/cz/crcs/ectester/data/twist/secg/secp384r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp521r1.xml (renamed from src/cz/crcs/ectester/data/twist/secg/secp521r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect163k1.xml (renamed from src/cz/crcs/ectester/data/twist/secg/sect163k1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect163r1.xml (renamed from src/cz/crcs/ectester/data/twist/secg/sect163r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect163r2.xml (renamed from src/cz/crcs/ectester/data/twist/secg/sect163r2.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect233k1.xml (renamed from src/cz/crcs/ectester/data/twist/secg/sect233k1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect233r1.xml (renamed from src/cz/crcs/ectester/data/twist/secg/sect233r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect239k1.xml (renamed from src/cz/crcs/ectester/data/twist/secg/sect239k1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect283k1.xml (renamed from src/cz/crcs/ectester/data/twist/secg/sect283k1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect283r1.xml (renamed from src/cz/crcs/ectester/data/twist/secg/sect283r1.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/wrong/curves.xml (renamed from src/cz/crcs/ectester/data/wrong/curves.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/wrong/keys.xml (renamed from src/cz/crcs/ectester/data/wrong/keys.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/wrong/results.xml (renamed from src/cz/crcs/ectester/data/wrong/results.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp128.csv (renamed from src/cz/crcs/ectester/data/wrong/wrongp128.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp160.csv (renamed from src/cz/crcs/ectester/data/wrong/wrongp160.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp192.csv (renamed from src/cz/crcs/ectester/data/wrong/wrongp192.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp224.csv (renamed from src/cz/crcs/ectester/data/wrong/wrongp224.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp256.csv (renamed from src/cz/crcs/ectester/data/wrong/wrongp256.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp384.csv (renamed from src/cz/crcs/ectester/data/wrong/wrongp384.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp521.csv (renamed from src/cz/crcs/ectester/data/wrong/wrongp521.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/wrong/wrongt163.csv (renamed from src/cz/crcs/ectester/data/wrong/wrongt163.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/wrong/wrongt233.csv (renamed from src/cz/crcs/ectester/data/wrong/wrongt233.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/wrong/wrongt239.csv (renamed from src/cz/crcs/ectester/data/wrong/wrongt239.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/wrong/wrongt283.csv (renamed from src/cz/crcs/ectester/data/wrong/wrongt283.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/wrong/wrongt409.csv (renamed from src/cz/crcs/ectester/data/wrong/wrongt409.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/wrong/wrongt571.csv (renamed from src/cz/crcs/ectester/data/wrong/wrongt571.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/wycheproof/keys.xml (renamed from src/cz/crcs/ectester/data/wycheproof/keys.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/wycheproof/results.xml (renamed from src/cz/crcs/ectester/data/wycheproof/results.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/x962/curves.xml (renamed from src/cz/crcs/ectester/data/x962/curves.xml)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/x962/prime192v1.csv (renamed from src/cz/crcs/ectester/data/x962/prime192v1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/x962/prime192v2.csv (renamed from src/cz/crcs/ectester/data/x962/prime192v2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/x962/prime192v3.csv (renamed from src/cz/crcs/ectester/data/x962/prime192v3.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/x962/prime239v1.csv (renamed from src/cz/crcs/ectester/data/x962/prime239v1.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/x962/prime239v2.csv (renamed from src/cz/crcs/ectester/data/x962/prime239v2.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/x962/prime239v3.csv (renamed from src/cz/crcs/ectester/data/x962/prime239v3.csv)0
-rw-r--r--common/src/main/resources/cz/crcs/ectester/data/x962/prime256v1.csv (renamed from src/cz/crcs/ectester/data/x962/prime256v1.csv)0
-rw-r--r--dist/README.TXT16
-rw-r--r--docs/DEVELOPING.md7
-rw-r--r--docs/IMPLEMENTATIONS.md562
-rw-r--r--docs/LIBS.md116
-rw-r--r--docs/VULNS.md22
-rw-r--r--ext/ant-javacard.jarbin372534 -> 0 bytes
m---------ext/libressl0
m---------ext/mbedtls0
m---------ext/sdks0
m---------ext/wolfcrypt-jni0
-rw-r--r--ext/wolfcrypt-jni.jarbin0 -> 98431 bytes
-rw-r--r--gradle/wrapper/gradle-wrapper.jarbin0 -> 43453 bytes
-rw-r--r--gradle/wrapper/gradle-wrapper.properties7
-rwxr-xr-xgradlew249
-rw-r--r--gradlew.bat92
-rw-r--r--lib/bcprov-jdk18on-172.jarbin11274121 -> 0 bytes
-rw-r--r--lib/commons-cli-1.5.0-javadoc.jarbin185927 -> 0 bytes
-rw-r--r--lib/commons-cli-1.5.0.jarbin58284 -> 0 bytes
-rw-r--r--lib/jcardsim-3.0.5.11.jarbin499643 -> 0 bytes
-rw-r--r--lib/snakeyaml-1.19.jarbin297518 -> 0 bytes
-rw-r--r--lib/wolfcrypt-jni.jarbin83453 -> 0 bytes
-rw-r--r--nbproject/copylibstask.jarbin11902 -> 0 bytes
-rw-r--r--nbproject/dist-build.xml39
-rw-r--r--nbproject/genfiles.properties8
-rwxr-xr-xnbproject/keystorebin3987 -> 0 bytes
-rw-r--r--nbproject/reader/build-impl.xml1413
-rw-r--r--nbproject/reader/manifest.mf4
-rw-r--r--nbproject/reader/project.properties80
-rw-r--r--nbproject/reader/project.xml15
-rw-r--r--nbproject/standalone/build-impl.xml1413
-rw-r--r--nbproject/standalone/manifest.mf4
-rw-r--r--nbproject/standalone/project.properties81
-rw-r--r--nbproject/standalone/project.xml15
-rw-r--r--reader/build.gradle.kts66
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/CardMngr.java (renamed from src/cz/crcs/ectester/reader/CardMngr.java)7
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/ECTesterReader.java (renamed from src/cz/crcs/ectester/reader/ECTesterReader.java)125
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/ISO7816_status_words.txt (renamed from src/cz/crcs/ectester/reader/ISO7816_status_words.txt)0
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/command/Command.java (renamed from src/cz/crcs/ectester/reader/command/Command.java)95
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/output/FileTestWriter.java (renamed from src/cz/crcs/ectester/reader/output/FileTestWriter.java)33
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/output/ResponseWriter.java (renamed from src/cz/crcs/ectester/reader/output/ResponseWriter.java)0
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/output/TextTestWriter.java (renamed from src/cz/crcs/ectester/reader/output/TextTestWriter.java)4
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/output/XMLTestWriter.java (renamed from src/cz/crcs/ectester/reader/output/XMLTestWriter.java)0
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/output/YAMLTestWriter.java (renamed from src/cz/crcs/ectester/reader/output/YAMLTestWriter.java)0
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/response/Response.java (renamed from src/cz/crcs/ectester/reader/response/Response.java)42
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/test/CardCofactorSuite.java (renamed from src/cz/crcs/ectester/reader/test/CardCofactorSuite.java)16
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/test/CardCompositeSuite.java (renamed from src/cz/crcs/ectester/reader/test/CardCompositeSuite.java)22
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/test/CardCompressionSuite.java (renamed from src/cz/crcs/ectester/reader/test/CardCompressionSuite.java)41
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/test/CardDefaultSuite.java (renamed from src/cz/crcs/ectester/reader/test/CardDefaultSuite.java)33
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/test/CardDegenerateSuite.java (renamed from src/cz/crcs/ectester/reader/test/CardDegenerateSuite.java)16
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/test/CardEdgeCasesSuite.java (renamed from src/cz/crcs/ectester/reader/test/CardEdgeCasesSuite.java)93
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/test/CardInvalidSuite.java (renamed from src/cz/crcs/ectester/reader/test/CardInvalidSuite.java)16
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/test/CardMiscSuite.java (renamed from src/cz/crcs/ectester/reader/test/CardMiscSuite.java)14
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/test/CardSignatureSuite.java (renamed from src/cz/crcs/ectester/reader/test/CardSignatureSuite.java)12
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/test/CardTestSuite.java (renamed from src/cz/crcs/ectester/reader/test/CardTestSuite.java)18
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/test/CardTestVectorSuite.java (renamed from src/cz/crcs/ectester/reader/test/CardTestVectorSuite.java)38
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/test/CardTwistSuite.java (renamed from src/cz/crcs/ectester/reader/test/CardTwistSuite.java)16
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/test/CardWrongSuite.java (renamed from src/cz/crcs/ectester/reader/test/CardWrongSuite.java)73
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/test/CommandTest.java (renamed from src/cz/crcs/ectester/reader/test/CommandTest.java)0
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/test/CommandTestable.java (renamed from src/cz/crcs/ectester/reader/test/CommandTestable.java)0
-rw-r--r--reader/src/main/java/cz/crcs/ectester/reader/test/PerformanceTest.java (renamed from src/cz/crcs/ectester/reader/test/PerformanceTest.java)6
-rw-r--r--settings.gradle.kts12
-rw-r--r--src/cz/crcs/ectester/standalone/libs/MatrixsslLib.java20
-rw-r--r--src/cz/crcs/ectester/standalone/libs/jni/.gitignore6
-rw-r--r--src/cz/crcs/ectester/standalone/libs/jni/matrixssl.c397
-rw-r--r--standalone/build.gradle.kts124
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/ECTesterStandalone.java (renamed from src/cz/crcs/ectester/standalone/ECTesterStandalone.java)99
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/consts/Ident.java (renamed from src/cz/crcs/ectester/standalone/consts/Ident.java)4
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/consts/KeyAgreementIdent.java (renamed from src/cz/crcs/ectester/standalone/consts/KeyAgreementIdent.java)4
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/consts/KeyPairGeneratorIdent.java (renamed from src/cz/crcs/ectester/standalone/consts/KeyPairGeneratorIdent.java)0
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/consts/SignatureIdent.java (renamed from src/cz/crcs/ectester/standalone/consts/SignatureIdent.java)4
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/BoringsslLib.java (renamed from src/cz/crcs/ectester/standalone/libs/BoringsslLib.java)2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/BotanLib.java (renamed from src/cz/crcs/ectester/standalone/libs/BotanLib.java)2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/BouncyCastleLib.java (renamed from src/cz/crcs/ectester/standalone/libs/BouncyCastleLib.java)4
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/CryptoppLib.java (renamed from src/cz/crcs/ectester/standalone/libs/CryptoppLib.java)2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/ECLibrary.java (renamed from src/cz/crcs/ectester/standalone/libs/ECLibrary.java)0
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/GcryptLib.java (renamed from src/cz/crcs/ectester/standalone/libs/GcryptLib.java)2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/IppcpLib.java (renamed from src/cz/crcs/ectester/standalone/libs/IppcpLib.java)2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/LibresslLib.java (renamed from src/cz/crcs/ectester/standalone/libs/LibresslLib.java)2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/MbedTLSLib.java (renamed from src/cz/crcs/ectester/standalone/libs/MbedTLSLib.java)2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/MscngLib.java (renamed from src/cz/crcs/ectester/standalone/libs/MscngLib.java)2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/NativeECLibrary.java (renamed from src/cz/crcs/ectester/standalone/libs/NativeECLibrary.java)23
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/NettleLib.java (renamed from src/cz/crcs/ectester/standalone/libs/NettleLib.java)2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/OpensslLib.java (renamed from src/cz/crcs/ectester/standalone/libs/OpensslLib.java)2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/ProviderECLibrary.java (renamed from src/cz/crcs/ectester/standalone/libs/ProviderECLibrary.java)10
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/SunECLib.java (renamed from src/cz/crcs/ectester/standalone/libs/SunECLib.java)2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/TomcryptLib.java (renamed from src/cz/crcs/ectester/standalone/libs/TomcryptLib.java)2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/WolfCryptLib.java (renamed from src/cz/crcs/ectester/standalone/libs/WolfCryptLib.java)12
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeECPrivateKey.java (renamed from src/cz/crcs/ectester/standalone/libs/jni/NativeECPrivateKey.java)25
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeECPublicKey.java (renamed from src/cz/crcs/ectester/standalone/libs/jni/NativeECPublicKey.java)23
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java (renamed from src/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java)54
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi.java (renamed from src/cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi.java)27
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeProvider.java (renamed from src/cz/crcs/ectester/standalone/libs/jni/NativeProvider.java)11
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi.java (renamed from src/cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi.java)42
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/output/FileTestWriter.java50
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/output/TextTestWriter.java (renamed from src/cz/crcs/ectester/standalone/output/TextTestWriter.java)2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/output/XMLTestWriter.java (renamed from src/cz/crcs/ectester/standalone/output/XMLTestWriter.java)2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/output/YAMLTestWriter.java (renamed from src/cz/crcs/ectester/standalone/output/YAMLTestWriter.java)2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/base/KeyAgreementTest.java (renamed from src/cz/crcs/ectester/standalone/test/base/KeyAgreementTest.java)0
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/base/KeyAgreementTestable.java (renamed from src/cz/crcs/ectester/standalone/test/base/KeyAgreementTestable.java)0
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/base/KeyGeneratorTest.java (renamed from src/cz/crcs/ectester/standalone/test/base/KeyGeneratorTest.java)0
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/base/KeyGeneratorTestable.java (renamed from src/cz/crcs/ectester/standalone/test/base/KeyGeneratorTestable.java)2
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/base/PerformanceTest.java (renamed from src/cz/crcs/ectester/standalone/test/base/PerformanceTest.java)29
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/base/SignatureTest.java (renamed from src/cz/crcs/ectester/standalone/test/base/SignatureTest.java)0
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/base/SignatureTestable.java (renamed from src/cz/crcs/ectester/standalone/test/base/SignatureTestable.java)0
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/base/StandaloneTestable.java (renamed from src/cz/crcs/ectester/standalone/test/base/StandaloneTestable.java)0
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneCofactorSuite.java (renamed from src/cz/crcs/ectester/standalone/test/suites/StandaloneCofactorSuite.java)0
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneCompositeSuite.java (renamed from src/cz/crcs/ectester/standalone/test/suites/StandaloneCompositeSuite.java)0
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneDefaultSuite.java (renamed from src/cz/crcs/ectester/standalone/test/suites/StandaloneDefaultSuite.java)0
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneDegenerateSuite.java (renamed from src/cz/crcs/ectester/standalone/test/suites/StandaloneDegenerateSuite.java)0
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneEdgeCasesSuite.java (renamed from src/cz/crcs/ectester/standalone/test/suites/StandaloneEdgeCasesSuite.java)1
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneInvalidSuite.java (renamed from src/cz/crcs/ectester/standalone/test/suites/StandaloneInvalidSuite.java)0
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneMiscSuite.java (renamed from src/cz/crcs/ectester/standalone/test/suites/StandaloneMiscSuite.java)0
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandalonePerformanceSuite.java (renamed from src/cz/crcs/ectester/standalone/test/suites/StandalonePerformanceSuite.java)8
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneSignatureSuite.java (renamed from src/cz/crcs/ectester/standalone/test/suites/StandaloneSignatureSuite.java)0
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneTestSuite.java (renamed from src/cz/crcs/ectester/standalone/test/suites/StandaloneTestSuite.java)0
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneTestVectorSuite.java (renamed from src/cz/crcs/ectester/standalone/test/suites/StandaloneTestVectorSuite.java)0
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneTwistSuite.java (renamed from src/cz/crcs/ectester/standalone/test/suites/StandaloneTwistSuite.java)0
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneWrongSuite.java (renamed from src/cz/crcs/ectester/standalone/test/suites/StandaloneWrongSuite.java)3
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/.clang-format (renamed from src/cz/crcs/ectester/standalone/libs/jni/.clang-format)0
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/.gitignore5
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile (renamed from src/cz/crcs/ectester/standalone/libs/jni/Makefile)43
-rwxr-xr-xstandalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile.bat (renamed from src/cz/crcs/ectester/standalone/libs/jni/Makefile.bat)326
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/boringssl.c (renamed from src/cz/crcs/ectester/standalone/libs/jni/boringssl.c)21
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/botan.cpp (renamed from src/cz/crcs/ectester/standalone/libs/jni/botan.cpp)195
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_timing.c (renamed from src/cz/crcs/ectester/standalone/libs/jni/c_timing.c)0
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_timing.h (renamed from src/cz/crcs/ectester/standalone/libs/jni/c_timing.h)0
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_utils.c (renamed from src/cz/crcs/ectester/standalone/libs/jni/c_utils.c)29
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_utils.h (renamed from src/cz/crcs/ectester/standalone/libs/jni/c_utils.h)8
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cpp_utils.cpp (renamed from src/cz/crcs/ectester/standalone/libs/jni/cpp_utils.cpp)0
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cpp_utils.hpp (renamed from src/cz/crcs/ectester/standalone/libs/jni/cpp_utils.hpp)0
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp (renamed from src/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp)264
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/gcrypt.c (renamed from src/cz/crcs/ectester/standalone/libs/jni/gcrypt.c)34
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/ippcp.c (renamed from src/cz/crcs/ectester/standalone/libs/jni/ippcp.c)55
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/libressl.c (renamed from src/cz/crcs/ectester/standalone/libs/jni/libressl.c)76
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/mbedtls.c (renamed from src/cz/crcs/ectester/standalone/libs/jni/mbedtls.c)97
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/mscng.c (renamed from src/cz/crcs/ectester/standalone/libs/jni/mscng.c)2545
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/native.h (renamed from src/cz/crcs/ectester/standalone/libs/jni/native.h)181
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/nettle.c (renamed from src/cz/crcs/ectester/standalone/libs/jni/nettle.c)99
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/openssl.c (renamed from src/cz/crcs/ectester/standalone/libs/jni/openssl.c)6
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/tomcrypt.c (renamed from src/cz/crcs/ectester/standalone/libs/jni/tomcrypt.c)25
-rw-r--r--standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java360
-rw-r--r--standalone/src/test/java/cz/crcs/ectester/standalone/IdentTests.java49
-rw-r--r--standalone/src/test/java/cz/crcs/ectester/standalone/LibTests.java53
-rw-r--r--standalone/src/test/java/cz/crcs/ectester/standalone/OutputTests.java21
-rwxr-xr-xutil/run_all_suites.sh29
-rwxr-xr-xutil/run_test_suite.sh81
-rwxr-xr-xutil/test.sh48
660 files changed, 5946 insertions, 7876 deletions
diff --git a/.appveyor.yml b/.appveyor.yml
deleted file mode 100755
index 051d974..0000000
--- a/.appveyor.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-version: '{build}'
-image: Visual Studio 2017
-
-branches:
- except:
- - gh-pages
-
-environment:
- JAVA_HOME: C:\Program Files\Java\jdk1.8.0
-
-install:
- - cinst ant
- - git submodule update --init --recursive
-
-build_script:
- - ant -f build-applet.xml build
- - ant -f build-reader.xml package
- - ant -f build-standalone.xml package \ No newline at end of file
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..097f9f9
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,9 @@
+#
+# https://help.github.com/articles/dealing-with-line-endings/
+#
+# Linux start script should use lf
+/gradlew text eol=lf
+
+# These are Windows script files and should use crlf
+*.bat text eol=crlf
+
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..ab2a2ee
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,206 @@
+name: Build
+
+on:
+ push:
+ branches: [ "master" ]
+ pull_request:
+ branches: [ "master" ]
+
+jobs:
+ applet:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+
+ strategy:
+ matrix:
+ java: [ "8", "11", "17"]
+ env:
+ JAVA_VERSION: ${{ matrix.java }}
+ name: Build applet with Java ${{ matrix.java }}
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: recursive
+
+ - name: Set up JDK
+ uses: actions/setup-java@v4
+ with:
+ java-version: ${{ matrix.java }}
+ distribution: "temurin"
+
+ - name: Setup Gradle
+ uses: gradle/actions/setup-gradle@v3
+
+ - name: Build applets
+ run: ./gradlew applet:buildJavaCard
+
+ - name: Test
+ run: ./gradlew applet:test
+
+ - name: Upload build artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: built-applet-${{ matrix.java }}
+ path: |
+ applet/build/javacard/*.cap
+
+ reader:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+
+ strategy:
+ matrix:
+ java: [ "11", "17", "21" ]
+ name: Build reader on Java ${{ matrix.java }}
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: recursive
+
+ - name: Set up JDK
+ uses: actions/setup-java@v4
+ with:
+ java-version: ${{ matrix.java }}
+ distribution: "temurin"
+
+ - name: Setup Gradle
+ uses: gradle/actions/setup-gradle@v3
+
+ - name: Build reader
+ run: ./gradlew reader:uberJar
+
+ - name: Test
+ run: ./gradlew reader:test
+
+ - name: Upload build artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: built-reader-${{ matrix.java }}
+ path: |
+ reader/build/libs/ECTesterReader.jar
+
+ standalone:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+
+ strategy:
+ matrix:
+ java: [ "11", "17", "21" ]
+ env:
+ # ffs: https://github.com/adoptium/adoptium-support/issues/485 !!!
+ # also, add the wolfcrypt JNI path
+ LD_LIBRARY_PATH: "/usr/lib/x86_64-linux-gnu/:${{github.workspace}}/ext/wolfcrypt-jni/lib/"
+ name: Build standalone on Java ${{ matrix.java }}
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: recursive
+ fetch-tags: true
+ fetch-depth: -1
+
+ - name: Set up JDK
+ uses: actions/setup-java@v4
+ with:
+ java-version: ${{ matrix.java }}
+ distribution: "temurin"
+
+ - name: Setup Gradle
+ uses: gradle/actions/setup-gradle@v3
+
+ - name: Setup libraries
+ run: |
+ sudo apt update
+ sudo apt install libtomcrypt-dev libtommath-dev libssl-dev libcrypto++-dev libgcrypt20-dev nettle-dev libbotan-2-dev libwolfssl-dev nasm
+ echo "BORINGSSL_VERSION=$(git submodule status ext/boringssl | cut -f2 -d' ' | cut -c1-10)" >> $GITHUB_ENV
+ echo "LIBRESSL_VERSION=$(git submodule status ext/libressl | cut -f2 -d' ' | cut -c1-10)" >> $GITHUB_ENV
+ echo "IPPCP_VERSION=$(git submodule status ext/ipp-crypto | cut -f2 -d' ' | cut -c1-10)" >> $GITHUB_ENV
+ echo "MBEDTLS_VERSION=$(git submodule status ext/mbedtls | cut -f2 -d' ' | cut -c1-10)" >> $GITHUB_ENV
+ echo "WOLFCRYPT_VERSION=$(git submodule status ext/wolfcrypt-jni | cut -f2 -d' ' | cut -c1-10)" >> $GITHUB_ENV
+ echo "WOLFSSL_VERSION=$(dpkg -s libwolfssl-dev | grep 'Version' | cut -f2 -d' ')" >> $GITHUB_ENV
+
+ - name: Cache libs
+ uses: actions/cache@v4
+ id: cache-libs
+ with:
+ key: libs-${{ env.BORINGSSL_VERSION }}-${{ env.LIBRESSL_VERSION }}-${{ env.LIBRESSL_VERSION }}-${{ env.IPPCP_VERSION }}-${{ env.WOLFCRYPT_VERSION }}-${{ env.WOLFSSL_VERSION }}-${{ hashFiles('.github/workflows/build.yml') }}-${{ matrix.java }}
+ path: |
+ ext/boringssl/build/
+ ext/libressl/build/
+ ext/ipp-crypto/build/
+ ext/mbedtls/build/
+ ext/wolfcrypt-jni/lib/wolfcrypt-jni.jar
+ ext/wolfcrypt-jni/lib/libwolfcryptjni.so
+
+ - name: Build libs
+ if: steps.cache-libs.outputs.cache-hit != 'true'
+ run: |
+ # ------------ Build BoringSSL ------------
+ cd ext/boringssl
+ cmake -DBUILD_SHARED_LIBS=1 -Bbuild -G "Unix Makefiles"
+ cd build
+ make -j4 crypto
+ cd ../../..
+ # ------------ Build LibreSSL ------------
+ cd ext/libressl
+ ./autogen.sh
+ cmake -DBUILD_SHARED_LIBS=ON -Bbuild -G "Unix Makefiles"
+ cd build
+ make -j4 crypto
+ cd ../../..
+ # ------------ Build IPP-crypto ------------
+ cd ext/ipp-crypto
+ CC=clang CXX=clang++ cmake CMakeLists.txt -Bbuild -DARCH=intel64 -G "Unix Makefiles"
+ cd build
+ make -j4
+ cd ../../..
+ # ------------ Build wolfcrypt-jni ------------
+ cd ext/wolfcrypt-jni
+ mkdir junit
+ wget -P junit/ https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar
+ wget -P junit/ https://repo1.maven.org/maven2/org/hamcrest/hamcrest-all/1.3/hamcrest-all-1.3.jar
+ make -j4 -f makefile.linux
+ env JUNIT_HOME=junit/ ant build-jce-release
+ cd ../..
+ # ------------ Build mbedTLS ------------
+ cd ext/mbedtls
+ python -m venv virt
+ . virt/bin/activate
+ pip install -r scripts/basic.requirements.txt
+ cmake -DUSE_SHARED_MBEDTLS_LIBRARY=On -Bbuild -G "Unix Makefiles"
+ cd build
+ make -j4
+ cd ../../..
+
+ - name: Build standalone
+ run: |
+ ./gradlew standalone:libs || true
+ ./gradlew standalone:uberJar
+
+ - name: List libraries
+ run: ./gradlew standalone:run --args="list-libs"
+
+ - name: Test
+ run: ./gradlew standalone:test
+
+ - name: Upload build artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: built-standalone-${{ matrix.java }}
+ path: |
+ standalone/build/libs/ECTesterStandalone.jar
+
+ - name: Upload results
+ uses: actions/upload-artifact@v4
+ with:
+ name: results-standalone-${{ matrix.java }}
+ path: |
+ standalone/build/results/
+
+ - name: Upload code coverage
+ uses: codecov/codecov-action@v4
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ slug: crocs-muni/ECTester
diff --git a/.gitignore b/.gitignore
index 201c0f8..aa7fbd3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -40,3 +40,9 @@
# Python stuff
/util/__pycache__/
/util/.ipynb_checkpoints/
+
+# Ignore Gradle project-specific cache directory
+.gradle
+
+# Ignore Gradle build output directory
+build
diff --git a/.gitmodules b/.gitmodules
index 603e4d9..7fea751 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -16,3 +16,9 @@
[submodule "ext/ipp-crypto"]
path = ext/ipp-crypto
url = https://github.com/intel/ipp-crypto
+[submodule "ext/wolfcrypt-jni"]
+ path = ext/wolfcrypt-jni
+ url = https://github.com/wolfSSL/wolfcrypt-jni
+[submodule "ext/mbedtls"]
+ path = ext/mbedtls
+ url = https://github.com/Mbed-TLS/mbedtls.git
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index be60ac9..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,63 +0,0 @@
-os: linux
-dist: bionic
-addons:
- apt:
- sources:
- - ubuntu-toolchain-r-test
- packages:
- - cmake
- - libmbedtls-dev
- - libtomcrypt-dev
- - libtommath-dev
- - libssl-dev
- - libcrypto++-dev
- - libgcrypt20-dev
- - nettle-dev
- - gcc-8
- - g++-8
-language: java
-jdk: openjdk8
-env:
- - CC=gcc-8 CXX=g++-8
-
-install:
- - eval "$(gimme 1.13)"
- - cd ext/boringssl
- - mkdir build
- - cd build
- - cmake -DBUILD_SHARED_LIBS=1 ..
- - make crypto
- - cd ../../..
- - cd ext/libressl
- - ./autogen.sh
- - mkdir build
- - cd build
- - cmake -DBUILD_SHARED_LIBS=ON ..
- - make crypto
- - cd ../../..
-
-script:
- - ant -f build-applet.xml build
- - ant -f build-reader.xml package
- - ant -f build-standalone.xml package
- - ./util/test.sh
-
-before_deploy:
- - zip "dist/ECTester.zip" "dist/ECTesterReader-dist.jar" "dist/ECTesterReader.jar" "applet/ectester221.cap" "applet/ectester222.cap" "dist/ECTesterStandalone-dist.jar" "dist/ECTesterStandalone.jar"
-
-deploy:
- provider: releases
- token:
- secure: q2aJvu32K+nfbMR60nFCEkn+jYCKprlCRlIoPjuRz1HySX233Ccwpx1CAdNzEjY6FDFcoReKAg6r5vdPjJ4FRPAQ23TxffIYZPkykL5K/pUZJbM5xkazJY0Fp8i6Vyl0JfeanVib1PTyOSugplhCttFk5nb9JUFV36Tre66XntOl5y80Trn94F5aTlRjfW26UH65W7Aa6WZ0N4OX/ZsX+vEOJPAu+RLfOq9oBOx/loB8ntYM/e/6bEwJp6EedRQLDsiS4NavP3svH+GXsPLs5p3soyRXYsvvGKVnVjcjZURxDDdxv5YuCWUUfl9PbNB+Mqmx/HQxl50BKoKFqwap1+TnlbuTAiWaXeh3zdXuGB+TPg8KE8h6ueDneHd3Lpivgq79IvPWIH+N4b3Pa952+rD+JKBZ807efB+97OtWrkQL7/sLZESQUdIszE724HHOiArKpNajIX+kN6NJdul5xFCiQQHG+O7iDFQBavCGM9fk63mZRyGPxZQzS06BV2vIIHg0yx3igN+OKKMFCH+P3hYR1zL6o65OlgbL1ifTZ18GDvmVRNdi53/fxQ2n/mQmI4tQpn4ZB7Ddoxx4GlpjFjzdKk/P9nKwng0M9wrp8row/vb5S+1aPwSxp9/4ASP9dkvLcNjTkWhmGPrWe+82Y9JPK47uesx0YeaVI2C7IR0=
- file:
- - "dist/ECTesterReader-dist.jar"
- - "dist/ECTesterReader.jar"
- - "applet/ectester221.cap"
- - "applet/ectester222.cap"
- - "dist/ECTesterStandalone-dist.jar"
- - "dist/ECTesterStandalone.jar"
- - "dist/ECTester.zip"
- cleanup: false
- on:
- tags: true
- repo: crocs-muni/ECTester
diff --git a/README.md b/README.md
index f0fa08f..f9cbfd7 100644
--- a/README.md
+++ b/README.md
@@ -1,15 +1,16 @@
# ![](docs/full.png)
-[![Build status](https://api.travis-ci.org/crocs-muni/ECTester.svg?branch=master)](https://travis-ci.org/crocs-muni/ECTester) [![Build status](https://ci.appveyor.com/api/projects/status/02kcaf52op89910u?svg=true)](https://ci.appveyor.com/project/J08nY/ectester-cm6ng) [![GitHub release](https://img.shields.io/github/release/crocs-muni/ECTEster.svg)](https://github.com/crocs-muni/ECTester/releases) [![license](https://img.shields.io/github/license/crocs-muni/ECTester.svg)](https://github.com/crocs-muni/ECTester/blob/master/LICENSE) [![docs](https://img.shields.io/badge/docs-github.io-brightgreen.svg)](https://crocs-muni.github.io/ECTester/)
+[![Build](https://github.com/crocs-muni/ECTester/actions/workflows/build.yml/badge.svg)](https://github.com/crocs-muni/ECTester/actions/workflows/build.yml) [![codecov](https://codecov.io/github/crocs-muni/ECTester/graph/badge.svg?token=ulX0fZQinp)](https://codecov.io/github/crocs-muni/ECTester) [![GitHub release](https://img.shields.io/github/release/crocs-muni/ECTEster.svg)](https://github.com/crocs-muni/ECTester/releases) [![license](https://img.shields.io/github/license/crocs-muni/ECTester.svg)](https://github.com/crocs-muni/ECTester/blob/master/LICENSE) [![docs](https://img.shields.io/badge/docs-github.io-brightgreen.svg)](https://crocs-muni.github.io/ECTester/)
-ECTester is a tool for testing and analysis of elliptic curve cryptography implementations on JavaCards and in cryptographic libraries. It consists of four separate parts:
+ECTester is a tool for testing and analysis of elliptic curve cryptography implementations on JavaCards and in
+cryptographic libraries. It consists of four separate parts:
- The ECTester applet, a JavaCard applet that provides the testing interface
- The ECTesterReader app, a reader app that works with the applet
- The ECTesterStandalone app, which works with software libraries
- Jupyter notebooks for analysis and visualization of data from the apps
-For more information on ECC support on JavaCards see the [github page](https://crocs-muni.github.io/ECTester/), with results, tables and docs.
+For more information on ECC support on JavaCards see the [GitHub page](https://crocs-muni.github.io/ECTester/), with results, tables and docs.
This project is developed by the [Centre for Research On Cryptography and Security](https://crocs.fi.muni.cz) at Faculty of Informatics, Masaryk University.
@@ -30,25 +31,26 @@ This project is developed by the [Centre for Research On Cryptography and Securi
## Setup
-ECTester uses Java 8 and ant. There are three parts of ECTester, the JavaCard applet used for testing, the reader app which controls it and the standalone app which tests software libraries. The target platform for ECTester is Linux, but things should work on Windows as well, although testing of standalone libraries will be limited to Java libraries and Microsoft CNG library.
+ECTester uses Gradle (and Gradle wrapper) for its build.
+There are three parts of ECTester, the JavaCard applet used for testing, the reader app which controls it and the
+standalone app which tests software libraries. The target platform for ECTester is Linux, but things should work on
+Windows as well, although testing of standalone libraries will be limited to Java libraries and Microsoft CNG library.
To build ECTester simply do:
```bash
git submodule update --init --recursive # To initialize submodules (JavaCard SDKs, Microsoft CNG, BoringSSL, ...)
-ant -f build-reader.xml package # To build the reader tool (jar) -> "dist/ECTesterReader.jar"
-ant -f build-standalone.xml package # To build the standalone tool (jar) -> "dist/ECTesterStandalone.jar"
-ant -f build-applet.xml build # To build the applet (cap) -> "applet/ectester.cap".
+./gradlew :applet:buildJavaCard # To build the applet (cap) -> "applet/build/javacard/applet[221,222,305].cap".
+./gradlew :reader:uberJar # To build the reader tool (jar) -> "reader/build/libs/ECTesterReader.jar"
+./gradlew :standalone:libs # To build the native library shims. (Necessary
+./gradlew :standalone:uberJar # To build the standalone tool (jar) -> "standalone/build/libs/ECTesterStandalone.jar"
```
-Build produces both a lightweight version of the JARs and a full version of the JARs with dependencies included, the latter has the `*-dist.jar` suffix.
+The applet comes in several flavors, targeting JavaCard `2.2.1`, `2.2.2` and `3.0.5`. The `2.2.2` and later flavors
+support extended length APDUs which are necessary for some commands to work properly.
-The applet comes in two flavors, targeting JavaCard 2.2.1 and 2.2.2. The 2.2.2 version supports extended length APDUs which are necessary for some commands to work properly. Use the `cap` ant property to specify which CAP file to build, either `ectester221.cap` or `ectester222.cap`.
-
-To build the 221 version do:
-```bash
-ant -f build-applet.xml build -Dcap=ectester221.cap
-```
-
-The `build-standalone.xml` ant build file invokes a Makefile (or a Makefile.bat on Windows) in `src/cz/crcs/ectester/standalone/libs/jni`, which tries to build the C/C++ shim libraries required for ECTester to test the actual native cryptographic libraries from Java. The Makefile uses pkg-config to locate the libraries installed, thus if non-standard location of the tested libraries is used, the Makefile or your pkg-config needs some changes to work.
+The `:standalone:libs` task invokes a Makefile in `standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni`, which tries to build the
+C/C++ shim libraries required for ECTester to test the actual native cryptographic libraries from Java.
+The Makefile uses pkg-config to locate the libraries installed, thus if non-standard location of the tested libraries is
+used, the Makefile or your pkg-config needs some changes to work.
See the section on [setup](#setup-1) of standalone library testing for more details.
@@ -56,8 +58,8 @@ See the section on [setup](#setup-1) of standalone library testing for more deta
The JavaCard part of ECTester targets testing elliptic curve cryptography implementations in programmable smart cards of the JavaCard platform, version 2.2.1 and up. The reader app supports many actions, the main one being [testing](#test): the running of predetermined test suites that test the JavaCard for support, performance and vulnerabilities. The other actions focus on data collection, [generating keys](#generate), [signing data](#ecdsa), [performing key agreement](#ecdh) or [exporting the preset curves](#export), output of the mentioned actions can then be analyzed using the Jupyter notebooks, see [analysis](#analysis).
-1. Upload `applet/ectester.cap` using your favorite tool (e.g., [GlobalPlatformPro tool](https://github.com/martinpaljak/GlobalPlatform)) or the `build-applet.xml` ant file (target `upload` or `upload-emv`).
-2. Run `java -jar dist/ECTesterReader.jar -t` or other data collection commands.
+1. Upload `applet/build/applet/ectester[221,222,305].cap` using your favorite tool (e.g., [GlobalPlatformPro tool](https://github.com/martinpaljak/GlobalPlatform)).
+2. Run `java -jar reader/build/libs/ECTesterReader.jar -t` or other data collection commands.
3. Inspect output log with annotated results.
Following operations are tested in the default test suite, which is just a basic support test suite:
@@ -296,7 +298,6 @@ Currently supported libraries include:
- [Botan](https://botan.randombit.net/)
- [Microsoft CNG](https://msdn.microsoft.com/en-us/library/windows/desktop/aa376210(v=vs.85).aspx)
- [Intel Performance Primitives Crypto](https://github.com/intel/ipp-crypto)
- - [MatrixSSL](https://github.com/matrixssl/matrixssl)
- [MbedTLS](https://github.com/ARMmbed/mbedtls)
- [Nettle](https://www.lysator.liu.se/~nisse/nettle/)
- [LibreSSL](https://www.libressl.org/)
@@ -305,87 +306,128 @@ For more information on ECC libraries see [LIBS](docs/LIBS.md).
### Setup
-Simply doing `ant -f build-standalone.xml package` should build everything necessary to teste libraries via the standalone app, the sections below describe the details of how that works and what needs to be done if it doesn't.
+```shell
+./gradlew :standalone:libs # To build the native library shims.
+./gradlew :standalone:uberJar # To build the standalone tool (jar) -> "standalone/build/libs/ECTesterStandalone.jar"
+```
+Simply doing the above should build everything necessary to test libraries via the standalone app,
+(except the BoringSSL, LibreSSL, ipp-crypto, mbedTLS, and wolfCrypt libraries)
+the sections below describe the details of how that works and what needs to be done if it doesn't.
-To see whether your build was sucessful, go to the `dist` directory, run:
-`java -jar ECTesterStandalone.jar list-libs` and observe if your target libraries are included in the output. If they are not, and they are native libraries, it means that either the shim library was not built successfully or that the actual native library couldn't be found and loaded on runtime. To solve the former, look for build errors during the ant run in the `libs-try` step, for the latter, if the library is in an non-standard location specifying `LD_LIBRARY_PATH` will help load it. Consulting the next sections should help solve both.
+To see whether your build was successful, run:
+`java -jar standalone/build/libs/ECTesterStandalone.jar list-libs` and observe if your target libraries are included in
+the output. If they are not, and they are native libraries, it means that either the shim library was not built
+successfully or that the actual native library couldn't be found and loaded on runtime. To solve the former, look for
+build errors during the ant run in the `libs-try` step, for the latter, if the library is in an non-standard location
+specifying `LD_LIBRARY_PATH` will help load it. Consulting the next sections should help solve both.
#### Native
-ECTester interfaces with native libraries by using custom shim libraries that expose the functionality via the [Java Native Interface](https://en.wikipedia.org/wiki/Java_Native_Interface), these can be found in the [src/cz/crcs/ectester/standalone/libs/jni](src/cz/crcs/ectester/standalone/libs/jni) directory along with a Makefile (Makefile.bat for Windows). The shim library will depend on the native library, and have a name like `boringssl_provider.so`, `botan_provider.so`, `cryptopp_provider.so` and `openssl_provider.so`. The Makefile has a target for every library that it supports that builds its shim, see the `help` target for more info. The Makefile is automatically ran when the `build-standalone.xml` ant build is triggered, so if all is setup correctly, you do not need to deal with the Makefile while building.
+ECTester interfaces with native libraries by using custom shim libraries that expose the functionality via the [Java Native Interface](https://en.wikipedia.org/wiki/Java_Native_Interface), these can be found in the [standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni](standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni) directory along with a Makefile (Makefile.bat for Windows). The shim library will depend on the native library, and have a name like `boringssl_provider.so`, `botan_provider.so`, `cryptopp_provider.so` and `openssl_provider.so`. The Makefile has a target for every library that it supports that builds its shim, see the `help` target for more info. The Makefile is automatically ran when the `:standalone:libs` gradle task is triggered, so if all is setup correctly, you do not need to deal with the Makefile while building.
There are two important environmental variables that should be set in your environment. First, you should set `JAVA_HOME` which should point to your JDK. The tooling uses `JAVA_HOME` to locate native Java library headers, like `jni.h`. Second, ECTester uses pkg-config to locate the native libraries, if your pkg-config files are in an unusual place the pkg-config command would not find them by default, you should set `PKG_CONFIG_PATH` to the directory containing the `*.pc` files. If pkg-config files are unavailable for the library you are trying to test, you will need to change the Makefile manually to apply the correct options to the commands (CFLAGS, include options, linker options...).
Below you can see how a full build with all the libraries currently supported on Linux looks
```
-> cd src/cz/crcs/ectester/standalone/libs/jni
+> cd standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni
> make
-cc -DLTM_DESC -I/usr/local/include -fPIC -I"/usr/lib/jvm/java-8-openjdk/include" -I"/usr/lib/jvm/java-8-openjdk/include/linux" -I. -O2 -c tomcrypt.c
-cc -fPIC -I"/usr/lib/jvm/java-8-openjdk/include" -I"/usr/lib/jvm/java-8-openjdk/include/linux" -I. -O2 -c c_utils.c
-cc -o lib_timing.so -shared -fPIC -I"/usr/lib/jvm/java-8-openjdk/include" -I"/usr/lib/jvm/java-8-openjdk/include/linux" -I. -O2 -Wl,-soname,lib_timing.so c_timing.c
-g++ -I/usr/include/botan-2 -fPIC -I"/usr/lib/jvm/java-8-openjdk/include" -I"/usr/lib/jvm/java-8-openjdk/include/linux" -I. -O2 -c botan.cpp
-g++ -fPIC -I"/usr/lib/jvm/java-8-openjdk/include" -I"/usr/lib/jvm/java-8-openjdk/include/linux" -I. -O2 -c cpp_utils.cpp
-g++ -I/usr/local/include -fPIC -I"/usr/lib/jvm/java-8-openjdk/include" -I"/usr/lib/jvm/java-8-openjdk/include/linux" -I. -O2 -c cryptopp.cpp
-cc -fPIC -I"/usr/lib/jvm/java-8-openjdk/include" -I"/usr/lib/jvm/java-8-openjdk/include/linux" -I. -O2 -c openssl.c
-cc -I../../../../../../../ext/boringssl/include/ -fPIC -I"/usr/lib/jvm/java-8-openjdk/include" -I"/usr/lib/jvm/java-8-openjdk/include/linux" -I. -O2 -c boringssl.c
-cp ../../../../../../../ext/boringssl/build/crypto/libcrypto.so lib_boringssl.so
-cc -fPIC -I"/usr/lib/jvm/java-8-openjdk/include" -I"/usr/lib/jvm/java-8-openjdk/include/linux" -I. -O2 -c gcrypt.c
-cc -fPIC -I"/usr/lib/jvm/java-8-openjdk/include" -I"/usr/lib/jvm/java-8-openjdk/include/linux" -I. -O2 -c mbedtls.c
-cc -fPIC -I"/usr/lib/jvm/java-8-openjdk/include" -I"/usr/lib/jvm/java-8-openjdk/include/linux" -I. -O2 -c ippcp.c
-cc -fPIC -I"/usr/lib/jvm/java-8-openjdk/include" -I"/usr/lib/jvm/java-8-openjdk/include/linux" -I. -O2 -Imatrixssl/ -c matrixssl.c
-cc -fPIC -shared -O2 -o tomcrypt_provider.so -Wl,-rpath,'$ORIGIN/lib' tomcrypt.o c_utils.o -L. -ltommath -L/usr/local/lib -ltomcrypt -l:lib_timing.so
-cc -fPIC -shared -O2 -o openssl_provider.so -Wl,-rpath,'$ORIGIN/lib' openssl.o c_utils.o -L. -lssl -lcrypto -l:lib_timing.so
+cc -DLTM_DESC -fPIC -I"/usr/lib/jvm/java-21-openjdk/include" -I"/usr/lib/jvm/java-21-openjdk/include/linux" -I. -Wno-deprecated-declarations -O2 -c tomcrypt.c
+cc -fPIC -I"/usr/lib/jvm/java-21-openjdk/include" -I"/usr/lib/jvm/java-21-openjdk/include/linux" -I. -Wno-deprecated-declarations -O2 -c c_utils.c
+cc -o lib_timing.so -shared -fPIC -I"/usr/lib/jvm/java-21-openjdk/include" -I"/usr/lib/jvm/java-21-openjdk/include/linux" -I. -Wno-deprecated-declarations -O2 -Wl,-soname,lib_timing.so c_timing.c
+cc -fPIC -shared -O2 -o tomcrypt_provider.so -Wl,-rpath,'$ORIGIN/lib' tomcrypt.o c_utils.o -L. -ltommath -ltomcrypt -l:lib_timing.so
+g++ -I/usr/include/botan-2 -fPIC -I"/usr/lib/jvm/java-21-openjdk/include" -I"/usr/lib/jvm/java-21-openjdk/include/linux" -I. -Wno-deprecated-declarations -O2 -c botan.cpp
+g++ -fPIC -I"/usr/lib/jvm/java-21-openjdk/include" -I"/usr/lib/jvm/java-21-openjdk/include/linux" -I. -Wno-deprecated-declarations -O2 -c cpp_utils.cpp
+g++ -fPIC -shared -O2 -o botan_provider.so -Wl,-rpath,'$ORIGIN/lib' botan.o cpp_utils.o -L. -lbotan-2 -fstack-protector -m64 -pthread -l:lib_timing.so
+g++ -fPIC -I"/usr/lib/jvm/java-21-openjdk/include" -I"/usr/lib/jvm/java-21-openjdk/include/linux" -I. -Wno-deprecated-declarations -O2 -c cryptopp.cpp
+g++ -fPIC -shared -O2 -o cryptopp_provider.so -Wl,-rpath,'$ORIGIN/lib' cryptopp.o cpp_utils.o -L. -lcryptopp -l:lib_timing.so
+cc -fPIC -I"/usr/lib/jvm/java-21-openjdk/include" -I"/usr/lib/jvm/java-21-openjdk/include/linux" -I. -Wno-deprecated-declarations -O2 -c openssl.c
+cc -fPIC -shared -O2 -o openssl_provider.so -Wl,-rpath,'$ORIGIN/lib' openssl.o c_utils.o -L. -lssl -lcrypto -l:lib_timing.so
+cc -I../../../../../../../../../../boringssl/include/ -fPIC -I"/usr/lib/jvm/java-21-openjdk/include" -I"/usr/lib/jvm/java-21-openjdk/include/linux" -I. -Wno-deprecated-declarations -O2 -c boringssl.c
+cp ../../../../../../../../../../boringssl/build/crypto/libcrypto.so lib_boringssl.so
cc -fPIC -shared -O2 -o boringssl_provider.so -Wl,-rpath,'$ORIGIN/lib' boringssl.o c_utils.o -L. lib_boringssl.so -l:lib_timing.so
-cc -fPIC -shared -O2 -o gcrypt_provider.so -Wl,-rpath,'$ORIGIN/lib' gcrypt.o c_utils.o -L. -lgcrypt -lgpg-error -l:lib_timing.so
-cc -fPIC -shared -O2 -o mbedtls_provider.so -Wl,-rpath,'$ORIGIN/lib' mbedtls.o c_utils.o -L. -lmbedcrypto -l:lib_timing.so
-cc -fPIC -shared -O2 -o ippcp_provider.so -Wl,-rpath,'$ORIGIN/lib' ippcp.o c_utils.o -L. -lippcp -l:lib_timing.so
-cc -fPIC -shared -O2 -o matrixssl_provider.so -Wl,-rpath,'$ORIGIN/lib' -L. matrixssl.o c_utils.o libcrypt_s.a libcore_s.a -l:lib_timing.so
-g++ -fPIC -shared -O2 -o botan_provider.so -Wl,-rpath,'$ORIGIN/lib' botan.o cpp_utils.o -L. -lbotan-2 -fstack-protector -m64 -pthread -l:lib_timing.so
-g++ -fPIC -shared -O2 -o cryptopp_provider.so -Wl,-rpath,'$ORIGIN/lib' cryptopp.o cpp_utils.o -L. -L/usr/local/lib -lcryptopp -l:lib_timing.so
+cc -I/usr/local/include -fPIC -I"/usr/lib/jvm/java-21-openjdk/include" -I"/usr/lib/jvm/java-21-openjdk/include/linux" -I. -Wno-deprecated-declarations -O2 -c gcrypt.c
+cc -fPIC -shared -O2 -o gcrypt_provider.so -Wl,-rpath,'$ORIGIN/lib' gcrypt.o c_utils.o -L. -L/usr/local/lib -lgcrypt -lgpg-error -l:lib_timing.so
+cc -I../../../../../../../../../../ext/mbedtls/include/ -fPIC -I"/usr/lib/jvm/java-21-openjdk/include" -I"/usr/lib/jvm/java-21-openjdk/include/linux" -I. -Wno-deprecated-declarations -O2 -c mbedtls.c
+cp ../../../../../../../../../../ext/mbedtls/build/library/libmbedcrypto.so lib_mbedtls.so
+cc -fPIC -shared -O2 -o mbedtls_provider.so -Wl,-rpath,'$ORIGIN/lib' mbedtls.o c_utils.o -L. lib_mbedtls.so -l:lib_timing.so
+cc -I../../../../../../../../../../ipp-crypto/build/.build/RELEASE/include/ -fPIC -I"/usr/lib/jvm/java-21-openjdk/include" -I"/usr/lib/jvm/java-21-openjdk/include/linux" -I. -Wno-deprecated-declarations -O2 -c ippcp.c
+cp ../../../../../../../../../../ipp-crypto/build/.build/RELEASE/lib/libippcp.so lib_ippcp.so
+cc -fPIC -shared -O2 -o ippcp_provider.so -Wl,-rpath,'$ORIGIN/lib' ippcp.o c_utils.o -L. lib_ippcp.so -l:lib_timing.so
+cc -lhogweed -lgmp -fPIC -I"/usr/lib/jvm/java-21-openjdk/include" -I"/usr/lib/jvm/java-21-openjdk/include/linux" -I. -Wno-deprecated-declarations -O2 -c nettle.c
+cc -fPIC -shared -O2 -o nettle_provider.so -Wl,-rpath,'$ORIGIN/lib' nettle.o c_utils.o -L. -lnettle -l:lib_timing.so -lhogweed -lgmp
+cc -I../../../../../../../../../../ext/libressl/include/ -fPIC -I"/usr/lib/jvm/java-21-openjdk/include" -I"/usr/lib/jvm/java-21-openjdk/include/linux" -I. -Wno-deprecated-declarations -O2 -c libressl.c
+cp ../../../../../../../../../../ext/libressl/build/crypto/libcrypto.so lib_libressl.so
+cc -fPIC -shared -O2 -o libressl_provider.so -Wl,-rpath,'$ORIGIN/lib' libressl.o c_utils.o -L. lib_libressl.so -l:lib_timing.so
```
-BoringSSL, LibreSSL and ipp-crypto are included as git submodules. Make sure you run: `git submodule update --init --recursive`
-after checking out the ECTester repository to initialize them. To build BoringSSL do:
-```
+BoringSSL, LibreSSL, ipp-crypto, mbedTLS and partially wolfCrypt are included as git submodules.
+Make sure you run: `git submodule update --init --recursive`
+after checking out the ECTester repository to initialize them.
+
+To build BoringSSL do:
+```shell
cd ext/boringssl
-mkdir build
+cmake -GNinja -Bbuild -DBUILD_SHARED_LIBS=1
cd build
-cmake -GNinja -DBUILD_SHARED_LIBS=1 ..
ninja
```
To build LibreSSL do:
-```
+```shell
cd ext/libressl
./autogen.sh
-mkdir build
+cmake -GNinja -Bbuild -DBUILD_SHARED_LIBS=1
cd build
-cmake -GNinja -DBUILD_SHARED_LIBS=1 ..
ninja
```
To build ipp-crypto do:
(Make sure you have the necessary [build requirements](https://github.com/intel/ipp-crypto/blob/develop/BUILD.md))
-```
+```shell
cd ext/ipp-crypto
CC=clang CXX=clang++ cmake CMakeLists.txt -GNinja -Bbuild -DARCH=intel64 # Does not work with GCC 12+
cd build
ninja
```
+To build mbedTLS do:
+```shell
+cd ext/mbedtls
+python -m venv virt
+. virt/bin/activate
+pip install -r scripts/basic.requirements.txt
+cmake -GNinja -Bbuild -DUSE_SHARED_MBEDTLS_LIBRARY=On
+cd build
+ninja
+```
+
+To build wolfCrypt-JNI do:
+(You need to have wolfSSL installed and ready for development)
+```shell
+cd ext/wolfcrypt-jni
+mkdir junit
+wget -P junit/ https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar
+wget -P junit/ https://repo1.maven.org/maven2/org/hamcrest/hamcrest-all/1.3/hamcrest-all-1.3.jar
+make -f makefile.linux
+env JUNIT_HOME=junit/ ant build-jce-release
+```
+The produced `lib/wolfcrypt-jni.jar` will be automatically included into the standalone JAR when building `standalone:uberJar`.
+However, the produced `lib/libwolfcryptjni.so` native library will not be automatically loaded. You thus need to include it
+on `LD_LIBRARY_PATH`.
+
+Consult the GitHub CI [build script](.github/workflows/build.yml) for an example that runs on Ubuntu 22.04.
+
#### Java
-OpenJDK JRE is required to test ECDH on Windows properly, as Oracle JRE requires the Java Cryptography Providers
+OpenJDK JRE is required to test ECDH on Windows properly, as Oracle JRE requires the Java Cryptography Providers
for certain classes (such as a [KeyAgreement](https://docs.oracle.com/javase/8/docs/api/javax/crypto/KeyAgreement.html))
to be signed by keys that are signed by their JCA Code Signing Authority. ECTester internally uses Java Cryptography Provider
-API to expose and test native libraries. OpenJDK for Windows can be obtained from [ojdkbuild/ojdkbuild](https://github.com/ojdkbuild/ojdkbuild).
+API to expose and test native libraries.
Installing the Java Cryptography Extension Unlimited Strength policy files is necessary to do testing
-with quite a lot of practical key sizes, they are available for download:
+(for Java 8) with quite a lot of practical key sizes, they are available for download:
- - [Java 6](http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html)
- - [Java 7](http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html)
- [Java 8](http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html)
To install, place them in `${java.home}/jre/lib/security/`.
@@ -395,39 +437,39 @@ To install, place them in `${java.home}/jre/lib/security/`.
Snippet below shows how the `list-libs` command for well, listing currently supported libraries, behaves if all supported libraries are present (on Linux).
```
> java -jar ECTesterStandalone.jar list-libs
- - Sun Elliptic Curve provider (EC, ECDSA, ECDH)
- - Version: 1.800000
+ - Sun Elliptic Curve provider
+ - Version: 21.000000
- Supports native timing: []
- KeyPairGenerators: EC
- KeyAgreements: ECDH
- - Signatures: NONEwithECDSA, ECDSA, SHA384withECDSA, SHA224withECDSA, SHA512withECDSA, SHA256withECDSA
- - Curves: X9.62 c2tnb191v1, X9.62 c2tnb191v2, X9.62 c2tnb191v3, X9.62 c2tnb239v1, X9.62 c2tnb239v2, X9.62 c2tnb239v3, X9.62 c2tnb359v1, X9.62 c2tnb431r1, X9.62 prime192v2, X9.62 prime192v3, X9.62 prime239v1, X9.62 prime239v2, X9.62 prime239v3, brainpoolP160r1, brainpoolP192r1, brainpoolP224r1, brainpoolP256r1, brainpoolP320r1, brainpoolP384r1, brainpoolP512r1, secp112r1, secp112r2, secp128r1, secp128r2, secp160k1, secp160r1, secp160r2, secp192k1, secp192r1, secp224k1, secp224r1, secp256k1, secp256r1, secp384r1, secp521r1, sect113r1, sect113r2, sect131r1, sect131r2, sect163k1, sect163r1, sect163r2, sect193r1, sect193r2, sect233k1, sect233r1, sect239k1, sect283k1, sect283r1, sect409k1, sect409r1, sect571k1, sect571r1
+ - Signatures: SHA3-256withECDSA, NONEwithECDSA, ECDSA, SHA3-384withECDSA, SHA384withECDSA, SHA3-512withECDSA, SHA224withECDSA, SHA512withECDSA, SHA3-224withECDSA, SHA256withECDSA
+ - Curves: secp256r1, secp384r1, secp521r1
- - BouncyCastle Security Provider v1.58
- - Version: 1.580000
+ - BouncyCastle Security Provider v1.77
+ - Version: 1.770000
- Supports native timing: []
- - KeyPairGenerators: ECMQV, ECDSA, EC, ECDH, ECDHC
- - KeyAgreements: ECCDHwithSHA384KDF, ECDHwithSHA256KDF, ECDHwithSHA384KDF, ECDHwithSHA1KDF, ECDHwithSHA224KDF, ECDH, ECDHC, ECDHwithSHA512KDF, ECCDHwithSHA1KDF, ECCDHwithSHA512KDF, ECCDHwithSHA224KDF, ECCDHwithSHA256KDF
- - Signatures: SHA1withCVC-ECDSA, NONEwithECDSA, ECGOST3410, SHA256withECNR, ECGOST3410-2012-512, SHA512withECDDSA, GOST3411-2012-512withECGOST3410-2012-512, SHA3-512withECDSA, SHA384withPLAIN-ECDSA, SHA256withECDSA, SHA224withECDDSA, SHA256withECDDSA, ECDSA, SHA3-256withECDSA, SHA256withPLAIN-ECDSA, SHA224withECNR, SHA384withECDDSA, SHA512withECNR, SHA256withCVC-ECDSA, SHA1withECNR, ECDDSA, SHA1withPLAIN-ECDSA, GOST3411-2012-256withECGOST3410-2012-256, SHA384withCVC-ECDSA, SHA512withPLAIN-ECDSA, SHA224withCVC-ECDSA, SHA3-224withECDSA, SHA3-224withECDDSA, SHA224withPLAIN-ECDSA, SHA3-384withECDDSA, SHA384withECDSA, SHA3-384withECDSA, SHA3-512withECDDSA, SM3withSM2, GOST3411withECGOST3410, SHA224withECDSA, SHA512withECDSA, RIPEMD160withECDSA, ECGOST3410-2012-256, SHA512withCVC-ECDSA, RIPEMD160withPLAIN-ECDSA, SHA3-256withECDDSA
- - Curves: B-163, B-233, B-283, B-409, B-571, FRP256v1, K-163, K-233, K-283, K-409, K-571, P-192, P-224, P-256, P-384, P-521, brainpoolp160r1, brainpoolp160t1, brainpoolp192r1, brainpoolp192t1, brainpoolp224r1, brainpoolp224t1, brainpoolp256r1, brainpoolp256t1, brainpoolp320r1, brainpoolp320t1, brainpoolp384r1, brainpoolp384t1, brainpoolp512r1, brainpoolp512t1, c2pnb163v1, c2pnb163v2, c2pnb163v3, c2pnb176w1, c2pnb208w1, c2pnb272w1, c2pnb304w1, c2pnb368w1, c2tnb191v1, c2tnb191v2, c2tnb191v3, c2tnb239v1, c2tnb239v2, c2tnb239v3, c2tnb359v1, c2tnb431r1, prime192v1, prime192v2, prime192v3, prime239v1, prime239v2, prime239v3, prime256v1, secp112r1, secp112r2, secp128r1, secp128r2, secp160k1, secp160r1, secp160r2, secp192k1, secp192r1, secp224k1, secp224r1, secp256k1, secp256r1, secp384r1, secp521r1, sect113r1, sect113r2, sect131r1, sect131r2, sect163k1, sect163r1, sect163r2, sect193r1, sect193r2, sect233k1, sect233r1, sect239k1, sect283k1, sect283r1, sect409k1, sect409r1, sect571k1, sect571r1, sm2p256v1, wapip192v1
+ - KeyPairGenerators: ECDSA, ECMQV, EC, ECDH, ECDHC
+ - KeyAgreements: ECCDHwithSHA384KDF, ECDHwithSHA384KDF, ECDHwithSHA256KDF, ECDHwithSHA1KDF, ECDHwithSHA224KDF, ECDH, ECDHC, ECDHwithSHA512KDF, ECCDHwithSHA1KDF, ECCDHwithSHA512KDF, ECCDHwithSHA224KDF, ECCDHwithSHA256KDF
+ - Signatures: SHA1withCVC-ECDSA, NONEwithECDSA, ECGOST3410, SHA256withECNR, ECGOST3410-2012-512, SHA512withECDDSA, GOST3411-2012-512withECGOST3410-2012-512, SHA3-512withECDSA, SHA384withPLAIN-ECDSA, SHA256withECDSA, SHA256withECDDSA, SHA224withECDDSA, SHA3-256withECDSA, ECDSA, SHA256withPLAIN-ECDSA, SHA224withECNR, SHA384withECDDSA, SHA512withECNR, SHA256withCVC-ECDSA, SHA1withECNR, ECDDSA, SHA1withPLAIN-ECDSA, GOST3411-2012-256withECGOST3410-2012-256, SHA512withPLAIN-ECDSA, SHA384withCVC-ECDSA, SHA224withCVC-ECDSA, SHA3-224withECDSA, SHA3-224withECDDSA, SHA224withPLAIN-ECDSA, SHA3-384withECDDSA, SHA384withECDSA, SHA3-384withECDSA, SHA3-512withECDDSA, SM3withSM2, GOST3411withECGOST3410, ECGOST3410-2012-256, SHA224withECDSA, SHA512withECDSA, RIPEMD160withECDSA, SHA512withCVC-ECDSA, RIPEMD160withPLAIN-ECDSA, SHA3-256withECDDSA
+ - Curves: B-163, B-233, B-283, B-409, B-571, FRP256v1, GostR3410-2001-CryptoPro-A, GostR3410-2001-CryptoPro-B, GostR3410-2001-CryptoPro-C, GostR3410-2001-CryptoPro-XchA, GostR3410-2001-CryptoPro-XchB, K-163, K-233, K-283, K-409, K-571, P-192, P-224, P-256, P-384, P-521, Tc26-Gost-3410-12-256-paramSetA, Tc26-Gost-3410-12-512-paramSetA, Tc26-Gost-3410-12-512-paramSetB, Tc26-Gost-3410-12-512-paramSetC, brainpoolP160r1, brainpoolP160t1, brainpoolP192r1, brainpoolP192t1, brainpoolP224r1, brainpoolP224t1, brainpoolP256r1, brainpoolP256t1, brainpoolP320r1, brainpoolP320t1, brainpoolP384r1, brainpoolP384t1, brainpoolP512r1, brainpoolP512t1, c2pnb163v1, c2pnb163v2, c2pnb163v3, c2pnb176w1, c2pnb208w1, c2pnb272w1, c2pnb304w1, c2pnb368w1, c2tnb191v1, c2tnb191v2, c2tnb191v3, c2tnb239v1, c2tnb239v2, c2tnb239v3, c2tnb359v1, c2tnb431r1, prime192v1, prime192v2, prime192v3, prime239v1, prime239v2, prime239v3, prime256v1, secp112r1, secp112r2, secp128r1, secp128r2, secp160k1, secp160r1, secp160r2, secp192k1, secp192r1, secp224k1, secp224r1, secp256k1, secp256r1, secp384r1, secp521r1, sect113r1, sect113r2, sect131r1, sect131r2, sect163k1, sect163r1, sect163r2, sect193r1, sect193r2, sect233k1, sect233r1, sect239k1, sect283k1, sect283r1, sect409k1, sect409r1, sect571k1, sect571r1, sm2p256v1, wapi192v1, wapip192v1
- - libtomcrypt 1.18.1
- - Version: 1.180000
+ - libtomcrypt 1.18.2
+ - Version: 1.000000
- Supports native timing: [cputime-processor, cputime-thread, monotonic, monotonic-raw, rdtsc]
- KeyPairGenerators: EC
- KeyAgreements: ECDH
- Signatures: NONEwithECDSA
- Curves: ECC-192, ECC-224, ECC-256, ECC-384, ECC-521, SECP112R1, SECP128R1, SECP160R1
- - Botan 2.11.0 (release, dated 20190701, revision git:16a726c3ad10316bd8d37b6118a5cc52894e8e8f, distribution unspecified)
- - Version: 2.110000
+ - Botan 2.19.3 (release, dated 20221116, revision git:15dc32f12d05e99a267f0fc47d88b678b71b8b05, distribution unspecified)
+ - Version: 2.000000
- Supports native timing: [cputime-processor, cputime-thread, monotonic, monotonic-raw, rdtsc]
- - KeyPairGenerators: ECGDSA, ECDSA, ECKCDSA, ECDH
- - KeyAgreements: ECDHwithSHA256KDF, ECDHwithSHA384KDF, ECDHwithSHA1KDF, ECDHwithSHA224KDF, ECDH, ECDHwithSHA512KDF
+ - KeyPairGenerators: ECGDSA, ECKCDSA, ECDSA, ECDH
+ - KeyAgreements: ECDHwithSHA384KDF, ECDHwithSHA256KDF, ECDHwithSHA1KDF, ECDHwithSHA224KDF, ECDH, ECDHwithSHA512KDF
- Signatures: NONEwithECDSA, NONEwithECKCDSA, SHA256withECKCDSA, SHA512withECGDSA, SHA256withECDSA, NONEwithECGDSA, ECKCDSA, ECDSA, SHA224withECKCDSA, SHA384withECKCDSA, SHA224withECGDSA, SHA384withECDSA, ECGDSA, SHA384withECGDSA, SHA224withECDSA, SHA512withECDSA, SHA512withECKCDSA
- - Curves: brainpool160r1, brainpool192r1, brainpool224r1, brainpool256r1, brainpool320r1, brainpool384r1, brainpool512r1, frp256v1, gost_256A, secp160k1, secp160r1, secp160r2, secp192k1, secp192r1, secp224k1, secp224r1, secp256k1, secp256r1, secp384r1, secp521r1, sm2p256v1, x962_p192v2, x962_p192v3, x962_p239v1, x962_p239v2, x962_p239v3
+ - Curves: brainpool160r1, brainpool192r1, brainpool224r1, brainpool256r1, brainpool320r1, brainpool384r1, brainpool512r1, frp256v1, gost_256A, gost_512A, secp160k1, secp160r1, secp160r2, secp192k1, secp192r1, secp224k1, secp224r1, secp256k1, secp256r1, secp384r1, secp521r1, sm2p256v1, x962_p192v2, x962_p192v3, x962_p239v1, x962_p239v2, x962_p239v3
- - Crypto++ 8.3.0
+ - Crypto++ 8.9.0
- Version: 8.000000
- Supports native timing: [cputime-processor, cputime-thread, monotonic, monotonic-raw, rdtsc]
- KeyPairGenerators: ECDSA, ECDH
@@ -435,65 +477,72 @@ Snippet below shows how the `list-libs` command for well, listing currently supp
- Signatures: ECDSA, SHA384withECDSA, SHA224withECDSA, SHA512withECDSA, SHA256withECDSA
- Curves: 1.2.156.10197.1.301, 1.2.156.10197.1.301.3.1, 1.2.840.10045.3.1.1, 1.2.840.10045.3.1.7, 1.3.132.0.1, 1.3.132.0.10, 1.3.132.0.15, 1.3.132.0.16, 1.3.132.0.17, 1.3.132.0.2, 1.3.132.0.22, 1.3.132.0.23, 1.3.132.0.24, 1.3.132.0.25, 1.3.132.0.26, 1.3.132.0.27, 1.3.132.0.28, 1.3.132.0.29, 1.3.132.0.3, 1.3.132.0.30, 1.3.132.0.31, 1.3.132.0.32, 1.3.132.0.33, 1.3.132.0.34, 1.3.132.0.35, 1.3.132.0.36, 1.3.132.0.37, 1.3.132.0.38, 1.3.132.0.39, 1.3.132.0.4, 1.3.132.0.5, 1.3.132.0.6, 1.3.132.0.7, 1.3.132.0.8, 1.3.132.0.9, 1.3.36.3.3.2.8.1.1.1, 1.3.36.3.3.2.8.1.1.11, 1.3.36.3.3.2.8.1.1.13, 1.3.36.3.3.2.8.1.1.3, 1.3.36.3.3.2.8.1.1.5, 1.3.36.3.3.2.8.1.1.7, 1.3.36.3.3.2.8.1.1.9
- - OpenSSL 1.1.1c 28 May 2019
- - Version: 1.110000
+ - OpenSSL 3.2.1 30 Jan 2024
+ - Version: 3.200000
- Supports native timing: [cputime-processor, cputime-thread, monotonic, monotonic-raw, rdtsc]
- KeyPairGenerators: EC
- KeyAgreements: ECDH
- Signatures: NONEwithECDSA
- Curves: Oakley-EC2N-3, Oakley-EC2N-4, SM2, brainpoolP160r1, brainpoolP160t1, brainpoolP192r1, brainpoolP192t1, brainpoolP224r1, brainpoolP224t1, brainpoolP256r1, brainpoolP256t1, brainpoolP320r1, brainpoolP320t1, brainpoolP384r1, brainpoolP384t1, brainpoolP512r1, brainpoolP512t1, c2pnb163v1, c2pnb163v2, c2pnb163v3, c2pnb176v1, c2pnb208w1, c2pnb272w1, c2pnb304w1, c2pnb368w1, c2tnb191v1, c2tnb191v2, c2tnb191v3, c2tnb239v1, c2tnb239v2, c2tnb239v3, c2tnb359v1, c2tnb431r1, prime192v1, prime192v2, prime192v3, prime239v1, prime239v2, prime239v3, prime256v1, secp112r1, secp112r2, secp128r1, secp128r2, secp160k1, secp160r1, secp160r2, secp192k1, secp224k1, secp224r1, secp256k1, secp384r1, secp521r1, sect113r1, sect113r2, sect131r1, sect131r2, sect163k1, sect163r1, sect163r2, sect193r1, sect193r2, sect233k1, sect233r1, sect239k1, sect283k1, sect283r1, sect409k1, sect409r1, sect571k1, sect571r1, wap-wsg-idm-ecid-wtls1, wap-wsg-idm-ecid-wtls10, wap-wsg-idm-ecid-wtls11, wap-wsg-idm-ecid-wtls12, wap-wsg-idm-ecid-wtls3, wap-wsg-idm-ecid-wtls4, wap-wsg-idm-ecid-wtls5, wap-wsg-idm-ecid-wtls6, wap-wsg-idm-ecid-wtls7, wap-wsg-idm-ecid-wtls8, wap-wsg-idm-ecid-wtls9
- - OpenSSL 1.1.0 (compatible; BoringSSL)
- - Version: 1.100000
+ - OpenSSL 1.1.1 (compatible; BoringSSL)
+ - Version: 1.110000
- Supports native timing: [cputime-processor, cputime-thread, monotonic, monotonic-raw, rdtsc]
- KeyPairGenerators: EC
- KeyAgreements: ECDH
- Signatures: NONEwithECDSA
- Curves: prime256v1, secp224r1, secp384r1, secp521r1
- - libgcrypt 1.8.4
- - Version: 1.800000
+ - libgcrypt 1.10.3-unknown
+ - Version: 1.000000
- Supports native timing: [cputime-processor, cputime-thread, monotonic, monotonic-raw, rdtsc]
- KeyPairGenerators: EC
- KeyAgreements: ECDH
- Signatures: SHA224withECDDSA, SHA256withECDDSA, NONEwithECDSA, ECDSA, ECDDSA, SHA384withECDSA, SHA512withECDDSA, SHA224withECDSA, SHA512withECDSA, SHA384withECDDSA, SHA256withECDSA
- - Curves: Curve25519, Ed25519, GOST2001-CryptoPro-A, GOST2001-CryptoPro-B, GOST2001-CryptoPro-C, GOST2001-test, GOST2012-tc26-A, GOST2012-tc26-B, GOST2012-test, NIST P-192, NIST P-224, NIST P-256, NIST P-384, NIST P-521, brainpoolP160r1, brainpoolP192r1, brainpoolP224r1, brainpoolP256r1, brainpoolP320r1, brainpoolP384r1, brainpoolP512r1, secp256k1
+ - Curves: Curve25519, Ed25519, Ed448, GOST2001-CryptoPro-A, GOST2001-CryptoPro-B, GOST2001-CryptoPro-C, GOST2001-test, GOST2012-256-A, GOST2012-512-tc26-A, GOST2012-512-tc26-B, GOST2012-512-tc26-C, GOST2012-512-test, NIST P-192, NIST P-224, NIST P-256, NIST P-384, NIST P-521, X448, brainpoolP160r1, brainpoolP192r1, brainpoolP224r1, brainpoolP256r1, brainpoolP320r1, brainpoolP384r1, brainpoolP512r1, secp256k1, sm2p256v1
- wolfCrypt JCE Provider
- - Version: 1.000000
+ - Version: 1.500000
- Supports native timing: []
- - KeyPairGenerators: EC
- KeyAgreements: ECDH
- Signatures: ECDSA, SHA384withECDSA, SHA512withECDSA, SHA256withECDSA
- - mbed TLS 2.16.0
+ - Mbed TLS 3.5.2
- Version: 3.000000
- Supports native timing: [cputime-processor, cputime-thread, monotonic, monotonic-raw, rdtsc]
- KeyPairGenerators: EC
- KeyAgreements: ECDH
- Signatures: NONEwithECDSA
- - Curves: brainpoolP256r1, brainpoolP384r1, brainpoolP512r1, secp192k1, secp192r1, secp224k1, secp224r1, secp256k1, secp256r1, secp384r1, secp521r1
+ - Curves: brainpoolP256r1, brainpoolP384r1, brainpoolP512r1, secp192k1, secp192r1, secp224k1, secp224r1, secp256k1, secp256r1, secp384r1, secp521r1, x25519, x448
- - 2020.0.0 (-)
- - Version: 2020.000000
+ - 2021.7.0 (11.5 ) (-)
+ - Version: 2021.700000
- Supports native timing: [cputime-processor, cputime-thread, monotonic, monotonic-raw, rdtsc]
- KeyPairGenerators: EC
- KeyAgreements: ECDH
- Signatures: NONEwithECDSA
- Curves: secp112r1, secp112r2, secp128r1, secp128r2, secp160r1, secp160r2, secp192r1, secp224r1, secp256r1, secp384r1, secp521r1
- - MatrixSSL
- - Version: 4.100000
+ - Nettle
+ - Version: 3.900000
+ - Supports native timing: [cputime-processor, cputime-thread, monotonic, monotonic-raw, rdtsc]
+ - KeyPairGenerators: EC
+ - KeyAgreements: ECDH
+ - Signatures: NONEwithECDSA
+ - Curves: secp192r1, secp224r1, secp256r1, secp384r1, secp521r1
+
+ - LibreSSL 3.9.0
+ - Version: 3.900000
- Supports native timing: [cputime-processor, cputime-thread, monotonic, monotonic-raw, rdtsc]
- KeyPairGenerators: EC
- KeyAgreements: ECDH
- Signatures: NONEwithECDSA
- - Curves: brainpoolP224r1, brainpoolP256r1, brainpoolP384r1, brainpoolP512r1, secp192r1, secp224r1, secp256r1, secp384r1, secp521r1
+ - Curves: FRP256v1, brainpoolP160r1, brainpoolP160t1, brainpoolP192r1, brainpoolP192t1, brainpoolP224r1, brainpoolP224t1, brainpoolP256r1, brainpoolP256t1, brainpoolP320r1, brainpoolP320t1, brainpoolP384r1, brainpoolP384t1, brainpoolP512r1, brainpoolP512t1, prime192v1, prime192v2, prime192v3, prime239v1, prime239v2, prime239v3, prime256v1, secp112r1, secp112r2, secp128r1, secp128r2, secp160k1, secp160r1, secp160r2, secp192k1, secp224k1, secp224r1, secp256k1, secp384r1, secp521r1, wap-wsg-idm-ecid-wtls12, wap-wsg-idm-ecid-wtls6, wap-wsg-idm-ecid-wtls7, wap-wsg-idm-ecid-wtls8, wap-wsg-idm-ecid-wtls9
```
Snippet below demonstrates generation of 1000 (`-n`) keys on the named curve `secp256r1` (`-nc`) using the BouncyCastle library.
```
-> java -jar ECTesterStandalone.jar gen -n 1000 -nc secg/secp256r1 Bouncy
+> java -jar ECTesterStandalone.jar generate -n 1000 -nc secg/secp256r1 Bouncy
index;time[nano];pubW;privS
0;18459241;04886c2d253490d6a80906628aea65dc6763fe53690241d54de1f479f44d120e6349528644b3736eda0a8a0326563c3a846a415e1ff029a22404718c91770349d4;532e9b01e439df0ae63f7ed0a9c5f57f91175fd21d80a1d048c93fda7b704522
1;1672835;049de329ce6d7d031a693143890ea7a277c0cb400b534b3a075614a1ec7d0b1e1680bd6791bb5027007ea286aa86a3af451e6772440be0adb3b19d249a47f8581e;00d69151b165880f93d18b4870b613e012ff00883192cd405d1fccd23e9001f9cc
@@ -533,7 +582,7 @@ index;time[nano];pubW;privS;secret[NONE]
...
```
-It is recommended to disably [CPU frequency scaling](https://wiki.archlinux.org/index.php/CPU_frequency_scaling) of your processor before performing collection of timing data, as it adds significant noise to the data as it kicks in. Also, running the collection on very high priority and locked to a single core (`taskset -c 0`) helps as well.
+It is recommended to disable [CPU frequency scaling](https://wiki.archlinux.org/index.php/CPU_frequency_scaling) of your processor before performing collection of timing data, as it adds significant noise to the data as it kicks in. Also, running the collection on very high priority and locked to a single core (`taskset -c 0`) helps as well.
## Analysis
diff --git a/applet/GPPcScConnectionPlugin.dll b/applet/GPPcScConnectionPlugin.dll
deleted file mode 100644
index 3b27f6b..0000000
--- a/applet/GPPcScConnectionPlugin.dll
+++ /dev/null
Binary files differ
diff --git a/applet/GPShell.exe b/applet/GPShell.exe
deleted file mode 100644
index 091eece..0000000
--- a/applet/GPShell.exe
+++ /dev/null
Binary files differ
diff --git a/applet/GlobalPlatform.dll b/applet/GlobalPlatform.dll
deleted file mode 100644
index 6dca172..0000000
--- a/applet/GlobalPlatform.dll
+++ /dev/null
Binary files differ
diff --git a/applet/build.gradle.kts b/applet/build.gradle.kts
new file mode 100644
index 0000000..61071c2
--- /dev/null
+++ b/applet/build.gradle.kts
@@ -0,0 +1,164 @@
+// Buildscript configuration for the javacard-gradle plugin.
+// Do not modify this particular block. Dependencies for the project are lower.
+buildscript {
+ repositories {
+ mavenCentral()
+ maven("https://javacard.pro/maven")
+ maven("https://deadcode.me/mvn")
+ }
+ dependencies {
+ classpath("com.klinec:gradle-javacard:1.8.0")
+ }
+}
+
+plugins {
+ id("com.klinec.gradle.javacard") version "1.8.0"
+ id("java")
+}
+
+// Common settings, definitions
+val rootPath = rootDir.absolutePath
+val libs = "$rootPath/ext/libs"
+val libsSdk = "$rootPath/ext/sdks"
+
+// Repositories for your project
+repositories {
+ mavenCentral()
+ // mavenLocal() // for local maven repository if needed
+
+ // Repository with JCardSim, Globalplatform, etc, ...
+ maven("https://javacard.pro/maven")
+ maven("https://deadcode.me/mvn")
+
+ // Local lib repository
+ flatDir {
+ dirs(libs)
+ }
+}
+
+// Dependencies for your project
+dependencies {
+ jcardsim("com.klinec:jcardsim:3.0.5.11")
+ implementation("com.klinec:jcardsim:3.0.5.11")
+
+ testImplementation(platform("org.junit:junit-bom:5.10.2"))
+ testImplementation("org.junit.jupiter:junit-jupiter")
+ testRuntimeOnly("org.junit.platform:junit-platform-launcher")
+
+ // Include plugin as it has bundled GP & other tools.
+ // Alternative: include GP manually, but the included
+ // version has to be compatible with the plugin.
+ runtimeOnly("com.klinec:gradle-javacard:1.8.0") {
+ // Exclude old BouncyCastle (we have newer).
+ exclude(group = "org.bouncycastle", module="bcpkix-jdk15on")
+ }
+ runtimeOnly("org.bouncycastle:bcpkix-jdk18on:1.77")
+}
+
+java {
+ sourceCompatibility = if (JavaVersion.current() == JavaVersion.VERSION_1_8) JavaVersion.VERSION_1_8 else JavaVersion.VERSION_11
+}
+
+tasks.named<Test>("test") {
+ useJUnitPlatform()
+}
+
+// JavaCard SDKs and libraries
+val sdks = mapOf(
+ "JC211" to Triple("$libsSdk/jc211_kit", JavaVersion.VERSION_1_8, JavaVersion.VERSION_1_8),
+ "JC212" to Triple("$libsSdk/jc212_kit", JavaVersion.VERSION_1_8, JavaVersion.VERSION_1_8),
+ "JC221" to Triple("$libsSdk/jc221_kit", JavaVersion.VERSION_1_8, JavaVersion.VERSION_1_8),
+ "JC222" to Triple("$libsSdk/jc222_kit", JavaVersion.VERSION_1_8, JavaVersion.VERSION_1_8),
+ "JC303" to Triple("$libsSdk/jc303_kit", JavaVersion.VERSION_1_8, JavaVersion.VERSION_11),
+ "JC304" to Triple("$libsSdk/jc304_kit", JavaVersion.VERSION_1_8, JavaVersion.VERSION_11),
+ "JC305u2" to Triple("$libsSdk/jc305u2_kit", JavaVersion.VERSION_1_8, JavaVersion.VERSION_11),
+ "JC305u3" to Triple("$libsSdk/jc305u3_kit", JavaVersion.VERSION_1_8, JavaVersion.VERSION_11),
+ "JC305u4" to Triple("$libsSdk/jc305u4_kit", JavaVersion.VERSION_1_8, JavaVersion.VERSION_11),
+ "JC310b43" to Triple("$libsSdk/jc310b43_kit", JavaVersion.VERSION_1_8, JavaVersion.VERSION_17),
+ "JC310r20210706" to Triple("$libsSdk/jc310r20210706_kit", JavaVersion.VERSION_1_8, JavaVersion.VERSION_17),
+ "JC320v24" to Triple("$libsSdk/jc320v24.0_kit", JavaVersion.VERSION_1_8, JavaVersion.VERSION_17),
+)
+
+var pkgAID = "4543546573746572"
+var version = "0.3.3"
+
+javacard {
+ config {
+ // Using custom repo with jcardsim
+ debugGpPro(true)
+ addImplicitJcardSim(false)
+ addImplicitJcardSimJunit(false)
+
+ if (JavaVersion.current() == JavaVersion.VERSION_1_8) {
+ /*
+ // Exclude for the time being, as the "excludes" param is not properly implemented upstream.
+ // https://github.com/ph4r05/javacard-gradle-plugin/pull/11
+ cap {
+ jckit(sdks["JC221"]!!.first)
+ packageName("cz.crcs.ectester.applet")
+ version(version)
+ aid(pkgAID)
+ output("applet221.cap")
+
+ //excludes("ECTesterAppletExtended.*")
+
+ applet {
+ className("cz.crcs.ectester.applet.ECTesterApplet")
+ aid("454354657374657230333320323231")
+ }
+ }
+ */
+
+ cap {
+ jckit(sdks["JC222"]!!.first)
+ packageName("cz.crcs.ectester.applet")
+ version(version)
+ aid(pkgAID)
+ output("applet222.cap")
+
+ //excludes("ECTesterApplet.*")
+
+ applet {
+ className("cz.crcs.ectester.applet.ECTesterAppletExtended")
+ aid("454354657374657230333320323232")
+ }
+ }
+ }
+
+ if (JavaVersion.current() >= JavaVersion.VERSION_1_8 && JavaVersion.current() <= JavaVersion.VERSION_11) {
+ cap {
+ jckit(sdks["JC305u4"]!!.first)
+ packageName("cz.crcs.ectester.applet")
+ version(version)
+ aid(pkgAID)
+ output("applet305.cap")
+
+ //excludes("ECTesterApplet.*")
+
+ applet {
+ className("cz.crcs.ectester.applet.ECTesterAppletExtended")
+ aid("454354657374657230333320323035")
+ }
+ }
+ }
+
+ if (JavaVersion.current() > JavaVersion.VERSION_11) {
+ // This really only works for Java <= 17, but if the check is added, then configuration
+ // of the project will not work for Java > 17.
+ cap {
+ jckit(sdks["JC320v24"]!!.first)
+ packageName("cz.crcs.ectester.applet")
+ version(version)
+ aid(pkgAID)
+ output("applet320.cap")
+
+ //excludes("ECTesterApplet.*")
+
+ applet {
+ className("cz.crcs.ectester.applet.ECTesterAppletExtended")
+ aid("454354657374657230333320323230")
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/applet/gp.exe b/applet/gp.exe
deleted file mode 100644
index 6478bf2..0000000
--- a/applet/gp.exe
+++ /dev/null
Binary files differ
diff --git a/applet/gp.jar b/applet/gp.jar
deleted file mode 100644
index 774d81a..0000000
--- a/applet/gp.jar
+++ /dev/null
Binary files differ
diff --git a/applet/gppro_upload.bat b/applet/gppro_upload.bat
deleted file mode 100644
index 50a41d7..0000000
--- a/applet/gppro_upload.bat
+++ /dev/null
@@ -1,14 +0,0 @@
-if "%1" == "" {
- set err=yes
-}
-if "%2" == "" {
- set err=yes
-}
-if "%err" == "yes" {
- echo "gppro_upload.bat <AID> <CAP file>"
- exit
-}
-gp.exe -deletedeps -verbose -delete %1
-gp.exe -install %2 -verbose -d
-
-
diff --git a/applet/gppro_upload.sh b/applet/gppro_upload.sh
deleted file mode 100755
index 055d51d..0000000
--- a/applet/gppro_upload.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env bash
-if [ "$#" -ne 2 ]; then
- echo "gppro_upload.sh <AID> <CAP file>" >&2
- exit 1
-fi
-
-java -jar gp.jar -deletedeps -verbose -delete $1
-java -jar gp.jar -install $2 -verbose -d
-
-
diff --git a/applet/gppro_upload_emv.bat b/applet/gppro_upload_emv.bat
deleted file mode 100644
index 4094623..0000000
--- a/applet/gppro_upload_emv.bat
+++ /dev/null
@@ -1,15 +0,0 @@
-if "%1" == "" {
- set err=yes
-}
-if "%2" == "" {
- set err=yes
-}
-if "%err" == "yes" {
- echo "gppro_upload_emv.bat <AID> <CAP file>"
- exit
-}
-
-gp.exe -deletedeps -verbose -emv -delete %1
-gp.exe -install %2 -verbose -emv -d
-
-
diff --git a/applet/gppro_upload_emv.sh b/applet/gppro_upload_emv.sh
deleted file mode 100755
index 9e1a62e..0000000
--- a/applet/gppro_upload_emv.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env bash
-if [ "$#" -ne 2 ]; then
- echo "gppro_upload.sh <AID> <CAP file>" >&2
- exit 1
-fi
-
-java -jar gp.jar --deletedeps --verbose -emv --delete $1
-java -jar gp.jar --install $2 --verbose --emv -d
-
-
diff --git a/applet/libeay32.dll b/applet/libeay32.dll
deleted file mode 100644
index b59a6b4..0000000
--- a/applet/libeay32.dll
+++ /dev/null
Binary files differ
diff --git a/applet/openkms-gp.jar b/applet/openkms-gp.jar
deleted file mode 100644
index 9cd5de5..0000000
--- a/applet/openkms-gp.jar
+++ /dev/null
Binary files differ
diff --git a/src/cz/crcs/ectester/applet/AppletBase.java b/applet/src/main/java/cz/crcs/ectester/applet/AppletBase.java
index 9a8a479..411e5a1 100644
--- a/src/cz/crcs/ectester/applet/AppletBase.java
+++ b/applet/src/main/java/cz/crcs/ectester/applet/AppletBase.java
@@ -11,70 +11,6 @@ import javacard.security.*;
* @author Jan Jancar johny@neuromancer.sk
*/
public abstract class AppletBase extends Applet {
-
- // MAIN INSTRUCTION CLASS
- public static final byte CLA_ECTESTERAPPLET = (byte) 0xB0;
-
- // INSTRUCTIONS
- public static final byte INS_ALLOCATE = (byte) 0x5a;
- public static final byte INS_CLEAR = (byte) 0x5b;
- public static final byte INS_SET = (byte) 0x5c;
- public static final byte INS_TRANSFORM = (byte) 0x5d;
- public static final byte INS_GENERATE = (byte) 0x5e;
- public static final byte INS_EXPORT = (byte) 0x5f;
- public static final byte INS_ECDH = (byte) 0x70;
- public static final byte INS_ECDH_DIRECT = (byte) 0x71;
- public static final byte INS_ECDSA = (byte) 0x72;
- public static final byte INS_ECDSA_SIGN = (byte) 0x73;
- public static final byte INS_ECDSA_VERIFY = (byte) 0x74;
- public static final byte INS_CLEANUP = (byte) 0x75;
- public static final byte INS_ALLOCATE_KA = (byte) 0x76;
- public static final byte INS_ALLOCATE_SIG = (byte) 0x77;
- public static final byte INS_GET_INFO = (byte) 0x78;
- public static final byte INS_SET_DRY_RUN_MODE = (byte) 0x79;
- public static final byte INS_BUFFER = (byte) 0x7a;
- public static final byte INS_PERFORM = (byte) 0x7b;
-
- // PARAMETERS for P1 and P2
- public static final byte KEYPAIR_LOCAL = (byte) 0x01;
- public static final byte KEYPAIR_REMOTE = (byte) 0x02;
- public static final byte KEYPAIR_BOTH = KEYPAIR_LOCAL | KEYPAIR_REMOTE;
- public static final byte BUILD_KEYPAIR = (byte) 0x01;
- public static final byte BUILD_KEYBUILDER = (byte) 0x02;
- public static final byte EXPORT_TRUE = (byte) 0xff;
- public static final byte EXPORT_FALSE = (byte) 0x00;
- public static final byte MODE_NORMAL = (byte) 0xaa;
- public static final byte MODE_DRY_RUN = (byte) 0xbb;
-
- // STATUS WORDS
- public static final short SW_SIG_VERIFY_FAIL = (short) 0x0ee1;
- public static final short SW_DH_DHC_MISMATCH = (short) 0x0ee2;
- public static final short SW_KEYPAIR_NULL = (short) 0x0ee3;
- public static final short SW_KA_NULL = (short) 0x0ee4;
- public static final short SW_SIGNATURE_NULL = (short) 0x0ee5;
- public static final short SW_OBJECT_NULL = (short) 0x0ee6;
- public static final short SW_CANNOT_FIT = (short) 0x0ee7;
- public static final short SW_Exception = (short) 0xff01;
- public static final short SW_ArrayIndexOutOfBoundsException = (short) 0xff02;
- public static final short SW_ArithmeticException = (short) 0xff03;
- public static final short SW_ArrayStoreException = (short) 0xff04;
- public static final short SW_NullPointerException = (short) 0xff05;
- public static final short SW_NegativeArraySizeException = (short) 0xff06;
- public static final short SW_CryptoException_prefix = (short) 0xf100;
- public static final short SW_SystemException_prefix = (short) 0xf200;
- public static final short SW_PINException_prefix = (short) 0xf300;
- public static final short SW_TransactionException_prefix = (short) 0xf400;
- public static final short SW_CardRuntimeException_prefix = (short) 0xf500;
-
- //
- public static final short BASE_221 = (short) 0x0221;
- public static final short BASE_222 = (short) 0x0222;
-
- //
- public static final short CDATA_BASIC = (short) 5;
- public static final short CDATA_EXTENDED = (short) 7;
-
- //
public static final byte[] VERSION = {'v', '0', '.', '3', '.', '3'};
public static final short ARRAY_LENGTH = 0x100;
@@ -171,12 +107,12 @@ public abstract class AppletBase extends Applet {
return;
}
- if (cla == CLA_ECTESTERAPPLET) {
+ if (cla == CardConsts.CLA_ECTESTERAPPLET) {
try {
- if (ins == INS_BUFFER) {
+ if (ins == CardConsts.INS_BUFFER) {
short read = readAPDU(apdu, true);
if (read == -1) {
- ISOException.throwIt(SW_CANNOT_FIT);
+ ISOException.throwIt(CardConsts.SW_CANNOT_FIT);
return;
}
apduEnd += read;
@@ -184,12 +120,12 @@ public abstract class AppletBase extends Applet {
return;
} else {
apduEnd = 0;
- if (ins == INS_PERFORM) {
+ if (ins == CardConsts.INS_PERFORM) {
ins = apduArray[ISO7816.OFFSET_INS];
apdu.setIncomingAndReceive();
} else {
if (readAPDU(apdu, false) == -1) {
- ISOException.throwIt(SW_CANNOT_FIT);
+ ISOException.throwIt(CardConsts.SW_CANNOT_FIT);
return;
}
}
@@ -197,52 +133,52 @@ public abstract class AppletBase extends Applet {
short length = 0;
switch (ins) {
- case INS_ALLOCATE_KA:
+ case CardConsts.INS_ALLOCATE_KA:
length = insAllocateKA(apdu);
break;
- case INS_ALLOCATE_SIG:
+ case CardConsts.INS_ALLOCATE_SIG:
length = insAllocateSig(apdu);
break;
- case INS_ALLOCATE:
+ case CardConsts.INS_ALLOCATE:
length = insAllocate(apdu);
break;
- case INS_CLEAR:
+ case CardConsts.INS_CLEAR:
length = insClear(apdu);
break;
- case INS_SET:
+ case CardConsts.INS_SET:
length = insSet(apdu);
break;
- case INS_TRANSFORM:
+ case CardConsts.INS_TRANSFORM:
length = insTransform(apdu);
break;
- case INS_GENERATE:
+ case CardConsts.INS_GENERATE:
length = insGenerate(apdu);
break;
- case INS_EXPORT:
+ case CardConsts.INS_EXPORT:
length = insExport(apdu);
break;
- case INS_ECDH:
+ case CardConsts.INS_ECDH:
length = insECDH(apdu);
break;
- case INS_ECDH_DIRECT:
+ case CardConsts.INS_ECDH_DIRECT:
length = insECDH_direct(apdu);
break;
- case INS_ECDSA:
+ case CardConsts.INS_ECDSA:
length = insECDSA(apdu);
break;
- case INS_ECDSA_SIGN:
+ case CardConsts.INS_ECDSA_SIGN:
length = insECDSA_sign(apdu);
break;
- case INS_ECDSA_VERIFY:
+ case CardConsts.INS_ECDSA_VERIFY:
length = insECDSA_verify(apdu);
break;
- case INS_CLEANUP:
+ case CardConsts.INS_CLEANUP:
length = insCleanup(apdu);
break;
- case INS_GET_INFO:
+ case CardConsts.INS_GET_INFO:
length = insGetInfo(apdu);
break;
- case INS_SET_DRY_RUN_MODE:
+ case CardConsts.INS_SET_DRY_RUN_MODE:
length = insSetDryRunMode(apdu);
break;
default:
@@ -255,27 +191,27 @@ public abstract class AppletBase extends Applet {
} catch (ISOException e) {
throw e; // Our exception from code, just re-emit
} catch (ArrayIndexOutOfBoundsException e) {
- ISOException.throwIt(SW_ArrayIndexOutOfBoundsException);
+ ISOException.throwIt(CardConsts.SW_ArrayIndexOutOfBoundsException);
} catch (ArithmeticException e) {
- ISOException.throwIt(SW_ArithmeticException);
+ ISOException.throwIt(CardConsts.SW_ArithmeticException);
} catch (ArrayStoreException e) {
- ISOException.throwIt(SW_ArrayStoreException);
+ ISOException.throwIt(CardConsts.SW_ArrayStoreException);
} catch (NullPointerException e) {
- ISOException.throwIt(SW_NullPointerException);
+ ISOException.throwIt(CardConsts.SW_NullPointerException);
} catch (NegativeArraySizeException e) {
- ISOException.throwIt(SW_NegativeArraySizeException);
+ ISOException.throwIt(CardConsts.SW_NegativeArraySizeException);
} catch (CryptoException e) {
- ISOException.throwIt((short) (SW_CryptoException_prefix | e.getReason()));
+ ISOException.throwIt((short) (CardConsts.SW_CryptoException_prefix | e.getReason()));
} catch (SystemException e) {
- ISOException.throwIt((short) (SW_SystemException_prefix | e.getReason()));
+ ISOException.throwIt((short) (CardConsts.SW_SystemException_prefix | e.getReason()));
} catch (PINException e) {
- ISOException.throwIt((short) (SW_PINException_prefix | e.getReason()));
+ ISOException.throwIt((short) (CardConsts.SW_PINException_prefix | e.getReason()));
} catch (TransactionException e) {
- ISOException.throwIt((short) (SW_TransactionException_prefix | e.getReason()));
+ ISOException.throwIt((short) (CardConsts.SW_TransactionException_prefix | e.getReason()));
} catch (CardRuntimeException e) {
- ISOException.throwIt((short) (SW_CardRuntimeException_prefix | e.getReason()));
+ ISOException.throwIt((short) (CardConsts.SW_CardRuntimeException_prefix | e.getReason()));
} catch (Exception e) {
- ISOException.throwIt(SW_Exception);
+ ISOException.throwIt(CardConsts.SW_Exception);
}
} else ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
@@ -293,9 +229,9 @@ public abstract class AppletBase extends Applet {
short offset = 0;
if (skipHeader) {
offset = cdataOffset;
- cdata = CDATA_EXTENDED;
+ cdata = CardConsts.CDATA_EXTENDED;
} else {
- cdata = CDATA_BASIC;
+ cdata = CardConsts.CDATA_BASIC;
}
/* How much stuff was really sent in this APDU? */
@@ -380,10 +316,10 @@ public abstract class AppletBase extends Applet {
byte keyPair = apduArray[ISO7816.OFFSET_P1];
short len = 0;
- if ((keyPair & KEYPAIR_LOCAL) != 0) {
+ if ((keyPair & CardConsts.KEYPAIR_LOCAL) != 0) {
len += clear(localKeypair, apdu.getBuffer(), (short) 0);
}
- if ((keyPair & KEYPAIR_REMOTE) != 0) {
+ if ((keyPair & CardConsts.KEYPAIR_REMOTE) != 0) {
len += clear(remoteKeypair, apdu.getBuffer(), len);
}
@@ -411,10 +347,10 @@ public abstract class AppletBase extends Applet {
short len = 0;
- if ((keyPair & KEYPAIR_LOCAL) != 0) {
+ if ((keyPair & CardConsts.KEYPAIR_LOCAL) != 0) {
len += set(localKeypair, curve, params, apduArray, (short) (cdata + 2), apdu.getBuffer(), (short) 0);
}
- if ((keyPair & KEYPAIR_REMOTE) != 0) {
+ if ((keyPair & CardConsts.KEYPAIR_REMOTE) != 0) {
len += set(remoteKeypair, curve, params, apduArray, (short) (cdata + 2), apdu.getBuffer(), len);
}
@@ -438,11 +374,11 @@ public abstract class AppletBase extends Applet {
short transformation = Util.getShort(apduArray, (short) (cdata + 2));
short len = 0;
- if ((keyPair & KEYPAIR_LOCAL) != 0) {
+ if ((keyPair & CardConsts.KEYPAIR_LOCAL) != 0) {
len += transform(localKeypair, key, params, transformation, apdu.getBuffer(), (short) 0);
}
- if ((keyPair & KEYPAIR_REMOTE) != 0) {
+ if ((keyPair & CardConsts.KEYPAIR_REMOTE) != 0) {
len += transform(remoteKeypair, key, params, transformation, apdu.getBuffer(), len);
}
@@ -461,10 +397,10 @@ public abstract class AppletBase extends Applet {
byte keyPair = apduArray[ISO7816.OFFSET_P1];
short len = 0;
- if ((keyPair & KEYPAIR_LOCAL) != 0) {
+ if ((keyPair & CardConsts.KEYPAIR_LOCAL) != 0) {
len += generate(localKeypair, apdu.getBuffer(), (short) 0);
}
- if ((keyPair & KEYPAIR_REMOTE) != 0) {
+ if ((keyPair & CardConsts.KEYPAIR_REMOTE) != 0) {
len += generate(remoteKeypair, apdu.getBuffer(), len);
}
@@ -485,13 +421,13 @@ public abstract class AppletBase extends Applet {
short params = Util.getShort(apduArray, cdata);
short swOffset = 0;
- short len = (short) (keyPair == KEYPAIR_BOTH ? 4 : 2);
+ short len = (short) (keyPair == CardConsts.KEYPAIR_BOTH ? 4 : 2);
- if ((keyPair & KEYPAIR_LOCAL) != 0) {
+ if ((keyPair & CardConsts.KEYPAIR_LOCAL) != 0) {
len += export(localKeypair, key, params, apdu.getBuffer(), swOffset, len);
swOffset += 2;
}
- if ((keyPair & KEYPAIR_REMOTE) != 0) {
+ if ((keyPair & CardConsts.KEYPAIR_REMOTE) != 0) {
len += export(remoteKeypair, key, params, apdu.getBuffer(), swOffset, len);
}
@@ -557,10 +493,10 @@ public abstract class AppletBase extends Applet {
byte sigType = apduArray[cdata];
short len = 0;
- if ((keyPair & KEYPAIR_LOCAL) != 0) {
+ if ((keyPair & CardConsts.KEYPAIR_LOCAL) != 0) {
len += ecdsa(localKeypair, sigType, export, apduArray, (short) (cdata + 1), apdu.getBuffer(), (short) 0);
}
- if ((keyPair & KEYPAIR_REMOTE) != 0) {
+ if ((keyPair & CardConsts.KEYPAIR_REMOTE) != 0) {
len += ecdsa(remoteKeypair, sigType, export, apduArray, (short) (cdata + 1), apdu.getBuffer(), len);
}
@@ -581,10 +517,10 @@ public abstract class AppletBase extends Applet {
byte sigType = apduArray[cdata];
short len = 0;
- if ((keyPair & KEYPAIR_LOCAL) != 0) {
+ if ((keyPair & CardConsts.KEYPAIR_LOCAL) != 0) {
len += ecdsa_sign(localKeypair, sigType, export, apduArray, (short) (cdata + 1), apdu.getBuffer(), (short) 0);
}
- if ((keyPair & KEYPAIR_REMOTE) != 0) {
+ if ((keyPair & CardConsts.KEYPAIR_REMOTE) != 0) {
len += ecdsa_sign(remoteKeypair, sigType, export, apduArray, (short) (cdata + 1), apdu.getBuffer(), len);
}
return len;
@@ -604,10 +540,10 @@ public abstract class AppletBase extends Applet {
byte sigType = apduArray[ISO7816.OFFSET_P2];
short len = 0;
- if ((keyPair & KEYPAIR_LOCAL) != 0) {
+ if ((keyPair & CardConsts.KEYPAIR_LOCAL) != 0) {
len += ecdsa_verify(localKeypair, sigType, apduArray, cdata, apdu.getBuffer(), (short) 0);
}
- if ((keyPair & KEYPAIR_REMOTE) != 0) {
+ if ((keyPair & CardConsts.KEYPAIR_REMOTE) != 0) {
len += ecdsa_verify(remoteKeypair, sigType, apduArray, cdata, apdu.getBuffer(), len);
}
return len;
@@ -649,10 +585,10 @@ public abstract class AppletBase extends Applet {
byte mode = apduArray[ISO7816.OFFSET_P1];
short len = 0;
- if (mode == MODE_NORMAL) {
+ if (mode == CardConsts.MODE_NORMAL) {
len = setDryRunMode(apdubuf, false, (short) 0);
}
- if (mode == MODE_DRY_RUN) {
+ if (mode == CardConsts.MODE_DRY_RUN) {
len = setDryRunMode(apdubuf, true, (short) 0);
}
return len;
@@ -669,26 +605,26 @@ public abstract class AppletBase extends Applet {
*/
private short allocate(byte keyPair, byte build, short keyLength, byte keyClass, byte[] outBuffer, short outOffset) {
short length = 0;
- if ((keyPair & KEYPAIR_LOCAL) != 0) {
- if ((build & BUILD_KEYPAIR) != 0) {
+ if ((keyPair & CardConsts.KEYPAIR_LOCAL) != 0) {
+ if ((build & CardConsts.BUILD_KEYPAIR) != 0) {
localKeypair = keyGenerator.allocatePair(keyClass, keyLength);
- if (keyGenerator.getSW() != ISO7816.SW_NO_ERROR && (build & BUILD_KEYBUILDER) != 0) {
+ if (keyGenerator.getSW() != ISO7816.SW_NO_ERROR && (build & CardConsts.BUILD_KEYBUILDER) != 0) {
localKeypair = keyGenerator.constructPair(keyClass, keyLength);
}
- } else if ((build & BUILD_KEYBUILDER) != 0) {
+ } else if ((build & CardConsts.BUILD_KEYBUILDER) != 0) {
localKeypair = keyGenerator.constructPair(keyClass, keyLength);
}
Util.setShort(outBuffer, outOffset, keyGenerator.getSW());
length += 2;
}
- if ((keyPair & KEYPAIR_REMOTE) != 0) {
- if ((build & BUILD_KEYPAIR) != 0) {
+ if ((keyPair & CardConsts.KEYPAIR_REMOTE) != 0) {
+ if ((build & CardConsts.BUILD_KEYPAIR) != 0) {
remoteKeypair = keyGenerator.allocatePair(keyClass, keyLength);
- if (keyGenerator.getSW() != ISO7816.SW_NO_ERROR && (build & BUILD_KEYBUILDER) != 0) {
+ if (keyGenerator.getSW() != ISO7816.SW_NO_ERROR && (build & CardConsts.BUILD_KEYBUILDER) != 0) {
remoteKeypair = keyGenerator.constructPair(keyClass, keyLength);
}
- } else if ((build & BUILD_KEYBUILDER) != 0) {
+ } else if ((build & CardConsts.BUILD_KEYBUILDER) != 0) {
remoteKeypair = keyGenerator.constructPair(keyClass, keyLength);
}
Util.setShort(outBuffer, (short) (outOffset + length), keyGenerator.getSW());
@@ -811,8 +747,8 @@ public abstract class AppletBase extends Applet {
private short ecdh(byte pubkey, byte privkey, byte export, short transformation, byte type, byte[] outBuffer, short outOffset) {
short length = 0;
- KeyPair pub = ((pubkey & KEYPAIR_LOCAL) != 0) ? localKeypair : remoteKeypair;
- KeyPair priv = ((privkey & KEYPAIR_LOCAL) != 0) ? localKeypair : remoteKeypair;
+ KeyPair pub = ((pubkey & CardConsts.KEYPAIR_LOCAL) != 0) ? localKeypair : remoteKeypair;
+ KeyPair priv = ((privkey & CardConsts.KEYPAIR_LOCAL) != 0) ? localKeypair : remoteKeypair;
short secretLength = 0;
if (keyTester.getKaType() == type) {
@@ -826,7 +762,7 @@ public abstract class AppletBase extends Applet {
Util.setShort(outBuffer, outOffset, keyTester.getSW());
length += 2;
- if ((export == EXPORT_TRUE)) {
+ if ((export == CardConsts.EXPORT_TRUE)) {
Util.setShort(outBuffer, (short) (outOffset + length), secretLength);
length += 2;
Util.arrayCopyNonAtomic(ramArray2, (short) 0, outBuffer, (short) (outOffset + length), secretLength);
@@ -839,7 +775,7 @@ public abstract class AppletBase extends Applet {
private short ecdh_direct(byte privkey, byte export, short transformation, byte type, short keyOffset, short keyLength, byte[] outBuffer, short outOffset) {
short length = 0;
- KeyPair priv = ((privkey & KEYPAIR_LOCAL) != 0) ? localKeypair : remoteKeypair;
+ KeyPair priv = ((privkey & CardConsts.KEYPAIR_LOCAL) != 0) ? localKeypair : remoteKeypair;
short secretLength = 0;
if (keyTester.getKaType() == type) {
@@ -854,7 +790,7 @@ public abstract class AppletBase extends Applet {
Util.setShort(outBuffer, outOffset, keyTester.getSW());
length += 2;
- if ((export == EXPORT_TRUE)) {
+ if ((export == CardConsts.EXPORT_TRUE)) {
Util.setShort(outBuffer, (short) (outOffset + length), secretLength);
length += 2;
Util.arrayCopyNonAtomic(ramArray2, (short) 0, outBuffer, (short) (outOffset + length), secretLength);
@@ -897,7 +833,7 @@ public abstract class AppletBase extends Applet {
Util.setShort(outBuffer, outOffset, keyTester.getSW());
length += 2;
- if (export == EXPORT_TRUE) {
+ if (export == CardConsts.EXPORT_TRUE) {
Util.setShort(outBuffer, (short) (outOffset + length), signatureLength);
length += 2;
@@ -932,7 +868,7 @@ public abstract class AppletBase extends Applet {
Util.setShort(outBuffer, outOffset, keyTester.getSW());
length += 2;
- if (export == EXPORT_TRUE) {
+ if (export == CardConsts.EXPORT_TRUE) {
Util.setShort(outBuffer, (short) (outOffset + length), signatureLength);
length += 2;
diff --git a/src/cz/crcs/ectester/applet/AppletUtil.java b/applet/src/main/java/cz/crcs/ectester/applet/AppletUtil.java
index 9869aa4..c4a6744 100644
--- a/src/cz/crcs/ectester/applet/AppletUtil.java
+++ b/applet/src/main/java/cz/crcs/ectester/applet/AppletUtil.java
@@ -18,18 +18,18 @@ public class AppletUtil {
}
public static short objCheck(Object obj) {
- return nullCheck(obj, AppletBase.SW_OBJECT_NULL);
+ return nullCheck(obj, CardConsts.SW_OBJECT_NULL);
}
public static short keypairCheck(KeyPair keyPair) {
- return nullCheck(keyPair, AppletBase.SW_KEYPAIR_NULL);
+ return nullCheck(keyPair, CardConsts.SW_KEYPAIR_NULL);
}
public static short kaCheck(KeyAgreement keyAgreement) {
- return nullCheck(keyAgreement, AppletBase.SW_KA_NULL);
+ return nullCheck(keyAgreement, CardConsts.SW_KA_NULL);
}
public static short signCheck(Signature signature) {
- return nullCheck(signature, AppletBase.SW_SIGNATURE_NULL);
+ return nullCheck(signature, CardConsts.SW_SIGNATURE_NULL);
}
}
diff --git a/applet/src/main/java/cz/crcs/ectester/applet/CardConsts.java b/applet/src/main/java/cz/crcs/ectester/applet/CardConsts.java
new file mode 100644
index 0000000..abac8e7
--- /dev/null
+++ b/applet/src/main/java/cz/crcs/ectester/applet/CardConsts.java
@@ -0,0 +1,65 @@
+package cz.crcs.ectester.applet;
+
+public class CardConsts {
+ // MAIN INSTRUCTION CLASS
+ public static final byte CLA_ECTESTERAPPLET = (byte) 0xB0;
+
+ // INSTRUCTIONS
+ public static final byte INS_ALLOCATE = (byte) 0x5a;
+ public static final byte INS_CLEAR = (byte) 0x5b;
+ public static final byte INS_SET = (byte) 0x5c;
+ public static final byte INS_TRANSFORM = (byte) 0x5d;
+ public static final byte INS_GENERATE = (byte) 0x5e;
+ public static final byte INS_EXPORT = (byte) 0x5f;
+ public static final byte INS_ECDH = (byte) 0x70;
+ public static final byte INS_ECDH_DIRECT = (byte) 0x71;
+ public static final byte INS_ECDSA = (byte) 0x72;
+ public static final byte INS_ECDSA_SIGN = (byte) 0x73;
+ public static final byte INS_ECDSA_VERIFY = (byte) 0x74;
+ public static final byte INS_CLEANUP = (byte) 0x75;
+ public static final byte INS_ALLOCATE_KA = (byte) 0x76;
+ public static final byte INS_ALLOCATE_SIG = (byte) 0x77;
+ public static final byte INS_GET_INFO = (byte) 0x78;
+ public static final byte INS_SET_DRY_RUN_MODE = (byte) 0x79;
+ public static final byte INS_BUFFER = (byte) 0x7a;
+ public static final byte INS_PERFORM = (byte) 0x7b;
+
+ // PARAMETERS for P1 and P2
+ public static final byte KEYPAIR_LOCAL = (byte) 0x01;
+ public static final byte KEYPAIR_REMOTE = (byte) 0x02;
+ public static final byte KEYPAIR_BOTH = KEYPAIR_LOCAL | KEYPAIR_REMOTE;
+ public static final byte BUILD_KEYPAIR = (byte) 0x01;
+ public static final byte BUILD_KEYBUILDER = (byte) 0x02;
+ public static final byte EXPORT_TRUE = (byte) 0xff;
+ public static final byte EXPORT_FALSE = (byte) 0x00;
+ public static final byte MODE_NORMAL = (byte) 0xaa;
+ public static final byte MODE_DRY_RUN = (byte) 0xbb;
+
+ // STATUS WORDS
+ public static final short SW_SIG_VERIFY_FAIL = (short) 0x0ee1;
+ public static final short SW_DH_DHC_MISMATCH = (short) 0x0ee2;
+ public static final short SW_KEYPAIR_NULL = (short) 0x0ee3;
+ public static final short SW_KA_NULL = (short) 0x0ee4;
+ public static final short SW_SIGNATURE_NULL = (short) 0x0ee5;
+ public static final short SW_OBJECT_NULL = (short) 0x0ee6;
+ public static final short SW_CANNOT_FIT = (short) 0x0ee7;
+ public static final short SW_Exception = (short) 0xff01;
+ public static final short SW_ArrayIndexOutOfBoundsException = (short) 0xff02;
+ public static final short SW_ArithmeticException = (short) 0xff03;
+ public static final short SW_ArrayStoreException = (short) 0xff04;
+ public static final short SW_NullPointerException = (short) 0xff05;
+ public static final short SW_NegativeArraySizeException = (short) 0xff06;
+ public static final short SW_CryptoException_prefix = (short) 0xf100;
+ public static final short SW_SystemException_prefix = (short) 0xf200;
+ public static final short SW_PINException_prefix = (short) 0xf300;
+ public static final short SW_TransactionException_prefix = (short) 0xf400;
+ public static final short SW_CardRuntimeException_prefix = (short) 0xf500;
+
+ //
+ public static final short BASE_221 = (short) 0x0221;
+ public static final short BASE_222 = (short) 0x0222;
+
+ //
+ public static final short CDATA_BASIC = (short) 5;
+ public static final short CDATA_EXTENDED = (short) 7;
+}
diff --git a/src/cz/crcs/ectester/applet/ECKeyGenerator.java b/applet/src/main/java/cz/crcs/ectester/applet/ECKeyGenerator.java
index 601654a..601654a 100644
--- a/src/cz/crcs/ectester/applet/ECKeyGenerator.java
+++ b/applet/src/main/java/cz/crcs/ectester/applet/ECKeyGenerator.java
diff --git a/src/cz/crcs/ectester/applet/ECKeyTester.java b/applet/src/main/java/cz/crcs/ectester/applet/ECKeyTester.java
index 89590d0..3af1cca 100644
--- a/src/cz/crcs/ectester/applet/ECKeyTester.java
+++ b/applet/src/main/java/cz/crcs/ectester/applet/ECKeyTester.java
@@ -131,7 +131,7 @@ public class ECKeyTester {
ecdsaSignature.init(verifyKey, Signature.MODE_VERIFY);
if (!ecdsaSignature.verify(inputBuffer, inputOffset, inputLength, sigBuffer, sigOffset, length)) {
- sw = AppletBase.SW_SIG_VERIFY_FAIL;
+ sw = CardConsts.SW_SIG_VERIFY_FAIL;
}
}
} catch (CardRuntimeException ce) {
@@ -182,7 +182,7 @@ public class ECKeyTester {
if (!dryRun) {
ecdsaSignature.init(verifyKey, Signature.MODE_VERIFY);
if (!ecdsaSignature.verify(inputBuffer, inputOffset, inputLength, sigBuffer, sigOffset, sigLength)) {
- sw = AppletBase.SW_SIG_VERIFY_FAIL;
+ sw = CardConsts.SW_SIG_VERIFY_FAIL;
}
}
} catch (CardRuntimeException ce) {
diff --git a/src/cz/crcs/ectester/applet/ECTesterApplet.java b/applet/src/main/java/cz/crcs/ectester/applet/ECTesterApplet.java
index 12978e6..d679341 100644
--- a/src/cz/crcs/ectester/applet/ECTesterApplet.java
+++ b/applet/src/main/java/cz/crcs/ectester/applet/ECTesterApplet.java
@@ -21,10 +21,6 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-/*
- * PACKAGEID: 4543546573746572
- * APPLETID: 454354657374657230333362 // VERSION v0.3.3
- */
package cz.crcs.ectester.applet;
import javacard.framework.APDU;
@@ -58,6 +54,6 @@ public class ECTesterApplet extends AppletBase {
}
short getBase() {
- return AppletBase.BASE_221;
+ return CardConsts.BASE_221;
}
}
diff --git a/src/cz/crcs/ectester/applet/ECTesterAppletExtended.java b/applet/src/main/java/cz/crcs/ectester/applet/ECTesterAppletExtended.java
index 97a3769..a254ebd 100644
--- a/src/cz/crcs/ectester/applet/ECTesterAppletExtended.java
+++ b/applet/src/main/java/cz/crcs/ectester/applet/ECTesterAppletExtended.java
@@ -21,10 +21,6 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-/*
- * PACKAGEID: 4543546573746572
- * APPLETID: 454354657374657230333378 // VERSION v0.3.3
- */
package cz.crcs.ectester.applet;
import javacard.framework.APDU;
@@ -59,6 +55,6 @@ public class ECTesterAppletExtended extends AppletBase implements ExtendedLength
}
short getBase() {
- return AppletBase.BASE_222;
+ return CardConsts.BASE_222;
}
}
diff --git a/src/cz/crcs/ectester/applet/EC_Consts.java b/applet/src/main/java/cz/crcs/ectester/applet/EC_Consts.java
index 81016ac..2883ff1 100644
--- a/src/cz/crcs/ectester/applet/EC_Consts.java
+++ b/applet/src/main/java/cz/crcs/ectester/applet/EC_Consts.java
@@ -1472,7 +1472,6 @@ public class EC_Consts {
return curve <= FP_CURVES ? KeyPair.ALG_EC_FP : KeyPair.ALG_EC_F2M;
}
- @SuppressWarnings("fallthrough")
public static short toX962(byte form, byte[] outputBuffer, short outputOffset, byte[] xBuffer, short xOffset, short xLength, byte[] yBuffer, short yOffset, short yLength) {
short size = 1;
size += xLength;
diff --git a/applet/ssleay32.dll b/applet/ssleay32.dll
deleted file mode 100644
index e8fabb6..0000000
--- a/applet/ssleay32.dll
+++ /dev/null
Binary files differ
diff --git a/applet/zlib1.dll b/applet/zlib1.dll
deleted file mode 100644
index 31996cd..0000000
--- a/applet/zlib1.dll
+++ /dev/null
Binary files differ
diff --git a/build-applet.xml b/build-applet.xml
deleted file mode 100644
index c31ae23..0000000
--- a/build-applet.xml
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project basedir="." default="build" name="ECTesterApplet">
- <!-- Based on Martin Paljak's applets playground -->
- <!-- Applet building dependencies -->
- <property name="SDK_PATH" value="ext/sdks"/>
-
- <property name="JC212" value="${SDK_PATH}/jc212_kit"/>
- <property name="JC221" value="${SDK_PATH}/jc221_kit"/>
- <property name="JC222" value="${SDK_PATH}/jc222_kit"/>
- <property name="JC303" value="${SDK_PATH}/jc303_kit"/>
- <property name="JC304" value="${SDK_PATH}/jc304_kit"/>
- <property name="JC305u1" value="${SDK_PATH}/jc305u1_kit"/>
-
- <!-- ant-javacard task from javacard.pro -->
- <taskdef name="javacard" classname="pro.javacard.ant.JavaCard" classpath="ext/ant-javacard.jar"/>
-
- <!-- applet properties -->
- <property name="pkg_aid" value="4543546573746572"/>
- <property name="applet_aid_221" value="454354657374657230333362"/> <!--// VERSION v0.3.3 -->
- <property name="applet_aid_222" value="454354657374657230333378"/> <!--// VERSION v0.3.3 -->
- <property name="applet_aid_304" value="454354657374657230333394"/> <!--// VERSION v0.3.3 -->
- <property name="cap_221" value="ectester221.cap"/>
- <property name="cap_222" value="ectester222.cap"/>
- <property name="cap_304" value="ectester304.cap"/>
- <property name="cap" value="${cap_304}"/>
-
-
- <condition property="build_221">
- <equals arg1="${cap}" arg2="${cap_221}"/>
- </condition>
- <condition property="build_222">
- <equals arg1="${cap}" arg2="${cap_222}"/>
- </condition>
- <condition property="build_304">
- <equals arg1="${cap}" arg2="${cap_304}"/>
- </condition>
-
- <target name="build-check">
- <fail message="Invalid cap name!">
- <condition>
- <not>
- <or>
- <equals arg1="${cap}" arg2="${cap_304}"/>
- <equals arg1="${cap}" arg2="${cap_222}"/>
- <equals arg1="${cap}" arg2="${cap_221}"/>
- </or>
- </not>
- </condition>
- </fail>
- </target>
-
- <!-- TODO: These conditions disallow a manual request to build a concrete version. Fix this. -->
- <target name="build-221" description="Builds the CAP file for JavaCard 2.2.1." if="build_221">
- <javacard jckit="${JC221}">
- <cap verify="false" output="applet/${cap_221}" sources="src/cz/crcs/ectester/applet" aid="${pkg_aid}" excludes="ECTesterAppletExtended.*">
- <applet class="cz.crcs.ectester.applet.ECTesterApplet" aid="${applet_aid_221}"/>
- </cap>
- </javacard>
- </target>
-
- <target name="build-222" description="Builds the CAP file for JavaCard 2.2.2." if="build_222">
- <javacard jckit="${JC222}">
- <cap output="applet/${cap_222}" sources="src/cz/crcs/ectester/applet" aid="${pkg_aid}" excludes="ECTesterApplet.*">
- <applet class="cz.crcs.ectester.applet.ECTesterAppletExtended" aid="${applet_aid_222}"/>
- </cap>
- </javacard>
- </target>
-
- <target name="build-304" description="Builds the CAP file for JavaCard 3.0.4." if="build_304">
- <javacard jckit="${JC304}">
- <cap output="applet/${cap_304}" sources="src/cz/crcs/ectester/applet" aid="${pkg_aid}" excludes="ECTesterApplet.*">
- <applet class="cz.crcs.ectester.applet.ECTesterAppletExtended" aid="${applet_aid_304}"/>
- </cap>
- </javacard>
- </target>
-
- <target name="build" description="Builds the CAP file." depends="build-check,build-221,build-222,build-304">
- </target>
-
- <target name="upload" depends="build" description="Uploads the CAP file to the card, using gp.jar.">
- <exec dir="applet" executable="./gppro_upload.sh" osfamily="unix">
- <arg value="${pkg_aid}"/>
- <arg value="${cap}"/>
- </exec>
- <exec dir="applet" executable="./gppro_upload.bat" osfamily="windows">
- <arg value="${pkg_aid}"/>
- <arg value="${cap}"/>
- </exec>
- </target>
-
- <target name="upload-emv" depends="build" description="Uploads the CAP file to the card, using gp.jar, uses the EMV protocol">
- <exec dir="applet" executable="./gppro_upload_emv.sh" osfamily="unix">
- <arg value="${pkg_aid}"/>
- <arg value="${cap}"/>
- </exec>
- <exec dir="applet" executable="./gppro_upload_emv.bat" osfamily="windows">
- <arg value="${pkg_aid}"/>
- <arg value="${cap}"/>
- </exec>
- </target>
-
- <target name="clean" description="Clean the built CAP files.">
- <delete file="applet/${cap_221}" quiet="true"/>
- <delete file="applet/${cap_222}" quiet="true"/>
- <delete file="applet/${cap_304}" quiet="true"/>
- </target>
-</project>
diff --git a/build-reader.xml b/build-reader.xml
deleted file mode 100644
index 11d6145..0000000
--- a/build-reader.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- You may freely edit this file. See commented blocks below for -->
-<!-- some examples of how to customize the build. -->
-<!-- (If you delete it and reopen the project it will be recreated.) -->
-<!-- By default, only the Clean and Build commands use this build script. -->
-<!-- Commands such as Run, Debug, and Test only use this build script if -->
-<!-- the Compile on Save feature is turned off for the project. -->
-<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
-<!-- in the project's Project Properties dialog box.-->
-<project name="ECTesterReader" default="default" basedir=".">
- <description>Builds, tests, and runs the project ECTesterReader.</description>
- <import file="nbproject/reader/build-impl.xml"/>
- <import file="nbproject/dist-build.xml"/>
- <!--
-
- There exist several targets which are by default empty and which can be
- used for execution of your tasks. These targets are usually executed
- before and after some main targets. They are:
-
- -pre-init: called before initialization of project properties
- -post-init: called after initialization of project properties
- -pre-compile: called before javac compilation
- -post-compile: called after javac compilation
- -pre-compile-single: called before javac compilation of single file
- -post-compile-single: called after javac compilation of single file
- -pre-compile-test: called before javac compilation of JUnit tests
- -post-compile-test: called after javac compilation of JUnit tests
- -pre-compile-test-single: called before javac compilation of single JUnit test
- -post-compile-test-single: called after javac compilation of single JUunit test
- -pre-jar: called before JAR building
- -post-jar: called after JAR building
- -post-clean: called after cleaning build products
-
- (Targets beginning with '-' are not intended to be called on their own.)
-
- Example of inserting an obfuscator after compilation could look like this:
-
- <target name="-post-compile">
- <obfuscate>
- <fileset dir="${build.classes.dir}"/>
- </obfuscate>
- </target>
-
- For list of available properties check the imported
- nbproject/build-impl.xml file.
-
-
- Another way to customize the build is by overriding existing main targets.
- The targets of interest are:
-
- -init-macrodef-javac: defines macro for javac compilation
- -init-macrodef-junit: defines macro for junit execution
- -init-macrodef-debug: defines macro for class debugging
- -init-macrodef-java: defines macro for class execution
- -do-jar: JAR building
- run: execution of project
- -javadoc-build: Javadoc generation
- test-report: JUnit report generation
-
- An example of overriding the target for project execution could look like this:
-
- <target name="run" depends="SimpleECC-impl.jar">
- <exec dir="bin" executable="launcher.exe">
- <arg file="${dist.jar}"/>
- </exec>
- </target>
-
- Notice that the overridden target depends on the jar target and not only on
- the compile target as the regular run target does. Again, for a list of available
- properties which you can use, check the target you are overriding in the
- nbproject/build-impl.xml file.
-
- -->
- <target name="-pre-jar">
- <copy file="LICENSE" todir="${build.classes.dir}"/>
- </target>
-
- <!--
- <target name="-post-jar">
- <copy file="src/cz/crcs/ectester/scripts/ectester-reader.sh" todir="${dist.dir}"/>
- <copy file="src/cz/crcs/ectester/scripts/ectester-reader.bat" todir="${dist.dir}"/>
- </target>
- -->
-
- <target name="package" depends="jar">
- <property name="store.jar.name" value="ECTesterReader-dist"/>
- <antcall target="dist-build.package"/>
- </target>
-</project>
diff --git a/build-standalone.xml b/build-standalone.xml
deleted file mode 100644
index 731698b..0000000
--- a/build-standalone.xml
+++ /dev/null
@@ -1,224 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- You may freely edit this file. See commented blocks below for -->
-<!-- some examples of how to customize the build. -->
-<!-- (If you delete it and reopen the project it will be recreated.) -->
-<!-- By default, only the Clean and Build commands use this build script. -->
-<!-- Commands such as Run, Debug, and Test only use this build script if -->
-<!-- the Compile on Save feature is turned off for the project. -->
-<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
-<!-- in the project's Project Properties dialog box.-->
-<project name="ECTesterStandalone" default="default" basedir=".">
- <description>Builds, tests, and runs the project ECTesterStandalone.</description>
- <import file="nbproject/standalone/build-impl.xml"/>
- <import file="nbproject/dist-build.xml"/>
- <!--
-
- There exist several targets which are by default empty and which can be
- used for execution of your tasks. These targets are usually executed
- before and after some main targets. They are:
-
- -pre-init: called before initialization of project properties
- -post-init: called after initialization of project properties
- -pre-compile: called before javac compilation
- -post-compile: called after javac compilation
- -pre-compile-single: called before javac compilation of single file
- -post-compile-single: called after javac compilation of single file
- -pre-compile-test: called before javac compilation of JUnit tests
- -post-compile-test: called after javac compilation of JUnit tests
- -pre-compile-test-single: called before javac compilation of single JUnit test
- -post-compile-test-single: called after javac compilation of single JUunit test
- -pre-jar: called before JAR building
- -post-jar: called after JAR building
- -post-clean: called after cleaning build products
-
- (Targets beginning with '-' are not intended to be called on their own.)
-
- Example of inserting an obfuscator after compilation could look like this:
-
- <target name="-post-compile">
- <obfuscate>
- <fileset dir="${build.classes.dir}"/>
- </obfuscate>
- </target>
-
- For list of available properties check the imported
- nbproject/build-impl.xml file.
-
-
- Another way to customize the build is by overriding existing main targets.
- The targets of interest are:
-
- -init-macrodef-javac: defines macro for javac compilation
- -init-macrodef-junit: defines macro for junit execution
- -init-macrodef-debug: defines macro for class debugging
- -init-macrodef-java: defines macro for class execution
- -do-jar: JAR building
- run: execution of project
- -javadoc-build: Javadoc generation
- test-report: JUnit report generation
-
- An example of overriding the target for project execution could look like this:
-
- <target name="run" depends="SimpleECC-impl.jar">
- <exec dir="bin" executable="launcher.exe">
- <arg file="${dist.jar}"/>
- </exec>
- </target>
-
- Notice that the overridden target depends on the jar target and not only on
- the compile target as the regular run target does. Again, for a list of available
- properties which you can use, check the target you are overriding in the
- nbproject/build-impl.xml file.
-
- -->
- <target name="-pre-jar">
- <copy file="LICENSE" todir="${build.classes.dir}"/>
- </target>
-
- <target name="package" depends="jar">
- <property name="store.jar.name" value="ECTesterStandalone-dist"/>
- <antcall target="dist-build.package"/>
- </target>
-
- <target name="sign" depends="package">
- <signjar keystore="nbproject/keystore" alias="ectester" storepass="ectester">
- <path>
- <fileset dir="dist" includes="*.jar"/>
- </path>
- </signjar>
- </target>
-
- <target name="libs-try">
- <exec dir="src/cz/crcs/ectester/standalone/libs/jni" executable="make" osfamily="unix">
- <arg value="-k"/>
- <arg value="-B"/>
- </exec>
- <exec dir="src/cz/crcs/ectester/standalone/libs/jni" executable="cmd" osfamily="windows">
- <arg value="/c"/>
- <arg value="Makefile.bat"/>
- </exec>
- </target>
- <target name="libs">
- <exec dir="src/cz/crcs/ectester/standalone/libs/jni" failonerror="true" executable="make" osfamily="unix">
- <arg value="-k"/>
- <arg value="-B"/>
- </exec>
- <exec dir="src/cz/crcs/ectester/standalone/libs/jni" failonerror="true" executable="cmd" osfamily="windows">
- <arg value="/c"/>
- <arg value="Makefile.bat"/>
- </exec>
- </target>
- <target name="libs-debug">
- <exec dir="src/cz/crcs/ectester/standalone/libs/jni" failonerror="true" executable="make" osfamily="unix">
- <arg value="-k"/>
- <arg value="DEBUG=1"/>
- </exec>
- <exec dir="src/cz/crcs/ectester/standalone/libs/jni" failonerror="true" executable="cmd" osfamily="windows">
- <arg value="/c"/>
- <arg value="Makefile.bat"/>
- <env key="DEBUG" value="1"/>
- </exec>
- </target>
-
- <target name="-pre-compile" depends="libs-try"/>
-
- <target name="-post-clean">
- <exec dir="src/cz/crcs/ectester/standalone/libs/jni" failonerror="true" executable="make" osfamily="unix">
- <arg value="clean"/>
- </exec>
- <exec dir="src/cz/crcs/ectester/standalone/libs/jni" failonerror="true" executable="cmd" osfamily="windows">
- <arg value="/c"/>
- <arg value="Makefile.bat"/>
- <arg value="clean"/>
- </exec>
- </target>
-
- <target name="headers" depends="compile">
- <javah classpath="${build.classes.dir}" outputfile="src/cz/crcs/ectester/standalone/libs/jni/native.h">
- <class name="cz.crcs.ectester.standalone.libs.NativeECLibrary"/>
- <class name="cz.crcs.ectester.standalone.libs.TomcryptLib"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeProvider$TomCrypt"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyPairGeneratorSpi$TomCrypt"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPublicKey$TomCrypt"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPrivateKey$TomCrypt"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyAgreementSpi$TomCrypt"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeSignatureSpi$TomCryptRaw"/>
- <class name="cz.crcs.ectester.standalone.libs.BotanLib"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeProvider$Botan"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyPairGeneratorSpi$Botan"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPublicKey$Botan"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPrivateKey$Botan"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyAgreementSpi$Botan"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeSignatureSpi$Botan"/>
- <class name="cz.crcs.ectester.standalone.libs.CryptoppLib"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeProvider$Cryptopp"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyPairGeneratorSpi$Cryptopp"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPublicKey$Cryptopp"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPrivateKey$Cryptopp"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyAgreementSpi$Cryptopp"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeSignatureSpi$Cryptopp"/>
- <class name="cz.crcs.ectester.standalone.libs.OpensslLib"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeProvider$Openssl"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyPairGeneratorSpi$Openssl"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPublicKey$Openssl"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPrivateKey$Openssl"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyAgreementSpi$Openssl"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeSignatureSpi$Openssl"/>
- <class name="cz.crcs.ectester.standalone.libs.MscngLib"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeProvider$Mscng"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyPairGeneratorSpi$Mscng"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPublicKey$Mscng"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPrivateKey$Mscng"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyAgreementSpi$Mscng"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeSignatureSpi$Mscng"/>
- <class name="cz.crcs.ectester.standalone.libs.BoringsslLib"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeProvider$Boringssl"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyPairGeneratorSpi$Boringssl"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPublicKey$Boringssl"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPrivateKey$Boringssl"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyAgreementSpi$Boringssl"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeSignatureSpi$Boringssl"/>
- <class name="cz.crcs.ectester.standalone.libs.GcryptLib"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeProvider$Gcrypt"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyPairGeneratorSpi$Gcrypt"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPublicKey$Gcrypt"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPrivateKey$Gcrypt"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyAgreementSpi$Gcrypt"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeSignatureSpi$Gcrypt"/>
- <class name="cz.crcs.ectester.standalone.libs.MbedTLSLib"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeProvider$MbedTLS"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyPairGeneratorSpi$MbedTLS"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPublicKey$MbedTLS"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPrivateKey$MbedTLS"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyAgreementSpi$MbedTLS"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeSignatureSpi$MbedTLS"/>
- <class name="cz.crcs.ectester.standalone.libs.IppcpLib"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeProvider$Ippcp"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyPairGeneratorSpi$Ippcp"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPublicKey$Ippcp"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPrivateKey$Ippcp"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyAgreementSpi$Ippcp"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeSignatureSpi$Ippcp"/>
- <class name="cz.crcs.ectester.standalone.libs.MatrixsslLib"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeProvider$Matrixssl"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyPairGeneratorSpi$Matrixssl"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPublicKey$Matrixssl"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPrivateKey$Matrixssl"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyAgreementSpi$Matrixssl"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeSignatureSpi$Matrixssl"/>
- <class name="cz.crcs.ectester.standalone.libs.NettleLib"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeProvider$Nettle"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyPairGeneratorSpi$Nettle"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPublicKey$Nettle"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPrivateKey$Nettle"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeSignatureSpi$Nettle"/>
- <class name="cz.crcs.ectester.standalone.libs.LibresslLib"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeProvider$Libressl"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyPairGeneratorSpi$Libressl"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPublicKey$Libressl"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeECPrivateKey$Libressl"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeKeyAgreementSpi$Libressl"/>
- <class name="cz.crcs.ectester.standalone.libs.jni.NativeSignatureSpi$Libressl"/>
- </javah>
- </target>
-</project>
diff --git a/build.xml b/build.xml
deleted file mode 100644
index b3c6461..0000000
--- a/build.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project basedir="." default="build" name="ECTester">
- <target name="build">
- <ant antfile="build-applet.xml" target="build"/>
- <ant antfile="build-reader.xml" target="jar"/>
- <ant antfile="build-standalone.xml" target="jar"/>
- </target>
- <target name="package">
- <ant antfile="build-applet.xml" target="build"/>
- <ant antfile="build-reader.xml" target="package"/>
- <ant antfile="build-standalone.xml" target="package"/>
- </target>
- <target name="upload">
- <ant antfile="build-applet.xml" target="upload"/>
- </target>
- <target name="clean">
- <ant antfile="build-applet.xml" target="clean"/>
- <ant antfile="build-reader.xml" target="clean"/>
- <ant antfile="build-standalone.xml" target="clean"/>
- </target>
- <target name="help">
- <echo message="ECTester is built using three ant files:"/>
- <echo message=" - build-applet.xml - For building the JavaCard applet."/>
- <echo message=" -> build: Build the applet."/>
- <echo message=" -> build-221: Build the applet for JavaCard 2.2.1."/>
- <echo message=" -> build-222: Build the applet for JavaCard 2.2.2."/>
- <echo message=" -> upload: Upload the applet using the GPPro tool."/>
- <echo message=" (use `-Dcap=ectester221.cap` to upload the 2.2.1 version.)"/>
- <echo message=" -> upload-emv: Upload the applet using the GPPro tool and the EMV key protocol."/>
- <echo message=" (use `-Dcap=ectester221.cap` to upload the 2.2.1 version.)"/>
- <echo message=" - build-reader.xml - For building the reader app."/>
- <echo message=" -> jar: Build the reader app."/>
- <echo message=" -> package: Build the reader app into a distributable single jar, along with dependencies."/>
- <echo message=" - build-standalone.xml - For building the standalone app."/>
- <echo message=" -> jar: Build the standalone app."/>
- <echo message=" -> headers: Build the JNI header for testing native libraries."/>
- <echo message=" -> libs: Build the JNI shims for testing native libraries."/>
- <echo message=" -> libs-try: Build the JNI shims for testing native libraries, but do not fail if some are not available."/>
- <echo message=" -> package: Build the standalone app into a distributable single jar, along with dependencies."/>
- <echo message=""/>
- <echo message="Finally, this file provides four targets:"/>
- <echo message=" -> build: "/>
- <echo message=" -> package: "/>
- <echo message=" -> clean: "/>
- <echo message=" -> help: "/>
- </target>
-</project> \ No newline at end of file
diff --git a/common/build.gradle.kts b/common/build.gradle.kts
new file mode 100644
index 0000000..0aca7fb
--- /dev/null
+++ b/common/build.gradle.kts
@@ -0,0 +1,27 @@
+/*
+ * This file was generated by the Gradle 'init' task.
+ */
+
+plugins {
+ id("java-library")
+}
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ // https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk18on
+ api("org.bouncycastle:bcprov-jdk18on:1.77")
+ // https://mvnrepository.com/artifact/commons-cli/commons-cli
+ // We need 1.5.0, as for some reason 1.6.0 doesn't work (arguments don't ger parsed properly).
+ api("commons-cli:commons-cli:1.5.0")
+ // https://mvnrepository.com/artifact/org.yaml/snakeyaml
+ api("org.yaml:snakeyaml:2.2")
+ // https://mvnrepository.com/artifact/com.klinec/jcardsim
+ api("com.klinec:jcardsim:3.0.5.11")
+}
+
+java {
+ sourceCompatibility = JavaVersion.VERSION_11
+} \ No newline at end of file
diff --git a/src/cz/crcs/ectester/common/cli/Argument.java b/common/src/main/java/cz/crcs/ectester/common/cli/Argument.java
index e9b6688..e9b6688 100644
--- a/src/cz/crcs/ectester/common/cli/Argument.java
+++ b/common/src/main/java/cz/crcs/ectester/common/cli/Argument.java
diff --git a/src/cz/crcs/ectester/common/cli/CLITools.java b/common/src/main/java/cz/crcs/ectester/common/cli/CLITools.java
index 82ab530..82ab530 100644
--- a/src/cz/crcs/ectester/common/cli/CLITools.java
+++ b/common/src/main/java/cz/crcs/ectester/common/cli/CLITools.java
diff --git a/src/cz/crcs/ectester/common/cli/Colors.java b/common/src/main/java/cz/crcs/ectester/common/cli/Colors.java
index 7601088..7601088 100644
--- a/src/cz/crcs/ectester/common/cli/Colors.java
+++ b/common/src/main/java/cz/crcs/ectester/common/cli/Colors.java
diff --git a/src/cz/crcs/ectester/common/cli/ParserOptions.java b/common/src/main/java/cz/crcs/ectester/common/cli/ParserOptions.java
index 7300cbb..7300cbb 100644
--- a/src/cz/crcs/ectester/common/cli/ParserOptions.java
+++ b/common/src/main/java/cz/crcs/ectester/common/cli/ParserOptions.java
diff --git a/src/cz/crcs/ectester/common/cli/TreeCommandLine.java b/common/src/main/java/cz/crcs/ectester/common/cli/TreeCommandLine.java
index d758b78..d758b78 100644
--- a/src/cz/crcs/ectester/common/cli/TreeCommandLine.java
+++ b/common/src/main/java/cz/crcs/ectester/common/cli/TreeCommandLine.java
diff --git a/src/cz/crcs/ectester/common/cli/TreeParser.java b/common/src/main/java/cz/crcs/ectester/common/cli/TreeParser.java
index 657318d..657318d 100644
--- a/src/cz/crcs/ectester/common/cli/TreeParser.java
+++ b/common/src/main/java/cz/crcs/ectester/common/cli/TreeParser.java
diff --git a/src/cz/crcs/ectester/common/ec/CustomECFieldF2m.java b/common/src/main/java/cz/crcs/ectester/common/ec/CustomECFieldF2m.java
index 24ea5aa..24ea5aa 100644
--- a/src/cz/crcs/ectester/common/ec/CustomECFieldF2m.java
+++ b/common/src/main/java/cz/crcs/ectester/common/ec/CustomECFieldF2m.java
diff --git a/src/cz/crcs/ectester/common/ec/CustomECFieldFp.java b/common/src/main/java/cz/crcs/ectester/common/ec/CustomECFieldFp.java
index eafcb72..eafcb72 100644
--- a/src/cz/crcs/ectester/common/ec/CustomECFieldFp.java
+++ b/common/src/main/java/cz/crcs/ectester/common/ec/CustomECFieldFp.java
diff --git a/src/cz/crcs/ectester/common/ec/CustomECParameterSpec.java b/common/src/main/java/cz/crcs/ectester/common/ec/CustomECParameterSpec.java
index cbc15e7..cbc15e7 100644
--- a/src/cz/crcs/ectester/common/ec/CustomECParameterSpec.java
+++ b/common/src/main/java/cz/crcs/ectester/common/ec/CustomECParameterSpec.java
diff --git a/src/cz/crcs/ectester/common/ec/CustomEllipticCurve.java b/common/src/main/java/cz/crcs/ectester/common/ec/CustomEllipticCurve.java
index 489861c..489861c 100644
--- a/src/cz/crcs/ectester/common/ec/CustomEllipticCurve.java
+++ b/common/src/main/java/cz/crcs/ectester/common/ec/CustomEllipticCurve.java
diff --git a/src/cz/crcs/ectester/common/ec/EC_Category.java b/common/src/main/java/cz/crcs/ectester/common/ec/EC_Category.java
index 154403e..154403e 100644
--- a/src/cz/crcs/ectester/common/ec/EC_Category.java
+++ b/common/src/main/java/cz/crcs/ectester/common/ec/EC_Category.java
diff --git a/common/src/main/java/cz/crcs/ectester/common/ec/EC_Consts.java b/common/src/main/java/cz/crcs/ectester/common/ec/EC_Consts.java
new file mode 100644
index 0000000..86c30fa
--- /dev/null
+++ b/common/src/main/java/cz/crcs/ectester/common/ec/EC_Consts.java
@@ -0,0 +1,1403 @@
+package cz.crcs.ectester.common.ec;
+
+import cz.crcs.ectester.common.util.ByteUtil;
+
+import java.nio.ByteBuffer;
+
+/**
+ * @author Petr Svenda petr@svenda.com
+ * @author Jan Jancar johny@neuromancer.sk
+ */
+public class EC_Consts {
+ private static byte[] EC_FP_P = null; //p
+ private static byte[] EC_A = null; //a
+ private static byte[] EC_B = null; //b
+ private static byte[] EC_G_X = null; //G[x,y]
+ private static byte[] EC_G_Y = null; //
+ private static byte[] EC_R = null; //n
+ private static short EC_K = 1; //h
+
+ private static byte[] EC_W_X = null; //Pubkey[x,y]
+ private static byte[] EC_W_Y = null;
+ private static byte[] EC_S = null; //Private
+
+ private static byte[] EC_F2M_F2M = null; //[short i1, short i2, short i3], f = x^m + x^i1 + x^i2 + x^i3 + 1
+
+ // EC domain parameter identifiers (bit flags)
+ public static final short PARAMETER_FP = 0x0001;
+ public static final short PARAMETER_F2M = 0x0002;
+
+ public static final short PARAMETER_A = 0x0004;
+ public static final short PARAMETER_B = 0x0008;
+ public static final short PARAMETER_G = 0x0010;
+ public static final short PARAMETER_R = 0x0020;
+ public static final short PARAMETER_K = 0x0040;
+ public static final short PARAMETER_W = 0x0080;
+ public static final short PARAMETER_S = 0x0100;
+
+ public static final short PARAMETERS_NONE = 0x0000;
+ /**
+ * FP,A,B,G,R,K
+ */
+ public static final short PARAMETERS_DOMAIN_FP = 0x007d;
+ /**
+ * F2M,A,B,G,R,K
+ */
+ public static final short PARAMETERS_DOMAIN_F2M = 0x007e;
+ /**
+ * W,S
+ */
+ public static final short PARAMETERS_KEYPAIR = 0x0180;
+ public static final short PARAMETERS_ALL = 0x01ff;
+
+ // EC key identifiers
+ public static final byte KEY_PUBLIC = 0x01;
+ public static final byte KEY_PRIVATE = 0x02;
+ public static final byte KEY_BOTH = KEY_PUBLIC | KEY_PRIVATE;
+
+ // secp112r1
+ public static final byte[] EC112_FP_P = new byte[]{
+ (byte) 0xdb, (byte) 0x7c, (byte) 0x2a, (byte) 0xbf,
+ (byte) 0x62, (byte) 0xe3, (byte) 0x5e, (byte) 0x66,
+ (byte) 0x80, (byte) 0x76, (byte) 0xbe, (byte) 0xad,
+ (byte) 0x20, (byte) 0x8b
+ };
+
+ public static final byte[] EC112_FP_A = new byte[]{
+ (byte) 0xdb, (byte) 0x7c, (byte) 0x2a, (byte) 0xbf,
+ (byte) 0x62, (byte) 0xe3, (byte) 0x5e, (byte) 0x66,
+ (byte) 0x80, (byte) 0x76, (byte) 0xbe, (byte) 0xad,
+ (byte) 0x20, (byte) 0x88
+ };
+
+ public static final byte[] EC112_FP_B = new byte[]{
+ (byte) 0x65, (byte) 0x9e, (byte) 0xf8, (byte) 0xba,
+ (byte) 0x04, (byte) 0x39, (byte) 0x16, (byte) 0xee,
+ (byte) 0xde, (byte) 0x89, (byte) 0x11, (byte) 0x70,
+ (byte) 0x2b, (byte) 0x22
+ };
+
+ public static final byte[] EC112_FP_G_X = new byte[]{
+ (byte) 0x09, (byte) 0x48, (byte) 0x72, (byte) 0x39,
+ (byte) 0x99, (byte) 0x5a, (byte) 0x5e, (byte) 0xe7,
+ (byte) 0x6b, (byte) 0x55, (byte) 0xf9, (byte) 0xc2,
+ (byte) 0xf0, (byte) 0x98
+ };
+
+ public static final byte[] EC112_FP_G_Y = new byte[]{
+ (byte) 0xa8, (byte) 0x9c, (byte) 0xe5, (byte) 0xaf,
+ (byte) 0x87, (byte) 0x24, (byte) 0xc0, (byte) 0xa2,
+ (byte) 0x3e, (byte) 0x0e, (byte) 0x0f, (byte) 0xf7,
+ (byte) 0x75, (byte) 0x00
+ };
+
+ public static final byte[] EC112_FP_R = new byte[]{
+ (byte) 0xdb, (byte) 0x7c, (byte) 0x2a, (byte) 0xbf,
+ (byte) 0x62, (byte) 0xe3, (byte) 0x5e, (byte) 0x76,
+ (byte) 0x28, (byte) 0xdf, (byte) 0xac, (byte) 0x65,
+ (byte) 0x61, (byte) 0xc5
+ };
+
+ public static final short EC112_FP_K = 1;
+
+
+ // secp128r1 from http://www.secg.org/sec2-v2.pdf
+ public static final byte[] EC128_FP_P = new byte[]{
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFD,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF
+ };
+
+ public static final byte[] EC128_FP_A = new byte[]{
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFD,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFC
+ };
+
+ public static final byte[] EC128_FP_B = new byte[]{
+ (byte) 0xE8, (byte) 0x75, (byte) 0x79, (byte) 0xC1,
+ (byte) 0x10, (byte) 0x79, (byte) 0xF4, (byte) 0x3D,
+ (byte) 0xD8, (byte) 0x24, (byte) 0x99, (byte) 0x3C,
+ (byte) 0x2C, (byte) 0xEE, (byte) 0x5E, (byte) 0xD3
+ };
+
+ // G in compressed form / first part of ucompressed
+ public static final byte[] EC128_FP_G_X = new byte[]{
+ (byte) 0x16, (byte) 0x1F, (byte) 0xF7, (byte) 0x52,
+ (byte) 0x8B, (byte) 0x89, (byte) 0x9B, (byte) 0x2D,
+ (byte) 0x0C, (byte) 0x28, (byte) 0x60, (byte) 0x7C,
+ (byte) 0xA5, (byte) 0x2C, (byte) 0x5B, (byte) 0x86
+ };
+
+ // second part of G uncompressed
+ public static final byte[] EC128_FP_G_Y = new byte[]{
+ (byte) 0xCF, (byte) 0x5A, (byte) 0xC8, (byte) 0x39,
+ (byte) 0x5B, (byte) 0xAF, (byte) 0xEB, (byte) 0x13,
+ (byte) 0xC0, (byte) 0x2D, (byte) 0xA2, (byte) 0x92,
+ (byte) 0xDD, (byte) 0xED, (byte) 0x7A, (byte) 0x83
+ };
+ // Order of G
+ public static final byte[] EC128_FP_R = new byte[]{
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFE,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x75, (byte) 0xA3, (byte) 0x0D, (byte) 0x1B,
+ (byte) 0x90, (byte) 0x38, (byte) 0xA1, (byte) 0x15
+ };
+ // cofactor of G
+ public static final short EC128_FP_K = 1;
+
+ // secp160r1 from http://www.secg.org/sec2-v2.pdf
+ public static final byte[] EC160_FP_P = new byte[]{
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0x7F, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF
+ };
+
+ public static final byte[] EC160_FP_A = new byte[]{
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0x7F, (byte) 0xFF, (byte) 0xFF, (byte) 0xFC
+ };
+
+ public static final byte[] EC160_FP_B = new byte[]{
+ (byte) 0x1C, (byte) 0x97, (byte) 0xBE, (byte) 0xFC,
+ (byte) 0x54, (byte) 0xBD, (byte) 0x7A, (byte) 0x8B,
+ (byte) 0x65, (byte) 0xAC, (byte) 0xF8, (byte) 0x9F,
+ (byte) 0x81, (byte) 0xD4, (byte) 0xD4, (byte) 0xAD,
+ (byte) 0xC5, (byte) 0x65, (byte) 0xFA, (byte) 0x45
+ };
+
+ // G in compressed form / first part of ucompressed
+ public static final byte[] EC160_FP_G_X = new byte[]{
+ (byte) 0x4A, (byte) 0x96, (byte) 0xB5, (byte) 0x68,
+ (byte) 0x8E, (byte) 0xF5, (byte) 0x73, (byte) 0x28,
+ (byte) 0x46, (byte) 0x64, (byte) 0x69, (byte) 0x89,
+ (byte) 0x68, (byte) 0xC3, (byte) 0x8B, (byte) 0xB9,
+ (byte) 0x13, (byte) 0xCB, (byte) 0xFC, (byte) 0x82
+ };
+
+ // second part of G uncompressed
+ public static final byte[] EC160_FP_G_Y = new byte[]{
+ (byte) 0x23, (byte) 0xA6, (byte) 0x28, (byte) 0x55,
+ (byte) 0x31, (byte) 0x68, (byte) 0x94, (byte) 0x7D,
+ (byte) 0x59, (byte) 0xDC, (byte) 0xC9, (byte) 0x12,
+ (byte) 0x04, (byte) 0x23, (byte) 0x51, (byte) 0x37,
+ (byte) 0x7A, (byte) 0xC5, (byte) 0xFB, (byte) 0x32
+ };
+ // Order of G
+ public static final byte[] EC160_FP_R = new byte[]{
+ (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x01, (byte) 0xF4, (byte) 0xC8,
+ (byte) 0xF9, (byte) 0x27, (byte) 0xAE, (byte) 0xD3,
+ (byte) 0xCA, (byte) 0x75, (byte) 0x22, (byte) 0x57
+ };
+ // cofactor of G
+ public static final short EC160_FP_K = 1;
+
+
+ // secp192r1 from http://www.secg.org/sec2-v2.pdf
+ public static final byte[] EC192_FP_P = new byte[]{
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFE,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF
+ };
+ public static final byte[] EC192_FP_A = new byte[]{
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFE,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFC
+ };
+ public static final byte[] EC192_FP_B = new byte[]{
+ (byte) 0x64, (byte) 0x21, (byte) 0x05, (byte) 0x19,
+ (byte) 0xE5, (byte) 0x9C, (byte) 0x80, (byte) 0xE7,
+ (byte) 0x0F, (byte) 0xA7, (byte) 0xE9, (byte) 0xAB,
+ (byte) 0x72, (byte) 0x24, (byte) 0x30, (byte) 0x49,
+ (byte) 0xFE, (byte) 0xB8, (byte) 0xDE, (byte) 0xEC,
+ (byte) 0xC1, (byte) 0x46, (byte) 0xB9, (byte) 0xB1
+ };
+ // G in compressed form / first part of ucompressed
+ public static final byte[] EC192_FP_G_X = new byte[]{
+ (byte) 0x18, (byte) 0x8D, (byte) 0xA8, (byte) 0x0E,
+ (byte) 0xB0, (byte) 0x30, (byte) 0x90, (byte) 0xF6,
+ (byte) 0x7C, (byte) 0xBF, (byte) 0x20, (byte) 0xEB,
+ (byte) 0x43, (byte) 0xA1, (byte) 0x88, (byte) 0x00,
+ (byte) 0xF4, (byte) 0xFF, (byte) 0x0A, (byte) 0xFD,
+ (byte) 0x82, (byte) 0xFF, (byte) 0x10, (byte) 0x12
+ };
+ // second part of G uncompressed
+ public static final byte[] EC192_FP_G_Y = new byte[]{
+ (byte) 0x07, (byte) 0x19, (byte) 0x2B, (byte) 0x95,
+ (byte) 0xFF, (byte) 0xC8, (byte) 0xDA, (byte) 0x78,
+ (byte) 0x63, (byte) 0x10, (byte) 0x11, (byte) 0xED,
+ (byte) 0x6B, (byte) 0x24, (byte) 0xCD, (byte) 0xD5,
+ (byte) 0x73, (byte) 0xF9, (byte) 0x77, (byte) 0xA1,
+ (byte) 0x1E, (byte) 0x79, (byte) 0x48, (byte) 0x11
+ };
+ // Order of G
+ public static final byte[] EC192_FP_R = new byte[]{
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0x99, (byte) 0xDE, (byte) 0xF8, (byte) 0x36,
+ (byte) 0x14, (byte) 0x6B, (byte) 0xC9, (byte) 0xB1,
+ (byte) 0xB4, (byte) 0xD2, (byte) 0x28, (byte) 0x31
+ };
+ // cofactor of G
+ public static final short EC192_FP_K = 1;
+
+ // secp224r1 from http://www.secg.org/sec2-v2.pdf
+ public static final byte[] EC224_FP_P = new byte[]{
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01
+ };
+
+ public static final byte[] EC224_FP_A = new byte[]{
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFE,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFE
+ };
+
+ public static final byte[] EC224_FP_B = new byte[]{
+ (byte) 0xB4, (byte) 0x05, (byte) 0x0A, (byte) 0x85,
+ (byte) 0x0C, (byte) 0x04, (byte) 0xB3, (byte) 0xAB,
+ (byte) 0xF5, (byte) 0x41, (byte) 0x32, (byte) 0x56,
+ (byte) 0x50, (byte) 0x44, (byte) 0xB0, (byte) 0xB7,
+ (byte) 0xD7, (byte) 0xBF, (byte) 0xD8, (byte) 0xBA,
+ (byte) 0x27, (byte) 0x0B, (byte) 0x39, (byte) 0x43,
+ (byte) 0x23, (byte) 0x55, (byte) 0xFF, (byte) 0xB4
+ };
+
+ // G in compressed form / first part of ucompressed
+ public static final byte[] EC224_FP_G_X = new byte[]{
+ (byte) 0xB7, (byte) 0x0E, (byte) 0x0C, (byte) 0xBD,
+ (byte) 0x6B, (byte) 0xB4, (byte) 0xBF, (byte) 0x7F,
+ (byte) 0x32, (byte) 0x13, (byte) 0x90, (byte) 0xB9,
+ (byte) 0x4A, (byte) 0x03, (byte) 0xC1, (byte) 0xD3,
+ (byte) 0x56, (byte) 0xC2, (byte) 0x11, (byte) 0x22,
+ (byte) 0x34, (byte) 0x32, (byte) 0x80, (byte) 0xD6,
+ (byte) 0x11, (byte) 0x5C, (byte) 0x1D, (byte) 0x21
+ };
+ // second part of G uncompressed
+ public static final byte[] EC224_FP_G_Y = new byte[]{
+ (byte) 0xBD, (byte) 0x37, (byte) 0x63, (byte) 0x88,
+ (byte) 0xB5, (byte) 0xF7, (byte) 0x23, (byte) 0xFB,
+ (byte) 0x4C, (byte) 0x22, (byte) 0xDF, (byte) 0xE6,
+ (byte) 0xCD, (byte) 0x43, (byte) 0x75, (byte) 0xA0,
+ (byte) 0x5A, (byte) 0x07, (byte) 0x47, (byte) 0x64,
+ (byte) 0x44, (byte) 0xD5, (byte) 0x81, (byte) 0x99,
+ (byte) 0x85, (byte) 0x00, (byte) 0x7E, (byte) 0x34
+ };
+ // Order of G
+ public static final byte[] EC224_FP_R = new byte[]{
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0x16, (byte) 0xA2,
+ (byte) 0xE0, (byte) 0xB8, (byte) 0xF0, (byte) 0x3E,
+ (byte) 0x13, (byte) 0xDD, (byte) 0x29, (byte) 0x45,
+ (byte) 0x5C, (byte) 0x5C, (byte) 0x2A, (byte) 0x3D
+ };
+ // cofactor of G
+ public static final short EC224_FP_K = 1;
+
+ // secp256r1 from http://www.secg.org/sec2-v2.pdf
+ public static final byte[] EC256_FP_P = new byte[]{
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF
+ };
+ public static final byte[] EC256_FP_A = new byte[]{
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFC
+ };
+ public static final byte[] EC256_FP_B = new byte[]{
+ (byte) 0x5A, (byte) 0xC6, (byte) 0x35, (byte) 0xD8,
+ (byte) 0xAA, (byte) 0x3A, (byte) 0x93, (byte) 0xE7,
+ (byte) 0xB3, (byte) 0xEB, (byte) 0xBD, (byte) 0x55,
+ (byte) 0x76, (byte) 0x98, (byte) 0x86, (byte) 0xBC,
+ (byte) 0x65, (byte) 0x1D, (byte) 0x06, (byte) 0xB0,
+ (byte) 0xCC, (byte) 0x53, (byte) 0xB0, (byte) 0xF6,
+ (byte) 0x3B, (byte) 0xCE, (byte) 0x3C, (byte) 0x3E,
+ (byte) 0x27, (byte) 0xD2, (byte) 0x60, (byte) 0x4B
+ };
+ // G in compressed form / first part of ucompressed
+ public static final byte[] EC256_FP_G_X = new byte[]{
+ (byte) 0x6B, (byte) 0x17, (byte) 0xD1, (byte) 0xF2,
+ (byte) 0xE1, (byte) 0x2C, (byte) 0x42, (byte) 0x47,
+ (byte) 0xF8, (byte) 0xBC, (byte) 0xE6, (byte) 0xE5,
+ (byte) 0x63, (byte) 0xA4, (byte) 0x40, (byte) 0xF2,
+ (byte) 0x77, (byte) 0x03, (byte) 0x7D, (byte) 0x81,
+ (byte) 0x2D, (byte) 0xEB, (byte) 0x33, (byte) 0xA0,
+ (byte) 0xF4, (byte) 0xA1, (byte) 0x39, (byte) 0x45,
+ (byte) 0xD8, (byte) 0x98, (byte) 0xC2, (byte) 0x96
+ };
+ // second part of G uncompressed
+ public static final byte[] EC256_FP_G_Y = new byte[]{
+ (byte) 0x4F, (byte) 0xE3, (byte) 0x42, (byte) 0xE2,
+ (byte) 0xFE, (byte) 0x1A, (byte) 0x7F, (byte) 0x9B,
+ (byte) 0x8E, (byte) 0xE7, (byte) 0xEB, (byte) 0x4A,
+ (byte) 0x7C, (byte) 0x0F, (byte) 0x9E, (byte) 0x16,
+ (byte) 0x2B, (byte) 0xCE, (byte) 0x33, (byte) 0x57,
+ (byte) 0x6B, (byte) 0x31, (byte) 0x5E, (byte) 0xCE,
+ (byte) 0xCB, (byte) 0xB6, (byte) 0x40, (byte) 0x68,
+ (byte) 0x37, (byte) 0xBF, (byte) 0x51, (byte) 0xF5
+ };
+ // Order of G
+ public static final byte[] EC256_FP_R = new byte[]{
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xBC, (byte) 0xE6, (byte) 0xFA, (byte) 0xAD,
+ (byte) 0xA7, (byte) 0x17, (byte) 0x9E, (byte) 0x84,
+ (byte) 0xF3, (byte) 0xB9, (byte) 0xCA, (byte) 0xC2,
+ (byte) 0xFC, (byte) 0x63, (byte) 0x25, (byte) 0x51
+ };
+ // cofactor of G
+ public static final short EC256_FP_K = 1;
+
+ // secp384r1 from http://www.secg.org/sec2-v2.pdf
+ public static final byte[] EC384_FP_P = new byte[]{
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFE,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF
+ };
+
+ public static final byte[] EC384_FP_A = new byte[]{
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFE,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFC
+ };
+
+ public static final byte[] EC384_FP_B = new byte[]{
+ (byte) 0xB3, (byte) 0x31, (byte) 0x2F, (byte) 0xA7,
+ (byte) 0xE2, (byte) 0x3E, (byte) 0xE7, (byte) 0xE4,
+ (byte) 0x98, (byte) 0x8E, (byte) 0x05, (byte) 0x6B,
+ (byte) 0xE3, (byte) 0xF8, (byte) 0x2D, (byte) 0x19,
+ (byte) 0x18, (byte) 0x1D, (byte) 0x9C, (byte) 0x6E,
+ (byte) 0xFE, (byte) 0x81, (byte) 0x41, (byte) 0x12,
+ (byte) 0x03, (byte) 0x14, (byte) 0x08, (byte) 0x8F,
+ (byte) 0x50, (byte) 0x13, (byte) 0x87, (byte) 0x5A,
+ (byte) 0xC6, (byte) 0x56, (byte) 0x39, (byte) 0x8D,
+ (byte) 0x8A, (byte) 0x2E, (byte) 0xD1, (byte) 0x9D,
+ (byte) 0x2A, (byte) 0x85, (byte) 0xC8, (byte) 0xED,
+ (byte) 0xD3, (byte) 0xEC, (byte) 0x2A, (byte) 0xEF
+ };
+
+ // G in compressed form / first part of ucompressed
+ public static final byte[] EC384_FP_G_X = new byte[]{
+ (byte) 0xAA, (byte) 0x87, (byte) 0xCA, (byte) 0x22,
+ (byte) 0xBE, (byte) 0x8B, (byte) 0x05, (byte) 0x37,
+ (byte) 0x8E, (byte) 0xB1, (byte) 0xC7, (byte) 0x1E,
+ (byte) 0xF3, (byte) 0x20, (byte) 0xAD, (byte) 0x74,
+ (byte) 0x6E, (byte) 0x1D, (byte) 0x3B, (byte) 0x62,
+ (byte) 0x8B, (byte) 0xA7, (byte) 0x9B, (byte) 0x98,
+ (byte) 0x59, (byte) 0xF7, (byte) 0x41, (byte) 0xE0,
+ (byte) 0x82, (byte) 0x54, (byte) 0x2A, (byte) 0x38,
+ (byte) 0x55, (byte) 0x02, (byte) 0xF2, (byte) 0x5D,
+ (byte) 0xBF, (byte) 0x55, (byte) 0x29, (byte) 0x6C,
+ (byte) 0x3A, (byte) 0x54, (byte) 0x5E, (byte) 0x38,
+ (byte) 0x72, (byte) 0x76, (byte) 0x0A, (byte) 0xB7
+ };
+ // second part of G uncompressed
+ public static final byte[] EC384_FP_G_Y = new byte[]{
+ (byte) 0x36, (byte) 0x17, (byte) 0xDE, (byte) 0x4A,
+ (byte) 0x96, (byte) 0x26, (byte) 0x2C, (byte) 0x6F,
+ (byte) 0x5D, (byte) 0x9E, (byte) 0x98, (byte) 0xBF,
+ (byte) 0x92, (byte) 0x92, (byte) 0xDC, (byte) 0x29,
+ (byte) 0xF8, (byte) 0xF4, (byte) 0x1D, (byte) 0xBD,
+ (byte) 0x28, (byte) 0x9A, (byte) 0x14, (byte) 0x7C,
+ (byte) 0xE9, (byte) 0xDA, (byte) 0x31, (byte) 0x13,
+ (byte) 0xB5, (byte) 0xF0, (byte) 0xB8, (byte) 0xC0,
+ (byte) 0x0A, (byte) 0x60, (byte) 0xB1, (byte) 0xCE,
+ (byte) 0x1D, (byte) 0x7E, (byte) 0x81, (byte) 0x9D,
+ (byte) 0x7A, (byte) 0x43, (byte) 0x1D, (byte) 0x7C,
+ (byte) 0x90, (byte) 0xEA, (byte) 0x0E, (byte) 0x5F
+ };
+
+ // Order of G
+ public static final byte[] EC384_FP_R = new byte[]{
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xC7, (byte) 0x63, (byte) 0x4D, (byte) 0x81,
+ (byte) 0xF4, (byte) 0x37, (byte) 0x2D, (byte) 0xDF,
+ (byte) 0x58, (byte) 0x1A, (byte) 0x0D, (byte) 0xB2,
+ (byte) 0x48, (byte) 0xB0, (byte) 0xA7, (byte) 0x7A,
+ (byte) 0xEC, (byte) 0xEC, (byte) 0x19, (byte) 0x6A,
+ (byte) 0xCC, (byte) 0xC5, (byte) 0x29, (byte) 0x73
+ };
+ // cofactor of G
+ public static final short EC384_FP_K = 1;
+
+
+ // secp521r1 from http://www.secg.org/sec2-v2.pdf
+ public static final byte[] EC521_FP_P = new byte[]{
+ (byte) 0x01, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF
+ };
+
+ public static final byte[] EC521_FP_A = new byte[]{
+ (byte) 0x01, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFC
+ };
+
+ public static final byte[] EC521_FP_B = new byte[]{
+ (byte) 0x00, (byte) 0x51, (byte) 0x95, (byte) 0x3E,
+ (byte) 0xB9, (byte) 0x61, (byte) 0x8E, (byte) 0x1C,
+ (byte) 0x9A, (byte) 0x1F, (byte) 0x92, (byte) 0x9A,
+ (byte) 0x21, (byte) 0xA0, (byte) 0xB6, (byte) 0x85,
+ (byte) 0x40, (byte) 0xEE, (byte) 0xA2, (byte) 0xDA,
+ (byte) 0x72, (byte) 0x5B, (byte) 0x99, (byte) 0xB3,
+ (byte) 0x15, (byte) 0xF3, (byte) 0xB8, (byte) 0xB4,
+ (byte) 0x89, (byte) 0x91, (byte) 0x8E, (byte) 0xF1,
+ (byte) 0x09, (byte) 0xE1, (byte) 0x56, (byte) 0x19,
+ (byte) 0x39, (byte) 0x51, (byte) 0xEC, (byte) 0x7E,
+ (byte) 0x93, (byte) 0x7B, (byte) 0x16, (byte) 0x52,
+ (byte) 0xC0, (byte) 0xBD, (byte) 0x3B, (byte) 0xB1,
+ (byte) 0xBF, (byte) 0x07, (byte) 0x35, (byte) 0x73,
+ (byte) 0xDF, (byte) 0x88, (byte) 0x3D, (byte) 0x2C,
+ (byte) 0x34, (byte) 0xF1, (byte) 0xEF, (byte) 0x45,
+ (byte) 0x1F, (byte) 0xD4, (byte) 0x6B, (byte) 0x50,
+ (byte) 0x3F, (byte) 0x00
+ };
+
+ // G in compressed form / first part of ucompressed
+ public static final byte[] EC521_FP_G_X = new byte[]{
+ (byte) 0x00, (byte) 0xC6, (byte) 0x85, (byte) 0x8E,
+ (byte) 0x06, (byte) 0xB7, (byte) 0x04, (byte) 0x04,
+ (byte) 0xE9, (byte) 0xCD, (byte) 0x9E, (byte) 0x3E,
+ (byte) 0xCB, (byte) 0x66, (byte) 0x23, (byte) 0x95,
+ (byte) 0xB4, (byte) 0x42, (byte) 0x9C, (byte) 0x64,
+ (byte) 0x81, (byte) 0x39, (byte) 0x05, (byte) 0x3F,
+ (byte) 0xB5, (byte) 0x21, (byte) 0xF8, (byte) 0x28,
+ (byte) 0xAF, (byte) 0x60, (byte) 0x6B, (byte) 0x4D,
+ (byte) 0x3D, (byte) 0xBA, (byte) 0xA1, (byte) 0x4B,
+ (byte) 0x5E, (byte) 0x77, (byte) 0xEF, (byte) 0xE7,
+ (byte) 0x59, (byte) 0x28, (byte) 0xFE, (byte) 0x1D,
+ (byte) 0xC1, (byte) 0x27, (byte) 0xA2, (byte) 0xFF,
+ (byte) 0xA8, (byte) 0xDE, (byte) 0x33, (byte) 0x48,
+ (byte) 0xB3, (byte) 0xC1, (byte) 0x85, (byte) 0x6A,
+ (byte) 0x42, (byte) 0x9B, (byte) 0xF9, (byte) 0x7E,
+ (byte) 0x7E, (byte) 0x31, (byte) 0xC2, (byte) 0xE5,
+ (byte) 0xBD, (byte) 0x66
+ };
+
+ // second part of G uncompressed
+ public static final byte[] EC521_FP_G_Y = new byte[]{
+ (byte) 0x01, (byte) 0x18, (byte) 0x39, (byte) 0x29,
+ (byte) 0x6A, (byte) 0x78, (byte) 0x9A, (byte) 0x3B,
+ (byte) 0xC0, (byte) 0x04, (byte) 0x5C, (byte) 0x8A,
+ (byte) 0x5F, (byte) 0xB4, (byte) 0x2C, (byte) 0x7D,
+ (byte) 0x1B, (byte) 0xD9, (byte) 0x98, (byte) 0xF5,
+ (byte) 0x44, (byte) 0x49, (byte) 0x57, (byte) 0x9B,
+ (byte) 0x44, (byte) 0x68, (byte) 0x17, (byte) 0xAF,
+ (byte) 0xBD, (byte) 0x17, (byte) 0x27, (byte) 0x3E,
+ (byte) 0x66, (byte) 0x2C, (byte) 0x97, (byte) 0xEE,
+ (byte) 0x72, (byte) 0x99, (byte) 0x5E, (byte) 0xF4,
+ (byte) 0x26, (byte) 0x40, (byte) 0xC5, (byte) 0x50,
+ (byte) 0xB9, (byte) 0x01, (byte) 0x3F, (byte) 0xAD,
+ (byte) 0x07, (byte) 0x61, (byte) 0x35, (byte) 0x3C,
+ (byte) 0x70, (byte) 0x86, (byte) 0xA2, (byte) 0x72,
+ (byte) 0xC2, (byte) 0x40, (byte) 0x88, (byte) 0xBE,
+ (byte) 0x94, (byte) 0x76, (byte) 0x9F, (byte) 0xD1,
+ (byte) 0x66, (byte) 0x50
+ };
+
+ // Order of G
+ public static final byte[] EC521_FP_R = new byte[]{
+ (byte) 0x01, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFA,
+ (byte) 0x51, (byte) 0x86, (byte) 0x87, (byte) 0x83,
+ (byte) 0xBF, (byte) 0x2F, (byte) 0x96, (byte) 0x6B,
+ (byte) 0x7F, (byte) 0xCC, (byte) 0x01, (byte) 0x48,
+ (byte) 0xF7, (byte) 0x09, (byte) 0xA5, (byte) 0xD0,
+ (byte) 0x3B, (byte) 0xB5, (byte) 0xC9, (byte) 0xB8,
+ (byte) 0x89, (byte) 0x9C, (byte) 0x47, (byte) 0xAE,
+ (byte) 0xBB, (byte) 0x6F, (byte) 0xB7, (byte) 0x1E,
+ (byte) 0x91, (byte) 0x38, (byte) 0x64, (byte) 0x09
+ };
+
+ // cofactor of G
+ public static final short EC521_FP_K = 1;
+
+ //sect163r1 from http://www.secg.org/sec2-v2.pdf
+ // [short i1, short i2, short i3] f = x^163 + x^i1 + x^i2 + x^i3 + 1
+ public static final byte[] EC163_F2M_F = new byte[]{
+ (byte) 0x00, (byte) 0x07,
+ (byte) 0x00, (byte) 0x06,
+ (byte) 0x00, (byte) 0x03
+ };
+
+ public static final byte[] EC163_F2M_A = new byte[]{
+ (byte) 0x07, (byte) 0xB6, (byte) 0x88, (byte) 0x2C,
+ (byte) 0xAA, (byte) 0xEF, (byte) 0xA8, (byte) 0x4F,
+ (byte) 0x95, (byte) 0x54, (byte) 0xFF, (byte) 0x84,
+ (byte) 0x28, (byte) 0xBD, (byte) 0x88, (byte) 0xE2,
+ (byte) 0x46, (byte) 0xD2, (byte) 0x78, (byte) 0x2A,
+ (byte) 0xE2
+ };
+
+ public static final byte[] EC163_F2M_B = new byte[]{
+ (byte) 0x07, (byte) 0x13, (byte) 0x61, (byte) 0x2D,
+ (byte) 0xCD, (byte) 0xDC, (byte) 0xB4, (byte) 0x0A,
+ (byte) 0xAB, (byte) 0x94, (byte) 0x6B, (byte) 0xDA,
+ (byte) 0x29, (byte) 0xCA, (byte) 0x91, (byte) 0xF7,
+ (byte) 0x3A, (byte) 0xF9, (byte) 0x58, (byte) 0xAF,
+ (byte) 0xD9
+ };
+
+ // G in compressed form / first part of ucompressed
+ public static final byte[] EC163_F2M_G_X = new byte[]{
+ (byte) 0x03, (byte) 0x69, (byte) 0x97, (byte) 0x96,
+ (byte) 0x97, (byte) 0xAB, (byte) 0x43, (byte) 0x89,
+ (byte) 0x77, (byte) 0x89, (byte) 0x56, (byte) 0x67,
+ (byte) 0x89, (byte) 0x56, (byte) 0x7F, (byte) 0x78,
+ (byte) 0x7A, (byte) 0x78, (byte) 0x76, (byte) 0xA6,
+ (byte) 0x54
+ };
+
+ // second part of G uncompressed
+ public static final byte[] EC163_F2M_G_Y = new byte[]{
+ (byte) 0x00, (byte) 0x43, (byte) 0x5E, (byte) 0xDB,
+ (byte) 0x42, (byte) 0xEF, (byte) 0xAF, (byte) 0xB2,
+ (byte) 0x98, (byte) 0x9D, (byte) 0x51, (byte) 0xFE,
+ (byte) 0xFC, (byte) 0xE3, (byte) 0xC8, (byte) 0x09,
+ (byte) 0x88, (byte) 0xF4, (byte) 0x1F, (byte) 0xF8,
+ (byte) 0x83
+ };
+
+ // order of G
+ public static final byte[] EC163_F2M_R = new byte[]{
+ (byte) 0x03, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0x48,
+ (byte) 0xAA, (byte) 0xB6, (byte) 0x89, (byte) 0xC2,
+ (byte) 0x9C, (byte) 0xA7, (byte) 0x10, (byte) 0x27,
+ (byte) 0x9B
+ };
+
+ // cofactor of G
+ public static final short EC163_F2M_K = 2;
+
+ //sect233r1 from http://www.secg.org/sec2-v2.pdf
+ // [short i1, short i2, short i3] f = x^233 + x^i1 + 1
+ public static final byte[] EC233_F2M_F = new byte[]{
+ (byte) 0x00, (byte) 0x4a
+ };
+
+ public static final byte[] EC233_F2M_A = new byte[]{
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x01
+ };
+
+ public static final byte[] EC233_F2M_B = new byte[]{
+ (byte) 0x00, (byte) 0x66, (byte) 0x64, (byte) 0x7E,
+ (byte) 0xDE, (byte) 0x6C, (byte) 0x33, (byte) 0x2C,
+ (byte) 0x7F, (byte) 0x8C, (byte) 0x09, (byte) 0x23,
+ (byte) 0xBB, (byte) 0x58, (byte) 0x21, (byte) 0x3B,
+ (byte) 0x33, (byte) 0x3B, (byte) 0x20, (byte) 0xE9,
+ (byte) 0xCE, (byte) 0x42, (byte) 0x81, (byte) 0xFE,
+ (byte) 0x11, (byte) 0x5F, (byte) 0x7D, (byte) 0x8F,
+ (byte) 0x90, (byte) 0xAD
+ };
+
+ // G in compressed form / first part of ucompressed
+ public static final byte[] EC233_F2M_G_X = new byte[]{
+ (byte) 0x00, (byte) 0xFA, (byte) 0xC9, (byte) 0xDF,
+ (byte) 0xCB, (byte) 0xAC, (byte) 0x83, (byte) 0x13,
+ (byte) 0xBB, (byte) 0x21, (byte) 0x39, (byte) 0xF1,
+ (byte) 0xBB, (byte) 0x75, (byte) 0x5F, (byte) 0xEF,
+ (byte) 0x65, (byte) 0xBC, (byte) 0x39, (byte) 0x1F,
+ (byte) 0x8B, (byte) 0x36, (byte) 0xF8, (byte) 0xF8,
+ (byte) 0xEB, (byte) 0x73, (byte) 0x71, (byte) 0xFD,
+ (byte) 0x55, (byte) 0x8B
+ };
+
+ // second part of G uncompressed
+ public static final byte[] EC233_F2M_G_Y = new byte[]{
+ (byte) 0x01, (byte) 0x00, (byte) 0x6A, (byte) 0x08,
+ (byte) 0xA4, (byte) 0x19, (byte) 0x03, (byte) 0x35,
+ (byte) 0x06, (byte) 0x78, (byte) 0xE5, (byte) 0x85,
+ (byte) 0x28, (byte) 0xBE, (byte) 0xBF, (byte) 0x8A,
+ (byte) 0x0B, (byte) 0xEF, (byte) 0xF8, (byte) 0x67,
+ (byte) 0xA7, (byte) 0xCA, (byte) 0x36, (byte) 0x71,
+ (byte) 0x6F, (byte) 0x7E, (byte) 0x01, (byte) 0xF8,
+ (byte) 0x10, (byte) 0x52
+ };
+
+ // order of G
+ public static final byte[] EC233_F2M_R = new byte[]{
+ (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x13,
+ (byte) 0xE9, (byte) 0x74, (byte) 0xE7, (byte) 0x2F,
+ (byte) 0x8A, (byte) 0x69, (byte) 0x22, (byte) 0x03,
+ (byte) 0x1D, (byte) 0x26, (byte) 0x03, (byte) 0xCF,
+ (byte) 0xE0, (byte) 0xD7
+ };
+
+ // cofactor of G
+ public static final short EC233_F2M_K = 2;
+
+ //sect283r1 from http://www.secg.org/sec2-v2.pdf
+ // [short i1, short i2, short i3] f = x^283 + x^i1 + x^i2 + x^i3 + 1
+ public static final byte[] EC283_F2M_F = new byte[]{
+ (byte) 0x00, (byte) 0x0c,
+ (byte) 0x00, (byte) 0x07,
+ (byte) 0x00, (byte) 0x05
+ };
+
+ public static final byte[] EC283_F2M_A = new byte[]{
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01
+ };
+
+ public static final byte[] EC283_F2M_B = new byte[]{
+ (byte) 0x02, (byte) 0x7B, (byte) 0x68, (byte) 0x0A,
+ (byte) 0xC8, (byte) 0xB8, (byte) 0x59, (byte) 0x6D,
+ (byte) 0xA5, (byte) 0xA4, (byte) 0xAF, (byte) 0x8A,
+ (byte) 0x19, (byte) 0xA0, (byte) 0x30, (byte) 0x3F,
+ (byte) 0xCA, (byte) 0x97, (byte) 0xFD, (byte) 0x76,
+ (byte) 0x45, (byte) 0x30, (byte) 0x9F, (byte) 0xA2,
+ (byte) 0xA5, (byte) 0x81, (byte) 0x48, (byte) 0x5A,
+ (byte) 0xF6, (byte) 0x26, (byte) 0x3E, (byte) 0x31,
+ (byte) 0x3B, (byte) 0x79, (byte) 0xA2, (byte) 0xF5
+ };
+
+ // G in compressed form / first part of ucompressed
+ public static final byte[] EC283_F2M_G_X = new byte[]{
+ (byte) 0x05, (byte) 0xF9, (byte) 0x39, (byte) 0x25,
+ (byte) 0x8D, (byte) 0xB7, (byte) 0xDD, (byte) 0x90,
+ (byte) 0xE1, (byte) 0x93, (byte) 0x4F, (byte) 0x8C,
+ (byte) 0x70, (byte) 0xB0, (byte) 0xDF, (byte) 0xEC,
+ (byte) 0x2E, (byte) 0xED, (byte) 0x25, (byte) 0xB8,
+ (byte) 0x55, (byte) 0x7E, (byte) 0xAC, (byte) 0x9C,
+ (byte) 0x80, (byte) 0xE2, (byte) 0xE1, (byte) 0x98,
+ (byte) 0xF8, (byte) 0xCD, (byte) 0xBE, (byte) 0xCD,
+ (byte) 0x86, (byte) 0xB1, (byte) 0x20, (byte) 0x53
+ };
+
+ // second part of G uncompressed
+ public static final byte[] EC283_F2M_G_Y = new byte[]{
+ (byte) 0x03, (byte) 0x67, (byte) 0x68, (byte) 0x54,
+ (byte) 0xFE, (byte) 0x24, (byte) 0x14, (byte) 0x1C,
+ (byte) 0xB9, (byte) 0x8F, (byte) 0xE6, (byte) 0xD4,
+ (byte) 0xB2, (byte) 0x0D, (byte) 0x02, (byte) 0xB4,
+ (byte) 0x51, (byte) 0x6F, (byte) 0xF7, (byte) 0x02,
+ (byte) 0x35, (byte) 0x0E, (byte) 0xDD, (byte) 0xB0,
+ (byte) 0x82, (byte) 0x67, (byte) 0x79, (byte) 0xC8,
+ (byte) 0x13, (byte) 0xF0, (byte) 0xDF, (byte) 0x45,
+ (byte) 0xBE, (byte) 0x81, (byte) 0x12, (byte) 0xF4
+ };
+
+ // order of G
+ public static final byte[] EC283_F2M_R = new byte[]{
+ (byte) 0x03, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xEF, (byte) 0x90,
+ (byte) 0x39, (byte) 0x96, (byte) 0x60, (byte) 0xFC,
+ (byte) 0x93, (byte) 0x8A, (byte) 0x90, (byte) 0x16,
+ (byte) 0x5B, (byte) 0x04, (byte) 0x2A, (byte) 0x7C,
+ (byte) 0xEF, (byte) 0xAD, (byte) 0xB3, (byte) 0x07
+ };
+
+ // cofactor of G
+ public static final short EC283_F2M_K = 2;
+
+ //sect409r1 from http://www.secg.org/sec2-v2.pdf
+ // [short i1, short i2, short i3] f = x^409 + x^i1 + 1
+ public static final byte[] EC409_F2M_F = new byte[]{
+ (byte) 0x00, (byte) 0x57
+ };
+
+ public static final byte[] EC409_F2M_A = new byte[]{
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01
+ };
+
+ public static final byte[] EC409_F2M_B = new byte[]{
+ (byte) 0x00, (byte) 0x21, (byte) 0xA5, (byte) 0xC2,
+ (byte) 0xC8, (byte) 0xEE, (byte) 0x9F, (byte) 0xEB,
+ (byte) 0x5C, (byte) 0x4B, (byte) 0x9A, (byte) 0x75,
+ (byte) 0x3B, (byte) 0x7B, (byte) 0x47, (byte) 0x6B,
+ (byte) 0x7F, (byte) 0xD6, (byte) 0x42, (byte) 0x2E,
+ (byte) 0xF1, (byte) 0xF3, (byte) 0xDD, (byte) 0x67,
+ (byte) 0x47, (byte) 0x61, (byte) 0xFA, (byte) 0x99,
+ (byte) 0xD6, (byte) 0xAC, (byte) 0x27, (byte) 0xC8,
+ (byte) 0xA9, (byte) 0xA1, (byte) 0x97, (byte) 0xB2,
+ (byte) 0x72, (byte) 0x82, (byte) 0x2F, (byte) 0x6C,
+ (byte) 0xD5, (byte) 0x7A, (byte) 0x55, (byte) 0xAA,
+ (byte) 0x4F, (byte) 0x50, (byte) 0xAE, (byte) 0x31,
+ (byte) 0x7B, (byte) 0x13, (byte) 0x54, (byte) 0x5F
+ };
+
+ // G in compressed form / first part of ucompressed
+ public static final byte[] EC409_F2M_G_X = new byte[]{
+ (byte) 0x01, (byte) 0x5D, (byte) 0x48, (byte) 0x60,
+ (byte) 0xD0, (byte) 0x88, (byte) 0xDD, (byte) 0xB3,
+ (byte) 0x49, (byte) 0x6B, (byte) 0x0C, (byte) 0x60,
+ (byte) 0x64, (byte) 0x75, (byte) 0x62, (byte) 0x60,
+ (byte) 0x44, (byte) 0x1C, (byte) 0xDE, (byte) 0x4A,
+ (byte) 0xF1, (byte) 0x77, (byte) 0x1D, (byte) 0x4D,
+ (byte) 0xB0, (byte) 0x1F, (byte) 0xFE, (byte) 0x5B,
+ (byte) 0x34, (byte) 0xE5, (byte) 0x97, (byte) 0x03,
+ (byte) 0xDC, (byte) 0x25, (byte) 0x5A, (byte) 0x86,
+ (byte) 0x8A, (byte) 0x11, (byte) 0x80, (byte) 0x51,
+ (byte) 0x56, (byte) 0x03, (byte) 0xAE, (byte) 0xAB,
+ (byte) 0x60, (byte) 0x79, (byte) 0x4E, (byte) 0x54,
+ (byte) 0xBB, (byte) 0x79, (byte) 0x96, (byte) 0xA7
+ };
+
+ // second part of G uncompressed
+ public static final byte[] EC409_F2M_G_Y = new byte[]{
+ (byte) 0x00, (byte) 0x61, (byte) 0xB1, (byte) 0xCF,
+ (byte) 0xAB, (byte) 0x6B, (byte) 0xE5, (byte) 0xF3,
+ (byte) 0x2B, (byte) 0xBF, (byte) 0xA7, (byte) 0x83,
+ (byte) 0x24, (byte) 0xED, (byte) 0x10, (byte) 0x6A,
+ (byte) 0x76, (byte) 0x36, (byte) 0xB9, (byte) 0xC5,
+ (byte) 0xA7, (byte) 0xBD, (byte) 0x19, (byte) 0x8D,
+ (byte) 0x01, (byte) 0x58, (byte) 0xAA, (byte) 0x4F,
+ (byte) 0x54, (byte) 0x88, (byte) 0xD0, (byte) 0x8F,
+ (byte) 0x38, (byte) 0x51, (byte) 0x4F, (byte) 0x1F,
+ (byte) 0xDF, (byte) 0x4B, (byte) 0x4F, (byte) 0x40,
+ (byte) 0xD2, (byte) 0x18, (byte) 0x1B, (byte) 0x36,
+ (byte) 0x81, (byte) 0xC3, (byte) 0x64, (byte) 0xBA,
+ (byte) 0x02, (byte) 0x73, (byte) 0xC7, (byte) 0x06
+ };
+
+ // order of G
+ public static final byte[] EC409_F2M_R = new byte[]{
+ (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0xE2,
+ (byte) 0xAA, (byte) 0xD6, (byte) 0xA6, (byte) 0x12,
+ (byte) 0xF3, (byte) 0x33, (byte) 0x07, (byte) 0xBE,
+ (byte) 0x5F, (byte) 0xA4, (byte) 0x7C, (byte) 0x3C,
+ (byte) 0x9E, (byte) 0x05, (byte) 0x2F, (byte) 0x83,
+ (byte) 0x81, (byte) 0x64, (byte) 0xCD, (byte) 0x37,
+ (byte) 0xD9, (byte) 0xA2, (byte) 0x11, (byte) 0x73
+ };
+
+ // cofactor of G
+ public static final short EC409_F2M_K = 2;
+
+ //sect571r1 from http://www.secg.org/sec2-v2.pdf
+ // [short i1, short i2, short i3] f = x^571 + x^i1 + x^i2 + x^i3 + 1
+ public static final byte[] EC571_F2M_F = new byte[]{
+ (byte) 0x00, (byte) 0x0a,
+ (byte) 0x00, (byte) 0x05,
+ (byte) 0x00, (byte) 0x02,
+ };
+
+ public static final byte[] EC571_F2M_A = new byte[]{
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01
+ };
+
+ public static final byte[] EC571_F2M_B = new byte[]{
+ (byte) 0x02, (byte) 0xF4, (byte) 0x0E, (byte) 0x7E,
+ (byte) 0x22, (byte) 0x21, (byte) 0xF2, (byte) 0x95,
+ (byte) 0xDE, (byte) 0x29, (byte) 0x71, (byte) 0x17,
+ (byte) 0xB7, (byte) 0xF3, (byte) 0xD6, (byte) 0x2F,
+ (byte) 0x5C, (byte) 0x6A, (byte) 0x97, (byte) 0xFF,
+ (byte) 0xCB, (byte) 0x8C, (byte) 0xEF, (byte) 0xF1,
+ (byte) 0xCD, (byte) 0x6B, (byte) 0xA8, (byte) 0xCE,
+ (byte) 0x4A, (byte) 0x9A, (byte) 0x18, (byte) 0xAD,
+ (byte) 0x84, (byte) 0xFF, (byte) 0xAB, (byte) 0xBD,
+ (byte) 0x8E, (byte) 0xFA, (byte) 0x59, (byte) 0x33,
+ (byte) 0x2B, (byte) 0xE7, (byte) 0xAD, (byte) 0x67,
+ (byte) 0x56, (byte) 0xA6, (byte) 0x6E, (byte) 0x29,
+ (byte) 0x4A, (byte) 0xFD, (byte) 0x18, (byte) 0x5A,
+ (byte) 0x78, (byte) 0xFF, (byte) 0x12, (byte) 0xAA,
+ (byte) 0x52, (byte) 0x0E, (byte) 0x4D, (byte) 0xE7,
+ (byte) 0x39, (byte) 0xBA, (byte) 0xCA, (byte) 0x0C,
+ (byte) 0x7F, (byte) 0xFE, (byte) 0xFF, (byte) 0x7F,
+ (byte) 0x29, (byte) 0x55, (byte) 0x72, (byte) 0x7A
+ };
+
+ // G in compressed form / first part of ucompressed
+ public static final byte[] EC571_F2M_G_X = new byte[]{
+ (byte) 0x03, (byte) 0x03, (byte) 0x00, (byte) 0x1D,
+ (byte) 0x34, (byte) 0xB8, (byte) 0x56, (byte) 0x29,
+ (byte) 0x6C, (byte) 0x16, (byte) 0xC0, (byte) 0xD4,
+ (byte) 0x0D, (byte) 0x3C, (byte) 0xD7, (byte) 0x75,
+ (byte) 0x0A, (byte) 0x93, (byte) 0xD1, (byte) 0xD2,
+ (byte) 0x95, (byte) 0x5F, (byte) 0xA8, (byte) 0x0A,
+ (byte) 0xA5, (byte) 0xF4, (byte) 0x0F, (byte) 0xC8,
+ (byte) 0xDB, (byte) 0x7B, (byte) 0x2A, (byte) 0xBD,
+ (byte) 0xBD, (byte) 0xE5, (byte) 0x39, (byte) 0x50,
+ (byte) 0xF4, (byte) 0xC0, (byte) 0xD2, (byte) 0x93,
+ (byte) 0xCD, (byte) 0xD7, (byte) 0x11, (byte) 0xA3,
+ (byte) 0x5B, (byte) 0x67, (byte) 0xFB, (byte) 0x14,
+ (byte) 0x99, (byte) 0xAE, (byte) 0x60, (byte) 0x03,
+ (byte) 0x86, (byte) 0x14, (byte) 0xF1, (byte) 0x39,
+ (byte) 0x4A, (byte) 0xBF, (byte) 0xA3, (byte) 0xB4,
+ (byte) 0xC8, (byte) 0x50, (byte) 0xD9, (byte) 0x27,
+ (byte) 0xE1, (byte) 0xE7, (byte) 0x76, (byte) 0x9C,
+ (byte) 0x8E, (byte) 0xEC, (byte) 0x2D, (byte) 0x19
+ };
+
+ // second part of G uncompressed
+ public static final byte[] EC571_F2M_G_Y = new byte[]{
+ (byte) 0x03, (byte) 0x7B, (byte) 0xF2, (byte) 0x73,
+ (byte) 0x42, (byte) 0xDA, (byte) 0x63, (byte) 0x9B,
+ (byte) 0x6D, (byte) 0xCC, (byte) 0xFF, (byte) 0xFE,
+ (byte) 0xB7, (byte) 0x3D, (byte) 0x69, (byte) 0xD7,
+ (byte) 0x8C, (byte) 0x6C, (byte) 0x27, (byte) 0xA6,
+ (byte) 0x00, (byte) 0x9C, (byte) 0xBB, (byte) 0xCA,
+ (byte) 0x19, (byte) 0x80, (byte) 0xF8, (byte) 0x53,
+ (byte) 0x39, (byte) 0x21, (byte) 0xE8, (byte) 0xA6,
+ (byte) 0x84, (byte) 0x42, (byte) 0x3E, (byte) 0x43,
+ (byte) 0xBA, (byte) 0xB0, (byte) 0x8A, (byte) 0x57,
+ (byte) 0x62, (byte) 0x91, (byte) 0xAF, (byte) 0x8F,
+ (byte) 0x46, (byte) 0x1B, (byte) 0xB2, (byte) 0xA8,
+ (byte) 0xB3, (byte) 0x53, (byte) 0x1D, (byte) 0x2F,
+ (byte) 0x04, (byte) 0x85, (byte) 0xC1, (byte) 0x9B,
+ (byte) 0x16, (byte) 0xE2, (byte) 0xF1, (byte) 0x51,
+ (byte) 0x6E, (byte) 0x23, (byte) 0xDD, (byte) 0x3C,
+ (byte) 0x1A, (byte) 0x48, (byte) 0x27, (byte) 0xAF,
+ (byte) 0x1B, (byte) 0x8A, (byte) 0xC1, (byte) 0x5B
+ };
+
+ // order of G
+ public static final byte[] EC571_F2M_R = new byte[]{
+ (byte) 0x03, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
+ (byte) 0xE6, (byte) 0x61, (byte) 0xCE, (byte) 0x18,
+ (byte) 0xFF, (byte) 0x55, (byte) 0x98, (byte) 0x73,
+ (byte) 0x08, (byte) 0x05, (byte) 0x9B, (byte) 0x18,
+ (byte) 0x68, (byte) 0x23, (byte) 0x85, (byte) 0x1E,
+ (byte) 0xC7, (byte) 0xDD, (byte) 0x9C, (byte) 0xA1,
+ (byte) 0x16, (byte) 0x1D, (byte) 0xE9, (byte) 0x3D,
+ (byte) 0x51, (byte) 0x74, (byte) 0xD6, (byte) 0x6E,
+ (byte) 0x83, (byte) 0x82, (byte) 0xE9, (byte) 0xBB,
+ (byte) 0x2F, (byte) 0xE8, (byte) 0x4E, (byte) 0x47
+ };
+
+ // cofactor of G
+ public static final short EC571_F2M_K = 2;
+
+
+ // transformParameter TRANSFORMATION types
+ public static final short TRANSFORMATION_NONE = (short) 0x00;
+ public static final short TRANSFORMATION_FIXED = (short) 0x01;
+ public static final short TRANSFORMATION_FULLRANDOM = (short) 0x02;
+ public static final short TRANSFORMATION_ONEBYTERANDOM = (short) 0x04;
+ public static final short TRANSFORMATION_ZERO = (short) 0x08;
+ public static final short TRANSFORMATION_ONE = (short) 0x10;
+ public static final short TRANSFORMATION_MAX = (short) 0x20;
+ public static final short TRANSFORMATION_INCREMENT = (short) 0x40;
+ public static final short TRANSFORMATION_INFINITY = (short) 0x80;
+ public static final short TRANSFORMATION_COMPRESS = (short) 0x0100;
+ public static final short TRANSFORMATION_COMPRESS_HYBRID = (short) 0x0200;
+ public static final short TRANSFORMATION_04_MASK = (short) 0x0400;
+
+ // toX962 FORM types
+ public static final byte X962_UNCOMPRESSED = (byte) 0x00;
+ public static final byte X962_COMPRESSED = (byte) 0x01;
+ public static final byte X962_HYBRID = (byte) 0x02;
+
+ // Supported embedded curves, getCurveParameter
+ public static final byte CURVE_default = (byte) 0;
+ public static final byte CURVE_external = (byte) 0xff;
+
+ // SECG recommended curves over FP
+ public static final byte CURVE_secp112r1 = (byte) 1;
+ public static final byte CURVE_secp128r1 = (byte) 2;
+ public static final byte CURVE_secp160r1 = (byte) 3;
+ public static final byte CURVE_secp192r1 = (byte) 4;
+ public static final byte CURVE_secp224r1 = (byte) 5;
+ public static final byte CURVE_secp256r1 = (byte) 6;
+ public static final byte CURVE_secp384r1 = (byte) 7;
+ public static final byte CURVE_secp521r1 = (byte) 8;
+
+ public static final byte FP_CURVES = (byte) 8;
+
+ // SECG recommended curves over F2M
+ public static final byte CURVE_sect163r1 = (byte) 9;
+ public static final byte CURVE_sect233r1 = (byte) 10;
+ public static final byte CURVE_sect283r1 = (byte) 11;
+ public static final byte CURVE_sect409r1 = (byte) 12;
+ public static final byte CURVE_sect571r1 = (byte) 13;
+
+ public static final byte F2M_CURVES = (byte) 13;
+
+ public static final short[] FP_SIZES = new short[]{112, 128, 160, 192, 224, 256, 384, 521};
+ public static final short[] F2M_SIZES = new short[]{163, 233, 283, 409, 571};
+
+ public static final byte ALG_EC_F2M = 4;
+ public static final byte ALG_EC_FP = 5;
+
+ // Class javacard.security.KeyAgreement
+ // javacard.security.KeyAgreement Fields:
+ public static final byte KeyAgreement_ALG_EC_SVDP_DH = 1;
+ public static final byte KeyAgreement_ALG_EC_SVDP_DH_KDF = 1;
+ public static final byte KeyAgreement_ALG_EC_SVDP_DHC = 2;
+ public static final byte KeyAgreement_ALG_EC_SVDP_DHC_KDF = 2;
+ public static final byte KeyAgreement_ALG_EC_SVDP_DH_PLAIN = 3;
+ public static final byte KeyAgreement_ALG_EC_SVDP_DHC_PLAIN = 4;
+ public static final byte KeyAgreement_ALG_EC_PACE_GM = 5;
+ public static final byte KeyAgreement_ALG_EC_SVDP_DH_PLAIN_XY = 6;
+
+ public static final byte[] KA_TYPES = new byte[]{
+ KeyAgreement_ALG_EC_SVDP_DH,
+ //KeyAgreement_ALG_EC_SVDP_DH_KDF, //duplicate
+ KeyAgreement_ALG_EC_SVDP_DHC,
+ //KeyAgreement_ALG_EC_SVDP_DHC_KDF, //duplicate
+ KeyAgreement_ALG_EC_SVDP_DH_PLAIN,
+ KeyAgreement_ALG_EC_SVDP_DHC_PLAIN,
+ KeyAgreement_ALG_EC_PACE_GM,
+ KeyAgreement_ALG_EC_SVDP_DH_PLAIN_XY
+ };
+
+ // Class javacard.security.Signature
+ // javacard.security.Signature Fields:
+ public static final byte Signature_ALG_ECDSA_SHA = 17;
+ public static final byte Signature_ALG_ECDSA_SHA_224 = 37;
+ public static final byte Signature_ALG_ECDSA_SHA_256 = 33;
+ public static final byte Signature_ALG_ECDSA_SHA_384 = 34;
+ public static final byte Signature_ALG_ECDSA_SHA_512 = 38;
+
+ public static final byte[] SIG_TYPES = new byte[]{
+ Signature_ALG_ECDSA_SHA,
+ Signature_ALG_ECDSA_SHA_224,
+ Signature_ALG_ECDSA_SHA_256,
+ Signature_ALG_ECDSA_SHA_384,
+ Signature_ALG_ECDSA_SHA_512
+ };
+
+ public static byte getCurve(short keyLength, byte keyClass) {
+ if (keyClass == ALG_EC_FP) {
+ switch (keyLength) {
+ case (short) 112:
+ return CURVE_secp112r1;
+ case (short) 128:
+ return CURVE_secp128r1;
+ case (short) 160:
+ return CURVE_secp160r1;
+ case (short) 192:
+ return CURVE_secp192r1;
+ case (short) 224:
+ return CURVE_secp224r1;
+ case (short) 256:
+ return CURVE_secp256r1;
+ case (short) 384:
+ return CURVE_secp384r1;
+ case (short) 521:
+ return CURVE_secp521r1;
+ default:
+ throw new IllegalArgumentException("Unsupported keyLength and keyClass.");
+ }
+ } else if (keyClass == ALG_EC_F2M) {
+ switch (keyLength) {
+ case (short) 163:
+ return CURVE_sect163r1;
+ case (short) 233:
+ return CURVE_sect233r1;
+ case (short) 283:
+ return CURVE_sect283r1;
+ case (short) 409:
+ return CURVE_sect409r1;
+ case (short) 571:
+ return CURVE_sect571r1;
+ default:
+ throw new IllegalArgumentException("Unsupported keyLength and keyClass.");
+ }
+ } else {
+ throw new IllegalArgumentException("Unsupported keyClass.");
+ }
+ }
+
+ public static byte[] getCurveParameter(byte curve, short param) {
+ byte alg = getCurveType(curve);
+ switch (curve) {
+ case CURVE_secp112r1: {
+ EC_FP_P = EC112_FP_P;
+ EC_A = EC112_FP_A;
+ EC_B = EC112_FP_B;
+ EC_G_X = EC112_FP_G_X;
+ EC_G_Y = EC112_FP_G_Y;
+ EC_R = EC112_FP_R;
+ EC_K = EC112_FP_K;
+ EC_W_X = null;
+ EC_W_Y = null;
+ EC_S = null;
+ break;
+ }
+ case CURVE_secp128r1: {
+ EC_FP_P = EC128_FP_P;
+ EC_A = EC128_FP_A;
+ EC_B = EC128_FP_B;
+ EC_G_X = EC128_FP_G_X;
+ EC_G_Y = EC128_FP_G_Y;
+ EC_R = EC128_FP_R;
+ EC_K = EC128_FP_K;
+ EC_W_X = null;
+ EC_W_Y = null;
+ EC_S = null;
+ break;
+ }
+ case CURVE_secp160r1: {
+ EC_FP_P = EC160_FP_P;
+ EC_A = EC160_FP_A;
+ EC_B = EC160_FP_B;
+ EC_G_X = EC160_FP_G_X;
+ EC_G_Y = EC160_FP_G_Y;
+ EC_R = EC160_FP_R;
+ EC_K = EC160_FP_K;
+ EC_W_X = null;
+ EC_W_Y = null;
+ EC_S = null;
+ break;
+ }
+ case CURVE_secp192r1: {
+ EC_FP_P = EC192_FP_P;
+ EC_A = EC192_FP_A;
+ EC_B = EC192_FP_B;
+ EC_G_X = EC192_FP_G_X;
+ EC_G_Y = EC192_FP_G_Y;
+ EC_R = EC192_FP_R;
+ EC_K = EC192_FP_K;
+ EC_W_X = null;
+ EC_W_Y = null;
+ EC_S = null;
+ break;
+ }
+ case CURVE_secp224r1: {
+ EC_FP_P = EC224_FP_P;
+ EC_A = EC224_FP_A;
+ EC_B = EC224_FP_B;
+ EC_G_X = EC224_FP_G_X;
+ EC_G_Y = EC224_FP_G_Y;
+ EC_R = EC224_FP_R;
+ EC_K = EC224_FP_K;
+ EC_S = null;
+ break;
+ }
+ case CURVE_secp256r1: {
+ EC_FP_P = EC256_FP_P;
+ EC_A = EC256_FP_A;
+ EC_B = EC256_FP_B;
+ EC_G_X = EC256_FP_G_X;
+ EC_G_Y = EC256_FP_G_Y;
+ EC_R = EC256_FP_R;
+ EC_K = EC256_FP_K;
+ EC_W_X = null;
+ EC_W_Y = null;
+ EC_S = null;
+ break;
+ }
+ case CURVE_secp384r1: {
+ EC_FP_P = EC384_FP_P;
+ EC_A = EC384_FP_A;
+ EC_B = EC384_FP_B;
+ EC_G_X = EC384_FP_G_X;
+ EC_G_Y = EC384_FP_G_Y;
+ EC_R = EC384_FP_R;
+ EC_K = EC384_FP_K;
+ EC_W_X = null;
+ EC_W_Y = null;
+ EC_S = null;
+ break;
+ }
+ case CURVE_secp521r1: {
+ EC_FP_P = EC521_FP_P;
+ EC_A = EC521_FP_A;
+ EC_B = EC521_FP_B;
+ EC_G_X = EC521_FP_G_X;
+ EC_G_Y = EC521_FP_G_Y;
+ EC_R = EC521_FP_R;
+ EC_K = EC521_FP_K;
+ EC_W_X = null;
+ EC_W_Y = null;
+ EC_S = null;
+ break;
+ }
+ case CURVE_sect163r1: {
+ EC_F2M_F2M = EC163_F2M_F;
+ EC_A = EC163_F2M_A;
+ EC_B = EC163_F2M_B;
+ EC_G_X = EC163_F2M_G_X;
+ EC_G_Y = EC163_F2M_G_Y;
+ EC_R = EC163_F2M_R;
+ EC_K = EC163_F2M_K;
+ EC_W_X = null;
+ EC_W_Y = null;
+ EC_S = null;
+ break;
+ }
+ case CURVE_sect233r1: {
+ EC_F2M_F2M = EC233_F2M_F;
+ EC_A = EC233_F2M_A;
+ EC_B = EC233_F2M_B;
+ EC_G_X = EC233_F2M_G_X;
+ EC_G_Y = EC233_F2M_G_Y;
+ EC_R = EC233_F2M_R;
+ EC_K = EC233_F2M_K;
+ EC_W_X = null;
+ EC_W_Y = null;
+ EC_S = null;
+ break;
+ }
+ case CURVE_sect283r1: {
+ EC_F2M_F2M = EC283_F2M_F;
+ EC_A = EC283_F2M_A;
+ EC_B = EC283_F2M_B;
+ EC_G_X = EC283_F2M_G_X;
+ EC_G_Y = EC283_F2M_G_Y;
+ EC_R = EC283_F2M_R;
+ EC_K = EC283_F2M_K;
+ EC_W_X = null;
+ EC_W_Y = null;
+ EC_S = null;
+ break;
+ }
+ case CURVE_sect409r1: {
+ EC_F2M_F2M = EC409_F2M_F;
+ EC_A = EC409_F2M_A;
+ EC_B = EC409_F2M_B;
+ EC_G_X = EC409_F2M_G_X;
+ EC_G_Y = EC409_F2M_G_Y;
+ EC_R = EC409_F2M_R;
+ EC_K = EC409_F2M_K;
+ EC_W_X = null;
+ EC_W_Y = null;
+ EC_S = null;
+ break;
+ }
+ case CURVE_sect571r1: {
+ EC_F2M_F2M = EC571_F2M_F;
+ EC_A = EC571_F2M_A;
+ EC_B = EC571_F2M_B;
+ EC_G_X = EC571_F2M_G_X;
+ EC_G_Y = EC571_F2M_G_Y;
+ EC_R = EC571_F2M_R;
+ EC_K = EC571_F2M_K;
+ EC_W_X = null;
+ EC_W_Y = null;
+ EC_S = null;
+ break;
+ }
+ default:
+ throw new IllegalArgumentException("Unknown curve.");
+ }
+ switch (param) {
+ case PARAMETER_FP:
+ if (alg == ALG_EC_FP) {
+ return EC_FP_P.clone();
+ }
+ break;
+ case PARAMETER_F2M:
+ if (alg == ALG_EC_F2M) {
+ return EC_F2M_F2M.clone();
+ }
+ break;
+ case PARAMETER_A:
+ return EC_A.clone();
+ case PARAMETER_B:
+ return EC_B.clone();
+ case PARAMETER_G:
+ return toX962(X962_UNCOMPRESSED, EC_G_X, EC_G_Y);
+ case PARAMETER_R:
+ return EC_R.clone();
+ case PARAMETER_K:
+ return ByteUtil.shortToBytes(EC_K);
+ case PARAMETER_W:
+ if (EC_W_X == null || EC_W_Y == null) {
+ return null;
+ }
+ return toX962(X962_UNCOMPRESSED, EC_W_X, EC_W_Y);
+ case PARAMETER_S:
+ if (EC_S == null) {
+ return null;
+ }
+ return EC_S.clone();
+ default:
+ throw new IllegalArgumentException("Unknown parameter");
+ }
+ return null;
+ }
+
+ public static byte getCurveType(byte curve) {
+ return curve <= FP_CURVES ? ALG_EC_FP : ALG_EC_F2M;
+ }
+
+ public static byte[] toX962(byte form, byte[] xBuffer, byte[] yBuffer) {
+ ByteBuffer bb = ByteBuffer.allocate(xBuffer.length + yBuffer.length + 1);
+ byte yLSB = yBuffer[yBuffer.length - 1];
+ byte yBit = (byte) (yLSB & 0x01);
+
+ switch (form) {
+ case X962_UNCOMPRESSED:
+ bb.put((byte) 4);
+ break;
+ case X962_HYBRID:
+ if (yBit == 1) {
+ bb.put((byte) 7);
+ } else {
+ bb.put((byte) 6);
+ }
+ break;
+ case X962_COMPRESSED:
+ if (yBit == 1) {
+ bb.put((byte) 3);
+ } else {
+ bb.put((byte) 2);
+ }
+ break;
+ default:
+ throw new IllegalArgumentException("Unsupported form.");
+ }
+ bb.put(xBuffer);
+ if (form == X962_HYBRID || form == X962_UNCOMPRESSED) {
+ bb.put(yBuffer);
+ }
+ return bb.array();
+ }
+
+}
diff --git a/src/cz/crcs/ectester/common/ec/EC_Curve.java b/common/src/main/java/cz/crcs/ectester/common/ec/EC_Curve.java
index d188551..e26fc44 100644
--- a/src/cz/crcs/ectester/common/ec/EC_Curve.java
+++ b/common/src/main/java/cz/crcs/ectester/common/ec/EC_Curve.java
@@ -1,8 +1,6 @@
package cz.crcs.ectester.common.ec;
-import cz.crcs.ectester.applet.EC_Consts;
import cz.crcs.ectester.common.util.ByteUtil;
-import javacard.security.KeyPair;
import org.bouncycastle.math.ec.ECCurve;
import java.math.BigInteger;
@@ -20,10 +18,10 @@ public class EC_Curve extends EC_Params {
/**
* @param bits
- * @param field KeyPair.ALG_EC_FP or KeyPair.ALG_EC_F2M
+ * @param field EC_Consts.ALG_EC_FP or EC_Consts.ALG_EC_F2M
*/
public EC_Curve(short bits, byte field) {
- super(field == KeyPair.ALG_EC_FP ? EC_Consts.PARAMETERS_DOMAIN_FP : EC_Consts.PARAMETERS_DOMAIN_F2M);
+ super(field == EC_Consts.ALG_EC_FP ? EC_Consts.PARAMETERS_DOMAIN_FP : EC_Consts.PARAMETERS_DOMAIN_F2M);
this.bits = bits;
this.field = field;
}
@@ -52,12 +50,12 @@ public class EC_Curve extends EC_Params {
@Override
public String toString() {
- return "<" + getId() + "> " + (field == KeyPair.ALG_EC_FP ? "Prime" : "Binary") + " field Elliptic curve (" + String.valueOf(bits) + "b)" + (desc == null ? "" : ": " + desc) + System.lineSeparator() + super.toString();
+ return "<" + getId() + "> " + (field == EC_Consts.ALG_EC_FP ? "Prime" : "Binary") + " field Elliptic curve (" + String.valueOf(bits) + "b)" + (desc == null ? "" : ": " + desc) + System.lineSeparator() + super.toString();
}
public EllipticCurve toCurve() {
ECField field;
- if (this.field == KeyPair.ALG_EC_FP) {
+ if (this.field == EC_Consts.ALG_EC_FP) {
field = new ECFieldFp(new BigInteger(1, getData(0)));
} else {
byte[][] fieldData = getParam(EC_Consts.PARAMETER_F2M);
@@ -81,7 +79,7 @@ public class EC_Curve extends EC_Params {
}
public ECCurve toBCCurve() {
- if (this.field == KeyPair.ALG_EC_FP) {
+ if (this.field == EC_Consts.ALG_EC_FP) {
BigInteger p = new BigInteger(1, getParam(EC_Consts.PARAMETER_FP)[0]);
BigInteger a = new BigInteger(1, getParam(EC_Consts.PARAMETER_A)[0]);
BigInteger b = new BigInteger(1, getParam(EC_Consts.PARAMETER_B)[0]);
@@ -128,7 +126,7 @@ public class EC_Curve extends EC_Params {
ECFieldFp primeField = (ECFieldFp) field;
params = new byte[7][];
params[paramIndex++] = primeField.getP().toByteArray();
- fieldType = KeyPair.ALG_EC_FP;
+ fieldType = EC_Consts.ALG_EC_FP;
} else if (field instanceof ECFieldF2m) {
ECFieldF2m binaryField = (ECFieldF2m) field;
params = new byte[10][];
@@ -140,7 +138,7 @@ public class EC_Curve extends EC_Params {
short power = (i < powers.length) ? (short) powers[i] : 0;
ByteUtil.setShort(params[paramIndex++], 0, power);
}
- fieldType = KeyPair.ALG_EC_F2M;
+ fieldType = EC_Consts.ALG_EC_F2M;
} else {
throw new IllegalArgumentException("ECParameterSpec with an unknown field.");
}
diff --git a/src/cz/crcs/ectester/common/ec/EC_Data.java b/common/src/main/java/cz/crcs/ectester/common/ec/EC_Data.java
index 14ae1c5..14ae1c5 100644
--- a/src/cz/crcs/ectester/common/ec/EC_Data.java
+++ b/common/src/main/java/cz/crcs/ectester/common/ec/EC_Data.java
diff --git a/src/cz/crcs/ectester/common/ec/EC_KAResult.java b/common/src/main/java/cz/crcs/ectester/common/ec/EC_KAResult.java
index 4e97950..4e97950 100644
--- a/src/cz/crcs/ectester/common/ec/EC_KAResult.java
+++ b/common/src/main/java/cz/crcs/ectester/common/ec/EC_KAResult.java
diff --git a/src/cz/crcs/ectester/common/ec/EC_Key.java b/common/src/main/java/cz/crcs/ectester/common/ec/EC_Key.java
index 754775d..a9f0c40 100644
--- a/src/cz/crcs/ectester/common/ec/EC_Key.java
+++ b/common/src/main/java/cz/crcs/ectester/common/ec/EC_Key.java
@@ -1,7 +1,5 @@
package cz.crcs.ectester.common.ec;
-import cz.crcs.ectester.applet.EC_Consts;
-
/**
* An abstract-like EC key. Concrete implementations create a public and private keys.
*
diff --git a/src/cz/crcs/ectester/common/ec/EC_Keypair.java b/common/src/main/java/cz/crcs/ectester/common/ec/EC_Keypair.java
index 24ddba7..b1a0cbc 100644
--- a/src/cz/crcs/ectester/common/ec/EC_Keypair.java
+++ b/common/src/main/java/cz/crcs/ectester/common/ec/EC_Keypair.java
@@ -1,7 +1,5 @@
package cz.crcs.ectester.common.ec;
-import cz.crcs.ectester.applet.EC_Consts;
-
/**
* An EC keypair, contains both the W and S parameters.
*
diff --git a/src/cz/crcs/ectester/common/ec/EC_Params.java b/common/src/main/java/cz/crcs/ectester/common/ec/EC_Params.java
index e922feb..146c8d6 100644
--- a/src/cz/crcs/ectester/common/ec/EC_Params.java
+++ b/common/src/main/java/cz/crcs/ectester/common/ec/EC_Params.java
@@ -1,6 +1,5 @@
package cz.crcs.ectester.common.ec;
-import cz.crcs.ectester.applet.EC_Consts;
import cz.crcs.ectester.common.util.ByteUtil;
import java.io.ByteArrayOutputStream;
diff --git a/src/cz/crcs/ectester/common/ec/EC_SigResult.java b/common/src/main/java/cz/crcs/ectester/common/ec/EC_SigResult.java
index d97ced1..d97ced1 100644
--- a/src/cz/crcs/ectester/common/ec/EC_SigResult.java
+++ b/common/src/main/java/cz/crcs/ectester/common/ec/EC_SigResult.java
diff --git a/src/cz/crcs/ectester/common/ec/RawECPrivateKey.java b/common/src/main/java/cz/crcs/ectester/common/ec/RawECPrivateKey.java
index 479118f..479118f 100644
--- a/src/cz/crcs/ectester/common/ec/RawECPrivateKey.java
+++ b/common/src/main/java/cz/crcs/ectester/common/ec/RawECPrivateKey.java
diff --git a/src/cz/crcs/ectester/common/ec/RawECPublicKey.java b/common/src/main/java/cz/crcs/ectester/common/ec/RawECPublicKey.java
index 7888854..7888854 100644
--- a/src/cz/crcs/ectester/common/ec/RawECPublicKey.java
+++ b/common/src/main/java/cz/crcs/ectester/common/ec/RawECPublicKey.java
diff --git a/common/src/main/java/cz/crcs/ectester/common/output/BaseFileTestWriter.java b/common/src/main/java/cz/crcs/ectester/common/output/BaseFileTestWriter.java
new file mode 100644
index 0000000..9050e87
--- /dev/null
+++ b/common/src/main/java/cz/crcs/ectester/common/output/BaseFileTestWriter.java
@@ -0,0 +1,30 @@
+package cz.crcs.ectester.common.output;
+
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.PrintStream;
+import java.util.LinkedList;
+import java.util.List;
+
+public abstract class BaseFileTestWriter extends TeeTestWriter {
+
+ public BaseFileTestWriter(String defaultFormat, boolean systemOut, String[] files) throws ParserConfigurationException, FileNotFoundException {
+ int fLength = files == null ? 0 : files.length;
+ List<TestWriter> lWriters = new LinkedList<>();
+ if (systemOut) {
+ lWriters.add(createWriter(defaultFormat, System.out));
+ }
+ for (int i = 0; i < fLength; ++i) {
+ String[] matched = matchName(files[i]);
+ String format = matched[0];
+ String fName = matched[1];
+ lWriters.add(createWriter(format, new PrintStream(new FileOutputStream(fName))));
+ }
+ writers = lWriters.toArray(new TestWriter[0]);
+ }
+
+ protected abstract String[] matchName(String name);
+
+ protected abstract TestWriter createWriter(String format, PrintStream out) throws ParserConfigurationException;
+}
diff --git a/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java b/common/src/main/java/cz/crcs/ectester/common/output/BaseTextTestWriter.java
index 5c449db..5c449db 100644
--- a/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java
+++ b/common/src/main/java/cz/crcs/ectester/common/output/BaseTextTestWriter.java
diff --git a/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java b/common/src/main/java/cz/crcs/ectester/common/output/BaseXMLTestWriter.java
index 53970dd..53970dd 100644
--- a/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java
+++ b/common/src/main/java/cz/crcs/ectester/common/output/BaseXMLTestWriter.java
diff --git a/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java b/common/src/main/java/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java
index e054563..e054563 100644
--- a/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java
+++ b/common/src/main/java/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java
diff --git a/src/cz/crcs/ectester/common/output/OutputLogger.java b/common/src/main/java/cz/crcs/ectester/common/output/OutputLogger.java
index effd1fd..effd1fd 100644
--- a/src/cz/crcs/ectester/common/output/OutputLogger.java
+++ b/common/src/main/java/cz/crcs/ectester/common/output/OutputLogger.java
diff --git a/src/cz/crcs/ectester/common/output/TeeOutputStream.java b/common/src/main/java/cz/crcs/ectester/common/output/TeeOutputStream.java
index 2401fce..2401fce 100644
--- a/src/cz/crcs/ectester/common/output/TeeOutputStream.java
+++ b/common/src/main/java/cz/crcs/ectester/common/output/TeeOutputStream.java
diff --git a/src/cz/crcs/ectester/common/output/TeeTestWriter.java b/common/src/main/java/cz/crcs/ectester/common/output/TeeTestWriter.java
index 58a0a15..58a0a15 100644
--- a/src/cz/crcs/ectester/common/output/TeeTestWriter.java
+++ b/common/src/main/java/cz/crcs/ectester/common/output/TeeTestWriter.java
diff --git a/src/cz/crcs/ectester/common/output/TestWriter.java b/common/src/main/java/cz/crcs/ectester/common/output/TestWriter.java
index 67aeccb..67aeccb 100644
--- a/src/cz/crcs/ectester/common/output/TestWriter.java
+++ b/common/src/main/java/cz/crcs/ectester/common/output/TestWriter.java
diff --git a/src/cz/crcs/ectester/common/test/BaseTestable.java b/common/src/main/java/cz/crcs/ectester/common/test/BaseTestable.java
index 3c304d9..3c304d9 100644
--- a/src/cz/crcs/ectester/common/test/BaseTestable.java
+++ b/common/src/main/java/cz/crcs/ectester/common/test/BaseTestable.java
diff --git a/src/cz/crcs/ectester/common/test/CompoundTest.java b/common/src/main/java/cz/crcs/ectester/common/test/CompoundTest.java
index ba4ad4f..ba4ad4f 100644
--- a/src/cz/crcs/ectester/common/test/CompoundTest.java
+++ b/common/src/main/java/cz/crcs/ectester/common/test/CompoundTest.java
diff --git a/src/cz/crcs/ectester/common/test/Result.java b/common/src/main/java/cz/crcs/ectester/common/test/Result.java
index f065f9c..f065f9c 100644
--- a/src/cz/crcs/ectester/common/test/Result.java
+++ b/common/src/main/java/cz/crcs/ectester/common/test/Result.java
diff --git a/src/cz/crcs/ectester/common/test/SimpleTest.java b/common/src/main/java/cz/crcs/ectester/common/test/SimpleTest.java
index d2b3e94..d2b3e94 100644
--- a/src/cz/crcs/ectester/common/test/SimpleTest.java
+++ b/common/src/main/java/cz/crcs/ectester/common/test/SimpleTest.java
diff --git a/src/cz/crcs/ectester/common/test/Test.java b/common/src/main/java/cz/crcs/ectester/common/test/Test.java
index 8bf9502..8bf9502 100644
--- a/src/cz/crcs/ectester/common/test/Test.java
+++ b/common/src/main/java/cz/crcs/ectester/common/test/Test.java
diff --git a/src/cz/crcs/ectester/common/test/TestCallback.java b/common/src/main/java/cz/crcs/ectester/common/test/TestCallback.java
index c5a49f3..c5a49f3 100644
--- a/src/cz/crcs/ectester/common/test/TestCallback.java
+++ b/common/src/main/java/cz/crcs/ectester/common/test/TestCallback.java
diff --git a/src/cz/crcs/ectester/common/test/TestException.java b/common/src/main/java/cz/crcs/ectester/common/test/TestException.java
index 0b605eb..0b605eb 100644
--- a/src/cz/crcs/ectester/common/test/TestException.java
+++ b/common/src/main/java/cz/crcs/ectester/common/test/TestException.java
diff --git a/src/cz/crcs/ectester/common/test/TestSuite.java b/common/src/main/java/cz/crcs/ectester/common/test/TestSuite.java
index b12680a..b12680a 100644
--- a/src/cz/crcs/ectester/common/test/TestSuite.java
+++ b/common/src/main/java/cz/crcs/ectester/common/test/TestSuite.java
diff --git a/src/cz/crcs/ectester/common/test/TestSuiteException.java b/common/src/main/java/cz/crcs/ectester/common/test/TestSuiteException.java
index 2d1ea09..2d1ea09 100644
--- a/src/cz/crcs/ectester/common/test/TestSuiteException.java
+++ b/common/src/main/java/cz/crcs/ectester/common/test/TestSuiteException.java
diff --git a/src/cz/crcs/ectester/common/test/Testable.java b/common/src/main/java/cz/crcs/ectester/common/test/Testable.java
index 7b4545c..7b4545c 100644
--- a/src/cz/crcs/ectester/common/test/Testable.java
+++ b/common/src/main/java/cz/crcs/ectester/common/test/Testable.java
diff --git a/src/cz/crcs/ectester/common/util/ByteUtil.java b/common/src/main/java/cz/crcs/ectester/common/util/ByteUtil.java
index 442824a..442824a 100644
--- a/src/cz/crcs/ectester/common/util/ByteUtil.java
+++ b/common/src/main/java/cz/crcs/ectester/common/util/ByteUtil.java
diff --git a/common/src/main/java/cz/crcs/ectester/common/util/CardConsts.java b/common/src/main/java/cz/crcs/ectester/common/util/CardConsts.java
new file mode 100644
index 0000000..1483346
--- /dev/null
+++ b/common/src/main/java/cz/crcs/ectester/common/util/CardConsts.java
@@ -0,0 +1,65 @@
+package cz.crcs.ectester.common.util;
+
+public class CardConsts {
+ // MAIN INSTRUCTION CLASS
+ public static final byte CLA_ECTESTERAPPLET = (byte) 0xB0;
+
+ // INSTRUCTIONS
+ public static final byte INS_ALLOCATE = (byte) 0x5a;
+ public static final byte INS_CLEAR = (byte) 0x5b;
+ public static final byte INS_SET = (byte) 0x5c;
+ public static final byte INS_TRANSFORM = (byte) 0x5d;
+ public static final byte INS_GENERATE = (byte) 0x5e;
+ public static final byte INS_EXPORT = (byte) 0x5f;
+ public static final byte INS_ECDH = (byte) 0x70;
+ public static final byte INS_ECDH_DIRECT = (byte) 0x71;
+ public static final byte INS_ECDSA = (byte) 0x72;
+ public static final byte INS_ECDSA_SIGN = (byte) 0x73;
+ public static final byte INS_ECDSA_VERIFY = (byte) 0x74;
+ public static final byte INS_CLEANUP = (byte) 0x75;
+ public static final byte INS_ALLOCATE_KA = (byte) 0x76;
+ public static final byte INS_ALLOCATE_SIG = (byte) 0x77;
+ public static final byte INS_GET_INFO = (byte) 0x78;
+ public static final byte INS_SET_DRY_RUN_MODE = (byte) 0x79;
+ public static final byte INS_BUFFER = (byte) 0x7a;
+ public static final byte INS_PERFORM = (byte) 0x7b;
+
+ // PARAMETERS for P1 and P2
+ public static final byte KEYPAIR_LOCAL = (byte) 0x01;
+ public static final byte KEYPAIR_REMOTE = (byte) 0x02;
+ public static final byte KEYPAIR_BOTH = KEYPAIR_LOCAL | KEYPAIR_REMOTE;
+ public static final byte BUILD_KEYPAIR = (byte) 0x01;
+ public static final byte BUILD_KEYBUILDER = (byte) 0x02;
+ public static final byte EXPORT_TRUE = (byte) 0xff;
+ public static final byte EXPORT_FALSE = (byte) 0x00;
+ public static final byte MODE_NORMAL = (byte) 0xaa;
+ public static final byte MODE_DRY_RUN = (byte) 0xbb;
+
+ // STATUS WORDS
+ public static final short SW_SIG_VERIFY_FAIL = (short) 0x0ee1;
+ public static final short SW_DH_DHC_MISMATCH = (short) 0x0ee2;
+ public static final short SW_KEYPAIR_NULL = (short) 0x0ee3;
+ public static final short SW_KA_NULL = (short) 0x0ee4;
+ public static final short SW_SIGNATURE_NULL = (short) 0x0ee5;
+ public static final short SW_OBJECT_NULL = (short) 0x0ee6;
+ public static final short SW_CANNOT_FIT = (short) 0x0ee7;
+ public static final short SW_Exception = (short) 0xff01;
+ public static final short SW_ArrayIndexOutOfBoundsException = (short) 0xff02;
+ public static final short SW_ArithmeticException = (short) 0xff03;
+ public static final short SW_ArrayStoreException = (short) 0xff04;
+ public static final short SW_NullPointerException = (short) 0xff05;
+ public static final short SW_NegativeArraySizeException = (short) 0xff06;
+ public static final short SW_CryptoException_prefix = (short) 0xf100;
+ public static final short SW_SystemException_prefix = (short) 0xf200;
+ public static final short SW_PINException_prefix = (short) 0xf300;
+ public static final short SW_TransactionException_prefix = (short) 0xf400;
+ public static final short SW_CardRuntimeException_prefix = (short) 0xf500;
+
+ //
+ public static final short BASE_221 = (short) 0x0221;
+ public static final short BASE_222 = (short) 0x0222;
+
+ //
+ public static final short CDATA_BASIC = (short) 5;
+ public static final short CDATA_EXTENDED = (short) 7;
+}
diff --git a/src/cz/crcs/ectester/common/util/CardUtil.java b/common/src/main/java/cz/crcs/ectester/common/util/CardUtil.java
index 5187c42..eeb2159 100644
--- a/src/cz/crcs/ectester/common/util/CardUtil.java
+++ b/common/src/main/java/cz/crcs/ectester/common/util/CardUtil.java
@@ -1,10 +1,6 @@
package cz.crcs.ectester.common.util;
-import cz.crcs.ectester.applet.ECTesterApplet;
-import cz.crcs.ectester.applet.EC_Consts;
-import javacard.framework.ISO7816;
-import javacard.security.CryptoException;
-import javacard.security.KeyPair;
+import cz.crcs.ectester.common.ec.EC_Consts;
import java.util.LinkedList;
import java.util.List;
@@ -14,6 +10,42 @@ import java.util.List;
* @author Jan Jancar johny@neuromancer.sk
*/
public class CardUtil {
+ public class ISO7816 {
+ public static final short SW_APPLET_SELECT_FAILED = 27033;
+ public static final short SW_BYTES_REMAINING_00 = 24832;
+ public static final short SW_CLA_NOT_SUPPORTED = 28160;
+ public static final short SW_COMMAND_CHAINING_NOT_SUPPORTED = 26756;
+ public static final short SW_COMMAND_NOT_ALLOWED = 27014;
+ public static final short SW_CONDITIONS_NOT_SATISFIED = 27013;
+ public static final short SW_CORRECT_LENGTH_00 = 27648;
+ public static final short SW_DATA_INVALID = 27012;
+ public static final short SW_FILE_FULL = 27268;
+ public static final short SW_FILE_INVALID = 27011;
+ public static final short SW_FILE_NOT_FOUND = 27266;
+ public static final short SW_FUNC_NOT_SUPPORTED = 27265;
+ public static final short SW_INCORRECT_P1P2 = 27270;
+ public static final short SW_INS_NOT_SUPPORTED = 27904;
+ public static final short SW_LAST_COMMAND_EXPECTED = 26755;
+ public static final short SW_LOGICAL_CHANNEL_NOT_SUPPORTED = 26753;
+ public static final short SW_NO_ERROR = -28672;
+ public static final short SW_RECORD_NOT_FOUND = 27267;
+ public static final short SW_SECURE_MESSAGING_NOT_SUPPORTED = 26754;
+ public static final short SW_SECURITY_STATUS_NOT_SATISFIED = 27010;
+ public static final short SW_UNKNOWN = 28416;
+ public static final short SW_WARNING_STATE_UNCHANGED = 25088;
+ public static final short SW_WRONG_DATA = 27264;
+ public static final short SW_WRONG_LENGTH = 26368;
+ public static final short SW_WRONG_P1P2 = 27392;
+ }
+
+ public class CryptoException {
+ public static final short ILLEGAL_VALUE = 1;
+ public static final short UNINITIALIZED_KEY = 2;
+ public static final short NO_SUCH_ALGORITHM = 3;
+ public static final short INVALID_INIT = 4;
+ public static final short ILLEGAL_USE = 5;
+ }
+
public static byte getSig(String name) {
switch (name) {
case "SHA1":
@@ -51,15 +83,15 @@ public class CardUtil {
public static String getSigHashName(byte sigType) {
switch (sigType) {
case EC_Consts.Signature_ALG_ECDSA_SHA:
- return "SHA-1";
+ return "SHA1";
case EC_Consts.Signature_ALG_ECDSA_SHA_224:
- return "SHA-224";
+ return "SHA224";
case EC_Consts.Signature_ALG_ECDSA_SHA_256:
- return "SHA-256";
+ return "SHA256";
case EC_Consts.Signature_ALG_ECDSA_SHA_384:
- return "SHA-384";
+ return "SHA384";
case EC_Consts.Signature_ALG_ECDSA_SHA_512:
- return "SHA-512";
+ return "SHA512";
default:
return null;
}
@@ -101,6 +133,7 @@ public class CardUtil {
case ISO7816.SW_BYTES_REMAINING_00:
case ISO7816.SW_CLA_NOT_SUPPORTED:
case ISO7816.SW_COMMAND_NOT_ALLOWED:
+ case ISO7816.SW_COMMAND_CHAINING_NOT_SUPPORTED:
case ISO7816.SW_CONDITIONS_NOT_SATISFIED:
case ISO7816.SW_CORRECT_LENGTH_00:
case ISO7816.SW_DATA_INVALID:
@@ -126,12 +159,12 @@ public class CardUtil {
case CryptoException.INVALID_INIT:
case CryptoException.ILLEGAL_USE:
return "CryptoException";
- case ECTesterApplet.SW_SIG_VERIFY_FAIL:
- case ECTesterApplet.SW_DH_DHC_MISMATCH:
- case ECTesterApplet.SW_KEYPAIR_NULL:
- case ECTesterApplet.SW_KA_NULL:
- case ECTesterApplet.SW_SIGNATURE_NULL:
- case ECTesterApplet.SW_OBJECT_NULL:
+ case CardConsts.SW_SIG_VERIFY_FAIL:
+ case CardConsts.SW_DH_DHC_MISMATCH:
+ case CardConsts.SW_KEYPAIR_NULL:
+ case CardConsts.SW_KA_NULL:
+ case CardConsts.SW_SIGNATURE_NULL:
+ case CardConsts.SW_OBJECT_NULL:
return "ECTesterApplet";
default:
return "?";
@@ -162,6 +195,8 @@ public class CardUtil {
return "CLA_NOT_SUPPORTED";
case ISO7816.SW_COMMAND_NOT_ALLOWED:
return "COMMAND_NOT_ALLOWED";
+ case ISO7816.SW_COMMAND_CHAINING_NOT_SUPPORTED:
+ return "COMMAND_CHAINING_NOT_SUPPORTED";
case ISO7816.SW_CONDITIONS_NOT_SATISFIED:
return "CONDITIONS_NOT_SATISFIED";
case ISO7816.SW_CORRECT_LENGTH_00:
@@ -208,29 +243,29 @@ public class CardUtil {
return "INVALID_INIT";
case CryptoException.ILLEGAL_USE:
return "ILLEGAL_USE";
- case ECTesterApplet.SW_SIG_VERIFY_FAIL:
+ case CardConsts.SW_SIG_VERIFY_FAIL:
return "SIG_VERIFY_FAIL";
- case ECTesterApplet.SW_DH_DHC_MISMATCH:
+ case CardConsts.SW_DH_DHC_MISMATCH:
return "DH_DHC_MISMATCH";
- case ECTesterApplet.SW_KEYPAIR_NULL:
+ case CardConsts.SW_KEYPAIR_NULL:
return "KEYPAIR_NULL";
- case ECTesterApplet.SW_KA_NULL:
+ case CardConsts.SW_KA_NULL:
return "KA_NULL";
- case ECTesterApplet.SW_SIGNATURE_NULL:
+ case CardConsts.SW_SIGNATURE_NULL:
return "SIGNATURE_NULL";
- case ECTesterApplet.SW_OBJECT_NULL:
+ case CardConsts.SW_OBJECT_NULL:
return "OBJECT_NULL";
- case ECTesterApplet.SW_Exception:
+ case CardConsts.SW_Exception:
return "Exception";
- case ECTesterApplet.SW_ArrayIndexOutOfBoundsException:
+ case CardConsts.SW_ArrayIndexOutOfBoundsException:
return "ArrayIndexOutOfBoundsException";
- case ECTesterApplet.SW_ArithmeticException:
+ case CardConsts.SW_ArithmeticException:
return "ArithmeticException";
- case ECTesterApplet.SW_ArrayStoreException:
+ case CardConsts.SW_ArrayStoreException:
return "ArrayStoreException";
- case ECTesterApplet.SW_NullPointerException:
+ case CardConsts.SW_NullPointerException:
return "NullPointerException";
- case ECTesterApplet.SW_NegativeArraySizeException:
+ case CardConsts.SW_NegativeArraySizeException:
return "NegativeArraySizeException";
default:
return "unknown";
@@ -455,9 +490,9 @@ public class CardUtil {
public static String getKeyTypeString(byte keyClass) {
switch (keyClass) {
- case KeyPair.ALG_EC_FP:
+ case EC_Consts.ALG_EC_FP:
return "ALG_EC_FP";
- case KeyPair.ALG_EC_F2M:
+ case EC_Consts.ALG_EC_F2M:
return "ALG_EC_F2M";
default:
return "";
diff --git a/src/cz/crcs/ectester/common/util/ECUtil.java b/common/src/main/java/cz/crcs/ectester/common/util/ECUtil.java
index 8ad31bf..f9be536 100644
--- a/src/cz/crcs/ectester/common/util/ECUtil.java
+++ b/common/src/main/java/cz/crcs/ectester/common/util/ECUtil.java
@@ -1,10 +1,10 @@
package cz.crcs.ectester.common.util;
-import cz.crcs.ectester.applet.EC_Consts;
import cz.crcs.ectester.common.ec.*;
import cz.crcs.ectester.data.EC_Store;
-import org.bouncycastle.asn1.*;
import org.bouncycastle.crypto.digests.SHA1Digest;
+import org.bouncycastle.crypto.signers.PlainDSAEncoding;
+import org.bouncycastle.crypto.signers.StandardDSAEncoding;
import java.io.FileInputStream;
import java.io.IOException;
@@ -61,7 +61,7 @@ public class ECUtil {
}
public static byte[] toX962Compressed(ECPoint point, ECParameterSpec spec) {
- return toX962Compressed(point, spec.getOrder().bitLength());
+ return toX962Compressed(point, spec.getCurve().getField().getFieldSize());
}
public static byte[] toX962Uncompressed(ECPoint point, int bits) {
@@ -74,7 +74,7 @@ public class ECUtil {
}
public static byte[] toX962Uncompressed(ECPoint point, ECParameterSpec spec) {
- return toX962Uncompressed(point, spec.getOrder().bitLength());
+ return toX962Uncompressed(point, spec.getCurve().getField().getFieldSize());
}
public static byte[] toX962Hybrid(ECPoint point, int bits) {
@@ -205,7 +205,7 @@ public class ECUtil {
while (written < bytes) {
byte[] dig = new byte[digest.getDigestSize()];
digest.doFinal(dig, 0);
- int toWrite = digest.getDigestSize() > bytes - written ? bytes - written : digest.getDigestSize();
+ int toWrite = Math.min(digest.getDigestSize(), bytes - written);
System.arraycopy(dig, 0, result, written, toWrite);
written += toWrite;
digest.update(dig, 0, dig.length);
@@ -344,30 +344,21 @@ public class ECUtil {
return new KeyPair(pubkey, privkey);
}
- public static byte[] toDERSignature(byte[] r, byte[] s) throws IOException {
- ASN1Integer rInt = new ASN1Integer(r);
- ASN1Integer sInt = new ASN1Integer(s);
- DERSequence seq = new DERSequence(new ASN1Encodable[]{rInt, sInt});
- return seq.getEncoded();
- }
-
- public static BigInteger[] fromDERSignature(byte[] signature) throws IOException {
- ASN1StreamParser parser = new ASN1StreamParser(signature);
- DERSequence sequence = (DERSequence) ((DLSequenceParser) parser.readObject()).getLoadedObject();
- ASN1Integer r = (ASN1Integer) sequence.getObjectAt(0);
- ASN1Integer s = (ASN1Integer) sequence.getObjectAt(1);
- return new BigInteger[]{r.getPositiveValue(), s.getPositiveValue()};
- }
-
- public static BigInteger recoverSignatureNonce(byte[] signature, byte[] data, BigInteger privkey, ECParameterSpec params, String hashType) {
+ public static BigInteger recoverSignatureNonce(byte[] signature, byte[] data, BigInteger privkey, ECParameterSpec params, String hashAlgo, String sigType) {
+ // We do not know how to reconstruct those nonces so far.
+ // sigType.contains("ECKCDSA") || sigType.contains("ECNR") || sigType.contains("SM2")
+ if (!sigType.contains("ECDSA")) {
+ return null;
+ }
try {
- int bitSize = params.getOrder().bitLength();
+ BigInteger n = params.getOrder();
+ int bitSize = n.bitLength();
// Hash the data.
byte[] hash;
- if (hashType == null || hashType.equals("NONE")) {
+ if (hashAlgo == null || hashAlgo.equals("NONE")) {
hash = data;
} else {
- MessageDigest md = MessageDigest.getInstance(hashType);
+ MessageDigest md = MessageDigest.getInstance(hashAlgo);
hash = md.digest(data);
}
// Trim bitSize of rightmost bits.
@@ -377,14 +368,19 @@ public class ECUtil {
hashInt = hashInt.shiftRight(hashBits - bitSize);
}
- // Parse DERSignature
- BigInteger[] sigPair = fromDERSignature(signature);
+ // Parse signature
+ BigInteger[] sigPair;
+ if (sigType.contains("CVC") || sigType.contains("PLAIN")) {
+ sigPair = PlainDSAEncoding.INSTANCE.decode(n, signature);
+ } else {
+ sigPair = StandardDSAEncoding.INSTANCE.decode(n, signature);
+ }
BigInteger r = sigPair[0];
BigInteger s = sigPair[1];
- BigInteger rd = privkey.multiply(r).mod(params.getOrder());
- BigInteger hrd = hashInt.add(rd).mod(params.getOrder());
- return s.modInverse(params.getOrder()).multiply(hrd).mod(params.getOrder());
+ BigInteger rd = privkey.multiply(r).mod(n);
+ BigInteger hrd = hashInt.add(rd).mod(n);
+ return s.modInverse(n).multiply(hrd).mod(n);
} catch (NoSuchAlgorithmException | IOException | ArithmeticException ex) {
ex.printStackTrace();
return null;
@@ -461,7 +457,7 @@ public class ECUtil {
}
public static boolean equalKeyPairParameters(ECPrivateKey priv, ECPublicKey pub) {
- if(priv == null || pub == null) {
+ if (priv == null || pub == null) {
return false;
}
return priv.getParams().getCurve().equals(pub.getParams().getCurve()) &&
diff --git a/src/cz/crcs/ectester/common/util/FileUtil.java b/common/src/main/java/cz/crcs/ectester/common/util/FileUtil.java
index e6e319b..e6e319b 100644
--- a/src/cz/crcs/ectester/common/util/FileUtil.java
+++ b/common/src/main/java/cz/crcs/ectester/common/util/FileUtil.java
diff --git a/src/cz/crcs/ectester/common/util/Util.java b/common/src/main/java/cz/crcs/ectester/common/util/Util.java
index 5b0cd79..5b0cd79 100644
--- a/src/cz/crcs/ectester/common/util/Util.java
+++ b/common/src/main/java/cz/crcs/ectester/common/util/Util.java
diff --git a/src/cz/crcs/ectester/data/EC_Store.java b/common/src/main/java/cz/crcs/ectester/data/EC_Store.java
index bcadf80..ad25b1d 100644
--- a/src/cz/crcs/ectester/data/EC_Store.java
+++ b/common/src/main/java/cz/crcs/ectester/data/EC_Store.java
@@ -2,7 +2,6 @@ package cz.crcs.ectester.data;
import cz.crcs.ectester.common.ec.*;
import cz.crcs.ectester.common.util.Util;
-import javacard.security.KeyPair;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
@@ -152,9 +151,9 @@ public class EC_Store {
byte alg;
if (field.getTextContent().equalsIgnoreCase("prime")) {
- alg = KeyPair.ALG_EC_FP;
+ alg = EC_Consts.ALG_EC_FP;
} else {
- alg = KeyPair.ALG_EC_F2M;
+ alg = EC_Consts.ALG_EC_F2M;
}
short bitsize = Short.parseShort(bits.getTextContent());
diff --git a/src/cz/crcs/ectester/data/anomalous/anomalous112.csv b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous112.csv
index 6711b71..6711b71 100644
--- a/src/cz/crcs/ectester/data/anomalous/anomalous112.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous112.csv
diff --git a/src/cz/crcs/ectester/data/anomalous/anomalous128.csv b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous128.csv
index 2dcf172..2dcf172 100644
--- a/src/cz/crcs/ectester/data/anomalous/anomalous128.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous128.csv
diff --git a/src/cz/crcs/ectester/data/anomalous/anomalous160.csv b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous160.csv
index bc50f6d..bc50f6d 100644
--- a/src/cz/crcs/ectester/data/anomalous/anomalous160.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous160.csv
diff --git a/src/cz/crcs/ectester/data/anomalous/anomalous192.csv b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous192.csv
index 35a5c07..35a5c07 100644
--- a/src/cz/crcs/ectester/data/anomalous/anomalous192.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous192.csv
diff --git a/src/cz/crcs/ectester/data/anomalous/anomalous224.csv b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous224.csv
index bf24496..bf24496 100644
--- a/src/cz/crcs/ectester/data/anomalous/anomalous224.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous224.csv
diff --git a/src/cz/crcs/ectester/data/anomalous/anomalous256.csv b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous256.csv
index 24d7454..24d7454 100644
--- a/src/cz/crcs/ectester/data/anomalous/anomalous256.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous256.csv
diff --git a/src/cz/crcs/ectester/data/anomalous/anomalous320.csv b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous320.csv
index 96e98e5..96e98e5 100644
--- a/src/cz/crcs/ectester/data/anomalous/anomalous320.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous320.csv
diff --git a/src/cz/crcs/ectester/data/anomalous/anomalous384.csv b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous384.csv
index 6034b4a..6034b4a 100644
--- a/src/cz/crcs/ectester/data/anomalous/anomalous384.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous384.csv
diff --git a/src/cz/crcs/ectester/data/anomalous/anomalous512.csv b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous512.csv
index ed7ee5b..ed7ee5b 100644
--- a/src/cz/crcs/ectester/data/anomalous/anomalous512.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous512.csv
diff --git a/src/cz/crcs/ectester/data/anomalous/anomalous521.csv b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous521.csv
index e0d935e..e0d935e 100644
--- a/src/cz/crcs/ectester/data/anomalous/anomalous521.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/anomalous/anomalous521.csv
diff --git a/src/cz/crcs/ectester/data/anomalous/curves.xml b/common/src/main/resources/cz/crcs/ectester/data/anomalous/curves.xml
index 5486f35..5486f35 100644
--- a/src/cz/crcs/ectester/data/anomalous/curves.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/anomalous/curves.xml
diff --git a/src/cz/crcs/ectester/data/anomalous/miyaji128a1.csv b/common/src/main/resources/cz/crcs/ectester/data/anomalous/miyaji128a1.csv
index 20f2863..20f2863 100644
--- a/src/cz/crcs/ectester/data/anomalous/miyaji128a1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/anomalous/miyaji128a1.csv
diff --git a/src/cz/crcs/ectester/data/anomalous/miyaji128a2.csv b/common/src/main/resources/cz/crcs/ectester/data/anomalous/miyaji128a2.csv
index 4c0f6bc..4c0f6bc 100644
--- a/src/cz/crcs/ectester/data/anomalous/miyaji128a2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/anomalous/miyaji128a2.csv
diff --git a/src/cz/crcs/ectester/data/anomalous/miyaji128b1.csv b/common/src/main/resources/cz/crcs/ectester/data/anomalous/miyaji128b1.csv
index 678ce90..678ce90 100644
--- a/src/cz/crcs/ectester/data/anomalous/miyaji128b1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/anomalous/miyaji128b1.csv
diff --git a/src/cz/crcs/ectester/data/anomalous/miyaji128b2.csv b/common/src/main/resources/cz/crcs/ectester/data/anomalous/miyaji128b2.csv
index 73bf5aa..73bf5aa 100644
--- a/src/cz/crcs/ectester/data/anomalous/miyaji128b2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/anomalous/miyaji128b2.csv
diff --git a/src/cz/crcs/ectester/data/anssi/curves.xml b/common/src/main/resources/cz/crcs/ectester/data/anssi/curves.xml
index 0456e67..0456e67 100644
--- a/src/cz/crcs/ectester/data/anssi/curves.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/anssi/curves.xml
diff --git a/src/cz/crcs/ectester/data/anssi/frp256v1.csv b/common/src/main/resources/cz/crcs/ectester/data/anssi/frp256v1.csv
index 3e5428d..3e5428d 100644
--- a/src/cz/crcs/ectester/data/anssi/frp256v1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/anssi/frp256v1.csv
diff --git a/src/cz/crcs/ectester/data/bn/bn158.csv b/common/src/main/resources/cz/crcs/ectester/data/bn/bn158.csv
index 2e3b6b7..2e3b6b7 100644
--- a/src/cz/crcs/ectester/data/bn/bn158.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/bn/bn158.csv
diff --git a/src/cz/crcs/ectester/data/bn/bn190.csv b/common/src/main/resources/cz/crcs/ectester/data/bn/bn190.csv
index feb225b..feb225b 100644
--- a/src/cz/crcs/ectester/data/bn/bn190.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/bn/bn190.csv
diff --git a/src/cz/crcs/ectester/data/bn/bn222.csv b/common/src/main/resources/cz/crcs/ectester/data/bn/bn222.csv
index 89038b3..89038b3 100644
--- a/src/cz/crcs/ectester/data/bn/bn222.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/bn/bn222.csv
diff --git a/src/cz/crcs/ectester/data/bn/bn254.csv b/common/src/main/resources/cz/crcs/ectester/data/bn/bn254.csv
index de71c5d..de71c5d 100644
--- a/src/cz/crcs/ectester/data/bn/bn254.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/bn/bn254.csv
diff --git a/src/cz/crcs/ectester/data/bn/bn286.csv b/common/src/main/resources/cz/crcs/ectester/data/bn/bn286.csv
index 46d677e..46d677e 100644
--- a/src/cz/crcs/ectester/data/bn/bn286.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/bn/bn286.csv
diff --git a/src/cz/crcs/ectester/data/bn/bn318.csv b/common/src/main/resources/cz/crcs/ectester/data/bn/bn318.csv
index bc431fe..bc431fe 100644
--- a/src/cz/crcs/ectester/data/bn/bn318.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/bn/bn318.csv
diff --git a/src/cz/crcs/ectester/data/bn/bn350.csv b/common/src/main/resources/cz/crcs/ectester/data/bn/bn350.csv
index 237a255..237a255 100644
--- a/src/cz/crcs/ectester/data/bn/bn350.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/bn/bn350.csv
diff --git a/src/cz/crcs/ectester/data/bn/bn382.csv b/common/src/main/resources/cz/crcs/ectester/data/bn/bn382.csv
index 955882a..955882a 100644
--- a/src/cz/crcs/ectester/data/bn/bn382.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/bn/bn382.csv
diff --git a/src/cz/crcs/ectester/data/bn/bn414.csv b/common/src/main/resources/cz/crcs/ectester/data/bn/bn414.csv
index 0c7eb66..0c7eb66 100644
--- a/src/cz/crcs/ectester/data/bn/bn414.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/bn/bn414.csv
diff --git a/src/cz/crcs/ectester/data/bn/bn446.csv b/common/src/main/resources/cz/crcs/ectester/data/bn/bn446.csv
index a0a525e..a0a525e 100644
--- a/src/cz/crcs/ectester/data/bn/bn446.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/bn/bn446.csv
diff --git a/src/cz/crcs/ectester/data/bn/bn478.csv b/common/src/main/resources/cz/crcs/ectester/data/bn/bn478.csv
index 9c2640a..9c2640a 100644
--- a/src/cz/crcs/ectester/data/bn/bn478.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/bn/bn478.csv
diff --git a/src/cz/crcs/ectester/data/bn/bn510.csv b/common/src/main/resources/cz/crcs/ectester/data/bn/bn510.csv
index 9dc79b3..9dc79b3 100644
--- a/src/cz/crcs/ectester/data/bn/bn510.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/bn/bn510.csv
diff --git a/src/cz/crcs/ectester/data/bn/bn542.csv b/common/src/main/resources/cz/crcs/ectester/data/bn/bn542.csv
index 1a50175..1a50175 100644
--- a/src/cz/crcs/ectester/data/bn/bn542.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/bn/bn542.csv
diff --git a/src/cz/crcs/ectester/data/bn/bn574.csv b/common/src/main/resources/cz/crcs/ectester/data/bn/bn574.csv
index 1d547c7..1d547c7 100644
--- a/src/cz/crcs/ectester/data/bn/bn574.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/bn/bn574.csv
diff --git a/src/cz/crcs/ectester/data/bn/bn606.csv b/common/src/main/resources/cz/crcs/ectester/data/bn/bn606.csv
index f488ab2..f488ab2 100644
--- a/src/cz/crcs/ectester/data/bn/bn606.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/bn/bn606.csv
diff --git a/src/cz/crcs/ectester/data/bn/bn638.csv b/common/src/main/resources/cz/crcs/ectester/data/bn/bn638.csv
index cb54f9b..cb54f9b 100644
--- a/src/cz/crcs/ectester/data/bn/bn638.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/bn/bn638.csv
diff --git a/src/cz/crcs/ectester/data/bn/curves.xml b/common/src/main/resources/cz/crcs/ectester/data/bn/curves.xml
index c5ca22f..c5ca22f 100644
--- a/src/cz/crcs/ectester/data/bn/curves.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/bn/curves.xml
diff --git a/src/cz/crcs/ectester/data/brainpool/brainpoolP160r1.csv b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP160r1.csv
index a6734e9..a6734e9 100644
--- a/src/cz/crcs/ectester/data/brainpool/brainpoolP160r1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP160r1.csv
diff --git a/src/cz/crcs/ectester/data/brainpool/brainpoolP160t1.csv b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP160t1.csv
index b045237..b045237 100644
--- a/src/cz/crcs/ectester/data/brainpool/brainpoolP160t1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP160t1.csv
diff --git a/src/cz/crcs/ectester/data/brainpool/brainpoolP192r1.csv b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP192r1.csv
index d7fcf54..d7fcf54 100644
--- a/src/cz/crcs/ectester/data/brainpool/brainpoolP192r1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP192r1.csv
diff --git a/src/cz/crcs/ectester/data/brainpool/brainpoolP192t1.csv b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP192t1.csv
index 45ed451..45ed451 100644
--- a/src/cz/crcs/ectester/data/brainpool/brainpoolP192t1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP192t1.csv
diff --git a/src/cz/crcs/ectester/data/brainpool/brainpoolP224r1.csv b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP224r1.csv
index 411ff99..411ff99 100644
--- a/src/cz/crcs/ectester/data/brainpool/brainpoolP224r1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP224r1.csv
diff --git a/src/cz/crcs/ectester/data/brainpool/brainpoolP224t1.csv b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP224t1.csv
index d0e2610..d0e2610 100644
--- a/src/cz/crcs/ectester/data/brainpool/brainpoolP224t1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP224t1.csv
diff --git a/src/cz/crcs/ectester/data/brainpool/brainpoolP256r1.csv b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP256r1.csv
index f88728d..f88728d 100644
--- a/src/cz/crcs/ectester/data/brainpool/brainpoolP256r1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP256r1.csv
diff --git a/src/cz/crcs/ectester/data/brainpool/brainpoolP256t1.csv b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP256t1.csv
index 9c21eac..9c21eac 100644
--- a/src/cz/crcs/ectester/data/brainpool/brainpoolP256t1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP256t1.csv
diff --git a/src/cz/crcs/ectester/data/brainpool/brainpoolP320r1.csv b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP320r1.csv
index a5ea90d..a5ea90d 100644
--- a/src/cz/crcs/ectester/data/brainpool/brainpoolP320r1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP320r1.csv
diff --git a/src/cz/crcs/ectester/data/brainpool/brainpoolP320t1.csv b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP320t1.csv
index cda7844..cda7844 100644
--- a/src/cz/crcs/ectester/data/brainpool/brainpoolP320t1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP320t1.csv
diff --git a/src/cz/crcs/ectester/data/brainpool/brainpoolP384r1.csv b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP384r1.csv
index 4469585..4469585 100644
--- a/src/cz/crcs/ectester/data/brainpool/brainpoolP384r1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP384r1.csv
diff --git a/src/cz/crcs/ectester/data/brainpool/brainpoolP384t1.csv b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP384t1.csv
index 8a9a6ac..8a9a6ac 100644
--- a/src/cz/crcs/ectester/data/brainpool/brainpoolP384t1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP384t1.csv
diff --git a/src/cz/crcs/ectester/data/brainpool/brainpoolP512r1.csv b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP512r1.csv
index 20299d6..20299d6 100644
--- a/src/cz/crcs/ectester/data/brainpool/brainpoolP512r1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP512r1.csv
diff --git a/src/cz/crcs/ectester/data/brainpool/brainpoolP512t1.csv b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP512t1.csv
index 4a7c891..4a7c891 100644
--- a/src/cz/crcs/ectester/data/brainpool/brainpoolP512t1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/brainpool/brainpoolP512t1.csv
diff --git a/src/cz/crcs/ectester/data/brainpool/curves.xml b/common/src/main/resources/cz/crcs/ectester/data/brainpool/curves.xml
index 2cb7fc5..2cb7fc5 100644
--- a/src/cz/crcs/ectester/data/brainpool/curves.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/brainpool/curves.xml
diff --git a/src/cz/crcs/ectester/data/categories.xml b/common/src/main/resources/cz/crcs/ectester/data/categories.xml
index 0776b99..0776b99 100644
--- a/src/cz/crcs/ectester/data/categories.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/categories.xml
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor128p128.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p128.csv
index 58459f6..58459f6 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor128p128.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p128.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor128p16.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p16.csv
index 181c47c..181c47c 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor128p16.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p16.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor128p2.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p2.csv
index d9857d8..d9857d8 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor128p2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p2.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor128p32.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p32.csv
index 9673835..9673835 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor128p32.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p32.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor128p4.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p4.csv
index 44363ad..44363ad 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor128p4.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p4.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor128p56467.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p56467.csv
index 193f6a7..193f6a7 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor128p56467.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p56467.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor128p64.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p64.csv
index 35a5ecc..35a5ecc 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor128p64.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p64.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor128p65521.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p65521.csv
index 80a1eb3..80a1eb3 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor128p65521.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p65521.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor128p65535.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p65535.csv
index 54da6cc..54da6cc 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor128p65535.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p65535.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor128p8.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p8.csv
index 94d4b4e..94d4b4e 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor128p8.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor128p8.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor160p16.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p16.csv
index 4d82274..4d82274 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor160p16.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p16.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor160p2.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p2.csv
index 54717af..54717af 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor160p2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p2.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor160p32.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p32.csv
index 75238ea..75238ea 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor160p32.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p32.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor160p4.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p4.csv
index 760dbef..760dbef 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor160p4.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p4.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor160p56467.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p56467.csv
index f5355bf..f5355bf 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor160p56467.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p56467.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor160p64.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p64.csv
index 4cdcfdc..4cdcfdc 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor160p64.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p64.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor160p65521.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p65521.csv
index 10e3605..10e3605 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor160p65521.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p65521.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor160p65535.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p65535.csv
index bd47372..bd47372 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor160p65535.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p65535.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor160p8.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p8.csv
index 60ca98e..60ca98e 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor160p8.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor160p8.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor163t128.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t128.csv
index c748587..c748587 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor163t128.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t128.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor163t16.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t16.csv
index decdad3..decdad3 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor163t16.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t16.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor163t2.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t2.csv
index d837a28..d837a28 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor163t2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t2.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor163t32.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t32.csv
index 2b88982..2b88982 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor163t32.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t32.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor163t4.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t4.csv
index 61f7b03..61f7b03 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor163t4.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t4.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor163t64.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t64.csv
index 6d3ee91..6d3ee91 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor163t64.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t64.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor163t8.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t8.csv
index 349e874..349e874 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor163t8.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor163t8.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor192p2.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor192p2.csv
index 4de7049..4de7049 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor192p2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor192p2.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor192p4.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor192p4.csv
index 645f031..645f031 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor192p4.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor192p4.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor192p8.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor192p8.csv
index ee39445..ee39445 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor192p8.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor192p8.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor233t128.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t128.csv
index 48505d4..48505d4 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor233t128.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t128.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor233t16.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t16.csv
index d838407..d838407 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor233t16.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t16.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor233t2.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t2.csv
index 61a945f..61a945f 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor233t2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t2.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor233t32.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t32.csv
index 4f14dfe..4f14dfe 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor233t32.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t32.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor233t4.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t4.csv
index 1972de2..1972de2 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor233t4.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t4.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor233t64.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t64.csv
index df9e357..df9e357 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor233t64.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t64.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/cofactor233t8.csv b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t8.csv
index 43f6705..43f6705 100644
--- a/src/cz/crcs/ectester/data/cofactor/cofactor233t8.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/cofactor233t8.csv
diff --git a/src/cz/crcs/ectester/data/cofactor/curves.xml b/common/src/main/resources/cz/crcs/ectester/data/cofactor/curves.xml
index 30204e8..30204e8 100644
--- a/src/cz/crcs/ectester/data/cofactor/curves.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/curves.xml
diff --git a/src/cz/crcs/ectester/data/cofactor/keys.xml b/common/src/main/resources/cz/crcs/ectester/data/cofactor/keys.xml
index d6058f0..d6058f0 100644
--- a/src/cz/crcs/ectester/data/cofactor/keys.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/keys.xml
diff --git a/src/cz/crcs/ectester/data/cofactor/secg_keys.xml b/common/src/main/resources/cz/crcs/ectester/data/cofactor/secg_keys.xml
index 9634e9d..9634e9d 100644
--- a/src/cz/crcs/ectester/data/cofactor/secg_keys.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/cofactor/secg_keys.xml
diff --git a/src/cz/crcs/ectester/data/composite/carmichael_128.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_128.csv
index 400abca..400abca 100644
--- a/src/cz/crcs/ectester/data/composite/carmichael_128.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_128.csv
diff --git a/src/cz/crcs/ectester/data/composite/carmichael_192.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_192.csv
index 7c21982..7c21982 100644
--- a/src/cz/crcs/ectester/data/composite/carmichael_192.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_192.csv
diff --git a/src/cz/crcs/ectester/data/composite/carmichael_224.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_224.csv
index d72a30c..d72a30c 100644
--- a/src/cz/crcs/ectester/data/composite/carmichael_224.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_224.csv
diff --git a/src/cz/crcs/ectester/data/composite/carmichael_256.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_256.csv
index fea4281..fea4281 100644
--- a/src/cz/crcs/ectester/data/composite/carmichael_256.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_256.csv
diff --git a/src/cz/crcs/ectester/data/composite/carmichael_384.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_384.csv
index 3002514..3002514 100644
--- a/src/cz/crcs/ectester/data/composite/carmichael_384.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_384.csv
diff --git a/src/cz/crcs/ectester/data/composite/carmichael_512.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_512.csv
index 59d0b03..59d0b03 100644
--- a/src/cz/crcs/ectester/data/composite/carmichael_512.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_512.csv
diff --git a/src/cz/crcs/ectester/data/composite/carmichael_521.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_521.csv
index 47ec1c3..47ec1c3 100644
--- a/src/cz/crcs/ectester/data/composite/carmichael_521.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/carmichael_521.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite128.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite128.csv
index 66b7011..66b7011 100644
--- a/src/cz/crcs/ectester/data/composite/composite128.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite128.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite128_pq.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite128_pq.csv
index 8aea6b2..8aea6b2 100644
--- a/src/cz/crcs/ectester/data/composite/composite128_pq.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite128_pq.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite128_pq1.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite128_pq1.csv
index a551487..a551487 100644
--- a/src/cz/crcs/ectester/data/composite/composite128_pq1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite128_pq1.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite128_pq2.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite128_pq2.csv
index 69181df..69181df 100644
--- a/src/cz/crcs/ectester/data/composite/composite128_pq2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite128_pq2.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite128_rg0.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite128_rg0.csv
index 2e039f4..2e039f4 100644
--- a/src/cz/crcs/ectester/data/composite/composite128_rg0.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite128_rg0.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite128_small.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite128_small.csv
index fbcbdca..fbcbdca 100644
--- a/src/cz/crcs/ectester/data/composite/composite128_small.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite128_small.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite160.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite160.csv
index a78d77c..a78d77c 100644
--- a/src/cz/crcs/ectester/data/composite/composite160.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite160.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite160_pq.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite160_pq.csv
index 3f43b50..3f43b50 100644
--- a/src/cz/crcs/ectester/data/composite/composite160_pq.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite160_pq.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite160_pq1.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite160_pq1.csv
index debd466..debd466 100644
--- a/src/cz/crcs/ectester/data/composite/composite160_pq1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite160_pq1.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite160_pq2.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite160_pq2.csv
index efd7475..efd7475 100644
--- a/src/cz/crcs/ectester/data/composite/composite160_pq2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite160_pq2.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite160_rg0.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite160_rg0.csv
index e6a1a95..e6a1a95 100644
--- a/src/cz/crcs/ectester/data/composite/composite160_rg0.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite160_rg0.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite160_small.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite160_small.csv
index 2adaa8b..2adaa8b 100644
--- a/src/cz/crcs/ectester/data/composite/composite160_small.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite160_small.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite192.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite192.csv
index a9fbe1f..a9fbe1f 100644
--- a/src/cz/crcs/ectester/data/composite/composite192.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite192.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite192_pq.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite192_pq.csv
index 47b8a13..47b8a13 100644
--- a/src/cz/crcs/ectester/data/composite/composite192_pq.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite192_pq.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite192_pq1.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite192_pq1.csv
index 664d35e..664d35e 100644
--- a/src/cz/crcs/ectester/data/composite/composite192_pq1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite192_pq1.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite192_pq2.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite192_pq2.csv
index 33fe0f3..33fe0f3 100644
--- a/src/cz/crcs/ectester/data/composite/composite192_pq2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite192_pq2.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite192_rg0.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite192_rg0.csv
index a55a994..a55a994 100644
--- a/src/cz/crcs/ectester/data/composite/composite192_rg0.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite192_rg0.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite192_small.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite192_small.csv
index a90364d..a90364d 100644
--- a/src/cz/crcs/ectester/data/composite/composite192_small.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite192_small.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite224.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite224.csv
index 7902f2b..7902f2b 100644
--- a/src/cz/crcs/ectester/data/composite/composite224.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite224.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite224_pq.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite224_pq.csv
index ffa2cc1..ffa2cc1 100644
--- a/src/cz/crcs/ectester/data/composite/composite224_pq.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite224_pq.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite224_pq1.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite224_pq1.csv
index 6a01e2d..6a01e2d 100644
--- a/src/cz/crcs/ectester/data/composite/composite224_pq1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite224_pq1.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite224_pq2.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite224_pq2.csv
index f8bc6df..f8bc6df 100644
--- a/src/cz/crcs/ectester/data/composite/composite224_pq2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite224_pq2.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite224_rg0.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite224_rg0.csv
index 835676d..835676d 100644
--- a/src/cz/crcs/ectester/data/composite/composite224_rg0.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite224_rg0.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite224_small.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite224_small.csv
index ea18b96..ea18b96 100644
--- a/src/cz/crcs/ectester/data/composite/composite224_small.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite224_small.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite256.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite256.csv
index 7769ef2..7769ef2 100644
--- a/src/cz/crcs/ectester/data/composite/composite256.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite256.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite256_pq.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite256_pq.csv
index 380f756..380f756 100644
--- a/src/cz/crcs/ectester/data/composite/composite256_pq.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite256_pq.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite256_pq1.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite256_pq1.csv
index 9ac845f..9ac845f 100644
--- a/src/cz/crcs/ectester/data/composite/composite256_pq1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite256_pq1.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite256_pq2.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite256_pq2.csv
index b8b5e9b..b8b5e9b 100644
--- a/src/cz/crcs/ectester/data/composite/composite256_pq2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite256_pq2.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite256_rg0.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite256_rg0.csv
index 0c2d123..0c2d123 100644
--- a/src/cz/crcs/ectester/data/composite/composite256_rg0.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite256_rg0.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite256_small.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite256_small.csv
index 58c0a75..58c0a75 100644
--- a/src/cz/crcs/ectester/data/composite/composite256_small.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite256_small.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite384.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite384.csv
index 4e9d058..4e9d058 100644
--- a/src/cz/crcs/ectester/data/composite/composite384.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite384.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite384_small.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite384_small.csv
index 00b643b..00b643b 100644
--- a/src/cz/crcs/ectester/data/composite/composite384_small.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite384_small.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite521.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite521.csv
index 8681273..8681273 100644
--- a/src/cz/crcs/ectester/data/composite/composite521.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite521.csv
diff --git a/src/cz/crcs/ectester/data/composite/composite521_small.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/composite521_small.csv
index 15df9c8..15df9c8 100644
--- a/src/cz/crcs/ectester/data/composite/composite521_small.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/composite521_small.csv
diff --git a/src/cz/crcs/ectester/data/composite/curves.xml b/common/src/main/resources/cz/crcs/ectester/data/composite/curves.xml
index 34ad33a..34ad33a 100644
--- a/src/cz/crcs/ectester/data/composite/curves.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/curves.xml
diff --git a/src/cz/crcs/ectester/data/composite/keys.xml b/common/src/main/resources/cz/crcs/ectester/data/composite/keys.xml
index da770d8..da770d8 100644
--- a/src/cz/crcs/ectester/data/composite/keys.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/keys.xml
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/10.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/10.csv
index 5fa842a..5fa842a 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/10.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/10.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/112.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/112.csv
index 633ccd5..633ccd5 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/112.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/112.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/12.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/12.csv
index 62bb1a0..62bb1a0 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/12.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/12.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/128.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/128.csv
index 5f8c532..5f8c532 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/128.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/128.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/135.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/135.csv
index 232abff..232abff 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/135.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/135.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/14.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/14.csv
index c8df53e..c8df53e 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/14.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/14.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/140.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/140.csv
index 4d59858..4d59858 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/140.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/140.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/144.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/144.csv
index e8c6492..e8c6492 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/144.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/144.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/146.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/146.csv
index f656c72..f656c72 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/146.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/146.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/148.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/148.csv
index b292889..b292889 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/148.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/148.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/150.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/150.csv
index c1bf12e..c1bf12e 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/150.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/150.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/152.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/152.csv
index 24a03ba..24a03ba 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/152.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/152.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/152_cofactor.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/152_cofactor.csv
index 7861bbd..7861bbd 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/152_cofactor.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/152_cofactor.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/16.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/16.csv
index fd76ff7..fd76ff7 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/16.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/16.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/20.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/20.csv
index 940d10c..940d10c 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/20.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/20.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/25.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/25.csv
index 318099b..318099b 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/25.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/25.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/2a.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/2a.csv
index 670f4bc..670f4bc 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/2a.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/2a.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/2b.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/2b.csv
index 216827b..216827b 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/2b.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/2b.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/3.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/3.csv
index 18ec491..18ec491 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/3.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/3.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/32.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/32.csv
index fddfeee..fddfeee 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/32.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/32.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/4.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/4.csv
index a5b9e09..a5b9e09 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/4.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/4.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/48.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/48.csv
index 202a15b..202a15b 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/48.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/48.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/5.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/5.csv
index 5f0597c..5f0597c 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/5.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/5.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/6.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/6.csv
index 9c1528f..9c1528f 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/6.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/6.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/64.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/64.csv
index 94a2709..94a2709 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/64.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/64.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/7.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/7.csv
index 170b180..170b180 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/7.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/7.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/70.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/70.csv
index 1dbf9c0..1dbf9c0 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/70.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/70.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/8.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/8.csv
index 232df05..232df05 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/8.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/8.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/80.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/80.csv
index da082ef..da082ef 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/80.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/80.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/90.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/90.csv
index d67e673..d67e673 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/90.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/90.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/first/96.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/96.csv
index 5dd2d5c..5dd2d5c 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/first/96.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/first/96.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/second/140.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/140.csv
index 08f5ba1..08f5ba1 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/second/140.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/140.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/second/141.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/141.csv
index 896493f..896493f 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/second/141.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/141.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/second/142.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/142.csv
index cc5fd67..cc5fd67 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/second/142.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/142.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/second/143.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/143.csv
index 9c4861e..9c4861e 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/second/143.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/143.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/second/144.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/144.csv
index db68fad..db68fad 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/second/144.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/144.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/second/145.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/145.csv
index 08c8c4f..08c8c4f 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/second/145.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/145.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/second/146.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/146.csv
index 3afd1a0..3afd1a0 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/second/146.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/146.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/second/147.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/147.csv
index 895acfe..895acfe 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/second/147.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/147.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/second/148.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/148.csv
index 0e2221f..0e2221f 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/second/148.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/148.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/second/149.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/149.csv
index 2fb41e3..2fb41e3 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/second/149.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/149.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/second/150.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/150.csv
index e38fe99..e38fe99 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/second/150.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/150.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/second/151.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/151.csv
index 9b665bc..9b665bc 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/second/151.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/151.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/second/152.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/152.csv
index 854a93f..854a93f 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/second/152.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/152.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/second/153.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/153.csv
index 90ff712..90ff712 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/second/153.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/153.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/second/154.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/154.csv
index 1c45df7..1c45df7 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/second/154.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/154.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/second/155.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/155.csv
index a3dcc8c..a3dcc8c 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/second/155.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/155.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/second/156.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/156.csv
index 7614b13..7614b13 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/second/156.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/156.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/second/157.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/157.csv
index 06cd933..06cd933 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/second/157.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/157.csv
diff --git a/src/cz/crcs/ectester/data/composite/varying/160/second/158.csv b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/158.csv
index c35a628..c35a628 100644
--- a/src/cz/crcs/ectester/data/composite/varying/160/second/158.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/composite/varying/160/second/158.csv
diff --git a/src/cz/crcs/ectester/data/degenerate/brainpool.xml b/common/src/main/resources/cz/crcs/ectester/data/degenerate/brainpool.xml
index 3dd2f54..3dd2f54 100644
--- a/src/cz/crcs/ectester/data/degenerate/brainpool.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/degenerate/brainpool.xml
diff --git a/src/cz/crcs/ectester/data/degenerate/cofactor.xml b/common/src/main/resources/cz/crcs/ectester/data/degenerate/cofactor.xml
index 647515b..647515b 100644
--- a/src/cz/crcs/ectester/data/degenerate/cofactor.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/degenerate/cofactor.xml
diff --git a/src/cz/crcs/ectester/data/degenerate/keys.xml b/common/src/main/resources/cz/crcs/ectester/data/degenerate/keys.xml
index 498cf26..498cf26 100644
--- a/src/cz/crcs/ectester/data/degenerate/keys.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/degenerate/keys.xml
diff --git a/src/cz/crcs/ectester/data/degenerate/secg.xml b/common/src/main/resources/cz/crcs/ectester/data/degenerate/secg.xml
index 2cf81e7..2cf81e7 100644
--- a/src/cz/crcs/ectester/data/degenerate/secg.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/degenerate/secg.xml
diff --git a/src/cz/crcs/ectester/data/gost/curves.xml b/common/src/main/resources/cz/crcs/ectester/data/gost/curves.xml
index 2b83c5e..2b83c5e 100644
--- a/src/cz/crcs/ectester/data/gost/curves.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/gost/curves.xml
diff --git a/src/cz/crcs/ectester/data/gost/gost256.csv b/common/src/main/resources/cz/crcs/ectester/data/gost/gost256.csv
index baea45a..baea45a 100644
--- a/src/cz/crcs/ectester/data/gost/gost256.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/gost/gost256.csv
diff --git a/src/cz/crcs/ectester/data/gost/gost512.csv b/common/src/main/resources/cz/crcs/ectester/data/gost/gost512.csv
index 5b24d59..5b24d59 100644
--- a/src/cz/crcs/ectester/data/gost/gost512.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/gost/gost512.csv
diff --git a/src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP160r1.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP160r1.xml
index 7656432..7656432 100644
--- a/src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP160r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP160r1.xml
diff --git a/src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP160t1.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP160t1.xml
index ffac676..ffac676 100644
--- a/src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP160t1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP160t1.xml
diff --git a/src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP192r1.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP192r1.xml
index 4ceb20c..4ceb20c 100644
--- a/src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP192r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP192r1.xml
diff --git a/src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP192t1.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP192t1.xml
index fe06dcf..fe06dcf 100644
--- a/src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP192t1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP192t1.xml
diff --git a/src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP224r1.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP224r1.xml
index c708160..c708160 100644
--- a/src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP224r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP224r1.xml
diff --git a/src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP224t1.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP224t1.xml
index c7ae75b..c7ae75b 100644
--- a/src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP224t1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP224t1.xml
diff --git a/src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP256r1.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP256r1.xml
index 30343e6..30343e6 100644
--- a/src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP256r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP256r1.xml
diff --git a/src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP256t1.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP256t1.xml
index 8b0a544..8b0a544 100644
--- a/src/cz/crcs/ectester/data/invalid/brainpool/brainpoolP256t1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/brainpool/brainpoolP256t1.xml
diff --git a/src/cz/crcs/ectester/data/invalid/keys.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/keys.xml
index d630129..d630129 100644
--- a/src/cz/crcs/ectester/data/invalid/keys.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/keys.xml
diff --git a/src/cz/crcs/ectester/data/invalid/nist/b163.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/nist/b163.xml
index e3df992..e3df992 100644
--- a/src/cz/crcs/ectester/data/invalid/nist/b163.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/nist/b163.xml
diff --git a/src/cz/crcs/ectester/data/invalid/nist/b233.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/nist/b233.xml
index f1ebb74..f1ebb74 100644
--- a/src/cz/crcs/ectester/data/invalid/nist/b233.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/nist/b233.xml
diff --git a/src/cz/crcs/ectester/data/invalid/nist/b283.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/nist/b283.xml
index b925891..b925891 100644
--- a/src/cz/crcs/ectester/data/invalid/nist/b283.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/nist/b283.xml
diff --git a/src/cz/crcs/ectester/data/invalid/nist/k163.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/nist/k163.xml
index baa9ef5..baa9ef5 100644
--- a/src/cz/crcs/ectester/data/invalid/nist/k163.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/nist/k163.xml
diff --git a/src/cz/crcs/ectester/data/invalid/nist/k233.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/nist/k233.xml
index 250c9df..250c9df 100644
--- a/src/cz/crcs/ectester/data/invalid/nist/k233.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/nist/k233.xml
diff --git a/src/cz/crcs/ectester/data/invalid/nist/k283.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/nist/k283.xml
index 38e3659..38e3659 100644
--- a/src/cz/crcs/ectester/data/invalid/nist/k283.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/nist/k283.xml
diff --git a/src/cz/crcs/ectester/data/invalid/secg/secp112r1.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp112r1.xml
index c93b236..c93b236 100644
--- a/src/cz/crcs/ectester/data/invalid/secg/secp112r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp112r1.xml
diff --git a/src/cz/crcs/ectester/data/invalid/secg/secp112r2.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp112r2.xml
index 49f869a..49f869a 100644
--- a/src/cz/crcs/ectester/data/invalid/secg/secp112r2.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp112r2.xml
diff --git a/src/cz/crcs/ectester/data/invalid/secg/secp128r1.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp128r1.xml
index e010003..e010003 100644
--- a/src/cz/crcs/ectester/data/invalid/secg/secp128r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp128r1.xml
diff --git a/src/cz/crcs/ectester/data/invalid/secg/secp128r2.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp128r2.xml
index 1bf0e19..1bf0e19 100644
--- a/src/cz/crcs/ectester/data/invalid/secg/secp128r2.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp128r2.xml
diff --git a/src/cz/crcs/ectester/data/invalid/secg/secp160r1.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp160r1.xml
index c0ac9f5..c0ac9f5 100644
--- a/src/cz/crcs/ectester/data/invalid/secg/secp160r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp160r1.xml
diff --git a/src/cz/crcs/ectester/data/invalid/secg/secp160r2.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp160r2.xml
index 5a0afdc..5a0afdc 100644
--- a/src/cz/crcs/ectester/data/invalid/secg/secp160r2.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp160r2.xml
diff --git a/src/cz/crcs/ectester/data/invalid/secg/secp192r1.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp192r1.xml
index 6ecf018..6ecf018 100644
--- a/src/cz/crcs/ectester/data/invalid/secg/secp192r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp192r1.xml
diff --git a/src/cz/crcs/ectester/data/invalid/secg/secp224r1.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp224r1.xml
index 9ce561d..9ce561d 100644
--- a/src/cz/crcs/ectester/data/invalid/secg/secp224r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp224r1.xml
diff --git a/src/cz/crcs/ectester/data/invalid/secg/secp256r1.xml b/common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp256r1.xml
index 6a30210..6a30210 100644
--- a/src/cz/crcs/ectester/data/invalid/secg/secp256r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/invalid/secg/secp256r1.xml
diff --git a/src/cz/crcs/ectester/data/misc/keys.xml b/common/src/main/resources/cz/crcs/ectester/data/misc/keys.xml
index e17b45b..e17b45b 100644
--- a/src/cz/crcs/ectester/data/misc/keys.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/misc/keys.xml
diff --git a/src/cz/crcs/ectester/data/misc/results.xml b/common/src/main/resources/cz/crcs/ectester/data/misc/results.xml
index 07601b1..07601b1 100644
--- a/src/cz/crcs/ectester/data/misc/results.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/misc/results.xml
diff --git a/src/cz/crcs/ectester/data/mnt/curves.xml b/common/src/main/resources/cz/crcs/ectester/data/mnt/curves.xml
index 0087a5a..0087a5a 100644
--- a/src/cz/crcs/ectester/data/mnt/curves.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/mnt/curves.xml
diff --git a/src/cz/crcs/ectester/data/mnt/mnt1.csv b/common/src/main/resources/cz/crcs/ectester/data/mnt/mnt1.csv
index 7ff5784..7ff5784 100644
--- a/src/cz/crcs/ectester/data/mnt/mnt1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/mnt/mnt1.csv
diff --git a/src/cz/crcs/ectester/data/mnt/mnt2_1.csv b/common/src/main/resources/cz/crcs/ectester/data/mnt/mnt2_1.csv
index a53376f..a53376f 100644
--- a/src/cz/crcs/ectester/data/mnt/mnt2_1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/mnt/mnt2_1.csv
diff --git a/src/cz/crcs/ectester/data/mnt/mnt2_2.csv b/common/src/main/resources/cz/crcs/ectester/data/mnt/mnt2_2.csv
index 20dd8f4..20dd8f4 100644
--- a/src/cz/crcs/ectester/data/mnt/mnt2_2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/mnt/mnt2_2.csv
diff --git a/src/cz/crcs/ectester/data/mnt/mnt3_1.csv b/common/src/main/resources/cz/crcs/ectester/data/mnt/mnt3_1.csv
index d00719d..d00719d 100644
--- a/src/cz/crcs/ectester/data/mnt/mnt3_1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/mnt/mnt3_1.csv
diff --git a/src/cz/crcs/ectester/data/mnt/mnt3_2.csv b/common/src/main/resources/cz/crcs/ectester/data/mnt/mnt3_2.csv
index 86d8191..86d8191 100644
--- a/src/cz/crcs/ectester/data/mnt/mnt3_2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/mnt/mnt3_2.csv
diff --git a/src/cz/crcs/ectester/data/mnt/mnt3_3.csv b/common/src/main/resources/cz/crcs/ectester/data/mnt/mnt3_3.csv
index 348b30d..348b30d 100644
--- a/src/cz/crcs/ectester/data/mnt/mnt3_3.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/mnt/mnt3_3.csv
diff --git a/src/cz/crcs/ectester/data/mnt/mnt4.csv b/common/src/main/resources/cz/crcs/ectester/data/mnt/mnt4.csv
index ea5eaa1..ea5eaa1 100644
--- a/src/cz/crcs/ectester/data/mnt/mnt4.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/mnt/mnt4.csv
diff --git a/src/cz/crcs/ectester/data/mnt/mnt5_1.csv b/common/src/main/resources/cz/crcs/ectester/data/mnt/mnt5_1.csv
index 2fd1622..2fd1622 100644
--- a/src/cz/crcs/ectester/data/mnt/mnt5_1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/mnt/mnt5_1.csv
diff --git a/src/cz/crcs/ectester/data/mnt/mnt5_2.csv b/common/src/main/resources/cz/crcs/ectester/data/mnt/mnt5_2.csv
index 18ec3a5..18ec3a5 100644
--- a/src/cz/crcs/ectester/data/mnt/mnt5_2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/mnt/mnt5_2.csv
diff --git a/src/cz/crcs/ectester/data/mnt/mnt5_3.csv b/common/src/main/resources/cz/crcs/ectester/data/mnt/mnt5_3.csv
index 73fce1d..73fce1d 100644
--- a/src/cz/crcs/ectester/data/mnt/mnt5_3.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/mnt/mnt5_3.csv
diff --git a/src/cz/crcs/ectester/data/nist/b163.csv b/common/src/main/resources/cz/crcs/ectester/data/nist/b163.csv
index 85b777b..85b777b 100644
--- a/src/cz/crcs/ectester/data/nist/b163.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/nist/b163.csv
diff --git a/src/cz/crcs/ectester/data/nist/b233.csv b/common/src/main/resources/cz/crcs/ectester/data/nist/b233.csv
index a9c2711..a9c2711 100644
--- a/src/cz/crcs/ectester/data/nist/b233.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/nist/b233.csv
diff --git a/src/cz/crcs/ectester/data/nist/b283.csv b/common/src/main/resources/cz/crcs/ectester/data/nist/b283.csv
index 06cc151..06cc151 100644
--- a/src/cz/crcs/ectester/data/nist/b283.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/nist/b283.csv
diff --git a/src/cz/crcs/ectester/data/nist/b409.csv b/common/src/main/resources/cz/crcs/ectester/data/nist/b409.csv
index 66523a7..66523a7 100644
--- a/src/cz/crcs/ectester/data/nist/b409.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/nist/b409.csv
diff --git a/src/cz/crcs/ectester/data/nist/b571.csv b/common/src/main/resources/cz/crcs/ectester/data/nist/b571.csv
index 7d824c4..7d824c4 100644
--- a/src/cz/crcs/ectester/data/nist/b571.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/nist/b571.csv
diff --git a/src/cz/crcs/ectester/data/nist/curves.xml b/common/src/main/resources/cz/crcs/ectester/data/nist/curves.xml
index 2abf72f..2abf72f 100644
--- a/src/cz/crcs/ectester/data/nist/curves.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/nist/curves.xml
diff --git a/src/cz/crcs/ectester/data/nist/k163.csv b/common/src/main/resources/cz/crcs/ectester/data/nist/k163.csv
index e35fbda..e35fbda 100644
--- a/src/cz/crcs/ectester/data/nist/k163.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/nist/k163.csv
diff --git a/src/cz/crcs/ectester/data/nist/k233.csv b/common/src/main/resources/cz/crcs/ectester/data/nist/k233.csv
index a429d81..a429d81 100644
--- a/src/cz/crcs/ectester/data/nist/k233.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/nist/k233.csv
diff --git a/src/cz/crcs/ectester/data/nist/k283.csv b/common/src/main/resources/cz/crcs/ectester/data/nist/k283.csv
index 32dcc3e..32dcc3e 100644
--- a/src/cz/crcs/ectester/data/nist/k283.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/nist/k283.csv
diff --git a/src/cz/crcs/ectester/data/nist/k409.csv b/common/src/main/resources/cz/crcs/ectester/data/nist/k409.csv
index 119754a..119754a 100644
--- a/src/cz/crcs/ectester/data/nist/k409.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/nist/k409.csv
diff --git a/src/cz/crcs/ectester/data/nist/k571.csv b/common/src/main/resources/cz/crcs/ectester/data/nist/k571.csv
index 7fb1431..7fb1431 100644
--- a/src/cz/crcs/ectester/data/nist/k571.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/nist/k571.csv
diff --git a/src/cz/crcs/ectester/data/nist/p192.csv b/common/src/main/resources/cz/crcs/ectester/data/nist/p192.csv
index 07f9154..07f9154 100644
--- a/src/cz/crcs/ectester/data/nist/p192.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/nist/p192.csv
diff --git a/src/cz/crcs/ectester/data/nist/p224.csv b/common/src/main/resources/cz/crcs/ectester/data/nist/p224.csv
index 4b206d4..4b206d4 100644
--- a/src/cz/crcs/ectester/data/nist/p224.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/nist/p224.csv
diff --git a/src/cz/crcs/ectester/data/nist/p256.csv b/common/src/main/resources/cz/crcs/ectester/data/nist/p256.csv
index c5a2440..c5a2440 100644
--- a/src/cz/crcs/ectester/data/nist/p256.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/nist/p256.csv
diff --git a/src/cz/crcs/ectester/data/nist/p384.csv b/common/src/main/resources/cz/crcs/ectester/data/nist/p384.csv
index eeba9fa..eeba9fa 100644
--- a/src/cz/crcs/ectester/data/nist/p384.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/nist/p384.csv
diff --git a/src/cz/crcs/ectester/data/nist/p521.csv b/common/src/main/resources/cz/crcs/ectester/data/nist/p521.csv
index 609672f..609672f 100644
--- a/src/cz/crcs/ectester/data/nist/p521.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/nist/p521.csv
diff --git a/src/cz/crcs/ectester/data/other/curve25519.csv b/common/src/main/resources/cz/crcs/ectester/data/other/curve25519.csv
index 2e62d80..2e62d80 100644
--- a/src/cz/crcs/ectester/data/other/curve25519.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/other/curve25519.csv
diff --git a/src/cz/crcs/ectester/data/other/curves.xml b/common/src/main/resources/cz/crcs/ectester/data/other/curves.xml
index f200d9c..f200d9c 100644
--- a/src/cz/crcs/ectester/data/other/curves.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/other/curves.xml
diff --git a/src/cz/crcs/ectester/data/other/m221.csv b/common/src/main/resources/cz/crcs/ectester/data/other/m221.csv
index 0a74263..0a74263 100644
--- a/src/cz/crcs/ectester/data/other/m221.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/other/m221.csv
diff --git a/src/cz/crcs/ectester/data/other/m383.csv b/common/src/main/resources/cz/crcs/ectester/data/other/m383.csv
index 9a8890d..9a8890d 100644
--- a/src/cz/crcs/ectester/data/other/m383.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/other/m383.csv
diff --git a/src/cz/crcs/ectester/data/other/m511.csv b/common/src/main/resources/cz/crcs/ectester/data/other/m511.csv
index 815714c..815714c 100644
--- a/src/cz/crcs/ectester/data/other/m511.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/other/m511.csv
diff --git a/src/cz/crcs/ectester/data/schema.xsd b/common/src/main/resources/cz/crcs/ectester/data/schema.xsd
index 99c9b76..99c9b76 100644
--- a/src/cz/crcs/ectester/data/schema.xsd
+++ b/common/src/main/resources/cz/crcs/ectester/data/schema.xsd
diff --git a/src/cz/crcs/ectester/data/secg/curves.xml b/common/src/main/resources/cz/crcs/ectester/data/secg/curves.xml
index c04fe38..c04fe38 100644
--- a/src/cz/crcs/ectester/data/secg/curves.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/curves.xml
diff --git a/src/cz/crcs/ectester/data/secg/secp112r1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/secp112r1.csv
index 00d64d6..00d64d6 100644
--- a/src/cz/crcs/ectester/data/secg/secp112r1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/secp112r1.csv
diff --git a/src/cz/crcs/ectester/data/secg/secp112r2.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/secp112r2.csv
index 0513e72..0513e72 100644
--- a/src/cz/crcs/ectester/data/secg/secp112r2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/secp112r2.csv
diff --git a/src/cz/crcs/ectester/data/secg/secp128r1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/secp128r1.csv
index eea5fed..eea5fed 100644
--- a/src/cz/crcs/ectester/data/secg/secp128r1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/secp128r1.csv
diff --git a/src/cz/crcs/ectester/data/secg/secp128r2.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/secp128r2.csv
index 6f2d098..6f2d098 100644
--- a/src/cz/crcs/ectester/data/secg/secp128r2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/secp128r2.csv
diff --git a/src/cz/crcs/ectester/data/secg/secp160k1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/secp160k1.csv
index 7d14c99..7d14c99 100644
--- a/src/cz/crcs/ectester/data/secg/secp160k1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/secp160k1.csv
diff --git a/src/cz/crcs/ectester/data/secg/secp160r1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/secp160r1.csv
index ed37d81..ed37d81 100644
--- a/src/cz/crcs/ectester/data/secg/secp160r1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/secp160r1.csv
diff --git a/src/cz/crcs/ectester/data/secg/secp160r2.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/secp160r2.csv
index 2121fc1..2121fc1 100644
--- a/src/cz/crcs/ectester/data/secg/secp160r2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/secp160r2.csv
diff --git a/src/cz/crcs/ectester/data/secg/secp192k1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/secp192k1.csv
index 550093b..550093b 100644
--- a/src/cz/crcs/ectester/data/secg/secp192k1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/secp192k1.csv
diff --git a/src/cz/crcs/ectester/data/secg/secp192r1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/secp192r1.csv
index 07f9154..07f9154 100644
--- a/src/cz/crcs/ectester/data/secg/secp192r1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/secp192r1.csv
diff --git a/src/cz/crcs/ectester/data/secg/secp224r1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/secp224r1.csv
index 4b206d4..4b206d4 100644
--- a/src/cz/crcs/ectester/data/secg/secp224r1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/secp224r1.csv
diff --git a/src/cz/crcs/ectester/data/secg/secp256k1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/secp256k1.csv
index 7835afc..7835afc 100644
--- a/src/cz/crcs/ectester/data/secg/secp256k1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/secp256k1.csv
diff --git a/src/cz/crcs/ectester/data/secg/secp256r1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/secp256r1.csv
index c5a2440..c5a2440 100644
--- a/src/cz/crcs/ectester/data/secg/secp256r1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/secp256r1.csv
diff --git a/src/cz/crcs/ectester/data/secg/secp384r1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/secp384r1.csv
index eeba9fa..eeba9fa 100644
--- a/src/cz/crcs/ectester/data/secg/secp384r1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/secp384r1.csv
diff --git a/src/cz/crcs/ectester/data/secg/secp521r1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/secp521r1.csv
index 609672f..609672f 100644
--- a/src/cz/crcs/ectester/data/secg/secp521r1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/secp521r1.csv
diff --git a/src/cz/crcs/ectester/data/secg/sect163k1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/sect163k1.csv
index e35fbda..e35fbda 100644
--- a/src/cz/crcs/ectester/data/secg/sect163k1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/sect163k1.csv
diff --git a/src/cz/crcs/ectester/data/secg/sect163r1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/sect163r1.csv
index fa7a328..fa7a328 100644
--- a/src/cz/crcs/ectester/data/secg/sect163r1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/sect163r1.csv
diff --git a/src/cz/crcs/ectester/data/secg/sect163r2.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/sect163r2.csv
index 85b777b..85b777b 100644
--- a/src/cz/crcs/ectester/data/secg/sect163r2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/sect163r2.csv
diff --git a/src/cz/crcs/ectester/data/secg/sect233k1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/sect233k1.csv
index a429d81..a429d81 100644
--- a/src/cz/crcs/ectester/data/secg/sect233k1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/sect233k1.csv
diff --git a/src/cz/crcs/ectester/data/secg/sect233r1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/sect233r1.csv
index faba42b..faba42b 100644
--- a/src/cz/crcs/ectester/data/secg/sect233r1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/sect233r1.csv
diff --git a/src/cz/crcs/ectester/data/secg/sect239k1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/sect239k1.csv
index 8b2e58a..8b2e58a 100644
--- a/src/cz/crcs/ectester/data/secg/sect239k1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/sect239k1.csv
diff --git a/src/cz/crcs/ectester/data/secg/sect283k1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/sect283k1.csv
index 9a3a8f6..9a3a8f6 100644
--- a/src/cz/crcs/ectester/data/secg/sect283k1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/sect283k1.csv
diff --git a/src/cz/crcs/ectester/data/secg/sect283r1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/sect283r1.csv
index 68c17f6..68c17f6 100644
--- a/src/cz/crcs/ectester/data/secg/sect283r1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/sect283r1.csv
diff --git a/src/cz/crcs/ectester/data/secg/sect409k1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/sect409k1.csv
index e39e076..e39e076 100644
--- a/src/cz/crcs/ectester/data/secg/sect409k1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/sect409k1.csv
diff --git a/src/cz/crcs/ectester/data/secg/sect409r1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/sect409r1.csv
index 727fb25..727fb25 100644
--- a/src/cz/crcs/ectester/data/secg/sect409r1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/sect409r1.csv
diff --git a/src/cz/crcs/ectester/data/secg/sect571k1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/sect571k1.csv
index 0c94778..0c94778 100644
--- a/src/cz/crcs/ectester/data/secg/sect571k1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/sect571k1.csv
diff --git a/src/cz/crcs/ectester/data/secg/sect571r1.csv b/common/src/main/resources/cz/crcs/ectester/data/secg/sect571r1.csv
index 739cbb0..739cbb0 100644
--- a/src/cz/crcs/ectester/data/secg/sect571r1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/secg/sect571r1.csv
diff --git a/src/cz/crcs/ectester/data/supersingular/curves.xml b/common/src/main/resources/cz/crcs/ectester/data/supersingular/curves.xml
index 186a8a7..186a8a7 100644
--- a/src/cz/crcs/ectester/data/supersingular/curves.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/supersingular/curves.xml
diff --git a/src/cz/crcs/ectester/data/supersingular/ss128.csv b/common/src/main/resources/cz/crcs/ectester/data/supersingular/ss128.csv
index 9dd4f13..9dd4f13 100644
--- a/src/cz/crcs/ectester/data/supersingular/ss128.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/supersingular/ss128.csv
diff --git a/src/cz/crcs/ectester/data/supersingular/ss192.csv b/common/src/main/resources/cz/crcs/ectester/data/supersingular/ss192.csv
index 0c8ae8b..0c8ae8b 100644
--- a/src/cz/crcs/ectester/data/supersingular/ss192.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/supersingular/ss192.csv
diff --git a/src/cz/crcs/ectester/data/supersingular/ss224.csv b/common/src/main/resources/cz/crcs/ectester/data/supersingular/ss224.csv
index 01eaa35..01eaa35 100644
--- a/src/cz/crcs/ectester/data/supersingular/ss224.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/supersingular/ss224.csv
diff --git a/src/cz/crcs/ectester/data/supersingular/ss256.csv b/common/src/main/resources/cz/crcs/ectester/data/supersingular/ss256.csv
index 47a8174..47a8174 100644
--- a/src/cz/crcs/ectester/data/supersingular/ss256.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/supersingular/ss256.csv
diff --git a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-dh-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-dh-raw.csv
index 36c396a..36c396a 100644
--- a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-dh-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-dh-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-dh-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-dh-sha1.csv
index f9abc47..f9abc47 100644
--- a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-dh-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-dh-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-keyA.csv b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-keyA.csv
index a2f0525..a2f0525 100644
--- a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-keyA.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-keyA.csv
diff --git a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-keyB.csv b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-keyB.csv
index b397506..b397506 100644
--- a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-keyB.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP224r1-keyB.csv
diff --git a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-dh-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-dh-raw.csv
index 1d7ab37..1d7ab37 100644
--- a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-dh-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-dh-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-dh-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-dh-sha1.csv
index 45a851b..45a851b 100644
--- a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-dh-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-dh-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-keyA.csv b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-keyA.csv
index 597d3fe..597d3fe 100644
--- a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-keyA.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-keyA.csv
diff --git a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-keyB.csv b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-keyB.csv
index 110f6b5..110f6b5 100644
--- a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-keyB.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP256r1-keyB.csv
diff --git a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-dh-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-dh-raw.csv
index 392d962..392d962 100644
--- a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-dh-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-dh-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-dh-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-dh-sha1.csv
index b293a59..b293a59 100644
--- a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-dh-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-dh-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-keyA.csv b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-keyA.csv
index 6746753..6746753 100644
--- a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-keyA.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-keyA.csv
diff --git a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-keyB.csv b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-keyB.csv
index 83289fd..83289fd 100644
--- a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-keyB.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP384r1-keyB.csv
diff --git a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-dh-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-dh-raw.csv
index fe6c294..fe6c294 100644
--- a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-dh-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-dh-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-dh-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-dh-sha1.csv
index ff8d321..ff8d321 100644
--- a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-dh-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-dh-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-keyA.csv b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-keyA.csv
index 3648a36..3648a36 100644
--- a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-keyA.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-keyA.csv
diff --git a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-keyB.csv b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-keyB.csv
index 9684984..9684984 100644
--- a/src/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-keyB.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/brainpool/brainpoolP512r1-keyB.csv
diff --git a/src/cz/crcs/ectester/data/test/keys.xml b/common/src/main/resources/cz/crcs/ectester/data/test/keys.xml
index 380aef1..380aef1 100644
--- a/src/cz/crcs/ectester/data/test/keys.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/keys.xml
diff --git a/src/cz/crcs/ectester/data/test/nist/b163-dhc-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b163-dhc-raw.csv
index 25233c1..25233c1 100644
--- a/src/cz/crcs/ectester/data/test/nist/b163-dhc-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b163-dhc-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/b163-dhc-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b163-dhc-sha1.csv
index 0ad84c1..0ad84c1 100644
--- a/src/cz/crcs/ectester/data/test/nist/b163-dhc-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b163-dhc-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/b163-keyCAVS.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b163-keyCAVS.csv
index 4d85a19..4d85a19 100644
--- a/src/cz/crcs/ectester/data/test/nist/b163-keyCAVS.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b163-keyCAVS.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/b163-keyIUT.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b163-keyIUT.csv
index e56e6c4..e56e6c4 100644
--- a/src/cz/crcs/ectester/data/test/nist/b163-keyIUT.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b163-keyIUT.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/b233-dhc-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b233-dhc-raw.csv
index 5e703be..5e703be 100644
--- a/src/cz/crcs/ectester/data/test/nist/b233-dhc-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b233-dhc-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/b233-dhc-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b233-dhc-sha1.csv
index 8c6886f..8c6886f 100644
--- a/src/cz/crcs/ectester/data/test/nist/b233-dhc-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b233-dhc-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/b233-keyCAVS.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b233-keyCAVS.csv
index 591bfe1..591bfe1 100644
--- a/src/cz/crcs/ectester/data/test/nist/b233-keyCAVS.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b233-keyCAVS.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/b233-keyIUT.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b233-keyIUT.csv
index eb7b5e6..eb7b5e6 100644
--- a/src/cz/crcs/ectester/data/test/nist/b233-keyIUT.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b233-keyIUT.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/b283-dhc-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b283-dhc-raw.csv
index 6bc719a..6bc719a 100644
--- a/src/cz/crcs/ectester/data/test/nist/b283-dhc-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b283-dhc-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/b283-dhc-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b283-dhc-sha1.csv
index 6980f80..6980f80 100644
--- a/src/cz/crcs/ectester/data/test/nist/b283-dhc-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b283-dhc-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/b283-keyCAVS.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b283-keyCAVS.csv
index 52b33fc..52b33fc 100644
--- a/src/cz/crcs/ectester/data/test/nist/b283-keyCAVS.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b283-keyCAVS.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/b283-keyIUT.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b283-keyIUT.csv
index 8d2d534..8d2d534 100644
--- a/src/cz/crcs/ectester/data/test/nist/b283-keyIUT.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b283-keyIUT.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/b409-dhc-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b409-dhc-raw.csv
index f84d029..f84d029 100644
--- a/src/cz/crcs/ectester/data/test/nist/b409-dhc-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b409-dhc-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/b409-dhc-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b409-dhc-sha1.csv
index f6db38b..f6db38b 100644
--- a/src/cz/crcs/ectester/data/test/nist/b409-dhc-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b409-dhc-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/b409-keyCAVS.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b409-keyCAVS.csv
index cecb5f3..cecb5f3 100644
--- a/src/cz/crcs/ectester/data/test/nist/b409-keyCAVS.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b409-keyCAVS.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/b409-keyIUT.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b409-keyIUT.csv
index 066d220..066d220 100644
--- a/src/cz/crcs/ectester/data/test/nist/b409-keyIUT.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b409-keyIUT.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/b571-dhc-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b571-dhc-raw.csv
index ffef41d..ffef41d 100644
--- a/src/cz/crcs/ectester/data/test/nist/b571-dhc-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b571-dhc-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/b571-dhc-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b571-dhc-sha1.csv
index d75a7ff..d75a7ff 100644
--- a/src/cz/crcs/ectester/data/test/nist/b571-dhc-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b571-dhc-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/b571-keyCAVS.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b571-keyCAVS.csv
index 20b1816..20b1816 100644
--- a/src/cz/crcs/ectester/data/test/nist/b571-keyCAVS.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b571-keyCAVS.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/b571-keyIUT.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b571-keyIUT.csv
index 8e3973d..8e3973d 100644
--- a/src/cz/crcs/ectester/data/test/nist/b571-keyIUT.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/b571-keyIUT.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/k163-dhc-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k163-dhc-raw.csv
index 5001502..5001502 100644
--- a/src/cz/crcs/ectester/data/test/nist/k163-dhc-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k163-dhc-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/k163-dhc-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k163-dhc-sha1.csv
index e03aa60..e03aa60 100644
--- a/src/cz/crcs/ectester/data/test/nist/k163-dhc-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k163-dhc-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/k163-keyCAVS.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k163-keyCAVS.csv
index 6f03652..6f03652 100644
--- a/src/cz/crcs/ectester/data/test/nist/k163-keyCAVS.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k163-keyCAVS.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/k163-keyIUT.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k163-keyIUT.csv
index b34189e..b34189e 100644
--- a/src/cz/crcs/ectester/data/test/nist/k163-keyIUT.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k163-keyIUT.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/k233-dhc-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k233-dhc-raw.csv
index 03193ae..03193ae 100644
--- a/src/cz/crcs/ectester/data/test/nist/k233-dhc-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k233-dhc-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/k233-dhc-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k233-dhc-sha1.csv
index c6c68ac..c6c68ac 100644
--- a/src/cz/crcs/ectester/data/test/nist/k233-dhc-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k233-dhc-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/k233-keyCAVS.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k233-keyCAVS.csv
index 7c60338..7c60338 100644
--- a/src/cz/crcs/ectester/data/test/nist/k233-keyCAVS.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k233-keyCAVS.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/k233-keyIUT.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k233-keyIUT.csv
index d8cc078..d8cc078 100644
--- a/src/cz/crcs/ectester/data/test/nist/k233-keyIUT.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k233-keyIUT.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/k283-dhc-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k283-dhc-raw.csv
index 0e14373..0e14373 100644
--- a/src/cz/crcs/ectester/data/test/nist/k283-dhc-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k283-dhc-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/k283-dhc-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k283-dhc-sha1.csv
index 6852d2f..6852d2f 100644
--- a/src/cz/crcs/ectester/data/test/nist/k283-dhc-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k283-dhc-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/k283-keyCAVS.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k283-keyCAVS.csv
index f91e05a..f91e05a 100644
--- a/src/cz/crcs/ectester/data/test/nist/k283-keyCAVS.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k283-keyCAVS.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/k283-keyIUT.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k283-keyIUT.csv
index 2b19347..2b19347 100644
--- a/src/cz/crcs/ectester/data/test/nist/k283-keyIUT.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k283-keyIUT.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/k409-dhc-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k409-dhc-raw.csv
index f02c0dd..f02c0dd 100644
--- a/src/cz/crcs/ectester/data/test/nist/k409-dhc-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k409-dhc-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/k409-dhc-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k409-dhc-sha1.csv
index f4f5cdc..f4f5cdc 100644
--- a/src/cz/crcs/ectester/data/test/nist/k409-dhc-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k409-dhc-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/k409-keyCAVS.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k409-keyCAVS.csv
index cc40c76..cc40c76 100644
--- a/src/cz/crcs/ectester/data/test/nist/k409-keyCAVS.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k409-keyCAVS.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/k409-keyIUT.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k409-keyIUT.csv
index e8d0c97..e8d0c97 100644
--- a/src/cz/crcs/ectester/data/test/nist/k409-keyIUT.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k409-keyIUT.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/k571-dhc-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k571-dhc-raw.csv
index eca4a7b..eca4a7b 100644
--- a/src/cz/crcs/ectester/data/test/nist/k571-dhc-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k571-dhc-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/k571-dhc-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k571-dhc-sha1.csv
index 938ba18..938ba18 100644
--- a/src/cz/crcs/ectester/data/test/nist/k571-dhc-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k571-dhc-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/k571-keyCAVS.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k571-keyCAVS.csv
index 71d1e64..71d1e64 100644
--- a/src/cz/crcs/ectester/data/test/nist/k571-keyCAVS.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k571-keyCAVS.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/k571-keyIUT.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k571-keyIUT.csv
index 6222122..6222122 100644
--- a/src/cz/crcs/ectester/data/test/nist/k571-keyIUT.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/k571-keyIUT.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/p192-dhc-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p192-dhc-raw.csv
index 4f139f7..4f139f7 100644
--- a/src/cz/crcs/ectester/data/test/nist/p192-dhc-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p192-dhc-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/p192-dhc-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p192-dhc-sha1.csv
index f3e01bf..f3e01bf 100644
--- a/src/cz/crcs/ectester/data/test/nist/p192-dhc-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p192-dhc-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/p192-keyCAVS.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p192-keyCAVS.csv
index d8a3fab..d8a3fab 100644
--- a/src/cz/crcs/ectester/data/test/nist/p192-keyCAVS.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p192-keyCAVS.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/p192-keyIUT.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p192-keyIUT.csv
index fb58f03..fb58f03 100644
--- a/src/cz/crcs/ectester/data/test/nist/p192-keyIUT.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p192-keyIUT.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/p224-dhc-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p224-dhc-raw.csv
index 5a3bb67..5a3bb67 100644
--- a/src/cz/crcs/ectester/data/test/nist/p224-dhc-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p224-dhc-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/p224-dhc-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p224-dhc-sha1.csv
index 8e0e8ec..8e0e8ec 100644
--- a/src/cz/crcs/ectester/data/test/nist/p224-dhc-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p224-dhc-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/p224-keyCAVS.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p224-keyCAVS.csv
index 183d654..183d654 100644
--- a/src/cz/crcs/ectester/data/test/nist/p224-keyCAVS.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p224-keyCAVS.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/p224-keyIUT.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p224-keyIUT.csv
index 24b992b..24b992b 100644
--- a/src/cz/crcs/ectester/data/test/nist/p224-keyIUT.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p224-keyIUT.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/p256-dhc-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p256-dhc-raw.csv
index cd8291f..cd8291f 100644
--- a/src/cz/crcs/ectester/data/test/nist/p256-dhc-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p256-dhc-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/p256-dhc-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p256-dhc-sha1.csv
index 021f92b..021f92b 100644
--- a/src/cz/crcs/ectester/data/test/nist/p256-dhc-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p256-dhc-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/p256-keyCAVS.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p256-keyCAVS.csv
index e7b0176..e7b0176 100644
--- a/src/cz/crcs/ectester/data/test/nist/p256-keyCAVS.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p256-keyCAVS.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/p256-keyIUT.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p256-keyIUT.csv
index 0df2f99..0df2f99 100644
--- a/src/cz/crcs/ectester/data/test/nist/p256-keyIUT.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p256-keyIUT.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/p384-dhc-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p384-dhc-raw.csv
index 725e299..725e299 100644
--- a/src/cz/crcs/ectester/data/test/nist/p384-dhc-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p384-dhc-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/p384-dhc-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p384-dhc-sha1.csv
index 765e6de..765e6de 100644
--- a/src/cz/crcs/ectester/data/test/nist/p384-dhc-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p384-dhc-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/p384-keyCAVS.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p384-keyCAVS.csv
index 64c6328..64c6328 100644
--- a/src/cz/crcs/ectester/data/test/nist/p384-keyCAVS.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p384-keyCAVS.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/p384-keyIUT.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p384-keyIUT.csv
index 65cf43d..65cf43d 100644
--- a/src/cz/crcs/ectester/data/test/nist/p384-keyIUT.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p384-keyIUT.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/p521-dhc-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p521-dhc-raw.csv
index 6467649..6467649 100644
--- a/src/cz/crcs/ectester/data/test/nist/p521-dhc-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p521-dhc-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/p521-dhc-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p521-dhc-sha1.csv
index 2f4f557..2f4f557 100644
--- a/src/cz/crcs/ectester/data/test/nist/p521-dhc-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p521-dhc-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/p521-keyCAVS.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p521-keyCAVS.csv
index c00148e..c00148e 100644
--- a/src/cz/crcs/ectester/data/test/nist/p521-keyCAVS.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p521-keyCAVS.csv
diff --git a/src/cz/crcs/ectester/data/test/nist/p521-keyIUT.csv b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p521-keyIUT.csv
index b36b3b6..b36b3b6 100644
--- a/src/cz/crcs/ectester/data/test/nist/p521-keyIUT.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/nist/p521-keyIUT.csv
diff --git a/src/cz/crcs/ectester/data/test/results.xml b/common/src/main/resources/cz/crcs/ectester/data/test/results.xml
index fa43e4b..fa43e4b 100644
--- a/src/cz/crcs/ectester/data/test/results.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/results.xml
diff --git a/src/cz/crcs/ectester/data/test/secg/secp160r1-dh-kdf.csv b/common/src/main/resources/cz/crcs/ectester/data/test/secg/secp160r1-dh-kdf.csv
index eb56e26..eb56e26 100644
--- a/src/cz/crcs/ectester/data/test/secg/secp160r1-dh-kdf.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/secg/secp160r1-dh-kdf.csv
diff --git a/src/cz/crcs/ectester/data/test/secg/secp160r1-dh-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/secg/secp160r1-dh-raw.csv
index c246c32..c246c32 100644
--- a/src/cz/crcs/ectester/data/test/secg/secp160r1-dh-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/secg/secp160r1-dh-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/secg/secp160r1-dh-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/secg/secp160r1-dh-sha1.csv
index d83d932..d83d932 100644
--- a/src/cz/crcs/ectester/data/test/secg/secp160r1-dh-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/secg/secp160r1-dh-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/secg/secp160r1-keyU.csv b/common/src/main/resources/cz/crcs/ectester/data/test/secg/secp160r1-keyU.csv
index dcbe885..dcbe885 100644
--- a/src/cz/crcs/ectester/data/test/secg/secp160r1-keyU.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/secg/secp160r1-keyU.csv
diff --git a/src/cz/crcs/ectester/data/test/secg/secp160r1-keyV.csv b/common/src/main/resources/cz/crcs/ectester/data/test/secg/secp160r1-keyV.csv
index 59aacda..59aacda 100644
--- a/src/cz/crcs/ectester/data/test/secg/secp160r1-keyV.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/secg/secp160r1-keyV.csv
diff --git a/src/cz/crcs/ectester/data/test/secg/sect163k1-dh-kdf.csv b/common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-dh-kdf.csv
index 06a416f..06a416f 100644
--- a/src/cz/crcs/ectester/data/test/secg/sect163k1-dh-kdf.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-dh-kdf.csv
diff --git a/src/cz/crcs/ectester/data/test/secg/sect163k1-dh-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-dh-raw.csv
index 94eacd8..94eacd8 100644
--- a/src/cz/crcs/ectester/data/test/secg/sect163k1-dh-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-dh-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/secg/sect163k1-dh-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-dh-sha1.csv
index 651b80c..651b80c 100644
--- a/src/cz/crcs/ectester/data/test/secg/sect163k1-dh-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-dh-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/secg/sect163k1-dhc-kdf.csv b/common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-dhc-kdf.csv
index c234f31..c234f31 100644
--- a/src/cz/crcs/ectester/data/test/secg/sect163k1-dhc-kdf.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-dhc-kdf.csv
diff --git a/src/cz/crcs/ectester/data/test/secg/sect163k1-dhc-raw.csv b/common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-dhc-raw.csv
index 46a0a0f..46a0a0f 100644
--- a/src/cz/crcs/ectester/data/test/secg/sect163k1-dhc-raw.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-dhc-raw.csv
diff --git a/src/cz/crcs/ectester/data/test/secg/sect163k1-dhc-sha1.csv b/common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-dhc-sha1.csv
index 4839c25..4839c25 100644
--- a/src/cz/crcs/ectester/data/test/secg/sect163k1-dhc-sha1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-dhc-sha1.csv
diff --git a/src/cz/crcs/ectester/data/test/secg/sect163k1-keyU.csv b/common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-keyU.csv
index b516f3b..b516f3b 100644
--- a/src/cz/crcs/ectester/data/test/secg/sect163k1-keyU.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-keyU.csv
diff --git a/src/cz/crcs/ectester/data/test/secg/sect163k1-keyV.csv b/common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-keyV.csv
index 00ab019..00ab019 100644
--- a/src/cz/crcs/ectester/data/test/secg/sect163k1-keyV.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/test/secg/sect163k1-keyV.csv
diff --git a/src/cz/crcs/ectester/data/twist/cofactor/cofactor128p4.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/cofactor/cofactor128p4.xml
index b558f8e..b558f8e 100644
--- a/src/cz/crcs/ectester/data/twist/cofactor/cofactor128p4.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/cofactor/cofactor128p4.xml
diff --git a/src/cz/crcs/ectester/data/twist/cofactor/cofactor160p4.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/cofactor/cofactor160p4.xml
index bb712af..bb712af 100644
--- a/src/cz/crcs/ectester/data/twist/cofactor/cofactor160p4.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/cofactor/cofactor160p4.xml
diff --git a/src/cz/crcs/ectester/data/twist/keys.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/keys.xml
index 3292004..3292004 100644
--- a/src/cz/crcs/ectester/data/twist/keys.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/keys.xml
diff --git a/src/cz/crcs/ectester/data/twist/nist/b163.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/b163.xml
index 03690ac..03690ac 100644
--- a/src/cz/crcs/ectester/data/twist/nist/b163.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/b163.xml
diff --git a/src/cz/crcs/ectester/data/twist/nist/b233.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/b233.xml
index 7a0b579..7a0b579 100644
--- a/src/cz/crcs/ectester/data/twist/nist/b233.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/b233.xml
diff --git a/src/cz/crcs/ectester/data/twist/nist/b283.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/b283.xml
index 7f57585..7f57585 100644
--- a/src/cz/crcs/ectester/data/twist/nist/b283.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/b283.xml
diff --git a/src/cz/crcs/ectester/data/twist/nist/k163.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/k163.xml
index 31040c0..31040c0 100644
--- a/src/cz/crcs/ectester/data/twist/nist/k163.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/k163.xml
diff --git a/src/cz/crcs/ectester/data/twist/nist/k233.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/k233.xml
index 6354ff9..6354ff9 100644
--- a/src/cz/crcs/ectester/data/twist/nist/k233.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/k233.xml
diff --git a/src/cz/crcs/ectester/data/twist/nist/k283.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/k283.xml
index 48a2dd9..48a2dd9 100644
--- a/src/cz/crcs/ectester/data/twist/nist/k283.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/k283.xml
diff --git a/src/cz/crcs/ectester/data/twist/nist/p192.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/p192.xml
index d1fdf49..d1fdf49 100644
--- a/src/cz/crcs/ectester/data/twist/nist/p192.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/p192.xml
diff --git a/src/cz/crcs/ectester/data/twist/nist/p224.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/p224.xml
index 3ae34ff..3ae34ff 100644
--- a/src/cz/crcs/ectester/data/twist/nist/p224.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/p224.xml
diff --git a/src/cz/crcs/ectester/data/twist/nist/p256.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/p256.xml
index 2e1c55e..2e1c55e 100644
--- a/src/cz/crcs/ectester/data/twist/nist/p256.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/p256.xml
diff --git a/src/cz/crcs/ectester/data/twist/nist/p384.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/p384.xml
index 8e0d2b6..8e0d2b6 100644
--- a/src/cz/crcs/ectester/data/twist/nist/p384.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/p384.xml
diff --git a/src/cz/crcs/ectester/data/twist/nist/p521.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/p521.xml
index 1564c80..1564c80 100644
--- a/src/cz/crcs/ectester/data/twist/nist/p521.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/nist/p521.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/secp112r1.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp112r1.xml
index bea215a..bea215a 100644
--- a/src/cz/crcs/ectester/data/twist/secg/secp112r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp112r1.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/secp112r2.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp112r2.xml
index f1d0fee..f1d0fee 100644
--- a/src/cz/crcs/ectester/data/twist/secg/secp112r2.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp112r2.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/secp128r1.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp128r1.xml
index e9bf07b..e9bf07b 100644
--- a/src/cz/crcs/ectester/data/twist/secg/secp128r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp128r1.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/secp128r2.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp128r2.xml
index fdd9028..fdd9028 100644
--- a/src/cz/crcs/ectester/data/twist/secg/secp128r2.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp128r2.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/secp160k1.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp160k1.xml
index 8d1cc53..8d1cc53 100644
--- a/src/cz/crcs/ectester/data/twist/secg/secp160k1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp160k1.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/secp160r1.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp160r1.xml
index dece980..dece980 100644
--- a/src/cz/crcs/ectester/data/twist/secg/secp160r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp160r1.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/secp160r2.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp160r2.xml
index bdb8a03..bdb8a03 100644
--- a/src/cz/crcs/ectester/data/twist/secg/secp160r2.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp160r2.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/secp192k1.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp192k1.xml
index 457a414..457a414 100644
--- a/src/cz/crcs/ectester/data/twist/secg/secp192k1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp192k1.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/secp192r1.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp192r1.xml
index 16ba7db..16ba7db 100644
--- a/src/cz/crcs/ectester/data/twist/secg/secp192r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp192r1.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/secp224r1.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp224r1.xml
index ee6782e..ee6782e 100644
--- a/src/cz/crcs/ectester/data/twist/secg/secp224r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp224r1.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/secp256k1.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp256k1.xml
index 467641e..467641e 100644
--- a/src/cz/crcs/ectester/data/twist/secg/secp256k1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp256k1.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/secp256r1.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp256r1.xml
index b385548..b385548 100644
--- a/src/cz/crcs/ectester/data/twist/secg/secp256r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp256r1.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/secp384r1.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp384r1.xml
index 2ddbe9b..2ddbe9b 100644
--- a/src/cz/crcs/ectester/data/twist/secg/secp384r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp384r1.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/secp521r1.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp521r1.xml
index 105efa3..105efa3 100644
--- a/src/cz/crcs/ectester/data/twist/secg/secp521r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/secp521r1.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/sect163k1.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect163k1.xml
index 754e8e6..754e8e6 100644
--- a/src/cz/crcs/ectester/data/twist/secg/sect163k1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect163k1.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/sect163r1.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect163r1.xml
index dd7d798..dd7d798 100644
--- a/src/cz/crcs/ectester/data/twist/secg/sect163r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect163r1.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/sect163r2.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect163r2.xml
index 421887d..421887d 100644
--- a/src/cz/crcs/ectester/data/twist/secg/sect163r2.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect163r2.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/sect233k1.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect233k1.xml
index cf8524c..cf8524c 100644
--- a/src/cz/crcs/ectester/data/twist/secg/sect233k1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect233k1.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/sect233r1.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect233r1.xml
index 45eecf4..45eecf4 100644
--- a/src/cz/crcs/ectester/data/twist/secg/sect233r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect233r1.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/sect239k1.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect239k1.xml
index bc17d4f..bc17d4f 100644
--- a/src/cz/crcs/ectester/data/twist/secg/sect239k1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect239k1.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/sect283k1.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect283k1.xml
index 65ecb63..65ecb63 100644
--- a/src/cz/crcs/ectester/data/twist/secg/sect283k1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect283k1.xml
diff --git a/src/cz/crcs/ectester/data/twist/secg/sect283r1.xml b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect283r1.xml
index e2913a0..e2913a0 100644
--- a/src/cz/crcs/ectester/data/twist/secg/sect283r1.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/twist/secg/sect283r1.xml
diff --git a/src/cz/crcs/ectester/data/wrong/curves.xml b/common/src/main/resources/cz/crcs/ectester/data/wrong/curves.xml
index 2a51474..2a51474 100644
--- a/src/cz/crcs/ectester/data/wrong/curves.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/curves.xml
diff --git a/src/cz/crcs/ectester/data/wrong/keys.xml b/common/src/main/resources/cz/crcs/ectester/data/wrong/keys.xml
index 4be8b4d..4be8b4d 100644
--- a/src/cz/crcs/ectester/data/wrong/keys.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/keys.xml
diff --git a/src/cz/crcs/ectester/data/wrong/results.xml b/common/src/main/resources/cz/crcs/ectester/data/wrong/results.xml
index e3f0967..e3f0967 100644
--- a/src/cz/crcs/ectester/data/wrong/results.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/results.xml
diff --git a/src/cz/crcs/ectester/data/wrong/wrongp128.csv b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp128.csv
index d24da0e..d24da0e 100644
--- a/src/cz/crcs/ectester/data/wrong/wrongp128.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp128.csv
diff --git a/src/cz/crcs/ectester/data/wrong/wrongp160.csv b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp160.csv
index 20dea88..20dea88 100644
--- a/src/cz/crcs/ectester/data/wrong/wrongp160.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp160.csv
diff --git a/src/cz/crcs/ectester/data/wrong/wrongp192.csv b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp192.csv
index 7d2241c..7d2241c 100644
--- a/src/cz/crcs/ectester/data/wrong/wrongp192.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp192.csv
diff --git a/src/cz/crcs/ectester/data/wrong/wrongp224.csv b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp224.csv
index aeaaae4..aeaaae4 100644
--- a/src/cz/crcs/ectester/data/wrong/wrongp224.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp224.csv
diff --git a/src/cz/crcs/ectester/data/wrong/wrongp256.csv b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp256.csv
index 6902618..6902618 100644
--- a/src/cz/crcs/ectester/data/wrong/wrongp256.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp256.csv
diff --git a/src/cz/crcs/ectester/data/wrong/wrongp384.csv b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp384.csv
index 694ae78..694ae78 100644
--- a/src/cz/crcs/ectester/data/wrong/wrongp384.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp384.csv
diff --git a/src/cz/crcs/ectester/data/wrong/wrongp521.csv b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp521.csv
index 76fe2f2..76fe2f2 100644
--- a/src/cz/crcs/ectester/data/wrong/wrongp521.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongp521.csv
diff --git a/src/cz/crcs/ectester/data/wrong/wrongt163.csv b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongt163.csv
index 88b142e..88b142e 100644
--- a/src/cz/crcs/ectester/data/wrong/wrongt163.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongt163.csv
diff --git a/src/cz/crcs/ectester/data/wrong/wrongt233.csv b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongt233.csv
index 291cdfe..291cdfe 100644
--- a/src/cz/crcs/ectester/data/wrong/wrongt233.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongt233.csv
diff --git a/src/cz/crcs/ectester/data/wrong/wrongt239.csv b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongt239.csv
index bef2e14..bef2e14 100644
--- a/src/cz/crcs/ectester/data/wrong/wrongt239.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongt239.csv
diff --git a/src/cz/crcs/ectester/data/wrong/wrongt283.csv b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongt283.csv
index 736fe15..736fe15 100644
--- a/src/cz/crcs/ectester/data/wrong/wrongt283.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongt283.csv
diff --git a/src/cz/crcs/ectester/data/wrong/wrongt409.csv b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongt409.csv
index fe7e040..fe7e040 100644
--- a/src/cz/crcs/ectester/data/wrong/wrongt409.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongt409.csv
diff --git a/src/cz/crcs/ectester/data/wrong/wrongt571.csv b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongt571.csv
index 2fcd0df..2fcd0df 100644
--- a/src/cz/crcs/ectester/data/wrong/wrongt571.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/wrong/wrongt571.csv
diff --git a/src/cz/crcs/ectester/data/wycheproof/keys.xml b/common/src/main/resources/cz/crcs/ectester/data/wycheproof/keys.xml
index ee7280c..ee7280c 100644
--- a/src/cz/crcs/ectester/data/wycheproof/keys.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/wycheproof/keys.xml
diff --git a/src/cz/crcs/ectester/data/wycheproof/results.xml b/common/src/main/resources/cz/crcs/ectester/data/wycheproof/results.xml
index 094043c..094043c 100644
--- a/src/cz/crcs/ectester/data/wycheproof/results.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/wycheproof/results.xml
diff --git a/src/cz/crcs/ectester/data/x962/curves.xml b/common/src/main/resources/cz/crcs/ectester/data/x962/curves.xml
index eee64ad..eee64ad 100644
--- a/src/cz/crcs/ectester/data/x962/curves.xml
+++ b/common/src/main/resources/cz/crcs/ectester/data/x962/curves.xml
diff --git a/src/cz/crcs/ectester/data/x962/prime192v1.csv b/common/src/main/resources/cz/crcs/ectester/data/x962/prime192v1.csv
index 07f9154..07f9154 100644
--- a/src/cz/crcs/ectester/data/x962/prime192v1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/x962/prime192v1.csv
diff --git a/src/cz/crcs/ectester/data/x962/prime192v2.csv b/common/src/main/resources/cz/crcs/ectester/data/x962/prime192v2.csv
index ee6f1a2..ee6f1a2 100644
--- a/src/cz/crcs/ectester/data/x962/prime192v2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/x962/prime192v2.csv
diff --git a/src/cz/crcs/ectester/data/x962/prime192v3.csv b/common/src/main/resources/cz/crcs/ectester/data/x962/prime192v3.csv
index f80fd5b..f80fd5b 100644
--- a/src/cz/crcs/ectester/data/x962/prime192v3.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/x962/prime192v3.csv
diff --git a/src/cz/crcs/ectester/data/x962/prime239v1.csv b/common/src/main/resources/cz/crcs/ectester/data/x962/prime239v1.csv
index c9d704b..c9d704b 100644
--- a/src/cz/crcs/ectester/data/x962/prime239v1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/x962/prime239v1.csv
diff --git a/src/cz/crcs/ectester/data/x962/prime239v2.csv b/common/src/main/resources/cz/crcs/ectester/data/x962/prime239v2.csv
index 100e60b..100e60b 100644
--- a/src/cz/crcs/ectester/data/x962/prime239v2.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/x962/prime239v2.csv
diff --git a/src/cz/crcs/ectester/data/x962/prime239v3.csv b/common/src/main/resources/cz/crcs/ectester/data/x962/prime239v3.csv
index ce8b38a..ce8b38a 100644
--- a/src/cz/crcs/ectester/data/x962/prime239v3.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/x962/prime239v3.csv
diff --git a/src/cz/crcs/ectester/data/x962/prime256v1.csv b/common/src/main/resources/cz/crcs/ectester/data/x962/prime256v1.csv
index c5a2440..c5a2440 100644
--- a/src/cz/crcs/ectester/data/x962/prime256v1.csv
+++ b/common/src/main/resources/cz/crcs/ectester/data/x962/prime256v1.csv
diff --git a/dist/README.TXT b/dist/README.TXT
deleted file mode 100644
index 64c76a6..0000000
--- a/dist/README.TXT
+++ /dev/null
@@ -1,16 +0,0 @@
-========================
-BUILD OUTPUT DESCRIPTION
-========================
-
-After building (with package target) this directory should contain the files:
-
-- ECTesterReader.jar
-- ECTesterReader-dist.jar
-- ECTesterStandalone.jar
-- ECTesterStandalone-dist.jar
-- ectester-reader.sh
-- ectester-reader.bat
-
-The *-dist.jar variants of JAR files are self-contained executable JAR files with
-all the dependencies inside them.
-
diff --git a/docs/DEVELOPING.md b/docs/DEVELOPING.md
index 863361b..a5eda6c 100644
--- a/docs/DEVELOPING.md
+++ b/docs/DEVELOPING.md
@@ -6,9 +6,10 @@ developing the ECTester tool itself.
## Developing ECTester standalone modules
- Create Java classes inheriting Native{ECPrivateKey,ECPublicKey,KeyPairGeneratorSpi,KeyAgreementSpi,SignatureSpi}.
- - Add those classes to `build-standalone.xml` header generation.
- - Generate `native.h` headers for new classes using `build-standalone.xml`.
- - Create module file (C/C++) in `cz/crcs/ectester/standalone/libs/jni`, and add it to the Makefile.
+ - Run `gradle :standalone:compileJava` to compile the classes and obtain a native header file. It will be in
+ `standalone/build/generated/sources/headers/java/main`. Ideally, copy the generated function declarations into
+ the `native.h` file found in the `standalone/src/java/resources/cz/crcs/ectester/standalone/libs/jni` directory.
+ - Create module file (C/C++) in `standalone/src/java/resources/cz/crcs/ectester/standalone/libs/jni`, and add it to the Makefile.
- Implement the required JNI functions, look at existing modules for what is expected, what the contract
of the function is, use the `native_timing_*` functions around points that should be measurable.
- Compile and run ECTester using your new module. \ No newline at end of file
diff --git a/docs/IMPLEMENTATIONS.md b/docs/IMPLEMENTATIONS.md
deleted file mode 100644
index d333ed5..0000000
--- a/docs/IMPLEMENTATIONS.md
+++ /dev/null
@@ -1,562 +0,0 @@
-# Implementations
-
-This document contains information about possible implementation choices and algorithms when implementing elliptic curve cryptography. It is mainly concerned with curve models, coordinate systems, addition formulas and scalar multiplication algorithms. Also, only curves over \( \mathbb{F}_p \) are analyzed.
-
----
-
-## Curve models
-
-### Weierstrass (full)
-
-#### Affine
-$$ y^2 + a_1xy + a_3y = x^3 + a_2x^2 + a_4x + a_6 $$
-
-#### Projective
-$$ Y^2Z + a_1XYZ + a_3YZ^2 = X^3 + a_2X^2Z + a_4XZ^2 + a_6Z^3 $$
-
-
-### Weierstrass (short)
-
-[EFD entry](https://www.hyperelliptic.org/EFD/g1p/auto-shortw.html)
-
- toweierstrass weierx = x
- toweierstrass weiery = y
- a0 = 1
- a1 = 0
- a2 = 0
- a3 = 0
- a4 = a
- a6 = b
- fromweierstrass x = weierx
- fromweierstrass y = weiery
-
-#### Affine
-$$ y^2 = x^3 + a x + b $$
-
-#### Projective
-$$ Y^2Z = X^3 + aXZ^2 + bZ^3 $$
-
-#### Jacobian
-$$ Y^2 = X^3 + aXZ^4 + bZ^6 $$
-
-
-### Montgomery
-
-[EFD entry](https://www.hyperelliptic.org/EFD/g1p/auto-montgom.html)
-
- toweierstrass weierx = x
- toweierstrass weiery = y
- a0 = b
- a1 = 0
- a2 = a
- a3 = 0
- a4 = 1
- a6 = 0
- fromweierstrass x = weierx
- fromweierstrass y = weiery
-
-#### Affine
-$$ By^2 = x^3 + Ax^2 + x $$
-
-
-### Edwards
-
-[EFD entry](https://www.hyperelliptic.org/EFD/g1p/auto-edwards.html)
-
- toweierstrass u = (c+y)/(c-y)
- toweierstrass v = 2 c (c+y)/(x(c-y))
- a0 = 1/(1-d c^4)
- a1 = 0
- a2 = 4/(1-d c^4)-2
- a3 = 0
- a4 = 1
- a6 = 0
- fromweierstrass x = 2 c u/v
- fromweierstrass y = c(u-1)/(u+1)
-
-#### Affine
-$$ x^2 + y^2 = c^2 (1 + dx^2y^2) $$
-
-
-### Twisted Edwards
-
-[EFD entry](https://www.hyperelliptic.org/EFD/g1p/auto-twisted.html)
-
- toweierstrass u = (1+y)/(1-y)
- toweierstrass v = 2 (1+y)/(x(1-y))
- a0 = 1/(a-d)
- a1 = 0
- a2 = 4 a/(a-d)-2
- a3 = 0
- a4 = 1
- a6 = 0
- fromweierstrass x = 2 u/v
- fromweierstrass y = (u-1)/(u+1)
-
-#### Affine
-$$ ax^2 + y^2=1 + dx^2y^2 $$
-
-
-### Hessian
-
-[EFD entry](https://www.hyperelliptic.org/EFD/g1p/auto-hessian.html)
-
- toweierstrass u = 12(d^3-1)/(d+x+y)-9 d^2
- toweierstrass v = 36(y-x)(d^3-1)/(d+x+y)
- a0 = 1
- a1 = 0
- a2 = 0
- a3 = 0
- a4 = -27 d(d^3+8)
- a6 = 54(d^6-20 d^3-8)
- fromweierstrass x = (36(d^3-1)-v)/(6(u+9 d^2))-d/2
- fromweierstrass y = (v+36(d^3-1))/(6(u+9 d^2))-d/2
-
-#### Affine
-$$ x^3+y^3+1=3dxy $$
-
-#### Projective
-$$ X^3 + Y^3 + Z^3 = 3dXYZ $$
-
-
----
-
-## Coordinates
-
-### Affine
-
-$$ [x, y] \in \mathbb{K}^2 $$
-
-*(Weierstrass)* infinity is special cased, sometimes represented as \( [0] \).
-
-*(Weierstrass)* negation: \(-[x, y] = [x, -y] \)
-
- - To Projective: \( [x, y] \rightarrow (x : y : 1) \)
- - To Jacobian: \( [x, y] \rightarrow (x : y : 1) \)
- - To Chudnovsky: \( [x, y] \rightarrow (x : y : 1 : 1 : 1) \)
-
-### Projective
-\begin{align*}
-[X, Y, Z] &\in \mathbb{K}^3 \\
-[X_1, Y_1, Z_1] &\sim [X_2, Y_2, Z_2] \\
-\text{if}\ X_1 &= λ X_2, \\
- Y_1 &= λ Y_2, \\
- Z_1 &= λ Z_2 \\
-\text{for some}\ λ &\in \mathbb{K}^* \\
-(X : Y : Z) &= \{(λ X, λ Y, λ Z) | λ \in \mathbb{K}^* \}
-\end{align*}
-
-*(Weierstrass)* infinity is \((0 : 1 : 0)\).
-
-*(Weierstrass)* negation: \( -(X : Y : Z) = (X : -Y : Z) \)
-
- - To Affine: \( (X : Y : Z) \rightarrow [X/Z, Y/Z] \)
- - To Jacobian: \( (X : Y : Z) \rightarrow (X/Z : Y/Z : 1) \) ?
- - To Chudnovsky: \( (X : Y : Z) \rightarrow (X/Z : Y/Z : 1 : 1 : 1) \) ?
-
-### Jacobian
-\begin{align*}
-[X, Y, Z] &\in \mathbb{K}^3 \\
-[X_1, Y_1, Z_1] &\sim [X_2, Y_2, Z_2] \\
-\text{if}\ X_1 &= λ^2 X_2, \\
- Y_1 &= λ^3 Y_2, \\
- Z_1 &= λ Z_2 \\
-\text{for some}\ λ &\in \mathbb{K}^* \\
-(X : Y : Z) &= \{(λ^2 X, λ^3 Y, λ Z) | λ \in \mathbb{K}^* \}
-\end{align*}
-
-*(Weierstrass)* infinity is \( (1 : 1 : 0) \).
-
-*(Weierstrass)* negation: \( -(X : Y : Z) = (X : -Y : Z) \)
-
- - To Affine: \( (X : Y : Z) \rightarrow [X/Z^2, Y/Z^3] \)
- - To Projective: \( (X : Y : Z) \rightarrow (X/Z^2 : Y/Z^3 : 1) \) ?
- - To Chudnovsky: \( (X : Y : Z) \rightarrow (X : Y : Z : Z^2 : Z^3) \)
-
-### Chudnovsky
-\begin{align*}
-[X, Y, Z, Z^2, Z^3] &\in \mathbb{K}^5 \\
-(X : Y : Z : Z^2 : Z^3 ) &= \{(λ^2 X, λ^3 Y, λ Z, λ^2 Z^2, λ^3 Z^3) | λ \in \mathbb{K}^* \}
-\end{align*}
-
-*(Weierstrass)* infinity is \( (1 : 1 : 0 : 0 : 0) \). ?
-
-*(Weierstrass)* negation: \( -(X : Y : Z : Z^2 : Z^3) = (X : -Y : Z : Z^2 : Z^3) \)
-
- - To Affine: \( (X : Y : Z : Z^2 : Z^3) \rightarrow [X/Z^2, Y/Z^3] \)
- - To Projective: \( (X : Y : Z : Z^2 : Z^3) \rightarrow (X/Z^2 : Y/Z^3 : 1) \) ?
- - To Jacobian: \( (X : Y : Z : Z^2 : Z^3) \rightarrow (X : Y : Z) \)
-
-
----
-
-## Formulas
-
- - Addition
- - Doubling
- - Tripling
- - Differential addition
- - Differential addition and doubling
- - Scaling
-
-See EFD[^3].
-
----
-
-## Scalar multiplication
-
-See TAOCP volume 2, section 4.6.3 for introduction to multiplication/exponentiation and addition/multiplication chains.[^5]
-
-Scalar multiplication on elliptic curves is very similar to usual multiplication/exponentiation in general additive/multiplicative groups, respectively, with some additional structure:
-
- - \(A + B\) when \(A \ne B\) might be a different operation from \(A + A = [2]A\), and also sometimes takes different time.
- - negation \(-A\) is easy/fast.
- - \(0\) sometimes has a special representation and thus requires special casing.
- - sometimes, there exists a fast operation of \(\phi: E(\mathbb{F}_p) \rightarrow E(\mathbb{F}_p) \) with \( \phi(P) = [k]P \) for some \(k \in \mathbb{K}\) computable using some endomorphism on the curve.
-
-Some links:
-
- - [wiki/Addition_chain](https://en.wikipedia.org/wiki/Addition_chain)
- - [wiki/Addition-subtraction_chain](https://en.wikipedia.org/wiki/Addition-subtraction_chain)
- - [wiki/Exponentiation_by_squaring](https://en.wikipedia.org/wiki/Exponentiation_by_squaring)
- - [wiki/Addition-chain_exponentiation](https://en.wikipedia.org/wiki/Addition-chain_exponentiation)
-
-We define:
-
- - \( \lambda(k) = \lfloor \log_2 k \rfloor \) , the size of k
- - \( k_i \) , the *i*-th bit of *k*
- - \( \nu(k) = \vert \{ i \vert 0 \le i \le \lambda(k), k_i = 1\} \vert \) , the number of nonzero bits in *k*
- - \( l(k) \) , the length of NAF of *k*
- - \( \sigma(k) = \vert \{ i \vert 0 \le i \le l(k), NAF(k)_i \ne 0 \} \vert \) , the number of nonzero values in the NAF of *k*
- - \( C_2 \) , the cost of doubling a point
- - \( C_+ \) , the cost of point addition
- - \( C_{algo}(k) \) , the cost of scalar multiplication by *k* of the algorithm *algo*
- - *Addition chain* of *n*, is a sequence of integers:
-\( 1 = a_0, a_1, \ldots, a_r = n\),
-where \(a_i = a_j + a_k\) for some \( k \le j < i, \forall i \in \{ 1, 2, \ldots, r \} \)
- - *Addition-subtraction chain* of *n*, is a sequence of integers:
-\( 1 = a_0, a_1, \ldots, a_r = n\),
-where \(a_i = \pm a_j \pm a_k\) for some \( k \le j < i, \forall i \in \{ 1, 2, \ldots, r \} \)
- - *Addition sequence* for \( r_1, r_2, \ldots, r_t \) is an addition chain: \( 1 = a_1, a_2, \ldots, a_l \) which contains \( r_1, r_2, \ldots, r_t \). Useful when operating with one element and many powers \( g^{r_1}, g^{r_2}, \ldots \)
- - *Vector addition chain* for \(r \in \mathbb{N}^t \) is a sequence of elements \( v_i \) of \( \mathbb{N}^t \) such that \( v_i = e_i \) for \( 1 \le i \le t \) and \( v_i = v_j + v_k \) for \(j \le k < i \). Useful when powering many elements to many powers \( g_1^{r_1}, g_2^{r_2}, \ldots \)
-
-### Double and Add (binary exponentiation)
-
-Uses binary addition chain.
-
-<u>Algorithm 3.26</u> (right-to-left) in GECC[^1]
-
- INPUT: k = (k_{t-1}, ..., k_1, k_0)_2, P ∈ E(F_q).
- OUTPUT: [k]P.
- 1. Q ← ∞.
- 2. For i from 0 to t-1 do
- 2.1 If k_i = 1 then Q ← Q + P.
- 2.2 P ← 2P.
- 3. Return(Q).
-
-<u>Algorithm 3.27</u> (left-to-right) in GECC[^1]
-
- INPUT: k = (k_{t-1}, ..., k_1, k_0)_2, P ∈ E(F_q).
- OUTPUT: [k]P.
- 1. Q ← ∞.
- 2. For i from t - 1 downto 0 do
- 2.1 Q ← 2Q.
- 2.2 If k_i = 1 then Q ← Q + P.
- 3. Return(Q).
-
-Cost: \( C_{binexp}(k) = \lambda(k)C_2 + (\nu(k) - k_0)C_+\)[^7]
-
-### Double and Add Always (binary exponentiation - constant time)
-
-Uses binary addition chain, but does all the additions/multiplications.
-
-(right-to-left)
-
- INPUT: k = (k_{t-1}, ..., k_1, k_0)_2, P ∈ E(F_q).
- OUTPUT: [k]P.
- 1. Q ← ∞.
- 2. For i from t - 1 downto 0 do
- 2.1 If k_i = 1 then Q ← Q + P else Dummy ← Q + P.
- 2.2 P ← 2P.
- 3. Return(Q).
-
-(left-to-right)
-
- INPUT: k = (k_{t-1}, ..., k_1, k_0)_2, P ∈ E(F_q).
- OUTPUT: [k]P.
- 1. Q ← ∞.
- 2. For i from t - 1 downto 0 do
- 2.1 Q ← 2Q.
- 2.2 If k_i = 1 then Q ← Q + P else Dummy ← Q + P.
- 3. Return(Q).
-
-Cost: \( C_{const\_binexp}(k) = \lambda(k) (C_2 + C_+) \) ?
-
-
-### Binary NAF multiplication (signed binary exponentiation)
-
-**Definition 3.28**[^1] A *non-adjacent form (NAF)* of a positive integer *k* is an expression \( k = \Sigma_{i=0}^{l - 1} k_i 2^i \) where \(k_i \in \{0, ±1\}, k_{l−1} \ne 0\), and no two consecutive digits \( k_i \) are nonzero. The length of the NAF is *l*.
-
-<u>Algorithm 3.30</u> Computing the NAF of a positive integer[^1]
-
- INPUT: A positive integer k.
- OUTPUT: NAF(k).
- 1. i ← 0.
- 2. While k ≥ 1 do
- 2.1 If k is odd then:
- k_i ← 2 − (k mod 4), k ← k − k_i ;
- 2.2 Else:
- k_i ← 0.
- 2.3 k ← k/2, i ← i + 1.
- 3. Return(k_{i−1}, k_{i−2}, ..., k_1, k_0).
-
-<u>Algorithm 3.31</u> Binary NAF multiplication (left-to-right)[^1]
-
- INPUT: Positive integer k, P ∈ E(F_q).
- OUTPUT: [k]P.
- 1. Use Algorithm 3.30 to compute NAF(k).
- 2. Q ← ∞.
- 3. For i from l - 1 downto 0 do
- 3.1 Q ← 2Q.
- 3.2 If k_i = 1 then Q ← Q + P.
- 3.3 If k_i = -1 then Q ← Q - P.
- 4. Return(Q).
-
-Can be made constant time.
-
-Cost: \( C_{bin\_NAF} = l(k)C_2 + \sigma(k)C_+ + \text{NAF computation cost}\) ?
-
-### \(m\)-ary method
-
-Like binary double-and-add but uses a different base *m*.[^6]
-
- INPUT: k = (k_{t-1}, ..., k_1, k_0)_m, P ∈ E(F_q).
- OUTPUT: [k]P
- 1. Compute P_i = [i]P for i ∈ {1, 2, ..., m - 1}.
- 2. Q ← ∞.
- 3. For i from l downto 0 do
- 3.1 Q ← [m]Q.
- 3.2 Q ← Q + P_{k_i}.
- 4. Return(Q).
-
-### \( 2^r \) method
-
-Like \(m\)-ary method, with \( m = 2^r \), means that `[m]Q` is doable with only doubling.[^6]
-
-### Sliding window
-
-<u>Algorithm 13.6</u> Sliding window in HEHCC[^2]
-
- INPUT: Window width w, k = (k_{t-1}, ..., k_1, k_0)_2, P ∈ E(F_q).
- OUTPUT: [k]P
- 1. Compute P_i = [i]P for i ∈ {3, 5, ..., 2^w - 1}. //precomputation for fixed P
- 2. Q ← ∞, i ← t - 1.
- 3. While i ≥ 0 do
- 3.1 If k_i = 0 then:
- Q ← [2]Q, i ← i - 1.
- 3.2 Else:
- 3.2.1 s ← max(i - k + 1, 0).
- 3.2.2 While k_s = 0 do
- s ← s + 1.
- 3.2.3 For h from 1 to i - s + 1 do
- Q ← [2]Q.
- 3.2.4 u ← (k_i, ..., k_s)_2.
- 3.2.5 Q ← P_u. // u is odd.
- 3.2.6 i ← s - 1.
- 4. Return(Q).
-
-<u>Algorithm 3.38</u> Sliding window with NAF(signed sliding window) in GECC[^1]
-
- INPUT: Window width w, positive integer k, P ∈ E(F_q).
- OUTPUT: [k]P.
- 1. Use Algorithm 3.30 to compute NAF(k).
- 2. Compute P_i = [i]P for i ∈ {1, 3, ..., 2(2^w - (-1)^w)/3 - 1}. //precomputation for fixed P
- 3. Q ← ∞, i ← l - 1.
- 4. While i ≥ 0 do
- 4.1 If k_i = 0 then:
- t ← 1, u ← 0.
- 4.2 Else:
- find the largest t ≤ w such that u ← (k_i , ..., k_{i-t+1}) is odd.
- 4.3 Q ← [2^t]Q.
- 4.4 If u > 0 then:
- Q ← Q + P_u.
- 4.5 Else:
- if u < 0 then Q ← Q - P_{-u}.
- 4.6 i ← i - t.
- 5. Return(Q).
-
-### Window NAF multiplication
-
-**Definition 3.32**[^1] Let \( w \ge 2 \) be a positive integer. A *width-w NAF* of a positive integer *k* is an expression \( k = \Sigma_{i=0}^{l - 1} k_i 2^i \) where each nonzero coefficient \( k_i \) is odd, \( \vert k_i \vert < 2^{w - 1}, k_{l-1} \ne 0 \), and at most one of any *w* consecutive digits is nonzero. The length of the width-w NAF is *l*.
-
-
-<u>Algorithm 3.35</u> Computing the width-w NAF of a positive integer[^1]
-
- INPUT : Window width w, positive integer k.
- OUTPUT : NAF-w(k).
- 1. i ← 0.
- 2. While k ≥ 1 do
- 2.1 If k is odd then:
- k_i ← k mods 2^w , k ← k − k_i; // k mods 2^w is an integer u, -2^{w-1} ≤ u < 2^{w-1}, u ≡ k mod 2^w
- 2.2 Else:
- k_i ← 0.
- 2.3 k ← k/2, i ← i + 1.
- 3. Return(k_{i−1}, k_{i−2}, ..., k_1, k_0).
-
-<u>Algorithm 3.36</u> in GECC[^1]
-
- INPUT: Window width w, positive integer k, P ∈ E(F_q).
- OUTPUT: [k]P.
- 1. Use Algorithm 3.35 to compute NAF-w(k).
- 2. Compute P_i = [i]P for i ∈ {1, 3, 5, ..., 2^{w-1} - 1}. //precomputation for fixed P
- 3. Q ← ∞.
- 4. For i from l - 1 downto 0 do
- 4.1 Q ← 2Q.
- 4.2 If k_i != 0 then:
- If k_i > 0 then:
- Q ← Q + P_{k_i} ;
- Else:
- Q ← Q - P_{-k_i} .
- 5. Return(Q).
-
-### Fractional window
-
-[^10] and [^11]
-
-### Montgomery ladder
-
-The same name, Montgomery ladder, is used both for the general ladder idea of exponentiation/scalar-multiplication and the concrete *x*-coordinate only addition formulas and scalar multiplication algorithm on Montgomery curves.
-
-<u>Algorithm 13.35</u> in [^2] (general Montgomery ladder)
-
- INPUT: k = (k_{t-1}, ..., k_1, k_0)_2, P ∈ E(F_q).
- OUTPUT: [k]P .
- 1. P_1 ← P and P_2 ← [2]P
- 2. For i = t − 1 downto 0 do
- 2.1 If k_i = 0 then
- P_1 ← [2]P_1; P_2 ← P_1 + P_2.
- Else
- P_1 ← P_1 + P_2; P_2 ← [2]P_2.
- 3. Return(P_1).
-
-<u>Algorithm 3.</u> in [^8] (general Montgomery ladder)
-
- INPUT: G ∈ E(F_q), k = (1, k_{t−2}, ..., k_0)2
- OUTPUT: Y = kG
- 1. R0 ← G; R1 ← [2]G
- 2. for j = t − 2 downto 0 do
- 2.1 if (k_j = 0) then
- R1 ← R0 + R1; R0 ← [2]R0
- else [if (kj = 1)]
- R0 ← R0 + R1; R1 ← [2]R1
- 3. return R0
-
-Montgomery addition formulas (Projective coordinates/XZ coordinates):[^2]
-
- - Addition (\( n \ne m \)):
-\begin{align*}
-X_{m+n} &= Z_{m-n}((X_m - Z_m)(X_n + Z_n) + (X_m + Z_m)(X_n - Z_n))^2 \\
-Z_{m+n} &= X_{m-n}((X_m - Z_m)(X_n + Z_n) - (X_m + Z_m)(X_n - Z_n))^2
-\end{align*}
-
- - Doubling:
-\begin{align*}
-4X_nZ_n &= (X_n + Z_n)^2 - (X_n - Z_n)^2 \\
-X_{2n} &= (X_n + Z_n)^2 (X_n - Z_n)^2 \\
-Z_{2n} &= 4X_nZ_n((X_n - Z_n)^2 + ((A + 2)/4)(4X_nZ_n))
-\end{align*}
-
- - \( Y \) recovery:
-\begin{align*}
-x_n &= X_n / Z_n; \qquad x_{n+1} = X_{n+1} / Z_{n+1} \\
-y_n &= \frac{(x_1x_n + 1) (x_1 + x_n + 2A) - 2A - (x_1 - x_n)^2x_{n+1}}{2By_1}
-\end{align*}
-
-### Brier-Joye (+ Lopez-Dahab) ladder
-
-Not really a scalar-multiplication algorithm. Generalization of the stricter Montgomery ladder(the *x*-coordinate only scalar-mult algo and addition formulas on Montgomery curves) to short Weierstrass elliptic curves over fields of \( \text{char}\ \mathbb{K} \ne 2, 3 \) by Brier & Joye. Furthermore the *x*-coordinate only addition formulas were generalized to curves over \( \mathbb{F}_{2^m} \) by Lopez & Dahab.
-
-Brier-Joye addition formulas (Projective coordinates/XZ coordinates):[^2]
-
- - Addition (\( n \ne m \)):
-\begin{align*}
-X_{m+n} &= Z_{m-n}(-4a_6Z_mZ_n(X_mZ_n + X_nZ_m) + (X_mX_n - a_4 Z_mZ_n)^2) \\
-Z_{m+n} &= X_{m-n}(X_mZ_n - X_nZ_m)^2
-\end{align*}
-
- - Doubling:
-\begin{align*}
-X_{2n} &= (X_n^2 - a_4Z_n^2)^2 - 8 a_6X_nZ_n^3 \\
-Z_{2n} &= 4Z_n(X_n(X_n^2 + a_4 Z_n^2) + a_6Z_n^3)
-\end{align*}
-
- - \( Y \) recovery:
-\begin{align*}
-x_n &= X_n / Z_n; \qquad x_{n+1} = X_{n+1} / Z_{n+1} \\
-y_n &= \frac{2a_6 +(x_1x_n + a_4) (x_1 + x_n) - (x_1 - x_n)^2x_{n+1}}{2y_1}
-\end{align*}
-
-Lopez-Dahab addition formulas on \( E(\mathbb{F}_{2^m}) \)(Projective coordinates/XZ coordinates):[^2]
-
- - Addition (\( n \ne m \)):
-\begin{align*}
-Z_{m+n} &= (X_mZ_n)^2 + (X_nZ_m)^2 \\
-X_{m+n} &= Z_{m+n}X_{m-n} + X_mZ_nX_nZ_m
-\end{align*}
-
- - Doubling:
-\begin{align*}
-X_{2n} &= X_n^4 + a_6Z_n^4 = (X_n^2 + \sqrt{a_6}Z_n^2)^2 \\
-Z_{2n} &= X_n^2Z_n^2
-\end{align*}
-
- - \( Y \) recovery:
-\begin{align*}
-x_n &= X_n / Z_n; \qquad x_{n+1} = X_{n+1} / Z_{n+1} \\
-y_n &= \frac{(x_n + x_1)((x_n + x_1)(x_{n+1} + x_1) + x_1^2 + y_1)}{x_1} + y_1
-\end{align*}
-
-### GLV scalar multiplication
-
-[^13]
-
-### Fixed-base windowing (BGMW)
-
-<u>Algorithm 3.41</u> and <u>Algorithm 3.42</u> in GECC[^1]
-
-
-### Fixed-base comb
-
-<u>Algorithm 3.44</u> and <u>Algorithm 3.45</u> in GECC[^1]
-
-### Möller-1
-
-> The method may fail in some cases in that an addition step may turn out to be a point doubling or may involve the point at infinity (which both requires special treatment and is potentially clearly visible through side channels). However, we will show that the probability of this happening is negligible if multipliers are appropriately selected: Randomly chosen e is safe.[^9]
-
-## References
-
-[^1]: HANKERSON, Darrel; MENEZES, Alfred J.; VANSTONE, Scott. Guide to Elliptic Curve Cryptography. New York, USA: Springer, 2004. ISBN 9780387218465. Available from DOI: [10.1007/b97644](https://dx.doi.org/10.1007/b97644).
-
-[^2]: COHEN, Henri; FREY, Gerhard; AVANZI, Roberto M.; DOCHE, Christophe; LANGE, Tanja; NGUYEN, Kim; VERCAUTEREN, Frederik. Handbook of Elliptic and Hyper-elliptic Curve Cryptography. CRC Press, 2005-07-19. Discrete Mathematics and It’s Applications, no. 34. ISBN 9781584885184.
-
-[^3]: BERNSTEIN, Daniel J.; LANGE, Tanja. Explicit Formulas Database, <https://www.hyperelliptic.org/EFD/>
-
-[^4]: <http://point-at-infinity.org/ecc/>
-
-[^5]: KNUTH, Donald: The Art of Computer Programming, Volume 2: Seminumerical algorithms
-
-[^6]: GORDON, Daniel M.: A survey of fast exponentiation methods.
-
-[^7]: MORAIN, Francois; OLIVOS, Jorge: Speeding up the computations on an elliptic curve using addition-subtraction chains.
-
-[^8]: JOYE, Marc; YEN, Sung-Ming: The Montgomery Powering Ladder.
-
-[^9]: MOLLER, Bodo: Securing Elliptic Curve Point Multiplication against Side-Channel Attacks.
-
-[^10]: MOLLER, Bodo: Improved Techniques for Fast Exponentiation.
-
-[^11]: MOLLER, Bodo: Fractional Windows Revisited: Improved Signed-Digit Representations for Efficient Exponentiation.
-
-[^12]: KOYAMA, Kenji; TSURUOKA, Yukio: Speeding up Elliptic Cryptosystems by Using a Signed Binary Window Method.
-
-[^13]: GALLANT, Robert P.; LAMBERT, Robert J.; VANSTONE, Scott A.: Faster point multiplication on elliptic curves with efficient endomorphisms. \ No newline at end of file
diff --git a/docs/LIBS.md b/docs/LIBS.md
index 7baec65..a71b792 100644
--- a/docs/LIBS.md
+++ b/docs/LIBS.md
@@ -1,135 +1,21 @@
# Supported libraries
-Libraries that ECTester can test.
+Libraries that ECTester can test:
- [BouncyCastle](https://bouncycastle.org/java.html)
- - Java
- - Works with the short Weierstrass curve model for ECDSA and ECDH.
- - Works with coordinates:
- - Affine
- - Projective(Homogenous)
- - Jacobian
- - Jacobian-Chudnovsky
- - Jacobian-Modified
- - Lambda-Affine?
- - Lambda-Projective?
- - Skewed?
- - Multiple scalar multiplication algorithms implemented and used:
- - Double-and-add always (DoubleAddMultiplier)
- - Fixed point comb (FixedPointCombMultiplier)
- - GLV (Gallant-Lambert-Vanstone) using endomorphisms (GLVMultiplier): Faster point multiplication on elliptic curves with efficient endomorphisms. <-- default, if available
- - Binary NAF right-to-left multiplication(mixed coordinates) (MixedNafR2LMultiplier)
- - Montgomery ladder (MontgomeryLadderMultiplier)
- - Binary NAF right-to-left multiplication (NafR2LMultiplier)
- - Binary NAF left-to-right multiplication (NafL2RMultiplier)
- - Double-and-add reference implementation (ReferenceMultiplier)
- - Window NAF left-to-right multiplication (WNafL2RMultiplier) <-- default
- - Window Tau-NAF multiplication (WTauNafMultiplier): Improved Algorithms for Arithmetic on Anomalous Binary Curves
- - Zeroless signed digit binary right-to-left multiplication (ZSignedDigitR2LMultiplier)
- - Zeroless signed digit binary left-to-right multiplication (ZSignedDigitL2RMultiplier)
- - Has custom field and point arithmetic for:
- - Curve25519 (transformed into short Weierstrass model)
- - SMP2 curves
- - SECG curves
- [Sun EC](https://docs.oracle.com/javase/7/docs/technotes/guides/security/SunProviders.html#SunEC)
- - Java + C
- - Uses the short Weierstrass curve model.
- - For prime field curves:
- - Uses 5-bit window NAF, Uses mixed Modified-Jacobian coordinates
- for doubling and Chudnovsky Jacobian coordinates for additions (ecp_jm.c). From:
- Brown, Hankerson, Lopez, Menezes: Software Implementation of the NIST Elliptic Curves Over Prime Fields.
- - Contains an implementation of scalar multiplication with 4-bit sliding window, using Jacobian coordinates (ecp_jac.c)
- - Contains an implementation of IEEE P1363 algorithm A.10.3 using affine coordinates (ecp_aff.c)
- - For binary field curves:
- - Uses Lopez-Dahab (Montgomery) ladder, XZ coordinates (ec2_mont.c): Fast multiplication on elliptic curves over GF(2^m) without precomputation (Algorithm 2P)
- - Contains an implementation of IEEE P1363 algorithm A.10.3 using affine coordinates (ec2_aff.c)
- - Has some custom arithmetic for some of the NIST primes.
- [WolfCrypt(WolfSSL)](https://www.wolfssl.com)
- - C + Java
- - Prime field curves only.
- - Jacobian coordinates:
- - Uses sliding window scalar multiplication, (discards `b` parameter of curve), but validates points.
- [OpenSSL](https://www.openssl.org/)
- - C
- - For prime field curves:
- - Uses Jacobian coordinates, and Montgomery ladder, also uses wNAF-based interleaving multi-exponentiation method(ec_mult.c): http://www.bmoeller.de/pdf/TI-01-08.multiexp.pdf
- - Also uses multiplication with precomputation by wNAF splitting(ec_mult.c)
- - For binary field curves:
- - Uses Jacobian coordinates, and Lopez-Dahab ladder, also uses wNAF-based interleaving multi-exponentiation method(ec2_smpl.c)
- [BoringSSL](https://boringssl.googlesource.com/boringssl)
- - C
- - Supports prime field curves only:
- - Use Jacobian coordinates, and Montgomery ladder, also uses optimized arithmetic on NIST P-224, P-256.
- - Bundled as a git submodule in `ext/boringssl`. To build and use run:
-```bash
-cd ext/boringssl
-mkdir build && cd build
-cmake -DBUILD_SHARED_LIBS=1 -GNinja ..
-ninja
-```
- [Crypto++](https://cryptopp.com/)
- - C++
- - For prime field curves:
- - Uses projective coordinates and sliding window scalar multiplication algorithm.
- - For binary field curves:
- - Uses affine coordinates and sliding window scalar multiplication algorithm.
- [libtomcrypt](http://www.libtom.net/LibTomCrypt/)
- - C
- - Uses Jacobian coordinates.
- - Sliding window scalar multiplication algorithm.
- [libgcrypt](https://www.gnupg.org/related_software/libgcrypt/)
- - C
- - Only supports prime field curves.
- - Uses short Weierstrass, Montgomery and Twisted Edwards models.
- - Uses left-to-right double-and-add always scalar multiplication and Jacobian coordinates in short Weierstrass form.
- - Uses Montgomery ladder and X-only in Montgomery form.
- - Uses left-to-right double-and-add always scalar multiplication in Twisted Edwards form.
- [Botan](https://botan.randombit.net/)
- - C++
- - Uses blinded(randomized) Montgomery ladder.
- - <https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#addition-add-1998-cmo-2>
- - <https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-1986-cc>
- - <https://eprint.iacr.org/2015/657>
- - ECTester supports v2.4.0 and up.
- [Microsoft CNG](https://msdn.microsoft.com/en-us/library/windows/desktop/aa376210(v=vs.85).aspx)
- - C API.
- - <del>Closed source.</del> Not any more: <https://github.com/Microsoft/SymCrypt>.
- - For prime field curves(only supports):
- - Uses Short Weierstrass model.
- - Uses Twisted Edwards model.
- - Uses Montgomery model.
- - Uses fixed window scalar multiplication.
- - Uses Wnaf multi-scalar multiplication with interleaving.
- - Uses Montgomery ladder.
- [mbedTLS](https://tls.mbed.org/)
- - C
- - Only supports prime field curves.
- - Uses short Weierstrass and Montgomery models.
- - Uses comb method for short Weierstrass curves, using (randomized) Jacobian coordinates.
- - <http://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#doubling-dbl-1998-cmo-2>
- - Uses Montgomery ladder with xz coordinates for Montgomery curves.
- - [MatrixSSL](https://github.com/matrixssl/matrixssl)
- - C
- - Only supports prime field curves.
- - Uses 4 bit sliding window.
- - Uses projective coordinates.
- [Intel Performance Primitives](https://software.intel.com/en-us/ipp-crypto-reference-2019)
- - C
- - Only supports prime field curves.
- - Uses 5-bit window NAF.
- - Uses Jacobian coordinates.
- - <https://github.com/intel/ipp-crypto>
- [Nettle](http://www.lysator.liu.se/~nisse/nettle/)
- - C
- - No support for explicit parameters, only SECG named curves.
- - Uses Jacobian coordinates.
- - <https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b>
- - <https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#addition-add-2007-bl>
- - <https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#addition-madd-2007-bl>
- - Uses double-and-add always or windowing algorithm.
- - Uses Pippenger scalar mult for Twisted Edwards curves.
- [LibreSSL](https://www.libressl.org/)
- - C
# Libraries with ECC support
diff --git a/docs/VULNS.md b/docs/VULNS.md
index d7117b5..3db4f81 100644
--- a/docs/VULNS.md
+++ b/docs/VULNS.md
@@ -2,17 +2,17 @@
## Cards
-| CVE | Card | CVSS v3 | Description | Discoverer |
-|:-------------------------------------------------------------------------------:|:------------------------:|:---------:| ----------- |:----------:|
-| [CVE-2019-15809](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-15809) | Athena IDProtect | 4.7 MEDIUM| Smart cards from the Athena SCS manufacturer, based on the Atmel Toolbox 00.03.11.05 and the AT90SC chip, contain a timing side channel in ECDSA signature generation. This allows a local attacker, able to measure the duration of hundreds to thousands of signing operations, to compute the private key used. The issue occurs because the Atmel Toolbox 00.03.11.05 contains two versions of ECDSA signature functions, described as fast and secure, but the affected cards chose to use the fast version, which leaks the bit length of the random nonce via timing. This affects: <ul> <li>Athena IDProtect 010b.0352.0005</li> <li>Athena IDProtect 010e.1245.0002</li> <li>Athena IDProtect 0106.0130.0401</li> <li>Athena IDProtect 010e.1245.0002</li> <li>Valid S/A IDflex V 010b.0352.0005</li> <li>SafeNet eToken 4300 010e.1245.0002</li> <li>TecSec Armored Card 010e.0264.0001</li> <li>TecSec Armored Card 0108.0264.0001</li> </ul> | [Jan Jancar](https://github.com/J08nY) |
+| CVE | Card | CVSS v3 | Description | Discoverer |
+|:-------------------------------------------------------------------------------:|:----------------:|:----------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------:|
+| [CVE-2019-15809](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-15809) | Athena IDProtect | 4.7 MEDIUM | Smart cards from the Athena SCS manufacturer, based on the Atmel Toolbox 00.03.11.05 and the AT90SC chip, contain a timing side channel in ECDSA signature generation. This allows a local attacker, able to measure the duration of hundreds to thousands of signing operations, to compute the private key used. The issue occurs because the Atmel Toolbox 00.03.11.05 contains two versions of ECDSA signature functions, described as fast and secure, but the affected cards chose to use the fast version, which leaks the bit length of the random nonce via timing. This affects: <ul> <li>Athena IDProtect 010b.0352.0005</li> <li>Athena IDProtect 010e.1245.0002</li> <li>Athena IDProtect 0106.0130.0401</li> <li>Athena IDProtect 010e.1245.0002</li> <li>Valid S/A IDflex V 010b.0352.0005</li> <li>SafeNet eToken 4300 010e.1245.0002</li> <li>TecSec Armored Card 010e.0264.0001</li> <li>TecSec Armored Card 0108.0264.0001</li> </ul> | [Jan Jancar](https://github.com/J08nY) |
## Libraries
-| CVE | Library | CVSS v3 | Description | Discoverer |
-|:-------------------------------------------------------------------------------:|:------------------------:|:---------:| ----------- |:----------:|
-| [CVE-2018-20187](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-20187) | Botan 2 | 5.9 MEDIUM| A side-channel issue was discovered in Botan before 2.9.0. An attacker capable of precisely measuring the time taken for ECC key generation may be able to derive information about the high bits of the secret key, as the function to derive the public point from the secret scalar uses an unblinded Montgomery ladder whose loop iteration count depends on the bitlength of the secret. This issue affects only key generation, not ECDSA signatures or ECDH key agreement.| [Jan Jancar](https://github.com/J08nY)|
-| [CVE-2019-13627](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-13627) | libgcrypt | 5.9 MEDIUM| Libgcrypt 1.3.0 through 1.8.4 (ECDSA) and 1.6.0 through 1.8.4 (EdDSA) contains a timing side channel in ECDSA/EdDSA signature generation. This allows a local or a remote attacker, able to measure the duration of hundreds to thousands of signing operations, to compute the private key used. The issue occurs because mpi/ec.c scalar multiplication leaks the bit length of the scalar.| [Jan Jancar](https://github.com/J08nY)|
-| [CVE-2019-13628](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-13628) | wolfCrypt, wolfSSL | 5.9 MEDIUM| wolfSSL and wolfCrypt 4.0.0 and earlier (when configured without --enable-fpecc, --enable-sp, or --enable-sp-math) contain a timing side channel in ECDSA signature generation. This allows a local attacker, able to precisely measure the duration of signature operations, to infer information about the nonces used and potentially mount a lattice attack to recover the private key used. The issue occurs because ecc.c scalar multiplication might leak the bit length.| [Jan Jancar](https://github.com/J08nY)|
-| [CVE-2019-13629](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-13629) | MatrixSSL | 5.9 MEDIUM| MatrixSSL 4.2.1 and earlier contains a timing side channel in ECDSA signature generation. This allows a local or a remote attacker, able to measure the duration of hundreds to thousands of signing operations, to compute the private key used. The issue occurs because crypto/pubkey/ecc_math.c scalar multiplication leaks the bit length of the scalar.| [Jan Jancar](https://github.com/J08nY) |
-| [CVE-2019-14317](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-14317) | wolfCrypt, wolfSSL | 5.3 MEDIUM| wolfSSL and wolfCrypt 4.1.0 and earlier (formerly known as CyaSSL) generate biased DSA nonces. This allows a remote attacker to compute the long term private key from several hundred DSA signatures via a lattice attack. The issue occurs because dsa.c fixes two bits of the generated nonces.| [Jan Jancar](https://github.com/J08nY)|
-| [CVE-2019-14318](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-14318) | Crypto++ | 5.9 MEDIUM| Crypto++ 8.3.0 and earlier contains a timing side channel in ECDSA signature generation. This allows a local or remote attacker, able to measure the duration of hundreds to thousands of signing operations, to compute the private key used. The issue occurs because scalar multiplication in ecp.cpp (prime field curves, small leakage) and algebra.cpp (binary field curves, large leakage) is not constant time and leaks the bit length of the scalar among other information.| [Jan Jancar](https://github.com/J08nY)|
+| CVE | Library | CVSS v3 | Description | Discoverer |
+|:-------------------------------------------------------------------------------:|:------------------:|:----------:|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------:|
+| [CVE-2018-20187](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-20187) | Botan 2 | 5.9 MEDIUM | A side-channel issue was discovered in Botan before 2.9.0. An attacker capable of precisely measuring the time taken for ECC key generation may be able to derive information about the high bits of the secret key, as the function to derive the public point from the secret scalar uses an unblinded Montgomery ladder whose loop iteration count depends on the bitlength of the secret. This issue affects only key generation, not ECDSA signatures or ECDH key agreement. | [Jan Jancar](https://github.com/J08nY) |
+| [CVE-2019-13627](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-13627) | libgcrypt | 5.9 MEDIUM | Libgcrypt 1.3.0 through 1.8.4 (ECDSA) and 1.6.0 through 1.8.4 (EdDSA) contains a timing side channel in ECDSA/EdDSA signature generation. This allows a local or a remote attacker, able to measure the duration of hundreds to thousands of signing operations, to compute the private key used. The issue occurs because mpi/ec.c scalar multiplication leaks the bit length of the scalar. | [Jan Jancar](https://github.com/J08nY) |
+| [CVE-2019-13628](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-13628) | wolfCrypt, wolfSSL | 5.9 MEDIUM | wolfSSL and wolfCrypt 4.0.0 and earlier (when configured without --enable-fpecc, --enable-sp, or --enable-sp-math) contain a timing side channel in ECDSA signature generation. This allows a local attacker, able to precisely measure the duration of signature operations, to infer information about the nonces used and potentially mount a lattice attack to recover the private key used. The issue occurs because ecc.c scalar multiplication might leak the bit length. | [Jan Jancar](https://github.com/J08nY) |
+| [CVE-2019-13629](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-13629) | MatrixSSL | 5.9 MEDIUM | MatrixSSL 4.2.1 and earlier contains a timing side channel in ECDSA signature generation. This allows a local or a remote attacker, able to measure the duration of hundreds to thousands of signing operations, to compute the private key used. The issue occurs because crypto/pubkey/ecc_math.c scalar multiplication leaks the bit length of the scalar. | [Jan Jancar](https://github.com/J08nY) |
+| [CVE-2019-14317](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-14317) | wolfCrypt, wolfSSL | 5.3 MEDIUM | wolfSSL and wolfCrypt 4.1.0 and earlier (formerly known as CyaSSL) generate biased DSA nonces. This allows a remote attacker to compute the long term private key from several hundred DSA signatures via a lattice attack. The issue occurs because dsa.c fixes two bits of the generated nonces. | [Jan Jancar](https://github.com/J08nY) |
+| [CVE-2019-14318](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-14318) | Crypto++ | 5.9 MEDIUM | Crypto++ 8.3.0 and earlier contains a timing side channel in ECDSA signature generation. This allows a local or remote attacker, able to measure the duration of hundreds to thousands of signing operations, to compute the private key used. The issue occurs because scalar multiplication in ecp.cpp (prime field curves, small leakage) and algebra.cpp (binary field curves, large leakage) is not constant time and leaks the bit length of the scalar among other information. | [Jan Jancar](https://github.com/J08nY) |
diff --git a/ext/ant-javacard.jar b/ext/ant-javacard.jar
deleted file mode 100644
index a9c8656..0000000
--- a/ext/ant-javacard.jar
+++ /dev/null
Binary files differ
diff --git a/ext/libressl b/ext/libressl
-Subproject 5a590f8e0c1bb3b3bf7ba02ee7d3ac0c1e09a1a
+Subproject 69449e791b5e99408a686fa68c2e5745a950162
diff --git a/ext/mbedtls b/ext/mbedtls
new file mode 160000
+Subproject 611f899c0c9d397baedfaec34ea0861ad254399
diff --git a/ext/sdks b/ext/sdks
-Subproject 494164ea8470f49f44be19f49dab3af7c83e39e
+Subproject 6025a1d48060b2a72df2d862de310be434f4227
diff --git a/ext/wolfcrypt-jni b/ext/wolfcrypt-jni
new file mode 160000
+Subproject 0497ee767c994775beda2f2091009593961e5c7
diff --git a/ext/wolfcrypt-jni.jar b/ext/wolfcrypt-jni.jar
new file mode 100644
index 0000000..be579ee
--- /dev/null
+++ b/ext/wolfcrypt-jni.jar
Binary files differ
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..e644113
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..b82aa23
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,7 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
+networkTimeout=10000
+validateDistributionUrl=true
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..1aa94a4
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,249 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+ echo "$*"
+} >&2
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD=$JAVA_HOME/jre/sh/java
+ else
+ JAVACMD=$JAVA_HOME/bin/java
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD=java
+ if ! command -v java >/dev/null 2>&1
+ then
+ die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# and any embedded shellness will be escaped.
+# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+# treated as '${Hostname}' itself on the command line.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..25da30d
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,92 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/lib/bcprov-jdk18on-172.jar b/lib/bcprov-jdk18on-172.jar
deleted file mode 100644
index fa22e6a..0000000
--- a/lib/bcprov-jdk18on-172.jar
+++ /dev/null
Binary files differ
diff --git a/lib/commons-cli-1.5.0-javadoc.jar b/lib/commons-cli-1.5.0-javadoc.jar
deleted file mode 100644
index 651dac3..0000000
--- a/lib/commons-cli-1.5.0-javadoc.jar
+++ /dev/null
Binary files differ
diff --git a/lib/commons-cli-1.5.0.jar b/lib/commons-cli-1.5.0.jar
deleted file mode 100644
index e036456..0000000
--- a/lib/commons-cli-1.5.0.jar
+++ /dev/null
Binary files differ
diff --git a/lib/jcardsim-3.0.5.11.jar b/lib/jcardsim-3.0.5.11.jar
deleted file mode 100644
index 90be8a0..0000000
--- a/lib/jcardsim-3.0.5.11.jar
+++ /dev/null
Binary files differ
diff --git a/lib/snakeyaml-1.19.jar b/lib/snakeyaml-1.19.jar
deleted file mode 100644
index 7c73a76..0000000
--- a/lib/snakeyaml-1.19.jar
+++ /dev/null
Binary files differ
diff --git a/lib/wolfcrypt-jni.jar b/lib/wolfcrypt-jni.jar
deleted file mode 100644
index 890ae14..0000000
--- a/lib/wolfcrypt-jni.jar
+++ /dev/null
Binary files differ
diff --git a/nbproject/copylibstask.jar b/nbproject/copylibstask.jar
deleted file mode 100644
index 45fdbe1..0000000
--- a/nbproject/copylibstask.jar
+++ /dev/null
Binary files differ
diff --git a/nbproject/dist-build.xml b/nbproject/dist-build.xml
deleted file mode 100644
index b1bfadf..0000000
--- a/nbproject/dist-build.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="dist-build">
- <description>.</description>
- <target name="package">
- <property name="store.dir" value="dist"/>
- <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>
-
- <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>
-
- <tempfile property="temp.file" destDir="${java.io.tmpdir}" suffix=".jar"/>
- <tempfile property="temp.previous_jar" destdir="${java.io.tmpdir}" suffix=".jar"/>
-
- <exec executable="git" outputproperty="git.commit" failifexecutionfails="false">
- <arg line="rev-parse --short HEAD"/>
- </exec>
-
- <copy file="${store.jar}" tofile="${temp.previous_jar}" failonerror="false"/>
- <echo message="Backed up ${store.jar} into ${temp.previous_jar}"/>
-
- <delete file="${store.jar}" failonerror="false"/>
- <jar destfile="${temp.file}" filesetmanifest="skip" compress="true" level="8">
- <zipgroupfileset dir="dist" includes="*.jar"/>
- <zipgroupfileset dir="dist/lib" includes="*.jar"/>
-
- <manifest>
- <attribute name="Main-Class" value="${main.class}"/>
- <attribute name="Git-Commit" value="${git.commit}"/>
- </manifest>
- </jar>
-
- <zip destfile="${store.jar}" compress="true" level="8">
- <zipfileset src="${temp.file}"
- excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA, ${dist.archive.excludes}"/>
- </zip>
-
- <delete file="${temp.file}"/>
- <delete file="${temp.previous_jar}"/>
- </target>
-</project> \ No newline at end of file
diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties
deleted file mode 100644
index 133840f..0000000
--- a/nbproject/genfiles.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-build.xml.data.CRC32=314f40b8
-build.xml.script.CRC32=5d85f1b1
-build.xml.stylesheet.CRC32=8064a381@1.75.2.48
-# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
-# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=667fcbc9
-nbproject/build-impl.xml.script.CRC32=e6bea23e
-nbproject/build-impl.xml.stylesheet.CRC32=876e7a8f@1.75.2.48
diff --git a/nbproject/keystore b/nbproject/keystore
deleted file mode 100755
index 7c9c8e4..0000000
--- a/nbproject/keystore
+++ /dev/null
Binary files differ
diff --git a/nbproject/reader/build-impl.xml b/nbproject/reader/build-impl.xml
deleted file mode 100644
index f7c43a2..0000000
--- a/nbproject/reader/build-impl.xml
+++ /dev/null
@@ -1,1413 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-*** GENERATED FROM project.xml - DO NOT EDIT ***
-*** EDIT ../build.xml INSTEAD ***
-
-For the purpose of easier reading the script
-is divided into following sections:
-
- - initialization
- - compilation
- - jar
- - execution
- - debugging
- - javadoc
- - test compilation
- - test execution
- - test debugging
- - applet
- - cleanup
-
- -->
-<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir="../../../" default="default" name="ECTesterReader-impl">
- <fail message="Please build using Ant 1.8.0 or higher.">
- <condition>
- <not>
- <antversion atleast="1.8.0"/>
- </not>
- </condition>
- </fail>
- <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
- <!--
- ======================
- INITIALIZATION SECTION
- ======================
- -->
- <target name="-pre-init">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="-pre-init" name="-init-private">
- <property file="nbproject/private/config.properties"/>
- <property file="nbproject/private/configs/${config}.properties"/>
- <property file="nbproject/private/private.properties"/>
- </target>
- <target depends="-pre-init,-init-private" name="-init-user">
- <property file="${user.properties.file}"/>
- <!-- The two properties below are usually overridden -->
- <!-- by the active platform. Just a fallback. -->
- <property name="default.javac.source" value="1.4"/>
- <property name="default.javac.target" value="1.4"/>
- </target>
- <target depends="-pre-init,-init-private,-init-user" name="-init-project">
- <property file="nbproject/configs/${config}.properties"/>
- <property file="nbproject/reader/project.properties"/>
- </target>
- <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
- <property name="platform.java" value="${java.home}/bin/java"/>
- <available file="${manifest.file}" property="manifest.available"/>
- <condition property="splashscreen.available">
- <and>
- <not>
- <equals arg1="${application.splash}" arg2="" trim="true"/>
- </not>
- <available file="${application.splash}"/>
- </and>
- </condition>
- <condition property="main.class.available">
- <and>
- <isset property="main.class"/>
- <not>
- <equals arg1="${main.class}" arg2="" trim="true"/>
- </not>
- </and>
- </condition>
- <condition property="profile.available">
- <and>
- <isset property="javac.profile"/>
- <length length="0" string="${javac.profile}" when="greater"/>
- <matches pattern="1\.[89](\..*)?" string="${javac.source}"/>
- </and>
- </condition>
- <condition property="do.archive">
- <or>
- <not>
- <istrue value="${jar.archive.disabled}"/>
- </not>
- <istrue value="${not.archive.disabled}"/>
- </or>
- </condition>
- <condition property="do.mkdist">
- <and>
- <isset property="do.archive"/>
- <isset property="libs.CopyLibs.classpath"/>
- <not>
- <istrue value="${mkdist.disabled}"/>
- </not>
- </and>
- </condition>
- <condition property="do.archive+manifest.available">
- <and>
- <isset property="manifest.available"/>
- <istrue value="${do.archive}"/>
- </and>
- </condition>
- <condition property="do.archive+main.class.available">
- <and>
- <isset property="main.class.available"/>
- <istrue value="${do.archive}"/>
- </and>
- </condition>
- <condition property="do.archive+splashscreen.available">
- <and>
- <isset property="splashscreen.available"/>
- <istrue value="${do.archive}"/>
- </and>
- </condition>
- <condition property="do.archive+profile.available">
- <and>
- <isset property="profile.available"/>
- <istrue value="${do.archive}"/>
- </and>
- </condition>
- <condition property="have.tests">
- <or>
- <available file="${test.src.dir}"/>
- </or>
- </condition>
- <condition property="have.sources">
- <or>
- <available file="${src.dir}"/>
- </or>
- </condition>
- <condition property="netbeans.home+have.tests">
- <and>
- <isset property="netbeans.home"/>
- <isset property="have.tests"/>
- </and>
- </condition>
- <condition property="no.javadoc.preview">
- <and>
- <isset property="javadoc.preview"/>
- <isfalse value="${javadoc.preview}"/>
- </and>
- </condition>
- <property name="run.jvmargs" value=""/>
- <property name="run.jvmargs.ide" value=""/>
- <property name="javac.compilerargs" value=""/>
- <property name="work.dir" value="${basedir}"/>
- <condition property="no.deps">
- <and>
- <istrue value="${no.dependencies}"/>
- </and>
- </condition>
- <property name="javac.debug" value="true"/>
- <property name="javadoc.preview" value="true"/>
- <property name="application.args" value=""/>
- <property name="source.encoding" value="${file.encoding}"/>
- <property name="runtime.encoding" value="${source.encoding}"/>
- <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
- <and>
- <isset property="javadoc.encoding"/>
- <not>
- <equals arg1="${javadoc.encoding}" arg2=""/>
- </not>
- </and>
- </condition>
- <property name="javadoc.encoding.used" value="${source.encoding}"/>
- <property name="includes" value="**"/>
- <property name="excludes" value=""/>
- <property name="do.depend" value="false"/>
- <condition property="do.depend.true">
- <istrue value="${do.depend}"/>
- </condition>
- <path id="endorsed.classpath.path" path="${endorsed.classpath}"/>
- <condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'">
- <and>
- <isset property="endorsed.classpath"/>
- <not>
- <equals arg1="${endorsed.classpath}" arg2="" trim="true"/>
- </not>
- </and>
- </condition>
- <condition else="" property="javac.profile.cmd.line.arg" value="-profile ${javac.profile}">
- <isset property="profile.available"/>
- </condition>
- <condition else="false" property="jdkBug6558476">
- <and>
- <matches pattern="1\.[56]" string="${java.specification.version}"/>
- <not>
- <os family="unix"/>
- </not>
- </and>
- </condition>
- <property name="javac.fork" value="${jdkBug6558476}"/>
- <property name="jar.index" value="false"/>
- <property name="jar.index.metainf" value="${jar.index}"/>
- <property name="copylibs.rebase" value="true"/>
- <available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/>
- <condition property="junit.available">
- <or>
- <available classname="org.junit.Test" classpath="${run.test.classpath}"/>
- <available classname="junit.framework.Test" classpath="${run.test.classpath}"/>
- </or>
- </condition>
- <condition property="testng.available">
- <available classname="org.testng.annotations.Test" classpath="${run.test.classpath}"/>
- </condition>
- <condition property="junit+testng.available">
- <and>
- <istrue value="${junit.available}"/>
- <istrue value="${testng.available}"/>
- </and>
- </condition>
- <condition else="testng" property="testng.mode" value="mixed">
- <istrue value="${junit+testng.available}"/>
- </condition>
- <condition else="" property="testng.debug.mode" value="-mixed">
- <istrue value="${junit+testng.available}"/>
- </condition>
- </target>
- <target name="-post-init">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check">
- <fail unless="src.dir">Must set src.dir</fail>
- <fail unless="test.src.dir">Must set test.src.dir</fail>
- <fail unless="build.dir">Must set build.dir</fail>
- <fail unless="dist.dir">Must set dist.dir</fail>
- <fail unless="build.classes.dir">Must set build.classes.dir</fail>
- <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
- <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
- <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
- <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
- <fail unless="dist.jar">Must set dist.jar</fail>
- </target>
- <target name="-init-macrodef-property">
- <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
- <attribute name="name"/>
- <attribute name="value"/>
- <sequential>
- <property name="@{name}" value="${@{value}}"/>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors">
- <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${src.dir}" name="srcdir"/>
- <attribute default="${build.classes.dir}" name="destdir"/>
- <attribute default="${javac.classpath}" name="classpath"/>
- <attribute default="${javac.processorpath}" name="processorpath"/>
- <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="${javac.debug}" name="debug"/>
- <attribute default="${empty.dir}" name="sourcepath"/>
- <attribute default="${empty.dir}" name="gensrcdir"/>
- <element name="customize" optional="true"/>
- <sequential>
- <property location="${build.dir}/empty" name="empty.dir"/>
- <mkdir dir="${empty.dir}"/>
- <mkdir dir="@{apgeneratedsrcdir}"/>
- <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
- <src>
- <dirset dir="@{gensrcdir}" erroronmissingdir="false">
- <include name="*"/>
- </dirset>
- </src>
- <classpath>
- <path path="@{classpath}"/>
- </classpath>
- <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
- <compilerarg line="${javac.profile.cmd.line.arg}"/>
- <compilerarg line="${javac.compilerargs}"/>
- <compilerarg value="-processorpath"/>
- <compilerarg path="@{processorpath}:${empty.dir}"/>
- <compilerarg line="${ap.processors.internal}"/>
- <compilerarg line="${annotation.processing.processor.options}"/>
- <compilerarg value="-s"/>
- <compilerarg path="@{apgeneratedsrcdir}"/>
- <compilerarg line="${ap.proc.none.internal}"/>
- <customize/>
- </javac>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-ap-cmdline-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal">
- <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${src.dir}" name="srcdir"/>
- <attribute default="${build.classes.dir}" name="destdir"/>
- <attribute default="${javac.classpath}" name="classpath"/>
- <attribute default="${javac.processorpath}" name="processorpath"/>
- <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="${javac.debug}" name="debug"/>
- <attribute default="${empty.dir}" name="sourcepath"/>
- <attribute default="${empty.dir}" name="gensrcdir"/>
- <element name="customize" optional="true"/>
- <sequential>
- <property location="${build.dir}/empty" name="empty.dir"/>
- <mkdir dir="${empty.dir}"/>
- <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
- <src>
- <dirset dir="@{gensrcdir}" erroronmissingdir="false">
- <include name="*"/>
- </dirset>
- </src>
- <classpath>
- <path path="@{classpath}"/>
- </classpath>
- <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
- <compilerarg line="${javac.profile.cmd.line.arg}"/>
- <compilerarg line="${javac.compilerargs}"/>
- <customize/>
- </javac>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac">
- <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${src.dir}" name="srcdir"/>
- <attribute default="${build.classes.dir}" name="destdir"/>
- <attribute default="${javac.classpath}" name="classpath"/>
- <sequential>
- <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
- <classpath>
- <path path="@{classpath}"/>
- </classpath>
- </depend>
- </sequential>
- </macrodef>
- <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${build.classes.dir}" name="destdir"/>
- <sequential>
- <fail unless="javac.includes">Must set javac.includes</fail>
- <pathconvert pathsep="${line.separator}" property="javac.includes.binary">
- <path>
- <filelist dir="@{destdir}" files="${javac.includes}"/>
- </path>
- <globmapper from="*.java" to="*.class"/>
- </pathconvert>
- <tempfile deleteonexit="true" property="javac.includesfile.binary"/>
- <echo file="${javac.includesfile.binary}" message="${javac.includes.binary}"/>
- <delete>
- <files includesfile="${javac.includesfile.binary}"/>
- </delete>
- <delete>
- <fileset file="${javac.includesfile.binary}"/>
- </delete>
- </sequential>
- </macrodef>
- </target>
- <target if="${junit.available}" name="-init-macrodef-junit-init">
- <condition else="false" property="nb.junit.batch" value="true">
- <and>
- <istrue value="${junit.available}"/>
- <not>
- <isset property="test.method"/>
- </not>
- </and>
- </condition>
- <condition else="false" property="nb.junit.single" value="true">
- <and>
- <istrue value="${junit.available}"/>
- <isset property="test.method"/>
- </and>
- </condition>
- </target>
- <target name="-init-test-properties">
- <property name="test.binaryincludes" value="&lt;nothing&gt;"/>
- <property name="test.binarytestincludes" value=""/>
- <property name="test.binaryexcludes" value=""/>
- </target>
- <target if="${nb.junit.single}" name="-init-macrodef-junit-single" unless="${nb.junit.batch}">
- <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element name="customize" optional="true"/>
- <sequential>
- <property name="junit.forkmode" value="perTest"/>
- <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
- <test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
- <syspropertyset>
- <propertyref prefix="test-sys-prop."/>
- <mapper from="test-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <formatter type="brief" usefile="false"/>
- <formatter type="xml"/>
- <jvmarg value="-ea"/>
- <customize/>
- </junit>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-test-properties" if="${nb.junit.batch}" name="-init-macrodef-junit-batch" unless="${nb.junit.single}">
- <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element name="customize" optional="true"/>
- <sequential>
- <property name="junit.forkmode" value="perTest"/>
- <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
- <batchtest todir="${build.test.results.dir}">
- <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
- <filename name="@{testincludes}"/>
- </fileset>
- <fileset dir="${build.test.classes.dir}" excludes="@{excludes},${excludes},${test.binaryexcludes}" includes="${test.binaryincludes}">
- <filename name="${test.binarytestincludes}"/>
- </fileset>
- </batchtest>
- <syspropertyset>
- <propertyref prefix="test-sys-prop."/>
- <mapper from="test-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <formatter type="brief" usefile="false"/>
- <formatter type="xml"/>
- <jvmarg value="-ea"/>
- <customize/>
- </junit>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-junit-init,-init-macrodef-junit-single, -init-macrodef-junit-batch" if="${junit.available}" name="-init-macrodef-junit"/>
- <target if="${testng.available}" name="-init-macrodef-testng">
- <macrodef name="testng" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element name="customize" optional="true"/>
- <sequential>
- <condition else="" property="testng.methods.arg" value="@{testincludes}.@{testmethods}">
- <isset property="test.method"/>
- </condition>
- <union id="test.set">
- <fileset dir="${test.src.dir}" excludes="@{excludes},**/*.xml,${excludes}" includes="@{includes}">
- <filename name="@{testincludes}"/>
- </fileset>
- </union>
- <taskdef classname="org.testng.TestNGAntTask" classpath="${run.test.classpath}" name="testng"/>
- <testng classfilesetref="test.set" failureProperty="tests.failed" listeners="org.testng.reporters.VerboseReporter" methods="${testng.methods.arg}" mode="${testng.mode}" outputdir="${build.test.results.dir}" suitename="ECTester" testname="TestNG tests" workingDir="${work.dir}">
- <xmlfileset dir="${build.test.classes.dir}" includes="@{testincludes}"/>
- <propertyset>
- <propertyref prefix="test-sys-prop."/>
- <mapper from="test-sys-prop.*" to="*" type="glob"/>
- </propertyset>
- <customize/>
- </testng>
- </sequential>
- </macrodef>
- </target>
- <target name="-init-macrodef-test-impl">
- <macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element implicit="true" name="customize" optional="true"/>
- <sequential>
- <echo>No tests executed.</echo>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-junit" if="${junit.available}" name="-init-macrodef-junit-impl">
- <macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element implicit="true" name="customize" optional="true"/>
- <sequential>
- <j2seproject3:junit excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
- <customize/>
- </j2seproject3:junit>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-testng" if="${testng.available}" name="-init-macrodef-testng-impl">
- <macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element implicit="true" name="customize" optional="true"/>
- <sequential>
- <j2seproject3:testng excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
- <customize/>
- </j2seproject3:testng>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-test-impl,-init-macrodef-junit-impl,-init-macrodef-testng-impl" name="-init-macrodef-test">
- <macrodef name="test" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <sequential>
- <j2seproject3:test-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
- <customize>
- <classpath>
- <path path="${run.test.classpath}"/>
- </classpath>
- <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
- <jvmarg line="${run.jvmargs}"/>
- <jvmarg line="${run.jvmargs.ide}"/>
- </customize>
- </j2seproject3:test-impl>
- </sequential>
- </macrodef>
- </target>
- <target if="${junit.available}" name="-init-macrodef-junit-debug" unless="${nb.junit.batch}">
- <macrodef name="junit-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element name="customize" optional="true"/>
- <sequential>
- <property name="junit.forkmode" value="perTest"/>
- <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
- <test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
- <syspropertyset>
- <propertyref prefix="test-sys-prop."/>
- <mapper from="test-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <formatter type="brief" usefile="false"/>
- <formatter type="xml"/>
- <jvmarg value="-ea"/>
- <jvmarg line="${debug-args-line}"/>
- <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
- <customize/>
- </junit>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-test-properties" if="${nb.junit.batch}" name="-init-macrodef-junit-debug-batch">
- <macrodef name="junit-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element name="customize" optional="true"/>
- <sequential>
- <property name="junit.forkmode" value="perTest"/>
- <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
- <batchtest todir="${build.test.results.dir}">
- <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
- <filename name="@{testincludes}"/>
- </fileset>
- <fileset dir="${build.test.classes.dir}" excludes="@{excludes},${excludes},${test.binaryexcludes}" includes="${test.binaryincludes}">
- <filename name="${test.binarytestincludes}"/>
- </fileset>
- </batchtest>
- <syspropertyset>
- <propertyref prefix="test-sys-prop."/>
- <mapper from="test-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <formatter type="brief" usefile="false"/>
- <formatter type="xml"/>
- <jvmarg value="-ea"/>
- <jvmarg line="${debug-args-line}"/>
- <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
- <customize/>
- </junit>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-junit-debug,-init-macrodef-junit-debug-batch" if="${junit.available}" name="-init-macrodef-junit-debug-impl">
- <macrodef name="test-debug-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element implicit="true" name="customize" optional="true"/>
- <sequential>
- <j2seproject3:junit-debug excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
- <customize/>
- </j2seproject3:junit-debug>
- </sequential>
- </macrodef>
- </target>
- <target if="${testng.available}" name="-init-macrodef-testng-debug">
- <macrodef name="testng-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${main.class}" name="testClass"/>
- <attribute default="" name="testMethod"/>
- <element name="customize2" optional="true"/>
- <sequential>
- <condition else="-testclass @{testClass}" property="test.class.or.method" value="-methods @{testClass}.@{testMethod}">
- <isset property="test.method"/>
- </condition>
- <condition else="-suitename ECTester -testname @{testClass} ${test.class.or.method}" property="testng.cmd.args" value="@{testClass}">
- <matches pattern=".*\.xml" string="@{testClass}"/>
- </condition>
- <delete dir="${build.test.results.dir}" quiet="true"/>
- <mkdir dir="${build.test.results.dir}"/>
- <j2seproject3:debug classname="org.testng.TestNG" classpath="${debug.test.classpath}">
- <customize>
- <customize2/>
- <jvmarg value="-ea"/>
- <arg line="${testng.debug.mode}"/>
- <arg line="-d ${build.test.results.dir}"/>
- <arg line="-listener org.testng.reporters.VerboseReporter"/>
- <arg line="${testng.cmd.args}"/>
- </customize>
- </j2seproject3:debug>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-testng-debug" if="${testng.available}" name="-init-macrodef-testng-debug-impl">
- <macrodef name="testng-debug-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${main.class}" name="testClass"/>
- <attribute default="" name="testMethod"/>
- <element implicit="true" name="customize2" optional="true"/>
- <sequential>
- <j2seproject3:testng-debug testClass="@{testClass}" testMethod="@{testMethod}">
- <customize2/>
- </j2seproject3:testng-debug>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-junit-debug-impl" if="${junit.available}" name="-init-macrodef-test-debug-junit">
- <macrodef name="test-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <attribute default="${main.class}" name="testClass"/>
- <attribute default="" name="testMethod"/>
- <sequential>
- <j2seproject3:test-debug-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
- <customize>
- <classpath>
- <path path="${run.test.classpath}"/>
- </classpath>
- <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
- <jvmarg line="${run.jvmargs}"/>
- <jvmarg line="${run.jvmargs.ide}"/>
- </customize>
- </j2seproject3:test-debug-impl>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-testng-debug-impl" if="${testng.available}" name="-init-macrodef-test-debug-testng">
- <macrodef name="test-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <attribute default="${main.class}" name="testClass"/>
- <attribute default="" name="testMethod"/>
- <sequential>
- <j2seproject3:testng-debug-impl testClass="@{testClass}" testMethod="@{testMethod}">
- <customize2>
- <syspropertyset>
- <propertyref prefix="test-sys-prop."/>
- <mapper from="test-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- </customize2>
- </j2seproject3:testng-debug-impl>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-test-debug-junit,-init-macrodef-test-debug-testng" name="-init-macrodef-test-debug"/>
- <!--
- pre NB7.2 profiling section; consider it deprecated
- -->
- <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check" if="profiler.info.jvmargs.agent" name="profile-init"/>
- <target if="profiler.info.jvmargs.agent" name="-profile-pre-init">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target if="profiler.info.jvmargs.agent" name="-profile-post-init">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target if="profiler.info.jvmargs.agent" name="-profile-init-macrodef-profile">
- <macrodef name="resolve">
- <attribute name="name"/>
- <attribute name="value"/>
- <sequential>
- <property name="@{name}" value="${env.@{value}}"/>
- </sequential>
- </macrodef>
- <macrodef name="profile">
- <attribute default="${main.class}" name="classname"/>
- <element name="customize" optional="true"/>
- <sequential>
- <property environment="env"/>
- <resolve name="profiler.current.path" value="${profiler.info.pathvar}"/>
- <java classname="@{classname}" dir="${profiler.info.dir}" fork="true" jvm="${profiler.info.jvm}">
- <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
- <jvmarg value="${profiler.info.jvmargs.agent}"/>
- <jvmarg line="${profiler.info.jvmargs}"/>
- <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
- <arg line="${application.args}"/>
- <classpath>
- <path path="${run.classpath}"/>
- </classpath>
- <syspropertyset>
- <propertyref prefix="run-sys-prop."/>
- <mapper from="run-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <customize/>
- </java>
- </sequential>
- </macrodef>
- </target>
- <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile" if="profiler.info.jvmargs.agent" name="-profile-init-check">
- <fail unless="profiler.info.jvm">Must set JVM to use for profiling in profiler.info.jvm</fail>
- <fail unless="profiler.info.jvmargs.agent">Must set profiler agent JVM arguments in profiler.info.jvmargs.agent</fail>
- </target>
- <!--
- end of pre NB7.2 profiling section
- -->
- <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
- <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
- <attribute default="${main.class}" name="name"/>
- <attribute default="${debug.classpath}" name="classpath"/>
- <attribute default="" name="stopclassname"/>
- <sequential>
- <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
- <classpath>
- <path path="@{classpath}"/>
- </classpath>
- </nbjpdastart>
- </sequential>
- </macrodef>
- <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
- <attribute default="${build.classes.dir}" name="dir"/>
- <sequential>
- <nbjpdareload>
- <fileset dir="@{dir}" includes="${fix.classes}">
- <include name="${fix.includes}*.class"/>
- </fileset>
- </nbjpdareload>
- </sequential>
- </macrodef>
- </target>
- <target name="-init-debug-args">
- <property name="version-output" value="java version &quot;${ant.java.version}"/>
- <condition property="have-jdk-older-than-1.4">
- <or>
- <contains string="${version-output}" substring="java version &quot;1.0"/>
- <contains string="${version-output}" substring="java version &quot;1.1"/>
- <contains string="${version-output}" substring="java version &quot;1.2"/>
- <contains string="${version-output}" substring="java version &quot;1.3"/>
- </or>
- </condition>
- <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
- <istrue value="${have-jdk-older-than-1.4}"/>
- </condition>
- <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
- <os family="windows"/>
- </condition>
- <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
- <isset property="debug.transport"/>
- </condition>
- </target>
- <target depends="-init-debug-args" name="-init-macrodef-debug">
- <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${main.class}" name="classname"/>
- <attribute default="${debug.classpath}" name="classpath"/>
- <element name="customize" optional="true"/>
- <sequential>
- <java classname="@{classname}" dir="${work.dir}" fork="true">
- <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
- <jvmarg line="${debug-args-line}"/>
- <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
- <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
- <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
- <jvmarg line="${run.jvmargs}"/>
- <jvmarg line="${run.jvmargs.ide}"/>
- <classpath>
- <path path="@{classpath}"/>
- </classpath>
- <syspropertyset>
- <propertyref prefix="run-sys-prop."/>
- <mapper from="run-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <customize/>
- </java>
- </sequential>
- </macrodef>
- </target>
- <target name="-init-macrodef-java">
- <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
- <attribute default="${main.class}" name="classname"/>
- <attribute default="${run.classpath}" name="classpath"/>
- <attribute default="jvm" name="jvm"/>
- <element name="customize" optional="true"/>
- <sequential>
- <java classname="@{classname}" dir="${work.dir}" fork="true">
- <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
- <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
- <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
- <jvmarg line="${run.jvmargs}"/>
- <jvmarg line="${run.jvmargs.ide}"/>
- <classpath>
- <path path="@{classpath}"/>
- </classpath>
- <syspropertyset>
- <propertyref prefix="run-sys-prop."/>
- <mapper from="run-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <customize/>
- </java>
- </sequential>
- </macrodef>
- </target>
- <target name="-init-macrodef-copylibs">
- <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${manifest.file}" name="manifest"/>
- <element name="customize" optional="true"/>
- <sequential>
- <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
- <pathconvert property="run.classpath.without.build.classes.dir">
- <path path="${run.classpath}"/>
- <map from="${build.classes.dir.resolved}" to=""/>
- </pathconvert>
- <pathconvert pathsep=" " property="jar.classpath">
- <path path="${run.classpath.without.build.classes.dir}"/>
- <chainedmapper>
- <flattenmapper/>
- <filtermapper>
- <replacestring from=" " to="%20"/>
- </filtermapper>
- <globmapper from="*" to="lib/*"/>
- </chainedmapper>
- </pathconvert>
- <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
- <copylibs compress="${jar.compress}" index="${jar.index}" indexMetaInf="${jar.index.metainf}" jarfile="${dist.jar}" manifest="@{manifest}" rebase="${copylibs.rebase}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
- <fileset dir="${build.classes.dir}" excludes="${dist.archive.excludes}"/>
- <manifest>
- <attribute name="Class-Path" value="${jar.classpath}"/>
- <customize/>
- </manifest>
- </copylibs>
- </sequential>
- </macrodef>
- </target>
- <target name="-init-presetdef-jar">
- <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
- <jar compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}">
- <j2seproject1:fileset dir="${build.classes.dir}" excludes="${dist.archive.excludes}"/>
- </jar>
- </presetdef>
- </target>
- <target name="-init-ap-cmdline-properties">
- <property name="annotation.processing.enabled" value="true"/>
- <property name="annotation.processing.processors.list" value=""/>
- <property name="annotation.processing.processor.options" value=""/>
- <property name="annotation.processing.run.all.processors" value="true"/>
- <property name="javac.processorpath" value="${javac.classpath}"/>
- <property name="javac.test.processorpath" value="${javac.test.classpath}"/>
- <condition property="ap.supported.internal" value="true">
- <not>
- <matches pattern="1\.[0-5](\..*)?" string="${javac.source}"/>
- </not>
- </condition>
- </target>
- <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-ap-cmdline-supported">
- <condition else="" property="ap.processors.internal" value="-processor ${annotation.processing.processors.list}">
- <isfalse value="${annotation.processing.run.all.processors}"/>
- </condition>
- <condition else="" property="ap.proc.none.internal" value="-proc:none">
- <isfalse value="${annotation.processing.enabled}"/>
- </condition>
- </target>
- <target depends="-init-ap-cmdline-properties,-init-ap-cmdline-supported" name="-init-ap-cmdline">
- <property name="ap.cmd.line.internal" value=""/>
- </target>
- <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-test,-init-macrodef-test-debug,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/>
- <!--
- ===================
- COMPILATION SECTION
- ===================
- -->
- <target name="-deps-jar-init" unless="built-jar.properties">
- <property location="${build.dir}/built-jar.properties" name="built-jar.properties"/>
- <delete file="${built-jar.properties}" quiet="true"/>
- </target>
- <target if="already.built.jar.${basedir}" name="-warn-already-built-jar">
- <echo level="warn" message="Cycle detected: ECTester was already built"/>
- </target>
- <target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps">
- <mkdir dir="${build.dir}"/>
- <touch file="${built-jar.properties}" verbose="false"/>
- <property file="${built-jar.properties}" prefix="already.built.jar."/>
- <antcall target="-warn-already-built-jar"/>
- <propertyfile file="${built-jar.properties}">
- <entry key="${basedir}" value=""/>
- </propertyfile>
- </target>
- <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
- <target depends="init" name="-check-automatic-build">
- <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
- </target>
- <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
- <antcall target="clean"/>
- </target>
- <target depends="init,deps-jar" name="-pre-pre-compile">
- <mkdir dir="${build.classes.dir}"/>
- </target>
- <target name="-pre-compile">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target if="do.depend.true" name="-compile-depend">
- <pathconvert property="build.generated.subdirs">
- <dirset dir="${build.generated.sources.dir}" erroronmissingdir="false">
- <include name="*"/>
- </dirset>
- </pathconvert>
- <j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/>
- </target>
- <target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml,-compile-depend" if="have.sources" name="-do-compile">
- <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
- <copy todir="${build.classes.dir}">
- <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
- </copy>
- </target>
- <target if="has.persistence.xml" name="-copy-persistence-xml">
- <mkdir dir="${build.classes.dir}/META-INF"/>
- <copy todir="${build.classes.dir}/META-INF">
- <fileset dir="${meta.inf.dir}" includes="persistence.xml orm.xml"/>
- </copy>
- </target>
- <target name="-post-compile">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
- <target name="-pre-compile-single">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
- <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
- <j2seproject3:force-recompile/>
- <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/>
- </target>
- <target name="-post-compile-single">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
- <!--
- ====================
- JAR BUILDING SECTION
- ====================
- -->
- <target depends="init" name="-pre-pre-jar">
- <dirname file="${dist.jar}" property="dist.jar.dir"/>
- <mkdir dir="${dist.jar.dir}"/>
- </target>
- <target name="-pre-jar">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init" if="do.archive" name="-do-jar-create-manifest" unless="manifest.available">
- <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
- <touch file="${tmp.manifest.file}" verbose="false"/>
- </target>
- <target depends="init" if="do.archive+manifest.available" name="-do-jar-copy-manifest">
- <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
- <copy file="${manifest.file}" tofile="${tmp.manifest.file}"/>
- </target>
- <target depends="init,-do-jar-create-manifest,-do-jar-copy-manifest" if="do.archive+main.class.available" name="-do-jar-set-mainclass">
- <manifest file="${tmp.manifest.file}" mode="update">
- <attribute name="Main-Class" value="${main.class}"/>
- </manifest>
- </target>
- <target depends="init,-do-jar-create-manifest,-do-jar-copy-manifest" if="do.archive+profile.available" name="-do-jar-set-profile">
- <manifest file="${tmp.manifest.file}" mode="update">
- <attribute name="Profile" value="${javac.profile}"/>
- </manifest>
- </target>
- <target depends="init,-do-jar-create-manifest,-do-jar-copy-manifest" if="do.archive+splashscreen.available" name="-do-jar-set-splashscreen">
- <basename file="${application.splash}" property="splashscreen.basename"/>
- <mkdir dir="${build.classes.dir}/META-INF"/>
- <copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/>
- <manifest file="${tmp.manifest.file}" mode="update">
- <attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
- </manifest>
- </target>
- <target depends="init,-init-macrodef-copylibs,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen" if="do.mkdist" name="-do-jar-copylibs">
- <j2seproject3:copylibs manifest="${tmp.manifest.file}"/>
- <echo level="info">To run this application from the command line without Ant, try:</echo>
- <property location="${dist.jar}" name="dist.jar.resolved"/>
- <echo level="info">java -jar "${dist.jar.resolved}"</echo>
- </target>
- <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen" if="do.archive" name="-do-jar-jar" unless="do.mkdist">
- <j2seproject1:jar manifest="${tmp.manifest.file}"/>
- <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
- <property location="${dist.jar}" name="dist.jar.resolved"/>
- <pathconvert property="run.classpath.with.dist.jar">
- <path path="${run.classpath}"/>
- <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
- </pathconvert>
- <condition else="" property="jar.usage.message" value="To run this application from the command line without Ant, try:${line.separator}${platform.java} -cp ${run.classpath.with.dist.jar} ${main.class}">
- <isset property="main.class.available"/>
- </condition>
- <condition else="debug" property="jar.usage.level" value="info">
- <isset property="main.class.available"/>
- </condition>
- <echo level="${jar.usage.level}" message="${jar.usage.message}"/>
- </target>
- <target depends="-do-jar-copylibs" if="do.archive" name="-do-jar-delete-manifest">
- <delete>
- <fileset file="${tmp.manifest.file}"/>
- </delete>
- </target>
- <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen,-do-jar-jar,-do-jar-delete-manifest" name="-do-jar-without-libraries"/>
- <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen,-do-jar-copylibs,-do-jar-delete-manifest" name="-do-jar-with-libraries"/>
- <target name="-post-jar">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,compile,-pre-jar,-do-jar-without-libraries,-do-jar-with-libraries,-post-jar" name="-do-jar"/>
- <target depends="init,compile,-pre-jar,-do-jar,-post-jar" description="Build JAR." name="jar"/>
- <!--
- =================
- EXECUTION SECTION
- =================
- -->
- <target depends="init,compile" description="Run a main class." name="run">
- <j2seproject1:java>
- <customize>
- <arg line="${application.args}"/>
- </customize>
- </j2seproject1:java>
- </target>
- <target name="-do-not-recompile">
- <property name="javac.includes.binary" value=""/>
- </target>
- <target depends="init,compile-single" name="run-single">
- <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
- <j2seproject1:java classname="${run.class}"/>
- </target>
- <target depends="init,compile-test-single" name="run-test-with-main">
- <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
- <j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/>
- </target>
- <!--
- =================
- DEBUGGING SECTION
- =================
- -->
- <target depends="init" if="netbeans.home" name="-debug-start-debugger">
- <j2seproject1:nbjpdastart name="${debug.class}"/>
- </target>
- <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test">
- <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/>
- </target>
- <target depends="init,compile" name="-debug-start-debuggee">
- <j2seproject3:debug>
- <customize>
- <arg line="${application.args}"/>
- </customize>
- </j2seproject3:debug>
- </target>
- <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
- <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
- <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
- </target>
- <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
- <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
- <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
- <j2seproject3:debug classname="${debug.class}"/>
- </target>
- <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
- <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test">
- <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
- <j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/>
- </target>
- <target depends="init,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/>
- <target depends="init" name="-pre-debug-fix">
- <fail unless="fix.includes">Must set fix.includes</fail>
- <property name="javac.includes" value="${fix.includes}.java"/>
- </target>
- <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
- <j2seproject1:nbjpdareload/>
- </target>
- <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
- <!--
- =================
- PROFILING SECTION
- =================
- -->
- <!--
- pre NB7.2 profiler integration
- -->
- <target depends="profile-init,compile" description="Profile a project in the IDE." if="profiler.info.jvmargs.agent" name="-profile-pre72">
- <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
- <nbprofiledirect>
- <classpath>
- <path path="${run.classpath}"/>
- </classpath>
- </nbprofiledirect>
- <profile/>
- </target>
- <target depends="profile-init,compile-single" description="Profile a selected class in the IDE." if="profiler.info.jvmargs.agent" name="-profile-single-pre72">
- <fail unless="profile.class">Must select one file in the IDE or set profile.class</fail>
- <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
- <nbprofiledirect>
- <classpath>
- <path path="${run.classpath}"/>
- </classpath>
- </nbprofiledirect>
- <profile classname="${profile.class}"/>
- </target>
- <target depends="profile-init,compile-single" if="profiler.info.jvmargs.agent" name="-profile-applet-pre72">
- <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
- <nbprofiledirect>
- <classpath>
- <path path="${run.classpath}"/>
- </classpath>
- </nbprofiledirect>
- <profile classname="sun.applet.AppletViewer">
- <customize>
- <arg value="${applet.url}"/>
- </customize>
- </profile>
- </target>
- <target depends="profile-init,compile-test-single" if="profiler.info.jvmargs.agent" name="-profile-test-single-pre72">
- <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
- <nbprofiledirect>
- <classpath>
- <path path="${run.test.classpath}"/>
- </classpath>
- </nbprofiledirect>
- <junit dir="${profiler.info.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" jvm="${profiler.info.jvm}" showoutput="true">
- <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
- <jvmarg value="${profiler.info.jvmargs.agent}"/>
- <jvmarg line="${profiler.info.jvmargs}"/>
- <test name="${profile.class}"/>
- <classpath>
- <path path="${run.test.classpath}"/>
- </classpath>
- <syspropertyset>
- <propertyref prefix="test-sys-prop."/>
- <mapper from="test-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <formatter type="brief" usefile="false"/>
- <formatter type="xml"/>
- </junit>
- </target>
- <!--
- end of pre NB72 profiling section
- -->
- <target if="netbeans.home" name="-profile-check">
- <condition property="profiler.configured">
- <or>
- <contains casesensitive="true" string="${run.jvmargs.ide}" substring="-agentpath:"/>
- <contains casesensitive="true" string="${run.jvmargs.ide}" substring="-javaagent:"/>
- </or>
- </condition>
- </target>
- <target depends="-profile-check,-profile-pre72" description="Profile a project in the IDE." if="profiler.configured" name="profile" unless="profiler.info.jvmargs.agent">
- <startprofiler/>
- <antcall target="run"/>
- </target>
- <target depends="-profile-check,-profile-single-pre72" description="Profile a selected class in the IDE." if="profiler.configured" name="profile-single" unless="profiler.info.jvmargs.agent">
- <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
- <startprofiler/>
- <antcall target="run-single"/>
- </target>
- <target depends="-profile-test-single-pre72" description="Profile a selected test in the IDE." name="profile-test-single"/>
- <target depends="-profile-check" description="Profile a selected test in the IDE." if="profiler.configured" name="profile-test" unless="profiler.info.jvmargs">
- <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
- <startprofiler/>
- <antcall target="test-single"/>
- </target>
- <target depends="-profile-check" description="Profile a selected class in the IDE." if="profiler.configured" name="profile-test-with-main">
- <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
- <startprofiler/>
- <antcal target="run-test-with-main"/>
- </target>
- <target depends="-profile-check,-profile-applet-pre72" if="profiler.configured" name="profile-applet" unless="profiler.info.jvmargs.agent">
- <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
- <startprofiler/>
- <antcall target="run-applet"/>
- </target>
- <!--
- ===============
- JAVADOC SECTION
- ===============
- -->
- <target depends="init" if="have.sources" name="-javadoc-build">
- <mkdir dir="${dist.javadoc.dir}"/>
- <condition else="" property="javadoc.endorsed.classpath.cmd.line.arg" value="-J${endorsed.classpath.cmd.line.arg}">
- <and>
- <isset property="endorsed.classpath.cmd.line.arg"/>
- <not>
- <equals arg1="${endorsed.classpath.cmd.line.arg}" arg2=""/>
- </not>
- </and>
- </condition>
- <condition else="" property="bug5101868workaround" value="*.java">
- <matches pattern="1\.[56](\..*)?" string="${java.version}"/>
- </condition>
- <javadoc additionalparam="-J-Dfile.encoding=${file.encoding} ${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
- <classpath>
- <path path="${javac.classpath}"/>
- </classpath>
- <fileset dir="${src.dir}" excludes="${bug5101868workaround},${excludes}" includes="${includes}">
- <filename name="**/*.java"/>
- </fileset>
- <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
- <include name="**/*.java"/>
- <exclude name="*.java"/>
- </fileset>
- <arg line="${javadoc.endorsed.classpath.cmd.line.arg}"/>
- </javadoc>
- <copy todir="${dist.javadoc.dir}">
- <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
- <filename name="**/doc-files/**"/>
- </fileset>
- <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
- <include name="**/doc-files/**"/>
- </fileset>
- </copy>
- </target>
- <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
- <nbbrowse file="${dist.javadoc.dir}/index.html"/>
- </target>
- <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
- <!--
- =========================
- TEST COMPILATION SECTION
- =========================
- -->
- <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
- <mkdir dir="${build.test.classes.dir}"/>
- </target>
- <target name="-pre-compile-test">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target if="do.depend.true" name="-compile-test-depend">
- <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
- </target>
- <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
- <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" processorpath="${javac.test.processorpath}" srcdir="${test.src.dir}"/>
- <copy todir="${build.test.classes.dir}">
- <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
- </copy>
- </target>
- <target name="-post-compile-test">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
- <target name="-pre-compile-test-single">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
- <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
- <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
- <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" processorpath="${javac.test.processorpath}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
- <copy todir="${build.test.classes.dir}">
- <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
- </copy>
- </target>
- <target name="-post-compile-test-single">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
- <!--
- =======================
- TEST EXECUTION SECTION
- =======================
- -->
- <target depends="init" if="have.tests" name="-pre-test-run">
- <mkdir dir="${build.test.results.dir}"/>
- </target>
- <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
- <j2seproject3:test includes="${includes}" testincludes="**/*Test.java"/>
- </target>
- <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
- <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
- </target>
- <target depends="init" if="have.tests" name="test-report"/>
- <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
- <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
- <target depends="init" if="have.tests" name="-pre-test-run-single">
- <mkdir dir="${build.test.results.dir}"/>
- </target>
- <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
- <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
- <j2seproject3:test excludes="" includes="${test.includes}" testincludes="${test.includes}"/>
- </target>
- <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
- <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
- </target>
- <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
- <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single-method">
- <fail unless="test.class">Must select some files in the IDE or set test.class</fail>
- <fail unless="test.method">Must select some method in the IDE or set test.method</fail>
- <j2seproject3:test excludes="" includes="${javac.includes}" testincludes="${test.class}" testmethods="${test.method}"/>
- </target>
- <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single-method" if="have.tests" name="-post-test-run-single-method">
- <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
- </target>
- <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single-method,-post-test-run-single-method" description="Run single unit test." name="test-single-method"/>
- <!--
- =======================
- TEST DEBUGGING SECTION
- =======================
- -->
- <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-debug-start-debuggee-test">
- <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
- <j2seproject3:test-debug excludes="" includes="${javac.includes}" testClass="${test.class}" testincludes="${javac.includes}"/>
- </target>
- <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-debug-start-debuggee-test-method">
- <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
- <fail unless="test.method">Must select some method in the IDE or set test.method</fail>
- <j2seproject3:test-debug excludes="" includes="${javac.includes}" testClass="${test.class}" testMethod="${test.method}" testincludes="${test.class}" testmethods="${test.method}"/>
- </target>
- <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
- <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
- </target>
- <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
- <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test-method" name="debug-test-method"/>
- <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
- <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
- </target>
- <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
- <!--
- =========================
- APPLET EXECUTION SECTION
- =========================
- -->
- <target depends="init,compile-single" name="run-applet">
- <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
- <j2seproject1:java classname="sun.applet.AppletViewer">
- <customize>
- <arg value="${applet.url}"/>
- </customize>
- </j2seproject1:java>
- </target>
- <!--
- =========================
- APPLET DEBUGGING SECTION
- =========================
- -->
- <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
- <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
- <j2seproject3:debug classname="sun.applet.AppletViewer">
- <customize>
- <arg value="${applet.url}"/>
- </customize>
- </j2seproject3:debug>
- </target>
- <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
- <!--
- ===============
- CLEANUP SECTION
- ===============
- -->
- <target name="-deps-clean-init" unless="built-clean.properties">
- <property location="${build.dir}/built-clean.properties" name="built-clean.properties"/>
- <delete file="${built-clean.properties}" quiet="true"/>
- </target>
- <target if="already.built.clean.${basedir}" name="-warn-already-built-clean">
- <echo level="warn" message="Cycle detected: ECTester was already built"/>
- </target>
- <target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps">
- <mkdir dir="${build.dir}"/>
- <touch file="${built-clean.properties}" verbose="false"/>
- <property file="${built-clean.properties}" prefix="already.built.clean."/>
- <antcall target="-warn-already-built-clean"/>
- <propertyfile file="${built-clean.properties}">
- <entry key="${basedir}" value=""/>
- </propertyfile>
- </target>
- <target depends="init" name="-do-clean">
- <delete dir="${build.dir}"/>
- <delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/>
- </target>
- <target name="-post-clean">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
- <target name="-check-call-dep">
- <property file="${call.built.properties}" prefix="already.built."/>
- <condition property="should.call.dep">
- <and>
- <not>
- <isset property="already.built.${call.subproject}"/>
- </not>
- <available file="${call.script}"/>
- </and>
- </condition>
- </target>
- <target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep">
- <ant antfile="${call.script}" inheritall="false" target="${call.target}">
- <propertyset>
- <propertyref prefix="transfer."/>
- <mapper from="transfer.*" to="*" type="glob"/>
- </propertyset>
- </ant>
- </target>
-</project>
diff --git a/nbproject/reader/manifest.mf b/nbproject/reader/manifest.mf
deleted file mode 100644
index f1c6743..0000000
--- a/nbproject/reader/manifest.mf
+++ /dev/null
@@ -1,4 +0,0 @@
-Manifest-Version: 1.0
-Class-Path: lib/bcprov-jdk18on-172.jar lib/jcardsim-3.0.5.11.jar lib/commons-cli-1.5.0.jar lib/snakeyaml-1.19.jar
-Main-Class: cz.crcs.ectester.reader.ECTesterReader
-
diff --git a/nbproject/reader/project.properties b/nbproject/reader/project.properties
deleted file mode 100644
index 3049d39..0000000
--- a/nbproject/reader/project.properties
+++ /dev/null
@@ -1,80 +0,0 @@
-annotation.processing.enabled=true
-annotation.processing.enabled.in.editor=false
-annotation.processing.processors.list=
-annotation.processing.run.all.processors=true
-annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
-application.title=ECTesterReader
-application.vendor=xsvenda
-build.classes.dir=${build.dir}/classes
-build.classes.excludes=**/*.java,**/*.form,**/*.c,**/*.cpp,**/*.hpp,**/*.h,**/*.a,**/*.o,**/*.so,**/Makefile,**/Makefile.bat
-# This directory is removed when the project is cleaned:
-build.dir=build
-build.generated.dir=${build.dir}/generated
-build.generated.sources.dir=${build.dir}/generated-sources
-# Only compile against the classpath explicitly listed here:
-build.sysclasspath=ignore
-build.test.classes.dir=${build.dir}/test/classes
-build.test.results.dir=${build.dir}/test/results
-# Uncomment to specify the preferred debugger connection transport:
-#debug.transport=dt_socket
-debug.classpath=\
- ${run.classpath}
-debug.test.classpath=\
- ${run.test.classpath}
-# Files in build.classes.dir which should be excluded from distribution jar
-dist.archive.excludes=**/*.java,**/*.form,**/*.c,**/*.cpp,**/*.hpp,**/*.h,**/*.a,**/*.o,**/*.so,**/Makefile,**/Makefile.bat
-# This directory is removed when the project is cleaned:
-dist.dir=dist
-dist.jar=${dist.dir}/ECTesterReader.jar
-dist.javadoc.dir=${dist.dir}/javadoc
-libs.CopyLibs.classpath=nbproject/copylibstask.jar
-endorsed.classpath=
-excludes=
-includes=**/applet/**,**/common/**,**/data/**,**/reader/**
-jar.compress=true
-javac.classpath=\
- lib/bcprov-jdk18on-172.jar:\
- lib/jcardsim-3.0.5.11.jar:\
- lib/commons-cli-1.5.0.jar:\
- lib/snakeyaml-1.19.jar
-# Space-separated list of extra javac options
-javac.compilerargs=-Xlint:all
-javac.deprecation=false
-javac.processorpath=\
- ${javac.classpath}
-javac.source=11
-javac.target=11
-javac.test.classpath=\
- ${javac.classpath}:\
- ${build.classes.dir}
-javac.test.processorpath=\
- ${javac.test.classpath}
-javadoc.additionalparam=
-javadoc.author=false
-javadoc.encoding=${source.encoding}
-javadoc.noindex=false
-javadoc.nonavbar=false
-javadoc.notree=false
-javadoc.private=false
-javadoc.splitindex=true
-javadoc.use=true
-javadoc.version=false
-javadoc.windowtitle=
-main.class=cz.crcs.ectester.reader.ECTesterReader
-manifest.file=nbproject/reader/manifest.mf
-meta.inf.dir=${src.dir}/META-INF
-mkdist.disabled=false
-platform.active=default_platform
-run.classpath=\
- ${javac.classpath}:\
- ${build.classes.dir}
-# Space-separated list of JVM arguments used when running the project.
-# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value.
-# To set system properties for unit tests define test-sys-prop.name=value:
-run.jvmargs=
-run.test.classpath=\
- ${javac.test.classpath}:\
- ${build.test.classes.dir}
-source.encoding=UTF-8
-src.dir=src
-test.src.dir=test
diff --git a/nbproject/reader/project.xml b/nbproject/reader/project.xml
deleted file mode 100644
index aebe217..0000000
--- a/nbproject/reader/project.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://www.netbeans.org/ns/project/1">
- <type>org.netbeans.modules.java.j2seproject</type>
- <configuration>
- <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
- <name>ECTesterReader</name>
- <source-roots>
- <root id="src.dir"/>
- </source-roots>
- <test-roots>
- <root id="test.src.dir"/>
- </test-roots>
- </data>
- </configuration>
-</project>
diff --git a/nbproject/standalone/build-impl.xml b/nbproject/standalone/build-impl.xml
deleted file mode 100644
index a1f91c2..0000000
--- a/nbproject/standalone/build-impl.xml
+++ /dev/null
@@ -1,1413 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-*** GENERATED FROM project.xml - DO NOT EDIT ***
-*** EDIT ../build.xml INSTEAD ***
-
-For the purpose of easier reading the script
-is divided into following sections:
-
- - initialization
- - compilation
- - jar
- - execution
- - debugging
- - javadoc
- - test compilation
- - test execution
- - test debugging
- - applet
- - cleanup
-
- -->
-<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir="../../../" default="default" name="ECTesterStandalone-impl">
- <fail message="Please build using Ant 1.8.0 or higher.">
- <condition>
- <not>
- <antversion atleast="1.8.0"/>
- </not>
- </condition>
- </fail>
- <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
- <!--
- ======================
- INITIALIZATION SECTION
- ======================
- -->
- <target name="-pre-init">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="-pre-init" name="-init-private">
- <property file="nbproject/private/config.properties"/>
- <property file="nbproject/private/configs/${config}.properties"/>
- <property file="nbproject/private/private.properties"/>
- </target>
- <target depends="-pre-init,-init-private" name="-init-user">
- <property file="${user.properties.file}"/>
- <!-- The two properties below are usually overridden -->
- <!-- by the active platform. Just a fallback. -->
- <property name="default.javac.source" value="1.4"/>
- <property name="default.javac.target" value="1.4"/>
- </target>
- <target depends="-pre-init,-init-private,-init-user" name="-init-project">
- <property file="nbproject/configs/${config}.properties"/>
- <property file="nbproject/standalone/project.properties"/>
- </target>
- <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
- <property name="platform.java" value="${java.home}/bin/java"/>
- <available file="${manifest.file}" property="manifest.available"/>
- <condition property="splashscreen.available">
- <and>
- <not>
- <equals arg1="${application.splash}" arg2="" trim="true"/>
- </not>
- <available file="${application.splash}"/>
- </and>
- </condition>
- <condition property="main.class.available">
- <and>
- <isset property="main.class"/>
- <not>
- <equals arg1="${main.class}" arg2="" trim="true"/>
- </not>
- </and>
- </condition>
- <condition property="profile.available">
- <and>
- <isset property="javac.profile"/>
- <length length="0" string="${javac.profile}" when="greater"/>
- <matches pattern="1\.[89](\..*)?" string="${javac.source}"/>
- </and>
- </condition>
- <condition property="do.archive">
- <or>
- <not>
- <istrue value="${jar.archive.disabled}"/>
- </not>
- <istrue value="${not.archive.disabled}"/>
- </or>
- </condition>
- <condition property="do.mkdist">
- <and>
- <isset property="do.archive"/>
- <isset property="libs.CopyLibs.classpath"/>
- <not>
- <istrue value="${mkdist.disabled}"/>
- </not>
- </and>
- </condition>
- <condition property="do.archive+manifest.available">
- <and>
- <isset property="manifest.available"/>
- <istrue value="${do.archive}"/>
- </and>
- </condition>
- <condition property="do.archive+main.class.available">
- <and>
- <isset property="main.class.available"/>
- <istrue value="${do.archive}"/>
- </and>
- </condition>
- <condition property="do.archive+splashscreen.available">
- <and>
- <isset property="splashscreen.available"/>
- <istrue value="${do.archive}"/>
- </and>
- </condition>
- <condition property="do.archive+profile.available">
- <and>
- <isset property="profile.available"/>
- <istrue value="${do.archive}"/>
- </and>
- </condition>
- <condition property="have.tests">
- <or>
- <available file="${test.src.dir}"/>
- </or>
- </condition>
- <condition property="have.sources">
- <or>
- <available file="${src.dir}"/>
- </or>
- </condition>
- <condition property="netbeans.home+have.tests">
- <and>
- <isset property="netbeans.home"/>
- <isset property="have.tests"/>
- </and>
- </condition>
- <condition property="no.javadoc.preview">
- <and>
- <isset property="javadoc.preview"/>
- <isfalse value="${javadoc.preview}"/>
- </and>
- </condition>
- <property name="run.jvmargs" value=""/>
- <property name="run.jvmargs.ide" value=""/>
- <property name="javac.compilerargs" value=""/>
- <property name="work.dir" value="${basedir}"/>
- <condition property="no.deps">
- <and>
- <istrue value="${no.dependencies}"/>
- </and>
- </condition>
- <property name="javac.debug" value="true"/>
- <property name="javadoc.preview" value="true"/>
- <property name="application.args" value=""/>
- <property name="source.encoding" value="${file.encoding}"/>
- <property name="runtime.encoding" value="${source.encoding}"/>
- <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
- <and>
- <isset property="javadoc.encoding"/>
- <not>
- <equals arg1="${javadoc.encoding}" arg2=""/>
- </not>
- </and>
- </condition>
- <property name="javadoc.encoding.used" value="${source.encoding}"/>
- <property name="includes" value="**"/>
- <property name="excludes" value=""/>
- <property name="do.depend" value="false"/>
- <condition property="do.depend.true">
- <istrue value="${do.depend}"/>
- </condition>
- <path id="endorsed.classpath.path" path="${endorsed.classpath}"/>
- <condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'">
- <and>
- <isset property="endorsed.classpath"/>
- <not>
- <equals arg1="${endorsed.classpath}" arg2="" trim="true"/>
- </not>
- </and>
- </condition>
- <condition else="" property="javac.profile.cmd.line.arg" value="-profile ${javac.profile}">
- <isset property="profile.available"/>
- </condition>
- <condition else="false" property="jdkBug6558476">
- <and>
- <matches pattern="1\.[56]" string="${java.specification.version}"/>
- <not>
- <os family="unix"/>
- </not>
- </and>
- </condition>
- <property name="javac.fork" value="${jdkBug6558476}"/>
- <property name="jar.index" value="false"/>
- <property name="jar.index.metainf" value="${jar.index}"/>
- <property name="copylibs.rebase" value="true"/>
- <available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/>
- <condition property="junit.available">
- <or>
- <available classname="org.junit.Test" classpath="${run.test.classpath}"/>
- <available classname="junit.framework.Test" classpath="${run.test.classpath}"/>
- </or>
- </condition>
- <condition property="testng.available">
- <available classname="org.testng.annotations.Test" classpath="${run.test.classpath}"/>
- </condition>
- <condition property="junit+testng.available">
- <and>
- <istrue value="${junit.available}"/>
- <istrue value="${testng.available}"/>
- </and>
- </condition>
- <condition else="testng" property="testng.mode" value="mixed">
- <istrue value="${junit+testng.available}"/>
- </condition>
- <condition else="" property="testng.debug.mode" value="-mixed">
- <istrue value="${junit+testng.available}"/>
- </condition>
- </target>
- <target name="-post-init">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check">
- <fail unless="src.dir">Must set src.dir</fail>
- <fail unless="test.src.dir">Must set test.src.dir</fail>
- <fail unless="build.dir">Must set build.dir</fail>
- <fail unless="dist.dir">Must set dist.dir</fail>
- <fail unless="build.classes.dir">Must set build.classes.dir</fail>
- <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
- <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
- <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
- <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
- <fail unless="dist.jar">Must set dist.jar</fail>
- </target>
- <target name="-init-macrodef-property">
- <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
- <attribute name="name"/>
- <attribute name="value"/>
- <sequential>
- <property name="@{name}" value="${@{value}}"/>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors">
- <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${src.dir}" name="srcdir"/>
- <attribute default="${build.classes.dir}" name="destdir"/>
- <attribute default="${javac.classpath}" name="classpath"/>
- <attribute default="${javac.processorpath}" name="processorpath"/>
- <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="${javac.debug}" name="debug"/>
- <attribute default="${empty.dir}" name="sourcepath"/>
- <attribute default="${empty.dir}" name="gensrcdir"/>
- <element name="customize" optional="true"/>
- <sequential>
- <property location="${build.dir}/empty" name="empty.dir"/>
- <mkdir dir="${empty.dir}"/>
- <mkdir dir="@{apgeneratedsrcdir}"/>
- <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
- <src>
- <dirset dir="@{gensrcdir}" erroronmissingdir="false">
- <include name="*"/>
- </dirset>
- </src>
- <classpath>
- <path path="@{classpath}"/>
- </classpath>
- <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
- <compilerarg line="${javac.profile.cmd.line.arg}"/>
- <compilerarg line="${javac.compilerargs}"/>
- <compilerarg value="-processorpath"/>
- <compilerarg path="@{processorpath}:${empty.dir}"/>
- <compilerarg line="${ap.processors.internal}"/>
- <compilerarg line="${annotation.processing.processor.options}"/>
- <compilerarg value="-s"/>
- <compilerarg path="@{apgeneratedsrcdir}"/>
- <compilerarg line="${ap.proc.none.internal}"/>
- <customize/>
- </javac>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-ap-cmdline-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal">
- <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${src.dir}" name="srcdir"/>
- <attribute default="${build.classes.dir}" name="destdir"/>
- <attribute default="${javac.classpath}" name="classpath"/>
- <attribute default="${javac.processorpath}" name="processorpath"/>
- <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="${javac.debug}" name="debug"/>
- <attribute default="${empty.dir}" name="sourcepath"/>
- <attribute default="${empty.dir}" name="gensrcdir"/>
- <element name="customize" optional="true"/>
- <sequential>
- <property location="${build.dir}/empty" name="empty.dir"/>
- <mkdir dir="${empty.dir}"/>
- <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
- <src>
- <dirset dir="@{gensrcdir}" erroronmissingdir="false">
- <include name="*"/>
- </dirset>
- </src>
- <classpath>
- <path path="@{classpath}"/>
- </classpath>
- <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
- <compilerarg line="${javac.profile.cmd.line.arg}"/>
- <compilerarg line="${javac.compilerargs}"/>
- <customize/>
- </javac>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac">
- <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${src.dir}" name="srcdir"/>
- <attribute default="${build.classes.dir}" name="destdir"/>
- <attribute default="${javac.classpath}" name="classpath"/>
- <sequential>
- <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
- <classpath>
- <path path="@{classpath}"/>
- </classpath>
- </depend>
- </sequential>
- </macrodef>
- <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${build.classes.dir}" name="destdir"/>
- <sequential>
- <fail unless="javac.includes">Must set javac.includes</fail>
- <pathconvert pathsep="${line.separator}" property="javac.includes.binary">
- <path>
- <filelist dir="@{destdir}" files="${javac.includes}"/>
- </path>
- <globmapper from="*.java" to="*.class"/>
- </pathconvert>
- <tempfile deleteonexit="true" property="javac.includesfile.binary"/>
- <echo file="${javac.includesfile.binary}" message="${javac.includes.binary}"/>
- <delete>
- <files includesfile="${javac.includesfile.binary}"/>
- </delete>
- <delete>
- <fileset file="${javac.includesfile.binary}"/>
- </delete>
- </sequential>
- </macrodef>
- </target>
- <target if="${junit.available}" name="-init-macrodef-junit-init">
- <condition else="false" property="nb.junit.batch" value="true">
- <and>
- <istrue value="${junit.available}"/>
- <not>
- <isset property="test.method"/>
- </not>
- </and>
- </condition>
- <condition else="false" property="nb.junit.single" value="true">
- <and>
- <istrue value="${junit.available}"/>
- <isset property="test.method"/>
- </and>
- </condition>
- </target>
- <target name="-init-test-properties">
- <property name="test.binaryincludes" value="&lt;nothing&gt;"/>
- <property name="test.binarytestincludes" value=""/>
- <property name="test.binaryexcludes" value=""/>
- </target>
- <target if="${nb.junit.single}" name="-init-macrodef-junit-single" unless="${nb.junit.batch}">
- <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element name="customize" optional="true"/>
- <sequential>
- <property name="junit.forkmode" value="perTest"/>
- <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
- <test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
- <syspropertyset>
- <propertyref prefix="test-sys-prop."/>
- <mapper from="test-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <formatter type="brief" usefile="false"/>
- <formatter type="xml"/>
- <jvmarg value="-ea"/>
- <customize/>
- </junit>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-test-properties" if="${nb.junit.batch}" name="-init-macrodef-junit-batch" unless="${nb.junit.single}">
- <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element name="customize" optional="true"/>
- <sequential>
- <property name="junit.forkmode" value="perTest"/>
- <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
- <batchtest todir="${build.test.results.dir}">
- <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
- <filename name="@{testincludes}"/>
- </fileset>
- <fileset dir="${build.test.classes.dir}" excludes="@{excludes},${excludes},${test.binaryexcludes}" includes="${test.binaryincludes}">
- <filename name="${test.binarytestincludes}"/>
- </fileset>
- </batchtest>
- <syspropertyset>
- <propertyref prefix="test-sys-prop."/>
- <mapper from="test-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <formatter type="brief" usefile="false"/>
- <formatter type="xml"/>
- <jvmarg value="-ea"/>
- <customize/>
- </junit>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-junit-init,-init-macrodef-junit-single, -init-macrodef-junit-batch" if="${junit.available}" name="-init-macrodef-junit"/>
- <target if="${testng.available}" name="-init-macrodef-testng">
- <macrodef name="testng" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element name="customize" optional="true"/>
- <sequential>
- <condition else="" property="testng.methods.arg" value="@{testincludes}.@{testmethods}">
- <isset property="test.method"/>
- </condition>
- <union id="test.set">
- <fileset dir="${test.src.dir}" excludes="@{excludes},**/*.xml,${excludes}" includes="@{includes}">
- <filename name="@{testincludes}"/>
- </fileset>
- </union>
- <taskdef classname="org.testng.TestNGAntTask" classpath="${run.test.classpath}" name="testng"/>
- <testng classfilesetref="test.set" failureProperty="tests.failed" listeners="org.testng.reporters.VerboseReporter" methods="${testng.methods.arg}" mode="${testng.mode}" outputdir="${build.test.results.dir}" suitename="ECTester" testname="TestNG tests" workingDir="${work.dir}">
- <xmlfileset dir="${build.test.classes.dir}" includes="@{testincludes}"/>
- <propertyset>
- <propertyref prefix="test-sys-prop."/>
- <mapper from="test-sys-prop.*" to="*" type="glob"/>
- </propertyset>
- <customize/>
- </testng>
- </sequential>
- </macrodef>
- </target>
- <target name="-init-macrodef-test-impl">
- <macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element implicit="true" name="customize" optional="true"/>
- <sequential>
- <echo>No tests executed.</echo>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-junit" if="${junit.available}" name="-init-macrodef-junit-impl">
- <macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element implicit="true" name="customize" optional="true"/>
- <sequential>
- <j2seproject3:junit excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
- <customize/>
- </j2seproject3:junit>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-testng" if="${testng.available}" name="-init-macrodef-testng-impl">
- <macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element implicit="true" name="customize" optional="true"/>
- <sequential>
- <j2seproject3:testng excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
- <customize/>
- </j2seproject3:testng>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-test-impl,-init-macrodef-junit-impl,-init-macrodef-testng-impl" name="-init-macrodef-test">
- <macrodef name="test" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <sequential>
- <j2seproject3:test-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
- <customize>
- <classpath>
- <path path="${run.test.classpath}"/>
- </classpath>
- <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
- <jvmarg line="${run.jvmargs}"/>
- <jvmarg line="${run.jvmargs.ide}"/>
- </customize>
- </j2seproject3:test-impl>
- </sequential>
- </macrodef>
- </target>
- <target if="${junit.available}" name="-init-macrodef-junit-debug" unless="${nb.junit.batch}">
- <macrodef name="junit-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element name="customize" optional="true"/>
- <sequential>
- <property name="junit.forkmode" value="perTest"/>
- <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
- <test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
- <syspropertyset>
- <propertyref prefix="test-sys-prop."/>
- <mapper from="test-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <formatter type="brief" usefile="false"/>
- <formatter type="xml"/>
- <jvmarg value="-ea"/>
- <jvmarg line="${debug-args-line}"/>
- <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
- <customize/>
- </junit>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-test-properties" if="${nb.junit.batch}" name="-init-macrodef-junit-debug-batch">
- <macrodef name="junit-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element name="customize" optional="true"/>
- <sequential>
- <property name="junit.forkmode" value="perTest"/>
- <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
- <batchtest todir="${build.test.results.dir}">
- <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
- <filename name="@{testincludes}"/>
- </fileset>
- <fileset dir="${build.test.classes.dir}" excludes="@{excludes},${excludes},${test.binaryexcludes}" includes="${test.binaryincludes}">
- <filename name="${test.binarytestincludes}"/>
- </fileset>
- </batchtest>
- <syspropertyset>
- <propertyref prefix="test-sys-prop."/>
- <mapper from="test-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <formatter type="brief" usefile="false"/>
- <formatter type="xml"/>
- <jvmarg value="-ea"/>
- <jvmarg line="${debug-args-line}"/>
- <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
- <customize/>
- </junit>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-junit-debug,-init-macrodef-junit-debug-batch" if="${junit.available}" name="-init-macrodef-junit-debug-impl">
- <macrodef name="test-debug-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element implicit="true" name="customize" optional="true"/>
- <sequential>
- <j2seproject3:junit-debug excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
- <customize/>
- </j2seproject3:junit-debug>
- </sequential>
- </macrodef>
- </target>
- <target if="${testng.available}" name="-init-macrodef-testng-debug">
- <macrodef name="testng-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${main.class}" name="testClass"/>
- <attribute default="" name="testMethod"/>
- <element name="customize2" optional="true"/>
- <sequential>
- <condition else="-testclass @{testClass}" property="test.class.or.method" value="-methods @{testClass}.@{testMethod}">
- <isset property="test.method"/>
- </condition>
- <condition else="-suitename ECTester -testname @{testClass} ${test.class.or.method}" property="testng.cmd.args" value="@{testClass}">
- <matches pattern=".*\.xml" string="@{testClass}"/>
- </condition>
- <delete dir="${build.test.results.dir}" quiet="true"/>
- <mkdir dir="${build.test.results.dir}"/>
- <j2seproject3:debug classname="org.testng.TestNG" classpath="${debug.test.classpath}">
- <customize>
- <customize2/>
- <jvmarg value="-ea"/>
- <arg line="${testng.debug.mode}"/>
- <arg line="-d ${build.test.results.dir}"/>
- <arg line="-listener org.testng.reporters.VerboseReporter"/>
- <arg line="${testng.cmd.args}"/>
- </customize>
- </j2seproject3:debug>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-testng-debug" if="${testng.available}" name="-init-macrodef-testng-debug-impl">
- <macrodef name="testng-debug-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${main.class}" name="testClass"/>
- <attribute default="" name="testMethod"/>
- <element implicit="true" name="customize2" optional="true"/>
- <sequential>
- <j2seproject3:testng-debug testClass="@{testClass}" testMethod="@{testMethod}">
- <customize2/>
- </j2seproject3:testng-debug>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-junit-debug-impl" if="${junit.available}" name="-init-macrodef-test-debug-junit">
- <macrodef name="test-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <attribute default="${main.class}" name="testClass"/>
- <attribute default="" name="testMethod"/>
- <sequential>
- <j2seproject3:test-debug-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
- <customize>
- <classpath>
- <path path="${run.test.classpath}"/>
- </classpath>
- <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
- <jvmarg line="${run.jvmargs}"/>
- <jvmarg line="${run.jvmargs.ide}"/>
- </customize>
- </j2seproject3:test-debug-impl>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-testng-debug-impl" if="${testng.available}" name="-init-macrodef-test-debug-testng">
- <macrodef name="test-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <attribute default="${main.class}" name="testClass"/>
- <attribute default="" name="testMethod"/>
- <sequential>
- <j2seproject3:testng-debug-impl testClass="@{testClass}" testMethod="@{testMethod}">
- <customize2>
- <syspropertyset>
- <propertyref prefix="test-sys-prop."/>
- <mapper from="test-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- </customize2>
- </j2seproject3:testng-debug-impl>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-test-debug-junit,-init-macrodef-test-debug-testng" name="-init-macrodef-test-debug"/>
- <!--
- pre NB7.2 profiling section; consider it deprecated
- -->
- <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check" if="profiler.info.jvmargs.agent" name="profile-init"/>
- <target if="profiler.info.jvmargs.agent" name="-profile-pre-init">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target if="profiler.info.jvmargs.agent" name="-profile-post-init">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target if="profiler.info.jvmargs.agent" name="-profile-init-macrodef-profile">
- <macrodef name="resolve">
- <attribute name="name"/>
- <attribute name="value"/>
- <sequential>
- <property name="@{name}" value="${env.@{value}}"/>
- </sequential>
- </macrodef>
- <macrodef name="profile">
- <attribute default="${main.class}" name="classname"/>
- <element name="customize" optional="true"/>
- <sequential>
- <property environment="env"/>
- <resolve name="profiler.current.path" value="${profiler.info.pathvar}"/>
- <java classname="@{classname}" dir="${profiler.info.dir}" fork="true" jvm="${profiler.info.jvm}">
- <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
- <jvmarg value="${profiler.info.jvmargs.agent}"/>
- <jvmarg line="${profiler.info.jvmargs}"/>
- <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
- <arg line="${application.args}"/>
- <classpath>
- <path path="${run.classpath}"/>
- </classpath>
- <syspropertyset>
- <propertyref prefix="run-sys-prop."/>
- <mapper from="run-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <customize/>
- </java>
- </sequential>
- </macrodef>
- </target>
- <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile" if="profiler.info.jvmargs.agent" name="-profile-init-check">
- <fail unless="profiler.info.jvm">Must set JVM to use for profiling in profiler.info.jvm</fail>
- <fail unless="profiler.info.jvmargs.agent">Must set profiler agent JVM arguments in profiler.info.jvmargs.agent</fail>
- </target>
- <!--
- end of pre NB7.2 profiling section
- -->
- <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
- <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
- <attribute default="${main.class}" name="name"/>
- <attribute default="${debug.classpath}" name="classpath"/>
- <attribute default="" name="stopclassname"/>
- <sequential>
- <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
- <classpath>
- <path path="@{classpath}"/>
- </classpath>
- </nbjpdastart>
- </sequential>
- </macrodef>
- <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
- <attribute default="${build.classes.dir}" name="dir"/>
- <sequential>
- <nbjpdareload>
- <fileset dir="@{dir}" includes="${fix.classes}">
- <include name="${fix.includes}*.class"/>
- </fileset>
- </nbjpdareload>
- </sequential>
- </macrodef>
- </target>
- <target name="-init-debug-args">
- <property name="version-output" value="java version &quot;${ant.java.version}"/>
- <condition property="have-jdk-older-than-1.4">
- <or>
- <contains string="${version-output}" substring="java version &quot;1.0"/>
- <contains string="${version-output}" substring="java version &quot;1.1"/>
- <contains string="${version-output}" substring="java version &quot;1.2"/>
- <contains string="${version-output}" substring="java version &quot;1.3"/>
- </or>
- </condition>
- <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
- <istrue value="${have-jdk-older-than-1.4}"/>
- </condition>
- <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
- <os family="windows"/>
- </condition>
- <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
- <isset property="debug.transport"/>
- </condition>
- </target>
- <target depends="-init-debug-args" name="-init-macrodef-debug">
- <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${main.class}" name="classname"/>
- <attribute default="${debug.classpath}" name="classpath"/>
- <element name="customize" optional="true"/>
- <sequential>
- <java classname="@{classname}" dir="${work.dir}" fork="true">
- <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
- <jvmarg line="${debug-args-line}"/>
- <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
- <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
- <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
- <jvmarg line="${run.jvmargs}"/>
- <jvmarg line="${run.jvmargs.ide}"/>
- <classpath>
- <path path="@{classpath}"/>
- </classpath>
- <syspropertyset>
- <propertyref prefix="run-sys-prop."/>
- <mapper from="run-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <customize/>
- </java>
- </sequential>
- </macrodef>
- </target>
- <target name="-init-macrodef-java">
- <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
- <attribute default="${main.class}" name="classname"/>
- <attribute default="${run.classpath}" name="classpath"/>
- <attribute default="jvm" name="jvm"/>
- <element name="customize" optional="true"/>
- <sequential>
- <java classname="@{classname}" dir="${work.dir}" fork="true">
- <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
- <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
- <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
- <jvmarg line="${run.jvmargs}"/>
- <jvmarg line="${run.jvmargs.ide}"/>
- <classpath>
- <path path="@{classpath}"/>
- </classpath>
- <syspropertyset>
- <propertyref prefix="run-sys-prop."/>
- <mapper from="run-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <customize/>
- </java>
- </sequential>
- </macrodef>
- </target>
- <target name="-init-macrodef-copylibs">
- <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${manifest.file}" name="manifest"/>
- <element name="customize" optional="true"/>
- <sequential>
- <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
- <pathconvert property="run.classpath.without.build.classes.dir">
- <path path="${run.classpath}"/>
- <map from="${build.classes.dir.resolved}" to=""/>
- </pathconvert>
- <pathconvert pathsep=" " property="jar.classpath">
- <path path="${run.classpath.without.build.classes.dir}"/>
- <chainedmapper>
- <flattenmapper/>
- <filtermapper>
- <replacestring from=" " to="%20"/>
- </filtermapper>
- <globmapper from="*" to="lib/*"/>
- </chainedmapper>
- </pathconvert>
- <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
- <copylibs compress="${jar.compress}" index="${jar.index}" indexMetaInf="${jar.index.metainf}" jarfile="${dist.jar}" manifest="@{manifest}" rebase="${copylibs.rebase}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
- <fileset dir="${build.classes.dir}" excludes="${dist.archive.excludes}"/>
- <manifest>
- <attribute name="Class-Path" value="${jar.classpath}"/>
- <customize/>
- </manifest>
- </copylibs>
- </sequential>
- </macrodef>
- </target>
- <target name="-init-presetdef-jar">
- <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
- <jar compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}">
- <j2seproject1:fileset dir="${build.classes.dir}" excludes="${dist.archive.excludes}"/>
- </jar>
- </presetdef>
- </target>
- <target name="-init-ap-cmdline-properties">
- <property name="annotation.processing.enabled" value="true"/>
- <property name="annotation.processing.processors.list" value=""/>
- <property name="annotation.processing.processor.options" value=""/>
- <property name="annotation.processing.run.all.processors" value="true"/>
- <property name="javac.processorpath" value="${javac.classpath}"/>
- <property name="javac.test.processorpath" value="${javac.test.classpath}"/>
- <condition property="ap.supported.internal" value="true">
- <not>
- <matches pattern="1\.[0-5](\..*)?" string="${javac.source}"/>
- </not>
- </condition>
- </target>
- <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-ap-cmdline-supported">
- <condition else="" property="ap.processors.internal" value="-processor ${annotation.processing.processors.list}">
- <isfalse value="${annotation.processing.run.all.processors}"/>
- </condition>
- <condition else="" property="ap.proc.none.internal" value="-proc:none">
- <isfalse value="${annotation.processing.enabled}"/>
- </condition>
- </target>
- <target depends="-init-ap-cmdline-properties,-init-ap-cmdline-supported" name="-init-ap-cmdline">
- <property name="ap.cmd.line.internal" value=""/>
- </target>
- <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-test,-init-macrodef-test-debug,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/>
- <!--
- ===================
- COMPILATION SECTION
- ===================
- -->
- <target name="-deps-jar-init" unless="built-jar.properties">
- <property location="${build.dir}/built-jar.properties" name="built-jar.properties"/>
- <delete file="${built-jar.properties}" quiet="true"/>
- </target>
- <target if="already.built.jar.${basedir}" name="-warn-already-built-jar">
- <echo level="warn" message="Cycle detected: ECTester was already built"/>
- </target>
- <target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps">
- <mkdir dir="${build.dir}"/>
- <touch file="${built-jar.properties}" verbose="false"/>
- <property file="${built-jar.properties}" prefix="already.built.jar."/>
- <antcall target="-warn-already-built-jar"/>
- <propertyfile file="${built-jar.properties}">
- <entry key="${basedir}" value=""/>
- </propertyfile>
- </target>
- <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
- <target depends="init" name="-check-automatic-build">
- <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
- </target>
- <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
- <antcall target="clean"/>
- </target>
- <target depends="init,deps-jar" name="-pre-pre-compile">
- <mkdir dir="${build.classes.dir}"/>
- </target>
- <target name="-pre-compile">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target if="do.depend.true" name="-compile-depend">
- <pathconvert property="build.generated.subdirs">
- <dirset dir="${build.generated.sources.dir}" erroronmissingdir="false">
- <include name="*"/>
- </dirset>
- </pathconvert>
- <j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/>
- </target>
- <target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml,-compile-depend" if="have.sources" name="-do-compile">
- <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
- <copy todir="${build.classes.dir}">
- <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
- </copy>
- </target>
- <target if="has.persistence.xml" name="-copy-persistence-xml">
- <mkdir dir="${build.classes.dir}/META-INF"/>
- <copy todir="${build.classes.dir}/META-INF">
- <fileset dir="${meta.inf.dir}" includes="persistence.xml orm.xml"/>
- </copy>
- </target>
- <target name="-post-compile">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
- <target name="-pre-compile-single">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
- <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
- <j2seproject3:force-recompile/>
- <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/>
- </target>
- <target name="-post-compile-single">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
- <!--
- ====================
- JAR BUILDING SECTION
- ====================
- -->
- <target depends="init" name="-pre-pre-jar">
- <dirname file="${dist.jar}" property="dist.jar.dir"/>
- <mkdir dir="${dist.jar.dir}"/>
- </target>
- <target name="-pre-jar">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init" if="do.archive" name="-do-jar-create-manifest" unless="manifest.available">
- <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
- <touch file="${tmp.manifest.file}" verbose="false"/>
- </target>
- <target depends="init" if="do.archive+manifest.available" name="-do-jar-copy-manifest">
- <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
- <copy file="${manifest.file}" tofile="${tmp.manifest.file}"/>
- </target>
- <target depends="init,-do-jar-create-manifest,-do-jar-copy-manifest" if="do.archive+main.class.available" name="-do-jar-set-mainclass">
- <manifest file="${tmp.manifest.file}" mode="update">
- <attribute name="Main-Class" value="${main.class}"/>
- </manifest>
- </target>
- <target depends="init,-do-jar-create-manifest,-do-jar-copy-manifest" if="do.archive+profile.available" name="-do-jar-set-profile">
- <manifest file="${tmp.manifest.file}" mode="update">
- <attribute name="Profile" value="${javac.profile}"/>
- </manifest>
- </target>
- <target depends="init,-do-jar-create-manifest,-do-jar-copy-manifest" if="do.archive+splashscreen.available" name="-do-jar-set-splashscreen">
- <basename file="${application.splash}" property="splashscreen.basename"/>
- <mkdir dir="${build.classes.dir}/META-INF"/>
- <copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/>
- <manifest file="${tmp.manifest.file}" mode="update">
- <attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
- </manifest>
- </target>
- <target depends="init,-init-macrodef-copylibs,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen" if="do.mkdist" name="-do-jar-copylibs">
- <j2seproject3:copylibs manifest="${tmp.manifest.file}"/>
- <echo level="info">To run this application from the command line without Ant, try:</echo>
- <property location="${dist.jar}" name="dist.jar.resolved"/>
- <echo level="info">java -jar "${dist.jar.resolved}"</echo>
- </target>
- <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen" if="do.archive" name="-do-jar-jar" unless="do.mkdist">
- <j2seproject1:jar manifest="${tmp.manifest.file}"/>
- <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
- <property location="${dist.jar}" name="dist.jar.resolved"/>
- <pathconvert property="run.classpath.with.dist.jar">
- <path path="${run.classpath}"/>
- <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
- </pathconvert>
- <condition else="" property="jar.usage.message" value="To run this application from the command line without Ant, try:${line.separator}${platform.java} -cp ${run.classpath.with.dist.jar} ${main.class}">
- <isset property="main.class.available"/>
- </condition>
- <condition else="debug" property="jar.usage.level" value="info">
- <isset property="main.class.available"/>
- </condition>
- <echo level="${jar.usage.level}" message="${jar.usage.message}"/>
- </target>
- <target depends="-do-jar-copylibs" if="do.archive" name="-do-jar-delete-manifest">
- <delete>
- <fileset file="${tmp.manifest.file}"/>
- </delete>
- </target>
- <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen,-do-jar-jar,-do-jar-delete-manifest" name="-do-jar-without-libraries"/>
- <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen,-do-jar-copylibs,-do-jar-delete-manifest" name="-do-jar-with-libraries"/>
- <target name="-post-jar">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,compile,-pre-jar,-do-jar-without-libraries,-do-jar-with-libraries,-post-jar" name="-do-jar"/>
- <target depends="init,compile,-pre-jar,-do-jar,-post-jar" description="Build JAR." name="jar"/>
- <!--
- =================
- EXECUTION SECTION
- =================
- -->
- <target depends="init,compile" description="Run a main class." name="run">
- <j2seproject1:java>
- <customize>
- <arg line="${application.args}"/>
- </customize>
- </j2seproject1:java>
- </target>
- <target name="-do-not-recompile">
- <property name="javac.includes.binary" value=""/>
- </target>
- <target depends="init,compile-single" name="run-single">
- <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
- <j2seproject1:java classname="${run.class}"/>
- </target>
- <target depends="init,compile-test-single" name="run-test-with-main">
- <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
- <j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/>
- </target>
- <!--
- =================
- DEBUGGING SECTION
- =================
- -->
- <target depends="init" if="netbeans.home" name="-debug-start-debugger">
- <j2seproject1:nbjpdastart name="${debug.class}"/>
- </target>
- <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test">
- <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/>
- </target>
- <target depends="init,compile" name="-debug-start-debuggee">
- <j2seproject3:debug>
- <customize>
- <arg line="${application.args}"/>
- </customize>
- </j2seproject3:debug>
- </target>
- <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
- <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
- <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
- </target>
- <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
- <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
- <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
- <j2seproject3:debug classname="${debug.class}"/>
- </target>
- <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
- <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test">
- <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
- <j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/>
- </target>
- <target depends="init,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/>
- <target depends="init" name="-pre-debug-fix">
- <fail unless="fix.includes">Must set fix.includes</fail>
- <property name="javac.includes" value="${fix.includes}.java"/>
- </target>
- <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
- <j2seproject1:nbjpdareload/>
- </target>
- <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
- <!--
- =================
- PROFILING SECTION
- =================
- -->
- <!--
- pre NB7.2 profiler integration
- -->
- <target depends="profile-init,compile" description="Profile a project in the IDE." if="profiler.info.jvmargs.agent" name="-profile-pre72">
- <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
- <nbprofiledirect>
- <classpath>
- <path path="${run.classpath}"/>
- </classpath>
- </nbprofiledirect>
- <profile/>
- </target>
- <target depends="profile-init,compile-single" description="Profile a selected class in the IDE." if="profiler.info.jvmargs.agent" name="-profile-single-pre72">
- <fail unless="profile.class">Must select one file in the IDE or set profile.class</fail>
- <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
- <nbprofiledirect>
- <classpath>
- <path path="${run.classpath}"/>
- </classpath>
- </nbprofiledirect>
- <profile classname="${profile.class}"/>
- </target>
- <target depends="profile-init,compile-single" if="profiler.info.jvmargs.agent" name="-profile-applet-pre72">
- <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
- <nbprofiledirect>
- <classpath>
- <path path="${run.classpath}"/>
- </classpath>
- </nbprofiledirect>
- <profile classname="sun.applet.AppletViewer">
- <customize>
- <arg value="${applet.url}"/>
- </customize>
- </profile>
- </target>
- <target depends="profile-init,compile-test-single" if="profiler.info.jvmargs.agent" name="-profile-test-single-pre72">
- <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
- <nbprofiledirect>
- <classpath>
- <path path="${run.test.classpath}"/>
- </classpath>
- </nbprofiledirect>
- <junit dir="${profiler.info.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" jvm="${profiler.info.jvm}" showoutput="true">
- <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
- <jvmarg value="${profiler.info.jvmargs.agent}"/>
- <jvmarg line="${profiler.info.jvmargs}"/>
- <test name="${profile.class}"/>
- <classpath>
- <path path="${run.test.classpath}"/>
- </classpath>
- <syspropertyset>
- <propertyref prefix="test-sys-prop."/>
- <mapper from="test-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <formatter type="brief" usefile="false"/>
- <formatter type="xml"/>
- </junit>
- </target>
- <!--
- end of pre NB72 profiling section
- -->
- <target if="netbeans.home" name="-profile-check">
- <condition property="profiler.configured">
- <or>
- <contains casesensitive="true" string="${run.jvmargs.ide}" substring="-agentpath:"/>
- <contains casesensitive="true" string="${run.jvmargs.ide}" substring="-javaagent:"/>
- </or>
- </condition>
- </target>
- <target depends="-profile-check,-profile-pre72" description="Profile a project in the IDE." if="profiler.configured" name="profile" unless="profiler.info.jvmargs.agent">
- <startprofiler/>
- <antcall target="run"/>
- </target>
- <target depends="-profile-check,-profile-single-pre72" description="Profile a selected class in the IDE." if="profiler.configured" name="profile-single" unless="profiler.info.jvmargs.agent">
- <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
- <startprofiler/>
- <antcall target="run-single"/>
- </target>
- <target depends="-profile-test-single-pre72" description="Profile a selected test in the IDE." name="profile-test-single"/>
- <target depends="-profile-check" description="Profile a selected test in the IDE." if="profiler.configured" name="profile-test" unless="profiler.info.jvmargs">
- <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
- <startprofiler/>
- <antcall target="test-single"/>
- </target>
- <target depends="-profile-check" description="Profile a selected class in the IDE." if="profiler.configured" name="profile-test-with-main">
- <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
- <startprofiler/>
- <antcal target="run-test-with-main"/>
- </target>
- <target depends="-profile-check,-profile-applet-pre72" if="profiler.configured" name="profile-applet" unless="profiler.info.jvmargs.agent">
- <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
- <startprofiler/>
- <antcall target="run-applet"/>
- </target>
- <!--
- ===============
- JAVADOC SECTION
- ===============
- -->
- <target depends="init" if="have.sources" name="-javadoc-build">
- <mkdir dir="${dist.javadoc.dir}"/>
- <condition else="" property="javadoc.endorsed.classpath.cmd.line.arg" value="-J${endorsed.classpath.cmd.line.arg}">
- <and>
- <isset property="endorsed.classpath.cmd.line.arg"/>
- <not>
- <equals arg1="${endorsed.classpath.cmd.line.arg}" arg2=""/>
- </not>
- </and>
- </condition>
- <condition else="" property="bug5101868workaround" value="*.java">
- <matches pattern="1\.[56](\..*)?" string="${java.version}"/>
- </condition>
- <javadoc additionalparam="-J-Dfile.encoding=${file.encoding} ${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
- <classpath>
- <path path="${javac.classpath}"/>
- </classpath>
- <fileset dir="${src.dir}" excludes="${bug5101868workaround},${excludes}" includes="${includes}">
- <filename name="**/*.java"/>
- </fileset>
- <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
- <include name="**/*.java"/>
- <exclude name="*.java"/>
- </fileset>
- <arg line="${javadoc.endorsed.classpath.cmd.line.arg}"/>
- </javadoc>
- <copy todir="${dist.javadoc.dir}">
- <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
- <filename name="**/doc-files/**"/>
- </fileset>
- <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
- <include name="**/doc-files/**"/>
- </fileset>
- </copy>
- </target>
- <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
- <nbbrowse file="${dist.javadoc.dir}/index.html"/>
- </target>
- <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
- <!--
- =========================
- TEST COMPILATION SECTION
- =========================
- -->
- <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
- <mkdir dir="${build.test.classes.dir}"/>
- </target>
- <target name="-pre-compile-test">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target if="do.depend.true" name="-compile-test-depend">
- <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
- </target>
- <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
- <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" processorpath="${javac.test.processorpath}" srcdir="${test.src.dir}"/>
- <copy todir="${build.test.classes.dir}">
- <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
- </copy>
- </target>
- <target name="-post-compile-test">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
- <target name="-pre-compile-test-single">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
- <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
- <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
- <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" processorpath="${javac.test.processorpath}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
- <copy todir="${build.test.classes.dir}">
- <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
- </copy>
- </target>
- <target name="-post-compile-test-single">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
- <!--
- =======================
- TEST EXECUTION SECTION
- =======================
- -->
- <target depends="init" if="have.tests" name="-pre-test-run">
- <mkdir dir="${build.test.results.dir}"/>
- </target>
- <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
- <j2seproject3:test includes="${includes}" testincludes="**/*Test.java"/>
- </target>
- <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
- <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
- </target>
- <target depends="init" if="have.tests" name="test-report"/>
- <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
- <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
- <target depends="init" if="have.tests" name="-pre-test-run-single">
- <mkdir dir="${build.test.results.dir}"/>
- </target>
- <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
- <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
- <j2seproject3:test excludes="" includes="${test.includes}" testincludes="${test.includes}"/>
- </target>
- <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
- <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
- </target>
- <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
- <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single-method">
- <fail unless="test.class">Must select some files in the IDE or set test.class</fail>
- <fail unless="test.method">Must select some method in the IDE or set test.method</fail>
- <j2seproject3:test excludes="" includes="${javac.includes}" testincludes="${test.class}" testmethods="${test.method}"/>
- </target>
- <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single-method" if="have.tests" name="-post-test-run-single-method">
- <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
- </target>
- <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single-method,-post-test-run-single-method" description="Run single unit test." name="test-single-method"/>
- <!--
- =======================
- TEST DEBUGGING SECTION
- =======================
- -->
- <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-debug-start-debuggee-test">
- <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
- <j2seproject3:test-debug excludes="" includes="${javac.includes}" testClass="${test.class}" testincludes="${javac.includes}"/>
- </target>
- <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-debug-start-debuggee-test-method">
- <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
- <fail unless="test.method">Must select some method in the IDE or set test.method</fail>
- <j2seproject3:test-debug excludes="" includes="${javac.includes}" testClass="${test.class}" testMethod="${test.method}" testincludes="${test.class}" testmethods="${test.method}"/>
- </target>
- <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
- <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
- </target>
- <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
- <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test-method" name="debug-test-method"/>
- <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
- <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
- </target>
- <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
- <!--
- =========================
- APPLET EXECUTION SECTION
- =========================
- -->
- <target depends="init,compile-single" name="run-applet">
- <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
- <j2seproject1:java classname="sun.applet.AppletViewer">
- <customize>
- <arg value="${applet.url}"/>
- </customize>
- </j2seproject1:java>
- </target>
- <!--
- =========================
- APPLET DEBUGGING SECTION
- =========================
- -->
- <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
- <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
- <j2seproject3:debug classname="sun.applet.AppletViewer">
- <customize>
- <arg value="${applet.url}"/>
- </customize>
- </j2seproject3:debug>
- </target>
- <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
- <!--
- ===============
- CLEANUP SECTION
- ===============
- -->
- <target name="-deps-clean-init" unless="built-clean.properties">
- <property location="${build.dir}/built-clean.properties" name="built-clean.properties"/>
- <delete file="${built-clean.properties}" quiet="true"/>
- </target>
- <target if="already.built.clean.${basedir}" name="-warn-already-built-clean">
- <echo level="warn" message="Cycle detected: ECTester was already built"/>
- </target>
- <target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps">
- <mkdir dir="${build.dir}"/>
- <touch file="${built-clean.properties}" verbose="false"/>
- <property file="${built-clean.properties}" prefix="already.built.clean."/>
- <antcall target="-warn-already-built-clean"/>
- <propertyfile file="${built-clean.properties}">
- <entry key="${basedir}" value=""/>
- </propertyfile>
- </target>
- <target depends="init" name="-do-clean">
- <delete dir="${build.dir}"/>
- <delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/>
- </target>
- <target name="-post-clean">
- <!-- Empty placeholder for easier customization. -->
- <!-- You can override this target in the ../build.xml file. -->
- </target>
- <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
- <target name="-check-call-dep">
- <property file="${call.built.properties}" prefix="already.built."/>
- <condition property="should.call.dep">
- <and>
- <not>
- <isset property="already.built.${call.subproject}"/>
- </not>
- <available file="${call.script}"/>
- </and>
- </condition>
- </target>
- <target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep">
- <ant antfile="${call.script}" inheritall="false" target="${call.target}">
- <propertyset>
- <propertyref prefix="transfer."/>
- <mapper from="transfer.*" to="*" type="glob"/>
- </propertyset>
- </ant>
- </target>
-</project>
diff --git a/nbproject/standalone/manifest.mf b/nbproject/standalone/manifest.mf
deleted file mode 100644
index 53c6200..0000000
--- a/nbproject/standalone/manifest.mf
+++ /dev/null
@@ -1,4 +0,0 @@
-Manifest-Version: 1.0
-Class-Path: lib/bcprov-jdk18on-172.jar lib/wolfcrypt-jni.jar lib/jcardsim-3.0.5.11.jar lib/commons-cli-1.5.0.jar lib/snakeyaml-1.19.jar
-Main-Class: cz.crcs.ectester.standalone.ECTesterStandalone
-
diff --git a/nbproject/standalone/project.properties b/nbproject/standalone/project.properties
deleted file mode 100644
index 12658dc..0000000
--- a/nbproject/standalone/project.properties
+++ /dev/null
@@ -1,81 +0,0 @@
-annotation.processing.enabled=true
-annotation.processing.enabled.in.editor=false
-annotation.processing.processors.list=
-annotation.processing.run.all.processors=true
-annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
-application.title=ECTesterStandalone
-application.vendor=xsvenda
-build.classes.dir=${build.dir}/classes
-build.classes.excludes=**/*.java,**/*.form,**/*.c,**/*.cpp,**/*.hpp,**/*.h,**/*.a,**/*.o,**/Makefile,**/Makefile.bat
-# This directory is removed when the project is cleaned:
-build.dir=build
-build.generated.dir=${build.dir}/generated
-build.generated.sources.dir=${build.dir}/generated-sources
-# Only compile against the classpath explicitly listed here:
-build.sysclasspath=ignore
-build.test.classes.dir=${build.dir}/test/classes
-build.test.results.dir=${build.dir}/test/results
-# Uncomment to specify the preferred debugger connection transport:
-#debug.transport=dt_socket
-debug.classpath=\
- ${run.classpath}
-debug.test.classpath=\
- ${run.test.classpath}
-# Files in build.classes.dir which should be excluded from distribution jar
-dist.archive.excludes=**/*.java,**/*.form,**/*.c,**/*.cpp,**/*.hpp,**/*.h,**/*.a,**/*.o,**/Makefile,**/Makefile.bat
-# This directory is removed when the project is cleaned:
-dist.dir=dist
-dist.jar=${dist.dir}/ECTesterStandalone.jar
-dist.javadoc.dir=${dist.dir}/javadoc
-libs.CopyLibs.classpath=nbproject/copylibstask.jar
-endorsed.classpath=
-excludes=
-includes=**/common/**,**/standalone/**,**/data/**,**/applet/*
-jar.compress=true
-javac.classpath=\
- lib/bcprov-jdk18on-172.jar:\
- lib/wolfcrypt-jni.jar:\
- lib/jcardsim-3.0.5.11.jar:\
- lib/commons-cli-1.5.0.jar:\
- lib/snakeyaml-1.19.jar
-# Space-separated list of extra javac options
-javac.compilerargs=-Xlint:all --add-modules jdk.crypto.ec --add-exports jdk.crypto.ec/sun.security.ec=ALL-UNNAMED
-javac.deprecation=false
-javac.processorpath=\
- ${javac.classpath}
-javac.source=11
-javac.target=11
-javac.test.classpath=\
- ${javac.classpath}:\
- ${build.classes.dir}
-javac.test.processorpath=\
- ${javac.test.classpath}
-javadoc.additionalparam=
-javadoc.author=false
-javadoc.encoding=${source.encoding}
-javadoc.noindex=false
-javadoc.nonavbar=false
-javadoc.notree=false
-javadoc.private=false
-javadoc.splitindex=true
-javadoc.use=true
-javadoc.version=false
-javadoc.windowtitle=
-main.class=cz.crcs.ectester.standalone.ECTesterStandalone
-manifest.file=nbproject/standalone/manifest.mf
-meta.inf.dir=${src.dir}/META-INF
-mkdist.disabled=false
-platform.active=default_platform
-run.classpath=\
- ${javac.classpath}:\
- ${build.classes.dir}
-# Space-separated list of JVM arguments used when running the project.
-# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value.
-# To set system properties for unit tests define test-sys-prop.name=value:
-run.jvmargs=
-run.test.classpath=\
- ${javac.test.classpath}:\
- ${build.test.classes.dir}
-source.encoding=UTF-8
-src.dir=src
-test.src.dir=test
diff --git a/nbproject/standalone/project.xml b/nbproject/standalone/project.xml
deleted file mode 100644
index 2f2fb3f..0000000
--- a/nbproject/standalone/project.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://www.netbeans.org/ns/project/1">
- <type>org.netbeans.modules.java.j2seproject</type>
- <configuration>
- <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
- <name>ECTesterStandalone</name>
- <source-roots>
- <root id="src.dir"/>
- </source-roots>
- <test-roots>
- <root id="test.src.dir"/>
- </test-roots>
- </data>
- </configuration>
-</project>
diff --git a/reader/build.gradle.kts b/reader/build.gradle.kts
new file mode 100644
index 0000000..0e8de4e
--- /dev/null
+++ b/reader/build.gradle.kts
@@ -0,0 +1,66 @@
+plugins {
+ application
+ jacoco
+ id("com.adarshr.test-logger") version "4.0.0"
+}
+
+repositories {
+ mavenCentral()
+
+ // Repository with JCardSim, Globalplatform, etc, ...
+ maven("https://javacard.pro/maven")
+ maven("https://deadcode.me/mvn")
+}
+
+dependencies {
+ implementation(project(":common"))
+ implementation(project(":applet"))
+
+ testImplementation(platform("org.junit:junit-bom:5.10.2"))
+ testImplementation("org.junit.jupiter:junit-jupiter")
+ testImplementation("org.junit-pioneer:junit-pioneer:2.2.0")
+ testRuntimeOnly("org.junit.platform:junit-platform-launcher")
+}
+
+java {
+ sourceCompatibility = JavaVersion.VERSION_11
+}
+
+application {
+ applicationName = "ECTesterReader"
+ mainClass = "cz.crcs.ectester.reader.ECTesterReader"
+ version = "0.3.3"
+}
+
+tasks.named<Test>("test") {
+ useJUnitPlatform()
+ // Report is always generated after tests run
+ finalizedBy(tasks.jacocoTestReport)
+}
+
+tasks.jacocoTestReport {
+ reports {
+ xml.required = true
+ }
+}
+
+testlogger {
+ theme = com.adarshr.gradle.testlogger.theme.ThemeType.MOCHA
+ showStandardStreams = true
+}
+
+tasks.register<Jar>("uberJar") {
+ archiveFileName = "ECTesterReader.jar"
+ duplicatesStrategy = DuplicatesStrategy.WARN
+
+ from(sourceSets.main.get().output)
+
+ manifest {
+ attributes["Main-Class"] = application.mainClass
+ }
+
+ dependsOn(configurations.runtimeClasspath)
+ from({
+ configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it).matching { exclude("META-INF/*.DSA", "META-INF/*.SF", "META-INF/*.RSA", "META-INF/versions/*/module-info.class", "apdu4j/*") } }
+ })
+} \ No newline at end of file
diff --git a/src/cz/crcs/ectester/reader/CardMngr.java b/reader/src/main/java/cz/crcs/ectester/reader/CardMngr.java
index 0a01d9e..d8fa296 100644
--- a/src/cz/crcs/ectester/reader/CardMngr.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/CardMngr.java
@@ -2,6 +2,7 @@ package cz.crcs.ectester.reader;
import com.licel.jcardsim.io.JavaxSmartCardInterface;
import cz.crcs.ectester.common.util.ByteUtil;
+import cz.crcs.ectester.common.util.CardUtil;
import javacard.framework.AID;
import javacard.framework.Applet;
import javacard.framework.ISO7816;
@@ -206,10 +207,10 @@ public class CardMngr {
// Try CPLC via GP
ResponseAPDU resp = send(FETCH_GP_CPLC_APDU);
// If GP CLA fails, try with ISO
- if (resp.getSW() == (ISO7816.SW_CLA_NOT_SUPPORTED & 0xffff)) {
+ if (resp.getSW() == (CardUtil.ISO7816.SW_CLA_NOT_SUPPORTED & 0xffff)) {
resp = send(FETCH_ISO_CPLC_APDU);
}
- if (resp.getSW() == (ISO7816.SW_NO_ERROR & 0xffff)) {
+ if (resp.getSW() == (CardUtil.ISO7816.SW_NO_ERROR & 0xffff)) {
return resp.getData();
}
return null;
@@ -369,7 +370,7 @@ public class CardMngr {
} else {
resp = channel.transmit(cmd);
}
- if ((short) resp.getSW() != ISO7816.SW_NO_ERROR) {
+ if ((short) resp.getSW() != CardUtil.ISO7816.SW_NO_ERROR) {
throw new CardException("Chunking failed!");
}
}
diff --git a/src/cz/crcs/ectester/reader/ECTesterReader.java b/reader/src/main/java/cz/crcs/ectester/reader/ECTesterReader.java
index 02c6558..9ba9890 100644
--- a/src/cz/crcs/ectester/reader/ECTesterReader.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/ECTesterReader.java
@@ -24,13 +24,12 @@
package cz.crcs.ectester.reader;
import cz.crcs.ectester.applet.ECTesterApplet;
-import cz.crcs.ectester.applet.EC_Consts;
import cz.crcs.ectester.common.cli.CLITools;
import cz.crcs.ectester.common.cli.Colors;
import cz.crcs.ectester.common.ec.EC_Curve;
+import cz.crcs.ectester.common.ec.EC_Consts;
import cz.crcs.ectester.common.output.OutputLogger;
import cz.crcs.ectester.common.output.TestWriter;
-import cz.crcs.ectester.common.util.Util;
import cz.crcs.ectester.common.util.*;
import cz.crcs.ectester.data.EC_Store;
import cz.crcs.ectester.reader.command.Command;
@@ -38,8 +37,6 @@ import cz.crcs.ectester.reader.output.FileTestWriter;
import cz.crcs.ectester.reader.output.ResponseWriter;
import cz.crcs.ectester.reader.response.Response;
import cz.crcs.ectester.reader.test.*;
-import javacard.framework.ISO7816;
-import javacard.security.KeyPair;
import org.apache.commons.cli.*;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
@@ -55,9 +52,6 @@ import java.security.spec.ECParameterSpec;
import java.util.*;
import java.util.jar.Manifest;
-import static cz.crcs.ectester.applet.EC_Consts.KeyAgreement_ALG_EC_SVDP_DH;
-import static cz.crcs.ectester.applet.EC_Consts.Signature_ALG_ECDSA_SHA;
-
/**
* Reader part of ECTester, a tool for testing Elliptic curve support on javacards.
*
@@ -82,8 +76,9 @@ public class ECTesterReader {
private static final byte[] SELECT_PREFIX = {(byte) 0x00, (byte) 0xa4, (byte) 0x04, (byte) 0x00, (byte) 0x0c};
private static final byte[] AID_PREFIX = {(byte) 0x45, (byte) 0x43, (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x65, (byte) 0x72};
private static final byte[] AID_CURRENT_VERSION = {(byte) 0x30, (byte) 0x33, (byte) 0x33}; // VERSION v0.3.3
- private static final byte[] AID_SUFFIX_221 = {(byte) 0x62};
- private static final byte[] AID_SUFFIX_222 = {(byte) 0x78};
+ private static final byte[] AID_SUFFIX_221 = {(byte) 0x20, (byte) 0x32, (byte) 0x32, (byte) 0x31};
+ private static final byte[] AID_SUFFIX_222 = {(byte) 0x20, (byte) 0x32, (byte) 0x32, (byte) 0x32};
+ private static final byte[] AID_SUFFIX_305 = {(byte) 0x20, (byte) 0x33, (byte) 0x30, (byte) 0x35};
private static final byte[] INSTALL_DATA = new byte[10];
private static final int TRY_VERSIONS = 10;
@@ -153,13 +148,23 @@ public class ECTesterReader {
byte[] versionByte = AID_CURRENT_VERSION.clone();
boolean selected = false;
for (int i = 0; i < TRY_VERSIONS; ++i) {
- byte[] select222 = ByteUtil.concatenate(SELECT_PREFIX, AID_PREFIX, versionByte, AID_SUFFIX_222);
- ResponseAPDU selectResp = cardManager.send(select222);
- if ((short) selectResp.getSW() != ISO7816.SW_NO_ERROR) {
- byte[] select221 = ByteUtil.concatenate(SELECT_PREFIX, AID_PREFIX, versionByte, AID_SUFFIX_221);
- selectResp = cardManager.send(select221);
- if ((short) selectResp.getSW() == ISO7816.SW_NO_ERROR) {
- cardManager.setChunking(true);
+ // Try 301 CAP version
+ byte[] select301 = ByteUtil.concatenate(SELECT_PREFIX, AID_PREFIX, versionByte, AID_SUFFIX_305);
+ ResponseAPDU selectResp = cardManager.send(select301);
+ if ((short) selectResp.getSW() != CardUtil.ISO7816.SW_NO_ERROR) {
+ // Try 222 CAP version
+ byte[] select222 = ByteUtil.concatenate(SELECT_PREFIX, AID_PREFIX, versionByte, AID_SUFFIX_222);
+ selectResp = cardManager.send(select222);
+ if ((short) selectResp.getSW() != CardUtil.ISO7816.SW_NO_ERROR) {
+ // Try 221 CAP version
+ byte[] select221 = ByteUtil.concatenate(SELECT_PREFIX, AID_PREFIX, versionByte, AID_SUFFIX_221);
+ selectResp = cardManager.send(select221);
+ if ((short) selectResp.getSW() == CardUtil.ISO7816.SW_NO_ERROR) {
+ cardManager.setChunking(true);
+ selected = true;
+ break;
+ }
+ } else {
selected = true;
break;
}
@@ -378,7 +383,7 @@ public class ECTesterReader {
System.out.println(String.format("Card ATR:\t\t\t\t%s", ByteUtil.bytesToHex(cardManager.getATR().getBytes(), false)));
System.out.println(String.format("Card protocol:\t\t\t\t%s", cardManager.getProtocol()));
System.out.println(String.format("ECTester applet version:\t\t%s", info.getVersion()));
- System.out.println(String.format("ECTester applet APDU support:\t\t%s", (info.getBase() == ECTesterApplet.BASE_221) ? "basic" : "extended length"));
+ System.out.println(String.format("ECTester applet APDU support:\t\t%s", (info.getBase() == CardConsts.BASE_221) ? "basic" : "extended length"));
System.out.println(String.format("JavaCard API version:\t\t\t%.1f", info.getJavaCardVersion()));
System.out.println(String.format("JavaCard supports system cleanup:\t%s", info.getCleanupSupport()));
System.out.println(String.format("Array sizes (apduBuf,ram,ram2,apduArr):\t%d %d %d %d", info.getApduBufferLength(), info.getRamArrayLength(), info.getRamArray2Length(), info.getApduArrayLength()));
@@ -391,15 +396,15 @@ public class ECTesterReader {
* @throws IOException if an IO error occurs when writing to key file.
*/
private void export() throws CardException, IOException {
- byte keyClass = cfg.primeField ? KeyPair.ALG_EC_FP : KeyPair.ALG_EC_F2M;
+ byte keyClass = cfg.primeField ? EC_Consts.ALG_EC_FP : EC_Consts.ALG_EC_F2M;
List<Response> sent = new LinkedList<>();
- sent.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_LOCAL, cfg.keyBuilder, cfg.bits, keyClass).send());
- //sent.add(new Command.Clear(cardManager, ECTesterApplet.KEYPAIR_LOCAL).send());
- sent.add(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL).send());
+ sent.add(new Command.Allocate(cardManager, CardConsts.KEYPAIR_LOCAL, cfg.keyBuilder, cfg.bits, keyClass).send());
+ //sent.add(new Command.Clear(cardManager, CardConsts.KEYPAIR_LOCAL).send());
+ sent.add(new Command.Generate(cardManager, CardConsts.KEYPAIR_LOCAL).send());
// Also support exporting set parameters, to verify they are set correctly.
- Command curve = Command.prepareCurve(cardManager, cfg, ECTesterApplet.KEYPAIR_LOCAL, cfg.bits, keyClass);
+ Command curve = Command.prepareCurve(cardManager, cfg, CardConsts.KEYPAIR_LOCAL, cfg.bits, keyClass);
if (curve != null) {
sent.add(curve.send());
}
@@ -408,10 +413,10 @@ public class ECTesterReader {
// since its not necessary for ECDH, only ECDHC which not many cards implement
// TODO: check if its assumend to be == 1?
short domain = cfg.primeField ? EC_Consts.PARAMETERS_DOMAIN_FP : EC_Consts.PARAMETERS_DOMAIN_F2M;
- Response.Export export = new Command.Export(cardManager, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.KEY_PUBLIC, domain).send();
+ Response.Export export = new Command.Export(cardManager, CardConsts.KEYPAIR_LOCAL, EC_Consts.KEY_PUBLIC, domain).send();
if (!export.successful()) {
domain = (short) (domain ^ EC_Consts.PARAMETER_K);
- export = new Command.Export(cardManager, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.KEY_PUBLIC, domain).send();
+ export = new Command.Export(cardManager, CardConsts.KEYPAIR_LOCAL, EC_Consts.KEY_PUBLIC, domain).send();
}
sent.add(export);
@@ -441,10 +446,10 @@ public class ECTesterReader {
* @throws IOException if an IO error occurs when writing to key file.
*/
private void generate() throws CardException, IOException {
- byte keyClass = cfg.primeField ? KeyPair.ALG_EC_FP : KeyPair.ALG_EC_F2M;
- Command curve = Command.prepareCurve(cardManager, cfg, ECTesterApplet.KEYPAIR_LOCAL, cfg.bits, keyClass);
+ byte keyClass = cfg.primeField ? EC_Consts.ALG_EC_FP : EC_Consts.ALG_EC_F2M;
+ Command curve = Command.prepareCurve(cardManager, cfg, CardConsts.KEYPAIR_LOCAL, cfg.bits, keyClass);
- Response allocate = new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_LOCAL, cfg.keyBuilder, cfg.bits, keyClass).send();
+ Response allocate = new Command.Allocate(cardManager, CardConsts.KEYPAIR_LOCAL, cfg.keyBuilder, cfg.bits, keyClass).send();
respWriter.outputResponse(allocate);
OutputStreamWriter keysFile = FileUtil.openFiles(cfg.outputs);
@@ -458,7 +463,7 @@ public class ECTesterReader {
respWriter.outputResponse(fresh);
}
- Command.Generate generate = new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL);
+ Command.Generate generate = new Command.Generate(cardManager, CardConsts.KEYPAIR_LOCAL);
long time = 0;
if (cfg.time) {
time = -Command.dryRunTime(cardManager, generate, 2, respWriter);
@@ -467,7 +472,7 @@ public class ECTesterReader {
time += response.getDuration();
respWriter.outputResponse(response);
- Response.Export export = new Command.Export(cardManager, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.KEY_BOTH, EC_Consts.PARAMETERS_KEYPAIR).send();
+ Response.Export export = new Command.Export(cardManager, CardConsts.KEYPAIR_LOCAL, EC_Consts.KEY_BOTH, EC_Consts.PARAMETERS_KEYPAIR).send();
respWriter.outputResponse(export);
if (!response.successful() || !export.successful()) {
@@ -480,8 +485,8 @@ public class ECTesterReader {
}
}
- String pub = ByteUtil.bytesToHex(export.getParameter(ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.PARAMETER_W), false);
- String priv = ByteUtil.bytesToHex(export.getParameter(ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.PARAMETER_S), false);
+ String pub = ByteUtil.bytesToHex(export.getParameter(CardConsts.KEYPAIR_LOCAL, EC_Consts.PARAMETER_W), false);
+ String priv = ByteUtil.bytesToHex(export.getParameter(CardConsts.KEYPAIR_LOCAL, EC_Consts.PARAMETER_S), false);
String line = String.format("%d;%d;%d;%s;%s\n", generated, Util.convertTime(time, cfg.timeUnit), Util.convertTime(export.getDuration(), cfg.timeUnit), pub, priv);
keysFile.write(line);
keysFile.flush();
@@ -573,11 +578,11 @@ public class ECTesterReader {
* @throws IOException if an IO error occurs when writing to key file.
*/
private void ecdh() throws IOException, CardException {
- byte keyClass = cfg.primeField ? KeyPair.ALG_EC_FP : KeyPair.ALG_EC_F2M;
- Command curve = Command.prepareCurve(cardManager, cfg, ECTesterApplet.KEYPAIR_BOTH, cfg.bits, keyClass);
+ byte keyClass = cfg.primeField ? EC_Consts.ALG_EC_FP : EC_Consts.ALG_EC_F2M;
+ Command curve = Command.prepareCurve(cardManager, cfg, CardConsts.KEYPAIR_BOTH, cfg.bits, keyClass);
List<Response> prepare = new LinkedList<>();
prepare.add(new Command.AllocateKeyAgreement(cardManager, cfg.ECKAType).send()); // Prepare KeyAgreement or required type
- prepare.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, cfg.keyBuilder, cfg.bits, keyClass).send());
+ prepare.add(new Command.Allocate(cardManager, CardConsts.KEYPAIR_BOTH, cfg.keyBuilder, cfg.bits, keyClass).send());
if (curve != null)
prepare.add(curve.send());
@@ -591,23 +596,23 @@ public class ECTesterReader {
out.write(String.format("index;time[%s];pubW;privS;secret[%s]\n", cfg.timeUnit, CardUtil.getKexHashName(cfg.ECKAType)));
}
- Response gen = new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_BOTH).send();
+ Response gen = new Command.Generate(cardManager, CardConsts.KEYPAIR_BOTH).send();
respWriter.outputResponse(gen);
if (cfg.anyPublicKey || cfg.anyKey) {
- Response prep = Command.prepareKey(cardManager, EC_Store.getInstance(), cfg, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.PARAMETER_W).send();
+ Response prep = Command.prepareKey(cardManager, EC_Store.getInstance(), cfg, CardConsts.KEYPAIR_REMOTE, EC_Consts.PARAMETER_W).send();
respWriter.outputResponse(prep);
}
if (cfg.anyPrivateKey || cfg.anyKey) {
- Response prep = Command.prepareKey(cardManager, EC_Store.getInstance(), cfg, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.PARAMETER_S).send();
+ Response prep = Command.prepareKey(cardManager, EC_Store.getInstance(), cfg, CardConsts.KEYPAIR_LOCAL, EC_Consts.PARAMETER_S).send();
respWriter.outputResponse(prep);
}
- byte kp = ECTesterApplet.KEYPAIR_BOTH;
+ byte kp = CardConsts.KEYPAIR_BOTH;
if (cfg.fixedPrivate || cfg.anyPrivateKey) {
- kp ^= ECTesterApplet.KEYPAIR_LOCAL;
+ kp ^= CardConsts.KEYPAIR_LOCAL;
}
if (cfg.fixedPublic || cfg.anyPublicKey) {
- kp ^= ECTesterApplet.KEYPAIR_REMOTE;
+ kp ^= CardConsts.KEYPAIR_REMOTE;
}
if (cfg.fixedKey || cfg.anyKey) {
kp = 0;
@@ -626,14 +631,14 @@ public class ECTesterReader {
respWriter.outputResponse(regen);
}
- Response.Export exportRemote = new Command.Export(cardManager, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.KEY_PUBLIC, EC_Consts.PARAMETER_W).send();
+ Response.Export exportRemote = new Command.Export(cardManager, CardConsts.KEYPAIR_REMOTE, EC_Consts.KEY_PUBLIC, EC_Consts.PARAMETER_W).send();
respWriter.outputResponse(exportRemote);
- Response.Export exportLocal = new Command.Export(cardManager, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.KEY_PRIVATE, EC_Consts.PARAMETER_S).send();
+ Response.Export exportLocal = new Command.Export(cardManager, CardConsts.KEYPAIR_LOCAL, EC_Consts.KEY_PRIVATE, EC_Consts.PARAMETER_S).send();
respWriter.outputResponse(exportLocal);
- byte[] pubkey_bytes = exportRemote.getParameter(ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.PARAMETER_W);
- byte[] privkey_bytes = exportLocal.getParameter(ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.PARAMETER_S);
+ byte[] pubkey_bytes = exportRemote.getParameter(CardConsts.KEYPAIR_REMOTE, EC_Consts.PARAMETER_W);
+ byte[] privkey_bytes = exportLocal.getParameter(CardConsts.KEYPAIR_LOCAL, EC_Consts.PARAMETER_S);
- Command.ECDH perform = new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_TRUE, EC_Consts.TRANSFORMATION_NONE, cfg.ECKAType);
+ Command.ECDH perform = new Command.ECDH(cardManager, CardConsts.KEYPAIR_REMOTE, CardConsts.KEYPAIR_LOCAL, CardConsts.EXPORT_TRUE, EC_Consts.TRANSFORMATION_NONE, cfg.ECKAType);
long time = 0;
if (cfg.time) {
@@ -695,16 +700,16 @@ public class ECTesterReader {
Command generate;
if (cfg.anyKeypart) {
- generate = Command.prepareKey(cardManager, EC_Store.getInstance(), cfg, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.PARAMETERS_KEYPAIR);
+ generate = Command.prepareKey(cardManager, EC_Store.getInstance(), cfg, CardConsts.KEYPAIR_LOCAL, EC_Consts.PARAMETERS_KEYPAIR);
} else {
- generate = new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL);
+ generate = new Command.Generate(cardManager, CardConsts.KEYPAIR_LOCAL);
}
- byte keyClass = cfg.primeField ? KeyPair.ALG_EC_FP : KeyPair.ALG_EC_F2M;
+ byte keyClass = cfg.primeField ? EC_Consts.ALG_EC_FP : EC_Consts.ALG_EC_F2M;
List<Response> prepare = new LinkedList<>();
prepare.add(new Command.AllocateSignature(cardManager, cfg.ECDSAType).send());
- prepare.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_LOCAL, cfg.keyBuilder, cfg.bits, keyClass).send());
- Command curve = Command.prepareCurve(cardManager, cfg, ECTesterApplet.KEYPAIR_LOCAL, cfg.bits, keyClass);
+ prepare.add(new Command.Allocate(cardManager, CardConsts.KEYPAIR_LOCAL, cfg.keyBuilder, cfg.bits, keyClass).send());
+ Command curve = Command.prepareCurve(cardManager, cfg, CardConsts.KEYPAIR_LOCAL, cfg.bits, keyClass);
if (curve != null)
prepare.add(curve.send());
@@ -717,7 +722,7 @@ public class ECTesterReader {
out.write(String.format("index;signTime[%s];verifyTime[%s];data;pubW;privS;signature[%s];nonce;valid\n", cfg.timeUnit, cfg.timeUnit, CardUtil.getSigHashAlgo(cfg.ECDSAType)));
}
- Command.Export export = new Command.Export(cardManager, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.KEY_BOTH, EC_Consts.PARAMETERS_KEYPAIR);
+ Command.Export export = new Command.Export(cardManager, CardConsts.KEYPAIR_LOCAL, EC_Consts.KEY_BOTH, EC_Consts.PARAMETERS_KEYPAIR);
Response.Export exported = null;
if (cfg.fixedKey) {
respWriter.outputResponse(generate.send());
@@ -734,7 +739,7 @@ public class ECTesterReader {
respWriter.outputResponse(exported);
}
- Command.ECDSA_sign sign = new Command.ECDSA_sign(cardManager, ECTesterApplet.KEYPAIR_LOCAL, cfg.ECDSAType, ECTesterApplet.EXPORT_TRUE, data);
+ Command.ECDSA_sign sign = new Command.ECDSA_sign(cardManager, CardConsts.KEYPAIR_LOCAL, cfg.ECDSAType, CardConsts.EXPORT_TRUE, data);
long signTime = 0;
if (cfg.time) {
@@ -754,7 +759,7 @@ public class ECTesterReader {
}
}
byte[] signature = signResp.getSignature();
- Command.ECDSA_verify verify = new Command.ECDSA_verify(cardManager, ECTesterApplet.KEYPAIR_LOCAL, cfg.ECDSAType, data, signature);
+ Command.ECDSA_verify verify = new Command.ECDSA_verify(cardManager, CardConsts.KEYPAIR_LOCAL, cfg.ECDSAType, data, signature);
long verifyTime = 0;
if (cfg.time) {
verifyTime = -Command.dryRunTime(cardManager, verify, 2, respWriter);
@@ -774,15 +779,15 @@ public class ECTesterReader {
}
if (out != null) {
- String pub = ByteUtil.bytesToHex(exported.getParameter(ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.PARAMETER_W), false);
- String priv = ByteUtil.bytesToHex(exported.getParameter(ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.PARAMETER_S), false);
+ String pub = ByteUtil.bytesToHex(exported.getParameter(CardConsts.KEYPAIR_LOCAL, EC_Consts.PARAMETER_W), false);
+ String priv = ByteUtil.bytesToHex(exported.getParameter(CardConsts.KEYPAIR_LOCAL, EC_Consts.PARAMETER_S), false);
String dataString = (cfg.input != null) ? "" : ByteUtil.bytesToHex(data, false);
- BigInteger privkey = new BigInteger(1, exported.getParameter(ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.PARAMETER_S));
+ BigInteger privkey = new BigInteger(1, exported.getParameter(CardConsts.KEYPAIR_LOCAL, EC_Consts.PARAMETER_S));
EC_Curve actualCurve = Command.findCurve(cfg, cfg.bits, keyClass);
String k = "";
if (actualCurve != null) {
ECParameterSpec params = actualCurve.toSpec();
- BigInteger kValue = ECUtil.recoverSignatureNonce(signature, data, privkey, params, CardUtil.getSigHashName(cfg.ECDSAType));
+ BigInteger kValue = ECUtil.recoverSignatureNonce(signature, data, privkey, params, CardUtil.getSigHashName(cfg.ECDSAType), "ECDSA");
if (kValue != null) {
k = ByteUtil.bytesToHex(kValue.toByteArray(), false);
}
@@ -858,9 +863,9 @@ public class ECTesterReader {
public int testTo;
public int generateAmount;
public int ECKACount;
- public byte ECKAType = KeyAgreement_ALG_EC_SVDP_DH;
+ public byte ECKAType = EC_Consts.KeyAgreement_ALG_EC_SVDP_DH;
public int ECDSACount;
- public byte ECDSAType = Signature_ALG_ECDSA_SHA;
+ public byte ECDSAType = EC_Consts.Signature_ALG_ECDSA_SHA;
public Set<String> testOptions;
/**
@@ -895,7 +900,7 @@ public class ECTesterReader {
fixedKey = cli.hasOption("fixed");
fixedPrivate = cli.hasOption("fixed-private");
fixedPublic = cli.hasOption("fixed-public");
- keyBuilder = cli.hasOption("key-builder") ? ECTesterApplet.BUILD_KEYBUILDER : ECTesterApplet.BUILD_KEYPAIR;
+ keyBuilder = cli.hasOption("key-builder") ? CardConsts.BUILD_KEYBUILDER : CardConsts.BUILD_KEYPAIR;
if (cli.hasOption("log")) {
log = cli.getOptionValue("log", String.format("ECTESTER_log_%d.log", System.currentTimeMillis() / 1000));
diff --git a/src/cz/crcs/ectester/reader/ISO7816_status_words.txt b/reader/src/main/java/cz/crcs/ectester/reader/ISO7816_status_words.txt
index bf5af2b..bf5af2b 100644
--- a/src/cz/crcs/ectester/reader/ISO7816_status_words.txt
+++ b/reader/src/main/java/cz/crcs/ectester/reader/ISO7816_status_words.txt
diff --git a/src/cz/crcs/ectester/reader/command/Command.java b/reader/src/main/java/cz/crcs/ectester/reader/command/Command.java
index 61e3900..892a481 100644
--- a/src/cz/crcs/ectester/reader/command/Command.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/command/Command.java
@@ -1,18 +1,17 @@
package cz.crcs.ectester.reader.command;
-import cz.crcs.ectester.applet.ECTesterApplet;
-import cz.crcs.ectester.applet.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.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;
import cz.crcs.ectester.reader.output.ResponseWriter;
import cz.crcs.ectester.reader.response.Response;
-import javacard.security.KeyPair;
import javax.smartcardio.CardException;
import javax.smartcardio.CommandAPDU;
@@ -98,7 +97,7 @@ public abstract class Command implements Cloneable {
public static Command prepareCurve(CardMngr cardManager, ECTesterReader.Config cfg, byte keyPair, short keyLength, byte keyClass) throws IOException {
if (cfg.customCurve) {
// Set custom curve (one of the SECG curves embedded applet-side)
- short domainParams = keyClass == KeyPair.ALG_EC_FP ? EC_Consts.PARAMETERS_DOMAIN_FP : EC_Consts.PARAMETERS_DOMAIN_F2M;
+ short domainParams = keyClass == EC_Consts.ALG_EC_FP ? EC_Consts.PARAMETERS_DOMAIN_FP : EC_Consts.PARAMETERS_DOMAIN_F2M;
return new Command.Set(cardManager, keyPair, EC_Consts.getCurve(keyLength, keyClass), domainParams, null);
}
@@ -173,14 +172,14 @@ public abstract class Command implements Cloneable {
public static long dryRunTime(CardMngr cardManager, Command cmd, int num, ResponseWriter respWriter) throws CardException {
long time = 0;
- respWriter.outputResponse(new Command.SetDryRunMode(cardManager, ECTesterApplet.MODE_DRY_RUN).send());
+ respWriter.outputResponse(new Command.SetDryRunMode(cardManager, CardConsts.MODE_DRY_RUN).send());
for (int i = 0; i < num; ++i) {
Response dry = cmd.send();
respWriter.outputResponse(dry);
time += dry.getDuration();
}
time /= num;
- respWriter.outputResponse(new Command.SetDryRunMode(cardManager, ECTesterApplet.MODE_NORMAL).send());
+ respWriter.outputResponse(new Command.SetDryRunMode(cardManager, CardConsts.MODE_NORMAL).send());
return time;
}
@@ -200,7 +199,7 @@ public abstract class Command implements Cloneable {
super(cardManager);
this.kaType = kaType;
byte[] data = new byte[]{kaType};
- this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_ALLOCATE_KA, 0x00, 0x00, data);
+ this.cmd = new CommandAPDU(CardConsts.CLA_ECTESTERAPPLET, CardConsts.INS_ALLOCATE_KA, 0x00, 0x00, data);
}
@Override
@@ -233,7 +232,7 @@ public abstract class Command implements Cloneable {
super(cardManager);
this.sigType = sigType;
byte[] data = new byte[]{sigType};
- this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_ALLOCATE_SIG, 0x00, 0x00, data);
+ this.cmd = new CommandAPDU(CardConsts.CLA_ECTESTERAPPLET, CardConsts.INS_ALLOCATE_SIG, 0x00, 0x00, data);
}
@Override
@@ -277,11 +276,11 @@ public abstract class Command implements Cloneable {
byte[] data = new byte[]{0, 0, keyClass};
ByteUtil.setShort(data, 0, keyLength);
- this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_ALLOCATE, keyPair, build, data);
+ this.cmd = new CommandAPDU(CardConsts.CLA_ECTESTERAPPLET, CardConsts.INS_ALLOCATE, keyPair, build, data);
}
public Allocate(CardMngr cardManager, byte keyPair, short keyLength, byte keyClass) {
- this(cardManager, keyPair, (byte) (ECTesterApplet.BUILD_KEYPAIR | ECTesterApplet.BUILD_KEYBUILDER), keyLength, keyClass);
+ this(cardManager, keyPair, (byte) (CardConsts.BUILD_KEYPAIR | CardConsts.BUILD_KEYBUILDER), keyLength, keyClass);
}
@Override
@@ -294,12 +293,12 @@ public abstract class Command implements Cloneable {
@Override
public String getDescription() {
- String field = keyClass == KeyPair.ALG_EC_FP ? "ALG_EC_FP" : "ALG_EC_F2M";
+ String field = keyClass == EC_Consts.ALG_EC_FP ? "ALG_EC_FP" : "ALG_EC_F2M";
String key;
- if (keyPair == ECTesterApplet.KEYPAIR_BOTH) {
+ if (keyPair == CardConsts.KEYPAIR_BOTH) {
key = "both keypairs";
} else {
- key = ((keyPair == ECTesterApplet.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair";
+ key = ((keyPair == CardConsts.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair";
}
return String.format("Allocate %s %db %s", key, keyLength, field);
}
@@ -319,7 +318,7 @@ public abstract class Command implements Cloneable {
super(cardManager);
this.keyPair = keyPair;
- this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_CLEAR, keyPair, 0x00, GOD_DAMN_JAVA_BUG_6474858_AND_GOD_DAMN_JAVA_12_MODULE_SYSTEM);
+ this.cmd = new CommandAPDU(CardConsts.CLA_ECTESTERAPPLET, CardConsts.INS_CLEAR, keyPair, 0x00, GOD_DAMN_JAVA_BUG_6474858_AND_GOD_DAMN_JAVA_12_MODULE_SYSTEM);
}
@Override
@@ -333,10 +332,10 @@ public abstract class Command implements Cloneable {
@Override
public String getDescription() {
String key;
- if (keyPair == ECTesterApplet.KEYPAIR_BOTH) {
+ if (keyPair == CardConsts.KEYPAIR_BOTH) {
key = "both keypairs";
} else {
- key = ((keyPair == ECTesterApplet.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair";
+ key = ((keyPair == CardConsts.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair";
}
return String.format("Clear %s", key);
}
@@ -374,7 +373,7 @@ public abstract class Command implements Cloneable {
System.arraycopy(external, 0, data, 2, external.length);
}
- this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_SET, keyPair, curve, data);
+ this.cmd = new CommandAPDU(CardConsts.CLA_ECTESTERAPPLET, CardConsts.INS_SET, keyPair, curve, data);
}
@Override
@@ -391,10 +390,10 @@ public abstract class Command implements Cloneable {
String what = CardUtil.getParameterString(params);
String pair;
- if (keyPair == ECTesterApplet.KEYPAIR_BOTH) {
+ if (keyPair == CardConsts.KEYPAIR_BOTH) {
pair = "both keypairs";
} else {
- pair = ((keyPair == ECTesterApplet.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair";
+ pair = ((keyPair == CardConsts.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair";
}
return String.format("Set %s %s parameters on %s", name, what, pair);
}
@@ -427,7 +426,7 @@ public abstract class Command implements Cloneable {
ByteUtil.setShort(data, 0, params);
ByteUtil.setShort(data, 2, transformation);
- this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_TRANSFORM, keyPair, key, data);
+ this.cmd = new CommandAPDU(CardConsts.CLA_ECTESTERAPPLET, CardConsts.INS_TRANSFORM, keyPair, key, data);
}
@Override
@@ -444,10 +443,10 @@ public abstract class Command implements Cloneable {
String transform = CardUtil.getTransformation(transformation);
String pair;
- if (keyPair == ECTesterApplet.KEYPAIR_BOTH) {
+ if (keyPair == CardConsts.KEYPAIR_BOTH) {
pair = "both keypairs";
} else {
- pair = ((keyPair == ECTesterApplet.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair";
+ pair = ((keyPair == CardConsts.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair";
}
return String.format("Transform params %s of %s, %s", stringParams, pair, transform);
}
@@ -469,7 +468,7 @@ public abstract class Command implements Cloneable {
super(cardManager);
this.keyPair = keyPair;
- this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_GENERATE, keyPair, 0, GOD_DAMN_JAVA_BUG_6474858_AND_GOD_DAMN_JAVA_12_MODULE_SYSTEM);
+ this.cmd = new CommandAPDU(CardConsts.CLA_ECTESTERAPPLET, CardConsts.INS_GENERATE, keyPair, 0, GOD_DAMN_JAVA_BUG_6474858_AND_GOD_DAMN_JAVA_12_MODULE_SYSTEM);
}
@Override
@@ -483,10 +482,10 @@ public abstract class Command implements Cloneable {
@Override
public String getDescription() {
String key;
- if (keyPair == ECTesterApplet.KEYPAIR_BOTH) {
+ if (keyPair == CardConsts.KEYPAIR_BOTH) {
key = "both keypairs";
} else {
- key = ((keyPair == ECTesterApplet.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair";
+ key = ((keyPair == CardConsts.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair";
}
return String.format("Generate %s", key);
}
@@ -517,7 +516,7 @@ public abstract class Command implements Cloneable {
byte[] data = new byte[2];
ByteUtil.setShort(data, 0, params);
- this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_EXPORT, keyPair, key, data);
+ this.cmd = new CommandAPDU(CardConsts.CLA_ECTESTERAPPLET, CardConsts.INS_EXPORT, keyPair, key, data);
}
@Override
@@ -539,10 +538,10 @@ public abstract class Command implements Cloneable {
source = ((key == EC_Consts.KEY_PUBLIC) ? "public" : "private") + " key";
}
String pair;
- if (keyPair == ECTesterApplet.KEYPAIR_BOTH) {
+ if (keyPair == CardConsts.KEYPAIR_BOTH) {
pair = "both keypairs";
} else {
- pair = ((keyPair == ECTesterApplet.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair";
+ pair = ((keyPair == CardConsts.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair";
}
return String.format("Export %s params from %s of %s", what, source, pair);
}
@@ -579,7 +578,7 @@ public abstract class Command implements Cloneable {
byte[] data = new byte[]{export, 0, 0, type};
ByteUtil.setShort(data, 1, transformation);
- this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_ECDH, pubkey, privkey, data);
+ this.cmd = new CommandAPDU(CardConsts.CLA_ECTESTERAPPLET, CardConsts.INS_ECDH, pubkey, privkey, data);
}
@Override
@@ -594,8 +593,8 @@ public abstract class Command implements Cloneable {
public String getDescription() {
String algo = CardUtil.getKATypeString(type);
- String pub = pubkey == ECTesterApplet.KEYPAIR_LOCAL ? "local" : "remote";
- String priv = privkey == ECTesterApplet.KEYPAIR_LOCAL ? "local" : "remote";
+ String pub = pubkey == CardConsts.KEYPAIR_LOCAL ? "local" : "remote";
+ String priv = privkey == CardConsts.KEYPAIR_LOCAL ? "local" : "remote";
String validity;
if (transformation == EC_Consts.TRANSFORMATION_NONE) {
@@ -640,7 +639,7 @@ public abstract class Command implements Cloneable {
data[2] = type;
System.arraycopy(pubkey, 0, data, 3, pubkey.length);
- this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_ECDH_DIRECT, privkey, export, data);
+ this.cmd = new CommandAPDU(CardConsts.CLA_ECTESTERAPPLET, CardConsts.INS_ECDH_DIRECT, privkey, export, data);
}
@Override
@@ -648,14 +647,14 @@ public abstract class Command implements Cloneable {
long elapsed = -System.nanoTime();
ResponseAPDU response = cardManager.send(cmd);
elapsed += System.nanoTime();
- return new Response.ECDH(response, getDescription(), elapsed, ECTesterApplet.KEYPAIR_REMOTE, privkey, export, transformation, type);
+ return new Response.ECDH(response, getDescription(), elapsed, CardConsts.KEYPAIR_REMOTE, privkey, export, transformation, type);
}
@Override
public String getDescription() {
String algo = CardUtil.getKATypeString(type);
- String priv = privkey == ECTesterApplet.KEYPAIR_LOCAL ? "local" : "remote";
+ String priv = privkey == CardConsts.KEYPAIR_LOCAL ? "local" : "remote";
String validity;
if (transformation == EC_Consts.TRANSFORMATION_NONE) {
@@ -684,7 +683,7 @@ public abstract class Command implements Cloneable {
*/
public ECDSA(CardMngr cardManager, byte keyPair, byte sigType, byte export, byte[] raw) {
super(cardManager);
- if (keyPair == ECTesterApplet.KEYPAIR_BOTH) {
+ if (keyPair == CardConsts.KEYPAIR_BOTH) {
throw new IllegalArgumentException();
}
@@ -701,7 +700,7 @@ public abstract class Command implements Cloneable {
System.arraycopy(raw, 0, data, 3, len);
}
- this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_ECDSA, keyPair, export, data);
+ this.cmd = new CommandAPDU(CardConsts.CLA_ECTESTERAPPLET, CardConsts.INS_ECDSA, keyPair, export, data);
}
@Override
@@ -715,7 +714,7 @@ public abstract class Command implements Cloneable {
@Override
public String getDescription() {
String algo = CardUtil.getSigTypeString(sigType);
- String key = keyPair == ECTesterApplet.KEYPAIR_LOCAL ? "local" : "remote";
+ String key = keyPair == CardConsts.KEYPAIR_LOCAL ? "local" : "remote";
String data = raw == null ? "random" : "provided";
return String.format("%s with %s keypair(%s data)", algo, key, data);
}
@@ -738,7 +737,7 @@ public abstract class Command implements Cloneable {
*/
public ECDSA_sign(CardMngr cardManager, byte keyPair, byte sigType, byte export, byte[] raw) {
super(cardManager);
- if (keyPair == ECTesterApplet.KEYPAIR_BOTH) {
+ if (keyPair == CardConsts.KEYPAIR_BOTH) {
throw new IllegalArgumentException();
}
@@ -755,7 +754,7 @@ public abstract class Command implements Cloneable {
System.arraycopy(raw, 0, data, 3, len);
}
- this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_ECDSA_SIGN, keyPair, export, data);
+ this.cmd = new CommandAPDU(CardConsts.CLA_ECTESTERAPPLET, CardConsts.INS_ECDSA_SIGN, keyPair, export, data);
}
@Override
@@ -769,7 +768,7 @@ public abstract class Command implements Cloneable {
@Override
public String getDescription() {
String algo = CardUtil.getSigTypeString(sigType);
- String key = keyPair == ECTesterApplet.KEYPAIR_LOCAL ? "local" : "remote";
+ String key = keyPair == CardConsts.KEYPAIR_LOCAL ? "local" : "remote";
String data = raw == null ? "random" : "provided";
return String.format("%s signature with %s keypair(%s data)", algo, key, data);
}
@@ -792,7 +791,7 @@ public abstract class Command implements Cloneable {
*/
public ECDSA_verify(CardMngr cardManager, byte keyPair, byte sigType, byte[] raw, byte[] signature) {
super(cardManager);
- if (keyPair == ECTesterApplet.KEYPAIR_BOTH) {
+ if (keyPair == CardConsts.KEYPAIR_BOTH) {
throw new IllegalArgumentException();
}
if (raw == null || signature == null) {
@@ -810,7 +809,7 @@ public abstract class Command implements Cloneable {
ByteUtil.setShort(data, 2 + raw.length, (short) signature.length);
System.arraycopy(signature, 0, data, 2 + raw.length + 2, signature.length);
- this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_ECDSA_VERIFY, keyPair, sigType, data);
+ this.cmd = new CommandAPDU(CardConsts.CLA_ECTESTERAPPLET, CardConsts.INS_ECDSA_VERIFY, keyPair, sigType, data);
}
@Override
@@ -818,13 +817,13 @@ public abstract class Command implements Cloneable {
long elapsed = -System.nanoTime();
ResponseAPDU response = cardManager.send(cmd);
elapsed += System.nanoTime();
- return new Response.ECDSA(response, getDescription(), elapsed, keyPair, sigType, ECTesterApplet.EXPORT_FALSE, raw);
+ return new Response.ECDSA(response, getDescription(), elapsed, keyPair, sigType, CardConsts.EXPORT_FALSE, raw);
}
@Override
public String getDescription() {
String algo = CardUtil.getSigTypeString(sigType);
- String key = keyPair == ECTesterApplet.KEYPAIR_LOCAL ? "local" : "remote";
+ String key = keyPair == CardConsts.KEYPAIR_LOCAL ? "local" : "remote";
String data = raw == null ? "random" : "provided";
return String.format("%s verification with %s keypair(%s data)", algo, key, data);
}
@@ -841,7 +840,7 @@ public abstract class Command implements Cloneable {
public Cleanup(CardMngr cardManager) {
super(cardManager);
- this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_CLEANUP, 0, 0, GOD_DAMN_JAVA_BUG_6474858_AND_GOD_DAMN_JAVA_12_MODULE_SYSTEM);
+ this.cmd = new CommandAPDU(CardConsts.CLA_ECTESTERAPPLET, CardConsts.INS_CLEANUP, 0, 0, GOD_DAMN_JAVA_BUG_6474858_AND_GOD_DAMN_JAVA_12_MODULE_SYSTEM);
}
@Override
@@ -869,7 +868,7 @@ public abstract class Command implements Cloneable {
public GetInfo(CardMngr cardManager) {
super(cardManager);
- this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_GET_INFO, 0, 0, GOD_DAMN_JAVA_BUG_6474858_AND_GOD_DAMN_JAVA_12_MODULE_SYSTEM);
+ this.cmd = new CommandAPDU(CardConsts.CLA_ECTESTERAPPLET, CardConsts.INS_GET_INFO, 0, 0, GOD_DAMN_JAVA_BUG_6474858_AND_GOD_DAMN_JAVA_12_MODULE_SYSTEM);
}
@Override
@@ -900,7 +899,7 @@ public abstract class Command implements Cloneable {
super(cardManager);
this.dryRunMode = dryRunMode;
- this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_SET_DRY_RUN_MODE, dryRunMode, 0, GOD_DAMN_JAVA_BUG_6474858_AND_GOD_DAMN_JAVA_12_MODULE_SYSTEM);
+ this.cmd = new CommandAPDU(CardConsts.CLA_ECTESTERAPPLET, CardConsts.INS_SET_DRY_RUN_MODE, dryRunMode, 0, GOD_DAMN_JAVA_BUG_6474858_AND_GOD_DAMN_JAVA_12_MODULE_SYSTEM);
}
@Override
@@ -913,7 +912,7 @@ public abstract class Command implements Cloneable {
@Override
public String getDescription() {
- return (dryRunMode == ECTesterApplet.MODE_NORMAL ? "Disable" : "Enable") + " dry run mode";
+ return (dryRunMode == CardConsts.MODE_NORMAL ? "Disable" : "Enable") + " dry run mode";
}
}
}
diff --git a/src/cz/crcs/ectester/reader/output/FileTestWriter.java b/reader/src/main/java/cz/crcs/ectester/reader/output/FileTestWriter.java
index 69e5f41..da8dbfc 100644
--- a/src/cz/crcs/ectester/reader/output/FileTestWriter.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/output/FileTestWriter.java
@@ -1,40 +1,37 @@
package cz.crcs.ectester.reader.output;
-import cz.crcs.ectester.common.output.TeeTestWriter;
+import cz.crcs.ectester.common.output.BaseFileTestWriter;
import cz.crcs.ectester.common.output.TestWriter;
import javax.xml.parsers.ParserConfigurationException;
import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.regex.Pattern;
/**
* @author Jan Jancar johny@neuromancer.sk
*/
-public class FileTestWriter extends TeeTestWriter {
+public class FileTestWriter extends BaseFileTestWriter {
private static final Pattern PREFIX = Pattern.compile("(text|xml|yaml|yml):.+");
public FileTestWriter(String defaultFormat, boolean systemOut, String[] files) throws ParserConfigurationException, FileNotFoundException {
- int fLength = files == null ? 0 : files.length;
- writers = new TestWriter[systemOut ? fLength + 1 : fLength];
- if (systemOut) {
- writers[0] = createWriter(defaultFormat, System.out);
- }
- for (int i = 0; i < fLength; ++i) {
- String fName = files[i];
- String format = null;
- if (PREFIX.matcher(fName).matches()) {
- String[] split = fName.split(":", 2);
- format = split[0];
- fName = split[1];
- }
- writers[i + 1] = createWriter(format, new PrintStream(new FileOutputStream(fName)));
+ super(defaultFormat, systemOut, files);
+ }
+
+ @Override
+ protected String[] matchName(String name) {
+ String[] result = new String[2];
+ if (PREFIX.matcher(name).matches()) {
+ result = name.split(":", 2);
+ } else {
+ result[0] = null;
+ result[1] = name;
}
+ return result;
}
- private TestWriter createWriter(String format, PrintStream out) throws ParserConfigurationException {
+ protected TestWriter createWriter(String format, PrintStream out) throws ParserConfigurationException {
if (format == null) {
return new TextTestWriter(out);
}
diff --git a/src/cz/crcs/ectester/reader/output/ResponseWriter.java b/reader/src/main/java/cz/crcs/ectester/reader/output/ResponseWriter.java
index 85bf79a..85bf79a 100644
--- a/src/cz/crcs/ectester/reader/output/ResponseWriter.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/output/ResponseWriter.java
diff --git a/src/cz/crcs/ectester/reader/output/TextTestWriter.java b/reader/src/main/java/cz/crcs/ectester/reader/output/TextTestWriter.java
index 2775647..532ace5 100644
--- a/src/cz/crcs/ectester/reader/output/TextTestWriter.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/output/TextTestWriter.java
@@ -1,11 +1,11 @@
package cz.crcs.ectester.reader.output;
-import cz.crcs.ectester.applet.ECTesterApplet;
import cz.crcs.ectester.common.cli.Colors;
import cz.crcs.ectester.common.output.BaseTextTestWriter;
import cz.crcs.ectester.common.test.TestSuite;
import cz.crcs.ectester.common.test.Testable;
import cz.crcs.ectester.common.util.ByteUtil;
+import cz.crcs.ectester.common.util.CardConsts;
import cz.crcs.ectester.reader.CardMngr;
import cz.crcs.ectester.reader.ECTesterReader;
import cz.crcs.ectester.reader.command.Command;
@@ -48,7 +48,7 @@ public class TextTestWriter extends BaseTextTestWriter {
try {
sb.append("═══ ").append(Colors.underline("ECTester version:")).append(" ").append(ECTesterReader.VERSION).append(ECTesterReader.GIT_COMMIT).append(System.lineSeparator());
Response.GetInfo info = new Command.GetInfo(cardSuite.getCard()).send();
- sb.append("═══ ").append(Colors.underline("ECTester applet version:")).append(" ").append(info.getVersion()).append(info.getBase() == ECTesterApplet.BASE_221 ? "" : " (extended length)").append(System.lineSeparator());
+ sb.append("═══ ").append(Colors.underline("ECTester applet version:")).append(" ").append(info.getVersion()).append(info.getBase() == CardConsts.BASE_221 ? "" : " (extended length)").append(System.lineSeparator());
sb.append("═══ ").append(Colors.underline("Card ATR:")).append(" ").append(ByteUtil.bytesToHex(cardSuite.getCard().getATR().getBytes(), false)).append(System.lineSeparator());
sb.append("═══ ").append(Colors.underline("JavaCard version:")).append(" ").append(info.getJavaCardVersion()).append(System.lineSeparator());
sb.append("═══ ").append(Colors.underline("Array sizes (apduBuf, ram, ram2, apduArr):")).append(" ").append(String.format("%d %d %d %d", info.getApduBufferLength(), info.getRamArrayLength(), info.getRamArray2Length(), info.getApduArrayLength())).append(System.lineSeparator());
diff --git a/src/cz/crcs/ectester/reader/output/XMLTestWriter.java b/reader/src/main/java/cz/crcs/ectester/reader/output/XMLTestWriter.java
index fc41805..fc41805 100644
--- a/src/cz/crcs/ectester/reader/output/XMLTestWriter.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/output/XMLTestWriter.java
diff --git a/src/cz/crcs/ectester/reader/output/YAMLTestWriter.java b/reader/src/main/java/cz/crcs/ectester/reader/output/YAMLTestWriter.java
index 56ecb71..56ecb71 100644
--- a/src/cz/crcs/ectester/reader/output/YAMLTestWriter.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/output/YAMLTestWriter.java
diff --git a/src/cz/crcs/ectester/reader/response/Response.java b/reader/src/main/java/cz/crcs/ectester/reader/response/Response.java
index f36d087..e253d30 100644
--- a/src/cz/crcs/ectester/reader/response/Response.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/response/Response.java
@@ -1,9 +1,9 @@
package cz.crcs.ectester.reader.response;
-import cz.crcs.ectester.applet.ECTesterApplet;
-import cz.crcs.ectester.applet.EC_Consts;
+import cz.crcs.ectester.common.ec.EC_Consts;
import cz.crcs.ectester.common.util.ByteUtil;
-import javacard.framework.ISO7816;
+import cz.crcs.ectester.common.util.CardConsts;
+import cz.crcs.ectester.common.util.CardUtil;
import javax.smartcardio.ResponseAPDU;
@@ -39,7 +39,7 @@ public abstract class Response {
short sw = ByteUtil.getShort(data, offset);
offset += 2;
sws[i] = sw;
- if (sw != ISO7816.SW_NO_ERROR) {
+ if (sw != CardUtil.ISO7816.SW_NO_ERROR) {
success = false;
}
} else {
@@ -48,7 +48,7 @@ public abstract class Response {
}
}
- if ((short) resp.getSW() != ISO7816.SW_NO_ERROR) {
+ if ((short) resp.getSW() != CardUtil.ISO7816.SW_NO_ERROR) {
success = false;
error = true;
}
@@ -179,8 +179,8 @@ public abstract class Response {
this.keyClass = keyClass;
int pairs = 0;
- if ((keyPair & ECTesterApplet.KEYPAIR_LOCAL) != 0) pairs++;
- if ((keyPair & ECTesterApplet.KEYPAIR_REMOTE) != 0) pairs++;
+ if ((keyPair & CardConsts.KEYPAIR_LOCAL) != 0) pairs++;
+ if ((keyPair & CardConsts.KEYPAIR_REMOTE) != 0) pairs++;
parse(pairs, 0);
}
}
@@ -196,8 +196,8 @@ public abstract class Response {
this.keyPair = keyPair;
int pairs = 0;
- if ((keyPair & ECTesterApplet.KEYPAIR_LOCAL) != 0) pairs++;
- if ((keyPair & ECTesterApplet.KEYPAIR_REMOTE) != 0) pairs++;
+ if ((keyPair & CardConsts.KEYPAIR_LOCAL) != 0) pairs++;
+ if ((keyPair & CardConsts.KEYPAIR_REMOTE) != 0) pairs++;
parse(pairs, 0);
}
}
@@ -217,8 +217,8 @@ public abstract class Response {
this.parameters = parameters;
int pairs = 0;
- if ((keyPair & ECTesterApplet.KEYPAIR_LOCAL) != 0) pairs++;
- if ((keyPair & ECTesterApplet.KEYPAIR_REMOTE) != 0) pairs++;
+ if ((keyPair & CardConsts.KEYPAIR_LOCAL) != 0) pairs++;
+ if ((keyPair & CardConsts.KEYPAIR_REMOTE) != 0) pairs++;
parse(pairs, 0);
}
@@ -241,8 +241,8 @@ public abstract class Response {
this.transformation = transformation;
int pairs = 0;
- if ((keyPair & ECTesterApplet.KEYPAIR_LOCAL) != 0) pairs++;
- if ((keyPair & ECTesterApplet.KEYPAIR_REMOTE) != 0) pairs++;
+ if ((keyPair & CardConsts.KEYPAIR_LOCAL) != 0) pairs++;
+ if ((keyPair & CardConsts.KEYPAIR_REMOTE) != 0) pairs++;
parse(pairs, 0);
}
@@ -259,8 +259,8 @@ public abstract class Response {
this.keyPair = keyPair;
int generated = 0;
- if ((keyPair & ECTesterApplet.KEYPAIR_LOCAL) != 0) generated++;
- if ((keyPair & ECTesterApplet.KEYPAIR_REMOTE) != 0) generated++;
+ if ((keyPair & CardConsts.KEYPAIR_LOCAL) != 0) generated++;
+ if ((keyPair & CardConsts.KEYPAIR_REMOTE) != 0) generated++;
parse(generated, 0);
}
}
@@ -280,8 +280,8 @@ public abstract class Response {
this.parameters = parameters;
int exported = 0;
- if ((keyPair & ECTesterApplet.KEYPAIR_LOCAL) != 0) exported++;
- if ((keyPair & ECTesterApplet.KEYPAIR_REMOTE) != 0) exported++;
+ if ((keyPair & CardConsts.KEYPAIR_LOCAL) != 0) exported++;
+ if ((keyPair & CardConsts.KEYPAIR_REMOTE) != 0) exported++;
int keys = 0;
if ((key & EC_Consts.KEY_PUBLIC) != 0) keys++;
if ((key & EC_Consts.KEY_PRIVATE) != 0) keys++;
@@ -301,9 +301,9 @@ public abstract class Response {
}
private int getIndex(byte keyPair, short param) {
- byte pair = ECTesterApplet.KEYPAIR_LOCAL;
+ byte pair = CardConsts.KEYPAIR_LOCAL;
int index = 0;
- while (pair <= ECTesterApplet.KEYPAIR_REMOTE) {
+ while (pair <= CardConsts.KEYPAIR_REMOTE) {
short mask = EC_Consts.PARAMETER_FP;
while (mask <= EC_Consts.PARAMETER_S) {
if (pair == keyPair && param == mask) {
@@ -374,7 +374,7 @@ public abstract class Response {
this.transformation = transformation;
this.type = type;
- parse(1, (export == ECTesterApplet.EXPORT_TRUE) ? 1 : 0);
+ parse(1, (export == CardConsts.EXPORT_TRUE) ? 1 : 0);
}
public short getTransformation() {
@@ -414,7 +414,7 @@ public abstract class Response {
this.export = export;
this.raw = raw;
- parse(1, (export == ECTesterApplet.EXPORT_TRUE) ? 1 : 0);
+ parse(1, (export == CardConsts.EXPORT_TRUE) ? 1 : 0);
}
public boolean hasSignature() {
diff --git a/src/cz/crcs/ectester/reader/test/CardCofactorSuite.java b/reader/src/main/java/cz/crcs/ectester/reader/test/CardCofactorSuite.java
index d1eb2b1..01e9d02 100644
--- a/src/cz/crcs/ectester/reader/test/CardCofactorSuite.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/test/CardCofactorSuite.java
@@ -1,14 +1,14 @@
package cz.crcs.ectester.reader.test;
-import cz.crcs.ectester.applet.ECTesterApplet;
-import cz.crcs.ectester.applet.EC_Consts;
import cz.crcs.ectester.common.ec.EC_Curve;
import cz.crcs.ectester.common.ec.EC_Key;
+import cz.crcs.ectester.common.ec.EC_Consts;
import cz.crcs.ectester.common.output.TestWriter;
import cz.crcs.ectester.common.test.CompoundTest;
import cz.crcs.ectester.common.test.Result;
import cz.crcs.ectester.common.test.Test;
import cz.crcs.ectester.common.util.CardUtil;
+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;
@@ -37,18 +37,18 @@ public class CardCofactorSuite extends CardTestSuite {
EC_Curve curve = e.getKey();
List<EC_Key.Public> keys = e.getValue();
- Test allocate = CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS);
- Test set = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.SUCCESS);
- Test generate = setupKeypairs(curve, ExpectedValue.SUCCESS, ECTesterApplet.KEYPAIR_LOCAL);
+ Test allocate = CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_BOTH, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS);
+ Test set = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.SUCCESS);
+ Test generate = setupKeypairs(curve, ExpectedValue.SUCCESS, CardConsts.KEYPAIR_LOCAL);
Test prepare = CompoundTest.all(ExpectedValue.SUCCESS, "Prepare and generate keypair on " + curve.getId() + ".", allocate, set, generate);
List<Test> ecdhTests = new LinkedList<>();
for (EC_Key.Public pub : keys) {
- Test setPub = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, pub.getParams(), pub.flatten()), Result.ExpectedValue.FAILURE);
- Test ecdh = CommandTest.expect(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), Result.ExpectedValue.FAILURE);
+ Test setPub = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, pub.getParams(), pub.flatten()), Result.ExpectedValue.FAILURE);
+ Test ecdh = CommandTest.expect(new Command.ECDH(this.card, CardConsts.KEYPAIR_REMOTE, CardConsts.KEYPAIR_LOCAL, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), Result.ExpectedValue.FAILURE);
Test objectEcdh = CompoundTest.any(Result.ExpectedValue.SUCCESS, CardUtil.getKATypeString(EC_Consts.KeyAgreement_ALG_EC_SVDP_DH) + " test with cofactor pubkey.", setPub, ecdh);
- Command ecdhCommand = new Command.ECDH_direct(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH, pub.flatten());
+ Command ecdhCommand = new Command.ECDH_direct(this.card, CardConsts.KEYPAIR_LOCAL, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH, pub.flatten());
Test rawEcdh = CommandTest.expect(ecdhCommand, ExpectedValue.FAILURE, "Card correctly rejected point on non-generator subgroup.", "Card incorrectly accepted point on non-generator subgroup.");
ecdhTests.add(CompoundTest.all(Result.ExpectedValue.SUCCESS, pub.getId() + " cofactor key test.", objectEcdh, rawEcdh));
}
diff --git a/src/cz/crcs/ectester/reader/test/CardCompositeSuite.java b/reader/src/main/java/cz/crcs/ectester/reader/test/CardCompositeSuite.java
index babe732..a28c2a7 100644
--- a/src/cz/crcs/ectester/reader/test/CardCompositeSuite.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/test/CardCompositeSuite.java
@@ -1,13 +1,13 @@
package cz.crcs.ectester.reader.test;
-import cz.crcs.ectester.applet.ECTesterApplet;
-import cz.crcs.ectester.applet.EC_Consts;
import cz.crcs.ectester.common.ec.EC_Curve;
import cz.crcs.ectester.common.ec.EC_Key;
+import cz.crcs.ectester.common.ec.EC_Consts;
import cz.crcs.ectester.common.output.TestWriter;
import cz.crcs.ectester.common.test.CompoundTest;
import cz.crcs.ectester.common.test.Test;
import cz.crcs.ectester.common.util.CardUtil;
+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;
@@ -36,13 +36,13 @@ public class CardCompositeSuite extends CardTestSuite {
for (Map.Entry<EC_Curve, List<EC_Key>> curveKeys : mappedKeys.entrySet()) {
EC_Curve curve = curveKeys.getKey();
List<Test> tests = new LinkedList<>();
- Test allocate = runTest(CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_LOCAL, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS));
+ Test allocate = runTest(CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_LOCAL, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS));
if (!allocate.ok()) {
doTest(CompoundTest.all(ExpectedValue.SUCCESS, "No support for " + curve.getBits() + "b " + CardUtil.getKeyTypeString(curve.getField()) + ".", allocate));
continue;
}
tests.add(allocate);
- tests.add(CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.ANY));
+ tests.add(CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_LOCAL, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.ANY));
String name;
if (cfg.testOptions.contains("preset")) {
@@ -50,9 +50,9 @@ public class CardCompositeSuite extends CardTestSuite {
} else {
name = "generated private key";
}
- tests.add(setupKeypairs(curve, ExpectedValue.ANY, ECTesterApplet.KEYPAIR_LOCAL));
+ tests.add(setupKeypairs(curve, ExpectedValue.ANY, CardConsts.KEYPAIR_LOCAL));
for (EC_Key key : curveKeys.getValue()) {
- Command ecdhCommand = new Command.ECDH_direct(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH, key.flatten());
+ Command ecdhCommand = new Command.ECDH_direct(this.card, CardConsts.KEYPAIR_LOCAL, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH, key.flatten());
Test ecdh = CommandTest.expect(ecdhCommand, ExpectedValue.FAILURE, "Card correctly rejected to do ECDH over a composite order curve.", "Card incorrectly does ECDH over a composite order curve, leaks bits of private key.");
tests.add(CompoundTest.greedyAllTry(ExpectedValue.SUCCESS, "Composite test of " + curve.getId() + ", with " + name + ", " + key.getDesc(), ecdh));
}
@@ -95,11 +95,11 @@ public class CardCompositeSuite extends CardTestSuite {
private void testGroup(List<EC_Curve> curves, String testName, ExpectedValue dhValue, String ok, String nok) throws Exception {
for (EC_Curve curve : curves) {
- Test allocate = CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS);
- Test set = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.ANY);
- Test generate = setupKeypairs(curve, ExpectedValue.ANY, ECTesterApplet.KEYPAIR_BOTH);
- Test ecdh = CommandTest.expect(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), dhValue, ok, nok);
- Test ecdsa = CommandTest.expect(new Command.ECDSA_sign(this.card, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.Signature_ALG_ECDSA_SHA, ECTesterApplet.EXPORT_FALSE, null), dhValue, ok, nok);
+ Test allocate = CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_BOTH, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS);
+ Test set = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.ANY);
+ Test generate = setupKeypairs(curve, ExpectedValue.ANY, CardConsts.KEYPAIR_BOTH);
+ Test ecdh = CommandTest.expect(new Command.ECDH(this.card, CardConsts.KEYPAIR_REMOTE, CardConsts.KEYPAIR_LOCAL, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), dhValue, ok, nok);
+ Test ecdsa = CommandTest.expect(new Command.ECDSA_sign(this.card, CardConsts.KEYPAIR_LOCAL, EC_Consts.Signature_ALG_ECDSA_SHA, CardConsts.EXPORT_FALSE, null), dhValue, ok, nok);
String description;
if (testName == null) {
diff --git a/src/cz/crcs/ectester/reader/test/CardCompressionSuite.java b/reader/src/main/java/cz/crcs/ectester/reader/test/CardCompressionSuite.java
index 9eed814..8390cd3 100644
--- a/src/cz/crcs/ectester/reader/test/CardCompressionSuite.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/test/CardCompressionSuite.java
@@ -1,9 +1,8 @@
package cz.crcs.ectester.reader.test;
-import cz.crcs.ectester.applet.ECTesterApplet;
-import cz.crcs.ectester.applet.EC_Consts;
import cz.crcs.ectester.common.ec.EC_Curve;
import cz.crcs.ectester.common.ec.EC_Key;
+import cz.crcs.ectester.common.ec.EC_Consts;
import cz.crcs.ectester.common.output.TestWriter;
import cz.crcs.ectester.common.test.CompoundTest;
import cz.crcs.ectester.common.test.Result;
@@ -11,12 +10,12 @@ import cz.crcs.ectester.common.test.Test;
import cz.crcs.ectester.common.util.ByteUtil;
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;
import cz.crcs.ectester.reader.command.Command;
import cz.crcs.ectester.reader.response.Response;
-import javacard.security.KeyPair;
import java.security.spec.ECPoint;
import java.util.LinkedList;
@@ -45,7 +44,7 @@ public class CardCompressionSuite extends CardTestSuite {
// - test local privkey, remote pubkey (hybrid with wrong y)
// - test local privkey, remote pubkey (point at infinity)
if (cfg.primeField) {
- runCompression(KeyPair.ALG_EC_FP);
+ runCompression(EC_Consts.ALG_EC_FP);
}
// for F2m
// - allocate, set custom curve, generate keypairs, -> export generated.
@@ -55,7 +54,7 @@ public class CardCompressionSuite extends CardTestSuite {
// - test local privkey, remote pubkey (hybrid with wrong y)
// - test local privkey, remote pubkey (point at infinity)
if (cfg.binaryField) {
- runCompression(KeyPair.ALG_EC_F2M);
+ runCompression(EC_Consts.ALG_EC_F2M);
}
// Now, do ECDH over SECG curves and give the implementation a compressed key that is not a quadratic residue in
@@ -64,14 +63,14 @@ public class CardCompressionSuite extends CardTestSuite {
}
private void runCompression(byte field) throws Exception {
- short[] keySizes = field == KeyPair.ALG_EC_FP ? EC_Consts.FP_SIZES : EC_Consts.F2M_SIZES;
- short domain = field == KeyPair.ALG_EC_FP ? EC_Consts.PARAMETERS_DOMAIN_FP : EC_Consts.PARAMETERS_DOMAIN_F2M;
+ short[] keySizes = field == EC_Consts.ALG_EC_FP ? EC_Consts.FP_SIZES : EC_Consts.F2M_SIZES;
+ short domain = field == EC_Consts.ALG_EC_FP ? EC_Consts.PARAMETERS_DOMAIN_FP : EC_Consts.PARAMETERS_DOMAIN_F2M;
for (short keyLength : keySizes) {
String spec = keyLength + "b " + CardUtil.getKeyTypeString(field);
byte curveId = EC_Consts.getCurve(keyLength, field);
- Test allocateFirst = runTest(CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_BOTH, keyLength, field), Result.ExpectedValue.SUCCESS));
+ Test allocateFirst = runTest(CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_BOTH, keyLength, field), Result.ExpectedValue.SUCCESS));
if (!allocateFirst.ok()) {
doTest(CompoundTest.all(Result.ExpectedValue.SUCCESS, "No support for compression test on " + spec + ".", allocateFirst));
continue;
@@ -79,13 +78,13 @@ public class CardCompressionSuite extends CardTestSuite {
List<Test> compressionTests = new LinkedList<>();
compressionTests.add(allocateFirst);
- Test setCustom = runTest(CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, curveId, domain, null), Result.ExpectedValue.SUCCESS));
- Test genCustom = runTest(CommandTest.expect(new Command.Generate(this.card, ECTesterApplet.KEYPAIR_BOTH), Result.ExpectedValue.SUCCESS));
+ Test setCustom = runTest(CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, curveId, domain, null), Result.ExpectedValue.SUCCESS));
+ Test genCustom = runTest(CommandTest.expect(new Command.Generate(this.card, CardConsts.KEYPAIR_BOTH), Result.ExpectedValue.SUCCESS));
compressionTests.add(setCustom);
compressionTests.add(genCustom);
- Response.Export key = new Command.Export(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.KEY_PUBLIC, EC_Consts.PARAMETER_W).send();
- byte[] pubkey = key.getParameter(ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.KEY_PUBLIC);
+ Response.Export key = new Command.Export(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.KEY_PUBLIC, EC_Consts.PARAMETER_W).send();
+ byte[] pubkey = key.getParameter(CardConsts.KEYPAIR_REMOTE, EC_Consts.KEY_PUBLIC);
EC_Curve secgCurve = EC_Store.getInstance().getObject(EC_Curve.class, "secg", CardUtil.getCurveName(curveId));
ECPoint pub;
try {
@@ -100,23 +99,23 @@ public class CardCompressionSuite extends CardTestSuite {
List<Test> thisTests = new LinkedList<>();
Test allocate = runTest(CommandTest.expect(new Command.AllocateKeyAgreement(this.card, kaType), Result.ExpectedValue.SUCCESS));
if (allocate.ok()) {
- Test ka = runTest(CommandTest.expect(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, kaType), Result.ExpectedValue.SUCCESS));
+ Test ka = runTest(CommandTest.expect(new Command.ECDH(this.card, CardConsts.KEYPAIR_LOCAL, CardConsts.KEYPAIR_REMOTE, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, kaType), Result.ExpectedValue.SUCCESS));
thisTests.add(CompoundTest.all(Result.ExpectedValue.SUCCESS, "KeyAgreement setup and basic test.", allocate, ka));
if (ka.ok()) {
// tests of the good stuff
- Test kaCompressed = CommandTest.expect(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_COMPRESS, kaType), Result.ExpectedValue.SUCCESS);
- Test kaHybrid = CommandTest.expect(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_COMPRESS_HYBRID, kaType), Result.ExpectedValue.SUCCESS);
+ Test kaCompressed = CommandTest.expect(new Command.ECDH(this.card, CardConsts.KEYPAIR_LOCAL, CardConsts.KEYPAIR_REMOTE, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_COMPRESS, kaType), Result.ExpectedValue.SUCCESS);
+ Test kaHybrid = CommandTest.expect(new Command.ECDH(this.card, CardConsts.KEYPAIR_LOCAL, CardConsts.KEYPAIR_REMOTE, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_COMPRESS_HYBRID, kaType), Result.ExpectedValue.SUCCESS);
thisTests.add(CompoundTest.any(Result.ExpectedValue.SUCCESS, "Tests of compressed and hybrid form.", kaCompressed, kaHybrid));
// tests the bad stuff here
byte[] pubHybrid = ECUtil.toX962Hybrid(pub, keyLength);
pubHybrid[pubHybrid.length - 1] ^= 1;
byte[] pubHybridEncoded = ByteUtil.prependLength(pubHybrid);
- Test kaBadHybrid = CommandTest.expect(new Command.ECDH_direct(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, kaType, pubHybridEncoded), Result.ExpectedValue.FAILURE);
+ Test kaBadHybrid = CommandTest.expect(new Command.ECDH_direct(this.card, CardConsts.KEYPAIR_LOCAL, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, kaType, pubHybridEncoded), Result.ExpectedValue.FAILURE);
byte[] pubInfinityEncoded = {0x01, 0x00};
- Test kaBadInfinity = CommandTest.expect(new Command.ECDH_direct(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, kaType, pubInfinityEncoded), Result.ExpectedValue.FAILURE);
+ Test kaBadInfinity = CommandTest.expect(new Command.ECDH_direct(this.card, CardConsts.KEYPAIR_LOCAL, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, kaType, pubInfinityEncoded), Result.ExpectedValue.FAILURE);
thisTests.add(CompoundTest.all(Result.ExpectedValue.SUCCESS, "Tests of corrupted hybrid form and infinity.", kaBadHybrid, kaBadInfinity));
}
kaTests.add(CompoundTest.all(Result.ExpectedValue.SUCCESS, "KeyAgreement tests of " + CardUtil.getKATypeString(kaType) + ".", thisTests.toArray(new Test[0])));
@@ -138,17 +137,17 @@ public class CardCompressionSuite extends CardTestSuite {
for (EC_Key.Public key : compressionKeys) {
EC_Curve curve = EC_Store.getInstance().getObject(EC_Curve.class, key.getCurve());
List<Test> tests = new LinkedList<>();
- Test allocate = runTest(CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_LOCAL, curve.getBits(), curve.getField()), Result.ExpectedValue.SUCCESS));
+ Test allocate = runTest(CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_LOCAL, curve.getBits(), curve.getField()), Result.ExpectedValue.SUCCESS));
if (!allocate.ok()) {
doTest(CompoundTest.all(Result.ExpectedValue.SUCCESS, "No support for non-residue test on " + curve.getBits() + "b " + curve.getId() + ".", allocate));
continue;
}
tests.add(allocate);
- tests.add(CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Result.ExpectedValue.SUCCESS));
- tests.add(CommandTest.expect(new Command.Generate(this.card, ECTesterApplet.KEYPAIR_LOCAL), Result.ExpectedValue.SUCCESS));
+ tests.add(CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_LOCAL, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Result.ExpectedValue.SUCCESS));
+ tests.add(CommandTest.expect(new Command.Generate(this.card, CardConsts.KEYPAIR_LOCAL), Result.ExpectedValue.SUCCESS));
byte[] pointData = ECUtil.toX962Compressed(key.getParam(EC_Consts.PARAMETER_W));
byte[] pointDataEncoded = ByteUtil.prependLength(pointData);
- tests.add(CommandTest.expect(new Command.ECDH_direct(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH, pointDataEncoded), Result.ExpectedValue.FAILURE));
+ tests.add(CommandTest.expect(new Command.ECDH_direct(this.card, CardConsts.KEYPAIR_LOCAL, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH, pointDataEncoded), Result.ExpectedValue.FAILURE));
doTest(CompoundTest.greedyAll(Result.ExpectedValue.SUCCESS, "Non-residue test of " + curve.getId() + ".", tests.toArray(new Test[0])));
}
}
diff --git a/src/cz/crcs/ectester/reader/test/CardDefaultSuite.java b/reader/src/main/java/cz/crcs/ectester/reader/test/CardDefaultSuite.java
index 8814c37..ebb1d3f 100644
--- a/src/cz/crcs/ectester/reader/test/CardDefaultSuite.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/test/CardDefaultSuite.java
@@ -1,16 +1,15 @@
package cz.crcs.ectester.reader.test;
-import cz.crcs.ectester.applet.ECTesterApplet;
-import cz.crcs.ectester.applet.EC_Consts;
+import cz.crcs.ectester.common.ec.EC_Consts;
import cz.crcs.ectester.common.output.TestWriter;
import cz.crcs.ectester.common.test.CompoundTest;
import cz.crcs.ectester.common.test.Result;
import cz.crcs.ectester.common.test.Test;
+import cz.crcs.ectester.common.util.CardConsts;
import cz.crcs.ectester.common.util.CardUtil;
import cz.crcs.ectester.reader.CardMngr;
import cz.crcs.ectester.reader.ECTesterReader;
import cz.crcs.ectester.reader.command.Command;
-import javacard.security.KeyPair;
import java.util.LinkedList;
import java.util.List;
@@ -34,30 +33,30 @@ public class CardDefaultSuite extends CardTestSuite {
@Override
protected void runTests() throws Exception {
if (cfg.primeField) {
- runDefault(KeyPair.ALG_EC_FP);
+ runDefault(EC_Consts.ALG_EC_FP);
}
if (cfg.binaryField) {
- runDefault(KeyPair.ALG_EC_F2M);
+ runDefault(EC_Consts.ALG_EC_F2M);
}
}
private void runDefault(byte field) throws Exception {
- short[] keySizes = field == KeyPair.ALG_EC_FP ? EC_Consts.FP_SIZES : EC_Consts.F2M_SIZES;
- short domain = field == KeyPair.ALG_EC_FP ? EC_Consts.PARAMETERS_DOMAIN_FP : EC_Consts.PARAMETERS_DOMAIN_F2M;
+ short[] keySizes = field == EC_Consts.ALG_EC_FP ? EC_Consts.FP_SIZES : EC_Consts.F2M_SIZES;
+ short domain = field == EC_Consts.ALG_EC_FP ? EC_Consts.PARAMETERS_DOMAIN_FP : EC_Consts.PARAMETERS_DOMAIN_F2M;
for (short keyLength : keySizes) {
List<Test> supportTests = new LinkedList<>();
- Test allocateFirst = runTest(CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_BOTH, keyLength, field), ExpectedValue.SUCCESS));
+ Test allocateFirst = runTest(CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_BOTH, keyLength, field), ExpectedValue.SUCCESS));
if (!allocateFirst.ok()) {
doTest(CompoundTest.all(ExpectedValue.SUCCESS, "No support for " + keyLength + "b " + CardUtil.getKeyTypeString(field) + ".", allocateFirst));
continue;
}
supportTests.add(allocateFirst);
- Test genDefault = runTest(CommandTest.expect(new Command.Generate(this.card, ECTesterApplet.KEYPAIR_BOTH), ExpectedValue.SUCCESS));
- Test allocateSecond = runTest(CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_BOTH, keyLength, field), ExpectedValue.SUCCESS));
- Test setCustom = runTest(CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.getCurve(keyLength, field), domain, null), ExpectedValue.SUCCESS));
- Test genCustom = runTest(CommandTest.expect(new Command.Generate(this.card, ECTesterApplet.KEYPAIR_BOTH), ExpectedValue.SUCCESS));
+ Test genDefault = runTest(CommandTest.expect(new Command.Generate(this.card, CardConsts.KEYPAIR_BOTH), ExpectedValue.SUCCESS));
+ Test allocateSecond = runTest(CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_BOTH, keyLength, field), ExpectedValue.SUCCESS));
+ Test setCustom = runTest(CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.getCurve(keyLength, field), domain, null), ExpectedValue.SUCCESS));
+ Test genCustom = runTest(CommandTest.expect(new Command.Generate(this.card, CardConsts.KEYPAIR_BOTH), ExpectedValue.SUCCESS));
supportTests.add(genDefault);
supportTests.add(allocateSecond);
supportTests.add(setCustom);
@@ -67,9 +66,9 @@ public class CardDefaultSuite extends CardTestSuite {
for (byte kaType : EC_Consts.KA_TYPES) {
Test allocate = runTest(CommandTest.expect(new Command.AllocateKeyAgreement(this.card, kaType), ExpectedValue.SUCCESS));
if (allocate.ok()) {
- Command ecdh = new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, kaType);
+ Command ecdh = new Command.ECDH(this.card, CardConsts.KEYPAIR_LOCAL, CardConsts.KEYPAIR_REMOTE, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, kaType);
Test ka = runTest(CommandTest.expect(ecdh, ExpectedValue.SUCCESS));
- Test kaCompressed = runTest(CommandTest.expect(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_COMPRESS, kaType), ExpectedValue.SUCCESS));
+ Test kaCompressed = runTest(CommandTest.expect(new Command.ECDH(this.card, CardConsts.KEYPAIR_LOCAL, CardConsts.KEYPAIR_REMOTE, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_COMPRESS, kaType), ExpectedValue.SUCCESS));
String kaDesc = "Test of the " + CardUtil.getKATypeString(kaType) + " KeyAgreement.";
Function<Test[], Result> kaCallback = (tests) -> {
@@ -101,7 +100,7 @@ public class CardDefaultSuite extends CardTestSuite {
for (byte sigType : EC_Consts.SIG_TYPES) {
Test allocate = runTest(CommandTest.expect(new Command.AllocateSignature(this.card, sigType), ExpectedValue.SUCCESS));
if (allocate.ok()) {
- Command ecdsa = new Command.ECDSA(this.card, ECTesterApplet.KEYPAIR_LOCAL, sigType, ECTesterApplet.EXPORT_FALSE, null);
+ Command ecdsa = new Command.ECDSA(this.card, CardConsts.KEYPAIR_LOCAL, sigType, CardConsts.EXPORT_FALSE, null);
Test expect = runTest(CommandTest.expect(ecdsa, ExpectedValue.SUCCESS));
String signDesc = "Test of the " + CardUtil.getSigTypeString(sigType) + " signature.";
@@ -112,10 +111,10 @@ public class CardDefaultSuite extends CardTestSuite {
Test compound;
if (expect.ok()) {
- Command ecdsaSign = new Command.ECDSA_sign(this.card, ECTesterApplet.KEYPAIR_LOCAL, sigType, ECTesterApplet.EXPORT_TRUE, sigData);
+ Command ecdsaSign = new Command.ECDSA_sign(this.card, CardConsts.KEYPAIR_LOCAL, sigType, CardConsts.EXPORT_TRUE, sigData);
PerformanceTest signTest = runTest(PerformanceTest.repeat(this.card, "Sign", ecdsaSign, 10));
byte[] signature = signTest.getResponses()[0].getParam(0);
- Command ecdsaVerify = new Command.ECDSA_verify(this.card, ECTesterApplet.KEYPAIR_LOCAL, sigType, sigData, signature);
+ Command ecdsaVerify = new Command.ECDSA_verify(this.card, CardConsts.KEYPAIR_LOCAL, sigType, sigData, signature);
PerformanceTest verifyTest = runTest(PerformanceTest.repeat(this.card, "Verify", ecdsaVerify, 10));
compound = runTest(CompoundTest.all(ExpectedValue.SUCCESS, signDesc, allocate, expect, signTest, verifyTest));
} else {
diff --git a/src/cz/crcs/ectester/reader/test/CardDegenerateSuite.java b/reader/src/main/java/cz/crcs/ectester/reader/test/CardDegenerateSuite.java
index f2e73b6..e2c07da 100644
--- a/src/cz/crcs/ectester/reader/test/CardDegenerateSuite.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/test/CardDegenerateSuite.java
@@ -1,13 +1,13 @@
package cz.crcs.ectester.reader.test;
-import cz.crcs.ectester.applet.ECTesterApplet;
-import cz.crcs.ectester.applet.EC_Consts;
+import cz.crcs.ectester.common.ec.EC_Consts;
import cz.crcs.ectester.common.ec.EC_Curve;
import cz.crcs.ectester.common.ec.EC_Key;
import cz.crcs.ectester.common.output.TestWriter;
import cz.crcs.ectester.common.test.CompoundTest;
import cz.crcs.ectester.common.test.Result;
import cz.crcs.ectester.common.test.Test;
+import cz.crcs.ectester.common.util.CardConsts;
import cz.crcs.ectester.common.util.CardUtil;
import cz.crcs.ectester.data.EC_Store;
import cz.crcs.ectester.reader.CardMngr;
@@ -36,22 +36,22 @@ public class CardDegenerateSuite extends CardTestSuite {
EC_Curve curve = e.getKey();
List<EC_Key.Public> keys = e.getValue();
- Test allocate = runTest(CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), Result.ExpectedValue.SUCCESS));
+ Test allocate = runTest(CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_BOTH, curve.getBits(), curve.getField()), Result.ExpectedValue.SUCCESS));
if (!allocate.ok()) {
doTest(CompoundTest.all(Result.ExpectedValue.SUCCESS, "No support for " + curve.getId() + ".", allocate));
continue;
}
- Test set = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Result.ExpectedValue.SUCCESS);
- Test generate = CommandTest.expect(new Command.Generate(this.card, ECTesterApplet.KEYPAIR_LOCAL), Result.ExpectedValue.SUCCESS);
+ Test set = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Result.ExpectedValue.SUCCESS);
+ Test generate = CommandTest.expect(new Command.Generate(this.card, CardConsts.KEYPAIR_LOCAL), Result.ExpectedValue.SUCCESS);
Test prepare = CompoundTest.all(Result.ExpectedValue.SUCCESS, "Prepare and generate keypair on " + curve.getId() + ".", allocate, set, generate);
List<Test> ecdhTests = new LinkedList<>();
for (EC_Key.Public pub : keys) {
- Test setPub = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, pub.getParams(), pub.flatten()), Result.ExpectedValue.FAILURE);
- Test ecdh = CommandTest.expect(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), Result.ExpectedValue.FAILURE, "Card correctly rejected point on degenerate curve.", "Card incorrectly accepted point on degenerate curve.");
+ Test setPub = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, pub.getParams(), pub.flatten()), Result.ExpectedValue.FAILURE);
+ Test ecdh = CommandTest.expect(new Command.ECDH(this.card, CardConsts.KEYPAIR_REMOTE, CardConsts.KEYPAIR_LOCAL, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), Result.ExpectedValue.FAILURE, "Card correctly rejected point on degenerate curve.", "Card incorrectly accepted point on degenerate curve.");
Test objectEcdh = CompoundTest.any(Result.ExpectedValue.SUCCESS, CardUtil.getKATypeString(EC_Consts.KeyAgreement_ALG_EC_SVDP_DH) + " test with degenerate pubkey.", setPub, ecdh);
- Command ecdhCommand = new Command.ECDH_direct(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH, pub.flatten());
+ Command ecdhCommand = new Command.ECDH_direct(this.card, CardConsts.KEYPAIR_LOCAL, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH, pub.flatten());
Test rawEcdh = CommandTest.expect(ecdhCommand, Result.ExpectedValue.FAILURE, "Card correctly rejected point on degenerate curve.", "Card incorrectly accepted point on degenerate curve.");
ecdhTests.add(CompoundTest.all(Result.ExpectedValue.SUCCESS, pub.getId() + " degenerate key test.", objectEcdh, rawEcdh));
//TODO: actually get the result of ECDH here, as well as export privkey and compare to exponentiation in Fp^*.
diff --git a/src/cz/crcs/ectester/reader/test/CardEdgeCasesSuite.java b/reader/src/main/java/cz/crcs/ectester/reader/test/CardEdgeCasesSuite.java
index 9257b3d..0a82da3 100644
--- a/src/cz/crcs/ectester/reader/test/CardEdgeCasesSuite.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/test/CardEdgeCasesSuite.java
@@ -1,25 +1,20 @@
package cz.crcs.ectester.reader.test;
-import cz.crcs.ectester.applet.ECTesterApplet;
-import cz.crcs.ectester.applet.EC_Consts;
-import cz.crcs.ectester.common.ec.EC_Curve;
-import cz.crcs.ectester.common.ec.EC_KAResult;
-import cz.crcs.ectester.common.ec.EC_Key;
-import cz.crcs.ectester.common.ec.EC_Params;
+import cz.crcs.ectester.common.ec.*;
import cz.crcs.ectester.common.output.TestWriter;
import cz.crcs.ectester.common.test.CompoundTest;
import cz.crcs.ectester.common.test.Result;
import cz.crcs.ectester.common.test.Test;
import cz.crcs.ectester.common.test.TestCallback;
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.data.EC_Store;
import cz.crcs.ectester.reader.CardMngr;
import cz.crcs.ectester.reader.ECTesterReader;
import cz.crcs.ectester.reader.command.Command;
import cz.crcs.ectester.reader.response.Response;
-import javacard.security.CryptoException;
-import javacard.security.KeyPair;
import java.math.BigDecimal;
import java.math.BigInteger;
@@ -61,8 +56,8 @@ public class CardEdgeCasesSuite extends CardTestSuite {
EC_Curve curve = c.getKey();
List<Test> curveTests = new LinkedList<>();
- Test allocate = CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), Result.ExpectedValue.SUCCESS);
- Test set = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Result.ExpectedValue.SUCCESS);
+ Test allocate = CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_BOTH, curve.getBits(), curve.getField()), Result.ExpectedValue.SUCCESS);
+ Test set = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Result.ExpectedValue.SUCCESS);
Test prepareCurve = CompoundTest.greedyAll(Result.ExpectedValue.SUCCESS, "Prepare curve", allocate, set);
List<EC_KAResult> values = c.getValue();
@@ -74,14 +69,14 @@ public class CardEdgeCasesSuite extends CardTestSuite {
EC_Key.Private privkey = EC_Store.getInstance().getObject(EC_Key.Private.class, privkeyId);
EC_Key.Public pubkey = EC_Store.getInstance().getObject(EC_Key.Public.class, pubkeyId);
- Test setPrivkey = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.CURVE_external, privkey.getParams(), privkey.flatten()), Result.ExpectedValue.SUCCESS);
- Test setPubkey = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, pubkey.getParams(), pubkey.flatten()), Result.ExpectedValue.SUCCESS);
- Test ecdhPreTest = CommandTest.expect(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), Result.ExpectedValue.SUCCESS);
- Test ecdh = CommandTest.function(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_TRUE, EC_Consts.TRANSFORMATION_NONE, value.getJavaCardKA()), new TestCallback<CommandTestable>() {
+ Test setPrivkey = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_LOCAL, EC_Consts.CURVE_external, privkey.getParams(), privkey.flatten()), Result.ExpectedValue.SUCCESS);
+ Test setPubkey = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, pubkey.getParams(), pubkey.flatten()), Result.ExpectedValue.SUCCESS);
+ Test ecdhPreTest = CommandTest.expect(new Command.ECDH(this.card, CardConsts.KEYPAIR_REMOTE, CardConsts.KEYPAIR_LOCAL, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), Result.ExpectedValue.SUCCESS);
+ Test ecdh = CommandTest.function(new Command.ECDH(this.card, CardConsts.KEYPAIR_REMOTE, CardConsts.KEYPAIR_LOCAL, CardConsts.EXPORT_TRUE, EC_Consts.TRANSFORMATION_NONE, value.getJavaCardKA()), new TestCallback<CommandTestable>() {
@Override
public Result apply(CommandTestable testable) {
Response.ECDH dh = (Response.ECDH) testable.getResponse();
- if (dh.getSW(0) == CryptoException.NO_SUCH_ALGORITHM) {
+ if (dh.getSW(0) == CardUtil.CryptoException.NO_SUCH_ALGORITHM) {
return new Result(Result.Value.SUCCESS, "ECDH algorithm unsupported.");
}
if (!dh.successful())
@@ -120,11 +115,11 @@ public class CardEdgeCasesSuite extends CardTestSuite {
EC_Curve curve = EC_Store.getInstance().getObject(EC_Curve.class, openssl_bug.getCurve());
EC_Key.Private skey = EC_Store.getInstance().getObject(EC_Key.Private.class, openssl_bug.getOtherKey());
EC_Key.Public pkey = EC_Store.getInstance().getObject(EC_Key.Public.class, openssl_bug.getOneKey());
- Test key = CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), KeyPair.ALG_EC_FP), Result.ExpectedValue.SUCCESS);
- Test set = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Result.ExpectedValue.SUCCESS);
- Test setPrivate = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.CURVE_external, EC_Consts.PARAMETER_S, skey.flatten(EC_Consts.PARAMETER_S)), Result.ExpectedValue.SUCCESS);
- Test setPublic = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, EC_Consts.PARAMETER_W, pkey.flatten(EC_Consts.PARAMETER_W)), Result.ExpectedValue.SUCCESS);
- Test ecdh = CommandTest.function(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_TRUE, EC_Consts.TRANSFORMATION_NONE, openssl_bug.getJavaCardKA()), new TestCallback<CommandTestable>() {
+ Test key = CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_BOTH, curve.getBits(), EC_Consts.ALG_EC_FP), Result.ExpectedValue.SUCCESS);
+ Test set = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Result.ExpectedValue.SUCCESS);
+ Test setPrivate = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_LOCAL, EC_Consts.CURVE_external, EC_Consts.PARAMETER_S, skey.flatten(EC_Consts.PARAMETER_S)), Result.ExpectedValue.SUCCESS);
+ Test setPublic = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, EC_Consts.PARAMETER_W, pkey.flatten(EC_Consts.PARAMETER_W)), Result.ExpectedValue.SUCCESS);
+ Test ecdh = CommandTest.function(new Command.ECDH(this.card, CardConsts.KEYPAIR_REMOTE, CardConsts.KEYPAIR_LOCAL, CardConsts.EXPORT_TRUE, EC_Consts.TRANSFORMATION_NONE, openssl_bug.getJavaCardKA()), new TestCallback<CommandTestable>() {
@Override
public Result apply(CommandTestable testable) {
Response.ECDH dh = (Response.ECDH) testable.getResponse();
@@ -143,25 +138,25 @@ public class CardEdgeCasesSuite extends CardTestSuite {
}
Map<String, EC_Curve> curveMap = EC_Store.getInstance().getObjects(EC_Curve.class, "secg");
- List<EC_Curve> curves = curveMap.entrySet().stream().filter((e) -> e.getKey().endsWith("r1") && e.getValue().getField() == KeyPair.ALG_EC_FP).map(Map.Entry::getValue).collect(Collectors.toList());
+ List<EC_Curve> curves = curveMap.entrySet().stream().filter((e) -> e.getKey().endsWith("r1") && e.getValue().getField() == EC_Consts.ALG_EC_FP).map(Map.Entry::getValue).collect(Collectors.toList());
curves.add(EC_Store.getInstance().getObject(EC_Curve.class, "cofactor/cofactor128p2"));
curves.add(EC_Store.getInstance().getObject(EC_Curve.class, "cofactor/cofactor160p4"));
Random rand = new Random();
for (EC_Curve curve : curves) {
- Test key = runTest(CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), KeyPair.ALG_EC_FP), Result.ExpectedValue.SUCCESS));
+ Test key = runTest(CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_BOTH, curve.getBits(), EC_Consts.ALG_EC_FP), Result.ExpectedValue.SUCCESS));
if (!key.ok()) {
doTest(CompoundTest.all(Result.ExpectedValue.FAILURE, "No support for " + curve.getBits() + "b " + curve.getId() + ".", key));
continue;
}
- Test set = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Result.ExpectedValue.SUCCESS);
- Test generate = CommandTest.expect(new Command.Generate(this.card, ECTesterApplet.KEYPAIR_LOCAL), Result.ExpectedValue.SUCCESS);
- CommandTest export = CommandTest.expect(new Command.Export(this.card, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.KEY_PUBLIC, EC_Consts.PARAMETER_W), Result.ExpectedValue.SUCCESS);
+ Test set = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Result.ExpectedValue.SUCCESS);
+ Test generate = CommandTest.expect(new Command.Generate(this.card, CardConsts.KEYPAIR_LOCAL), Result.ExpectedValue.SUCCESS);
+ CommandTest export = CommandTest.expect(new Command.Export(this.card, CardConsts.KEYPAIR_LOCAL, EC_Consts.KEY_PUBLIC, EC_Consts.PARAMETER_W), Result.ExpectedValue.SUCCESS);
Test setup = runTest(CompoundTest.all(Result.ExpectedValue.SUCCESS, "KeyPair setup.", key, set, generate, export));
/*
byte[] pParam = curve.getParam(EC_Consts.PARAMETER_FP)[0];
BigInteger p = new BigInteger(1, pParam);
- byte[] wParam = ((Response.Export) export.getResponse()).getParameter(ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.PARAMETER_W);
+ byte[] wParam = ((Response.Export) export.getResponse()).getParameter(CardConsts.KEYPAIR_LOCAL, EC_Consts.PARAMETER_W);
byte[] xValue = new byte[(wParam.length - 1) / 2];
byte[] yValue = new byte[(wParam.length - 1) / 2];
System.arraycopy(wParam, 1, xValue, 0, xValue.length);
@@ -171,11 +166,11 @@ public class CardEdgeCasesSuite extends CardTestSuite {
byte[] newY = ECUtil.toByteArray(negY, curve.getBits());
EC_Params negYParams = new EC_Params(EC_Consts.PARAMETER_W, new byte[][]{xValue, newY});
- Test negYTest = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.CURVE_external, negYParams.getParams(), negYParams.flatten()), "ECDH with pubkey negated.", Result.ExpectedValue.FAILURE, Result.ExpectedValue.FAILURE);
+ Test negYTest = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_LOCAL, EC_Consts.CURVE_external, negYParams.getParams(), negYParams.flatten()), "ECDH with pubkey negated.", Result.ExpectedValue.FAILURE, Result.ExpectedValue.FAILURE);
*/
- Test zeroS = ecdhTest(new Command.Transform(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, EC_Consts.PARAMETER_S, EC_Consts.TRANSFORMATION_ZERO), "ECDH with S = 0.", Result.ExpectedValue.FAILURE, Result.ExpectedValue.FAILURE);
- Test oneS = ecdhTest(new Command.Transform(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, EC_Consts.PARAMETER_S, EC_Consts.TRANSFORMATION_ONE), "ECDH with S = 1.", Result.ExpectedValue.FAILURE, Result.ExpectedValue.FAILURE);
+ Test zeroS = ecdhTest(new Command.Transform(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, EC_Consts.PARAMETER_S, EC_Consts.TRANSFORMATION_ZERO), "ECDH with S = 0.", Result.ExpectedValue.FAILURE, Result.ExpectedValue.FAILURE);
+ Test oneS = ecdhTest(new Command.Transform(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, EC_Consts.PARAMETER_S, EC_Consts.TRANSFORMATION_ONE), "ECDH with S = 1.", Result.ExpectedValue.FAILURE, Result.ExpectedValue.FAILURE);
byte[] rParam = curve.getParam(EC_Consts.PARAMETER_R)[0];
BigInteger R = new BigInteger(1, rParam);
@@ -194,31 +189,31 @@ public class CardEdgeCasesSuite extends CardTestSuite {
BigInteger alternateOther = alternate.xor(full);
EC_Params alternateParams = makeParams(alternate);
- Test alternateS = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, alternateParams.getParams(), alternateParams.flatten()), "ECDH with S = 101010101...01010.", Result.ExpectedValue.SUCCESS, Result.ExpectedValue.SUCCESS);
+ Test alternateS = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, alternateParams.getParams(), alternateParams.flatten()), "ECDH with S = 101010101...01010.", Result.ExpectedValue.SUCCESS, Result.ExpectedValue.SUCCESS);
EC_Params alternateOtherParams = makeParams(alternateOther);
- Test alternateOtherS = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, alternateOtherParams.getParams(), alternateOtherParams.flatten()), "ECDH with S = 010101010...10101.", Result.ExpectedValue.SUCCESS, Result.ExpectedValue.SUCCESS);
+ Test alternateOtherS = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, alternateOtherParams.getParams(), alternateOtherParams.flatten()), "ECDH with S = 010101010...10101.", Result.ExpectedValue.SUCCESS, Result.ExpectedValue.SUCCESS);
EC_Params fullParams = makeParams(full);
- Test fullS = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, fullParams.getParams(), fullParams.flatten()), "ECDH with S = 111111111...11111 (but < r).", Result.ExpectedValue.SUCCESS, Result.ExpectedValue.SUCCESS);
+ Test fullS = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, fullParams.getParams(), fullParams.flatten()), "ECDH with S = 111111111...11111 (but < r).", Result.ExpectedValue.SUCCESS, Result.ExpectedValue.SUCCESS);
EC_Params smallerParams = makeParams(smaller);
- Test smallerS = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, smallerParams.getParams(), smallerParams.flatten()), "ECDH with S < r.", Result.ExpectedValue.SUCCESS, Result.ExpectedValue.SUCCESS);
+ Test smallerS = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, smallerParams.getParams(), smallerParams.flatten()), "ECDH with S < r.", Result.ExpectedValue.SUCCESS, Result.ExpectedValue.SUCCESS);
EC_Params exactParams = makeParams(R);
- Test exactS = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, exactParams.getParams(), exactParams.flatten()), "ECDH with S = r.", Result.ExpectedValue.FAILURE, Result.ExpectedValue.FAILURE);
+ Test exactS = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, exactParams.getParams(), exactParams.flatten()), "ECDH with S = r.", Result.ExpectedValue.FAILURE, Result.ExpectedValue.FAILURE);
EC_Params largerParams = makeParams(larger);
- Test largerS = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, largerParams.getParams(), largerParams.flatten()), "ECDH with S > r.", Result.ExpectedValue.ANY, Result.ExpectedValue.ANY);
+ Test largerS = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, largerParams.getParams(), largerParams.flatten()), "ECDH with S > r.", Result.ExpectedValue.ANY, Result.ExpectedValue.ANY);
BigInteger rm1 = R.subtract(BigInteger.ONE);
BigInteger rp1 = R.add(BigInteger.ONE);
EC_Params rm1Params = makeParams(rm1);
- Test rm1S = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, rm1Params.getParams(), rm1Params.flatten()), "ECDH with S = r - 1.", Result.ExpectedValue.SUCCESS, Result.ExpectedValue.SUCCESS);
+ Test rm1S = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, rm1Params.getParams(), rm1Params.flatten()), "ECDH with S = r - 1.", Result.ExpectedValue.SUCCESS, Result.ExpectedValue.SUCCESS);
EC_Params rp1Params = makeParams(rp1);
- Test rp1S = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, rp1Params.getParams(), rp1Params.flatten()), "ECDH with S = r + 1.", Result.ExpectedValue.ANY, Result.ExpectedValue.ANY);
+ Test rp1S = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, rp1Params.getParams(), rp1Params.flatten()), "ECDH with S = r + 1.", Result.ExpectedValue.ANY, Result.ExpectedValue.ANY);
byte[] k = curve.getParam(EC_Consts.PARAMETER_K)[0];
BigInteger K = new BigInteger(1, k);
@@ -229,13 +224,13 @@ public class CardEdgeCasesSuite extends CardTestSuite {
Result.ExpectedValue kExpected = K.equals(BigInteger.ONE) ? Result.ExpectedValue.SUCCESS : Result.ExpectedValue.FAILURE;
EC_Params krParams = makeParams(kr);
- Test krS /*ONE!*/ = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, krParams.getParams(), krParams.flatten()), "ECDH with S = k * r.", Result.ExpectedValue.FAILURE, Result.ExpectedValue.FAILURE);
+ Test krS /*ONE!*/ = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, krParams.getParams(), krParams.flatten()), "ECDH with S = k * r.", Result.ExpectedValue.FAILURE, Result.ExpectedValue.FAILURE);
EC_Params krm1Params = makeParams(krm1);
- Test krm1S = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, krm1Params.getParams(), krm1Params.flatten()), "ECDH with S = (k * r) - 1.", kExpected, kExpected);
+ Test krm1S = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, krm1Params.getParams(), krm1Params.flatten()), "ECDH with S = (k * r) - 1.", kExpected, kExpected);
EC_Params krp1Params = makeParams(krp1);
- Test krp1S = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, krp1Params.getParams(), krp1Params.flatten()), "ECDH with S = (k * r) + 1.", Result.ExpectedValue.ANY, Result.ExpectedValue.ANY);
+ Test krp1S = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, krp1Params.getParams(), krp1Params.flatten()), "ECDH with S = (k * r) + 1.", Result.ExpectedValue.ANY, Result.ExpectedValue.ANY);
if (cfg.cleanup) {
Test cleanup = CommandTest.expect(new Command.Cleanup(this.card), Result.ExpectedValue.ANY);
@@ -273,20 +268,20 @@ public class CardEdgeCasesSuite extends CardTestSuite {
Arrays.sort(ps);
Arrays.sort(zeros);
- Test key = runTest(CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_BOTH, secp160r1.getBits(), KeyPair.ALG_EC_FP), Result.ExpectedValue.SUCCESS));
+ Test key = runTest(CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_BOTH, secp160r1.getBits(), EC_Consts.ALG_EC_FP), Result.ExpectedValue.SUCCESS));
if (!key.ok()) {
doTest(CompoundTest.all(Result.ExpectedValue.FAILURE, "No support for " + secp160r1.getBits() + "b secp160r1.", key));
return;
}
- Test set = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, secp160r1.getParams(), secp160r1.flatten()), Result.ExpectedValue.SUCCESS);
- Test generate = CommandTest.expect(new Command.Generate(this.card, ECTesterApplet.KEYPAIR_LOCAL), Result.ExpectedValue.SUCCESS);
+ Test set = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, secp160r1.getParams(), secp160r1.flatten()), Result.ExpectedValue.SUCCESS);
+ Test generate = CommandTest.expect(new Command.Generate(this.card, CardConsts.KEYPAIR_LOCAL), Result.ExpectedValue.SUCCESS);
Test setup = CompoundTest.all(Result.ExpectedValue.SUCCESS, "KeyPair setup.", key, set, generate);
Test[] zeroTests = new Test[n];
int i = 0;
for (BigInteger nearZero : zeros) {
EC_Params params = makeParams(nearZero);
- zeroTests[i++] = ecdhTestBoth(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, params.getParams(), params.flatten()), nearZero.toString(16), Result.ExpectedValue.SUCCESS, Result.ExpectedValue.SUCCESS);
+ zeroTests[i++] = ecdhTestBoth(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, params.getParams(), params.flatten()), nearZero.toString(16), Result.ExpectedValue.SUCCESS, Result.ExpectedValue.SUCCESS);
}
Test zeroTest = CompoundTest.all(Result.ExpectedValue.SUCCESS, "Near zero.", zeroTests);
@@ -294,7 +289,7 @@ public class CardEdgeCasesSuite extends CardTestSuite {
i = 0;
for (BigInteger nearP : ps) {
EC_Params params = makeParams(nearP);
- pTests[i++] = ecdhTestBoth(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, params.getParams(), params.flatten()), nearP.toString(16) + (nearP.compareTo(p) > 0 ? " (>p)" : " (<=p)"), Result.ExpectedValue.SUCCESS, Result.ExpectedValue.SUCCESS);
+ pTests[i++] = ecdhTestBoth(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, params.getParams(), params.flatten()), nearP.toString(16) + (nearP.compareTo(p) > 0 ? " (>p)" : " (<=p)"), Result.ExpectedValue.SUCCESS, Result.ExpectedValue.SUCCESS);
}
Test pTest = CompoundTest.all(Result.ExpectedValue.SUCCESS, "Near p.", pTests);
@@ -303,9 +298,9 @@ public class CardEdgeCasesSuite extends CardTestSuite {
for (BigInteger nearR : rs) {
EC_Params params = makeParams(nearR);
if (nearR.compareTo(r) >= 0) {
- rTests[i++] = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, params.getParams(), params.flatten()), nearR.toString(16) + " (>=r)", Result.ExpectedValue.FAILURE, Result.ExpectedValue.FAILURE);
+ rTests[i++] = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, params.getParams(), params.flatten()), nearR.toString(16) + " (>=r)", Result.ExpectedValue.FAILURE, Result.ExpectedValue.FAILURE);
} else {
- rTests[i++] = ecdhTestBoth(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, params.getParams(), params.flatten()), nearR.toString(16) + " (<r)", Result.ExpectedValue.SUCCESS, Result.ExpectedValue.SUCCESS);
+ rTests[i++] = ecdhTestBoth(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, params.getParams(), params.flatten()), nearR.toString(16) + " (<r)", Result.ExpectedValue.SUCCESS, Result.ExpectedValue.SUCCESS);
}
}
Test rTest = CompoundTest.all(Result.ExpectedValue.SUCCESS, "Near r.", rTests);
@@ -314,14 +309,14 @@ public class CardEdgeCasesSuite extends CardTestSuite {
private Test ecdhTestBoth(Command setPriv, String desc, Result.ExpectedValue setExpect, Result.ExpectedValue ecdhExpect) {
Test set = CommandTest.expect(setPriv, setExpect);
- Test ecdh = CommandTest.expect(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_TRUE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), ecdhExpect);
+ Test ecdh = CommandTest.expect(new Command.ECDH(this.card, CardConsts.KEYPAIR_LOCAL, CardConsts.KEYPAIR_REMOTE, CardConsts.EXPORT_TRUE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), ecdhExpect);
return CompoundTest.all(Result.ExpectedValue.SUCCESS, desc, set, ecdh);
}
private Test ecdhTest(Command setPriv, String desc, Result.ExpectedValue setExpect, Result.ExpectedValue ecdhExpect) {
Test set = CommandTest.expect(setPriv, setExpect);
- Test ecdh = CommandTest.expect(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_TRUE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), ecdhExpect);
+ Test ecdh = CommandTest.expect(new Command.ECDH(this.card, CardConsts.KEYPAIR_LOCAL, CardConsts.KEYPAIR_REMOTE, CardConsts.EXPORT_TRUE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), ecdhExpect);
return CompoundTest.any(Result.ExpectedValue.SUCCESS, desc, set, ecdh);
}
diff --git a/src/cz/crcs/ectester/reader/test/CardInvalidSuite.java b/reader/src/main/java/cz/crcs/ectester/reader/test/CardInvalidSuite.java
index 5df379e..4657de0 100644
--- a/src/cz/crcs/ectester/reader/test/CardInvalidSuite.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/test/CardInvalidSuite.java
@@ -1,13 +1,13 @@
package cz.crcs.ectester.reader.test;
-import cz.crcs.ectester.applet.ECTesterApplet;
-import cz.crcs.ectester.applet.EC_Consts;
+import cz.crcs.ectester.common.ec.EC_Consts;
import cz.crcs.ectester.common.ec.EC_Curve;
import cz.crcs.ectester.common.ec.EC_Key;
import cz.crcs.ectester.common.output.TestWriter;
import cz.crcs.ectester.common.test.CompoundTest;
import cz.crcs.ectester.common.test.Result;
import cz.crcs.ectester.common.test.Test;
+import cz.crcs.ectester.common.util.CardConsts;
import cz.crcs.ectester.common.util.CardUtil;
import cz.crcs.ectester.data.EC_Store;
import cz.crcs.ectester.reader.CardMngr;
@@ -40,22 +40,22 @@ public class CardInvalidSuite extends CardTestSuite {
EC_Curve curve = e.getKey();
List<EC_Key.Public> keys = e.getValue();
- Test allocate = runTest(CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS));
+ Test allocate = runTest(CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_BOTH, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS));
if (!allocate.ok()) {
doTest(CompoundTest.all(Result.ExpectedValue.SUCCESS, "No support for " + curve.getId() + ".", allocate));
continue;
}
- Test set = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.SUCCESS);
- Test generate = CommandTest.expect(new Command.Generate(this.card, ECTesterApplet.KEYPAIR_LOCAL), ExpectedValue.SUCCESS);
+ Test set = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.SUCCESS);
+ Test generate = CommandTest.expect(new Command.Generate(this.card, CardConsts.KEYPAIR_LOCAL), ExpectedValue.SUCCESS);
Test prepare = CompoundTest.all(ExpectedValue.SUCCESS, "Prepare and generate keypair on " + curve.getId() + ".", allocate, set, generate);
List<Test> ecdhTests = new LinkedList<>();
for (EC_Key.Public pub : keys) {
- Test setPub = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, pub.getParams(), pub.flatten()), Result.ExpectedValue.FAILURE);
- Test ecdh = CommandTest.expect(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), Result.ExpectedValue.FAILURE);
+ Test setPub = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, pub.getParams(), pub.flatten()), Result.ExpectedValue.FAILURE);
+ Test ecdh = CommandTest.expect(new Command.ECDH(this.card, CardConsts.KEYPAIR_REMOTE, CardConsts.KEYPAIR_LOCAL, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), Result.ExpectedValue.FAILURE);
Test objectEcdh = CompoundTest.any(Result.ExpectedValue.SUCCESS, CardUtil.getKATypeString(EC_Consts.KeyAgreement_ALG_EC_SVDP_DH) + " test with invalid pubkey.", setPub, ecdh);
- Command ecdhCommand = new Command.ECDH_direct(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH, pub.flatten());
+ Command ecdhCommand = new Command.ECDH_direct(this.card, CardConsts.KEYPAIR_LOCAL, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH, pub.flatten());
Test rawEcdh = CommandTest.expect(ecdhCommand, ExpectedValue.FAILURE, "Card correctly rejected point on invalid curve.", "Card incorrectly accepted point on invalid curve.");
ecdhTests.add(CompoundTest.all(Result.ExpectedValue.SUCCESS, pub.getId() + " invalid key test.", objectEcdh, rawEcdh));
}
diff --git a/src/cz/crcs/ectester/reader/test/CardMiscSuite.java b/reader/src/main/java/cz/crcs/ectester/reader/test/CardMiscSuite.java
index dd49708..da4c0b5 100644
--- a/src/cz/crcs/ectester/reader/test/CardMiscSuite.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/test/CardMiscSuite.java
@@ -1,12 +1,12 @@
package cz.crcs.ectester.reader.test;
-import cz.crcs.ectester.applet.ECTesterApplet;
-import cz.crcs.ectester.applet.EC_Consts;
+import cz.crcs.ectester.common.ec.EC_Consts;
import cz.crcs.ectester.common.ec.EC_Curve;
import cz.crcs.ectester.common.output.TestWriter;
import cz.crcs.ectester.common.test.CompoundTest;
import cz.crcs.ectester.common.test.Result;
import cz.crcs.ectester.common.test.Test;
+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;
@@ -49,16 +49,16 @@ public class CardMiscSuite extends CardTestSuite {
}
private void testCurve(EC_Curve curve, String catName, Result.ExpectedValue expected) {
- Test allocateFirst = runTest(CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), Result.ExpectedValue.SUCCESS));
+ Test allocateFirst = runTest(CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_BOTH, curve.getBits(), curve.getField()), Result.ExpectedValue.SUCCESS));
if (!allocateFirst.ok()) {
doTest(CompoundTest.all(Result.ExpectedValue.SUCCESS, "No support for " + curve.getBits() + "b " + catName + " curve: " + curve.getId() + ".", allocateFirst));
return;
}
- Test set = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Result.ExpectedValue.SUCCESS);
- Test generate = setupKeypairs(curve, Result.ExpectedValue.ANY, ECTesterApplet.KEYPAIR_BOTH);
- Test ka = CommandTest.expect(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), expected);
- Test sig = CommandTest.expect(new Command.ECDSA_sign(this.card, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.Signature_ALG_ECDSA_SHA, ECTesterApplet.EXPORT_FALSE, null), expected);
+ Test set = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Result.ExpectedValue.SUCCESS);
+ Test generate = setupKeypairs(curve, Result.ExpectedValue.ANY, CardConsts.KEYPAIR_BOTH);
+ Test ka = CommandTest.expect(new Command.ECDH(this.card, CardConsts.KEYPAIR_REMOTE, CardConsts.KEYPAIR_LOCAL, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), expected);
+ Test sig = CommandTest.expect(new Command.ECDSA_sign(this.card, CardConsts.KEYPAIR_LOCAL, EC_Consts.Signature_ALG_ECDSA_SHA, CardConsts.EXPORT_FALSE, null), expected);
Test perform = CompoundTest.all(Result.ExpectedValue.SUCCESS, "Perform ECDH and ECDSA.", ka, sig);
if (cfg.cleanup) {
diff --git a/src/cz/crcs/ectester/reader/test/CardSignatureSuite.java b/reader/src/main/java/cz/crcs/ectester/reader/test/CardSignatureSuite.java
index 0e4ca8e..086654a 100644
--- a/src/cz/crcs/ectester/reader/test/CardSignatureSuite.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/test/CardSignatureSuite.java
@@ -1,7 +1,6 @@
package cz.crcs.ectester.reader.test;
-import cz.crcs.ectester.applet.ECTesterApplet;
-import cz.crcs.ectester.applet.EC_Consts;
+import cz.crcs.ectester.common.ec.EC_Consts;
import cz.crcs.ectester.common.ec.EC_Curve;
import cz.crcs.ectester.common.ec.EC_Key;
import cz.crcs.ectester.common.ec.EC_SigResult;
@@ -9,6 +8,7 @@ import cz.crcs.ectester.common.output.TestWriter;
import cz.crcs.ectester.common.test.CompoundTest;
import cz.crcs.ectester.common.test.Result;
import cz.crcs.ectester.common.test.Test;
+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;
@@ -52,10 +52,10 @@ public class CardSignatureSuite extends CardTestSuite {
}
EC_Curve curve = EC_Store.getInstance().getObject(EC_Curve.class, sig.getCurve());
- Test allocate = CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_LOCAL, curve.getBits(), curve.getField()), Result.ExpectedValue.SUCCESS);
- Test set = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Result.ExpectedValue.SUCCESS);
- Test setVerifyKey = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.CURVE_external, pubkey.getParams(), pubkey.flatten()), Result.ExpectedValue.SUCCESS);
- Test ecdsaVerify = CommandTest.expect(new Command.ECDSA_verify(this.card, ECTesterApplet.KEYPAIR_LOCAL, sig.getJavaCardSig(), data, sig.getData(0)), expected);
+ Test allocate = CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_LOCAL, curve.getBits(), curve.getField()), Result.ExpectedValue.SUCCESS);
+ Test set = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_LOCAL, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Result.ExpectedValue.SUCCESS);
+ Test setVerifyKey = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_LOCAL, EC_Consts.CURVE_external, pubkey.getParams(), pubkey.flatten()), Result.ExpectedValue.SUCCESS);
+ Test ecdsaVerify = CommandTest.expect(new Command.ECDSA_verify(this.card, CardConsts.KEYPAIR_LOCAL, sig.getJavaCardSig(), data, sig.getData(0)), expected);
if (cfg.cleanup) {
Test cleanup = CommandTest.expect(new Command.Cleanup(this.card), Result.ExpectedValue.ANY);
diff --git a/src/cz/crcs/ectester/reader/test/CardTestSuite.java b/reader/src/main/java/cz/crcs/ectester/reader/test/CardTestSuite.java
index fc60ae5..15c4469 100644
--- a/src/cz/crcs/ectester/reader/test/CardTestSuite.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/test/CardTestSuite.java
@@ -1,7 +1,6 @@
package cz.crcs.ectester.reader.test;
-import cz.crcs.ectester.applet.ECTesterApplet;
-import cz.crcs.ectester.applet.EC_Consts;
+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.output.TestWriter;
@@ -9,6 +8,7 @@ import cz.crcs.ectester.common.test.CompoundTest;
import cz.crcs.ectester.common.test.Result;
import cz.crcs.ectester.common.test.Test;
import cz.crcs.ectester.common.test.TestSuite;
+import cz.crcs.ectester.common.util.CardConsts;
import cz.crcs.ectester.common.util.ECUtil;
import cz.crcs.ectester.reader.CardMngr;
import cz.crcs.ectester.reader.ECTesterReader;
@@ -50,17 +50,17 @@ public abstract class CardTestSuite extends TestSuite {
public Test setupKeypairs(EC_Curve curve, Result.ExpectedValue expected, byte keyPair) {
if ((Arrays.asList(options).contains("preset") && cfg.testOptions.contains("preset")) || (Arrays.asList(options).contains("random") && cfg.testOptions.contains("random"))) {
Test setLocal = null;
- if ((keyPair & ECTesterApplet.KEYPAIR_LOCAL) != 0) {
+ if ((keyPair & CardConsts.KEYPAIR_LOCAL) != 0) {
EC_Params priv;
if (cfg.testOptions.contains("preset")) {
priv = ECUtil.fixedRandomKey(curve);
} else {
priv = ECUtil.fullRandomKey(curve);
}
- setLocal = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.CURVE_external, priv.getParams(), priv.flatten()), expected);
+ setLocal = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_LOCAL, EC_Consts.CURVE_external, priv.getParams(), priv.flatten()), expected);
}
Test setRemote = null;
- if ((keyPair & ECTesterApplet.KEYPAIR_REMOTE) != 0) {
+ if ((keyPair & CardConsts.KEYPAIR_REMOTE) != 0) {
EC_Params pub;
if (cfg.testOptions.contains("preset")) {
pub = ECUtil.fixedRandomPoint(curve);
@@ -68,15 +68,15 @@ public abstract class CardTestSuite extends TestSuite {
pub = ECUtil.fullRandomPoint(curve);
}
if (pub == null) {
- setRemote = CommandTest.expect(new Command.Generate(this.card, ECTesterApplet.KEYPAIR_REMOTE), expected);
+ setRemote = CommandTest.expect(new Command.Generate(this.card, CardConsts.KEYPAIR_REMOTE), expected);
} else {
- setRemote = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, pub.getParams(), pub.flatten()), expected);
+ setRemote = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, pub.getParams(), pub.flatten()), expected);
}
}
- if (keyPair == ECTesterApplet.KEYPAIR_LOCAL) {
+ if (keyPair == CardConsts.KEYPAIR_LOCAL) {
return setLocal;
- } else if (keyPair == ECTesterApplet.KEYPAIR_REMOTE) {
+ } else if (keyPair == CardConsts.KEYPAIR_REMOTE) {
return setRemote;
} else {
String desc;
diff --git a/src/cz/crcs/ectester/reader/test/CardTestVectorSuite.java b/reader/src/main/java/cz/crcs/ectester/reader/test/CardTestVectorSuite.java
index d143852..07b38d0 100644
--- a/src/cz/crcs/ectester/reader/test/CardTestVectorSuite.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/test/CardTestVectorSuite.java
@@ -1,7 +1,5 @@
package cz.crcs.ectester.reader.test;
-import cz.crcs.ectester.applet.ECTesterApplet;
-import cz.crcs.ectester.applet.EC_Consts;
import cz.crcs.ectester.common.ec.*;
import cz.crcs.ectester.common.output.TestWriter;
import cz.crcs.ectester.common.test.CompoundTest;
@@ -9,6 +7,7 @@ import cz.crcs.ectester.common.test.Result;
import cz.crcs.ectester.common.test.Test;
import cz.crcs.ectester.common.test.TestCallback;
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.data.EC_Store;
@@ -16,7 +15,6 @@ import cz.crcs.ectester.reader.CardMngr;
import cz.crcs.ectester.reader.ECTesterReader;
import cz.crcs.ectester.reader.command.Command;
import cz.crcs.ectester.reader.response.Response;
-import javacard.security.KeyPair;
import javax.crypto.KeyAgreement;
import java.io.IOException;
@@ -65,17 +63,17 @@ public class CardTestVectorSuite extends CardTestSuite {
throw new IOException("Test vector keys couldn't be located.");
}
List<Test> testVector = new LinkedList<>();
- Test allocate = runTest(CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS));
+ Test allocate = runTest(CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_BOTH, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS));
if (!allocate.ok()) {
doTest(CompoundTest.all(ExpectedValue.SUCCESS, "No support for " + curve.getBits() + "b " + CardUtil.getKeyTypeString(curve.getField()) + ".", allocate));
continue;
}
testVector.add(allocate);
- testVector.add(CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.SUCCESS));
- testVector.add(CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.CURVE_external, EC_Consts.PARAMETER_S, onekey.flatten(EC_Consts.PARAMETER_S)), ExpectedValue.SUCCESS));
- testVector.add(CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, EC_Consts.PARAMETER_W, otherkey.flatten(EC_Consts.PARAMETER_W)), ExpectedValue.SUCCESS));
- testVector.add(CommandTest.function(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_TRUE, EC_Consts.TRANSFORMATION_NONE, result.getJavaCardKA()), new TestCallback<CommandTestable>() {
+ testVector.add(CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.SUCCESS));
+ testVector.add(CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_LOCAL, EC_Consts.CURVE_external, EC_Consts.PARAMETER_S, onekey.flatten(EC_Consts.PARAMETER_S)), ExpectedValue.SUCCESS));
+ testVector.add(CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, EC_Consts.PARAMETER_W, otherkey.flatten(EC_Consts.PARAMETER_W)), ExpectedValue.SUCCESS));
+ testVector.add(CommandTest.function(new Command.ECDH(this.card, CardConsts.KEYPAIR_REMOTE, CardConsts.KEYPAIR_LOCAL, CardConsts.EXPORT_TRUE, EC_Consts.TRANSFORMATION_NONE, result.getJavaCardKA()), new TestCallback<CommandTestable>() {
@Override
public Result apply(CommandTestable testable) {
Response.ECDH dh = (Response.ECDH) testable.getResponse();
@@ -110,25 +108,25 @@ public class CardTestVectorSuite extends CardTestSuite {
}
List<EC_Curve> testCurves = new ArrayList<>();
- testCurves.addAll(EC_Store.getInstance().getObjects(EC_Curve.class, "secg").values().stream().filter((curve) -> curve.getField() == KeyPair.ALG_EC_FP).collect(Collectors.toList()));
- testCurves.addAll(EC_Store.getInstance().getObjects(EC_Curve.class, "brainpool").values().stream().filter((curve) -> curve.getField() == KeyPair.ALG_EC_FP).collect(Collectors.toList()));
+ testCurves.addAll(EC_Store.getInstance().getObjects(EC_Curve.class, "secg").values().stream().filter((curve) -> curve.getField() == EC_Consts.ALG_EC_FP).collect(Collectors.toList()));
+ testCurves.addAll(EC_Store.getInstance().getObjects(EC_Curve.class, "brainpool").values().stream().filter((curve) -> curve.getField() == EC_Consts.ALG_EC_FP).collect(Collectors.toList()));
for (EC_Curve curve : testCurves) {
List<Test> testVector = new LinkedList<>();
- Test allocate = runTest(CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS));
+ Test allocate = runTest(CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_BOTH, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS));
if (!allocate.ok()) {
doTest(CompoundTest.all(ExpectedValue.SUCCESS, "No support for " + curve.getBits() + "b " + CardUtil.getKeyTypeString(curve.getField()) + ".", allocate));
continue;
}
testVector.add(allocate);
- testVector.add(CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.SUCCESS));
- testVector.add(CommandTest.expect(new Command.Generate(this.card, ECTesterApplet.KEYPAIR_BOTH), ExpectedValue.SUCCESS));
- CommandTest exportLocal = CommandTest.expect(new Command.Export(this.card, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.KEY_PUBLIC, EC_Consts.PARAMETER_W), ExpectedValue.ANY);
- CommandTest exportRemote = CommandTest.expect(new Command.Export(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.KEY_PRIVATE, EC_Consts.PARAMETER_S), ExpectedValue.ANY);
+ testVector.add(CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.SUCCESS));
+ testVector.add(CommandTest.expect(new Command.Generate(this.card, CardConsts.KEYPAIR_BOTH), ExpectedValue.SUCCESS));
+ CommandTest exportLocal = CommandTest.expect(new Command.Export(this.card, CardConsts.KEYPAIR_LOCAL, EC_Consts.KEY_PUBLIC, EC_Consts.PARAMETER_W), ExpectedValue.ANY);
+ CommandTest exportRemote = CommandTest.expect(new Command.Export(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.KEY_PRIVATE, EC_Consts.PARAMETER_S), ExpectedValue.ANY);
testVector.add(exportLocal);
testVector.add(exportRemote);
BiFunction<Response.Export, Response.Export, Key[]> getKeys = (localData, remoteData) -> {
- byte[] pkey = localData.getParameter(ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.PARAMETER_W);
- byte[] skey = remoteData.getParameter(ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.PARAMETER_S);
+ byte[] pkey = localData.getParameter(CardConsts.KEYPAIR_LOCAL, EC_Consts.PARAMETER_W);
+ byte[] skey = remoteData.getParameter(CardConsts.KEYPAIR_REMOTE, EC_Consts.PARAMETER_S);
ECParameterSpec spec = curve.toSpec();
ECPrivateKeySpec privKeySpec = new ECPrivateKeySpec(new BigInteger(1, skey), spec);
ECPublicKeySpec pubKeySpec = new ECPublicKeySpec(ECUtil.fromX962(pkey, curve.toCurve()), spec);
@@ -191,8 +189,8 @@ public class CardTestVectorSuite extends CardTestSuite {
}
}
};
- Test ecdhTest = CommandTest.function(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_TRUE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), kaCallback);
- Test ecdhRawTest = CommandTest.function(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_TRUE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH_PLAIN), kaCallback);
+ Test ecdhTest = CommandTest.function(new Command.ECDH(this.card, CardConsts.KEYPAIR_LOCAL, CardConsts.KEYPAIR_REMOTE, CardConsts.EXPORT_TRUE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), kaCallback);
+ Test ecdhRawTest = CommandTest.function(new Command.ECDH(this.card, CardConsts.KEYPAIR_LOCAL, CardConsts.KEYPAIR_REMOTE, CardConsts.EXPORT_TRUE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH_PLAIN), kaCallback);
byte[] data = new byte[32];
TestCallback<CommandTestable> sigCallback = new TestCallback<CommandTestable>() {
@Override
@@ -224,7 +222,7 @@ public class CardTestVectorSuite extends CardTestSuite {
}
}
};
- Test ecdsaTest = CommandTest.function(new Command.ECDSA_sign(this.card, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.Signature_ALG_ECDSA_SHA, ECTesterApplet.EXPORT_TRUE, data), sigCallback);
+ Test ecdsaTest = CommandTest.function(new Command.ECDSA_sign(this.card, CardConsts.KEYPAIR_LOCAL, EC_Consts.Signature_ALG_ECDSA_SHA, CardConsts.EXPORT_TRUE, data), sigCallback);
testVector.add(CompoundTest.all(ExpectedValue.SUCCESS, "Test.", ecdhTest, ecdhRawTest, ecdsaTest));
if (cfg.cleanup) {
testVector.add(CommandTest.expect(new Command.Cleanup(this.card), ExpectedValue.ANY));
diff --git a/src/cz/crcs/ectester/reader/test/CardTwistSuite.java b/reader/src/main/java/cz/crcs/ectester/reader/test/CardTwistSuite.java
index a6bca6c..5c35be7 100644
--- a/src/cz/crcs/ectester/reader/test/CardTwistSuite.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/test/CardTwistSuite.java
@@ -1,13 +1,13 @@
package cz.crcs.ectester.reader.test;
-import cz.crcs.ectester.applet.ECTesterApplet;
-import cz.crcs.ectester.applet.EC_Consts;
+import cz.crcs.ectester.common.ec.EC_Consts;
import cz.crcs.ectester.common.ec.EC_Curve;
import cz.crcs.ectester.common.ec.EC_Key;
import cz.crcs.ectester.common.output.TestWriter;
import cz.crcs.ectester.common.test.CompoundTest;
import cz.crcs.ectester.common.test.Result;
import cz.crcs.ectester.common.test.Test;
+import cz.crcs.ectester.common.util.CardConsts;
import cz.crcs.ectester.common.util.CardUtil;
import cz.crcs.ectester.data.EC_Store;
import cz.crcs.ectester.reader.CardMngr;
@@ -34,22 +34,22 @@ public class CardTwistSuite extends CardTestSuite {
EC_Curve curve = e.getKey();
List<EC_Key.Public> keys = e.getValue();
- Test allocate = runTest(CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), Result.ExpectedValue.SUCCESS));
+ Test allocate = runTest(CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_BOTH, curve.getBits(), curve.getField()), Result.ExpectedValue.SUCCESS));
if (!allocate.ok()) {
doTest(CompoundTest.all(Result.ExpectedValue.SUCCESS, "No support for " + curve.getId() + ".", allocate));
continue;
}
- Test set = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Result.ExpectedValue.SUCCESS);
- Test generate = CommandTest.expect(new Command.Generate(this.card, ECTesterApplet.KEYPAIR_LOCAL), Result.ExpectedValue.SUCCESS);
+ Test set = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Result.ExpectedValue.SUCCESS);
+ Test generate = CommandTest.expect(new Command.Generate(this.card, CardConsts.KEYPAIR_LOCAL), Result.ExpectedValue.SUCCESS);
Test prepare = CompoundTest.all(Result.ExpectedValue.SUCCESS, "Prepare and generate keypair on " + curve.getId() + ".", allocate, set, generate);
List<Test> ecdhTests = new LinkedList<>();
for (EC_Key.Public pub : keys) {
- Test setPub = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, pub.getParams(), pub.flatten()), Result.ExpectedValue.FAILURE);
- Test ecdh = CommandTest.expect(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), Result.ExpectedValue.FAILURE, "Card correctly rejected point on twist.", "Card incorrectly accepted point on twist.");
+ Test setPub = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_REMOTE, EC_Consts.CURVE_external, pub.getParams(), pub.flatten()), Result.ExpectedValue.FAILURE);
+ Test ecdh = CommandTest.expect(new Command.ECDH(this.card, CardConsts.KEYPAIR_REMOTE, CardConsts.KEYPAIR_LOCAL, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), Result.ExpectedValue.FAILURE, "Card correctly rejected point on twist.", "Card incorrectly accepted point on twist.");
Test objectEcdh = CompoundTest.any(Result.ExpectedValue.SUCCESS, CardUtil.getKATypeString(EC_Consts.KeyAgreement_ALG_EC_SVDP_DH) + " test with twist pubkey.", setPub, ecdh);
- Command ecdhCommand = new Command.ECDH_direct(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH, pub.flatten());
+ Command ecdhCommand = new Command.ECDH_direct(this.card, CardConsts.KEYPAIR_LOCAL, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH, pub.flatten());
Test rawEcdh = CommandTest.expect(ecdhCommand, Result.ExpectedValue.FAILURE, "Card correctly rejected point on twist.", "Card incorrectly accepted point on twist.");
ecdhTests.add(CompoundTest.all(Result.ExpectedValue.SUCCESS, pub.getId() + " twist key test.", objectEcdh, rawEcdh));
}
diff --git a/src/cz/crcs/ectester/reader/test/CardWrongSuite.java b/reader/src/main/java/cz/crcs/ectester/reader/test/CardWrongSuite.java
index 13a3f8b..0b030b8 100644
--- a/src/cz/crcs/ectester/reader/test/CardWrongSuite.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/test/CardWrongSuite.java
@@ -1,7 +1,6 @@
package cz.crcs.ectester.reader.test;
-import cz.crcs.ectester.applet.ECTesterApplet;
-import cz.crcs.ectester.applet.EC_Consts;
+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.output.TestWriter;
@@ -9,13 +8,13 @@ import cz.crcs.ectester.common.test.CompoundTest;
import cz.crcs.ectester.common.test.Result;
import cz.crcs.ectester.common.test.Test;
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.data.EC_Store;
import cz.crcs.ectester.reader.CardMngr;
import cz.crcs.ectester.reader.ECTesterReader;
import cz.crcs.ectester.reader.command.Command;
-import javacard.security.KeyPair;
import java.math.BigInteger;
import java.util.LinkedList;
@@ -43,21 +42,21 @@ public class CardWrongSuite extends CardTestSuite {
for (Map.Entry<String, EC_Curve> e : curves.entrySet()) {
EC_Curve curve = e.getValue();
List<Test> tests = new LinkedList<>();
- Test key = runTest(CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS));
+ Test key = runTest(CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_BOTH, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS));
if (!key.ok()) {
doTest(CompoundTest.all(ExpectedValue.FAILURE, "No support for " + curve.getBits() + "b " + CardUtil.getKeyTypeString(curve.getField()), key));
continue;
}
tests.add(key);
- Test set = runTest(CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.FAILURE));
- Test generate = runTest(setupKeypairs(curve, ExpectedValue.SUCCESS, ECTesterApplet.KEYPAIR_BOTH));
+ Test set = runTest(CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.FAILURE));
+ Test generate = runTest(setupKeypairs(curve, ExpectedValue.SUCCESS, CardConsts.KEYPAIR_BOTH));
Test setup = runTest(CompoundTest.any(ExpectedValue.SUCCESS, "Set wrong curve and generate keypairs.", set, generate));
tests.add(setup);
for (byte kaType : EC_Consts.KA_TYPES) {
Test allocate = runTest(CommandTest.expect(new Command.AllocateKeyAgreement(this.card, kaType), ExpectedValue.SUCCESS));
if (allocate.ok()) {
- Test ka = runTest(CommandTest.expect(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, kaType), ExpectedValue.FAILURE));
+ Test ka = runTest(CommandTest.expect(new Command.ECDH(this.card, CardConsts.KEYPAIR_REMOTE, CardConsts.KEYPAIR_LOCAL, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, kaType), ExpectedValue.FAILURE));
Test kaTest = runTest(CompoundTest.all(ExpectedValue.SUCCESS, "Allocate and perform KA.", allocate, ka));
tests.add(kaTest);
}
@@ -82,52 +81,46 @@ public class CardWrongSuite extends CardTestSuite {
*/
Random r = new Random();
for (short keyLength : EC_Consts.FP_SIZES) {
- byte curve = EC_Consts.getCurve(keyLength, KeyPair.ALG_EC_FP);
- Test key = runTest(CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_BOTH, keyLength, KeyPair.ALG_EC_FP), ExpectedValue.SUCCESS));
+ byte curve = EC_Consts.getCurve(keyLength, EC_Consts.ALG_EC_FP);
+ Test key = runTest(CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_BOTH, keyLength, EC_Consts.ALG_EC_FP), ExpectedValue.SUCCESS));
if (!key.ok()) {
doTest(CompoundTest.all(ExpectedValue.FAILURE, "No support for " + keyLength + "b ALG_EC_FP.", key));
continue;
}
- Test set = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, curve, EC_Consts.PARAMETERS_DOMAIN_FP, null), ExpectedValue.SUCCESS);
+ Test set = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, curve, EC_Consts.PARAMETERS_DOMAIN_FP, null), ExpectedValue.SUCCESS);
Test setup = CompoundTest.all(ExpectedValue.SUCCESS, "KeyPair setup.", key, set);
- Test prime0 = ecdhTest(new Command.Transform(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.KEY_BOTH, EC_Consts.PARAMETER_FP, EC_Consts.TRANSFORMATION_ZERO), "Set p = 0.", "ECDH with p = 0.");
- Test prime1 = ecdhTest(new Command.Transform(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.KEY_BOTH, EC_Consts.PARAMETER_FP, EC_Consts.TRANSFORMATION_ONE), "Set p = 1.", "ECDH with p = 1.");
+ Test prime0 = ecdhTest(new Command.Transform(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.KEY_BOTH, EC_Consts.PARAMETER_FP, EC_Consts.TRANSFORMATION_ZERO), "Set p = 0.", "ECDH with p = 0.");
+ Test prime1 = ecdhTest(new Command.Transform(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.KEY_BOTH, EC_Consts.PARAMETER_FP, EC_Consts.TRANSFORMATION_ONE), "Set p = 1.", "ECDH with p = 1.");
short keyHalf = (short) (keyLength / 2);
BigInteger prime = new BigInteger(keyHalf, 50, r);
BigInteger primePow = prime.pow(2);
byte[] primePowBytes = ECUtil.toByteArray(primePow, keyLength);
EC_Params primePowData = new EC_Params(EC_Consts.PARAMETER_FP, new byte[][]{primePowBytes});
- Test primePower = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, primePowData.getParams(), primePowData.flatten()), "Set p = square of a prime.", "ECDH with p = q^2.");
+ Test primePower = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, primePowData.getParams(), primePowData.flatten()), "Set p = square of a prime.", "ECDH with p = q^2.");
BigInteger q = new BigInteger(keyHalf, r);
BigInteger s = new BigInteger(keyHalf, r);
BigInteger compositeValue = q.multiply(s);
byte[] compositeBytes = ECUtil.toByteArray(compositeValue, keyLength);
EC_Params compositeData = new EC_Params(EC_Consts.PARAMETER_FP, new byte[][]{compositeBytes});
- Test composite = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, compositeData.getParams(), compositeData.flatten()), "Set p = product of two primes.", "ECDH with p = q * s.");
+ Test composite = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, compositeData.getParams(), compositeData.flatten()), "Set p = product of two primes.", "ECDH with p = q * s.");
Test wrongPrime = CompoundTest.all(ExpectedValue.SUCCESS, "Tests with corrupted prime parameter.", prime0, prime1, primePower, composite);
Test resetSetup = CompoundTest.all(ExpectedValue.SUCCESS, "Reset keypair.", set.clone());
- Test randomG = ecdhTest(new Command.Transform(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.KEY_BOTH, EC_Consts.PARAMETER_G, (short) (EC_Consts.TRANSFORMATION_FULLRANDOM | EC_Consts.TRANSFORMATION_04_MASK)), "Set G = random non-point/point-like.", "ECDH with non-point G.");
- Test fullRandomG = ecdhTest(new Command.Transform(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.KEY_BOTH, EC_Consts.PARAMETER_G, EC_Consts.TRANSFORMATION_FULLRANDOM), "Set G = random data.", "ECDH with G = random data.");
- Test zeroG = ecdhTest(new Command.Transform(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.KEY_BOTH, EC_Consts.PARAMETER_G, EC_Consts.TRANSFORMATION_INFINITY), "Set G = inifnity.", "ECDH with G = infinity.");
+ Test randomG = ecdhTest(new Command.Transform(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.KEY_BOTH, EC_Consts.PARAMETER_G, (short) (EC_Consts.TRANSFORMATION_FULLRANDOM | EC_Consts.TRANSFORMATION_04_MASK)), "Set G = random non-point/point-like.", "ECDH with non-point G.");
+ Test fullRandomG = ecdhTest(new Command.Transform(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.KEY_BOTH, EC_Consts.PARAMETER_G, EC_Consts.TRANSFORMATION_FULLRANDOM), "Set G = random data.", "ECDH with G = random data.");
+ Test zeroG = ecdhTest(new Command.Transform(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.KEY_BOTH, EC_Consts.PARAMETER_G, EC_Consts.TRANSFORMATION_INFINITY), "Set G = inifnity.", "ECDH with G = infinity.");
Test wrongG = CompoundTest.all(ExpectedValue.SUCCESS, "Tests with corrupted G parameter.", randomG, fullRandomG, zeroG);
- byte[] originalR = new byte[((keyLength + 7) / 8) + 1];
- short origRlen = EC_Consts.getCurveParameter(curve, EC_Consts.PARAMETER_R, originalR, (short) 0);
- if (origRlen != originalR.length) {
- byte[] copyR = new byte[origRlen];
- System.arraycopy(originalR, 0, copyR, 0, origRlen);
- originalR = copyR;
- }
+ byte[] originalR = EC_Consts.getCurveParameter(curve, EC_Consts.PARAMETER_R);
BigInteger originalBigR = new BigInteger(1, originalR);
- Test zeroR = ecdhTest(new Command.Transform(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, EC_Consts.PARAMETER_R, EC_Consts.TRANSFORMATION_ZERO), "Set R = 0.", "ECDH with R = 0.");
- Test oneR = ecdhTest(new Command.Transform(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, EC_Consts.PARAMETER_R, EC_Consts.TRANSFORMATION_ONE), "Set R = 1.", "ECDH with R = 1.");
+ Test zeroR = ecdhTest(new Command.Transform(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, EC_Consts.PARAMETER_R, EC_Consts.TRANSFORMATION_ZERO), "Set R = 0.", "ECDH with R = 0.");
+ Test oneR = ecdhTest(new Command.Transform(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, EC_Consts.PARAMETER_R, EC_Consts.TRANSFORMATION_ONE), "Set R = 1.", "ECDH with R = 1.");
BigInteger prevPrimeR;
do {
@@ -135,31 +128,31 @@ public class CardWrongSuite extends CardTestSuite {
} while (prevPrimeR.compareTo(originalBigR) >= 0);
byte[] prevRBytes = ECUtil.toByteArray(prevPrimeR, keyLength);
EC_Params prevRData = new EC_Params(EC_Consts.PARAMETER_R, new byte[][]{prevRBytes});
- Test prevprimeWrongR = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, prevRData.getParams(), prevRData.flatten()), "Set R = some prime (but [r]G != infinity) smaller than original R.", "ECDH with wrong R, prevprime.");
+ Test prevprimeWrongR = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, prevRData.getParams(), prevRData.flatten()), "Set R = some prime (but [r]G != infinity) smaller than original R.", "ECDH with wrong R, prevprime.");
BigInteger nextPrimeR = originalBigR.nextProbablePrime();
byte[] nextRBytes = ECUtil.toByteArray(nextPrimeR, keyLength);
EC_Params nextRData = new EC_Params(EC_Consts.PARAMETER_R, new byte[][]{nextRBytes});
- Test nextprimeWrongR = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, nextRData.getParams(), nextRData.flatten()), "Set R = some prime (but [r]G != infinity) larger than original R.", "ECDH with wrong R, nextprime.");
+ Test nextprimeWrongR = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, nextRData.getParams(), nextRData.flatten()), "Set R = some prime (but [r]G != infinity) larger than original R.", "ECDH with wrong R, nextprime.");
byte[] nonprimeRBytes = nextRBytes.clone();
nonprimeRBytes[nonprimeRBytes.length - 1] ^= 1;
EC_Params nonprimeWrongRData = new EC_Params(EC_Consts.PARAMETER_R, new byte[][]{nonprimeRBytes});
- Test nonprimeWrongR = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, nonprimeWrongRData.getParams(), nonprimeWrongRData.flatten()), "Set R = some composite (but [r]G != infinity).", "ECDH with wrong R, composite.");
+ Test nonprimeWrongR = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, nonprimeWrongRData.getParams(), nonprimeWrongRData.flatten()), "Set R = some composite (but [r]G != infinity).", "ECDH with wrong R, composite.");
Test wrongR = CompoundTest.all(ExpectedValue.SUCCESS, "Tests with corrupted R parameter.", zeroR, oneR, prevprimeWrongR, nextprimeWrongR, nonprimeWrongR);
byte[] kRaw = new byte[]{(byte) 0xff};
EC_Params kData = new EC_Params(EC_Consts.PARAMETER_K, new byte[][]{kRaw});
- Test bigK = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, kData.getParams(), kData.flatten()), "", "");
+ Test bigK = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, kData.getParams(), kData.flatten()), "", "");
byte[] kZero = new byte[]{(byte) 0};
EC_Params kZeroData = new EC_Params(EC_Consts.PARAMETER_K, new byte[][]{kZero});
- Test zeroK = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, kZeroData.getParams(), kZeroData.flatten()), "", "");
+ Test zeroK = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, kZeroData.getParams(), kZeroData.flatten()), "", "");
Test wrongK = CompoundTest.all(ExpectedValue.SUCCESS, "Tests with corrupted K parameter.", bigK, zeroK);
- doTest(CompoundTest.all(ExpectedValue.SUCCESS, "Tests of " + keyLength + "b " + CardUtil.getKeyTypeString(KeyPair.ALG_EC_FP), setup, wrongPrime, resetSetup, wrongG, resetSetup.clone(), wrongR, resetSetup.clone(), wrongK, resetSetup.clone()));
+ doTest(CompoundTest.all(ExpectedValue.SUCCESS, "Tests of " + keyLength + "b " + CardUtil.getKeyTypeString(EC_Consts.ALG_EC_FP), setup, wrongPrime, resetSetup, wrongG, resetSetup.clone(), wrongR, resetSetup.clone(), wrongK, resetSetup.clone()));
}
/*
@@ -168,16 +161,16 @@ public class CardWrongSuite extends CardTestSuite {
* - e1 = e2 = e3 = 0
*/
for (short keyLength : EC_Consts.F2M_SIZES) {
- byte curve = EC_Consts.getCurve(keyLength, KeyPair.ALG_EC_F2M);
- Test key = runTest(CommandTest.expect(new Command.Allocate(this.card, ECTesterApplet.KEYPAIR_BOTH, keyLength, KeyPair.ALG_EC_F2M), ExpectedValue.SUCCESS));
+ byte curve = EC_Consts.getCurve(keyLength, EC_Consts.ALG_EC_F2M);
+ Test key = runTest(CommandTest.expect(new Command.Allocate(this.card, CardConsts.KEYPAIR_BOTH, keyLength, EC_Consts.ALG_EC_F2M), ExpectedValue.SUCCESS));
if (!key.ok()) {
doTest(CompoundTest.all(ExpectedValue.FAILURE, "No support for " + keyLength + "b ALG_EC_F2M.", key));
continue;
}
- Test set = CommandTest.expect(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, curve, EC_Consts.PARAMETERS_DOMAIN_F2M, null), ExpectedValue.SUCCESS);
+ Test set = CommandTest.expect(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, curve, EC_Consts.PARAMETERS_DOMAIN_F2M, null), ExpectedValue.SUCCESS);
Test setup = CompoundTest.all(ExpectedValue.SUCCESS, "KeyPair setup.", key, set);
- Test coeff0 = ecdhTest(new Command.Transform(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.KEY_BOTH, EC_Consts.PARAMETER_F2M, EC_Consts.TRANSFORMATION_ZERO), "Set e1 = e2 = e3 = 0.", "ECDH with wrong field polynomial: x^" + keyLength);
+ Test coeff0 = ecdhTest(new Command.Transform(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.KEY_BOTH, EC_Consts.PARAMETER_F2M, EC_Consts.TRANSFORMATION_ZERO), "Set e1 = e2 = e3 = 0.", "ECDH with wrong field polynomial: x^" + keyLength);
short e1 = (short) (2 * keyLength);
short e2 = (short) (3 * keyLength);
@@ -188,10 +181,10 @@ public class CardWrongSuite extends CardTestSuite {
ByteUtil.shortToBytes(e2),
ByteUtil.shortToBytes(e3)};
EC_Params coeffParams = new EC_Params(EC_Consts.PARAMETER_F2M, coeffBytes);
- Test coeffLarger = ecdhTest(new Command.Set(this.card, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, coeffParams.getParams(), coeffParams.flatten()), "Set e1=" + e1 + ", e2=" + e2 + ", e3=" + e3, "ECDH with wrong field poly, powers larger than " + keyLength);
+ Test coeffLarger = ecdhTest(new Command.Set(this.card, CardConsts.KEYPAIR_BOTH, EC_Consts.CURVE_external, coeffParams.getParams(), coeffParams.flatten()), "Set e1=" + e1 + ", e2=" + e2 + ", e3=" + e3, "ECDH with wrong field poly, powers larger than " + keyLength);
Test wrong = CompoundTest.all(ExpectedValue.SUCCESS, "Tests with corrupted field polynomial parameter.", coeff0, coeffLarger);
- doTest(CompoundTest.all(ExpectedValue.SUCCESS, "Tests of " + keyLength + "b " + CardUtil.getKeyTypeString(KeyPair.ALG_EC_F2M), setup, wrong));
+ doTest(CompoundTest.all(ExpectedValue.SUCCESS, "Tests of " + keyLength + "b " + CardUtil.getKeyTypeString(EC_Consts.ALG_EC_F2M), setup, wrong));
}
/*
@@ -205,10 +198,10 @@ public class CardWrongSuite extends CardTestSuite {
private Test ecdhTest(Command setupCmd, String prepareDesc, String fullDesc) {
Test setup = CommandTest.expect(setupCmd, ExpectedValue.FAILURE);
- Test generate = CommandTest.expect(new Command.Generate(this.card, ECTesterApplet.KEYPAIR_BOTH), ExpectedValue.FAILURE);
+ Test generate = CommandTest.expect(new Command.Generate(this.card, CardConsts.KEYPAIR_BOTH), ExpectedValue.FAILURE);
Test preparePhase = CompoundTest.any(ExpectedValue.SUCCESS, prepareDesc, setup, generate);
Test allocateECDH = CommandTest.expect(new Command.AllocateKeyAgreement(this.card, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), ExpectedValue.SUCCESS);
- Test ecdh = CommandTest.expect(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), ExpectedValue.FAILURE);
+ Test ecdh = CommandTest.expect(new Command.ECDH(this.card, CardConsts.KEYPAIR_LOCAL, CardConsts.KEYPAIR_REMOTE, CardConsts.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), ExpectedValue.FAILURE);
return CompoundTest.function((tests) -> {
diff --git a/src/cz/crcs/ectester/reader/test/CommandTest.java b/reader/src/main/java/cz/crcs/ectester/reader/test/CommandTest.java
index b05d3e4..b05d3e4 100644
--- a/src/cz/crcs/ectester/reader/test/CommandTest.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/test/CommandTest.java
diff --git a/src/cz/crcs/ectester/reader/test/CommandTestable.java b/reader/src/main/java/cz/crcs/ectester/reader/test/CommandTestable.java
index f670534..f670534 100644
--- a/src/cz/crcs/ectester/reader/test/CommandTestable.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/test/CommandTestable.java
diff --git a/src/cz/crcs/ectester/reader/test/PerformanceTest.java b/reader/src/main/java/cz/crcs/ectester/reader/test/PerformanceTest.java
index f9cba46..a725dc2 100644
--- a/src/cz/crcs/ectester/reader/test/PerformanceTest.java
+++ b/reader/src/main/java/cz/crcs/ectester/reader/test/PerformanceTest.java
@@ -1,10 +1,10 @@
package cz.crcs.ectester.reader.test;
-import cz.crcs.ectester.applet.ECTesterApplet;
import cz.crcs.ectester.common.test.Result;
import cz.crcs.ectester.common.test.SimpleTest;
import cz.crcs.ectester.common.test.TestCallback;
import cz.crcs.ectester.common.test.TestException;
+import cz.crcs.ectester.common.util.CardConsts;
import cz.crcs.ectester.reader.CardMngr;
import cz.crcs.ectester.reader.command.Command;
import cz.crcs.ectester.reader.response.Response;
@@ -56,7 +56,7 @@ public class PerformanceTest extends SimpleTest<CommandTestable> {
protected void runSelf() {
long baseTime;
try {
- new Command.SetDryRunMode(cardManager, ECTesterApplet.MODE_DRY_RUN).send();
+ new Command.SetDryRunMode(cardManager, CardConsts.MODE_DRY_RUN).send();
testable.run();
baseTime = testable.getResponse().getDuration();
testable.reset();
@@ -64,7 +64,7 @@ public class PerformanceTest extends SimpleTest<CommandTestable> {
baseTime += testable.getResponse().getDuration();
testable.reset();
baseTime /= 2;
- new Command.SetDryRunMode(cardManager, ECTesterApplet.MODE_NORMAL).send();
+ new Command.SetDryRunMode(cardManager, CardConsts.MODE_NORMAL).send();
} catch (CardException ce) {
throw new TestException(ce);
}
diff --git a/settings.gradle.kts b/settings.gradle.kts
new file mode 100644
index 0000000..9e6c60e
--- /dev/null
+++ b/settings.gradle.kts
@@ -0,0 +1,12 @@
+/*
+ * The settings file is used to specify which projects to include in your build.
+ * For more detailed information on multi-project builds, please refer to https://docs.gradle.org/8.6/userguide/multi_project_builds.html in the Gradle documentation.
+ */
+
+plugins {
+ // Apply the foojay-resolver plugin to allow automatic download of JDKs
+ id("org.gradle.toolchains.foojay-resolver-convention") version "0.7.0"
+}
+
+rootProject.name = "ECTester"
+include("common", "applet", "reader", "standalone")
diff --git a/src/cz/crcs/ectester/standalone/libs/MatrixsslLib.java b/src/cz/crcs/ectester/standalone/libs/MatrixsslLib.java
deleted file mode 100644
index fcc13ea..0000000
--- a/src/cz/crcs/ectester/standalone/libs/MatrixsslLib.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package cz.crcs.ectester.standalone.libs;
-
-import java.security.Provider;
-import java.util.Set;
-
-/**
- * @author Jan Jancar johny@neuromancer.sk
- */
-public class MatrixsslLib extends NativeECLibrary {
-
- public MatrixsslLib() {
- super("matrixssl_provider");
- }
-
- @Override
- native Provider createProvider();
-
- @Override
- public native Set<String> getCurves();
-}
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/.gitignore b/src/cz/crcs/ectester/standalone/libs/jni/.gitignore
deleted file mode 100644
index 7e8075a..0000000
--- a/src/cz/crcs/ectester/standalone/libs/jni/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-libcore_s.a
-libcrypt_s.a
-matrixssl/
-
-CMakeLists.txt
-cmake-build-debug \ No newline at end of file
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/matrixssl.c b/src/cz/crcs/ectester/standalone/libs/jni/matrixssl.c
deleted file mode 100644
index 8324dd4..0000000
--- a/src/cz/crcs/ectester/standalone/libs/jni/matrixssl.c
+++ /dev/null
@@ -1,397 +0,0 @@
-#include "native.h"
-#include <string.h>
-#include <stdio.h>
-
-#include <cryptoApi.h>
-#include <coreApi.h>
-
-#include "c_utils.h"
-#include "c_timing.h"
-
-static jclass provider_class;
-
-
-JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MatrixsslLib_createProvider(JNIEnv *env, jobject this) {
- /* Create the custom provider. */
- jclass local_provider_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeProvider$Matrixssl");
- provider_class = (*env)->NewGlobalRef(env, local_provider_class);
-
- jmethodID init = (*env)->GetMethodID(env, local_provider_class, "<init>", "(Ljava/lang/String;DLjava/lang/String;)V");
-
- jstring name = (*env)->NewStringUTF(env, "MatrixSSL");
- double version = 4.1;
-
- return (*env)->NewObject(env, provider_class, init, name, version, name);
-}
-
-JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Matrixssl_setup(JNIEnv *env, jobject this) {
- INIT_PROVIDER(env, provider_class);
-
- ADD_KPG(env, this, "EC", "Matrixssl");
- ADD_KA(env, this, "ECDH", "MatrixsslECDH");
- ADD_SIG(env, this, "NONEwithECDSA", "MatrixsslECDSAwithNONE");
-
- psCoreOpen(PSCORE_CONFIG);
- psOpenPrng();
-
- init_classes(env, "Matrixssl");
-}
-
-
-JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MatrixsslLib_getCurves(JNIEnv *env, jobject this) {
- jclass hash_set_class = (*env)->FindClass(env, "java/util/TreeSet");
-
- jmethodID hash_set_ctr = (*env)->GetMethodID(env, hash_set_class, "<init>", "()V");
- jmethodID hash_set_add = (*env)->GetMethodID(env, hash_set_class, "add", "(Ljava/lang/Object;)Z");
-
- jobject result = (*env)->NewObject(env, hash_set_class, hash_set_ctr);
- size_t i = 0;
- while (eccCurves[i].size > 0) {
- jstring curve_name = (*env)->NewStringUTF(env, eccCurves[i].name);
- (*env)->CallBooleanMethod(env, result, hash_set_add, curve_name);
- i++;
- }
- return result;
-}
-
-JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Matrixssl_keysizeSupported(JNIEnv *env, jobject this, jint keysize) {
- size_t i = 0;
- while (eccCurves[i].size > 0) {
- if (eccCurves[i].size * 8 == keysize) {
- return JNI_TRUE;
- }
- i++;
- }
- return JNI_FALSE;
-}
-
-JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Matrixssl_paramsSupported(JNIEnv *env, jobject this, jobject params) {
- if (params == NULL) {
- return JNI_FALSE;
- }
-
- if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) {
- jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;");
- jobject curve = (*env)->CallObjectMethod(env, params, get_curve);
-
- jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;");
- jobject field = (*env)->CallObjectMethod(env, curve, get_field);
- if ((*env)->IsInstanceOf(env, field, f2m_field_class)) {
- return JNI_FALSE;
- }
- return JNI_TRUE;
- } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) {
- jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
- jstring name = (*env)->CallObjectMethod(env, params, get_name);
- const char *utf_name = (*env)->GetStringUTFChars(env, name, NULL);
- size_t i = 0;
- while (eccCurves[i].size > 0) {
- if (strcasecmp(utf_name, eccCurves[i].name) == 0) {
- (*env)->ReleaseStringUTFChars(env, name, utf_name);
- return JNI_TRUE;
- }
- i++;
- }
- (*env)->ReleaseStringUTFChars(env, name, utf_name);
- return JNI_FALSE;
- } else {
- return JNI_FALSE;
- }
-}
-
-
-static jobject create_ec_param_spec(JNIEnv *env, const psEccCurve_t *curve) {
- jmethodID biginteger_init = (*env)->GetMethodID(env, biginteger_class, "<init>", "(Ljava/lang/String;I)V");
-
- jstring p_string = (*env)->NewStringUTF(env, curve->prime);
- jobject p = (*env)->NewObject(env, biginteger_class, biginteger_init, p_string, (jint) 16);
-
- jmethodID fp_field_init = (*env)->GetMethodID(env, fp_field_class, "<init>", "(Ljava/math/BigInteger;)V");
- jobject field = (*env)->NewObject(env, fp_field_class, fp_field_init, p);
-
- jstring a_string = (*env)->NewStringUTF(env, curve->A);
- jobject a = (*env)->NewObject(env, biginteger_class, biginteger_init, a_string, (jint) 16);
- jstring b_string = (*env)->NewStringUTF(env, curve->B);
- jobject b = (*env)->NewObject(env, biginteger_class, biginteger_init, b_string, (jint) 16);
-
- jmethodID elliptic_curve_init = (*env)->GetMethodID(env, elliptic_curve_class, "<init>", "(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;)V");
- jobject elliptic_curve = (*env)->NewObject(env, elliptic_curve_class, elliptic_curve_init, field, a, b);
-
- jstring gx_string = (*env)->NewStringUTF(env, curve->Gx);
- jstring gy_string = (*env)->NewStringUTF(env, curve->Gy);
- jobject gx = (*env)->NewObject(env, biginteger_class, biginteger_init, gx_string, (jint) 16);
- jobject gy = (*env)->NewObject(env, biginteger_class, biginteger_init, gy_string, (jint) 16);
-
- jmethodID point_init = (*env)->GetMethodID(env, point_class, "<init>", "(Ljava/math/BigInteger;Ljava/math/BigInteger;)V");
- jobject g = (*env)->NewObject(env, point_class, point_init, gx, gy);
-
- jstring n_string = (*env)->NewStringUTF(env, curve->order);
- jobject n = (*env)->NewObject(env, biginteger_class, biginteger_init, n_string, (jint) 16);
-
- jmethodID ec_parameter_spec_init = (*env)->GetMethodID(env, ec_parameter_spec_class, "<init>", "(Ljava/security/spec/EllipticCurve;Ljava/security/spec/ECPoint;Ljava/math/BigInteger;I)V");
- return (*env)->NewObject(env, ec_parameter_spec_class, ec_parameter_spec_init, elliptic_curve, g, n, (jint) 1);
-}
-
-static psEccCurve_t *create_curve(JNIEnv *env, jobject params) {
- psEccCurve_t *curve = calloc(sizeof(psEccCurve_t), 1);
-
- jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;");
- jobject elliptic_curve = (*env)->CallObjectMethod(env, params, get_curve);
-
- jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;");
- jobject field = (*env)->CallObjectMethod(env, elliptic_curve, get_field);
-
- jmethodID get_bits = (*env)->GetMethodID(env, fp_field_class, "getFieldSize", "()I");
- jint bits = (*env)->CallIntMethod(env, field, get_bits);
- jint bytes = (bits + 7) / 8;
- curve->size = bytes;
-
- jmethodID get_p = (*env)->GetMethodID(env, fp_field_class, "getP", "()Ljava/math/BigInteger;");
- jobject p = (*env)->CallObjectMethod(env, field, get_p);
-
- jmethodID get_a = (*env)->GetMethodID(env, elliptic_curve_class, "getA", "()Ljava/math/BigInteger;");
- jobject a = (*env)->CallObjectMethod(env, elliptic_curve, get_a);
-
- jmethodID get_b = (*env)->GetMethodID(env, elliptic_curve_class, "getB", "()Ljava/math/BigInteger;");
- jobject b = (*env)->CallObjectMethod(env, elliptic_curve, get_b);
-
- jmethodID get_g = (*env)->GetMethodID(env, ec_parameter_spec_class, "getGenerator", "()Ljava/security/spec/ECPoint;");
- jobject g = (*env)->CallObjectMethod(env, params, get_g);
-
- jmethodID get_x = (*env)->GetMethodID(env, point_class, "getAffineX", "()Ljava/math/BigInteger;");
- jobject gx = (*env)->CallObjectMethod(env, g, get_x);
-
- jmethodID get_y = (*env)->GetMethodID(env, point_class, "getAffineY", "()Ljava/math/BigInteger;");
- jobject gy = (*env)->CallObjectMethod(env, g, get_y);
-
- jmethodID get_n = (*env)->GetMethodID(env, ec_parameter_spec_class, "getOrder", "()Ljava/math/BigInteger;");
- jobject n = (*env)->CallObjectMethod(env, params, get_n);
-
- //jmethodID get_h = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCofactor", "()I");
- //jint h = (*env)->CallIntMethod(env, params, get_h);
-
- jmethodID get_bitlength = (*env)->GetMethodID(env, biginteger_class, "bitLength", "()I");
- jint ord_bits = (*env)->CallIntMethod(env, n, get_bitlength);
- jint ord_bytes = (ord_bits + 7) / 8;
-
- curve->prime = biginteger_to_hex(env, p, bytes);
- curve->A = biginteger_to_hex(env, a, bytes);
- curve->B = biginteger_to_hex(env, b, bytes);
- curve->Gx = biginteger_to_hex(env, gx, bytes);
- curve->Gy = biginteger_to_hex(env, gy, bytes);
- curve->order = biginteger_to_hex(env, n, ord_bytes);
- return curve;
-}
-
-static void free_curve(psEccCurve_t *curve) {
- free((char *)curve->prime);
- free((char *)curve->A);
- free((char *)curve->B);
- free((char *)curve->order);
- free((char *)curve->Gx);
- free((char *)curve->Gy);
-}
-
-static jobject generate_from_curve(JNIEnv *env, const psEccCurve_t *curve) {
- psEccKey_t *key;
- int32_t err = psEccNewKey(NULL, &key, curve);
- err = psEccInitKey(NULL, key, curve);
-
- native_timing_start();
- err = psEccGenKey(NULL, key, curve, NULL);
- native_timing_stop();
-
- if (err < 0) {
- throw_new(env, "java/security/GeneralSecurityException", "Couldn't generate key.");
- psEccClearKey(key);
- psEccDeleteKey(&key);
- return NULL;
- }
-
- jbyteArray priv = (*env)->NewByteArray(env, pstm_unsigned_bin_size(&key->k));
- jbyte *priv_data = (*env)->GetByteArrayElements(env, priv, NULL);
- pstm_to_unsigned_bin(NULL, &key->k, (unsigned char *) priv_data);
- (*env)->ReleaseByteArrayElements(env, priv, priv_data, 0);
-
- jint xlen = pstm_unsigned_bin_size(&key->pubkey.x);
- jint ylen = pstm_unsigned_bin_size(&key->pubkey.y);
- jbyteArray pub = (*env)->NewByteArray(env, 1 + xlen + ylen);
- jbyte *pub_data = (*env)->GetByteArrayElements(env, pub, NULL);
- pub_data[0] = 0x04;
- pstm_to_unsigned_bin(NULL, &key->pubkey.x, (unsigned char *) (pub_data + 1));
- pstm_to_unsigned_bin(NULL, &key->pubkey.y, (unsigned char *) (pub_data + 1 + xlen));
- (*env)->ReleaseByteArrayElements(env, pub, pub_data, 0);
-
- jobject ec_param_spec = create_ec_param_spec(env, curve);
-
- jobject ec_pub_param_spec = (*env)->NewLocalRef(env, ec_param_spec);
- jmethodID ec_pub_init = (*env)->GetMethodID(env, pubkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V");
- jobject pubkey = (*env)->NewObject(env, pubkey_class, ec_pub_init, pub, ec_pub_param_spec);
-
- jobject ec_priv_param_spec = (*env)->NewLocalRef(env, ec_param_spec);
- jmethodID ec_priv_init = (*env)->GetMethodID(env, privkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V");
- jobject privkey = (*env)->NewObject(env, privkey_class, ec_priv_init, priv, ec_priv_param_spec);
-
- jmethodID keypair_init = (*env)->GetMethodID(env, keypair_class, "<init>", "(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V");
-
- psEccDeleteKey(&key);
-
- return (*env)->NewObject(env, keypair_class, keypair_init, pubkey, privkey);
-}
-
-JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Matrixssl_generate__ILjava_security_SecureRandom_2(JNIEnv *env, jobject this, jint keysize, jobject random) {
- size_t i = 0;
- while (eccCurves[i].size > 0) {
- if (eccCurves[i].size * 8 == keysize) {
- return generate_from_curve(env, &eccCurves[i]);
- }
- i++;
- }
- return NULL;
-}
-
-JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Matrixssl_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2(JNIEnv *env, jobject this, jobject params, jobject random) {
- if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) {
- psEccCurve_t *curve = create_curve(env, params);
- jobject result = generate_from_curve(env, curve);
- free_curve(curve);
- return result;
- } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) {
- jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
- jstring name = (*env)->CallObjectMethod(env, params, get_name);
- const char* utf_name = (*env)->GetStringUTFChars(env, name, NULL);
- size_t i = 0;
- while (eccCurves[i].size > 0) {
- if (strcasecmp(utf_name, eccCurves[i].name) == 0) {
- break;
- }
- i++;
- }
- (*env)->ReleaseStringUTFChars(env, name, utf_name);
- return generate_from_curve(env, &eccCurves[i]);
- } else {
- return NULL;
- }
-}
-
-static psEccKey_t *bytearray_to_privkey(JNIEnv *env, jbyteArray privkey, const psEccCurve_t *curve) {
- psEccKey_t *result;
- psEccNewKey(NULL, &result, curve);
- psEccInitKey(NULL, result, curve);
-
- pstm_init_for_read_unsigned_bin(NULL, &result->k, curve->size);
- jint len = (*env)->GetArrayLength(env, privkey);
- jbyte *priv_data = (*env)->GetByteArrayElements(env, privkey, NULL);
- pstm_read_unsigned_bin(&result->k, (unsigned char *) priv_data, len);
- (*env)->ReleaseByteArrayElements(env, privkey, priv_data, JNI_ABORT);
- result->type = PS_PRIVKEY;
-
- return result;
-}
-
-static psEccKey_t *bytearray_to_pubkey(JNIEnv *env, jbyteArray pubkey, const psEccCurve_t *curve) {
- psEccKey_t *result;
- psEccNewKey(NULL, &result, curve);
- psEccInitKey(NULL, result, curve);
-
- pstm_init_for_read_unsigned_bin(NULL, &result->pubkey.x, curve->size);
- pstm_init_for_read_unsigned_bin(NULL, &result->pubkey.y, curve->size);
- pstm_init_for_read_unsigned_bin(NULL, &result->pubkey.z, curve->size);
- jbyte *pubkey_data = (*env)->GetByteArrayElements(env, pubkey, NULL);
- pstm_read_unsigned_bin(&result->pubkey.x, (unsigned char *) (pubkey_data + 1), curve->size);
- pstm_read_unsigned_bin(&result->pubkey.y, (unsigned char *) (pubkey_data + 1 + curve->size), curve->size);
- (*env)->ReleaseByteArrayElements(env, pubkey, pubkey_data, JNI_ABORT);
- pstm_set(&result->pubkey.z, 1);
- result->type = PS_PUBKEY;
-
- return result;
-}
-
-JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Matrixssl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2(JNIEnv *env, jobject this, jbyteArray pubkey, jbyteArray privkey, jobject params) {
- psEccCurve_t *curve = create_curve(env, params);
-
- psEccKey_t *priv = bytearray_to_privkey(env, privkey, curve);
- psEccKey_t *pub = bytearray_to_pubkey(env, pubkey, curve);
-
- jbyteArray result = (*env)->NewByteArray(env, curve->size);
- jbyte *result_data = (*env)->GetByteArrayElements(env, result, NULL);
- psSize_t outlen = curve->size;
-
- native_timing_start();
- int32_t err = psEccGenSharedSecret(NULL, priv, pub, (unsigned char *) result_data, &outlen, NULL);
- native_timing_stop();
- (*env)->ReleaseByteArrayElements(env, result, result_data, 0);
-
- psEccDeleteKey(&priv);
- psEccDeleteKey(&pub);
- free_curve(curve);
-
- if (err < 0) {
- throw_new(env, "java/security/GeneralSecurityException", "Couldn't derive secret.");
- return NULL;
- }
-
- return result;
-}
-
-JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Matrixssl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2(JNIEnv *env, jobject this, jbyteArray pubkey, jbyteArray privkey, jobject params, jstring algorithm) {
- throw_new(env, "java/lang/UnsupportedOperationException", "Not supported.");
- return NULL;
-}
-
-JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Matrixssl_sign(JNIEnv *env, jobject this, jbyteArray data, jbyteArray privkey, jobject params) {
- psEccCurve_t *curve = create_curve(env, params);
-
- psEccKey_t *priv = bytearray_to_privkey(env, privkey, curve);
-
- psSize_t siglen = 512;
- uint8_t sig[siglen];
-
- jint data_len = (*env)->GetArrayLength(env, data);
- jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL);
- native_timing_start();
- int32_t err = psEccDsaSign(NULL, priv, (unsigned char *) data_data, data_len, sig, &siglen, 0, NULL);
- native_timing_stop();
-
- psEccDeleteKey(&priv);
- free_curve(curve);
-
- if (err < 0) {
- throw_new(env, "java/security/GeneralSecurityException", "Couldn't sign data.");
- return NULL;
- }
-
- jbyteArray result = (*env)->NewByteArray(env, siglen);
- jbyte *result_data = (*env)->GetByteArrayElements(env, result, NULL);
- memcpy(result_data, sig, siglen);
- (*env)->ReleaseByteArrayElements(env, result, result_data, 0);
-
- return result;
-}
-
-JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Matrixssl_verify(JNIEnv *env, jobject this, jbyteArray signature, jbyteArray data, jbyteArray pubkey, jobject params) {
- psEccCurve_t *curve = create_curve(env, params);
- psEccKey_t *pub = bytearray_to_pubkey(env, pubkey, curve);
-
- jint data_len = (*env)->GetArrayLength(env, data);
- jint sig_len = (*env)->GetArrayLength(env, signature);
- jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL);
- jbyte *sig_data = (*env)->GetByteArrayElements(env, signature, NULL);
-
- int32_t result;
- native_timing_start();
- int32_t err = psEccDsaVerify(NULL, pub, (unsigned char *) data_data, data_len, (unsigned char *) sig_data, sig_len, &result, NULL);
- native_timing_stop();
- (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT);
- (*env)->ReleaseByteArrayElements(env, signature, sig_data, JNI_ABORT);
-
- free_curve(curve);
- psEccDeleteKey(&pub);
-
- if (err < 0) {
- throw_new(env, "java/security/GeneralSecurityException", "Couldn't verify signature.");
- return JNI_FALSE;
- }
-
- return result < 0 ? JNI_FALSE : JNI_TRUE;
-} \ No newline at end of file
diff --git a/standalone/build.gradle.kts b/standalone/build.gradle.kts
new file mode 100644
index 0000000..27764eb
--- /dev/null
+++ b/standalone/build.gradle.kts
@@ -0,0 +1,124 @@
+plugins {
+ application
+ jacoco
+ id("com.google.osdetector") version "1.7.3"
+ id("com.adarshr.test-logger") version "4.0.0"
+}
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ // Fallback to bundled wolfcrypt-jni if the submodule one is not built.
+ if (file("$rootDir/ext/wolfcrypt-jni/lib/wolfcrypt-jni.jar").exists()) {
+ implementation(files("$rootDir/ext/wolfcrypt-jni/lib/wolfcrypt-jni.jar"))
+ } else {
+ implementation(files("$rootDir/ext/wolfcrypt-jni.jar"))
+ }
+ implementation(project(":common"))
+
+ testImplementation(platform("org.junit:junit-bom:5.10.2"))
+ testImplementation("org.junit.jupiter:junit-jupiter")
+ testImplementation("org.junit-pioneer:junit-pioneer:2.2.0")
+ testRuntimeOnly("org.junit.platform:junit-platform-launcher")
+}
+
+java {
+ sourceCompatibility = JavaVersion.VERSION_11
+}
+
+application {
+ applicationName = "ECTesterStandalone"
+ mainClass = "cz.crcs.ectester.standalone.ECTesterStandalone"
+ version = "0.3.3"
+}
+
+tasks.named<Test>("test") {
+ val resultsDir = layout.buildDirectory.dir("results").get().asFile;
+ doFirst {
+ resultsDir.mkdirs();
+ }
+ ignoreFailures = true
+ useJUnitPlatform()
+ // Report is always generated after tests run
+ finalizedBy(tasks.jacocoTestReport)
+
+ if (JavaVersion.current() > JavaVersion.VERSION_1_8 && JavaVersion.current() < JavaVersion.VERSION_22) {
+ jvmArgs("--add-exports", "jdk.crypto.ec/sun.security.ec=ALL-UNNAMED"
+ )
+ } else if (JavaVersion.current() >= JavaVersion.VERSION_22) {
+ jvmArgs("--add-exports", "java.base/sun.security.ec=ALL-UNNAMED")
+ }
+
+ // Add wolfcrypt JNI lib path to LD_LIBRARY_PATH (as our native library loading does not handle it)
+ environment(
+ "LD_LIBRARY_PATH", "$rootDir/ext/wolfcrypt-jni/lib/:" + System.getenv("LD_LIBRARY_PATH")
+ )
+ // Add a path where we will store our test results.
+ environment(
+ "RESULT_PATH", resultsDir.absolutePath
+ )
+}
+
+tasks.jacocoTestReport {
+ reports {
+ xml.required = true
+ }
+}
+
+testlogger {
+ theme = com.adarshr.gradle.testlogger.theme.ThemeType.MOCHA
+ showStandardStreams = true
+}
+
+tasks.withType<JavaCompile> {
+ if (JavaVersion.current() > JavaVersion.VERSION_1_8 && JavaVersion.current() < JavaVersion.VERSION_22) {
+ options.compilerArgs.addAll(arrayOf(
+ "--add-modules", "jdk.crypto.ec",
+ "--add-exports", "jdk.crypto.ec/sun.security.ec=ALL-UNNAMED"
+ ))
+ } else if (JavaVersion.current() >= JavaVersion.VERSION_22) {
+ options.compilerArgs.addAll(arrayOf(
+ "--add-modules", "java.base",
+ "--add-exports", "java.base/sun.security.ec=ALL-UNNAMED"
+ ))
+ }
+}
+
+tasks.register<Exec>("libs") {
+ workingDir("src/main/resources/cz/crcs/ectester/standalone/libs/jni")
+ environment("PROJECT_ROOT_PATH", rootDir.absolutePath)
+
+ val libName = findProperty("libName") ?: ""
+ if ( libName == "" ) {
+ println("Building all libraries")
+ } else {
+ println("Buidling ${libName}")
+ }
+
+ if (osdetector.os == "windows") {
+ commandLine("makefile.bat", "/c", libName)
+ } else if (osdetector.os == "linux") {
+ commandLine("make", "-k", "-B", libName)
+ }
+}
+
+tasks.register<Jar>("uberJar") {
+ archiveFileName = "ECTesterStandalone.jar"
+ duplicatesStrategy = DuplicatesStrategy.WARN
+
+ from(sourceSets.main.get().output)
+
+ manifest {
+ attributes["Main-Class"] = application.mainClass
+ if (JavaVersion.current() > JavaVersion.VERSION_1_8) {
+ attributes["Add-Exports"] = "jdk.crypto.ec/sun.security.ec"
+ }
+ }
+
+ dependsOn(configurations.runtimeClasspath)
+ from({
+ configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it).matching { exclude("META-INF/*.DSA", "META-INF/*.SF", "META-INF/*.RSA", "META-INF/versions/*/module-info.class") } }
+ })
+}
diff --git a/src/cz/crcs/ectester/standalone/ECTesterStandalone.java b/standalone/src/main/java/cz/crcs/ectester/standalone/ECTesterStandalone.java
index 84e0ee9..c702dee 100644
--- a/src/cz/crcs/ectester/standalone/ECTesterStandalone.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/ECTesterStandalone.java
@@ -23,8 +23,8 @@
*/
package cz.crcs.ectester.standalone;
-import cz.crcs.ectester.applet.EC_Consts;
import cz.crcs.ectester.common.cli.*;
+import cz.crcs.ectester.common.ec.EC_Consts;
import cz.crcs.ectester.common.ec.EC_Curve;
import cz.crcs.ectester.common.output.TestWriter;
import cz.crcs.ectester.common.test.TestException;
@@ -36,6 +36,7 @@ import cz.crcs.ectester.standalone.consts.KeyAgreementIdent;
import cz.crcs.ectester.standalone.consts.KeyPairGeneratorIdent;
import cz.crcs.ectester.standalone.consts.SignatureIdent;
import cz.crcs.ectester.standalone.libs.*;
+import cz.crcs.ectester.standalone.output.FileTestWriter;
import cz.crcs.ectester.standalone.output.TextTestWriter;
import cz.crcs.ectester.standalone.output.XMLTestWriter;
import cz.crcs.ectester.standalone.output.YAMLTestWriter;
@@ -81,7 +82,7 @@ public class ECTesterStandalone {
private static final String CLI_HEADER = "\n" + DESCRIPTION + "\n\n";
private static final String CLI_FOOTER = "\n" + LICENSE;
- public static String LIB_RESOURCE_DIR = "/cz/crcs/ectester/standalone/libs/jni/";
+ public static final String LIB_RESOURCE_DIR = "/cz/crcs/ectester/standalone/libs/jni/";
private void run(String[] args) {
try {
@@ -109,7 +110,7 @@ public class ECTesterStandalone {
}
List<ProviderECLibrary> libObjects = new LinkedList<>();
- Class[] libClasses = new Class[]{SunECLib.class,
+ Class<?>[] libClasses = new Class[]{SunECLib.class,
BouncyCastleLib.class,
TomcryptLib.class,
BotanLib.class,
@@ -121,15 +122,13 @@ public class ECTesterStandalone {
WolfCryptLib.class,
MbedTLSLib.class,
IppcpLib.class,
- MatrixsslLib.class,
NettleLib.class,
LibresslLib.class};
- for (Class c : libClasses) {
+ for (Class<?> c : libClasses) {
try {
libObjects.add((ProviderECLibrary) c.getDeclaredConstructor().newInstance());
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException |
- InvocationTargetException e) {
-
+ InvocationTargetException ignored) {
}
}
libs = libObjects.toArray(new ProviderECLibrary[0]);
@@ -196,13 +195,17 @@ public class ECTesterStandalone {
privateKey.addOption(filePrivate);
Option curveName = Option.builder("cn").longOpt("curve-name").desc("Use a named curve, search from curves supported by the library: <name>").hasArg().argName("name").optionalArg(false).numberOfArgs(1).build();
Option bits = Option.builder("b").longOpt("bits").hasArg().argName("n").optionalArg(false).desc("What size of curve to use.").numberOfArgs(1).build();
- Option output = Option.builder("o").longOpt("output").desc("Output into file <output_file>.").hasArgs().argName("output_file").optionalArg(false).numberOfArgs(1).build();
+ Option output = Option.builder("o").longOpt("output").desc("Output into file <output_file>. The file can be prefixed by the format (one of text,yml,xml), such as: xml:<output_file>.").hasArgs().argName("output_file").optionalArg(false).numberOfArgs(1).build();
+ Option outputRaw = Option.builder("o").longOpt("output").desc("Output CSV into file <output_file>.").hasArgs().argName("output_file").optionalArg(false).numberOfArgs(1).build();
+ Option quiet = Option.builder("q").longOpt("quiet").desc("Do not output to stdout.").build();
Option timeSource = Option.builder("ts").longOpt("time-source").desc("Use a given native timing source: {rdtsc, monotonic, monotonic-raw, cputime-process, cputime-thread, perfcount}").hasArgs().argName("source").optionalArg(false).numberOfArgs(1).build();
Options testOpts = new Options();
testOpts.addOption(bits);
testOpts.addOption(namedCurve);
testOpts.addOption(curveName);
+ testOpts.addOption(output);
+ testOpts.addOption(quiet);
testOpts.addOption(Option.builder("gt").longOpt("kpg-type").desc("Set the KeyPairGenerator object [type].").hasArg().argName("type").optionalArg(false).build());
testOpts.addOption(Option.builder("kt").longOpt("ka-type").desc("Set the KeyAgreement object [type].").hasArg().argName("type").optionalArg(false).build());
testOpts.addOption(Option.builder("st").longOpt("sig-type").desc("Set the Signature object [type].").hasArg().argName("type").optionalArg(false).build());
@@ -217,7 +220,7 @@ public class ECTesterStandalone {
ecdhOpts.addOption(bits);
ecdhOpts.addOption(namedCurve);
ecdhOpts.addOption(curveName);
- ecdhOpts.addOption(output);
+ ecdhOpts.addOption(outputRaw);
ecdhOpts.addOption(timeSource);
ecdhOpts.addOption(Option.builder("t").longOpt("type").desc("Set KeyAgreement object [type].").hasArg().argName("type").optionalArg(false).build());
ecdhOpts.addOption(Option.builder().longOpt("key-type").desc("Set the key [algorithm] for which the key should be derived in KeyAgreements with KDF. Default is \"AES\".").hasArg().argName("algorithm").optionalArg(false).build());
@@ -233,7 +236,7 @@ public class ECTesterStandalone {
ecdsaOpts.addOption(bits);
ecdsaOpts.addOption(namedCurve);
ecdsaOpts.addOption(curveName);
- ecdsaOpts.addOption(output);
+ ecdsaOpts.addOption(outputRaw);
ecdsaOpts.addOption(timeSource);
ecdsaOpts.addOptionGroup(privateKey);
ecdsaOpts.addOptionGroup(publicKey);
@@ -248,7 +251,7 @@ public class ECTesterStandalone {
generateOpts.addOption(bits);
generateOpts.addOption(namedCurve);
generateOpts.addOption(curveName);
- generateOpts.addOption(output);
+ generateOpts.addOption(outputRaw);
generateOpts.addOption(timeSource);
generateOpts.addOption(Option.builder("n").longOpt("amount").hasArg().argName("amount").optionalArg(false).desc("Generate [amount] of EC keys.").build());
generateOpts.addOption(Option.builder("t").longOpt("type").hasArg().argName("type").optionalArg(false).desc("Set KeyPairGenerator object [type].").build());
@@ -257,7 +260,7 @@ public class ECTesterStandalone {
Options exportOpts = new Options();
exportOpts.addOption(bits);
- exportOpts.addOption(output);
+ exportOpts.addOption(outputRaw);
exportOpts.addOption(Option.builder("t").longOpt("type").hasArg().argName("type").optionalArg(false).desc("Set KeyPair object [type].").build());
ParserOptions export = new ParserOptions(new DefaultParser(), exportOpts, "Export default curve parameters.");
actions.put("export", export);
@@ -298,19 +301,20 @@ public class ECTesterStandalone {
for (ProviderECLibrary lib : libs) {
if (lib.isInitialized() && (cfg.selected == null || lib == cfg.selected)) {
System.out.println("\t- " + Colors.bold(lib.name()));
- System.out.println(Colors.bold("\t\t- Version: ") + String.format("%f", lib.getProvider().getVersion()));
+ System.out.println(Colors.bold("\t\t- Fullname: ") + lib.getProvider().getName());
+ System.out.println(Colors.bold("\t\t- Version: ") + lib.getProvider().getVersionStr());
System.out.println(Colors.bold("\t\t- Supports native timing: ") + lib.getNativeTimingSupport().toString());
Set<KeyPairGeneratorIdent> kpgs = lib.getKPGs();
if (!kpgs.isEmpty()) {
- System.out.println(Colors.bold("\t\t- KeyPairGenerators: ") + String.join(", ", kpgs.stream().map(KeyPairGeneratorIdent::getName).collect(Collectors.toList())));
+ System.out.println(Colors.bold("\t\t- KeyPairGenerators: ") + kpgs.stream().map(KeyPairGeneratorIdent::getName).collect(Collectors.joining(", ")));
}
Set<KeyAgreementIdent> eckas = lib.getKAs();
if (!eckas.isEmpty()) {
- System.out.println(Colors.bold("\t\t- KeyAgreements: ") + String.join(", ", eckas.stream().map(KeyAgreementIdent::getName).collect(Collectors.toList())));
+ System.out.println(Colors.bold("\t\t- KeyAgreements: ") + eckas.stream().map(KeyAgreementIdent::getName).collect(Collectors.joining(", ")));
}
Set<SignatureIdent> sigs = lib.getSigs();
if (!sigs.isEmpty()) {
- System.out.println(Colors.bold("\t\t- Signatures: ") + String.join(", ", sigs.stream().map(SignatureIdent::getName).collect(Collectors.toList())));
+ System.out.println(Colors.bold("\t\t- Signatures: ") + sigs.stream().map(SignatureIdent::getName).collect(Collectors.joining(", ")));
}
Set<String> curves = lib.getCurves();
if (!curves.isEmpty()) {
@@ -352,15 +356,15 @@ public class ECTesterStandalone {
private void listIdents() {
System.out.println(Colors.bold("\t- KeyPairGenerator"));
for (KeyPairGeneratorIdent kpgIdent : KeyPairGeneratorIdent.list()) {
- System.out.println("\t\t- " + Colors.underline(kpgIdent.getName()) + " " + kpgIdent.toString());
+ System.out.println("\t\t- " + Colors.underline(kpgIdent.getName()) + " " + kpgIdent);
}
System.out.println(Colors.bold("\t- KeyAgreement"));
for (KeyAgreementIdent kaIdent : KeyAgreementIdent.list()) {
- System.out.println("\t\t- " + Colors.underline(kaIdent.getName()) + " " + kaIdent.toString());
+ System.out.println("\t\t- " + Colors.underline(kaIdent.getName()) + " " + kaIdent);
}
System.out.println(Colors.bold("\t- Signature"));
for (SignatureIdent sigIdent : SignatureIdent.list()) {
- System.out.println("\t\t- " + Colors.underline(sigIdent.getName()) + " " + sigIdent.toString());
+ System.out.println("\t\t- " + Colors.underline(sigIdent.getName()) + " " + sigIdent);
}
}
@@ -443,7 +447,7 @@ public class ECTesterStandalone {
}
String hashAlgo = kaIdent.getBaseAlgo() != null ? String.format("[%s]", kaIdent.getBaseAlgo()) : "[NONE]";
- out.println(String.format("index;time[%s];pubW;privS;secret%s", timeUnit, hashAlgo));
+ out.printf("index;time[%s];pubW;privS;secret%s%n", timeUnit, hashAlgo);
KeyPair one = null;
if (cli.hasOption("ecdh.fixed-private") && !cli.hasOption("ecdh.named-private") && !cli.hasOption("ecdh.private")) {
@@ -500,7 +504,7 @@ public class ECTesterStandalone {
String pub = ByteUtil.bytesToHex(ECUtil.toX962Uncompressed(pubkey.getW(), pubkey.getParams()), false);
String priv = ByteUtil.bytesToHex(privkey.getS().toByteArray(), false);
String dh = ByteUtil.bytesToHex(result, false);
- out.println(String.format("%d;%d;%s;%s;%s", i, elapsed, pub, priv, dh));
+ out.printf("%d;%d;%s;%s;%s%n", i, elapsed, pub, priv, dh);
}
if (cli.hasOption("ecdh.output")) {
@@ -598,8 +602,8 @@ public class ECTesterStandalone {
timeUnit = lib.getNativeTimingUnit();
}
- String hashAlgo = sigIdent.getHashAlgo() != null ? String.format("[%s]", sigIdent.getHashAlgo()) : "";
- out.println(String.format("index;signTime[%s];verifyTime[%s];data;pubW;privS;signature%s;nonce;verified", timeUnit, timeUnit, hashAlgo));
+ String hashAlgoOut = sigIdent.getHashAlgo() != null ? String.format("[%s]", sigIdent.getHashAlgo()) : "";
+ out.printf("index;signTime[%s];verifyTime[%s];data;pubW;privS;signature%s;nonce;verified%n", timeUnit, timeUnit, hashAlgoOut);
ECPrivateKey privkey = (ECPrivateKey) ECUtil.loadKey(EC_Consts.PARAMETER_S, cli.getOptionValue("ecdsa.named-private"), cli.getOptionValue("ecdsa.private"), spec);
ECPublicKey pubkey = (ECPublicKey) ECUtil.loadKey(EC_Consts.PARAMETER_W, cli.getOptionValue("ecdsa.named-public"), cli.getOptionValue("ecdsa.public"), spec);
@@ -658,12 +662,19 @@ public class ECTesterStandalone {
kSpec = privkey.getParams();
}
if (kSpec != null) {
- BigInteger kValue = ECUtil.recoverSignatureNonce(signature, data, privkey.getS(), kSpec, sigIdent.getHashAlgo());
+ // Parse the types out of SignatureIdent.
+ String hashAlgo = sigIdent.getHashAlgo();
+ String sigType = sigIdent.getSigType();
+ if (sigType == null) {
+ sigType = sigIdent.toString();
+ }
+
+ BigInteger kValue = ECUtil.recoverSignatureNonce(signature, data, privkey.getS(), kSpec, hashAlgo, sigType);
if (kValue != null) {
k = ByteUtil.bytesToHex(kValue.toByteArray(), false);
}
}
- out.println(String.format("%d;%d;%d;%s;%s;%s;%s;%s;%d", i, signTime, verifyTime, dataString, pub, priv, sign, k, verified ? 1 : 0));
+ out.printf("%d;%d;%d;%s;%s;%s;%s;%s;%d%n", i, signTime, verifyTime, dataString, pub, priv, sign, k, verified ? 1 : 0);
}
if (cli.hasOption("ecdsa.output")) {
@@ -723,7 +734,7 @@ public class ECTesterStandalone {
out = System.out;
}
- out.println(String.format("index;time[%s];pubW;privS", timeUnit));
+ out.printf("index;time[%s];pubW;privS%n", timeUnit);
int amount = Integer.parseInt(cli.getOptionValue("generate.amount", "1"));
for (int i = 0; i < amount || amount == 0; ++i) {
@@ -738,7 +749,7 @@ public class ECTesterStandalone {
String pub = ByteUtil.bytesToHex(ECUtil.toX962Uncompressed(publicKey.getW(), publicKey.getParams()), false);
String priv = ByteUtil.bytesToHex(privateKey.getS().toByteArray(), false);
- out.println(String.format("%d;%d;%s;%s", i, elapsed, pub, priv));
+ out.printf("%d;%d;%s;%s%n", i, elapsed, pub, priv);
}
if (cli.hasOption("generate.output")) {
@@ -749,22 +760,8 @@ public class ECTesterStandalone {
/**
*
*/
- private void test() throws TestException, ParserConfigurationException {
- TestWriter writer;
- switch (cli.getOptionValue("test.format", "text").toLowerCase()) {
- case "yaml":
- case "yml":
- writer = new YAMLTestWriter(System.out);
- break;
- case "xml":
- writer = new XMLTestWriter(System.out);
- break;
- case "text":
- default:
- writer = new TextTestWriter(System.out);
- break;
- }
-
+ private void test() throws TestException, ParserConfigurationException, FileNotFoundException {
+ TestWriter writer = new FileTestWriter(cli.getOptionValue("test.format", "text"), !cli.hasOption("test.quiet"), cli.getOptionValues("test.output"));
StandaloneTestSuite suite;
switch (cli.getArg(0).toLowerCase()) {
@@ -833,9 +830,13 @@ public class ECTesterStandalone {
KeyPair kp = kpg.genKeyPair();
ECPrivateKey privateKey = (ECPrivateKey) kp.getPrivate();
ECParameterSpec params = privateKey.getParams();
- System.out.println(params);
- EC_Curve curve = EC_Curve.fromSpec(params);
- curve.writeCSV(System.out);
+ if (params == null) {
+ System.err.println("Parameters could not be exported (they are NULL).");
+ } else {
+ System.out.println(params);
+ EC_Curve curve = EC_Curve.fromSpec(params);
+ curve.writeCSV(System.out);
+ }
}
public static void main(String[] args) {
@@ -891,11 +892,11 @@ public class ECTesterStandalone {
matchedLibs.add(lib);
}
}
- if (matchedLibs.size() == 0) {
+ if (matchedLibs.isEmpty()) {
System.err.println("No library " + libraryName + " found.");
return false;
} else if (matchedLibs.size() > 1) {
- System.err.println("Multiple matching libraries found: " + String.join(",", matchedLibs.stream().map(ECLibrary::name).collect(Collectors.toList())));
+ System.err.println("Multiple matching libraries found: " + matchedLibs.stream().map(ECLibrary::name).collect(Collectors.joining(",")));
return false;
} else {
selected = matchedLibs.get(0);
@@ -930,7 +931,7 @@ public class ECTesterStandalone {
if (cli.hasOption(next + ".time-source")) {
String source = cli.getOptionValue(next + ".time-source");
if (!selected.getNativeTimingSupport().contains(source)) {
- System.err.println(String.format("Time source %s unavailable for library %s.", source, selected.name()));
+ System.err.printf("Time source %s unavailable for library %s.%n", source, selected.name());
return false;
}
}
diff --git a/src/cz/crcs/ectester/standalone/consts/Ident.java b/standalone/src/main/java/cz/crcs/ectester/standalone/consts/Ident.java
index fcc811d..fa5dffa 100644
--- a/src/cz/crcs/ectester/standalone/consts/Ident.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/consts/Ident.java
@@ -6,8 +6,8 @@ import java.util.*;
import java.util.function.BiFunction;
public abstract class Ident {
- Set<String> idents;
- String name;
+ final Set<String> idents;
+ final String name;
public Ident(String name, String... aliases) {
this.name = name;
diff --git a/src/cz/crcs/ectester/standalone/consts/KeyAgreementIdent.java b/standalone/src/main/java/cz/crcs/ectester/standalone/consts/KeyAgreementIdent.java
index 9b912cb..60c60e8 100644
--- a/src/cz/crcs/ectester/standalone/consts/KeyAgreementIdent.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/consts/KeyAgreementIdent.java
@@ -90,8 +90,12 @@ public class KeyAgreementIdent extends Ident {
int split = alias.indexOf("with");
this.algo = alias.substring(0, split);
this.kdf = alias.substring(split + 4);
+ break;
}
}
+ if (this.algo == null) {
+ this.algo = name;
+ }
}
}
diff --git a/src/cz/crcs/ectester/standalone/consts/KeyPairGeneratorIdent.java b/standalone/src/main/java/cz/crcs/ectester/standalone/consts/KeyPairGeneratorIdent.java
index 83eef75..83eef75 100644
--- a/src/cz/crcs/ectester/standalone/consts/KeyPairGeneratorIdent.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/consts/KeyPairGeneratorIdent.java
diff --git a/src/cz/crcs/ectester/standalone/consts/SignatureIdent.java b/standalone/src/main/java/cz/crcs/ectester/standalone/consts/SignatureIdent.java
index 39b8031..c3913b7 100644
--- a/src/cz/crcs/ectester/standalone/consts/SignatureIdent.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/consts/SignatureIdent.java
@@ -127,6 +127,10 @@ public class SignatureIdent extends Ident {
return instance;
}
+ public String toString() {
+ return name;
+ }
+
public String getHashAlgo() {
return hash;
}
diff --git a/src/cz/crcs/ectester/standalone/libs/BoringsslLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/BoringsslLib.java
index 60ca5d9..af4d969 100644
--- a/src/cz/crcs/ectester/standalone/libs/BoringsslLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/BoringsslLib.java
@@ -8,7 +8,7 @@ import java.util.Set;
*/
public class BoringsslLib extends NativeECLibrary {
public BoringsslLib() {
- super("boringssl_provider", "lib_boringssl.so");
+ super("BoringSSL", "boringssl_provider", "lib_boringssl.so");
}
@Override
diff --git a/src/cz/crcs/ectester/standalone/libs/BotanLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/BotanLib.java
index cd28791..e8f6e13 100644
--- a/src/cz/crcs/ectester/standalone/libs/BotanLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/BotanLib.java
@@ -9,7 +9,7 @@ import java.util.Set;
public class BotanLib extends NativeECLibrary {
public BotanLib() {
- super("botan_provider", "botan-2");
+ super("Botan", "botan_provider", "botan-2");
}
@Override
diff --git a/src/cz/crcs/ectester/standalone/libs/BouncyCastleLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/BouncyCastleLib.java
index c6600f9..e8a4d30 100644
--- a/src/cz/crcs/ectester/standalone/libs/BouncyCastleLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/BouncyCastleLib.java
@@ -13,13 +13,13 @@ import java.util.TreeSet;
public class BouncyCastleLib extends ProviderECLibrary {
public BouncyCastleLib() {
- super(new BouncyCastleProvider());
+ super("BouncyCastle", new BouncyCastleProvider());
}
@Override
public Set<String> getCurves() {
Set<String> result = new TreeSet<>();
- Enumeration names = ECNamedCurveTable.getNames();
+ Enumeration<?> names = ECNamedCurveTable.getNames();
while (names.hasMoreElements()) {
result.add((String) names.nextElement());
}
diff --git a/src/cz/crcs/ectester/standalone/libs/CryptoppLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/CryptoppLib.java
index 5112d7d..66aa9ea 100644
--- a/src/cz/crcs/ectester/standalone/libs/CryptoppLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/CryptoppLib.java
@@ -9,7 +9,7 @@ import java.util.Set;
public class CryptoppLib extends NativeECLibrary {
public CryptoppLib() {
- super("cryptopp_provider", "cryptopp");
+ super("Crypto++","cryptopp_provider", "cryptopp");
}
@Override
diff --git a/src/cz/crcs/ectester/standalone/libs/ECLibrary.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/ECLibrary.java
index 0f81978..0f81978 100644
--- a/src/cz/crcs/ectester/standalone/libs/ECLibrary.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/ECLibrary.java
diff --git a/src/cz/crcs/ectester/standalone/libs/GcryptLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/GcryptLib.java
index a0a7fc8..83d78ef 100644
--- a/src/cz/crcs/ectester/standalone/libs/GcryptLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/GcryptLib.java
@@ -9,7 +9,7 @@ import java.util.Set;
public class GcryptLib extends NativeECLibrary {
public GcryptLib() {
- super("gcrypt_provider", "gcrypt", "gpg-error");
+ super("libgcrypt","gcrypt_provider", "gcrypt", "gpg-error");
}
@Override
diff --git a/src/cz/crcs/ectester/standalone/libs/IppcpLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/IppcpLib.java
index 0dec0a2..115fe00 100644
--- a/src/cz/crcs/ectester/standalone/libs/IppcpLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/IppcpLib.java
@@ -9,7 +9,7 @@ import java.util.Set;
public class IppcpLib extends NativeECLibrary {
public IppcpLib() {
- super("ippcp_provider", "lib_ippcp.so");
+ super("IPPCP", "ippcp_provider", "lib_ippcp.so");
}
@Override
diff --git a/src/cz/crcs/ectester/standalone/libs/LibresslLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/LibresslLib.java
index cee4e4d..2dba049 100644
--- a/src/cz/crcs/ectester/standalone/libs/LibresslLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/LibresslLib.java
@@ -8,7 +8,7 @@ import java.util.Set;
*/
public class LibresslLib extends NativeECLibrary {
public LibresslLib() {
- super("libressl_provider", "lib_libressl.so");
+ super("LibreSSL", "libressl_provider", "lib_libressl.so");
}
@Override
diff --git a/src/cz/crcs/ectester/standalone/libs/MbedTLSLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/MbedTLSLib.java
index ace10d7..e44598c 100644
--- a/src/cz/crcs/ectester/standalone/libs/MbedTLSLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/MbedTLSLib.java
@@ -9,7 +9,7 @@ import java.util.Set;
public class MbedTLSLib extends NativeECLibrary {
public MbedTLSLib() {
- super("mbedtls_provider", "mbedcrypto");
+ super("mbedTLS", "mbedtls_provider", "lib_mbedtls.so");
}
@Override
diff --git a/src/cz/crcs/ectester/standalone/libs/MscngLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/MscngLib.java
index 527a65b..77879db 100644
--- a/src/cz/crcs/ectester/standalone/libs/MscngLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/MscngLib.java
@@ -9,7 +9,7 @@ import java.util.Set;
public class MscngLib extends NativeECLibrary {
public MscngLib() {
- super("mscng_provider", "bcrypt");
+ super("MicrosoftCNG", "mscng_provider", "bcrypt");
}
@Override
diff --git a/src/cz/crcs/ectester/standalone/libs/NativeECLibrary.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NativeECLibrary.java
index db85b02..7f9d96e 100644
--- a/src/cz/crcs/ectester/standalone/libs/NativeECLibrary.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NativeECLibrary.java
@@ -3,7 +3,6 @@ package cz.crcs.ectester.standalone.libs;
import cz.crcs.ectester.common.util.FileUtil;
import cz.crcs.ectester.standalone.ECTesterStandalone;
-import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.security.Provider;
@@ -13,11 +12,11 @@ import java.util.Set;
* @author Jan Jancar johny@neuromancer.sk
*/
public abstract class NativeECLibrary extends ProviderECLibrary {
- private String resource;
- private String[] requriements;
+ private final String resource;
+ private final String[] requriements;
-
- public NativeECLibrary(String resource, String... requirements) {
+ public NativeECLibrary(String name, String resource, String... requirements) {
+ super(name);
this.resource = resource;
this.requriements = requirements;
}
@@ -34,7 +33,10 @@ public abstract class NativeECLibrary extends ProviderECLibrary {
Path libPath = libDir.resolve(resource + "." + suffix);
/* Write the shim. */
- FileUtil.writeNewer(ECTesterStandalone.LIB_RESOURCE_DIR + resource + "." + suffix, libPath);
+ boolean found = FileUtil.writeNewer(ECTesterStandalone.LIB_RESOURCE_DIR + resource + "." + suffix, libPath);
+ if (!found) {
+ return false;
+ }
/* Load the requirements, if they are bundled, write them in and load them. */
try {
@@ -42,13 +44,18 @@ public abstract class NativeECLibrary extends ProviderECLibrary {
if (requirement.endsWith(suffix)) {
/* The requirement is bundled, write it */
Path reqPath = libReqDir.resolve(requirement);
- FileUtil.writeNewer(ECTesterStandalone.LIB_RESOURCE_DIR + requirement, reqPath);
+ found = FileUtil.writeNewer(ECTesterStandalone.LIB_RESOURCE_DIR + requirement, reqPath);
+ if (!found) {
+ return false;
+ }
System.load(reqPath.toString());
} else {
System.loadLibrary(requirement);
}
}
} catch (UnsatisfiedLinkError ule) {
+ System.err.println(resource);
+ ule.printStackTrace();
return false;
}
@@ -57,6 +64,8 @@ public abstract class NativeECLibrary extends ProviderECLibrary {
provider = createProvider();
return super.initialize();
} catch (IOException | UnsatisfiedLinkError ignored) {
+ System.err.println(resource);
+ ignored.printStackTrace();
}
return false;
}
diff --git a/src/cz/crcs/ectester/standalone/libs/NettleLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NettleLib.java
index 00e3b39..6b60779 100644
--- a/src/cz/crcs/ectester/standalone/libs/NettleLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NettleLib.java
@@ -9,7 +9,7 @@ import java.util.Set;
public class NettleLib extends NativeECLibrary {
public NettleLib() {
- super("nettle_provider", "nettle","hogweed", "gmp");
+ super("Nettle", "nettle_provider", "nettle","hogweed", "gmp");
}
@Override
diff --git a/src/cz/crcs/ectester/standalone/libs/OpensslLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/OpensslLib.java
index e558336..61f00a4 100644
--- a/src/cz/crcs/ectester/standalone/libs/OpensslLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/OpensslLib.java
@@ -8,7 +8,7 @@ import java.util.Set;
*/
public class OpensslLib extends NativeECLibrary {
public OpensslLib() {
- super("openssl_provider", "crypto");
+ super("OpenSSL", "openssl_provider", "crypto");
}
@Override
diff --git a/src/cz/crcs/ectester/standalone/libs/ProviderECLibrary.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/ProviderECLibrary.java
index dd8e49c..a9a49e9 100644
--- a/src/cz/crcs/ectester/standalone/libs/ProviderECLibrary.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/ProviderECLibrary.java
@@ -15,14 +15,16 @@ import java.util.function.Function;
* @author Jan Jancar johny@neuromancer.sk
*/
public abstract class ProviderECLibrary implements ECLibrary {
+ String name;
Provider provider;
private boolean initialized = false;
- public ProviderECLibrary() {
-
+ public ProviderECLibrary(String name) {
+ this.name = name;
}
- public ProviderECLibrary(Provider provider) {
+ public ProviderECLibrary(String name, Provider provider) {
+ this.name = name;
this.provider = provider;
}
@@ -99,7 +101,7 @@ public abstract class ProviderECLibrary implements ECLibrary {
@Override
public String name() {
- return provider.getInfo();
+ return name;
}
public Provider getProvider() {
diff --git a/src/cz/crcs/ectester/standalone/libs/SunECLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/SunECLib.java
index 3aec842..7209dc3 100644
--- a/src/cz/crcs/ectester/standalone/libs/SunECLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/SunECLib.java
@@ -11,7 +11,7 @@ import java.util.TreeSet;
public class SunECLib extends ProviderECLibrary {
public SunECLib() {
- super(new SunEC());
+ super("SunEC", new SunEC());
}
@Override
diff --git a/src/cz/crcs/ectester/standalone/libs/TomcryptLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/TomcryptLib.java
index 78db00e..8c000a2 100644
--- a/src/cz/crcs/ectester/standalone/libs/TomcryptLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/TomcryptLib.java
@@ -9,7 +9,7 @@ import java.util.Set;
public class TomcryptLib extends NativeECLibrary {
public TomcryptLib() {
- super("tomcrypt_provider", "tommath", "tomcrypt");
+ super("tomcrypt","tomcrypt_provider", "tommath", "tomcrypt");
}
@Override
diff --git a/src/cz/crcs/ectester/standalone/libs/WolfCryptLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/WolfCryptLib.java
index b58eb91..c8d5ad5 100644
--- a/src/cz/crcs/ectester/standalone/libs/WolfCryptLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/WolfCryptLib.java
@@ -8,7 +8,17 @@ import java.util.Set;
public class WolfCryptLib extends ProviderECLibrary {
public WolfCryptLib() {
- super(new WolfCryptProvider());
+ super("wolfCrypt", new WolfCryptProvider());
+ }
+
+ @Override
+ public boolean initialize() {
+ try {
+ System.loadLibrary("wolfcryptjni");
+ return super.initialize();
+ } catch (UnsatisfiedLinkError ule) {
+ return false;
+ }
}
@Override
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/NativeECPrivateKey.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeECPrivateKey.java
index 81bd387..a788181 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/NativeECPrivateKey.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeECPrivateKey.java
@@ -12,9 +12,9 @@ import java.security.spec.ECParameterSpec;
*/
@SuppressWarnings("serial")
public abstract class NativeECPrivateKey implements ECPrivateKey {
- private String algorithm;
- private String format;
- ECParameterSpec params;
+ private final String algorithm;
+ private final String format;
+ final ECParameterSpec params;
public NativeECPrivateKey(String algorithm, String format, ECParameterSpec params) {
this.algorithm = algorithm;
@@ -41,7 +41,7 @@ public abstract class NativeECPrivateKey implements ECPrivateKey {
@SuppressWarnings("serial")
private static class Raw extends NativeECPrivateKey {
- byte[] keyData;
+ final byte[] keyData;
public Raw(byte[] keyData, ECParameterSpec params) {
super("EC", "raw", params);
@@ -120,13 +120,6 @@ public abstract class NativeECPrivateKey implements ECPrivateKey {
}
@SuppressWarnings("serial")
- public static class Matrixssl extends Raw {
- public Matrixssl(byte[] keyData, ECParameterSpec params) {
- super(keyData, params);
- }
- }
-
- @SuppressWarnings("serial")
public static class Libressl extends Raw {
public Libressl(byte[] keyData, ECParameterSpec params) {
super(keyData, params);
@@ -138,11 +131,11 @@ public abstract class NativeECPrivateKey implements ECPrivateKey {
// 0 -> implicit (meta = curveName UTF16, header = full);
// 1 -> explicit (meta = null, header = full);
// 2 -> nist (meta = null, header = full)
- private int flag;
- private byte[] meta = null;
- private byte[] header;
- private byte[] x;
- private byte[] y;
+ private final int flag;
+ private final byte[] meta;
+ private final byte[] header;
+ private final byte[] x;
+ private final byte[] y;
public Mscng(int flag, byte[] meta, byte[] header, byte[] x, byte[] y, byte[] keyData, ECParameterSpec params) {
super(keyData, params);
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/NativeECPublicKey.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeECPublicKey.java
index 7a8de83..4761f11 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/NativeECPublicKey.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeECPublicKey.java
@@ -13,9 +13,9 @@ import java.security.spec.ECPoint;
*/
@SuppressWarnings("serial")
public abstract class NativeECPublicKey implements ECPublicKey {
- private String algorithm;
- private String format;
- ECParameterSpec params;
+ private final String algorithm;
+ private final String format;
+ final ECParameterSpec params;
public NativeECPublicKey(String algorithm, String format, ECParameterSpec params) {
this.algorithm = algorithm;
@@ -121,13 +121,6 @@ public abstract class NativeECPublicKey implements ECPublicKey {
}
@SuppressWarnings("serial")
- public static class Matrixssl extends ANSIX962 {
- public Matrixssl(byte[] keyData, ECParameterSpec params) {
- super(keyData, params);
- }
- }
-
- @SuppressWarnings("serial")
public static class Libressl extends ANSIX962 {
public Libressl(byte[] keyData, ECParameterSpec params) {
super(keyData, params);
@@ -139,11 +132,11 @@ public abstract class NativeECPublicKey implements ECPublicKey {
// 0 -> implicit (meta = curveName UTF16, header = full);
// 1 -> explicit (meta = null, header = full);
// 2 -> nist (meta = null, header = full)
- private int flag;
- private byte[] meta = null;
- private byte[] header;
- private byte[] x;
- private byte[] y;
+ private final int flag;
+ private final byte[] meta;
+ private final byte[] header;
+ private final byte[] x;
+ private final byte[] y;
public Mscng(int flag, byte[] meta, byte[] header, byte[] x, byte[] y, ECParameterSpec params) {
super(ByteUtil.concatenate(new byte[]{0x04}, x, y), params);
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java
index 1e68f78..afed02b 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java
@@ -146,7 +146,7 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
}
public abstract static class Botan extends SimpleKeyAgreementSpi {
- private String type;
+ private final String type;
public Botan(String type) {
this.type = type;
@@ -196,7 +196,7 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
}
public abstract static class Cryptopp extends SimpleKeyAgreementSpi {
- private String type;
+ private final String type;
public Cryptopp(String type) {
this.type = type;
@@ -216,7 +216,7 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
}
public abstract static class Openssl extends SimpleKeyAgreementSpi {
- private String type;
+ private final String type;
public Openssl(String type) {
this.type = type;
@@ -236,7 +236,7 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
}
public abstract static class Boringssl extends SimpleKeyAgreementSpi {
- private String type;
+ private final String type;
public Boringssl(String type) {
this.type = type;
@@ -256,7 +256,7 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
}
public abstract static class Gcrypt extends SimpleKeyAgreementSpi {
- private String type;
+ private final String type;
public Gcrypt(String type) {
this.type = type;
@@ -277,7 +277,7 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
public abstract static class Mscng extends ExtendedKeyAgreementSpi {
- private String type;
+ private final String type;
public Mscng(String type) {
this.type = type;
@@ -315,7 +315,7 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
}
public abstract static class MbedTLS extends SimpleKeyAgreementSpi {
- private String type;
+ private final String type;
public MbedTLS(String type) {
this.type = type;
@@ -335,7 +335,7 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
}
public abstract static class Ippcp extends SimpleKeyAgreementSpi {
- private String type;
+ private final String type;
public Ippcp(String type) {
this.type = type;
@@ -354,28 +354,8 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
}
}
- public abstract static class Matrixssl extends SimpleKeyAgreementSpi {
- private String type;
-
- public Matrixssl(String type) {
- this.type = type;
- }
-
- @Override
- native byte[] generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params);
-
- @Override
- native SecretKey generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params, String algorithm);
- }
-
- public static class MatrixsslECDH extends Matrixssl {
- public MatrixsslECDH() {
- super("ECDH");
- }
- }
-
public abstract static class Libressl extends SimpleKeyAgreementSpi {
- private String type;
+ private final String type;
public Libressl(String type) {
this.type = type;
@@ -388,8 +368,14 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
native SecretKey generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params, String algorithm);
}
+ public static class LibresslECDH extends Libressl {
+ public LibresslECDH() {
+ super("ECDH");
+ }
+ }
+
public abstract static class Nettle extends SimpleKeyAgreementSpi {
- private String type;
+ private final String type;
public Nettle(String type) {
this.type = type;
@@ -398,6 +384,7 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
@Override
byte[] generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params) {
try {
+ // TODO: OMG remove this monstrosity.
AlgorithmParameters tmp = AlgorithmParameters.getInstance("EC");
tmp.init(params);
ECGenParameterSpec spec = tmp.getParameterSpec(ECGenParameterSpec.class);
@@ -424,7 +411,6 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
return generateSecret(pubkey, privkey, spec);
} catch (NoSuchAlgorithmException | InvalidParameterSpecException e) {
- e.printStackTrace();
return null;
}
}
@@ -440,10 +426,4 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
super("ECDH");
}
}
- public static class LibresslECDH extends Libressl {
- public LibresslECDH() {
- super("ECDH");
- }
- }
-
}
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi.java
index 636f423..0a9487f 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi.java
@@ -5,10 +5,8 @@ import cz.crcs.ectester.data.EC_Store;
import java.security.*;
import java.security.spec.AlgorithmParameterSpec;
-import java.security.AlgorithmParameters;
import java.security.spec.ECGenParameterSpec;
import java.security.spec.ECParameterSpec;
-import java.security.spec.InvalidParameterSpecException;
/**
* @author Jan Jancar johny@neuromancer.sk
@@ -89,7 +87,7 @@ public abstract class NativeKeyPairGeneratorSpi extends KeyPairGeneratorSpi {
}
public static abstract class Botan extends NativeKeyPairGeneratorSpi {
- private String type;
+ private final String type;
public Botan(String type) {
this.type = type;
@@ -137,7 +135,7 @@ public abstract class NativeKeyPairGeneratorSpi extends KeyPairGeneratorSpi {
}
public static abstract class Cryptopp extends NativeKeyPairGeneratorSpi {
- private String type;
+ private final String type;
public Cryptopp(String type) {
this.type = type;
@@ -225,7 +223,7 @@ public abstract class NativeKeyPairGeneratorSpi extends KeyPairGeneratorSpi {
}
public static abstract class Mscng extends NativeKeyPairGeneratorSpi {
- private String type;
+ private final String type;
public Mscng(String type) {
this.type = type;
@@ -295,25 +293,6 @@ public abstract class NativeKeyPairGeneratorSpi extends KeyPairGeneratorSpi {
@Override
native KeyPair generate(AlgorithmParameterSpec params, SecureRandom random);
}
-
- public static class Matrixssl extends NativeKeyPairGeneratorSpi {
-
- public Matrixssl() {
- initialize(256, new SecureRandom());
- }
-
- @Override
- native boolean keysizeSupported(int keysize);
-
- @Override
- native boolean paramsSupported(AlgorithmParameterSpec params);
-
- @Override
- native KeyPair generate(int keysize, SecureRandom random);
-
- @Override
- native KeyPair generate(AlgorithmParameterSpec params, SecureRandom random);
- }
public static class Libressl extends NativeKeyPairGeneratorSpi {
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/NativeProvider.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeProvider.java
index e036937..9ea1186 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/NativeProvider.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeProvider.java
@@ -125,17 +125,6 @@ public abstract class NativeProvider extends Provider {
}
@SuppressWarnings("serial")
- public static class Matrixssl extends NativeProvider {
-
- public Matrixssl(String name, double version, String info) {
- super(name, version, info);
- }
-
- @Override
- native void setup();
- }
-
- @SuppressWarnings("serial")
public static class Libressl extends NativeProvider {
public Libressl(String name, double version, String info) {
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi.java
index d6e814c..9557288 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi.java
@@ -121,7 +121,7 @@ public abstract class NativeSignatureSpi extends SignatureSpi {
}
public abstract static class Botan extends SimpleSignatureSpi {
- private String type;
+ private final String type;
public Botan(String type) {
this.type = type;
@@ -261,7 +261,7 @@ public abstract class NativeSignatureSpi extends SignatureSpi {
}
public abstract static class Cryptopp extends SimpleSignatureSpi {
- private String type;
+ private final String type;
public Cryptopp(String type) {
this.type = type;
@@ -310,7 +310,7 @@ public abstract class NativeSignatureSpi extends SignatureSpi {
}
public abstract static class Openssl extends SimpleSignatureSpi {
- private String type;
+ private final String type;
public Openssl(String type) {
this.type = type;
@@ -331,7 +331,7 @@ public abstract class NativeSignatureSpi extends SignatureSpi {
}
public abstract static class Boringssl extends SimpleSignatureSpi {
- private String type;
+ private final String type;
public Boringssl(String type) {
this.type = type;
@@ -352,7 +352,7 @@ public abstract class NativeSignatureSpi extends SignatureSpi {
}
public abstract static class Gcrypt extends SimpleSignatureSpi {
- private String type;
+ private final String type;
public Gcrypt(String type) {
this.type = type;
@@ -443,7 +443,7 @@ public abstract class NativeSignatureSpi extends SignatureSpi {
}
public abstract static class MbedTLS extends SimpleSignatureSpi {
- private String type;
+ private final String type;
public MbedTLS(String type) {
this.type = type;
@@ -464,7 +464,7 @@ public abstract class NativeSignatureSpi extends SignatureSpi {
}
public abstract static class Ippcp extends SimpleSignatureSpi {
- private String type;
+ private final String type;
public Ippcp(String type) {
this.type = type;
@@ -485,7 +485,7 @@ public abstract class NativeSignatureSpi extends SignatureSpi {
}
public abstract static class Libressl extends SimpleSignatureSpi {
- private String type;
+ private final String type;
public Libressl(String type) {
this.type = type;
@@ -505,29 +505,8 @@ public abstract class NativeSignatureSpi extends SignatureSpi {
}
}
- public abstract static class Matrixssl extends SimpleSignatureSpi {
- private String type;
-
- public Matrixssl(String type) {
- this.type = type;
- }
-
- @Override
- native byte[] sign(byte[] data, byte[] privkey, ECParameterSpec params);
-
- @Override
- native boolean verify(byte[] signature, byte[] data, byte[] pubkey, ECParameterSpec params);
- }
-
- public static class MatrixsslECDSAwithNONE extends Matrixssl {
-
- public MatrixsslECDSAwithNONE() {
- super("NONEwithECDSA");
- }
- }
-
public abstract static class Mscng extends ExtendedSignatureSpi {
- private String type;
+ private final String type;
public Mscng(String type) {
this.type = type;
@@ -569,7 +548,7 @@ public abstract class NativeSignatureSpi extends SignatureSpi {
}
public abstract static class Nettle extends SimpleSignatureSpi {
- private String type;
+ private final String type;
public Nettle(String type) {
this.type = type;
@@ -639,7 +618,6 @@ public abstract class NativeSignatureSpi extends SignatureSpi {
return verify(signature, data, pubkey, spec);
} catch (NoSuchAlgorithmException | InvalidParameterSpecException e) {
- e.printStackTrace();
return false;
}
}
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/output/FileTestWriter.java b/standalone/src/main/java/cz/crcs/ectester/standalone/output/FileTestWriter.java
new file mode 100644
index 0000000..a7dd017
--- /dev/null
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/output/FileTestWriter.java
@@ -0,0 +1,50 @@
+package cz.crcs.ectester.standalone.output;
+
+import cz.crcs.ectester.common.output.BaseFileTestWriter;
+import cz.crcs.ectester.common.output.TestWriter;
+
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.FileNotFoundException;
+import java.io.PrintStream;
+import java.util.regex.Pattern;
+
+/**
+ * @author Jan Jancar johny@neuromancer.sk
+ */
+public class FileTestWriter extends BaseFileTestWriter {
+
+ private static final Pattern PREFIX = Pattern.compile("(text|xml|yaml|yml):.+");
+
+ public FileTestWriter(String defaultFormat, boolean systemOut, String[] files) throws ParserConfigurationException, FileNotFoundException {
+ super(defaultFormat, systemOut, files);
+ }
+
+ @Override
+ protected String[] matchName(String name) {
+ String[] result = new String[2];
+ if (PREFIX.matcher(name).matches()) {
+ result = name.split(":", 2);
+ } else {
+ result[0] = null;
+ result[1] = name;
+ }
+ return result;
+ }
+
+ protected TestWriter createWriter(String format, PrintStream out) throws ParserConfigurationException {
+ if (format == null) {
+ return new TextTestWriter(out);
+ }
+ switch (format) {
+ case "text":
+ return new TextTestWriter(out);
+ case "xml":
+ return new XMLTestWriter(out);
+ case "yaml":
+ case "yml":
+ return new YAMLTestWriter(out);
+ default:
+ return null;
+ }
+ }
+}
diff --git a/src/cz/crcs/ectester/standalone/output/TextTestWriter.java b/standalone/src/main/java/cz/crcs/ectester/standalone/output/TextTestWriter.java
index d7be4dc..ba345e7 100644
--- a/src/cz/crcs/ectester/standalone/output/TextTestWriter.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/output/TextTestWriter.java
@@ -32,7 +32,7 @@ public class TextTestWriter extends BaseTextTestWriter {
@Override
protected String testableString(Testable t) {
if (t instanceof StandaloneTestable) {
- StandaloneTestable<?> testable = (StandaloneTestable) t;
+ StandaloneTestable<?> testable = (StandaloneTestable<?>) t;
Enum<?> stage = testable.getStage();
String stageName = stage.name();
String exception = causeString(testable.getException());
diff --git a/src/cz/crcs/ectester/standalone/output/XMLTestWriter.java b/standalone/src/main/java/cz/crcs/ectester/standalone/output/XMLTestWriter.java
index 812634f..60751f5 100644
--- a/src/cz/crcs/ectester/standalone/output/XMLTestWriter.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/output/XMLTestWriter.java
@@ -119,7 +119,7 @@ public class XMLTestWriter extends BaseXMLTestWriter {
protected Element testableElement(Testable t) {
Element result = doc.createElement("test");
if (t instanceof StandaloneTestable) {
- StandaloneTestable<?> testable = (StandaloneTestable) t;
+ StandaloneTestable<?> testable = (StandaloneTestable<?>) t;
if (t instanceof KeyGeneratorTestable) {
result.setAttribute("type", "key-pair-generator");
result.appendChild(kgtElement((KeyGeneratorTestable) t));
diff --git a/src/cz/crcs/ectester/standalone/output/YAMLTestWriter.java b/standalone/src/main/java/cz/crcs/ectester/standalone/output/YAMLTestWriter.java
index ee8a199..664fa18 100644
--- a/src/cz/crcs/ectester/standalone/output/YAMLTestWriter.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/output/YAMLTestWriter.java
@@ -92,7 +92,7 @@ public class YAMLTestWriter extends BaseYAMLTestWriter {
protected Map<String, Object> testableObject(Testable t) {
Map<String, Object> result = new LinkedHashMap<>();
if (t instanceof StandaloneTestable) {
- StandaloneTestable<?> testable = (StandaloneTestable) t;
+ StandaloneTestable<?> testable = (StandaloneTestable<?>) t;
if (t instanceof KeyGeneratorTestable) {
result.put("type", "key-pair-generator");
result.put("key-pair-generator", kgtObject((KeyGeneratorTestable) t));
diff --git a/src/cz/crcs/ectester/standalone/test/base/KeyAgreementTest.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/base/KeyAgreementTest.java
index fd48212..fd48212 100644
--- a/src/cz/crcs/ectester/standalone/test/base/KeyAgreementTest.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/base/KeyAgreementTest.java
diff --git a/src/cz/crcs/ectester/standalone/test/base/KeyAgreementTestable.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/base/KeyAgreementTestable.java
index 7fd1c5a..7fd1c5a 100644
--- a/src/cz/crcs/ectester/standalone/test/base/KeyAgreementTestable.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/base/KeyAgreementTestable.java
diff --git a/src/cz/crcs/ectester/standalone/test/base/KeyGeneratorTest.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/base/KeyGeneratorTest.java
index 32f82cb..32f82cb 100644
--- a/src/cz/crcs/ectester/standalone/test/base/KeyGeneratorTest.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/base/KeyGeneratorTest.java
diff --git a/src/cz/crcs/ectester/standalone/test/base/KeyGeneratorTestable.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/base/KeyGeneratorTestable.java
index c05d6e3..296ec3c 100644
--- a/src/cz/crcs/ectester/standalone/test/base/KeyGeneratorTestable.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/base/KeyGeneratorTestable.java
@@ -10,7 +10,7 @@ import java.security.spec.ECParameterSpec;
*/
public class KeyGeneratorTestable extends StandaloneTestable<KeyGeneratorTestable.KeyGeneratorStage> {
private KeyPair kp;
- private KeyPairGenerator kpg;
+ private final KeyPairGenerator kpg;
private int keysize = 0;
private ECParameterSpec spec = null;
diff --git a/src/cz/crcs/ectester/standalone/test/base/PerformanceTest.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/base/PerformanceTest.java
index 258ca12..d50c7e9 100644
--- a/src/cz/crcs/ectester/standalone/test/base/PerformanceTest.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/base/PerformanceTest.java
@@ -4,6 +4,7 @@ import cz.crcs.ectester.common.test.BaseTestable;
import cz.crcs.ectester.common.test.Result;
import cz.crcs.ectester.common.test.SimpleTest;
import cz.crcs.ectester.common.test.TestCallback;
+import cz.crcs.ectester.standalone.libs.ProviderECLibrary;
import java.util.Arrays;
@@ -11,6 +12,8 @@ import java.util.Arrays;
* @author David Hofman
*/
public class PerformanceTest extends SimpleTest<BaseTestable> {
+
+ private ProviderECLibrary library;
private long[] times;
private long mean;
private long median;
@@ -18,23 +21,24 @@ public class PerformanceTest extends SimpleTest<BaseTestable> {
private final int count;
private final String desc;
- private PerformanceTest(BaseTestable testable, int count, String desc) {
+ private PerformanceTest(BaseTestable testable, ProviderECLibrary library, int count, String desc) {
super(testable, new TestCallback<BaseTestable>() {
@Override
public Result apply(BaseTestable testable) {
return new Result(Result.Value.SUCCESS);
}
});
+ this.library = library;
this.count = count;
this.desc = desc;
}
- public static PerformanceTest repeat(BaseTestable testable, int count) {
- return new PerformanceTest(testable, count, null);
+ public static PerformanceTest repeat(BaseTestable testable, ProviderECLibrary library, int count) {
+ return new PerformanceTest(testable, library, count, null);
}
- public static PerformanceTest repeat(BaseTestable testable, String desc, int count) {
- return new PerformanceTest(testable, count, desc);
+ public static PerformanceTest repeat(BaseTestable testable, ProviderECLibrary library, String desc, int count) {
+ return new PerformanceTest(testable, library, count, desc);
}
@Override
@@ -99,11 +103,16 @@ public class PerformanceTest extends SimpleTest<BaseTestable> {
}
private long measureTime() {
- if(testable.hasRun()) {
- testable.reset();
+ if (testable.hasRun()) {
+ testable.reset();
+ }
+ if (library.getNativeTimingSupport().isEmpty()) {
+ long startTime = System.nanoTime();
+ testable.run();
+ return System.nanoTime() - startTime;
+ } else {
+ testable.run();
+ return library.getLastNativeTiming();
}
- long startTime = System.nanoTime();
- testable.run();
- return System.nanoTime() - startTime;
}
}
diff --git a/src/cz/crcs/ectester/standalone/test/base/SignatureTest.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/base/SignatureTest.java
index a817691..a817691 100644
--- a/src/cz/crcs/ectester/standalone/test/base/SignatureTest.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/base/SignatureTest.java
diff --git a/src/cz/crcs/ectester/standalone/test/base/SignatureTestable.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/base/SignatureTestable.java
index fe81b10..fe81b10 100644
--- a/src/cz/crcs/ectester/standalone/test/base/SignatureTestable.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/base/SignatureTestable.java
diff --git a/src/cz/crcs/ectester/standalone/test/base/StandaloneTestable.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/base/StandaloneTestable.java
index 47bffc1..47bffc1 100644
--- a/src/cz/crcs/ectester/standalone/test/base/StandaloneTestable.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/base/StandaloneTestable.java
diff --git a/src/cz/crcs/ectester/standalone/test/suites/StandaloneCofactorSuite.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneCofactorSuite.java
index 52b0fbf..52b0fbf 100644
--- a/src/cz/crcs/ectester/standalone/test/suites/StandaloneCofactorSuite.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneCofactorSuite.java
diff --git a/src/cz/crcs/ectester/standalone/test/suites/StandaloneCompositeSuite.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneCompositeSuite.java
index c59d864..c59d864 100644
--- a/src/cz/crcs/ectester/standalone/test/suites/StandaloneCompositeSuite.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneCompositeSuite.java
diff --git a/src/cz/crcs/ectester/standalone/test/suites/StandaloneDefaultSuite.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneDefaultSuite.java
index 1c14ecc..1c14ecc 100644
--- a/src/cz/crcs/ectester/standalone/test/suites/StandaloneDefaultSuite.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneDefaultSuite.java
diff --git a/src/cz/crcs/ectester/standalone/test/suites/StandaloneDegenerateSuite.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneDegenerateSuite.java
index 9ab8a39..9ab8a39 100644
--- a/src/cz/crcs/ectester/standalone/test/suites/StandaloneDegenerateSuite.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneDegenerateSuite.java
diff --git a/src/cz/crcs/ectester/standalone/test/suites/StandaloneEdgeCasesSuite.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneEdgeCasesSuite.java
index 3624aaa..1900bea 100644
--- a/src/cz/crcs/ectester/standalone/test/suites/StandaloneEdgeCasesSuite.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneEdgeCasesSuite.java
@@ -1,6 +1,5 @@
package cz.crcs.ectester.standalone.test.suites;
-import cz.crcs.ectester.applet.EC_Consts;
import cz.crcs.ectester.common.cli.TreeCommandLine;
import cz.crcs.ectester.common.ec.*;
import cz.crcs.ectester.common.output.TestWriter;
diff --git a/src/cz/crcs/ectester/standalone/test/suites/StandaloneInvalidSuite.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneInvalidSuite.java
index ace8945..ace8945 100644
--- a/src/cz/crcs/ectester/standalone/test/suites/StandaloneInvalidSuite.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneInvalidSuite.java
diff --git a/src/cz/crcs/ectester/standalone/test/suites/StandaloneMiscSuite.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneMiscSuite.java
index f3a10eb..f3a10eb 100644
--- a/src/cz/crcs/ectester/standalone/test/suites/StandaloneMiscSuite.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneMiscSuite.java
diff --git a/src/cz/crcs/ectester/standalone/test/suites/StandalonePerformanceSuite.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandalonePerformanceSuite.java
index dd50862..e3b6d2e 100644
--- a/src/cz/crcs/ectester/standalone/test/suites/StandalonePerformanceSuite.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandalonePerformanceSuite.java
@@ -93,7 +93,7 @@ public class StandalonePerformanceSuite extends StandaloneTestSuite {
kgtOne = new KeyGeneratorTestable(kpg);
kgtOther = new KeyGeneratorTestable(kpg);
}
- kpgTests.add(PerformanceTest.repeat(kgtOne, kpgIdent.getName(), count));
+ kpgTests.add(PerformanceTest.repeat(kgtOne, cfg.selected, kpgIdent.getName(), count));
}
runTest(KeyGeneratorTest.expect(kgtOther, Result.ExpectedValue.SUCCESS));
doTest(CompoundTest.all(Result.ExpectedValue.SUCCESS, "KeyPairGenerator performance tests", kpgTests.toArray(new Test[0])));
@@ -108,7 +108,7 @@ public class StandalonePerformanceSuite extends StandaloneTestSuite {
} else {
testable = new KeyAgreementTestable(ka, kgtOne, kgtOther, spec);
}
- kaTests.add(PerformanceTest.repeat(testable, kaIdent.getName(), count));
+ kaTests.add(PerformanceTest.repeat(testable, cfg.selected, kaIdent.getName(), count));
}
}
if(kaTests.isEmpty()) {
@@ -121,10 +121,10 @@ public class StandalonePerformanceSuite extends StandaloneTestSuite {
for (SignatureIdent sigIdent : cfg.selected.getSigs()) {
if (sigAlgo == null || sigIdent.containsAny(sigTypes)) {
Signature sig = sigIdent.getInstance(cfg.selected.getProvider());
- sigTests.add(PerformanceTest.repeat(new SignatureTestable(sig, kgtOne, null), sigIdent.getName(),count));
+ sigTests.add(PerformanceTest.repeat(new SignatureTestable(sig, kgtOne, null), cfg.selected, sigIdent.getName(),count));
if(kgtOne.getKeyPair() != null) {
ECPrivateKey signKey = (ECPrivateKey) kgtOne.getKeyPair().getPrivate();
- sigTestsNoVerification.add(PerformanceTest.repeat(new SignatureTestable(sig, signKey, null, null), sigIdent.getName(), count));
+ sigTestsNoVerification.add(PerformanceTest.repeat(new SignatureTestable(sig, signKey, null, null), cfg.selected, sigIdent.getName(), count));
}
}
}
diff --git a/src/cz/crcs/ectester/standalone/test/suites/StandaloneSignatureSuite.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneSignatureSuite.java
index 94e810e..94e810e 100644
--- a/src/cz/crcs/ectester/standalone/test/suites/StandaloneSignatureSuite.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneSignatureSuite.java
diff --git a/src/cz/crcs/ectester/standalone/test/suites/StandaloneTestSuite.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneTestSuite.java
index e4e0013..e4e0013 100644
--- a/src/cz/crcs/ectester/standalone/test/suites/StandaloneTestSuite.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneTestSuite.java
diff --git a/src/cz/crcs/ectester/standalone/test/suites/StandaloneTestVectorSuite.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneTestVectorSuite.java
index 1e1889c..1e1889c 100644
--- a/src/cz/crcs/ectester/standalone/test/suites/StandaloneTestVectorSuite.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneTestVectorSuite.java
diff --git a/src/cz/crcs/ectester/standalone/test/suites/StandaloneTwistSuite.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneTwistSuite.java
index f182952..f182952 100644
--- a/src/cz/crcs/ectester/standalone/test/suites/StandaloneTwistSuite.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneTwistSuite.java
diff --git a/src/cz/crcs/ectester/standalone/test/suites/StandaloneWrongSuite.java b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneWrongSuite.java
index 79b0b7d..a457a33 100644
--- a/src/cz/crcs/ectester/standalone/test/suites/StandaloneWrongSuite.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/test/suites/StandaloneWrongSuite.java
@@ -1,6 +1,5 @@
package cz.crcs.ectester.standalone.test.suites;
-import cz.crcs.ectester.applet.EC_Consts;
import cz.crcs.ectester.common.cli.TreeCommandLine;
import cz.crcs.ectester.common.ec.*;
import cz.crcs.ectester.common.output.TestWriter;
@@ -253,7 +252,7 @@ public class StandaloneWrongSuite extends StandaloneTestSuite {
*/
curveMap = EC_Store.getInstance().getObjects(EC_Curve.class, "secg");
curves = curveMap.entrySet().stream().filter((e) -> e.getKey().endsWith("r1") &&
- e.getValue().getField() == javacard.security.KeyPair.ALG_EC_F2M).map(Map.Entry::getValue).collect(Collectors.toList());
+ e.getValue().getField() == EC_Consts.ALG_EC_F2M).map(Map.Entry::getValue).collect(Collectors.toList());
for (EC_Curve curve : curves) {
short bits = curve.getBits();
byte[][] coeffBytes;
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/.clang-format b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/.clang-format
index 0aa8562..0aa8562 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/.clang-format
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/.clang-format
diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/.gitignore b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/.gitignore
new file mode 100644
index 0000000..5b1c500
--- /dev/null
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/.gitignore
@@ -0,0 +1,5 @@
+*.o
+*.so
+
+CMakeLists.txt
+cmake-build-debug \ No newline at end of file
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/Makefile b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile
index c3995e3..1fa16c0 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/Makefile
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile
@@ -5,10 +5,11 @@ CC?=gcc
CXX?=g++
LFLAGS+=-fPIC -shared
-CFLAGS+=-fPIC -I"$(JNI_INCLUDEDIR)" -I"$(JNI_PLATFORMINCLUDEDIR)" -I.
-CXXFLAGS+=-fPIC -I"$(JNI_INCLUDEDIR)" -I"$(JNI_PLATFORMINCLUDEDIR)" -I.
+CFLAGS+=-fPIC -I"$(JNI_INCLUDEDIR)" -I"$(JNI_PLATFORMINCLUDEDIR)" -I. -Wno-deprecated-declarations
+CXXFLAGS+=-fPIC -I"$(JNI_INCLUDEDIR)" -I"$(JNI_PLATFORMINCLUDEDIR)" -I. -Wno-deprecated-declarations
DEBUG ?= 0
+PROJECT_ROOT_PATH ?= ../../../../../../../../../..
ifeq ($(DEBUG), 1)
CFLAGS+=-g -Wall
@@ -38,7 +39,7 @@ ifneq ($(JAVA_HOME),)
endif
ifeq ($(JNI_INCLUDEDIR),)
- $(error Could not determine JNI include dir. Try specifying either JAVA_HOME or JNI_INCLUDEDIR.)
+ $(error "Could not determine JNI include dir. Try specifying either JAVA_HOME or JNI_INCLUDEDIR.")
endif
TARGETTRIPLET := $(shell $(CC) -dumpmachine)
@@ -58,7 +59,7 @@ JNI_PLATFORMINCLUDEDIR ?= $(JNI_INCLUDEDIR)/$(JNI_PLATFORM)
###############################################################################
## Targets.
-all: tomcrypt botan cryptopp openssl boringssl gcrypt mbedtls ippcp matrixssl nettle libressl
+all: tomcrypt botan cryptopp openssl boringssl gcrypt mbedtls ippcp nettle libressl
# Common utils
c_utils.o: c_utils.c
@@ -85,13 +86,13 @@ openssl.o: openssl.c
boringssl: boringssl_provider.so
lib_boringssl.so:
- cp ../../../../../../../ext/boringssl/build/crypto/libcrypto.so lib_boringssl.so
+ cp $(PROJECT_ROOT_PATH)/ext/boringssl/build/crypto/libcrypto.so lib_boringssl.so
boringssl_provider.so: boringssl.o c_utils.o | lib_timing.so lib_boringssl.so
$(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_boringssl.so -l:lib_timing.so
boringssl.o: boringssl.c
- $(CC) -I../../../../../../../ext/boringssl/include/ $(CFLAGS) -c $<
+ $(CC) -I$(PROJECT_ROOT_PATH)/ext/boringssl/include/ $(CFLAGS) -c $<
# libgcrypt shim
@@ -141,34 +142,27 @@ cryptopp.o: cryptopp.cpp
# mbedTLS shim
mbedtls: mbedtls_provider.so
-mbedtls_provider.so: mbedtls.o c_utils.o | lib_timing.so
- $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. -lmbedcrypto -l:lib_timing.so
+lib_mbedtls.so:
+ cp $(PROJECT_ROOT_PATH)/ext/mbedtls/build/library/libmbedcrypto.so lib_mbedtls.so
+
+mbedtls_provider.so: mbedtls.o c_utils.o | lib_timing.so lib_mbedtls.so
+ $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_mbedtls.so -l:lib_timing.so
mbedtls.o: mbedtls.c
- $(CC) $(CFLAGS) -c $<
+ $(CC) -I$(PROJECT_ROOT_PATH)/ext/mbedtls/build/include/ $(CFLAGS) -c $<
# Intel Performance Primitives crypto shim
ippcp: ippcp_provider.so
lib_ippcp.so:
- cp ../../../../../../../ext/ipp-crypto/build/.build/RELEASE/lib/libippcp.so lib_ippcp.so
+ cp $(PROJECT_ROOT_PATH)/ext/ipp-crypto/build/.build/RELEASE/lib/libippcp.so lib_ippcp.so
ippcp_provider.so: ippcp.o c_utils.o | lib_timing.so lib_ippcp.so
$(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_ippcp.so -l:lib_timing.so
ippcp.o: ippcp.c
- $(CC) -I../../../../../../../ext/ipp-crypto/build/.build/RELEASE/include/ $(CFLAGS) -c $<
-
-
-# MatrixSSL shim
-matrixssl: matrixssl_provider.so
-
-matrixssl_provider.so: matrixssl.o c_utils.o | lib_timing.so
- $(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' -L. $^ libcrypt_s.a libcore_s.a -l:lib_timing.so
-
-matrixssl.o: matrixssl.c
- $(CC) $(CFLAGS) -Imatrixssl/ -c $<
+ $(CC) -I$(PROJECT_ROOT_PATH)/ext/ipp-crypto/build/.build/RELEASE/include/ $(CFLAGS) -c $<
# Nettle shim
@@ -185,13 +179,13 @@ nettle.o: nettle.c
libressl: libressl_provider.so
lib_libressl.so:
- cp ../../../../../../../ext/libressl/build/crypto/libcrypto.so lib_libressl.so
+ cp $(PROJECT_ROOT_PATH)/ext/libressl/build/crypto/libcrypto.so lib_libressl.so
libressl_provider.so: libressl.o c_utils.o | lib_timing.so lib_libressl.so
$(CC) $(LFLAGS) -o $@ -Wl,-rpath,'$$ORIGIN/lib' $^ -L. lib_libressl.so -l:lib_timing.so
libressl.o: libressl.c
- $(CC) -I../../../../../../../ext/libressl/include/ $(CFLAGS) -c $<
+ $(CC) -I$(PROJECT_ROOT_PATH)/ext/libressl/build/include/ $(CFLAGS) -c $<
help:
@@ -205,7 +199,6 @@ help:
@echo " - cryptopp"
@echo " - mbedtls"
@echo " - ippcp"
- @echo " - matrixssl"
@echo " - nettle"
@echo " - libressl"
@@ -214,4 +207,4 @@ clean:
rm -rf *.o
rm -rf *.so
-.PHONY: all help clean openssl boringssl gcrypt tomcrypt botan cryptopp mbedtls ippcp matrixssl nettle libressl
+.PHONY: all help clean openssl boringssl gcrypt tomcrypt botan cryptopp mbedtls ippcp nettle libressl
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/Makefile.bat b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile.bat
index a8b51f4..e6c98d5 100755
--- a/src/cz/crcs/ectester/standalone/libs/jni/Makefile.bat
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile.bat
@@ -1,163 +1,163 @@
-@if not defined _echo echo off
-setlocal EnableDelayedExpansion
-
-:: ENV variables respected:
-:: - JAVA_HOME
-:: - CC
-:: - USE_EXT_MSCNG
-:: - DEBUG
-
-:: See if we are cleaning.
-if "%1" == "clean" (
- echo ** cleaning
- del *.dll *.exp *.lib *.obj
- exit
-)
-
-set TAB=
-
-
-:: Determine arch.
-reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" | find /i "x86" > NUL 2>&1 && (set ARCH=32& set ARCH_S=x86& set ARCH_VS=x86) || (set ARCH=64& set ARCH_S=x64& set ARCH_VS=amd64)
-
-echo ** ARCH%TAB%%TAB%%ARCH_S%
-
-
-:: Find a working visual studio environment.
-set found=0
-set vsw_path="%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"
-
-set vs_path=
-for /f "usebackq delims=" %%i in (`%vsw_path% -nologo -prerelease -latest -property installationPath`) do (
- if exist "%%i\Common7\Tools\vsdevcmd.bat" (
- echo ** VsDevCmd%TAB%%TAB%%%i\Common7\Tools\vsdevcmd.bat
- call "%%i\Common7\Tools\vsdevcmd.bat" -no_logo -arch=%ARCH_VS%
- if ERRORLEVEL 1 (
- echo nope.
- ) else (
- set found=1
- set vs_path=%%i
- break
- )
- )
-)
-
-:: Test if we have a visual studio env.
-if %found% EQU 0 (
- echo Working VsDevCmd not found.
- exit /b 2
-)
-
-echo ** VS_PATH%TAB%%TAB%%vs_path%
-
-
-:: Try to find vcruntime.
-set vc_base=%vs_path%\VC\Tools\MSVC\
-if exist %vc_base% (
- set vc_version=
- for /f "delims=" %%i in ('dir /b /on "!vc_base!"') do (
- set vc_version=%%i
- )
- echo ** VC_VERSION%TAB%!vc_version!
- set vc_include=%vc_base%!vc_version!\include
- set vc_lib=%vc_base%!vc_version!\lib\%ARCH_S%
-)
-
-
-:: Get the paths to Microsoft CNG SDK.
-set root_rel=..\..\..\..\..\..\..\
-set mscng_rel_include=ext\mscng\10\Include
-set mscng_rel_lib=ext\mscng\10\Lib
-
-pushd %root_rel%
-pushd %mscng_rel_include%
-set mscng_include=%CD%
-popd
-pushd %mscng_rel_lib%
-set mscng_lib=%CD%
-popd
-popd
-
-set mscng_lib_arch=%mscng_lib%\X%ARCH%
-
-echo ** CNG_INCLUDE%TAB%%mscng_include%
-echo ** CNG_LIB%TAB%%TAB%%mscng_lib_arch%
-
-
-:: Get the paths to Java JNI.
-if not defined JAVA_HOME (
- set jva=
- for /f "delims=" %%i in ('where javac') do (
- set jva=%%~dpi
- )
- pushd !jva!\..
- set JAVA_HOME=!CD!
- popd
-)
-
-echo ** JAVA_HOME%TAB%%JAVA_HOME%
-
-set JNI_INCLUDEDIR=%JAVA_HOME%\include
-set JNI_PLATFORMINCLUDEDIR=%JNI_INCLUDEDIR%\win32
-set JNI_LIBDIR=%JAVA_HOME%\lib
-
-
-:: Setup binaries.
-if not defined CC (
- set CC=cl.exe
-)
-
-echo ** CC%TAB%%TAB%%CC%
-
-
-:: Try to find uCRT.
-set ucrt_base=%ProgramFiles(x86)%\Windows Kits\10\
-if exist %ucrt_base% (
- set ucrt_version=
- for /f "delims=" %%i in ('dir /b /on "!ucrt_base!\Include"') do (
- set ucrt_version=%%i
- )
- echo ** uCRT%TAB%%TAB%!ucrt_version!
- set ucrt_include=%ucrt_base%Include\!ucrt_version!\ucrt
- set ucrt_lib=%ucrt_base%Lib\!ucrt_version!
- set ucrt_lib_arch=!ucrt_lib!\ucrt\%ARCH_S%
-)
-
-
-:: Setup INCLUDE paths.
-set INCLUDE_CLI=/I. /I"%JNI_INCLUDEDIR%" /I"%JNI_PLATFORMINCLUDEDIR%"
-
-if defined USE_EXT_MSCNG (
- set INCLUDE_CLI=!INCLUDE_CLI! /I"%mscng_include%"
-)
-
-echo ** INCLUDE%TAB%%TAB%%INCLUDE%
-echo ** INCLUDE_CLI%TAB%%INCLUDE_CLI%
-
-
-:: Setup LIB paths.
-set LIBPATH=/LIBPATH:"%JNI_LIBDIR%"
-
-if defined USE_EXT_MSCNG (
- set LIBPATH=!LIBPATH! /LIBPATH:"%mscng_lib_arch%"
-)
-
-echo ** LIB%TAB%%TAB%%LIB%
-echo ** LIBPATH%TAB%%TAB%%LIBPATH%
-
-
-:: Setup DEBUB options.
-set OTHER_CLI=
-if defined DEBUG (
- set OTHER_CLI=/Od /Z7
-) else (
- set OTHER_CLI=/O2
-)
-
-echo ** OTHER_CLI%TAB%%OTHER_CLI%
-echo.
-
-echo ^>^> %CC% /W2 /EHsc %OTHER_CLI% %INCLUDE_CLI% mscng.c c_utils.c c_timing.c bcrypt.lib jvm.lib kernel32.lib /Femscng_provider.dll /LD /link %LIBPATH% /nologo
-echo.
-
-%CC% /W2 /EHsc %OTHER_CLI% %INCLUDE_CLI% mscng.c c_utils.c c_timing.c bcrypt.lib jvm.lib kernel32.lib /Femscng_provider.dll /LD /link %LIBPATH% /nologo
+@if not defined _echo echo off
+setlocal EnableDelayedExpansion
+
+:: ENV variables respected:
+:: - JAVA_HOME
+:: - CC
+:: - USE_EXT_MSCNG
+:: - DEBUG
+
+:: See if we are cleaning.
+if "%1" == "clean" (
+ echo ** cleaning
+ del *.dll *.exp *.lib *.obj
+ exit
+)
+
+set TAB=
+
+
+:: Determine arch.
+reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" | find /i "x86" > NUL 2>&1 && (set ARCH=32& set ARCH_S=x86& set ARCH_VS=x86) || (set ARCH=64& set ARCH_S=x64& set ARCH_VS=amd64)
+
+echo ** ARCH%TAB%%TAB%%ARCH_S%
+
+
+:: Find a working visual studio environment.
+set found=0
+set vsw_path="%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"
+
+set vs_path=
+for /f "usebackq delims=" %%i in (`%vsw_path% -nologo -prerelease -latest -property installationPath`) do (
+ if exist "%%i\Common7\Tools\vsdevcmd.bat" (
+ echo ** VsDevCmd%TAB%%TAB%%%i\Common7\Tools\vsdevcmd.bat
+ call "%%i\Common7\Tools\vsdevcmd.bat" -no_logo -arch=%ARCH_VS%
+ if ERRORLEVEL 1 (
+ echo nope.
+ ) else (
+ set found=1
+ set vs_path=%%i
+ break
+ )
+ )
+)
+
+:: Test if we have a visual studio env.
+if %found% EQU 0 (
+ echo Working VsDevCmd not found.
+ exit /b 2
+)
+
+echo ** VS_PATH%TAB%%TAB%%vs_path%
+
+
+:: Try to find vcruntime.
+set vc_base=%vs_path%\VC\Tools\MSVC\
+if exist %vc_base% (
+ set vc_version=
+ for /f "delims=" %%i in ('dir /b /on "!vc_base!"') do (
+ set vc_version=%%i
+ )
+ echo ** VC_VERSION%TAB%!vc_version!
+ set vc_include=%vc_base%!vc_version!\include
+ set vc_lib=%vc_base%!vc_version!\lib\%ARCH_S%
+)
+
+
+:: Get the paths to Microsoft CNG SDK.
+set root_rel=..\..\..\..\..\..\..\
+set mscng_rel_include=ext\mscng\10\Include
+set mscng_rel_lib=ext\mscng\10\Lib
+
+pushd %root_rel%
+pushd %mscng_rel_include%
+set mscng_include=%CD%
+popd
+pushd %mscng_rel_lib%
+set mscng_lib=%CD%
+popd
+popd
+
+set mscng_lib_arch=%mscng_lib%\X%ARCH%
+
+echo ** CNG_INCLUDE%TAB%%mscng_include%
+echo ** CNG_LIB%TAB%%TAB%%mscng_lib_arch%
+
+
+:: Get the paths to Java JNI.
+if not defined JAVA_HOME (
+ set jva=
+ for /f "delims=" %%i in ('where javac') do (
+ set jva=%%~dpi
+ )
+ pushd !jva!\..
+ set JAVA_HOME=!CD!
+ popd
+)
+
+echo ** JAVA_HOME%TAB%%JAVA_HOME%
+
+set JNI_INCLUDEDIR=%JAVA_HOME%\include
+set JNI_PLATFORMINCLUDEDIR=%JNI_INCLUDEDIR%\win32
+set JNI_LIBDIR=%JAVA_HOME%\lib
+
+
+:: Setup binaries.
+if not defined CC (
+ set CC=cl.exe
+)
+
+echo ** CC%TAB%%TAB%%CC%
+
+
+:: Try to find uCRT.
+set ucrt_base=%ProgramFiles(x86)%\Windows Kits\10\
+if exist %ucrt_base% (
+ set ucrt_version=
+ for /f "delims=" %%i in ('dir /b /on "!ucrt_base!\Include"') do (
+ set ucrt_version=%%i
+ )
+ echo ** uCRT%TAB%%TAB%!ucrt_version!
+ set ucrt_include=%ucrt_base%Include\!ucrt_version!\ucrt
+ set ucrt_lib=%ucrt_base%Lib\!ucrt_version!
+ set ucrt_lib_arch=!ucrt_lib!\ucrt\%ARCH_S%
+)
+
+
+:: Setup INCLUDE paths.
+set INCLUDE_CLI=/I. /I"%JNI_INCLUDEDIR%" /I"%JNI_PLATFORMINCLUDEDIR%"
+
+if defined USE_EXT_MSCNG (
+ set INCLUDE_CLI=!INCLUDE_CLI! /I"%mscng_include%"
+)
+
+echo ** INCLUDE%TAB%%TAB%%INCLUDE%
+echo ** INCLUDE_CLI%TAB%%INCLUDE_CLI%
+
+
+:: Setup LIB paths.
+set LIBPATH=/LIBPATH:"%JNI_LIBDIR%"
+
+if defined USE_EXT_MSCNG (
+ set LIBPATH=!LIBPATH! /LIBPATH:"%mscng_lib_arch%"
+)
+
+echo ** LIB%TAB%%TAB%%LIB%
+echo ** LIBPATH%TAB%%TAB%%LIBPATH%
+
+
+:: Setup DEBUB options.
+set OTHER_CLI=
+if defined DEBUG (
+ set OTHER_CLI=/Od /Z7
+) else (
+ set OTHER_CLI=/O2
+)
+
+echo ** OTHER_CLI%TAB%%OTHER_CLI%
+echo.
+
+echo ^>^> %CC% /W2 /EHsc %OTHER_CLI% %INCLUDE_CLI% mscng.c c_utils.c c_timing.c bcrypt.lib jvm.lib kernel32.lib /Femscng_provider.dll /LD /link %LIBPATH% /nologo
+echo.
+
+%CC% /W2 /EHsc %OTHER_CLI% %INCLUDE_CLI% mscng.c c_utils.c c_timing.c bcrypt.lib jvm.lib kernel32.lib /Femscng_provider.dll /LD /link %LIBPATH% /nologo
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/boringssl.c b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/boringssl.c
index bca2ead..4cc95a5 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/boringssl.c
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/boringssl.c
@@ -1,5 +1,8 @@
+#include "c_utils.h"
+#include "c_timing.h"
+
#include "native.h"
-#include <string.h>
+#include <strings.h>
#include <openssl/conf.h>
#include <openssl/opensslv.h>
@@ -12,9 +15,11 @@
#include <openssl/ecdh.h>
#include <openssl/ecdsa.h>
-#include "c_utils.h"
-#include "c_timing.h"
-
+/*
+ * BoringSSL:
+ * - Supports prime field curves only.
+ * - Named curves and explicit params.
+ */
static jclass provider_class;
@@ -113,6 +118,7 @@ static EC_GROUP *create_curve(JNIEnv *env, jobject params) {
jobject field = (*env)->CallObjectMethod(env, elliptic_curve, get_field);
if ((*env)->IsInstanceOf(env, field, f2m_field_class)) {
+
return NULL;
}
@@ -192,7 +198,8 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPa
if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) {
EC_GROUP *curve = create_curve(env, params);
jboolean result = !curve;
- EC_GROUP_free(curve);
+ if (curve)
+ EC_GROUP_free(curve);
return result;
} else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) {
jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
@@ -345,6 +352,10 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPai
JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Boringssl_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2(JNIEnv *env, jobject self, jobject params, jobject random) {
if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) {
EC_GROUP *curve = create_curve(env, params);
+ if (!curve) {
+ throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
+ return NULL;
+ }
jobject result = generate_from_curve(env, curve);
EC_GROUP_free(curve);
return result;
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/botan.cpp b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/botan.cpp
index c0d249c..c5bc5f1 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/botan.cpp
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/botan.cpp
@@ -16,6 +16,12 @@
#include "cpp_utils.hpp"
#include "c_timing.h"
+/*
+ * Botan:
+ * - Supports prime field curves only.
+ * - Named curves and explicit params.
+ */
+
static jclass provider_class;
static Botan::AutoSeeded_RNG rng;
@@ -32,7 +38,7 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_BotanLib_createP
name_str.insert(0, "Botan ");
jstring name = env->NewStringUTF(name_str.c_str());
- double version = strtod(v_str, NULL);
+ double version = strtod(v_str, nullptr);
jstring info = env->NewStringUTF(info_str);
return env->NewObject(provider_class, init, name, version, info);
@@ -86,8 +92,7 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_BotanLib_getCurv
jobject result = env->NewObject(set_class, set_ctr);
const std::set<std::string>& curves = Botan::EC_Group::known_named_groups();
- for (auto it = curves.begin(); it != curves.end(); ++it) {
- std::string curve_name = *it;
+ for (const auto& curve_name : curves) {
jstring name_str = env->NewStringUTF(curve_name.c_str());
env->CallBooleanMethod(result, set_add, name_str);
}
@@ -99,8 +104,8 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPa
return JNI_TRUE;
}
-JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Botan_paramsSupported(JNIEnv *env, jobject self, jobject params){
- if (params == NULL) {
+jboolean check_params(JNIEnv *env, jobject params) {
+ if (params == nullptr) {
return JNI_FALSE;
}
@@ -117,8 +122,8 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPa
} else if (env->IsInstanceOf(params, ecgen_parameter_spec_class)) {
const std::set<std::string>& curves = Botan::EC_Group::known_named_groups();
jmethodID get_name = env->GetMethodID(ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
- jstring name = (jstring) env->CallObjectMethod(params, get_name);
- const char *utf_name = env->GetStringUTFChars(name, NULL);
+ auto name = (jstring) env->CallObjectMethod(params, get_name);
+ const char *utf_name = env->GetStringUTFChars(name, nullptr);
std::string str_name(utf_name);
env->ReleaseStringUTFChars(name, utf_name);
if (curves.find(str_name) != curves.end()) {
@@ -128,10 +133,14 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPa
return JNI_FALSE;
}
+JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Botan_paramsSupported(JNIEnv *env, jobject self, jobject params){
+ return check_params(env, params);
+}
+
static jobject biginteger_from_bigint(JNIEnv *env, const Botan::BigInt& bigint) {
std::vector<uint8_t> bigint_data = Botan::BigInt::encode(bigint);
jbyteArray bigint_array = env->NewByteArray(bigint_data.size());
- jbyte * bigint_bytes = env->GetByteArrayElements(bigint_array, NULL);
+ jbyte *bigint_bytes = env->GetByteArrayElements(bigint_array, nullptr);
std::copy(bigint_data.begin(), bigint_data.end(), bigint_bytes);
env->ReleaseByteArrayElements(bigint_array, bigint_bytes, 0);
@@ -143,7 +152,7 @@ static Botan::BigInt bigint_from_biginteger(JNIEnv *env, jobject biginteger) {
jmethodID to_byte_array = env->GetMethodID(biginteger_class, "toByteArray", "()[B");
jbyteArray byte_array = (jbyteArray) env->CallObjectMethod(biginteger, to_byte_array);
jsize byte_length = env->GetArrayLength(byte_array);
- jbyte *byte_data = env->GetByteArrayElements(byte_array, NULL);
+ jbyte *byte_data = env->GetByteArrayElements(byte_array, nullptr);
Botan::BigInt result((unsigned char *) byte_data, byte_length);
env->ReleaseByteArrayElements(byte_array, byte_data, JNI_ABORT);
return result;
@@ -195,7 +204,7 @@ static Botan::EC_Group group_from_params(JNIEnv *env, jobject params) {
} else if (env->IsInstanceOf(params, ecgen_parameter_spec_class)) {
jmethodID get_name = env->GetMethodID(ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
jstring name = (jstring) env->CallObjectMethod(params, get_name);
- const char *utf_name = env->GetStringUTFChars(name, NULL);
+ const char *utf_name = env->GetStringUTFChars(name, nullptr);
std::string curve_name(utf_name);
env->ReleaseStringUTFChars(name, utf_name);
return Botan::EC_Group(curve_name);
@@ -236,7 +245,7 @@ static jobject generate_from_group(JNIEnv* env, jobject self, Botan::EC_Group gr
jclass botan_kpg_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi$Botan");
jfieldID type_id = env->GetFieldID(botan_kpg_class, "type", "Ljava/lang/String;");
jstring type = (jstring) env->GetObjectField(self, type_id);
- const char* type_data = env->GetStringUTFChars(type, NULL);
+ const char* type_data = env->GetStringUTFChars(type, nullptr);
std::string type_str(type_data);
env->ReleaseStringUTFChars(type, type_data);
@@ -255,7 +264,7 @@ static jobject generate_from_group(JNIEnv* env, jobject self, Botan::EC_Group gr
native_timing_stop();
} catch (Botan::Exception & ex) {
throw_new(env, "java/security/GeneralSecurityException", ex.what());
- return NULL;
+ return nullptr;
}
jobject ec_param_spec = params_from_group(env, group);
@@ -264,7 +273,7 @@ static jobject generate_from_group(JNIEnv* env, jobject self, Botan::EC_Group gr
std::vector<uint8_t> pub_data = pub_point.encode(Botan::PointGFp::UNCOMPRESSED);
jbyteArray pub_bytearray = env->NewByteArray(pub_data.size());
- jbyte *pub_bytes = env->GetByteArrayElements(pub_bytearray, NULL);
+ jbyte *pub_bytes = env->GetByteArrayElements(pub_bytearray, nullptr);
std::copy(pub_data.begin(), pub_data.end(), pub_bytes);
env->ReleaseByteArrayElements(pub_bytearray, pub_bytes, 0);
@@ -276,7 +285,7 @@ static jobject generate_from_group(JNIEnv* env, jobject self, Botan::EC_Group gr
std::vector<uint8_t> priv_data = Botan::BigInt::encode(priv_scalar);
jbyteArray priv_bytearray = env->NewByteArray(priv_data.size());
- jbyte *priv_bytes = env->GetByteArrayElements(priv_bytearray, NULL);
+ jbyte *priv_bytes = env->GetByteArrayElements(priv_bytearray, nullptr);
std::copy(priv_data.begin(), priv_data.end(), priv_bytes);
env->ReleaseByteArrayElements(priv_bytearray, priv_bytes, 0);
@@ -291,8 +300,8 @@ static jobject generate_from_group(JNIEnv* env, jobject self, Botan::EC_Group gr
JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Botan_generate__ILjava_security_SecureRandom_2(JNIEnv *env, jobject self, jint keysize, jobject random){
const std::set<std::string>& curves = Botan::EC_Group::known_named_groups();
- for (auto it = curves.begin(); it != curves.end(); ++it) {
- Botan::EC_Group curve_group = Botan::EC_Group(*it);
+ for (const auto & curve : curves) {
+ Botan::EC_Group curve_group = Botan::EC_Group(curve);
size_t curve_size = curve_group.get_p_bits();
if (curve_size == (size_t) keysize) {
//generate on this group. Even thou no default groups are present...
@@ -301,11 +310,21 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPai
}
throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
- return NULL;
+ return nullptr;
}
JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Botan_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2(JNIEnv *env, jobject self, jobject params, jobject random){
- Botan::EC_Group curve_group = group_from_params(env, params);
+ if (!check_params(env, params)) {
+ throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
+ return nullptr;
+ }
+ Botan::EC_Group curve_group;
+ try {
+ curve_group = group_from_params(env, params);
+ } catch (Botan::Exception & ex) {
+ throw_new(env, "java/security/GeneralSecurityException", ex.what());
+ return nullptr;
+ }
return generate_from_group(env, self, curve_group);
}
@@ -340,18 +359,35 @@ static std::string get_kdf(const std::string& type_str, size_t *kdf_bits) {
}
jbyteArray generate_secret(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params, jstring algorithm) {
- Botan::EC_Group curve_group = group_from_params(env, params);
+ if (!check_params(env, params)) {
+ throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
+ return nullptr;
+ }
+ Botan::EC_Group curve_group;
+ try {
+ curve_group = group_from_params(env, params);
+ } catch (Botan::Exception & ex) {
+ throw_new(env, "java/security/GeneralSecurityException", ex.what());
+ return nullptr;
+ }
jsize privkey_length = env->GetArrayLength(privkey);
- jbyte *privkey_data = env->GetByteArrayElements(privkey, NULL);
+ jbyte *privkey_data = env->GetByteArrayElements(privkey, nullptr);
Botan::BigInt privkey_scalar((unsigned char *) privkey_data, privkey_length);
env->ReleaseByteArrayElements(privkey, privkey_data, JNI_ABORT);
Botan::ECDH_PrivateKey skey(rng, curve_group, privkey_scalar);
jsize pubkey_length = env->GetArrayLength(pubkey);
- jbyte *pubkey_data = env->GetByteArrayElements(pubkey, NULL);
- Botan::PointGFp public_point = curve_group.OS2ECP((uint8_t*) pubkey_data, pubkey_length);
+ jbyte *pubkey_data = env->GetByteArrayElements(pubkey, nullptr);
+ Botan::PointGFp public_point;
+ try {
+ public_point = curve_group.OS2ECP((uint8_t*) pubkey_data, pubkey_length);
+ } catch (Botan::Exception & ex) {
+ throw_new(env, "java/security/GeneralSecurityException", ex.what());
+ return nullptr;
+ }
+
env->ReleaseByteArrayElements(pubkey, pubkey_data, JNI_ABORT);
Botan::ECDH_PublicKey pkey(curve_group, public_point);
@@ -360,7 +396,7 @@ jbyteArray generate_secret(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteAr
jclass botan_ka_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi$Botan");
jfieldID type_id = env->GetFieldID(botan_ka_class, "type", "Ljava/lang/String;");
jstring type = (jstring) env->GetObjectField(self, type_id);
- const char *type_data = env->GetStringUTFChars(type, NULL);
+ const char *type_data = env->GetStringUTFChars(type, nullptr);
std::string type_str(type_data);
env->ReleaseStringUTFChars(type, type_data);
@@ -376,10 +412,10 @@ jbyteArray generate_secret(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteAr
native_timing_stop();
} catch (Botan::Exception & ex) {
throw_new(env, "java/security/GeneralSecurityException", ex.what());
- return NULL;
+ return nullptr;
}
jbyteArray result = env->NewByteArray(derived.size());
- jbyte *result_data = env->GetByteArrayElements(result, NULL);
+ jbyte *result_data = env->GetByteArrayElements(result, nullptr);
std::copy(derived.begin(), derived.end(), result_data);
env->ReleaseByteArrayElements(result, result_data, 0);
@@ -387,40 +423,62 @@ jbyteArray generate_secret(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteAr
}
JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Botan_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params){
- return generate_secret(env, self, pubkey, privkey, params, NULL);
+ return generate_secret(env, self, pubkey, privkey, params, nullptr);
}
JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Botan_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params, jstring algorithm) {
jbyteArray secret = generate_secret(env, self, pubkey, privkey, params, algorithm);
- if (secret == NULL) {
- return NULL;
+ if (secret == nullptr) {
+ return nullptr;
}
jmethodID spec_init = env->GetMethodID(secret_key_spec_class, "<init>", ("([BLjava/lang/String;)V"));
return env->NewObject(secret_key_spec_class, spec_init, secret, algorithm);
}
JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Botan_sign(JNIEnv *env, jobject self, jbyteArray data, jbyteArray privkey, jobject params){
- Botan::EC_Group curve_group = group_from_params(env, params);
+ if (!check_params(env, params)) {
+ throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
+ return nullptr;
+ }
+ Botan::EC_Group curve_group;
+ try {
+ curve_group = group_from_params(env, params);
+ } catch (Botan::Exception & ex) {
+ throw_new(env, "java/security/GeneralSecurityException", ex.what());
+ return nullptr;
+ }
jclass botan_sig_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi$Botan");
jfieldID type_id = env->GetFieldID(botan_sig_class, "type", "Ljava/lang/String;");
jstring type = (jstring) env->GetObjectField(self, type_id);
- const char *type_data = env->GetStringUTFChars(type, NULL);
+ const char *type_data = env->GetStringUTFChars(type, nullptr);
std::string type_str(type_data);
env->ReleaseStringUTFChars(type, type_data);
jsize privkey_length = env->GetArrayLength(privkey);
- jbyte *privkey_bytes = env->GetByteArrayElements(privkey, NULL);
- Botan::BigInt privkey_scalar((uint8_t*) privkey_bytes, privkey_length);
+ jbyte *privkey_bytes = env->GetByteArrayElements(privkey, nullptr);
+ Botan::BigInt privkey_scalar;
+ try {
+ privkey_scalar = Botan::BigInt((uint8_t*) privkey_bytes, privkey_length);
+ } catch (Botan::Exception & ex) {
+ throw_new(env, "java/security/GeneralSecurityException", ex.what());
+ env->ReleaseByteArrayElements(privkey, privkey_bytes, JNI_ABORT);
+ return NULL;
+ }
env->ReleaseByteArrayElements(privkey, privkey_bytes, JNI_ABORT);
std::unique_ptr<Botan::EC_PrivateKey> skey;
- if (type_str.find("ECDSA") != std::string::npos) {
- skey = std::make_unique<Botan::ECDSA_PrivateKey>(rng, curve_group, privkey_scalar);
- } else if (type_str.find("ECKCDSA") != std::string::npos) {
- skey = std::make_unique<Botan::ECKCDSA_PrivateKey>(rng, curve_group, privkey_scalar);
- } else if (type_str.find("ECGDSA") != std::string::npos) {
- skey = std::make_unique<Botan::ECGDSA_PrivateKey>(rng, curve_group, privkey_scalar);
+ try {
+ if (type_str.find("ECDSA") != std::string::npos) {
+ skey = std::make_unique<Botan::ECDSA_PrivateKey>(rng, curve_group, privkey_scalar);
+ } else if (type_str.find("ECKCDSA") != std::string::npos) {
+ skey = std::make_unique<Botan::ECKCDSA_PrivateKey>(rng, curve_group, privkey_scalar);
+ } else if (type_str.find("ECGDSA") != std::string::npos) {
+ skey = std::make_unique<Botan::ECGDSA_PrivateKey>(rng, curve_group, privkey_scalar);
+ }
+ } catch (Botan::Exception & ex) {
+ throw_new(env, "java/security/GeneralSecurityException", ex.what());
+ return NULL;
}
std::string emsa;
@@ -438,24 +496,24 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSig
emsa = "EMSA1(SHA-512)";
}
- Botan::PK_Signer signer(*skey, rng, emsa, Botan::DER_SEQUENCE);
-
jsize data_length = env->GetArrayLength(data);
- jbyte *data_bytes = env->GetByteArrayElements(data, NULL);
+ jbyte *data_bytes = env->GetByteArrayElements(data, nullptr);
std::vector<uint8_t> sig;
try {
+ Botan::PK_Signer signer(*skey, rng, emsa, Botan::DER_SEQUENCE);
+
native_timing_start();
sig = signer.sign_message((uint8_t*) data_bytes, data_length, rng);
native_timing_stop();
} catch (Botan::Exception & ex) {
throw_new(env, "java/security/GeneralSecurityException", ex.what());
env->ReleaseByteArrayElements(data, data_bytes, JNI_ABORT);
- return NULL;
+ return nullptr;
}
env->ReleaseByteArrayElements(data, data_bytes, JNI_ABORT);
jbyteArray result = env->NewByteArray(sig.size());
- jbyte *result_data = env->GetByteArrayElements(result, NULL);
+ jbyte *result_data = env->GetByteArrayElements(result, nullptr);
std::copy(sig.begin(), sig.end(), result_data);
env->ReleaseByteArrayElements(result, result_data, 0);
@@ -463,27 +521,49 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSig
}
JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Botan_verify(JNIEnv *env, jobject self, jbyteArray signature, jbyteArray data, jbyteArray pubkey, jobject params){
- Botan::EC_Group curve_group = group_from_params(env, params);
+ if (!check_params(env, params)) {
+ throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
+ return JNI_FALSE;
+ }
+ Botan::EC_Group curve_group;
+ try {
+ curve_group = group_from_params(env, params);
+ } catch (Botan::Exception & ex) {
+ throw_new(env, "java/security/GeneralSecurityException", ex.what());
+ return JNI_FALSE;
+ }
jclass botan_sig_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi$Botan");
jfieldID type_id = env->GetFieldID(botan_sig_class, "type", "Ljava/lang/String;");
jstring type = (jstring) env->GetObjectField(self, type_id);
- const char *type_data = env->GetStringUTFChars(type, NULL);
+ const char *type_data = env->GetStringUTFChars(type, nullptr);
std::string type_str(type_data);
env->ReleaseStringUTFChars(type, type_data);
jsize pubkey_length = env->GetArrayLength(pubkey);
- jbyte *pubkey_data = env->GetByteArrayElements(pubkey, NULL);
- Botan::PointGFp public_point = curve_group.OS2ECP((uint8_t*) pubkey_data, pubkey_length);
+ jbyte *pubkey_data = env->GetByteArrayElements(pubkey, nullptr);
+ Botan::PointGFp public_point;
+ try {
+ public_point = curve_group.OS2ECP((uint8_t*) pubkey_data, pubkey_length);
+ } catch (Botan::Exception & ex) {
+ throw_new(env, "java/security/GeneralSecurityException", ex.what());
+ env->ReleaseByteArrayElements(pubkey, pubkey_data, JNI_ABORT);
+ return JNI_FALSE;
+ }
env->ReleaseByteArrayElements(pubkey, pubkey_data, JNI_ABORT);
std::unique_ptr<Botan::EC_PublicKey> pkey;
- if (type_str.find("ECDSA") != std::string::npos) {
- pkey = std::make_unique<Botan::ECDSA_PublicKey>(curve_group, public_point);
- } else if (type_str.find("ECKCDSA") != std::string::npos) {
- pkey = std::make_unique<Botan::ECKCDSA_PublicKey>(curve_group, public_point);
- } else if (type_str.find("ECGDSA") != std::string::npos) {
- pkey = std::make_unique<Botan::ECGDSA_PublicKey>(curve_group, public_point);
+ try {
+ if (type_str.find("ECDSA") != std::string::npos) {
+ pkey = std::make_unique<Botan::ECDSA_PublicKey>(curve_group, public_point);
+ } else if (type_str.find("ECKCDSA") != std::string::npos) {
+ pkey = std::make_unique<Botan::ECKCDSA_PublicKey>(curve_group, public_point);
+ } else if (type_str.find("ECGDSA") != std::string::npos) {
+ pkey = std::make_unique<Botan::ECGDSA_PublicKey>(curve_group, public_point);
+ }
+ } catch (Botan::Exception & ex) {
+ throw_new(env, "java/security/GeneralSecurityException", ex.what());
+ return JNI_FALSE;
}
std::string emsa;
@@ -501,15 +581,16 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSigna
emsa = "EMSA1(SHA-512)";
}
- Botan::PK_Verifier verifier(*pkey, emsa, Botan::DER_SEQUENCE);
-
jsize data_length = env->GetArrayLength(data);
jsize sig_length = env->GetArrayLength(signature);
- jbyte *data_bytes = env->GetByteArrayElements(data, NULL);
- jbyte *sig_bytes = env->GetByteArrayElements(signature, NULL);
+ jbyte *data_bytes = env->GetByteArrayElements(data, nullptr);
+ jbyte *sig_bytes = env->GetByteArrayElements(signature, nullptr);
bool result;
+
try {
+ Botan::PK_Verifier verifier(*pkey, emsa, Botan::DER_SEQUENCE);
+
native_timing_start();
result = verifier.verify_message((uint8_t*)data_bytes, data_length, (uint8_t*)sig_bytes, sig_length);
native_timing_stop();
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/c_timing.c b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_timing.c
index 018ceda..018ceda 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/c_timing.c
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_timing.c
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/c_timing.h b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_timing.h
index e12ccdd..e12ccdd 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/c_timing.h
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_timing.h
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/c_utils.c b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_utils.c
index 46286fd..ac8c49d 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/c_utils.c
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_utils.c
@@ -127,16 +127,16 @@ jbyteArray asn1_der_encode(JNIEnv *env, const jbyte *r, size_t r_len, const jbyt
jbyte s_length = (jbyte) s_len + (s[0] & 0x80 ? 1 : 0);
// R and S are < 128 bytes, so 1 byte tag + 1 byte len + len bytes value
- size_t seq_value_len = 2 + r_length + 2 + s_length;
- size_t whole_len = seq_value_len;
+ jint seq_value_len = 2 + r_length + 2 + s_length;
+ jint whole_len = seq_value_len;
// The SEQUENCE length might be >= 128, so more bytes of length
- size_t seq_len_len = 0;
+ jint seq_len_len = 0;
if (seq_value_len >= 128) {
- size_t s = seq_value_len;
+ jint svl = seq_value_len;
do {
seq_len_len++;
- } while ((s = s >> 8));
+ } while ((svl = svl >> 8));
}
// seq_len_len bytes for length and one for length of length
whole_len += seq_len_len + 1;
@@ -183,11 +183,11 @@ bool asn1_der_decode(JNIEnv *env, jbyteArray sig, jbyte **r_data, size_t *r_len,
(*env)->ReleaseByteArrayElements(env, sig, data, JNI_ABORT);
return false;
}
- size_t seq_value_len = 0;
+ jint seq_value_len = 0;
if (!(data[i] & 0x80)) {
seq_value_len = data[i++];
} else {
- size_t seq_len_len = data[i++] & 0x7f;
+ jint seq_len_len = data[i++] & 0x7f;
while (seq_len_len > 0) {
seq_value_len |= (data[i++] << (seq_len_len - 1));
seq_len_len--;
@@ -232,21 +232,18 @@ char *biginteger_to_hex(JNIEnv *env, jobject big, jint bytes) {
jstring big_string = (*env)->CallObjectMethod(env, big, to_string, (jint) 16);
jsize len = (*env)->GetStringUTFLength(env, big_string);
-#if defined(__WIN32__) || defined(_MSC_VER)
- char *raw_string = _alloca(len);
-#else
- char raw_string[len];
-#endif
- (*env)->GetStringUTFRegion(env, big_string, 0, len, raw_string);
+ const char *raw_string = (*env)->GetStringUTFChars(env, big_string, 0);
- char *result = calloc(bytes, 2);
+ char *result = calloc(bytes, sizeof(char) * 2);
if (len >= bytes) {
- return strncpy(result, raw_string, 2*bytes);
+ strncpy(result, raw_string, 2*bytes);
} else {
jsize diff = bytes - len;
for (jint i = 0; i < diff*2; ++i) {
result[i] = '0';
}
- return strncpy(result + diff*2, raw_string, 2*bytes);
+ strncpy(result + diff*2, raw_string, 2*bytes);
}
+ (*env)->ReleaseStringUTFChars(env, big_string, raw_string);
+ return result;
} \ No newline at end of file
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/c_utils.h b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_utils.h
index f2f3f2f..93a11ed 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/c_utils.h
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/c_utils.h
@@ -57,11 +57,11 @@ char *biginteger_to_hex(JNIEnv *env, jobject big, jint bytes);
/**
* Some useful defines to init the provider.
*/
-#define INIT_PROVIDER(env, provider_class) jmethodID provider_put = (*env)->GetMethodID(env, provider_class, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;")
+#define INIT_PROVIDER(env, provider_class) jmethodID provider_put = (*(env))->GetMethodID(env, provider_class, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;")
#define ADD_PROPERTY(env, self, base_name, base_class, prop_name, prop_class) do { \
- jstring ec = (*env)->NewStringUTF(env, base_name prop_name); \
- jstring ec_value = (*env)->NewStringUTF(env, base_class prop_class); \
- (*env)->CallObjectMethod(env, self, provider_put, ec, ec_value); \
+ jstring ec = (*(env))->NewStringUTF(env, base_name prop_name); \
+ jstring ec_value = (*(env))->NewStringUTF(env, base_class prop_class); \
+ (*(env))->CallObjectMethod(env, self, provider_put, ec, ec_value); \
} while (0)
#define ADD_KPG(env, self, kpg_name, kpg_class) ADD_PROPERTY(env, self, "KeyPairGenerator.", "cz.crcs.ectester.standalone.libs.jni.NativeKeyPairGeneratorSpi$", kpg_name, kpg_class)
#define ADD_KA(env, self, ka_name, ka_class) ADD_PROPERTY(env, self, "KeyAgreement.", "cz.crcs.ectester.standalone.libs.jni.NativeKeyAgreementSpi$", ka_name, ka_class)
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/cpp_utils.cpp b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cpp_utils.cpp
index 20d9a3c..20d9a3c 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/cpp_utils.cpp
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cpp_utils.cpp
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/cpp_utils.hpp b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cpp_utils.hpp
index ed26c01..ed26c01 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/cpp_utils.hpp
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cpp_utils.hpp
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp
index eb782b7..6ec2060 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/cryptopp.cpp
@@ -72,6 +72,12 @@ using CryptoPP::Integer;
#include "cpp_utils.hpp"
#include "c_timing.h"
+/*
+ * Crypto++:
+* - Supports both prime field and binary field curves.
+* - Named curves (OID) and explicit params.
+ */
+
static jclass provider_class;
static AutoSeededRandomPool rng;
@@ -163,8 +169,8 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_CryptoppLib_getC
std::vector<OID> all_oids = get_all_curve_oids();
- for (auto oid = all_oids.begin(); oid != all_oids.end(); ++oid) {
- jstring name_str = env->NewStringUTF(oid_to_str(*oid).c_str());
+ for (auto & all_oid : all_oids) {
+ jstring name_str = env->NewStringUTF(oid_to_str(all_oid).c_str());
env->CallBooleanMethod(result, set_add, name_str);
}
@@ -173,16 +179,16 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_CryptoppLib_getC
JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Cryptopp_keysizeSupported(JNIEnv *env, jobject self, jint keysize){
std::vector<OID> ecp_oids = get_curve_oids<ECP>();
- for (auto oid = ecp_oids.begin(); oid != ecp_oids.end(); ++oid) {
- DL_GroupParameters_EC<ECP> group(*oid);
+ for (auto & ecp_oid : ecp_oids) {
+ DL_GroupParameters_EC<ECP> group(ecp_oid);
if (((jint) group.GetCurve().GetField().MaxElementBitLength()) == keysize) {
return JNI_TRUE;
}
}
std::vector<OID> e2n_oids = get_curve_oids<EC2N>();
- for (auto oid = e2n_oids.begin(); oid != e2n_oids.end(); ++oid) {
- DL_GroupParameters_EC<EC2N> group(*oid);
+ for (auto & e2n_oid : e2n_oids) {
+ DL_GroupParameters_EC<EC2N> group(e2n_oid);
if (((jint) group.GetCurve().FieldSize().ConvertToLong()) == keysize) {
return JNI_TRUE;
}
@@ -191,7 +197,7 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPa
}
JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Cryptopp_paramsSupported(JNIEnv *env, jobject self, jobject params){
- if (params == NULL) {
+ if (params == nullptr) {
return JNI_FALSE;
}
@@ -202,13 +208,13 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPa
// Compare with OIDs I guess?
jmethodID get_name = env->GetMethodID(ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
jstring name = (jstring) env->CallObjectMethod(params, get_name);
- const char *utf_name = env->GetStringUTFChars(name, NULL);
+ const char *utf_name = env->GetStringUTFChars(name, nullptr);
std::string str_name(utf_name);
env->ReleaseStringUTFChars(name, utf_name);
std::vector<OID> all_oids = get_all_curve_oids();
- for (auto oid = all_oids.begin(); oid != all_oids.end(); ++oid) {
- std::string oid_s = oid_to_str(*oid);
+ for (auto & all_oid : all_oids) {
+ std::string oid_s = oid_to_str(all_oid);
if (str_name == oid_s) {
return JNI_TRUE;
}
@@ -222,7 +228,7 @@ static Integer integer_from_biginteger(JNIEnv *env, jobject bigint) {
jbyteArray byte_array = (jbyteArray) env->CallObjectMethod(bigint, to_byte_array);
jsize byte_length = env->GetArrayLength(byte_array);
- jbyte *byte_data = env->GetByteArrayElements(byte_array, NULL);
+ jbyte *byte_data = env->GetByteArrayElements(byte_array, nullptr);
Integer result((byte *) byte_data, (size_t) byte_length);
env->ReleaseByteArrayElements(byte_array, byte_data, JNI_ABORT);
return result;
@@ -231,7 +237,7 @@ static Integer integer_from_biginteger(JNIEnv *env, jobject bigint) {
static jobject biginteger_from_integer(JNIEnv *env, const Integer &integer) {
jbyteArray byte_array = (jbyteArray) env->NewByteArray(integer.MinEncodedSize());
- jbyte *bigint_bytes = env->GetByteArrayElements(byte_array, NULL);
+ jbyte *bigint_bytes = env->GetByteArrayElements(byte_array, nullptr);
integer.Encode((byte *) bigint_bytes, integer.MinEncodedSize());
env->ReleaseByteArrayElements(byte_array, bigint_bytes, 0);
@@ -243,7 +249,7 @@ static jobject biginteger_from_polmod2(JNIEnv *env, const PolynomialMod2 &polmod
jmethodID biginteger_init = env->GetMethodID(biginteger_class, "<init>", "(I[B)V");
jbyteArray mod_array = env->NewByteArray(polmod.MinEncodedSize());
- jbyte *mod_data = env->GetByteArrayElements(mod_array, NULL);
+ jbyte *mod_data = env->GetByteArrayElements(mod_array, nullptr);
polmod.Encode((byte *) mod_data, polmod.MinEncodedSize());
env->ReleaseByteArrayElements(mod_array, mod_data, 0);
@@ -301,15 +307,15 @@ static std::unique_ptr<DL_GroupParameters_EC<ECP>> fp_group_from_params(JNIEnv *
} else if (env->IsInstanceOf(params, ecgen_parameter_spec_class)) {
jmethodID get_name = env->GetMethodID(ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
jstring name = (jstring) env->CallObjectMethod(params, get_name);
- const char *utf_name = env->GetStringUTFChars(name, NULL);
+ const char *utf_name = env->GetStringUTFChars(name, nullptr);
std::string str_name(utf_name);
env->ReleaseStringUTFChars(name, utf_name);
std::vector<OID> ecp_oids = get_curve_oids<ECP>();
- for (auto oid = ecp_oids.begin(); oid != ecp_oids.end(); ++oid) {
- std::string oid_s = oid_to_str(*oid);
+ for (auto & ecp_oid : ecp_oids) {
+ std::string oid_s = oid_to_str(ecp_oid);
if (str_name == oid_s) {
- return std::make_unique<DL_GroupParameters_EC<ECP>>(*oid);
+ return std::make_unique<DL_GroupParameters_EC<ECP>>(ecp_oid);
}
}
}
@@ -357,7 +363,7 @@ static std::unique_ptr<DL_GroupParameters_EC<EC2N>> f2m_group_from_params(JNIEnv
jmethodID get_midterms = env->GetMethodID(f2m_field_class, "getMidTermsOfReductionPolynomial", "()[I");
jintArray midterms = (jintArray) env->CallObjectMethod(field, get_midterms);
jsize midterm_length = env->GetArrayLength(midterms);
- jint *midterm_data = env->GetIntArrayElements(midterms, NULL);
+ jint *midterm_data = env->GetIntArrayElements(midterms, nullptr);
jmethodID get_m = env->GetMethodID(f2m_field_class, "getM", "()I");
jint m = env->CallIntMethod(field, get_m);
@@ -375,11 +381,11 @@ static std::unique_ptr<DL_GroupParameters_EC<EC2N>> f2m_group_from_params(JNIEnv
jmethodID to_byte_array = env->GetMethodID(biginteger_class, "toByteArray", "()[B");
jbyteArray a_array = (jbyteArray) env->CallObjectMethod(a, to_byte_array);
jsize a_length = env->GetArrayLength(a_array);
- jbyte *a_data = env->GetByteArrayElements(a_array, NULL);
+ jbyte *a_data = env->GetByteArrayElements(a_array, nullptr);
jbyteArray b_array = (jbyteArray) env->CallObjectMethod(b, to_byte_array);
jsize b_length = env->GetArrayLength(b_array);
- jbyte *b_data = env->GetByteArrayElements(b_array, NULL);
+ jbyte *b_data = env->GetByteArrayElements(b_array, nullptr);
EC2N curve(*base_field, EC2N::FieldElement((byte *) a_data, (size_t) a_length), EC2N::FieldElement((byte *) b_data, (size_t) b_length));
env->ReleaseByteArrayElements(a_array, a_data, JNI_ABORT);
@@ -387,13 +393,13 @@ static std::unique_ptr<DL_GroupParameters_EC<EC2N>> f2m_group_from_params(JNIEnv
jbyteArray gx_array = (jbyteArray) env->CallObjectMethod(gx, to_byte_array);
jsize gx_length = env->GetArrayLength(gx_array);
- jbyte *gx_data = env->GetByteArrayElements(gx_array, NULL);
+ jbyte *gx_data = env->GetByteArrayElements(gx_array, nullptr);
PolynomialMod2 gxm((byte *) gx_data, (size_t) gx_length);
env->ReleaseByteArrayElements(gx_array, gx_data, JNI_ABORT);
jbyteArray gy_array = (jbyteArray) env->CallObjectMethod(gy, to_byte_array);
jsize gy_length = env->GetArrayLength(gy_array);
- jbyte *gy_data = env->GetByteArrayElements(gy_array, NULL);
+ jbyte *gy_data = env->GetByteArrayElements(gy_array, nullptr);
PolynomialMod2 gym((byte *) gy_data, (size_t) gy_length);
env->ReleaseByteArrayElements(gy_array, gy_data, JNI_ABORT);
@@ -403,15 +409,15 @@ static std::unique_ptr<DL_GroupParameters_EC<EC2N>> f2m_group_from_params(JNIEnv
} else if (env->IsInstanceOf(params, ecgen_parameter_spec_class)) {
jmethodID get_name = env->GetMethodID(ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
jstring name = (jstring) env->CallObjectMethod(params, get_name);
- const char *utf_name = env->GetStringUTFChars(name, NULL);
+ const char *utf_name = env->GetStringUTFChars(name, nullptr);
std::string str_name(utf_name);
env->ReleaseStringUTFChars(name, utf_name);
std::vector<OID> e2n_oids = get_curve_oids<EC2N>();
- for (auto oid = e2n_oids.begin(); oid != e2n_oids.end(); ++oid) {
- std::string oid_s = oid_to_str(*oid);
+ for (auto & e2n_oid : e2n_oids) {
+ std::string oid_s = oid_to_str(e2n_oid);
if (str_name == oid_s) {
- return std::make_unique<DL_GroupParameters_EC<EC2N>>(*oid);
+ return std::make_unique<DL_GroupParameters_EC<EC2N>>(e2n_oid);
}
}
}
@@ -436,13 +442,13 @@ template <class EC> jobject finish_params(JNIEnv *env, jobject field, jobject a,
}
template <class EC> jobject params_from_group(JNIEnv *env, DL_GroupParameters_EC<EC> group) {
- return NULL;
+ return nullptr;
}
template <> jobject params_from_group<ECP>(JNIEnv *env, DL_GroupParameters_EC<ECP> group) {
- ECP curve = group.GetCurve();
+ const ECP& curve = group.GetCurve();
jmethodID fp_field_init = env->GetMethodID(fp_field_class, "<init>", "(Ljava/math/BigInteger;)V");
- ModularArithmetic mod = curve.GetField();
+ const ModularArithmetic& mod = curve.GetField();
jobject p = biginteger_from_integer(env, mod.GetModulus());
jobject a = biginteger_from_integer(env, curve.GetA());
jobject b = biginteger_from_integer(env, curve.GetB());
@@ -456,7 +462,7 @@ template <> jobject params_from_group<ECP>(JNIEnv *env, DL_GroupParameters_EC<EC
}
template <> jobject params_from_group<EC2N>(JNIEnv *env, DL_GroupParameters_EC<EC2N> group) {
- EC2N curve = group.GetCurve();
+ const EC2N& curve = group.GetCurve();
PolynomialMod2 mod = curve.GetField().GetModulus();
int m = mod.Degree();
unsigned int coeff_count = mod.CoefficientCount();
@@ -472,9 +478,9 @@ template <> jobject params_from_group<EC2N>(JNIEnv *env, DL_GroupParameters_EC<E
ks = env->NewIntArray(3);
to_find = 3;
} else {
- return NULL;
+ return nullptr;
}
- jint *ks_data = env->GetIntArrayElements(ks, NULL);
+ jint *ks_data = env->GetIntArrayElements(ks, nullptr);
for (int i = m - 1; i > 0 && found < to_find; --i) {
if (mod.GetCoefficient(i) == 1) {
ks_data[found++] = i;
@@ -504,11 +510,11 @@ template <class EC> jobject generate_from_group(JNIEnv *env, DL_GroupParameters_
native_timing_stop();
} catch (Exception & ex) {
throw_new(env, "java/security/GeneralSecurityException", ex.what());
- return NULL;
+ return nullptr;
}
jbyteArray pub_bytearray = env->NewByteArray(pub.SizeInBytes());
- jbyte *pub_bytes = env->GetByteArrayElements(pub_bytearray, NULL);
+ jbyte *pub_bytes = env->GetByteArrayElements(pub_bytearray, nullptr);
std::copy(pub.BytePtr(), pub.BytePtr()+pub.SizeInBytes(), pub_bytes);
env->ReleaseByteArrayElements(pub_bytearray, pub_bytes, 0);
@@ -517,7 +523,7 @@ template <class EC> jobject generate_from_group(JNIEnv *env, DL_GroupParameters_
jobject pubkey = env->NewObject(pubkey_class, ec_pub_init, pub_bytearray, ec_pub_param_spec);
jbyteArray priv_bytearray = env->NewByteArray(priv.SizeInBytes());
- jbyte *priv_bytes = env->GetByteArrayElements(priv_bytearray, NULL);
+ jbyte *priv_bytes = env->GetByteArrayElements(priv_bytearray, nullptr);
std::copy(priv.BytePtr(), priv.BytePtr()+priv.SizeInBytes(), priv_bytes);
env->ReleaseByteArrayElements(priv_bytearray, priv_bytes, 0);
@@ -532,8 +538,8 @@ template <class EC> jobject generate_from_group(JNIEnv *env, DL_GroupParameters_
JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Cryptopp_generate__ILjava_security_SecureRandom_2(JNIEnv *env, jobject self, jint keysize, jobject random){
std::vector<OID> ecp_oids = get_curve_oids<ECP>();
- for (auto oid = ecp_oids.begin(); oid != ecp_oids.end(); ++oid) {
- DL_GroupParameters_EC<ECP> group(*oid);
+ for (auto & ecp_oid : ecp_oids) {
+ DL_GroupParameters_EC<ECP> group(ecp_oid);
if (((jint) group.GetCurve().GetField().MaxElementBitLength()) == keysize) {
jobject params = params_from_group(env, group);
return generate_from_group<ECP>(env, group, params);
@@ -541,74 +547,79 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPai
}
std::vector<OID> e2n_oids = get_curve_oids<EC2N>();
- for (auto oid = e2n_oids.begin(); oid != e2n_oids.end(); ++oid) {
- DL_GroupParameters_EC<EC2N> group(*oid);
+ for (auto & e2n_oid : e2n_oids) {
+ DL_GroupParameters_EC<EC2N> group(e2n_oid);
if ((jint) group.GetCurve().FieldSize().ConvertToLong() == keysize) {
jobject params = params_from_group(env, group);
return generate_from_group<EC2N>(env, group, params);
}
}
- return NULL;
+ return nullptr;
}
JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Cryptopp_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2(JNIEnv *env, jobject self, jobject params, jobject random) {
- std::unique_ptr<DL_GroupParameters_EC<ECP>> ecp_group = fp_group_from_params(env, params);
- if (ecp_group == nullptr) {
- std::unique_ptr<DL_GroupParameters_EC<EC2N>> ec2n_group = f2m_group_from_params(env, params);
- return generate_from_group<EC2N>(env, *ec2n_group, params);
- } else {
- return generate_from_group<ECP>(env, *ecp_group, params);
+ try {
+ std::unique_ptr<DL_GroupParameters_EC<ECP>> ecp_group = fp_group_from_params(env, params);
+ if (ecp_group == nullptr) {
+ std::unique_ptr<DL_GroupParameters_EC<EC2N>> ec2n_group = f2m_group_from_params(env, params);
+ return generate_from_group<EC2N>(env, *ec2n_group, params);
+ } else {
+ return generate_from_group<ECP>(env, *ecp_group, params);
+ }
+ } catch (Exception & ex) {
+ throw_new(env, "java/security/GeneralSecurityException", ex.what());
+ return nullptr;
}
- return NULL;
+
+ return nullptr;
}
JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Cryptopp_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params) {
jsize privkey_length = env->GetArrayLength(privkey);
- jbyte *privkey_data = env->GetByteArrayElements(privkey, NULL);
+ jbyte *privkey_data = env->GetByteArrayElements(privkey, nullptr);
SecByteBlock private_key((byte *) privkey_data, privkey_length);
env->ReleaseByteArrayElements(privkey, privkey_data, JNI_ABORT);
jsize pubkey_length = env->GetArrayLength(pubkey);
- jbyte *pubkey_data = env->GetByteArrayElements(pubkey, NULL);
+ jbyte *pubkey_data = env->GetByteArrayElements(pubkey, nullptr);
SecByteBlock public_key((byte *) pubkey_data, pubkey_length);
env->ReleaseByteArrayElements(pubkey, pubkey_data, JNI_ABORT);
bool success;
std::unique_ptr<SecByteBlock> secret;
- std::unique_ptr<DL_GroupParameters_EC<ECP>> ecp_group = fp_group_from_params(env, params);
- if (ecp_group == nullptr) {
- std::unique_ptr<DL_GroupParameters_EC<EC2N>> ec2n_group = f2m_group_from_params(env, params);
- ECDH<EC2N>::Domain dh_agreement(*ec2n_group);
+ try {
+ std::unique_ptr<DL_GroupParameters_EC<ECP>> ecp_group = fp_group_from_params(env, params);
+ if (ecp_group == nullptr) {
+ std::unique_ptr<DL_GroupParameters_EC<EC2N>> ec2n_group = f2m_group_from_params(env, params);
+
+ ECDH<EC2N>::Domain dh_agreement(*ec2n_group);
- try {
secret = std::make_unique<SecByteBlock>(dh_agreement.AgreedValueLength());
native_timing_start();
success = dh_agreement.Agree(*secret, private_key, public_key);
native_timing_stop();
- } catch (Exception & ex) {
- throw_new(env, "java/security/GeneralSecurityException", ex.what());
- return NULL;
- }
- } else {
- ECDH<ECP>::Domain dh_agreement(*ecp_group);
- try {
+ } else {
+ ECDH<ECP>::Domain dh_agreement(*ecp_group);
+
secret = std::make_unique<SecByteBlock>(dh_agreement.AgreedValueLength());
native_timing_start();
success = dh_agreement.Agree(*secret, private_key, public_key);
native_timing_stop();
- } catch (Exception & ex) {
- throw_new(env, "java/security/GeneralSecurityException", ex.what());
- return NULL;
+
}
+ } catch (Exception & ex) {
+ throw_new(env, "java/security/GeneralSecurityException", ex.what());
+ return nullptr;
}
+
if (!success) {
throw_new(env, "java/security/GeneralSecurityException", "Agreement was unsuccessful.");
- return NULL;
+ return nullptr;
}
jbyteArray result = env->NewByteArray(secret->size());
- jbyte *result_data = env->GetByteArrayElements(result, NULL);
+ jbyte *result_data = env->GetByteArrayElements(result, nullptr);
std::copy(secret->begin(), secret->end(), result_data);
env->ReleaseByteArrayElements(result, result_data, 0);
@@ -617,7 +628,7 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKey
JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Cryptopp_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params, jstring algorithm){
throw_new(env, "java/lang/UnsupportedOperationException", "Not supported.");
- return NULL;
+ return nullptr;
}
template <class EC, class H>
@@ -630,7 +641,7 @@ jbyteArray sign_message(JNIEnv *env, DL_GroupParameters_EC<EC> group, jbyteArray
std::string signature(signer.MaxSignatureLength(), 0);
jsize data_length = env->GetArrayLength(data);
- jbyte *data_bytes = env->GetByteArrayElements(data, NULL);
+ jbyte *data_bytes = env->GetByteArrayElements(data, nullptr);
native_timing_start();
size_t len = signer.SignMessage(rng, (byte *)data_bytes, data_length, (byte *)signature.c_str());
native_timing_stop();
@@ -641,7 +652,7 @@ jbyteArray sign_message(JNIEnv *env, DL_GroupParameters_EC<EC> group, jbyteArray
size_t sig_len = DSAConvertSignatureFormat(sig, sizeof(sig), DSA_DER, (byte *)signature.c_str(), len, DSA_P1363);
jbyteArray result = env->NewByteArray(sig_len);
- jbyte *result_bytes = env->GetByteArrayElements(result, NULL);
+ jbyte *result_bytes = env->GetByteArrayElements(result, nullptr);
std::copy(sig, sig+sig_len, result_bytes);
env->ReleaseByteArrayElements(result, result_bytes, 0);
@@ -652,42 +663,53 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSig
jclass cryptopp_sig_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi$Cryptopp");
jfieldID type_id = env->GetFieldID(cryptopp_sig_class, "type", "Ljava/lang/String;");
jstring type = (jstring) env->GetObjectField(self, type_id);
- const char *type_data = env->GetStringUTFChars(type, NULL);
+ const char *type_data = env->GetStringUTFChars(type, nullptr);
std::string type_str(type_data);
env->ReleaseStringUTFChars(type, type_data);
jsize privkey_length = env->GetArrayLength(privkey);
- jbyte *privkey_data = env->GetByteArrayElements(privkey, NULL);
+ jbyte *privkey_data = env->GetByteArrayElements(privkey, nullptr);
Integer private_key_x((byte *) privkey_data, (size_t) privkey_length);
env->ReleaseByteArrayElements(privkey, privkey_data, JNI_ABORT);
- jbyteArray result = NULL;
+ jbyteArray result = nullptr;
std::unique_ptr<DL_GroupParameters_EC<ECP>> ecp_group = fp_group_from_params(env, params);
if (ecp_group == nullptr) {
std::unique_ptr<DL_GroupParameters_EC<EC2N>> ec2n_group = f2m_group_from_params(env, params);
- if (type_str.find("SHA1") != std::string::npos) {
- result = sign_message<EC2N, SHA1>(env, *ec2n_group, data, private_key_x);
- } else if (type_str.find("SHA224") != std::string::npos) {
- result = sign_message<EC2N, SHA224>(env, *ec2n_group, data, private_key_x);
- } else if (type_str.find("SHA256") != std::string::npos) {
- result = sign_message<EC2N, SHA256>(env, *ec2n_group, data, private_key_x);
- } else if (type_str.find("SHA384") != std::string::npos) {
- result = sign_message<EC2N, SHA384>(env, *ec2n_group, data, private_key_x);
- } else if (type_str.find("SHA512") != std::string::npos) {
- result = sign_message<EC2N, SHA512>(env, *ec2n_group, data, private_key_x);
+
+ try {
+ if (type_str.find("SHA1") != std::string::npos) {
+ result = sign_message<EC2N, SHA1>(env, *ec2n_group, data, private_key_x);
+ } else if (type_str.find("SHA224") != std::string::npos) {
+ result = sign_message<EC2N, SHA224>(env, *ec2n_group, data, private_key_x);
+ } else if (type_str.find("SHA256") != std::string::npos) {
+ result = sign_message<EC2N, SHA256>(env, *ec2n_group, data, private_key_x);
+ } else if (type_str.find("SHA384") != std::string::npos) {
+ result = sign_message<EC2N, SHA384>(env, *ec2n_group, data, private_key_x);
+ } else if (type_str.find("SHA512") != std::string::npos) {
+ result = sign_message<EC2N, SHA512>(env, *ec2n_group, data, private_key_x);
+ }
+ } catch (Exception & ex) {
+ throw_new(env, "java/security/GeneralSecurityException", ex.what());
+ return nullptr;
}
} else {
- if (type_str.find("SHA1") != std::string::npos) {
- result = sign_message<ECP, SHA1>(env, *ecp_group, data, private_key_x);
- } else if (type_str.find("SHA224") != std::string::npos) {
- result = sign_message<ECP, SHA224>(env, *ecp_group, data, private_key_x);
- } else if (type_str.find("SHA256") != std::string::npos) {
- result = sign_message<ECP, SHA256>(env, *ecp_group, data, private_key_x);
- } else if (type_str.find("SHA384") != std::string::npos) {
- result = sign_message<ECP, SHA384>(env, *ecp_group, data, private_key_x);
- } else if (type_str.find("SHA512") != std::string::npos) {
- result = sign_message<ECP, SHA512>(env, *ecp_group, data, private_key_x);
+ try {
+ if (type_str.find("SHA1") != std::string::npos) {
+ result = sign_message<ECP, SHA1>(env, *ecp_group, data, private_key_x);
+ } else if (type_str.find("SHA224") != std::string::npos) {
+ result = sign_message<ECP, SHA224>(env, *ecp_group, data, private_key_x);
+ } else if (type_str.find("SHA256") != std::string::npos) {
+ result = sign_message<ECP, SHA256>(env, *ecp_group, data, private_key_x);
+ } else if (type_str.find("SHA384") != std::string::npos) {
+ result = sign_message<ECP, SHA384>(env, *ecp_group, data, private_key_x);
+ } else if (type_str.find("SHA512") != std::string::npos) {
+ result = sign_message<ECP, SHA512>(env, *ecp_group, data, private_key_x);
+ }
+ } catch (Exception & ex) {
+ throw_new(env, "java/security/GeneralSecurityException", ex.what());
+ return nullptr;
}
}
@@ -698,7 +720,7 @@ template <class EC, class H>
jboolean verify_message(JNIEnv *env, DL_GroupParameters_EC<EC> group, jbyteArray data, jbyteArray signature, jbyteArray pubkey) {
typename EC::Point pkey_point;
jsize pubkey_length = env->GetArrayLength(pubkey);
- jbyte *pubkey_data = env->GetByteArrayElements(pubkey, NULL);
+ jbyte *pubkey_data = env->GetByteArrayElements(pubkey, nullptr);
group.GetCurve().DecodePoint(pkey_point, (byte *)pubkey_data, pubkey_length);
env->ReleaseByteArrayElements(pubkey, pubkey_data, JNI_ABORT);
@@ -710,14 +732,14 @@ jboolean verify_message(JNIEnv *env, DL_GroupParameters_EC<EC> group, jbyteArray
size_t bytes = (bit_length + 7)/8;
jsize sig_length = env->GetArrayLength(signature);
- jbyte *sig_bytes = env->GetByteArrayElements(signature, NULL);
+ jbyte *sig_bytes = env->GetByteArrayElements(signature, nullptr);
byte sig[bytes * 2];
size_t sig_len = DSAConvertSignatureFormat(sig, bytes * 2, DSA_P1363, (byte *)sig_bytes, sig_length, DSA_DER);
env->ReleaseByteArrayElements(signature, sig_bytes, JNI_ABORT);
jsize data_length = env->GetArrayLength(data);
- jbyte *data_bytes = env->GetByteArrayElements(data, NULL);
+ jbyte *data_bytes = env->GetByteArrayElements(data, nullptr);
native_timing_start();
bool result = verifier.VerifyMessage((byte *)data_bytes, data_length, sig, sig_len);
native_timing_stop();
@@ -730,7 +752,7 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSigna
jclass cryptopp_sig_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi$Cryptopp");
jfieldID type_id = env->GetFieldID(cryptopp_sig_class, "type", "Ljava/lang/String;");
jstring type = (jstring) env->GetObjectField(self, type_id);
- const char *type_data = env->GetStringUTFChars(type, NULL);
+ const char *type_data = env->GetStringUTFChars(type, nullptr);
std::string type_str(type_data);
env->ReleaseStringUTFChars(type, type_data);
@@ -738,28 +760,38 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSigna
if (ecp_group == nullptr) {
std::unique_ptr<DL_GroupParameters_EC<EC2N>> ec2n_group = f2m_group_from_params(env, params);
- if (type_str.find("SHA1") != std::string::npos) {
- return verify_message<EC2N, SHA1>(env, *ec2n_group, data, signature, pubkey);
- } else if (type_str.find("SHA224") != std::string::npos) {
- return verify_message<EC2N, SHA224>(env, *ec2n_group, data, signature, pubkey);
- } else if (type_str.find("SHA256") != std::string::npos) {
- return verify_message<EC2N, SHA256>(env, *ec2n_group, data, signature, pubkey);
- } else if (type_str.find("SHA384") != std::string::npos) {
- return verify_message<EC2N, SHA384>(env, *ec2n_group, data, signature, pubkey);
- } else if (type_str.find("SHA512") != std::string::npos) {
- return verify_message<EC2N, SHA512>(env, *ec2n_group, data, signature, pubkey);
+ try {
+ if (type_str.find("SHA1") != std::string::npos) {
+ return verify_message<EC2N, SHA1>(env, *ec2n_group, data, signature, pubkey);
+ } else if (type_str.find("SHA224") != std::string::npos) {
+ return verify_message<EC2N, SHA224>(env, *ec2n_group, data, signature, pubkey);
+ } else if (type_str.find("SHA256") != std::string::npos) {
+ return verify_message<EC2N, SHA256>(env, *ec2n_group, data, signature, pubkey);
+ } else if (type_str.find("SHA384") != std::string::npos) {
+ return verify_message<EC2N, SHA384>(env, *ec2n_group, data, signature, pubkey);
+ } else if (type_str.find("SHA512") != std::string::npos) {
+ return verify_message<EC2N, SHA512>(env, *ec2n_group, data, signature, pubkey);
+ }
+ } catch (Exception & ex) {
+ throw_new(env, "java/security/GeneralSecurityException", ex.what());
+ return JNI_FALSE;
}
} else {
- if (type_str.find("SHA1") != std::string::npos) {
- return verify_message<ECP, SHA1>(env, *ecp_group, data, signature, pubkey);
- } else if (type_str.find("SHA224") != std::string::npos) {
- return verify_message<ECP, SHA224>(env, *ecp_group, data, signature, pubkey);
- } else if (type_str.find("SHA256") != std::string::npos) {
- return verify_message<ECP, SHA256>(env, *ecp_group, data, signature, pubkey);
- } else if (type_str.find("SHA384") != std::string::npos) {
- return verify_message<ECP, SHA384>(env, *ecp_group, data, signature, pubkey);
- } else if (type_str.find("SHA512") != std::string::npos) {
- return verify_message<ECP, SHA512>(env, *ecp_group, data, signature, pubkey);
+ try {
+ if (type_str.find("SHA1") != std::string::npos) {
+ return verify_message<ECP, SHA1>(env, *ecp_group, data, signature, pubkey);
+ } else if (type_str.find("SHA224") != std::string::npos) {
+ return verify_message<ECP, SHA224>(env, *ecp_group, data, signature, pubkey);
+ } else if (type_str.find("SHA256") != std::string::npos) {
+ return verify_message<ECP, SHA256>(env, *ecp_group, data, signature, pubkey);
+ } else if (type_str.find("SHA384") != std::string::npos) {
+ return verify_message<ECP, SHA384>(env, *ecp_group, data, signature, pubkey);
+ } else if (type_str.find("SHA512") != std::string::npos) {
+ return verify_message<ECP, SHA512>(env, *ecp_group, data, signature, pubkey);
+ }
+ } catch (Exception & ex) {
+ throw_new(env, "java/security/GeneralSecurityException", ex.what());
+ return JNI_FALSE;
}
}
// unreachable
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/gcrypt.c b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/gcrypt.c
index 5d29d2c..ef62fbf 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/gcrypt.c
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/gcrypt.c
@@ -1,10 +1,18 @@
+#include "c_utils.h"
+#include "c_timing.h"
+
#include "native.h"
#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
#include <gcrypt.h>
-#include "c_utils.h"
-#include "c_timing.h"
+
+/*
+ * libgcrypt:
+ * - Supports prime field curves only.
+ * - Named curves and (likely) explicit params for keygen.
+ * - TODO: Add support for explicit params in keygen.
+ */
static jclass provider_class;
@@ -65,7 +73,7 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_GcryptLib_getCur
const char *name;
unsigned int nbits;
- for (size_t i = 0; (name = gcry_pk_get_curve(NULL, i, &nbits)); i++){
+ for (jint i = 0; (name = gcry_pk_get_curve(NULL, i, &nbits)); i++){
jstring curve_name = (*env)->NewStringUTF(env, name);
(*env)->CallBooleanMethod(env, result, hash_set_add, curve_name);
}
@@ -77,7 +85,7 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPa
const char *name;
unsigned int nbits;
- for (size_t i = 0; (name = gcry_pk_get_curve(NULL, i, &nbits)); i++){
+ for (jint i = 0; (name = gcry_pk_get_curve(NULL, i, &nbits)); i++){
if (nbits == keysize) {
return JNI_TRUE;
}
@@ -133,7 +141,7 @@ static gcry_mpi_t bytearray_to_mpi(JNIEnv *env, jbyteArray array) {
gcry_mpi_t result;
- size_t length = (*env)->GetArrayLength(env, array);
+ jsize length = (*env)->GetArrayLength(env, array);
jbyte data[length + 1];
data[0] = 0;
(*env)->GetByteArrayRegion(env, array, 0, length, data + 1);
@@ -354,6 +362,10 @@ static gcry_sexp_t create_key(JNIEnv *env, jobject ec_param_spec, const char *ke
jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;");
jobject field = (*env)->CallObjectMethod(env, elliptic_curve, get_field);
+ if (!(*env)->IsInstanceOf(env, field, fp_field_class)) {
+ return NULL;
+ }
+
jmethodID get_bits = (*env)->GetMethodID(env, fp_field_class, "getFieldSize", "()I");
jint bits = (*env)->CallIntMethod(env, field, get_bits);
jint bytes = (bits + 7) / 8;
@@ -437,6 +449,10 @@ static gcry_sexp_t create_privkey(JNIEnv *env, jobject ec_param_spec, jbyteArray
JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Gcrypt_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2(JNIEnv *env, jobject this, jbyteArray pubkey, jbyteArray privkey, jobject params) {
jbyteArray result = NULL;
gcry_sexp_t pub = create_pubkey(env, params, pubkey);
+ if (!pub) {
+ throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
+ return NULL;
+ }
gcry_mpi_t priv = bytearray_to_mpi(env, privkey);
gcry_sexp_t enc_sexp;
@@ -547,6 +563,10 @@ static void get_sign_data_sexp(JNIEnv *env, gcry_sexp_t *result, jobject this, j
JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Gcrypt_sign(JNIEnv *env, jobject this, jbyteArray data, jbyteArray privkey, jobject params) {
jbyteArray result = NULL;
gcry_sexp_t priv_sexp = create_privkey(env, params, NULL, privkey);
+ if (!priv_sexp) {
+ throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
+ return NULL;
+ }
gcry_sexp_t data_sexp;
get_sign_data_sexp(env, &data_sexp, this, data);
@@ -582,6 +602,10 @@ release_init:
JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Gcrypt_verify(JNIEnv *env, jobject this, jbyteArray sig, jbyteArray data, jbyteArray pubkey, jobject params) {
jboolean result = JNI_FALSE;
gcry_sexp_t pub_sexp = create_pubkey(env, params, pubkey);
+ if (!pub_sexp) {
+ throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
+ return JNI_FALSE;
+ }
gcry_sexp_t data_sexp;
get_sign_data_sexp(env, &data_sexp, this, data);
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/ippcp.c b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/ippcp.c
index 98a4c36..2f876d2 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/ippcp.c
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/ippcp.c
@@ -1,3 +1,6 @@
+#include "c_timing.h"
+#include "c_utils.h"
+
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
@@ -5,9 +8,6 @@
#include <ippcp.h>
-#include "c_timing.h"
-#include "c_utils.h"
-
#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
@@ -59,8 +59,6 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_IppcpLib_createP
double version = (double)lib->major + ((double)lib->minor / 10);
jstring info = (*env)->NewStringUTF(env, lib->Version);
- // printf("%s\n%s\n%d.%d.%d.%d\n", lib->Name, lib->Version, lib->major, lib->minor, lib->majorBuild, lib->build);
-
return (*env)->NewObject(env, provider_class, init, name, version, info);
}
@@ -255,6 +253,10 @@ static IppsECCPState *create_curve(JNIEnv *env, jobject params, int *keysize) {
jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;");
jobject field = (*env)->CallObjectMethod(env, curve, get_field);
+ if (!(*env)->IsInstanceOf(env, field, fp_field_class)) {
+ return NULL;
+ }
+
jmethodID get_bits = (*env)->GetMethodID(env, fp_field_class, "getFieldSize", "()I");
jint bits = (*env)->CallIntMethod(env, field, get_bits);
@@ -293,12 +295,31 @@ static IppsECCPState *create_curve(JNIEnv *env, jobject params, int *keysize) {
}
int size;
- ippsECCPGetSize(bits, &size);
+ IppStatus err = ippsECCPGetSize(bits, &size);
+ if (err != ippStsNoErr) {
+ goto err_out;
+ }
IppsECCPState *result = malloc(size);
- ippsECCPInit(bits, result);
- ippsECCPSet(p_bn, a_bn, b_bn, gx_bn, gy_bn, n_bn, h, result);
-
+ err = ippsECCPInit(bits, result);
+ if (err != ippStsNoErr) {
+ free(result);
+ goto err_out;
+ }
+ err = ippsECCPSet(p_bn, a_bn, b_bn, gx_bn, gy_bn, n_bn, h, result);
+ if (err != ippStsNoErr) {
+ free(result);
+ goto err_out;
+ }
return result;
+
+err_out:
+ free(p_bn);
+ free(a_bn);
+ free(b_bn);
+ free(gx_bn);
+ free(gy_bn);
+ free(n_bn);
+ return NULL;
}
static jobject create_ec_param_spec(JNIEnv *env, int keysize, IppsECCPState *curve) {
@@ -451,6 +472,10 @@ Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Ippcp_g
if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) {
int keysize;
IppsECCPState *curve = create_curve(env, params, &keysize);
+ if (!curve) {
+ throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
+ return NULL;
+ }
jobject result = generate_from_curve(env, keysize, curve);
free(curve);
return result;
@@ -503,6 +528,10 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKey
jint coord_size = ((*env)->GetArrayLength(env, pubkey) - 1) / 2;
jint keysize;
IppsECCPState *curve = create_curve(env, params, &keysize);
+ if (!curve) {
+ throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
+ return NULL;
+ }
if (VALIDATE_CURVE) {
IppECResult validation;
@@ -559,6 +588,10 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgr
JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Ippcp_sign(JNIEnv *env, jobject this, jbyteArray data, jbyteArray privkey, jobject params) {
jint keysize;
IppsECCPState *curve = create_curve(env, params, &keysize);
+ if (!curve) {
+ throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
+ return NULL;
+ }
if (VALIDATE_CURVE) {
IppECResult validation;
@@ -625,6 +658,10 @@ error:
JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Ippcp_verify(JNIEnv *env, jobject this, jbyteArray signature, jbyteArray data, jbyteArray pubkey, jobject params) {
jint keysize;
IppsECCPState *curve = create_curve(env, params, &keysize);
+ if (!curve) {
+ throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
+ return JNI_FALSE;
+ }
if (VALIDATE_CURVE) {
IppECResult validation;
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/libressl.c b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/libressl.c
index 79227f8..398ad1e 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/libressl.c
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/libressl.c
@@ -1,7 +1,9 @@
+#include "c_utils.h"
+#include "c_timing.h"
+
#include "native.h"
#include <string.h>
-#include <openssl/conf.h>
#include <openssl/opensslv.h>
#include <openssl/objects.h>
#include <openssl/obj_mac.h>
@@ -12,8 +14,7 @@
#include <openssl/ecdh.h>
#include <openssl/ecdsa.h>
-#include "c_utils.h"
-#include "c_timing.h"
+
static jclass provider_class;
@@ -153,26 +154,7 @@ static EC_GROUP *create_curve(JNIEnv *env, jobject params) {
BN_free(a_bn); BN_free(b_bn); BN_free(gx_bn); BN_free(gy_bn); EC_POINT_free(g_point); EC_GROUP_free(result);
return NULL;
}
- } else if ((*env)->IsInstanceOf(env, field, f2m_field_class)) {
- jmethodID get_reduction_poly = (*env)->GetMethodID(env, f2m_field_class, "getReductionPolynomial", "()Ljava/math/BigInteger;");
- jobject red_poly = (*env)->CallObjectMethod(env, field, get_reduction_poly);
-
- BIGNUM *p_bn = biginteger_to_bignum(env, red_poly);
- result = EC_GROUP_new_curve_GF2m(p_bn, a_bn, b_bn, NULL);
- BN_free(p_bn);
- if (!result) {
- throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating EC_GROUP, EC_GROUP_new_curve_GF2m.");
- BN_free(a_bn); BN_free(b_bn); BN_free(gx_bn); BN_free(gy_bn);
- return NULL;
- }
-
- g_point = EC_POINT_new(result);
- if(!EC_POINT_set_affine_coordinates_GF2m(result, g_point, gx_bn, gy_bn, NULL)) {
- throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating EC_GROUP, EC_POINT_set_affine_coordinates_GF2m.");
- BN_free(a_bn); BN_free(b_bn); BN_free(gx_bn); BN_free(gy_bn); EC_POINT_free(g_point); EC_GROUP_free(result);
- return NULL;
- }
- } else {
+ } else {
return NULL;
}
@@ -210,6 +192,9 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPa
if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) {
EC_GROUP *curve = create_curve(env, params);
+ if (!curve) {
+ return JNI_FALSE;
+ }
jboolean result = (EC_GROUP_check(curve, NULL) == 1) ? JNI_TRUE : JNI_FALSE;
EC_GROUP_free(curve);
return result;
@@ -268,51 +253,6 @@ static jobject create_ec_param_spec(JNIEnv *env, const EC_GROUP *curve) {
BN_free(a); BN_free(b); BN_free(gx); BN_free(gy);
return NULL;
}
- } else if (field_type == NID_X9_62_characteristic_two_field) {
- if (!EC_GROUP_get_curve_GF2m(curve, NULL, a, b, NULL)) {
- throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating ECParameterSpec, EC_GROUP_get_curve_GF2m.");
- BN_free(a); BN_free(b);
- return NULL;
- }
-
- int basis_type = EC_GROUP_get_basis_type(curve);
- jintArray ks;
- jint *ks_data;
- if (basis_type == NID_X9_62_tpBasis) {
- ks = (*env)->NewIntArray(env, 1);
- ks_data = (*env)->GetIntArrayElements(env, ks, NULL);
- if (!EC_GROUP_get_trinomial_basis(curve, (unsigned int *) &ks_data[0])) {
- throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating ECParameterSpec, EC_GROUP_get_trinomial_basis.");
- BN_free(a); BN_free(b);
- (*env)->ReleaseIntArrayElements(env, ks, ks_data, JNI_ABORT);
- return NULL;
- }
- } else if (basis_type == NID_X9_62_ppBasis) {
- ks = (*env)->NewIntArray(env, 3);
- ks_data = (*env)->GetIntArrayElements(env, ks, NULL);
- if (!EC_GROUP_get_pentanomial_basis(curve, (unsigned int *) &ks_data[0], (unsigned int *) &ks_data[1], (unsigned int *) &ks_data[2])) {
- throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating ECParameterSpec, EC_GROUP_get_pentanomial_basis.");
- BN_free(a); BN_free(b);
- (*env)->ReleaseIntArrayElements(env, ks, ks_data, JNI_ABORT);
- return NULL;
- }
- } else {
- return NULL;
- }
- (*env)->ReleaseIntArrayElements(env, ks, ks_data, 0);
-
- jint m = EC_GROUP_get_degree(curve);
-
- jmethodID f2m_field_init = (*env)->GetMethodID(env, f2m_field_class, "<init>", "(I[I)V");
- field = (*env)->NewObject(env, f2m_field_class, f2m_field_init, m, ks);
-
- gx = BN_new();
- gy = BN_new();
- if (!EC_POINT_get_affine_coordinates_GF2m(curve, EC_GROUP_get0_generator(curve), gx, gy, NULL)) {
- throw_new(env, "java/security/InvalidAlgorithmParameterException", "Error creating ECParameterSpec, EC_POINT_get_affine_coordinates_GF2m.");
- BN_free(a); BN_free(b); BN_free(gx); BN_free(gy);
- return NULL;
- }
} else {
return NULL;
}
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/mbedtls.c b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/mbedtls.c
index 2cff6ff..ab556d8 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/mbedtls.c
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/mbedtls.c
@@ -1,5 +1,10 @@
+#include "c_utils.h"
+#include "c_timing.h"
+
#include "native.h"
#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
#include <mbedtls/ecdsa.h>
#include <mbedtls/ecdh.h>
@@ -7,10 +12,7 @@
#include <mbedtls/version.h>
#include <mbedtls/entropy.h>
#include <mbedtls/ctr_drbg.h>
-#include <stdio.h>
-#include "c_utils.h"
-#include "c_timing.h"
static mbedtls_ctr_drbg_context ctr_drbg;
static mbedtls_entropy_context entropy;
@@ -209,7 +211,7 @@ static jobject create_ec_param_spec(JNIEnv *env, const mbedtls_ecp_group *group)
jobject field = (*env)->NewObject(env, fp_field_class, fp_field_init, p);
jobject a;
- if (group->A.p == NULL) {
+ if (mbedtls_ecp_group_a_is_minus_3(group)) {
jmethodID biginteger_subtract = (*env)->GetMethodID(env, biginteger_class, "subtract", "(Ljava/math/BigInteger;)Ljava/math/BigInteger;");
jmethodID biginteger_valueof = (*env)->GetStaticMethodID(env, biginteger_class, "valueOf", "(J)Ljava/math/BigInteger;");
jobject three = (*env)->CallStaticObjectMethod(env, biginteger_class, biginteger_valueof, (jlong) 3);
@@ -222,10 +224,14 @@ static jobject create_ec_param_spec(JNIEnv *env, const mbedtls_ecp_group *group)
jmethodID elliptic_curve_init = (*env)->GetMethodID(env, elliptic_curve_class, "<init>", "(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;)V");
jobject elliptic_curve = (*env)->NewObject(env, elliptic_curve_class, elliptic_curve_init, field, a, b);
- jobject gx = biginteger_from_mpi(env, &group->G.X);
- jobject gy = biginteger_from_mpi(env, &group->G.Y);
- jmethodID point_init = (*env)->GetMethodID(env, point_class, "<init>", "(Ljava/math/BigInteger;Ljava/math/BigInteger;)V");
- jobject g = (*env)->NewObject(env, point_class, point_init, gx, gy);
+ jclass ecutil_class = (*env)->FindClass(env, "cz/crcs/ectester/common/util/ECUtil");
+ jmethodID from_X962 = (*env)->GetStaticMethodID(env, ecutil_class, "fromX962", "([BLjava/security/spec/EllipticCurve;)Ljava/security/spec/ECPoint;");
+ size_t point_len = 2 * mbedtls_mpi_size(&group->P) + 1;
+ jbyteArray g_bytes = (*env)->NewByteArray(env, (jint) point_len);
+ jbyte *g_data = (*env)->GetByteArrayElements(env, g_bytes, NULL);
+ mbedtls_ecp_point_write_binary(group, &group->G, MBEDTLS_ECP_PF_UNCOMPRESSED, &point_len, (unsigned char *) g_data, point_len);
+ (*env)->ReleaseByteArrayElements(env, g_bytes, g_data, 0);
+ jobject g = (*env)->CallStaticObjectMethod(env, ecutil_class, from_X962, g_bytes, elliptic_curve);
jobject n = biginteger_from_mpi(env, &group->N);
jint h = 1;
@@ -234,7 +240,7 @@ static jobject create_ec_param_spec(JNIEnv *env, const mbedtls_ecp_group *group)
return (*env)->NewObject(env, ec_parameter_spec_class, ec_parameter_spec_init, elliptic_curve, g, n, h);
}
-static void create_curve(JNIEnv *env, jobject params, mbedtls_ecp_group *group) {
+static int create_curve(JNIEnv *env, jobject params, mbedtls_ecp_group *group) {
mbedtls_ecp_group_init(group);
group->id = 0;
@@ -244,6 +250,11 @@ static void create_curve(JNIEnv *env, jobject params, mbedtls_ecp_group *group)
jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;");
jobject field = (*env)->CallObjectMethod(env, curve, get_field);
+ if (!(*env)->IsInstanceOf(env, field, fp_field_class)) {
+ throw_new(env, "java/lang/UnsupportedOperationException", "Not supported.");
+ return 1;
+ }
+
jmethodID get_p = (*env)->GetMethodID(env, fp_field_class, "getP", "()Ljava/math/BigInteger;");
jobject p = (*env)->CallObjectMethod(env, field, get_p);
mpi_from_biginteger(env, p, &group->P);
@@ -259,36 +270,50 @@ static void create_curve(JNIEnv *env, jobject params, mbedtls_ecp_group *group)
jmethodID get_g = (*env)->GetMethodID(env, ec_parameter_spec_class, "getGenerator", "()Ljava/security/spec/ECPoint;");
jobject g = (*env)->CallObjectMethod(env, params, get_g);
- jmethodID get_x = (*env)->GetMethodID(env, point_class, "getAffineX", "()Ljava/math/BigInteger;");
- jobject gx = (*env)->CallObjectMethod(env, g, get_x);
- mpi_from_biginteger(env, gx, &group->G.X);
-
- jmethodID get_y = (*env)->GetMethodID(env, point_class, "getAffineY", "()Ljava/math/BigInteger;");
- jobject gy = (*env)->CallObjectMethod(env, g, get_y);
- mpi_from_biginteger(env, gy, &group->G.Y);
-
- mbedtls_mpi_lset(&group->G.Z, 1);
-
+ jclass ecutil_class = (*env)->FindClass(env, "cz/crcs/ectester/common/util/ECUtil");
+ jmethodID to_uncompressed = (*env)->GetStaticMethodID(env, ecutil_class, "toX962Uncompressed", "(Ljava/security/spec/ECPoint;I)[B");
+ jint bitsize = (jint) mbedtls_mpi_bitlen(&group->P);
+ jbyteArray point_array = (jbyteArray) (*env)->CallStaticObjectMethod(env, ecutil_class, to_uncompressed, g, bitsize);
+ jsize data_size = (*env)->GetArrayLength(env, point_array);
+ jbyte *point_data = (*env)->GetByteArrayElements(env, point_array, NULL);
+ // The mbedtls_ecp_point_read_binary function we use to setup the generator actually
+ // internally relies on the group generator already being set to a sane value.
+ // Thus, we need to set it to the point at infinity first, only then can we load the
+ // correct generator.
+ int error = mbedtls_ecp_set_zero(&group->G);
+ if (error) {
+ throw_new_var(env, "java/security/GeneralSecurityException", err_to_string(error));
+ return error;
+ }
+ error = mbedtls_ecp_point_read_binary(group, &group->G, (unsigned char *) point_data, data_size);
+ (*env)->ReleaseByteArrayElements(env, point_array, point_data, JNI_ABORT);
+ if (error) {
+ throw_new_var(env, "java/security/GeneralSecurityException", err_to_string(error));
+ return error;
+ }
+
jmethodID get_n = (*env)->GetMethodID(env, ec_parameter_spec_class, "getOrder", "()Ljava/math/BigInteger;");
jobject n = (*env)->CallObjectMethod(env, params, get_n);
mpi_from_biginteger(env, n, &group->N);
group->pbits = group->nbits = mbedtls_mpi_bitlen(&group->P);
- group->h = 0;
+ return 0;
}
static jobject generate_from_curve(JNIEnv *env, mbedtls_ecp_group *group) {
+ static int gen_counter = 0;
mbedtls_mpi d;
mbedtls_mpi_init(&d);
mbedtls_ecp_point Q;
mbedtls_ecp_point_init(&Q);
- if (ctr_drbg.reseed_counter >= ctr_drbg.reseed_interval) {
- // Reseed manually, outside of the timing window, to not disturb the timing data.
+ if (gen_counter >= MBEDTLS_CTR_DRBG_RESEED_INTERVAL/2) {
+ // Reseed manually, outside the timing window, to not disturb the timing data.
// They are somewhat disturbed anyway, but we cannot really get rid of that easily.
// We also help it by using a wrapper and pausing for random gen.
mbedtls_ctr_drbg_reseed(&ctr_drbg, NULL, 0);
}
+ gen_counter++;
native_timing_start();
int error = mbedtls_ecp_gen_keypair(group, &d, &Q, ctr_drbg_wrapper, &ctr_drbg);
@@ -363,7 +388,10 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPai
JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024MbedTLS_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2(JNIEnv *env, jobject this, jobject params, jobject random) {
if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) {
mbedtls_ecp_group curve;
- create_curve(env, params, &curve);
+ int error = create_curve(env, params, &curve);
+ if (error) {
+ return NULL;
+ }
jobject result = generate_from_curve(env, &curve);
mbedtls_ecp_group_free(&curve);
return result;
@@ -411,7 +439,10 @@ static void create_privkey(JNIEnv *env, jbyteArray privkey, mbedtls_mpi *priv) {
JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024MbedTLS_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2(JNIEnv *env, jobject this, jbyteArray pubkey, jbyteArray privkey, jobject params) {
mbedtls_ecp_group curve;
- create_curve(env, params, &curve);
+ int error = create_curve(env, params, &curve);
+ if (error) {
+ return NULL;
+ }
mbedtls_ecp_point pub;
create_pubkey(env, pubkey, &curve, &pub);
@@ -423,7 +454,7 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKey
mbedtls_mpi_init(&result);
native_timing_start();
- int error = mbedtls_ecdh_compute_shared(&curve, &result, &pub, &priv, ctr_drbg_wrapper, &ctr_drbg);
+ error = mbedtls_ecdh_compute_shared(&curve, &result, &pub, &priv, ctr_drbg_wrapper, &ctr_drbg);
native_timing_stop();
if (error) {
@@ -457,7 +488,10 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgr
JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024MbedTLS_sign(JNIEnv *env, jobject this, jbyteArray data, jbyteArray privkey, jobject params) {
mbedtls_ecp_group curve;
- create_curve(env, params, &curve);
+ int error = create_curve(env, params, &curve);
+ if (error) {
+ return NULL;
+ }
mbedtls_mpi priv;
create_privkey(env, privkey, &priv);
@@ -471,7 +505,7 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSig
jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL);
native_timing_start();
- int error = mbedtls_ecdsa_sign(&curve, &r, &s, &priv, (unsigned char *) data_data, data_size, ctr_drbg_wrapper, &ctr_drbg);
+ error = mbedtls_ecdsa_sign(&curve, &r, &s, &priv, (unsigned char *) data_data, data_size, ctr_drbg_wrapper, &ctr_drbg);
native_timing_stop();
mbedtls_mpi_free(&priv);
@@ -498,7 +532,10 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSig
JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024MbedTLS_verify(JNIEnv *env, jobject this, jbyteArray signature, jbyteArray data, jbyteArray pubkey, jobject params) {
mbedtls_ecp_group curve;
- create_curve(env, params, &curve);
+ int error = create_curve(env, params, &curve);
+ if (error) {
+ return JNI_FALSE;
+ }
mbedtls_ecp_point pub;
create_pubkey(env, pubkey, &curve, &pub);
@@ -527,7 +564,7 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSigna
jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL);
native_timing_start();
- int error = mbedtls_ecdsa_verify(&curve, (unsigned char *) data_data, data_size, &pub, &r, &s);
+ error = mbedtls_ecdsa_verify(&curve, (unsigned char *) data_data, data_size, &pub, &r, &s);
native_timing_stop();
(*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT);
@@ -541,4 +578,4 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSigna
}
return JNI_TRUE;
-} \ No newline at end of file
+}
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/mscng.c b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/mscng.c
index a182b98..88e0a48 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/mscng.c
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/mscng.c
@@ -1,1273 +1,1274 @@
-#include <windows.h>
-#include <bcrypt.h>
-#include "native.h"
-
-#include "c_timing.h"
-#include "c_utils.h"
-
-// BCRYPT and NT things.
-#define NT_SUCCESS(status) (((NTSTATUS)(status)) >= 0)
-#define NT_FAILURE(status) !NT_SUCCESS(status)
-
-#define STATUS_SUCCESS 0x00000000
-#define STATUS_INVALID_SIGNATURE 0xC000A000
-
-typedef struct {
- ULONG dwVersion; // Version of the structure
- ECC_CURVE_TYPE_ENUM dwCurveType; // Supported curve types.
- ECC_CURVE_ALG_ID_ENUM dwCurveGenerationAlgId; // For X.592 verification purposes, if we include Seed we will need to include the algorithm ID.
- ULONG cbFieldLength; // Byte length of the fields P, A, B, X, Y.
- ULONG cbSubgroupOrder; // Byte length of the subgroup.
- ULONG cbCofactor; // Byte length of cofactor of G in E.
- ULONG cbSeed; // Byte length of the seed used to generate the curve.
-} BCRYPT_ECC_PARAMETER_HEADER;
-
-// Provider things
-static jclass provider_class;
-
-#define KEYFLAG_IMPLICIT 0 // Mscng native key, over named curve
-#define KEYFLAG_EXPLICIT 1 // Mscng native key, over explicit ecc parameters
-#define KEYFLAG_NIST 2 // Mscng native key, over NIST parameters, custom ECDH/ECDSA_P* algo
-#define KEYFLAG_OTHER 3 // Other key, explicit ecc parameters
-
-JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MscngLib_createProvider(JNIEnv *env, jobject self) {
- jclass local_provider_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeProvider$Mscng");
- provider_class = (*env)->NewGlobalRef(env, local_provider_class);
-
- jmethodID init = (*env)->GetMethodID(env, local_provider_class, "<init>", "(Ljava/lang/String;DLjava/lang/String;)V");
-
- jstring name = (*env)->NewStringUTF(env, "Microsoft CNG");
- double version = 1.0;
-
- return (*env)->NewObject(env, provider_class, init, name, version, name);
-}
-
-JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Mscng_setup(JNIEnv *env, jobject self) {
- INIT_PROVIDER(env, provider_class);
-
- ADD_KPG(env, self, "ECDH", "MscngECDH");
- ADD_KPG(env, self, "ECDSA", "MscngECDSA");
-
- ADD_KA(env, self, "ECDHwithSHA1KDF(CNG)", "MscngECDHwithSHA1KDF");
- ADD_KA(env, self, "ECDHwithSHA256KDF(CNG)", "MscngECDHwithSHA256KDF");
- ADD_KA(env, self, "ECDHwithSHA384KDF(CNG)", "MscngECDHwithSHA384KDF");
- ADD_KA(env, self, "ECDHwithSHA512KDF(CNG)", "MscngECDHwithSHA512KDF");
-
- ADD_SIG(env, self, "SHA1withECDSA", "MscngECDSAwithSHA1");
- ADD_SIG(env, self, "SHA256withECDSA", "MscngECDSAwithSHA256");
- ADD_SIG(env, self, "SHA384withECDSA", "MscngECDSAwithSHA384");
- ADD_SIG(env, self, "SHA512withECDSA", "MscngECDSAwithSHA112");
-
- init_classes(env, "Mscng");
-}
-
-typedef struct {
- LPCSTR name;
- ULONG bits;
-} named_curve_t;
-
-static named_curve_t named_curves[] = {
- {"curve25519", 256}, {"brainpoolP160r1", 160}, {"brainpoolP160t1", 160}, {"brainpoolP192r1", 192}, {"brainpoolP192t1", 192},
- {"brainpoolP224r1", 224}, {"brainpoolP224t1", 224}, {"brainpoolP256r1", 256}, {"brainpoolP256t1", 256}, {"brainpoolP320r1", 320},
- {"brainpoolP320t1", 320}, {"brainpoolP384r1", 384}, {"brainpoolP384t1", 384}, {"brainpoolP512r1", 512}, {"brainpoolP512t1", 512},
- {"ec192wapi", 192}, {"nistP192", 192}, {"nistP224", 224}, {"nistP256", 256}, {"nistP384", 384},
- {"nistP521", 521}, {"numsP256t1", 256}, {"numsP384t1", 384}, {"numsP512t1", 512}, {"secP160k1", 160},
- {"secP160r1", 160}, {"secP160r2", 160}, {"secP192k1", 192}, {"secP192r1", 192}, {"secP224k1", 224},
- {"secP224r1", 224}, {"secP256k1", 256}, {"secP256r1", 256}, {"secP384r1", 384}, {"secP521r1", 521},
- {"wtls12", 224}, {"wtls7", 160}, {"wtls9", 160}, {"x962P192v1", 192}, {"x962P192v2", 192},
- {"x962P192v3", 192}, {"x962P239v1", 239}, {"x962P239v2", 239}, {"x962P239v3", 239}, {"x962P256v1", 256}};
-
-static const named_curve_t *lookup_curve(const char *name) {
- for (size_t i = 0; i < sizeof(named_curves) / sizeof(named_curve_t); ++i) {
- if (strcmp(name, named_curves[i].name) == 0) {
- return &named_curves[i];
- }
- }
- return NULL;
-}
-
-static ULONG utf_16to8(NPSTR *out_buf, LPCWSTR in_str) {
- INT result = WideCharToMultiByte(CP_UTF8, 0, in_str, -1, NULL, 0, NULL, NULL);
- *out_buf = calloc(result, 1);
- return WideCharToMultiByte(CP_UTF8, 0, in_str, -1, *out_buf, result, NULL, NULL);
-}
-
-static ULONG utf_8to16(NWPSTR *out_buf, LPCSTR in_str) {
- INT result = MultiByteToWideChar(CP_UTF8, 0, in_str, -1, NULL, 0);
- *out_buf = calloc(result * sizeof(WCHAR), 1);
- return MultiByteToWideChar(CP_UTF8, 0, in_str, -1, *out_buf, result);
-}
-
-/**
- * Convert Java String to UTF-16 NWPSTR null-terminated.
- * Returns: Length of NWPSTR in bytes!
- */
-static ULONG utf_strto16(NWPSTR *out_buf, JNIEnv *env, jobject str) {
- jsize len = (*env)->GetStringLength(env, str);
- *out_buf = calloc(len * sizeof(jchar) + 1, 1);
- const jchar *chars = (*env)->GetStringChars(env, str, NULL);
- memcpy(*out_buf, chars, len * sizeof(jchar));
- (*env)->ReleaseStringChars(env, str, chars);
- return len * sizeof(jchar);
-}
-
-JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MscngLib_getCurves(JNIEnv *env, jobject self) {
- jclass hash_set_class = (*env)->FindClass(env, "java/util/TreeSet");
-
- jmethodID hash_set_ctr = (*env)->GetMethodID(env, hash_set_class, "<init>", "()V");
- jmethodID hash_set_add = (*env)->GetMethodID(env, hash_set_class, "add", "(Ljava/lang/Object;)Z");
-
- jobject result = (*env)->NewObject(env, hash_set_class, hash_set_ctr);
-
- NTSTATUS status;
- BCRYPT_ALG_HANDLE handle;
-
- if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(&handle, BCRYPT_ECDH_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0))) {
- wprintf(L"**** Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status);
- return result;
- }
-
- ULONG bufSize;
- if (NT_FAILURE(status = BCryptGetProperty(handle, BCRYPT_ECC_CURVE_NAME_LIST, NULL, 0, &bufSize, 0))) {
- wprintf(L"**** Error 0x%x returned by BCryptGetProperty(length only)\n", status);
- BCryptCloseAlgorithmProvider(handle, 0);
- return result;
- }
-
- BCRYPT_ECC_CURVE_NAMES *curves = (BCRYPT_ECC_CURVE_NAMES *)calloc(bufSize, 1);
- if (NT_FAILURE(status = BCryptGetProperty(handle, BCRYPT_ECC_CURVE_NAME_LIST, (PBYTE)curves, bufSize, &bufSize, 0))) {
- wprintf(L"**** Error 0x%x returned by BCryptGetProperty(whole)\n", status);
- BCryptCloseAlgorithmProvider(handle, 0);
- free(curves);
- return result;
- }
-
- for (size_t i = 0; i < curves->dwEccCurveNames; ++i) {
- NPSTR curve_name;
- ULONG len = utf_16to8(&curve_name, curves->pEccCurveNames[i]);
- jstring c_name = (*env)->NewStringUTF(env, curve_name);
- (*env)->CallBooleanMethod(env, result, hash_set_add, c_name);
- free(curve_name);
- }
-
- free(curves);
-
- BCryptCloseAlgorithmProvider(handle, 0);
- return result;
-}
-
-JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Mscng_keysizeSupported(JNIEnv *env,
- jobject self,
- jint keysize) {
- switch (keysize) {
- case 256:
- case 384:
- case 521:
- return JNI_TRUE;
- default:
- return JNI_FALSE;
- }
-}
-
-JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Mscng_paramsSupported(JNIEnv *env,
- jobject self,
- jobject params) {
- if (params == NULL) {
- return JNI_FALSE;
- }
-
- if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) {
- jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
- jstring name = (*env)->CallObjectMethod(env, params, get_name);
- const char *utf_name = (*env)->GetStringUTFChars(env, name, NULL);
- const named_curve_t *curve = lookup_curve(utf_name);
- (*env)->ReleaseStringUTFChars(env, name, utf_name);
- return curve == NULL ? JNI_FALSE : JNI_TRUE;
- } else if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) {
- jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;");
- jobject curve = (*env)->CallObjectMethod(env, params, get_curve);
-
- jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;");
- jobject field = (*env)->CallObjectMethod(env, curve, get_field);
-
- if ((*env)->IsInstanceOf(env, field, fp_field_class)) {
- return JNI_TRUE;
- } else {
- return JNI_FALSE;
- }
- } else {
- return JNI_FALSE;
- }
-}
-
-static jobject bytes_to_biginteger(JNIEnv *env, PBYTE bytes, int len) {
- jmethodID biginteger_init = (*env)->GetMethodID(env, biginteger_class, "<init>", "(I[B)V");
- jbyteArray byte_array = (*env)->NewByteArray(env, len);
- jbyte *data = (*env)->GetByteArrayElements(env, byte_array, NULL);
- memcpy(data, bytes, len);
- (*env)->ReleaseByteArrayElements(env, byte_array, data, 0);
- jobject result = (*env)->NewObject(env, biginteger_class, biginteger_init, 1, byte_array);
- return result;
-}
-
-static void biginteger_to_bytes(JNIEnv *env, jobject bigint, PBYTE bytes, ULONG len) {
- jmethodID to_byte_array = (*env)->GetMethodID(env, biginteger_class, "toByteArray", "()[B");
-
- jbyteArray byte_array = (jbyteArray)(*env)->CallObjectMethod(env, bigint, to_byte_array);
- jsize byte_length = (*env)->GetArrayLength(env, byte_array);
- jbyte *byte_data = (*env)->GetByteArrayElements(env, byte_array, NULL);
- memcpy(bytes, &byte_data[byte_length - len], len);
- (*env)->ReleaseByteArrayElements(env, byte_array, byte_data, JNI_ABORT);
-}
-
-static jobject create_ec_param_spec(JNIEnv *env, PBYTE eccParams, PULONG paramLength) {
- //
- // BCRYPT_ECCFULLKEY_BLOB header
- // P[cbFieldLength] Prime specifying the base field.
- // A[cbFieldLength] Coefficient A of the equation y^2 = x^3 + A*x + B mod p
- // B[cbFieldLength] Coefficient B of the equation y^2 = x^3 + A*x + B mod p
- // Gx[cbFieldLength] X-coordinate of the base point.
- // Gy[cbFieldLength] Y-coordinate of the base point.
- // n[cbSubgroupOrder] Order of the group generated by G = (x,y)
- // h[cbCofactor] Cofactor of G in E.
- // S[cbSeed] Seed of the curve.
-
- BCRYPT_ECCFULLKEY_BLOB *header = (BCRYPT_ECCFULLKEY_BLOB *)eccParams;
- PBYTE paramsStart = &eccParams[sizeof(BCRYPT_ECCFULLKEY_BLOB)];
-
- // cbFieldLength
- PBYTE P = paramsStart;
- PBYTE A = P + header->cbFieldLength;
- PBYTE B = A + header->cbFieldLength;
- PBYTE GX = B + header->cbFieldLength;
- PBYTE GY = GX + header->cbFieldLength;
-
- // cbSubgroupOrder
- PBYTE N = GY + header->cbFieldLength;
-
- // cbCofactor
- PBYTE H = N + header->cbSubgroupOrder;
-
- // cbSeed
- PBYTE S = H + header->cbCofactor;
-
- *paramLength =
- sizeof(BCRYPT_ECCFULLKEY_BLOB) + 5 * header->cbFieldLength + header->cbSubgroupOrder + header->cbCofactor + header->cbSeed;
-
- jobject p_int = bytes_to_biginteger(env, P, header->cbFieldLength);
-
- jmethodID fp_field_init = (*env)->GetMethodID(env, fp_field_class, "<init>", "(Ljava/math/BigInteger;)V");
- jobject field = (*env)->NewObject(env, fp_field_class, fp_field_init, p_int);
-
- jobject a_int = bytes_to_biginteger(env, A, header->cbFieldLength);
- jobject b_int = bytes_to_biginteger(env, B, header->cbFieldLength);
-
- jmethodID elliptic_curve_init = (*env)->GetMethodID(env, elliptic_curve_class, "<init>",
- "(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;)V");
- jobject elliptic_curve = (*env)->NewObject(env, elliptic_curve_class, elliptic_curve_init, field, a_int, b_int);
-
- jobject gx_int = bytes_to_biginteger(env, GX, header->cbFieldLength);
- jobject gy_int = bytes_to_biginteger(env, GY, header->cbFieldLength);
-
- jmethodID point_init = (*env)->GetMethodID(env, point_class, "<init>", "(Ljava/math/BigInteger;Ljava/math/BigInteger;)V");
- jobject g = (*env)->NewObject(env, point_class, point_init, gx_int, gy_int);
-
- jobject n_int = bytes_to_biginteger(env, N, header->cbSubgroupOrder);
-
- jobject h_int = bytes_to_biginteger(env, H, header->cbCofactor);
- jmethodID bigint_to_int = (*env)->GetMethodID(env, biginteger_class, "intValue", "()I");
- jint cof = (*env)->CallIntMethod(env, h_int, bigint_to_int);
-
- jmethodID ec_parameter_spec_init = (*env)->GetMethodID(
- env, ec_parameter_spec_class, "<init>", "(Ljava/security/spec/EllipticCurve;Ljava/security/spec/ECPoint;Ljava/math/BigInteger;I)V");
- return (*env)->NewObject(env, ec_parameter_spec_class, ec_parameter_spec_init, elliptic_curve, g, n_int, cof);
-}
-
-static ULONG create_curve(JNIEnv *env, jobject params, PBYTE *curve) {
- jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;");
- jobject elliptic_curve = (*env)->CallObjectMethod(env, params, get_curve);
-
- jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;");
- jobject field = (*env)->CallObjectMethod(env, elliptic_curve, get_field);
-
- jmethodID get_bits = (*env)->GetMethodID(env, fp_field_class, "getFieldSize", "()I");
- jint bits = (*env)->CallIntMethod(env, field, get_bits);
- jint bytes = (bits + 7) / 8;
-
- jmethodID get_a = (*env)->GetMethodID(env, elliptic_curve_class, "getA", "()Ljava/math/BigInteger;");
- jobject a = (*env)->CallObjectMethod(env, elliptic_curve, get_a);
-
- jmethodID get_b = (*env)->GetMethodID(env, elliptic_curve_class, "getB", "()Ljava/math/BigInteger;");
- jobject b = (*env)->CallObjectMethod(env, elliptic_curve, get_b);
-
- jmethodID get_p = (*env)->GetMethodID(env, fp_field_class, "getP", "()Ljava/math/BigInteger;");
- jobject p = (*env)->CallObjectMethod(env, field, get_p);
-
- jmethodID get_g = (*env)->GetMethodID(env, ec_parameter_spec_class, "getGenerator", "()Ljava/security/spec/ECPoint;");
- jobject g = (*env)->CallObjectMethod(env, params, get_g);
-
- jmethodID get_x = (*env)->GetMethodID(env, point_class, "getAffineX", "()Ljava/math/BigInteger;");
- jobject gx = (*env)->CallObjectMethod(env, g, get_x);
-
- jmethodID get_y = (*env)->GetMethodID(env, point_class, "getAffineY", "()Ljava/math/BigInteger;");
- jobject gy = (*env)->CallObjectMethod(env, g, get_y);
-
- jmethodID get_n = (*env)->GetMethodID(env, ec_parameter_spec_class, "getOrder", "()Ljava/math/BigInteger;");
- jobject n = (*env)->CallObjectMethod(env, params, get_n);
-
- jmethodID get_h = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCofactor", "()I");
- jint h = (*env)->CallIntMethod(env, params, get_h);
-
- jmethodID get_bitlength = (*env)->GetMethodID(env, biginteger_class, "bitLength", "()I");
- jint order_bits = (*env)->CallIntMethod(env, n, get_bitlength);
- jint order_bytes = (order_bits + 7) / 8;
-
- // header_size + 5*bytes + order_bytes + cof_size + 0
- ULONG bufSize = sizeof(BCRYPT_ECC_PARAMETER_HEADER) + 5 * bytes + order_bytes + 1 + 0;
- *curve = calloc(bufSize, 1);
- BCRYPT_ECC_PARAMETER_HEADER *header = (BCRYPT_ECC_PARAMETER_HEADER *)*curve;
- header->dwVersion = 1;
- header->dwCurveType = 1; // 1 -> Prime short Weierstrass, 2 -> Prime Twisted Edwards, 3 -> Montgomery
- header->dwCurveGenerationAlgId = 0;
- header->cbFieldLength = bytes;
- header->cbSubgroupOrder = order_bytes;
- header->cbCofactor = 1;
- header->cbSeed = 0;
-
- PBYTE paramsStart = &(*curve)[sizeof(BCRYPT_ECC_PARAMETER_HEADER)];
-
- biginteger_to_bytes(env, p, paramsStart, bytes);
- biginteger_to_bytes(env, a, paramsStart + bytes, bytes);
- biginteger_to_bytes(env, b, paramsStart + 2 * bytes, bytes);
- biginteger_to_bytes(env, gx, paramsStart + 3 * bytes, bytes);
- biginteger_to_bytes(env, gy, paramsStart + 4 * bytes, bytes);
- biginteger_to_bytes(env, n, paramsStart + 5 * bytes, order_bytes);
- PBYTE cof_ptr = (PBYTE)(paramsStart + 5 * bytes + order_bytes);
- *cof_ptr = (BYTE)h;
- return bufSize;
-}
-
-static ULONG init_algo(JNIEnv *env, BCRYPT_ALG_HANDLE *handle, jint *keyflag, NWPSTR *curve_name, LPCWSTR algo, jobject params) {
- NTSTATUS status;
- if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(handle, algo, MS_PRIMITIVE_PROVIDER, 0))) {
- wprintf(L"**** Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status);
- return 0;
- }
- ULONG result = 0;
- if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) {
- jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
- jstring name = (*env)->CallObjectMethod(env, params, get_name);
- jint utf_length = (*env)->GetStringUTFLength(env, name);
- PUCHAR chars = calloc(utf_length + 1, 1);
- (*env)->GetStringUTFRegion(env, name, 0, utf_length, chars);
- const named_curve_t *curve = lookup_curve(chars);
- ULONG ret = utf_8to16(curve_name, chars);
- if (NT_FAILURE(status = BCryptSetProperty(*handle, BCRYPT_ECC_CURVE_NAME, (PUCHAR)*curve_name, ret * sizeof(WCHAR), 0))) {
- wprintf(L"**** Error 0x%x returned by BCryptSetProperty\n", status);
- return 0;
- }
- free(chars);
- result = curve->bits;
- *keyflag = KEYFLAG_IMPLICIT;
- } else if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) {
- PBYTE curve;
- ULONG curveLen = create_curve(env, params, &curve);
- if (NT_FAILURE(status = BCryptSetProperty(*handle, BCRYPT_ECC_PARAMETERS, curve, curveLen, 0))) {
- wprintf(L"**** Error 0x%x returned by BCryptSetProperty\n", status);
- return 0;
- }
- free(curve);
-
- jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;");
- jobject elliptic_curve = (*env)->CallObjectMethod(env, params, get_curve);
-
- jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;");
- jobject field = (*env)->CallObjectMethod(env, elliptic_curve, get_field);
-
- jmethodID get_bits = (*env)->GetMethodID(env, fp_field_class, "getFieldSize", "()I");
- jint bits = (*env)->CallIntMethod(env, field, get_bits);
- result = bits;
- *keyflag = KEYFLAG_EXPLICIT;
- *curve_name = NULL;
- }
- return result;
-}
-
-static jobject key_to_privkey(JNIEnv *env, BCRYPT_KEY_HANDLE key, jint flag, LPCWSTR curve) {
- NTSTATUS status;
- ULONG bufSize = 0;
- if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCFULLPRIVATE_BLOB, NULL, 0, &bufSize, 0))) {
- wprintf(L"**** Error 0x%x returned by BCryptExportKey(full, length only)\n", status);
- return NULL;
- }
- if (bufSize == 0) {
- printf("buf 0\n");
- return NULL;
- }
-
- PBYTE fullBuf = calloc(bufSize, 1);
- if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCFULLPRIVATE_BLOB, fullBuf, bufSize, &bufSize, 0))) {
- wprintf(L"**** Error 0x%x returned by BCryptExportKey(full, whole)\n", status);
- free(fullBuf);
- return NULL;
- }
-
- ULONG paramLength;
- jobject ec_priv_param_spec = create_ec_param_spec(env, fullBuf, &paramLength);
-
- // fullBuf looks like:
- // BCRYPT_ECCFULLKEY_BLOB header
- // P[cbFieldLength] Prime specifying the base field.
- // A[cbFieldLength] Coefficient A of the equation y^2 = x^3 + A*x + B mod p
- // B[cbFieldLength] Coefficient B of the equation y^2 = x^3 + A*x + B mod p
- // Gx[cbFieldLength] X-coordinate of the base point.
- // Gy[cbFieldLength] Y-coordinate of the base point.
- // n[cbSubgroupOrder] Order of the group generated by G = (x,y)
- // h[cbCofactor] Cofactor of G in E.
- // S[cbSeed] Seed of the curve.
- // Qx[cbFieldLength] X-coordinate of the public point.
- // Qy[cbFieldLength] Y-coordinate of the public point.
- // d[cbSubgroupOrder] Private key.
- BCRYPT_ECCFULLKEY_BLOB *privHeader = (BCRYPT_ECCFULLKEY_BLOB *)fullBuf;
- PBYTE priv_x = &fullBuf[paramLength];
- PBYTE priv_y = priv_x + privHeader->cbFieldLength;
- PBYTE priv = priv_y + privHeader->cbFieldLength;
-
- jbyteArray meta_bytes = NULL;
- jbyteArray header_bytes = NULL;
- switch (flag) {
- case 0: {
- // meta = curve
- jint meta_len = (wcslen(curve) + 1) * sizeof(WCHAR);
- meta_bytes = (*env)->NewByteArray(env, meta_len);
- jbyte *meta_data = (*env)->GetByteArrayElements(env, meta_bytes, NULL);
- memcpy(meta_data, curve, meta_len);
- (*env)->ReleaseByteArrayElements(env, meta_bytes, meta_data, 0);
- }
- case 1:
- case 2: {
- // meta = null
- // header = full
- header_bytes = (*env)->NewByteArray(env, paramLength);
- jbyte *header_data = (*env)->GetByteArrayElements(env, header_bytes, NULL);
- memcpy(header_data, fullBuf, paramLength);
- (*env)->ReleaseByteArrayElements(env, header_bytes, header_data, 0);
- break;
- }
- default:
- // header = small
- if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCPRIVATE_BLOB, NULL, 0, &bufSize, 0))) {
- wprintf(L"**** Error 0x%x returned by BCryptExportKey(small, length only)\n", status);
- free(fullBuf);
- return NULL;
- }
- if (bufSize == 0) {
- printf("buf 0\n");
- free(fullBuf);
- return NULL;
- }
- PBYTE smallBuf = calloc(bufSize, 1);
- if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCPRIVATE_BLOB, smallBuf, bufSize, &bufSize, 0))) {
- wprintf(L"**** Error 0x%x returned by BCryptExportKey(small, whole)\n", status);
- free(fullBuf);
- free(smallBuf);
- return NULL;
- }
- // smallBuf looks like:
- // BCRYPT_ECCKEY_BLOB header
- // Qx[cbFieldLength] X-coordinate of the public point.
- // Qy[cbFieldLength] Y-coordinate of the public point.
- // d[cbSubgroupOrder] Private key.
- header_bytes = (*env)->NewByteArray(env, sizeof(BCRYPT_ECCKEY_BLOB));
- jbyte *header_data = (*env)->GetByteArrayElements(env, header_bytes, NULL);
- memcpy(header_data, smallBuf, sizeof(BCRYPT_ECCKEY_BLOB));
- (*env)->ReleaseByteArrayElements(env, header_bytes, header_data, 0);
- free(smallBuf);
- break;
- }
-
- jbyteArray x_bytes = (*env)->NewByteArray(env, privHeader->cbFieldLength);
- jbyte *x_data = (*env)->GetByteArrayElements(env, x_bytes, NULL);
- memcpy(x_data, priv_x, privHeader->cbFieldLength);
- (*env)->ReleaseByteArrayElements(env, x_bytes, x_data, 0);
-
- jbyteArray y_bytes = (*env)->NewByteArray(env, privHeader->cbFieldLength);
- jbyte *y_data = (*env)->GetByteArrayElements(env, y_bytes, NULL);
- memcpy(y_data, priv_y, privHeader->cbFieldLength);
- (*env)->ReleaseByteArrayElements(env, y_bytes, y_data, 0);
-
- jbyteArray priv_bytes = (*env)->NewByteArray(env, privHeader->cbSubgroupOrder);
- jbyte *key_priv = (*env)->GetByteArrayElements(env, priv_bytes, NULL);
- memcpy(key_priv, priv, privHeader->cbSubgroupOrder);
- (*env)->ReleaseByteArrayElements(env, priv_bytes, key_priv, 0);
-
- free(fullBuf);
-
- jmethodID ec_priv_init = (*env)->GetMethodID(env, privkey_class, "<init>", "(I[B[B[B[B[BLjava/security/spec/ECParameterSpec;)V");
- return (*env)->NewObject(env, privkey_class, ec_priv_init, flag, meta_bytes, header_bytes, x_bytes, y_bytes, priv_bytes,
- ec_priv_param_spec);
-}
-
-static jobject key_to_pubkey(JNIEnv *env, BCRYPT_KEY_HANDLE key, jint flag, LPCWSTR curve) {
- NTSTATUS status;
- ULONG bufSize = 0;
- if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCFULLPUBLIC_BLOB, NULL, 0, &bufSize, 0))) {
- wprintf(L"**** Error 0x%x returned by BCryptExportKey(full, length only)\n", status);
- return NULL;
- }
- if (bufSize == 0) {
- printf("err0\n");
- return NULL;
- }
-
- PBYTE fullBuf = calloc(bufSize, 1);
- if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCFULLPUBLIC_BLOB, fullBuf, bufSize, &bufSize, 0))) {
- wprintf(L"**** Error 0x%x returned by BCryptExportKey(full, whole)\n", status);
- return NULL;
- }
-
- ULONG paramLength;
- jobject ec_pub_param_spec = create_ec_param_spec(env, fullBuf, &paramLength);
-
- // fullBuf looks like:
- // BCRYPT_ECCFULLKEY_BLOB header
- // P[cbFieldLength] Prime specifying the base field.
- // A[cbFieldLength] Coefficient A of the equation y^2 = x^3 + A*x + B mod p
- // B[cbFieldLength] Coefficient B of the equation y^2 = x^3 + A*x + B mod p
- // Gx[cbFieldLength] X-coordinate of the base point.
- // Gy[cbFieldLength] Y-coordinate of the base point.
- // n[cbSubgroupOrder] Order of the group generated by G = (x,y)
- // h[cbCofactor] Cofactor of G in E.
- // S[cbSeed] Seed of the curve.
- // Qx[cbFieldLength] X-coordinate of the public point.
- // Qy[cbFieldLength] Y-coordinate of the public point.
- BCRYPT_ECCFULLKEY_BLOB *pubHeader = (BCRYPT_ECCFULLKEY_BLOB *)fullBuf;
- PBYTE pub_x = &fullBuf[paramLength];
- PBYTE pub_y = pub_x + pubHeader->cbFieldLength;
-
- jbyteArray meta_bytes = NULL;
- jbyteArray header_bytes = NULL;
- switch (flag) {
- case 0: {
- // meta = curve
- jint meta_len = (wcslen(curve) + 1) * sizeof(WCHAR);
- meta_bytes = (*env)->NewByteArray(env, meta_len);
- jbyte *meta_data = (*env)->GetByteArrayElements(env, meta_bytes, NULL);
- memcpy(meta_data, curve, meta_len);
- (*env)->ReleaseByteArrayElements(env, meta_bytes, meta_data, 0);
- }
- case 1:
- case 2: {
- header_bytes = (*env)->NewByteArray(env, paramLength);
- jbyte *header_data = (*env)->GetByteArrayElements(env, header_bytes, NULL);
- memcpy(header_data, pubHeader, paramLength);
- (*env)->ReleaseByteArrayElements(env, header_bytes, header_data, 0);
- break;
- }
- default:
- // header = small
- if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCPUBLIC_BLOB, NULL, 0, &bufSize, 0))) {
- wprintf(L"**** Error 0x%x returned by BCryptExportKey(small, length only)\n", status);
- free(fullBuf);
- return NULL;
- }
- if (bufSize == 0) {
- printf("buf 0\n");
- free(fullBuf);
- return NULL;
- }
- PBYTE smallBuf = calloc(bufSize, 1);
- if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCPUBLIC_BLOB, smallBuf, bufSize, &bufSize, 0))) {
- wprintf(L"**** Error 0x%x returned by BCryptExportKey(small, whole)\n", status);
- free(fullBuf);
- free(smallBuf);
- return NULL;
- }
- // smallBuf looks like:
- // BCRYPT_ECCKEY_BLOB header
- // Qx[cbFieldLength] X-coordinate of the public point.
- // Qy[cbFieldLength] Y-coordinate of the public point.
- header_bytes = (*env)->NewByteArray(env, sizeof(BCRYPT_ECCKEY_BLOB));
- jbyte *header_data = (*env)->GetByteArrayElements(env, header_bytes, NULL);
- memcpy(header_data, smallBuf, sizeof(BCRYPT_ECCKEY_BLOB));
- (*env)->ReleaseByteArrayElements(env, header_bytes, header_data, 0);
- free(smallBuf);
- break;
- }
-
- jbyteArray x_bytes = (*env)->NewByteArray(env, pubHeader->cbFieldLength);
- jbyte *x_data = (*env)->GetByteArrayElements(env, x_bytes, NULL);
- memcpy(x_data, pub_x, pubHeader->cbFieldLength);
- (*env)->ReleaseByteArrayElements(env, x_bytes, x_data, 0);
-
- jbyteArray y_bytes = (*env)->NewByteArray(env, pubHeader->cbFieldLength);
- jbyte *y_data = (*env)->GetByteArrayElements(env, y_bytes, NULL);
- memcpy(y_data, pub_y, pubHeader->cbFieldLength);
- (*env)->ReleaseByteArrayElements(env, y_bytes, y_data, 0);
-
- free(fullBuf);
-
- jmethodID ec_pub_init = (*env)->GetMethodID(env, pubkey_class, "<init>", "(I[B[B[B[BLjava/security/spec/ECParameterSpec;)V");
- return (*env)->NewObject(env, pubkey_class, ec_pub_init, flag, meta_bytes, header_bytes, x_bytes, y_bytes, ec_pub_param_spec);
-}
-
-JNIEXPORT jobject JNICALL
-Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Mscng_generate__ILjava_security_SecureRandom_2(JNIEnv *env,
- jobject self,
- jint keysize,
- jobject random) {
- NTSTATUS status;
- BCRYPT_ALG_HANDLE handle = NULL;
-
- jclass mscng_kpg_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi$Mscng");
- jfieldID type_id = (*env)->GetFieldID(env, mscng_kpg_class, "type", "Ljava/lang/String;");
- jstring type = (jstring)(*env)->GetObjectField(env, self, type_id);
- const char *type_data = (*env)->GetStringUTFChars(env, type, NULL);
- LPCWSTR algo;
- if (strcmp(type_data, "ECDH") == 0) {
- switch (keysize) {
- case 256:
- algo = BCRYPT_ECDH_P256_ALGORITHM;
- break;
- case 384:
- algo = BCRYPT_ECDH_P384_ALGORITHM;
- break;
- case 521:
- algo = BCRYPT_ECDH_P521_ALGORITHM;
- break;
- default:
- // unreachable
- return NULL;
- }
- } else if (strcmp(type_data, "ECDSA") == 0) {
- switch (keysize) {
- case 256:
- algo = BCRYPT_ECDSA_P256_ALGORITHM;
- break;
- case 384:
- algo = BCRYPT_ECDSA_P384_ALGORITHM;
- break;
- case 521:
- algo = BCRYPT_ECDSA_P521_ALGORITHM;
- break;
- default:
- // unreachable
- return NULL;
- }
- } else {
- // unreachable
- return NULL;
- }
- (*env)->ReleaseStringUTFChars(env, type, type_data);
-
- if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(&handle, algo, MS_PRIMITIVE_PROVIDER, 0))) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptOpenAlgorithmProvider", status);
- return NULL;
- }
-
- BCRYPT_KEY_HANDLE key = NULL;
-
- native_timing_start();
- status = BCryptGenerateKeyPair(handle, &key, keysize, 0);
- native_timing_pause();
-
- if (NT_FAILURE(status)) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptGenerateKeyPair\n", status);
- BCryptCloseAlgorithmProvider(handle, 0);
- return NULL;
- }
-
- native_timing_restart();
- status = BCryptFinalizeKeyPair(key, 0);
- native_timing_stop();
-
- if (NT_FAILURE(status)) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptFinalizeKeyPair\n", status);
- BCryptCloseAlgorithmProvider(handle, 0);
- return NULL;
- }
-
- jobject privkey = key_to_privkey(env, key, KEYFLAG_NIST, NULL);
- jobject pubkey = key_to_pubkey(env, key, KEYFLAG_NIST, NULL);
-
- jmethodID keypair_init = (*env)->GetMethodID(env, keypair_class, "<init>", "(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V");
-
- BCryptDestroyKey(key);
- BCryptCloseAlgorithmProvider(handle, 0);
- return (*env)->NewObject(env, keypair_class, keypair_init, pubkey, privkey);
-}
-
-JNIEXPORT jobject JNICALL
-Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Mscng_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2(
- JNIEnv *env, jobject self, jobject params, jobject random) {
- NTSTATUS status;
- BCRYPT_ALG_HANDLE handle = NULL;
- BCRYPT_KEY_HANDLE key = NULL;
-
- jclass mscng_kpg_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi$Mscng");
- jfieldID type_id = (*env)->GetFieldID(env, mscng_kpg_class, "type", "Ljava/lang/String;");
- jstring type = (jstring)(*env)->GetObjectField(env, self, type_id);
- const char *type_data = (*env)->GetStringUTFChars(env, type, NULL);
- LPCWSTR algo;
- if (strcmp(type_data, "ECDH") == 0) {
- algo = BCRYPT_ECDH_ALGORITHM;
- } else if (strcmp(type_data, "ECDSA") == 0) {
- algo = BCRYPT_ECDSA_ALGORITHM;
- } else {
- // unreachable
- return NULL;
- }
- (*env)->ReleaseStringUTFChars(env, type, type_data);
-
- jint keyflag;
- NWPSTR curveName;
- ULONG bits = init_algo(env, &handle, &keyflag, &curveName, algo, params);
- if (bits == 0) {
- throw_new(env, "java/security/GeneralSecurityException", "Couldn't initialize algo.");
- return NULL;
- }
-
- native_timing_start();
- status = BCryptGenerateKeyPair(handle, &key, bits, 0);
- native_timing_pause();
-
- if (NT_FAILURE(status)) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptGenerateKeyPair\n", status);
- BCryptCloseAlgorithmProvider(handle, 0);
- return NULL;
- }
-
- native_timing_restart();
- status = BCryptFinalizeKeyPair(key, 0);
- native_timing_stop();
-
- if (NT_FAILURE(status)) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptFinalizeKeyPair\n", status);
- BCryptCloseAlgorithmProvider(handle, 0);
- return NULL;
- }
-
- jobject privkey = key_to_privkey(env, key, keyflag, curveName);
- jobject pubkey = key_to_pubkey(env, key, keyflag, curveName);
-
- if (curveName) {
- free(curveName);
- }
-
- jmethodID keypair_init = (*env)->GetMethodID(env, keypair_class, "<init>", "(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V");
-
- BCryptDestroyKey(key);
- BCryptCloseAlgorithmProvider(handle, 0);
- return (*env)->NewObject(env, keypair_class, keypair_init, pubkey, privkey);
-}
-
-static NTSTATUS init_use_algo(JNIEnv *env, BCRYPT_ALG_HANDLE *handle, LPCWSTR type, jint keyflag, jbyteArray meta, jobject params) {
- LPCWSTR ecdh_algos[] = {BCRYPT_ECDH_ALGORITHM, BCRYPT_ECDH_P256_ALGORITHM, BCRYPT_ECDH_P384_ALGORITHM, BCRYPT_ECDH_P521_ALGORITHM};
- LPCWSTR ecdsa_algos[] = {BCRYPT_ECDSA_ALGORITHM, BCRYPT_ECDSA_P256_ALGORITHM, BCRYPT_ECDSA_P384_ALGORITHM, BCRYPT_ECDSA_P521_ALGORITHM};
-
- LPCWSTR *algos;
- LPCWSTR algo;
- if (lstrcmpW(type, BCRYPT_ECDH_ALGORITHM) == 0) {
- algos = ecdh_algos;
- } else if (lstrcmpW(type, BCRYPT_ECDSA_ALGORITHM) == 0) {
- algos = ecdsa_algos;
- } else {
- // unreachable
- return STATUS_INVALID_PARAMETER;
- }
-
- switch (keyflag) {
- case KEYFLAG_IMPLICIT:
- case KEYFLAG_EXPLICIT:
- case KEYFLAG_OTHER:
- algo = algos[0];
- break;
- case KEYFLAG_NIST: {
- jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;");
- jobject elliptic_curve = (*env)->CallObjectMethod(env, params, get_curve);
-
- jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;");
- jobject field = (*env)->CallObjectMethod(env, elliptic_curve, get_field);
-
- jmethodID get_bits = (*env)->GetMethodID(env, fp_field_class, "getFieldSize", "()I");
- jint bits = (*env)->CallIntMethod(env, field, get_bits);
- switch (bits) {
- case 256:
- algo = algos[1];
- break;
- case 384:
- algo = algos[2];
- break;
- case 521:
- algo = algos[3];
- break;
- default:
- return STATUS_INVALID_PARAMETER;
- }
- break;
- }
- }
- NTSTATUS status;
-
- if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(handle, algo, MS_PRIMITIVE_PROVIDER, 0))) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status);
- return status;
- }
-
- switch (keyflag) {
- case KEYFLAG_IMPLICIT: {
- jint meta_len = (*env)->GetArrayLength(env, meta);
- jbyte *meta_data = (*env)->GetByteArrayElements(env, meta, NULL);
- // if (NT_FAILURE(status = BCryptSetProperty(*handle, BCRYPT_ECC_CURVE_NAME, meta_data, meta_len, 0))) {
- // throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptSetProperty(curve name)\n",
- //status);
- // (*env)->ReleaseByteArrayElements(env, meta, meta_data, JNI_ABORT);
- // return status;
- //}
- (*env)->ReleaseByteArrayElements(env, meta, meta_data, JNI_ABORT);
- break;
- }
- case KEYFLAG_EXPLICIT:
- case KEYFLAG_OTHER: {
- PBYTE curve;
- ULONG curve_len = create_curve(env, params, &curve);
- if (NT_FAILURE(status = BCryptSetProperty(*handle, BCRYPT_ECC_PARAMETERS, curve, curve_len, 0))) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptSetProperty(parameters)\n",
- status);
- free(curve);
- return status;
- }
- free(curve);
- break;
- }
- }
- return STATUS_SUCCESS;
-}
-
-static jint get_keyflag(JNIEnv *env, jobject key) {
- if ((*env)->IsInstanceOf(env, key, pubkey_class) || (*env)->IsInstanceOf(env, key, privkey_class)) {
- jclass key_class = (*env)->GetObjectClass(env, key);
- jmethodID get_flag = (*env)->GetMethodID(env, key_class, "getFlag", "()I");
- return (*env)->CallIntMethod(env, key, get_flag);
- } else {
- return KEYFLAG_OTHER;
- }
-}
-
-static jbyteArray get_meta(JNIEnv *env, jobject key) {
- if ((*env)->IsInstanceOf(env, key, pubkey_class) || (*env)->IsInstanceOf(env, key, privkey_class)) {
- jclass key_class = (*env)->GetObjectClass(env, key);
- jmethodID get_meta = (*env)->GetMethodID(env, key_class, "getMeta", "()[B");
- return (jbyteArray)(*env)->CallObjectMethod(env, key, get_meta);
- } else {
- return NULL;
- }
-}
-
-JNIEXPORT jbyteArray JNICALL
-Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Mscng_generateSecret__Ljava_security_interfaces_ECPublicKey_2Ljava_security_interfaces_ECPrivateKey_2Ljava_security_spec_AlgorithmParameterSpec_2(
- JNIEnv *env, jobject self, jobject pubkey, jobject privkey, jobject params) {
- NTSTATUS status;
-
- jclass mscng_ka_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi$Mscng");
- jfieldID type_id = (*env)->GetFieldID(env, mscng_ka_class, "type", "Ljava/lang/String;");
- jstring type = (jstring)(*env)->GetObjectField(env, self, type_id);
- const char *type_data = (*env)->GetStringUTFChars(env, type, NULL);
- LPCWSTR kdf_algo;
- if (strcmp(type_data, "ECDHwithSHA1KDF(CNG)") == 0) {
- kdf_algo = BCRYPT_SHA1_ALGORITHM;
- } else if (strcmp(type_data, "ECDHwithSHA256KDF(CNG)") == 0) {
- kdf_algo = BCRYPT_SHA256_ALGORITHM;
- } else if (strcmp(type_data, "ECDHwithSHA384KDF(CNG)") == 0) {
- kdf_algo = BCRYPT_SHA384_ALGORITHM;
- } else if (strcmp(type_data, "ECDHwithSHA512KDF(CNG)") == 0) {
- kdf_algo = BCRYPT_SHA512_ALGORITHM;
- } else {
- // unreachable
- return NULL;
- }
- (*env)->ReleaseStringUTFChars(env, type, type_data);
-
- BCRYPT_ALG_HANDLE kaHandle = NULL;
-
- jint pub_flag = get_keyflag(env, pubkey);
- if (pub_flag == KEYFLAG_OTHER) {
- throw_new(env, "java/security/InvalidAlgorithmParameterException", "Cannot import non-native public key.");
- return NULL;
- }
- jbyteArray meta = get_meta(env, pubkey);
-
- if (NT_FAILURE(status = init_use_algo(env, &kaHandle, BCRYPT_ECDH_ALGORITHM, pub_flag, meta, params))) {
- return NULL;
- }
-
- BCRYPT_KEY_HANDLE pkey = NULL;
- BCRYPT_KEY_HANDLE skey = NULL;
-
- jmethodID get_data_priv = (*env)->GetMethodID(env, pubkey_class, "getData", "()[B");
- jbyteArray pubkey_barray = (jbyteArray)(*env)->CallObjectMethod(env, pubkey, get_data_priv);
-
- jint pub_length = (*env)->GetArrayLength(env, pubkey_barray);
- jbyte *pub_data = (*env)->GetByteArrayElements(env, pubkey_barray, NULL);
- if (NT_FAILURE(status = BCryptImportKeyPair(kaHandle, NULL, BCRYPT_ECCFULLPUBLIC_BLOB, &pkey, pub_data, pub_length, 0))) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptImportKeyPair(pub)\n", status);
- BCryptCloseAlgorithmProvider(kaHandle, 0);
- (*env)->ReleaseByteArrayElements(env, pubkey_barray, pub_data, JNI_ABORT);
- return NULL;
- }
- (*env)->ReleaseByteArrayElements(env, pubkey_barray, pub_data, JNI_ABORT);
-
- jint priv_flag = get_keyflag(env, privkey);
- if (priv_flag == KEYFLAG_OTHER) {
- throw_new(env, "java/security/InvalidAlgorithmParameterException", "Cannot import non-native private key.");
- return NULL;
- }
-
- jmethodID get_data_pub = (*env)->GetMethodID(env, privkey_class, "getData", "()[B");
- jbyteArray privkey_barray = (jbyteArray)(*env)->CallObjectMethod(env, privkey, get_data_pub);
-
- jint priv_length = (*env)->GetArrayLength(env, privkey_barray);
- jbyte *priv_data = (*env)->GetByteArrayElements(env, privkey_barray, NULL);
- if (NT_FAILURE(status = BCryptImportKeyPair(kaHandle, NULL, BCRYPT_ECCFULLPRIVATE_BLOB, &skey, priv_data, priv_length, 0))) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptImportKeyPair(priv)\n", status);
- BCryptCloseAlgorithmProvider(kaHandle, 0);
- BCryptDestroyKey(pkey);
- (*env)->ReleaseByteArrayElements(env, privkey_barray, priv_data, JNI_ABORT);
- return NULL;
- }
- (*env)->ReleaseByteArrayElements(env, privkey_barray, priv_data, JNI_ABORT);
-
- BCRYPT_SECRET_HANDLE ka = NULL;
-
- native_timing_start();
- status = BCryptSecretAgreement(skey, pkey, &ka, 0);
- native_timing_stop();
-
- if (NT_FAILURE(status)) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptSecretAgreement\n", status);
- BCryptCloseAlgorithmProvider(kaHandle, 0);
- BCryptDestroyKey(pkey);
- BCryptDestroyKey(skey);
- return NULL;
- }
-
- BCryptBufferDesc paramList = {0};
- BCryptBuffer kdfParams[1] = {0};
- kdfParams[0].BufferType = KDF_HASH_ALGORITHM;
- kdfParams[0].cbBuffer = (DWORD)((wcslen(kdf_algo) + 1) * sizeof(WCHAR));
- kdfParams[0].pvBuffer = (PVOID)kdf_algo;
- paramList.cBuffers = 1;
- paramList.pBuffers = kdfParams;
- paramList.ulVersion = BCRYPTBUFFER_VERSION;
-
- ULONG bufSize = 0;
- if (NT_FAILURE(status = BCryptDeriveKey(ka, BCRYPT_KDF_HASH, &paramList, NULL, 0, &bufSize, 0))) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptDeriveKey(length only)\n", status);
- return NULL;
- }
-
- PBYTE derived = calloc(bufSize, 1);
- if (NT_FAILURE(status = BCryptDeriveKey(ka, BCRYPT_KDF_HASH, &paramList, derived, bufSize, &bufSize, 0))) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptDeriveKey(whole)\n", status);
- return NULL;
- }
-
- jbyteArray result = (*env)->NewByteArray(env, bufSize);
- jbyte *result_data = (*env)->GetByteArrayElements(env, result, NULL);
- memcpy(result_data, derived, bufSize);
- (*env)->ReleaseByteArrayElements(env, result, result_data, 0);
-
- free(derived);
- BCryptDestroyKey(pkey);
- BCryptDestroyKey(skey);
- BCryptDestroySecret(ka);
- BCryptCloseAlgorithmProvider(kaHandle, 0);
- return result;
-}
-
-JNIEXPORT jobject JNICALL
-Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Mscng_generateSecret__Ljava_security_interfaces_ECPublicKey_2Ljava_security_interfaces_ECPrivateKey_2Ljava_security_spec_AlgorithmParameterSpec_2Ljava_lang_String_2(
- JNIEnv *env, jobject self, jobject pubkey, jobject privkey, jobject params, jstring algorithm) {
- throw_new(env, "java/lang/UnsupportedOperationException", "Not supported.");
- return NULL;
-}
-
-static LPCWSTR get_sighash_algo(JNIEnv *env, jobject self) {
- jclass mscng_sig_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi$Mscng");
- jfieldID type_id = (*env)->GetFieldID(env, mscng_sig_class, "type", "Ljava/lang/String;");
- jstring type = (jstring)(*env)->GetObjectField(env, self, type_id);
- const char *type_data = (*env)->GetStringUTFChars(env, type, NULL);
- LPCWSTR hash_algo;
- if (strcmp(type_data, "SHA1withECDSA") == 0) {
- hash_algo = BCRYPT_SHA1_ALGORITHM;
- } else if (strcmp(type_data, "SHA256withECDSA") == 0) {
- hash_algo = BCRYPT_SHA256_ALGORITHM;
- } else if (strcmp(type_data, "SHA384withECDSA") == 0) {
- hash_algo = BCRYPT_SHA384_ALGORITHM;
- } else if (strcmp(type_data, "SHA512withECDSA") == 0) {
- hash_algo = BCRYPT_SHA512_ALGORITHM;
- } else {
- // unreachable
- return NULL;
- }
- (*env)->ReleaseStringUTFChars(env, type, type_data);
- return hash_algo;
-}
-
-JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Mscng_sign(JNIEnv *env, jobject self,
- jbyteArray data, jobject privkey,
- jobject params) {
- NTSTATUS status;
- LPCWSTR hash_algo = get_sighash_algo(env, self);
-
- BCRYPT_ALG_HANDLE sigHandle = NULL;
-
- jint keyflag = get_keyflag(env, privkey);
- if (keyflag == KEYFLAG_OTHER) {
- throw_new(env, "java/security/InvalidAlgorithmParameterException", "Cannot import non-native private key.");
- return NULL;
- }
- jbyteArray meta = get_meta(env, privkey);
-
- if (NT_FAILURE(status = init_use_algo(env, &sigHandle, BCRYPT_ECDSA_ALGORITHM, keyflag, meta, params))) {
- return NULL;
- }
-
- if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(&sigHandle, BCRYPT_ECDSA_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0))) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status);
- return NULL;
- }
-
- BCRYPT_ALG_HANDLE hashHandle = NULL;
-
- if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(&hashHandle, hash_algo, NULL, 0))) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status);
- BCryptCloseAlgorithmProvider(sigHandle, 0);
- return NULL;
- }
-
- DWORD dummy = 0;
- DWORD hash_len = 0;
- if (NT_FAILURE(status = BCryptGetProperty(hashHandle, BCRYPT_HASH_LENGTH, (PBYTE)&hash_len, sizeof(DWORD), &dummy, 0))) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptGetProperty(hash len)\n", status);
- BCryptCloseAlgorithmProvider(sigHandle, 0);
- BCryptCloseAlgorithmProvider(hashHandle, 0);
- return NULL;
- }
-
- PBYTE hash = calloc(hash_len, 1);
-
- jint data_len = (*env)->GetArrayLength(env, data);
- jbyte *data_bytes = (*env)->GetByteArrayElements(env, data, NULL);
- native_timing_start();
- status = BCryptHash(hashHandle, NULL, 0, data_bytes, data_len, hash, hash_len);
- native_timing_pause();
-
- if (NT_FAILURE(status)) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptHash\n", status);
- BCryptCloseAlgorithmProvider(sigHandle, 0);
- BCryptCloseAlgorithmProvider(hashHandle, 0);
- free(hash);
- (*env)->ReleaseByteArrayElements(env, data, data_bytes, JNI_ABORT);
- return NULL;
- }
- (*env)->ReleaseByteArrayElements(env, data, data_bytes, JNI_ABORT);
-
- BCRYPT_KEY_HANDLE skey = NULL;
-
- jmethodID get_data = (*env)->GetMethodID(env, privkey_class, "getData", "()[B");
- jbyteArray privkey_barray = (jbyteArray)(*env)->CallObjectMethod(env, privkey, get_data);
-
- jint priv_length = (*env)->GetArrayLength(env, privkey_barray);
- jbyte *priv_data = (*env)->GetByteArrayElements(env, privkey_barray, NULL);
- if (NT_FAILURE(status = BCryptImportKeyPair(sigHandle, NULL, BCRYPT_ECCFULLPRIVATE_BLOB, &skey, priv_data, priv_length, 0))) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptImportKeyPair\n", status);
- BCryptCloseAlgorithmProvider(sigHandle, 0);
- BCryptCloseAlgorithmProvider(hashHandle, 0);
- free(hash);
- (*env)->ReleaseByteArrayElements(env, privkey_barray, priv_data, JNI_ABORT);
- return NULL;
- }
- (*env)->ReleaseByteArrayElements(env, privkey_barray, priv_data, JNI_ABORT);
-
- DWORD sig_len = 0;
- native_timing_restart();
- status = BCryptSignHash(skey, NULL, hash, hash_len, NULL, 0, &sig_len, 0);
- native_timing_pause();
-
- if (NT_FAILURE(status)) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptSignHash(len only)\n", status);
- BCryptCloseAlgorithmProvider(sigHandle, 0);
- BCryptCloseAlgorithmProvider(hashHandle, 0);
- free(hash);
- return NULL;
- }
-
- PBYTE sig_buf = calloc(sig_len, 1);
-
- native_timing_restart();
- status = BCryptSignHash(skey, NULL, hash, hash_len, sig_buf, sig_len, &sig_len, 0);
- native_timing_stop();
-
- if (NT_FAILURE(status)) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptSignHash(do)\n", status);
- BCryptCloseAlgorithmProvider(sigHandle, 0);
- BCryptCloseAlgorithmProvider(hashHandle, 0);
- free(hash);
- free(sig_buf);
- return NULL;
- }
-
- DWORD half_len = sig_len / 2;
- jobject sig = asn1_der_encode(env, sig_buf, half_len, sig_buf + half_len, half_len);
-
- free(hash);
- free(sig_buf);
- BCryptDestroyKey(skey);
- BCryptCloseAlgorithmProvider(hashHandle, 0);
- BCryptCloseAlgorithmProvider(sigHandle, 0);
-
- return sig;
-}
-
-JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Mscng_verify(JNIEnv *env, jobject self,
- jbyteArray sig, jbyteArray data,
- jobject pubkey, jobject params) {
- NTSTATUS status;
- LPCWSTR hash_algo = get_sighash_algo(env, self);
-
- BCRYPT_ALG_HANDLE sigHandle = NULL;
-
- jint keyflag = get_keyflag(env, pubkey);
- if (keyflag == KEYFLAG_OTHER) { // TODO: This is not necessary
- throw_new(env, "java/security/InvalidAlgorithmParameterException", "Cannot import non-native public key.");
- return JNI_FALSE;
- }
- jbyteArray meta = get_meta(env, pubkey);
-
- if (NT_FAILURE(status = init_use_algo(env, &sigHandle, BCRYPT_ECDSA_ALGORITHM, keyflag, meta, params))) {
- return JNI_FALSE;
- }
-
- BCRYPT_ALG_HANDLE hashHandle = NULL;
-
- if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(&hashHandle, hash_algo, NULL, 0))) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status);
- BCryptCloseAlgorithmProvider(sigHandle, 0);
- return JNI_FALSE;
- }
-
- DWORD dummy = 0;
- DWORD hash_len = 0;
- if (NT_FAILURE(status = BCryptGetProperty(hashHandle, BCRYPT_HASH_LENGTH, (PBYTE)&hash_len, sizeof(DWORD), &dummy, 0))) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptGetProperty(hash len)\n", status);
- BCryptCloseAlgorithmProvider(sigHandle, 0);
- BCryptCloseAlgorithmProvider(hashHandle, 0);
- return JNI_FALSE;
- }
-
- PBYTE hash = calloc(hash_len, 1);
-
- jint data_len = (*env)->GetArrayLength(env, data);
- jbyte *data_bytes = (*env)->GetByteArrayElements(env, data, NULL);
- native_timing_start();
- status = BCryptHash(hashHandle, NULL, 0, data_bytes, data_len, hash, hash_len);
- native_timing_pause();
-
- if (NT_FAILURE(status)) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptHash\n", status);
- BCryptCloseAlgorithmProvider(sigHandle, 0);
- BCryptCloseAlgorithmProvider(hashHandle, 0);
- free(hash);
- (*env)->ReleaseByteArrayElements(env, data, data_bytes, JNI_ABORT);
- return JNI_FALSE;
- }
- (*env)->ReleaseByteArrayElements(env, data, data_bytes, JNI_ABORT);
-
- BCRYPT_KEY_HANDLE pkey = NULL;
-
- jmethodID get_data = (*env)->GetMethodID(env, pubkey_class, "getData", "()[B");
- jbyteArray pubkey_barray = (jbyteArray)(*env)->CallObjectMethod(env, pubkey, get_data);
-
- jint pub_length = (*env)->GetArrayLength(env, pubkey_barray);
- jbyte *pub_data = (*env)->GetByteArrayElements(env, pubkey_barray, NULL);
- if (NT_FAILURE(status = BCryptImportKeyPair(sigHandle, NULL, BCRYPT_ECCFULLPUBLIC_BLOB, &pkey, pub_data, pub_length, 0))) {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptImportKeyPair\n", status);
- BCryptCloseAlgorithmProvider(sigHandle, 0);
- BCryptCloseAlgorithmProvider(hashHandle, 0);
- free(hash);
- (*env)->ReleaseByteArrayElements(env, pubkey_barray, pub_data, JNI_ABORT);
- return JNI_FALSE;
- }
- (*env)->ReleaseByteArrayElements(env, pubkey_barray, pub_data, JNI_ABORT);
-
- jmethodID get_n = (*env)->GetMethodID(env, ec_parameter_spec_class, "getOrder", "()Ljava/math/BigInteger;");
- jobject n = (*env)->CallObjectMethod(env, params, get_n);
- jmethodID get_bitlength = (*env)->GetMethodID(env, biginteger_class, "bitLength", "()I");
- jint ord_bits = (*env)->CallIntMethod(env, n, get_bitlength);
- jint ord_bytes = (ord_bits + 7) / 8;
-
- jint sig_len = (*env)->GetArrayLength(env, sig);
- jbyte *sig_data = (*env)->GetByteArrayElements(env, sig, NULL);
- jbyte *r;
- size_t rlen;
- jbyte *s;
- size_t slen;
- bool decode = asn1_der_decode(env, sig, &r, &rlen, &s, &slen);
- (*env)->ReleaseByteArrayElements(env, sig, sig_data, JNI_ABORT);
-
- if (!decode) {
- throw_new(env, "java/security/GeneralSecurityException", "Error decoding sig.");
- BCryptDestroyKey(pkey);
- BCryptCloseAlgorithmProvider(sigHandle, 0);
- BCryptCloseAlgorithmProvider(hashHandle, 0);
- free(hash);
- return JNI_FALSE;
- }
-
- jbyte *r_cpy = r;
- jbyte *s_cpy = s;
- if (rlen > ord_bytes) {
- r_cpy += ord_bytes - rlen;
- }
- if (slen > ord_bytes) {
- s_cpy += ord_bytes - slen;
- }
- if (rlen < ord_bytes) {
- r_cpy = _alloca(ord_bytes);
- memset(r_cpy, 0, ord_bytes);
- memcpy(r_cpy, r + (ord_bytes - rlen), ord_bytes);
- }
- if (slen < ord_bytes) {
- s_cpy = _alloca(ord_bytes);
- memset(s_cpy, 0, ord_bytes);
- memcpy(s_cpy, s + (ord_bytes - slen), ord_bytes);
- }
- rlen = ord_bytes;
- slen = ord_bytes;
-
- UCHAR *sig_full = calloc(rlen + slen, 1);
- memcpy(sig_full, r_cpy, rlen);
- memcpy(sig_full + rlen, s_cpy, slen);
- free(r);
- free(s);
-
- native_timing_restart();
- NTSTATUS result = BCryptVerifySignature(pkey, NULL, hash, hash_len, sig_full, rlen + slen, 0);
- native_timing_stop();
-
- free(hash);
- free(sig_full);
- BCryptDestroyKey(pkey);
- BCryptCloseAlgorithmProvider(hashHandle, 0);
- BCryptCloseAlgorithmProvider(sigHandle, 0);
-
- if (result == STATUS_SUCCESS) {
- return JNI_TRUE;
- } else if (result == STATUS_INVALID_SIGNATURE) {
- return JNI_FALSE;
- } else {
- throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptVerifySignature\n", status);
- return JNI_FALSE;
- }
+#include "c_timing.h"
+#include "c_utils.h"
+
+#include <windows.h>
+#include <bcrypt.h>
+#include "native.h"
+
+
+// BCRYPT and NT things.
+#define NT_SUCCESS(status) (((NTSTATUS)(status)) >= 0)
+#define NT_FAILURE(status) !NT_SUCCESS(status)
+
+#define STATUS_SUCCESS 0x00000000
+#define STATUS_INVALID_SIGNATURE 0xC000A000
+
+typedef struct {
+ ULONG dwVersion; // Version of the structure
+ ECC_CURVE_TYPE_ENUM dwCurveType; // Supported curve types.
+ ECC_CURVE_ALG_ID_ENUM dwCurveGenerationAlgId; // For X.592 verification purposes, if we include Seed we will need to include the algorithm ID.
+ ULONG cbFieldLength; // Byte length of the fields P, A, B, X, Y.
+ ULONG cbSubgroupOrder; // Byte length of the subgroup.
+ ULONG cbCofactor; // Byte length of cofactor of G in E.
+ ULONG cbSeed; // Byte length of the seed used to generate the curve.
+} BCRYPT_ECC_PARAMETER_HEADER;
+
+// Provider things
+static jclass provider_class;
+
+#define KEYFLAG_IMPLICIT 0 // Mscng native key, over named curve
+#define KEYFLAG_EXPLICIT 1 // Mscng native key, over explicit ecc parameters
+#define KEYFLAG_NIST 2 // Mscng native key, over NIST parameters, custom ECDH/ECDSA_P* algo
+#define KEYFLAG_OTHER 3 // Other key, explicit ecc parameters
+
+JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MscngLib_createProvider(JNIEnv *env, jobject self) {
+ jclass local_provider_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeProvider$Mscng");
+ provider_class = (*env)->NewGlobalRef(env, local_provider_class);
+
+ jmethodID init = (*env)->GetMethodID(env, local_provider_class, "<init>", "(Ljava/lang/String;DLjava/lang/String;)V");
+
+ jstring name = (*env)->NewStringUTF(env, "Microsoft CNG");
+ double version = 1.0;
+
+ return (*env)->NewObject(env, provider_class, init, name, version, name);
+}
+
+JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Mscng_setup(JNIEnv *env, jobject self) {
+ INIT_PROVIDER(env, provider_class);
+
+ ADD_KPG(env, self, "ECDH", "MscngECDH");
+ ADD_KPG(env, self, "ECDSA", "MscngECDSA");
+
+ ADD_KA(env, self, "ECDHwithSHA1KDF(CNG)", "MscngECDHwithSHA1KDF");
+ ADD_KA(env, self, "ECDHwithSHA256KDF(CNG)", "MscngECDHwithSHA256KDF");
+ ADD_KA(env, self, "ECDHwithSHA384KDF(CNG)", "MscngECDHwithSHA384KDF");
+ ADD_KA(env, self, "ECDHwithSHA512KDF(CNG)", "MscngECDHwithSHA512KDF");
+
+ ADD_SIG(env, self, "SHA1withECDSA", "MscngECDSAwithSHA1");
+ ADD_SIG(env, self, "SHA256withECDSA", "MscngECDSAwithSHA256");
+ ADD_SIG(env, self, "SHA384withECDSA", "MscngECDSAwithSHA384");
+ ADD_SIG(env, self, "SHA512withECDSA", "MscngECDSAwithSHA112");
+
+ init_classes(env, "Mscng");
+}
+
+typedef struct {
+ LPCSTR name;
+ ULONG bits;
+} named_curve_t;
+
+static named_curve_t named_curves[] = {
+ {"curve25519", 256}, {"brainpoolP160r1", 160}, {"brainpoolP160t1", 160}, {"brainpoolP192r1", 192}, {"brainpoolP192t1", 192},
+ {"brainpoolP224r1", 224}, {"brainpoolP224t1", 224}, {"brainpoolP256r1", 256}, {"brainpoolP256t1", 256}, {"brainpoolP320r1", 320},
+ {"brainpoolP320t1", 320}, {"brainpoolP384r1", 384}, {"brainpoolP384t1", 384}, {"brainpoolP512r1", 512}, {"brainpoolP512t1", 512},
+ {"ec192wapi", 192}, {"nistP192", 192}, {"nistP224", 224}, {"nistP256", 256}, {"nistP384", 384},
+ {"nistP521", 521}, {"numsP256t1", 256}, {"numsP384t1", 384}, {"numsP512t1", 512}, {"secP160k1", 160},
+ {"secP160r1", 160}, {"secP160r2", 160}, {"secP192k1", 192}, {"secP192r1", 192}, {"secP224k1", 224},
+ {"secP224r1", 224}, {"secP256k1", 256}, {"secP256r1", 256}, {"secP384r1", 384}, {"secP521r1", 521},
+ {"wtls12", 224}, {"wtls7", 160}, {"wtls9", 160}, {"x962P192v1", 192}, {"x962P192v2", 192},
+ {"x962P192v3", 192}, {"x962P239v1", 239}, {"x962P239v2", 239}, {"x962P239v3", 239}, {"x962P256v1", 256}};
+
+static const named_curve_t *lookup_curve(const char *name) {
+ for (size_t i = 0; i < sizeof(named_curves) / sizeof(named_curve_t); ++i) {
+ if (strcmp(name, named_curves[i].name) == 0) {
+ return &named_curves[i];
+ }
+ }
+ return NULL;
+}
+
+static ULONG utf_16to8(NPSTR *out_buf, LPCWSTR in_str) {
+ INT result = WideCharToMultiByte(CP_UTF8, 0, in_str, -1, NULL, 0, NULL, NULL);
+ *out_buf = calloc(result, 1);
+ return WideCharToMultiByte(CP_UTF8, 0, in_str, -1, *out_buf, result, NULL, NULL);
+}
+
+static ULONG utf_8to16(NWPSTR *out_buf, LPCSTR in_str) {
+ INT result = MultiByteToWideChar(CP_UTF8, 0, in_str, -1, NULL, 0);
+ *out_buf = calloc(result * sizeof(WCHAR), 1);
+ return MultiByteToWideChar(CP_UTF8, 0, in_str, -1, *out_buf, result);
+}
+
+/**
+ * Convert Java String to UTF-16 NWPSTR null-terminated.
+ * Returns: Length of NWPSTR in bytes!
+ */
+static ULONG utf_strto16(NWPSTR *out_buf, JNIEnv *env, jobject str) {
+ jsize len = (*env)->GetStringLength(env, str);
+ *out_buf = calloc(len * sizeof(jchar) + 1, 1);
+ const jchar *chars = (*env)->GetStringChars(env, str, NULL);
+ memcpy(*out_buf, chars, len * sizeof(jchar));
+ (*env)->ReleaseStringChars(env, str, chars);
+ return len * sizeof(jchar);
+}
+
+JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MscngLib_getCurves(JNIEnv *env, jobject self) {
+ jclass hash_set_class = (*env)->FindClass(env, "java/util/TreeSet");
+
+ jmethodID hash_set_ctr = (*env)->GetMethodID(env, hash_set_class, "<init>", "()V");
+ jmethodID hash_set_add = (*env)->GetMethodID(env, hash_set_class, "add", "(Ljava/lang/Object;)Z");
+
+ jobject result = (*env)->NewObject(env, hash_set_class, hash_set_ctr);
+
+ NTSTATUS status;
+ BCRYPT_ALG_HANDLE handle;
+
+ if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(&handle, BCRYPT_ECDH_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0))) {
+ wprintf(L"**** Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status);
+ return result;
+ }
+
+ ULONG bufSize;
+ if (NT_FAILURE(status = BCryptGetProperty(handle, BCRYPT_ECC_CURVE_NAME_LIST, NULL, 0, &bufSize, 0))) {
+ wprintf(L"**** Error 0x%x returned by BCryptGetProperty(length only)\n", status);
+ BCryptCloseAlgorithmProvider(handle, 0);
+ return result;
+ }
+
+ BCRYPT_ECC_CURVE_NAMES *curves = (BCRYPT_ECC_CURVE_NAMES *)calloc(bufSize, 1);
+ if (NT_FAILURE(status = BCryptGetProperty(handle, BCRYPT_ECC_CURVE_NAME_LIST, (PBYTE)curves, bufSize, &bufSize, 0))) {
+ wprintf(L"**** Error 0x%x returned by BCryptGetProperty(whole)\n", status);
+ BCryptCloseAlgorithmProvider(handle, 0);
+ free(curves);
+ return result;
+ }
+
+ for (size_t i = 0; i < curves->dwEccCurveNames; ++i) {
+ NPSTR curve_name;
+ ULONG len = utf_16to8(&curve_name, curves->pEccCurveNames[i]);
+ jstring c_name = (*env)->NewStringUTF(env, curve_name);
+ (*env)->CallBooleanMethod(env, result, hash_set_add, c_name);
+ free(curve_name);
+ }
+
+ free(curves);
+
+ BCryptCloseAlgorithmProvider(handle, 0);
+ return result;
+}
+
+JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Mscng_keysizeSupported(JNIEnv *env,
+ jobject self,
+ jint keysize) {
+ switch (keysize) {
+ case 256:
+ case 384:
+ case 521:
+ return JNI_TRUE;
+ default:
+ return JNI_FALSE;
+ }
+}
+
+JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Mscng_paramsSupported(JNIEnv *env,
+ jobject self,
+ jobject params) {
+ if (params == NULL) {
+ return JNI_FALSE;
+ }
+
+ if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) {
+ jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
+ jstring name = (*env)->CallObjectMethod(env, params, get_name);
+ const char *utf_name = (*env)->GetStringUTFChars(env, name, NULL);
+ const named_curve_t *curve = lookup_curve(utf_name);
+ (*env)->ReleaseStringUTFChars(env, name, utf_name);
+ return curve == NULL ? JNI_FALSE : JNI_TRUE;
+ } else if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) {
+ jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;");
+ jobject curve = (*env)->CallObjectMethod(env, params, get_curve);
+
+ jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;");
+ jobject field = (*env)->CallObjectMethod(env, curve, get_field);
+
+ if ((*env)->IsInstanceOf(env, field, fp_field_class)) {
+ return JNI_TRUE;
+ } else {
+ return JNI_FALSE;
+ }
+ } else {
+ return JNI_FALSE;
+ }
+}
+
+static jobject bytes_to_biginteger(JNIEnv *env, PBYTE bytes, int len) {
+ jmethodID biginteger_init = (*env)->GetMethodID(env, biginteger_class, "<init>", "(I[B)V");
+ jbyteArray byte_array = (*env)->NewByteArray(env, len);
+ jbyte *data = (*env)->GetByteArrayElements(env, byte_array, NULL);
+ memcpy(data, bytes, len);
+ (*env)->ReleaseByteArrayElements(env, byte_array, data, 0);
+ jobject result = (*env)->NewObject(env, biginteger_class, biginteger_init, 1, byte_array);
+ return result;
+}
+
+static void biginteger_to_bytes(JNIEnv *env, jobject bigint, PBYTE bytes, ULONG len) {
+ jmethodID to_byte_array = (*env)->GetMethodID(env, biginteger_class, "toByteArray", "()[B");
+
+ jbyteArray byte_array = (jbyteArray)(*env)->CallObjectMethod(env, bigint, to_byte_array);
+ jsize byte_length = (*env)->GetArrayLength(env, byte_array);
+ jbyte *byte_data = (*env)->GetByteArrayElements(env, byte_array, NULL);
+ memcpy(bytes, &byte_data[byte_length - len], len);
+ (*env)->ReleaseByteArrayElements(env, byte_array, byte_data, JNI_ABORT);
+}
+
+static jobject create_ec_param_spec(JNIEnv *env, PBYTE eccParams, PULONG paramLength) {
+ //
+ // BCRYPT_ECCFULLKEY_BLOB header
+ // P[cbFieldLength] Prime specifying the base field.
+ // A[cbFieldLength] Coefficient A of the equation y^2 = x^3 + A*x + B mod p
+ // B[cbFieldLength] Coefficient B of the equation y^2 = x^3 + A*x + B mod p
+ // Gx[cbFieldLength] X-coordinate of the base point.
+ // Gy[cbFieldLength] Y-coordinate of the base point.
+ // n[cbSubgroupOrder] Order of the group generated by G = (x,y)
+ // h[cbCofactor] Cofactor of G in E.
+ // S[cbSeed] Seed of the curve.
+
+ BCRYPT_ECCFULLKEY_BLOB *header = (BCRYPT_ECCFULLKEY_BLOB *)eccParams;
+ PBYTE paramsStart = &eccParams[sizeof(BCRYPT_ECCFULLKEY_BLOB)];
+
+ // cbFieldLength
+ PBYTE P = paramsStart;
+ PBYTE A = P + header->cbFieldLength;
+ PBYTE B = A + header->cbFieldLength;
+ PBYTE GX = B + header->cbFieldLength;
+ PBYTE GY = GX + header->cbFieldLength;
+
+ // cbSubgroupOrder
+ PBYTE N = GY + header->cbFieldLength;
+
+ // cbCofactor
+ PBYTE H = N + header->cbSubgroupOrder;
+
+ // cbSeed
+ PBYTE S = H + header->cbCofactor;
+
+ *paramLength =
+ sizeof(BCRYPT_ECCFULLKEY_BLOB) + 5 * header->cbFieldLength + header->cbSubgroupOrder + header->cbCofactor + header->cbSeed;
+
+ jobject p_int = bytes_to_biginteger(env, P, header->cbFieldLength);
+
+ jmethodID fp_field_init = (*env)->GetMethodID(env, fp_field_class, "<init>", "(Ljava/math/BigInteger;)V");
+ jobject field = (*env)->NewObject(env, fp_field_class, fp_field_init, p_int);
+
+ jobject a_int = bytes_to_biginteger(env, A, header->cbFieldLength);
+ jobject b_int = bytes_to_biginteger(env, B, header->cbFieldLength);
+
+ jmethodID elliptic_curve_init = (*env)->GetMethodID(env, elliptic_curve_class, "<init>",
+ "(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;)V");
+ jobject elliptic_curve = (*env)->NewObject(env, elliptic_curve_class, elliptic_curve_init, field, a_int, b_int);
+
+ jobject gx_int = bytes_to_biginteger(env, GX, header->cbFieldLength);
+ jobject gy_int = bytes_to_biginteger(env, GY, header->cbFieldLength);
+
+ jmethodID point_init = (*env)->GetMethodID(env, point_class, "<init>", "(Ljava/math/BigInteger;Ljava/math/BigInteger;)V");
+ jobject g = (*env)->NewObject(env, point_class, point_init, gx_int, gy_int);
+
+ jobject n_int = bytes_to_biginteger(env, N, header->cbSubgroupOrder);
+
+ jobject h_int = bytes_to_biginteger(env, H, header->cbCofactor);
+ jmethodID bigint_to_int = (*env)->GetMethodID(env, biginteger_class, "intValue", "()I");
+ jint cof = (*env)->CallIntMethod(env, h_int, bigint_to_int);
+
+ jmethodID ec_parameter_spec_init = (*env)->GetMethodID(
+ env, ec_parameter_spec_class, "<init>", "(Ljava/security/spec/EllipticCurve;Ljava/security/spec/ECPoint;Ljava/math/BigInteger;I)V");
+ return (*env)->NewObject(env, ec_parameter_spec_class, ec_parameter_spec_init, elliptic_curve, g, n_int, cof);
+}
+
+static ULONG create_curve(JNIEnv *env, jobject params, PBYTE *curve) {
+ jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;");
+ jobject elliptic_curve = (*env)->CallObjectMethod(env, params, get_curve);
+
+ jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;");
+ jobject field = (*env)->CallObjectMethod(env, elliptic_curve, get_field);
+
+ jmethodID get_bits = (*env)->GetMethodID(env, fp_field_class, "getFieldSize", "()I");
+ jint bits = (*env)->CallIntMethod(env, field, get_bits);
+ jint bytes = (bits + 7) / 8;
+
+ jmethodID get_a = (*env)->GetMethodID(env, elliptic_curve_class, "getA", "()Ljava/math/BigInteger;");
+ jobject a = (*env)->CallObjectMethod(env, elliptic_curve, get_a);
+
+ jmethodID get_b = (*env)->GetMethodID(env, elliptic_curve_class, "getB", "()Ljava/math/BigInteger;");
+ jobject b = (*env)->CallObjectMethod(env, elliptic_curve, get_b);
+
+ jmethodID get_p = (*env)->GetMethodID(env, fp_field_class, "getP", "()Ljava/math/BigInteger;");
+ jobject p = (*env)->CallObjectMethod(env, field, get_p);
+
+ jmethodID get_g = (*env)->GetMethodID(env, ec_parameter_spec_class, "getGenerator", "()Ljava/security/spec/ECPoint;");
+ jobject g = (*env)->CallObjectMethod(env, params, get_g);
+
+ jmethodID get_x = (*env)->GetMethodID(env, point_class, "getAffineX", "()Ljava/math/BigInteger;");
+ jobject gx = (*env)->CallObjectMethod(env, g, get_x);
+
+ jmethodID get_y = (*env)->GetMethodID(env, point_class, "getAffineY", "()Ljava/math/BigInteger;");
+ jobject gy = (*env)->CallObjectMethod(env, g, get_y);
+
+ jmethodID get_n = (*env)->GetMethodID(env, ec_parameter_spec_class, "getOrder", "()Ljava/math/BigInteger;");
+ jobject n = (*env)->CallObjectMethod(env, params, get_n);
+
+ jmethodID get_h = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCofactor", "()I");
+ jint h = (*env)->CallIntMethod(env, params, get_h);
+
+ jmethodID get_bitlength = (*env)->GetMethodID(env, biginteger_class, "bitLength", "()I");
+ jint order_bits = (*env)->CallIntMethod(env, n, get_bitlength);
+ jint order_bytes = (order_bits + 7) / 8;
+
+ // header_size + 5*bytes + order_bytes + cof_size + 0
+ ULONG bufSize = sizeof(BCRYPT_ECC_PARAMETER_HEADER) + 5 * bytes + order_bytes + 1 + 0;
+ *curve = calloc(bufSize, 1);
+ BCRYPT_ECC_PARAMETER_HEADER *header = (BCRYPT_ECC_PARAMETER_HEADER *)*curve;
+ header->dwVersion = 1;
+ header->dwCurveType = 1; // 1 -> Prime short Weierstrass, 2 -> Prime Twisted Edwards, 3 -> Montgomery
+ header->dwCurveGenerationAlgId = 0;
+ header->cbFieldLength = bytes;
+ header->cbSubgroupOrder = order_bytes;
+ header->cbCofactor = 1;
+ header->cbSeed = 0;
+
+ PBYTE paramsStart = &(*curve)[sizeof(BCRYPT_ECC_PARAMETER_HEADER)];
+
+ biginteger_to_bytes(env, p, paramsStart, bytes);
+ biginteger_to_bytes(env, a, paramsStart + bytes, bytes);
+ biginteger_to_bytes(env, b, paramsStart + 2 * bytes, bytes);
+ biginteger_to_bytes(env, gx, paramsStart + 3 * bytes, bytes);
+ biginteger_to_bytes(env, gy, paramsStart + 4 * bytes, bytes);
+ biginteger_to_bytes(env, n, paramsStart + 5 * bytes, order_bytes);
+ PBYTE cof_ptr = (PBYTE)(paramsStart + 5 * bytes + order_bytes);
+ *cof_ptr = (BYTE)h;
+ return bufSize;
+}
+
+static ULONG init_algo(JNIEnv *env, BCRYPT_ALG_HANDLE *handle, jint *keyflag, NWPSTR *curve_name, LPCWSTR algo, jobject params) {
+ NTSTATUS status;
+ if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(handle, algo, MS_PRIMITIVE_PROVIDER, 0))) {
+ wprintf(L"**** Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status);
+ return 0;
+ }
+ ULONG result = 0;
+ if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) {
+ jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
+ jstring name = (*env)->CallObjectMethod(env, params, get_name);
+ jint utf_length = (*env)->GetStringUTFLength(env, name);
+ PUCHAR chars = calloc(utf_length + 1, 1);
+ (*env)->GetStringUTFRegion(env, name, 0, utf_length, chars);
+ const named_curve_t *curve = lookup_curve(chars);
+ ULONG ret = utf_8to16(curve_name, chars);
+ if (NT_FAILURE(status = BCryptSetProperty(*handle, BCRYPT_ECC_CURVE_NAME, (PUCHAR)*curve_name, ret * sizeof(WCHAR), 0))) {
+ wprintf(L"**** Error 0x%x returned by BCryptSetProperty\n", status);
+ return 0;
+ }
+ free(chars);
+ result = curve->bits;
+ *keyflag = KEYFLAG_IMPLICIT;
+ } else if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) {
+ PBYTE curve;
+ ULONG curveLen = create_curve(env, params, &curve);
+ if (NT_FAILURE(status = BCryptSetProperty(*handle, BCRYPT_ECC_PARAMETERS, curve, curveLen, 0))) {
+ wprintf(L"**** Error 0x%x returned by BCryptSetProperty\n", status);
+ return 0;
+ }
+ free(curve);
+
+ jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;");
+ jobject elliptic_curve = (*env)->CallObjectMethod(env, params, get_curve);
+
+ jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;");
+ jobject field = (*env)->CallObjectMethod(env, elliptic_curve, get_field);
+
+ jmethodID get_bits = (*env)->GetMethodID(env, fp_field_class, "getFieldSize", "()I");
+ jint bits = (*env)->CallIntMethod(env, field, get_bits);
+ result = bits;
+ *keyflag = KEYFLAG_EXPLICIT;
+ *curve_name = NULL;
+ }
+ return result;
+}
+
+static jobject key_to_privkey(JNIEnv *env, BCRYPT_KEY_HANDLE key, jint flag, LPCWSTR curve) {
+ NTSTATUS status;
+ ULONG bufSize = 0;
+ if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCFULLPRIVATE_BLOB, NULL, 0, &bufSize, 0))) {
+ wprintf(L"**** Error 0x%x returned by BCryptExportKey(full, length only)\n", status);
+ return NULL;
+ }
+ if (bufSize == 0) {
+ printf("buf 0\n");
+ return NULL;
+ }
+
+ PBYTE fullBuf = calloc(bufSize, 1);
+ if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCFULLPRIVATE_BLOB, fullBuf, bufSize, &bufSize, 0))) {
+ wprintf(L"**** Error 0x%x returned by BCryptExportKey(full, whole)\n", status);
+ free(fullBuf);
+ return NULL;
+ }
+
+ ULONG paramLength;
+ jobject ec_priv_param_spec = create_ec_param_spec(env, fullBuf, &paramLength);
+
+ // fullBuf looks like:
+ // BCRYPT_ECCFULLKEY_BLOB header
+ // P[cbFieldLength] Prime specifying the base field.
+ // A[cbFieldLength] Coefficient A of the equation y^2 = x^3 + A*x + B mod p
+ // B[cbFieldLength] Coefficient B of the equation y^2 = x^3 + A*x + B mod p
+ // Gx[cbFieldLength] X-coordinate of the base point.
+ // Gy[cbFieldLength] Y-coordinate of the base point.
+ // n[cbSubgroupOrder] Order of the group generated by G = (x,y)
+ // h[cbCofactor] Cofactor of G in E.
+ // S[cbSeed] Seed of the curve.
+ // Qx[cbFieldLength] X-coordinate of the public point.
+ // Qy[cbFieldLength] Y-coordinate of the public point.
+ // d[cbSubgroupOrder] Private key.
+ BCRYPT_ECCFULLKEY_BLOB *privHeader = (BCRYPT_ECCFULLKEY_BLOB *)fullBuf;
+ PBYTE priv_x = &fullBuf[paramLength];
+ PBYTE priv_y = priv_x + privHeader->cbFieldLength;
+ PBYTE priv = priv_y + privHeader->cbFieldLength;
+
+ jbyteArray meta_bytes = NULL;
+ jbyteArray header_bytes = NULL;
+ switch (flag) {
+ case 0: {
+ // meta = curve
+ jint meta_len = (wcslen(curve) + 1) * sizeof(WCHAR);
+ meta_bytes = (*env)->NewByteArray(env, meta_len);
+ jbyte *meta_data = (*env)->GetByteArrayElements(env, meta_bytes, NULL);
+ memcpy(meta_data, curve, meta_len);
+ (*env)->ReleaseByteArrayElements(env, meta_bytes, meta_data, 0);
+ }
+ case 1:
+ case 2: {
+ // meta = null
+ // header = full
+ header_bytes = (*env)->NewByteArray(env, paramLength);
+ jbyte *header_data = (*env)->GetByteArrayElements(env, header_bytes, NULL);
+ memcpy(header_data, fullBuf, paramLength);
+ (*env)->ReleaseByteArrayElements(env, header_bytes, header_data, 0);
+ break;
+ }
+ default:
+ // header = small
+ if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCPRIVATE_BLOB, NULL, 0, &bufSize, 0))) {
+ wprintf(L"**** Error 0x%x returned by BCryptExportKey(small, length only)\n", status);
+ free(fullBuf);
+ return NULL;
+ }
+ if (bufSize == 0) {
+ printf("buf 0\n");
+ free(fullBuf);
+ return NULL;
+ }
+ PBYTE smallBuf = calloc(bufSize, 1);
+ if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCPRIVATE_BLOB, smallBuf, bufSize, &bufSize, 0))) {
+ wprintf(L"**** Error 0x%x returned by BCryptExportKey(small, whole)\n", status);
+ free(fullBuf);
+ free(smallBuf);
+ return NULL;
+ }
+ // smallBuf looks like:
+ // BCRYPT_ECCKEY_BLOB header
+ // Qx[cbFieldLength] X-coordinate of the public point.
+ // Qy[cbFieldLength] Y-coordinate of the public point.
+ // d[cbSubgroupOrder] Private key.
+ header_bytes = (*env)->NewByteArray(env, sizeof(BCRYPT_ECCKEY_BLOB));
+ jbyte *header_data = (*env)->GetByteArrayElements(env, header_bytes, NULL);
+ memcpy(header_data, smallBuf, sizeof(BCRYPT_ECCKEY_BLOB));
+ (*env)->ReleaseByteArrayElements(env, header_bytes, header_data, 0);
+ free(smallBuf);
+ break;
+ }
+
+ jbyteArray x_bytes = (*env)->NewByteArray(env, privHeader->cbFieldLength);
+ jbyte *x_data = (*env)->GetByteArrayElements(env, x_bytes, NULL);
+ memcpy(x_data, priv_x, privHeader->cbFieldLength);
+ (*env)->ReleaseByteArrayElements(env, x_bytes, x_data, 0);
+
+ jbyteArray y_bytes = (*env)->NewByteArray(env, privHeader->cbFieldLength);
+ jbyte *y_data = (*env)->GetByteArrayElements(env, y_bytes, NULL);
+ memcpy(y_data, priv_y, privHeader->cbFieldLength);
+ (*env)->ReleaseByteArrayElements(env, y_bytes, y_data, 0);
+
+ jbyteArray priv_bytes = (*env)->NewByteArray(env, privHeader->cbSubgroupOrder);
+ jbyte *key_priv = (*env)->GetByteArrayElements(env, priv_bytes, NULL);
+ memcpy(key_priv, priv, privHeader->cbSubgroupOrder);
+ (*env)->ReleaseByteArrayElements(env, priv_bytes, key_priv, 0);
+
+ free(fullBuf);
+
+ jmethodID ec_priv_init = (*env)->GetMethodID(env, privkey_class, "<init>", "(I[B[B[B[B[BLjava/security/spec/ECParameterSpec;)V");
+ return (*env)->NewObject(env, privkey_class, ec_priv_init, flag, meta_bytes, header_bytes, x_bytes, y_bytes, priv_bytes,
+ ec_priv_param_spec);
+}
+
+static jobject key_to_pubkey(JNIEnv *env, BCRYPT_KEY_HANDLE key, jint flag, LPCWSTR curve) {
+ NTSTATUS status;
+ ULONG bufSize = 0;
+ if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCFULLPUBLIC_BLOB, NULL, 0, &bufSize, 0))) {
+ wprintf(L"**** Error 0x%x returned by BCryptExportKey(full, length only)\n", status);
+ return NULL;
+ }
+ if (bufSize == 0) {
+ printf("err0\n");
+ return NULL;
+ }
+
+ PBYTE fullBuf = calloc(bufSize, 1);
+ if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCFULLPUBLIC_BLOB, fullBuf, bufSize, &bufSize, 0))) {
+ wprintf(L"**** Error 0x%x returned by BCryptExportKey(full, whole)\n", status);
+ return NULL;
+ }
+
+ ULONG paramLength;
+ jobject ec_pub_param_spec = create_ec_param_spec(env, fullBuf, &paramLength);
+
+ // fullBuf looks like:
+ // BCRYPT_ECCFULLKEY_BLOB header
+ // P[cbFieldLength] Prime specifying the base field.
+ // A[cbFieldLength] Coefficient A of the equation y^2 = x^3 + A*x + B mod p
+ // B[cbFieldLength] Coefficient B of the equation y^2 = x^3 + A*x + B mod p
+ // Gx[cbFieldLength] X-coordinate of the base point.
+ // Gy[cbFieldLength] Y-coordinate of the base point.
+ // n[cbSubgroupOrder] Order of the group generated by G = (x,y)
+ // h[cbCofactor] Cofactor of G in E.
+ // S[cbSeed] Seed of the curve.
+ // Qx[cbFieldLength] X-coordinate of the public point.
+ // Qy[cbFieldLength] Y-coordinate of the public point.
+ BCRYPT_ECCFULLKEY_BLOB *pubHeader = (BCRYPT_ECCFULLKEY_BLOB *)fullBuf;
+ PBYTE pub_x = &fullBuf[paramLength];
+ PBYTE pub_y = pub_x + pubHeader->cbFieldLength;
+
+ jbyteArray meta_bytes = NULL;
+ jbyteArray header_bytes = NULL;
+ switch (flag) {
+ case 0: {
+ // meta = curve
+ jint meta_len = (wcslen(curve) + 1) * sizeof(WCHAR);
+ meta_bytes = (*env)->NewByteArray(env, meta_len);
+ jbyte *meta_data = (*env)->GetByteArrayElements(env, meta_bytes, NULL);
+ memcpy(meta_data, curve, meta_len);
+ (*env)->ReleaseByteArrayElements(env, meta_bytes, meta_data, 0);
+ }
+ case 1:
+ case 2: {
+ header_bytes = (*env)->NewByteArray(env, paramLength);
+ jbyte *header_data = (*env)->GetByteArrayElements(env, header_bytes, NULL);
+ memcpy(header_data, pubHeader, paramLength);
+ (*env)->ReleaseByteArrayElements(env, header_bytes, header_data, 0);
+ break;
+ }
+ default:
+ // header = small
+ if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCPUBLIC_BLOB, NULL, 0, &bufSize, 0))) {
+ wprintf(L"**** Error 0x%x returned by BCryptExportKey(small, length only)\n", status);
+ free(fullBuf);
+ return NULL;
+ }
+ if (bufSize == 0) {
+ printf("buf 0\n");
+ free(fullBuf);
+ return NULL;
+ }
+ PBYTE smallBuf = calloc(bufSize, 1);
+ if (NT_FAILURE(status = BCryptExportKey(key, NULL, BCRYPT_ECCPUBLIC_BLOB, smallBuf, bufSize, &bufSize, 0))) {
+ wprintf(L"**** Error 0x%x returned by BCryptExportKey(small, whole)\n", status);
+ free(fullBuf);
+ free(smallBuf);
+ return NULL;
+ }
+ // smallBuf looks like:
+ // BCRYPT_ECCKEY_BLOB header
+ // Qx[cbFieldLength] X-coordinate of the public point.
+ // Qy[cbFieldLength] Y-coordinate of the public point.
+ header_bytes = (*env)->NewByteArray(env, sizeof(BCRYPT_ECCKEY_BLOB));
+ jbyte *header_data = (*env)->GetByteArrayElements(env, header_bytes, NULL);
+ memcpy(header_data, smallBuf, sizeof(BCRYPT_ECCKEY_BLOB));
+ (*env)->ReleaseByteArrayElements(env, header_bytes, header_data, 0);
+ free(smallBuf);
+ break;
+ }
+
+ jbyteArray x_bytes = (*env)->NewByteArray(env, pubHeader->cbFieldLength);
+ jbyte *x_data = (*env)->GetByteArrayElements(env, x_bytes, NULL);
+ memcpy(x_data, pub_x, pubHeader->cbFieldLength);
+ (*env)->ReleaseByteArrayElements(env, x_bytes, x_data, 0);
+
+ jbyteArray y_bytes = (*env)->NewByteArray(env, pubHeader->cbFieldLength);
+ jbyte *y_data = (*env)->GetByteArrayElements(env, y_bytes, NULL);
+ memcpy(y_data, pub_y, pubHeader->cbFieldLength);
+ (*env)->ReleaseByteArrayElements(env, y_bytes, y_data, 0);
+
+ free(fullBuf);
+
+ jmethodID ec_pub_init = (*env)->GetMethodID(env, pubkey_class, "<init>", "(I[B[B[B[BLjava/security/spec/ECParameterSpec;)V");
+ return (*env)->NewObject(env, pubkey_class, ec_pub_init, flag, meta_bytes, header_bytes, x_bytes, y_bytes, ec_pub_param_spec);
+}
+
+JNIEXPORT jobject JNICALL
+Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Mscng_generate__ILjava_security_SecureRandom_2(JNIEnv *env,
+ jobject self,
+ jint keysize,
+ jobject random) {
+ NTSTATUS status;
+ BCRYPT_ALG_HANDLE handle = NULL;
+
+ jclass mscng_kpg_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi$Mscng");
+ jfieldID type_id = (*env)->GetFieldID(env, mscng_kpg_class, "type", "Ljava/lang/String;");
+ jstring type = (jstring)(*env)->GetObjectField(env, self, type_id);
+ const char *type_data = (*env)->GetStringUTFChars(env, type, NULL);
+ LPCWSTR algo;
+ if (strcmp(type_data, "ECDH") == 0) {
+ switch (keysize) {
+ case 256:
+ algo = BCRYPT_ECDH_P256_ALGORITHM;
+ break;
+ case 384:
+ algo = BCRYPT_ECDH_P384_ALGORITHM;
+ break;
+ case 521:
+ algo = BCRYPT_ECDH_P521_ALGORITHM;
+ break;
+ default:
+ // unreachable
+ return NULL;
+ }
+ } else if (strcmp(type_data, "ECDSA") == 0) {
+ switch (keysize) {
+ case 256:
+ algo = BCRYPT_ECDSA_P256_ALGORITHM;
+ break;
+ case 384:
+ algo = BCRYPT_ECDSA_P384_ALGORITHM;
+ break;
+ case 521:
+ algo = BCRYPT_ECDSA_P521_ALGORITHM;
+ break;
+ default:
+ // unreachable
+ return NULL;
+ }
+ } else {
+ // unreachable
+ return NULL;
+ }
+ (*env)->ReleaseStringUTFChars(env, type, type_data);
+
+ if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(&handle, algo, MS_PRIMITIVE_PROVIDER, 0))) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptOpenAlgorithmProvider", status);
+ return NULL;
+ }
+
+ BCRYPT_KEY_HANDLE key = NULL;
+
+ native_timing_start();
+ status = BCryptGenerateKeyPair(handle, &key, keysize, 0);
+ native_timing_pause();
+
+ if (NT_FAILURE(status)) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptGenerateKeyPair\n", status);
+ BCryptCloseAlgorithmProvider(handle, 0);
+ return NULL;
+ }
+
+ native_timing_restart();
+ status = BCryptFinalizeKeyPair(key, 0);
+ native_timing_stop();
+
+ if (NT_FAILURE(status)) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptFinalizeKeyPair\n", status);
+ BCryptCloseAlgorithmProvider(handle, 0);
+ return NULL;
+ }
+
+ jobject privkey = key_to_privkey(env, key, KEYFLAG_NIST, NULL);
+ jobject pubkey = key_to_pubkey(env, key, KEYFLAG_NIST, NULL);
+
+ jmethodID keypair_init = (*env)->GetMethodID(env, keypair_class, "<init>", "(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V");
+
+ BCryptDestroyKey(key);
+ BCryptCloseAlgorithmProvider(handle, 0);
+ return (*env)->NewObject(env, keypair_class, keypair_init, pubkey, privkey);
+}
+
+JNIEXPORT jobject JNICALL
+Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Mscng_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2(
+ JNIEnv *env, jobject self, jobject params, jobject random) {
+ NTSTATUS status;
+ BCRYPT_ALG_HANDLE handle = NULL;
+ BCRYPT_KEY_HANDLE key = NULL;
+
+ jclass mscng_kpg_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi$Mscng");
+ jfieldID type_id = (*env)->GetFieldID(env, mscng_kpg_class, "type", "Ljava/lang/String;");
+ jstring type = (jstring)(*env)->GetObjectField(env, self, type_id);
+ const char *type_data = (*env)->GetStringUTFChars(env, type, NULL);
+ LPCWSTR algo;
+ if (strcmp(type_data, "ECDH") == 0) {
+ algo = BCRYPT_ECDH_ALGORITHM;
+ } else if (strcmp(type_data, "ECDSA") == 0) {
+ algo = BCRYPT_ECDSA_ALGORITHM;
+ } else {
+ // unreachable
+ return NULL;
+ }
+ (*env)->ReleaseStringUTFChars(env, type, type_data);
+
+ jint keyflag;
+ NWPSTR curveName;
+ ULONG bits = init_algo(env, &handle, &keyflag, &curveName, algo, params);
+ if (bits == 0) {
+ throw_new(env, "java/security/GeneralSecurityException", "Couldn't initialize algo.");
+ return NULL;
+ }
+
+ native_timing_start();
+ status = BCryptGenerateKeyPair(handle, &key, bits, 0);
+ native_timing_pause();
+
+ if (NT_FAILURE(status)) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptGenerateKeyPair\n", status);
+ BCryptCloseAlgorithmProvider(handle, 0);
+ return NULL;
+ }
+
+ native_timing_restart();
+ status = BCryptFinalizeKeyPair(key, 0);
+ native_timing_stop();
+
+ if (NT_FAILURE(status)) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptFinalizeKeyPair\n", status);
+ BCryptCloseAlgorithmProvider(handle, 0);
+ return NULL;
+ }
+
+ jobject privkey = key_to_privkey(env, key, keyflag, curveName);
+ jobject pubkey = key_to_pubkey(env, key, keyflag, curveName);
+
+ if (curveName) {
+ free(curveName);
+ }
+
+ jmethodID keypair_init = (*env)->GetMethodID(env, keypair_class, "<init>", "(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V");
+
+ BCryptDestroyKey(key);
+ BCryptCloseAlgorithmProvider(handle, 0);
+ return (*env)->NewObject(env, keypair_class, keypair_init, pubkey, privkey);
+}
+
+static NTSTATUS init_use_algo(JNIEnv *env, BCRYPT_ALG_HANDLE *handle, LPCWSTR type, jint keyflag, jbyteArray meta, jobject params) {
+ LPCWSTR ecdh_algos[] = {BCRYPT_ECDH_ALGORITHM, BCRYPT_ECDH_P256_ALGORITHM, BCRYPT_ECDH_P384_ALGORITHM, BCRYPT_ECDH_P521_ALGORITHM};
+ LPCWSTR ecdsa_algos[] = {BCRYPT_ECDSA_ALGORITHM, BCRYPT_ECDSA_P256_ALGORITHM, BCRYPT_ECDSA_P384_ALGORITHM, BCRYPT_ECDSA_P521_ALGORITHM};
+
+ LPCWSTR *algos;
+ LPCWSTR algo;
+ if (lstrcmpW(type, BCRYPT_ECDH_ALGORITHM) == 0) {
+ algos = ecdh_algos;
+ } else if (lstrcmpW(type, BCRYPT_ECDSA_ALGORITHM) == 0) {
+ algos = ecdsa_algos;
+ } else {
+ // unreachable
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ switch (keyflag) {
+ case KEYFLAG_IMPLICIT:
+ case KEYFLAG_EXPLICIT:
+ case KEYFLAG_OTHER:
+ algo = algos[0];
+ break;
+ case KEYFLAG_NIST: {
+ jmethodID get_curve = (*env)->GetMethodID(env, ec_parameter_spec_class, "getCurve", "()Ljava/security/spec/EllipticCurve;");
+ jobject elliptic_curve = (*env)->CallObjectMethod(env, params, get_curve);
+
+ jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;");
+ jobject field = (*env)->CallObjectMethod(env, elliptic_curve, get_field);
+
+ jmethodID get_bits = (*env)->GetMethodID(env, fp_field_class, "getFieldSize", "()I");
+ jint bits = (*env)->CallIntMethod(env, field, get_bits);
+ switch (bits) {
+ case 256:
+ algo = algos[1];
+ break;
+ case 384:
+ algo = algos[2];
+ break;
+ case 521:
+ algo = algos[3];
+ break;
+ default:
+ return STATUS_INVALID_PARAMETER;
+ }
+ break;
+ }
+ }
+ NTSTATUS status;
+
+ if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(handle, algo, MS_PRIMITIVE_PROVIDER, 0))) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status);
+ return status;
+ }
+
+ switch (keyflag) {
+ case KEYFLAG_IMPLICIT: {
+ jint meta_len = (*env)->GetArrayLength(env, meta);
+ jbyte *meta_data = (*env)->GetByteArrayElements(env, meta, NULL);
+ // if (NT_FAILURE(status = BCryptSetProperty(*handle, BCRYPT_ECC_CURVE_NAME, meta_data, meta_len, 0))) {
+ // throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptSetProperty(curve name)\n",
+ //status);
+ // (*env)->ReleaseByteArrayElements(env, meta, meta_data, JNI_ABORT);
+ // return status;
+ //}
+ (*env)->ReleaseByteArrayElements(env, meta, meta_data, JNI_ABORT);
+ break;
+ }
+ case KEYFLAG_EXPLICIT:
+ case KEYFLAG_OTHER: {
+ PBYTE curve;
+ ULONG curve_len = create_curve(env, params, &curve);
+ if (NT_FAILURE(status = BCryptSetProperty(*handle, BCRYPT_ECC_PARAMETERS, curve, curve_len, 0))) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptSetProperty(parameters)\n",
+ status);
+ free(curve);
+ return status;
+ }
+ free(curve);
+ break;
+ }
+ }
+ return STATUS_SUCCESS;
+}
+
+static jint get_keyflag(JNIEnv *env, jobject key) {
+ if ((*env)->IsInstanceOf(env, key, pubkey_class) || (*env)->IsInstanceOf(env, key, privkey_class)) {
+ jclass key_class = (*env)->GetObjectClass(env, key);
+ jmethodID get_flag = (*env)->GetMethodID(env, key_class, "getFlag", "()I");
+ return (*env)->CallIntMethod(env, key, get_flag);
+ } else {
+ return KEYFLAG_OTHER;
+ }
+}
+
+static jbyteArray get_meta(JNIEnv *env, jobject key) {
+ if ((*env)->IsInstanceOf(env, key, pubkey_class) || (*env)->IsInstanceOf(env, key, privkey_class)) {
+ jclass key_class = (*env)->GetObjectClass(env, key);
+ jmethodID get_meta = (*env)->GetMethodID(env, key_class, "getMeta", "()[B");
+ return (jbyteArray)(*env)->CallObjectMethod(env, key, get_meta);
+ } else {
+ return NULL;
+ }
+}
+
+JNIEXPORT jbyteArray JNICALL
+Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Mscng_generateSecret__Ljava_security_interfaces_ECPublicKey_2Ljava_security_interfaces_ECPrivateKey_2Ljava_security_spec_AlgorithmParameterSpec_2(
+ JNIEnv *env, jobject self, jobject pubkey, jobject privkey, jobject params) {
+ NTSTATUS status;
+
+ jclass mscng_ka_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi$Mscng");
+ jfieldID type_id = (*env)->GetFieldID(env, mscng_ka_class, "type", "Ljava/lang/String;");
+ jstring type = (jstring)(*env)->GetObjectField(env, self, type_id);
+ const char *type_data = (*env)->GetStringUTFChars(env, type, NULL);
+ LPCWSTR kdf_algo;
+ if (strcmp(type_data, "ECDHwithSHA1KDF(CNG)") == 0) {
+ kdf_algo = BCRYPT_SHA1_ALGORITHM;
+ } else if (strcmp(type_data, "ECDHwithSHA256KDF(CNG)") == 0) {
+ kdf_algo = BCRYPT_SHA256_ALGORITHM;
+ } else if (strcmp(type_data, "ECDHwithSHA384KDF(CNG)") == 0) {
+ kdf_algo = BCRYPT_SHA384_ALGORITHM;
+ } else if (strcmp(type_data, "ECDHwithSHA512KDF(CNG)") == 0) {
+ kdf_algo = BCRYPT_SHA512_ALGORITHM;
+ } else {
+ // unreachable
+ return NULL;
+ }
+ (*env)->ReleaseStringUTFChars(env, type, type_data);
+
+ BCRYPT_ALG_HANDLE kaHandle = NULL;
+
+ jint pub_flag = get_keyflag(env, pubkey);
+ if (pub_flag == KEYFLAG_OTHER) {
+ throw_new(env, "java/security/InvalidAlgorithmParameterException", "Cannot import non-native public key.");
+ return NULL;
+ }
+ jbyteArray meta = get_meta(env, pubkey);
+
+ if (NT_FAILURE(status = init_use_algo(env, &kaHandle, BCRYPT_ECDH_ALGORITHM, pub_flag, meta, params))) {
+ return NULL;
+ }
+
+ BCRYPT_KEY_HANDLE pkey = NULL;
+ BCRYPT_KEY_HANDLE skey = NULL;
+
+ jmethodID get_data_priv = (*env)->GetMethodID(env, pubkey_class, "getData", "()[B");
+ jbyteArray pubkey_barray = (jbyteArray)(*env)->CallObjectMethod(env, pubkey, get_data_priv);
+
+ jint pub_length = (*env)->GetArrayLength(env, pubkey_barray);
+ jbyte *pub_data = (*env)->GetByteArrayElements(env, pubkey_barray, NULL);
+ if (NT_FAILURE(status = BCryptImportKeyPair(kaHandle, NULL, BCRYPT_ECCFULLPUBLIC_BLOB, &pkey, pub_data, pub_length, 0))) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptImportKeyPair(pub)\n", status);
+ BCryptCloseAlgorithmProvider(kaHandle, 0);
+ (*env)->ReleaseByteArrayElements(env, pubkey_barray, pub_data, JNI_ABORT);
+ return NULL;
+ }
+ (*env)->ReleaseByteArrayElements(env, pubkey_barray, pub_data, JNI_ABORT);
+
+ jint priv_flag = get_keyflag(env, privkey);
+ if (priv_flag == KEYFLAG_OTHER) {
+ throw_new(env, "java/security/InvalidAlgorithmParameterException", "Cannot import non-native private key.");
+ return NULL;
+ }
+
+ jmethodID get_data_pub = (*env)->GetMethodID(env, privkey_class, "getData", "()[B");
+ jbyteArray privkey_barray = (jbyteArray)(*env)->CallObjectMethod(env, privkey, get_data_pub);
+
+ jint priv_length = (*env)->GetArrayLength(env, privkey_barray);
+ jbyte *priv_data = (*env)->GetByteArrayElements(env, privkey_barray, NULL);
+ if (NT_FAILURE(status = BCryptImportKeyPair(kaHandle, NULL, BCRYPT_ECCFULLPRIVATE_BLOB, &skey, priv_data, priv_length, 0))) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptImportKeyPair(priv)\n", status);
+ BCryptCloseAlgorithmProvider(kaHandle, 0);
+ BCryptDestroyKey(pkey);
+ (*env)->ReleaseByteArrayElements(env, privkey_barray, priv_data, JNI_ABORT);
+ return NULL;
+ }
+ (*env)->ReleaseByteArrayElements(env, privkey_barray, priv_data, JNI_ABORT);
+
+ BCRYPT_SECRET_HANDLE ka = NULL;
+
+ native_timing_start();
+ status = BCryptSecretAgreement(skey, pkey, &ka, 0);
+ native_timing_stop();
+
+ if (NT_FAILURE(status)) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptSecretAgreement\n", status);
+ BCryptCloseAlgorithmProvider(kaHandle, 0);
+ BCryptDestroyKey(pkey);
+ BCryptDestroyKey(skey);
+ return NULL;
+ }
+
+ BCryptBufferDesc paramList = {0};
+ BCryptBuffer kdfParams[1] = {0};
+ kdfParams[0].BufferType = KDF_HASH_ALGORITHM;
+ kdfParams[0].cbBuffer = (DWORD)((wcslen(kdf_algo) + 1) * sizeof(WCHAR));
+ kdfParams[0].pvBuffer = (PVOID)kdf_algo;
+ paramList.cBuffers = 1;
+ paramList.pBuffers = kdfParams;
+ paramList.ulVersion = BCRYPTBUFFER_VERSION;
+
+ ULONG bufSize = 0;
+ if (NT_FAILURE(status = BCryptDeriveKey(ka, BCRYPT_KDF_HASH, &paramList, NULL, 0, &bufSize, 0))) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptDeriveKey(length only)\n", status);
+ return NULL;
+ }
+
+ PBYTE derived = calloc(bufSize, 1);
+ if (NT_FAILURE(status = BCryptDeriveKey(ka, BCRYPT_KDF_HASH, &paramList, derived, bufSize, &bufSize, 0))) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptDeriveKey(whole)\n", status);
+ return NULL;
+ }
+
+ jbyteArray result = (*env)->NewByteArray(env, bufSize);
+ jbyte *result_data = (*env)->GetByteArrayElements(env, result, NULL);
+ memcpy(result_data, derived, bufSize);
+ (*env)->ReleaseByteArrayElements(env, result, result_data, 0);
+
+ free(derived);
+ BCryptDestroyKey(pkey);
+ BCryptDestroyKey(skey);
+ BCryptDestroySecret(ka);
+ BCryptCloseAlgorithmProvider(kaHandle, 0);
+ return result;
+}
+
+JNIEXPORT jobject JNICALL
+Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Mscng_generateSecret__Ljava_security_interfaces_ECPublicKey_2Ljava_security_interfaces_ECPrivateKey_2Ljava_security_spec_AlgorithmParameterSpec_2Ljava_lang_String_2(
+ JNIEnv *env, jobject self, jobject pubkey, jobject privkey, jobject params, jstring algorithm) {
+ throw_new(env, "java/lang/UnsupportedOperationException", "Not supported.");
+ return NULL;
+}
+
+static LPCWSTR get_sighash_algo(JNIEnv *env, jobject self) {
+ jclass mscng_sig_class = (*env)->FindClass(env, "cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi$Mscng");
+ jfieldID type_id = (*env)->GetFieldID(env, mscng_sig_class, "type", "Ljava/lang/String;");
+ jstring type = (jstring)(*env)->GetObjectField(env, self, type_id);
+ const char *type_data = (*env)->GetStringUTFChars(env, type, NULL);
+ LPCWSTR hash_algo;
+ if (strcmp(type_data, "SHA1withECDSA") == 0) {
+ hash_algo = BCRYPT_SHA1_ALGORITHM;
+ } else if (strcmp(type_data, "SHA256withECDSA") == 0) {
+ hash_algo = BCRYPT_SHA256_ALGORITHM;
+ } else if (strcmp(type_data, "SHA384withECDSA") == 0) {
+ hash_algo = BCRYPT_SHA384_ALGORITHM;
+ } else if (strcmp(type_data, "SHA512withECDSA") == 0) {
+ hash_algo = BCRYPT_SHA512_ALGORITHM;
+ } else {
+ // unreachable
+ return NULL;
+ }
+ (*env)->ReleaseStringUTFChars(env, type, type_data);
+ return hash_algo;
+}
+
+JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Mscng_sign(JNIEnv *env, jobject self,
+ jbyteArray data, jobject privkey,
+ jobject params) {
+ NTSTATUS status;
+ LPCWSTR hash_algo = get_sighash_algo(env, self);
+
+ BCRYPT_ALG_HANDLE sigHandle = NULL;
+
+ jint keyflag = get_keyflag(env, privkey);
+ if (keyflag == KEYFLAG_OTHER) {
+ throw_new(env, "java/security/InvalidAlgorithmParameterException", "Cannot import non-native private key.");
+ return NULL;
+ }
+ jbyteArray meta = get_meta(env, privkey);
+
+ if (NT_FAILURE(status = init_use_algo(env, &sigHandle, BCRYPT_ECDSA_ALGORITHM, keyflag, meta, params))) {
+ return NULL;
+ }
+
+ if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(&sigHandle, BCRYPT_ECDSA_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0))) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status);
+ return NULL;
+ }
+
+ BCRYPT_ALG_HANDLE hashHandle = NULL;
+
+ if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(&hashHandle, hash_algo, NULL, 0))) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status);
+ BCryptCloseAlgorithmProvider(sigHandle, 0);
+ return NULL;
+ }
+
+ DWORD dummy = 0;
+ DWORD hash_len = 0;
+ if (NT_FAILURE(status = BCryptGetProperty(hashHandle, BCRYPT_HASH_LENGTH, (PBYTE)&hash_len, sizeof(DWORD), &dummy, 0))) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptGetProperty(hash len)\n", status);
+ BCryptCloseAlgorithmProvider(sigHandle, 0);
+ BCryptCloseAlgorithmProvider(hashHandle, 0);
+ return NULL;
+ }
+
+ PBYTE hash = calloc(hash_len, 1);
+
+ jint data_len = (*env)->GetArrayLength(env, data);
+ jbyte *data_bytes = (*env)->GetByteArrayElements(env, data, NULL);
+ native_timing_start();
+ status = BCryptHash(hashHandle, NULL, 0, data_bytes, data_len, hash, hash_len);
+ native_timing_pause();
+
+ if (NT_FAILURE(status)) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptHash\n", status);
+ BCryptCloseAlgorithmProvider(sigHandle, 0);
+ BCryptCloseAlgorithmProvider(hashHandle, 0);
+ free(hash);
+ (*env)->ReleaseByteArrayElements(env, data, data_bytes, JNI_ABORT);
+ return NULL;
+ }
+ (*env)->ReleaseByteArrayElements(env, data, data_bytes, JNI_ABORT);
+
+ BCRYPT_KEY_HANDLE skey = NULL;
+
+ jmethodID get_data = (*env)->GetMethodID(env, privkey_class, "getData", "()[B");
+ jbyteArray privkey_barray = (jbyteArray)(*env)->CallObjectMethod(env, privkey, get_data);
+
+ jint priv_length = (*env)->GetArrayLength(env, privkey_barray);
+ jbyte *priv_data = (*env)->GetByteArrayElements(env, privkey_barray, NULL);
+ if (NT_FAILURE(status = BCryptImportKeyPair(sigHandle, NULL, BCRYPT_ECCFULLPRIVATE_BLOB, &skey, priv_data, priv_length, 0))) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptImportKeyPair\n", status);
+ BCryptCloseAlgorithmProvider(sigHandle, 0);
+ BCryptCloseAlgorithmProvider(hashHandle, 0);
+ free(hash);
+ (*env)->ReleaseByteArrayElements(env, privkey_barray, priv_data, JNI_ABORT);
+ return NULL;
+ }
+ (*env)->ReleaseByteArrayElements(env, privkey_barray, priv_data, JNI_ABORT);
+
+ DWORD sig_len = 0;
+ native_timing_restart();
+ status = BCryptSignHash(skey, NULL, hash, hash_len, NULL, 0, &sig_len, 0);
+ native_timing_pause();
+
+ if (NT_FAILURE(status)) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptSignHash(len only)\n", status);
+ BCryptCloseAlgorithmProvider(sigHandle, 0);
+ BCryptCloseAlgorithmProvider(hashHandle, 0);
+ free(hash);
+ return NULL;
+ }
+
+ PBYTE sig_buf = calloc(sig_len, 1);
+
+ native_timing_restart();
+ status = BCryptSignHash(skey, NULL, hash, hash_len, sig_buf, sig_len, &sig_len, 0);
+ native_timing_stop();
+
+ if (NT_FAILURE(status)) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptSignHash(do)\n", status);
+ BCryptCloseAlgorithmProvider(sigHandle, 0);
+ BCryptCloseAlgorithmProvider(hashHandle, 0);
+ free(hash);
+ free(sig_buf);
+ return NULL;
+ }
+
+ DWORD half_len = sig_len / 2;
+ jobject sig = asn1_der_encode(env, sig_buf, half_len, sig_buf + half_len, half_len);
+
+ free(hash);
+ free(sig_buf);
+ BCryptDestroyKey(skey);
+ BCryptCloseAlgorithmProvider(hashHandle, 0);
+ BCryptCloseAlgorithmProvider(sigHandle, 0);
+
+ return sig;
+}
+
+JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Mscng_verify(JNIEnv *env, jobject self,
+ jbyteArray sig, jbyteArray data,
+ jobject pubkey, jobject params) {
+ NTSTATUS status;
+ LPCWSTR hash_algo = get_sighash_algo(env, self);
+
+ BCRYPT_ALG_HANDLE sigHandle = NULL;
+
+ jint keyflag = get_keyflag(env, pubkey);
+ if (keyflag == KEYFLAG_OTHER) { // TODO: This is not necessary
+ throw_new(env, "java/security/InvalidAlgorithmParameterException", "Cannot import non-native public key.");
+ return JNI_FALSE;
+ }
+ jbyteArray meta = get_meta(env, pubkey);
+
+ if (NT_FAILURE(status = init_use_algo(env, &sigHandle, BCRYPT_ECDSA_ALGORITHM, keyflag, meta, params))) {
+ return JNI_FALSE;
+ }
+
+ BCRYPT_ALG_HANDLE hashHandle = NULL;
+
+ if (NT_FAILURE(status = BCryptOpenAlgorithmProvider(&hashHandle, hash_algo, NULL, 0))) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptOpenAlgorithmProvider\n", status);
+ BCryptCloseAlgorithmProvider(sigHandle, 0);
+ return JNI_FALSE;
+ }
+
+ DWORD dummy = 0;
+ DWORD hash_len = 0;
+ if (NT_FAILURE(status = BCryptGetProperty(hashHandle, BCRYPT_HASH_LENGTH, (PBYTE)&hash_len, sizeof(DWORD), &dummy, 0))) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptGetProperty(hash len)\n", status);
+ BCryptCloseAlgorithmProvider(sigHandle, 0);
+ BCryptCloseAlgorithmProvider(hashHandle, 0);
+ return JNI_FALSE;
+ }
+
+ PBYTE hash = calloc(hash_len, 1);
+
+ jint data_len = (*env)->GetArrayLength(env, data);
+ jbyte *data_bytes = (*env)->GetByteArrayElements(env, data, NULL);
+ native_timing_start();
+ status = BCryptHash(hashHandle, NULL, 0, data_bytes, data_len, hash, hash_len);
+ native_timing_pause();
+
+ if (NT_FAILURE(status)) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptHash\n", status);
+ BCryptCloseAlgorithmProvider(sigHandle, 0);
+ BCryptCloseAlgorithmProvider(hashHandle, 0);
+ free(hash);
+ (*env)->ReleaseByteArrayElements(env, data, data_bytes, JNI_ABORT);
+ return JNI_FALSE;
+ }
+ (*env)->ReleaseByteArrayElements(env, data, data_bytes, JNI_ABORT);
+
+ BCRYPT_KEY_HANDLE pkey = NULL;
+
+ jmethodID get_data = (*env)->GetMethodID(env, pubkey_class, "getData", "()[B");
+ jbyteArray pubkey_barray = (jbyteArray)(*env)->CallObjectMethod(env, pubkey, get_data);
+
+ jint pub_length = (*env)->GetArrayLength(env, pubkey_barray);
+ jbyte *pub_data = (*env)->GetByteArrayElements(env, pubkey_barray, NULL);
+ if (NT_FAILURE(status = BCryptImportKeyPair(sigHandle, NULL, BCRYPT_ECCFULLPUBLIC_BLOB, &pkey, pub_data, pub_length, 0))) {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptImportKeyPair\n", status);
+ BCryptCloseAlgorithmProvider(sigHandle, 0);
+ BCryptCloseAlgorithmProvider(hashHandle, 0);
+ free(hash);
+ (*env)->ReleaseByteArrayElements(env, pubkey_barray, pub_data, JNI_ABORT);
+ return JNI_FALSE;
+ }
+ (*env)->ReleaseByteArrayElements(env, pubkey_barray, pub_data, JNI_ABORT);
+
+ jmethodID get_n = (*env)->GetMethodID(env, ec_parameter_spec_class, "getOrder", "()Ljava/math/BigInteger;");
+ jobject n = (*env)->CallObjectMethod(env, params, get_n);
+ jmethodID get_bitlength = (*env)->GetMethodID(env, biginteger_class, "bitLength", "()I");
+ jint ord_bits = (*env)->CallIntMethod(env, n, get_bitlength);
+ jint ord_bytes = (ord_bits + 7) / 8;
+
+ jint sig_len = (*env)->GetArrayLength(env, sig);
+ jbyte *sig_data = (*env)->GetByteArrayElements(env, sig, NULL);
+ jbyte *r;
+ size_t rlen;
+ jbyte *s;
+ size_t slen;
+ bool decode = asn1_der_decode(env, sig, &r, &rlen, &s, &slen);
+ (*env)->ReleaseByteArrayElements(env, sig, sig_data, JNI_ABORT);
+
+ if (!decode) {
+ throw_new(env, "java/security/GeneralSecurityException", "Error decoding sig.");
+ BCryptDestroyKey(pkey);
+ BCryptCloseAlgorithmProvider(sigHandle, 0);
+ BCryptCloseAlgorithmProvider(hashHandle, 0);
+ free(hash);
+ return JNI_FALSE;
+ }
+
+ jbyte *r_cpy = r;
+ jbyte *s_cpy = s;
+ if (rlen > ord_bytes) {
+ r_cpy += ord_bytes - rlen;
+ }
+ if (slen > ord_bytes) {
+ s_cpy += ord_bytes - slen;
+ }
+ if (rlen < ord_bytes) {
+ r_cpy = _alloca(ord_bytes);
+ memset(r_cpy, 0, ord_bytes);
+ memcpy(r_cpy, r + (ord_bytes - rlen), ord_bytes);
+ }
+ if (slen < ord_bytes) {
+ s_cpy = _alloca(ord_bytes);
+ memset(s_cpy, 0, ord_bytes);
+ memcpy(s_cpy, s + (ord_bytes - slen), ord_bytes);
+ }
+ rlen = ord_bytes;
+ slen = ord_bytes;
+
+ UCHAR *sig_full = calloc(rlen + slen, 1);
+ memcpy(sig_full, r_cpy, rlen);
+ memcpy(sig_full + rlen, s_cpy, slen);
+ free(r);
+ free(s);
+
+ native_timing_restart();
+ NTSTATUS result = BCryptVerifySignature(pkey, NULL, hash, hash_len, sig_full, rlen + slen, 0);
+ native_timing_stop();
+
+ free(hash);
+ free(sig_full);
+ BCryptDestroyKey(pkey);
+ BCryptCloseAlgorithmProvider(hashHandle, 0);
+ BCryptCloseAlgorithmProvider(sigHandle, 0);
+
+ if (result == STATUS_SUCCESS) {
+ return JNI_TRUE;
+ } else if (result == STATUS_INVALID_SIGNATURE) {
+ return JNI_FALSE;
+ } else {
+ throw_new_var(env, "java/security/GeneralSecurityException", "Error 0x%x returned by BCryptVerifySignature\n", status);
+ return JNI_FALSE;
+ }
} \ No newline at end of file
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/native.h b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/native.h
index 8f5b521..dcaf57c 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/native.h
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/native.h
@@ -1680,187 +1680,6 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSigna
}
#endif
#endif
-/* Header for class cz_crcs_ectester_standalone_libs_MatrixsslLib */
-
-#ifndef _Included_cz_crcs_ectester_standalone_libs_MatrixsslLib
-#define _Included_cz_crcs_ectester_standalone_libs_MatrixsslLib
-#ifdef __cplusplus
-extern "C" {
-#endif
-/*
- * Class: cz_crcs_ectester_standalone_libs_MatrixsslLib
- * Method: createProvider
- * Signature: ()Ljava/security/Provider;
- */
-JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MatrixsslLib_createProvider
- (JNIEnv *, jobject);
-
-/*
- * Class: cz_crcs_ectester_standalone_libs_MatrixsslLib
- * Method: getCurves
- * Signature: ()Ljava/util/Set;
- */
-JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_MatrixsslLib_getCurves
- (JNIEnv *, jobject);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
-/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl */
-
-#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl
-#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl
-#ifdef __cplusplus
-extern "C" {
-#endif
-#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_serialVersionUID
-#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_serialVersionUID 1421746759512286392LL
-#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_MAX_ARRAY_SIZE
-#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_MAX_ARRAY_SIZE 2147483639L
-#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_KEYS
-#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_KEYS 0L
-#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_VALUES
-#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_VALUES 1L
-#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_ENTRIES
-#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_ENTRIES 2L
-#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_serialVersionUID
-#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_serialVersionUID 4112578634029874840LL
-#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_serialVersionUID
-#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl_serialVersionUID -4298000515446427739LL
-/*
- * Class: cz_crcs_ectester_standalone_libs_jni_NativeProvider_Matrixssl
- * Method: setup
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Matrixssl_setup
- (JNIEnv *, jobject);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
-/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Matrixssl */
-
-#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Matrixssl
-#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Matrixssl
-#ifdef __cplusplus
-extern "C" {
-#endif
-#undef cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Matrixssl_DEFAULT_KEYSIZE
-#define cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Matrixssl_DEFAULT_KEYSIZE 256L
-/*
- * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Matrixssl
- * Method: keysizeSupported
- * Signature: (I)Z
- */
-JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Matrixssl_keysizeSupported
- (JNIEnv *, jobject, jint);
-
-/*
- * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Matrixssl
- * Method: paramsSupported
- * Signature: (Ljava/security/spec/AlgorithmParameterSpec;)Z
- */
-JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Matrixssl_paramsSupported
- (JNIEnv *, jobject, jobject);
-
-/*
- * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Matrixssl
- * Method: generate
- * Signature: (ILjava/security/SecureRandom;)Ljava/security/KeyPair;
- */
-JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Matrixssl_generate__ILjava_security_SecureRandom_2
- (JNIEnv *, jobject, jint, jobject);
-
-/*
- * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Matrixssl
- * Method: generate
- * Signature: (Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)Ljava/security/KeyPair;
- */
-JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Matrixssl_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2
- (JNIEnv *, jobject, jobject, jobject);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
-/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Matrixssl */
-
-#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Matrixssl
-#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPublicKey_Matrixssl
-#ifdef __cplusplus
-extern "C" {
-#endif
-#ifdef __cplusplus
-}
-#endif
-#endif
-/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Matrixssl */
-
-#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Matrixssl
-#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeECPrivateKey_Matrixssl
-#ifdef __cplusplus
-extern "C" {
-#endif
-#ifdef __cplusplus
-}
-#endif
-#endif
-/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Matrixssl */
-
-#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Matrixssl
-#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Matrixssl
-#ifdef __cplusplus
-extern "C" {
-#endif
-/*
- * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Matrixssl
- * Method: generateSecret
- * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B
- */
-JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Matrixssl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2
- (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject);
-
-/*
- * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Matrixssl
- * Method: generateSecret
- * Signature: ([B[BLjava/security/spec/ECParameterSpec;Ljava/lang/String;)Ljavax/crypto/SecretKey;
- */
-JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Matrixssl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2
- (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject, jstring);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
-/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Matrixssl */
-
-#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Matrixssl
-#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Matrixssl
-#ifdef __cplusplus
-extern "C" {
-#endif
-/*
- * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Matrixssl
- * Method: sign
- * Signature: ([B[BLjava/security/spec/ECParameterSpec;)[B
- */
-JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Matrixssl_sign
- (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject);
-
-/*
- * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Matrixssl
- * Method: verify
- * Signature: ([B[B[BLjava/security/spec/ECParameterSpec;)Z
- */
-JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Matrixssl_verify
- (JNIEnv *, jobject, jbyteArray, jbyteArray, jbyteArray, jobject);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
/* Header for class cz_crcs_ectester_standalone_libs_LibresslLib */
#ifndef _Included_cz_crcs_ectester_standalone_libs_LibresslLib
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/nettle.c b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/nettle.c
index e8d874a..dfc8389 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/nettle.c
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/nettle.c
@@ -1,3 +1,6 @@
+#include "c_utils.h"
+#include "c_timing.h"
+
#include "native.h"
#include <string.h>
@@ -11,8 +14,6 @@
#include <fcntl.h>
#include <unistd.h>
-#include "c_utils.h"
-#include "c_timing.h"
static struct yarrow256_ctx yarrow;
@@ -75,27 +76,43 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPa
return JNI_FALSE;
}
-static const struct ecc_curve* create_curve(JNIEnv *env, const char* curve_name) {
- const struct ecc_curve* curve = NULL;
- if (curve_name) {
- if (strcasecmp("secp192r1", curve_name) == 0) {
- curve = nettle_get_secp_192r1();
- }
- if (strcasecmp("secp224r1", curve_name) == 0) {
- curve = nettle_get_secp_224r1();
- }
- if (strcasecmp("secp256r1", curve_name) == 0) {
- curve = nettle_get_secp_256r1();
- }
- if (strcasecmp("secp384r1", curve_name) == 0) {
- curve = nettle_get_secp_384r1();
- }
- if (strcasecmp("secp521r1", curve_name) == 0) {
- curve = nettle_get_secp_521r1();
- }
- return curve;
- }
- return NULL;
+static const struct ecc_curve* create_curve_from_name(JNIEnv *env, const char* curve_name) {
+ if (!curve_name) {
+ return NULL;
+ }
+ if (strcasecmp("secp192r1", curve_name) == 0) {
+ return nettle_get_secp_192r1();
+ }
+ if (strcasecmp("secp224r1", curve_name) == 0) {
+ return nettle_get_secp_224r1();
+ }
+ if (strcasecmp("secp256r1", curve_name) == 0) {
+ return nettle_get_secp_256r1();
+ }
+ if (strcasecmp("secp384r1", curve_name) == 0) {
+ return nettle_get_secp_384r1();
+ }
+ if (strcasecmp("secp521r1", curve_name) == 0) {
+ return nettle_get_secp_521r1();
+ }
+ return NULL;
+}
+
+static const struct ecc_curve* create_curve_from_size(JNIEnv *env, jint keysize) {
+ switch (keysize) {
+ case 192:
+ return nettle_get_secp_192r1();
+ case 224:
+ return nettle_get_secp_224r1();
+ case 256:
+ return nettle_get_secp_256r1();
+ case 384:
+ return nettle_get_secp_384r1();
+ case 521:
+ return nettle_get_secp_521r1();
+ default:
+ return NULL;
+ }
}
JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Nettle_paramsSupported(JNIEnv *env, jobject self, jobject params){
@@ -153,7 +170,6 @@ static jobject generate_from_curve(JNIEnv *env, const struct ecc_curve* curve, j
mpz_export((unsigned char*) key_priv + diff, &size, 1, sizeof(unsigned char), 0, 0, private_value);
(*env)->ReleaseByteArrayElements(env, priv_bytes, key_priv, 0);
-
unsigned long key_len = 2*byte_size + 1;
jbyteArray pub_bytes = (*env)->NewByteArray(env, key_len);
mpz_t pub_value_x;
@@ -175,7 +191,6 @@ static jobject generate_from_curve(JNIEnv *env, const struct ecc_curve* curve, j
mpz_export((unsigned char*) key_pub + 1 + byte_size + diff, &yLen, 1, sizeof(unsigned char), 0, 0, pub_value_y);
(*env)->ReleaseByteArrayElements(env, pub_bytes, key_pub, 0);
-
jobject ec_pub_param_spec = (*env)->NewLocalRef(env, spec);
jmethodID ec_pub_init = (*env)->GetMethodID(env, pubkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V");
jobject pubkey = (*env)->NewObject(env, pubkey_class, ec_pub_init, pub_bytes, ec_pub_param_spec);
@@ -189,39 +204,41 @@ static jobject generate_from_curve(JNIEnv *env, const struct ecc_curve* curve, j
ecc_point_clear(&pub);
ecc_scalar_clear(&priv);
return (*env)->NewObject(env, keypair_class, keypair_init, pubkey, privkey);
-
-
}
JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Nettle_generate__ILjava_security_SecureRandom_2(JNIEnv *env, jobject self, jint keysize, jobject random) {
- throw_new(env, "java/lang/UnsupportedOperationException", "Not supported.");
+ const struct ecc_curve* curve = create_curve_from_size(env, keysize);
+ if (!curve) {
+ throw_new(env, "java/lang/UnsupportedOperationException", "Not supported.");
+ return NULL;
+ }
+ int byte_size = (keysize + 7) / 8;
+ jobject result = generate_from_curve(env, curve, NULL, byte_size);
+ return result;
return NULL;
}
-
-
JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Nettle_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2Ljava_security_spec_AlgorithmParameterSpec_2(JNIEnv *env, jobject self, jobject params, jobject random, jobject spec) {
-
if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) {
return NULL;
} else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) {
jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
jstring name = (*env)->CallObjectMethod(env, params, get_name);
const char* utf_name = (*env)->GetStringUTFChars(env, name, NULL);
- const struct ecc_curve* curve;
+ const struct ecc_curve* curve = NULL;
int byte_size;
char *curve_name[5] = {"secp192r1", "secp224r1", "secp256r1", "secp384r1", "secp521r1"};
int byte_sizes[] = {24, 28, 32, 48, 66};
for (int i = 0; i < sizeof(curve_name); i++) {
if (strcasecmp(utf_name, curve_name[i]) == 0) {
- curve = create_curve(env, curve_name[i]);
+ curve = create_curve_from_name(env, curve_name[i]);
byte_size = byte_sizes[i];
break;
}
}
(*env)->ReleaseStringUTFChars(env, name, utf_name);
if (!curve) {
- throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve for given bitsize not found.");
+ throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve with given name not found.");
return NULL;
}
jobject result = generate_from_curve(env, curve, spec, byte_size);
@@ -263,13 +280,13 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKey
jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
jstring name = (*env)->CallObjectMethod(env, params, get_name);
const char* utf_name = (*env)->GetStringUTFChars(env, name, NULL);
- const struct ecc_curve* curve;
+ const struct ecc_curve* curve = NULL;
char *curve_name[5] = {"secp192r1", "secp224r1", "secp256r1", "secp384r1", "secp521r1"};
int byte_sizes[] = {24, 28, 32, 48, 66};
int byte_size;
for (int i = 0; i < sizeof(curve_name); i++) {
if (strcasecmp(utf_name, curve_name[i]) == 0) {
- curve = create_curve(env, curve_name[i]);
+ curve = create_curve_from_name(env, curve_name[i]);
byte_size = byte_sizes[i];
break;
}
@@ -412,20 +429,19 @@ int der_to_signature(struct dsa_signature* signature, unsigned char* der) {
size_t sLength = der[index++];
mpz_import(signature->s, sLength, 1, sizeof(unsigned char), 0, 0, der + index);
return 1;
-
}
JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Nettle_sign(JNIEnv *env, jobject self, jbyteArray data, jbyteArray privkey, jobject params) {
jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
jstring name = (*env)->CallObjectMethod(env, params, get_name);
const char* utf_name = (*env)->GetStringUTFChars(env, name, NULL);
- const struct ecc_curve* curve;
+ const struct ecc_curve* curve = NULL;
int byte_size;
char *curve_name[5] = {"secp192r1", "secp224r1", "secp256r1", "secp384r1", "secp521r1"};
int byte_sizes[] = {24, 28, 32, 48, 66};
for (int i = 0; i < sizeof(curve_name); i++) {
if (strcasecmp(utf_name, curve_name[i]) == 0) {
- curve = create_curve(env, curve_name[i]);
+ curve = create_curve_from_name(env, curve_name[i]);
byte_size = byte_sizes[i] + 1;
break;
}
@@ -451,7 +467,6 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSig
(*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT);
-
jsize sig_len = signature_to_der(&signature, NULL, byte_size);
jbyteArray result = (*env)->NewByteArray(env, sig_len);
jbyte *result_data = (*env)->GetByteArrayElements(env, result, NULL);
@@ -467,11 +482,11 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSigna
jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
jstring name = (*env)->CallObjectMethod(env, params, get_name);
const char* utf_name = (*env)->GetStringUTFChars(env, name, NULL);
- const struct ecc_curve* curve;
+ const struct ecc_curve* curve = NULL;
char *curve_name[5] = {"secp192r1", "secp224r1", "secp256r1", "secp384r1", "secp521r1"};
for (int i = 0; i < sizeof(curve_name); i++) {
if (strcasecmp(utf_name, curve_name[i]) == 0) {
- curve = create_curve(env, curve_name[i]);
+ curve = create_curve_from_name(env, curve_name[i]);
break;
}
}
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/openssl.c b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/openssl.c
index 1739420..3fa560e 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/openssl.c
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/openssl.c
@@ -1,3 +1,6 @@
+#include "c_utils.h"
+#include "c_timing.h"
+
#include "native.h"
#include <string.h>
@@ -11,9 +14,6 @@
#include <openssl/ec.h>
#include <openssl/ecdsa.h>
-#include "c_utils.h"
-#include "c_timing.h"
-
static jclass provider_class;
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/tomcrypt.c b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/tomcrypt.c
index 82592f1..efaa3b9 100644
--- a/src/cz/crcs/ectester/standalone/libs/jni/tomcrypt.c
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/tomcrypt.c
@@ -1,9 +1,10 @@
+#include "c_utils.h"
+#include "c_timing.h"
+
#include "native.h"
#include <stdio.h>
#include <string.h>
#include <tomcrypt.h>
-#include "c_utils.h"
-#include "c_timing.h"
static prng_state ltc_prng;
static jclass provider_class;
@@ -176,6 +177,10 @@ static ltc_ecc_set_type* create_curve(JNIEnv *env, jobject params) {
jmethodID get_field = (*env)->GetMethodID(env, elliptic_curve_class, "getField", "()Ljava/security/spec/ECField;");
jobject field = (*env)->CallObjectMethod(env, elliptic_curve, get_field);
+ if (!(*env)->IsInstanceOf(env, field, fp_field_class)) {
+ return NULL;
+ }
+
jmethodID get_bits = (*env)->GetMethodID(env, fp_field_class, "getFieldSize", "()I");
jint bits = (*env)->CallIntMethod(env, field, get_bits);
jint bytes = (bits + 7) / 8;
@@ -284,6 +289,10 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPai
JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024TomCrypt_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2(JNIEnv *env, jobject this, jobject params, jobject random){
if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) {
ltc_ecc_set_type *curve = create_curve(env, params);
+ if (!curve) {
+ throw_new(env, "java/lang/UnsupportedOperationException", "Not supported.");
+ return NULL;
+ }
jobject result = generate_from_curve(env, curve);
free_curve(curve);
return result;
@@ -352,6 +361,10 @@ static jboolean pubkey_from_bytes(JNIEnv *env, jbyteArray pubkey, const ltc_ecc_
JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024TomCrypt_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2(JNIEnv *env, jobject this, jbyteArray pubkey, jbyteArray privkey, jobject params){
ltc_ecc_set_type *curve = create_curve(env, params);
+ if (!curve) {
+ throw_new(env, "java/lang/UnsupportedOperationException", "Not supported.");
+ return NULL;
+ }
ecc_key pub;
if (!pubkey_from_bytes(env, pubkey, curve, &pub)) {
@@ -395,6 +408,10 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgr
JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024TomCryptRaw_sign(JNIEnv *env, jobject this, jbyteArray data, jbyteArray privkey, jobject params) {
ltc_ecc_set_type *curve = create_curve(env, params);
+ if (!curve) {
+ throw_new(env, "java/lang/UnsupportedOperationException", "Not supported.");
+ return NULL;
+ }
ecc_key priv;
if (!privkey_from_bytes(env, privkey, curve, &priv)) {
@@ -432,6 +449,10 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSig
JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024TomCryptRaw_verify(JNIEnv *env, jobject this, jbyteArray signature, jbyteArray data, jbyteArray pubkey, jobject params) {
ltc_ecc_set_type *curve = create_curve(env, params);
+ if (!curve) {
+ throw_new(env, "java/lang/UnsupportedOperationException", "Not supported.");
+ return JNI_FALSE;
+ }
ecc_key pub;
if (!pubkey_from_bytes(env, pubkey, curve, &pub)) {
diff --git a/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java b/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java
new file mode 100644
index 0000000..7ff2826
--- /dev/null
+++ b/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java
@@ -0,0 +1,360 @@
+package cz.crcs.ectester.standalone;
+
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.Timeout;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.junitpioneer.jupiter.StdIo;
+import org.junitpioneer.jupiter.StdOut;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.PrintStream;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.stream.Stream;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assumptions.assumeFalse;
+
+public class AppTests {
+
+ @Test
+ @StdIo()
+ public void help(StdOut out) {
+ ECTesterStandalone.main(new String[]{"-h"});
+ String s = out.capturedString();
+ assertTrue(s.contains("ECTesterStandalone"));
+ }
+
+ @Test
+ @StdIo()
+ public void listLibraries(StdOut out) {
+ ECTesterStandalone.main(new String[]{"list-libs"});
+ String s = out.capturedString();
+ assertTrue(s.contains("BouncyCastle"));
+ }
+
+ @Test
+ @StdIo()
+ public void listData(StdOut out) {
+ ECTesterStandalone.main(new String[]{"list-data"});
+ String s = out.capturedString();
+ assertTrue(s.contains("secg"));
+ }
+
+ @Test
+ @StdIo()
+ public void listSuites(StdOut out) {
+ ECTesterStandalone.main(new String[]{"list-suites"});
+ String s = out.capturedString();
+ assertTrue(s.contains("default test suite"));
+ }
+
+ @Test
+ @StdIo()
+ public void listIdents(StdOut out) {
+ ECTesterStandalone.main(new String[]{"list-types"});
+ String s = out.capturedString();
+ assertTrue(s.contains("NONEwithECDSA"));
+ }
+
+ static Stream<String> libs() {
+ return Stream.of("BoringSSL", "Botan", "BouncyCastle", "Crypto++", "IPPCP", "LibreSSL", "libgcrypt", "mbedTLS", "Nettle", "OpenSSL", "SunEC", "tomcrypt", "wolfCrypt");
+ }
+
+ String[] buildCLIArgs(String libName, String suite, String... additional) {
+ String resultPath = System.getenv("RESULT_PATH");
+ List<String> args = new LinkedList<>();
+ args.add("test");
+ if (resultPath != null) {
+ File resultDir = new File(resultPath);
+ if (resultDir.exists() || resultDir.mkdirs()) {
+ args.add("-o");
+ args.add(String.format("text:%s/%s_%s.txt", resultPath, suite, libName));
+ args.add("-o");
+ args.add(String.format("yaml:%s/%s_%s.yml", resultPath, suite, libName));
+ args.add("-o");
+ args.add(String.format("xml:%s/%s_%s.xml", resultPath, suite, libName));
+ }
+ }
+ Collections.addAll(args, additional);
+ args.add(suite);
+ args.add(libName);
+ return args.toArray(new String[]{});
+ }
+
+ @SuppressWarnings("JUnitMalformedDeclaration")
+ @ParameterizedTest
+ @MethodSource("libs")
+ @StdIo()
+ public void defaultSuite(String libName, StdOut out) {
+ // TODO: "Nettle" is very broken here for a weird reason.
+ assumeFalse(libName.equals("Nettle"));
+
+ String[] args = buildCLIArgs(libName, "default");
+ if (libName.equals("Botan") || libName.equals("Crypto++")) {
+ args = buildCLIArgs(libName, "default", "--kpg-type", "ECDH");
+ }
+ ECTesterStandalone.main(args);
+ String sout = out.capturedString();
+ if (sout.contains("Exception")) {
+ System.err.printf("%s: Default suite has exceptions.%n", libName);
+ }
+ }
+
+ @SuppressWarnings("JUnitMalformedDeclaration")
+ @ParameterizedTest
+ @MethodSource("libs")
+ @StdIo()
+ public void testVectorSuite(String libName, StdOut out) {
+ String[] args = buildCLIArgs(libName, "test-vectors");
+ if (libName.equals("Botan") || libName.equals("Crypto++")) {
+ args = buildCLIArgs(libName, "test-vectors", "--kpg-type", "ECDH");
+ }
+ ECTesterStandalone.main(args);
+ String sout = out.capturedString();
+ if (sout.contains("Exception")) {
+ System.err.printf("%s: Test vector suite has exceptions.%n", libName);
+ }
+ }
+
+ @ParameterizedTest
+ @MethodSource("libs")
+ public void performanceSuite(String libName) {
+ // TODO: "Nettle" is very broken here for a weird reason.
+ assumeFalse(libName.equals("Nettle"));
+
+ String[] args = buildCLIArgs(libName, "performance");
+ if (libName.equals("Botan") || libName.equals("Crypto++")) {
+ args = buildCLIArgs(libName, "performance", "--kpg-type", "ECDH");
+ }
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ PrintStream ps = new PrintStream(baos);
+ System.setOut(ps);
+ ECTesterStandalone.main(args);
+ String sout = baos.toString();
+ if (sout.contains("Exception")) {
+ System.err.printf("%s: Performance suite has exceptions.%n", libName);
+ }
+ }
+
+ @ParameterizedTest
+ @MethodSource("libs")
+ public void signatureSuite(String libName) {
+ String[] args = buildCLIArgs(libName, "signature", "-q");
+ switch (libName) {
+ case "Nettle":
+ case "libgcrypt":
+ case "BoringSSL":
+ case "OpenSSL":
+ case "tomcrypt":
+ case "LibreSSL":
+ case "IPPCP":
+ case "mbedTLS":
+ args = buildCLIArgs(libName, "signature", "-st", "NONEwithECDSA", "-q");
+ break;
+ }
+ ECTesterStandalone.main(args);
+ }
+
+ @ParameterizedTest
+ @MethodSource("libs")
+ @Timeout(20)
+ public void miscSuite(String libName) {
+ String[] args = buildCLIArgs(libName, "miscellaneous", "-q");
+ if (libName.equals("Botan") || libName.equals("Crypto++")) {
+ args = buildCLIArgs(libName, "miscellaneous", "--kpg-type", "ECDH", "-q");
+ }
+ ECTesterStandalone.main(args);
+ }
+
+ @ParameterizedTest
+ @MethodSource("libs")
+ @Timeout(20)
+ public void twistSuite(String libName) {
+ // TODO: "Nettle" is very broken here for a weird reason.
+ assumeFalse(libName.equals("Nettle"));
+
+ String[] args = buildCLIArgs(libName, "twist", "-q");
+ if (libName.equals("Botan") || libName.equals("Crypto++")) {
+ args = buildCLIArgs(libName, "twist", "--kpg-type", "ECDH", "-q");
+ }
+ ECTesterStandalone.main(args);
+ }
+
+ @ParameterizedTest
+ @MethodSource("libs")
+ @Timeout(20)
+ public void degenerateSuite(String libName) {
+ // TODO: "Nettle" is very broken here for a weird reason.
+ assumeFalse(libName.equals("Nettle"));
+
+ String[] args = buildCLIArgs(libName, "degenerate", "-q");
+ if (libName.equals("Botan") || libName.equals("Crypto++")) {
+ args = buildCLIArgs(libName, "degenerate", "--kpg-type", "ECDH", "-q");
+ }
+ ECTesterStandalone.main(args);
+ }
+
+ @ParameterizedTest
+ @MethodSource("libs")
+ @Timeout(20)
+ public void edgeCasesSuite(String libName) {
+ // TODO: Crypto++ and tomcrypt is broken here.
+ assumeFalse(libName.equals("Crypto++") || libName.equals("tomcrypt"));
+
+ String[] args = buildCLIArgs(libName, "edge-cases", "-q");
+ if (libName.equals("Botan") || libName.equals("Crypto++")) {
+ args = buildCLIArgs(libName, "edge-cases", "--kpg-type", "ECDH", "-q");
+ }
+ ECTesterStandalone.main(args);
+ }
+
+ @ParameterizedTest
+ @MethodSource("libs")
+ @Timeout(20)
+ // TODO: This breaks the tests because the libs do all sorts of weird stuff here.
+ @Disabled
+ public void compositeSuite(String libName) {
+ // TODO: "Crypto++" and IPPCP cycles indefinitely here.
+ assumeFalse(libName.equals("Crypto++") || libName.equals("IPPCP") || libName.equals("OpenSSL"));
+
+ String[] args = buildCLIArgs(libName, "composite", "-q");
+ if (libName.equals("Botan") || libName.equals("Crypto++")) {
+ args = buildCLIArgs(libName, "composite", "--kpg-type", "ECDH", "-q");
+ }
+ ECTesterStandalone.main(args);
+ }
+
+ @ParameterizedTest
+ @MethodSource("libs")
+ @Timeout(20)
+ public void cofactorSuite(String libName) {
+ String[] args = buildCLIArgs(libName, "cofactor", "-q");
+ if (libName.equals("Botan") || libName.equals("Crypto++")) {
+ args = buildCLIArgs(libName, "cofactor", "--kpg-type", "ECDH", "-q");
+ }
+ ECTesterStandalone.main(args);
+ }
+
+ @ParameterizedTest
+ @MethodSource("libs")
+ @Timeout(20)
+ // TODO: This breaks the tests because the libs do all sorts of weird stuff here.
+ @Disabled
+ public void wrongSuite(String libName) {
+ // TODO: "BouncyCastle" and Crypto++ cycles indefinitely here.
+ assumeFalse(libName.equals("BouncyCastle") || libName.equals("Crypto++") || libName.equals("IPPCP") || libName.equals("wolfCrypt"));
+
+ String[] args = buildCLIArgs(libName, "wrong", "-q");
+ if (libName.equals("Botan") || libName.equals("Crypto++")) {
+ args = buildCLIArgs(libName, "wrong", "--kpg-type", "ECDH", "-q");
+ }
+ ECTesterStandalone.main(args);
+ }
+
+ @ParameterizedTest
+ @MethodSource("libs")
+ @Timeout(20)
+ public void invalidSuite(String libName) {
+ // TODO: "Nettle" is very broken here for a weird reason.
+ assumeFalse(libName.equals("Nettle"));
+
+ String[] args = buildCLIArgs(libName, "invalid", "-q");
+ if (libName.equals("Botan") || libName.equals("Crypto++")) {
+ args = buildCLIArgs(libName, "invalid", "--kpg-type", "ECDH", "-q");
+ }
+ ECTesterStandalone.main(args);
+ }
+
+ @SuppressWarnings("JUnitMalformedDeclaration")
+ @ParameterizedTest
+ @MethodSource("libs")
+ @StdIo()
+ public void generate(String libName, StdOut out) {
+ String[] args = new String[]{"generate", "-n", "10", "-nc", "secg/secp256r1", libName};
+ switch (libName) {
+ case "Botan":
+ case "Crypto++":
+ args = new String[]{"generate", "-n", "10", "-nc", "secg/secp256r1", "-t", "ECDH", libName};
+ break;
+ case "Nettle":
+ case "libgcrypt":
+ case "wolfCrypt":
+ args = new String[]{"generate", "-n", "10", "-cn", "secp256r1", libName};
+ break;
+ case "BoringSSL":
+ args = new String[]{"generate", "-n", "10", "-cn", "prime256v1", libName};
+ break;
+ }
+ ECTesterStandalone.main(args);
+ }
+
+ @SuppressWarnings("JUnitMalformedDeclaration")
+ @ParameterizedTest
+ @MethodSource("libs")
+ @StdIo()
+ public void ecdh(String libName, StdOut out) {
+ String[] args = new String[]{"ecdh", "-n", "10", "-nc", "secg/secp256r1", libName};
+ switch (libName) {
+ case "Nettle":
+ case "libgcrypt":
+ case "wolfCrypt":
+ args = new String[]{"ecdh", "-n", "10", "-cn", "secp256r1", libName};
+ break;
+ case "BoringSSL":
+ args = new String[]{"ecdh", "-n", "10", "-cn", "prime256v1", libName};
+ break;
+ }
+ ECTesterStandalone.main(args);
+ }
+
+ @SuppressWarnings("JUnitMalformedDeclaration")
+ @ParameterizedTest
+ @MethodSource("libs")
+ @StdIo()
+ public void ecdsa(String libName, StdOut out) {
+ String[] args = new String[]{"ecdsa", "-n", "10", "-nc", "secg/secp256r1", libName};
+ switch (libName) {
+ case "Nettle":
+ case "libgcrypt":
+ args = new String[]{"ecdsa", "-n", "10", "-cn", "secp256r1", "-t", "NONEwithECDSA", libName};
+ break;
+ case "BoringSSL":
+ args = new String[]{"ecdsa", "-n", "10", "-cn", "prime256v1", "-t", "NONEwithECDSA", libName};
+ break;
+ case "OpenSSL":
+ case "tomcrypt":
+ case "LibreSSL":
+ case "IPPCP":
+ case "mbedTLS":
+ args = new String[]{"ecdsa", "-n", "10", "-nc", "secg/secp256r1", "-t", "NONEwithECDSA", libName};
+ break;
+ case "wolfCrypt":
+ args = new String[]{"ecdsa", "-n", "10", "-cn", "secp256r1", libName};
+ break;
+ }
+ ECTesterStandalone.main(args);
+ }
+
+ @SuppressWarnings("JUnitMalformedDeclaration")
+ @ParameterizedTest
+ @MethodSource("libs")
+ @StdIo()
+ public void export(String libName, StdOut out) {
+ // TODO: wolfCrypt is weirdly broken here.
+ assumeFalse(libName.contains("wolfCrypt"));
+ String[] args = new String[]{"export", "-b", "256", libName};
+ switch (libName) {
+ case "Botan":
+ case "Crypto++":
+ args = new String[]{"export", "-b", "256", "-t", "ECDH", libName};
+ break;
+ }
+ ECTesterStandalone.main(args);
+ System.err.println(out.capturedString());
+ }
+}
diff --git a/standalone/src/test/java/cz/crcs/ectester/standalone/IdentTests.java b/standalone/src/test/java/cz/crcs/ectester/standalone/IdentTests.java
new file mode 100644
index 0000000..e6f520e
--- /dev/null
+++ b/standalone/src/test/java/cz/crcs/ectester/standalone/IdentTests.java
@@ -0,0 +1,49 @@
+package cz.crcs.ectester.standalone;
+
+import cz.crcs.ectester.standalone.consts.KeyAgreementIdent;
+import cz.crcs.ectester.standalone.consts.KeyPairGeneratorIdent;
+import cz.crcs.ectester.standalone.consts.SignatureIdent;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.junit.jupiter.api.Test;
+
+import javax.crypto.KeyAgreement;
+import java.security.KeyPairGenerator;
+import java.security.NoSuchAlgorithmException;
+import java.security.Provider;
+import java.security.Signature;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class IdentTests {
+
+ Provider bc = new BouncyCastleProvider();
+
+ @Test
+ void kaIdents() throws NoSuchAlgorithmException {
+ for (KeyAgreementIdent keyAgreementIdent : KeyAgreementIdent.list()) {
+ assertNotNull(keyAgreementIdent.getBaseAlgo());
+ }
+ KeyAgreementIdent ecdh = KeyAgreementIdent.get("ECDH");
+ assertNotNull(ecdh);
+ KeyAgreement instance = ecdh.getInstance(bc);
+ assertNotNull(instance);
+ }
+
+ @Test
+ void kpgIdents() throws NoSuchAlgorithmException {
+ assertFalse(KeyPairGeneratorIdent.list().isEmpty());
+ KeyPairGeneratorIdent kpg = KeyPairGeneratorIdent.get("ECDH");
+ assertNotNull(kpg);
+ KeyPairGenerator instance = kpg.getInstance(bc);
+ assertNotNull(instance);
+ }
+
+ @Test
+ void sigIdents() throws NoSuchAlgorithmException {
+ assertFalse(SignatureIdent.list().isEmpty());
+ SignatureIdent ecdsa = SignatureIdent.get("NONEwithECDSA");
+ assertNotNull(ecdsa);
+ Signature instance = ecdsa.getInstance(bc);
+ assertNotNull(instance);
+ }
+}
diff --git a/standalone/src/test/java/cz/crcs/ectester/standalone/LibTests.java b/standalone/src/test/java/cz/crcs/ectester/standalone/LibTests.java
new file mode 100644
index 0000000..48a5d89
--- /dev/null
+++ b/standalone/src/test/java/cz/crcs/ectester/standalone/LibTests.java
@@ -0,0 +1,53 @@
+package cz.crcs.ectester.standalone;
+import cz.crcs.ectester.standalone.libs.*;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.LinkedList;
+import java.util.List;
+
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public class LibTests {
+
+ ProviderECLibrary[] libs;
+
+ @BeforeAll
+ public void loadLibs() {
+ List<ProviderECLibrary> libObjects = new LinkedList<>();
+ Class<?>[] libClasses = new Class[]{SunECLib.class,
+ BouncyCastleLib.class,
+ TomcryptLib.class,
+ BotanLib.class,
+ CryptoppLib.class,
+ OpensslLib.class,
+ BoringsslLib.class,
+ GcryptLib.class,
+ MscngLib.class,
+ WolfCryptLib.class,
+ MbedTLSLib.class,
+ IppcpLib.class,
+ NettleLib.class,
+ LibresslLib.class};
+ for (Class<?> c : libClasses) {
+ try {
+ libObjects.add((ProviderECLibrary) c.getDeclaredConstructor().newInstance());
+ } catch (NoSuchMethodException | InstantiationException | IllegalAccessException |
+ InvocationTargetException ignored) {
+ }
+ }
+ libs = libObjects.toArray(new ProviderECLibrary[0]);
+ for (ProviderECLibrary lib : libs) {
+ lib.initialize();
+ }
+ }
+
+ @Test
+ public void loaded() {
+ for (ProviderECLibrary lib : libs) {
+ System.err.printf("%s: %b%n", lib.getClass().getSimpleName(), lib.isInitialized());
+ }
+
+ }
+}
diff --git a/standalone/src/test/java/cz/crcs/ectester/standalone/OutputTests.java b/standalone/src/test/java/cz/crcs/ectester/standalone/OutputTests.java
new file mode 100644
index 0000000..7247195
--- /dev/null
+++ b/standalone/src/test/java/cz/crcs/ectester/standalone/OutputTests.java
@@ -0,0 +1,21 @@
+package cz.crcs.ectester.standalone;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+import org.junitpioneer.jupiter.StdIo;
+import org.junitpioneer.jupiter.StdOut;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
+public class OutputTests {
+
+ @SuppressWarnings("JUnitMalformedDeclaration")
+ @ParameterizedTest
+ @ValueSource(strings = {"text", "xml", "yml"})
+ @StdIo()
+ public void formats(String format, StdOut out) {
+ ECTesterStandalone.main(new String[]{"test", "-f", format, "default", "SunEC"});
+ String s = out.capturedString();
+ assertFalse(s.isEmpty());
+ }
+}
diff --git a/util/run_all_suites.sh b/util/run_all_suites.sh
deleted file mode 100755
index c861efa..0000000
--- a/util/run_all_suites.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/bash
-#
-# ECTesterStandalone testing script,
-# runs all the suites on all the libraries
-#
-tempfolder=.temp_results
-cur=$PWD
-cd "$(dirname "${BASH_SOURCE[0]}")"/../dist
-run="$(which java) -jar ECTesterStandalone-dist.jar"
-suites=$($run list-suites | grep -P "^ -" | cut -c3-)
-cd $cur
-
-rm -rf $tempfolder
-mkdir $tempfolder
-while read -r suite; do
- echo "**Run $suite suite on all the libraries:"
- bash run_test_suite.sh $suite
- unzip results_$suite.zip -d $tempfolder
- rm results_$suite.zip
-done <<< "$suites"
-
-if [[ -f results_all.zip ]]; then
- echo '**Removing old archive...'
- rm -f results_all.zip
-fi
-echo '**Creating archive...'
-cd $tempfolder && zip -r ../results_all.zip . && cd ..
-rm -rf $tempfolder
-echo "**All tests finished! The results can be found in results_all.zip"
diff --git a/util/run_test_suite.sh b/util/run_test_suite.sh
deleted file mode 100755
index 67457c1..0000000
--- a/util/run_test_suite.sh
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/usr/bin/bash
-#
-# ECTesterStandalone testing script,
-# runs the specified suite on all installed libraries
-#
-suite=${1,,}
-extra_args="" #e.g., -kt ECDH -st ECDSA
-tempfolder="temp_results"
-cur=$PWD
-timeout=10
-
-cd "$(dirname "${BASH_SOURCE[0]}")"/../dist
-if [[ $# -eq 0 ]]; then
- echo 'No test suite specified.'
- exit 0
-fi
-if [[ ! -f ECTesterStandalone-dist.jar ]]; then
- echo 'ECTesterStandalone-dist.jar not found. Build ECTesterStandalone first.'
- exit 0
-fi
-
-rm -rf $tempfolder
-mkdir $tempfolder
-run="$(which java) -jar ECTesterStandalone-dist.jar"
-libs=$($run list-libs | grep -P "^\t-" | cut -d"-" -f 2 | cut -d"(" -f1)
-while read -r lib; do
- if [[ $lib == *"BoringSSL"* ]]; then
- lib=BoringSSL
- fi
- mkdir -p $tempfolder/${suite}/$"${lib// /_}"
- filename=$tempfolder/${suite}/$"${lib// /_}"/results.txt
-
- echo "Testing library: $lib..."
- #Botan and Crypto++ don't recognize default kgt type EC, specify kgt=ECDH instead.
- if [[ $lib == *"Botan"* ]] || [[ $lib == *"Crypto++"* ]]; then
- args="-gt ECDH"
- else
- args=""
- fi
-
- #Wrong suite can cause a freeze in some libraries. Try running the tests again with the -skip argument if it happens. Default timeout is 10s.
- if [[ $suite == "wrong" ]]; then
- timeout ${timeout}s $run test $args $extra_args $suite "$lib" > $filename 2>&1
- if [[ $? -eq 124 ]]; then
- echo "#" >> $filename
- echo "# NOTE: Tests timeouted at this point after taking longer than ${timeout}s. What follows next is a second run with -skip argument." >> $filename
- echo "#" >> $filename
- $run test $args $extra_args $suite -skip "$lib" >> $filename 2>&1
- fi
- #Composite suite can also cause a freeze, but this time there is no -skip argument.
- elif [[ $suite == "composite" ]]; then
- timeout ${timeout}s $run test $args $extra_args $suite "$lib" > $filename 2>&1
- if [[ $? -eq 124 ]]; then
- echo "#" >> $filename
- echo "# NOTE: Tests timeouted at this point after taking longer than ${timeout}s." >> $filename
- echo "#" >> $filename
- fi
- #Signature suite requires SHA1withECDSA signature type
- elif [[ $suite == "signature" ]]; then
- $run test $args $extra_args -st SHA1withECDSA $suite "$lib" > $filename 2>&1
- else
- $run test $args $extra_args $suite "$lib" > $filename 2>&1
- fi
-done <<< "$libs"
-
-#Comment out these two lines to keep java error logs. They are removed by default to prevent unnecessary cluttering of dist folder.
-echo 'Removing java error logs...'
-find . -type f -name 'hs_err_*' -exec rm {} \;
-
-if [[ -f $cur/results_$suite.zip ]]; then
- echo 'Removing old archive...'
- rm -f $cur/results_$suite.zip
-fi
-echo 'Creating archive...'
-cd $tempfolder
-zip -r $cur/results_$suite.zip .
-cd ..
-rm -rf $tempfolder
-
-echo "Finished. The results can be found in results_$suite.zip."
-exit 1
diff --git a/util/test.sh b/util/test.sh
deleted file mode 100755
index 41a16e0..0000000
--- a/util/test.sh
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/usr/bin/env bash
-#
-# ECTesterStandalone testing script,
-# tests to see everything is implemented correctly in the testing tool
-#
-cur=$PWD
-cd "$(dirname "${BASH_SOURCE[0]}")"/../dist
-
-trap int INT
-function int() {
- cd $cur
- exit 1
-}
-
-function do_test() {
- out=$($run "$@")
- ret=$?
- echo "$out" | tail -n1
- if [ "$ret" -ne "0" ]; then
- echo ">>>> ERROR '$@' => $ret"
- fi
-}
-
-run="$(which java) -jar ECTesterStandalone.jar"
-libs=$($run list-libs | grep -P "^\t-" | cut -d"-" -f 2 | cut -d"(" -f1)
-while read -r lib; do
- echo "** Testing library: $lib"
- support=$($run list-libs "$lib")
- kpgs=$(echo "$support" | grep KeyPairGenerators | cut -d":" -f2 | sed 's/,//g')
- kas=$(echo "$support" | grep KeyAgreements | cut -d":" -f2 | sed 's/,//g')
- sigs=$(echo "$support" | grep Signatures | cut -d":" -f2 | sed 's/,//g')
- for kpg in $kpgs; do
- echo "*** KPG: $kpg"
- do_test generate -t $kpg "$lib"
- done
- for ka in $kas; do
- echo "*** KA: $ka"
- do_test ecdh -t $ka "$lib"
- done
- for sig in $sigs; do
- echo "*** SIG: $sig"
- do_test ecdsa -t $sig "$lib"
- done
- echo -en "\n\n"
-done <<< "$libs"
-
-trap INT
-cd $cur \ No newline at end of file