Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Add FIPS-aligned AES specification #29

Draft
wants to merge 5 commits into
base: main
Choose a base branch
from
Draft

Conversation

hanno-becker
Copy link
Collaborator

@hanno-becker hanno-becker commented Apr 26, 2024

This is a work-in-progress attempt add adding an alternative model AESSpec.lean of the AES specification that's closely aligned to the FIPS specification. The existing model in AESArm.lean and AESCommon.lean is more aligned to the Arm ASL for AES instructions.

Status: So far I merely added various interpretations of AES state as (a) bitvector, (b) byte sequence, (c) 4x4 byte grid, and conversions between them.

This is my first attempt at doing anything with Lean, and I'm sure there's a lot to improve. I'm grateful about any comments 🙏

This is a minimal attempt at providing a elimination tactic `elim`.

Elimination rules are a unified and principled way to destruct various
kinds of premises, and ubiquituous in Isabelle.

While std and mathlib have custom destruction tactics, we try to avoid
external dependencies as much as possible here.

Signed-off-by: Hanno Becker <[email protected]>
This commit adds definition and basic constructions and lemmas
for a type `Vec t n` of length-n lists of type `t`.

This exists in Mathlib, but in the interest of keeping dependencies
down (and as a useful learning exercise), we re-implement the required
material here.

Signed-off-by: Hanno Becker <[email protected]>
`simp` rules for `extractLsb'` and `cast` / `append`

Signed-off-by: Hanno Becker <[email protected]>
This commit adds `AESSpec.lean` which aims to model the AES
specification in a way that's as close to the FIPS specification
as possible (the existing specification in `AESArm.lean` is more
aligned to the Arm ASL).

This is work in progress. For the moment, we only have definitions
of the AES state as a bitvector, byte vector, or byte array, as well as
conversions between them.

Signed-off-by: Hanno Becker <[email protected]>
def example_bitvec' := byte_seq_to_bitvec example_byteseq
def example_byteseq' := bitvec_to_byte_seq 16 example_bitvec'

#eval example_bitvec
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd recommend using example to test these out instead of using #eval. E.g., see

example : decode_raw_inst 0x91000421#32 =
.

@hanno-becker
Copy link
Collaborator Author

I don't have the bandwidth to push this at the moment. I'll close for now and reopen if things change.

@hanno-becker hanno-becker reopened this Jul 10, 2024
@shigoel shigoel marked this pull request as draft August 13, 2024 22:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants