dog-and-duck/src/clj_activitypub/internal/crypto.clj
2022-12-19 23:39:24 +00:00

40 lines
1.3 KiB
Clojure

(ns clj-activitypub.internal.crypto
"copied from [Jahfer's clj-activitypub library](https://github.com/jahfer/clj-activitypub).
If and when Jahfer issues a release of that library, this directory will be deleted and a
dependency on that library will be added to the project."
(:require [clojure.java.io :as io])
(:import (java.util Base64)
(java.security MessageDigest SecureRandom Signature)))
(java.security.Security/addProvider
(org.bouncycastle.jce.provider.BouncyCastleProvider.))
(defn- keydata [reader]
(->> reader
(org.bouncycastle.openssl.PEMParser.)
(.readObject)))
(defn- pem-string->key-pair [string]
(let [kd (keydata (io/reader (.getBytes string)))]
(.getKeyPair (org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter.) kd)))
(defn private-key [private-pem-str]
(-> private-pem-str
(pem-string->key-pair)
(.getPrivate)))
(defn base64-encode [bytes]
(.encodeToString (Base64/getEncoder) bytes))
(defn sha256-base64 [data]
(let [digest (.digest (MessageDigest/getInstance "SHA-256") (.getBytes data))]
(base64-encode digest)))
(defn sign [data private-key]
(let [bytes (.getBytes data)
signer (doto (Signature/getInstance "SHA256withRSA")
(.initSign private-key (SecureRandom.))
(.update bytes))]
(.sign signer)))