Local Open Scope logic.
(* FIPS 197 section 5.3.5 mentions that ShiftRows and SubBytes (or InvShiftRows and * InvSubBytes) can commute. Normally, we would stipulate that the blocks are in bounds, * but it actually turns out to be unnecessary for the proof. *)

Lemma invsubbytes_invshiftrows_comm : forall b : block,
InvShiftRows (InvSubBytes b) = InvSubBytes (InvShiftRows b).