proofs/crypto/aes/cipher.bend checks
raw source on the hub · import bend-collections-laws-crypto@1.0.0.0/proofs/crypto/aes/cipher.bend as Cipher
6 imports
import Base import ../../../src/crypto/aes/types.bend as T import ../../../src/crypto/aes/sbox.bend as B import ../../../src/crypto/aes/aes.bend as I import ../../../spec/crypto/aes/aes.bend as S import ./sbox.bend as L
Laws
law quad_cong provedsource · line 14 · raw
@+a:U32 -> @+b:U32 -> @+c:U32 -> @+d:U32 -> @+a2:U32 -> @+b2:U32 -> @+c2:U32 -> @+d2:U32 -> @+ea:{a == a2 : U32} -> @+eb:{b == b2 : U32} -> @+ec:{c == c2 : U32} -> @+ed:{d == d2 : U32} -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.W{a, b, c, d} == 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.W{a2, b2, c2, d2} : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad}Congruence of the record constructors (one rewrite per field, on variables).
law state_cong provedsource · line 36 · raw
@+a:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> @+b:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> @+c:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> @+d:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> @+a2:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> @+b2:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> @+c2:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> @+d2:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> @+ea:{a == a2 : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad} -> @+eb:{b == b2 : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad} -> @+ec:{c == c2 : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad} -> @+ed:{d == d2 : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad} -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.S{a, b, c, d} == 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.S{a2, b2, c2, d2} : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.State}
law sub_word_ok provedsource · line 58 · raw
@+w:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.sub_word(w) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.sub_word(w) : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad}
law sub_bytes_ok provedsource · line 67 · raw
@+s:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.State -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.sub_bytes(s) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.sub_bytes(s) : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.State}
law shift_rows_ok provedsource · line 76 · raw
@+s:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.State -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.shift_rows(s) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.shift_rows(s) : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.State}
law xor4_cong provedsource · line 85 · raw
@+p:U32 -> @+q:U32 -> @+r:U32 -> @+s:U32 -> @+p2:U32 -> @+q2:U32 -> @+r2:U32 -> @+s2:U32 -> @+ep:{p == p2 : U32} -> @+eq:{q == q2 : U32} -> @+er:{r == r2 : U32} -> @+es:{s == s2 : U32} -> {U32.xor(U32.xor(U32.xor(p, q), r), s) == U32.xor(U32.xor(U32.xor(p2, q2), r2), s2) : U32}
law mix_column_ok provedsource · line 107 · raw
@+w:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.mix_column(w) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.mix_column(w) : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad}
law mix_columns_ok provedsource · line 117 · raw
@+s:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.State -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.mix_columns(s) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.mix_columns(s) : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.State}
law xor_word_ok provedsource · line 126 · raw
@+a:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> @+b:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.xor_word(a, b) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.xor_word(a, b) : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad}
law ark_ok provedsource · line 136 · raw
@+s:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.State -> @+w0:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> @+w1:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> @+w2:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> @+w3:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.add_round_key(s, 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.S{w0, w1, w2, w3}) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.add_round_key(s, w0, w1, w2, w3) : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.State}
law round_ok provedsource · line 153 · raw
@+s:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.State -> @+w0:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> @+w1:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> @+w2:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> @+w3:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.round(s, 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.S{w0, w1, w2, w3}) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.add_round_key(0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.mix_columns(0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.shift_rows(0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.sub_bytes(s))), w0, w1, w2, w3) : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.State}
law last_round_ok provedsource · line 167 · raw
@+s:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.State -> @+w0:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> @+w1:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> @+w2:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> @+w3:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.last_round(s, 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.S{w0, w1, w2, w3}) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.add_round_key(0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.shift_rows(0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.sub_bytes(s)), w0, w1, w2, w3) : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.State}
law rounds_ok provedsource · line 180 · raw
@+n:Nat -> @+s:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.State -> @+w:List<&2, 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad> -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.rounds(n, s, 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.round_keys(w)) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.rounds(n, s, w) : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.State}
law cipher_ok provedsource · line 210 · raw
@+nr:Nat -> @+s:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.State -> @+w:List<&2, 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad> -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.cipher(nr, s, 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.round_keys(w)) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.cipher(nr, s, w) : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.State}
law rot_word_ok provedsource · line 232 · raw
@+w:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.rot_word(w) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.rot_word(w) : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad}
law xpow_ok provedsource · line 241 · raw
@+n:Nat -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.xpow(n) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.xpow(n) : U32}
law rcon_ok provedsource · line 253 · raw
@+j:Nat -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.rcon(j) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.rcon(j) : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad}
law key_words_ok provedsource · line 261 · raw
@+key:List<&2, U32> -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.key_words(key) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.key_words(key) : List<&2, 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad>}
law get_word_ok provedsource · line 279 · raw
@+ws:List<&2, 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad> -> @+n:Nat -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.get_word(ws, n) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.nth_word(ws, n) : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad}
law core_ok provedsource · line 293 · raw
@+k:Nat -> @+big:Bool -> @+q:Nat -> @+temp:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.schedule_core(k, big, q, temp) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.transform(k, big, q, temp) : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad}
law next_ok provedsource · line 322 · raw
@+nk:Nat -> @+i:Nat -> @+h:List<&2, 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad> -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.next_word(nk, i, h) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.next_word(nk, i, h) : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad}
law grow_ok provedsource · line 334 · raw
@+n:Nat -> @+nk:Nat -> @+i:Nat -> @+h:List<&2, 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad> -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.grow(n, nk, i, h) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.expand(n, nk, i, h) : List<&2, 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.Quad>}
law expand_ok provedsource · line 349 · raw
@+nk:Nat -> @+nr:Nat -> @+key:List<&2, U32> -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.expand(nk, nr, key) == 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.round_keys(0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.key_expansion(nk, nr, key)) : List<&2, 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.State>}
law encrypt_ok provedsource · line 362 · raw
@+nk:Nat -> @+nr:Nat -> @+key:List<&2, U32> -> @+s:0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.State -> {0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/aes.encrypt(nk, nr, key, s) == 0xa7e654f9780078ca65bf9e187da99d3e/spec/crypto/aes/aes.encrypt(nk, nr, key, s) : 0xa7e654f9780078ca65bf9e187da99d3e/src/crypto/aes/types.State}The implementation's cipher with its expanded key is FIPS 197's Cipher with KeyExpansion, for every Nk, Nr, key and block.