Skip to content

Commit a0d3189

Browse files
committed
unit tests
1 parent 6434f17 commit a0d3189

5 files changed

Lines changed: 187 additions & 26 deletions

File tree

src/java/com/wolfssl/provider/jsse/WolfSSLEngine.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -580,8 +580,10 @@ private synchronized int DoHandshake(boolean fromWrap) throws SSLException {
580580
}
581581

582582
} catch (SocketTimeoutException | SocketException e) {
583-
throw new SSLHandshakeException(
583+
SSLHandshakeException hsException = new SSLHandshakeException(
584584
"Socket error during SSL/TLS handshake: " + e.getMessage());
585+
hsException.initCause(e);
586+
throw hsException;
585587
}
586588

587589
return ret;

src/java/com/wolfssl/provider/jsse/WolfSSLTrustManager.java

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,17 @@
3434
import java.security.cert.CertificateException;
3535
import java.security.cert.Certificate;
3636
import java.security.cert.CertificateFactory;
37+
import javax.net.ssl.CertPathTrustManagerParameters;
38+
import javax.net.ssl.KeyStoreBuilderParameters;
3739
import javax.net.ssl.ManagerFactoryParameters;
3840
import javax.net.ssl.TrustManager;
3941
import javax.net.ssl.TrustManagerFactorySpi;
42+
import java.security.cert.CertPathParameters;
43+
import java.security.cert.PKIXParameters;
44+
import java.security.cert.TrustAnchor;
45+
import java.security.cert.X509Certificate;
46+
import java.util.List;
47+
import java.util.Set;
4048
import com.wolfssl.WolfSSL;
4149
import com.wolfssl.WolfSSLDebug;
4250
import com.wolfssl.WolfSSLCertificate;
@@ -761,29 +769,25 @@ protected void engineInit(ManagerFactoryParameters arg0)
761769
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
762770
() -> "entered engineInit(ManagerFactoryParameters arg0)");
763771

