spec/crypto/aes/poly.bend
bend-collections-laws-crypto@1.0.0.0 · 80 lines · 9 definitions
1import Base
2
3
4
5
6
7
8
9def add(a: List<&2, Bool>, b: List<&2, Bool>) -> List<&2, Bool>:
10 match a b:
11 case Nil{} _:
12 b
13 case x <> xs Nil{}:
14 x <> xs
15 case x <> xs y <> ys:
16 Bool.xor(x, y) <> add(xs, ys)
17
18
19def scale(+c: Bool, a: List<&2, Bool>) -> List<&2, Bool>:
20 match a:
21 case Nil{}:
22 Nil{}
23 case x <> xs:
24 Bool.and(c, x) <> scale(c, xs)
25
26
27def mul(a: List<&2, Bool>, +b: List<&2, Bool>) -> List<&2, Bool>:
28 match a:
29 case Nil{}:
30 Nil{}
31 case c <> q:
32 add(scale(c, b), False{} <> mul(q, b))
33
34
35def top(n: Nat, w: Word(n)) -> Bool:
36 match n w:
37 case 0n WNil{}:
38 False{}
39 case 1n WCon{b, t}:
40 b
41 case 2n+p WCon{b, t}:
42 top(1n+p, t)
43
44def wscale(n: Nat, c: Bool, w: Word(n)) -> Word(n):
45 match c:
46 case True{}:
47 w
48 case False{}:
49 Word.zero(n)
50
51
52def constant(n: Nat, c: Bool) -> Word(n):
53 match n:
54 case 0n:
55 WNil{}
56 case 1n+p:
57 WCon{c, Word.zero(p)}
58
59
60
61
62def times_x(+n: Nat, +low: Word(n), +r: Word(n)) -> Word(n):
63 Word.xor(n, wscale(n, top(n, r), low), Word.shl(n, r))
64
65
66
67def reduce(+n: Nat, +low: Word(n), p: List<&2, Bool>) -> Word(n):
68 match p:
69 case Nil{}:
70 Word.zero(n)
71 case c <> q:
72 Word.xor(n, constant(n, c), times_x(n, low, reduce(n, low, q)))
73
74
75def coefficients(n: Nat, w: Word(n)) -> List<&2, Bool>:
76 match n w:
77 case 0n WNil{}:
78 Nil{}
79 case 1n+p WCon{b, t}:
80 b <> coefficients(p, t)