117 lines
3.3 KiB
Plaintext
117 lines
3.3 KiB
Plaintext
(de leftRotate (X C)
|
|
(| (mod32 (>> (- C) X)) (>> (- 32 C) X)) )
|
|
|
|
(de mod32 (N)
|
|
(& N `(hex "FFFFFFFF")) )
|
|
|
|
(de not32 (N)
|
|
(x| N `(hex "FFFFFFFF")) )
|
|
|
|
(de add32 @
|
|
(mod32 (pass +)) )
|
|
|
|
(de sha1 (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 )
|
|
(flip
|
|
(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
|
|
(A H0 B H1 C H2 D H3 E H4
|
|
W (conc
|
|
(make
|
|
(do 16
|
|
(link
|
|
(apply
|
|
|
|
|
(mapcar >> (-24 -16 -8 0) (cut 4 'Str)) ) ) ) )
|
|
(need 64 0) ) )
|
|
(for (I 17 (>= 80 I) (inc I))
|
|
(set (nth W I)
|
|
(leftRotate
|
|
(x|
|
|
(get W (- I 3))
|
|
(get W (- I 8))
|
|
(get W (- I 14))
|
|
(get W (- I 16)) )
|
|
1 ) ) )
|
|
(use (Tmp F K)
|
|
(for I 80
|
|
(cond
|
|
((>= 20 I)
|
|
(setq
|
|
F (| (& B C) (& (not32 B) D))
|
|
K `(hex "5A827999") ) )
|
|
((>= 40 I)
|
|
(setq
|
|
F (x| B C D)
|
|
K `(hex "6ED9EBA1") ) )
|
|
((>= 60 I)
|
|
(setq
|
|
F (| (& B C) (& B D) (& C D))
|
|
K `(hex "8F1BBCDC") ) )
|
|
(T
|
|
(setq
|
|
F (x| B C D)
|
|
K `(hex "CA62C1D6") ) ) )
|
|
(setq
|
|
Tmp (add32 (leftRotate A 5) F E K (get W I) )
|
|
E D
|
|
D C
|
|
C (leftRotate B 30)
|
|
B A
|
|
A Tmp ) ) )
|
|
(setq
|
|
H0 (add32 H0 A)
|
|
H1 (add32 H1 B)
|
|
H2 (add32 H2 C)
|
|
H3 (add32 H3 D)
|
|
H4 (add32 H4 E) ) ) )
|
|
(mapcan
|
|
'((N)
|
|
(flip
|
|
(make
|
|
(do 4
|
|
(link (& 255 N))
|
|
(setq N (>> 8 N)) ) ) ) )
|
|
(list H0 H1 H2 H3 H4) ) ) )
|
|
|
|
(let Str "Rosetta Code"
|
|
(println
|
|
(pack
|
|
(mapcar
|
|
'((B) (pad 2 (hex B)))
|
|
(sha1 Str) ) ) )
|
|
(println
|
|
(pack
|
|
(mapcar
|
|
'((B) (pad 2 (hex B)))
|
|
(native
|
|
"libcrypto.so"
|
|
"SHA1"
|
|
'(B . 20)
|
|
Str
|
|
(length Str)
|
|
'(NIL (20)) ) ) ) ) )
|
|
|
|
(bye)
|