xref: /aosp_15_r20/system/keymint/wire/src/keymint.rs (revision 9860b7637a5f185913c70aa0caabe3ecb78441e4)
1*9860b763SAndroid Build Coastguard Worker // Copyright 2022, The Android Open Source Project
2*9860b763SAndroid Build Coastguard Worker //
3*9860b763SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9860b763SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9860b763SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9860b763SAndroid Build Coastguard Worker //
7*9860b763SAndroid Build Coastguard Worker //     http://www.apache.org/licenses/LICENSE-2.0
8*9860b763SAndroid Build Coastguard Worker //
9*9860b763SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9860b763SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9860b763SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9860b763SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9860b763SAndroid Build Coastguard Worker // limitations under the License.
14*9860b763SAndroid Build Coastguard Worker 
15*9860b763SAndroid Build Coastguard Worker //! Local types that are equivalent to those generated for KeyMint HAL interfaces
16*9860b763SAndroid Build Coastguard Worker //!
17*9860b763SAndroid Build Coastguard Worker //! - Enums are encoded as exhaustive Rust enums backed by `i32`, using Rust naming
18*9860b763SAndroid Build Coastguard Worker //!   conventions (CamelCase values).
19*9860b763SAndroid Build Coastguard Worker //! - Structs have all fields `pub`, using Rust naming conventions (snake_case fields).
20*9860b763SAndroid Build Coastguard Worker //! - Both enums and structs get a `[derive(AsCborValue)]`
21*9860b763SAndroid Build Coastguard Worker //!
22*9860b763SAndroid Build Coastguard Worker //! Special cases:
23*9860b763SAndroid Build Coastguard Worker //! - The `BeginResult` type of the HAL interface is omitted here, as it includes a
24*9860b763SAndroid Build Coastguard Worker //!   Binder reference.
25*9860b763SAndroid Build Coastguard Worker //! - `Tag` is private to this module, because....
26*9860b763SAndroid Build Coastguard Worker //! - `KeyParam` is a Rust `enum` that is used in place of the `KeyParameter` struct, meaning...
27*9860b763SAndroid Build Coastguard Worker //! - `KeyParameterValue` is not included here.
28*9860b763SAndroid Build Coastguard Worker 
29*9860b763SAndroid Build Coastguard Worker use crate::{
30*9860b763SAndroid Build Coastguard Worker     cbor, cbor_type_error, try_from_n, vec_try, AsCborValue, CborError, KeySizeInBits, RsaExponent,
31*9860b763SAndroid Build Coastguard Worker };
32*9860b763SAndroid Build Coastguard Worker use alloc::format;
33*9860b763SAndroid Build Coastguard Worker use alloc::string::{String, ToString};
34*9860b763SAndroid Build Coastguard Worker use alloc::vec::Vec;
35*9860b763SAndroid Build Coastguard Worker use enumn::N;
36*9860b763SAndroid Build Coastguard Worker use kmr_derive::{AsCborValue, FromRawTag};
37*9860b763SAndroid Build Coastguard Worker 
38*9860b763SAndroid Build Coastguard Worker /// Default certificate serial number of 1.
39*9860b763SAndroid Build Coastguard Worker pub const DEFAULT_CERT_SERIAL: &[u8] = &[0x01];
40*9860b763SAndroid Build Coastguard Worker 
41*9860b763SAndroid Build Coastguard Worker /// ASN.1 DER encoding of the default certificate subject of 'CN=Android Keystore Key'.
42*9860b763SAndroid Build Coastguard Worker pub const DEFAULT_CERT_SUBJECT: &[u8] = &[
43*9860b763SAndroid Build Coastguard Worker     0x30, 0x1f, // SEQUENCE len 31
44*9860b763SAndroid Build Coastguard Worker     0x31, 0x1d, // SET len 29
45*9860b763SAndroid Build Coastguard Worker     0x30, 0x1b, // SEQUENCE len 27
46*9860b763SAndroid Build Coastguard Worker     0x06, 0x03, // OBJECT IDENTIFIER len 3
47*9860b763SAndroid Build Coastguard Worker     0x55, 0x04, 0x03, // 2.5.4.3 (commonName)
48*9860b763SAndroid Build Coastguard Worker     0x0c, 0x14, // UTF8String len 20
49*9860b763SAndroid Build Coastguard Worker     0x41, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x20, 0x4b, 0x65, 0x79, 0x73, 0x74, 0x6f, 0x72, 0x65,
50*9860b763SAndroid Build Coastguard Worker     0x20, 0x4b, 0x65, 0x79, // "Android Keystore Key"
51*9860b763SAndroid Build Coastguard Worker ];
52*9860b763SAndroid Build Coastguard Worker 
53*9860b763SAndroid Build Coastguard Worker /// Constants to indicate whether or not to include/expect more messages when splitting and then
54*9860b763SAndroid Build Coastguard Worker /// assembling the large responses sent from the TA to the HAL.
55*9860b763SAndroid Build Coastguard Worker pub const NEXT_MESSAGE_SIGNAL_TRUE: u8 = 0b00000001u8;
56*9860b763SAndroid Build Coastguard Worker pub const NEXT_MESSAGE_SIGNAL_FALSE: u8 = 0b00000000u8;
57*9860b763SAndroid Build Coastguard Worker 
58*9860b763SAndroid Build Coastguard Worker /// We use Unix epoch as the start date of an undefined certificate validity period.
59*9860b763SAndroid Build Coastguard Worker pub const UNDEFINED_NOT_BEFORE: DateTime = DateTime { ms_since_epoch: 0 };
60*9860b763SAndroid Build Coastguard Worker /// Per RFC 5280 4.1.2.5, an undefined expiration (not-after) field should be set to
61*9860b763SAndroid Build Coastguard Worker /// 9999-12-31T23:59:59Z.
62*9860b763SAndroid Build Coastguard Worker pub const UNDEFINED_NOT_AFTER: DateTime = DateTime { ms_since_epoch: 253402300799000 };
63*9860b763SAndroid Build Coastguard Worker 
64*9860b763SAndroid Build Coastguard Worker /// Possible verified boot state values.
65*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Copy, Debug, PartialEq, Eq, N, AsCborValue)]
66*9860b763SAndroid Build Coastguard Worker pub enum VerifiedBootState {
67*9860b763SAndroid Build Coastguard Worker     Verified = 0,
68*9860b763SAndroid Build Coastguard Worker     SelfSigned = 1,
69*9860b763SAndroid Build Coastguard Worker     Unverified = 2,
70*9860b763SAndroid Build Coastguard Worker     Failed = 3,
71*9860b763SAndroid Build Coastguard Worker }
72*9860b763SAndroid Build Coastguard Worker 
73*9860b763SAndroid Build Coastguard Worker impl TryFrom<i32> for VerifiedBootState {
74*9860b763SAndroid Build Coastguard Worker     type Error = CborError;
try_from(v: i32) -> Result<Self, Self::Error>75*9860b763SAndroid Build Coastguard Worker     fn try_from(v: i32) -> Result<Self, Self::Error> {
76*9860b763SAndroid Build Coastguard Worker         Self::n(v).ok_or(CborError::OutOfRangeIntegerValue)
77*9860b763SAndroid Build Coastguard Worker     }
78*9860b763SAndroid Build Coastguard Worker }
79*9860b763SAndroid Build Coastguard Worker 
80*9860b763SAndroid Build Coastguard Worker /// Information provided once at start-of-day, normally by the bootloader.
81*9860b763SAndroid Build Coastguard Worker ///
82*9860b763SAndroid Build Coastguard Worker /// Field order is fixed, to match the CBOR type definition of `RootOfTrust` in `IKeyMintDevice`.
83*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Debug, AsCborValue, PartialEq, Eq)]
84*9860b763SAndroid Build Coastguard Worker pub struct BootInfo {
85*9860b763SAndroid Build Coastguard Worker     pub verified_boot_key: Vec<u8>,
86*9860b763SAndroid Build Coastguard Worker     pub device_boot_locked: bool,
87*9860b763SAndroid Build Coastguard Worker     pub verified_boot_state: VerifiedBootState,
88*9860b763SAndroid Build Coastguard Worker     pub verified_boot_hash: Vec<u8>,
89*9860b763SAndroid Build Coastguard Worker     pub boot_patchlevel: u32, // YYYYMMDD format
90*9860b763SAndroid Build Coastguard Worker }
91*9860b763SAndroid Build Coastguard Worker 
92*9860b763SAndroid Build Coastguard Worker // Implement the `coset` CBOR serialization traits in terms of the local `AsCborValue` trait,
93*9860b763SAndroid Build Coastguard Worker // in order to get access to tagged versions of serialize/deserialize.
94*9860b763SAndroid Build Coastguard Worker impl coset::AsCborValue for BootInfo {
from_cbor_value(value: cbor::value::Value) -> coset::Result<Self>95*9860b763SAndroid Build Coastguard Worker     fn from_cbor_value(value: cbor::value::Value) -> coset::Result<Self> {
96*9860b763SAndroid Build Coastguard Worker         <Self as AsCborValue>::from_cbor_value(value).map_err(|e| e.into())
97*9860b763SAndroid Build Coastguard Worker     }
to_cbor_value(self) -> coset::Result<cbor::value::Value>98*9860b763SAndroid Build Coastguard Worker     fn to_cbor_value(self) -> coset::Result<cbor::value::Value> {
99*9860b763SAndroid Build Coastguard Worker         <Self as AsCborValue>::to_cbor_value(self).map_err(|e| e.into())
100*9860b763SAndroid Build Coastguard Worker     }
101*9860b763SAndroid Build Coastguard Worker }
102*9860b763SAndroid Build Coastguard Worker 
103*9860b763SAndroid Build Coastguard Worker impl coset::TaggedCborSerializable for BootInfo {
104*9860b763SAndroid Build Coastguard Worker     const TAG: u64 = 40001;
105*9860b763SAndroid Build Coastguard Worker }
106*9860b763SAndroid Build Coastguard Worker 
107*9860b763SAndroid Build Coastguard Worker /// Representation of a date/time.
108*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
109*9860b763SAndroid Build Coastguard Worker pub struct DateTime {
110*9860b763SAndroid Build Coastguard Worker     pub ms_since_epoch: i64,
111*9860b763SAndroid Build Coastguard Worker }
112*9860b763SAndroid Build Coastguard Worker 
113*9860b763SAndroid Build Coastguard Worker impl AsCborValue for DateTime {
from_cbor_value(value: cbor::value::Value) -> Result<Self, CborError>114*9860b763SAndroid Build Coastguard Worker     fn from_cbor_value(value: cbor::value::Value) -> Result<Self, CborError> {
115*9860b763SAndroid Build Coastguard Worker         let val = <i64>::from_cbor_value(value)?;
116*9860b763SAndroid Build Coastguard Worker         Ok(Self { ms_since_epoch: val })
117*9860b763SAndroid Build Coastguard Worker     }
to_cbor_value(self) -> Result<cbor::value::Value, CborError>118*9860b763SAndroid Build Coastguard Worker     fn to_cbor_value(self) -> Result<cbor::value::Value, CborError> {
119*9860b763SAndroid Build Coastguard Worker         self.ms_since_epoch.to_cbor_value()
120*9860b763SAndroid Build Coastguard Worker     }
cddl_typename() -> Option<String>121*9860b763SAndroid Build Coastguard Worker     fn cddl_typename() -> Option<String> {
122*9860b763SAndroid Build Coastguard Worker         Some("DateTime".to_string())
123*9860b763SAndroid Build Coastguard Worker     }
cddl_schema() -> Option<String>124*9860b763SAndroid Build Coastguard Worker     fn cddl_schema() -> Option<String> {
125*9860b763SAndroid Build Coastguard Worker         Some("int".to_string())
126*9860b763SAndroid Build Coastguard Worker     }
127*9860b763SAndroid Build Coastguard Worker }
128*9860b763SAndroid Build Coastguard Worker 
129*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, AsCborValue, N)]
130*9860b763SAndroid Build Coastguard Worker #[repr(i32)]
131*9860b763SAndroid Build Coastguard Worker pub enum Algorithm {
132*9860b763SAndroid Build Coastguard Worker     Rsa = 1,
133*9860b763SAndroid Build Coastguard Worker     Ec = 3,
134*9860b763SAndroid Build Coastguard Worker     Aes = 32,
135*9860b763SAndroid Build Coastguard Worker     TripleDes = 33,
136*9860b763SAndroid Build Coastguard Worker     Hmac = 128,
137*9860b763SAndroid Build Coastguard Worker }
138*9860b763SAndroid Build Coastguard Worker try_from_n!(Algorithm);
139*9860b763SAndroid Build Coastguard Worker 
140*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Debug, Eq, PartialEq, AsCborValue)]
141*9860b763SAndroid Build Coastguard Worker pub struct AttestationKey {
142*9860b763SAndroid Build Coastguard Worker     pub key_blob: Vec<u8>,
143*9860b763SAndroid Build Coastguard Worker     pub attest_key_params: Vec<KeyParam>,
144*9860b763SAndroid Build Coastguard Worker     pub issuer_subject_name: Vec<u8>,
145*9860b763SAndroid Build Coastguard Worker }
146*9860b763SAndroid Build Coastguard Worker 
147*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, AsCborValue, N)]
148*9860b763SAndroid Build Coastguard Worker #[repr(i32)]
149*9860b763SAndroid Build Coastguard Worker pub enum BlockMode {
150*9860b763SAndroid Build Coastguard Worker     Ecb = 1,
151*9860b763SAndroid Build Coastguard Worker     Cbc = 2,
152*9860b763SAndroid Build Coastguard Worker     Ctr = 3,
153*9860b763SAndroid Build Coastguard Worker     Gcm = 32,
154*9860b763SAndroid Build Coastguard Worker }
155*9860b763SAndroid Build Coastguard Worker try_from_n!(BlockMode);
156*9860b763SAndroid Build Coastguard Worker 
157*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Debug, Eq, PartialEq, AsCborValue)]
158*9860b763SAndroid Build Coastguard Worker pub struct Certificate {
159*9860b763SAndroid Build Coastguard Worker     pub encoded_certificate: Vec<u8>,
160*9860b763SAndroid Build Coastguard Worker }
161*9860b763SAndroid Build Coastguard Worker 
162*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, AsCborValue, N)]
163*9860b763SAndroid Build Coastguard Worker #[repr(i32)]
164*9860b763SAndroid Build Coastguard Worker pub enum Digest {
165*9860b763SAndroid Build Coastguard Worker     None = 0,
166*9860b763SAndroid Build Coastguard Worker     Md5 = 1,
167*9860b763SAndroid Build Coastguard Worker     Sha1 = 2,
168*9860b763SAndroid Build Coastguard Worker     Sha224 = 3,
169*9860b763SAndroid Build Coastguard Worker     Sha256 = 4,
170*9860b763SAndroid Build Coastguard Worker     Sha384 = 5,
171*9860b763SAndroid Build Coastguard Worker     Sha512 = 6,
172*9860b763SAndroid Build Coastguard Worker }
173*9860b763SAndroid Build Coastguard Worker try_from_n!(Digest);
174*9860b763SAndroid Build Coastguard Worker 
175*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, AsCborValue, N)]
176*9860b763SAndroid Build Coastguard Worker #[repr(i32)]
177*9860b763SAndroid Build Coastguard Worker pub enum EcCurve {
178*9860b763SAndroid Build Coastguard Worker     P224 = 0,
179*9860b763SAndroid Build Coastguard Worker     P256 = 1,
180*9860b763SAndroid Build Coastguard Worker     P384 = 2,
181*9860b763SAndroid Build Coastguard Worker     P521 = 3,
182*9860b763SAndroid Build Coastguard Worker     #[cfg(feature = "hal_v2")]
183*9860b763SAndroid Build Coastguard Worker     Curve25519 = 4,
184*9860b763SAndroid Build Coastguard Worker }
185*9860b763SAndroid Build Coastguard Worker try_from_n!(EcCurve);
186*9860b763SAndroid Build Coastguard Worker 
187*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, AsCborValue, N)]
188*9860b763SAndroid Build Coastguard Worker #[repr(i32)]
189*9860b763SAndroid Build Coastguard Worker pub enum ErrorCode {
190*9860b763SAndroid Build Coastguard Worker     Ok = 0,
191*9860b763SAndroid Build Coastguard Worker     RootOfTrustAlreadySet = -1,
192*9860b763SAndroid Build Coastguard Worker     UnsupportedPurpose = -2,
193*9860b763SAndroid Build Coastguard Worker     IncompatiblePurpose = -3,
194*9860b763SAndroid Build Coastguard Worker     UnsupportedAlgorithm = -4,
195*9860b763SAndroid Build Coastguard Worker     IncompatibleAlgorithm = -5,
196*9860b763SAndroid Build Coastguard Worker     UnsupportedKeySize = -6,
197*9860b763SAndroid Build Coastguard Worker     UnsupportedBlockMode = -7,
198*9860b763SAndroid Build Coastguard Worker     IncompatibleBlockMode = -8,
199*9860b763SAndroid Build Coastguard Worker     UnsupportedMacLength = -9,
200*9860b763SAndroid Build Coastguard Worker     UnsupportedPaddingMode = -10,
201*9860b763SAndroid Build Coastguard Worker     IncompatiblePaddingMode = -11,
202*9860b763SAndroid Build Coastguard Worker     UnsupportedDigest = -12,
203*9860b763SAndroid Build Coastguard Worker     IncompatibleDigest = -13,
204*9860b763SAndroid Build Coastguard Worker     InvalidExpirationTime = -14,
205*9860b763SAndroid Build Coastguard Worker     InvalidUserId = -15,
206*9860b763SAndroid Build Coastguard Worker     InvalidAuthorizationTimeout = -16,
207*9860b763SAndroid Build Coastguard Worker     UnsupportedKeyFormat = -17,
208*9860b763SAndroid Build Coastguard Worker     IncompatibleKeyFormat = -18,
209*9860b763SAndroid Build Coastguard Worker     UnsupportedKeyEncryptionAlgorithm = -19,
210*9860b763SAndroid Build Coastguard Worker     UnsupportedKeyVerificationAlgorithm = -20,
211*9860b763SAndroid Build Coastguard Worker     InvalidInputLength = -21,
212*9860b763SAndroid Build Coastguard Worker     KeyExportOptionsInvalid = -22,
213*9860b763SAndroid Build Coastguard Worker     DelegationNotAllowed = -23,
214*9860b763SAndroid Build Coastguard Worker     KeyNotYetValid = -24,
215*9860b763SAndroid Build Coastguard Worker     KeyExpired = -25,
216*9860b763SAndroid Build Coastguard Worker     KeyUserNotAuthenticated = -26,
217*9860b763SAndroid Build Coastguard Worker     OutputParameterNull = -27,
218*9860b763SAndroid Build Coastguard Worker     InvalidOperationHandle = -28,
219*9860b763SAndroid Build Coastguard Worker     InsufficientBufferSpace = -29,
220*9860b763SAndroid Build Coastguard Worker     VerificationFailed = -30,
221*9860b763SAndroid Build Coastguard Worker     TooManyOperations = -31,
222*9860b763SAndroid Build Coastguard Worker     UnexpectedNullPointer = -32,
223*9860b763SAndroid Build Coastguard Worker     InvalidKeyBlob = -33,
224*9860b763SAndroid Build Coastguard Worker     ImportedKeyNotEncrypted = -34,
225*9860b763SAndroid Build Coastguard Worker     ImportedKeyDecryptionFailed = -35,
226*9860b763SAndroid Build Coastguard Worker     ImportedKeyNotSigned = -36,
227*9860b763SAndroid Build Coastguard Worker     ImportedKeyVerificationFailed = -37,
228*9860b763SAndroid Build Coastguard Worker     InvalidArgument = -38,
229*9860b763SAndroid Build Coastguard Worker     UnsupportedTag = -39,
230*9860b763SAndroid Build Coastguard Worker     InvalidTag = -40,
231*9860b763SAndroid Build Coastguard Worker     MemoryAllocationFailed = -41,
232*9860b763SAndroid Build Coastguard Worker     ImportParameterMismatch = -44,
233*9860b763SAndroid Build Coastguard Worker     SecureHwAccessDenied = -45,
234*9860b763SAndroid Build Coastguard Worker     OperationCancelled = -46,
235*9860b763SAndroid Build Coastguard Worker     ConcurrentAccessConflict = -47,
236*9860b763SAndroid Build Coastguard Worker     SecureHwBusy = -48,
237*9860b763SAndroid Build Coastguard Worker     SecureHwCommunicationFailed = -49,
238*9860b763SAndroid Build Coastguard Worker     UnsupportedEcField = -50,
239*9860b763SAndroid Build Coastguard Worker     MissingNonce = -51,
240*9860b763SAndroid Build Coastguard Worker     InvalidNonce = -52,
241*9860b763SAndroid Build Coastguard Worker     MissingMacLength = -53,
242*9860b763SAndroid Build Coastguard Worker     KeyRateLimitExceeded = -54,
243*9860b763SAndroid Build Coastguard Worker     CallerNonceProhibited = -55,
244*9860b763SAndroid Build Coastguard Worker     KeyMaxOpsExceeded = -56,
245*9860b763SAndroid Build Coastguard Worker     InvalidMacLength = -57,
246*9860b763SAndroid Build Coastguard Worker     MissingMinMacLength = -58,
247*9860b763SAndroid Build Coastguard Worker     UnsupportedMinMacLength = -59,
248*9860b763SAndroid Build Coastguard Worker     UnsupportedKdf = -60,
249*9860b763SAndroid Build Coastguard Worker     UnsupportedEcCurve = -61,
250*9860b763SAndroid Build Coastguard Worker     KeyRequiresUpgrade = -62,
251*9860b763SAndroid Build Coastguard Worker     AttestationChallengeMissing = -63,
252*9860b763SAndroid Build Coastguard Worker     KeymintNotConfigured = -64,
253*9860b763SAndroid Build Coastguard Worker     AttestationApplicationIdMissing = -65,
254*9860b763SAndroid Build Coastguard Worker     CannotAttestIds = -66,
255*9860b763SAndroid Build Coastguard Worker     RollbackResistanceUnavailable = -67,
256*9860b763SAndroid Build Coastguard Worker     HardwareTypeUnavailable = -68,
257*9860b763SAndroid Build Coastguard Worker     ProofOfPresenceRequired = -69,
258*9860b763SAndroid Build Coastguard Worker     ConcurrentProofOfPresenceRequested = -70,
259*9860b763SAndroid Build Coastguard Worker     NoUserConfirmation = -71,
260*9860b763SAndroid Build Coastguard Worker     DeviceLocked = -72,
261*9860b763SAndroid Build Coastguard Worker     EarlyBootEnded = -73,
262*9860b763SAndroid Build Coastguard Worker     AttestationKeysNotProvisioned = -74,
263*9860b763SAndroid Build Coastguard Worker     AttestationIdsNotProvisioned = -75,
264*9860b763SAndroid Build Coastguard Worker     InvalidOperation = -76,
265*9860b763SAndroid Build Coastguard Worker     StorageKeyUnsupported = -77,
266*9860b763SAndroid Build Coastguard Worker     IncompatibleMgfDigest = -78,
267*9860b763SAndroid Build Coastguard Worker     UnsupportedMgfDigest = -79,
268*9860b763SAndroid Build Coastguard Worker     MissingNotBefore = -80,
269*9860b763SAndroid Build Coastguard Worker     MissingNotAfter = -81,
270*9860b763SAndroid Build Coastguard Worker     MissingIssuerSubject = -82,
271*9860b763SAndroid Build Coastguard Worker     InvalidIssuerSubject = -83,
272*9860b763SAndroid Build Coastguard Worker     BootLevelExceeded = -84,
273*9860b763SAndroid Build Coastguard Worker     HardwareNotYetAvailable = -85,
274*9860b763SAndroid Build Coastguard Worker     ModuleHashAlreadySet = -86,
275*9860b763SAndroid Build Coastguard Worker     Unimplemented = -100,
276*9860b763SAndroid Build Coastguard Worker     VersionMismatch = -101,
277*9860b763SAndroid Build Coastguard Worker     UnknownError = -1000,
278*9860b763SAndroid Build Coastguard Worker     // Implementer's namespace for error codes starts at -10000.
279*9860b763SAndroid Build Coastguard Worker     EncodingError = -20000,
280*9860b763SAndroid Build Coastguard Worker     BoringSslError = -30000,
281*9860b763SAndroid Build Coastguard Worker }
282*9860b763SAndroid Build Coastguard Worker try_from_n!(ErrorCode);
283*9860b763SAndroid Build Coastguard Worker 
284*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Debug, Eq, PartialEq, AsCborValue)]
285*9860b763SAndroid Build Coastguard Worker pub struct HardwareAuthToken {
286*9860b763SAndroid Build Coastguard Worker     pub challenge: i64,
287*9860b763SAndroid Build Coastguard Worker     pub user_id: i64,
288*9860b763SAndroid Build Coastguard Worker     pub authenticator_id: i64,
289*9860b763SAndroid Build Coastguard Worker     pub authenticator_type: HardwareAuthenticatorType,
290*9860b763SAndroid Build Coastguard Worker     pub timestamp: super::secureclock::Timestamp,
291*9860b763SAndroid Build Coastguard Worker     pub mac: Vec<u8>,
292*9860b763SAndroid Build Coastguard Worker }
293*9860b763SAndroid Build Coastguard Worker 
294*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, AsCborValue, N)]
295*9860b763SAndroid Build Coastguard Worker #[repr(i32)]
296*9860b763SAndroid Build Coastguard Worker pub enum HardwareAuthenticatorType {
297*9860b763SAndroid Build Coastguard Worker     None = 0,
298*9860b763SAndroid Build Coastguard Worker     Password = 1,
299*9860b763SAndroid Build Coastguard Worker     Fingerprint = 2,
300*9860b763SAndroid Build Coastguard Worker     Any = -1,
301*9860b763SAndroid Build Coastguard Worker }
302*9860b763SAndroid Build Coastguard Worker try_from_n!(HardwareAuthenticatorType);
303*9860b763SAndroid Build Coastguard Worker 
304*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Debug, Eq, PartialEq, AsCborValue)]
305*9860b763SAndroid Build Coastguard Worker pub struct KeyCharacteristics {
306*9860b763SAndroid Build Coastguard Worker     pub security_level: SecurityLevel,
307*9860b763SAndroid Build Coastguard Worker     pub authorizations: Vec<KeyParam>,
308*9860b763SAndroid Build Coastguard Worker }
309*9860b763SAndroid Build Coastguard Worker 
310*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Debug, Eq, PartialEq, AsCborValue)]
311*9860b763SAndroid Build Coastguard Worker pub struct KeyCreationResult {
312*9860b763SAndroid Build Coastguard Worker     pub key_blob: Vec<u8>,
313*9860b763SAndroid Build Coastguard Worker     pub key_characteristics: Vec<KeyCharacteristics>,
314*9860b763SAndroid Build Coastguard Worker     pub certificate_chain: Vec<Certificate>,
315*9860b763SAndroid Build Coastguard Worker }
316*9860b763SAndroid Build Coastguard Worker 
317*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, AsCborValue, N)]
318*9860b763SAndroid Build Coastguard Worker #[repr(i32)]
319*9860b763SAndroid Build Coastguard Worker pub enum KeyFormat {
320*9860b763SAndroid Build Coastguard Worker     X509 = 0,
321*9860b763SAndroid Build Coastguard Worker     Pkcs8 = 1,
322*9860b763SAndroid Build Coastguard Worker     Raw = 3,
323*9860b763SAndroid Build Coastguard Worker }
324*9860b763SAndroid Build Coastguard Worker try_from_n!(KeyFormat);
325*9860b763SAndroid Build Coastguard Worker 
326*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Debug, Eq, PartialEq, AsCborValue)]
327*9860b763SAndroid Build Coastguard Worker pub struct KeyMintHardwareInfo {
328*9860b763SAndroid Build Coastguard Worker     pub version_number: i32,
329*9860b763SAndroid Build Coastguard Worker     pub security_level: SecurityLevel,
330*9860b763SAndroid Build Coastguard Worker     pub key_mint_name: String,
331*9860b763SAndroid Build Coastguard Worker     pub key_mint_author_name: String,
332*9860b763SAndroid Build Coastguard Worker     pub timestamp_token_required: bool,
333*9860b763SAndroid Build Coastguard Worker }
334*9860b763SAndroid Build Coastguard Worker 
335*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, AsCborValue, N)]
336*9860b763SAndroid Build Coastguard Worker #[repr(i32)]
337*9860b763SAndroid Build Coastguard Worker pub enum KeyOrigin {
338*9860b763SAndroid Build Coastguard Worker     Generated = 0,
339*9860b763SAndroid Build Coastguard Worker     Derived = 1,
340*9860b763SAndroid Build Coastguard Worker     Imported = 2,
341*9860b763SAndroid Build Coastguard Worker     Reserved = 3,
342*9860b763SAndroid Build Coastguard Worker     SecurelyImported = 4,
343*9860b763SAndroid Build Coastguard Worker }
344*9860b763SAndroid Build Coastguard Worker try_from_n!(KeyOrigin);
345*9860b763SAndroid Build Coastguard Worker 
346*9860b763SAndroid Build Coastguard Worker /// Rust exhaustive enum for all key parameters.
347*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Debug, PartialEq, Eq)]
348*9860b763SAndroid Build Coastguard Worker pub enum KeyParam {
349*9860b763SAndroid Build Coastguard Worker     Purpose(KeyPurpose),
350*9860b763SAndroid Build Coastguard Worker     Algorithm(Algorithm),
351*9860b763SAndroid Build Coastguard Worker     KeySize(KeySizeInBits),
352*9860b763SAndroid Build Coastguard Worker     BlockMode(BlockMode),
353*9860b763SAndroid Build Coastguard Worker     Digest(Digest),
354*9860b763SAndroid Build Coastguard Worker     Padding(PaddingMode),
355*9860b763SAndroid Build Coastguard Worker     CallerNonce,
356*9860b763SAndroid Build Coastguard Worker     MinMacLength(u32),
357*9860b763SAndroid Build Coastguard Worker     EcCurve(EcCurve),
358*9860b763SAndroid Build Coastguard Worker     RsaPublicExponent(RsaExponent),
359*9860b763SAndroid Build Coastguard Worker     IncludeUniqueId,
360*9860b763SAndroid Build Coastguard Worker     RsaOaepMgfDigest(Digest),
361*9860b763SAndroid Build Coastguard Worker     BootloaderOnly,
362*9860b763SAndroid Build Coastguard Worker     RollbackResistance,
363*9860b763SAndroid Build Coastguard Worker     EarlyBootOnly,
364*9860b763SAndroid Build Coastguard Worker     ActiveDatetime(DateTime),
365*9860b763SAndroid Build Coastguard Worker     OriginationExpireDatetime(DateTime),
366*9860b763SAndroid Build Coastguard Worker     UsageExpireDatetime(DateTime),
367*9860b763SAndroid Build Coastguard Worker     MaxUsesPerBoot(u32),
368*9860b763SAndroid Build Coastguard Worker     UsageCountLimit(u32),
369*9860b763SAndroid Build Coastguard Worker     UserId(u32),
370*9860b763SAndroid Build Coastguard Worker     UserSecureId(u64),
371*9860b763SAndroid Build Coastguard Worker     NoAuthRequired,
372*9860b763SAndroid Build Coastguard Worker     UserAuthType(u32),
373*9860b763SAndroid Build Coastguard Worker     AuthTimeout(u32),
374*9860b763SAndroid Build Coastguard Worker     AllowWhileOnBody,
375*9860b763SAndroid Build Coastguard Worker     TrustedUserPresenceRequired,
376*9860b763SAndroid Build Coastguard Worker     TrustedConfirmationRequired,
377*9860b763SAndroid Build Coastguard Worker     UnlockedDeviceRequired,
378*9860b763SAndroid Build Coastguard Worker     ApplicationId(Vec<u8>),
379*9860b763SAndroid Build Coastguard Worker     ApplicationData(Vec<u8>),
380*9860b763SAndroid Build Coastguard Worker     CreationDatetime(DateTime),
381*9860b763SAndroid Build Coastguard Worker     Origin(KeyOrigin),
382*9860b763SAndroid Build Coastguard Worker     RootOfTrust(Vec<u8>),
383*9860b763SAndroid Build Coastguard Worker     OsVersion(u32),
384*9860b763SAndroid Build Coastguard Worker     OsPatchlevel(u32),
385*9860b763SAndroid Build Coastguard Worker     AttestationChallenge(Vec<u8>),
386*9860b763SAndroid Build Coastguard Worker     AttestationApplicationId(Vec<u8>),
387*9860b763SAndroid Build Coastguard Worker     AttestationIdBrand(Vec<u8>),
388*9860b763SAndroid Build Coastguard Worker     AttestationIdDevice(Vec<u8>),
389*9860b763SAndroid Build Coastguard Worker     AttestationIdProduct(Vec<u8>),
390*9860b763SAndroid Build Coastguard Worker     AttestationIdSerial(Vec<u8>),
391*9860b763SAndroid Build Coastguard Worker     AttestationIdImei(Vec<u8>),
392*9860b763SAndroid Build Coastguard Worker     #[cfg(feature = "hal_v3")]
393*9860b763SAndroid Build Coastguard Worker     AttestationIdSecondImei(Vec<u8>),
394*9860b763SAndroid Build Coastguard Worker     AttestationIdMeid(Vec<u8>),
395*9860b763SAndroid Build Coastguard Worker     AttestationIdManufacturer(Vec<u8>),
396*9860b763SAndroid Build Coastguard Worker     AttestationIdModel(Vec<u8>),
397*9860b763SAndroid Build Coastguard Worker     VendorPatchlevel(u32),
398*9860b763SAndroid Build Coastguard Worker     BootPatchlevel(u32),
399*9860b763SAndroid Build Coastguard Worker     DeviceUniqueAttestation,
400*9860b763SAndroid Build Coastguard Worker     StorageKey,
401*9860b763SAndroid Build Coastguard Worker     Nonce(Vec<u8>),
402*9860b763SAndroid Build Coastguard Worker     MacLength(u32),
403*9860b763SAndroid Build Coastguard Worker     ResetSinceIdRotation,
404*9860b763SAndroid Build Coastguard Worker     CertificateSerial(Vec<u8>),
405*9860b763SAndroid Build Coastguard Worker     CertificateSubject(Vec<u8>),
406*9860b763SAndroid Build Coastguard Worker     CertificateNotBefore(DateTime),
407*9860b763SAndroid Build Coastguard Worker     CertificateNotAfter(DateTime),
408*9860b763SAndroid Build Coastguard Worker     MaxBootLevel(u32),
409*9860b763SAndroid Build Coastguard Worker     #[cfg(feature = "hal_v4")]
410*9860b763SAndroid Build Coastguard Worker     ModuleHash(Vec<u8>),
411*9860b763SAndroid Build Coastguard Worker }
412*9860b763SAndroid Build Coastguard Worker 
413*9860b763SAndroid Build Coastguard Worker impl KeyParam {
tag(&self) -> Tag414*9860b763SAndroid Build Coastguard Worker     pub fn tag(&self) -> Tag {
415*9860b763SAndroid Build Coastguard Worker         match self {
416*9860b763SAndroid Build Coastguard Worker             KeyParam::Algorithm(_) => Tag::Algorithm,
417*9860b763SAndroid Build Coastguard Worker             KeyParam::BlockMode(_) => Tag::BlockMode,
418*9860b763SAndroid Build Coastguard Worker             KeyParam::Padding(_) => Tag::Padding,
419*9860b763SAndroid Build Coastguard Worker             KeyParam::Digest(_) => Tag::Digest,
420*9860b763SAndroid Build Coastguard Worker             KeyParam::EcCurve(_) => Tag::EcCurve,
421*9860b763SAndroid Build Coastguard Worker             KeyParam::Origin(_) => Tag::Origin,
422*9860b763SAndroid Build Coastguard Worker             KeyParam::Purpose(_) => Tag::Purpose,
423*9860b763SAndroid Build Coastguard Worker             KeyParam::KeySize(_) => Tag::KeySize,
424*9860b763SAndroid Build Coastguard Worker             KeyParam::CallerNonce => Tag::CallerNonce,
425*9860b763SAndroid Build Coastguard Worker             KeyParam::MinMacLength(_) => Tag::MinMacLength,
426*9860b763SAndroid Build Coastguard Worker             KeyParam::RsaPublicExponent(_) => Tag::RsaPublicExponent,
427*9860b763SAndroid Build Coastguard Worker             KeyParam::IncludeUniqueId => Tag::IncludeUniqueId,
428*9860b763SAndroid Build Coastguard Worker             KeyParam::RsaOaepMgfDigest(_) => Tag::RsaOaepMgfDigest,
429*9860b763SAndroid Build Coastguard Worker             KeyParam::BootloaderOnly => Tag::BootloaderOnly,
430*9860b763SAndroid Build Coastguard Worker             KeyParam::RollbackResistance => Tag::RollbackResistance,
431*9860b763SAndroid Build Coastguard Worker             KeyParam::EarlyBootOnly => Tag::EarlyBootOnly,
432*9860b763SAndroid Build Coastguard Worker             KeyParam::ActiveDatetime(_) => Tag::ActiveDatetime,
433*9860b763SAndroid Build Coastguard Worker             KeyParam::OriginationExpireDatetime(_) => Tag::OriginationExpireDatetime,
434*9860b763SAndroid Build Coastguard Worker             KeyParam::UsageExpireDatetime(_) => Tag::UsageExpireDatetime,
435*9860b763SAndroid Build Coastguard Worker             KeyParam::MaxUsesPerBoot(_) => Tag::MaxUsesPerBoot,
436*9860b763SAndroid Build Coastguard Worker             KeyParam::UsageCountLimit(_) => Tag::UsageCountLimit,
437*9860b763SAndroid Build Coastguard Worker             KeyParam::UserId(_) => Tag::UserId,
438*9860b763SAndroid Build Coastguard Worker             KeyParam::UserSecureId(_) => Tag::UserSecureId,
439*9860b763SAndroid Build Coastguard Worker             KeyParam::NoAuthRequired => Tag::NoAuthRequired,
440*9860b763SAndroid Build Coastguard Worker             KeyParam::UserAuthType(_) => Tag::UserAuthType,
441*9860b763SAndroid Build Coastguard Worker             KeyParam::AuthTimeout(_) => Tag::AuthTimeout,
442*9860b763SAndroid Build Coastguard Worker             KeyParam::AllowWhileOnBody => Tag::AllowWhileOnBody,
443*9860b763SAndroid Build Coastguard Worker             KeyParam::TrustedUserPresenceRequired => Tag::TrustedUserPresenceRequired,
444*9860b763SAndroid Build Coastguard Worker             KeyParam::TrustedConfirmationRequired => Tag::TrustedConfirmationRequired,
445*9860b763SAndroid Build Coastguard Worker             KeyParam::UnlockedDeviceRequired => Tag::UnlockedDeviceRequired,
446*9860b763SAndroid Build Coastguard Worker             KeyParam::ApplicationId(_) => Tag::ApplicationId,
447*9860b763SAndroid Build Coastguard Worker             KeyParam::ApplicationData(_) => Tag::ApplicationData,
448*9860b763SAndroid Build Coastguard Worker             KeyParam::CreationDatetime(_) => Tag::CreationDatetime,
449*9860b763SAndroid Build Coastguard Worker             KeyParam::RootOfTrust(_) => Tag::RootOfTrust,
450*9860b763SAndroid Build Coastguard Worker             KeyParam::OsVersion(_) => Tag::OsVersion,
451*9860b763SAndroid Build Coastguard Worker             KeyParam::OsPatchlevel(_) => Tag::OsPatchlevel,
452*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationChallenge(_) => Tag::AttestationChallenge,
453*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationApplicationId(_) => Tag::AttestationApplicationId,
454*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdBrand(_) => Tag::AttestationIdBrand,
455*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdDevice(_) => Tag::AttestationIdDevice,
456*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdProduct(_) => Tag::AttestationIdProduct,
457*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdSerial(_) => Tag::AttestationIdSerial,
458*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdImei(_) => Tag::AttestationIdImei,
459*9860b763SAndroid Build Coastguard Worker             #[cfg(feature = "hal_v3")]
460*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdSecondImei(_) => Tag::AttestationIdSecondImei,
461*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdMeid(_) => Tag::AttestationIdMeid,
462*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdManufacturer(_) => Tag::AttestationIdManufacturer,
463*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdModel(_) => Tag::AttestationIdModel,
464*9860b763SAndroid Build Coastguard Worker             KeyParam::VendorPatchlevel(_) => Tag::VendorPatchlevel,
465*9860b763SAndroid Build Coastguard Worker             KeyParam::BootPatchlevel(_) => Tag::BootPatchlevel,
466*9860b763SAndroid Build Coastguard Worker             KeyParam::DeviceUniqueAttestation => Tag::DeviceUniqueAttestation,
467*9860b763SAndroid Build Coastguard Worker             KeyParam::StorageKey => Tag::StorageKey,
468*9860b763SAndroid Build Coastguard Worker             KeyParam::Nonce(_) => Tag::Nonce,
469*9860b763SAndroid Build Coastguard Worker             KeyParam::MacLength(_) => Tag::MacLength,
470*9860b763SAndroid Build Coastguard Worker             KeyParam::ResetSinceIdRotation => Tag::ResetSinceIdRotation,
471*9860b763SAndroid Build Coastguard Worker             KeyParam::CertificateSerial(_) => Tag::CertificateSerial,
472*9860b763SAndroid Build Coastguard Worker             KeyParam::CertificateSubject(_) => Tag::CertificateSubject,
473*9860b763SAndroid Build Coastguard Worker             KeyParam::CertificateNotBefore(_) => Tag::CertificateNotBefore,
474*9860b763SAndroid Build Coastguard Worker             KeyParam::CertificateNotAfter(_) => Tag::CertificateNotAfter,
475*9860b763SAndroid Build Coastguard Worker             KeyParam::MaxBootLevel(_) => Tag::MaxBootLevel,
476*9860b763SAndroid Build Coastguard Worker             #[cfg(feature = "hal_v4")]
477*9860b763SAndroid Build Coastguard Worker             KeyParam::ModuleHash(_) => Tag::ModuleHash,
478*9860b763SAndroid Build Coastguard Worker         }
479*9860b763SAndroid Build Coastguard Worker     }
480*9860b763SAndroid Build Coastguard Worker }
481*9860b763SAndroid Build Coastguard Worker 
482*9860b763SAndroid Build Coastguard Worker /// Check that a `bool` value is true (false values are represented by the absence of a tag).
check_bool(value: cbor::value::Value) -> Result<(), crate::CborError>483*9860b763SAndroid Build Coastguard Worker fn check_bool(value: cbor::value::Value) -> Result<(), crate::CborError> {
484*9860b763SAndroid Build Coastguard Worker     match value {
485*9860b763SAndroid Build Coastguard Worker         cbor::value::Value::Bool(true) => Ok(()),
486*9860b763SAndroid Build Coastguard Worker         cbor::value::Value::Bool(false) => Err(crate::CborError::UnexpectedItem("false", "true")),
487*9860b763SAndroid Build Coastguard Worker         _ => crate::cbor_type_error(&value, "true"),
488*9860b763SAndroid Build Coastguard Worker     }
489*9860b763SAndroid Build Coastguard Worker }
490*9860b763SAndroid Build Coastguard Worker 
491*9860b763SAndroid Build Coastguard Worker /// Manual implementation of [`crate::AsCborValue`] for the [`KeyParam`] enum that
492*9860b763SAndroid Build Coastguard Worker /// matches the serialization of the HAL `Tag` / `KeyParameterValue` types.
493*9860b763SAndroid Build Coastguard Worker impl crate::AsCborValue for KeyParam {
from_cbor_value(value: cbor::value::Value) -> Result<Self, crate::CborError>494*9860b763SAndroid Build Coastguard Worker     fn from_cbor_value(value: cbor::value::Value) -> Result<Self, crate::CborError> {
495*9860b763SAndroid Build Coastguard Worker         let mut a = match value {
496*9860b763SAndroid Build Coastguard Worker             cbor::value::Value::Array(a) => a,
497*9860b763SAndroid Build Coastguard Worker             _ => return crate::cbor_type_error(&value, "arr"),
498*9860b763SAndroid Build Coastguard Worker         };
499*9860b763SAndroid Build Coastguard Worker         if a.len() != 2 {
500*9860b763SAndroid Build Coastguard Worker             return Err(crate::CborError::UnexpectedItem("arr", "arr len 2"));
501*9860b763SAndroid Build Coastguard Worker         }
502*9860b763SAndroid Build Coastguard Worker 
503*9860b763SAndroid Build Coastguard Worker         // Need to know the tag value to completely parse the value.
504*9860b763SAndroid Build Coastguard Worker         let raw = a.remove(1);
505*9860b763SAndroid Build Coastguard Worker         let tag = <Tag>::from_cbor_value(a.remove(0))?;
506*9860b763SAndroid Build Coastguard Worker 
507*9860b763SAndroid Build Coastguard Worker         Ok(match tag {
508*9860b763SAndroid Build Coastguard Worker             Tag::Algorithm => KeyParam::Algorithm(<Algorithm>::from_cbor_value(raw)?),
509*9860b763SAndroid Build Coastguard Worker             Tag::BlockMode => KeyParam::BlockMode(<BlockMode>::from_cbor_value(raw)?),
510*9860b763SAndroid Build Coastguard Worker             Tag::Padding => KeyParam::Padding(<PaddingMode>::from_cbor_value(raw)?),
511*9860b763SAndroid Build Coastguard Worker             Tag::Digest => KeyParam::Digest(<Digest>::from_cbor_value(raw)?),
512*9860b763SAndroid Build Coastguard Worker             Tag::EcCurve => KeyParam::EcCurve(<EcCurve>::from_cbor_value(raw)?),
513*9860b763SAndroid Build Coastguard Worker             Tag::Origin => KeyParam::Origin(<KeyOrigin>::from_cbor_value(raw)?),
514*9860b763SAndroid Build Coastguard Worker             Tag::Purpose => KeyParam::Purpose(<KeyPurpose>::from_cbor_value(raw)?),
515*9860b763SAndroid Build Coastguard Worker             Tag::KeySize => KeyParam::KeySize(<KeySizeInBits>::from_cbor_value(raw)?),
516*9860b763SAndroid Build Coastguard Worker             Tag::CallerNonce => KeyParam::CallerNonce,
517*9860b763SAndroid Build Coastguard Worker             Tag::MinMacLength => KeyParam::MinMacLength(<u32>::from_cbor_value(raw)?),
518*9860b763SAndroid Build Coastguard Worker             Tag::RsaPublicExponent => {
519*9860b763SAndroid Build Coastguard Worker                 KeyParam::RsaPublicExponent(<RsaExponent>::from_cbor_value(raw)?)
520*9860b763SAndroid Build Coastguard Worker             }
521*9860b763SAndroid Build Coastguard Worker             Tag::IncludeUniqueId => {
522*9860b763SAndroid Build Coastguard Worker                 check_bool(raw)?;
523*9860b763SAndroid Build Coastguard Worker                 KeyParam::IncludeUniqueId
524*9860b763SAndroid Build Coastguard Worker             }
525*9860b763SAndroid Build Coastguard Worker             Tag::RsaOaepMgfDigest => KeyParam::RsaOaepMgfDigest(<Digest>::from_cbor_value(raw)?),
526*9860b763SAndroid Build Coastguard Worker             Tag::BootloaderOnly => {
527*9860b763SAndroid Build Coastguard Worker                 check_bool(raw)?;
528*9860b763SAndroid Build Coastguard Worker                 KeyParam::BootloaderOnly
529*9860b763SAndroid Build Coastguard Worker             }
530*9860b763SAndroid Build Coastguard Worker             Tag::RollbackResistance => {
531*9860b763SAndroid Build Coastguard Worker                 check_bool(raw)?;
532*9860b763SAndroid Build Coastguard Worker                 KeyParam::RollbackResistance
533*9860b763SAndroid Build Coastguard Worker             }
534*9860b763SAndroid Build Coastguard Worker             Tag::EarlyBootOnly => {
535*9860b763SAndroid Build Coastguard Worker                 check_bool(raw)?;
536*9860b763SAndroid Build Coastguard Worker                 KeyParam::EarlyBootOnly
537*9860b763SAndroid Build Coastguard Worker             }
538*9860b763SAndroid Build Coastguard Worker             Tag::ActiveDatetime => KeyParam::ActiveDatetime(<DateTime>::from_cbor_value(raw)?),
539*9860b763SAndroid Build Coastguard Worker             Tag::OriginationExpireDatetime => {
540*9860b763SAndroid Build Coastguard Worker                 KeyParam::OriginationExpireDatetime(<DateTime>::from_cbor_value(raw)?)
541*9860b763SAndroid Build Coastguard Worker             }
542*9860b763SAndroid Build Coastguard Worker             Tag::UsageExpireDatetime => {
543*9860b763SAndroid Build Coastguard Worker                 KeyParam::UsageExpireDatetime(<DateTime>::from_cbor_value(raw)?)
544*9860b763SAndroid Build Coastguard Worker             }
545*9860b763SAndroid Build Coastguard Worker             Tag::MaxUsesPerBoot => KeyParam::MaxUsesPerBoot(<u32>::from_cbor_value(raw)?),
546*9860b763SAndroid Build Coastguard Worker             Tag::UsageCountLimit => KeyParam::UsageCountLimit(<u32>::from_cbor_value(raw)?),
547*9860b763SAndroid Build Coastguard Worker             Tag::UserId => KeyParam::UserId(<u32>::from_cbor_value(raw)?),
548*9860b763SAndroid Build Coastguard Worker             Tag::UserSecureId => KeyParam::UserSecureId(<u64>::from_cbor_value(raw)?),
549*9860b763SAndroid Build Coastguard Worker             Tag::NoAuthRequired => {
550*9860b763SAndroid Build Coastguard Worker                 check_bool(raw)?;
551*9860b763SAndroid Build Coastguard Worker                 KeyParam::NoAuthRequired
552*9860b763SAndroid Build Coastguard Worker             }
553*9860b763SAndroid Build Coastguard Worker             Tag::UserAuthType => KeyParam::UserAuthType(<u32>::from_cbor_value(raw)?),
554*9860b763SAndroid Build Coastguard Worker             Tag::AuthTimeout => KeyParam::AuthTimeout(<u32>::from_cbor_value(raw)?),
555*9860b763SAndroid Build Coastguard Worker             Tag::AllowWhileOnBody => KeyParam::AllowWhileOnBody,
556*9860b763SAndroid Build Coastguard Worker             Tag::TrustedUserPresenceRequired => {
557*9860b763SAndroid Build Coastguard Worker                 check_bool(raw)?;
558*9860b763SAndroid Build Coastguard Worker                 KeyParam::TrustedUserPresenceRequired
559*9860b763SAndroid Build Coastguard Worker             }
560*9860b763SAndroid Build Coastguard Worker             Tag::TrustedConfirmationRequired => {
561*9860b763SAndroid Build Coastguard Worker                 check_bool(raw)?;
562*9860b763SAndroid Build Coastguard Worker                 KeyParam::TrustedConfirmationRequired
563*9860b763SAndroid Build Coastguard Worker             }
564*9860b763SAndroid Build Coastguard Worker             Tag::UnlockedDeviceRequired => {
565*9860b763SAndroid Build Coastguard Worker                 check_bool(raw)?;
566*9860b763SAndroid Build Coastguard Worker                 KeyParam::UnlockedDeviceRequired
567*9860b763SAndroid Build Coastguard Worker             }
568*9860b763SAndroid Build Coastguard Worker             Tag::ApplicationId => KeyParam::ApplicationId(<Vec<u8>>::from_cbor_value(raw)?),
569*9860b763SAndroid Build Coastguard Worker             Tag::ApplicationData => KeyParam::ApplicationData(<Vec<u8>>::from_cbor_value(raw)?),
570*9860b763SAndroid Build Coastguard Worker             Tag::CreationDatetime => KeyParam::CreationDatetime(<DateTime>::from_cbor_value(raw)?),
571*9860b763SAndroid Build Coastguard Worker             Tag::RootOfTrust => KeyParam::RootOfTrust(<Vec<u8>>::from_cbor_value(raw)?),
572*9860b763SAndroid Build Coastguard Worker             Tag::OsVersion => KeyParam::OsVersion(<u32>::from_cbor_value(raw)?),
573*9860b763SAndroid Build Coastguard Worker             Tag::OsPatchlevel => KeyParam::OsPatchlevel(<u32>::from_cbor_value(raw)?),
574*9860b763SAndroid Build Coastguard Worker             Tag::AttestationChallenge => {
575*9860b763SAndroid Build Coastguard Worker                 KeyParam::AttestationChallenge(<Vec<u8>>::from_cbor_value(raw)?)
576*9860b763SAndroid Build Coastguard Worker             }
577*9860b763SAndroid Build Coastguard Worker             Tag::AttestationApplicationId => {
578*9860b763SAndroid Build Coastguard Worker                 KeyParam::AttestationApplicationId(<Vec<u8>>::from_cbor_value(raw)?)
579*9860b763SAndroid Build Coastguard Worker             }
580*9860b763SAndroid Build Coastguard Worker             Tag::AttestationIdBrand => {
581*9860b763SAndroid Build Coastguard Worker                 KeyParam::AttestationIdBrand(<Vec<u8>>::from_cbor_value(raw)?)
582*9860b763SAndroid Build Coastguard Worker             }
583*9860b763SAndroid Build Coastguard Worker             Tag::AttestationIdDevice => {
584*9860b763SAndroid Build Coastguard Worker                 KeyParam::AttestationIdDevice(<Vec<u8>>::from_cbor_value(raw)?)
585*9860b763SAndroid Build Coastguard Worker             }
586*9860b763SAndroid Build Coastguard Worker             Tag::AttestationIdProduct => {
587*9860b763SAndroid Build Coastguard Worker                 KeyParam::AttestationIdProduct(<Vec<u8>>::from_cbor_value(raw)?)
588*9860b763SAndroid Build Coastguard Worker             }
589*9860b763SAndroid Build Coastguard Worker             Tag::AttestationIdSerial => {
590*9860b763SAndroid Build Coastguard Worker                 KeyParam::AttestationIdSerial(<Vec<u8>>::from_cbor_value(raw)?)
591*9860b763SAndroid Build Coastguard Worker             }
592*9860b763SAndroid Build Coastguard Worker             Tag::AttestationIdImei => KeyParam::AttestationIdImei(<Vec<u8>>::from_cbor_value(raw)?),
593*9860b763SAndroid Build Coastguard Worker             #[cfg(feature = "hal_v3")]
594*9860b763SAndroid Build Coastguard Worker             Tag::AttestationIdSecondImei => {
595*9860b763SAndroid Build Coastguard Worker                 KeyParam::AttestationIdSecondImei(<Vec<u8>>::from_cbor_value(raw)?)
596*9860b763SAndroid Build Coastguard Worker             }
597*9860b763SAndroid Build Coastguard Worker             Tag::AttestationIdMeid => KeyParam::AttestationIdMeid(<Vec<u8>>::from_cbor_value(raw)?),
598*9860b763SAndroid Build Coastguard Worker             Tag::AttestationIdManufacturer => {
599*9860b763SAndroid Build Coastguard Worker                 KeyParam::AttestationIdManufacturer(<Vec<u8>>::from_cbor_value(raw)?)
600*9860b763SAndroid Build Coastguard Worker             }
601*9860b763SAndroid Build Coastguard Worker             Tag::AttestationIdModel => {
602*9860b763SAndroid Build Coastguard Worker                 KeyParam::AttestationIdModel(<Vec<u8>>::from_cbor_value(raw)?)
603*9860b763SAndroid Build Coastguard Worker             }
604*9860b763SAndroid Build Coastguard Worker             Tag::VendorPatchlevel => KeyParam::VendorPatchlevel(<u32>::from_cbor_value(raw)?),
605*9860b763SAndroid Build Coastguard Worker             Tag::BootPatchlevel => KeyParam::BootPatchlevel(<u32>::from_cbor_value(raw)?),
606*9860b763SAndroid Build Coastguard Worker             Tag::DeviceUniqueAttestation => {
607*9860b763SAndroid Build Coastguard Worker                 check_bool(raw)?;
608*9860b763SAndroid Build Coastguard Worker                 KeyParam::DeviceUniqueAttestation
609*9860b763SAndroid Build Coastguard Worker             }
610*9860b763SAndroid Build Coastguard Worker             Tag::StorageKey => KeyParam::StorageKey,
611*9860b763SAndroid Build Coastguard Worker             Tag::Nonce => KeyParam::Nonce(<Vec<u8>>::from_cbor_value(raw)?),
612*9860b763SAndroid Build Coastguard Worker             Tag::MacLength => KeyParam::MacLength(<u32>::from_cbor_value(raw)?),
613*9860b763SAndroid Build Coastguard Worker             Tag::ResetSinceIdRotation => {
614*9860b763SAndroid Build Coastguard Worker                 check_bool(raw)?;
615*9860b763SAndroid Build Coastguard Worker                 KeyParam::ResetSinceIdRotation
616*9860b763SAndroid Build Coastguard Worker             }
617*9860b763SAndroid Build Coastguard Worker             Tag::CertificateSerial => KeyParam::CertificateSerial(<Vec<u8>>::from_cbor_value(raw)?),
618*9860b763SAndroid Build Coastguard Worker             Tag::CertificateSubject => {
619*9860b763SAndroid Build Coastguard Worker                 KeyParam::CertificateSubject(<Vec<u8>>::from_cbor_value(raw)?)
620*9860b763SAndroid Build Coastguard Worker             }
621*9860b763SAndroid Build Coastguard Worker             Tag::CertificateNotBefore => {
622*9860b763SAndroid Build Coastguard Worker                 KeyParam::CertificateNotBefore(<DateTime>::from_cbor_value(raw)?)
623*9860b763SAndroid Build Coastguard Worker             }
624*9860b763SAndroid Build Coastguard Worker             Tag::CertificateNotAfter => {
625*9860b763SAndroid Build Coastguard Worker                 KeyParam::CertificateNotAfter(<DateTime>::from_cbor_value(raw)?)
626*9860b763SAndroid Build Coastguard Worker             }
627*9860b763SAndroid Build Coastguard Worker             Tag::MaxBootLevel => KeyParam::MaxBootLevel(<u32>::from_cbor_value(raw)?),
628*9860b763SAndroid Build Coastguard Worker             #[cfg(feature = "hal_v4")]
629*9860b763SAndroid Build Coastguard Worker             Tag::ModuleHash => KeyParam::ModuleHash(<Vec<u8>>::from_cbor_value(raw)?),
630*9860b763SAndroid Build Coastguard Worker 
631*9860b763SAndroid Build Coastguard Worker             _ => return Err(crate::CborError::UnexpectedItem("tag", "known tag")),
632*9860b763SAndroid Build Coastguard Worker         })
633*9860b763SAndroid Build Coastguard Worker     }
to_cbor_value(self) -> Result<cbor::value::Value, crate::CborError>634*9860b763SAndroid Build Coastguard Worker     fn to_cbor_value(self) -> Result<cbor::value::Value, crate::CborError> {
635*9860b763SAndroid Build Coastguard Worker         let (tag, val) = match self {
636*9860b763SAndroid Build Coastguard Worker             KeyParam::Algorithm(v) => (Tag::Algorithm, v.to_cbor_value()?),
637*9860b763SAndroid Build Coastguard Worker             KeyParam::BlockMode(v) => (Tag::BlockMode, v.to_cbor_value()?),
638*9860b763SAndroid Build Coastguard Worker             KeyParam::Padding(v) => (Tag::Padding, v.to_cbor_value()?),
639*9860b763SAndroid Build Coastguard Worker             KeyParam::Digest(v) => (Tag::Digest, v.to_cbor_value()?),
640*9860b763SAndroid Build Coastguard Worker             KeyParam::EcCurve(v) => (Tag::EcCurve, v.to_cbor_value()?),
641*9860b763SAndroid Build Coastguard Worker             KeyParam::Origin(v) => (Tag::Origin, v.to_cbor_value()?),
642*9860b763SAndroid Build Coastguard Worker             KeyParam::Purpose(v) => (Tag::Purpose, v.to_cbor_value()?),
643*9860b763SAndroid Build Coastguard Worker             KeyParam::KeySize(v) => (Tag::KeySize, v.to_cbor_value()?),
644*9860b763SAndroid Build Coastguard Worker             KeyParam::CallerNonce => (Tag::CallerNonce, true.to_cbor_value()?),
645*9860b763SAndroid Build Coastguard Worker             KeyParam::MinMacLength(v) => (Tag::MinMacLength, v.to_cbor_value()?),
646*9860b763SAndroid Build Coastguard Worker             KeyParam::RsaPublicExponent(v) => (Tag::RsaPublicExponent, v.to_cbor_value()?),
647*9860b763SAndroid Build Coastguard Worker             KeyParam::IncludeUniqueId => (Tag::IncludeUniqueId, true.to_cbor_value()?),
648*9860b763SAndroid Build Coastguard Worker             KeyParam::RsaOaepMgfDigest(v) => (Tag::RsaOaepMgfDigest, v.to_cbor_value()?),
649*9860b763SAndroid Build Coastguard Worker             KeyParam::BootloaderOnly => (Tag::BootloaderOnly, true.to_cbor_value()?),
650*9860b763SAndroid Build Coastguard Worker             KeyParam::RollbackResistance => (Tag::RollbackResistance, true.to_cbor_value()?),
651*9860b763SAndroid Build Coastguard Worker             KeyParam::EarlyBootOnly => (Tag::EarlyBootOnly, true.to_cbor_value()?),
652*9860b763SAndroid Build Coastguard Worker             KeyParam::ActiveDatetime(v) => (Tag::ActiveDatetime, v.to_cbor_value()?),
653*9860b763SAndroid Build Coastguard Worker             KeyParam::OriginationExpireDatetime(v) => {
654*9860b763SAndroid Build Coastguard Worker                 (Tag::OriginationExpireDatetime, v.to_cbor_value()?)
655*9860b763SAndroid Build Coastguard Worker             }
656*9860b763SAndroid Build Coastguard Worker             KeyParam::UsageExpireDatetime(v) => (Tag::UsageExpireDatetime, v.to_cbor_value()?),
657*9860b763SAndroid Build Coastguard Worker             KeyParam::MaxUsesPerBoot(v) => (Tag::MaxUsesPerBoot, v.to_cbor_value()?),
658*9860b763SAndroid Build Coastguard Worker             KeyParam::UsageCountLimit(v) => (Tag::UsageCountLimit, v.to_cbor_value()?),
659*9860b763SAndroid Build Coastguard Worker             KeyParam::UserId(v) => (Tag::UserId, v.to_cbor_value()?),
660*9860b763SAndroid Build Coastguard Worker             KeyParam::UserSecureId(v) => (Tag::UserSecureId, v.to_cbor_value()?),
661*9860b763SAndroid Build Coastguard Worker             KeyParam::NoAuthRequired => (Tag::NoAuthRequired, true.to_cbor_value()?),
662*9860b763SAndroid Build Coastguard Worker             KeyParam::UserAuthType(v) => (Tag::UserAuthType, v.to_cbor_value()?),
663*9860b763SAndroid Build Coastguard Worker             KeyParam::AuthTimeout(v) => (Tag::AuthTimeout, v.to_cbor_value()?),
664*9860b763SAndroid Build Coastguard Worker             KeyParam::AllowWhileOnBody => (Tag::AllowWhileOnBody, true.to_cbor_value()?),
665*9860b763SAndroid Build Coastguard Worker             KeyParam::TrustedUserPresenceRequired => {
666*9860b763SAndroid Build Coastguard Worker                 (Tag::TrustedUserPresenceRequired, true.to_cbor_value()?)
667*9860b763SAndroid Build Coastguard Worker             }
668*9860b763SAndroid Build Coastguard Worker             KeyParam::TrustedConfirmationRequired => {
669*9860b763SAndroid Build Coastguard Worker                 (Tag::TrustedConfirmationRequired, true.to_cbor_value()?)
670*9860b763SAndroid Build Coastguard Worker             }
671*9860b763SAndroid Build Coastguard Worker             KeyParam::UnlockedDeviceRequired => {
672*9860b763SAndroid Build Coastguard Worker                 (Tag::UnlockedDeviceRequired, true.to_cbor_value()?)
673*9860b763SAndroid Build Coastguard Worker             }
674*9860b763SAndroid Build Coastguard Worker             KeyParam::ApplicationId(v) => (Tag::ApplicationId, v.to_cbor_value()?),
675*9860b763SAndroid Build Coastguard Worker             KeyParam::ApplicationData(v) => (Tag::ApplicationData, v.to_cbor_value()?),
676*9860b763SAndroid Build Coastguard Worker             KeyParam::CreationDatetime(v) => (Tag::CreationDatetime, v.to_cbor_value()?),
677*9860b763SAndroid Build Coastguard Worker             KeyParam::RootOfTrust(v) => (Tag::RootOfTrust, v.to_cbor_value()?),
678*9860b763SAndroid Build Coastguard Worker             KeyParam::OsVersion(v) => (Tag::OsVersion, v.to_cbor_value()?),
679*9860b763SAndroid Build Coastguard Worker             KeyParam::OsPatchlevel(v) => (Tag::OsPatchlevel, v.to_cbor_value()?),
680*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationChallenge(v) => (Tag::AttestationChallenge, v.to_cbor_value()?),
681*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationApplicationId(v) => {
682*9860b763SAndroid Build Coastguard Worker                 (Tag::AttestationApplicationId, v.to_cbor_value()?)
683*9860b763SAndroid Build Coastguard Worker             }
684*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdBrand(v) => (Tag::AttestationIdBrand, v.to_cbor_value()?),
685*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdDevice(v) => (Tag::AttestationIdDevice, v.to_cbor_value()?),
686*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdProduct(v) => (Tag::AttestationIdProduct, v.to_cbor_value()?),
687*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdSerial(v) => (Tag::AttestationIdSerial, v.to_cbor_value()?),
688*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdImei(v) => (Tag::AttestationIdImei, v.to_cbor_value()?),
689*9860b763SAndroid Build Coastguard Worker             #[cfg(feature = "hal_v3")]
690*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdSecondImei(v) => {
691*9860b763SAndroid Build Coastguard Worker                 (Tag::AttestationIdSecondImei, v.to_cbor_value()?)
692*9860b763SAndroid Build Coastguard Worker             }
693*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdMeid(v) => (Tag::AttestationIdMeid, v.to_cbor_value()?),
694*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdManufacturer(v) => {
695*9860b763SAndroid Build Coastguard Worker                 (Tag::AttestationIdManufacturer, v.to_cbor_value()?)
696*9860b763SAndroid Build Coastguard Worker             }
697*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdModel(v) => (Tag::AttestationIdModel, v.to_cbor_value()?),
698*9860b763SAndroid Build Coastguard Worker             KeyParam::VendorPatchlevel(v) => (Tag::VendorPatchlevel, v.to_cbor_value()?),
699*9860b763SAndroid Build Coastguard Worker             KeyParam::BootPatchlevel(v) => (Tag::BootPatchlevel, v.to_cbor_value()?),
700*9860b763SAndroid Build Coastguard Worker             KeyParam::DeviceUniqueAttestation => {
701*9860b763SAndroid Build Coastguard Worker                 (Tag::DeviceUniqueAttestation, true.to_cbor_value()?)
702*9860b763SAndroid Build Coastguard Worker             }
703*9860b763SAndroid Build Coastguard Worker             KeyParam::StorageKey => (Tag::StorageKey, true.to_cbor_value()?),
704*9860b763SAndroid Build Coastguard Worker             KeyParam::Nonce(v) => (Tag::Nonce, v.to_cbor_value()?),
705*9860b763SAndroid Build Coastguard Worker             KeyParam::MacLength(v) => (Tag::MacLength, v.to_cbor_value()?),
706*9860b763SAndroid Build Coastguard Worker             KeyParam::ResetSinceIdRotation => (Tag::ResetSinceIdRotation, true.to_cbor_value()?),
707*9860b763SAndroid Build Coastguard Worker             KeyParam::CertificateSerial(v) => (Tag::CertificateSerial, v.to_cbor_value()?),
708*9860b763SAndroid Build Coastguard Worker             KeyParam::CertificateSubject(v) => (Tag::CertificateSubject, v.to_cbor_value()?),
709*9860b763SAndroid Build Coastguard Worker             KeyParam::CertificateNotBefore(v) => (Tag::CertificateNotBefore, v.to_cbor_value()?),
710*9860b763SAndroid Build Coastguard Worker             KeyParam::CertificateNotAfter(v) => (Tag::CertificateNotAfter, v.to_cbor_value()?),
711*9860b763SAndroid Build Coastguard Worker             KeyParam::MaxBootLevel(v) => (Tag::MaxBootLevel, v.to_cbor_value()?),
712*9860b763SAndroid Build Coastguard Worker             #[cfg(feature = "hal_v4")]
713*9860b763SAndroid Build Coastguard Worker             KeyParam::ModuleHash(v) => (Tag::ModuleHash, v.to_cbor_value()?),
714*9860b763SAndroid Build Coastguard Worker         };
715*9860b763SAndroid Build Coastguard Worker         Ok(cbor::value::Value::Array(vec_try![tag.to_cbor_value()?, val]?))
716*9860b763SAndroid Build Coastguard Worker     }
cddl_typename() -> Option<String>717*9860b763SAndroid Build Coastguard Worker     fn cddl_typename() -> Option<String> {
718*9860b763SAndroid Build Coastguard Worker         Some("KeyParam".to_string())
719*9860b763SAndroid Build Coastguard Worker     }
cddl_schema() -> Option<String>720*9860b763SAndroid Build Coastguard Worker     fn cddl_schema() -> Option<String> {
721*9860b763SAndroid Build Coastguard Worker         let mut result = "&(\n".to_string();
722*9860b763SAndroid Build Coastguard Worker 
723*9860b763SAndroid Build Coastguard Worker         result += &format!(
724*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
725*9860b763SAndroid Build Coastguard Worker             Tag::Algorithm as i32,
726*9860b763SAndroid Build Coastguard Worker             Algorithm::cddl_ref(),
727*9860b763SAndroid Build Coastguard Worker             "Tag_Algorithm"
728*9860b763SAndroid Build Coastguard Worker         );
729*9860b763SAndroid Build Coastguard Worker         result += &format!(
730*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
731*9860b763SAndroid Build Coastguard Worker             Tag::BlockMode as i32,
732*9860b763SAndroid Build Coastguard Worker             BlockMode::cddl_ref(),
733*9860b763SAndroid Build Coastguard Worker             "Tag_BlockMode",
734*9860b763SAndroid Build Coastguard Worker         );
735*9860b763SAndroid Build Coastguard Worker         result += &format!(
736*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
737*9860b763SAndroid Build Coastguard Worker             Tag::Padding as i32,
738*9860b763SAndroid Build Coastguard Worker             PaddingMode::cddl_ref(),
739*9860b763SAndroid Build Coastguard Worker             "Tag_Padding",
740*9860b763SAndroid Build Coastguard Worker         );
741*9860b763SAndroid Build Coastguard Worker         result +=
742*9860b763SAndroid Build Coastguard Worker             &format!("    [{}, {}], ; {}\n", Tag::Digest as i32, Digest::cddl_ref(), "Tag_Digest",);
743*9860b763SAndroid Build Coastguard Worker         result += &format!(
744*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
745*9860b763SAndroid Build Coastguard Worker             Tag::EcCurve as i32,
746*9860b763SAndroid Build Coastguard Worker             EcCurve::cddl_ref(),
747*9860b763SAndroid Build Coastguard Worker             "Tag_EcCurve",
748*9860b763SAndroid Build Coastguard Worker         );
749*9860b763SAndroid Build Coastguard Worker         result += &format!(
750*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
751*9860b763SAndroid Build Coastguard Worker             Tag::Origin as i32,
752*9860b763SAndroid Build Coastguard Worker             KeyOrigin::cddl_ref(),
753*9860b763SAndroid Build Coastguard Worker             "Tag_Origin",
754*9860b763SAndroid Build Coastguard Worker         );
755*9860b763SAndroid Build Coastguard Worker         result += &format!(
756*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
757*9860b763SAndroid Build Coastguard Worker             Tag::Purpose as i32,
758*9860b763SAndroid Build Coastguard Worker             KeyPurpose::cddl_ref(),
759*9860b763SAndroid Build Coastguard Worker             "Tag_Purpose",
760*9860b763SAndroid Build Coastguard Worker         );
761*9860b763SAndroid Build Coastguard Worker         result += &format!(
762*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
763*9860b763SAndroid Build Coastguard Worker             Tag::KeySize as i32,
764*9860b763SAndroid Build Coastguard Worker             KeySizeInBits::cddl_ref(),
765*9860b763SAndroid Build Coastguard Worker             "Tag_KeySize",
766*9860b763SAndroid Build Coastguard Worker         );
767*9860b763SAndroid Build Coastguard Worker         result += &format!(
768*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
769*9860b763SAndroid Build Coastguard Worker             Tag::CallerNonce as i32,
770*9860b763SAndroid Build Coastguard Worker             Vec::<u8>::cddl_ref(),
771*9860b763SAndroid Build Coastguard Worker             "Tag_CallerNonce",
772*9860b763SAndroid Build Coastguard Worker         );
773*9860b763SAndroid Build Coastguard Worker         result += &format!(
774*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
775*9860b763SAndroid Build Coastguard Worker             Tag::MinMacLength as i32,
776*9860b763SAndroid Build Coastguard Worker             u32::cddl_ref(),
777*9860b763SAndroid Build Coastguard Worker             "Tag_MinMacLength",
778*9860b763SAndroid Build Coastguard Worker         );
779*9860b763SAndroid Build Coastguard Worker         result += &format!(
780*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
781*9860b763SAndroid Build Coastguard Worker             Tag::RsaPublicExponent as i32,
782*9860b763SAndroid Build Coastguard Worker             RsaExponent::cddl_ref(),
783*9860b763SAndroid Build Coastguard Worker             "Tag_RsaPublicExponent",
784*9860b763SAndroid Build Coastguard Worker         );
785*9860b763SAndroid Build Coastguard Worker         result += &format!(
786*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
787*9860b763SAndroid Build Coastguard Worker             Tag::IncludeUniqueId as i32,
788*9860b763SAndroid Build Coastguard Worker             "true",
789*9860b763SAndroid Build Coastguard Worker             "Tag_IncludeUniqueId",
790*9860b763SAndroid Build Coastguard Worker         );
791*9860b763SAndroid Build Coastguard Worker         result += &format!(
792*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
793*9860b763SAndroid Build Coastguard Worker             Tag::RsaOaepMgfDigest as i32,
794*9860b763SAndroid Build Coastguard Worker             Digest::cddl_ref(),
795*9860b763SAndroid Build Coastguard Worker             "Tag_RsaOaepMgfDigest",
796*9860b763SAndroid Build Coastguard Worker         );
797*9860b763SAndroid Build Coastguard Worker         result += &format!(
798*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
799*9860b763SAndroid Build Coastguard Worker             Tag::BootloaderOnly as i32,
800*9860b763SAndroid Build Coastguard Worker             "true",
801*9860b763SAndroid Build Coastguard Worker             "Tag_BootloaderOnly",
802*9860b763SAndroid Build Coastguard Worker         );
803*9860b763SAndroid Build Coastguard Worker         result += &format!(
804*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
805*9860b763SAndroid Build Coastguard Worker             Tag::RollbackResistance as i32,
806*9860b763SAndroid Build Coastguard Worker             "true",
807*9860b763SAndroid Build Coastguard Worker             "Tag_RollbackResistance",
808*9860b763SAndroid Build Coastguard Worker         );
809*9860b763SAndroid Build Coastguard Worker         result += &format!(
810*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
811*9860b763SAndroid Build Coastguard Worker             Tag::EarlyBootOnly as i32,
812*9860b763SAndroid Build Coastguard Worker             "true",
813*9860b763SAndroid Build Coastguard Worker             "Tag_EarlyBootOnly",
814*9860b763SAndroid Build Coastguard Worker         );
815*9860b763SAndroid Build Coastguard Worker         result += &format!(
816*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
817*9860b763SAndroid Build Coastguard Worker             Tag::ActiveDatetime as i32,
818*9860b763SAndroid Build Coastguard Worker             DateTime::cddl_ref(),
819*9860b763SAndroid Build Coastguard Worker             "Tag_ActiveDatetime",
820*9860b763SAndroid Build Coastguard Worker         );
821*9860b763SAndroid Build Coastguard Worker         result += &format!(
822*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
823*9860b763SAndroid Build Coastguard Worker             Tag::OriginationExpireDatetime as i32,
824*9860b763SAndroid Build Coastguard Worker             DateTime::cddl_ref(),
825*9860b763SAndroid Build Coastguard Worker             "Tag_OriginationExpireDatetime",
826*9860b763SAndroid Build Coastguard Worker         );
827*9860b763SAndroid Build Coastguard Worker         result += &format!(
828*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
829*9860b763SAndroid Build Coastguard Worker             Tag::UsageExpireDatetime as i32,
830*9860b763SAndroid Build Coastguard Worker             DateTime::cddl_ref(),
831*9860b763SAndroid Build Coastguard Worker             "Tag_UsageExpireDatetime",
832*9860b763SAndroid Build Coastguard Worker         );
833*9860b763SAndroid Build Coastguard Worker         result += &format!(
834*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
835*9860b763SAndroid Build Coastguard Worker             Tag::MaxUsesPerBoot as i32,
836*9860b763SAndroid Build Coastguard Worker             u32::cddl_ref(),
837*9860b763SAndroid Build Coastguard Worker             "Tag_MaxUsesPerBoot",
838*9860b763SAndroid Build Coastguard Worker         );
839*9860b763SAndroid Build Coastguard Worker         result += &format!(
840*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
841*9860b763SAndroid Build Coastguard Worker             Tag::UsageCountLimit as i32,
842*9860b763SAndroid Build Coastguard Worker             u32::cddl_ref(),
843*9860b763SAndroid Build Coastguard Worker             "Tag_UsageCountLimit",
844*9860b763SAndroid Build Coastguard Worker         );
845*9860b763SAndroid Build Coastguard Worker         result +=
846*9860b763SAndroid Build Coastguard Worker             &format!("    [{}, {}], ; {}\n", Tag::UserId as i32, u32::cddl_ref(), "Tag_UserId",);
847*9860b763SAndroid Build Coastguard Worker         result += &format!(
848*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
849*9860b763SAndroid Build Coastguard Worker             Tag::UserSecureId as i32,
850*9860b763SAndroid Build Coastguard Worker             u64::cddl_ref(),
851*9860b763SAndroid Build Coastguard Worker             "Tag_UserSecureId",
852*9860b763SAndroid Build Coastguard Worker         );
853*9860b763SAndroid Build Coastguard Worker         result += &format!(
854*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
855*9860b763SAndroid Build Coastguard Worker             Tag::NoAuthRequired as i32,
856*9860b763SAndroid Build Coastguard Worker             "true",
857*9860b763SAndroid Build Coastguard Worker             "Tag_NoAuthRequired",
858*9860b763SAndroid Build Coastguard Worker         );
859*9860b763SAndroid Build Coastguard Worker         result += &format!(
860*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
861*9860b763SAndroid Build Coastguard Worker             Tag::UserAuthType as i32,
862*9860b763SAndroid Build Coastguard Worker             u32::cddl_ref(),
863*9860b763SAndroid Build Coastguard Worker             "Tag_UserAuthType",
864*9860b763SAndroid Build Coastguard Worker         );
865*9860b763SAndroid Build Coastguard Worker         result += &format!(
866*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
867*9860b763SAndroid Build Coastguard Worker             Tag::AuthTimeout as i32,
868*9860b763SAndroid Build Coastguard Worker             u32::cddl_ref(),
869*9860b763SAndroid Build Coastguard Worker             "Tag_AuthTimeout",
870*9860b763SAndroid Build Coastguard Worker         );
871*9860b763SAndroid Build Coastguard Worker         result += &format!(
872*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
873*9860b763SAndroid Build Coastguard Worker             Tag::AllowWhileOnBody as i32,
874*9860b763SAndroid Build Coastguard Worker             "true",
875*9860b763SAndroid Build Coastguard Worker             "Tag_AllowWhileOnBody",
876*9860b763SAndroid Build Coastguard Worker         );
877*9860b763SAndroid Build Coastguard Worker         result += &format!(
878*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
879*9860b763SAndroid Build Coastguard Worker             Tag::TrustedUserPresenceRequired as i32,
880*9860b763SAndroid Build Coastguard Worker             "true",
881*9860b763SAndroid Build Coastguard Worker             "Tag_TrustedUserPresenceRequired",
882*9860b763SAndroid Build Coastguard Worker         );
883*9860b763SAndroid Build Coastguard Worker         result += &format!(
884*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
885*9860b763SAndroid Build Coastguard Worker             Tag::TrustedConfirmationRequired as i32,
886*9860b763SAndroid Build Coastguard Worker             "true",
887*9860b763SAndroid Build Coastguard Worker             "Tag_TrustedConfirmationRequired",
888*9860b763SAndroid Build Coastguard Worker         );
889*9860b763SAndroid Build Coastguard Worker         result += &format!(
890*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
891*9860b763SAndroid Build Coastguard Worker             Tag::UnlockedDeviceRequired as i32,
892*9860b763SAndroid Build Coastguard Worker             "true",
893*9860b763SAndroid Build Coastguard Worker             "Tag_UnlockedDeviceRequired",
894*9860b763SAndroid Build Coastguard Worker         );
895*9860b763SAndroid Build Coastguard Worker         result += &format!(
896*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
897*9860b763SAndroid Build Coastguard Worker             Tag::ApplicationId as i32,
898*9860b763SAndroid Build Coastguard Worker             Vec::<u8>::cddl_ref(),
899*9860b763SAndroid Build Coastguard Worker             "Tag_ApplicationId",
900*9860b763SAndroid Build Coastguard Worker         );
901*9860b763SAndroid Build Coastguard Worker         result += &format!(
902*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
903*9860b763SAndroid Build Coastguard Worker             Tag::ApplicationData as i32,
904*9860b763SAndroid Build Coastguard Worker             Vec::<u8>::cddl_ref(),
905*9860b763SAndroid Build Coastguard Worker             "Tag_ApplicationData",
906*9860b763SAndroid Build Coastguard Worker         );
907*9860b763SAndroid Build Coastguard Worker         result += &format!(
908*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
909*9860b763SAndroid Build Coastguard Worker             Tag::CreationDatetime as i32,
910*9860b763SAndroid Build Coastguard Worker             DateTime::cddl_ref(),
911*9860b763SAndroid Build Coastguard Worker             "Tag_CreationDatetime",
912*9860b763SAndroid Build Coastguard Worker         );
913*9860b763SAndroid Build Coastguard Worker         result += &format!(
914*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
915*9860b763SAndroid Build Coastguard Worker             Tag::RootOfTrust as i32,
916*9860b763SAndroid Build Coastguard Worker             Vec::<u8>::cddl_ref(),
917*9860b763SAndroid Build Coastguard Worker             "Tag_RootOfTrust",
918*9860b763SAndroid Build Coastguard Worker         );
919*9860b763SAndroid Build Coastguard Worker         result += &format!(
920*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
921*9860b763SAndroid Build Coastguard Worker             Tag::OsVersion as i32,
922*9860b763SAndroid Build Coastguard Worker             u32::cddl_ref(),
923*9860b763SAndroid Build Coastguard Worker             "Tag_OsVersion",
924*9860b763SAndroid Build Coastguard Worker         );
925*9860b763SAndroid Build Coastguard Worker         result += &format!(
926*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
927*9860b763SAndroid Build Coastguard Worker             Tag::OsPatchlevel as i32,
928*9860b763SAndroid Build Coastguard Worker             u32::cddl_ref(),
929*9860b763SAndroid Build Coastguard Worker             "Tag_OsPatchlevel",
930*9860b763SAndroid Build Coastguard Worker         );
931*9860b763SAndroid Build Coastguard Worker         result += &format!(
932*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
933*9860b763SAndroid Build Coastguard Worker             Tag::AttestationChallenge as i32,
934*9860b763SAndroid Build Coastguard Worker             Vec::<u8>::cddl_ref(),
935*9860b763SAndroid Build Coastguard Worker             "Tag_AttestationChallenge",
936*9860b763SAndroid Build Coastguard Worker         );
937*9860b763SAndroid Build Coastguard Worker         result += &format!(
938*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
939*9860b763SAndroid Build Coastguard Worker             Tag::AttestationApplicationId as i32,
940*9860b763SAndroid Build Coastguard Worker             Vec::<u8>::cddl_ref(),
941*9860b763SAndroid Build Coastguard Worker             "Tag_AttestationApplicationId",
942*9860b763SAndroid Build Coastguard Worker         );
943*9860b763SAndroid Build Coastguard Worker         result += &format!(
944*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
945*9860b763SAndroid Build Coastguard Worker             Tag::AttestationIdBrand as i32,
946*9860b763SAndroid Build Coastguard Worker             Vec::<u8>::cddl_ref(),
947*9860b763SAndroid Build Coastguard Worker             "Tag_AttestationIdBrand",
948*9860b763SAndroid Build Coastguard Worker         );
949*9860b763SAndroid Build Coastguard Worker         result += &format!(
950*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
951*9860b763SAndroid Build Coastguard Worker             Tag::AttestationIdDevice as i32,
952*9860b763SAndroid Build Coastguard Worker             Vec::<u8>::cddl_ref(),
953*9860b763SAndroid Build Coastguard Worker             "Tag_AttestationIdDevice",
954*9860b763SAndroid Build Coastguard Worker         );
955*9860b763SAndroid Build Coastguard Worker         result += &format!(
956*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
957*9860b763SAndroid Build Coastguard Worker             Tag::AttestationIdProduct as i32,
958*9860b763SAndroid Build Coastguard Worker             Vec::<u8>::cddl_ref(),
959*9860b763SAndroid Build Coastguard Worker             "Tag_AttestationIdProduct",
960*9860b763SAndroid Build Coastguard Worker         );
961*9860b763SAndroid Build Coastguard Worker         result += &format!(
962*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
963*9860b763SAndroid Build Coastguard Worker             Tag::AttestationIdSerial as i32,
964*9860b763SAndroid Build Coastguard Worker             Vec::<u8>::cddl_ref(),
965*9860b763SAndroid Build Coastguard Worker             "Tag_AttestationIdSerial",
966*9860b763SAndroid Build Coastguard Worker         );
967*9860b763SAndroid Build Coastguard Worker         result += &format!(
968*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
969*9860b763SAndroid Build Coastguard Worker             Tag::AttestationIdImei as i32,
970*9860b763SAndroid Build Coastguard Worker             Vec::<u8>::cddl_ref(),
971*9860b763SAndroid Build Coastguard Worker             "Tag_AttestationIdImei",
972*9860b763SAndroid Build Coastguard Worker         );
973*9860b763SAndroid Build Coastguard Worker         #[cfg(feature = "hal_v3")]
974*9860b763SAndroid Build Coastguard Worker         {
975*9860b763SAndroid Build Coastguard Worker             result += &format!(
976*9860b763SAndroid Build Coastguard Worker                 "    [{}, {}], ; {}\n",
977*9860b763SAndroid Build Coastguard Worker                 Tag::AttestationIdSecondImei as i32,
978*9860b763SAndroid Build Coastguard Worker                 Vec::<u8>::cddl_ref(),
979*9860b763SAndroid Build Coastguard Worker                 "Tag_AttestationIdSecondImei",
980*9860b763SAndroid Build Coastguard Worker             );
981*9860b763SAndroid Build Coastguard Worker         }
982*9860b763SAndroid Build Coastguard Worker         result += &format!(
983*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
984*9860b763SAndroid Build Coastguard Worker             Tag::AttestationIdMeid as i32,
985*9860b763SAndroid Build Coastguard Worker             Vec::<u8>::cddl_ref(),
986*9860b763SAndroid Build Coastguard Worker             "Tag_AttestationIdMeid",
987*9860b763SAndroid Build Coastguard Worker         );
988*9860b763SAndroid Build Coastguard Worker         result += &format!(
989*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
990*9860b763SAndroid Build Coastguard Worker             Tag::AttestationIdManufacturer as i32,
991*9860b763SAndroid Build Coastguard Worker             Vec::<u8>::cddl_ref(),
992*9860b763SAndroid Build Coastguard Worker             "Tag_AttestationIdManufacturer",
993*9860b763SAndroid Build Coastguard Worker         );
994*9860b763SAndroid Build Coastguard Worker         result += &format!(
995*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
996*9860b763SAndroid Build Coastguard Worker             Tag::AttestationIdModel as i32,
997*9860b763SAndroid Build Coastguard Worker             Vec::<u8>::cddl_ref(),
998*9860b763SAndroid Build Coastguard Worker             "Tag_AttestationIdModel",
999*9860b763SAndroid Build Coastguard Worker         );
1000*9860b763SAndroid Build Coastguard Worker         result += &format!(
1001*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
1002*9860b763SAndroid Build Coastguard Worker             Tag::VendorPatchlevel as i32,
1003*9860b763SAndroid Build Coastguard Worker             u32::cddl_ref(),
1004*9860b763SAndroid Build Coastguard Worker             "Tag_VendorPatchlevel",
1005*9860b763SAndroid Build Coastguard Worker         );
1006*9860b763SAndroid Build Coastguard Worker         result += &format!(
1007*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
1008*9860b763SAndroid Build Coastguard Worker             Tag::BootPatchlevel as i32,
1009*9860b763SAndroid Build Coastguard Worker             u32::cddl_ref(),
1010*9860b763SAndroid Build Coastguard Worker             "Tag_BootPatchlevel",
1011*9860b763SAndroid Build Coastguard Worker         );
1012*9860b763SAndroid Build Coastguard Worker         result += &format!(
1013*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
1014*9860b763SAndroid Build Coastguard Worker             Tag::DeviceUniqueAttestation as i32,
1015*9860b763SAndroid Build Coastguard Worker             "true",
1016*9860b763SAndroid Build Coastguard Worker             "Tag_DeviceUniqueAttestation",
1017*9860b763SAndroid Build Coastguard Worker         );
1018*9860b763SAndroid Build Coastguard Worker         result +=
1019*9860b763SAndroid Build Coastguard Worker             &format!("    [{}, {}], ; {}\n", Tag::StorageKey as i32, "true", "Tag_StorageKey",);
1020*9860b763SAndroid Build Coastguard Worker         result += &format!(
1021*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
1022*9860b763SAndroid Build Coastguard Worker             Tag::Nonce as i32,
1023*9860b763SAndroid Build Coastguard Worker             Vec::<u8>::cddl_ref(),
1024*9860b763SAndroid Build Coastguard Worker             "Tag_Nonce",
1025*9860b763SAndroid Build Coastguard Worker         );
1026*9860b763SAndroid Build Coastguard Worker         result += &format!(
1027*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
1028*9860b763SAndroid Build Coastguard Worker             Tag::MacLength as i32,
1029*9860b763SAndroid Build Coastguard Worker             u32::cddl_ref(),
1030*9860b763SAndroid Build Coastguard Worker             "Tag_MacLength",
1031*9860b763SAndroid Build Coastguard Worker         );
1032*9860b763SAndroid Build Coastguard Worker         result += &format!(
1033*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
1034*9860b763SAndroid Build Coastguard Worker             Tag::ResetSinceIdRotation as i32,
1035*9860b763SAndroid Build Coastguard Worker             "true",
1036*9860b763SAndroid Build Coastguard Worker             "Tag_ResetSinceIdRotation",
1037*9860b763SAndroid Build Coastguard Worker         );
1038*9860b763SAndroid Build Coastguard Worker         result += &format!(
1039*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
1040*9860b763SAndroid Build Coastguard Worker             Tag::CertificateSerial as i32,
1041*9860b763SAndroid Build Coastguard Worker             Vec::<u8>::cddl_ref(),
1042*9860b763SAndroid Build Coastguard Worker             "Tag_CertificateSerial",
1043*9860b763SAndroid Build Coastguard Worker         );
1044*9860b763SAndroid Build Coastguard Worker         result += &format!(
1045*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
1046*9860b763SAndroid Build Coastguard Worker             Tag::CertificateSubject as i32,
1047*9860b763SAndroid Build Coastguard Worker             Vec::<u8>::cddl_ref(),
1048*9860b763SAndroid Build Coastguard Worker             "Tag_CertificateSubject",
1049*9860b763SAndroid Build Coastguard Worker         );
1050*9860b763SAndroid Build Coastguard Worker         result += &format!(
1051*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
1052*9860b763SAndroid Build Coastguard Worker             Tag::CertificateNotBefore as i32,
1053*9860b763SAndroid Build Coastguard Worker             DateTime::cddl_ref(),
1054*9860b763SAndroid Build Coastguard Worker             "Tag_CertificateNotBefore",
1055*9860b763SAndroid Build Coastguard Worker         );
1056*9860b763SAndroid Build Coastguard Worker         result += &format!(
1057*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
1058*9860b763SAndroid Build Coastguard Worker             Tag::CertificateNotAfter as i32,
1059*9860b763SAndroid Build Coastguard Worker             DateTime::cddl_ref(),
1060*9860b763SAndroid Build Coastguard Worker             "Tag_CertificateNotAfter",
1061*9860b763SAndroid Build Coastguard Worker         );
1062*9860b763SAndroid Build Coastguard Worker         result += &format!(
1063*9860b763SAndroid Build Coastguard Worker             "    [{}, {}], ; {}\n",
1064*9860b763SAndroid Build Coastguard Worker             Tag::MaxBootLevel as i32,
1065*9860b763SAndroid Build Coastguard Worker             u32::cddl_ref(),
1066*9860b763SAndroid Build Coastguard Worker             "Tag_MaxBootLevel",
1067*9860b763SAndroid Build Coastguard Worker         );
1068*9860b763SAndroid Build Coastguard Worker         #[cfg(feature = "hal_v4")]
1069*9860b763SAndroid Build Coastguard Worker         {
1070*9860b763SAndroid Build Coastguard Worker             result += &format!(
1071*9860b763SAndroid Build Coastguard Worker                 "    [{}, {}], ; {}\n",
1072*9860b763SAndroid Build Coastguard Worker                 Tag::ModuleHash as i32,
1073*9860b763SAndroid Build Coastguard Worker                 Vec::<u8>::cddl_ref(),
1074*9860b763SAndroid Build Coastguard Worker                 "Tag_ModuleHash",
1075*9860b763SAndroid Build Coastguard Worker             );
1076*9860b763SAndroid Build Coastguard Worker         }
1077*9860b763SAndroid Build Coastguard Worker         result += ")";
1078*9860b763SAndroid Build Coastguard Worker         Some(result)
1079*9860b763SAndroid Build Coastguard Worker     }
1080*9860b763SAndroid Build Coastguard Worker }
1081*9860b763SAndroid Build Coastguard Worker 
1082*9860b763SAndroid Build Coastguard Worker /// Determine the tag type for a tag, based on the top 4 bits of the tag number.
tag_type(tag: Tag) -> TagType1083*9860b763SAndroid Build Coastguard Worker pub fn tag_type(tag: Tag) -> TagType {
1084*9860b763SAndroid Build Coastguard Worker     match ((tag as u32) & 0xf0000000u32) as i32 {
1085*9860b763SAndroid Build Coastguard Worker         x if x == TagType::Enum as i32 => TagType::Enum,
1086*9860b763SAndroid Build Coastguard Worker         x if x == TagType::EnumRep as i32 => TagType::EnumRep,
1087*9860b763SAndroid Build Coastguard Worker         x if x == TagType::Uint as i32 => TagType::Uint,
1088*9860b763SAndroid Build Coastguard Worker         x if x == TagType::UintRep as i32 => TagType::UintRep,
1089*9860b763SAndroid Build Coastguard Worker         x if x == TagType::Ulong as i32 => TagType::Ulong,
1090*9860b763SAndroid Build Coastguard Worker         x if x == TagType::Date as i32 => TagType::Date,
1091*9860b763SAndroid Build Coastguard Worker         x if x == TagType::Bool as i32 => TagType::Bool,
1092*9860b763SAndroid Build Coastguard Worker         x if x == TagType::Bignum as i32 => TagType::Bignum,
1093*9860b763SAndroid Build Coastguard Worker         x if x == TagType::Bytes as i32 => TagType::Bytes,
1094*9860b763SAndroid Build Coastguard Worker         x if x == TagType::UlongRep as i32 => TagType::UlongRep,
1095*9860b763SAndroid Build Coastguard Worker         _ => TagType::Invalid,
1096*9860b763SAndroid Build Coastguard Worker     }
1097*9860b763SAndroid Build Coastguard Worker }
1098*9860b763SAndroid Build Coastguard Worker 
1099*9860b763SAndroid Build Coastguard Worker /// Determine the raw tag value with tag type information stripped out.
raw_tag_value(tag: Tag) -> u321100*9860b763SAndroid Build Coastguard Worker pub fn raw_tag_value(tag: Tag) -> u32 {
1101*9860b763SAndroid Build Coastguard Worker     (tag as u32) & 0x0fffffffu32
1102*9860b763SAndroid Build Coastguard Worker }
1103*9860b763SAndroid Build Coastguard Worker 
1104*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, AsCborValue, N)]
1105*9860b763SAndroid Build Coastguard Worker #[repr(i32)]
1106*9860b763SAndroid Build Coastguard Worker pub enum KeyPurpose {
1107*9860b763SAndroid Build Coastguard Worker     Encrypt = 0,
1108*9860b763SAndroid Build Coastguard Worker     Decrypt = 1,
1109*9860b763SAndroid Build Coastguard Worker     Sign = 2,
1110*9860b763SAndroid Build Coastguard Worker     Verify = 3,
1111*9860b763SAndroid Build Coastguard Worker     WrapKey = 5,
1112*9860b763SAndroid Build Coastguard Worker     AgreeKey = 6,
1113*9860b763SAndroid Build Coastguard Worker     AttestKey = 7,
1114*9860b763SAndroid Build Coastguard Worker }
1115*9860b763SAndroid Build Coastguard Worker try_from_n!(KeyPurpose);
1116*9860b763SAndroid Build Coastguard Worker 
1117*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, AsCborValue, N)]
1118*9860b763SAndroid Build Coastguard Worker #[repr(i32)]
1119*9860b763SAndroid Build Coastguard Worker pub enum PaddingMode {
1120*9860b763SAndroid Build Coastguard Worker     None = 1,
1121*9860b763SAndroid Build Coastguard Worker     RsaOaep = 2,
1122*9860b763SAndroid Build Coastguard Worker     RsaPss = 3,
1123*9860b763SAndroid Build Coastguard Worker     RsaPkcs115Encrypt = 4,
1124*9860b763SAndroid Build Coastguard Worker     RsaPkcs115Sign = 5,
1125*9860b763SAndroid Build Coastguard Worker     Pkcs7 = 64,
1126*9860b763SAndroid Build Coastguard Worker }
1127*9860b763SAndroid Build Coastguard Worker try_from_n!(PaddingMode);
1128*9860b763SAndroid Build Coastguard Worker 
1129*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, AsCborValue, N)]
1130*9860b763SAndroid Build Coastguard Worker #[repr(i32)]
1131*9860b763SAndroid Build Coastguard Worker pub enum SecurityLevel {
1132*9860b763SAndroid Build Coastguard Worker     Software = 0,
1133*9860b763SAndroid Build Coastguard Worker     TrustedEnvironment = 1,
1134*9860b763SAndroid Build Coastguard Worker     Strongbox = 2,
1135*9860b763SAndroid Build Coastguard Worker     Keystore = 100,
1136*9860b763SAndroid Build Coastguard Worker }
1137*9860b763SAndroid Build Coastguard Worker try_from_n!(SecurityLevel);
1138*9860b763SAndroid Build Coastguard Worker 
1139*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, AsCborValue, FromRawTag, N)]
1140*9860b763SAndroid Build Coastguard Worker #[repr(i32)]
1141*9860b763SAndroid Build Coastguard Worker pub enum Tag {
1142*9860b763SAndroid Build Coastguard Worker     Invalid = 0,
1143*9860b763SAndroid Build Coastguard Worker     Purpose = 536870913,
1144*9860b763SAndroid Build Coastguard Worker     Algorithm = 268435458,
1145*9860b763SAndroid Build Coastguard Worker     KeySize = 805306371,
1146*9860b763SAndroid Build Coastguard Worker     BlockMode = 536870916,
1147*9860b763SAndroid Build Coastguard Worker     Digest = 536870917,
1148*9860b763SAndroid Build Coastguard Worker     Padding = 536870918,
1149*9860b763SAndroid Build Coastguard Worker     CallerNonce = 1879048199,
1150*9860b763SAndroid Build Coastguard Worker     MinMacLength = 805306376,
1151*9860b763SAndroid Build Coastguard Worker     EcCurve = 268435466,
1152*9860b763SAndroid Build Coastguard Worker     RsaPublicExponent = 1342177480,
1153*9860b763SAndroid Build Coastguard Worker     IncludeUniqueId = 1879048394,
1154*9860b763SAndroid Build Coastguard Worker     RsaOaepMgfDigest = 536871115,
1155*9860b763SAndroid Build Coastguard Worker     BootloaderOnly = 1879048494,
1156*9860b763SAndroid Build Coastguard Worker     RollbackResistance = 1879048495,
1157*9860b763SAndroid Build Coastguard Worker     HardwareType = 268435760,
1158*9860b763SAndroid Build Coastguard Worker     EarlyBootOnly = 1879048497,
1159*9860b763SAndroid Build Coastguard Worker     ActiveDatetime = 1610613136,
1160*9860b763SAndroid Build Coastguard Worker     OriginationExpireDatetime = 1610613137,
1161*9860b763SAndroid Build Coastguard Worker     UsageExpireDatetime = 1610613138,
1162*9860b763SAndroid Build Coastguard Worker     MinSecondsBetweenOps = 805306771,
1163*9860b763SAndroid Build Coastguard Worker     MaxUsesPerBoot = 805306772,
1164*9860b763SAndroid Build Coastguard Worker     UsageCountLimit = 805306773,
1165*9860b763SAndroid Build Coastguard Worker     UserId = 805306869,
1166*9860b763SAndroid Build Coastguard Worker     UserSecureId = -1610612234,
1167*9860b763SAndroid Build Coastguard Worker     NoAuthRequired = 1879048695,
1168*9860b763SAndroid Build Coastguard Worker     UserAuthType = 268435960,
1169*9860b763SAndroid Build Coastguard Worker     AuthTimeout = 805306873,
1170*9860b763SAndroid Build Coastguard Worker     AllowWhileOnBody = 1879048698,
1171*9860b763SAndroid Build Coastguard Worker     TrustedUserPresenceRequired = 1879048699,
1172*9860b763SAndroid Build Coastguard Worker     TrustedConfirmationRequired = 1879048700,
1173*9860b763SAndroid Build Coastguard Worker     UnlockedDeviceRequired = 1879048701,
1174*9860b763SAndroid Build Coastguard Worker     ApplicationId = -1879047591,
1175*9860b763SAndroid Build Coastguard Worker     ApplicationData = -1879047492,
1176*9860b763SAndroid Build Coastguard Worker     CreationDatetime = 1610613437,
1177*9860b763SAndroid Build Coastguard Worker     Origin = 268436158,
1178*9860b763SAndroid Build Coastguard Worker     RootOfTrust = -1879047488,
1179*9860b763SAndroid Build Coastguard Worker     OsVersion = 805307073,
1180*9860b763SAndroid Build Coastguard Worker     OsPatchlevel = 805307074,
1181*9860b763SAndroid Build Coastguard Worker     UniqueId = -1879047485,
1182*9860b763SAndroid Build Coastguard Worker     AttestationChallenge = -1879047484,
1183*9860b763SAndroid Build Coastguard Worker     AttestationApplicationId = -1879047483,
1184*9860b763SAndroid Build Coastguard Worker     AttestationIdBrand = -1879047482,
1185*9860b763SAndroid Build Coastguard Worker     AttestationIdDevice = -1879047481,
1186*9860b763SAndroid Build Coastguard Worker     AttestationIdProduct = -1879047480,
1187*9860b763SAndroid Build Coastguard Worker     AttestationIdSerial = -1879047479,
1188*9860b763SAndroid Build Coastguard Worker     AttestationIdImei = -1879047478,
1189*9860b763SAndroid Build Coastguard Worker     AttestationIdMeid = -1879047477,
1190*9860b763SAndroid Build Coastguard Worker     AttestationIdManufacturer = -1879047476,
1191*9860b763SAndroid Build Coastguard Worker     AttestationIdModel = -1879047475,
1192*9860b763SAndroid Build Coastguard Worker     VendorPatchlevel = 805307086,
1193*9860b763SAndroid Build Coastguard Worker     BootPatchlevel = 805307087,
1194*9860b763SAndroid Build Coastguard Worker     DeviceUniqueAttestation = 1879048912,
1195*9860b763SAndroid Build Coastguard Worker     IdentityCredentialKey = 1879048913,
1196*9860b763SAndroid Build Coastguard Worker     StorageKey = 1879048914,
1197*9860b763SAndroid Build Coastguard Worker     #[cfg(feature = "hal_v3")]
1198*9860b763SAndroid Build Coastguard Worker     AttestationIdSecondImei = -1879047469,
1199*9860b763SAndroid Build Coastguard Worker     AssociatedData = -1879047192,
1200*9860b763SAndroid Build Coastguard Worker     Nonce = -1879047191,
1201*9860b763SAndroid Build Coastguard Worker     MacLength = 805307371,
1202*9860b763SAndroid Build Coastguard Worker     ResetSinceIdRotation = 1879049196,
1203*9860b763SAndroid Build Coastguard Worker     ConfirmationToken = -1879047187,
1204*9860b763SAndroid Build Coastguard Worker     CertificateSerial = -2147482642,
1205*9860b763SAndroid Build Coastguard Worker     CertificateSubject = -1879047185,
1206*9860b763SAndroid Build Coastguard Worker     CertificateNotBefore = 1610613744,
1207*9860b763SAndroid Build Coastguard Worker     CertificateNotAfter = 1610613745,
1208*9860b763SAndroid Build Coastguard Worker     MaxBootLevel = 805307378,
1209*9860b763SAndroid Build Coastguard Worker     #[cfg(feature = "hal_v4")]
1210*9860b763SAndroid Build Coastguard Worker     ModuleHash = -1879047468,
1211*9860b763SAndroid Build Coastguard Worker }
1212*9860b763SAndroid Build Coastguard Worker try_from_n!(Tag);
1213*9860b763SAndroid Build Coastguard Worker 
1214*9860b763SAndroid Build Coastguard Worker #[derive(Clone, Copy, Debug, PartialEq, Eq, AsCborValue, N)]
1215*9860b763SAndroid Build Coastguard Worker #[repr(i32)]
1216*9860b763SAndroid Build Coastguard Worker pub enum TagType {
1217*9860b763SAndroid Build Coastguard Worker     Invalid = 0,
1218*9860b763SAndroid Build Coastguard Worker     Enum = 268435456,
1219*9860b763SAndroid Build Coastguard Worker     EnumRep = 536870912,
1220*9860b763SAndroid Build Coastguard Worker     Uint = 805306368,
1221*9860b763SAndroid Build Coastguard Worker     UintRep = 1073741824,
1222*9860b763SAndroid Build Coastguard Worker     Ulong = 1342177280,
1223*9860b763SAndroid Build Coastguard Worker     Date = 1610612736,
1224*9860b763SAndroid Build Coastguard Worker     Bool = 1879048192,
1225*9860b763SAndroid Build Coastguard Worker     Bignum = -2147483648,
1226*9860b763SAndroid Build Coastguard Worker     Bytes = -1879048192,
1227*9860b763SAndroid Build Coastguard Worker     UlongRep = -1610612736,
1228*9860b763SAndroid Build Coastguard Worker }
1229*9860b763SAndroid Build Coastguard Worker try_from_n!(TagType);
1230