001 (ns clj-activitypub.internal.crypto
002 (:require [clojure.java.io :as io])
003 (:import (java.util Base64)
004 (java.security MessageDigest SecureRandom Signature)))
005
006 (java.security.Security/addProvider
007 (org.bouncycastle.jce.provider.BouncyCastleProvider.))
008
009 (defn- keydata [reader]
010 (->> reader
011 (org.bouncycastle.openssl.PEMParser.)
012 (.readObject)))
013
014 (defn- pem-string->key-pair [string]
015 (let [kd (keydata (io/reader (.getBytes string)))]
016 (.getKeyPair (org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter.) kd)))
017
018 (defn private-key [private-pem-str]
019 (-> private-pem-str
020 (pem-string->key-pair)
021 (.getPrivate)))
022
023 (defn base64-encode [bytes]
024 (.encodeToString (Base64/getEncoder) bytes))
025
026 (defn sha256-base64 [data]
027 (let [digest (.digest (MessageDigest/getInstance "SHA-256") (.getBytes data))]
028 (base64-encode digest)))
029
030 (defn sign [data private-key]
031 (let [bytes (.getBytes data)
032 signer (doto (Signature/getInstance "SHA256withRSA")
033 (.initSign private-key (SecureRandom.))
034 (.update bytes))]
035 (.sign signer)))
036