on master help sign in
Merge pull request #313 from urbit/rmariani-patch-33
c2d68f9Joshua Reagan
docs/hoon/library/3e.md+1−657
@@ -4,663 +4,7 @@ navhome: /docs/
4
4
5
5
6# 3e: AES encryption
6# 3e: AES encryption
7−### `++aesc`
8−
9− ++ aesc :: AES-256
10− ~% %aesc + ~
11− |%
12−
13−XX document
14−
15−### `++en`
16−
17− ++ en :: ECB enc
18− ~/ %en
19− |= [a/@I b/@H] ^- @uxH
20− =+ ahem
21− (be & (ex a) b)
22−
23−XX document
24−
25−### `++de`
26−
27− ++ de :: ECB dec
28− ~/ %de
29− |= [a/@I b/@H] ^- @uxH
30− =+ ahem
31− (be | (ix (ex a)) b)
32− --
33−
34−XX document
35−
36−### `++ahem`
37−
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− => |%
43−
44−XX document
45−
46−### `++cipa`
47−
48− ++ cipa :: AES params
49− $_ ^? |%
50−
51−
52−XX document
53−
54−### `++co`
55−
56− ++ co *{p/@ q/@ r/@ s/@} :: col coefs
57−
58−XX document
59−
60−### `++ix`
61−
62− ++ ix |~(a/@ *@) :: key index
63−
64−
65−XX document
66−
67−### `++ro`
68−
69− ++ ro *{p/@ q/@ r/@ s/@} :: row shifts
70−
71−
72−XX document
73−
74−### `++su`
75−
76− ++ su *@ :: s-box
77−
78−XX document
79−
80−### `++pen`
81−
82− ++ pen :: encrypt
83− ^- cipa
84− |%
85−
86−XX document
87−
88−### `++co`
89−
90− ++ co [0x2 0x3 1 1]
91−
92−XX document
93−
94−### `++ix`
95−
96− ++ ix |~(a/@ *@) :: key index
97−
98−XX document
99−
100−### `++ro`
101−
102− ++ ro *{p/@ q/@ r/@ s/@} :: row shifts
103−
104−XX document
105−
106−### `++su`
107−
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− ::
126−
127−XX document
128−
129−### `++pin`
130−
131− ++ pin :: decrypt
132− ^- cipa
133− |%
134−
135−XX document
136−
137−### `++co`
138−
139− ++ co [0xe 0xb 0xd 0x9]
140−
141−XX document
142−
143−### `++ix`
144−
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− ::
165−
166−XX document
167−
168−### `++ro`
169−
170− ++ ro [0 3 2 1]
171−
172−XX document
173−
174−### `++su`
175−
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− ::
194−
195−XX document
196−
197−### `++mcol`
198−
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− ::
220−
221−XX document
222−
223−### `++pode`
224−
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 ~])))
233−
234−XX document
235−
236−### `++sube`
237−
238− ++ sube :: s-box word
239− |= [a=@ b=@] ^- @
240− (rep 3 (turn (pode 3 4 a) |=(c=@ (cut 3 [c 1] b))))
241− --
242− |%
243−
244−XX document
245−
246−### `++be`
247−
248− ++ be :: block cipher
249− |= [a=? b=@ c=@H] ^- @uxH
250− ~| %be-aesc
251− => %= .
252− +
253− => +
254− |%
255−
256−XX document
257−
258−### `++ankh`
259−
260− ++ ankh
261− |= [a=cipa b=@ c=@]
262− (pode 5 nnb (cut 5 [(mul (ix.a b) nnb) nnb] c))
263−
264−XX document
265−
266−### `++sark`
267−
268− ++ sark
269− |= [c=(list ,@) d=(list ,@)] ^- (list ,@)
270− ?~ c ~
271− ?~ d !!
272− [(mix i.c i.d) $(c t.c, d t.d)]
273−
274−XX document
275−
276−### `++srow`
277−
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))
290−
291−XX document
292−
293−### `++subs`
294−
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)
314−
315−XX document
316−
317−### `++ex`
318−
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))
336−
337−XX document
338−
339−### `++ix`
340−
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− ::
361−
362−XX document
363−
364−### `++curt`
365−
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− |%
375−
376−XX document
377−
378−### `++cla`
379−
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] ~])
386−
387−XX document
388−
389−### `++sqr`
390−
391− ++ sqr |=(a=@ (mul a a))
392−
393−XX document
394−
395−### `++inv`
396−
397− ++ inv |=(a=@ (~(exp fo q) (sub q 2) a))
398−
399−XX document
400−
401−### `++cad`
402−
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)]
420−
421−XX document
422−
423−### `++cub`
424−
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− ::
452−
453−XX document
454−
455−### `++ed`
456−
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− |%
470−
471−### `++norm`
472−
473− ++ norm |=(x=@ ?:(=(0 (mod x 2)) x (sub q x)))
474− ::
475−
476−XX document
477−
478−### `++xrec`
479−
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− ::
490−
491−XX document
492−
493−### `++ward`
494−
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− ::
512−
513−XX document
514−
515−### `++scam`
516−
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− ::
527−
528−XX document
529−
530−### `++etch`
531−
532− ++ etch :: encode point
533− |= pp=[@ @] ^- @
534− (can 0 ~[[(sub b 1) +.pp] [1 (dis 1 -.pp)]])
535− ::
536−
537−XX document
538−
539−### `++curv`
540−
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− ::
550−
551−XX document
552−
553−### `++deco`
554−
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− ::
566−
567−XX document
568−
569−### `++bb`
570−
571− ++ bb
572− =+ bby=(pro.fq 4 (inv.fq 5))
573− [(xrec bby) bby]
574− ::
575− --
576− ~% %ed + ~
577− |%
578−
579−XX document
580−
581−### `++puck`
582−
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)
594−
595−XX document
596−
597−### `++suck`
598−
599− ++ suck :: keypair from seed
600− |= se=@I ^- @uJ
601− =+ pu=(puck se)
602− (can 0 ~[[b se] [b pu]])
603− ::
604−
605−XX document
606−
607−### `++sign`
608−
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− ::
639−
640−XX document
641−
642−### `++veri`
643−
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− ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
661−
662−XX document
663−
664
7
8+The standard-library functions in this section have been removed.
665
9
666***
10***