trussed 0.2.0

Modern Cryptographic Firmware
Documentation
mod client;

use aes::Aes256;
use cbc::cipher::{block_padding::ZeroPadding, BlockEncryptMut, KeyIvInit};
use sha2::digest::Digest;
use trussed_core::{
    syscall,
    types::{Location::*, Mechanism, StorageAttributes},
    CryptoClient,
};

#[test]
fn aes256cbc() {
    client::get(|client| {
        let secret = syscall!(client.unsafe_inject_shared_key(&[], Volatile)).key;
        let key =
            syscall!(client.derive_key(Mechanism::Sha256, secret, None, StorageAttributes::new()))
                .key;
        let ciphertext =
            syscall!(client.encrypt(Mechanism::Aes256Cbc, key, &[48; 64], &[], None)).ciphertext;

        let hash = sha2::Sha256::new();
        let key_ref = hash.finalize();
        let cipher = cbc::Encryptor::<Aes256>::new_from_slices(&key_ref, &[0; 16]).unwrap();
        let mut buffer = [48; 64];
        cipher
            .encrypt_padded_mut::<ZeroPadding>(&mut buffer, 64)
            .unwrap();
        assert_ne!(buffer, [48; 64]);
        assert_eq!(buffer.as_slice(), ciphertext.as_slice());

        let plaintext =
            syscall!(client.decrypt(Mechanism::Aes256Cbc, key, &ciphertext, &[], &[], &[]))
                .plaintext
                .unwrap();
        assert_eq!(plaintext, &[48; 64]);
    })
}