rustkey 0.5.0

rusTkey — rust library for tillitis TKey application development
Documentation
// rusTkey, a rust crate/library that provides a development API for the tillitis TKey.
// Copyright (C) 2024  Danny van Heumen
// SPDX-License-Identifier: BSD-2-Clause

#![no_std]
#![no_main]
#![deny(unused_must_use)]
//#![warn(clippy::pedantic)]

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",
    /* init stack below 0x40020000 (TK1_RAM_BASE+TK1_RAM_SIZE) */
    "la sp, _stack_start",
    /* zero-init bss section */
    "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)
);