Created
April 14, 2012 07:00
-
-
Save jhickner/2382543 to your computer and use it in GitHub Desktop.
hmac
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns oauth.digest | |
(:import (javax.crypto Mac) | |
(javax.crypto.spec SecretKeySpec))) | |
(defn hmac | |
"Calculate HMAC signature for given data." | |
[^String key ^String data] | |
(let [hmac-sha1 "HmacSHA1" | |
signing-key (SecretKeySpec. (.getBytes key) hmac-sha1) | |
mac (doto (Mac/getInstance hmac-sha1) (.init signing-key))] | |
(String. (org.apache.commons.codec.binary.Base64/encodeBase64 | |
(.doFinal mac (.getBytes data))) | |
"UTF-8"))) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(defn hmac-sha-256 | |
[key-seq byte-seq] | |
(let [hmac-key (SecretKeySpec. (byte-array key-seq) "HmacSHA256") | |
hmac (doto (Mac/getInstance "HmacSHA256") (.init hmac-key))] | |
(.doFinal hmac (byte-array byte-seq)))) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns compojure.crypto | |
"Functions for cryptographically signing, verifying and encrypting data." | |
(:use compojure.encodings) | |
(:use clojure.contrib.def) | |
(:use clojure.contrib.java-utils) | |
(:import java.security.SecureRandom) | |
(:import javax.crypto.Cipher) | |
(:import javax.crypto.KeyGenerator) | |
(:import javax.crypto.Mac) | |
(:import javax.crypto.spec.SecretKeySpec) | |
(:import javax.crypto.spec.IvParameterSpec) | |
(:import java.util.UUID)) | |
(defvar hmac-defaults | |
{:algorithm "HmacSHA256"} | |
"Default options for HMACs.") | |
(defvar encrypt-defaults | |
{:algorithm "AES" | |
:key-size 128 | |
:mode "CBC" | |
:padding "PKCS5Padding"} | |
"Default options for symmetric encryption.") | |
(defn- make-algorithm | |
"Return an algorithm string suitable for JCE from a map of options." | |
[options] | |
(str "AES/" (options :mode) "/" (options :padding))) | |
(defn- make-cipher | |
"Create an AES Cipher instance." | |
[options] | |
(Cipher/getInstance (make-algorithm options))) | |
(defn decrypt-bytes | |
"Decrypts a byte array with the given key and encryption options." | |
[options key data] | |
(let [options (merge encrypt-defaults options) | |
cipher (make-cipher options) | |
[iv data] (split-at (.getBlockSize cipher) data) | |
iv-spec (IvParameterSpec. (to-bytes iv)) | |
secret-key (SecretKeySpec. key (options :algorithm))] | |
(.init cipher Cipher/DECRYPT_MODE secret-key iv-spec) | |
(.doFinal cipher (to-bytes data)))) | |
(defn decrypt | |
"Base64 encodes and encrypts a string with the given key and algorithm." | |
[options key data] | |
(String. (decrypt-bytes options key (base64-decode-bytes data)))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
if someone will need a PHP-like version – take this
Different algo and will output hex, instead of UTF-8 formatted string