#![no_std]
#![no_main]
#![deny(unused_must_use)]
use core::{arch::global_asm, panic::PanicInfo};
use rustkey::led::{LED_CYAN, LED_GREEN, LED_OFF, LED_RED};
#[no_mangle]
extern "C" fn main() -> ! {
let mut keylength: usize;
let mut outlength: usize;
let mut contentlength: usize;
let mut key = [0u8; 32];
let mut content = [0u8; 1024];
let mut result1 = [0u8; 32];
let mut result2 = [0u8; 32];
rustkey::led::set(LED_GREEN);
for _ in 0..100 {
rustkey::random(&mut key[..6], &[]);
keylength = key[0] as usize % 33;
outlength = key[1] as usize % 32 + 1;
contentlength =
u32::from_be_bytes([key[2], key[3], key[4], key[5]]) as usize % content.len() + 1;
rustkey::random(&mut key[..keylength], &[]);
rustkey::random(&mut content[..contentlength], &[]);
rustkey::blake2s(
&mut result1[..outlength],
&key[..keylength],
&content[..contentlength],
)
.unwrap();
rustkey::blake2s::blake2s(
&mut result2[..outlength],
&key[..keylength],
&content[..contentlength],
)
.unwrap();
if result1 == result2 {
rustkey::led::signal(1, LED_CYAN, LED_GREEN);
} else {
rustkey::abort();
}
}
rustkey::led::signal(5, LED_CYAN, LED_OFF);
rustkey::led::set(LED_CYAN);
rustkey::done()
}
#[panic_handler]
fn panic(_: &PanicInfo) -> ! {
rustkey::abort()
}
global_asm!(
".section \".text.init\"",
".global _start",
"_start:",
"li x1, 0",
"li x2, 0",
"li x3, 0",
"li x4, 0",
"li x5, 0",
"li x6, 0",
"li x7, 0",
"li x8, 0",
"li x9, 0",
"li x10,0",
"li x11,0",
"li x12,0",
"li x13,0",
"li x14,0",
"li x15,0",
"li x16,0",
"li x17,0",
"li x18,0",
"li x19,0",
"li x20,0",
"li x21,0",
"li x22,0",
"li x23,0",
"li x24,0",
"li x25,0",
"li x26,0",
"li x27,0",
"li x28,0",
"li x29,0",
"li x30,0",
"li x31,0",
"la sp, _stack_start",
"la a0, _sbss",
"la a1, _ebss",
"bge a0, a1, end_init_bss",
"loop_init_bss:",
"sw zero, 0(a0)",
"addi a0, a0, 4",
"blt a0, a1, loop_init_bss",
"end_init_bss:",
"call main",
options(raw)
);