#![no_std]
#![no_main]
use esp32_hal::{
clock::ClockControl,
peripherals::Peripherals,
prelude::*,
sha::{Sha, ShaMode},
xtensa_lx,
};
use esp_backtrace as _;
use esp_println::println;
use nb::block;
use sha2::{Digest, Sha512};
#[entry]
fn main() -> ! {
let peripherals = Peripherals::take();
let system = peripherals.SYSTEM.split();
let _clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let source_data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa".as_bytes();
let mut remaining = source_data;
let mut hasher = Sha::new(peripherals.SHA, ShaMode::SHA512);
let mut output = [0u8; 64];
let pre_calc = xtensa_lx::timer::get_cycle_count();
while remaining.len() > 0 {
remaining = block!(hasher.update(remaining)).unwrap();
}
block!(hasher.finish(output.as_mut_slice())).unwrap();
let post_calc = xtensa_lx::timer::get_cycle_count();
let hw_time = post_calc - pre_calc;
println!("Took {} cycles", hw_time);
println!("SHA512 Hash output {:02x?}", output);
let pre_calc = xtensa_lx::timer::get_cycle_count();
let mut hasher = Sha512::new();
hasher.update(source_data);
let soft_result = hasher.finalize();
let post_calc = xtensa_lx::timer::get_cycle_count();
let soft_time = post_calc - pre_calc;
println!("Took {} cycles", soft_time);
println!("SHA512 Hash output {:02x?}", soft_result);
assert_eq!(output, soft_result[..]);
println!("HW SHA is {}x faster", soft_time / hw_time);
loop {}
}