LAWS.bend
bend-osdev-cipher-core@0.1.0.0 · 121 lines · 16 definitions
1
2
3
4
5import Base
6import bend-osdev-bytes@0.1.1.0/bytes.bend as B
7import bend-osdev-cipher-core@0.1.0.0/cipher_core.bend as L
8import bend-osdev-cipher-core@0.1.0.0/modes64.bend as X
9
10
11
12
13law block64_octets_round_trip:
14 for +b: L.LcBlock64
15 {L.LcBlock64.of_octets(L.LcBlock64.to_octets(b)) == Some{b} : Maybe<&2, L.LcBlock64>}
16
17law block64_octets_dual:
18 for +o: B.Octets
19 for +b: L.LcBlock64
20 for e: {L.LcBlock64.of_octets(o) == Some{b} : Maybe<&2, L.LcBlock64>}
21 {L.LcBlock64.to_octets(b) == o : B.Octets}
22
23law blocks64_octets_round_trip:
24 for +bs: List<&2, L.LcBlock64>
25 {X.Lc64.blocks_of(X.Lc64.octets_of(bs)) == Done{bs} : Result<&2, &2, L.LcError, List<&2, L.LcBlock64>>}
26
27
28
29
30
31
32
33law word_xor_cancel:
34 for n: Nat
35 for a: Word(n)
36 for b: Word(n)
37 {a == Word.xor(n, Word.xor(n, a, b), b) : Word(n)}
38
39law u32_xor_cancel:
40 for a: U32
41 for b: U32
42 {a == U32.xor(U32.xor(a, b), b) : U32}
43
44law block64_xor_cancel:
45 for a: L.LcBlock64
46 for b: L.LcBlock64
47 {b == L.LcBlock64.xor(a, L.LcBlock64.xor(a, b)) : L.LcBlock64}
48
49
50
51law rotl1_rotl31:
52 for x: U32
53 {x == L.lc.rotl1.bits(L.lc.rotl31.bits(x)) : U32}
54
55law rotl31_rotl1:
56 for x: U32
57 {x == L.lc.rotl31.bits(L.lc.rotl1.bits(x)) : U32}
58
59law bswap_bswap:
60 for x: U32
61 {x == L.lc.bswap.bits(L.lc.bswap.bits(x)) : U32}
62
63
64
65law feistel_unrun_run:
66 for ~RK: Data
67 for ~f: RK -> U32 -> U32
68 for ks: List<&2, RK>
69 for +b: L.LcBlock64
70 {b == L.lc.fe.unrun(~RK, ~f, ks, L.lc.fe.run(~RK, ~f, ks, b)) : L.LcBlock64}
71
72law feistel_run_unrun:
73 for ~RK: Data
74 for ~f: RK -> U32 -> U32
75 for ks: List<&2, RK>
76 for +b: L.LcBlock64
77 {b == L.lc.fe.run(~RK, ~f, ks, L.lc.fe.unrun(~RK, ~f, ks, b)) : L.LcBlock64}
78
79
80
81
82
83
84law modes64_ecb_blocks:
85 for ~K: Data
86 for ~enc: K -> L.LcBlock64 -> L.LcBlock64
87 for ~dec: K -> L.LcBlock64 -> L.LcBlock64
88 for +k: K
89 for +bs: List<&2, L.LcBlock64>
90 {X.m64.ecb(~K, ~dec, k, X.m64.ecb(~K, ~enc, k, bs)) == X.Lc64.ecb_decrypt_blocks(~K, ~dec, k, X.Lc64.ecb_encrypt_blocks(~K, ~enc, k, bs)) : List<&2, L.LcBlock64>}
91
92law modes64_cbc_blocks:
93 for ~K: Data
94 for ~enc: K -> L.LcBlock64 -> L.LcBlock64
95 for ~dec: K -> L.LcBlock64 -> L.LcBlock64
96 for +k: K
97 for +iv: L.LcBlock64
98 for +bs: List<&2, L.LcBlock64>
99 {X.m64.cbc.dec(~K, ~dec, k, X.m64.cbc.enc(~K, ~enc, k, bs, iv), iv) == X.Lc64.cbc_decrypt_blocks(~K, ~dec, k, iv, X.Lc64.cbc_encrypt_blocks(~K, ~enc, k, iv, bs)) : List<&2, L.LcBlock64>}
100
101law modes64_ecb_octets:
102 for ~K: Data
103 for ~enc: K -> L.LcBlock64 -> L.LcBlock64
104 for ~dec: K -> L.LcBlock64 -> L.LcBlock64
105 for +k: K
106 for +bs: List<&2, L.LcBlock64>
107 {Done{X.Lc64.octets_of(X.Lc64.ecb_decrypt_blocks(~K, ~dec, k, X.Lc64.ecb_encrypt_blocks(~K, ~enc, k, bs)))} == Result.bind(&2, &2, L.LcError, B.Octets, B.Octets, X.Lc64.ecb_encrypt(~K, ~enc, k, X.Lc64.octets_of(bs)), c => X.Lc64.ecb_decrypt(~K, ~dec, k, c)) : Result<&2, &2, L.LcError, B.Octets>}
108
109law modes64_cbc_octets:
110 for ~K: Data
111 for ~enc: K -> L.LcBlock64 -> L.LcBlock64
112 for ~dec: K -> L.LcBlock64 -> L.LcBlock64
113 for +k: K
114 for +iv: L.LcBlock64
115 for +bs: List<&2, L.LcBlock64>
116 {Done{X.Lc64.octets_of(X.Lc64.cbc_decrypt_blocks(~K, ~dec, k, iv, X.Lc64.cbc_encrypt_blocks(~K, ~enc, k, iv, bs)))} == Result.bind(&2, &2, L.LcError, B.Octets, B.Octets, X.Lc64.cbc_encrypt(~K, ~enc, k, L.LcBlock64.to_octets(iv), X.Lc64.octets_of(bs)), c => X.Lc64.cbc_decrypt(~K, ~dec, k, L.LcBlock64.to_octets(iv), c)) : Result<&2, &2, L.LcError, B.Octets>}
117
118
119
120law modes64_not_whole_blocks:
121 {Result.map(&2, &2, L.LcError, List<&2, L.LcBlock64>, Unit, bs => Unit{}, X.Lc64.blocks_of(B.Octets.zeros(12n))) == Fail{L.LcNotBlockMultiple{12n}} : Result<&2, &2, L.LcError, Unit>}