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,
}
#[derive(Default)]
pub struct VerifyEcdsaParam {
pub public_key: Option<Vec<u8>>,
pub slot_number: Option<u8>,
pub num_in: Vec<u8>,
pub io_key: u8,
}
#[derive(Copy, Clone, Debug, PartialEq)]
pub enum CipherOperation {
Encrypt,
Decrypt,
}
#[derive(Copy, Clone, Debug, PartialEq)]
pub enum FeedbackMode {
Cfb,
Ofb,
}
#[derive(Clone, Debug, PartialEq)]
pub enum CipherAlgorithm {
Ctr(CipherParam),
Cfb(CipherParam),
Ofb(CipherParam),
Xts(CipherParam),
Ecb(CipherParam),
Cbc(CipherParam),
CbcPkcs7(CipherParam),
}
#[derive(Clone, Debug, PartialEq, Default)]
pub struct CipherParam {
pub iv: Option<[u8; ATCA_AES_KEY_SIZE]>,
pub counter_size: Option<u8>,
pub key: Option<Vec<u8>>,
}
#[derive(Clone, Debug, PartialEq)]
pub enum AeadAlgorithm {
Ccm(AeadParam),
Gcm(AeadParam),
}
#[derive(Clone, Debug, PartialEq, Default)]
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>>,
}
#[derive(Clone, Debug, PartialEq)]
pub enum MacAlgorithm {
HmacSha256(MacParam),
Cbcmac(MacParam),
Cmac(MacParam),
}
#[derive(Clone, Debug, PartialEq, Default)]
pub struct MacParam {
pub key: Option<Vec<u8>>,
pub mac_length: Option<u8>,
pub mac: Option<Vec<u8>>,
}
#[derive(Clone, Debug, PartialEq)]
pub enum KdfAlgorithm {
Prf(PrfDetails),
Hkdf(HkdfDetails),
Aes,
}
#[derive(Clone, Debug, PartialEq)]
pub struct KdfParams {
pub source: KdfSource,
pub target: KdfTarget,
pub source_slot_id: Option<u8>,
pub target_slot_id: Option<u8>,
}
impl Default for KdfParams {
fn default() -> KdfParams {
KdfParams {
source: KdfSource::TempKey,
target: KdfTarget::Output,
source_slot_id: None,
target_slot_id: None,
}
}
}
#[derive(Clone, Debug, PartialEq)]
#[repr(u8)]
pub enum KdfSource {
TempKey = 0x00,
TempKeyUp = 0x01,
Slot = 0x02,
AltKeyBuf = 0x03,
}
#[derive(Clone, Debug, PartialEq)]
#[repr(u8)]
pub enum KdfTarget {
TempKey = 0x00,
TempKeyUp = 0x04,
Slot = 0x08,
AltKeyBuf = 0x0C,
Output = 0x10,
OutputEnc = 0x14,
}
#[derive(Clone, Debug, PartialEq)]
#[repr(u32)]
pub enum KdfPrfKeyLen {
Len16 = 0x00000000,
Len32 = 0x00000001,
Len48 = 0x00000002,
Len64 = 0x00000003,
}
#[derive(Clone, Debug, PartialEq)]
#[repr(u32)]
pub enum KdfPrfTargetLen {
Len32 = 0x00000000,
Len64 = 0x00000100,
}
impl From<KdfPrfTargetLen> for usize {
fn from(orig: KdfPrfTargetLen) -> Self {
match orig {
KdfPrfTargetLen::Len32 => 32,
KdfPrfTargetLen::Len64 => 64,
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct PrfDetails {
pub key_length: KdfPrfKeyLen,
pub target_length: KdfPrfTargetLen,
}
impl Default for PrfDetails {
fn default() -> PrfDetails {
PrfDetails {
key_length: KdfPrfKeyLen::Len32,
target_length: KdfPrfTargetLen::Len64,
}
}
}
#[derive(Clone, Debug, PartialEq)]
#[repr(u32)]
pub enum HkdfMsgLoc {
Slot = 0x00000000,
TempKey = 0x00000001,
Input = 0x00000002,
Iv = 0x00000003,
}
#[derive(Clone, Debug, PartialEq)]
pub struct HkdfDetails {
pub msg_loc: HkdfMsgLoc,
pub zero_key: bool,
pub msg_slot: Option<u8>,
}
impl Default for HkdfDetails {
fn default() -> HkdfDetails {
HkdfDetails {
msg_loc: HkdfMsgLoc::Input,
zero_key: false,
msg_slot: None,
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct KdfResult {
pub out_data: Option<Vec<u8>>,
pub out_nonce: Option<Vec<u8>>,
}
#[derive(Clone, Debug, PartialEq)]
pub struct EcdhParams {
pub key_source: EcdhSource,
pub out_target: EcdhTarget,
pub out_encrypt: bool,
pub slot_id: Option<u8>,
}
impl Default for EcdhParams {
fn default() -> EcdhParams {
EcdhParams {
key_source: EcdhSource::Slot,
out_target: EcdhTarget::Compatibility,
out_encrypt: false,
slot_id: None,
}
}
}
#[derive(Clone, Debug, PartialEq)]
#[repr(u8)]
pub enum EcdhSource{
Slot = 0x00,
TempKey = 0x01,
}
#[derive(Clone, Debug, PartialEq)]
#[repr(u8)]
pub enum EcdhTarget {
Compatibility = 0x00,
Slot = 0x04,
TempKey = 0x08,
Output = 0x0C,
}
#[derive(Clone, Debug, PartialEq)]
pub struct EcdhResult {
pub pms: Option<Vec<u8>>,
pub out_nonce: Option<Vec<u8>>,
}
#[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,
pub kdf_iv_enabled: bool,
pub kdf_iv_location_at: usize,
pub kdf_iv_str: [u8; 0x02],
}
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,
kdf_iv_enabled: false,
kdf_iv_location_at: 0x00,
kdf_iv_str: [0x00, 0x00],
}
}
}
#[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, Default)]
pub struct AtcaSlot {
pub id: u8,
pub is_locked: bool,
pub config: SlotConfig,
}
#[derive(Copy, Clone, Debug, Default)]
pub struct AtcaSlotCapacity {
pub blocks: u8,
pub last_block_bytes: u8,
pub bytes: u16,
}
#[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, Default)]
pub struct EccKeyAttr {
pub is_private: bool,
pub ext_sign: bool,
pub int_sign: bool,
pub ecdh_operation: bool,
pub ecdh_secret_out: bool,
}
#[derive(Copy, Clone, Debug, Default)]
pub struct ReadKey {
pub encrypt_read: bool,
pub slot_number: u8,
}
#[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, Default)]
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 {}