1*60b67249SAndroid Build Coastguard Worker // Copyright 2024 Google LLC 2*60b67249SAndroid Build Coastguard Worker // 3*60b67249SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not 4*60b67249SAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of 5*60b67249SAndroid Build Coastguard Worker // the License at 6*60b67249SAndroid Build Coastguard Worker // 7*60b67249SAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0 8*60b67249SAndroid Build Coastguard Worker // 9*60b67249SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*60b67249SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11*60b67249SAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12*60b67249SAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under 13*60b67249SAndroid Build Coastguard Worker // the License. 14*60b67249SAndroid Build Coastguard Worker 15*60b67249SAndroid Build Coastguard Worker //! Defines the [ErrCode] and [DpeResult] types. 16*60b67249SAndroid Build Coastguard Worker 17*60b67249SAndroid Build Coastguard Worker use log::error; 18*60b67249SAndroid Build Coastguard Worker 19*60b67249SAndroid Build Coastguard Worker /// An enum of error codes as defined in the DPE specification. The 20*60b67249SAndroid Build Coastguard Worker /// discriminant values match the CBOR encoding values per the specification. 21*60b67249SAndroid Build Coastguard Worker #[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)] 22*60b67249SAndroid Build Coastguard Worker pub enum ErrCode { 23*60b67249SAndroid Build Coastguard Worker /// An unexpected error has occurred which is not actionable by the client. 24*60b67249SAndroid Build Coastguard Worker InternalError = 1, 25*60b67249SAndroid Build Coastguard Worker /// The command could not be decrypted, parsed, or is not supported. 26*60b67249SAndroid Build Coastguard Worker InvalidCommand = 2, 27*60b67249SAndroid Build Coastguard Worker /// A command argument is malformed, invalid with respect to the current 28*60b67249SAndroid Build Coastguard Worker /// DPE state, in conflict with other arguments, not allowed, not 29*60b67249SAndroid Build Coastguard Worker /// recognized, or otherwise not supported. 30*60b67249SAndroid Build Coastguard Worker InvalidArgument = 3, 31*60b67249SAndroid Build Coastguard Worker /// Keys for an encrypted session have been exhausted. 32*60b67249SAndroid Build Coastguard Worker SessionExhausted = 4, 33*60b67249SAndroid Build Coastguard Worker /// The command cannot be fulfilled because an internal seed component is 34*60b67249SAndroid Build Coastguard Worker /// no longer available. 35*60b67249SAndroid Build Coastguard Worker InitializationSeedLocked = 5, 36*60b67249SAndroid Build Coastguard Worker /// A lack of internal resources prevented the DPE from fulfilling the 37*60b67249SAndroid Build Coastguard Worker /// command. 38*60b67249SAndroid Build Coastguard Worker OutOfMemory = 6, 39*60b67249SAndroid Build Coastguard Worker /// The command was canceled. 40*60b67249SAndroid Build Coastguard Worker Canceled = 7, 41*60b67249SAndroid Build Coastguard Worker } 42*60b67249SAndroid Build Coastguard Worker 43*60b67249SAndroid Build Coastguard Worker impl<E> From<minicbor::encode::Error<E>> for ErrCode { from(_error: minicbor::encode::Error<E>) -> Self44*60b67249SAndroid Build Coastguard Worker fn from(_error: minicbor::encode::Error<E>) -> Self { 45*60b67249SAndroid Build Coastguard Worker error!("Failed to encode CBOR message"); 46*60b67249SAndroid Build Coastguard Worker ErrCode::InternalError 47*60b67249SAndroid Build Coastguard Worker } 48*60b67249SAndroid Build Coastguard Worker } 49*60b67249SAndroid Build Coastguard Worker 50*60b67249SAndroid Build Coastguard Worker impl From<minicbor::decode::Error> for ErrCode { from(_error: minicbor::decode::Error) -> Self51*60b67249SAndroid Build Coastguard Worker fn from(_error: minicbor::decode::Error) -> Self { 52*60b67249SAndroid Build Coastguard Worker error!("Failed to decode CBOR message"); 53*60b67249SAndroid Build Coastguard Worker ErrCode::InvalidArgument 54*60b67249SAndroid Build Coastguard Worker } 55*60b67249SAndroid Build Coastguard Worker } 56*60b67249SAndroid Build Coastguard Worker 57*60b67249SAndroid Build Coastguard Worker impl From<core::num::TryFromIntError> for ErrCode { from(_: core::num::TryFromIntError) -> Self58*60b67249SAndroid Build Coastguard Worker fn from(_: core::num::TryFromIntError) -> Self { 59*60b67249SAndroid Build Coastguard Worker error!("Unexpected failure: core::num::TryFromIntError"); 60*60b67249SAndroid Build Coastguard Worker ErrCode::InternalError 61*60b67249SAndroid Build Coastguard Worker } 62*60b67249SAndroid Build Coastguard Worker } 63*60b67249SAndroid Build Coastguard Worker 64*60b67249SAndroid Build Coastguard Worker impl From<u32> for ErrCode { from(value: u32) -> Self65*60b67249SAndroid Build Coastguard Worker fn from(value: u32) -> Self { 66*60b67249SAndroid Build Coastguard Worker match value { 67*60b67249SAndroid Build Coastguard Worker 1 => Self::InternalError, 68*60b67249SAndroid Build Coastguard Worker 2 => Self::InvalidCommand, 69*60b67249SAndroid Build Coastguard Worker 3 => Self::InvalidArgument, 70*60b67249SAndroid Build Coastguard Worker 4 => Self::SessionExhausted, 71*60b67249SAndroid Build Coastguard Worker 5 => Self::InitializationSeedLocked, 72*60b67249SAndroid Build Coastguard Worker 6 => Self::OutOfMemory, 73*60b67249SAndroid Build Coastguard Worker 7 => Self::Canceled, 74*60b67249SAndroid Build Coastguard Worker _ => { 75*60b67249SAndroid Build Coastguard Worker error!("Unknown error code"); 76*60b67249SAndroid Build Coastguard Worker Self::InternalError 77*60b67249SAndroid Build Coastguard Worker } 78*60b67249SAndroid Build Coastguard Worker } 79*60b67249SAndroid Build Coastguard Worker } 80*60b67249SAndroid Build Coastguard Worker } 81*60b67249SAndroid Build Coastguard Worker 82*60b67249SAndroid Build Coastguard Worker /// A Result type using a DPE [`ErrCode`] error type. 83*60b67249SAndroid Build Coastguard Worker pub type DpeResult<T> = Result<T, ErrCode>; 84