RosettaCodeData/Task/RIPEMD-160/PicoLisp/ripemd-160.l
2015-02-20 00:35:01 -05:00

160 lines
5.4 KiB
Text

(de *R160-R1 . (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
8 5 14 2 11 7 16 4 13 1 10 6 3 15 12 9
4 11 15 5 10 16 9 2 3 8 1 7 14 12 6 13
2 10 12 11 1 9 13 5 14 4 8 16 15 6 7 3
5 1 6 10 8 13 3 11 15 2 4 9 12 7 16 14 .))
(de *R160-R2 . (6 15 8 1 10 3 12 5 14 7 16 9 2 11 4 13
7 12 4 8 1 14 6 11 15 16 9 13 5 10 2 3
16 6 2 4 8 15 7 10 12 9 13 3 11 1 5 14
9 7 5 2 4 12 16 1 6 13 3 14 10 8 11 15
13 16 11 5 2 6 9 8 7 3 14 15 1 4 10 12 .))
(de *R160-S1 . (11 14 15 12 5 8 7 9 11 13 14 15 6 7 9 8
7 6 8 13 11 9 7 15 7 12 15 9 11 7 13 12
11 13 6 7 14 9 13 15 14 8 13 6 5 12 7 5
11 12 14 15 14 15 9 8 9 14 5 6 8 6 5 12
9 15 5 11 6 8 13 12 5 12 13 14 11 8 5 6 .))
(de *R160-S2 . (8 9 9 11 13 15 15 5 7 7 8 11 14 14 12 6
9 13 15 7 12 8 9 11 7 7 12 7 6 15 13 11
9 7 15 11 8 6 6 14 12 13 5 14 13 13 7 5
15 5 8 11 14 14 6 14 6 9 12 9 12 5 15 8
8 5 12 9 12 5 14 6 8 13 6 5 15 13 11 11 .))
(de mod32 (N)
(& N `(hex "FFFFFFFF")) )
(de not32 (N)
(x| N `(hex "FFFFFFFF")) )
(de add32 @
(mod32 (pass +)) )
(de leftRotate (X C)
(| (mod32 (>> (- C) X)) (>> (- 32 C) X)) )
(de ripemd160 (Str)
(let Len (length Str)
(setq Str
(conc
(need
(- 8 (* 64 (/ (+ Len 1 8 63) 64)))
(conc
(mapcar char (chop Str))
(cons `(hex "80")) )
0 )
(make
(setq Len (* 8 Len))
(do 8
(link (& Len 255))
(setq Len (>> 8 Len )) ) ) ) ) )
(let
(H0 `(hex "67452301")
H1 `(hex "EFCDAB89")
H2 `(hex "98BADCFE")
H3 `(hex "10325476")
H4 `(hex "C3D2E1F0") )
(while Str
(let
(A1 H0 B1 H1 C1 H2 D1 H3 E1 H4
A2 H0 B2 H1 C2 H2 D2 H3 E2 H4
W (make
(do 16
(link
(apply |
(mapcar >> (0 -8 -16 -24) (cut 4 'Str)) ) ) ) ) )
(use (Func1 Func2 Hex1 Hex2)
(for I 80
(cond
((>= 16 I)
(setq
Func1 '(x| B1 C1 D1)
Func2 '(x| B2 (| C2 (not32 D2)))
Hex1 0
Hex2 `(hex "50A28BE6") ) )
((>= 32 I)
(setq
Func1 '(| (& B1 C1) (& (not32 B1) D1))
Func2 '(| (& B2 D2) (& C2 (not32 D2)))
Hex1 `(hex "5A827999")
Hex2 `(hex "5C4DD124") ) )
((>= 48 I)
(setq
Func1 '(x| (| B1 (not32 C1)) D1)
Func2 '(x| (| B2 (not32 C2)) D2)
Hex1 `(hex "6ED9EBA1")
Hex2 `(hex "6D703EF3") ) )
((>= 64 I)
(setq
Func1 '(| (& B1 D1) (& C1 (not32 D1)))
Func2 '(| (& B2 C2) (& (not32 B2) D2))
Hex1 `(hex "8F1BBCDC")
Hex2 `(hex "7A6D76E9") ) )
(T
(setq
Func1 '(x| B1 (| C1 (not32 D1)))
Func2 '(x| B2 C2 D2)
Hex1 `(hex "A953FD4E")
Hex2 0 ) ) )
(setq
Tmp1
(add32
(leftRotate
(add32
A1
(eval Func1)
(get W (pop '*R160-R1))
Hex1 )
(pop '*R160-S1) )
E1 )
Tmp2
(add32
(leftRotate
(add32
A2
(eval Func2)
(get W (pop '*R160-R2))
Hex2 )
(pop '*R160-S2) )
E2 )
A1 E1
E1 D1
D1 (leftRotate C1 10)
C1 B1
B1 Tmp1
A2 E2
E2 D2
D2 (leftRotate C2 10)
C2 B2
B2 Tmp2 ) ) )
(setq
Tmp (add32 H1 C1 D2)
H1 (add32 H2 D1 E2)
H2 (add32 H3 E1 A2)
H3 (add32 H4 A1 B2)
H4 (add32 H0 B1 C2)
H0 Tmp ) ) )
(make
(for N (list H0 H1 H2 H3 H4)
(do 4
(link (& N 255))
(setq N (>> 8 N)) ) ) ) ) )
(let Str "Rosetta Code"
(println
(pack
(mapcar
'((B) (pad 2 (hex B)))
(ripemd160 Str) ) ) )
(println
(pack
(mapcar
'((B) (pad 2 (hex B)))
(native
"libcrypto.so"
"RIPEMD160"
'(B . 20)
Str
(length Str)
'(NIL (20)) ) ) ) ) )
(bye)