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