1
0
Fork 0
monocypher-ed25519-1M/sha512.l

156 lines
5.7 KiB
Plaintext

(setq *Sha512-K
(mapcar hex
'("428a2f98d728ae22" "7137449123ef65cd" "b5c0fbcfec4d3b2f"
"e9b5dba58189dbbc" "3956c25bf348b538" "59f111f1b605d019"
"923f82a4af194f9b" "ab1c5ed5da6d8118" "d807aa98a3030242"
"12835b0145706fbe" "243185be4ee4b28c" "550c7dc3d5ffb4e2"
"72be5d74f27b896f" "80deb1fe3b1696b1" "9bdc06a725c71235"
"c19bf174cf692694" "e49b69c19ef14ad2" "efbe4786384f25e3"
"0fc19dc68b8cd5b5" "240ca1cc77ac9c65" "2de92c6f592b0275"
"4a7484aa6ea6e483" "5cb0a9dcbd41fbd4" "76f988da831153b5"
"983e5152ee66dfab" "a831c66d2db43210" "b00327c898fb213f"
"bf597fc7beef0ee4" "c6e00bf33da88fc2" "d5a79147930aa725"
"06ca6351e003826f" "142929670a0e6e70" "27b70a8546d22ffc"
"2e1b21385c26c926" "4d2c6dfc5ac42aed" "53380d139d95b3df"
"650a73548baf63de" "766a0abb3c77b2a8" "81c2c92e47edaee6"
"92722c851482353b" "a2bfe8a14cf10364" "a81a664bbc423001"
"c24b8b70d0f89791" "c76c51a30654be30" "d192e819d6ef5218"
"d69906245565a910" "f40e35855771202a" "106aa07032bbd1b8"
"19a4c116b8d2d0c8" "1e376c085141ab53" "2748774cdf8eeb99"
"34b0bcb5e19b48a8" "391c0cb3c5c95a63" "4ed8aa4ae3418acb"
"5b9cca4f7763e373" "682e6ff3d6b2b8a3" "748f82ee5defb2fc"
"78a5636f43172f60" "84c87814a1f0ab72" "8cc702081a6439ec"
"90befffa23631e28" "a4506cebde82bde9" "bef9a3f7b2c67915"
"c67178f2e372532b" "ca273eceea26619c" "d186b8c721c0c207"
"eada7dd6cde0eb1e" "f57d4f7fee6ed178" "06f067aa72176fba"
"0a637dc5a2c898a6" "113f9804bef90dae" "1b710b35131c471b"
"28db77f523047d84" "32caab7b40c72493" "3c9ebe0a15c9bebc"
"431d67c49c100d4c" "4cc5d4becb3e42b6" "597f299cfc657e2a"
"5fcb6fab3ad6faec" "6c44198c4a475817" ) ) )
(de rightRotate64 (X C)
(| (>> C X) (mod64 (>> (- C 64) X))) )
(de mod64 (N)
(& N `(hex "FFFFFFFFFFFFFFFF")) )
(de not64 (N)
(x| N `(hex "FFFFFFFFFFFFFFFF")) )
(de add64 @
(mod64 (pass +)) )
(de sha512 (Lst)
(let (Len (length Lst) R NIL)
(setq Lst
(conc
(need
(-
16
(* 128 (/ (+ Len 1 16 127) 128)) )
(append Lst (cons `(hex "80")))
0 )
(prog
(setq Len (* 8 Len))
(do 16
(push 'R (& Len 255))
(setq Len (>> 8 Len)) )
R ) ) ) )
(let
(H0 `(hex "6a09e667f3bcc908")
H1 `(hex "bb67ae8584caa73b")
H2 `(hex "3c6ef372fe94f82b")
H3 `(hex "a54ff53a5f1d36f1")
H4 `(hex "510e527fade682d1")
H5 `(hex "9b05688c2b3e6c1f")
H6 `(hex "1f83d9abfb41bd6b")
H7 `(hex "5be0cd19137e2179") )
(while Lst
(let
(A H0
B H1
C H2
D H3
E H4
F H5
G H6
H H7
W
(conc
(make
(do 16
(link
(apply
|
(mapcar
>>
(-56 -48 -40 -32 -24 -16 -8 0)
(cut 8 'Lst) ) ) ) ) )
(need 64 0) ) )
(for (I 17 (>= 80 I) (inc I))
(let
(Wi15 (get W (- I 15))
Wi2 (get W (- I 2))
S0
(x|
(rightRotate64 Wi15 1)
(rightRotate64 Wi15 8)
(>> 7 Wi15) )
S1
(x|
(rightRotate64 Wi2 19)
(rightRotate64 Wi2 61)
(>> 6 Wi2) ) )
(set (nth W I)
(add64
(get W (- I 16))
S0
(get W (- I 7))
S1 ) ) ) )
(use (Tmp1 Tmp2)
(for I 80
(setq
Tmp1
(add64
H
(x|
(rightRotate64 E 14)
(rightRotate64 E 18)
(rightRotate64 E 41) )
(x| (& E F) (& (not64 E) G))
(get *Sha512-K I)
(get W I) )
Tmp2
(add64
(x|
(rightRotate64 A 28)
(rightRotate64 A 34)
(rightRotate64 A 39) )
(x|
(& A B)
(& A C)
(& B C) ) )
H G
G F
F E
E (add64 D Tmp1)
D C
C B
B A
A (add64 Tmp1 Tmp2) ) ) )
(setq
H0 (add64 H0 A)
H1 (add64 H1 B)
H2 (add64 H2 C)
H3 (add64 H3 D)
H4 (add64 H4 E)
H5 (add64 H5 F)
H6 (add64 H6 G)
H7 (add64 H7 H) ) ) )
(mapcan
'((N)
(let R NIL
(do 8
(push 'R (& 255 N))
(setq N (>> 8 N)) )
R ) )
(list H0 H1 H2 H3 H4 H5 H6 H7) ) ) )
(de d512 (Lst)
(sha512 (sha512 Lst)) )