xref: /aosp_15_r20/system/keymint/hal/src/hal.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 //! Code for dealing with HAL-defined types, especially conversions to/from internal types.
16*9860b763SAndroid Build Coastguard Worker //!
17*9860b763SAndroid Build Coastguard Worker //! The internal code for KeyMint uses its own type definitions, not the HAL-defined autogenerated
18*9860b763SAndroid Build Coastguard Worker //! types, for two reasons:
19*9860b763SAndroid Build Coastguard Worker //!
20*9860b763SAndroid Build Coastguard Worker //! - The auto-generated types impose a dependency on Binder which is not appropriate for
21*9860b763SAndroid Build Coastguard Worker //!   code being built for a secure environment.
22*9860b763SAndroid Build Coastguard Worker //! - The auto-generated types are not idiomatic Rust, and have reduced type safety.
23*9860b763SAndroid Build Coastguard Worker //!
24*9860b763SAndroid Build Coastguard Worker //! This module includes code to convert between HAL types (re-used under `kmr_hal::hal`) and
25*9860b763SAndroid Build Coastguard Worker //! internal types (under `kmr_wire`), via the [`Fromm`] / [`TryFromm`], [`Innto`] and
26*9860b763SAndroid Build Coastguard Worker //! [`TryInnto`] traits (which are deliberately misspelled to avoid a clash with standard
27*9860b763SAndroid Build Coastguard Worker //! traits -- see below).
28*9860b763SAndroid Build Coastguard Worker //!
29*9860b763SAndroid Build Coastguard Worker //! - Going from wire=>HAL is an infallible conversion, as the wire types are stricter.
30*9860b763SAndroid Build Coastguard Worker //! - Going from HAL=>wire is often a fallible conversion, as there may be "enum" values
31*9860b763SAndroid Build Coastguard Worker //!   that are not in range.
32*9860b763SAndroid Build Coastguard Worker //!
33*9860b763SAndroid Build Coastguard Worker //! This module (and `kmr_wire`) must be kept in sync with the Android KeyMint HAL definition.
34*9860b763SAndroid Build Coastguard Worker 
35*9860b763SAndroid Build Coastguard Worker #![allow(non_snake_case)]
36*9860b763SAndroid Build Coastguard Worker 
37*9860b763SAndroid Build Coastguard Worker use crate::binder;
38*9860b763SAndroid Build Coastguard Worker use keymint::{KeyParameterValue::KeyParameterValue, Tag::Tag, TagType::TagType};
39*9860b763SAndroid Build Coastguard Worker use kmr_wire as wire;
40*9860b763SAndroid Build Coastguard Worker use kmr_wire::{keymint::DateTime, keymint::KeyParam, KeySizeInBits, RsaExponent};
41*9860b763SAndroid Build Coastguard Worker use log::{error, warn};
42*9860b763SAndroid Build Coastguard Worker use std::convert::TryFrom;
43*9860b763SAndroid Build Coastguard Worker use std::ffi::CString;
44*9860b763SAndroid Build Coastguard Worker 
45*9860b763SAndroid Build Coastguard Worker pub use android_hardware_security_keymint::aidl::android::hardware::security::keymint;
46*9860b763SAndroid Build Coastguard Worker pub use android_hardware_security_rkp::aidl::android::hardware::security::keymint as rkp;
47*9860b763SAndroid Build Coastguard Worker pub use android_hardware_security_secureclock::aidl::android::hardware::security::secureclock;
48*9860b763SAndroid Build Coastguard Worker pub use android_hardware_security_sharedsecret::aidl::android::hardware::security::sharedsecret;
49*9860b763SAndroid Build Coastguard Worker 
50*9860b763SAndroid Build Coastguard Worker #[cfg(test)]
51*9860b763SAndroid Build Coastguard Worker mod tests;
52*9860b763SAndroid Build Coastguard Worker 
53*9860b763SAndroid Build Coastguard Worker /// Emit a failure for a failed type conversion.
54*9860b763SAndroid Build Coastguard Worker #[inline]
failed_conversion(err: wire::ValueNotRecognized) -> binder::Status55*9860b763SAndroid Build Coastguard Worker pub fn failed_conversion(err: wire::ValueNotRecognized) -> binder::Status {
56*9860b763SAndroid Build Coastguard Worker     // If conversion from a HAL type failed because an enum value was unrecognized, try to use a
57*9860b763SAndroid Build Coastguard Worker     // more specific error code.
58*9860b763SAndroid Build Coastguard Worker     let errcode = match err {
59*9860b763SAndroid Build Coastguard Worker         wire::ValueNotRecognized::KeyPurpose => keymint::ErrorCode::ErrorCode::UNSUPPORTED_PURPOSE,
60*9860b763SAndroid Build Coastguard Worker         wire::ValueNotRecognized::Algorithm => keymint::ErrorCode::ErrorCode::UNSUPPORTED_ALGORITHM,
61*9860b763SAndroid Build Coastguard Worker         wire::ValueNotRecognized::BlockMode => {
62*9860b763SAndroid Build Coastguard Worker             keymint::ErrorCode::ErrorCode::UNSUPPORTED_BLOCK_MODE
63*9860b763SAndroid Build Coastguard Worker         }
64*9860b763SAndroid Build Coastguard Worker         wire::ValueNotRecognized::PaddingMode => {
65*9860b763SAndroid Build Coastguard Worker             keymint::ErrorCode::ErrorCode::UNSUPPORTED_PADDING_MODE
66*9860b763SAndroid Build Coastguard Worker         }
67*9860b763SAndroid Build Coastguard Worker         wire::ValueNotRecognized::Digest => keymint::ErrorCode::ErrorCode::UNSUPPORTED_DIGEST,
68*9860b763SAndroid Build Coastguard Worker         wire::ValueNotRecognized::KeyFormat => {
69*9860b763SAndroid Build Coastguard Worker             keymint::ErrorCode::ErrorCode::UNSUPPORTED_KEY_FORMAT
70*9860b763SAndroid Build Coastguard Worker         }
71*9860b763SAndroid Build Coastguard Worker         wire::ValueNotRecognized::EcCurve => keymint::ErrorCode::ErrorCode::UNSUPPORTED_EC_CURVE,
72*9860b763SAndroid Build Coastguard Worker         _ => keymint::ErrorCode::ErrorCode::INVALID_ARGUMENT,
73*9860b763SAndroid Build Coastguard Worker     };
74*9860b763SAndroid Build Coastguard Worker     binder::Status::new_service_specific_error(
75*9860b763SAndroid Build Coastguard Worker         errcode.0,
76*9860b763SAndroid Build Coastguard Worker         Some(&CString::new("conversion from HAL type to internal type failed").unwrap()),
77*9860b763SAndroid Build Coastguard Worker     )
78*9860b763SAndroid Build Coastguard Worker }
79*9860b763SAndroid Build Coastguard Worker 
80*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) -> TagType81*9860b763SAndroid Build Coastguard Worker pub fn tag_type(tag: Tag) -> TagType {
82*9860b763SAndroid Build Coastguard Worker     match ((tag.0 as u32) & 0xf0000000u32) as i32 {
83*9860b763SAndroid Build Coastguard Worker         x if x == TagType::ENUM.0 => TagType::ENUM,
84*9860b763SAndroid Build Coastguard Worker         x if x == TagType::ENUM_REP.0 => TagType::ENUM_REP,
85*9860b763SAndroid Build Coastguard Worker         x if x == TagType::UINT.0 => TagType::UINT,
86*9860b763SAndroid Build Coastguard Worker         x if x == TagType::UINT_REP.0 => TagType::UINT_REP,
87*9860b763SAndroid Build Coastguard Worker         x if x == TagType::ULONG.0 => TagType::ULONG,
88*9860b763SAndroid Build Coastguard Worker         x if x == TagType::DATE.0 => TagType::DATE,
89*9860b763SAndroid Build Coastguard Worker         x if x == TagType::BOOL.0 => TagType::BOOL,
90*9860b763SAndroid Build Coastguard Worker         x if x == TagType::BIGNUM.0 => TagType::BIGNUM,
91*9860b763SAndroid Build Coastguard Worker         x if x == TagType::BYTES.0 => TagType::BYTES,
92*9860b763SAndroid Build Coastguard Worker         x if x == TagType::ULONG_REP.0 => TagType::ULONG_REP,
93*9860b763SAndroid Build Coastguard Worker         _ => TagType::INVALID,
94*9860b763SAndroid Build Coastguard Worker     }
95*9860b763SAndroid Build Coastguard Worker }
96*9860b763SAndroid Build Coastguard Worker 
97*9860b763SAndroid Build Coastguard Worker // Neither the `kmr_wire` types nor the `hal` types are local to this crate, which means that Rust's
98*9860b763SAndroid Build Coastguard Worker // orphan rule means we cannot implement the standard conversion traits.  So instead define our own
99*9860b763SAndroid Build Coastguard Worker // equivalent conversion traits that are local, and for which we're allowed to provide
100*9860b763SAndroid Build Coastguard Worker // implementations.  Give them an odd name to avoid confusion with the standard traits.
101*9860b763SAndroid Build Coastguard Worker 
102*9860b763SAndroid Build Coastguard Worker /// Local equivalent of `From` trait, with a different name to avoid clashes.
103*9860b763SAndroid Build Coastguard Worker pub trait Fromm<T>: Sized {
104*9860b763SAndroid Build Coastguard Worker     /// Convert `val` into type `Self`.
fromm(val: T) -> Self105*9860b763SAndroid Build Coastguard Worker     fn fromm(val: T) -> Self;
106*9860b763SAndroid Build Coastguard Worker }
107*9860b763SAndroid Build Coastguard Worker /// Local equivalent of `TryFrom` trait, with a different name to avoid clashes.
108*9860b763SAndroid Build Coastguard Worker pub trait TryFromm<T>: Sized {
109*9860b763SAndroid Build Coastguard Worker     /// Error type emitted on conversion failure.
110*9860b763SAndroid Build Coastguard Worker     type Error;
111*9860b763SAndroid Build Coastguard Worker     /// Try to convert `val` into type `Self`.
try_fromm(val: T) -> Result<Self, Self::Error>112*9860b763SAndroid Build Coastguard Worker     fn try_fromm(val: T) -> Result<Self, Self::Error>;
113*9860b763SAndroid Build Coastguard Worker }
114*9860b763SAndroid Build Coastguard Worker /// Local equivalent of `Into` trait, with a different name to avoid clashes.
115*9860b763SAndroid Build Coastguard Worker pub trait Innto<T> {
116*9860b763SAndroid Build Coastguard Worker     /// Convert `self` into type `T`.
innto(self) -> T117*9860b763SAndroid Build Coastguard Worker     fn innto(self) -> T;
118*9860b763SAndroid Build Coastguard Worker }
119*9860b763SAndroid Build Coastguard Worker /// Local equivalent of `TryInto` trait, with a different name to avoid clashes.
120*9860b763SAndroid Build Coastguard Worker pub trait TryInnto<T> {
121*9860b763SAndroid Build Coastguard Worker     /// Error type emitted on conversion failure.
122*9860b763SAndroid Build Coastguard Worker     type Error;
123*9860b763SAndroid Build Coastguard Worker     /// Try to convert `self` into type `T`.
try_innto(self) -> Result<T, Self::Error>124*9860b763SAndroid Build Coastguard Worker     fn try_innto(self) -> Result<T, Self::Error>;
125*9860b763SAndroid Build Coastguard Worker }
126*9860b763SAndroid Build Coastguard Worker /// Blanket implementation of `Innto` from `Fromm`
127*9860b763SAndroid Build Coastguard Worker impl<T, U> Innto<U> for T
128*9860b763SAndroid Build Coastguard Worker where
129*9860b763SAndroid Build Coastguard Worker     U: Fromm<T>,
130*9860b763SAndroid Build Coastguard Worker {
innto(self) -> U131*9860b763SAndroid Build Coastguard Worker     fn innto(self) -> U {
132*9860b763SAndroid Build Coastguard Worker         U::fromm(self)
133*9860b763SAndroid Build Coastguard Worker     }
134*9860b763SAndroid Build Coastguard Worker }
135*9860b763SAndroid Build Coastguard Worker /// Blanket implementation of `TryInnto` from `TryFromm`
136*9860b763SAndroid Build Coastguard Worker impl<T, U> TryInnto<U> for T
137*9860b763SAndroid Build Coastguard Worker where
138*9860b763SAndroid Build Coastguard Worker     U: TryFromm<T>,
139*9860b763SAndroid Build Coastguard Worker {
140*9860b763SAndroid Build Coastguard Worker     type Error = U::Error;
try_innto(self) -> Result<U, Self::Error>141*9860b763SAndroid Build Coastguard Worker     fn try_innto(self) -> Result<U, Self::Error> {
142*9860b763SAndroid Build Coastguard Worker         U::try_fromm(self)
143*9860b763SAndroid Build Coastguard Worker     }
144*9860b763SAndroid Build Coastguard Worker }
145*9860b763SAndroid Build Coastguard Worker /// Blanket implementation of `Fromm<Vec<T>>` from `Fromm<T>`
146*9860b763SAndroid Build Coastguard Worker impl<T, U> Fromm<Vec<T>> for Vec<U>
147*9860b763SAndroid Build Coastguard Worker where
148*9860b763SAndroid Build Coastguard Worker     U: Fromm<T>,
149*9860b763SAndroid Build Coastguard Worker {
fromm(val: Vec<T>) -> Vec<U>150*9860b763SAndroid Build Coastguard Worker     fn fromm(val: Vec<T>) -> Vec<U> {
151*9860b763SAndroid Build Coastguard Worker         val.into_iter().map(|t| <U>::fromm(t)).collect()
152*9860b763SAndroid Build Coastguard Worker     }
153*9860b763SAndroid Build Coastguard Worker }
154*9860b763SAndroid Build Coastguard Worker 
155*9860b763SAndroid Build Coastguard Worker // Conversions from `kmr_wire` types into the equivalent types in the auto-generated HAL code. These
156*9860b763SAndroid Build Coastguard Worker // conversions are infallible, because the range of the `wire` types is strictly contained within
157*9860b763SAndroid Build Coastguard Worker // the HAL types.
158*9860b763SAndroid Build Coastguard Worker 
159*9860b763SAndroid Build Coastguard Worker impl Fromm<wire::sharedsecret::SharedSecretParameters>
160*9860b763SAndroid Build Coastguard Worker     for sharedsecret::SharedSecretParameters::SharedSecretParameters
161*9860b763SAndroid Build Coastguard Worker {
fromm(val: wire::sharedsecret::SharedSecretParameters) -> Self162*9860b763SAndroid Build Coastguard Worker     fn fromm(val: wire::sharedsecret::SharedSecretParameters) -> Self {
163*9860b763SAndroid Build Coastguard Worker         Self { seed: val.seed, nonce: val.nonce }
164*9860b763SAndroid Build Coastguard Worker     }
165*9860b763SAndroid Build Coastguard Worker }
166*9860b763SAndroid Build Coastguard Worker impl Fromm<wire::secureclock::Timestamp> for secureclock::Timestamp::Timestamp {
fromm(val: wire::secureclock::Timestamp) -> Self167*9860b763SAndroid Build Coastguard Worker     fn fromm(val: wire::secureclock::Timestamp) -> Self {
168*9860b763SAndroid Build Coastguard Worker         Self { milliSeconds: val.milliseconds }
169*9860b763SAndroid Build Coastguard Worker     }
170*9860b763SAndroid Build Coastguard Worker }
171*9860b763SAndroid Build Coastguard Worker impl Fromm<wire::secureclock::TimeStampToken> for secureclock::TimeStampToken::TimeStampToken {
fromm(val: wire::secureclock::TimeStampToken) -> Self172*9860b763SAndroid Build Coastguard Worker     fn fromm(val: wire::secureclock::TimeStampToken) -> Self {
173*9860b763SAndroid Build Coastguard Worker         Self { challenge: val.challenge, timestamp: val.timestamp.innto(), mac: val.mac }
174*9860b763SAndroid Build Coastguard Worker     }
175*9860b763SAndroid Build Coastguard Worker }
176*9860b763SAndroid Build Coastguard Worker impl Fromm<wire::keymint::Certificate> for keymint::Certificate::Certificate {
fromm(val: wire::keymint::Certificate) -> Self177*9860b763SAndroid Build Coastguard Worker     fn fromm(val: wire::keymint::Certificate) -> Self {
178*9860b763SAndroid Build Coastguard Worker         Self { encodedCertificate: val.encoded_certificate }
179*9860b763SAndroid Build Coastguard Worker     }
180*9860b763SAndroid Build Coastguard Worker }
181*9860b763SAndroid Build Coastguard Worker impl Fromm<wire::rpc::DeviceInfo> for rkp::DeviceInfo::DeviceInfo {
fromm(val: wire::rpc::DeviceInfo) -> Self182*9860b763SAndroid Build Coastguard Worker     fn fromm(val: wire::rpc::DeviceInfo) -> Self {
183*9860b763SAndroid Build Coastguard Worker         Self { deviceInfo: val.device_info }
184*9860b763SAndroid Build Coastguard Worker     }
185*9860b763SAndroid Build Coastguard Worker }
186*9860b763SAndroid Build Coastguard Worker impl Fromm<wire::keymint::HardwareAuthToken> for keymint::HardwareAuthToken::HardwareAuthToken {
fromm(val: wire::keymint::HardwareAuthToken) -> Self187*9860b763SAndroid Build Coastguard Worker     fn fromm(val: wire::keymint::HardwareAuthToken) -> Self {
188*9860b763SAndroid Build Coastguard Worker         Self {
189*9860b763SAndroid Build Coastguard Worker             challenge: val.challenge,
190*9860b763SAndroid Build Coastguard Worker             userId: val.user_id,
191*9860b763SAndroid Build Coastguard Worker             authenticatorId: val.authenticator_id,
192*9860b763SAndroid Build Coastguard Worker             authenticatorType: val.authenticator_type.innto(),
193*9860b763SAndroid Build Coastguard Worker             timestamp: val.timestamp.innto(),
194*9860b763SAndroid Build Coastguard Worker             mac: val.mac,
195*9860b763SAndroid Build Coastguard Worker         }
196*9860b763SAndroid Build Coastguard Worker     }
197*9860b763SAndroid Build Coastguard Worker }
198*9860b763SAndroid Build Coastguard Worker impl Fromm<wire::keymint::KeyCharacteristics> for keymint::KeyCharacteristics::KeyCharacteristics {
fromm(val: wire::keymint::KeyCharacteristics) -> Self199*9860b763SAndroid Build Coastguard Worker     fn fromm(val: wire::keymint::KeyCharacteristics) -> Self {
200*9860b763SAndroid Build Coastguard Worker         Self {
201*9860b763SAndroid Build Coastguard Worker             securityLevel: val.security_level.innto(),
202*9860b763SAndroid Build Coastguard Worker             authorizations: val.authorizations.innto(),
203*9860b763SAndroid Build Coastguard Worker         }
204*9860b763SAndroid Build Coastguard Worker     }
205*9860b763SAndroid Build Coastguard Worker }
206*9860b763SAndroid Build Coastguard Worker impl Fromm<wire::keymint::KeyCreationResult> for keymint::KeyCreationResult::KeyCreationResult {
fromm(val: wire::keymint::KeyCreationResult) -> Self207*9860b763SAndroid Build Coastguard Worker     fn fromm(val: wire::keymint::KeyCreationResult) -> Self {
208*9860b763SAndroid Build Coastguard Worker         Self {
209*9860b763SAndroid Build Coastguard Worker             keyBlob: val.key_blob,
210*9860b763SAndroid Build Coastguard Worker             keyCharacteristics: val.key_characteristics.innto(),
211*9860b763SAndroid Build Coastguard Worker             certificateChain: val.certificate_chain.innto(),
212*9860b763SAndroid Build Coastguard Worker         }
213*9860b763SAndroid Build Coastguard Worker     }
214*9860b763SAndroid Build Coastguard Worker }
215*9860b763SAndroid Build Coastguard Worker impl Fromm<wire::keymint::KeyMintHardwareInfo>
216*9860b763SAndroid Build Coastguard Worker     for keymint::KeyMintHardwareInfo::KeyMintHardwareInfo
217*9860b763SAndroid Build Coastguard Worker {
fromm(val: wire::keymint::KeyMintHardwareInfo) -> Self218*9860b763SAndroid Build Coastguard Worker     fn fromm(val: wire::keymint::KeyMintHardwareInfo) -> Self {
219*9860b763SAndroid Build Coastguard Worker         Self {
220*9860b763SAndroid Build Coastguard Worker             versionNumber: val.version_number,
221*9860b763SAndroid Build Coastguard Worker             securityLevel: val.security_level.innto(),
222*9860b763SAndroid Build Coastguard Worker             keyMintName: val.key_mint_name,
223*9860b763SAndroid Build Coastguard Worker             keyMintAuthorName: val.key_mint_author_name,
224*9860b763SAndroid Build Coastguard Worker             timestampTokenRequired: val.timestamp_token_required,
225*9860b763SAndroid Build Coastguard Worker         }
226*9860b763SAndroid Build Coastguard Worker     }
227*9860b763SAndroid Build Coastguard Worker }
228*9860b763SAndroid Build Coastguard Worker impl Fromm<wire::rpc::MacedPublicKey> for rkp::MacedPublicKey::MacedPublicKey {
fromm(val: wire::rpc::MacedPublicKey) -> Self229*9860b763SAndroid Build Coastguard Worker     fn fromm(val: wire::rpc::MacedPublicKey) -> Self {
230*9860b763SAndroid Build Coastguard Worker         Self { macedKey: val.maced_key }
231*9860b763SAndroid Build Coastguard Worker     }
232*9860b763SAndroid Build Coastguard Worker }
233*9860b763SAndroid Build Coastguard Worker impl Fromm<wire::rpc::ProtectedData> for rkp::ProtectedData::ProtectedData {
fromm(val: wire::rpc::ProtectedData) -> Self234*9860b763SAndroid Build Coastguard Worker     fn fromm(val: wire::rpc::ProtectedData) -> Self {
235*9860b763SAndroid Build Coastguard Worker         Self { protectedData: val.protected_data }
236*9860b763SAndroid Build Coastguard Worker     }
237*9860b763SAndroid Build Coastguard Worker }
238*9860b763SAndroid Build Coastguard Worker impl Fromm<wire::rpc::HardwareInfo> for rkp::RpcHardwareInfo::RpcHardwareInfo {
fromm(val: wire::rpc::HardwareInfo) -> Self239*9860b763SAndroid Build Coastguard Worker     fn fromm(val: wire::rpc::HardwareInfo) -> Self {
240*9860b763SAndroid Build Coastguard Worker         Self {
241*9860b763SAndroid Build Coastguard Worker             versionNumber: val.version_number,
242*9860b763SAndroid Build Coastguard Worker             rpcAuthorName: val.rpc_author_name,
243*9860b763SAndroid Build Coastguard Worker             supportedEekCurve: val.supported_eek_curve as i32,
244*9860b763SAndroid Build Coastguard Worker             uniqueId: val.unique_id,
245*9860b763SAndroid Build Coastguard Worker             supportedNumKeysInCsr: val.supported_num_keys_in_csr,
246*9860b763SAndroid Build Coastguard Worker         }
247*9860b763SAndroid Build Coastguard Worker     }
248*9860b763SAndroid Build Coastguard Worker }
249*9860b763SAndroid Build Coastguard Worker 
250*9860b763SAndroid Build Coastguard Worker impl Fromm<wire::keymint::KeyParam> for keymint::KeyParameter::KeyParameter {
fromm(val: wire::keymint::KeyParam) -> Self251*9860b763SAndroid Build Coastguard Worker     fn fromm(val: wire::keymint::KeyParam) -> Self {
252*9860b763SAndroid Build Coastguard Worker         let (tag, value) = match val {
253*9860b763SAndroid Build Coastguard Worker             // Enum-holding variants.
254*9860b763SAndroid Build Coastguard Worker             KeyParam::Purpose(v) => (Tag::PURPOSE, KeyParameterValue::KeyPurpose(v.innto())),
255*9860b763SAndroid Build Coastguard Worker             KeyParam::Algorithm(v) => (Tag::ALGORITHM, KeyParameterValue::Algorithm(v.innto())),
256*9860b763SAndroid Build Coastguard Worker             KeyParam::BlockMode(v) => (Tag::BLOCK_MODE, KeyParameterValue::BlockMode(v.innto())),
257*9860b763SAndroid Build Coastguard Worker             KeyParam::Digest(v) => (Tag::DIGEST, KeyParameterValue::Digest(v.innto())),
258*9860b763SAndroid Build Coastguard Worker             KeyParam::Padding(v) => (Tag::PADDING, KeyParameterValue::PaddingMode(v.innto())),
259*9860b763SAndroid Build Coastguard Worker             KeyParam::EcCurve(v) => (Tag::EC_CURVE, KeyParameterValue::EcCurve(v.innto())),
260*9860b763SAndroid Build Coastguard Worker             KeyParam::RsaOaepMgfDigest(v) => {
261*9860b763SAndroid Build Coastguard Worker                 (Tag::RSA_OAEP_MGF_DIGEST, KeyParameterValue::Digest(v.innto()))
262*9860b763SAndroid Build Coastguard Worker             }
263*9860b763SAndroid Build Coastguard Worker             KeyParam::Origin(v) => (Tag::ORIGIN, KeyParameterValue::Origin(v.innto())),
264*9860b763SAndroid Build Coastguard Worker 
265*9860b763SAndroid Build Coastguard Worker             // `u32`-holding variants.
266*9860b763SAndroid Build Coastguard Worker             KeyParam::KeySize(v) => (Tag::KEY_SIZE, KeyParameterValue::Integer(v.0 as i32)),
267*9860b763SAndroid Build Coastguard Worker             KeyParam::MinMacLength(v) => {
268*9860b763SAndroid Build Coastguard Worker                 (Tag::MIN_MAC_LENGTH, KeyParameterValue::Integer(v as i32))
269*9860b763SAndroid Build Coastguard Worker             }
270*9860b763SAndroid Build Coastguard Worker             KeyParam::MaxUsesPerBoot(v) => {
271*9860b763SAndroid Build Coastguard Worker                 (Tag::MAX_USES_PER_BOOT, KeyParameterValue::Integer(v as i32))
272*9860b763SAndroid Build Coastguard Worker             }
273*9860b763SAndroid Build Coastguard Worker             KeyParam::UsageCountLimit(v) => {
274*9860b763SAndroid Build Coastguard Worker                 (Tag::USAGE_COUNT_LIMIT, KeyParameterValue::Integer(v as i32))
275*9860b763SAndroid Build Coastguard Worker             }
276*9860b763SAndroid Build Coastguard Worker             KeyParam::UserId(v) => (Tag::USER_ID, KeyParameterValue::Integer(v as i32)),
277*9860b763SAndroid Build Coastguard Worker             KeyParam::UserAuthType(v) => {
278*9860b763SAndroid Build Coastguard Worker                 // Special case: auth type is a bitmask, so the Rust types use `u32` but the HAL
279*9860b763SAndroid Build Coastguard Worker                 // type has an "enum".
280*9860b763SAndroid Build Coastguard Worker                 (
281*9860b763SAndroid Build Coastguard Worker                     Tag::USER_AUTH_TYPE,
282*9860b763SAndroid Build Coastguard Worker                     KeyParameterValue::HardwareAuthenticatorType(
283*9860b763SAndroid Build Coastguard Worker                         keymint::HardwareAuthenticatorType::HardwareAuthenticatorType(v as i32),
284*9860b763SAndroid Build Coastguard Worker                     ),
285*9860b763SAndroid Build Coastguard Worker                 )
286*9860b763SAndroid Build Coastguard Worker             }
287*9860b763SAndroid Build Coastguard Worker             KeyParam::AuthTimeout(v) => (Tag::AUTH_TIMEOUT, KeyParameterValue::Integer(v as i32)),
288*9860b763SAndroid Build Coastguard Worker             KeyParam::OsVersion(v) => (Tag::OS_VERSION, KeyParameterValue::Integer(v as i32)),
289*9860b763SAndroid Build Coastguard Worker             KeyParam::OsPatchlevel(v) => (Tag::OS_PATCHLEVEL, KeyParameterValue::Integer(v as i32)),
290*9860b763SAndroid Build Coastguard Worker             KeyParam::VendorPatchlevel(v) => {
291*9860b763SAndroid Build Coastguard Worker                 (Tag::VENDOR_PATCHLEVEL, KeyParameterValue::Integer(v as i32))
292*9860b763SAndroid Build Coastguard Worker             }
293*9860b763SAndroid Build Coastguard Worker             KeyParam::BootPatchlevel(v) => {
294*9860b763SAndroid Build Coastguard Worker                 (Tag::BOOT_PATCHLEVEL, KeyParameterValue::Integer(v as i32))
295*9860b763SAndroid Build Coastguard Worker             }
296*9860b763SAndroid Build Coastguard Worker             KeyParam::MacLength(v) => (Tag::MAC_LENGTH, KeyParameterValue::Integer(v as i32)),
297*9860b763SAndroid Build Coastguard Worker             KeyParam::MaxBootLevel(v) => {
298*9860b763SAndroid Build Coastguard Worker                 (Tag::MAX_BOOT_LEVEL, KeyParameterValue::Integer(v as i32))
299*9860b763SAndroid Build Coastguard Worker             }
300*9860b763SAndroid Build Coastguard Worker 
301*9860b763SAndroid Build Coastguard Worker             // `u64`-holding variants.
302*9860b763SAndroid Build Coastguard Worker             KeyParam::RsaPublicExponent(v) => {
303*9860b763SAndroid Build Coastguard Worker                 (Tag::RSA_PUBLIC_EXPONENT, KeyParameterValue::LongInteger(v.0 as i64))
304*9860b763SAndroid Build Coastguard Worker             }
305*9860b763SAndroid Build Coastguard Worker             KeyParam::UserSecureId(v) => {
306*9860b763SAndroid Build Coastguard Worker                 (Tag::USER_SECURE_ID, KeyParameterValue::LongInteger(v as i64))
307*9860b763SAndroid Build Coastguard Worker             }
308*9860b763SAndroid Build Coastguard Worker 
309*9860b763SAndroid Build Coastguard Worker             // `true`-holding variants.
310*9860b763SAndroid Build Coastguard Worker             KeyParam::CallerNonce => (Tag::CALLER_NONCE, KeyParameterValue::BoolValue(true)),
311*9860b763SAndroid Build Coastguard Worker             KeyParam::IncludeUniqueId => {
312*9860b763SAndroid Build Coastguard Worker                 (Tag::INCLUDE_UNIQUE_ID, KeyParameterValue::BoolValue(true))
313*9860b763SAndroid Build Coastguard Worker             }
314*9860b763SAndroid Build Coastguard Worker             KeyParam::BootloaderOnly => (Tag::BOOTLOADER_ONLY, KeyParameterValue::BoolValue(true)),
315*9860b763SAndroid Build Coastguard Worker             KeyParam::RollbackResistance => {
316*9860b763SAndroid Build Coastguard Worker                 (Tag::ROLLBACK_RESISTANCE, KeyParameterValue::BoolValue(true))
317*9860b763SAndroid Build Coastguard Worker             }
318*9860b763SAndroid Build Coastguard Worker             KeyParam::EarlyBootOnly => (Tag::EARLY_BOOT_ONLY, KeyParameterValue::BoolValue(true)),
319*9860b763SAndroid Build Coastguard Worker             KeyParam::AllowWhileOnBody => {
320*9860b763SAndroid Build Coastguard Worker                 (Tag::ALLOW_WHILE_ON_BODY, KeyParameterValue::BoolValue(true))
321*9860b763SAndroid Build Coastguard Worker             }
322*9860b763SAndroid Build Coastguard Worker             KeyParam::NoAuthRequired => (Tag::NO_AUTH_REQUIRED, KeyParameterValue::BoolValue(true)),
323*9860b763SAndroid Build Coastguard Worker             KeyParam::TrustedUserPresenceRequired => {
324*9860b763SAndroid Build Coastguard Worker                 (Tag::TRUSTED_USER_PRESENCE_REQUIRED, KeyParameterValue::BoolValue(true))
325*9860b763SAndroid Build Coastguard Worker             }
326*9860b763SAndroid Build Coastguard Worker             KeyParam::TrustedConfirmationRequired => {
327*9860b763SAndroid Build Coastguard Worker                 (Tag::TRUSTED_CONFIRMATION_REQUIRED, KeyParameterValue::BoolValue(true))
328*9860b763SAndroid Build Coastguard Worker             }
329*9860b763SAndroid Build Coastguard Worker             KeyParam::UnlockedDeviceRequired => {
330*9860b763SAndroid Build Coastguard Worker                 (Tag::UNLOCKED_DEVICE_REQUIRED, KeyParameterValue::BoolValue(true))
331*9860b763SAndroid Build Coastguard Worker             }
332*9860b763SAndroid Build Coastguard Worker             KeyParam::DeviceUniqueAttestation => {
333*9860b763SAndroid Build Coastguard Worker                 (Tag::DEVICE_UNIQUE_ATTESTATION, KeyParameterValue::BoolValue(true))
334*9860b763SAndroid Build Coastguard Worker             }
335*9860b763SAndroid Build Coastguard Worker             KeyParam::StorageKey => (Tag::STORAGE_KEY, KeyParameterValue::BoolValue(true)),
336*9860b763SAndroid Build Coastguard Worker             KeyParam::ResetSinceIdRotation => {
337*9860b763SAndroid Build Coastguard Worker                 (Tag::RESET_SINCE_ID_ROTATION, KeyParameterValue::BoolValue(true))
338*9860b763SAndroid Build Coastguard Worker             }
339*9860b763SAndroid Build Coastguard Worker 
340*9860b763SAndroid Build Coastguard Worker             // `DateTime`-holding variants.
341*9860b763SAndroid Build Coastguard Worker             KeyParam::ActiveDatetime(v) => {
342*9860b763SAndroid Build Coastguard Worker                 (Tag::ACTIVE_DATETIME, KeyParameterValue::DateTime(v.ms_since_epoch))
343*9860b763SAndroid Build Coastguard Worker             }
344*9860b763SAndroid Build Coastguard Worker             KeyParam::OriginationExpireDatetime(v) => {
345*9860b763SAndroid Build Coastguard Worker                 (Tag::ORIGINATION_EXPIRE_DATETIME, KeyParameterValue::DateTime(v.ms_since_epoch))
346*9860b763SAndroid Build Coastguard Worker             }
347*9860b763SAndroid Build Coastguard Worker             KeyParam::UsageExpireDatetime(v) => {
348*9860b763SAndroid Build Coastguard Worker                 (Tag::USAGE_EXPIRE_DATETIME, KeyParameterValue::DateTime(v.ms_since_epoch))
349*9860b763SAndroid Build Coastguard Worker             }
350*9860b763SAndroid Build Coastguard Worker             KeyParam::CreationDatetime(v) => {
351*9860b763SAndroid Build Coastguard Worker                 (Tag::CREATION_DATETIME, KeyParameterValue::DateTime(v.ms_since_epoch))
352*9860b763SAndroid Build Coastguard Worker             }
353*9860b763SAndroid Build Coastguard Worker             KeyParam::CertificateNotBefore(v) => {
354*9860b763SAndroid Build Coastguard Worker                 (Tag::CERTIFICATE_NOT_BEFORE, KeyParameterValue::DateTime(v.ms_since_epoch))
355*9860b763SAndroid Build Coastguard Worker             }
356*9860b763SAndroid Build Coastguard Worker             KeyParam::CertificateNotAfter(v) => {
357*9860b763SAndroid Build Coastguard Worker                 (Tag::CERTIFICATE_NOT_AFTER, KeyParameterValue::DateTime(v.ms_since_epoch))
358*9860b763SAndroid Build Coastguard Worker             }
359*9860b763SAndroid Build Coastguard Worker 
360*9860b763SAndroid Build Coastguard Worker             // `Vec<u8>`-holding variants.
361*9860b763SAndroid Build Coastguard Worker             KeyParam::ApplicationId(v) => (Tag::APPLICATION_ID, KeyParameterValue::Blob(v)),
362*9860b763SAndroid Build Coastguard Worker             KeyParam::ApplicationData(v) => (Tag::APPLICATION_DATA, KeyParameterValue::Blob(v)),
363*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationChallenge(v) => {
364*9860b763SAndroid Build Coastguard Worker                 (Tag::ATTESTATION_CHALLENGE, KeyParameterValue::Blob(v))
365*9860b763SAndroid Build Coastguard Worker             }
366*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationApplicationId(v) => {
367*9860b763SAndroid Build Coastguard Worker                 (Tag::ATTESTATION_APPLICATION_ID, KeyParameterValue::Blob(v))
368*9860b763SAndroid Build Coastguard Worker             }
369*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdBrand(v) => {
370*9860b763SAndroid Build Coastguard Worker                 (Tag::ATTESTATION_ID_BRAND, KeyParameterValue::Blob(v))
371*9860b763SAndroid Build Coastguard Worker             }
372*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdDevice(v) => {
373*9860b763SAndroid Build Coastguard Worker                 (Tag::ATTESTATION_ID_DEVICE, KeyParameterValue::Blob(v))
374*9860b763SAndroid Build Coastguard Worker             }
375*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdProduct(v) => {
376*9860b763SAndroid Build Coastguard Worker                 (Tag::ATTESTATION_ID_PRODUCT, KeyParameterValue::Blob(v))
377*9860b763SAndroid Build Coastguard Worker             }
378*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdSerial(v) => {
379*9860b763SAndroid Build Coastguard Worker                 (Tag::ATTESTATION_ID_SERIAL, KeyParameterValue::Blob(v))
380*9860b763SAndroid Build Coastguard Worker             }
381*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdImei(v) => {
382*9860b763SAndroid Build Coastguard Worker                 (Tag::ATTESTATION_ID_IMEI, KeyParameterValue::Blob(v))
383*9860b763SAndroid Build Coastguard Worker             }
384*9860b763SAndroid Build Coastguard Worker             #[cfg(feature = "hal_v3")]
385*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdSecondImei(v) => {
386*9860b763SAndroid Build Coastguard Worker                 (Tag::ATTESTATION_ID_SECOND_IMEI, KeyParameterValue::Blob(v))
387*9860b763SAndroid Build Coastguard Worker             }
388*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdMeid(v) => {
389*9860b763SAndroid Build Coastguard Worker                 (Tag::ATTESTATION_ID_MEID, KeyParameterValue::Blob(v))
390*9860b763SAndroid Build Coastguard Worker             }
391*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdManufacturer(v) => {
392*9860b763SAndroid Build Coastguard Worker                 (Tag::ATTESTATION_ID_MANUFACTURER, KeyParameterValue::Blob(v))
393*9860b763SAndroid Build Coastguard Worker             }
394*9860b763SAndroid Build Coastguard Worker             KeyParam::AttestationIdModel(v) => {
395*9860b763SAndroid Build Coastguard Worker                 (Tag::ATTESTATION_ID_MODEL, KeyParameterValue::Blob(v))
396*9860b763SAndroid Build Coastguard Worker             }
397*9860b763SAndroid Build Coastguard Worker             KeyParam::Nonce(v) => (Tag::NONCE, KeyParameterValue::Blob(v)),
398*9860b763SAndroid Build Coastguard Worker             KeyParam::RootOfTrust(v) => (Tag::ROOT_OF_TRUST, KeyParameterValue::Blob(v)),
399*9860b763SAndroid Build Coastguard Worker             KeyParam::CertificateSerial(v) => (Tag::CERTIFICATE_SERIAL, KeyParameterValue::Blob(v)),
400*9860b763SAndroid Build Coastguard Worker             KeyParam::CertificateSubject(v) => {
401*9860b763SAndroid Build Coastguard Worker                 (Tag::CERTIFICATE_SUBJECT, KeyParameterValue::Blob(v))
402*9860b763SAndroid Build Coastguard Worker             }
403*9860b763SAndroid Build Coastguard Worker             #[cfg(feature = "hal_v4")]
404*9860b763SAndroid Build Coastguard Worker             KeyParam::ModuleHash(v) => (Tag::MODULE_HASH, KeyParameterValue::Blob(v)),
405*9860b763SAndroid Build Coastguard Worker         };
406*9860b763SAndroid Build Coastguard Worker         Self { tag, value }
407*9860b763SAndroid Build Coastguard Worker     }
408*9860b763SAndroid Build Coastguard Worker }
409*9860b763SAndroid Build Coastguard Worker 
410*9860b763SAndroid Build Coastguard Worker // Conversions from auto-generated HAL types into the equivalent types from `kmr_wire`.  These
411*9860b763SAndroid Build Coastguard Worker // conversions are generally fallible, because the "enum" types generated for the HAL are actually
412*9860b763SAndroid Build Coastguard Worker // `i32` values, which may contain invalid values.
413*9860b763SAndroid Build Coastguard Worker 
414*9860b763SAndroid Build Coastguard Worker impl Fromm<secureclock::TimeStampToken::TimeStampToken> for wire::secureclock::TimeStampToken {
fromm(val: secureclock::TimeStampToken::TimeStampToken) -> Self415*9860b763SAndroid Build Coastguard Worker     fn fromm(val: secureclock::TimeStampToken::TimeStampToken) -> Self {
416*9860b763SAndroid Build Coastguard Worker         Self { challenge: val.challenge, timestamp: val.timestamp.innto(), mac: val.mac }
417*9860b763SAndroid Build Coastguard Worker     }
418*9860b763SAndroid Build Coastguard Worker }
419*9860b763SAndroid Build Coastguard Worker impl Fromm<secureclock::Timestamp::Timestamp> for wire::secureclock::Timestamp {
fromm(val: secureclock::Timestamp::Timestamp) -> Self420*9860b763SAndroid Build Coastguard Worker     fn fromm(val: secureclock::Timestamp::Timestamp) -> Self {
421*9860b763SAndroid Build Coastguard Worker         Self { milliseconds: val.milliSeconds }
422*9860b763SAndroid Build Coastguard Worker     }
423*9860b763SAndroid Build Coastguard Worker }
424*9860b763SAndroid Build Coastguard Worker impl Fromm<sharedsecret::SharedSecretParameters::SharedSecretParameters>
425*9860b763SAndroid Build Coastguard Worker     for wire::sharedsecret::SharedSecretParameters
426*9860b763SAndroid Build Coastguard Worker {
fromm(val: sharedsecret::SharedSecretParameters::SharedSecretParameters) -> Self427*9860b763SAndroid Build Coastguard Worker     fn fromm(val: sharedsecret::SharedSecretParameters::SharedSecretParameters) -> Self {
428*9860b763SAndroid Build Coastguard Worker         Self { seed: val.seed, nonce: val.nonce }
429*9860b763SAndroid Build Coastguard Worker     }
430*9860b763SAndroid Build Coastguard Worker }
431*9860b763SAndroid Build Coastguard Worker impl TryFromm<keymint::AttestationKey::AttestationKey> for wire::keymint::AttestationKey {
432*9860b763SAndroid Build Coastguard Worker     type Error = wire::ValueNotRecognized;
try_fromm(val: keymint::AttestationKey::AttestationKey) -> Result<Self, Self::Error>433*9860b763SAndroid Build Coastguard Worker     fn try_fromm(val: keymint::AttestationKey::AttestationKey) -> Result<Self, Self::Error> {
434*9860b763SAndroid Build Coastguard Worker         Ok(Self {
435*9860b763SAndroid Build Coastguard Worker             key_blob: val.keyBlob,
436*9860b763SAndroid Build Coastguard Worker             attest_key_params: val
437*9860b763SAndroid Build Coastguard Worker                 .attestKeyParams // Vec<KeyParameter>
438*9860b763SAndroid Build Coastguard Worker                 .into_iter() // Iter<KeyParameter>
439*9860b763SAndroid Build Coastguard Worker                 .filter_map(|p| (&p).try_innto().transpose())
440*9860b763SAndroid Build Coastguard Worker                 .collect::<Result<Vec<KeyParam>, _>>()?,
441*9860b763SAndroid Build Coastguard Worker             issuer_subject_name: val.issuerSubjectName,
442*9860b763SAndroid Build Coastguard Worker         })
443*9860b763SAndroid Build Coastguard Worker     }
444*9860b763SAndroid Build Coastguard Worker }
445*9860b763SAndroid Build Coastguard Worker impl TryFromm<keymint::HardwareAuthToken::HardwareAuthToken> for wire::keymint::HardwareAuthToken {
446*9860b763SAndroid Build Coastguard Worker     type Error = wire::ValueNotRecognized;
try_fromm(val: keymint::HardwareAuthToken::HardwareAuthToken) -> Result<Self, Self::Error>447*9860b763SAndroid Build Coastguard Worker     fn try_fromm(val: keymint::HardwareAuthToken::HardwareAuthToken) -> Result<Self, Self::Error> {
448*9860b763SAndroid Build Coastguard Worker         Ok(Self {
449*9860b763SAndroid Build Coastguard Worker             challenge: val.challenge,
450*9860b763SAndroid Build Coastguard Worker             user_id: val.userId,
451*9860b763SAndroid Build Coastguard Worker             authenticator_id: val.authenticatorId,
452*9860b763SAndroid Build Coastguard Worker             authenticator_type: val.authenticatorType.try_innto()?,
453*9860b763SAndroid Build Coastguard Worker             timestamp: val.timestamp.innto(),
454*9860b763SAndroid Build Coastguard Worker             mac: val.mac,
455*9860b763SAndroid Build Coastguard Worker         })
456*9860b763SAndroid Build Coastguard Worker     }
457*9860b763SAndroid Build Coastguard Worker }
458*9860b763SAndroid Build Coastguard Worker impl Fromm<rkp::MacedPublicKey::MacedPublicKey> for wire::rpc::MacedPublicKey {
fromm(val: rkp::MacedPublicKey::MacedPublicKey) -> Self459*9860b763SAndroid Build Coastguard Worker     fn fromm(val: rkp::MacedPublicKey::MacedPublicKey) -> Self {
460*9860b763SAndroid Build Coastguard Worker         Self { maced_key: val.macedKey }
461*9860b763SAndroid Build Coastguard Worker     }
462*9860b763SAndroid Build Coastguard Worker }
463*9860b763SAndroid Build Coastguard Worker impl Fromm<&rkp::MacedPublicKey::MacedPublicKey> for wire::rpc::MacedPublicKey {
fromm(val: &rkp::MacedPublicKey::MacedPublicKey) -> Self464*9860b763SAndroid Build Coastguard Worker     fn fromm(val: &rkp::MacedPublicKey::MacedPublicKey) -> Self {
465*9860b763SAndroid Build Coastguard Worker         Self { maced_key: val.macedKey.to_vec() }
466*9860b763SAndroid Build Coastguard Worker     }
467*9860b763SAndroid Build Coastguard Worker }
468*9860b763SAndroid Build Coastguard Worker 
469*9860b763SAndroid Build Coastguard Worker macro_rules! value_of {
470*9860b763SAndroid Build Coastguard Worker     {
471*9860b763SAndroid Build Coastguard Worker         $val:expr, $variant:ident
472*9860b763SAndroid Build Coastguard Worker     } => {
473*9860b763SAndroid Build Coastguard Worker         if let keymint::KeyParameterValue::KeyParameterValue::$variant(v) = $val.value {
474*9860b763SAndroid Build Coastguard Worker             Ok(v)
475*9860b763SAndroid Build Coastguard Worker         } else {
476*9860b763SAndroid Build Coastguard Worker             error!("failed to convert parameter '{}' with value {:?}", stringify!($val), $val);
477*9860b763SAndroid Build Coastguard Worker             Err(wire::ValueNotRecognized::$variant)
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 macro_rules! check_bool {
483*9860b763SAndroid Build Coastguard Worker     {
484*9860b763SAndroid Build Coastguard Worker         $val:expr
485*9860b763SAndroid Build Coastguard Worker     } => {
486*9860b763SAndroid Build Coastguard Worker         if let keymint::KeyParameterValue::KeyParameterValue::BoolValue(true) = $val.value {
487*9860b763SAndroid Build Coastguard Worker             Ok(())
488*9860b763SAndroid Build Coastguard Worker         } else {
489*9860b763SAndroid Build Coastguard Worker             Err(wire::ValueNotRecognized::Bool)
490*9860b763SAndroid Build Coastguard Worker         }
491*9860b763SAndroid Build Coastguard Worker     }
492*9860b763SAndroid Build Coastguard Worker }
493*9860b763SAndroid Build Coastguard Worker 
494*9860b763SAndroid Build Coastguard Worker macro_rules! clone_blob {
495*9860b763SAndroid Build Coastguard Worker     {
496*9860b763SAndroid Build Coastguard Worker         $val:expr
497*9860b763SAndroid Build Coastguard Worker     } => {
498*9860b763SAndroid Build Coastguard Worker         if let keymint::KeyParameterValue::KeyParameterValue::Blob(b) = &$val.value {
499*9860b763SAndroid Build Coastguard Worker             Ok(b.clone())
500*9860b763SAndroid Build Coastguard Worker         } else {
501*9860b763SAndroid Build Coastguard Worker             Err(wire::ValueNotRecognized::Blob)
502*9860b763SAndroid Build Coastguard Worker         }
503*9860b763SAndroid Build Coastguard Worker     }
504*9860b763SAndroid Build Coastguard Worker }
505*9860b763SAndroid Build Coastguard Worker 
506*9860b763SAndroid Build Coastguard Worker /// Converting a HAL `KeyParameter` to a wire `KeyParam` may fail (producing an `Err`) but may also
507*9860b763SAndroid Build Coastguard Worker /// silently drop unknown tags (producing `Ok(None)`)
508*9860b763SAndroid Build Coastguard Worker impl TryFromm<&keymint::KeyParameter::KeyParameter> for Option<KeyParam> {
509*9860b763SAndroid Build Coastguard Worker     type Error = wire::ValueNotRecognized;
try_fromm(val: &keymint::KeyParameter::KeyParameter) -> Result<Self, Self::Error>510*9860b763SAndroid Build Coastguard Worker     fn try_fromm(val: &keymint::KeyParameter::KeyParameter) -> Result<Self, Self::Error> {
511*9860b763SAndroid Build Coastguard Worker         Ok(match val.tag {
512*9860b763SAndroid Build Coastguard Worker             // Enum-holding variants.
513*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::PURPOSE => {
514*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::Purpose(value_of!(val, KeyPurpose)?.try_innto()?))
515*9860b763SAndroid Build Coastguard Worker             }
516*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::ALGORITHM => {
517*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::Algorithm(value_of!(val, Algorithm)?.try_innto()?))
518*9860b763SAndroid Build Coastguard Worker             }
519*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::BLOCK_MODE => {
520*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::BlockMode(value_of!(val, BlockMode)?.try_innto()?))
521*9860b763SAndroid Build Coastguard Worker             }
522*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::DIGEST => {
523*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::Digest(value_of!(val, Digest)?.try_innto()?))
524*9860b763SAndroid Build Coastguard Worker             }
525*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::PADDING => {
526*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::Padding(value_of!(val, PaddingMode)?.try_innto()?))
527*9860b763SAndroid Build Coastguard Worker             }
528*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::EC_CURVE => {
529*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::EcCurve(value_of!(val, EcCurve)?.try_innto()?))
530*9860b763SAndroid Build Coastguard Worker             }
531*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::RSA_OAEP_MGF_DIGEST => {
532*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::RsaOaepMgfDigest(value_of!(val, Digest)?.try_innto()?))
533*9860b763SAndroid Build Coastguard Worker             }
534*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::ORIGIN => {
535*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::Origin(value_of!(val, Origin)?.try_innto()?))
536*9860b763SAndroid Build Coastguard Worker             }
537*9860b763SAndroid Build Coastguard Worker 
538*9860b763SAndroid Build Coastguard Worker             // Special case: although `Tag::USER_AUTH_TYPE` claims to have an associated enum, it's
539*9860b763SAndroid Build Coastguard Worker             // actually a bitmask rather than an enum.
540*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::USER_AUTH_TYPE => {
541*9860b763SAndroid Build Coastguard Worker                 let val = value_of!(val, HardwareAuthenticatorType)?;
542*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::UserAuthType(val.0 as u32))
543*9860b763SAndroid Build Coastguard Worker             }
544*9860b763SAndroid Build Coastguard Worker 
545*9860b763SAndroid Build Coastguard Worker             // `u32`-holding variants.
546*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::KEY_SIZE => {
547*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::KeySize(KeySizeInBits(value_of!(val, Integer)? as u32)))
548*9860b763SAndroid Build Coastguard Worker             }
549*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::MIN_MAC_LENGTH => {
550*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::MinMacLength(value_of!(val, Integer)? as u32))
551*9860b763SAndroid Build Coastguard Worker             }
552*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::MAX_USES_PER_BOOT => {
553*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::MaxUsesPerBoot(value_of!(val, Integer)? as u32))
554*9860b763SAndroid Build Coastguard Worker             }
555*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::USAGE_COUNT_LIMIT => {
556*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::UsageCountLimit(value_of!(val, Integer)? as u32))
557*9860b763SAndroid Build Coastguard Worker             }
558*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::USER_ID => Some(KeyParam::UserId(value_of!(val, Integer)? as u32)),
559*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::AUTH_TIMEOUT => {
560*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::AuthTimeout(value_of!(val, Integer)? as u32))
561*9860b763SAndroid Build Coastguard Worker             }
562*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::OS_VERSION => {
563*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::OsVersion(value_of!(val, Integer)? as u32))
564*9860b763SAndroid Build Coastguard Worker             }
565*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::OS_PATCHLEVEL => {
566*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::OsPatchlevel(value_of!(val, Integer)? as u32))
567*9860b763SAndroid Build Coastguard Worker             }
568*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::VENDOR_PATCHLEVEL => {
569*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::VendorPatchlevel(value_of!(val, Integer)? as u32))
570*9860b763SAndroid Build Coastguard Worker             }
571*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::BOOT_PATCHLEVEL => {
572*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::BootPatchlevel(value_of!(val, Integer)? as u32))
573*9860b763SAndroid Build Coastguard Worker             }
574*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::MAC_LENGTH => {
575*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::MacLength(value_of!(val, Integer)? as u32))
576*9860b763SAndroid Build Coastguard Worker             }
577*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::MAX_BOOT_LEVEL => {
578*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::MaxBootLevel(value_of!(val, Integer)? as u32))
579*9860b763SAndroid Build Coastguard Worker             }
580*9860b763SAndroid Build Coastguard Worker 
581*9860b763SAndroid Build Coastguard Worker             // `u64`-holding variants.
582*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::RSA_PUBLIC_EXPONENT => {
583*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::RsaPublicExponent(RsaExponent(value_of!(val, LongInteger)? as u64)))
584*9860b763SAndroid Build Coastguard Worker             }
585*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::USER_SECURE_ID => {
586*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::UserSecureId(value_of!(val, LongInteger)? as u64))
587*9860b763SAndroid Build Coastguard Worker             }
588*9860b763SAndroid Build Coastguard Worker 
589*9860b763SAndroid Build Coastguard Worker             // `bool`-holding variants; only `true` is allowed.
590*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::CALLER_NONCE => {
591*9860b763SAndroid Build Coastguard Worker                 check_bool!(val)?;
592*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::CallerNonce)
593*9860b763SAndroid Build Coastguard Worker             }
594*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::INCLUDE_UNIQUE_ID => {
595*9860b763SAndroid Build Coastguard Worker                 check_bool!(val)?;
596*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::IncludeUniqueId)
597*9860b763SAndroid Build Coastguard Worker             }
598*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::BOOTLOADER_ONLY => {
599*9860b763SAndroid Build Coastguard Worker                 check_bool!(val)?;
600*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::BootloaderOnly)
601*9860b763SAndroid Build Coastguard Worker             }
602*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::ROLLBACK_RESISTANCE => {
603*9860b763SAndroid Build Coastguard Worker                 check_bool!(val)?;
604*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::RollbackResistance)
605*9860b763SAndroid Build Coastguard Worker             }
606*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::EARLY_BOOT_ONLY => {
607*9860b763SAndroid Build Coastguard Worker                 check_bool!(val)?;
608*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::EarlyBootOnly)
609*9860b763SAndroid Build Coastguard Worker             }
610*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::NO_AUTH_REQUIRED => {
611*9860b763SAndroid Build Coastguard Worker                 check_bool!(val)?;
612*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::NoAuthRequired)
613*9860b763SAndroid Build Coastguard Worker             }
614*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::ALLOW_WHILE_ON_BODY => {
615*9860b763SAndroid Build Coastguard Worker                 check_bool!(val)?;
616*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::AllowWhileOnBody)
617*9860b763SAndroid Build Coastguard Worker             }
618*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::TRUSTED_USER_PRESENCE_REQUIRED => {
619*9860b763SAndroid Build Coastguard Worker                 check_bool!(val)?;
620*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::TrustedUserPresenceRequired)
621*9860b763SAndroid Build Coastguard Worker             }
622*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::TRUSTED_CONFIRMATION_REQUIRED => {
623*9860b763SAndroid Build Coastguard Worker                 check_bool!(val)?;
624*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::TrustedConfirmationRequired)
625*9860b763SAndroid Build Coastguard Worker             }
626*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::UNLOCKED_DEVICE_REQUIRED => {
627*9860b763SAndroid Build Coastguard Worker                 check_bool!(val)?;
628*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::UnlockedDeviceRequired)
629*9860b763SAndroid Build Coastguard Worker             }
630*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::DEVICE_UNIQUE_ATTESTATION => {
631*9860b763SAndroid Build Coastguard Worker                 check_bool!(val)?;
632*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::DeviceUniqueAttestation)
633*9860b763SAndroid Build Coastguard Worker             }
634*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::STORAGE_KEY => {
635*9860b763SAndroid Build Coastguard Worker                 check_bool!(val)?;
636*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::StorageKey)
637*9860b763SAndroid Build Coastguard Worker             }
638*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::RESET_SINCE_ID_ROTATION => {
639*9860b763SAndroid Build Coastguard Worker                 check_bool!(val)?;
640*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::ResetSinceIdRotation)
641*9860b763SAndroid Build Coastguard Worker             }
642*9860b763SAndroid Build Coastguard Worker 
643*9860b763SAndroid Build Coastguard Worker             // `DateTime`-holding variants.
644*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::ACTIVE_DATETIME => Some(KeyParam::ActiveDatetime(DateTime {
645*9860b763SAndroid Build Coastguard Worker                 ms_since_epoch: value_of!(val, DateTime)?,
646*9860b763SAndroid Build Coastguard Worker             })),
647*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::ORIGINATION_EXPIRE_DATETIME => {
648*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::OriginationExpireDatetime(DateTime {
649*9860b763SAndroid Build Coastguard Worker                     ms_since_epoch: value_of!(val, DateTime)?,
650*9860b763SAndroid Build Coastguard Worker                 }))
651*9860b763SAndroid Build Coastguard Worker             }
652*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::USAGE_EXPIRE_DATETIME => {
653*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::UsageExpireDatetime(DateTime {
654*9860b763SAndroid Build Coastguard Worker                     ms_since_epoch: value_of!(val, DateTime)?,
655*9860b763SAndroid Build Coastguard Worker                 }))
656*9860b763SAndroid Build Coastguard Worker             }
657*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::CREATION_DATETIME => Some(KeyParam::CreationDatetime(DateTime {
658*9860b763SAndroid Build Coastguard Worker                 ms_since_epoch: value_of!(val, DateTime)?,
659*9860b763SAndroid Build Coastguard Worker             })),
660*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::CERTIFICATE_NOT_BEFORE => {
661*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::CertificateNotBefore(DateTime {
662*9860b763SAndroid Build Coastguard Worker                     ms_since_epoch: value_of!(val, DateTime)?,
663*9860b763SAndroid Build Coastguard Worker                 }))
664*9860b763SAndroid Build Coastguard Worker             }
665*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::CERTIFICATE_NOT_AFTER => {
666*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::CertificateNotAfter(DateTime {
667*9860b763SAndroid Build Coastguard Worker                     ms_since_epoch: value_of!(val, DateTime)?,
668*9860b763SAndroid Build Coastguard Worker                 }))
669*9860b763SAndroid Build Coastguard Worker             }
670*9860b763SAndroid Build Coastguard Worker 
671*9860b763SAndroid Build Coastguard Worker             // `Vec<u8>`-holding variants.
672*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::APPLICATION_ID => Some(KeyParam::ApplicationId(clone_blob!(val)?)),
673*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::APPLICATION_DATA => {
674*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::ApplicationData(clone_blob!(val)?))
675*9860b763SAndroid Build Coastguard Worker             }
676*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::ROOT_OF_TRUST => Some(KeyParam::RootOfTrust(clone_blob!(val)?)),
677*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::ATTESTATION_CHALLENGE => {
678*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::AttestationChallenge(clone_blob!(val)?))
679*9860b763SAndroid Build Coastguard Worker             }
680*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::ATTESTATION_APPLICATION_ID => {
681*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::AttestationApplicationId(clone_blob!(val)?))
682*9860b763SAndroid Build Coastguard Worker             }
683*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::ATTESTATION_ID_BRAND => {
684*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::AttestationIdBrand(clone_blob!(val)?))
685*9860b763SAndroid Build Coastguard Worker             }
686*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::ATTESTATION_ID_DEVICE => {
687*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::AttestationIdDevice(clone_blob!(val)?))
688*9860b763SAndroid Build Coastguard Worker             }
689*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::ATTESTATION_ID_PRODUCT => {
690*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::AttestationIdProduct(clone_blob!(val)?))
691*9860b763SAndroid Build Coastguard Worker             }
692*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::ATTESTATION_ID_SERIAL => {
693*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::AttestationIdSerial(clone_blob!(val)?))
694*9860b763SAndroid Build Coastguard Worker             }
695*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::ATTESTATION_ID_IMEI => {
696*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::AttestationIdImei(clone_blob!(val)?))
697*9860b763SAndroid Build Coastguard Worker             }
698*9860b763SAndroid Build Coastguard Worker             #[cfg(feature = "hal_v3")]
699*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::ATTESTATION_ID_SECOND_IMEI => {
700*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::AttestationIdSecondImei(clone_blob!(val)?))
701*9860b763SAndroid Build Coastguard Worker             }
702*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::ATTESTATION_ID_MEID => {
703*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::AttestationIdMeid(clone_blob!(val)?))
704*9860b763SAndroid Build Coastguard Worker             }
705*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::ATTESTATION_ID_MANUFACTURER => {
706*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::AttestationIdManufacturer(clone_blob!(val)?))
707*9860b763SAndroid Build Coastguard Worker             }
708*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::ATTESTATION_ID_MODEL => {
709*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::AttestationIdModel(clone_blob!(val)?))
710*9860b763SAndroid Build Coastguard Worker             }
711*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::NONCE => Some(KeyParam::Nonce(clone_blob!(val)?)),
712*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::CERTIFICATE_SERIAL => {
713*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::CertificateSerial(clone_blob!(val)?))
714*9860b763SAndroid Build Coastguard Worker             }
715*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::CERTIFICATE_SUBJECT => {
716*9860b763SAndroid Build Coastguard Worker                 Some(KeyParam::CertificateSubject(clone_blob!(val)?))
717*9860b763SAndroid Build Coastguard Worker             }
718*9860b763SAndroid Build Coastguard Worker             #[cfg(feature = "hal_v4")]
719*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::MODULE_HASH => Some(KeyParam::ModuleHash(clone_blob!(val)?)),
720*9860b763SAndroid Build Coastguard Worker 
721*9860b763SAndroid Build Coastguard Worker             // Unsupported variants
722*9860b763SAndroid Build Coastguard Worker             keymint::Tag::Tag::UNIQUE_ID
723*9860b763SAndroid Build Coastguard Worker             | keymint::Tag::Tag::HARDWARE_TYPE
724*9860b763SAndroid Build Coastguard Worker             | keymint::Tag::Tag::MIN_SECONDS_BETWEEN_OPS
725*9860b763SAndroid Build Coastguard Worker             | keymint::Tag::Tag::IDENTITY_CREDENTIAL_KEY
726*9860b763SAndroid Build Coastguard Worker             | keymint::Tag::Tag::ASSOCIATED_DATA
727*9860b763SAndroid Build Coastguard Worker             | keymint::Tag::Tag::CONFIRMATION_TOKEN => {
728*9860b763SAndroid Build Coastguard Worker                 error!("Unsupported tag {:?} encountered", val.tag);
729*9860b763SAndroid Build Coastguard Worker                 return Err(wire::ValueNotRecognized::Tag);
730*9860b763SAndroid Build Coastguard Worker             }
731*9860b763SAndroid Build Coastguard Worker             _ => {
732*9860b763SAndroid Build Coastguard Worker                 warn!("Unknown tag {:?} silently dropped", val.tag);
733*9860b763SAndroid Build Coastguard Worker                 None
734*9860b763SAndroid Build Coastguard Worker             }
735*9860b763SAndroid Build Coastguard Worker         })
736*9860b763SAndroid Build Coastguard Worker     }
737*9860b763SAndroid Build Coastguard Worker }
738*9860b763SAndroid Build Coastguard Worker 
739*9860b763SAndroid Build Coastguard Worker /// Macro that emits conversion implementations for `wire` and HAL enums.
740*9860b763SAndroid Build Coastguard Worker /// - The `hal::keymint` version of the enum is a newtype holding `i32`
741*9860b763SAndroid Build Coastguard Worker /// - The `wire::keymint` version of the enum is an exhaustive enum with `[repr(i32)]`
742*9860b763SAndroid Build Coastguard Worker macro_rules! enum_convert {
743*9860b763SAndroid Build Coastguard Worker     {
744*9860b763SAndroid Build Coastguard Worker         $wenum:ty => $henum:ty
745*9860b763SAndroid Build Coastguard Worker     } => {
746*9860b763SAndroid Build Coastguard Worker         impl Fromm<$wenum> for $henum {
747*9860b763SAndroid Build Coastguard Worker             fn fromm(val: $wenum) -> Self {
748*9860b763SAndroid Build Coastguard Worker                 Self(val as i32)
749*9860b763SAndroid Build Coastguard Worker             }
750*9860b763SAndroid Build Coastguard Worker         }
751*9860b763SAndroid Build Coastguard Worker         impl TryFromm<$henum> for $wenum {
752*9860b763SAndroid Build Coastguard Worker             type Error = wire::ValueNotRecognized;
753*9860b763SAndroid Build Coastguard Worker             fn try_fromm(val: $henum) -> Result<Self, Self::Error> {
754*9860b763SAndroid Build Coastguard Worker                 Self::try_from(val.0)
755*9860b763SAndroid Build Coastguard Worker             }
756*9860b763SAndroid Build Coastguard Worker         }
757*9860b763SAndroid Build Coastguard Worker     };
758*9860b763SAndroid Build Coastguard Worker }
759*9860b763SAndroid Build Coastguard Worker enum_convert! { wire::keymint::ErrorCode => keymint::ErrorCode::ErrorCode }
760*9860b763SAndroid Build Coastguard Worker enum_convert! { wire::keymint::Algorithm => keymint::Algorithm::Algorithm }
761*9860b763SAndroid Build Coastguard Worker enum_convert! { wire::keymint::BlockMode => keymint::BlockMode::BlockMode }
762*9860b763SAndroid Build Coastguard Worker enum_convert! { wire::keymint::Digest => keymint::Digest::Digest }
763*9860b763SAndroid Build Coastguard Worker enum_convert! { wire::keymint::EcCurve => keymint::EcCurve::EcCurve }
764*9860b763SAndroid Build Coastguard Worker enum_convert! { wire::keymint::HardwareAuthenticatorType =>
765*9860b763SAndroid Build Coastguard Worker keymint::HardwareAuthenticatorType::HardwareAuthenticatorType }
766*9860b763SAndroid Build Coastguard Worker enum_convert! { wire::keymint::KeyFormat => keymint::KeyFormat::KeyFormat }
767*9860b763SAndroid Build Coastguard Worker enum_convert! { wire::keymint::KeyOrigin => keymint::KeyOrigin::KeyOrigin }
768*9860b763SAndroid Build Coastguard Worker enum_convert! { wire::keymint::KeyPurpose => keymint::KeyPurpose::KeyPurpose }
769*9860b763SAndroid Build Coastguard Worker enum_convert! { wire::keymint::PaddingMode => keymint::PaddingMode::PaddingMode }
770*9860b763SAndroid Build Coastguard Worker enum_convert! { wire::keymint::SecurityLevel => keymint::SecurityLevel::SecurityLevel }
771*9860b763SAndroid Build Coastguard Worker enum_convert! { wire::keymint::Tag => keymint::Tag::Tag }
772*9860b763SAndroid Build Coastguard Worker enum_convert! { wire::keymint::TagType => keymint::TagType::TagType }
773