diff --git a/core/java/test/junit/resources/i2pseeds.su3 b/core/java/test/junit/resources/i2pseeds.su3
new file mode 100644
index 0000000000000000000000000000000000000000..94699305e669abfbffcdfd62af0a0c02a29105b7
Binary files /dev/null and b/core/java/test/junit/resources/i2pseeds.su3 differ
diff --git a/core/java/test/junit/resources/keystore.ks b/core/java/test/junit/resources/keystore.ks
new file mode 100644
index 0000000000000000000000000000000000000000..a7c2aa71934669533b48a4f06c2dceec5dc358f9
Binary files /dev/null and b/core/java/test/junit/resources/keystore.ks differ
diff --git a/core/java/test/junit/resources/meeh_at_mail.i2p.crt b/core/java/test/junit/resources/meeh_at_mail.i2p.crt
new file mode 100644
index 0000000000000000000000000000000000000000..6014c96f789c4ba5f2edeaca7761f1279bbc2e46
--- /dev/null
+++ b/core/java/test/junit/resources/meeh_at_mail.i2p.crt
@@ -0,0 +1,32 @@
+-----BEGIN CERTIFICATE-----
+MIIFeTCCA2GgAwIBAgIEZZozujANBgkqhkiG9w0BAQ0FADBtMQswCQYDVQQGEwJY
+WDELMAkGA1UECBMCWFgxCzAJBgNVBAcTAlhYMR4wHAYDVQQKExVJMlAgQW5vbnlt
+b3VzIE5ldHdvcmsxDDAKBgNVBAsTA0kyUDEWMBQGA1UEAwwNbWVlaEBtYWlsLmky
+cDAeFw0xNDA2MjgyMjQ5MDlaFw0yNDA2MjcyMjQ5MDlaMG0xCzAJBgNVBAYTAlhY
+MQswCQYDVQQIEwJYWDELMAkGA1UEBxMCWFgxHjAcBgNVBAoTFUkyUCBBbm9ueW1v
+dXMgTmV0d29yazEMMAoGA1UECxMDSTJQMRYwFAYDVQQDDA1tZWVoQG1haWwuaTJw
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnVnmPE4uUvCky0yCnnVH
+cJEDqzwDPupx0zr0YDlhZk5VOPPecx5haayJ/V6nXPc1aVVWn+CHfedcF2aBgN4K
+5aBueS/l6l5WHcv02DofAqlTmyAws3oQeR1qoTuW24cKRtLR7h5bxv63f6bgp6e+
+RihFNez6UxErnRPuJOJEO2Im6EgVp6fz7tQ7R35zxAUeES2YILPySvzy2vYm/EEG
+jXX7Ap2A5svVo90xCMOeUZ/55vLsjyIshN+tV87U4xwvAkUmwsmWVHm3BQpHkI6z
+zMJie6epB8Bqm0GYm0EcElJH4OCxGTvDLoghpswbuUO7iy3JSfoL7ZCnoiQdK9K4
+yVVChj8lG+r7KaTowK96iZep+sZefjOt5VFGuW2Fi/WBv3ldiLlJAo/ZfrUM4+vG
+fyNBXbl6bX87uTCGOT1p3dazo+zJMsAZ+Y93DlM/mDEWFa1kKNrs74syzaWEqF4L
+KQE6VoYn80OOzafSigTVQgSwUtQtB0XGhMzJhyxU2XHWe1LFIy7Pta0B+lDiZj7c
+I8nXxYjsDfEu/Elj/Ra9N6bH0awmgB5JDa+Tbir+oEM5SyDfpSaCGuatdGxjweGI
+kVmFU0SqCZV/8TXbIu6MUVzTZMZVT94edifFSRad4fqw7eZbSXlPu++3d1/btn6h
+ibM04nkv0mm+FxCKB/wdAkECAwEAAaMhMB8wHQYDVR0OBBYEFO7jIkSRkoXyJcho
+9/Q0gDOINa5EMA0GCSqGSIb3DQEBDQUAA4ICAQBzfWO7+8HWOKLaYWToJ6XZbpNF
+3wXv1yC4W/HRR80m4JSsq9r0d7838Nvd7vLVP6MY6MaVb/JnV76FdQ5WQ6ticD0Y
+o3zmpqqbKVSspN0lrkig4surT88AjfVQz/vEIzKNQEbpzc3hC2LCiE2u+cK/ix4j
+b9RohnaPvwLnew5RNQRpcmk+XejaNITISr2yQIwXL7TEYy8HdGCfzFSSFhKe9vkb
+GsWS5ASrUzRoprswmlgRe8gEHI+d51Z7mWgna0/5mBz9bH/3QXtpxlLWm3bVV+kt
+pZjQDTHE0GqG2YsD1Gmp4LU/JFhCojMTtiPCXmr9KFtpiVlx06DuKm5PC8Ak+5w+
+m/DQYYfv9z+AA5Y430bjnzwg67bhqVyyek4wcDQinFswv3h4bIB7CJujDcEqXXza
+lhG1ufPPCUTMrVjh7AShohZraqlSlyQPY9vEppLwD4W1d+MqDHM7ljOH7gQYaUPi
+wE30AdXEOxLZcT3aRKxkKf2esNofSuUC/+NXQvPjpuI4UJKO3eegi+M9dbnKoNWs
+MPPLPpycecWPheFYM5K6Ao63cjlUY2wYwCfDTFgjA5q8i/Rp7i6Z6fLE3YWJ4VdR
+WOFB7hlluQ//jMW6M1qz6IYXmlUjcXl81VEvlOH/QBNrPvX3I3SYXYgVRnVGUudB
+o3eNsanvTU+TIFBh2Q==
+-----END CERTIFICATE-----
diff --git a/core/java/test/junit/resources/publicKeyFile.crt b/core/java/test/junit/resources/publicKeyFile.crt
new file mode 100644
index 0000000000000000000000000000000000000000..b4974efeea9bb66ce9bceaacc58336232e22664b
--- /dev/null
+++ b/core/java/test/junit/resources/publicKeyFile.crt
@@ -0,0 +1,12 @@
+-----BEGIN CERTIFICATE-----
+MIIB1jCCAYagAwIBAgIIDzyykH5nzvUwBwYDK2VlBQAwUTEeMBwGA1UEBxMVSTJQ
+IEFub255bW91cyBOZXR3b3JrMQwwCgYDVQQLEwNJMlAxITAfBgNVBAMMGG1lZWgu
+c2NhbGF0ZXN0c0BtYWlsLmkycDAeFw0xODAzMjYxOTE0MjZaFw0yODAzMjUxOTE0
+MjZaMFExHjAcBgNVBAcTFUkyUCBBbm9ueW1vdXMgTmV0d29yazEMMAoGA1UECxMD
+STJQMSEwHwYDVQQDDBhtZWVoLnNjYWxhdGVzdHNAbWFpbC5pMnAwLTAIBgMrZWQK
+AQEDIQCaYkkPeLv5lxLu01fs/L0dD/rq2RYAFOMu16+1UPlbBKN3MHUwHQYDVR0O
+BBYEFMdstwMszJ/2GkGGt8SYNDrYaiQ1MB8GA1UdIwQYMBaAFMdstwMszJ/2GkGG
+t8SYNDrYaiQ1MA4GA1UdDwEB/wQEAwIBpjAjBgNVHREEHDAagRhtZWVoLnNjYWxh
+dGVzdHNAbWFpbC5pMnAwBwYDK2VlBQADQQAagw8ZKDz0YkrVadMEo2Tq0xspe3YQ
+ZKVYzhpj3dGf0JHq/K5FPuAQcRYOIc7UEsJC0ine7BMUC3bUyKq5B3IP
+-----END CERTIFICATE-----
diff --git a/core/java/test/scalatest/net/i2p/crypto/CertUtilSpec.scala b/core/java/test/scalatest/net/i2p/crypto/CertUtilSpec.scala
new file mode 100644
index 0000000000000000000000000000000000000000..63c5d5095cb632d220432d5c8e2b32f79aaeca3b
--- /dev/null
+++ b/core/java/test/scalatest/net/i2p/crypto/CertUtilSpec.scala
@@ -0,0 +1,30 @@
+package net.i2p.crypto
+
+import java.io.File
+import java.security.cert.X509Certificate
+
+import org.scalatest.FunSpec
+import org.scalatest.Matchers
+
+
+class CertUtilSpec extends FunSpec with Matchers {
+
+  describe("CertUtil") {
+    // For some stupid gradle issues, it don't copies reosurces. So hacky way.
+    // When added to junit directory, it get copied. Until a better way is found,
+    // this is the non-optimal solution.
+    val certFileUrl = getClass.getResource("/resources/meeh_at_mail.i2p.crt")
+    val certFile = new File(certFileUrl.toURI)
+
+    it("should be able to read a certificate") {
+      val cert: X509Certificate = CertUtil.loadCert(certFile)
+      assert(cert.getSubjectDN.toString === "CN=meeh@mail.i2p, OU=I2P, O=I2P Anonymous Network, L=XX, ST=XX, C=XX")
+    }
+
+    it("should be able to tell if it's revoked or not") {
+      val cert: X509Certificate = CertUtil.loadCert(certFile)
+      assert(CertUtil.isRevoked(cert) === false)
+    }
+
+  }
+}
diff --git a/core/java/test/scalatest/net/i2p/crypto/SU3FileSpec.scala b/core/java/test/scalatest/net/i2p/crypto/SU3FileSpec.scala
new file mode 100644
index 0000000000000000000000000000000000000000..a694631c1cfcded9504784ec0b558a0ff1d9f7aa
--- /dev/null
+++ b/core/java/test/scalatest/net/i2p/crypto/SU3FileSpec.scala
@@ -0,0 +1,30 @@
+package net.i2p.crypto
+
+import java.io.File
+
+import org.scalatest.FunSpec
+import org.scalatest.Matchers
+
+
+class SU3FileSpec extends FunSpec with Matchers {
+
+  def cheater(methodName : String, parameters: (AnyRef,Class[_])*): AnyRef = {
+    val parameterValues = parameters.map(_._1)
+    val parameterTypes = parameters.map(_._2)
+    val method = classOf[SU3File].getDeclaredMethod(methodName, parameterTypes:_*)
+    method.setAccessible(true)
+    method.invoke(classOf[SU3File], parameterValues:_*)
+  }
+
+  describe("SU3File") {
+    val certFileUrl = getClass.getResource("/resources/meeh_at_mail.i2p.crt")
+    val certFile = new File(certFileUrl.toURI)
+
+    val seedFileUrl = getClass.getResource("/resources/i2pseeds.su3")
+    val seedFile = new File(seedFileUrl.toURI)
+
+    it("should be able to verify a valid file") {
+      cheater("verifySigCLI", (seedFile.getAbsolutePath, classOf[String]), (certFile.getAbsolutePath, classOf[String]))
+    }
+  }
+}
\ No newline at end of file