commit 6da7f9b
zzo38
·
2023-10-01 03:56:44 +0000 UTC
parent 5f4a5b9
Add prg/blake2s.tal
1 files changed,
+148,
-0
+148,
-0
1@@ -0,0 +1,148 @@
2+\\ BLAKE2s (this implementation is public domain)
3+\\ Requires a nonstandard feature of uxn38 (port #16).
4+\\ Specify hash size in bytes (1 to 32) on command-line argument.
5+\\ This implementation is limited to 4 gigabytes of input.
6+\\ (See RFC 7693)
7+
8+|00
9+ @hi $2 @lo $2 ( number of bytes of input )
10+ @nn $2 ( number of bytes of hash )
11+ @ax @ah $1 @al $1
12+ @bx @bh $1 @bl $1
13+ @cx @ch $1 @cl $1
14+ @dx @dh $1 @dl $1
15+|40 @h ( internal state, and copy of initialization vector )
16+|80 @v ( local work vector )
17+|c0 @m ( data of message block )
18+
19+|0100
20+ #0116 DEO
21+ { 01 0040 0000 :IV 0000 00 [@ 40 } LITr 02 DEO2rk #60 ]; STA DEO2r
22+ \\ First figure out output block size (in bytes)
23+ [; #10 DEO2 BRK ]@
24+ #0a12 DEI EQU [? LIT2 0a -nn LDZ MUL #d012 DEI ADD ADD .nn STZ BRK ]@
25+ LIT2 67 -nn LDZ EOR #43 STZ
26+ #6b08 #40 STZ2
27+ \\ Ready to receive data
28+ LITr -m
29+ [; #10 DEO2 BRK ]@
30+ #17 DEI [?
31+ \\ Final
32+ #e07c #78 STZ2
33+ #2654 #7a STZ2
34+ F
35+ .nn LDZ2 [@ DUP #43 EOR LDZ hex INC NEQk ]?
36+ #0a18 DEO #800f DEO BRK
37+ ]@
38+ STHrk [? POPr LITr -m F ;ztom #02 DEO2 ]@
39+ .lo LDZ2k INC2 ORAk [? .hi LDZ2k INC2 ROT STZ2 ]@ ROT STZ2
40+ #12 DEI STHrk #03 EOR STZ INCr
41+ BRK
42+
43+@F
44+ \\ Initialization
45+ ;htov #02 DEO2
46+ .hi LDZ2 #510e EOR2 #b0 STZ2
47+ .lo LDZ2 #527f EOR2 #b2 STZ2
48+ \\ Mixing
49+ ;SIGMA [@
50+ #8082 #9092 #a0a2 #b0b2 G
51+ #8486 #9496 #a4a6 #b4b6 G
52+ #888a #989a #a8aa #b8ba G
53+ #8c8e #9c9e #acae #bcbe G
54+ #8082 #9496 #a8aa #bcbe G
55+ #8486 #989a #acae #b0b2 G
56+ #888a #9c9e #a0a2 #b4b6 G
57+ #8c8e #9092 #a4a6 #b8ba G
58+ DUP
59+ ]? POP2
60+ \\ Final XOR
61+ LITr 40 [@
62+ STHrk LDZ2
63+ STHrk #40 ADD LDZ2
64+ STHrk #60 ADD LDZ2
65+ EOR2 EOR2 STHrk STZ2
66+ INCr INCr STHrk #60 NEQ
67+ ]? POPr JMP2r
68+
69+%gah { .ah LDZ LDZ2 } %pah { .ah LDZ STZ2 }
70+%gal { .al LDZ LDZ2 } %pal { .al LDZ STZ2 }
71+%gbh { .bh LDZ LDZ2 } %pbh { .bh LDZ STZ2 }
72+%gbl { .bl LDZ LDZ2 } %pbl { .bl LDZ STZ2 }
73+%gch { .ch LDZ LDZ2 } %pch { .ch LDZ STZ2 }
74+%gcl { .cl LDZ LDZ2 } %pcl { .cl LDZ STZ2 }
75+%gdh { .dh LDZ LDZ2 } %pdh { .dh LDZ STZ2 }
76+%gdl { .dl LDZ LDZ2 } %pdl { .dl LDZ STZ2 }
77+
78+\\ v[a] := (v[a] + v[b] + x)
79+\\ v[d] := (v[d] ^ v[a]) >>> 16
80+\\ v[c] := (v[c] + v[d])
81+\\ v[b] := (v[b] ^ v[c]) >>> 12
82+\\ v[a] := (v[a] + v[b] + y)
83+\\ v[d] := (v[d] ^ v[a]) >>> 8
84+\\ v[c] := (v[c] + v[d])
85+\\ v[b] := (v[b] ^ v[c]) >>> 7
86+
87+%rotate {
88+ STH2k LITr \_:f^1+4<w SFT2r
89+ LIT \_:w SFT2 SWP2
90+ gbl EOR2
91+ STH2k LITr \_:w SFT2r EOR2r
92+ LIT \_f^1+4<w SFT2 ORA2
93+ pbh LITr -bl LDZr STZ2r
94+}
95+
96+@G ( a* b* c* d* sigma* -- sigma* )
97+ .dx STZ2 .cx STZ2 .bx STZ2 .ax STZ2
98+ G1 SWP2k pdl pdh SWP2
99+ G2 \c rotate INC
100+ G1 ROT ROT STH2k pdl SWP DUP2 pdh STH2r
101+ G2 \7 rotate INC
102+ JMP2r
103+
104+@G1 ( sigma* -- sigma* adh* adl* )
105+ LDAk LDZ2k ROT INC INC LDZ2
106+ gah gal asw SWP2 gbh gbl asw
107+ SWP2k pal pah
108+ gdh EOR2 SWP2 gdl EOR2 JMP2r
109+
110+@G2 ( dh* dl* -- cl* cbh* )
111+ gch gcl asw SWP2k pcl pch
112+ gbh EOR2 JMP2r
113+
114+@asw ( hi1* lo1* hi2* lo2* -- lo* hi* )
115+ \\ Add 32-bit numbers and swap high/low halfs
116+ ROT2 STH2k ADD2 STH2k ROT2 ROT2 GTH2r #00 STHr ADD2 ADD2 JMP2r
117+
118+@hex ( x -- )
119+ DUP #04 SFT [& #0f AND ]@
120+ DUP #09 GTH #27 MUL ADD #30 ADD #18 DEO JMP2r
121+
122+@htov 01 0040 0000 :h 0000 :v
123+@ztom 01 0040 0000 :zero 0000 :m
124+
125+@dump ( -- )
126+ ( TEST ONLY )
127+ #00 [@ LDZk hex INC DUP #03 AND [? #2018 DEO ]@ DUP #0f AND [? #0a18 DEO ]@ DUP ]?
128+ POP #0a18 DEO JMP2r
129+
130+@Before-alignment
131+\_@ff'&[@ff00"&18<+!] ( alignment )
132+@IV
133+ 6a09 e667 bb67 ae85 3c6e f372 a54f f53a
134+ 510e 527f 9b05 688c 1f83 d9ab 5be0 cd19
135+@zero
136+ $40
137+@SIGMA
138+ c0 c4 c8 cc d0 d4 d8 dc e0 e4 e8 ec f0 f4 f8 fc
139+ f8 e8 d0 e0 e4 fc f4 d8 c4 f0 c0 c8 ec dc d4 cc
140+ ec e0 f0 c0 d4 c8 fc f4 e8 f8 cc d8 dc c4 e4 d0
141+ dc e4 cc c4 f4 f0 ec f8 c8 d8 d4 e8 d0 c0 fc e0
142+ e4 c0 d4 dc c8 d0 e8 fc f8 c4 ec f0 d8 e0 cc f4
143+ c8 f0 d8 e8 c0 ec e0 cc d0 f4 dc d4 fc f8 c4 e4
144+ f0 d4 c4 fc f8 f4 d0 e8 c0 dc d8 cc e4 c8 e0 ec
145+ f4 ec dc f8 f0 c4 cc e4 d4 c0 fc d0 e0 d8 c8 e8
146+ d8 fc f8 e4 ec cc c0 e0 f0 c8 f4 dc c4 d0 e8 d4
147+ e8 c8 e0 d0 dc d8 c4 d4 fc ec e4 f8 cc f0 f4 c0
148+\_@ff00"&(1E) ( assertion )
149+