law cbc_round_trip

bend-osdev-cbc@0.1.0.0 · LAWS.bend:26

import bend-osdev-cbc@0.1.0.0/LAWS.bend as LAWS
import Base
import bend-osdev-bytes@0.1.1.0/bytes.bend as B
import bend-osdev-mode-core@0.1.0.0/mode_core.bend as M
import bend-osdev-cbc@0.1.0.0/cbc.bend as C

26# CBC on bytes: for every 16-byte IV and every message of whole blocks,
27# encryption succeeds and decryption gives the message back
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>}

Uses (48)

Used by (1)