Skip to content

Commit

Permalink
Add more suites to tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
J08nY committed Mar 30, 2024
1 parent 3222a7d commit fa5ba0e
Show file tree
Hide file tree
Showing 4 changed files with 141 additions and 58 deletions.
7 changes: 6 additions & 1 deletion standalone/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,16 @@ testlogger {
}

tasks.withType<JavaCompile> {
if (JavaVersion.current() > JavaVersion.VERSION_1_8) {
if (JavaVersion.current() > JavaVersion.VERSION_1_8 && JavaVersion.current() < JavaVersion.VERSION_22) {
options.compilerArgs.addAll(arrayOf(
"--add-modules", "jdk.crypto.ec",
"--add-exports", "jdk.crypto.ec/sun.security.ec=ALL-UNNAMED"
))
} else if (JavaVersion.current() >= JavaVersion.VERSION_22) {
options.compilerArgs.addAll(arrayOf(
"--add-modules", "java.base",
"--add-exports", "java.base/sun.security.ec=ALL-UNNAMED"
))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ private TreeCommandLine parseArgs(String[] args) throws ParseException {
testOpts.addOption(bits);
testOpts.addOption(namedCurve);
testOpts.addOption(curveName);
testOpts.addOption(output);
testOpts.addOption(Option.builder("gt").longOpt("kpg-type").desc("Set the KeyPairGenerator object [type].").hasArg().argName("type").optionalArg(false).build());
testOpts.addOption(Option.builder("kt").longOpt("ka-type").desc("Set the KeyAgreement object [type].").hasArg().argName("type").optionalArg(false).build());
testOpts.addOption(Option.builder("st").longOpt("sig-type").desc("Set the Signature object [type].").hasArg().argName("type").optionalArg(false).build());
Expand Down Expand Up @@ -755,19 +756,26 @@ private void generate() throws NoSuchAlgorithmException, InvalidAlgorithmParamet
/**
*
*/
private void test() throws TestException, ParserConfigurationException {
private void test() throws TestException, ParserConfigurationException, FileNotFoundException {
PrintStream out;
if (cli.hasOption("test.output")) {
out = new PrintStream(FileUtil.openStream(cli.getOptionValues("test.output")));
} else {
out = System.out;
}

TestWriter writer;
switch (cli.getOptionValue("test.format", "text").toLowerCase()) {
case "yaml":
case "yml":
writer = new YAMLTestWriter(System.out);
writer = new YAMLTestWriter(out);
break;
case "xml":
writer = new XMLTestWriter(System.out);
writer = new XMLTestWriter(out);
break;
case "text":
default:
writer = new TextTestWriter(System.out);
writer = new TextTestWriter(out);
break;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -672,28 +672,39 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSig
std::unique_ptr<DL_GroupParameters_EC<ECP>> ecp_group = fp_group_from_params(env, params);
if (ecp_group == nullptr) {
std::unique_ptr<DL_GroupParameters_EC<EC2N>> ec2n_group = f2m_group_from_params(env, params);
if (type_str.find("SHA1") != std::string::npos) {
result = sign_message<EC2N, SHA1>(env, *ec2n_group, data, private_key_x);
} else if (type_str.find("SHA224") != std::string::npos) {
result = sign_message<EC2N, SHA224>(env, *ec2n_group, data, private_key_x);
} else if (type_str.find("SHA256") != std::string::npos) {
result = sign_message<EC2N, SHA256>(env, *ec2n_group, data, private_key_x);
} else if (type_str.find("SHA384") != std::string::npos) {
result = sign_message<EC2N, SHA384>(env, *ec2n_group, data, private_key_x);
} else if (type_str.find("SHA512") != std::string::npos) {
result = sign_message<EC2N, SHA512>(env, *ec2n_group, data, private_key_x);

try {
if (type_str.find("SHA1") != std::string::npos) {
result = sign_message<EC2N, SHA1>(env, *ec2n_group, data, private_key_x);
} else if (type_str.find("SHA224") != std::string::npos) {
result = sign_message<EC2N, SHA224>(env, *ec2n_group, data, private_key_x);
} else if (type_str.find("SHA256") != std::string::npos) {
result = sign_message<EC2N, SHA256>(env, *ec2n_group, data, private_key_x);
} else if (type_str.find("SHA384") != std::string::npos) {
result = sign_message<EC2N, SHA384>(env, *ec2n_group, data, private_key_x);
} else if (type_str.find("SHA512") != std::string::npos) {
result = sign_message<EC2N, SHA512>(env, *ec2n_group, data, private_key_x);
}
} catch (Exception & ex) {
throw_new(env, "java/security/GeneralSecurityException", ex.what());
return nullptr;
}
} else {
if (type_str.find("SHA1") != std::string::npos) {
result = sign_message<ECP, SHA1>(env, *ecp_group, data, private_key_x);
} else if (type_str.find("SHA224") != std::string::npos) {
result = sign_message<ECP, SHA224>(env, *ecp_group, data, private_key_x);
} else if (type_str.find("SHA256") != std::string::npos) {
result = sign_message<ECP, SHA256>(env, *ecp_group, data, private_key_x);
} else if (type_str.find("SHA384") != std::string::npos) {
result = sign_message<ECP, SHA384>(env, *ecp_group, data, private_key_x);
} else if (type_str.find("SHA512") != std::string::npos) {
result = sign_message<ECP, SHA512>(env, *ecp_group, data, private_key_x);
try {
if (type_str.find("SHA1") != std::string::npos) {
result = sign_message<ECP, SHA1>(env, *ecp_group, data, private_key_x);
} else if (type_str.find("SHA224") != std::string::npos) {
result = sign_message<ECP, SHA224>(env, *ecp_group, data, private_key_x);
} else if (type_str.find("SHA256") != std::string::npos) {
result = sign_message<ECP, SHA256>(env, *ecp_group, data, private_key_x);
} else if (type_str.find("SHA384") != std::string::npos) {
result = sign_message<ECP, SHA384>(env, *ecp_group, data, private_key_x);
} else if (type_str.find("SHA512") != std::string::npos) {
result = sign_message<ECP, SHA512>(env, *ecp_group, data, private_key_x);
}
} catch (Exception & ex) {
throw_new(env, "java/security/GeneralSecurityException", ex.what());
return nullptr;
}
}

Expand Down Expand Up @@ -744,28 +755,38 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSigna
if (ecp_group == nullptr) {
std::unique_ptr<DL_GroupParameters_EC<EC2N>> ec2n_group = f2m_group_from_params(env, params);

if (type_str.find("SHA1") != std::string::npos) {
return verify_message<EC2N, SHA1>(env, *ec2n_group, data, signature, pubkey);
} else if (type_str.find("SHA224") != std::string::npos) {
return verify_message<EC2N, SHA224>(env, *ec2n_group, data, signature, pubkey);
} else if (type_str.find("SHA256") != std::string::npos) {
return verify_message<EC2N, SHA256>(env, *ec2n_group, data, signature, pubkey);
} else if (type_str.find("SHA384") != std::string::npos) {
return verify_message<EC2N, SHA384>(env, *ec2n_group, data, signature, pubkey);
} else if (type_str.find("SHA512") != std::string::npos) {
return verify_message<EC2N, SHA512>(env, *ec2n_group, data, signature, pubkey);
try {
if (type_str.find("SHA1") != std::string::npos) {
return verify_message<EC2N, SHA1>(env, *ec2n_group, data, signature, pubkey);
} else if (type_str.find("SHA224") != std::string::npos) {
return verify_message<EC2N, SHA224>(env, *ec2n_group, data, signature, pubkey);
} else if (type_str.find("SHA256") != std::string::npos) {
return verify_message<EC2N, SHA256>(env, *ec2n_group, data, signature, pubkey);
} else if (type_str.find("SHA384") != std::string::npos) {
return verify_message<EC2N, SHA384>(env, *ec2n_group, data, signature, pubkey);
} else if (type_str.find("SHA512") != std::string::npos) {
return verify_message<EC2N, SHA512>(env, *ec2n_group, data, signature, pubkey);
}
} catch (Exception & ex) {
throw_new(env, "java/security/GeneralSecurityException", ex.what());
return JNI_FALSE;
}
} else {
if (type_str.find("SHA1") != std::string::npos) {
return verify_message<ECP, SHA1>(env, *ecp_group, data, signature, pubkey);
} else if (type_str.find("SHA224") != std::string::npos) {
return verify_message<ECP, SHA224>(env, *ecp_group, data, signature, pubkey);
} else if (type_str.find("SHA256") != std::string::npos) {
return verify_message<ECP, SHA256>(env, *ecp_group, data, signature, pubkey);
} else if (type_str.find("SHA384") != std::string::npos) {
return verify_message<ECP, SHA384>(env, *ecp_group, data, signature, pubkey);
} else if (type_str.find("SHA512") != std::string::npos) {
return verify_message<ECP, SHA512>(env, *ecp_group, data, signature, pubkey);
try {
if (type_str.find("SHA1") != std::string::npos) {
return verify_message<ECP, SHA1>(env, *ecp_group, data, signature, pubkey);
} else if (type_str.find("SHA224") != std::string::npos) {
return verify_message<ECP, SHA224>(env, *ecp_group, data, signature, pubkey);
} else if (type_str.find("SHA256") != std::string::npos) {
return verify_message<ECP, SHA256>(env, *ecp_group, data, signature, pubkey);
} else if (type_str.find("SHA384") != std::string::npos) {
return verify_message<ECP, SHA384>(env, *ecp_group, data, signature, pubkey);
} else if (type_str.find("SHA512") != std::string::npos) {
return verify_message<ECP, SHA512>(env, *ecp_group, data, signature, pubkey);
}
} catch (Exception & ex) {
throw_new(env, "java/security/GeneralSecurityException", ex.what());
return JNI_FALSE;
}
}
// unreachable
Expand Down
75 changes: 62 additions & 13 deletions standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
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.junit.jupiter.params.provider.MethodSource;
import org.junitpioneer.jupiter.StdIo;
import org.junitpioneer.jupiter.StdOut;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.stream.Stream;

import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
Expand Down Expand Up @@ -53,9 +55,13 @@ public void listIdents(StdOut out) {
assertTrue(s.contains("NONEwithECDSA"));
}

static Stream<String> libs() {
return Stream.of("BoringSSL", "Botan", "BouncyCastle", "Crypto++", "IPPCP", "LibreSSL", "libgcrypt", "mbedTLS", "Nettle", "OpenSSL", "SunEC", "tomcrypt", "wolfCrypt");
}

@SuppressWarnings("JUnitMalformedDeclaration")
@ParameterizedTest
@ValueSource(strings = {"Bouncy", "Sun", "libtomcrypt", "Botan", "Crypto++", "OpenSSL 3", "BoringSSL", "libgcrypt", "mbed TLS", "2021" /* IPPCP */, "Nettle", "LibreSSL", "wolfCrypt"})
@MethodSource("libs")
@StdIo()
public void defaultSuite(String libName, StdOut out) {
// TODO: "Nettle" is very broken here for a weird reason.
Expand All @@ -74,7 +80,7 @@ public void defaultSuite(String libName, StdOut out) {

@SuppressWarnings("JUnitMalformedDeclaration")
@ParameterizedTest
@ValueSource(strings = {"Bouncy", "Sun", "libtomcrypt", "Botan", "Crypto++", "OpenSSL 3", "BoringSSL", "libgcrypt", "mbed TLS", "2021" /* IPPCP */, "Nettle", "LibreSSL", "wolfCrypt"})
@MethodSource("libs")
@StdIo()
public void testVectorSuite(String libName, StdOut out) {
String[] args = new String[]{"test", "test-vectors", libName};
Expand All @@ -89,14 +95,14 @@ public void testVectorSuite(String libName, StdOut out) {
}

@ParameterizedTest
@ValueSource(strings = {"Bouncy", "Sun", "libtomcrypt", "Botan", "Crypto++", "OpenSSL 3", "BoringSSL", "libgcrypt", "mbed TLS", "2021" /* IPPCP */, "Nettle", "LibreSSL", "wolfCrypt"})
@MethodSource("libs")
public void performanceSuite(String libName) {
// TODO: "Nettle" is very broken here for a weird reason.
assumeFalse(libName.equals("Nettle"));

String[] args = new String[]{"test", "performance", "-o", "/dev/null", libName};
String[] args = new String[]{"test", "performance", libName};
if (libName.equals("Botan") || libName.equals("Crypto++")) {
args = new String[]{"test", "--kpg-type", "ECDH", "performance", "-o", "/dev/null", libName};
args = new String[]{"test", "--kpg-type", "ECDH", "performance", libName};
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
Expand All @@ -108,9 +114,51 @@ public void performanceSuite(String libName) {
}
}

@ParameterizedTest
@MethodSource("libs")
public void signatureSuite(String libName) {
String[] args = new String[]{"test", "signature", libName};
switch (libName) {
case "Nettle":
case "libgcrypt":
case "BoringSSL":
case "OpenSSL":
case "tomcrypt":
case "LibreSSL":
case "IPPCP":
case "mbedTLS":
args = new String[]{"test", "-st", "NONEwithECDSA", "signature", libName};
break;
}
ECTesterStandalone.main(args);
}

@ParameterizedTest
@MethodSource("libs")
public void miscSuite(String libName) {
String[] args = new String[]{"test", "miscellaneous", libName};
if (libName.equals("Botan") || libName.equals("Crypto++")) {
args = new String[]{"test", "--kpg-type", "ECDH", "miscellaneous", libName};
}
ECTesterStandalone.main(args);
}

@ParameterizedTest
@MethodSource("libs")
public void invalidSuite(String libName) {
// TODO: "Nettle" is very broken here for a weird reason.
assumeFalse(libName.equals("Nettle"));

String[] args = new String[]{"test", "invalid", libName};
if (libName.equals("Botan") || libName.equals("Crypto++")) {
args = new String[]{"test", "--kpg-type", "ECDH", "invalid", libName};
}
ECTesterStandalone.main(args);
}

@SuppressWarnings("JUnitMalformedDeclaration")
@ParameterizedTest
@ValueSource(strings = {"Bouncy", "Sun", "libtomcrypt", "Botan", "Crypto++", "OpenSSL 3", "BoringSSL", "libgcrypt", "mbed TLS", "2021" /* IPPCP */, "Nettle", "LibreSSL", "wolfCrypt"})
@MethodSource("libs")
@StdIo()
public void generate(String libName, StdOut out) {
String[] args = new String[]{"generate", "-n", "10", "-nc", "secg/secp256r1", libName};
Expand All @@ -133,7 +181,7 @@ public void generate(String libName, StdOut out) {

@SuppressWarnings("JUnitMalformedDeclaration")
@ParameterizedTest
@ValueSource(strings = {"Bouncy", "Sun", "libtomcrypt", "Botan", "Crypto++", "OpenSSL 3", "BoringSSL", "libgcrypt", "mbed TLS", "2021" /* IPPCP */, "Nettle", "LibreSSL", "wolfCrypt"})
@MethodSource("libs")
@StdIo()
public void ecdh(String libName, StdOut out) {
String[] args = new String[]{"ecdh", "-n", "10", "-nc", "secg/secp256r1", libName};
Expand All @@ -152,7 +200,7 @@ public void ecdh(String libName, StdOut out) {

@SuppressWarnings("JUnitMalformedDeclaration")
@ParameterizedTest
@ValueSource(strings = {"Bouncy", "Sun", "libtomcrypt", "Botan", "Crypto++", "OpenSSL 3", "BoringSSL", "libgcrypt", "mbed TLS", "2021" /* IPPCP */, "Nettle", "LibreSSL", "wolfCrypt"})
@MethodSource("libs")
@StdIo()
public void ecdsa(String libName, StdOut out) {
String[] args = new String[]{"ecdsa", "-n", "10", "-nc", "secg/secp256r1", libName};
Expand All @@ -164,10 +212,11 @@ public void ecdsa(String libName, StdOut out) {
case "BoringSSL":
args = new String[]{"ecdsa", "-n", "10", "-cn", "prime256v1", "-t", "NONEwithECDSA", libName};
break;
case "OpenSSL 3":
case "libtomcrypt":
case "OpenSSL":
case "tomcrypt":
case "LibreSSL":
case "2021":
case "IPPCP":
case "mbedTLS":
args = new String[]{"ecdsa", "-n", "10", "-nc", "secg/secp256r1", "-t", "NONEwithECDSA", libName};
break;
case "wolfCrypt":
Expand All @@ -179,7 +228,7 @@ public void ecdsa(String libName, StdOut out) {

@SuppressWarnings("JUnitMalformedDeclaration")
@ParameterizedTest
@ValueSource(strings = {"Bouncy", "Sun", "libtomcrypt", "Botan", "Crypto++", "OpenSSL 3", "BoringSSL", "libgcrypt", "mbed TLS", "2021" /* IPPCP */, "Nettle", "LibreSSL", "wolfCrypt"})
@MethodSource("libs")
@StdIo()
public void export(String libName, StdOut out) {
// TODO: wolfCrypt is weirdly broken here.
Expand Down

0 comments on commit fa5ba0e

Please sign in to comment.