    (instance? IFn engine) (engine)
    (instance? BlockCipher engine) engine))
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Internal implementations
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defn key->poly1305key
+(defn- key->poly1305key
   "Noramalizes any length byte array key to poly1305
   formatted byte array key.
 

    (Poly1305KeyGenerator/clamp bkey)
    bkey))

(defn- make-poly1305-plain-impl
  "Calculate the poly1305 message authentication code
  for byte array objects."
  [^bytes input ^bytes pkey ^bytes iv ^Keyword alg]
  (let [engine (resolve-engine alg)
        mac    (Poly1305. engine)
        out    (byte-array 16)
        kp     (KeyParameter. (key->poly1305key pkey))
        pwi    (ParametersWithIV. kp iv)]
    (doto mac
      (.init pwi)
      (.update input 0 (count input))
      (.doFinal out 0))
    out))

(defn- make-poly1305-stream-impl
  "Calculate the poly1305 message authentication code
  for file like objects in most memory efficient way."
  [^java.io.InputStream stream ^bytes pkey ^bytes iv ^Keyword alg]
  (let [engine (resolve-engine alg)
        mac    (Poly1305. engine)
        out    (byte-array 16)
        kp     (KeyParameter. (key->poly1305key pkey))
        pwi    (ParametersWithIV. kp iv)
        bfr    (byte-array 5120)]
    (.init mac pwi)
    (loop []
      (let [readed (.read stream bfr 0 5120)]
        (when-not (= readed -1)
          (.update mac bfr 0 readed)
          (recur))))
    (.doFinal mac out 0)
    out))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Low level interface

           clojure.lang.Keyword
           buddy.Arrays))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Low level hmac engine.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(def ^{:doc "Default engine factories."
       :dynamic true}
