Browse Source

feat(rtc,crypt): add ns frontend.worker.rtc.crypt

rcmerci 1 year ago
parent
commit
de8b0b7a42
1 changed files with 59 additions and 0 deletions
  1. 59 0
      src/main/frontend/worker/rtc/crypt.cljs

+ 59 - 0
src/main/frontend/worker/rtc/crypt.cljs

@@ -0,0 +1,59 @@
+(ns frontend.worker.rtc.crypt
+  "Fns to en/decrypt some block attrs"
+  (:require [promesa.core :as p]))
+
+(defonce ^:private encoder (new js/TextEncoder "utf-8"))
+(defonce ^:private decoder (new js/TextDecoder "utf-8"))
+
+(defn <encrypt
+  [message public-key]
+  (let [data (.encode encoder message)]
+    (js/crypto.subtle.encrypt
+     #js{:name "RSA-OAEP"}
+     public-key
+     data)))
+
+(defn <decrypt
+  [cipher-text private-key]
+  (p/let [result (js/crypto.subtle.decrypt
+                  #js{:name "RSA-OAEP"}
+                  private-key
+                  cipher-text)]
+    (.decode decoder result)))
+
+(defonce ^:private key-algorithm
+  #js{:name "RSA-OAEP"
+      :modulusLength 4096
+      :publicExponent (new js/Uint8Array #js[1 0 1])
+      :hash "SHA-256"})
+
+(defn <gen-key-pair
+  []
+  (p/let [result (js/crypto.subtle.generateKey
+                  key-algorithm
+                  true
+                  #js["encrypt", "decrypt"])]
+    (js->clj result :keywordize-keys true)))
+
+(defn <export-key
+  [key']
+  (js/crypto.subtle.exportKey "jwk" key'))
+
+(defn <import-public-key
+  [jwk]
+  (js/crypto.subtle.importKey "jwk" jwk key-algorithm true #js["encrypt"]))
+
+(defn <import-private-key
+  [jwk]
+  (js/crypto.subtle.importKey "jwk" jwk key-algorithm true #js["decrypt"]))
+
+
+(comment
+  (p/let [{:keys [publicKey privateKey]} (<gen-key-pair)]
+    (p/doseq [msg (map #(str "message" %) (range 1000))]
+      (p/let [encrypted (<encrypt msg publicKey)
+              ;; plaintxt (<decrypt encrypted privateKey)
+              ]
+        (prn :encrypted msg)
+        ;; (prn :plaintxt plaintxt)
+        ))))