<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: digest code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Mon, 18 Aug 2008 20:29:11 GMT</pubDate>
    <description>DZone Snippets: digest code</description>
    <item>
      <title>md5 digest hash in newLISP</title>
      <link>http://snippets.dzone.com/posts/show/2591</link>
      <description>;;; md5 in newLISP&lt;br /&gt;&lt;br /&gt;;;&lt;br /&gt;;; based on RFC 1321&lt;br /&gt;;;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(define (F x y z)&lt;br /&gt;  (| (&amp; x y) (&amp; (&amp; 0xffffffff (~ x)) z)))&lt;br /&gt;&lt;br /&gt;(define (G x y z)&lt;br /&gt;  (| (&amp; x z) (&amp; y (&amp; 0xffffffff (~ z)))))&lt;br /&gt;&lt;br /&gt;(define (H x y z)&lt;br /&gt;  (^ x y z))&lt;br /&gt;&lt;br /&gt;(define (I x y z)&lt;br /&gt;  (^ y (| x (&amp; 0xffffffff (~ z)))))&lt;br /&gt;&lt;br /&gt;(define (rotate-left x n)&lt;br /&gt;  (| (&amp; 0xffffffff (&lt;&lt; x n)) (&amp; 0xffffffff (&gt;&gt; x (- 32 n)))))&lt;br /&gt;&lt;br /&gt;(define (FF a b c d x s ac)&lt;br /&gt;  (set 'a (&amp; 0xffffffff (+ a (F b c d) x ac)))&lt;br /&gt;  (set 'a (rotate-left a s))&lt;br /&gt;  (set 'a (&amp; 0xffffffff (+ a b))))&lt;br /&gt;&lt;br /&gt;(define (GG a b c d x s ac)&lt;br /&gt;  (set 'a (&amp; 0xffffffff (+ a (G b c d) x ac)))&lt;br /&gt;  (set 'a (rotate-left a s))&lt;br /&gt;  (set 'a (&amp; 0xffffffff (+ a b))))&lt;br /&gt;&lt;br /&gt;(define (HH a b c d x s ac)&lt;br /&gt;  (set 'a (&amp; 0xffffffff (+ a (H b c d) x ac)))&lt;br /&gt;  (set 'a (rotate-left a s))&lt;br /&gt;  (set 'a (&amp; 0xffffffff (+ a b))))&lt;br /&gt;&lt;br /&gt;(define (II a b c d x s ac)&lt;br /&gt;  (set 'a (&amp; 0xffffffff (+ a (I b c d) x ac)))&lt;br /&gt;  (set 'a (rotate-left a s))&lt;br /&gt;  (set 'a (&amp; 0xffffffff (+ a b))))&lt;br /&gt;&lt;br /&gt;(define (md5-init )&lt;br /&gt;  (set 'md5-i '(0 0))&lt;br /&gt;  (set 'md5-in (dup 0 64))&lt;br /&gt;  (set 'md5-digest (dup 0 16))&lt;br /&gt;  (set 'md5-buf '(0x67452301 0xefcdab89 0x98badcfe 0x10325476)))&lt;br /&gt;&lt;br /&gt;(define (md5-update inbuf inlen)&lt;br /&gt;  ;; compute number of bytes mod 64&lt;br /&gt;  (set 'mdi (&amp; (&gt;&gt; (md5-i 0) 3) 0x3f))&lt;br /&gt;&lt;br /&gt;  ;; update number of bits&lt;br /&gt;  (if (&lt; (+ (md5-i 0)  (&lt;&lt; inlen 3)) (md5-i 0))&lt;br /&gt;      (nth-set (md5-i 1) (+ 1 (md5-i 1))))&lt;br /&gt;&lt;br /&gt;  (nth-set (md5-i 0) (+ (md5-i 0) (&lt;&lt; inlen 3)))&lt;br /&gt;  (nth-set (md5-i 1) (+ (md5-i 1) (&gt;&gt; inlen 29)))&lt;br /&gt;&lt;br /&gt;  (set 'inbuf-index 0)&lt;br /&gt;  (while (&gt; inlen 0)&lt;br /&gt;	 ;; add new character to buffer, increment mdi&lt;br /&gt;	 (nth-set (md5-in mdi) (inbuf inbuf-index))&lt;br /&gt;	 (set 'mdi (+ mdi 1))&lt;br /&gt;	 (set 'inbuf-index (+ inbuf-index 1))&lt;br /&gt;&lt;br /&gt;	 ;; transform if necessary&lt;br /&gt;	 (if (= mdi 0x40)&lt;br /&gt;	     (begin&lt;br /&gt;	       (set 'ii 0)&lt;br /&gt;	       (set 'in (dup 0 16))&lt;br /&gt;	       (for (i 0 15 1)&lt;br /&gt;		    (nth-set (in i) (| (&lt;&lt; (char-&gt;int (md5-in (+ ii 3))) 24)&lt;br /&gt;				       (&lt;&lt; (char-&gt;int (md5-in (+ ii 2))) 16)&lt;br /&gt;				       (&lt;&lt; (char-&gt;int (md5-in (+ ii 1))) 8)&lt;br /&gt;				       (char-&gt;int (md5-in ii))))&lt;br /&gt;		    (set 'ii (+ ii 4)))&lt;br /&gt;	       (transform  in)&lt;br /&gt;	       (set 'mdi 0)))&lt;br /&gt;	 (set 'inlen (- inlen 1))))&lt;br /&gt;&lt;br /&gt;(define (char-&gt;int x)&lt;br /&gt;  (if (integer? x) x (char x)))&lt;br /&gt;&lt;br /&gt;(define (md5-final)&lt;br /&gt;  (set 'in (dup 0 16))&lt;br /&gt;&lt;br /&gt;  ;; save number of bits&lt;br /&gt;  (nth-set (in 14) (md5-i 0))&lt;br /&gt;  (nth-set (in 15) (md5-i 1))&lt;br /&gt;&lt;br /&gt;  ;; compute number of bytse mod 64&lt;br /&gt;  (set 'mdi (&amp; (&gt;&gt; (md5-i 0) 3) 0x3f))&lt;br /&gt;&lt;br /&gt;  ;; pad out to 56 mod 64&lt;br /&gt;  (if (&lt; mdi 56)&lt;br /&gt;      (set 'padlen (- 56 mdi))&lt;br /&gt;      (set 'padlen (- 120 mdi)))&lt;br /&gt;&lt;br /&gt;  (set 'padding (dup 0 64))&lt;br /&gt;  (nth-set (padding 0) 0x80)&lt;br /&gt;  (md5-update padding padlen)&lt;br /&gt;&lt;br /&gt;  ;; append lenth in bits and transform&lt;br /&gt;  (set 'ii 0)&lt;br /&gt;  (for (i 0 13 1)&lt;br /&gt;       (nth-set (in i) (| (&lt;&lt; (char-&gt;int (md5-in (+ ii 3))) 24)&lt;br /&gt;			  (&lt;&lt; (char-&gt;int (md5-in (+ ii 2))) 16)&lt;br /&gt;			  (&lt;&lt; (char-&gt;int (md5-in (+ ii 1))) 8) (char-&gt;int (md5-in ii))))&lt;br /&gt;       (set 'ii (+ ii 4)))&lt;br /&gt;  (transform in)&lt;br /&gt;&lt;br /&gt;  ;; store buffer in digest&lt;br /&gt;  (set 'ii 0)&lt;br /&gt;  (for (i 0 3 1)&lt;br /&gt;       (nth-set (md5-digest ii) (&amp; (md5-buf i) 0xff))&lt;br /&gt;       (nth-set (md5-digest (+ ii 1)) (&amp; (&gt;&gt; (md5-buf i) 8) 0xff))&lt;br /&gt;       (nth-set (md5-digest (+ ii 2)) (&amp; (&gt;&gt; (md5-buf i) 16)  0xff))&lt;br /&gt;       (nth-set (md5-digest (+ ii 3)) (&amp; (&gt;&gt; (md5-buf i) 24)  0xff))&lt;br /&gt;       (set 'ii (+ ii 4))))&lt;br /&gt;&lt;br /&gt;(define (transform  in)&lt;br /&gt;  (set 'a (md5-buf 0))&lt;br /&gt;  (set 'b (md5-buf 1))&lt;br /&gt;  (set 'c (md5-buf 2))&lt;br /&gt;  (set 'd (md5-buf 3))&lt;br /&gt;&lt;br /&gt;  ;; Round 1&lt;br /&gt;  (set 'S11 7)&lt;br /&gt;  (set 'S12 12)&lt;br /&gt;  (set 'S13 17)&lt;br /&gt;  (set 'S14 22)&lt;br /&gt;  (set 'a (FF a b c d (in 0) S11 3614090360)) &lt;br /&gt;  (set 'd (FF d a b c (in 1) S12 3905402710)) &lt;br /&gt;  (set 'c (FF c d a b (in 2) S13  606105819)) &lt;br /&gt;  (set 'b (FF b c d a (in 3) S14 3250441966)) &lt;br /&gt;  (set 'a (FF a b c d (in 4) S11 4118548399)) &lt;br /&gt;  (set 'd (FF d a b c (in 5) S12 1200080426)) &lt;br /&gt;  (set 'c (FF c d a b (in 6) S13 2821735955)) &lt;br /&gt;  (set 'b (FF b c d a (in 7) S14 4249261313)) &lt;br /&gt;  (set 'a (FF a b c d (in 8) S11 1770035416)) &lt;br /&gt;  (set 'd (FF d a b c (in 9) S12 2336552879)) &lt;br /&gt;  (set 'c (FF c d a b (in 10) S13 4294925233))&lt;br /&gt;  (set 'b (FF b c d a (in 11) S14 2304563134))&lt;br /&gt;  (set 'a (FF a b c d (in 12) S11 1804603682))&lt;br /&gt;  (set 'd (FF d a b c (in 13) S12 4254626195))&lt;br /&gt;  (set 'c (FF c d a b (in 14) S13 2792965006))&lt;br /&gt;  (set 'b (FF b c d a (in 15) S14 1236535329))&lt;br /&gt;&lt;br /&gt;  ;; Round 2 &lt;br /&gt;  (set 'S21 5)&lt;br /&gt;  (set 'S22 9)&lt;br /&gt;  (set 'S23 14)&lt;br /&gt;  (set 'S24 20)&lt;br /&gt;  (set 'a (GG a b c d (in 1) S21 4129170786)) &lt;br /&gt;  (set 'd (GG d a b c (in 6) S22 3225465664)) &lt;br /&gt;  (set 'c (GG c d a b (in 11) S23  643717713))&lt;br /&gt;  (set 'b (GG b c d a (in 0) S24 3921069994)) &lt;br /&gt;  (set 'a (GG a b c d (in 5) S21 3593408605)) &lt;br /&gt;  (set 'd (GG d a b c (in 10) S22   38016083))&lt;br /&gt;  (set 'c (GG c d a b (in 15) S23 3634488961))&lt;br /&gt;  (set 'b (GG b c d a (in 4) S24 3889429448)) &lt;br /&gt;  (set 'a (GG a b c d (in 9) S21  568446438)) &lt;br /&gt;  (set 'd (GG d a b c (in 14) S22 3275163606))&lt;br /&gt;  (set 'c (GG c d a b (in 3) S23 4107603335)) &lt;br /&gt;  (set 'b (GG b c d a (in 8) S24 1163531501)) &lt;br /&gt;  (set 'a (GG a b c d (in 13) S21 2850285829))&lt;br /&gt;  (set 'd (GG d a b c (in 2) S22 4243563512)) &lt;br /&gt;  (set 'c (GG c d a b (in 7) S23 1735328473)) &lt;br /&gt;  (set 'b (GG b c d a (in 12) S24 2368359562))&lt;br /&gt;&lt;br /&gt;  ;; Round 3 &lt;br /&gt;  (set 'S31 4)&lt;br /&gt;  (set 'S32 11)&lt;br /&gt;  (set 'S33 16)&lt;br /&gt;  (set 'S34 23)&lt;br /&gt;  (set 'a (HH a b c d (in 5) S31 4294588738)) &lt;br /&gt;  (set 'd (HH d a b c (in 8) S32 2272392833)) &lt;br /&gt;  (set 'c (HH c d a b (in 11) S33 1839030562))&lt;br /&gt;  (set 'b (HH b c d a (in 14) S34 4259657740))&lt;br /&gt;  (set 'a (HH a b c d (in 1) S31 2763975236)) &lt;br /&gt;  (set 'd (HH d a b c (in 4) S32 1272893353)) &lt;br /&gt;  (set 'c (HH c d a b (in 7) S33 4139469664)) &lt;br /&gt;  (set 'b (HH b c d a (in 10) S34 3200236656))&lt;br /&gt;  (set 'a (HH a b c d (in 13) S31  681279174))&lt;br /&gt;  (set 'd (HH d a b c (in 0) S32 3936430074)) &lt;br /&gt;  (set 'c (HH c d a b (in 3) S33 3572445317)) &lt;br /&gt;  (set 'b (HH b c d a (in 6) S34   76029189)) &lt;br /&gt;  (set 'a (HH a b c d (in 9) S31 3654602809)) &lt;br /&gt;  (set 'd (HH d a b c (in 12) S32 3873151461))&lt;br /&gt;  (set 'c (HH c d a b (in 15) S33  530742520))&lt;br /&gt;  (set 'b (HH b c d a (in 2) S34 3299628645)) &lt;br /&gt;&lt;br /&gt;  ;; Round 4 &lt;br /&gt;  (set 'S41 6)&lt;br /&gt;  (set 'S42 10)&lt;br /&gt;  (set 'S43 15)&lt;br /&gt;  (set 'S44 21)&lt;br /&gt;  (set 'a (II a b c d (in 0) S41 4096336452)) &lt;br /&gt;  (set 'd (II d a b c (in 7) S42 1126891415)) &lt;br /&gt;  (set 'c (II c d a b (in 14) S43 2878612391))&lt;br /&gt;  (set 'b (II b c d a (in 5) S44 4237533241)) &lt;br /&gt;  (set 'a (II a b c d (in 12) S41 1700485571))&lt;br /&gt;  (set 'd (II d a b c (in 3) S42 2399980690)) &lt;br /&gt;  (set 'c (II c d a b (in 10) S43 4293915773))&lt;br /&gt;  (set 'b (II b c d a (in 1) S44 2240044497)) &lt;br /&gt;  (set 'a (II a b c d (in 8) S41 1873313359)) &lt;br /&gt;  (set 'd (II d a b c (in 15) S42 4264355552))&lt;br /&gt;  (set 'c (II c d a b (in 6) S43 2734768916)) &lt;br /&gt;  (set 'b (II b c d a (in 13) S44 1309151649))&lt;br /&gt;  (set 'a (II a b c d (in 4) S41 4149444226)) &lt;br /&gt;  (set 'd (II d a b c (in 11) S42 3174756917))&lt;br /&gt;  (set 'c (II c d a b (in 2) S43  718787259)) &lt;br /&gt;  (set 'b (II b c d a (in 9) S44 3951481745)) &lt;br /&gt;&lt;br /&gt;  (nth-set (md5-buf 0) (+ a (md5-buf 0)))&lt;br /&gt;  (nth-set (md5-buf 1) (+ b (md5-buf 1)))&lt;br /&gt;  (nth-set (md5-buf 2) (+ c (md5-buf 2)))&lt;br /&gt;  (nth-set (md5-buf 3) (+ d (md5-buf 3))))&lt;br /&gt;&lt;br /&gt;(define (md5-string str)&lt;br /&gt;  (md5-init)&lt;br /&gt;  (md5-update str (length str))&lt;br /&gt;  (md5-final)&lt;br /&gt;  (set 'result "")&lt;br /&gt;  (for (i 0 15 1)&lt;br /&gt;       (set 'result (append result (format "%02x" (md5-digest i)))))&lt;br /&gt;  result)&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 14 Sep 2006 05:52:51 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2591</guid>
      <author>frontera000 (bob bae)</author>
    </item>
  </channel>
</rss>
