1use rasn::prelude::*;
21
22use super::EnvelopedData;
23
24pub const FIRMWARE_PACKAGE: &Oid = Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS9_SMIME_CT_FIRMWARE_PACKAGE;
25pub const FIRMWARE_PACKAGE_ID: &Oid =
26 Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS9_SMIME_AA_FIRMWARE_PACKAGE_ID;
27pub const DECRYPT_KEY_ID: &Oid = Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS9_SMIME_AA_DECRYPT_KEY_ID;
28pub const CRYPTO_ALGORITHMS: &Oid = Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS9_SMIME_AA_CRYPTO_ALGORITHMS;
29pub const COMPRESS_ALGORITHMS: &Oid =
30 Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS9_SMIME_AA_COMPRESS_ALGORITHMS;
31pub const COMMUNITY_IDENTIFIERS: &Oid =
32 Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS9_SMIME_AA_COMMUNITY_IDENTIFIERS;
33pub const FIRMWARE_PACKAGE_INFO: &Oid =
34 Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS9_SMIME_AA_FIRMWARE_PACKAGE_INFO;
35pub const WRAPPED_FIRMWARE_KEY: &Oid =
36 Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS9_SMIME_AA_WRAPPED_FIRMWARE_KEY;
37pub const FIRMWARE_LOAD_RECEIPT: &Oid =
38 Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS9_SMIME_CT_FIRMWARE_LOAD_RECEIPT;
39pub const FIRMWARE_LOAD_ERROR: &Oid =
40 Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS9_SMIME_CT_FIRMWARE_LOAD_ERROR;
41pub const HARDWARE_MODULE_NAME: &Oid =
42 Oid::ISO_IDENTIFIED_ORGANISATION_DOD_INTERNET_SECURITY_MECHANISMS_PKIX_ON_HARDWARE_MODULE_NAME;
43pub const TARGET_HARDWARE_IDS: &Oid =
44 Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS9_SMIME_AA_TARGET_HARDWARE_IDS;
45
46pub type FirmwarePackageData = OctetString;
47pub type TargetHardwareIdentifiers = SequenceOf<ObjectIdentifier>;
48pub type DecryptKeyIdentifier = OctetString;
49pub type ImplementedCryptoAlgorithms = SequenceOf<ObjectIdentifier>;
50pub type ImplementedCompressAlgorithms = SequenceOf<ObjectIdentifier>;
51pub type CommunityIdentifiers = SequenceOf<CommunityIdentifier>;
52pub type WrappedFirmwareKey = EnvelopedData;
53pub type FirmwareReceiptVersion = Integer;
54pub type FirmwareErrorVersion = Integer;
55pub type VendorLoadErrorCode = Integer;
56
57#[derive(AsnType, Debug, Clone, Decode, Encode, PartialEq, PartialOrd, Eq, Ord, Hash)]
58pub struct FirmwarePackageIdentifier {
59 pub name: PreferredOrLegacyPackageIdentifier,
60 pub stale: Option<PreferredOrLegacyStalePackageIdentifier>,
61}
62
63#[derive(AsnType, Debug, Clone, Decode, Encode, PartialEq, PartialOrd, Eq, Ord, Hash)]
64#[rasn(choice)]
65pub enum PreferredOrLegacyPackageIdentifier {
66 Preferred(PreferredPackageIdentifier),
67 Legacy(OctetString),
68}
69
70#[derive(AsnType, Debug, Clone, Decode, Encode, PartialEq, PartialOrd, Eq, Ord, Hash)]
71pub struct PreferredPackageIdentifier {
72 pub firmware_package_id: ObjectIdentifier,
73 pub version_number: Integer,
74}
75
76#[derive(AsnType, Debug, Clone, Decode, Encode, PartialEq, PartialOrd, Eq, Ord, Hash)]
77#[rasn(choice)]
78pub enum PreferredOrLegacyStalePackageIdentifier {
79 PreferredStaleVersionNumber(Integer),
80 LegacyStaleVersion(OctetString),
81}
82
83#[derive(AsnType, Debug, Clone, Decode, Encode, PartialEq, PartialOrd, Eq, Ord, Hash)]
84#[rasn(choice)]
85pub enum CommunityIdentifier {
86 CommunityOid(ObjectIdentifier),
87 HardwareModuleList(HardwareModules),
88}
89
90#[derive(AsnType, Debug, Clone, Decode, Encode, PartialEq, PartialOrd, Eq, Ord, Hash)]
91pub struct HardwareModules {
92 pub hardware_type: ObjectIdentifier,
93 pub hardware_serial_entries: SequenceOf<HardwareSerialEntry>,
94}
95
96#[derive(AsnType, Debug, Clone, Decode, Encode, PartialEq, PartialOrd, Eq, Ord, Hash)]
97#[rasn(choice)]
98pub enum HardwareSerialEntry {
99 All,
100 Single(OctetString),
101 Block { low: OctetString, high: OctetString },
102}
103
104#[derive(AsnType, Debug, Clone, Decode, Encode, PartialEq, PartialOrd, Eq, Ord, Hash)]
105pub struct FirmwarePackageInfo {
106 pub firmware_package_type: Option<Integer>,
107 pub dependencies: Option<SequenceOf<PreferredOrLegacyPackageIdentifier>>,
108}
109
110#[derive(AsnType, Debug, Clone, Decode, Encode, PartialEq, PartialOrd, Eq, Ord, Hash)]
111pub struct FirmwarePackageLoadReceipt {
112 #[rasn(default = "default_firmware_receipt_version")]
113 pub version: FirmwareReceiptVersion,
114 pub hardware_type: ObjectIdentifier,
115 pub hardware_serial_number: OctetString,
116 pub firmware_package_name: PreferredOrLegacyPackageIdentifier,
117 pub trust_anchor_key_id: Option<OctetString>,
118 #[rasn(tag(1))]
119 pub decrypt_key_id: Option<OctetString>,
120}
121
122fn default_firmware_receipt_version() -> FirmwareReceiptVersion {
123 1u8.into()
124}
125
126#[derive(AsnType, Debug, Clone, Decode, Encode, PartialEq, PartialOrd, Eq, Ord, Hash)]
127pub struct FirmwarePackageLoadError {
128 #[rasn(default = "default_firmware_error_version")]
129 pub version: FirmwareErrorVersion,
130 pub hardware_type: ObjectIdentifier,
131 pub hardware_serial_number: OctetString,
132 pub error_code: FirmwarePackageLoadErrorCode,
133 pub vendor_error_code: Option<VendorLoadErrorCode>,
134 pub firmware_package_name: Option<PreferredOrLegacyPackageIdentifier>,
135 #[rasn(tag(1))]
136 pub config: Option<SequenceOf<CurrentFirmwareConfig>>,
137}
138
139fn default_firmware_error_version() -> FirmwareErrorVersion {
140 1u8.into()
141}
142
143#[derive(AsnType, Debug, Clone, Decode, Encode, PartialEq, PartialOrd, Eq, Ord, Hash)]
144pub struct CurrentFirmwareConfig {
145 pub firmware_package_type: Option<Integer>,
146 pub firmware_package_name: PreferredOrLegacyPackageIdentifier,
147}
148
149#[derive(AsnType, Debug, Clone, Copy, Decode, Encode, PartialEq, PartialOrd, Eq, Ord, Hash)]
150#[rasn(enumerated)]
151pub enum FirmwarePackageLoadErrorCode {
152 DecodeFailure = 1,
153 BadContentInfo = 2,
154 BadSignedData = 3,
155 BadEncapContent = 4,
156 BadCertificate = 5,
157 BadSignerInfo = 6,
158 BadSignedAttrs = 7,
159 BadUnsignedAttrs = 8,
160 MissingContent = 9,
161 NoTrustAnchor = 10,
162 NotAuthorized = 11,
163 BadDigestAlgorithm = 12,
164 BadSignatureAlgorithm = 13,
165 UnsupportedKeySize = 14,
166 SignatureFailure = 15,
167 ContentTypeMismatch = 16,
168 BadEncryptedData = 17,
169 UnprotectedAttrsPresent = 18,
170 BadEncryptContent = 19,
171 BadEncryptAlgorithm = 20,
172 MissingCiphertext = 21,
173 NoDecryptKey = 22,
174 DecryptFailure = 23,
175 BadCompressAlgorithm = 24,
176 MissingCompressedContent = 25,
177 DecompressFailure = 26,
178 WrongHardware = 27,
179 StalePackage = 28,
180 NotInCommunity = 29,
181 UnsupportedPackageType = 30,
182 MissingDependency = 31,
183 WrongDependencyVersion = 32,
184 InsufficientMemory = 33,
185 BadFirmware = 34,
186 UnsupportedParameters = 35,
187 BreaksDependency = 36,
188 OtherError = 99,
189}
190
191#[derive(AsnType, Debug, Clone, Decode, Encode, PartialEq, PartialOrd, Eq, Ord, Hash)]
192pub struct HardwareModuleName {
193 pub hardware_type: ObjectIdentifier,
194 pub hardware_serial_number: OctetString,
195}