@shd101wyy/yo 0.1.26 → 0.1.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/skills/yo-async-effects/SKILL.md +4 -4
- package/.github/skills/yo-async-effects/async-effects-recipes.md +34 -34
- package/.github/skills/yo-core-patterns/SKILL.md +1 -1
- package/.github/skills/yo-core-patterns/core-patterns-cheatsheet.md +26 -26
- package/.github/skills/yo-project-workflow/SKILL.md +6 -3
- package/.github/skills/yo-project-workflow/workflow-cheatsheet.md +34 -11
- package/.github/skills/yo-syntax/SKILL.md +7 -6
- package/.github/skills/yo-syntax/syntax-cheatsheet.md +73 -60
- package/.github/skills/yo-wasm-integration/wasm-integration-cheatsheet.md +3 -3
- package/README.md +10 -8
- package/out/cjs/index.cjs +456 -438
- package/out/cjs/yo-cli.cjs +576 -543
- package/out/cjs/yo-lsp.cjs +559 -532
- package/out/esm/index.mjs +281 -263
- package/out/types/src/formatter.d.ts +11 -0
- package/out/types/src/lsp/formatting.d.ts +2 -0
- package/out/types/src/tests/formatter.test.d.ts +1 -0
- package/out/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/std/alg/hash.yo +13 -21
- package/std/allocator.yo +25 -40
- package/std/async.yo +3 -7
- package/std/build.yo +105 -151
- package/std/cli/arg_parser.yo +184 -169
- package/std/collections/array_list.yo +350 -314
- package/std/collections/btree_map.yo +142 -131
- package/std/collections/deque.yo +132 -128
- package/std/collections/hash_map.yo +542 -566
- package/std/collections/hash_set.yo +623 -687
- package/std/collections/linked_list.yo +275 -293
- package/std/collections/ordered_map.yo +113 -85
- package/std/collections/priority_queue.yo +73 -73
- package/std/crypto/md5.yo +191 -95
- package/std/crypto/random.yo +56 -64
- package/std/crypto/sha256.yo +151 -107
- package/std/encoding/base64.yo +87 -81
- package/std/encoding/hex.yo +43 -50
- package/std/encoding/html.yo +56 -81
- package/std/encoding/html_char_utils.yo +7 -13
- package/std/encoding/html_entities.yo +2248 -2253
- package/std/encoding/json.yo +316 -224
- package/std/encoding/punycode.yo +86 -116
- package/std/encoding/toml.yo +67 -66
- package/std/encoding/utf16.yo +37 -44
- package/std/env.yo +62 -91
- package/std/error.yo +7 -15
- package/std/fmt/display.yo +5 -9
- package/std/fmt/index.yo +8 -14
- package/std/fmt/to_string.yo +330 -315
- package/std/fmt/writer.yo +58 -87
- package/std/fs/dir.yo +83 -102
- package/std/fs/file.yo +147 -180
- package/std/fs/metadata.yo +45 -78
- package/std/fs/temp.yo +55 -65
- package/std/fs/types.yo +27 -40
- package/std/fs/walker.yo +53 -68
- package/std/gc.yo +5 -8
- package/std/glob.yo +30 -43
- package/std/http/client.yo +107 -120
- package/std/http/http.yo +106 -96
- package/std/http/index.yo +4 -6
- package/std/imm/list.yo +88 -93
- package/std/imm/map.yo +528 -464
- package/std/imm/set.yo +52 -57
- package/std/imm/sorted_map.yo +340 -286
- package/std/imm/sorted_set.yo +57 -63
- package/std/imm/string.yo +404 -345
- package/std/imm/vec.yo +173 -181
- package/std/io/reader.yo +3 -6
- package/std/io/writer.yo +4 -8
- package/std/libc/assert.yo +5 -9
- package/std/libc/ctype.yo +32 -22
- package/std/libc/dirent.yo +26 -25
- package/std/libc/errno.yo +164 -90
- package/std/libc/fcntl.yo +52 -45
- package/std/libc/float.yo +66 -44
- package/std/libc/limits.yo +42 -33
- package/std/libc/math.yo +53 -82
- package/std/libc/signal.yo +72 -47
- package/std/libc/stdatomic.yo +217 -188
- package/std/libc/stdint.yo +5 -29
- package/std/libc/stdio.yo +5 -29
- package/std/libc/stdlib.yo +32 -39
- package/std/libc/string.yo +5 -23
- package/std/libc/sys/stat.yo +58 -56
- package/std/libc/time.yo +5 -19
- package/std/libc/unistd.yo +5 -20
- package/std/libc/wctype.yo +6 -9
- package/std/libc/windows.yo +26 -30
- package/std/log.yo +41 -55
- package/std/net/addr.yo +102 -97
- package/std/net/dns.yo +27 -28
- package/std/net/errors.yo +50 -49
- package/std/net/tcp.yo +113 -124
- package/std/net/udp.yo +55 -66
- package/std/os/env.yo +35 -33
- package/std/os/signal.yo +15 -25
- package/std/path.yo +276 -311
- package/std/prelude.yo +6304 -4315
- package/std/process/command.yo +87 -103
- package/std/process/index.yo +12 -31
- package/std/regex/compiler.yo +196 -95
- package/std/regex/flags.yo +58 -39
- package/std/regex/index.yo +157 -173
- package/std/regex/match.yo +20 -31
- package/std/regex/node.yo +134 -152
- package/std/regex/parser.yo +283 -259
- package/std/regex/unicode.yo +172 -202
- package/std/regex/vm.yo +155 -171
- package/std/string/index.yo +5 -7
- package/std/string/rune.yo +45 -55
- package/std/string/string.yo +937 -964
- package/std/string/string_builder.yo +94 -104
- package/std/string/unicode.yo +46 -64
- package/std/sync/channel.yo +72 -73
- package/std/sync/cond.yo +31 -36
- package/std/sync/mutex.yo +30 -32
- package/std/sync/once.yo +13 -16
- package/std/sync/rwlock.yo +26 -31
- package/std/sync/waitgroup.yo +20 -25
- package/std/sys/advise.yo +16 -24
- package/std/sys/bufio/buf_reader.yo +77 -93
- package/std/sys/bufio/buf_writer.yo +52 -65
- package/std/sys/clock.yo +4 -9
- package/std/sys/constants.yo +77 -61
- package/std/sys/copy.yo +4 -10
- package/std/sys/dir.yo +26 -43
- package/std/sys/dns.yo +41 -61
- package/std/sys/errors.yo +95 -103
- package/std/sys/events.yo +45 -57
- package/std/sys/externs.yo +319 -267
- package/std/sys/fallocate.yo +7 -11
- package/std/sys/fcntl.yo +14 -22
- package/std/sys/file.yo +26 -40
- package/std/sys/future.yo +5 -8
- package/std/sys/iov.yo +12 -25
- package/std/sys/lock.yo +12 -13
- package/std/sys/mmap.yo +38 -43
- package/std/sys/path.yo +3 -8
- package/std/sys/perm.yo +7 -21
- package/std/sys/pipe.yo +5 -12
- package/std/sys/process.yo +23 -29
- package/std/sys/seek.yo +10 -12
- package/std/sys/signal.yo +7 -13
- package/std/sys/signals.yo +52 -35
- package/std/sys/socket.yo +63 -58
- package/std/sys/socketpair.yo +3 -6
- package/std/sys/sockinfo.yo +11 -20
- package/std/sys/statfs.yo +11 -34
- package/std/sys/statx.yo +25 -52
- package/std/sys/sysinfo.yo +15 -20
- package/std/sys/tcp.yo +62 -92
- package/std/sys/temp.yo +5 -9
- package/std/sys/time.yo +5 -15
- package/std/sys/timer.yo +6 -11
- package/std/sys/tty.yo +10 -18
- package/std/sys/udp.yo +22 -39
- package/std/sys/umask.yo +3 -6
- package/std/sys/unix.yo +33 -52
- package/std/testing/bench.yo +49 -52
- package/std/thread.yo +10 -15
- package/std/time/datetime.yo +105 -89
- package/std/time/duration.yo +43 -56
- package/std/time/instant.yo +13 -18
- package/std/time/sleep.yo +5 -9
- package/std/url/index.yo +184 -209
- package/std/worker.yo +6 -10
package/std/crypto/md5.yo
CHANGED
|
@@ -8,127 +8,226 @@
|
|
|
8
8
|
//!
|
|
9
9
|
//! digest := md5_hex(data); // "5d41402abc4b2a76b9719d911017c592"
|
|
10
10
|
//! ```
|
|
11
|
-
|
|
12
|
-
{
|
|
13
|
-
|
|
14
|
-
open import "../string";
|
|
15
|
-
|
|
11
|
+
{ ArrayList } :: import("../collections/array_list");
|
|
12
|
+
{ hex_encode } :: import("../encoding/hex");
|
|
13
|
+
open(import("../string"));
|
|
16
14
|
// ============================================================================
|
|
17
15
|
// MD5 implementation
|
|
18
16
|
// ============================================================================
|
|
19
|
-
|
|
20
17
|
_T :: Array(u32, usize(64))(
|
|
21
|
-
u32(0xd76aa478),
|
|
22
|
-
u32(
|
|
23
|
-
u32(
|
|
24
|
-
u32(
|
|
25
|
-
u32(
|
|
26
|
-
u32(
|
|
27
|
-
u32(
|
|
28
|
-
u32(
|
|
29
|
-
u32(
|
|
30
|
-
u32(
|
|
31
|
-
u32(
|
|
32
|
-
u32(
|
|
33
|
-
u32(
|
|
34
|
-
u32(
|
|
35
|
-
u32(
|
|
36
|
-
u32(
|
|
18
|
+
u32(0xd76aa478),
|
|
19
|
+
u32(0xe8c7b756),
|
|
20
|
+
u32(0x242070db),
|
|
21
|
+
u32(0xc1bdceee),
|
|
22
|
+
u32(0xf57c0faf),
|
|
23
|
+
u32(0x4787c62a),
|
|
24
|
+
u32(0xa8304613),
|
|
25
|
+
u32(0xfd469501),
|
|
26
|
+
u32(0x698098d8),
|
|
27
|
+
u32(0x8b44f7af),
|
|
28
|
+
u32(0xffff5bb1),
|
|
29
|
+
u32(0x895cd7be),
|
|
30
|
+
u32(0x6b901122),
|
|
31
|
+
u32(0xfd987193),
|
|
32
|
+
u32(0xa679438e),
|
|
33
|
+
u32(0x49b40821),
|
|
34
|
+
u32(0xf61e2562),
|
|
35
|
+
u32(0xc040b340),
|
|
36
|
+
u32(0x265e5a51),
|
|
37
|
+
u32(0xe9b6c7aa),
|
|
38
|
+
u32(0xd62f105d),
|
|
39
|
+
u32(0x02441453),
|
|
40
|
+
u32(0xd8a1e681),
|
|
41
|
+
u32(0xe7d3fbc8),
|
|
42
|
+
u32(0x21e1cde6),
|
|
43
|
+
u32(0xc33707d6),
|
|
44
|
+
u32(0xf4d50d87),
|
|
45
|
+
u32(0x455a14ed),
|
|
46
|
+
u32(0xa9e3e905),
|
|
47
|
+
u32(0xfcefa3f8),
|
|
48
|
+
u32(0x676f02d9),
|
|
49
|
+
u32(0x8d2a4c8a),
|
|
50
|
+
u32(0xfffa3942),
|
|
51
|
+
u32(0x8771f681),
|
|
52
|
+
u32(0x6d9d6122),
|
|
53
|
+
u32(0xfde5380c),
|
|
54
|
+
u32(0xa4beea44),
|
|
55
|
+
u32(0x4bdecfa9),
|
|
56
|
+
u32(0xf6bb4b60),
|
|
57
|
+
u32(0xbebfbc70),
|
|
58
|
+
u32(0x289b7ec6),
|
|
59
|
+
u32(0xeaa127fa),
|
|
60
|
+
u32(0xd4ef3085),
|
|
61
|
+
u32(0x04881d05),
|
|
62
|
+
u32(0xd9d4d039),
|
|
63
|
+
u32(0xe6db99e5),
|
|
64
|
+
u32(0x1fa27cf8),
|
|
65
|
+
u32(0xc4ac5665),
|
|
66
|
+
u32(0xf4292244),
|
|
67
|
+
u32(0x432aff97),
|
|
68
|
+
u32(0xab9423a7),
|
|
69
|
+
u32(0xfc93a039),
|
|
70
|
+
u32(0x655b59c3),
|
|
71
|
+
u32(0x8f0ccc92),
|
|
72
|
+
u32(0xffeff47d),
|
|
73
|
+
u32(0x85845dd1),
|
|
74
|
+
u32(0x6fa87e4f),
|
|
75
|
+
u32(0xfe2ce6e0),
|
|
76
|
+
u32(0xa3014314),
|
|
77
|
+
u32(0x4e0811a1),
|
|
78
|
+
u32(0xf7537e82),
|
|
79
|
+
u32(0xbd3af235),
|
|
80
|
+
u32(0x2ad7d2bb),
|
|
81
|
+
u32(0xeb86d391)
|
|
37
82
|
);
|
|
38
|
-
|
|
39
83
|
_S :: Array(u32, usize(64))(
|
|
40
|
-
u32(7),
|
|
41
|
-
u32(
|
|
42
|
-
u32(
|
|
43
|
-
u32(
|
|
44
|
-
u32(
|
|
45
|
-
u32(
|
|
46
|
-
u32(
|
|
47
|
-
u32(
|
|
84
|
+
u32(7),
|
|
85
|
+
u32(12),
|
|
86
|
+
u32(17),
|
|
87
|
+
u32(22),
|
|
88
|
+
u32(7),
|
|
89
|
+
u32(12),
|
|
90
|
+
u32(17),
|
|
91
|
+
u32(22),
|
|
92
|
+
u32(7),
|
|
93
|
+
u32(12),
|
|
94
|
+
u32(17),
|
|
95
|
+
u32(22),
|
|
96
|
+
u32(7),
|
|
97
|
+
u32(12),
|
|
98
|
+
u32(17),
|
|
99
|
+
u32(22),
|
|
100
|
+
u32(5),
|
|
101
|
+
u32(9),
|
|
102
|
+
u32(14),
|
|
103
|
+
u32(20),
|
|
104
|
+
u32(5),
|
|
105
|
+
u32(9),
|
|
106
|
+
u32(14),
|
|
107
|
+
u32(20),
|
|
108
|
+
u32(5),
|
|
109
|
+
u32(9),
|
|
110
|
+
u32(14),
|
|
111
|
+
u32(20),
|
|
112
|
+
u32(5),
|
|
113
|
+
u32(9),
|
|
114
|
+
u32(14),
|
|
115
|
+
u32(20),
|
|
116
|
+
u32(4),
|
|
117
|
+
u32(11),
|
|
118
|
+
u32(16),
|
|
119
|
+
u32(23),
|
|
120
|
+
u32(4),
|
|
121
|
+
u32(11),
|
|
122
|
+
u32(16),
|
|
123
|
+
u32(23),
|
|
124
|
+
u32(4),
|
|
125
|
+
u32(11),
|
|
126
|
+
u32(16),
|
|
127
|
+
u32(23),
|
|
128
|
+
u32(4),
|
|
129
|
+
u32(11),
|
|
130
|
+
u32(16),
|
|
131
|
+
u32(23),
|
|
132
|
+
u32(6),
|
|
133
|
+
u32(10),
|
|
134
|
+
u32(15),
|
|
135
|
+
u32(21),
|
|
136
|
+
u32(6),
|
|
137
|
+
u32(10),
|
|
138
|
+
u32(15),
|
|
139
|
+
u32(21),
|
|
140
|
+
u32(6),
|
|
141
|
+
u32(10),
|
|
142
|
+
u32(15),
|
|
143
|
+
u32(21),
|
|
144
|
+
u32(6),
|
|
145
|
+
u32(10),
|
|
146
|
+
u32(15),
|
|
147
|
+
u32(21)
|
|
48
148
|
);
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
((x << n) | (x >> (u32(32) - n)))
|
|
149
|
+
_rotl32 :: (fn(x : u32, n : u32) -> u32)(
|
|
150
|
+
(x << n) | (x >> (u32(32) - n))
|
|
52
151
|
);
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
((u32((p &+ usize(2)).*) << u32(16)) | (u32((p &+ usize(3)).*) << u32(24))))
|
|
152
|
+
_le32 :: (fn(p : *(u8)) -> u32)(
|
|
153
|
+
(u32(p.*) | (u32((p &+ usize(1)).*) << u32(8))) |
|
|
154
|
+
((u32((p &+ usize(2)).*) << u32(16)) | (u32((p &+ usize(3)).*) << u32(24)))
|
|
57
155
|
);
|
|
58
|
-
|
|
59
|
-
_md5_block :: (fn(block: *(u8), h: *(u32)) -> unit)({
|
|
156
|
+
_md5_block :: (fn(block : *(u8), h : *(u32)) -> unit)({
|
|
60
157
|
a := (h &+ usize(0)).*;
|
|
61
158
|
b := (h &+ usize(1)).*;
|
|
62
159
|
c := (h &+ usize(2)).*;
|
|
63
160
|
d := (h &+ usize(3)).*;
|
|
64
161
|
i := usize(0);
|
|
65
|
-
while
|
|
162
|
+
while(i < usize(64), i = (i + usize(1)), {
|
|
66
163
|
fv := u32(0);
|
|
67
|
-
g
|
|
164
|
+
g := usize(0);
|
|
68
165
|
cond(
|
|
69
166
|
(i < usize(16)) => {
|
|
70
|
-
fv = ((b & c) | ((~b) & d));
|
|
71
|
-
g
|
|
167
|
+
fv = ((b & c) | ((~(b)) & d));
|
|
168
|
+
g = i;
|
|
72
169
|
},
|
|
73
170
|
(i < usize(32)) => {
|
|
74
|
-
fv = ((d & b) | ((~d) & c));
|
|
75
|
-
g
|
|
171
|
+
fv = ((d & b) | ((~(d)) & c));
|
|
172
|
+
g = (((i * usize(5)) + usize(1)) % usize(16));
|
|
76
173
|
},
|
|
77
174
|
(i < usize(48)) => {
|
|
78
175
|
fv = ((b ^ c) ^ d);
|
|
79
|
-
g
|
|
176
|
+
g = (((i * usize(3)) + usize(5)) % usize(16));
|
|
80
177
|
},
|
|
81
178
|
true => {
|
|
82
|
-
fv = (c ^ (b | (~d)));
|
|
83
|
-
g
|
|
179
|
+
fv = (c ^ (b | (~(d))));
|
|
180
|
+
g = ((i * usize(7)) % usize(16));
|
|
84
181
|
}
|
|
85
182
|
);
|
|
86
|
-
fv = (((fv + a) + _T(i)) + _le32(
|
|
87
|
-
a
|
|
88
|
-
d
|
|
89
|
-
c
|
|
90
|
-
b
|
|
91
|
-
};
|
|
183
|
+
fv = (((fv + a) + _T(i)) + _le32(block &+ (g * usize(4))));
|
|
184
|
+
a = d;
|
|
185
|
+
d = c;
|
|
186
|
+
c = b;
|
|
187
|
+
b = (b + _rotl32(fv, _S(i)));
|
|
188
|
+
});
|
|
92
189
|
(h &+ usize(0)).* = ((h &+ usize(0)).* + a);
|
|
93
190
|
(h &+ usize(1)).* = ((h &+ usize(1)).* + b);
|
|
94
191
|
(h &+ usize(2)).* = ((h &+ usize(2)).* + c);
|
|
95
192
|
(h &+ usize(3)).* = ((h &+ usize(3)).* + d);
|
|
96
193
|
});
|
|
97
|
-
|
|
98
194
|
// Compute an MD5 digest over `data`.
|
|
99
|
-
md5 :: (fn(data: ArrayList(u8)) -> Array(u8, usize(16)))({
|
|
195
|
+
md5 :: (fn(data : ArrayList(u8)) -> Array(u8, usize(16)))({
|
|
100
196
|
h := Array(u32, usize(4))(
|
|
101
|
-
u32(0x67452301),
|
|
197
|
+
u32(0x67452301),
|
|
198
|
+
u32(0xefcdab89),
|
|
199
|
+
u32(0x98badcfe),
|
|
200
|
+
u32(0x10325476)
|
|
102
201
|
);
|
|
103
202
|
h_ptr := &(h(usize(0)));
|
|
104
|
-
n
|
|
203
|
+
n := data.len();
|
|
105
204
|
// Process full blocks
|
|
106
205
|
i := usize(0);
|
|
107
|
-
while
|
|
206
|
+
while((i + usize(64)) <= n, i = (i + usize(64)), {
|
|
108
207
|
chunk_ptr := (*(u8)(data.ptr().unwrap()) &+ i);
|
|
109
208
|
_md5_block(chunk_ptr, h_ptr);
|
|
110
|
-
};
|
|
209
|
+
});
|
|
111
210
|
// Final block(s) with padding
|
|
112
211
|
pad_buf := Array(u8, usize(128)).fill(u8(0));
|
|
113
212
|
pad_ptr := &(pad_buf(usize(0)));
|
|
114
213
|
rem := (n - i);
|
|
115
214
|
j := usize(0);
|
|
116
|
-
while
|
|
117
|
-
(pad_ptr &+ j).* = data.get(
|
|
118
|
-
};
|
|
215
|
+
while(j < rem, j = (j + usize(1)), {
|
|
216
|
+
(pad_ptr &+ j).* = data.get(i + j).unwrap();
|
|
217
|
+
});
|
|
119
218
|
(pad_ptr &+ rem).* = u8(0x80);
|
|
120
219
|
cond(
|
|
121
220
|
(rem < usize(56)) => {
|
|
122
221
|
// Length fits in this block
|
|
123
|
-
bit_len := u64(
|
|
222
|
+
bit_len := u64(n * usize(8));
|
|
124
223
|
(pad_ptr &+ usize(56)).* = u8(bit_len);
|
|
125
|
-
(pad_ptr &+ usize(57)).* = u8(
|
|
126
|
-
(pad_ptr &+ usize(58)).* = u8(
|
|
127
|
-
(pad_ptr &+ usize(59)).* = u8(
|
|
128
|
-
(pad_ptr &+ usize(60)).* = u8(
|
|
129
|
-
(pad_ptr &+ usize(61)).* = u8(
|
|
130
|
-
(pad_ptr &+ usize(62)).* = u8(
|
|
131
|
-
(pad_ptr &+ usize(63)).* = u8(
|
|
224
|
+
(pad_ptr &+ usize(57)).* = u8(bit_len >> u64(8));
|
|
225
|
+
(pad_ptr &+ usize(58)).* = u8(bit_len >> u64(16));
|
|
226
|
+
(pad_ptr &+ usize(59)).* = u8(bit_len >> u64(24));
|
|
227
|
+
(pad_ptr &+ usize(60)).* = u8(bit_len >> u64(32));
|
|
228
|
+
(pad_ptr &+ usize(61)).* = u8(bit_len >> u64(40));
|
|
229
|
+
(pad_ptr &+ usize(62)).* = u8(bit_len >> u64(48));
|
|
230
|
+
(pad_ptr &+ usize(63)).* = u8(bit_len >> u64(56));
|
|
132
231
|
_md5_block(pad_ptr, h_ptr);
|
|
133
232
|
},
|
|
134
233
|
true => {
|
|
@@ -136,42 +235,39 @@ md5 :: (fn(data: ArrayList(u8)) -> Array(u8, usize(16)))({
|
|
|
136
235
|
_md5_block(pad_ptr, h_ptr);
|
|
137
236
|
pad2 := Array(u8, usize(64)).fill(u8(0));
|
|
138
237
|
pad2_ptr := &(pad2(usize(0)));
|
|
139
|
-
bit_len := u64(
|
|
238
|
+
bit_len := u64(n * usize(8));
|
|
140
239
|
(pad2_ptr &+ usize(56)).* = u8(bit_len);
|
|
141
|
-
(pad2_ptr &+ usize(57)).* = u8(
|
|
142
|
-
(pad2_ptr &+ usize(58)).* = u8(
|
|
143
|
-
(pad2_ptr &+ usize(59)).* = u8(
|
|
144
|
-
(pad2_ptr &+ usize(60)).* = u8(
|
|
145
|
-
(pad2_ptr &+ usize(61)).* = u8(
|
|
146
|
-
(pad2_ptr &+ usize(62)).* = u8(
|
|
147
|
-
(pad2_ptr &+ usize(63)).* = u8(
|
|
240
|
+
(pad2_ptr &+ usize(57)).* = u8(bit_len >> u64(8));
|
|
241
|
+
(pad2_ptr &+ usize(58)).* = u8(bit_len >> u64(16));
|
|
242
|
+
(pad2_ptr &+ usize(59)).* = u8(bit_len >> u64(24));
|
|
243
|
+
(pad2_ptr &+ usize(60)).* = u8(bit_len >> u64(32));
|
|
244
|
+
(pad2_ptr &+ usize(61)).* = u8(bit_len >> u64(40));
|
|
245
|
+
(pad2_ptr &+ usize(62)).* = u8(bit_len >> u64(48));
|
|
246
|
+
(pad2_ptr &+ usize(63)).* = u8(bit_len >> u64(56));
|
|
148
247
|
_md5_block(pad2_ptr, h_ptr);
|
|
149
248
|
}
|
|
150
249
|
);
|
|
151
250
|
// Output little-endian digest
|
|
152
251
|
digest := Array(u8, usize(16)).fill(u8(0));
|
|
153
252
|
k := usize(0);
|
|
154
|
-
while
|
|
253
|
+
while(k < usize(4), k = (k + usize(1)), {
|
|
155
254
|
w := h(k);
|
|
156
|
-
digest(
|
|
157
|
-
digest((
|
|
158
|
-
digest((
|
|
159
|
-
digest((
|
|
160
|
-
};
|
|
255
|
+
digest(k * usize(4)) = u8(w);
|
|
256
|
+
digest((k * usize(4)) + usize(1)) = u8(w >> u32(8));
|
|
257
|
+
digest((k * usize(4)) + usize(2)) = u8(w >> u32(16));
|
|
258
|
+
digest((k * usize(4)) + usize(3)) = u8(w >> u32(24));
|
|
259
|
+
});
|
|
161
260
|
digest
|
|
162
261
|
});
|
|
163
|
-
|
|
164
|
-
export md5;
|
|
165
|
-
|
|
262
|
+
export(md5);
|
|
166
263
|
// Return the 32-character lowercase hex MD5 digest.
|
|
167
|
-
md5_hex :: (fn(data: ArrayList(u8)) -> String)({
|
|
264
|
+
md5_hex :: (fn(data : ArrayList(u8)) -> String)({
|
|
168
265
|
digest := md5(data);
|
|
169
|
-
bytes
|
|
266
|
+
bytes := ArrayList(u8).with_capacity(usize(16));
|
|
170
267
|
i := usize(0);
|
|
171
|
-
while
|
|
268
|
+
while(i < usize(16), i = (i + usize(1)), {
|
|
172
269
|
bytes.push(digest(i));
|
|
173
|
-
};
|
|
270
|
+
});
|
|
174
271
|
hex_encode(bytes)
|
|
175
272
|
});
|
|
176
|
-
|
|
177
|
-
export md5_hex;
|
|
273
|
+
export(md5_hex);
|
package/std/crypto/random.yo
CHANGED
|
@@ -9,56 +9,52 @@
|
|
|
9
9
|
//!
|
|
10
10
|
//! id := uuid_v4(); // "550e8400-e29b-41d4-a716-446655440000"
|
|
11
11
|
//! ```
|
|
12
|
-
|
|
13
|
-
{
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
{
|
|
17
|
-
{
|
|
18
|
-
{
|
|
19
|
-
{ ToString } :: import "../fmt";
|
|
20
|
-
|
|
12
|
+
{ ArrayList } :: import("../collections/array_list");
|
|
13
|
+
{ platform, Platform } :: import("../process");
|
|
14
|
+
open(import("../string"));
|
|
15
|
+
{ snprintf } :: import("../libc/stdio");
|
|
16
|
+
{ hex_encode } :: import("../encoding/hex");
|
|
17
|
+
{ Error, AnyError, Exception } :: import("../error");
|
|
18
|
+
{ ToString } :: import("../fmt");
|
|
21
19
|
// ============================================================================
|
|
22
20
|
// Error type
|
|
23
21
|
// ============================================================================
|
|
24
|
-
|
|
25
22
|
/// Errors that can occur during cryptographic random operations.
|
|
26
23
|
CryptoError :: enum(
|
|
27
24
|
/// Platform does not support secure random generation.
|
|
28
25
|
Unavailable,
|
|
29
26
|
/// Other platform-specific error.
|
|
30
|
-
Other(msg: String)
|
|
27
|
+
Other(msg : String)
|
|
31
28
|
);
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
29
|
+
impl(
|
|
30
|
+
CryptoError,
|
|
31
|
+
ToString(
|
|
32
|
+
to_string : (
|
|
33
|
+
self ->
|
|
34
|
+
match(
|
|
35
|
+
self,
|
|
36
|
+
.Unavailable => `crypto: platform random unavailable`,
|
|
37
|
+
.Other(msg) => `crypto error: ${msg}`
|
|
38
|
+
)
|
|
38
39
|
)
|
|
39
40
|
)
|
|
40
|
-
)
|
|
41
|
-
|
|
41
|
+
);
|
|
42
42
|
impl(CryptoError, Error());
|
|
43
|
-
|
|
44
|
-
export CryptoError;
|
|
45
|
-
|
|
43
|
+
export(CryptoError);
|
|
46
44
|
// ============================================================================
|
|
47
45
|
// Platform externs
|
|
48
46
|
// ============================================================================
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
__yo_getrandom
|
|
52
|
-
__yo_arc4random_buf: (fn(buf: *(u8), nbytes: usize) -> unit),
|
|
53
|
-
__yo_bcrypt_gen_random: (fn(buf: *(u8), size: u32) -> i32),
|
|
54
|
-
__yo_getentropy: (fn(buf: *(u8), buflen: usize) -> i32)
|
|
55
|
-
;
|
|
56
|
-
|
|
47
|
+
extern(
|
|
48
|
+
"Yo",
|
|
49
|
+
__yo_getrandom : (fn(buf : *(u8), buflen : usize, flags : u32) -> isize),
|
|
50
|
+
__yo_arc4random_buf : (fn(buf : *(u8), nbytes : usize) -> unit),
|
|
51
|
+
__yo_bcrypt_gen_random : (fn(buf : *(u8), size : u32) -> i32),
|
|
52
|
+
__yo_getentropy : (fn(buf : *(u8), buflen : usize) -> i32)
|
|
53
|
+
);
|
|
57
54
|
// ============================================================================
|
|
58
55
|
// Fill a buffer with cryptographically secure random bytes.
|
|
59
56
|
// ============================================================================
|
|
60
|
-
|
|
61
|
-
random_bytes :: (fn(buf: *(u8), size: usize, using(exn : Exception)) -> unit)(
|
|
57
|
+
random_bytes :: (fn(buf : *(u8), size : usize, using(exn : Exception)) -> unit)(
|
|
62
58
|
cond(
|
|
63
59
|
(platform == Platform.Macos) => {
|
|
64
60
|
__yo_arc4random_buf(buf, size);
|
|
@@ -67,82 +63,79 @@ random_bytes :: (fn(buf: *(u8), size: usize, using(exn : Exception)) -> unit)(
|
|
|
67
63
|
r := __yo_bcrypt_gen_random(buf, u32(size));
|
|
68
64
|
cond(
|
|
69
65
|
(r == i32(0)) => (),
|
|
70
|
-
true => {
|
|
66
|
+
true => {
|
|
67
|
+
exn.throw(dyn(CryptoError.Unavailable));
|
|
68
|
+
}
|
|
71
69
|
);
|
|
72
70
|
},
|
|
73
71
|
((platform == Platform.Emscripten) || (platform == Platform.Wasi)) => {
|
|
74
72
|
// WASM/Emscripten/WASI: getentropy() via WASI random_get (max 256 bytes per call)
|
|
75
73
|
remaining := size;
|
|
76
74
|
offset := usize(0);
|
|
77
|
-
while
|
|
75
|
+
while(remaining > usize(0), {
|
|
78
76
|
chunk := cond(
|
|
79
77
|
(remaining > usize(256)) => usize(256),
|
|
80
78
|
true => remaining
|
|
81
79
|
);
|
|
82
|
-
ret := __yo_getentropy(
|
|
80
|
+
ret := __yo_getentropy(buf &+ offset, chunk);
|
|
83
81
|
cond(
|
|
84
|
-
(ret < i32(0)) => {
|
|
82
|
+
(ret < i32(0)) => {
|
|
83
|
+
exn.throw(dyn(CryptoError.Unavailable));
|
|
84
|
+
},
|
|
85
85
|
true => ()
|
|
86
86
|
);
|
|
87
87
|
offset = (offset + chunk);
|
|
88
88
|
remaining = (remaining - chunk);
|
|
89
|
-
};
|
|
89
|
+
});
|
|
90
90
|
},
|
|
91
91
|
true => {
|
|
92
92
|
// Linux: getrandom syscall
|
|
93
93
|
ret := __yo_getrandom(buf, size, u32(0));
|
|
94
94
|
cond(
|
|
95
|
-
(ret < isize(0)) => {
|
|
95
|
+
(ret < isize(0)) => {
|
|
96
|
+
exn.throw(dyn(CryptoError.Unavailable));
|
|
97
|
+
},
|
|
96
98
|
true => ()
|
|
97
99
|
);
|
|
98
100
|
}
|
|
99
101
|
)
|
|
100
102
|
);
|
|
101
|
-
|
|
102
|
-
export random_bytes;
|
|
103
|
-
|
|
103
|
+
export(random_bytes);
|
|
104
104
|
// ============================================================================
|
|
105
105
|
// Typed helpers
|
|
106
106
|
// ============================================================================
|
|
107
|
-
|
|
108
107
|
random_u32 :: (fn(using(exn : Exception)) -> u32)({
|
|
109
108
|
buf := Array(u8, usize(4)).fill(u8(0));
|
|
110
109
|
buf_ptr := &(buf(usize(0)));
|
|
111
110
|
random_bytes(buf_ptr, usize(4));
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
});
|
|
117
|
-
|
|
111
|
+
u32(buf(usize(0))) |
|
|
112
|
+
(u32(buf(usize(1))) << u32(8)) |
|
|
113
|
+
(u32(buf(usize(2))) << u32(16)) |
|
|
114
|
+
(u32(buf(usize(3))) << u32(24))
|
|
115
|
+
});
|
|
118
116
|
random_u64 :: (fn(using(exn : Exception)) -> u64)({
|
|
119
117
|
lo := u64(random_u32());
|
|
120
118
|
hi := u64(random_u32());
|
|
121
|
-
|
|
119
|
+
lo | (hi << u64(32))
|
|
122
120
|
});
|
|
123
|
-
|
|
124
121
|
random_f64 :: (fn(using(exn : Exception)) -> f64)(
|
|
125
|
-
|
|
122
|
+
f64(random_u64()) / f64(18446744073709551615.0)
|
|
126
123
|
);
|
|
127
|
-
|
|
128
124
|
// Return a random integer in the half-open range [min, max).
|
|
129
|
-
random_range :: (fn(min: i64, max: i64, using(exn : Exception)) -> i64)({
|
|
125
|
+
random_range :: (fn(min : i64, max : i64, using(exn : Exception)) -> i64)({
|
|
130
126
|
span := (max - min);
|
|
131
127
|
cond(
|
|
132
128
|
(span <= i64(0)) => min,
|
|
133
129
|
true => {
|
|
134
130
|
r := random_u64();
|
|
135
|
-
|
|
131
|
+
min + i64(r % u64(span))
|
|
136
132
|
}
|
|
137
133
|
)
|
|
138
134
|
});
|
|
139
|
-
|
|
140
|
-
export random_u32, random_u64, random_f64, random_range;
|
|
141
|
-
|
|
135
|
+
export(random_u32, random_u64, random_f64, random_range);
|
|
142
136
|
// ============================================================================
|
|
143
137
|
// UUID v4
|
|
144
138
|
// ============================================================================
|
|
145
|
-
|
|
146
139
|
// Generate a random UUID v4 string: "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"
|
|
147
140
|
uuid_v4 :: (fn(using(exn : Exception)) -> String)({
|
|
148
141
|
bytes := ArrayList(u8).with_capacity(usize(16));
|
|
@@ -154,9 +147,9 @@ uuid_v4 :: (fn(using(exn : Exception)) -> String)({
|
|
|
154
147
|
// Set variant bits
|
|
155
148
|
buf(usize(8)) = ((buf(usize(8)) & u8(0x3F)) | u8(0x80));
|
|
156
149
|
i := usize(0);
|
|
157
|
-
while
|
|
150
|
+
while(i < usize(16), i = (i + usize(1)), {
|
|
158
151
|
bytes.push(buf(i));
|
|
159
|
-
};
|
|
152
|
+
});
|
|
160
153
|
hex := hex_encode(bytes);
|
|
161
154
|
hex_bytes := hex.as_bytes();
|
|
162
155
|
// Insert dashes: 8-4-4-4-12
|
|
@@ -164,7 +157,7 @@ uuid_v4 :: (fn(using(exn : Exception)) -> String)({
|
|
|
164
157
|
positions := Array(usize, usize(4))(usize(8), usize(12), usize(16), usize(20));
|
|
165
158
|
j := usize(0);
|
|
166
159
|
dash_idx := usize(0);
|
|
167
|
-
while
|
|
160
|
+
while(j < hex_bytes.len(), j = (j + usize(1)), {
|
|
168
161
|
cond(
|
|
169
162
|
((dash_idx < usize(4)) && (j == positions(dash_idx))) => {
|
|
170
163
|
out.push(u8(45)); // '-'
|
|
@@ -173,8 +166,7 @@ uuid_v4 :: (fn(using(exn : Exception)) -> String)({
|
|
|
173
166
|
true => ()
|
|
174
167
|
);
|
|
175
168
|
out.push(hex_bytes.get(j).unwrap());
|
|
176
|
-
};
|
|
169
|
+
});
|
|
177
170
|
String.from_bytes(out)
|
|
178
171
|
});
|
|
179
|
-
|
|
180
|
-
export uuid_v4;
|
|
172
|
+
export(uuid_v4);
|