use num_derive::FromPrimitive;
mod response_status;
pub mod utils;
pub mod common;
pub mod request;
pub mod response;
#[cfg(feature = "fuzz")]
use arbitrary::Arbitrary;
pub use request::Request;
pub use response::Response;
pub use response_status::{ResponseStatus, Result};
use std::convert::TryFrom;
#[cfg_attr(feature = "fuzz", derive(Arbitrary))]
#[derive(FromPrimitive, PartialEq, Eq, Hash, Copy, Clone, Debug)]
#[repr(u8)]
pub enum ProviderID {
Core = 0,
MbedCrypto = 1,
Pkcs11 = 2,
Tpm = 3,
TrustedService = 4,
CryptoAuthLib = 5,
}
impl std::fmt::Display for ProviderID {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}
impl TryFrom<u8> for ProviderID {
type Error = ResponseStatus;
fn try_from(provider_id: u8) -> ::std::result::Result<Self, Self::Error> {
match num::FromPrimitive::from_u8(provider_id) {
Some(provider_id) => Ok(provider_id),
None => Err(ResponseStatus::ProviderDoesNotExist),
}
}
}
#[cfg_attr(feature = "fuzz", derive(Arbitrary))]
#[derive(FromPrimitive, Copy, Clone, Debug, PartialEq)]
#[repr(u8)]
pub enum BodyType {
Protobuf = 0,
}
#[cfg_attr(feature = "fuzz", derive(Arbitrary))]
#[derive(FromPrimitive, Copy, Clone, PartialEq, Debug, Hash, Eq)]
#[repr(u32)]
pub enum Opcode {
Ping = 0x0001,
PsaGenerateKey = 0x0002,
PsaDestroyKey = 0x0003,
PsaSignHash = 0x0004,
PsaVerifyHash = 0x0005,
PsaImportKey = 0x0006,
PsaExportPublicKey = 0x0007,
ListProviders = 0x0008,
ListOpcodes = 0x0009,
PsaAsymmetricEncrypt = 0x000A,
PsaAsymmetricDecrypt = 0x000B,
PsaExportKey = 0x000C,
PsaGenerateRandom = 0x000D,
ListAuthenticators = 0x000E,
PsaHashCompute = 0x000F,
PsaHashCompare = 0x0010,
PsaAeadEncrypt = 0x0011,
PsaAeadDecrypt = 0x0012,
PsaRawKeyAgreement = 0x0013,
ListKeys = 0x001A,
ListClients = 0x001B,
DeleteClient = 0x001C,
}
impl Opcode {
pub fn is_core(&self) -> bool {
match self {
Opcode::Ping
| Opcode::ListProviders
| Opcode::ListOpcodes
| Opcode::ListAuthenticators
| Opcode::ListKeys
| Opcode::ListClients
| Opcode::DeleteClient => true,
Opcode::PsaGenerateKey
| Opcode::PsaDestroyKey
| Opcode::PsaSignHash
| Opcode::PsaVerifyHash
| Opcode::PsaImportKey
| Opcode::PsaExportPublicKey
| Opcode::PsaAsymmetricEncrypt
| Opcode::PsaAsymmetricDecrypt
| Opcode::PsaExportKey
| Opcode::PsaGenerateRandom
| Opcode::PsaHashCompute
| Opcode::PsaHashCompare
| Opcode::PsaAeadEncrypt
| Opcode::PsaAeadDecrypt
| Opcode::PsaRawKeyAgreement => false,
}
}
pub fn is_admin(&self) -> bool {
match self {
Opcode::ListClients | Opcode::DeleteClient => true,
Opcode::Ping
| Opcode::ListProviders
| Opcode::ListOpcodes
| Opcode::ListAuthenticators
| Opcode::ListKeys
| Opcode::PsaGenerateKey
| Opcode::PsaDestroyKey
| Opcode::PsaSignHash
| Opcode::PsaVerifyHash
| Opcode::PsaImportKey
| Opcode::PsaExportPublicKey
| Opcode::PsaAsymmetricEncrypt
| Opcode::PsaAsymmetricDecrypt
| Opcode::PsaExportKey
| Opcode::PsaGenerateRandom
| Opcode::PsaHashCompute
| Opcode::PsaHashCompare
| Opcode::PsaAeadEncrypt
| Opcode::PsaAeadDecrypt
| Opcode::PsaRawKeyAgreement => false,
}
}
pub fn is_crypto(&self) -> bool {
!self.is_core()
}
}
#[cfg_attr(feature = "fuzz", derive(Arbitrary))]
#[derive(FromPrimitive, PartialEq, Eq, Hash, Copy, Clone, Debug)]
#[repr(u8)]
pub enum AuthType {
NoAuth = 0,
Direct = 1,
Jwt = 2,
UnixPeerCredentials = 3,
JwtSvid = 4,
}
#[test]
fn check_opcode_nature() {
assert!(Opcode::ListKeys.is_core());
assert!(!Opcode::ListKeys.is_crypto());
assert!(Opcode::PsaGenerateKey.is_crypto());
assert!(Opcode::ListClients.is_admin());
assert!(!Opcode::PsaGenerateKey.is_admin());
}