xref: /aosp_15_r20/system/authgraph/wire/src/lib.rs (revision 4185b0660fbe514985fdcf75410317caad8afad1)
1*4185b066SAndroid Build Coastguard Worker // Copyright 2023 Google LLC
2*4185b066SAndroid Build Coastguard Worker //
3*4185b066SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*4185b066SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*4185b066SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*4185b066SAndroid Build Coastguard Worker //
7*4185b066SAndroid Build Coastguard Worker //      http://www.apache.org/licenses/LICENSE-2.0
8*4185b066SAndroid Build Coastguard Worker //
9*4185b066SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*4185b066SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*4185b066SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*4185b066SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*4185b066SAndroid Build Coastguard Worker // limitations under the License.
14*4185b066SAndroid Build Coastguard Worker 
15*4185b066SAndroid Build Coastguard Worker //! Types and macros for communication between HAL and TA
16*4185b066SAndroid Build Coastguard Worker 
17*4185b066SAndroid Build Coastguard Worker // Allow missing docs in this crate as the types here are generally 1:1 with the HAL
18*4185b066SAndroid Build Coastguard Worker // interface definitions.
19*4185b066SAndroid Build Coastguard Worker #![allow(missing_docs)]
20*4185b066SAndroid Build Coastguard Worker #![no_std]
21*4185b066SAndroid Build Coastguard Worker extern crate alloc;
22*4185b066SAndroid Build Coastguard Worker 
23*4185b066SAndroid Build Coastguard Worker use crate::cbor::{cbor_type_error, AsCborValue, CborError};
24*4185b066SAndroid Build Coastguard Worker use alloc::{vec, vec::Vec};
25*4185b066SAndroid Build Coastguard Worker use authgraph_derive::AsCborValue;
26*4185b066SAndroid Build Coastguard Worker use ciborium::value::Value;
27*4185b066SAndroid Build Coastguard Worker use enumn::N;
28*4185b066SAndroid Build Coastguard Worker 
29*4185b066SAndroid Build Coastguard Worker pub mod cbor;
30*4185b066SAndroid Build Coastguard Worker pub mod fragmentation;
31*4185b066SAndroid Build Coastguard Worker 
32*4185b066SAndroid Build Coastguard Worker #[cfg(test)]
33*4185b066SAndroid Build Coastguard Worker mod tests;
34*4185b066SAndroid Build Coastguard Worker 
35*4185b066SAndroid Build Coastguard Worker /// Length of a session identifier in bytes
36*4185b066SAndroid Build Coastguard Worker pub const SESSION_ID_LEN: usize = 32;
37*4185b066SAndroid Build Coastguard Worker 
38*4185b066SAndroid Build Coastguard Worker // Request/Response pairs corresponding to each of the methods on the `IAuthGraphKeyExchange`
39*4185b066SAndroid Build Coastguard Worker // interface.  Structures that have a single field containing CBOR-encoded data are directly
40*4185b066SAndroid Build Coastguard Worker // expanded.
41*4185b066SAndroid Build Coastguard Worker 
42*4185b066SAndroid Build Coastguard Worker #[derive(Debug, Clone, PartialEq, Eq, AsCborValue)]
43*4185b066SAndroid Build Coastguard Worker pub struct CreateRequest {}
44*4185b066SAndroid Build Coastguard Worker #[derive(Debug, Clone, PartialEq, Eq, AsCborValue)]
45*4185b066SAndroid Build Coastguard Worker pub struct CreateResponse {
46*4185b066SAndroid Build Coastguard Worker     pub ret: SessionInitiationInfo,
47*4185b066SAndroid Build Coastguard Worker }
48*4185b066SAndroid Build Coastguard Worker #[derive(Debug, Clone, PartialEq, Eq, AsCborValue)]
49*4185b066SAndroid Build Coastguard Worker pub struct InitRequest {
50*4185b066SAndroid Build Coastguard Worker     // Note that the AIDL definition for this field has type `PubKey`, which allows either a
51*4185b066SAndroid Build Coastguard Worker     // `PlainPubKey` or a `SignedPubKey`, to allow for re-used in identity chains.  However, only
52*4185b066SAndroid Build Coastguard Worker     // the `PlainPubKey` variant appears here.
53*4185b066SAndroid Build Coastguard Worker     pub peer_pub_key: Vec<u8>, // PlainPubKey.cddl
54*4185b066SAndroid Build Coastguard Worker     pub peer_id: Vec<u8>,      // Identity.cddl
55*4185b066SAndroid Build Coastguard Worker     pub peer_nonce: Vec<u8>,
56*4185b066SAndroid Build Coastguard Worker     pub peer_version: i32,
57*4185b066SAndroid Build Coastguard Worker }
58*4185b066SAndroid Build Coastguard Worker #[derive(Debug, Clone, PartialEq, Eq, AsCborValue)]
59*4185b066SAndroid Build Coastguard Worker pub struct InitResponse {
60*4185b066SAndroid Build Coastguard Worker     pub ret: KeInitResult,
61*4185b066SAndroid Build Coastguard Worker }
62*4185b066SAndroid Build Coastguard Worker #[derive(Debug, Clone, PartialEq, Eq, AsCborValue)]
63*4185b066SAndroid Build Coastguard Worker pub struct FinishRequest {
64*4185b066SAndroid Build Coastguard Worker     // Note that the AIDL definition for this field has type `PubKey`, which allows either a
65*4185b066SAndroid Build Coastguard Worker     // `PlainPubKey` or a `SignedPubKey`, to allow for re-used in identity chains.  However, only
66*4185b066SAndroid Build Coastguard Worker     // the `PlainPubKey` variant appears here.
67*4185b066SAndroid Build Coastguard Worker     pub peer_pub_key: Vec<u8>,   // PlainPubKey.cddl
68*4185b066SAndroid Build Coastguard Worker     pub peer_id: Vec<u8>,        // Identity.cddl
69*4185b066SAndroid Build Coastguard Worker     pub peer_signature: Vec<u8>, // SessionIdSignature.cddl
70*4185b066SAndroid Build Coastguard Worker     pub peer_nonce: Vec<u8>,
71*4185b066SAndroid Build Coastguard Worker     pub peer_version: i32,
72*4185b066SAndroid Build Coastguard Worker     pub own_key: Key,
73*4185b066SAndroid Build Coastguard Worker }
74*4185b066SAndroid Build Coastguard Worker #[derive(Debug, Clone, PartialEq, Eq, AsCborValue)]
75*4185b066SAndroid Build Coastguard Worker pub struct FinishResponse {
76*4185b066SAndroid Build Coastguard Worker     pub ret: SessionInfo,
77*4185b066SAndroid Build Coastguard Worker }
78*4185b066SAndroid Build Coastguard Worker #[derive(Debug, Clone, PartialEq, Eq, AsCborValue)]
79*4185b066SAndroid Build Coastguard Worker pub struct AuthenticationCompleteRequest {
80*4185b066SAndroid Build Coastguard Worker     pub peer_signature: Vec<u8>,   // SessionIdSignature.cddl
81*4185b066SAndroid Build Coastguard Worker     pub shared_keys: [Vec<u8>; 2], // Arc.cddl
82*4185b066SAndroid Build Coastguard Worker }
83*4185b066SAndroid Build Coastguard Worker #[derive(Debug, Clone, PartialEq, Eq, AsCborValue)]
84*4185b066SAndroid Build Coastguard Worker pub struct AuthenticationCompleteResponse {
85*4185b066SAndroid Build Coastguard Worker     pub ret: [Vec<u8>; 2], // Arc.cddl
86*4185b066SAndroid Build Coastguard Worker }
87*4185b066SAndroid Build Coastguard Worker 
88*4185b066SAndroid Build Coastguard Worker // Rust `struct`s corresponding to AIDL messages on the `IAuthGraphKeyExchange` interface.
89*4185b066SAndroid Build Coastguard Worker // Structures that have a single field containing CBOR-encoded data are directly expanded.
90*4185b066SAndroid Build Coastguard Worker 
91*4185b066SAndroid Build Coastguard Worker #[derive(Debug, Clone, PartialEq, Eq, AsCborValue)]
92*4185b066SAndroid Build Coastguard Worker pub struct SessionInitiationInfo {
93*4185b066SAndroid Build Coastguard Worker     pub ke_key: Key,
94*4185b066SAndroid Build Coastguard Worker     pub identity: Vec<u8>, // Identity.cddl
95*4185b066SAndroid Build Coastguard Worker     pub nonce: Vec<u8>,
96*4185b066SAndroid Build Coastguard Worker     pub version: i32,
97*4185b066SAndroid Build Coastguard Worker }
98*4185b066SAndroid Build Coastguard Worker 
99*4185b066SAndroid Build Coastguard Worker #[derive(Debug, Clone, PartialEq, Eq, AsCborValue)]
100*4185b066SAndroid Build Coastguard Worker pub struct SessionInfo {
101*4185b066SAndroid Build Coastguard Worker     pub shared_keys: [Vec<u8>; 2], // Arc.cddl
102*4185b066SAndroid Build Coastguard Worker     pub session_id: Vec<u8>,
103*4185b066SAndroid Build Coastguard Worker     pub session_id_signature: Vec<u8>, // SessionIdSignature.cddl
104*4185b066SAndroid Build Coastguard Worker }
105*4185b066SAndroid Build Coastguard Worker 
106*4185b066SAndroid Build Coastguard Worker #[derive(Debug, Clone, PartialEq, Eq, AsCborValue)]
107*4185b066SAndroid Build Coastguard Worker pub struct KeInitResult {
108*4185b066SAndroid Build Coastguard Worker     pub session_init_info: SessionInitiationInfo,
109*4185b066SAndroid Build Coastguard Worker     pub session_info: SessionInfo,
110*4185b066SAndroid Build Coastguard Worker }
111*4185b066SAndroid Build Coastguard Worker 
112*4185b066SAndroid Build Coastguard Worker #[derive(Debug, Clone, PartialEq, Eq, AsCborValue)]
113*4185b066SAndroid Build Coastguard Worker pub struct Key {
114*4185b066SAndroid Build Coastguard Worker     // Note that the AIDL definition for this field has type `PubKey`, which allows either a
115*4185b066SAndroid Build Coastguard Worker     // `PlainPubKey` or a `SignedPubKey`, to allow for re-used in identity chains.  However, only
116*4185b066SAndroid Build Coastguard Worker     // the `PlainPubKey` variant appears here.
117*4185b066SAndroid Build Coastguard Worker     pub pub_key: Option<Vec<u8>>,      // PlainPubKey.cddl
118*4185b066SAndroid Build Coastguard Worker     pub arc_from_pbk: Option<Vec<u8>>, // Arc.cddl
119*4185b066SAndroid Build Coastguard Worker }
120*4185b066SAndroid Build Coastguard Worker 
121*4185b066SAndroid Build Coastguard Worker #[derive(Debug, Clone, Copy, PartialOrd, Ord, PartialEq, Eq, Hash, N)]
122*4185b066SAndroid Build Coastguard Worker pub enum AuthGraphOperationCode {
123*4185b066SAndroid Build Coastguard Worker     Create = 0x10,
124*4185b066SAndroid Build Coastguard Worker     Init = 0x11,
125*4185b066SAndroid Build Coastguard Worker     Finish = 0x12,
126*4185b066SAndroid Build Coastguard Worker     AuthenticationComplete = 0x13,
127*4185b066SAndroid Build Coastguard Worker }
128*4185b066SAndroid Build Coastguard Worker 
129*4185b066SAndroid Build Coastguard Worker #[derive(Debug, Clone, PartialEq, Eq)]
130*4185b066SAndroid Build Coastguard Worker pub enum PerformOpReq {
131*4185b066SAndroid Build Coastguard Worker     Create(CreateRequest),
132*4185b066SAndroid Build Coastguard Worker     Init(InitRequest),
133*4185b066SAndroid Build Coastguard Worker     Finish(FinishRequest),
134*4185b066SAndroid Build Coastguard Worker     AuthenticationComplete(AuthenticationCompleteRequest),
135*4185b066SAndroid Build Coastguard Worker }
136*4185b066SAndroid Build Coastguard Worker 
137*4185b066SAndroid Build Coastguard Worker impl Code for PerformOpReq {
code(&self) -> AuthGraphOperationCode138*4185b066SAndroid Build Coastguard Worker     fn code(&self) -> AuthGraphOperationCode {
139*4185b066SAndroid Build Coastguard Worker         match self {
140*4185b066SAndroid Build Coastguard Worker             Self::Create(_) => AuthGraphOperationCode::Create,
141*4185b066SAndroid Build Coastguard Worker             Self::Init(_) => AuthGraphOperationCode::Init,
142*4185b066SAndroid Build Coastguard Worker             Self::Finish(_) => AuthGraphOperationCode::Finish,
143*4185b066SAndroid Build Coastguard Worker             Self::AuthenticationComplete(_) => AuthGraphOperationCode::AuthenticationComplete,
144*4185b066SAndroid Build Coastguard Worker         }
145*4185b066SAndroid Build Coastguard Worker     }
146*4185b066SAndroid Build Coastguard Worker }
147*4185b066SAndroid Build Coastguard Worker 
148*4185b066SAndroid Build Coastguard Worker impl AsCborValue for PerformOpReq {
from_cbor_value(value: Value) -> Result<Self, CborError>149*4185b066SAndroid Build Coastguard Worker     fn from_cbor_value(value: Value) -> Result<Self, CborError> {
150*4185b066SAndroid Build Coastguard Worker         let mut a = match value {
151*4185b066SAndroid Build Coastguard Worker             Value::Array(a) if a.len() == 2 => a,
152*4185b066SAndroid Build Coastguard Worker             _ => return crate::cbor_type_error(&value, "arr len 2"),
153*4185b066SAndroid Build Coastguard Worker         };
154*4185b066SAndroid Build Coastguard Worker         let val = a.remove(1);
155*4185b066SAndroid Build Coastguard Worker         let code = i32::from_cbor_value(a.remove(0))?;
156*4185b066SAndroid Build Coastguard Worker         let code = AuthGraphOperationCode::n(code).ok_or(CborError::NonEnumValue)?;
157*4185b066SAndroid Build Coastguard Worker         Ok(match code {
158*4185b066SAndroid Build Coastguard Worker             AuthGraphOperationCode::Create => Self::Create(CreateRequest::from_cbor_value(val)?),
159*4185b066SAndroid Build Coastguard Worker             AuthGraphOperationCode::Init => Self::Init(InitRequest::from_cbor_value(val)?),
160*4185b066SAndroid Build Coastguard Worker             AuthGraphOperationCode::Finish => Self::Finish(FinishRequest::from_cbor_value(val)?),
161*4185b066SAndroid Build Coastguard Worker             AuthGraphOperationCode::AuthenticationComplete => {
162*4185b066SAndroid Build Coastguard Worker                 Self::AuthenticationComplete(AuthenticationCompleteRequest::from_cbor_value(val)?)
163*4185b066SAndroid Build Coastguard Worker             }
164*4185b066SAndroid Build Coastguard Worker         })
165*4185b066SAndroid Build Coastguard Worker     }
to_cbor_value(self) -> Result<Value, CborError>166*4185b066SAndroid Build Coastguard Worker     fn to_cbor_value(self) -> Result<Value, CborError> {
167*4185b066SAndroid Build Coastguard Worker         Ok(Value::Array(match self {
168*4185b066SAndroid Build Coastguard Worker             Self::Create(req) => vec![req.value(), req.to_cbor_value()?],
169*4185b066SAndroid Build Coastguard Worker             Self::Init(req) => vec![req.value(), req.to_cbor_value()?],
170*4185b066SAndroid Build Coastguard Worker             Self::Finish(req) => vec![req.value(), req.to_cbor_value()?],
171*4185b066SAndroid Build Coastguard Worker             Self::AuthenticationComplete(req) => vec![req.value(), req.to_cbor_value()?],
172*4185b066SAndroid Build Coastguard Worker         }))
173*4185b066SAndroid Build Coastguard Worker     }
174*4185b066SAndroid Build Coastguard Worker }
175*4185b066SAndroid Build Coastguard Worker 
176*4185b066SAndroid Build Coastguard Worker #[derive(Debug, Clone, PartialEq, Eq)]
177*4185b066SAndroid Build Coastguard Worker pub enum PerformOpRsp {
178*4185b066SAndroid Build Coastguard Worker     Create(CreateResponse),
179*4185b066SAndroid Build Coastguard Worker     Init(InitResponse),
180*4185b066SAndroid Build Coastguard Worker     Finish(FinishResponse),
181*4185b066SAndroid Build Coastguard Worker     AuthenticationComplete(AuthenticationCompleteResponse),
182*4185b066SAndroid Build Coastguard Worker }
183*4185b066SAndroid Build Coastguard Worker 
184*4185b066SAndroid Build Coastguard Worker impl Code for PerformOpRsp {
code(&self) -> AuthGraphOperationCode185*4185b066SAndroid Build Coastguard Worker     fn code(&self) -> AuthGraphOperationCode {
186*4185b066SAndroid Build Coastguard Worker         match self {
187*4185b066SAndroid Build Coastguard Worker             Self::Create(_) => AuthGraphOperationCode::Create,
188*4185b066SAndroid Build Coastguard Worker             Self::Init(_) => AuthGraphOperationCode::Init,
189*4185b066SAndroid Build Coastguard Worker             Self::Finish(_) => AuthGraphOperationCode::Finish,
190*4185b066SAndroid Build Coastguard Worker             Self::AuthenticationComplete(_) => AuthGraphOperationCode::AuthenticationComplete,
191*4185b066SAndroid Build Coastguard Worker         }
192*4185b066SAndroid Build Coastguard Worker     }
193*4185b066SAndroid Build Coastguard Worker }
194*4185b066SAndroid Build Coastguard Worker 
195*4185b066SAndroid Build Coastguard Worker impl AsCborValue for PerformOpRsp {
from_cbor_value(value: Value) -> Result<Self, CborError>196*4185b066SAndroid Build Coastguard Worker     fn from_cbor_value(value: Value) -> Result<Self, CborError> {
197*4185b066SAndroid Build Coastguard Worker         let mut a = match value {
198*4185b066SAndroid Build Coastguard Worker             Value::Array(a) if a.len() == 2 => a,
199*4185b066SAndroid Build Coastguard Worker             _ => return crate::cbor_type_error(&value, "arr len 2"),
200*4185b066SAndroid Build Coastguard Worker         };
201*4185b066SAndroid Build Coastguard Worker         let val = a.remove(1);
202*4185b066SAndroid Build Coastguard Worker         let code = i32::from_cbor_value(a.remove(0))?;
203*4185b066SAndroid Build Coastguard Worker         let code = AuthGraphOperationCode::n(code).ok_or(CborError::NonEnumValue)?;
204*4185b066SAndroid Build Coastguard Worker         Ok(match code {
205*4185b066SAndroid Build Coastguard Worker             AuthGraphOperationCode::Create => Self::Create(CreateResponse::from_cbor_value(val)?),
206*4185b066SAndroid Build Coastguard Worker             AuthGraphOperationCode::Init => Self::Init(InitResponse::from_cbor_value(val)?),
207*4185b066SAndroid Build Coastguard Worker             AuthGraphOperationCode::Finish => Self::Finish(FinishResponse::from_cbor_value(val)?),
208*4185b066SAndroid Build Coastguard Worker             AuthGraphOperationCode::AuthenticationComplete => {
209*4185b066SAndroid Build Coastguard Worker                 Self::AuthenticationComplete(AuthenticationCompleteResponse::from_cbor_value(val)?)
210*4185b066SAndroid Build Coastguard Worker             }
211*4185b066SAndroid Build Coastguard Worker         })
212*4185b066SAndroid Build Coastguard Worker     }
to_cbor_value(self) -> Result<Value, CborError>213*4185b066SAndroid Build Coastguard Worker     fn to_cbor_value(self) -> Result<Value, CborError> {
214*4185b066SAndroid Build Coastguard Worker         Ok(Value::Array(match self {
215*4185b066SAndroid Build Coastguard Worker             Self::Create(req) => vec![req.value(), req.to_cbor_value()?],
216*4185b066SAndroid Build Coastguard Worker             Self::Init(req) => vec![req.value(), req.to_cbor_value()?],
217*4185b066SAndroid Build Coastguard Worker             Self::Finish(req) => vec![req.value(), req.to_cbor_value()?],
218*4185b066SAndroid Build Coastguard Worker             Self::AuthenticationComplete(req) => vec![req.value(), req.to_cbor_value()?],
219*4185b066SAndroid Build Coastguard Worker         }))
220*4185b066SAndroid Build Coastguard Worker     }
221*4185b066SAndroid Build Coastguard Worker }
222*4185b066SAndroid Build Coastguard Worker 
223*4185b066SAndroid Build Coastguard Worker // Result of an operation, as an error code and a response message (only present when
224*4185b066SAndroid Build Coastguard Worker // `error_code` is zero).
225*4185b066SAndroid Build Coastguard Worker #[derive(Debug, Clone, PartialEq, Eq, AsCborValue)]
226*4185b066SAndroid Build Coastguard Worker pub struct PerformOpResponse {
227*4185b066SAndroid Build Coastguard Worker     pub error_code: ErrorCode,
228*4185b066SAndroid Build Coastguard Worker     pub rsp: Option<PerformOpRsp>,
229*4185b066SAndroid Build Coastguard Worker }
230*4185b066SAndroid Build Coastguard Worker 
231*4185b066SAndroid Build Coastguard Worker #[derive(Debug, Clone, Copy, PartialEq, Eq, AsCborValue)]
232*4185b066SAndroid Build Coastguard Worker #[repr(i32)]
233*4185b066SAndroid Build Coastguard Worker pub enum ErrorCode {
234*4185b066SAndroid Build Coastguard Worker     // Internal error codes corresponding to values in `Error.aidl`.
235*4185b066SAndroid Build Coastguard Worker     /// Success
236*4185b066SAndroid Build Coastguard Worker     Ok = 0,
237*4185b066SAndroid Build Coastguard Worker     /// Invalid peer nonce for key agreement
238*4185b066SAndroid Build Coastguard Worker     InvalidPeerNonce = -1,
239*4185b066SAndroid Build Coastguard Worker     /// Invalid key agreement public key by the peer
240*4185b066SAndroid Build Coastguard Worker     InvalidPeerKeKey = -2,
241*4185b066SAndroid Build Coastguard Worker     /// Invalid identity of the peer
242*4185b066SAndroid Build Coastguard Worker     InvalidIdentity = -3,
243*4185b066SAndroid Build Coastguard Worker     /// Invalid certificate chain in the identity of the peer
244*4185b066SAndroid Build Coastguard Worker     InvalidCertChain = -4,
245*4185b066SAndroid Build Coastguard Worker     /// Invalid signature by the peer
246*4185b066SAndroid Build Coastguard Worker     InvalidSignature = -5,
247*4185b066SAndroid Build Coastguard Worker     /// Invalid key agreement key created by a particular party themselves to be used as a handle
248*4185b066SAndroid Build Coastguard Worker     InvalidKeKey = -6,
249*4185b066SAndroid Build Coastguard Worker     /// Invalid public key in the `Key` struct
250*4185b066SAndroid Build Coastguard Worker     InvalidPubKeyInKey = -7,
251*4185b066SAndroid Build Coastguard Worker     /// Invalid private key arc in the `Key` struct
252*4185b066SAndroid Build Coastguard Worker     InvalidPrivKeyArcInKey = -8,
253*4185b066SAndroid Build Coastguard Worker     /// Invalid shared key arcs
254*4185b066SAndroid Build Coastguard Worker     InvalidSharedKeyArcs = -9,
255*4185b066SAndroid Build Coastguard Worker     /// Memory allocation failed
256*4185b066SAndroid Build Coastguard Worker     MemoryAllocationFailed = -10,
257*4185b066SAndroid Build Coastguard Worker     /// The protocol version negotiated with the sink is incompatible
258*4185b066SAndroid Build Coastguard Worker     IncompatibleProtocolVersion = -11,
259*4185b066SAndroid Build Coastguard Worker 
260*4185b066SAndroid Build Coastguard Worker     // Error codes corresponding to Binder error values.
261*4185b066SAndroid Build Coastguard Worker     /// Internal processing error
262*4185b066SAndroid Build Coastguard Worker     InternalError = -12,
263*4185b066SAndroid Build Coastguard Worker     /// Unimplemented
264*4185b066SAndroid Build Coastguard Worker     Unimplemented = -13,
265*4185b066SAndroid Build Coastguard Worker }
266*4185b066SAndroid Build Coastguard Worker 
267*4185b066SAndroid Build Coastguard Worker /// Trait that associates an [`AuthGraphOperationCode`] with a message.
268*4185b066SAndroid Build Coastguard Worker pub trait Code {
269*4185b066SAndroid Build Coastguard Worker     /// Return the enum value associated with the underlying type of this item.
code(&self) -> AuthGraphOperationCode270*4185b066SAndroid Build Coastguard Worker     fn code(&self) -> AuthGraphOperationCode;
271*4185b066SAndroid Build Coastguard Worker 
272*4185b066SAndroid Build Coastguard Worker     /// Return a [`Value`] holding the enum value.
value(&self) -> Value273*4185b066SAndroid Build Coastguard Worker     fn value(&self) -> Value {
274*4185b066SAndroid Build Coastguard Worker         Value::Integer((self.code() as i32).into())
275*4185b066SAndroid Build Coastguard Worker     }
276*4185b066SAndroid Build Coastguard Worker }
277*4185b066SAndroid Build Coastguard Worker 
278*4185b066SAndroid Build Coastguard Worker macro_rules! impl_code {
279*4185b066SAndroid Build Coastguard Worker     { $req:ident => $code:ident } => {
280*4185b066SAndroid Build Coastguard Worker         impl Code for $req {
281*4185b066SAndroid Build Coastguard Worker             fn code(&self) -> AuthGraphOperationCode {
282*4185b066SAndroid Build Coastguard Worker                 AuthGraphOperationCode::$code
283*4185b066SAndroid Build Coastguard Worker             }
284*4185b066SAndroid Build Coastguard Worker         }
285*4185b066SAndroid Build Coastguard Worker     }
286*4185b066SAndroid Build Coastguard Worker }
287*4185b066SAndroid Build Coastguard Worker 
288*4185b066SAndroid Build Coastguard Worker impl_code!(CreateRequest => Create);
289*4185b066SAndroid Build Coastguard Worker impl_code!(InitRequest => Init);
290*4185b066SAndroid Build Coastguard Worker impl_code!(FinishRequest => Finish);
291*4185b066SAndroid Build Coastguard Worker impl_code!(AuthenticationCompleteRequest => AuthenticationComplete);
292*4185b066SAndroid Build Coastguard Worker impl_code!(CreateResponse => Create);
293*4185b066SAndroid Build Coastguard Worker impl_code!(InitResponse => Init);
294*4185b066SAndroid Build Coastguard Worker impl_code!(FinishResponse => Finish);
295*4185b066SAndroid Build Coastguard Worker impl_code!(AuthenticationCompleteResponse => AuthenticationComplete);
296