         opts (Object)
   Returns
         (Key) An instance of the Key class wrapping the raw key bytes"
-  []
-  )
+  [k-str {:keys [algorithm curve ephemeral]}]
+  ;; (def b64-str (-> pub .getEncoded b64/encode String.))
+  ;;  {algorithm :ECDSA :curve :secp256r1}
+  (let [decoded-bytes (b64/decode (.getBytes ^String k-str))
+        key-factory (-> algorithm
+                        name
+                        (KeyFactory/getInstance BouncyCastleProvider/PROVIDER_NAME))
+        param-specs (-> curve name ECNamedCurveTable/getParameterSpec)
+        point (.decodePoint (.getCurve param-specs) decoded-bytes)]
+    (.generatePublic key-factory )))
 
 ;;;getKey
 (defn get-key

  ;; Derives the new private key from the source public key using the parameters passed in the opts.
  ;; This operation is needed for deriving private keys corresponding to the Transaction
  ;; Certificates.
  (%derive-key k opts))

;;; importKey

        “ephemeral”.
  Returns
        Result (Key): The key object"
  [algorithm {:keys [curve ephemeral]}]
  (let [generator (-> algorithm
                      name
                      (KeyPairGenerator/getInstance BouncyCastleProvider/PROVIDER_NAME))
        param-specs (-> curve name ECNamedCurveTable/getParameterSpec)]
    (.initialize generator param-specs (SecureRandom.))
    (.generateKeyPair generator)))
;;;
;;; Ex - (generate-key :ECDSA :secp256r1)
;;; 

(defprotocol IBCECKey
  (algorithm [this])
  (curve-spec [this])
  (curve-params [this])
  (%derive-key [this opts]))

(defn- %curve-params [params]
  ;; (.multiply g (biginteger 100000000000000000000))
