40 lines
1.3 KiB
Clojure
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)))
|
|
|