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