From e8cd86bb309cf90ec5e2aa211a765d3da45590b4 Mon Sep 17 00:00:00 2001 From: J08nY Date: Mon, 25 Mar 2024 15:07:53 +0100 Subject: Add CI. --- .github/workflows/build.yml | 82 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 .github/workflows/build.yml (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..73ee885 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,82 @@ +name: Build + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +jobs: + build: + + runs-on: ubuntu-latest + permissions: + contents: read + + strategy: + matrix: + java: [ "8", "11", "17", "21" ] + env: + JAVA_VERSION: ${{ matrix.java }} + name: Build 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: Setup libraries + run: | + sudo apt update + sudo apt install libmbedtls-dev libtomcrypt-dev libtommath-dev libssl-dev libcrypto++-dev libgcrypt20-dev nettle-dev libbotan-2-dev nasm + + - name: Build applets + run: if [ $JAVA_VERSION != 21 ]; then ./gradlew applet:buildJavaCard; fi + + - name: Build reader + run: ./gradlew reader:uberJar + + - name: Build libs + run: | + cd ext/boringssl + cmake -DBUILD_SHARED_LIBS=1 -Bbuild + cd build + make -j4 crypto + cd ../../.. + cd ext/libressl + ./autogen.sh + cmake -DBUILD_SHARED_LIBS=ON -Bbuild + cd build + make -j4 crypto + cd ../../.. + cd ext/ipp-crypto + CC=clang CXX=clang++ cmake CMakeLists.txt -Bbuild -DARCH=intel64 + cd build + make -j4 + cd ../../.. + + - name: Build standalone + run: | + ./gradlew standalone:libs || true + ./gradlew standalone:uberJar + + # ffs: https://github.com/adoptium/adoptium-support/issues/485 !!! + - name: List libraries + run: env LD_LIBRARY_PATH="/usr/lib/x86_64-linux-gnu/" ./gradlew standalone:run --args="list-libs" + + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + with: + name: built-${{ matrix.java }} + path: | + applet/build/javacard/*.cap + reader/build/libs/ECTesterReader.jar + standalone/build/libs/ECTesterStandalone.jar \ No newline at end of file -- cgit v1.3.1 From acdb72df6ac1bc0abba1a3344d911bd12181d7e9 Mon Sep 17 00:00:00 2001 From: J08nY Date: Mon, 25 Mar 2024 18:36:16 +0100 Subject: Add first standalone unit test. --- .github/workflows/build.yml | 3 +++ standalone/build.gradle.kts | 8 ++++++++ .../crcs/ectester/standalone/consts/KeyAgreementIdent.java | 4 ++++ .../src/test/java/cz/crcs/ectester/reader/IdentTests.java | 14 ++++++++++++++ 4 files changed, 29 insertions(+) create mode 100644 standalone/src/test/java/cz/crcs/ectester/reader/IdentTests.java (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 73ee885..8be96d3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -72,6 +72,9 @@ jobs: - name: List libraries run: env LD_LIBRARY_PATH="/usr/lib/x86_64-linux-gnu/" ./gradlew standalone:run --args="list-libs" + - name: Test + run: ./gradlew test + - name: Upload build artifacts uses: actions/upload-artifact@v4 with: diff --git a/standalone/build.gradle.kts b/standalone/build.gradle.kts index e1113e9..68bfd13 100644 --- a/standalone/build.gradle.kts +++ b/standalone/build.gradle.kts @@ -11,6 +11,10 @@ repositories { dependencies { 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") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") } application { @@ -19,6 +23,10 @@ application { version = "0.3.3" } +tasks.named("test") { + useJUnitPlatform() +} + tasks.withType { if (JavaVersion.current() > JavaVersion.VERSION_1_8) { options.compilerArgs.addAll(arrayOf( diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/consts/KeyAgreementIdent.java b/standalone/src/main/java/cz/crcs/ectester/standalone/consts/KeyAgreementIdent.java index 9b912cb..60c60e8 100644 --- a/standalone/src/main/java/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/standalone/src/test/java/cz/crcs/ectester/reader/IdentTests.java b/standalone/src/test/java/cz/crcs/ectester/reader/IdentTests.java new file mode 100644 index 0000000..2940f1e --- /dev/null +++ b/standalone/src/test/java/cz/crcs/ectester/reader/IdentTests.java @@ -0,0 +1,14 @@ +package cz.crcs.ectester.reader; + +import cz.crcs.ectester.standalone.consts.KeyAgreementIdent; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +public class IdentTests { + @Test + void kaIdents() { + for (KeyAgreementIdent keyAgreementIdent : KeyAgreementIdent.list()) { + assertNotNull(keyAgreementIdent.getBaseAlgo()); + } + } +} -- cgit v1.3.1 From 591deaece718b7821385ff0069b44adac4e1baf3 Mon Sep 17 00:00:00 2001 From: J08nY Date: Mon, 25 Mar 2024 19:43:02 +0100 Subject: Cache library builds. --- .github/workflows/build.yml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8be96d3..eb4b902 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,7 +36,10 @@ jobs: - name: Setup libraries run: | sudo apt update - sudo apt install libmbedtls-dev libtomcrypt-dev libtommath-dev libssl-dev libcrypto++-dev libgcrypt20-dev nettle-dev libbotan-2-dev nasm + sudo apt install libmbedtls-dev 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' ')" >> $GITHUB_ENV + echo "LIBRESSL_VERSION=$(git submodule status ext/libressl | cut -f2 -d' ')" >> $GITHUB_ENV + echo "IPPCP_VERSION=$(git submodule status ext/ipp-crypto | cut -f2 -d' ')" >> $GITHUB_ENV - name: Build applets run: if [ $JAVA_VERSION != 21 ]; then ./gradlew applet:buildJavaCard; fi @@ -44,7 +47,18 @@ jobs: - name: Build reader run: ./gradlew reader:uberJar + - name: Cache libs + uses: actions/cache@v4 + id: cache-libs + with: + key: libs-${{ env.BORINGSSL_VERSION }}-${{ env.LIBRESSL_VERSION }}-${{ env.IPPCP_VERSION }} + path: | + ext/boringssl/build/crypto/libcrypto.so + ext/libressl/build/crypto/libcrypto.so + ext/ipp-crypto/build/.build/RELEASE/lib/libippcp.so + - name: Build libs + if: steps.cache-libs.outputs.cache-hit != 'true' run: | cd ext/boringssl cmake -DBUILD_SHARED_LIBS=1 -Bbuild -- cgit v1.3.1 From d30ddada4441acb651ced166ff668cfdb99ae8d1 Mon Sep 17 00:00:00 2001 From: J08nY Date: Wed, 27 Mar 2024 12:13:57 +0100 Subject: Add code coverage measurement. --- .github/workflows/build.yml | 5 ++++- standalone/build.gradle.kts | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index eb4b902..f92df79 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -96,4 +96,7 @@ jobs: path: | applet/build/javacard/*.cap reader/build/libs/ECTesterReader.jar - standalone/build/libs/ECTesterStandalone.jar \ No newline at end of file + standalone/build/libs/ECTesterStandalone.jar + + - name: Upload code coverage + uses: codecov/codecov-action@v4 diff --git a/standalone/build.gradle.kts b/standalone/build.gradle.kts index 68bfd13..095c4b4 100644 --- a/standalone/build.gradle.kts +++ b/standalone/build.gradle.kts @@ -1,6 +1,7 @@ plugins { application + jacoco id("com.google.osdetector") version "1.7.3" } @@ -27,6 +28,16 @@ tasks.named("test") { useJUnitPlatform() } +tasks.test { + finalizedBy(tasks.jacocoTestReport) // report is always generated after tests run +} + +tasks.jacocoTestReport { + reports { + xml.required = true + } +} + tasks.withType { if (JavaVersion.current() > JavaVersion.VERSION_1_8) { options.compilerArgs.addAll(arrayOf( -- cgit v1.3.1 From ccdeec2bfab550091dd17936770c0fff3d730049 Mon Sep 17 00:00:00 2001 From: J08nY Date: Wed, 27 Mar 2024 12:25:56 +0100 Subject: Fix codecov. --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f92df79..89e1bfc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -100,3 +100,6 @@ jobs: - name: Upload code coverage uses: codecov/codecov-action@v4 + with: + token: ${{ secrets.CODECOV_TOKEN }} + slug: crocs-muni/ECTester \ No newline at end of file -- cgit v1.3.1 From 042f82049d87e1ee600ec84114ed69d0743ea9d0 Mon Sep 17 00:00:00 2001 From: J08nY Date: Wed, 27 Mar 2024 14:24:15 +0100 Subject: Add more tests. --- .github/workflows/build.yml | 97 ++++++++++++++++++---- standalone/build.gradle.kts | 6 ++ .../java/cz/crcs/ectester/reader/IdentTests.java | 14 ---- .../java/cz/crcs/ectester/standalone/AppTests.java | 75 +++++++++++++++++ .../cz/crcs/ectester/standalone/IdentTests.java | 49 +++++++++++ .../java/cz/crcs/ectester/standalone/LibTests.java | 54 ++++++++++++ 6 files changed, 265 insertions(+), 30 deletions(-) delete mode 100644 standalone/src/test/java/cz/crcs/ectester/reader/IdentTests.java create mode 100644 standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java create mode 100644 standalone/src/test/java/cz/crcs/ectester/standalone/IdentTests.java create mode 100644 standalone/src/test/java/cz/crcs/ectester/standalone/LibTests.java (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 89e1bfc..8b7ca52 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,18 +7,92 @@ on: branches: [ "master" ] jobs: - build: - + applet: runs-on: ubuntu-latest permissions: contents: read strategy: matrix: - java: [ "8", "11", "17", "21" ] + java: [ "8", "11", "17"] env: JAVA_VERSION: ${{ matrix.java }} - name: Build Java ${{ 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 !!! + LD_LIBRARY_PATH: "/usr/lib/x86_64-linux-gnu/" + name: Build standalone on Java ${{ matrix.java }} steps: - uses: actions/checkout@v4 with: @@ -41,12 +115,6 @@ jobs: echo "LIBRESSL_VERSION=$(git submodule status ext/libressl | cut -f2 -d' ')" >> $GITHUB_ENV echo "IPPCP_VERSION=$(git submodule status ext/ipp-crypto | cut -f2 -d' ')" >> $GITHUB_ENV - - name: Build applets - run: if [ $JAVA_VERSION != 21 ]; then ./gradlew applet:buildJavaCard; fi - - - name: Build reader - run: ./gradlew reader:uberJar - - name: Cache libs uses: actions/cache@v4 id: cache-libs @@ -82,20 +150,17 @@ jobs: ./gradlew standalone:libs || true ./gradlew standalone:uberJar - # ffs: https://github.com/adoptium/adoptium-support/issues/485 !!! - name: List libraries - run: env LD_LIBRARY_PATH="/usr/lib/x86_64-linux-gnu/" ./gradlew standalone:run --args="list-libs" + run: ./gradlew standalone:run --args="list-libs" - name: Test - run: ./gradlew test + run: ./gradlew standalone:test - name: Upload build artifacts uses: actions/upload-artifact@v4 with: - name: built-${{ matrix.java }} + name: built-standalone-${{ matrix.java }} path: | - applet/build/javacard/*.cap - reader/build/libs/ECTesterReader.jar standalone/build/libs/ECTesterStandalone.jar - name: Upload code coverage diff --git a/standalone/build.gradle.kts b/standalone/build.gradle.kts index 095c4b4..1c9c485 100644 --- a/standalone/build.gradle.kts +++ b/standalone/build.gradle.kts @@ -3,6 +3,7 @@ plugins { application jacoco id("com.google.osdetector") version "1.7.3" + id("com.adarshr.test-logger") version "4.0.0" } repositories { @@ -15,9 +16,14 @@ dependencies { 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" diff --git a/standalone/src/test/java/cz/crcs/ectester/reader/IdentTests.java b/standalone/src/test/java/cz/crcs/ectester/reader/IdentTests.java deleted file mode 100644 index 2940f1e..0000000 --- a/standalone/src/test/java/cz/crcs/ectester/reader/IdentTests.java +++ /dev/null @@ -1,14 +0,0 @@ -package cz.crcs.ectester.reader; - -import cz.crcs.ectester.standalone.consts.KeyAgreementIdent; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertNotNull; -public class IdentTests { - @Test - void kaIdents() { - for (KeyAgreementIdent keyAgreementIdent : KeyAgreementIdent.list()) { - assertNotNull(keyAgreementIdent.getBaseAlgo()); - } - } -} 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..cffc94f --- /dev/null +++ b/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java @@ -0,0 +1,75 @@ +package cz.crcs.ectester.standalone; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.junitpioneer.jupiter.ExpectedToFail; +import org.junitpioneer.jupiter.StdErr; +import org.junitpioneer.jupiter.StdIo; +import org.junitpioneer.jupiter.StdOut; + +import static org.junit.jupiter.api.Assertions.*; + +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")); + } + + @SuppressWarnings("JUnitMalformedDeclaration") + @ExpectedToFail + @ParameterizedTest + // TODO: Add "wolfCrypt" to the list + @ValueSource(strings = {"Bouncy", "Sun", "libtomcrypt", "Botan", "Crypto++", "OpenSSL 3", "BoringSSL", "libgcrypt", "mbedTLS", "2021" /* IPPCP */, "Nettle", "LibreSSL"}) + @StdIo() + public void defaultSuite(String libName, StdOut out, StdErr err) { + String[] args = new String[]{"test", "default", libName}; + if (libName.equals("Botan") || libName.equals("Crypto++")) { + args = new String[]{"test", "--kpg-type", "ECDH", "default", libName}; + } + ECTesterStandalone.main(args); + String sout = out.capturedString(); + if (sout.contains("Exception")) { + fail("Default suite has exceptions."); + } + String serr = err.capturedString(); + if (!serr.isEmpty()) { + fail(serr); + } + } +} 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..6e11ccd --- /dev/null +++ b/standalone/src/test/java/cz/crcs/ectester/standalone/LibTests.java @@ -0,0 +1,54 @@ +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 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, + MatrixsslLib.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()); + } + + } +} -- cgit v1.3.1 From 05677a74bdb26001183d663fe6c1b57b853967bc Mon Sep 17 00:00:00 2001 From: J08nY Date: Wed, 27 Mar 2024 15:55:17 +0100 Subject: Fix wilfCrypt use in CI and tests. --- .github/workflows/build.yml | 17 ++++++++++++++- .gitmodules | 3 +++ README.md | 24 ++++++++++++++++----- ext/wolfcrypt-jni | 1 + ext/wolfcrypt-jni.jar | Bin 83453 -> 98431 bytes standalone/build.gradle.kts | 17 ++++++++++----- .../ectester/standalone/libs/WolfCryptLib.java | 10 +++++++++ .../java/cz/crcs/ectester/standalone/AppTests.java | 5 +++-- 8 files changed, 64 insertions(+), 13 deletions(-) create mode 160000 ext/wolfcrypt-jni (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8b7ca52..d3e45cf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -114,36 +114,51 @@ jobs: echo "BORINGSSL_VERSION=$(git submodule status ext/boringssl | cut -f2 -d' ')" >> $GITHUB_ENV echo "LIBRESSL_VERSION=$(git submodule status ext/libressl | cut -f2 -d' ')" >> $GITHUB_ENV echo "IPPCP_VERSION=$(git submodule status ext/ipp-crypto | cut -f2 -d' ')" >> $GITHUB_ENV + echo "WOLFCRYPT_VERSION=$(git submodule status ext/wolfcrypt-jni | cut -f2 -d' ')" >> $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.IPPCP_VERSION }} + key: libs-${{ env.BORINGSSL_VERSION }}-${{ env.LIBRESSL_VERSION }}-${{ env.IPPCP_VERSION }}-${{ env.WOLFCRYPT_VERSION }}-${{ env.WOLFSSL_VERSION }} path: | ext/boringssl/build/crypto/libcrypto.so ext/libressl/build/crypto/libcrypto.so ext/ipp-crypto/build/.build/RELEASE/lib/libippcp.so + 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 cd build make -j4 crypto cd ../../.. + # ------------ Build LibreSSL ------------ cd ext/libressl ./autogen.sh cmake -DBUILD_SHARED_LIBS=ON -Bbuild cd build make -j4 crypto cd ../../.. + # ------------ Build IPP-crypto ------------ cd ext/ipp-crypto CC=clang CXX=clang++ cmake CMakeLists.txt -Bbuild -DARCH=intel64 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 ../../.. - name: Build standalone run: | diff --git a/.gitmodules b/.gitmodules index 603e4d9..54819aa 100644 --- a/.gitmodules +++ b/.gitmodules @@ -16,3 +16,6 @@ [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 diff --git a/README.md b/README.md index 8c1da32..ed0741d 100644 --- a/README.md +++ b/README.md @@ -308,7 +308,7 @@ For more information on ECC libraries see [LIBS](docs/LIBS.md). ### Setup ```shell -./gradlew :standalone:libs # To build the native library shims. (Necessary +./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, @@ -356,9 +356,9 @@ g++ -fPIC -shared -O2 -o botan_provider.so -Wl,-rpath,'$ORIGIN/lib' botan.o cpp_ 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 ``` -BoringSSL, LibreSSL and ipp-crypto are included as git submodules. Make sure you run: `git submodule update --init --recursive` +BoringSSL, LibreSSL, ipp-crypto 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 cmake -GNinja -Bbuild -DBUILD_SHARED_LIBS=1 cd build @@ -366,7 +366,7 @@ ninja ``` To build LibreSSL do: -``` +```shell cd ext/libressl ./autogen.sh cmake -GNinja -Bbuild -DBUILD_SHARED_LIBS=1 @@ -376,13 +376,27 @@ 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 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`. + #### Java diff --git a/ext/wolfcrypt-jni b/ext/wolfcrypt-jni new file mode 160000 index 0000000..0497ee7 --- /dev/null +++ b/ext/wolfcrypt-jni @@ -0,0 +1 @@ +Subproject commit 0497ee767c994775beda2f2091009593961e5c7e diff --git a/ext/wolfcrypt-jni.jar b/ext/wolfcrypt-jni.jar index 890ae14..be579ee 100644 Binary files a/ext/wolfcrypt-jni.jar and b/ext/wolfcrypt-jni.jar differ diff --git a/standalone/build.gradle.kts b/standalone/build.gradle.kts index 1c9c485..8fe4bff 100644 --- a/standalone/build.gradle.kts +++ b/standalone/build.gradle.kts @@ -11,7 +11,12 @@ repositories { } dependencies { - implementation(files("$rootDir/ext/wolfcrypt-jni.jar")) + // 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")) @@ -32,10 +37,12 @@ application { tasks.named("test") { useJUnitPlatform() -} - -tasks.test { - finalizedBy(tasks.jacocoTestReport) // report is always generated after tests run + // Report is always generated after tests run + finalizedBy(tasks.jacocoTestReport) + // 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") + ) } tasks.jacocoTestReport { diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/WolfCryptLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/WolfCryptLib.java index b58eb91..ff592d1 100644 --- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/WolfCryptLib.java +++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/WolfCryptLib.java @@ -11,6 +11,16 @@ public class WolfCryptLib extends ProviderECLibrary { super(new WolfCryptProvider()); } + @Override + public boolean initialize() { + try { + System.loadLibrary("wolfcryptjni"); + return super.initialize(); + } catch (UnsatisfiedLinkError ule) { + return false; + } + } + @Override public Set getCurves() { return new HashSet<>(); diff --git a/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java b/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java index c095ea5..6714e56 100644 --- a/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java +++ b/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java @@ -53,8 +53,9 @@ public class AppTests { @SuppressWarnings("JUnitMalformedDeclaration") @ParameterizedTest - // TODO: Add "wolfCrypt" to the list - @ValueSource(strings = {"Bouncy", "Sun", "libtomcrypt", "Botan", "Crypto++", "OpenSSL 3", "BoringSSL", "libgcrypt", "mbedTLS", "2021" /* IPPCP */, "Nettle", "LibreSSL"}) + // TODO: @ExpectedToFail does not work with parameterized tests: https://github.com/junit-pioneer/junit-pioneer/issues/762 + @ExpectedToFail + @ValueSource(strings = {"Bouncy", "Sun", "libtomcrypt", "Botan", "Crypto++", "OpenSSL 3", "BoringSSL", "libgcrypt", "mbedTLS", "2021" /* IPPCP */, "Nettle", "LibreSSL", "wolfCrypt"}) @StdIo() public void defaultSuite(String libName, StdOut out, StdErr err) { String[] args = new String[]{"test", "default", libName}; -- cgit v1.3.1 From 5f58325077f2fa6b999ae3455b45334785b94f76 Mon Sep 17 00:00:00 2001 From: J08nY Date: Wed, 27 Mar 2024 19:00:46 +0100 Subject: Fix LibreSSL build (they removed binary curves). --- .github/workflows/build.yml | 6 +- .../crcs/ectester/standalone/libs/jni/libressl.c | 69 ++-------------------- 2 files changed, 7 insertions(+), 68 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d3e45cf..df46cda 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -134,20 +134,20 @@ jobs: run: | # ------------ Build BoringSSL ------------ cd ext/boringssl - cmake -DBUILD_SHARED_LIBS=1 -Bbuild + 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 + 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 + CC=clang CXX=clang++ cmake CMakeLists.txt -Bbuild -DARCH=intel64 -G "Unix Makefiles" cd build make -j4 cd ../../.. diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/libressl.c b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/libressl.c index 79227f8..2a1eaa7 100644 --- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/libressl.c +++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/libressl.c @@ -153,26 +153,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 +191,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 +252,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, "", "(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; } -- cgit v1.3.1 From 9d33cfbec07835cbef801c77b3e062d969ea2bf4 Mon Sep 17 00:00:00 2001 From: J08nY Date: Wed, 27 Mar 2024 19:20:07 +0100 Subject: Add Java version to CI lib cache key (for wolfcrypt-JNI). --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index df46cda..9948751 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -121,7 +121,7 @@ jobs: uses: actions/cache@v4 id: cache-libs with: - key: libs-${{ env.BORINGSSL_VERSION }}-${{ env.LIBRESSL_VERSION }}-${{ env.IPPCP_VERSION }}-${{ env.WOLFCRYPT_VERSION }}-${{ env.WOLFSSL_VERSION }} + key: libs-${{ env.BORINGSSL_VERSION }}-${{ env.LIBRESSL_VERSION }}-${{ env.IPPCP_VERSION }}-${{ env.WOLFCRYPT_VERSION }}-${{ env.WOLFSSL_VERSION }}-${{ matrix.java }} path: | ext/boringssl/build/crypto/libcrypto.so ext/libressl/build/crypto/libcrypto.so @@ -182,4 +182,4 @@ jobs: uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} - slug: crocs-muni/ECTester \ No newline at end of file + slug: crocs-muni/ECTester -- cgit v1.3.1 From 6d3b0e0d55f44a0da78ee6674abd6b60fd9b556d Mon Sep 17 00:00:00 2001 From: J08nY Date: Thu, 28 Mar 2024 09:42:57 +0100 Subject: Cache whole LibreSSL build. --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9948751..d710da5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -123,9 +123,9 @@ jobs: with: key: libs-${{ env.BORINGSSL_VERSION }}-${{ env.LIBRESSL_VERSION }}-${{ env.IPPCP_VERSION }}-${{ env.WOLFCRYPT_VERSION }}-${{ env.WOLFSSL_VERSION }}-${{ matrix.java }} path: | - ext/boringssl/build/crypto/libcrypto.so - ext/libressl/build/crypto/libcrypto.so - ext/ipp-crypto/build/.build/RELEASE/lib/libippcp.so + ext/boringssl/build/ + ext/libressl/build/ + ext/ipp-crypto/build/ ext/wolfcrypt-jni/lib/wolfcrypt-jni.jar ext/wolfcrypt-jni/lib/libwolfcryptjni.so -- cgit v1.3.1 From 063b698ed716230b84f81cb88629ab63c0556000 Mon Sep 17 00:00:00 2001 From: J08nY Date: Thu, 28 Mar 2024 10:03:44 +0100 Subject: Vendor mbedTLS. --- .github/workflows/build.yml | 23 ++++++++++++++++------ .gitmodules | 3 +++ ext/mbedtls | 1 + .../crcs/ectester/standalone/libs/MbedTLSLib.java | 2 +- .../cz/crcs/ectester/standalone/libs/jni/Makefile | 9 ++++++--- 5 files changed, 28 insertions(+), 10 deletions(-) create mode 160000 ext/mbedtls (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d710da5..8274f51 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -110,22 +110,24 @@ jobs: - name: Setup libraries run: | sudo apt update - sudo apt install libmbedtls-dev 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' ')" >> $GITHUB_ENV - echo "LIBRESSL_VERSION=$(git submodule status ext/libressl | cut -f2 -d' ')" >> $GITHUB_ENV - echo "IPPCP_VERSION=$(git submodule status ext/ipp-crypto | cut -f2 -d' ')" >> $GITHUB_ENV - echo "WOLFCRYPT_VERSION=$(git submodule status ext/wolfcrypt-jni | cut -f2 -d' ')" >> $GITHUB_ENV + 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.IPPCP_VERSION }}-${{ env.WOLFCRYPT_VERSION }}-${{ env.WOLFSSL_VERSION }}-${{ matrix.java }} + key: libs-${{ env.BORINGSSL_VERSION }}-${{ env.LIBRESSL_VERSION }}-${{ env.LIBRESSL_VERSION }}-${{ env.IPPCP_VERSION }}-${{ env.WOLFCRYPT_VERSION }}-${{ env.WOLFSSL_VERSION }}-${{ 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 @@ -159,6 +161,15 @@ jobs: 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: | diff --git a/.gitmodules b/.gitmodules index 54819aa..7fea751 100644 --- a/.gitmodules +++ b/.gitmodules @@ -19,3 +19,6 @@ [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/ext/mbedtls b/ext/mbedtls new file mode 160000 index 0000000..611f899 --- /dev/null +++ b/ext/mbedtls @@ -0,0 +1 @@ +Subproject commit 611f899c0c9d397baedfaec34ea0861ad2543991 diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/MbedTLSLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/MbedTLSLib.java index ace10d7..5c0ad12 100644 --- a/standalone/src/main/java/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_provider", "lib_mbedtls.so"); } @Override diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile index be7449c..08c6374 100644 --- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile +++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile @@ -142,11 +142,14 @@ 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/include/ $(CFLAGS) -c $< # Intel Performance Primitives crypto shim -- cgit v1.3.1 From be249f77f9c12827c4e4f439954d958262249d1c Mon Sep 17 00:00:00 2001 From: J08nY Date: Thu, 28 Mar 2024 10:36:28 +0100 Subject: Fetch tags to make sure LibreSSL finds its version. --- .github/workflows/build.yml | 2 ++ 1 file changed, 2 insertions(+) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8274f51..ef8e04a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -97,6 +97,8 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive + fetch-tags: true + fetch-depth: -1 - name: Set up JDK uses: actions/setup-java@v4 -- cgit v1.3.1 From c71094f7ca90e5cbcdc9c8aca75dd0661646b2f4 Mon Sep 17 00:00:00 2001 From: J08nY Date: Thu, 28 Mar 2024 11:01:03 +0100 Subject: Fix mbedtls build. --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ef8e04a..ea3aa4f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -162,7 +162,7 @@ jobs: 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 ../../.. + cd ../.. # ------------ Build mbedTLS ------------ cd ext/mbedtls python -m venv virt -- cgit v1.3.1 From 54474b4d82129d7a927e8209a9f7496094c76fc7 Mon Sep 17 00:00:00 2001 From: J08nY Date: Thu, 28 Mar 2024 13:10:52 +0100 Subject: Correct listings of supported libraries. --- .github/workflows/build.yml | 3 +- README.md | 148 +++++++++++++++++++++++++++----------------- standalone/build.gradle.kts | 3 + 3 files changed, 96 insertions(+), 58 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ea3aa4f..c199acf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -91,7 +91,8 @@ jobs: java: [ "11", "17", "21" ] env: # ffs: https://github.com/adoptium/adoptium-support/issues/485 !!! - LD_LIBRARY_PATH: "/usr/lib/x86_64-linux-gnu/" + # also, add the wolfcrypt JNI path + LD_LIBRARY_PATH: "/usr/lib/x86_64-linux-gnu/:ext/wolfcrypt-jni/lib/" name: Build standalone on Java ${{ matrix.java }} steps: - uses: actions/checkout@v4 diff --git a/README.md b/README.md index 54f38b1..e56ab4e 100644 --- a/README.md +++ b/README.md @@ -329,34 +329,42 @@ There are two important environmental variables that should be set in your envir 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/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 -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, 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: +after checking out the ECTester repository to initialize them. + +To build BoringSSL do: ```shell cd ext/boringssl cmake -GNinja -Bbuild -DBUILD_SHARED_LIBS=1 @@ -382,6 +390,17 @@ 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 @@ -396,19 +415,19 @@ The produced `lib/wolfcrypt-jni.jar` will be automatically included into the sta 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 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/`. @@ -418,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 @@ -458,52 +477,67 @@ 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 + + - 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: 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. diff --git a/standalone/build.gradle.kts b/standalone/build.gradle.kts index d05480d..c3c4b9a 100644 --- a/standalone/build.gradle.kts +++ b/standalone/build.gradle.kts @@ -82,6 +82,9 @@ tasks.register("uberJar") { 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) -- cgit v1.3.1 From b3d94dd54e9af330d62aeea8b36be3fff7756df1 Mon Sep 17 00:00:00 2001 From: J08nY Date: Thu, 28 Mar 2024 14:43:44 +0100 Subject: Point at build incldue paths for vendored libs. --- .github/workflows/build.yml | 2 +- README.md | 2 +- .../src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c199acf..2e06faa 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -125,7 +125,7 @@ jobs: 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 }}-${{ matrix.java }} + 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/ diff --git a/README.md b/README.md index 8bdc5fb..f9cbfd7 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ git submodule update --init --recursive # To initialize submodules (JavaCa 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 `:standalone:libs` task invokes a Makefile in `src/cz/crcs/ectester/standalone/libs/jni`, which tries to build the +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. diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile index 6d7906e..1fa16c0 100644 --- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile +++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/Makefile @@ -149,7 +149,7 @@ 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) -I$(PROJECT_ROOT_PATH)/ext/mbedtls/include/ $(CFLAGS) -c $< + $(CC) -I$(PROJECT_ROOT_PATH)/ext/mbedtls/build/include/ $(CFLAGS) -c $< # Intel Performance Primitives crypto shim @@ -185,7 +185,7 @@ 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$(PROJECT_ROOT_PATH)/ext/libressl/include/ $(CFLAGS) -c $< + $(CC) -I$(PROJECT_ROOT_PATH)/ext/libressl/build/include/ $(CFLAGS) -c $< help: -- cgit v1.3.1 From 6456d96c094646b86c644c305b1addcbd335cdc0 Mon Sep 17 00:00:00 2001 From: J08nY Date: Thu, 28 Mar 2024 15:16:16 +0100 Subject: Fix BouncyCastle reader version colission in reader module. --- .github/workflows/build.yml | 2 +- applet/build.gradle.kts | 6 +++++- reader/build.gradle.kts | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2e06faa..67992be 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -125,7 +125,7 @@ jobs: 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 }} + 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/ diff --git a/applet/build.gradle.kts b/applet/build.gradle.kts index d5ef7f4..61071c2 100644 --- a/applet/build.gradle.kts +++ b/applet/build.gradle.kts @@ -48,7 +48,11 @@ dependencies { // 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") + 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 { diff --git a/reader/build.gradle.kts b/reader/build.gradle.kts index ac32214..0e8de4e 100644 --- a/reader/build.gradle.kts +++ b/reader/build.gradle.kts @@ -61,6 +61,6 @@ tasks.register("uberJar") { 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") } } + 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 -- cgit v1.3.1 From 93514d2f2508f8679a18ad4846c6b25456b27259 Mon Sep 17 00:00:00 2001 From: J08nY Date: Thu, 28 Mar 2024 15:19:03 +0100 Subject: Make CI LD_LIBRARY_PATH wolfCrypt entry absolute. --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 67992be..3021e73 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -92,7 +92,7 @@ jobs: 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/:ext/wolfcrypt-jni/lib/" + 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 -- cgit v1.3.1 From 8e388999ceec941a8f26d3ee6ee7ece91c10ee0e Mon Sep 17 00:00:00 2001 From: J08nY Date: Thu, 28 Mar 2024 15:20:14 +0100 Subject: Fix CI syntax. --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3021e73..fe294ee 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -92,7 +92,7 @@ jobs: 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/" + 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 @@ -125,7 +125,7 @@ jobs: 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 }} + 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/ -- cgit v1.3.1 From 6c2d68b4772b5276e2abd6208aee2618b6e32227 Mon Sep 17 00:00:00 2001 From: J08nY Date: Sun, 31 Mar 2024 11:18:40 +0200 Subject: Add storing of test results. --- .github/workflows/build.yml | 7 +++ standalone/build.gradle.kts | 22 ++++++++-- .../java/cz/crcs/ectester/standalone/AppTests.java | 50 ++++++++++++++++------ .../cz/crcs/ectester/standalone/OutputTests.java | 2 +- 4 files changed, 64 insertions(+), 17 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fe294ee..ab2a2ee 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -192,6 +192,13 @@ jobs: 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: diff --git a/standalone/build.gradle.kts b/standalone/build.gradle.kts index c79af1b..bc7e42a 100644 --- a/standalone/build.gradle.kts +++ b/standalone/build.gradle.kts @@ -35,16 +35,30 @@ application { } tasks.named("test") { + val resultsDir = layout.buildDirectory.dir("results").get().asFile; + doFirst { + resultsDir.mkdirs(); + } + useJUnitPlatform() // Report is always generated after tests run finalizedBy(tasks.jacocoTestReport) - jvmArgs( - "--add-exports", "jdk.crypto.ec/sun.security.ec=ALL-UNNAMED" - ) + + 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 { @@ -77,7 +91,7 @@ tasks.register("libs") { environment("PROJECT_ROOT_PATH", rootDir.absolutePath) if (osdetector.os == "windows") { commandLine("makefile.bat", "/c") - } else if (osdetector.os == "linux"){ + } else if (osdetector.os == "linux") { commandLine("make", "-k", "-B") } } diff --git a/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java b/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java index e3ae573..0476818 100644 --- a/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java +++ b/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java @@ -7,7 +7,12 @@ import org.junitpioneer.jupiter.StdIo; import org.junitpioneer.jupiter.StdOut; import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.PrintStream; +import java.nio.file.Path; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.*; @@ -59,6 +64,27 @@ public class AppTests { 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 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") @@ -67,9 +93,9 @@ public class AppTests { // TODO: "Nettle" is very broken here for a weird reason. assumeFalse(libName.equals("Nettle")); - String[] args = new String[]{"test", "default", libName}; + String[] args = buildCLIArgs(libName, "default"); if (libName.equals("Botan") || libName.equals("Crypto++")) { - args = new String[]{"test", "--kpg-type", "ECDH", "default", libName}; + args = buildCLIArgs(libName, "default", "--kpg-type", "ECDH"); } ECTesterStandalone.main(args); String sout = out.capturedString(); @@ -83,9 +109,9 @@ public class AppTests { @MethodSource("libs") @StdIo() public void testVectorSuite(String libName, StdOut out) { - String[] args = new String[]{"test", "test-vectors", libName}; + String[] args = buildCLIArgs(libName, "test-vectors"); if (libName.equals("Botan") || libName.equals("Crypto++")) { - args = new String[]{"test", "--kpg-type", "ECDH", "test-vectors", libName}; + args = buildCLIArgs(libName, "test-vectors", "--kpg-type", "ECDH"); } ECTesterStandalone.main(args); String sout = out.capturedString(); @@ -100,9 +126,9 @@ public class AppTests { // TODO: "Nettle" is very broken here for a weird reason. assumeFalse(libName.equals("Nettle")); - String[] args = new String[]{"test", "performance", libName}; + String[] args = buildCLIArgs(libName, "performance"); if (libName.equals("Botan") || libName.equals("Crypto++")) { - args = new String[]{"test", "--kpg-type", "ECDH", "performance", libName}; + args = buildCLIArgs(libName, "performance", "--kpg-type", "ECDH"); } ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos); @@ -117,7 +143,7 @@ public class AppTests { @ParameterizedTest @MethodSource("libs") public void signatureSuite(String libName) { - String[] args = new String[]{"test", "signature", libName}; + String[] args = buildCLIArgs(libName, "signature"); switch (libName) { case "Nettle": case "libgcrypt": @@ -127,7 +153,7 @@ public class AppTests { case "LibreSSL": case "IPPCP": case "mbedTLS": - args = new String[]{"test", "-st", "NONEwithECDSA", "signature", libName}; + args = buildCLIArgs(libName, "signature", "-st", "NONEwithECDSA"); break; } ECTesterStandalone.main(args); @@ -136,9 +162,9 @@ public class AppTests { @ParameterizedTest @MethodSource("libs") public void miscSuite(String libName) { - String[] args = new String[]{"test", "miscellaneous", libName}; + String[] args = buildCLIArgs(libName, "miscellaneous"); if (libName.equals("Botan") || libName.equals("Crypto++")) { - args = new String[]{"test", "--kpg-type", "ECDH", "miscellaneous", libName}; + args = buildCLIArgs(libName, "miscellaneous", "--kpg-type", "ECDH"); } ECTesterStandalone.main(args); } @@ -149,9 +175,9 @@ public class AppTests { // TODO: "Nettle" is very broken here for a weird reason. assumeFalse(libName.equals("Nettle")); - String[] args = new String[]{"test", "invalid", libName}; + String[] args = buildCLIArgs(libName, "invalid"); if (libName.equals("Botan") || libName.equals("Crypto++")) { - args = new String[]{"test", "--kpg-type", "ECDH", "invalid", libName}; + args = buildCLIArgs(libName, "invalid", "--kpg-type", "ECDH"); } ECTesterStandalone.main(args); } diff --git a/standalone/src/test/java/cz/crcs/ectester/standalone/OutputTests.java b/standalone/src/test/java/cz/crcs/ectester/standalone/OutputTests.java index 7218094..7247195 100644 --- a/standalone/src/test/java/cz/crcs/ectester/standalone/OutputTests.java +++ b/standalone/src/test/java/cz/crcs/ectester/standalone/OutputTests.java @@ -14,7 +14,7 @@ public class OutputTests { @ValueSource(strings = {"text", "xml", "yml"}) @StdIo() public void formats(String format, StdOut out) { - ECTesterStandalone.main(new String[]{"test", "-f", format, "default", "Sun"}); + ECTesterStandalone.main(new String[]{"test", "-f", format, "default", "SunEC"}); String s = out.capturedString(); assertFalse(s.isEmpty()); } -- cgit v1.3.1