Skip to content

sayantn/aes

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

39 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

This is a pure-Rust platform-agnostic AES library, that is focused on reusability and optimal performance.

This library guarantees the best performance on the target_cpu (if correctly specified). This currently has 7 implementations, among which it automatically decides the best (most performant) using Cargo's target_feature flags.

The implementations and their requirements are:

  • AES-NI (with Vector AES for 2- and 4- blocks) => requires a Nightly Compiler, the nightly feature to be enabled, and compiling for x86(64) with the avx512f and vaes target_feature flags set.
  • AES-NI (with Vector AES for 2-blocks) => requires a Nightly Compiler, the nightly feature to be enabled, and compiling for x86(64) with the vaes target_feature flag set. (although vaes is an AVX-512 feature, some AlderLake CPUs have vaes without AVX-512 support)
  • AES-NI => requires compiling for x86(64) with the sse4.1 and aes target_feature flags set.
  • AES-Neon => requires compiling for AArch64 or ARM64EC or ARM-v8 with the aes target_feature flag set (ARM-v8 requires a Nightly compiler and the nightly feature to be enabled) .
  • AES-RV => Requires a Nightly compiler, the nightly feature to be enabled and compiling for RISC-V RV64 or RV32 with the zkne and zknd target-features enabled (performance considerably improves with the unaligned-scalar-mem target-feature enabled)
  • Software AES => fallback implementation based on Rijmen and Daemen's optimized implementation (available on their website)
  • Constant-time Software AES => Much slower than Software AES, but is constant-time, which can be important in some scenarios. Enabled by the constant-time feature. It is worth noting that all the accelerated AES implementations are constant-time, so this only comes into play when no accelerated version is found)

If you are unsure about the target_feature flags to set, use target_cpu=native (if not cross-compiling) in the RUSTFLAGS environment variable, and use the nightly feature only if you are using a nightly compiler.

Warning

Using the wrong target_feature flags may lead to the binary crashing due to an "Unknown Instruction" error. This library uses these flags to use the CPU intrinsics to maximize performance. If you are unsure what target_features are supported on your CPU, use the command

    rustc --print cfg -C target-cpu=native

Using the nightly feature when not using a nightly compiler can lead to compile failures, so use this only if you are using a nightly compiler.