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() };
+    }
+}