pax_global_header00006660000000000000000000000064131411643240014511gustar00rootroot0000000000000052 comment=c9acc475ab5ce0fcd1b7e12bfee3d20c3f438129 clj-digest-clojure-1.4.5/000075500000000000000000000000001314116432400152045ustar00rootroot00000000000000clj-digest-clojure-1.4.5/.hgignore000064400000000000000000000001121314116432400170010ustar00rootroot00000000000000syntax: glob README.html classes digest-*.jar lib pom.xml .lein-* target clj-digest-clojure-1.4.5/.hgtags000064400000000000000000000010051314116432400164560ustar00rootroot0000000000000075060291f6a6771f6a7fd45eec7417db3f5bbff5 1.1.0 59789123e3f9d5d54d204d7e9885158227abe51e 1.1.1 3a1f9492f43ff37b7140c6fd18be61ce483f88ed 1.2.0 f3896701371ef1f2a353d8261555a06234b6c652 1.2.1 23e9fa7f1ac8f3e1b130a48de147231b4c97d914 1.3.0 23e9fa7f1ac8f3e1b130a48de147231b4c97d914 1.3.0 3ebc187532835c3804e326b75e71768233ebaf68 1.3.0 c9dc449f535c5e0e362bcaab5647df430533d14b 1.4.1 05f938662bd5a3c122d705fecc97f04e209d0613 1.4.2 1d9208f7c8bd5f9bf4a7e3b244fba479642a0229 1.4.3 f9d486aa099478aa1b1058831b224aca5618f92f 1.4.4 clj-digest-clojure-1.4.5/.travis.yml000064400000000000000000000000221314116432400173070ustar00rootroot00000000000000language: clojure clj-digest-clojure-1.4.5/ChangeLog000064400000000000000000000010711314116432400167550ustar00rootroot000000000000002016-06-16 version 1.4.5 * Added licence to project.clj (@raxod502 in PR #4) * Clojure 1.8.0 2014-04-02 version 1.4.4 * Clojure 1.6 * README.rst -> README.md 2013-02-20 version 1.4.3 * Using protocols (thanks DerGuteMoritz) 2012-11-24 version 1.4.2 * Clojure 1.4 2012-11-24 version 1.4.1 * Fix file descriptor leak (thanks Craig Ludington) 2012-03-04 version 1.4.0 * Remove reflections (thanks naitik!) 2011-10-03 version 1.3.0 * Clojure 1.3.0 * def ^:dynamic 2011-02-27 version 1.2.1 * Fixed bug in signature padding clj-digest-clojure-1.4.5/README.md000064400000000000000000000016541314116432400164710ustar00rootroot00000000000000# digest [![Build Status](https://travis-ci.org/tebeka/clj-digest.svg?branch=master)](https://travis-ci.org/tebeka/clj-digest) `digest` - Message digest library for Clojure. Providing md5, sha-256, ... There are several digest function (such as `md5`, `sha-256` ...) in this namespace. Each can handle the following input types: * java.lang.String * byte array * java.io.File * java.io.InputStream * Sequence of byte array # Usage user=> (require 'digest) nil ; On a string user=> (digest/md5 "foo") "acbd18db4cc2f85cedef654fccc4a4d8" ; On a file user=> (use 'clojure.java.io) nil user=> (digest/sha-256 (as-file "/tmp/hello.txt")) "163883d3e0e3b0c028d35b626b98564be8d9d649ed8adb8b929cb8c94c735c59" # Installation Add `[digest "1.4.4"]` to your `project.clj`. # License Copyright© 2016 Miki Tebeka Distributed under the Eclipse Public License (same as Clojure). clj-digest-clojure-1.4.5/project.clj000064400000000000000000000005301314116432400173420ustar00rootroot00000000000000(defproject digest "1.4.5" :description "Digest algorithms (MD5, SHA ...) for Clojure" :author "Miki Tebeka " :url "https://bitbucket.org/tebeka/clj-digest/src" :license {:name "Eclipse Public License" :url "http://www.eclipse.org/legal/epl-v10.html"} :dependencies [[org.clojure/clojure "1.8.0"]]) clj-digest-clojure-1.4.5/push-to-clojars.sh000075500000000000000000000006431314116432400206000ustar00rootroot00000000000000#!/bin/bash # Push to clojars set -x set -e if [ ! -f project.clj ]; then echo "error: can't find project.clj" 1>&2 exit 1 fi project=$(grep defproject project.clj | awk '{print $2}') version=$(egrep -o "[0-9]+\.[0-9]+\.[0-9]+(-SNAPSHOT)?" project.clj | head -1) jar=target/$project-${version}.jar if [ -f $jar ]; then rm $jar fi lein jar lein pom scp pom.xml $jar clojars@clojars.org: rm pom.xml $jar clj-digest-clojure-1.4.5/src/000075500000000000000000000000001314116432400157735ustar00rootroot00000000000000clj-digest-clojure-1.4.5/src/digest.clj000064400000000000000000000053521314116432400177510ustar00rootroot00000000000000(ns digest #^{ :author "Miki Tebeka " :doc "Message digest algorithms for Clojure"} (:use [clojure.string :only (split lower-case)]) (:import java.util.Arrays (java.security MessageDigest Security Provider) (java.io FileInputStream File InputStream))) ; Default buffer size for reading (def ^:dynamic *buffer-size* 1024) (defn- read-some "Read some data from reader. Return [data size] if there's more to read, otherwise nil." [^InputStream reader] (let [^bytes buffer (make-array Byte/TYPE *buffer-size*) size (.read reader buffer)] (when (> size 0) (if (= size *buffer-size*) buffer (Arrays/copyOf buffer size))))) (defn- byte-seq "Return a sequence of [data size] from reader." [^InputStream reader] (take-while (complement nil?) (repeatedly (partial read-some reader)))) (defn- signature "Get signature (string) of digest." [^MessageDigest algorithm] (let [size (* 2 (.getDigestLength algorithm)) sig (.toString (BigInteger. 1 (.digest algorithm)) 16) padding (apply str (repeat (- size (count sig)) "0"))] (str padding sig))) (defprotocol Digestible (-digest [message algorithm])) (extend-protocol Digestible (class (make-array Byte/TYPE 0)) (-digest [message algorithm] (-digest [message] algorithm)) java.util.Collection ;; Code "borrowed" from ;; * http://www.holygoat.co.uk/blog/entry/2009-03-26-1 ;; * http://www.rgagnon.com/javadetails/java-0416.html (-digest [message algorithm] (let [^MessageDigest algo (MessageDigest/getInstance algorithm)] (.reset algo) (doseq [^bytes b message] (.update algo b)) (signature algo))) String (-digest [message algorithm] (-digest [(.getBytes message)] algorithm)) InputStream (-digest [reader algorithm] (-digest (byte-seq reader) algorithm)) File (-digest [file algorithm] (with-open [f (FileInputStream. file)] (-digest f algorithm))) nil (-digest [message algorithm] nil)) (defn digest "Returns digest for message with given algorithm." [algorithm message] (-digest message algorithm)) (defn algorithms [] "List support digest algorithms." (let [providers (into [] (Security/getProviders)) names (mapcat (fn [^Provider p] (enumeration-seq (.keys p))) providers) digest-names (filter #(re-find #"MessageDigest\.[A-Z0-9-]+$" %) names)] (set (map #(last (split % #"\.")) digest-names)))) (defn- create-fns [] "Create utility function for each digest algorithms. For example will create an md5 function for MD5 algorithm." (dorun (map #(intern 'digest (symbol (lower-case %)) (partial digest %)) (algorithms)))) ; Create utililty functions such as md5, sha-2 ... (create-fns) clj-digest-clojure-1.4.5/test/000075500000000000000000000000001314116432400161635ustar00rootroot00000000000000clj-digest-clojure-1.4.5/test/debian.png000064400000000000000000000150641314116432400201210ustar00rootroot00000000000000PNG  IHDR(sRGBbKGD pHYs+tIME/mtEXtCommentfor dwww IDATx^ xU_[B$! "j 2NhӢ3*. v:;nM" d_ߛ߹yW,}SWy/U{9{P(]B֩VsY޴!O^W]Z_ʁs“V^c`mξdp{u퇞piMyCmi9rھSjjju?ٛJR/ i zຯr/{C).ջǞaMR@/J)Uz/qOs9>i9 2߿/ښ={voqmmmo.m ?kzjh(Z sW=CsV鐋BU'jɈ8߯}/mWfjR* xBmׄڂA#d`8Յ[3#(3%%宪ھhGh$%%ҲP #ohhJ3禢 54M>d9ap}'][x`XS#s483H-ZR3%ƥxb We,`Sf&֬D#s}Dx[yyy?ͳ_4ni[W*˚wEH2ůosˏ T ΐҌP?[KˌIE*B`3 EkfQ6-LSa&P# d5 VғNV.-Mlj%VGe}6 @OhUY-WkkkΝ;zKoaYՇ]Xr;z:se8uQ.+- ,bd)[f{_Qtzn\'EyVFY{dz#˵<..N;{eǺЭKyRSS+1gi q7>Cc= U:3rTzQQoM*Vm ][f>6N+,6OQz<9ڰp52'WAEW?'~@" XLKg"teObp_ _e5Tm$M^m=ݶlٲLzzz eYbv#nc?f X幗p(m=vy0Ak;gyoҙ H;vl\`pSO=,qOҶ3fLs1c({ܣH4CxY(s8pn&]^YK]r['ܐh9漅Nav2 + Ql(#,'wF-'\i483w<*CK9| ̠moP#4ϟQtBh{od|_~'SvVʊ#V~6Z]G/i) 7Eyaߙ,t&ScW}P@UIيA]݀j @Wޗ pKfc/Y:ؘ,t05ꊑ/ 0k#H`q*WSm„ C+#؁Bkyo%FY@ Xfި]æ&4Q Yט,m":]K:i*Lå_/]\d2*쪜`}Sdjig/C<[Ӥ}44|qZگEnbX>jf,'EC1{àe ɷAr ~_Kbmu1>aDeee%CS#"kz 4F)Xko[ui"0}st-)//QaecG13.}6!˶ d;t~}>?3:/ك-1g~>]P^ c-XnAy(/,Y^~{9&0q\z<ڃK1F+i }Ƅ40;vB#*DF 6X" %woza|lJԡL&c?3yأ(LEs݃Π6eʔt:[MHhIi*fգB#`ѵ@byLKH>+e+T)c@(д/9OR_{.{Q)Ž4X&B:B0F+6! d(z+dr[E]}ԧZ:s b=&`Iy4;hmȋ,cQcaREe=^Z{@8,;,v 3:͒$mɽF"WiHYCg(SAaÎنqd&~Y;jkk3cXC v $Nj!`!1D%g;pt1hG7K$N[T@,}L&-k$AFgX^K`-n[K~^2suyBI5X[w+~m{ hRì]fJ\2Ƕ^2J-Q@R59Q4LY}N=G&2 $Jc:4D p^&+D{L3pfټ1&h% /A~kIq%̌C/>ɗ`vY,I;xIOIWhn5hܢjxW u{Z|΀ so.O`%5fݏ>h K\2lE= /X !RHV4k!\e'`RT;V z,<UrXJSg'Z-a׋\ z@F7lDl1 Z xSf[A3Neٽn͵. aXx)Xe1Ržx13P}ypPW>"9stX(Gdcl6زpD~3,f>ck9PQqAiۈ`D B%Li:VA媒WeF>\ќD+ ?#^auoEbȨd8eM7d ,; -TnvjIWĘ9íݛ5 ~MҐm&KoB;L ^{]bQ> >2w&/:ߣ 8mrw B9A5*E|8t\݇2NUh;/{I1a`e]Vp5j]7d[leht\~Xl)Ǭo:ąpB>˴.Ee1ҧ k`t,_❗MNqX'e|0/$tK˫`ʿ_!ĀX.؃׎ܳKu-/iwb K/..^Xڜɬmz{" *clB v;O[d47 0cP/*~Ol_Œgխy5T>+;79}Ck|3Zȱr>*?[_QLg0mMl e&o0ba*̚S_~ <nTM=TD]p`;fĉ ; aФI·aDf9i9*tӧKhHPT}G z/pJLKh YƁqv6^'Xf?'XT [;l3VWͻk6@"NF%^x*a;lZwߝ <LNy @syM,+{bɢax]ـ zדpo"v7zk֬N{Mxoy*# \xF8VƱw&I|v,ۼgcVסJ%LNDGÏEu-d[>.ϻ4&UڣMhLyc^x|Ty?6HdTDyI9"k>kO%Cc_}YK vOO2^;.^ hS%?rX.1o91tR2F2: ȪI$6RA"mERjbTˆs7 ÍDQ~%9=P~)BL'/}n,K€v 5EKܭcj]byvsjg:Q8}w.5Y>v`>P PKaUM6DVtE{:u+g-IEsaIq<>C4~vrj8Dڕ^hkEp)QFi./3^I Gk$SG:n2x(HY&[vAfrY:'Wyu[)9:s<% I1d9t9^䏘+ue#߿y-o-2f˹#=Csmq|H'ʉC!R_;u~C;$I4( N9qe*RF}gtﶷ&OڲD1]1K qj/N`o_)x''oaq])Q0C~_2+m1h wIN AqMd?tG9HN eu8\%W" ;c7=ᠱ~fo%l7g$%69 Gư ն4T7o{dדuDc.#ro&Q 3~?v,$X[|>B{tw[\ND|N L]7oL8Ɇ^=`3F}Q`tNǧE&CKY3+L'm޼p42TGf~5]&Ա%.)$!!R7,t0Ryχˡ5̻f+GyK7{7r湱E Yҽ*(&,lIûN6\xg]n;v콙`)e$$H{Yb&%;¼p%1DneqoZƍi $1~.JxIENDB`clj-digest-clojure-1.4.5/test/digest_test.clj000064400000000000000000000020551314116432400211750ustar00rootroot00000000000000(ns digest-test (:use [digest] :reload-all) (:use [clojure.string :only (lower-case)]) (:use [clojure.test]) (:import java.io.File)) (deftest md5-test (is (= (digest "md5" "foo") "acbd18db4cc2f85cedef654fccc4a4d8"))) (deftest sha-256-test (is (= (sha-256 "foo") "2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"))) (deftest algorithms-test (let [names (algorithms)] (is not (empty? names)) (is (names "SHA-1")))) (deftest utils-test (for [name (algorithms)] (dorun (is (ns-resolve *ns* (symbol (lower-case name))))))) (def ^:dynamic *logo-md5* "59ef6e166bab377a48a348be2ac46c15") (def ^:dynamic *logo-sha256* "ff83aa6a4f8597ef45742e4c4837f1964fa14bd64a950388bce0bfe987acbd32") (deftest file-test (let [f (File. "test/clojure.png")] (is (= (md5 f) *logo-md5*)) (is (= (sha-256 f) *logo-sha256*)))) ; Just making sure that we don't explode on nil (deftest nil-test (md5 nil)) (deftest length-test (is (= (sha (File. "test/length.txt")) "007b65165b253172d054189e8e3175f3bcb9e28e"))) clj-digest-clojure-1.4.5/test/length.txt000064400000000000000000000000151314116432400202010ustar00rootroot00000000000000blah bar baz