add key.public-key-from-string to get public key from String
This commit is contained in:
parent
87e0f0ca06
commit
eefbad3d55
3 changed files with 57 additions and 29 deletions
|
@ -1,4 +1,4 @@
|
|||
(defproject clj-jwt "0.0.2"
|
||||
(defproject clj-jwt "0.0.3"
|
||||
:description "Clojure library for JSON Web Token(JWT)"
|
||||
:url "https://github.com/liquidz/clj-jwt"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
@ -10,6 +10,4 @@
|
|||
[clj-time "0.5.0"]]
|
||||
|
||||
:profiles {:dev {:dependencies [[midje "1.5.1" :exclusions [org.clojure/clojure]]]}}
|
||||
:plugins [[lein-midje "3.0.0"]]
|
||||
|
||||
:main clj-jwt.core)
|
||||
:plugins [[lein-midje "3.0.0"]])
|
||||
|
|
|
@ -1,34 +1,44 @@
|
|||
(ns clj-jwt.key
|
||||
(:require [clojure.java.io :as io])
|
||||
(:import [org.bouncycastle.openssl PasswordFinder PEMReader]))
|
||||
(:import [org.bouncycastle.openssl PasswordFinder PEMReader]
|
||||
[java.io StringReader]))
|
||||
|
||||
(java.security.Security/addProvider
|
||||
(org.bouncycastle.jce.provider.BouncyCastleProvider.))
|
||||
(org.bouncycastle.jce.provider.BouncyCastleProvider.))
|
||||
|
||||
(defn- password-finder [s]
|
||||
(reify PasswordFinder
|
||||
(getPassword [this] (.toCharArray s))))
|
||||
|
||||
(defn- pem->key
|
||||
[filename & [pass-phrase]]
|
||||
(with-open [r (io/reader filename)]
|
||||
(let [pr (if pass-phrase
|
||||
(PEMReader. r (password-finder pass-phrase))
|
||||
(PEMReader. r))]
|
||||
(.readObject pr))))
|
||||
[reader pass-phrase]
|
||||
(if pass-phrase
|
||||
(.readObject (PEMReader. reader (password-finder pass-phrase)))
|
||||
(.readObject (PEMReader. reader))))
|
||||
|
||||
(defn private-key
|
||||
[& args]
|
||||
(.getPrivate (apply pem->key args)))
|
||||
[filename & [pass-phrase]]
|
||||
(with-open [r (io/reader filename)]
|
||||
(.getPrivate
|
||||
(pem->key r pass-phrase))))
|
||||
|
||||
(defn- public-key? [k]
|
||||
(let [typ (type k)]
|
||||
(or (= org.bouncycastle.jce.provider.JCERSAPublicKey typ)
|
||||
(= org.bouncycastle.jce.provider.JCEECPublicKey typ))))
|
||||
(= org.bouncycastle.jce.provider.JCEECPublicKey typ))))
|
||||
|
||||
(defn public-key
|
||||
[& args]
|
||||
(let [res (apply pem->key args)]
|
||||
(if (public-key? res)
|
||||
res
|
||||
(.getPublic res))))
|
||||
[filename & [pass-phrase]]
|
||||
(with-open [r (io/reader filename)]
|
||||
(let [res (pem->key r pass-phrase)]
|
||||
(if (public-key? res)
|
||||
res
|
||||
(.getPublic res)))))
|
||||
|
||||
(defn public-key-from-string
|
||||
[key-str & [pass-phrase]]
|
||||
(with-open [r (StringReader. key-str)]
|
||||
(let [res (pem->key r pass-phrase)]
|
||||
(if (public-key? res)
|
||||
res
|
||||
(.getPublic res)))))
|
||||
|
|
|
@ -3,37 +3,57 @@
|
|||
[clj-jwt.key :refer :all]
|
||||
[midje.sweet :refer :all]))
|
||||
|
||||
(facts "private key"
|
||||
(fact "rsa non encrypt key"
|
||||
(facts "rsa private key"
|
||||
(fact "non encrypt key"
|
||||
(type (private-key "test/files/rsa/no_pass.key"))
|
||||
=> org.bouncycastle.jce.provider.JCERSAPrivateCrtKey)
|
||||
|
||||
(fact "rsa crypted key"
|
||||
(fact "crypted key"
|
||||
(type (private-key "test/files/rsa/3des.key" "pass phrase"))
|
||||
=> org.bouncycastle.jce.provider.JCERSAPrivateCrtKey)
|
||||
|
||||
(fact "rsa crypted key wrong pass-phrase"
|
||||
(fact "crypted key wrong pass-phrase"
|
||||
(private-key "test/files/rsa/3des.key" "wrong pass phrase")
|
||||
=> (throws org.bouncycastle.openssl.EncryptionException))
|
||||
=> (throws org.bouncycastle.openssl.EncryptionException)))
|
||||
|
||||
(facts "ecdsa private key"
|
||||
(fact "ecdsa key"
|
||||
(type (private-key "test/files/ec/private.key"))
|
||||
=> org.bouncycastle.jce.provider.JCEECPrivateKey))
|
||||
|
||||
(facts "public key"
|
||||
(facts "rsa public key"
|
||||
(fact "rsa non encrypted key"
|
||||
(type (public-key "test/files/rsa/no_pass.key"))
|
||||
=> org.bouncycastle.jce.provider.JCERSAPublicKey)
|
||||
|
||||
(fact "rsa encrypted key"
|
||||
(type (public-key "test/files/rsa/3des.key" "pass phrase"))
|
||||
=> org.bouncycastle.jce.provider.JCERSAPublicKey
|
||||
)
|
||||
=> org.bouncycastle.jce.provider.JCERSAPublicKey)
|
||||
|
||||
(fact "rsa encrypted key with wrong pass phrase"
|
||||
(type (public-key "test/files/rsa/3des.key" "wrong pass phrase"))
|
||||
=> (throws org.bouncycastle.openssl.EncryptionException))
|
||||
|
||||
(fact "rsa non encrypted key from string"
|
||||
(-> "test/files/rsa/no_pass.key" slurp public-key-from-string type)
|
||||
=> org.bouncycastle.jce.provider.JCERSAPublicKey)
|
||||
|
||||
(fact "rsa encrypted key from string"
|
||||
(-> "test/files/rsa/3des.key" slurp (public-key-from-string "pass phrase") type)
|
||||
=> org.bouncycastle.jce.provider.JCERSAPublicKey)
|
||||
|
||||
(fact "rsa encrypted key with wrong pass phrase from string"
|
||||
(-> "test/files/rsa/3des.key" slurp (public-key-from-string "wrong pass phrase") type)
|
||||
=> (throws org.bouncycastle.openssl.EncryptionException))
|
||||
)
|
||||
|
||||
(facts "ecdsa public key"
|
||||
(fact "ecdsa public key"
|
||||
(type (public-key "test/files/ec/public.key"))
|
||||
=> org.bouncycastle.jce.provider.JCEECPublicKey))
|
||||
=> org.bouncycastle.jce.provider.JCEECPublicKey)
|
||||
|
||||
(fact "ecdsa public key from string"
|
||||
(-> "test/files/ec/public.key" slurp public-key-from-string type)
|
||||
=> org.bouncycastle.jce.provider.JCEECPublicKey)
|
||||
)
|
||||
|
||||
|
|
Loading…
Reference in a new issue