on 140ac0e help sign in
661 lines 16 kB history raw
1# 3e: AES encryption
2### `++aesc`
4 ++ aesc :: AES-256
5 ~% %aesc + ~
6 |%
8XX document
10### `++en`
12 ++ en :: ECB enc
13 ~/ %en
14 |= [a/@I b/@H] ^- @uxH
15 =+ ahem
16 (be & (ex a) b)
18XX document
20### `++de`
22 ++ de :: ECB dec
23 ~/ %de
24 |= [a/@I b/@H] ^- @uxH
25 =+ ahem
26 (be | (ix (ex a)) b)
27 --
29XX document
31### `++ahem`
33 =>
34 =+ =+ [gr=(ga 8 0x11b 3) few==>(fe .(a 5))]
35 =+ [pro=pro.gr dif=dif.gr pow=pow.gr ror=ror.few]
36 [pro=pro dif=dif pow=pow ror=ror nnk=8 nnb=4 nnr=14]
37 => |%
39XX document
41### `++cipa`
43 ++ cipa :: AES params
44 $_ ^? |%
47XX document
49### `++co`
51 ++ co *{p/@ q/@ r/@ s/@} :: col coefs
53XX document
55### `++ix`
57 ++ ix |~(a/@ *@) :: key index
60XX document
62### `++ro`
64 ++ ro *{p/@ q/@ r/@ s/@} :: row shifts
67XX document
69### `++su`
71 ++ su *@ :: s-box
73XX document
75### `++pen`
77 ++ pen :: encrypt
78 ^- cipa
79 |%
81XX document
83### `++co`
85 ++ co [0x2 0x3 1 1]
87XX document
89### `++ix`
91 ++ ix |~(a/@ *@) :: key index
93XX document
95### `++ro`
97 ++ ro *{p/@ q/@ r/@ s/@} :: row shifts
99XX document
101### `++su`
103 ++ su 0x7d0c.2155.6314.69e1.26d6.77ba.7e04.2b17.
104 6199.5383.3cbb.ebc8.b0f5.2aae.4d3b.e0a0.
105 ef9c.c993.9f7a.e52d.0d4a.b519.a97f.5160.
106 5fec.8027.5910.12b1.31c7.0788.33a8.dd1f.
107 f45a.cd78.fec0.db9a.2079.d2c6.4b3e.56fc.
108 1bbe.18aa.0e62.b76f.89c5.291d.711a.f147.
109 6edf.751c.e837.f9e2.8535.ade7.2274.ac96.
110 73e6.b4f0.cecf.f297.eadc.674f.4111.913a.
111 6b8a.1301.03bd.afc1.020f.3fca.8f1e.2cd0.
112 0645.b3b8.0558.e4f7.0ad3.bc8c.00ab.d890.
113 849d.8da7.5746.155e.dab9.edfd.5048.706c.
114 92b6.655d.cc5c.a4d4.1698.6886.64f6.f872.
115 25d1.8b6d.49a2.5b76.b224.d928.66a1.2e08.
116 4ec3.fa42.0b95.4cee.3d23.c2a6.3294.7b54.
117 cbe9.dec4.4443.8e34.87ff.2f9b.8239.e37c.
118 fbd7.f381.9ea3.40bf.38a5.3630.d56a.0952
119 --
120 ::
122XX document
124### `++pin`
126 ++ pin :: decrypt
127 ^- cipa
128 |%
130XX document
132### `++co`
134 ++ co [0xe 0xb 0xd 0x9]
136XX document
138### `++ix`
140 ++ ix :: key expand, inv
141 |= a=@ ^- @
142 =+ [i=1 j=_@ b=_@ c=co:pin]
143 |-
144 ?: =(nnr i)
145 a
146 => .(b (cut 7 [i 1] a))
147 => .(b (rep 5 (mcol (pode 5 4 b) c)))
148 => .(j (sub nnr i))
149 %= $
150 i +(i)
151 a
152 %+ can 7
153 :~ [i (cut 7 [0 i] a)]
154 [1 b]
155 [j (cut 7 [+(i) j] a)]
156 ==
157 ==
158 --
159 ::
161XX document
163### `++ro`
165 ++ ro [0 3 2 1]
167XX document
169### `++su`
171 ++ su 0x7d0c.2155.6314.69e1.26d6.77ba.7e04.2b17.
172 6199.5383.3cbb.ebc8.b0f5.2aae.4d3b.e0a0.
173 ef9c.c993.9f7a.e52d.0d4a.b519.a97f.5160.
174 5fec.8027.5910.12b1.31c7.0788.33a8.dd1f.
175 f45a.cd78.fec0.db9a.2079.d2c6.4b3e.56fc.
176 1bbe.18aa.0e62.b76f.89c5.291d.711a.f147.
177 6edf.751c.e837.f9e2.8535.ade7.2274.ac96.
178 73e6.b4f0.cecf.f297.eadc.674f.4111.913a.
179 6b8a.1301.03bd.afc1.020f.3fca.8f1e.2cd0.
180 0645.b3b8.0558.e4f7.0ad3.bc8c.00ab.d890.
181 849d.8da7.5746.155e.dab9.edfd.5048.706c.
182 92b6.655d.cc5c.a4d4.1698.6886.64f6.f872.
183 25d1.8b6d.49a2.5b76.b224.d928.66a1.2e08.
184 4ec3.fa42.0b95.4cee.3d23.c2a6.3294.7b54.
185 cbe9.dec4.4443.8e34.87ff.2f9b.8239.e37c.
186 fbd7.f381.9ea3.40bf.38a5.3630.d56a.0952
187 --
188 ::
190XX document
192### `++mcol`
194 ++ mcol
195 |= [a=(list ,@) b=[p=@ q=@ r=@ s=@]] ^- (list ,@)
196 =+ c=[p=_@ q=_@ r=_@ s=_@]
197 |- ^- (list ,@)
198 ?~ a ~
199 => .(p.c (cut 3 [0 1] i.a))
200 => .(q.c (cut 3 [1 1] i.a))
201 => .(r.c (cut 3 [2 1] i.a))
202 => .(s.c (cut 3 [3 1] i.a))
203 :_ $(a t.a)
204 %+ rep 3
205 %+ turn
206 %- limo
207 :~ [[p.c p.b] [q.c q.b] [r.c r.b] [s.c s.b]]
208 [[p.c s.b] [q.c p.b] [r.c q.b] [s.c r.b]]
209 [[p.c r.b] [q.c s.b] [r.c p.b] [s.c q.b]]
210 [[p.c q.b] [q.c r.b] [r.c s.b] [s.c p.b]]
211 ==
212 |= [a=[@ @] b=[@ @] c=[@ @] d=[@ @]]
213 :(dif (pro a) (pro b) (pro c) (pro d))
214 ::
216XX document
218### `++pode`
220 ++ pode :: explode to block
221 |= [a=bloq b=@ c=@] ^- (list ,@)
222 =+ d=(rip a c)
223 =+ m=(met a c)
224 |-
225 ?: =(m b)
226 d
227 $(m +(m), d (weld d (limo [0 ~])))
229XX document
231### `++sube`
233 ++ sube :: s-box word
234 |= [a=@ b=@] ^- @
235 (rep 3 (turn (pode 3 4 a) |=(c=@ (cut 3 [c 1] b))))
236 --
237 |%
239XX document
241### `++be`
243 ++ be :: block cipher
244 |= [a=? b=@ c=@H] ^- @uxH
245 ~| %be-aesc
246 => %= .
247 +
248 => +
249 |%
251XX document
253### `++ankh`
255 ++ ankh
256 |= [a=cipa b=@ c=@]
257 (pode 5 nnb (cut 5 [(mul (ix.a b) nnb) nnb] c))
259XX document
261### `++sark`
263 ++ sark
264 |= [c=(list ,@) d=(list ,@)] ^- (list ,@)
265 ?~ c ~
266 ?~ d !!
267 [(mix i.c i.d) $(c t.c, d t.d)]
269XX document
271### `++srow`
273 ++ srow
274 |= [a=cipa b=(list ,@)] ^- (list ,@)
275 =+ [c=0 d=~ e=ro.a]
276 |-
277 ?: =(c nnb)
278 d
279 :_ $(c +(c))
280 %+ rep 3
281 %+ turn
282 (limo [0 p.e] [1 q.e] [2 r.e] [3 s.e] ~)
283 |= [f=@ g=@]
284 (cut 3 [f 1] (snag (mod (add g c) nnb) b))
286XX document
288### `++subs`
290 ++ subs
291 |= [a=cipa b=(list ,@)] ^- (list ,@)
292 ?~ b ~
293 [(sube i.b su.a) $(b t.b)]
294 --
295 ==
296 =+ [d=?:(a pen pin) e=(pode 5 nnb c) f=1]
297 => .(e (sark e (ankh d 0 b)))
298 |-
299 ?. =(nnr f)
300 => .(e (subs d e))
301 => .(e (srow d e))
302 => .(e (mcol e co.d))
303 => .(e (sark e (ankh d f b)))
304 $(f +(f))
305 => .(e (subs d e))
306 => .(e (srow d e))
307 => .(e (sark e (ankh d nnr b)))
308 (rep 5 e)
310XX document
312### `++ex`
314 ++ ex :: key expand
315 |= a=@I ^- @
316 =+ [b=a c=0 d=su:pen i=nnk]
317 |-
318 ?: =(i (mul nnb +(nnr)))
319 b
320 => .(c (cut 5 [(dec i) 1] b))
321 => ?: =(0 (mod i nnk))
322 => .(c (ror 3 1 c))
323 => .(c (sube c d))
324 .(c (mix c (pow (dec (div i nnk)) 2)))
325 ?: &((gth nnk 6) =(4 (mod i nnk)))
326 .(c (sube c d))
327 .
328 => .(c (mix c (cut 5 [(sub i nnk) 1] b)))
329 => .(b (can 5 [i b] [1 c] ~))
330 $(i +(i))
332XX document
334### `++ix`
336 ++ ix :: key expand, inv
337 |= a=@ ^- @
338 =+ [i=1 j=_@ b=_@ c=co:pin]
339 |-
340 ?: =(nnr i)
341 a
342 => .(b (cut 7 [i 1] a))
343 => .(b (rep 5 (mcol (pode 5 4 b) c)))
344 => .(j (sub nnr i))
345 %= $
346 i +(i)
347 a
348 %+ can 7
349 :~ [i (cut 7 [0 i] a)]
350 [1 b]
351 [j (cut 7 [+(i) j] a)]
352 ==
353 ==
354 --
355 ::
357XX document
359### `++curt`
361 ++ curt :: curve25519
362 |= [a=@ b=@]
363 => %= .
364 +
365 => +
366 =+ =+ [p=486.662 q=(sub (bex 255) 19)]
367 =+ fq=~(. fo q)
368 [p=p q=q fq=fq]
369 |%
371XX document
373### `++cla`
375 ++ cla
376 |= raw=@
377 =+ low=(dis 248 (cut 3 [0 1] raw))
378 =+ hih=(con 64 (dis 127 (cut 3 [31 1] raw)))
379 =+ mid=(cut 3 [1 30] raw)
380 (can 3 [[1 low] [30 mid] [1 hih] ~])
382XX document
384### `++sqr`
386 ++ sqr |=(a=@ (mul a a))
388XX document
390### `++inv`
392 ++ inv |=(a=@ (~(exp fo q) (sub q 2) a))
394XX document
396### `++cad`
398 ++ cad
399 |= [n=[x=@ z=@] m=[x=@ z=@] d=[x=@ z=@]]
400 =+ ^= xx
401 ;: mul 4 z.d
402 %- sqr %- abs:si
403 %+ dif:si
404 (sun:si (mul x.m x.n))
405 (sun:si (mul z.m z.n))
406 ==
407 =+ ^= zz
408 ;: mul 4 x.d
409 %- sqr %- abs:si
410 %+ dif:si
411 (sun:si (mul x.m z.n))
412 (sun:si (mul z.m x.n))
413 ==
414 [(sit.fq xx) (sit.fq zz)]
416XX document
418### `++cub`
420 ++ cub
421 |= [x=@ z=@]
422 =+ ^= xx
423 %+ mul
424 %- sqr %- abs:si
425 (dif:si (sun:si x) (sun:si z))
426 (sqr (add x z))
427 =+ ^= zz
428 ;: mul 4 x z
429 :(add (sqr x) :(mul p x z) (sqr z))
430 ==
431 [(sit.fq xx) (sit.fq zz)]
432 --
433 ==
434 =+ one=[b 1]
435 =+ i=253
436 =+ r=one
437 =+ s=(cub one)
438 |-
439 ?: =(i 0)
440 =+ x=(cub r)
441 (sit.fq (mul -.x (inv +.x)))
442 =+ m=(rsh 0 i a)
443 ?: =(0 (mod m 2))
444 $(i (dec i), s (cad r s one), r (cub r))
445 $(i (dec i), r (cad r s one), s (cub s))
446 ::
448XX document
450### `++ed`
452 ++ ed :: ed25519
453 =>
454 =+ =+ [b=256 q=(sub (bex 255) 19)]
455 =+ fq=~(. fo q)
456 =+ ^= l
457 %+ add
458 (bex 252)
459 27.742.317.777.372.353.535.851.937.790.883.648.493
460 =+ d=(dif.fq 0 (fra.fq 121.665 121.666))
461 =+ ii=(exp.fq (div (dec q) 4) 2)
462 [b=b q=q fq=fq l=l d=d ii=ii]
463 ~% %coed +> ~
464 |%
466### `++norm`
468 ++ norm |=(x=@ ?:(=(0 (mod x 2)) x (sub q x)))
469 ::
471XX document
473### `++xrec`
475 ++ xrec :: recover x-coord
476 |= y=@ ^- @
477 =+ ^= xx
478 %+ mul (dif.fq (mul y y) 1)
479 (inv.fq +(:(mul d y y)))
480 =+ x=(exp.fq (div (add 3 q) 8) xx)
481 ?: !=(0 (dif.fq (mul x x) (sit.fq xx)))
482 (norm (pro.fq x ii))
483 (norm x)
484 ::
486XX document
488### `++ward`
490 ++ ward :: edwards multiply
491 |= [pp=[@ @] qq=[@ @]] ^- [@ @]
492 =+ dp=:(pro.fq d -.pp -.qq +.pp +.qq)
493 =+ ^= xt
494 %+ pro.fq
495 %+ sum.fq
496 (pro.fq -.pp +.qq)
497 (pro.fq -.qq +.pp)
498 (inv.fq (sum.fq 1 dp))
499 =+ ^= yt
500 %+ pro.fq
501 %+ sum.fq
502 (pro.fq +.pp +.qq)
503 (pro.fq -.pp -.qq)
504 (inv.fq (dif.fq 1 dp))
505 [xt yt]
506 ::
508XX document
510### `++scam`
512 ++ scam :: scalar multiply
513 |= [pp=[@ @] e=@] ^- [@ @]
514 ?: =(0 e)
515 [0 1]
516 =+ qq=$(e (div e 2))
517 => .(qq (ward qq qq))
518 ?: =(1 (dis 1 e))
519 (ward qq pp)
520 qq
521 ::
523XX document
525### `++etch`
527 ++ etch :: encode point
528 |= pp=[@ @] ^- @
529 (can 0 ~[[(sub b 1) +.pp] [1 (dis 1 -.pp)]])
530 ::
532XX document
534### `++curv`
536 ++ curv :: point on curve?
537 |= [x=@ y=@] ^- ?
538 .= 0
539 %+ dif.fq
540 %+ sum.fq
541 (pro.fq (sub q (sit.fq x)) x)
542 (pro.fq y y)
543 (sum.fq 1 :(pro.fq d x x y y))
544 ::
546XX document
548### `++deco`
550 ++ deco :: decode point
551 |= s=@ ^- (unit ,[@ @])
552 =+ y=(cut 0 [0 (dec b)] s)
553 =+ si=(cut 0 [(dec b) 1] s)
554 =+ x=(xrec y)
555 => .(x ?:(!=(si (dis 1 x)) (sub q x) x))
556 =+ pp=[x y]
557 ?. (curv pp)
558 ~
559 [~ pp]
560 ::
562XX document
564### `++bb`
566 ++ bb
567 =+ bby=(pro.fq 4 (inv.fq 5))
568 [(xrec bby) bby]
569 ::
570 --
571 ~% %ed + ~
572 |%
574XX document
576### `++puck`
578 ++ puck :: public key
579 ~/ %puck
580 |= sk=@I ^- @
581 ?: (gth (met 3 sk) 32) !!
582 =+ h=(shal (rsh 0 3 b) sk)
583 =+ ^= a
584 %+ add
585 (bex (sub b 2))
586 (lsh 0 3 (cut 0 [3 (sub b 5)] h))
587 =+ aa=(scam bb a)
588 (etch aa)
590XX document
592### `++suck`
594 ++ suck :: keypair from seed
595 |= se=@I ^- @uJ
596 =+ pu=(puck se)
597 (can 0 ~[[b se] [b pu]])
598 ::
600XX document
602### `++sign`
604 ++ sign :: certify
605 ~/ %sign
606 |= [m=@ se=@] ^- @
607 =+ sk=(suck se)
608 =+ pk=(cut 0 [b b] sk)
609 =+ h=(shal (rsh 0 3 b) sk)
610 =+ ^= a
611 %+ add
612 (bex (sub b 2))
613 (lsh 0 3 (cut 0 [3 (sub b 5)] h))
614 =+ ^= r
615 =+ hm=(cut 0 [b b] h)
616 =+ ^= i
617 %+ can 0
618 :~ [b hm]
619 [(met 0 m) m]
620 ==
621 (shaz i)
622 =+ rr=(scam bb r)
623 =+ ^= ss
624 =+ er=(etch rr)
625 =+ ^= ha
626 %+ can 0
627 :~ [b er]
628 [b pk]
629 [(met 0 m) m]
630 ==
631 (~(sit fo l) (add r (mul (shaz ha) a)))
632 (can 0 ~[[b (etch rr)] [b ss]])
633 ::
635XX document
637### `++veri`
639 ++ veri :: validate
640 ~/ %veri
641 |= [s=@ m=@ pk=@] ^- ?
642 ?: (gth (div b 4) (met 3 s)) |
643 ?: (gth (div b 8) (met 3 pk)) |
644 =+ cb=(rsh 0 3 b)
645 =+ rr=(deco (cut 0 [0 b] s))
646 ?~ rr |
647 =+ aa=(deco pk)
648 ?~ aa |
649 =+ ss=(cut 0 [b b] s)
650 =+ ha=(can 3 ~[[cb (etch u.rr)] [cb pk] [(met 3 m) m]])
651 =+ h=(shaz ha)
652 =((scam bb ss) (ward u.rr (scam u.aa h)))
653 ::
654 --
655 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
657XX document
661***