@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/sha256.yo
CHANGED
|
@@ -7,64 +7,111 @@
|
|
|
7
7
|
//!
|
|
8
8
|
//! digest := sha256_hex(data); // "2cf24dba..."
|
|
9
9
|
//! ```
|
|
10
|
-
|
|
11
|
-
{
|
|
12
|
-
|
|
13
|
-
open import "../string";
|
|
14
|
-
|
|
10
|
+
{ ArrayList } :: import("../collections/array_list");
|
|
11
|
+
{ hex_encode } :: import("../encoding/hex");
|
|
12
|
+
open(import("../string"));
|
|
15
13
|
// ============================================================================
|
|
16
14
|
// SHA-256 constants
|
|
17
15
|
// ============================================================================
|
|
18
|
-
|
|
19
16
|
_K :: Array(u32, usize(64))(
|
|
20
|
-
u32(0x428a2f98),
|
|
21
|
-
u32(
|
|
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(
|
|
17
|
+
u32(0x428a2f98),
|
|
18
|
+
u32(0x71374491),
|
|
19
|
+
u32(0xb5c0fbcf),
|
|
20
|
+
u32(0xe9b5dba5),
|
|
21
|
+
u32(0x3956c25b),
|
|
22
|
+
u32(0x59f111f1),
|
|
23
|
+
u32(0x923f82a4),
|
|
24
|
+
u32(0xab1c5ed5),
|
|
25
|
+
u32(0xd807aa98),
|
|
26
|
+
u32(0x12835b01),
|
|
27
|
+
u32(0x243185be),
|
|
28
|
+
u32(0x550c7dc3),
|
|
29
|
+
u32(0x72be5d74),
|
|
30
|
+
u32(0x80deb1fe),
|
|
31
|
+
u32(0x9bdc06a7),
|
|
32
|
+
u32(0xc19bf174),
|
|
33
|
+
u32(0xe49b69c1),
|
|
34
|
+
u32(0xefbe4786),
|
|
35
|
+
u32(0x0fc19dc6),
|
|
36
|
+
u32(0x240ca1cc),
|
|
37
|
+
u32(0x2de92c6f),
|
|
38
|
+
u32(0x4a7484aa),
|
|
39
|
+
u32(0x5cb0a9dc),
|
|
40
|
+
u32(0x76f988da),
|
|
41
|
+
u32(0x983e5152),
|
|
42
|
+
u32(0xa831c66d),
|
|
43
|
+
u32(0xb00327c8),
|
|
44
|
+
u32(0xbf597fc7),
|
|
45
|
+
u32(0xc6e00bf3),
|
|
46
|
+
u32(0xd5a79147),
|
|
47
|
+
u32(0x06ca6351),
|
|
48
|
+
u32(0x14292967),
|
|
49
|
+
u32(0x27b70a85),
|
|
50
|
+
u32(0x2e1b2138),
|
|
51
|
+
u32(0x4d2c6dfc),
|
|
52
|
+
u32(0x53380d13),
|
|
53
|
+
u32(0x650a7354),
|
|
54
|
+
u32(0x766a0abb),
|
|
55
|
+
u32(0x81c2c92e),
|
|
56
|
+
u32(0x92722c85),
|
|
57
|
+
u32(0xa2bfe8a1),
|
|
58
|
+
u32(0xa81a664b),
|
|
59
|
+
u32(0xc24b8b70),
|
|
60
|
+
u32(0xc76c51a3),
|
|
61
|
+
u32(0xd192e819),
|
|
62
|
+
u32(0xd6990624),
|
|
63
|
+
u32(0xf40e3585),
|
|
64
|
+
u32(0x106aa070),
|
|
65
|
+
u32(0x19a4c116),
|
|
66
|
+
u32(0x1e376c08),
|
|
67
|
+
u32(0x2748774c),
|
|
68
|
+
u32(0x34b0bcb5),
|
|
69
|
+
u32(0x391c0cb3),
|
|
70
|
+
u32(0x4ed8aa4a),
|
|
71
|
+
u32(0x5b9cca4f),
|
|
72
|
+
u32(0x682e6ff3),
|
|
73
|
+
u32(0x748f82ee),
|
|
74
|
+
u32(0x78a5636f),
|
|
75
|
+
u32(0x84c87814),
|
|
76
|
+
u32(0x8cc70208),
|
|
77
|
+
u32(0x90befffa),
|
|
78
|
+
u32(0xa4506ceb),
|
|
79
|
+
u32(0xbef9a3f7),
|
|
80
|
+
u32(0xc67178f2)
|
|
36
81
|
);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
((x >> n) | (x << (u32(32) - n)))
|
|
82
|
+
_rotr32 :: (fn(x : u32, n : u32) -> u32)(
|
|
83
|
+
(x >> n) | (x << (u32(32) - n))
|
|
40
84
|
);
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
_sg1 :: (fn(x: u32) -> u32)( ((_rotr32(x, u32(17)) ^ _rotr32(x, u32(19))) ^ (x >> u32(10))) );
|
|
48
|
-
|
|
85
|
+
_ch :: (fn(e : u32, f : u32, g : u32) -> u32)((e & f) ^ ((~(e)) & g));
|
|
86
|
+
_maj :: (fn(a : u32, b : u32, c : u32) -> u32)(((a & b) ^ (a & c)) ^ (b & c));
|
|
87
|
+
_ep0 :: (fn(a : u32) -> u32)((_rotr32(a, u32(2)) ^ _rotr32(a, u32(13))) ^ _rotr32(a, u32(22)));
|
|
88
|
+
_ep1 :: (fn(e : u32) -> u32)((_rotr32(e, u32(6)) ^ _rotr32(e, u32(11))) ^ _rotr32(e, u32(25)));
|
|
89
|
+
_sg0 :: (fn(x : u32) -> u32)((_rotr32(x, u32(7)) ^ _rotr32(x, u32(18))) ^ (x >> u32(3)));
|
|
90
|
+
_sg1 :: (fn(x : u32) -> u32)((_rotr32(x, u32(17)) ^ _rotr32(x, u32(19))) ^ (x >> u32(10)));
|
|
49
91
|
// Process one 512-bit block. `block` must be 64 bytes. `h` is 8 u32 words.
|
|
50
|
-
_sha256_block :: (fn(block: *(u8), h: *(u32)) -> unit)({
|
|
92
|
+
_sha256_block :: (fn(block : *(u8), h : *(u32)) -> unit)({
|
|
51
93
|
w := Array(u32, usize(64)).fill(u32(0));
|
|
52
94
|
// Load message schedule
|
|
53
95
|
i := usize(0);
|
|
54
|
-
while
|
|
96
|
+
while(i < usize(16), i = (i + usize(1)), {
|
|
55
97
|
off := (i * usize(4));
|
|
56
|
-
w(i) =
|
|
57
|
-
(
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
};
|
|
98
|
+
w(i) =
|
|
99
|
+
(
|
|
100
|
+
(
|
|
101
|
+
(u32((block &+ off).*) << u32(24)) |
|
|
102
|
+
(u32((block &+ (off + usize(1))).*) << u32(16))
|
|
103
|
+
) |
|
|
104
|
+
(
|
|
105
|
+
(u32((block &+ (off + usize(2))).*) << u32(8)) |
|
|
106
|
+
u32((block &+ (off + usize(3))).*)
|
|
107
|
+
)
|
|
108
|
+
);
|
|
109
|
+
});
|
|
110
|
+
while(i < usize(64), i = (i + usize(1)), {
|
|
111
|
+
s1 := _sg1(w(i - usize(2)));
|
|
112
|
+
s0 := _sg0(w(i - usize(15)));
|
|
113
|
+
w(i) = (((s1 + w(i - usize(7))) + s0) + w(i - usize(16)));
|
|
114
|
+
});
|
|
68
115
|
// Compression
|
|
69
116
|
a := (h &+ usize(0)).*;
|
|
70
117
|
b := (h &+ usize(1)).*;
|
|
@@ -75,18 +122,18 @@ _sha256_block :: (fn(block: *(u8), h: *(u32)) -> unit)({
|
|
|
75
122
|
g := (h &+ usize(6)).*;
|
|
76
123
|
hh := (h &+ usize(7)).*;
|
|
77
124
|
i2 := usize(0);
|
|
78
|
-
while
|
|
125
|
+
while(i2 < usize(64), i2 = (i2 + usize(1)), {
|
|
79
126
|
t1 := ((((hh + _ep1(e)) + _ch(e, f, g)) + _K(i2)) + w(i2));
|
|
80
127
|
t2 := (_ep0(a) + _maj(a, b, c));
|
|
81
128
|
hh = g;
|
|
82
|
-
g
|
|
83
|
-
f
|
|
84
|
-
e
|
|
85
|
-
d
|
|
86
|
-
c
|
|
87
|
-
b
|
|
88
|
-
a
|
|
89
|
-
};
|
|
129
|
+
g = f;
|
|
130
|
+
f = e;
|
|
131
|
+
e = (d + t1);
|
|
132
|
+
d = c;
|
|
133
|
+
c = b;
|
|
134
|
+
b = a;
|
|
135
|
+
a = (t1 + t2);
|
|
136
|
+
});
|
|
90
137
|
(h &+ usize(0)).* = ((h &+ usize(0)).* + a);
|
|
91
138
|
(h &+ usize(1)).* = ((h &+ usize(1)).* + b);
|
|
92
139
|
(h &+ usize(2)).* = ((h &+ usize(2)).* + c);
|
|
@@ -96,54 +143,56 @@ _sha256_block :: (fn(block: *(u8), h: *(u32)) -> unit)({
|
|
|
96
143
|
(h &+ usize(6)).* = ((h &+ usize(6)).* + g);
|
|
97
144
|
(h &+ usize(7)).* = ((h &+ usize(7)).* + hh);
|
|
98
145
|
});
|
|
99
|
-
|
|
100
146
|
// ============================================================================
|
|
101
147
|
// Sha256 streaming state
|
|
102
148
|
// ============================================================================
|
|
103
|
-
|
|
104
149
|
Sha256 :: object(
|
|
105
|
-
_h
|
|
106
|
-
_buf
|
|
150
|
+
_h : Array(u32, usize(8)),
|
|
151
|
+
_buf : Array(u8, usize(64)),
|
|
107
152
|
_buflen : usize,
|
|
108
|
-
_total
|
|
153
|
+
_total : u64
|
|
109
154
|
);
|
|
110
|
-
|
|
111
|
-
|
|
155
|
+
impl(
|
|
156
|
+
Sha256,
|
|
112
157
|
// Initialise a new hasher.
|
|
113
158
|
new : (fn() -> Self)(
|
|
114
159
|
Self(
|
|
115
|
-
_h: Array(u32, usize(8))(
|
|
116
|
-
u32(0x6a09e667),
|
|
117
|
-
u32(
|
|
160
|
+
_h : Array(u32, usize(8))(
|
|
161
|
+
u32(0x6a09e667),
|
|
162
|
+
u32(0xbb67ae85),
|
|
163
|
+
u32(0x3c6ef372),
|
|
164
|
+
u32(0xa54ff53a),
|
|
165
|
+
u32(0x510e527f),
|
|
166
|
+
u32(0x9b05688c),
|
|
167
|
+
u32(0x1f83d9ab),
|
|
168
|
+
u32(0x5be0cd19)
|
|
118
169
|
),
|
|
119
|
-
_buf:
|
|
120
|
-
_buflen: usize(0),
|
|
121
|
-
_total:
|
|
170
|
+
_buf : Array(u8, usize(64)).fill(u8(0)),
|
|
171
|
+
_buflen : usize(0),
|
|
172
|
+
_total : u64(0)
|
|
122
173
|
)
|
|
123
174
|
),
|
|
124
|
-
|
|
125
175
|
// Feed more data into the hasher.
|
|
126
|
-
update : (fn(self: Self, data: ArrayList(u8)) -> Self)({
|
|
176
|
+
update : (fn(self : Self, data : ArrayList(u8)) -> Self)({
|
|
127
177
|
i := usize(0);
|
|
128
|
-
while
|
|
178
|
+
while(i < data.len(), i = (i + usize(1)), {
|
|
129
179
|
self._buf(self._buflen) = data.get(i).unwrap();
|
|
130
180
|
self._buflen = (self._buflen + usize(1));
|
|
131
|
-
self._total
|
|
181
|
+
self._total = (self._total + u64(1));
|
|
132
182
|
cond(
|
|
133
183
|
(self._buflen == usize(64)) => {
|
|
134
184
|
buf_ptr := &(self._buf(usize(0)));
|
|
135
|
-
h_ptr
|
|
185
|
+
h_ptr := &(self._h(usize(0)));
|
|
136
186
|
_sha256_block(buf_ptr, h_ptr);
|
|
137
187
|
self._buflen = usize(0);
|
|
138
188
|
},
|
|
139
189
|
true => ()
|
|
140
190
|
);
|
|
141
|
-
};
|
|
191
|
+
});
|
|
142
192
|
self
|
|
143
193
|
}),
|
|
144
|
-
|
|
145
194
|
// Finalise and return the 32-byte digest.
|
|
146
|
-
finish : (fn(self: Self) -> Array(u8, usize(32)))({
|
|
195
|
+
finish : (fn(self : Self) -> Array(u8, usize(32)))({
|
|
147
196
|
// Padding
|
|
148
197
|
bit_len := (self._total * u64(8));
|
|
149
198
|
self._buf(self._buflen) = u8(0x80);
|
|
@@ -151,66 +200,61 @@ impl(Sha256,
|
|
|
151
200
|
cond(
|
|
152
201
|
(self._buflen > usize(56)) => {
|
|
153
202
|
// Fill rest with zeros and process
|
|
154
|
-
while
|
|
203
|
+
while(self._buflen < usize(64), self._buflen = (self._buflen + usize(1)), {
|
|
155
204
|
self._buf(self._buflen) = u8(0);
|
|
156
|
-
};
|
|
205
|
+
});
|
|
157
206
|
buf_ptr := &(self._buf(usize(0)));
|
|
158
|
-
h_ptr
|
|
207
|
+
h_ptr := &(self._h(usize(0)));
|
|
159
208
|
_sha256_block(buf_ptr, h_ptr);
|
|
160
209
|
self._buflen = usize(0);
|
|
161
210
|
},
|
|
162
211
|
true => ()
|
|
163
212
|
);
|
|
164
|
-
while
|
|
213
|
+
while(self._buflen < usize(56), self._buflen = (self._buflen + usize(1)), {
|
|
165
214
|
self._buf(self._buflen) = u8(0);
|
|
166
|
-
};
|
|
215
|
+
});
|
|
167
216
|
// Big-endian bit length
|
|
168
|
-
self._buf(usize(56)) = u8(
|
|
169
|
-
self._buf(usize(57)) = u8(
|
|
170
|
-
self._buf(usize(58)) = u8(
|
|
171
|
-
self._buf(usize(59)) = u8(
|
|
172
|
-
self._buf(usize(60)) = u8(
|
|
173
|
-
self._buf(usize(61)) = u8(
|
|
174
|
-
self._buf(usize(62)) = u8(
|
|
217
|
+
self._buf(usize(56)) = u8(bit_len >> u64(56));
|
|
218
|
+
self._buf(usize(57)) = u8(bit_len >> u64(48));
|
|
219
|
+
self._buf(usize(58)) = u8(bit_len >> u64(40));
|
|
220
|
+
self._buf(usize(59)) = u8(bit_len >> u64(32));
|
|
221
|
+
self._buf(usize(60)) = u8(bit_len >> u64(24));
|
|
222
|
+
self._buf(usize(61)) = u8(bit_len >> u64(16));
|
|
223
|
+
self._buf(usize(62)) = u8(bit_len >> u64(8));
|
|
175
224
|
self._buf(usize(63)) = u8(bit_len);
|
|
176
225
|
buf_ptr := &(self._buf(usize(0)));
|
|
177
|
-
h_ptr
|
|
226
|
+
h_ptr := &(self._h(usize(0)));
|
|
178
227
|
_sha256_block(buf_ptr, h_ptr);
|
|
179
228
|
// Extract digest
|
|
180
229
|
digest := Array(u8, usize(32)).fill(u8(0));
|
|
181
230
|
j := usize(0);
|
|
182
|
-
while
|
|
231
|
+
while(j < usize(8), j = (j + usize(1)), {
|
|
183
232
|
word := self._h(j);
|
|
184
|
-
digest(
|
|
185
|
-
digest((
|
|
186
|
-
digest((
|
|
187
|
-
digest((
|
|
188
|
-
};
|
|
233
|
+
digest(j * usize(4)) = u8(word >> u32(24));
|
|
234
|
+
digest((j * usize(4)) + usize(1)) = u8(word >> u32(16));
|
|
235
|
+
digest((j * usize(4)) + usize(2)) = u8(word >> u32(8));
|
|
236
|
+
digest((j * usize(4)) + usize(3)) = u8(word);
|
|
237
|
+
});
|
|
189
238
|
digest
|
|
190
239
|
})
|
|
191
240
|
);
|
|
192
|
-
|
|
193
|
-
export Sha256;
|
|
194
|
-
|
|
241
|
+
export(Sha256);
|
|
195
242
|
// ============================================================================
|
|
196
243
|
// Convenience functions
|
|
197
244
|
// ============================================================================
|
|
198
|
-
|
|
199
245
|
// Hash data and return the 32-byte digest.
|
|
200
|
-
sha256 :: (fn(data: ArrayList(u8)) -> Array(u8, usize(32)))(
|
|
246
|
+
sha256 :: (fn(data : ArrayList(u8)) -> Array(u8, usize(32)))(
|
|
201
247
|
Sha256.new().update(data).finish()
|
|
202
248
|
);
|
|
203
|
-
|
|
204
249
|
// Hash data and return the 64-character lowercase hex digest.
|
|
205
|
-
sha256_hex :: (fn(data: ArrayList(u8)) -> String)({
|
|
250
|
+
sha256_hex :: (fn(data : ArrayList(u8)) -> String)({
|
|
206
251
|
digest := sha256(data);
|
|
207
252
|
// Convert fixed array to ArrayList(u8) for hex_encode
|
|
208
253
|
bytes := ArrayList(u8).with_capacity(usize(32));
|
|
209
254
|
i := usize(0);
|
|
210
|
-
while
|
|
255
|
+
while(i < usize(32), i = (i + usize(1)), {
|
|
211
256
|
bytes.push(digest(i));
|
|
212
|
-
};
|
|
257
|
+
});
|
|
213
258
|
hex_encode(bytes)
|
|
214
259
|
});
|
|
215
|
-
|
|
216
|
-
export sha256, sha256_hex;
|
|
260
|
+
export(sha256, sha256_hex);
|
package/std/encoding/base64.yo
CHANGED
|
@@ -8,34 +8,28 @@
|
|
|
8
8
|
//! s := base64_encode(data);
|
|
9
9
|
//! b := base64_decode(s.to_str()).unwrap();
|
|
10
10
|
//! ```
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
{
|
|
14
|
-
{
|
|
15
|
-
{ Error, AnyError, Exception } :: import "../error";
|
|
16
|
-
|
|
11
|
+
open(import("../string"));
|
|
12
|
+
{ ArrayList } :: import("../collections/array_list");
|
|
13
|
+
{ EncodingError } :: import("./hex");
|
|
14
|
+
{ Error, AnyError, Exception } :: import("../error");
|
|
17
15
|
// ============================================================================
|
|
18
16
|
// Standard alphabet
|
|
19
17
|
// ============================================================================
|
|
20
|
-
|
|
21
18
|
_STD_ALPHA :: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
22
19
|
_URL_ALPHA :: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
|
23
20
|
_PAD :: u8(61); // '='
|
|
24
|
-
|
|
25
21
|
// ============================================================================
|
|
26
22
|
// Encoding
|
|
27
23
|
// ============================================================================
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
i
|
|
33
|
-
while (i < n), (i = (i + usize(3))), {
|
|
24
|
+
_encode_with :: (fn(data : ArrayList(u8), alpha : str, pad : bool) -> String)({
|
|
25
|
+
n := data.len();
|
|
26
|
+
out := ArrayList(u8).with_capacity(((n + usize(2)) / usize(3)) * usize(4));
|
|
27
|
+
i := usize(0);
|
|
28
|
+
while(i < n, i = (i + usize(3)), {
|
|
34
29
|
b0 := data.get(i).unwrap();
|
|
35
|
-
b1 := cond(((i + usize(1)) < n) => data.get(
|
|
36
|
-
b2 := cond(((i + usize(2)) < n) => data.get(
|
|
37
|
-
|
|
38
|
-
out.push(alpha.bytes(usize((b0 >> u8(2)))));
|
|
30
|
+
b1 := cond(((i + usize(1)) < n) => data.get(i + usize(1)).unwrap(), true => u8(0));
|
|
31
|
+
b2 := cond(((i + usize(2)) < n) => data.get(i + usize(2)).unwrap(), true => u8(0));
|
|
32
|
+
out.push(alpha.bytes(usize(b0 >> u8(2))));
|
|
39
33
|
out.push(alpha.bytes(usize(((b0 & u8(3)) << u8(4)) | (b1 >> u8(4)))));
|
|
40
34
|
cond(
|
|
41
35
|
((i + usize(1)) < n) => {
|
|
@@ -48,156 +42,168 @@ _encode_with :: (fn(data: ArrayList(u8), alpha: str, pad: bool) -> String)({
|
|
|
48
42
|
);
|
|
49
43
|
cond(
|
|
50
44
|
((i + usize(2)) < n) => {
|
|
51
|
-
out.push(alpha.bytes(usize(
|
|
45
|
+
out.push(alpha.bytes(usize(b2 & u8(63))));
|
|
52
46
|
},
|
|
53
47
|
pad => {
|
|
54
48
|
out.push(_PAD);
|
|
55
49
|
},
|
|
56
50
|
true => ()
|
|
57
51
|
);
|
|
58
|
-
};
|
|
52
|
+
});
|
|
59
53
|
String.from_bytes(out)
|
|
60
54
|
});
|
|
61
|
-
|
|
62
55
|
/// Encode bytes as standard base64 with padding.
|
|
63
|
-
base64_encode :: (fn(data: ArrayList(u8)) -> String)(
|
|
56
|
+
base64_encode :: (fn(data : ArrayList(u8)) -> String)(
|
|
64
57
|
_encode_with(data, _STD_ALPHA, true)
|
|
65
58
|
);
|
|
66
|
-
|
|
67
59
|
/// Encode bytes as URL-safe base64 without padding.
|
|
68
|
-
base64_encode_url :: (fn(data: ArrayList(u8)) -> String)(
|
|
60
|
+
base64_encode_url :: (fn(data : ArrayList(u8)) -> String)(
|
|
69
61
|
_encode_with(data, _URL_ALPHA, false)
|
|
70
62
|
);
|
|
71
|
-
|
|
72
|
-
export base64_encode, base64_encode_url;
|
|
73
|
-
|
|
63
|
+
export(base64_encode, base64_encode_url);
|
|
74
64
|
// ============================================================================
|
|
75
65
|
// Decoding
|
|
76
66
|
// ============================================================================
|
|
77
|
-
|
|
78
|
-
_decode_char :: (fn(c: u8, alpha: str, using(exn : Exception)) -> u8)({
|
|
67
|
+
_decode_char :: (fn(c : u8, alpha : str, using(exn : Exception)) -> u8)({
|
|
79
68
|
i := usize(0);
|
|
80
|
-
while
|
|
69
|
+
while(i < usize(64), i = (i + usize(1)), {
|
|
81
70
|
cond(
|
|
82
|
-
(alpha.bytes(i) == c) => {
|
|
71
|
+
(alpha.bytes(i) == c) => {
|
|
72
|
+
return(u8(i));
|
|
73
|
+
},
|
|
83
74
|
true => ()
|
|
84
75
|
);
|
|
85
|
-
};
|
|
86
|
-
exn.throw(dyn
|
|
76
|
+
});
|
|
77
|
+
exn.throw(dyn(EncodingError.InvalidChar(c)))
|
|
87
78
|
});
|
|
88
|
-
|
|
89
|
-
_decode_with :: (fn(s: str, alpha: str, using(exn : Exception)) -> ArrayList(u8))({
|
|
79
|
+
_decode_with :: (fn(s : str, alpha : str, using(exn : Exception)) -> ArrayList(u8))({
|
|
90
80
|
// Strip trailing padding
|
|
91
81
|
len := s.len();
|
|
92
|
-
while
|
|
93
|
-
out := ArrayList(u8).with_capacity((
|
|
94
|
-
i
|
|
95
|
-
while
|
|
82
|
+
while((len > usize(0)) && (s.bytes(len - usize(1)) == _PAD), len = (len - usize(1)), ());
|
|
83
|
+
out := ArrayList(u8).with_capacity((len * usize(3)) / usize(4));
|
|
84
|
+
i := usize(0);
|
|
85
|
+
while(i < len, i = (i + usize(4)), {
|
|
96
86
|
c0 := _decode_char(s.bytes(i), alpha);
|
|
97
87
|
c1 := cond(
|
|
98
|
-
((i + usize(1)) < len) => _decode_char(s.bytes(
|
|
88
|
+
((i + usize(1)) < len) => _decode_char(s.bytes(i + usize(1)), alpha),
|
|
99
89
|
true => u8(0)
|
|
100
90
|
);
|
|
101
|
-
out.push((
|
|
91
|
+
out.push((c0 << u8(2)) | (c1 >> u8(4)));
|
|
102
92
|
cond(
|
|
103
93
|
((i + usize(2)) < len) => {
|
|
104
|
-
c2 := _decode_char(s.bytes(
|
|
105
|
-
out.push(((
|
|
94
|
+
c2 := _decode_char(s.bytes(i + usize(2)), alpha);
|
|
95
|
+
out.push(((c1 & u8(15)) << u8(4)) | (c2 >> u8(2)));
|
|
106
96
|
cond(
|
|
107
97
|
((i + usize(3)) < len) => {
|
|
108
|
-
c3 := _decode_char(s.bytes(
|
|
109
|
-
out.push(((
|
|
98
|
+
c3 := _decode_char(s.bytes(i + usize(3)), alpha);
|
|
99
|
+
out.push(((c2 & u8(3)) << u8(6)) | c3);
|
|
110
100
|
},
|
|
111
101
|
true => ()
|
|
112
102
|
);
|
|
113
103
|
},
|
|
114
104
|
true => ()
|
|
115
105
|
);
|
|
116
|
-
};
|
|
106
|
+
});
|
|
117
107
|
out
|
|
118
108
|
});
|
|
119
|
-
|
|
120
109
|
/// Decode a standard base64 string to bytes. Throws via `Exception` on invalid input.
|
|
121
|
-
base64_decode :: (fn(s: str, using(exn : Exception)) -> ArrayList(u8))(
|
|
110
|
+
base64_decode :: (fn(s : str, using(exn : Exception)) -> ArrayList(u8))(
|
|
122
111
|
_decode_with(s, _STD_ALPHA)
|
|
123
112
|
);
|
|
124
|
-
|
|
125
113
|
/// Decode a URL-safe base64 string to bytes. Throws via `Exception` on invalid input.
|
|
126
|
-
base64_decode_url :: (fn(s: str, using(exn : Exception)) -> ArrayList(u8))(
|
|
114
|
+
base64_decode_url :: (fn(s : str, using(exn : Exception)) -> ArrayList(u8))(
|
|
127
115
|
_decode_with(s, _URL_ALPHA)
|
|
128
116
|
);
|
|
129
|
-
|
|
130
|
-
export base64_decode, base64_decode_url;
|
|
131
|
-
|
|
117
|
+
export(base64_decode, base64_decode_url);
|
|
132
118
|
// ============================================================================
|
|
133
119
|
// String-level convenience API
|
|
134
120
|
// ============================================================================
|
|
135
|
-
|
|
136
121
|
/// Encode a `String` to standard base64.
|
|
137
|
-
base64_encode_string :: (fn(input: String) -> String)(
|
|
122
|
+
base64_encode_string :: (fn(input : String) -> String)(
|
|
138
123
|
_encode_with(input.as_bytes(), _STD_ALPHA, true)
|
|
139
124
|
);
|
|
140
|
-
|
|
141
125
|
// Reverse lookup: base64 char to 0-63, or -1 for invalid.
|
|
142
|
-
_base64_index :: (fn(c: u8) -> i32)({
|
|
126
|
+
_base64_index :: (fn(c : u8) -> i32)({
|
|
143
127
|
alpha := _STD_ALPHA;
|
|
144
128
|
i := usize(0);
|
|
145
|
-
while
|
|
129
|
+
while(i < usize(64), i = (i + usize(1)), {
|
|
146
130
|
cond(
|
|
147
|
-
(alpha.bytes(i) == c) => {
|
|
131
|
+
(alpha.bytes(i) == c) => {
|
|
132
|
+
return(i32(i));
|
|
133
|
+
},
|
|
148
134
|
true => ()
|
|
149
135
|
);
|
|
150
|
-
};
|
|
151
|
-
i32(-1)
|
|
136
|
+
});
|
|
137
|
+
i32(-(1))
|
|
152
138
|
});
|
|
153
|
-
|
|
154
139
|
/// Decode a base64 `String`, ignoring whitespace. Returns `Result(String, String)`.
|
|
155
|
-
base64_decode_string :: (fn(input: String) -> Result(String, String))({
|
|
140
|
+
base64_decode_string :: (fn(input : String) -> Result(String, String))({
|
|
156
141
|
raw := input.as_str();
|
|
157
142
|
cleaned := ArrayList(u8).new();
|
|
158
143
|
i := usize(0);
|
|
159
|
-
while
|
|
144
|
+
while(i < raw.len(), i = (i + usize(1)), {
|
|
160
145
|
ch := raw.bytes(i);
|
|
161
146
|
cond(
|
|
162
147
|
(((ch == u8(32)) || (ch == u8(9))) || ((ch == u8(10)) || (ch == u8(13)))) => (),
|
|
163
|
-
true => {
|
|
148
|
+
true => {
|
|
149
|
+
cleaned.push(ch);
|
|
150
|
+
}
|
|
164
151
|
);
|
|
165
|
-
};
|
|
152
|
+
});
|
|
166
153
|
// Strip trailing padding
|
|
167
154
|
len := cleaned.len();
|
|
168
|
-
while
|
|
155
|
+
while((len > usize(0)) && (cleaned.get(len - usize(1)).unwrap() == u8(61)), len = (len - usize(1)), ());
|
|
169
156
|
out := ArrayList(u8).new();
|
|
170
157
|
j := usize(0);
|
|
171
|
-
while
|
|
158
|
+
while(j < len, j = (j + usize(4)), {
|
|
172
159
|
v0 := _base64_index(cleaned.get(j).unwrap());
|
|
173
|
-
cond(
|
|
160
|
+
cond(
|
|
161
|
+
(v0 == i32(-(1))) => {
|
|
162
|
+
return(.Err(`Invalid base64 input`));
|
|
163
|
+
},
|
|
164
|
+
true => ()
|
|
165
|
+
);
|
|
174
166
|
v1 := cond(
|
|
175
167
|
((j + usize(1)) < len) => {
|
|
176
|
-
tmp := _base64_index(cleaned.get(
|
|
177
|
-
cond(
|
|
168
|
+
tmp := _base64_index(cleaned.get(j + usize(1)).unwrap());
|
|
169
|
+
cond(
|
|
170
|
+
(tmp == i32(-(1))) => {
|
|
171
|
+
return(.Err(`Invalid base64 input`));
|
|
172
|
+
},
|
|
173
|
+
true => ()
|
|
174
|
+
);
|
|
178
175
|
tmp
|
|
179
176
|
},
|
|
180
177
|
true => i32(0)
|
|
181
178
|
);
|
|
182
|
-
out.push(u8((
|
|
179
|
+
out.push(u8((v0 << i32(2)) | (v1 >> i32(4))));
|
|
183
180
|
cond(
|
|
184
181
|
((j + usize(2)) < len) => {
|
|
185
|
-
v2 := _base64_index(cleaned.get(
|
|
186
|
-
cond(
|
|
187
|
-
|
|
182
|
+
v2 := _base64_index(cleaned.get(j + usize(2)).unwrap());
|
|
183
|
+
cond(
|
|
184
|
+
(v2 == i32(-(1))) => {
|
|
185
|
+
return(.Err(`Invalid base64 input`));
|
|
186
|
+
},
|
|
187
|
+
true => ()
|
|
188
|
+
);
|
|
189
|
+
out.push(u8(((v1 & i32(15)) << i32(4)) | (v2 >> i32(2))));
|
|
188
190
|
cond(
|
|
189
191
|
((j + usize(3)) < len) => {
|
|
190
|
-
v3 := _base64_index(cleaned.get(
|
|
191
|
-
cond(
|
|
192
|
-
|
|
192
|
+
v3 := _base64_index(cleaned.get(j + usize(3)).unwrap());
|
|
193
|
+
cond(
|
|
194
|
+
(v3 == i32(-(1))) => {
|
|
195
|
+
return(.Err(`Invalid base64 input`));
|
|
196
|
+
},
|
|
197
|
+
true => ()
|
|
198
|
+
);
|
|
199
|
+
out.push(u8(((v2 & i32(3)) << i32(6)) | v3));
|
|
193
200
|
},
|
|
194
201
|
true => ()
|
|
195
202
|
);
|
|
196
203
|
},
|
|
197
204
|
true => ()
|
|
198
205
|
);
|
|
199
|
-
};
|
|
206
|
+
});
|
|
200
207
|
.Ok(String.from_bytes(out))
|
|
201
208
|
});
|
|
202
|
-
|
|
203
|
-
export base64_encode_string, base64_decode_string;
|
|
209
|
+
export(base64_encode_string, base64_decode_string);
|