examples: Add a hmac example
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
diff --git a/examples/hmac.rs b/examples/hmac.rs
new file mode 100644
index 0000000..97184f7
--- /dev/null
+++ b/examples/hmac.rs
@@ -0,0 +1,55 @@
+#![no_std]
+
+use core::fmt::Write;
+use libtock::hmac::{HmacDataBuffer, HmacDestBuffer, HmacKeyBuffer};
+use libtock::result::TockResult;
+use libtock::syscalls;
+
+#[libtock::main]
+async fn main() -> TockResult<()> {
+ let mut drivers = libtock::retrieve_drivers()?;
+ let mut console = drivers.console.create_console();
+ writeln!(console, "Starting HMAC example")?;
+ let hmac_driver = drivers.hmac.init_driver()?;
+
+ writeln!(console, "Loading in 0 key")?;
+ let mut key_buffer = HmacKeyBuffer::default();
+ let _key_buffer = hmac_driver.init_key_buffer(&mut key_buffer)?;
+ writeln!(console, " done")?;
+
+ writeln!(console, "Creating data buffer")?;
+ let mut data_buffer = HmacDataBuffer::default();
+ let data: &[u8; 72] =
+ b"A language empowering everyone to build reliable and efficient software.";
+
+ for (i, d) in data.iter().enumerate() {
+ data_buffer.buffer[i] = *d;
+ }
+ let _data_buffer = hmac_driver.init_data_buffer(&mut data_buffer)?;
+ writeln!(console, " done")?;
+
+ writeln!(console, "Creating dest buffer")?;
+ let mut dest_buffer = HmacDestBuffer::default();
+ let dest_buffer = hmac_driver.init_dest_buffer(&mut dest_buffer)?;
+ writeln!(console, " done")?;
+
+ let mut temp_buffer = [0; libtock::hmac::DEST_BUFFER_SIZE];
+
+ writeln!(console, "Setting callback and running")?;
+ let mut callback = |_result, _digest| {
+ writeln!(console, "HMAC Complete, printing digest").unwrap();
+ dest_buffer.read_bytes(&mut temp_buffer[..]);
+
+ for buf in temp_buffer.iter().take(libtock::hmac::DEST_BUFFER_SIZE) {
+ write!(console, "{:x}", *buf).unwrap();
+ }
+ };
+
+ let _subscription = hmac_driver.subscribe(&mut callback)?;
+
+ hmac_driver.run()?;
+
+ loop {
+ unsafe { syscalls::raw::yieldk() };
+ }
+}