on 8564483 help sign in
666 lines 16 kB history raw
1---
2navhome: /docs
3---
6# 3e: AES encryption
7### `++aesc`
9 ++ aesc :: AES-256
10 ~% %aesc + ~
11 |%
13XX document
15### `++en`
17 ++ en :: ECB enc
18 ~/ %en
19 |= [a/@I b/@H] ^- @uxH
20 =+ ahem
21 (be & (ex a) b)
23XX document
25### `++de`
27 ++ de :: ECB dec
28 ~/ %de
29 |= [a/@I b/@H] ^- @uxH
30 =+ ahem
31 (be | (ix (ex a)) b)
32 --
34XX document
36### `++ahem`
38 =>
39 =+ =+ [gr=(ga 8 0x11b 3) few==>(fe .(a 5))]
40 =+ [pro=pro.gr dif=dif.gr pow=pow.gr ror=ror.few]
41 [pro=pro dif=dif pow=pow ror=ror nnk=8 nnb=4 nnr=14]
42 => |%
44XX document
46### `++cipa`
48 ++ cipa :: AES params
49 $_ ^? |%
52XX document
54### `++co`
56 ++ co *{p/@ q/@ r/@ s/@} :: col coefs
58XX document
60### `++ix`
62 ++ ix |~(a/@ *@) :: key index
65XX document
67### `++ro`
69 ++ ro *{p/@ q/@ r/@ s/@} :: row shifts
72XX document
74### `++su`
76 ++ su *@ :: s-box
78XX document
80### `++pen`
82 ++ pen :: encrypt
83 ^- cipa
84 |%
86XX document
88### `++co`
90 ++ co [0x2 0x3 1 1]
92XX document
94### `++ix`
96 ++ ix |~(a/@ *@) :: key index
98XX document
100### `++ro`
102 ++ ro *{p/@ q/@ r/@ s/@} :: row shifts
104XX document
106### `++su`
108 ++ su 0x7d0c.2155.6314.69e1.26d6.77ba.7e04.2b17.
109 6199.5383.3cbb.ebc8.b0f5.2aae.4d3b.e0a0.
110 ef9c.c993.9f7a.e52d.0d4a.b519.a97f.5160.
111 5fec.8027.5910.12b1.31c7.0788.33a8.dd1f.
112 f45a.cd78.fec0.db9a.2079.d2c6.4b3e.56fc.
113 1bbe.18aa.0e62.b76f.89c5.291d.711a.f147.
114 6edf.751c.e837.f9e2.8535.ade7.2274.ac96.
115 73e6.b4f0.cecf.f297.eadc.674f.4111.913a.
116 6b8a.1301.03bd.afc1.020f.3fca.8f1e.2cd0.
117 0645.b3b8.0558.e4f7.0ad3.bc8c.00ab.d890.
118 849d.8da7.5746.155e.dab9.edfd.5048.706c.
119 92b6.655d.cc5c.a4d4.1698.6886.64f6.f872.
120 25d1.8b6d.49a2.5b76.b224.d928.66a1.2e08.
121 4ec3.fa42.0b95.4cee.3d23.c2a6.3294.7b54.
122 cbe9.dec4.4443.8e34.87ff.2f9b.8239.e37c.
123 fbd7.f381.9ea3.40bf.38a5.3630.d56a.0952
124 --
125 ::
127XX document
129### `++pin`
131 ++ pin :: decrypt
132 ^- cipa
133 |%
135XX document
137### `++co`
139 ++ co [0xe 0xb 0xd 0x9]
141XX document
143### `++ix`
145 ++ ix :: key expand, inv
146 |= a=@ ^- @
147 =+ [i=1 j=_@ b=_@ c=co:pin]
148 |-
149 ?: =(nnr i)
150 a
151 => .(b (cut 7 [i 1] a))
152 => .(b (rep 5 (mcol (pode 5 4 b) c)))
153 => .(j (sub nnr i))
154 %= $
155 i +(i)
156 a
157 %+ can 7
158 :~ [i (cut 7 [0 i] a)]
159 [1 b]
160 [j (cut 7 [+(i) j] a)]
161 ==
162 ==
163 --
164 ::
166XX document
168### `++ro`
170 ++ ro [0 3 2 1]
172XX document
174### `++su`
176 ++ su 0x7d0c.2155.6314.69e1.26d6.77ba.7e04.2b17.
177 6199.5383.3cbb.ebc8.b0f5.2aae.4d3b.e0a0.
178 ef9c.c993.9f7a.e52d.0d4a.b519.a97f.5160.
179 5fec.8027.5910.12b1.31c7.0788.33a8.dd1f.
180 f45a.cd78.fec0.db9a.2079.d2c6.4b3e.56fc.
181 1bbe.18aa.0e62.b76f.89c5.291d.711a.f147.
182 6edf.751c.e837.f9e2.8535.ade7.2274.ac96.
183 73e6.b4f0.cecf.f297.eadc.674f.4111.913a.
184 6b8a.1301.03bd.afc1.020f.3fca.8f1e.2cd0.
185 0645.b3b8.0558.e4f7.0ad3.bc8c.00ab.d890.
186 849d.8da7.5746.155e.dab9.edfd.5048.706c.
187 92b6.655d.cc5c.a4d4.1698.6886.64f6.f872.
188 25d1.8b6d.49a2.5b76.b224.d928.66a1.2e08.
189 4ec3.fa42.0b95.4cee.3d23.c2a6.3294.7b54.
190 cbe9.dec4.4443.8e34.87ff.2f9b.8239.e37c.
191 fbd7.f381.9ea3.40bf.38a5.3630.d56a.0952
192 --
193 ::
195XX document
197### `++mcol`
199 ++ mcol
200 |= [a=(list ,@) b=[p=@ q=@ r=@ s=@]] ^- (list ,@)
201 =+ c=[p=_@ q=_@ r=_@ s=_@]
202 |- ^- (list ,@)
203 ?~ a ~
204 => .(p.c (cut 3 [0 1] i.a))
205 => .(q.c (cut 3 [1 1] i.a))
206 => .(r.c (cut 3 [2 1] i.a))
207 => .(s.c (cut 3 [3 1] i.a))
208 :_ $(a t.a)
209 %+ rep 3
210 %+ turn
211 %- limo
212 :~ [[p.c p.b] [q.c q.b] [r.c r.b] [s.c s.b]]
213 [[p.c s.b] [q.c p.b] [r.c q.b] [s.c r.b]]
214 [[p.c r.b] [q.c s.b] [r.c p.b] [s.c q.b]]
215 [[p.c q.b] [q.c r.b] [r.c s.b] [s.c p.b]]
216 ==
217 |= [a=[@ @] b=[@ @] c=[@ @] d=[@ @]]
218 :(dif (pro a) (pro b) (pro c) (pro d))
219 ::
221XX document
223### `++pode`
225 ++ pode :: explode to block
226 |= [a=bloq b=@ c=@] ^- (list ,@)
227 =+ d=(rip a c)
228 =+ m=(met a c)
229 |-
230 ?: =(m b)
231 d
232 $(m +(m), d (weld d (limo [0 ~])))
234XX document
236### `++sube`
238 ++ sube :: s-box word
239 |= [a=@ b=@] ^- @
240 (rep 3 (turn (pode 3 4 a) |=(c=@ (cut 3 [c 1] b))))
241 --
242 |%
244XX document
246### `++be`
248 ++ be :: block cipher
249 |= [a=? b=@ c=@H] ^- @uxH
250 ~| %be-aesc
251 => %= .
252 +
253 => +
254 |%
256XX document
258### `++ankh`
260 ++ ankh
261 |= [a=cipa b=@ c=@]
262 (pode 5 nnb (cut 5 [(mul (ix.a b) nnb) nnb] c))
264XX document
266### `++sark`
268 ++ sark
269 |= [c=(list ,@) d=(list ,@)] ^- (list ,@)
270 ?~ c ~
271 ?~ d !!
272 [(mix i.c i.d) $(c t.c, d t.d)]
274XX document
276### `++srow`
278 ++ srow
279 |= [a=cipa b=(list ,@)] ^- (list ,@)
280 =+ [c=0 d=~ e=ro.a]
281 |-
282 ?: =(c nnb)
283 d
284 :_ $(c +(c))
285 %+ rep 3
286 %+ turn
287 (limo [0 p.e] [1 q.e] [2 r.e] [3 s.e] ~)
288 |= [f=@ g=@]
289 (cut 3 [f 1] (snag (mod (add g c) nnb) b))
291XX document
293### `++subs`
295 ++ subs
296 |= [a=cipa b=(list ,@)] ^- (list ,@)
297 ?~ b ~
298 [(sube i.b su.a) $(b t.b)]
299 --
300 ==
301 =+ [d=?:(a pen pin) e=(pode 5 nnb c) f=1]
302 => .(e (sark e (ankh d 0 b)))
303 |-
304 ?. =(nnr f)
305 => .(e (subs d e))
306 => .(e (srow d e))
307 => .(e (mcol e co.d))
308 => .(e (sark e (ankh d f b)))
309 $(f +(f))
310 => .(e (subs d e))
311 => .(e (srow d e))
312 => .(e (sark e (ankh d nnr b)))
313 (rep 5 e)
315XX document
317### `++ex`
319 ++ ex :: key expand
320 |= a=@I ^- @
321 =+ [b=a c=0 d=su:pen i=nnk]
322 |-
323 ?: =(i (mul nnb +(nnr)))
324 b
325 => .(c (cut 5 [(dec i) 1] b))
326 => ?: =(0 (mod i nnk))
327 => .(c (ror 3 1 c))
328 => .(c (sube c d))
329 .(c (mix c (pow (dec (div i nnk)) 2)))
330 ?: &((gth nnk 6) =(4 (mod i nnk)))
331 .(c (sube c d))
332 .
333 => .(c (mix c (cut 5 [(sub i nnk) 1] b)))
334 => .(b (can 5 [i b] [1 c] ~))
335 $(i +(i))
337XX document
339### `++ix`
341 ++ ix :: key expand, inv
342 |= a=@ ^- @
343 =+ [i=1 j=_@ b=_@ c=co:pin]
344 |-
345 ?: =(nnr i)
346 a
347 => .(b (cut 7 [i 1] a))
348 => .(b (rep 5 (mcol (pode 5 4 b) c)))
349 => .(j (sub nnr i))
350 %= $
351 i +(i)
352 a
353 %+ can 7
354 :~ [i (cut 7 [0 i] a)]
355 [1 b]
356 [j (cut 7 [+(i) j] a)]
357 ==
358 ==
359 --
360 ::
362XX document
364### `++curt`
366 ++ curt :: curve25519
367 |= [a=@ b=@]
368 => %= .
369 +
370 => +
371 =+ =+ [p=486.662 q=(sub (bex 255) 19)]
372 =+ fq=~(. fo q)
373 [p=p q=q fq=fq]
374 |%
376XX document
378### `++cla`
380 ++ cla
381 |= raw=@
382 =+ low=(dis 248 (cut 3 [0 1] raw))
383 =+ hih=(con 64 (dis 127 (cut 3 [31 1] raw)))
384 =+ mid=(cut 3 [1 30] raw)
385 (can 3 [[1 low] [30 mid] [1 hih] ~])
387XX document
389### `++sqr`
391 ++ sqr |=(a=@ (mul a a))
393XX document
395### `++inv`
397 ++ inv |=(a=@ (~(exp fo q) (sub q 2) a))
399XX document
401### `++cad`
403 ++ cad
404 |= [n=[x=@ z=@] m=[x=@ z=@] d=[x=@ z=@]]
405 =+ ^= xx
406 ;: mul 4 z.d
407 %- sqr %- abs:si
408 %+ dif:si
409 (sun:si (mul x.m x.n))
410 (sun:si (mul z.m z.n))
411 ==
412 =+ ^= zz
413 ;: mul 4 x.d
414 %- sqr %- abs:si
415 %+ dif:si
416 (sun:si (mul x.m z.n))
417 (sun:si (mul z.m x.n))
418 ==
419 [(sit.fq xx) (sit.fq zz)]
421XX document
423### `++cub`
425 ++ cub
426 |= [x=@ z=@]
427 =+ ^= xx
428 %+ mul
429 %- sqr %- abs:si
430 (dif:si (sun:si x) (sun:si z))
431 (sqr (add x z))
432 =+ ^= zz
433 ;: mul 4 x z
434 :(add (sqr x) :(mul p x z) (sqr z))
435 ==
436 [(sit.fq xx) (sit.fq zz)]
437 --
438 ==
439 =+ one=[b 1]
440 =+ i=253
441 =+ r=one
442 =+ s=(cub one)
443 |-
444 ?: =(i 0)
445 =+ x=(cub r)
446 (sit.fq (mul -.x (inv +.x)))
447 =+ m=(rsh 0 i a)
448 ?: =(0 (mod m 2))
449 $(i (dec i), s (cad r s one), r (cub r))
450 $(i (dec i), r (cad r s one), s (cub s))
451 ::
453XX document
455### `++ed`
457 ++ ed :: ed25519
458 =>
459 =+ =+ [b=256 q=(sub (bex 255) 19)]
460 =+ fq=~(. fo q)
461 =+ ^= l
462 %+ add
463 (bex 252)
464 27.742.317.777.372.353.535.851.937.790.883.648.493
465 =+ d=(dif.fq 0 (fra.fq 121.665 121.666))
466 =+ ii=(exp.fq (div (dec q) 4) 2)
467 [b=b q=q fq=fq l=l d=d ii=ii]
468 ~% %coed +> ~
469 |%
471### `++norm`
473 ++ norm |=(x=@ ?:(=(0 (mod x 2)) x (sub q x)))
474 ::
476XX document
478### `++xrec`
480 ++ xrec :: recover x-coord
481 |= y=@ ^- @
482 =+ ^= xx
483 %+ mul (dif.fq (mul y y) 1)
484 (inv.fq +(:(mul d y y)))
485 =+ x=(exp.fq (div (add 3 q) 8) xx)
486 ?: !=(0 (dif.fq (mul x x) (sit.fq xx)))
487 (norm (pro.fq x ii))
488 (norm x)
489 ::
491XX document
493### `++ward`
495 ++ ward :: edwards multiply
496 |= [pp=[@ @] qq=[@ @]] ^- [@ @]
497 =+ dp=:(pro.fq d -.pp -.qq +.pp +.qq)
498 =+ ^= xt
499 %+ pro.fq
500 %+ sum.fq
501 (pro.fq -.pp +.qq)
502 (pro.fq -.qq +.pp)
503 (inv.fq (sum.fq 1 dp))
504 =+ ^= yt
505 %+ pro.fq
506 %+ sum.fq
507 (pro.fq +.pp +.qq)
508 (pro.fq -.pp -.qq)
509 (inv.fq (dif.fq 1 dp))
510 [xt yt]
511 ::
513XX document
515### `++scam`
517 ++ scam :: scalar multiply
518 |= [pp=[@ @] e=@] ^- [@ @]
519 ?: =(0 e)
520 [0 1]
521 =+ qq=$(e (div e 2))
522 => .(qq (ward qq qq))
523 ?: =(1 (dis 1 e))
524 (ward qq pp)
525 qq
526 ::
528XX document
530### `++etch`
532 ++ etch :: encode point
533 |= pp=[@ @] ^- @
534 (can 0 ~[[(sub b 1) +.pp] [1 (dis 1 -.pp)]])
535 ::
537XX document
539### `++curv`
541 ++ curv :: point on curve?
542 |= [x=@ y=@] ^- ?
543 .= 0
544 %+ dif.fq
545 %+ sum.fq
546 (pro.fq (sub q (sit.fq x)) x)
547 (pro.fq y y)
548 (sum.fq 1 :(pro.fq d x x y y))
549 ::
551XX document
553### `++deco`
555 ++ deco :: decode point
556 |= s=@ ^- (unit ,[@ @])
557 =+ y=(cut 0 [0 (dec b)] s)
558 =+ si=(cut 0 [(dec b) 1] s)
559 =+ x=(xrec y)
560 => .(x ?:(!=(si (dis 1 x)) (sub q x) x))
561 =+ pp=[x y]
562 ?. (curv pp)
563 ~
564 [~ pp]
565 ::
567XX document
569### `++bb`
571 ++ bb
572 =+ bby=(pro.fq 4 (inv.fq 5))
573 [(xrec bby) bby]
574 ::
575 --
576 ~% %ed + ~
577 |%
579XX document
581### `++puck`
583 ++ puck :: public key
584 ~/ %puck
585 |= sk=@I ^- @
586 ?: (gth (met 3 sk) 32) !!
587 =+ h=(shal (rsh 0 3 b) sk)
588 =+ ^= a
589 %+ add
590 (bex (sub b 2))
591 (lsh 0 3 (cut 0 [3 (sub b 5)] h))
592 =+ aa=(scam bb a)
593 (etch aa)
595XX document
597### `++suck`
599 ++ suck :: keypair from seed
600 |= se=@I ^- @uJ
601 =+ pu=(puck se)
602 (can 0 ~[[b se] [b pu]])
603 ::
605XX document
607### `++sign`
609 ++ sign :: certify
610 ~/ %sign
611 |= [m=@ se=@] ^- @
612 =+ sk=(suck se)
613 =+ pk=(cut 0 [b b] sk)
614 =+ h=(shal (rsh 0 3 b) sk)
615 =+ ^= a
616 %+ add
617 (bex (sub b 2))
618 (lsh 0 3 (cut 0 [3 (sub b 5)] h))
619 =+ ^= r
620 =+ hm=(cut 0 [b b] h)
621 =+ ^= i
622 %+ can 0
623 :~ [b hm]
624 [(met 0 m) m]
625 ==
626 (shaz i)
627 =+ rr=(scam bb r)
628 =+ ^= ss
629 =+ er=(etch rr)
630 =+ ^= ha
631 %+ can 0
632 :~ [b er]
633 [b pk]
634 [(met 0 m) m]
635 ==
636 (~(sit fo l) (add r (mul (shaz ha) a)))
637 (can 0 ~[[b (etch rr)] [b ss]])
638 ::
640XX document
642### `++veri`
644 ++ veri :: validate
645 ~/ %veri
646 |= [s=@ m=@ pk=@] ^- ?
647 ?: (gth (div b 4) (met 3 s)) |
648 ?: (gth (div b 8) (met 3 pk)) |
649 =+ cb=(rsh 0 3 b)
650 =+ rr=(deco (cut 0 [0 b] s))
651 ?~ rr |
652 =+ aa=(deco pk)
653 ?~ aa |
654 =+ ss=(cut 0 [b b] s)
655 =+ ha=(can 3 ~[[cb (etch u.rr)] [cb pk] [(met 3 m) m]])
656 =+ h=(shaz ha)
657 =((scam bb ss) (ward u.rr (scam u.aa h)))
658 ::
659 --
660 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
662XX document
666***