use serde_derive::Deserialize;
use enum_display_derive::Display;
use std::fmt::Display;
use super::common::{
AttributeIndex, AttributeName, AttributeValue, CertificateType, CryptographicAlgorithm, KeyCompressionType,
KeyFormatType, KeyMaterial, NameType, NameValue, ObjectType, Operation, UniqueBatchItemID, UniqueIdentifier,
};
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x420040")]
pub struct KeyBlock {
#[serde(rename = "0x420042")]
pub key_format_type: KeyFormatType,
#[serde(rename = "0x420041")]
pub key_compression_type: Option<KeyCompressionType>,
#[serde(rename = "0x420045")]
pub key_value: KeyValue,
#[serde(rename = "0x420028")]
pub cryptographic_algorithm: Option<CryptographicAlgorithm>,
#[serde(rename = "0x42002A")]
pub cryptographic_length: Option<i32>,
#[serde(rename = "0x420046")]
pub key_wrapping_data: Option<()>, }
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x420045")]
pub struct KeyValue {
pub key_material: KeyMaterial,
pub attributes: Option<Vec<Attribute>>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x420091")]
pub struct TemplateAttribute {
pub name: KeyMaterial,
pub attributes: Option<Vec<Attribute>>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[non_exhaustive]
pub enum ManagedObject {
#[serde(rename = "if 0x420057==0x00000001")]
Certificate(Certificate),
#[serde(rename = "if 0x420057==0x00000002")]
SymmetricKey(SymmetricKey),
#[serde(rename = "if 0x420057==0x00000003")]
PublicKey(PublicKey),
#[serde(rename = "if 0x420057==0x00000004")]
PrivateKey(PrivateKey),
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x420013")]
pub struct Certificate {
pub certificate_type: CertificateType,
#[serde(with = "serde_bytes")]
pub certificate_value: Vec<u8>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x42008F")]
pub struct SymmetricKey {
pub key_block: KeyBlock,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x42006D")]
pub struct PublicKey {
pub key_block: KeyBlock,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x420064")]
pub struct PrivateKey {
pub key_block: KeyBlock,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x420053")]
pub struct Name {
pub name: NameValue,
pub r#type: NameType,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x42007C")]
pub struct CreateResponsePayload {
pub object_type: ObjectType,
pub unique_identifier: UniqueIdentifier,
pub object_attributes: Option<Vec<Attribute>>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x42007C")]
pub struct CreateKeyPairResponsePayload {
#[serde(rename = "0x420066")]
pub private_key_unique_identifier: UniqueIdentifier,
#[serde(rename = "0x42006F")]
pub public_key_unique_identifier: UniqueIdentifier,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x42007C")]
pub struct RegisterResponsePayload {
#[serde(rename = "0x420094")]
pub unique_identifier: UniqueIdentifier,
#[serde(rename = "0x420091")]
pub template_attributes: Option<Vec<TemplateAttribute>>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x42007C")]
pub struct LocateResponsePayload {
#[serde(rename = "0x420094")]
#[serde(default = "Vec::new")]
pub unique_identifiers: Vec<UniqueIdentifier>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x42007C")]
pub struct GetResponsePayload {
pub object_type: ObjectType,
pub unique_identifier: UniqueIdentifier,
pub cryptographic_object: ManagedObject,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x42007C")]
pub struct GetAttributesResponsePayload {
#[serde(rename = "0x420094")]
pub unique_identifier: UniqueIdentifier,
#[serde(rename = "0x420008")]
pub attributes: Option<Vec<Attribute>>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x42007C")]
pub struct GetAttributeListResponsePayload {
#[serde(rename = "0x420094")]
pub unique_identifier: UniqueIdentifier,
#[serde(rename = "0x42000A")]
pub attributes: Vec<AttributeName>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x42007C")]
pub struct UniqueIdentifierResponsePayload {
#[serde(rename = "0x420094")]
pub unique_identifier: UniqueIdentifier,
}
pub type ActivateResponsePayload = UniqueIdentifierResponsePayload;
pub type RevokeResponsePayload = UniqueIdentifierResponsePayload;
pub type DestroyResponsePayload = UniqueIdentifierResponsePayload;
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x42007C")]
pub struct AttributeEditResponsePayload {
#[serde(rename = "0x420094")]
pub unique_identifier: UniqueIdentifier,
#[serde(rename = "0x420008")]
pub attribute: Attribute,
}
pub type AddAttributeResponsePayload = AttributeEditResponsePayload;
pub type ModifyAttributeResponsePayload = AttributeEditResponsePayload;
pub type DeleteAttributeResponsePayload = AttributeEditResponsePayload;
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x42007C")]
pub struct QueryResponsePayload {
#[serde(rename = "0x42005C")]
pub operations: Option<Vec<Operation>>,
#[serde(rename = "0x420057")]
pub object_types: Option<Vec<ObjectType>>,
#[serde(rename = "0x42009D")]
pub vendor_identification: Option<String>,
#[serde(rename = "0x420088")]
#[serde(skip_deserializing)] #[serde(default)]
pub server_information: Option<ServerInformation>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x42007C")]
pub struct RNGRetrieveResponsePayload {
#[serde(with = "serde_bytes")]
pub data: Vec<u8>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Default)]
#[serde(rename = "0x420088")]
pub struct ServerInformation;
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x42007C")]
pub struct DiscoverVersionsResponsePayload {
#[serde(rename = "0x420069")]
pub supported_versions: Option<Vec<ProtocolVersion>>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x42007C")]
pub struct SignResponsePayload {
#[serde(rename = "0x420094")]
pub unique_identifier: UniqueIdentifier,
#[serde(rename = "0x4200C3")]
#[serde(with = "serde_bytes")]
pub signature_data: Vec<u8>,
}
#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x420069")]
pub struct ProtocolVersion {
#[serde(rename = "0x42006A")]
pub major: i32,
#[serde(rename = "0x42006B")]
pub minor: i32,
}
#[derive(Clone, Copy, Debug, Deserialize, Display, PartialEq, Eq)]
#[non_exhaustive]
pub enum ResultStatus {
#[serde(rename = "0x00000000")]
Success,
#[serde(rename = "0x00000001")]
OperationFailed,
#[serde(rename = "0x00000002")]
OperationPending,
#[serde(rename = "0x00000003")]
OperationUndone,
}
#[derive(Clone, Copy, Debug, Deserialize, Display, PartialEq, Eq)]
#[non_exhaustive]
pub enum ResultReason {
#[serde(rename = "0x00000001")]
ItemNotFound,
#[serde(rename = "0x00000002")]
ResponseTooLarge,
#[serde(rename = "0x00000003")]
AuthenticationNotSuccessful,
#[serde(rename = "0x00000004")]
InvalidMessage,
#[serde(rename = "0x00000005")]
OperationNotSupported,
#[serde(rename = "0x00000006")]
MissingData,
#[serde(rename = "0x00000007")]
InvalidField,
#[serde(rename = "0x00000008")]
FeatureNotSupported,
#[serde(rename = "0x00000009")]
OperationCanceledByRequester,
#[serde(rename = "0x0000000A")]
CryptographicFailure,
#[serde(rename = "0x0000000B")]
IllegalOperation,
#[serde(rename = "0x0000000C")]
PermissionDenied,
#[serde(rename = "0x0000000D")]
ObjectArchived,
#[serde(rename = "0x0000000E")]
IndexOutOfBounds,
#[serde(rename = "0x0000000F")]
ApplicationNamespaceNotSupported,
#[serde(rename = "0x00000010")]
KeyFormatTypeNotSupported,
#[serde(rename = "0x00000011")]
KeyCompressionTypeNotSupported,
#[serde(rename = "0x00000100")]
GeneralFailure,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x420051")]
pub struct MessageExtension {
#[serde(rename = "0x42007D")]
pub vendor_identification: String,
#[serde(rename = "0x420026")]
pub criticality_indicator: bool,
#[serde(rename = "0x42009C")]
#[serde(skip_deserializing)] #[serde(default)]
pub vendor_extension: VendorExtension,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Default)]
#[serde(rename = "0x42009C")]
pub struct VendorExtension;
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x42007B")]
pub struct ResponseMessage {
#[serde(rename = "0x42007A")]
pub header: ResponseHeader,
#[serde(rename = "0x42000F")]
pub batch_items: Vec<BatchItem>,
}
#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x42007A")]
pub struct ResponseHeader {
#[serde(rename = "0x420069")]
pub protocol_version: ProtocolVersion,
#[serde(rename = "0x420092")]
pub timestamp: i64,
#[serde(rename = "0x42000D")]
pub batch_count: i32,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x42000F")]
pub struct BatchItem {
#[serde(rename = "0x42005C")]
pub operation: Option<Operation>,
#[serde(rename = "0x420093")]
pub unique_batch_item_id: Option<UniqueBatchItemID>,
#[serde(rename = "0x42007F")]
pub result_status: ResultStatus,
#[serde(rename = "0x42007E")]
pub result_reason: Option<ResultReason>,
#[serde(rename = "0x42007D")]
pub result_message: Option<String>,
#[serde(rename = "0x42007C")]
pub payload: Option<ResponsePayload>,
#[serde(rename = "0x420051")]
pub message_extension: Option<MessageExtension>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[non_exhaustive]
#[allow(clippy::large_enum_variant)]
pub enum ResponsePayload {
#[serde(rename = "if 0x42005C==0x00000001")]
Create(CreateResponsePayload),
#[serde(rename = "if 0x42005C==0x00000002")]
CreateKeyPair(CreateKeyPairResponsePayload),
#[serde(rename = "if 0x42005C==0x00000003")]
Register(RegisterResponsePayload),
#[serde(rename = "if 0x42005C==0x00000008")]
Locate(LocateResponsePayload),
#[serde(rename = "if 0x42005C==0x0000000A")]
Get(GetResponsePayload),
#[serde(rename = "if 0x42005C==0x0000000B")]
GetAttributes(GetAttributesResponsePayload),
#[serde(rename = "if 0x42005C==0x0000000C")]
GetAttributeList(GetAttributeListResponsePayload),
#[serde(rename = "if 0x42005C==0x0000000D")]
AddAttribute(AddAttributeResponsePayload),
#[serde(rename = "if 0x42005C==0x0000000E")]
ModifyAttribute(ModifyAttributeResponsePayload),
#[serde(rename = "if 0x42005C==0x0000000F")]
DeleteAttribute(DeleteAttributeResponsePayload),
#[serde(rename = "if 0x42005C==0x00000012")]
Activate(ActivateResponsePayload),
#[serde(rename = "if 0x42005C==0x00000013")]
Revoke(RevokeResponsePayload),
#[serde(rename = "if 0x42005C==0x00000014")]
Destroy(DestroyResponsePayload),
#[serde(rename = "if 0x42005C==0x00000018")]
Query(QueryResponsePayload),
#[serde(rename = "if 0x42005C==0x0000001E")]
DiscoverVersions(DiscoverVersionsResponsePayload),
#[serde(rename = "if 0x42005C==0x00000021")]
Sign(SignResponsePayload),
#[serde(rename = "if 0x42005C==0x00000025")]
RNGRetrieve(RNGRetrieveResponsePayload),
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(rename = "0x420008")]
pub struct Attribute {
#[serde(rename = "0x42000A")]
pub name: AttributeName,
#[serde(rename = "0x420009")]
pub index: Option<AttributeIndex>,
#[serde(rename = "0x42000B")]
pub value: AttributeValue,
}