1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
let sha_1 (s:string) : string =
let sha_1_pad s =
let len = String.length s in
let blen = 8 * len in
let rem = len mod 64 in
let mlen = if rem > 55 then len + 128 - rem else len + 64 - rem in
let m = Bytes.create mlen in
Bytes.blit_string s 0 m 0 len;
Bytes.fill m len (mlen - len) '\x00';
Bytes.set m len '\x80';
if Sys.word_size > 32 then begin
Bytes.set m (mlen - 8) (Char.unsafe_chr (blen lsr 56 land 0xFF));
Bytes.set m (mlen - 7) (Char.unsafe_chr (blen lsr 48 land 0xFF));
Bytes.set m (mlen - 6) (Char.unsafe_chr (blen lsr 40 land 0xFF));
Bytes.set m (mlen - 5) (Char.unsafe_chr (blen lsr 32 land 0xFF));
end;
Bytes.set m (mlen - 4) (Char.unsafe_chr (blen lsr 24 land 0xFF));
Bytes.set m (mlen - 3) (Char.unsafe_chr (blen lsr 16 land 0xFF));
Bytes.set m (mlen - 2) (Char.unsafe_chr (blen lsr 8 land 0xFF));
Bytes.set m (mlen - 1) (Char.unsafe_chr (blen land 0xFF));
m
in
let ( &&& ) = ( land ) in
let ( lor ) = Int32.logor in
let ( lxor ) = Int32.logxor in
let ( land ) = Int32.logand in
let ( ++ ) = Int32.add in
let lnot = Int32.lognot in
let sr = Int32.shift_right in
let sl = Int32.shift_left in
let cls n x = (sl x n) lor (Int32.shift_right_logical x (32 - n)) in
let m = sha_1_pad s in
let w = Array.make 16 0l in
let h0 = ref 0x67452301l in
let h1 = ref 0xEFCDAB89l in
let h2 = ref 0x98BADCFEl in
let h3 = ref 0x10325476l in
let h4 = ref 0xC3D2E1F0l in
let a = ref 0l in
let b = ref 0l in
let c = ref 0l in
let d = ref 0l in
let e = ref 0l in
for i = 0 to ((Bytes.length m) / 64) - 1 do
let base = i * 64 in
for j = 0 to 15 do
let k = base + (j * 4) in
w.(j) <- sl (Int32.of_int (Char.code (Bytes.get m k))) 24 lor
sl (Int32.of_int (Char.code (Bytes.get m (k + 1)))) 16 lor
sl (Int32.of_int (Char.code (Bytes.get m (k + 2)))) 8 lor
(Int32.of_int (Char.code (Bytes.get m (k + 3))))
done;
a := !h0; b := !h1; c := !h2; d := !h3; e := !h4;
for t = 0 to 79 do
let f, k =
if t <= 19 then (!b land !c) lor ((lnot !b) land !d), 0x5A827999l else
if t <= 39 then !b lxor !c lxor !d, 0x6ED9EBA1l else
if t <= 59 then
(!b land !c) lor (!b land !d) lor (!c land !d), 0x8F1BBCDCl
else
!b lxor !c lxor !d, 0xCA62C1D6l
in
let s = t &&& 0xF in
if (t >= 16) then begin
w.(s) <- cls 1 begin
w.((s + 13) &&& 0xF) lxor
w.((s + 8) &&& 0xF) lxor
w.((s + 2) &&& 0xF) lxor
w.(s)
end
end;
let temp = (cls 5 !a) ++ f ++ !e ++ w.(s) ++ k in
e := !d;
d := !c;
c := cls 30 !b;
b := !a;
a := temp;
done;
h0 := !h0 ++ !a;
h1 := !h1 ++ !b;
h2 := !h2 ++ !c;
h3 := !h3 ++ !d;
h4 := !h4 ++ !e
done;
let h = Bytes.create 20 in
let i2s h k i =
Bytes.set h k (Char.unsafe_chr ((Int32.to_int (sr i 24)) &&& 0xFF));
Bytes.set h (k + 1) (Char.unsafe_chr ((Int32.to_int (sr i 16)) &&& 0xFF));
Bytes.set h (k + 2) (Char.unsafe_chr ((Int32.to_int (sr i 8)) &&& 0xFF));
Bytes.set h (k + 3) (Char.unsafe_chr ((Int32.to_int i) &&& 0xFF));
in
i2s h 0 !h0;
i2s h 4 !h1;
i2s h 8 !h2;
i2s h 12 !h3;
i2s h 16 !h4;
Bytes.unsafe_to_string h