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+