diff --git a/src/babashka/impl/classes.clj b/src/babashka/impl/classes.clj index bfe2f789..9913d715 100644 --- a/src/babashka/impl/classes.clj +++ b/src/babashka/impl/classes.clj @@ -223,6 +223,7 @@ java.net.http.WebSocket$Listener java.security.cert.X509Certificate java.security.cert.CertificateFactory + java.security.Signature javax.crypto.Cipher javax.crypto.KeyAgreement javax.crypto.Mac @@ -783,6 +784,8 @@ java.io.Console (instance? java.security.KeyPairGenerator v) java.security.KeyPairGenerator + (instance? java.security.Signature v) + java.security.Signature (instance? java.util.Set v) java.util.Set (instance? java.io.Closeable v) diff --git a/test/babashka/interop_test.clj b/test/babashka/interop_test.clj index f43d66bb..2edf710e 100644 --- a/test/babashka/interop_test.clj +++ b/test/babashka/interop_test.clj @@ -131,3 +131,39 @@ (deftest clojure-1_12-array-test (is (true? (bb nil "(instance? Class long/1)")))) + +(deftest keygen-test + (is (true? + (bb nil + '(do (ns keygen + (:import [java.security KeyPairGenerator Signature])) + + (defn generate-key-pair + "Generates a public/private key pair." + [] + (let [keygen (KeyPairGenerator/getInstance "RSA")] + (.initialize keygen 2048) + (.generateKeyPair keygen))) + + (defn create-signature + "Signs the given message using the private key." + [private-key message] + (let [signature (Signature/getInstance "SHA256withRSA")] + (.initSign signature private-key) + (.update signature (.getBytes message "UTF-8")) + (.sign signature))) + + (defn verify-signature + "Verifies the given signed data using the public key." + [public-key message signed-data] + (let [signature (Signature/getInstance "SHA256withRSA")] + (.initVerify signature public-key) + (.update signature (.getBytes message "UTF-8")) + (.verify signature signed-data))) + + (let [key-pair (generate-key-pair) + private-key (.getPrivate key-pair) + public-key (.getPublic key-pair) + message "This is a secret message" + signed-data (create-signature private-key message)] + (verify-signature public-key message signed-data)))))))