LAWS.bend
bend-osdev-cbc@0.1.0.0 · 38 lines · 2 definitions
1
2
3
4
5
6
7
8
9
10
11import Base
12import bend-osdev-bytes@0.1.1.0/bytes.bend as B
13import bend-osdev-mode-core@0.1.0.0/mode_core.bend as M
14import bend-osdev-cbc@0.1.0.0/cbc.bend as C
15
16law cbc_blocks_round_trip:
17 for ~K: Data
18 for ~enc: K -> M.CmBlock -> M.CmBlock
19 for ~dec: K -> M.CmBlock -> M.CmBlock
20 for +k: K
21 for inv: @xs: List<&2, M.CmBlock> -> {M.CmBlock.dec_enc(~K, ~enc, ~dec, k, xs) == xs : List<&2, M.CmBlock>}
22 for iv: M.CmBlock
23 for bs: List<&2, M.CmBlock>
24 {C.Cbc.decrypt_blocks(~K, ~dec, k, iv, C.Cbc.encrypt_blocks(~K, ~enc, k, iv, bs)) == bs : List<&2, M.CmBlock>}
25
26
27
28law cbc_round_trip:
29 for ~K: Data
30 for ~enc: K -> M.CmBlock -> M.CmBlock
31 for ~dec: K -> M.CmBlock -> M.CmBlock
32 for +k: K
33 for inv: @xs: List<&2, M.CmBlock> -> {M.CmBlock.dec_enc(~K, ~enc, ~dec, k, xs) == xs : List<&2, M.CmBlock>}
34 for +iv: B.Octets
35 for +m: B.Octets
36 for hi: {B.Octets.len(iv) == 16n : Nat}
37 for hm: {Nat.mod(B.Octets.len(m), 16n) == 0n : Nat}
38 {Result.bind(&2, &2, M.CmError, B.Octets, B.Octets, C.Cbc.encrypt(~K, ~enc, k, iv, m), c => C.Cbc.decrypt(~K, ~dec, k, iv, c)) == Done{m} : Result<&2, &2, M.CmError, B.Octets>}