Skip to content

Commit

Permalink
Add more tests.
Browse files Browse the repository at this point in the history
J08nY committed Mar 27, 2024
1 parent ccdeec2 commit 042f820
Showing 6 changed files with 265 additions and 30 deletions.
97 changes: 81 additions & 16 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -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
6 changes: 6 additions & 0 deletions standalone/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -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"
14 changes: 0 additions & 14 deletions standalone/src/test/java/cz/crcs/ectester/reader/IdentTests.java

This file was deleted.

75 changes: 75 additions & 0 deletions standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
54 changes: 54 additions & 0 deletions standalone/src/test/java/cz/crcs/ectester/standalone/LibTests.java
Original file line number Diff line number Diff line change
@@ -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<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,
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());
}

}
}

0 comments on commit 042f820

Please sign in to comment.