764-
/* Handle CertPathTrustManagerParameters (used by Tomcat, etc) */
765-
if (arg0 instanceof javax.net.ssl.CertPathTrustManagerParameters) {
766-
javax.net.ssl.CertPathTrustManagerParameters certPathParams =
767-
(javax.net.ssl.CertPathTrustManagerParameters) arg0;
768-
java.security.cert.CertPathParameters certPathParameters =
772+
/* Handle CertPathTrustManagerParameters */
773+
if (arg0 instanceof CertPathTrustManagerParameters) {
774+
CertPathTrustManagerParameters certPathParams =
775+
(CertPathTrustManagerParameters) arg0;
776+
CertPathParameters certPathParameters =
769777
certPathParams.getParameters();
770778

771-
if (certPathParameters instanceof
772-
java.security.cert.PKIXParameters) {
773-
java.security.cert.PKIXParameters pkixParams =
774-
(java.security.cert.PKIXParameters) certPathParameters;
775-
java.util.Set<java.security.cert.TrustAnchor> anchors =
776-
pkixParams.getTrustAnchors();
779+
if (certPathParameters instanceof PKIXParameters) {
780+
PKIXParameters pkixParams =
781+
(PKIXParameters) certPathParameters;
782+
Set<TrustAnchor> anchors = pkixParams.getTrustAnchors();
777783

778784
try {
779-
java.security.KeyStore ks =
780-
java.security.KeyStore.getInstance(
781-
java.security.KeyStore.getDefaultType());
785+
KeyStore ks =
786+
KeyStore.getInstance(KeyStore.getDefaultType());
782787
ks.load(null, null);
783788
int count = 0;
784-
for (java.security.cert.TrustAnchor anchor : anchors) {
785-
java.security.cert.X509Certificate cert =
786-
anchor.getTrustedCert();
789+
for (TrustAnchor anchor : anchors) {
790+
X509Certificate cert = anchor.getTrustedCert();
787791
if (cert != null) {
788792
ks.setCertificateEntry(
789793
"trustanchor-" + count, cert);
@@ -806,17 +810,15 @@ protected void engineInit(ManagerFactoryParameters arg0)
806810
}
807811

808812
/* Handle KeyStoreBuilderParameters */
809-
if (arg0 instanceof javax.net.ssl.KeyStoreBuilderParameters) {
810-
javax.net.ssl.KeyStoreBuilderParameters ksParams =
811-
(javax.net.ssl.KeyStoreBuilderParameters) arg0;
812-
java.util.List<java.security.KeyStore.Builder> builders =
813-
ksParams.getParameters();
813+
if (arg0 instanceof KeyStoreBuilderParameters) {
814+
KeyStoreBuilderParameters ksParams =
815+
(KeyStoreBuilderParameters) arg0;
816+
List<KeyStore.Builder> builders = ksParams.getParameters();
814817

815818
if (builders != null && !builders.isEmpty()) {
816819
try {
817820
/* Use the first KeyStore builder */
818-
java.security.KeyStore ks =
819-
builders.get(0).getKeyStore();
821+
KeyStore ks = builders.get(0).getKeyStore();
820822
WolfSSLDebug.log(getClass(), WolfSSLDebug.INFO,
821823
() -> "Initialized TrustManager from " +
822824
"KeyStoreBuilderParameters");

src/test/com/wolfssl/provider/jsse/test/WolfSSLContextTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@
5656
import com.wolfssl.WolfSSL;
5757
import com.wolfssl.provider.jsse.WolfSSLProvider;
5858

59+
import java.lang.reflect.Method;
60+
5961
public class WolfSSLContextTest {
6062

6163
private static WolfSSLTestFactory tf;
@@ -965,5 +967,36 @@ public void testWolfJSSEEnabledCipherSuites()
965967

966968
System.out.println("\t... passed");
967969
}
970+
971+
@Test
972+
public void testSanitizeProtocolsNullInput() {
973+
974+
System.out.print("\tTesting sanitizeProtocols(null)");
975+
976+
try {
977+
Class<?> utilClass = Class.forName(
978+
"com.wolfssl.provider.jsse.WolfSSLUtil");
979+
Method sanitizeMethod = utilClass.getDeclaredMethod(
980+
"sanitizeProtocols",
981+
String[].class,
982+
WolfSSL.TLS_VERSION.class);
983+
sanitizeMethod.setAccessible(true);
984+
985+
String[] result = (String[]) sanitizeMethod.invoke(
986+
null, (String[]) null, WolfSSL.TLS_VERSION.TLSv1_2);
987+
988+
if (result != null) {
989+
System.out.println("\t... failed");
990+
fail("sanitizeProtocols(null) should return null");
991+
return;
992+
}
993+
994+
System.out.println("\t\t... passed");
995+
996+
} catch (Exception e) {
997+
System.out.println("\t... failed");
998+
fail("Exception during sanitizeProtocols test: " + e.getMessage());
999+
}
1000+
}
9681001
}
9691002

src/test/com/wolfssl/provider/jsse/test/WolfSSLKeyX509Test.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1111,11 +1111,38 @@ public void testNullKeyStoreWithCachingDisabled()
11111111
pass("\t... passed");
11121112
}
11131113

1114+
/* Test that chooseAlias methods return aliases with private keys */
1115+
@Test
1116+
public void testChooseAliasSkipsCertOnlyEntries()
1117+
throws NoSuchAlgorithmException, KeyStoreException,
1118+
KeyManagementException, CertificateException, IOException,
1119+
NoSuchProviderException, UnrecoverableKeyException {
1120+
1121+
System.out.print("\tTesting chooseAlias skips cert-only");
1122+
1123+
KeyManager[] km = tf.createKeyManager("SunX509", tf.allJKS, provider);
1124+
X509ExtendedKeyManager x509km = (X509ExtendedKeyManager) km[0];
1125+
String alias;
1126+
1127+
alias = x509km.chooseClientAlias(new String[] { "RSA" }, null, null);
1128+
if (alias != null && x509km.getPrivateKey(alias) == null) {
1129+
fail("chooseClientAlias returned alias without private key");
1130+
}
1131+
1132+
alias = x509km.chooseEngineClientAlias(
1133+
new String[] { "RSA" }, null, null);
1134+
if (alias != null && x509km.getPrivateKey(alias) == null) {
1135+
fail("chooseEngineClientAlias returned alias without private key");
1136+
}
1137+
1138+
pass("\t... passed");
1139+
}
1140+
11141141
private void pass(String msg) {
11151142
WolfSSLTestFactory.pass(msg);
11161143
}
11171144

11181145
private void error(String msg) {
11191146
WolfSSLTestFactory.fail(msg);
11201147
}
1121-
}
1148+
}

src/test/com/wolfssl/provider/jsse/test/WolfSSLTrustX509Test.java

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,13 @@
4949
import java.security.cert.CertificateFactory;
5050
import java.security.cert.CertificateException;
5151
import java.security.cert.CertificateParsingException;
52+
import java.security.cert.PKIXParameters;
53+
import java.security.cert.TrustAnchor;
5254
import java.security.cert.X509Certificate;
55+
import java.security.InvalidAlgorithmParameterException;
56+
import java.util.Enumeration;
57+
import java.util.HashSet;
58+
import java.util.Set;
5359
import java.net.Socket;
5460
import java.net.InetSocketAddress;
5561
import javax.net.ssl.TrustManager;
@@ -67,6 +73,8 @@
6773
import javax.net.ssl.KeyManagerFactory;
6874
import javax.net.ssl.KeyManager;
6975
import javax.net.ssl.X509KeyManager;
76+
import javax.net.ssl.CertPathTrustManagerParameters;
77+
import javax.net.ssl.KeyStoreBuilderParameters;
7078

7179
import static org.junit.Assert.assertNotNull;
7280
import static org.junit.Assert.fail;
@@ -3342,6 +3350,95 @@ private void testX509ExtTrustMgrSSLSocketExtNoServerStartHandshakeSuccess()
33423350
}
33433351
}
33443352

3353+
/* Test TrustManagerFactory.init(CertPathTrustManagerParameters) */
3354+
@Test
3355+
public void testInitWithCertPathTrustManagerParameters()
3356+
throws NoSuchProviderException, NoSuchAlgorithmException,
3357+
KeyStoreException, IOException, CertificateException,
3358+
InvalidAlgorithmParameterException {
3359+
3360+
System.out.print("\tTesting init(CertPathTrustManagerParameters)");
3361+
3362+
/* Load CA certs and create TrustAnchors manually */
3363+
KeyStore caStore = KeyStore.getInstance(
3364+
WolfSSLTestFactory.isAndroid() ? "BKS" : "JKS");
3365+
InputStream stream = new FileInputStream(tf.caJKS);
3366+
caStore.load(stream, WolfSSLTestFactory.jksPass);
3367+
stream.close();
3368+
3369+
Set<TrustAnchor> anchors = new HashSet<TrustAnchor>();
3370+
Enumeration<String> aliases = caStore.aliases();
3371+
while (aliases.hasMoreElements()) {
3372+
String alias = aliases.nextElement();
3373+
Certificate cert = caStore.getCertificate(alias);
3374+
if (cert instanceof X509Certificate) {
3375+
anchors.add(new TrustAnchor((X509Certificate) cert, null));
3376+
}
3377+
}
3378+
3379+
if (anchors.isEmpty()) {
3380+
pass("\t... skipped (no certs)");
3381+
return;
3382+
}
3383+
3384+
PKIXParameters pkixParams = new PKIXParameters(anchors);
3385+
CertPathTrustManagerParameters certPathParams =
3386+
new CertPathTrustManagerParameters(pkixParams);
3387+
3388+
TrustManagerFactory tmf =
3389+
TrustManagerFactory.getInstance("SunX509", provider);
3390+
tmf.init(certPathParams);
3391+
3392+
TrustManager[] tms = tmf.getTrustManagers();
3393+
if (tms == null || tms.length == 0) {
3394+
fail("TrustManagers null/empty after CertPathParams init");
3395+
}
3396+
3397+
X509TrustManager x509tm = (X509TrustManager) tms[0];
3398+
if (x509tm.getAcceptedIssuers() == null ||
3399+
x509tm.getAcceptedIssuers().length == 0) {
3400+
fail("No accepted issuers after CertPathParams init");
3401+
}
3402+
3403+
pass("\t... passed");
3404+
}
3405+
3406+
/* Test TrustManagerFactory.init(KeyStoreBuilderParameters) */
3407+
@Test
3408+
public void testInitWithKeyStoreBuilderParameters()
3409+
throws NoSuchProviderException, NoSuchAlgorithmException,
3410+
KeyStoreException, IOException, CertificateException,
3411+
InvalidAlgorithmParameterException {
3412+
3413+
System.out.print("\tTesting init(KeyStoreBuilderParameters)");
3414+
3415+
KeyStore.Builder ksBuilder = KeyStore.Builder.newInstance(
3416+
WolfSSLTestFactory.isAndroid() ? "BKS" : "JKS",
3417+
null,
3418+
new File(tf.caJKS),
3419+
new KeyStore.PasswordProtection(WolfSSLTestFactory.jksPass));
3420+
3421+
KeyStoreBuilderParameters ksParams =
3422+
new KeyStoreBuilderParameters(ksBuilder);
3423+
3424+
TrustManagerFactory tmf =
3425+
TrustManagerFactory.getInstance("SunX509", provider);
3426+
tmf.init(ksParams);
3427+
3428+
TrustManager[] tms = tmf.getTrustManagers();
3429+
if (tms == null || tms.length == 0) {
3430+
fail("TrustManagers null/empty after KeyStoreBuilder init");
3431+
}
3432+
3433+
X509TrustManager x509tm = (X509TrustManager) tms[0];
3434+
if (x509tm.getAcceptedIssuers() == null ||
3435+
x509tm.getAcceptedIssuers().length == 0) {
3436+
fail("No accepted issuers after KeyStoreBuilder init");
3437+
}
3438+
3439+
pass("\t... passed");
3440+
}
3441+
33453442
private void pass(String msg) {
33463443
WolfSSLTestFactory.pass(msg);
33473444
}

0 commit comments

Comments
 (0)