use std::mem::MaybeUninit;
use cryptoauthlib_sys::atca_aes_ctr_ctx_t;
use cryptoauthlib_sys::atca_aes_cmac_ctx_t;
#[repr(u8)]
#[derive(Copy, Clone, Debug, PartialEq)]
pub enum NonceTarget {
TempKey = 0x00,
MsgDigBuf = 0x40,
AltKeyBuf = 0x80,
}
#[repr(u8)]
#[derive(Copy, Clone, Debug, PartialEq)]
pub enum GenDigZone {
Data = 0x02,
SharedNonce = 0x03,
}
#[allow(dead_code)]
#[repr(u8)]
pub enum InfoCmdType {
Revision = 0x00,
KeyValid = 0x01,
State = 0x02,
Gpio = 0x03,
VolKeyPermit = 0x04,
}
pub enum SignMode {
External(Vec<u8>),
Internal(SignEcdsaParam),
}
pub enum VerifyMode {
External(Vec<u8>),
ExternalMac(VerifyEcdsaParam),
Internal(u8),
InternalMac(VerifyEcdsaParam),
}
pub struct SignEcdsaParam {
pub is_invalidate: bool,
pub is_full_sn: bool,
}
pub struct VerifyEcdsaParam {
pub public_key: Option<Vec<u8>>,
pub slot_number: Option<u8>,
pub num_in: Vec<u8>,
pub io_key: u8,
}
impl Default for VerifyEcdsaParam {
fn default() -> VerifyEcdsaParam {
VerifyEcdsaParam {
public_key: None,
slot_number: None,
num_in: Vec::new(),
io_key: 0x00,
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum AeadAlgorithm {
Ccm(AeadParam),
Gcm(AeadParam),
}
#[derive(Clone, Debug, PartialEq)]
pub struct AeadParam {
pub nonce: Vec<u8>,
pub key: Option<[u8; ATCA_AES_KEY_SIZE]>,
pub tag: Option<Vec<u8>>,
pub tag_length: Option<u8>,
pub additional_data: Option<Vec<u8>>,
}
impl Default for AeadParam {
fn default() -> AeadParam {
AeadParam {
nonce: Vec::new(),
key: None,
tag: None,
tag_length: None,
additional_data: None,
}
}
}
#[derive(Copy, Clone, Debug)]pub struct AtcaAesCcmCtx {
pub cbc_mac_ctx: atca_aes_cmac_ctx_t, pub ctr_ctx: atca_aes_ctr_ctx_t, pub iv_size: u8, pub m: u8, pub counter: [u8; ATCA_AES_DATA_SIZE], pub partial_aad: [u8; ATCA_AES_DATA_SIZE], pub partial_aad_size: usize, pub text_size: usize, pub enc_cb: [u8; ATCA_AES_DATA_SIZE], pub data_size: u32, pub ciphertext_block: [u8; ATCA_AES_DATA_SIZE] }
impl Default for AtcaAesCcmCtx {
fn default() -> AtcaAesCcmCtx {
AtcaAesCcmCtx {
cbc_mac_ctx: {
let ctx = MaybeUninit::<atca_aes_cmac_ctx_t>::zeroed();
unsafe { ctx.assume_init() }
},
ctr_ctx: {
let ctx = MaybeUninit::<atca_aes_ctr_ctx_t>::zeroed();
unsafe { ctx.assume_init() }
},
iv_size: ATCA_AES_DATA_SIZE as u8,
m: ATCA_AES_DATA_SIZE as u8,
counter: [0x00; ATCA_AES_DATA_SIZE],
partial_aad: [0x00; ATCA_AES_DATA_SIZE],
partial_aad_size: 0,
text_size: 0,
enc_cb: [0x00; ATCA_AES_DATA_SIZE],
data_size: 0,
ciphertext_block: [0x00; ATCA_AES_DATA_SIZE],
}
}
}
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct ChipOptions {
pub io_key_enabled: bool,
pub io_key_in_slot: u8,
pub aes_enabled: bool,
pub kdf_aes_enabled: bool,
pub ecdh_output_protection: OutputProtectionState,
pub kdf_output_protection: OutputProtectionState,
}
impl Default for ChipOptions {
fn default() -> ChipOptions {
ChipOptions {
io_key_enabled: false,
io_key_in_slot: 0x00,
aes_enabled: false,
kdf_aes_enabled: false,
ecdh_output_protection: OutputProtectionState::Invalid,
kdf_output_protection: OutputProtectionState::Invalid,
}
}
}
#[repr(u8)]
#[derive(Copy, Clone, Debug, PartialEq)]
pub enum OutputProtectionState {
ClearTextAllowed = 0x00,
EncryptedOutputOnly = 0x01,
ForbiddenOutputOutsideChip = 0x02,
Invalid = 0x03,
}
impl From<u8> for OutputProtectionState {
fn from(orig: u8) -> Self {
match orig {
0x0 => OutputProtectionState::ClearTextAllowed,
0x1 => OutputProtectionState::EncryptedOutputOnly,
0x2 => OutputProtectionState::ForbiddenOutputOutsideChip,
_ => OutputProtectionState::Invalid,
}
}
}
#[derive(Copy, Clone, Debug)]
pub struct AtcaSlot {
pub id: u8,
pub is_locked: bool,
pub config: SlotConfig,
}
impl Default for AtcaSlot {
fn default() -> Self {
AtcaSlot {
id: 0u8,
is_locked: false,
config: SlotConfig::default(),
}
}
}
#[derive(Copy, Clone, Debug)]
pub struct AtcaSlotCapacity {
pub blocks: u8,
pub last_block_bytes: u8,
pub bytes: u16,
}
impl Default for AtcaSlotCapacity {
fn default() -> Self {
AtcaSlotCapacity {
blocks: 0u8,
last_block_bytes: 0u8,
bytes: 0u16,
}
}
}
#[derive(Copy, Clone, Debug)]
pub struct SlotConfig {
pub write_config: WriteConfig,
pub key_type: KeyType,
pub read_key: ReadKey,
pub ecc_key_attr: EccKeyAttr,
pub x509id: u8,
pub auth_key: u8,
pub write_key: u8,
pub is_secret: bool,
pub limited_use: bool,
pub no_mac: bool,
pub persistent_disable: bool,
pub req_auth: bool,
pub req_random: bool,
pub lockable: bool,
pub pub_info: bool,
}
impl Default for SlotConfig {
fn default() -> Self {
SlotConfig {
write_config: WriteConfig::Rfu,
key_type: KeyType::Rfu,
read_key: ReadKey::default(),
ecc_key_attr: EccKeyAttr::default(),
x509id: 0u8,
auth_key: 0u8,
write_key: 0u8,
is_secret: false,
limited_use: false,
no_mac: false,
persistent_disable: false,
req_auth: false,
req_random: false,
lockable: false,
pub_info: false,
}
}
}
#[derive(Copy, Clone, Debug)]
pub struct EccKeyAttr {
pub is_private: bool,
pub ext_sign: bool,
pub int_sign: bool,
pub ecdh_operation: bool,
pub ecdh_secret_out: bool,
}
impl Default for EccKeyAttr {
fn default() -> Self {
EccKeyAttr {
is_private: false,
ext_sign: false,
int_sign: false,
ecdh_operation: false,
ecdh_secret_out: false,
}
}
}
#[derive(Copy, Clone, Debug)]
pub struct ReadKey {
pub encrypt_read: bool,
pub slot_number: u8,
}
impl Default for ReadKey {
fn default() -> Self {
ReadKey {
encrypt_read: false,
slot_number: 0u8,
}
}
}
#[derive(Copy, Clone, Debug, PartialEq)]
pub enum WriteConfig {
Rfu,
Always,
PubInvalid,
Never,
Encrypt,
}
#[derive(Copy, Clone, Debug, PartialEq)]
pub enum KeyType {
Rfu,
P256EccKey,
Aes,
ShaOrText,
}
#[derive(Copy, Clone)]
pub struct AtcaIfaceCfg {
iface_type: AtcaIfaceType,
devtype: AtcaDeviceType,
iface: Option<AtcaIface>,
wake_delay: u16,
rx_retries: i32,
}
#[derive(Copy, Clone)]
pub union AtcaIface {
pub atcai2c: AtcaIfaceI2c,
}
#[derive(Copy, Clone)]
pub struct AtcaIfaceI2c {
slave_address: u8,
bus: u8,
baud: u32,
}
#[derive(PartialEq, Copy, Clone, Display)]
pub enum AtcaIfaceType {
AtcaI2cIface,
AtcaSwiIface,
AtcaUartIface,
AtcaSpiIface,
AtcaHidIface,
AtcaCustomIface,
AtcaTestIface,
AtcaUnknownIface,
}
#[derive(PartialEq, Debug, Display, Copy, Clone)]
pub enum AtcaDeviceType {
ATSHA204A,
ATECC108A,
ATECC508A,
ATECC608A,
ATSHA206A,
AtcaTestDevFail,
AtcaTestDevSuccess,
AtcaTestDevNone,
AtcaTestDevFailUnimplemented,
AtcaDevUnknown,
}
#[derive(Debug, Copy, Clone, Display, PartialEq)]
pub enum AtcaStatus {
AtcaSuccess,
AtcaConfigZoneLocked,
AtcaDataZoneLocked,
AtcaWakeFailed,
AtcaCheckMacVerifyFailed,
AtcaParseError,
AtcaStatusCrc,
AtcaStatusUnknown,
AtcaStatusEcc,
AtcaStatusSelftestError,
AtcaFuncFail,
AtcaGenFail,
AtcaBadParam,
AtcaInvalidId,
AtcaInvalidSize,
AtcaRxCrcError,
AtcaRxFail,
AtcaRxNoResponse,
AtcaResyncWithWakeup,
AtcaParityError,
AtcaTxTimeout,
AtcaRxTimeout,
AtcaTooManyCommRetries,
AtcaSmallBuffer,
AtcaCommFail,
AtcaTimeout,
AtcaBadOpcode,
AtcaWakeSuccess,
AtcaExecutionError,
AtcaUnimplemented,
AtcaAssertFailure,
AtcaTxFail,
AtcaNotLocked,
AtcaNoDevices,
AtcaHealthTestError,
AtcaAllocFailure,
AtcaUseFlagsConsumed,
AtcaUnknown,
}
#[derive(Debug)]
struct AtcaIfaceCfgPtrWrapper {
ptr: *mut cryptoauthlib_sys::ATCAIfaceCfg,
}
unsafe impl Send for AtcaIfaceCfgPtrWrapper {}
unsafe impl Sync for AtcaIfaceCfgPtrWrapper {}