xref: /aosp_15_r20/external/open-dice/dpe-rs/src/error.rs (revision 60b67249c2e226f42f35cc6cfe66c6048e0bae6b)
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