Alice Wang | 748b032 | 2023-07-24 12:51:18 +0000 | [diff] [blame] | 1 | // Copyright 2023, The Android Open Source Project |
| 2 | // |
| 3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 | // you may not use this file except in compliance with the License. |
| 5 | // You may obtain a copy of the License at |
| 6 | // |
| 7 | // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 | // |
| 9 | // Unless required by applicable law or agreed to in writing, software |
| 10 | // distributed under the License is distributed on an "AS IS" BASIS, |
| 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 | // See the License for the specific language governing permissions and |
| 13 | // limitations under the License. |
| 14 | |
| 15 | //! This module contains the requests and responses definitions exchanged |
| 16 | //! between the host and the service VM. |
| 17 | |
| 18 | use alloc::vec::Vec; |
Alice Wang | d80e99e | 2023-09-15 13:26:01 +0000 | [diff] [blame] | 19 | use core::fmt; |
| 20 | use log::error; |
Alice Wang | 748b032 | 2023-07-24 12:51:18 +0000 | [diff] [blame] | 21 | use serde::{Deserialize, Serialize}; |
| 22 | |
Alice Wang | 464e473 | 2023-09-06 12:25:22 +0000 | [diff] [blame] | 23 | type MacedPublicKey = Vec<u8>; |
| 24 | |
Alice Wang | fbdc85b | 2023-09-07 12:56:46 +0000 | [diff] [blame] | 25 | /// The main request type to be sent to the service VM. |
| 26 | #[derive(Clone, Debug, Serialize, Deserialize)] |
| 27 | pub enum ServiceVmRequest { |
| 28 | /// A request to be processed by the service VM. |
| 29 | /// |
| 30 | /// Each request has a corresponding response item. |
| 31 | Process(Request), |
| 32 | |
| 33 | /// Shuts down the service VM. No response is expected from it. |
| 34 | Shutdown, |
| 35 | } |
| 36 | |
| 37 | /// Represents a process request to be sent to the service VM. |
Alice Wang | 748b032 | 2023-07-24 12:51:18 +0000 | [diff] [blame] | 38 | /// |
| 39 | /// Each request has a corresponding response item. |
| 40 | #[derive(Clone, Debug, Serialize, Deserialize)] |
| 41 | pub enum Request { |
| 42 | /// Reverse the order of the bytes in the provided byte array. |
| 43 | /// Currently this is only used for testing. |
| 44 | Reverse(Vec<u8>), |
Alice Wang | 33f4cae | 2023-09-05 09:27:39 +0000 | [diff] [blame] | 45 | |
| 46 | /// Generates a new ECDSA P-256 key pair that can be attested by the remote |
| 47 | /// server. |
| 48 | GenerateEcdsaP256KeyPair, |
Alice Wang | 464e473 | 2023-09-06 12:25:22 +0000 | [diff] [blame] | 49 | |
| 50 | /// Creates a certificate signing request to be sent to the |
| 51 | /// provisioning server. |
| 52 | GenerateCertificateRequest(GenerateCertificateRequestParams), |
Alice Wang | 748b032 | 2023-07-24 12:51:18 +0000 | [diff] [blame] | 53 | } |
| 54 | |
| 55 | /// Represents a response to a request sent to the service VM. |
| 56 | /// |
| 57 | /// Each response corresponds to a specific request. |
| 58 | #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] |
| 59 | pub enum Response { |
| 60 | /// Reverse the order of the bytes in the provided byte array. |
| 61 | Reverse(Vec<u8>), |
Alice Wang | 33f4cae | 2023-09-05 09:27:39 +0000 | [diff] [blame] | 62 | |
| 63 | /// Returns the new ECDSA P-256 key pair. |
| 64 | GenerateEcdsaP256KeyPair(EcdsaP256KeyPair), |
Alice Wang | 464e473 | 2023-09-06 12:25:22 +0000 | [diff] [blame] | 65 | |
| 66 | /// Returns a CBOR Certificate Signing Request (Csr) serialized into a byte array. |
| 67 | GenerateCertificateRequest(Vec<u8>), |
Alice Wang | d80e99e | 2023-09-15 13:26:01 +0000 | [diff] [blame] | 68 | |
| 69 | /// Encountered an error during the request processing. |
| 70 | Err(RequestProcessingError), |
| 71 | } |
| 72 | |
| 73 | /// Errors related to request processing. |
| 74 | #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] |
| 75 | pub enum RequestProcessingError { |
Alice Wang | c8f88f5 | 2023-09-25 14:02:17 +0000 | [diff] [blame] | 76 | /// An error happened during the interaction with BoringSSL. |
| 77 | BoringSslError(bssl_avf_error::Error), |
Alice Wang | d80e99e | 2023-09-15 13:26:01 +0000 | [diff] [blame] | 78 | |
| 79 | /// An error happened during the interaction with coset. |
| 80 | CosetError, |
| 81 | |
Alice Wang | 6bc2a70 | 2023-09-22 12:42:13 +0000 | [diff] [blame] | 82 | /// An unexpected internal error occurred. |
| 83 | InternalError, |
| 84 | |
Alice Wang | d80e99e | 2023-09-15 13:26:01 +0000 | [diff] [blame] | 85 | /// Any key to sign lacks a valid MAC. Maps to `STATUS_INVALID_MAC`. |
| 86 | InvalidMac, |
Alice Wang | f7c0f94 | 2023-09-14 09:33:04 +0000 | [diff] [blame] | 87 | |
| 88 | /// No payload found in a key to sign. |
| 89 | KeyToSignHasEmptyPayload, |
| 90 | |
| 91 | /// An error happened when serializing to/from a `Value`. |
| 92 | CborValueError, |
Alice Wang | a2738b7 | 2023-09-22 15:31:28 +0000 | [diff] [blame] | 93 | |
| 94 | /// The DICE chain of the service VM is missing. |
| 95 | MissingDiceChain, |
Alice Wang | d80e99e | 2023-09-15 13:26:01 +0000 | [diff] [blame] | 96 | } |
| 97 | |
| 98 | impl fmt::Display for RequestProcessingError { |
| 99 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
| 100 | match self { |
Alice Wang | c8f88f5 | 2023-09-25 14:02:17 +0000 | [diff] [blame] | 101 | Self::BoringSslError(e) => { |
| 102 | write!(f, "An error happened during the interaction with BoringSSL: {e}") |
Alice Wang | d80e99e | 2023-09-15 13:26:01 +0000 | [diff] [blame] | 103 | } |
| 104 | Self::CosetError => write!(f, "Encountered an error with coset"), |
Alice Wang | 6bc2a70 | 2023-09-22 12:42:13 +0000 | [diff] [blame] | 105 | Self::InternalError => write!(f, "An unexpected internal error occurred"), |
Alice Wang | d80e99e | 2023-09-15 13:26:01 +0000 | [diff] [blame] | 106 | Self::InvalidMac => write!(f, "A key to sign lacks a valid MAC."), |
Alice Wang | f7c0f94 | 2023-09-14 09:33:04 +0000 | [diff] [blame] | 107 | Self::KeyToSignHasEmptyPayload => write!(f, "No payload found in a key to sign."), |
| 108 | Self::CborValueError => { |
| 109 | write!(f, "An error happened when serializing to/from a CBOR Value.") |
| 110 | } |
Alice Wang | a2738b7 | 2023-09-22 15:31:28 +0000 | [diff] [blame] | 111 | Self::MissingDiceChain => write!(f, "The DICE chain of the service VM is missing"), |
Alice Wang | d80e99e | 2023-09-15 13:26:01 +0000 | [diff] [blame] | 112 | } |
| 113 | } |
| 114 | } |
| 115 | |
Alice Wang | c8f88f5 | 2023-09-25 14:02:17 +0000 | [diff] [blame] | 116 | impl From<bssl_avf_error::Error> for RequestProcessingError { |
| 117 | fn from(e: bssl_avf_error::Error) -> Self { |
| 118 | Self::BoringSslError(e) |
| 119 | } |
| 120 | } |
| 121 | |
Alice Wang | d80e99e | 2023-09-15 13:26:01 +0000 | [diff] [blame] | 122 | impl From<coset::CoseError> for RequestProcessingError { |
| 123 | fn from(e: coset::CoseError) -> Self { |
| 124 | error!("Coset error: {e}"); |
| 125 | Self::CosetError |
| 126 | } |
Alice Wang | 464e473 | 2023-09-06 12:25:22 +0000 | [diff] [blame] | 127 | } |
| 128 | |
Alice Wang | f7c0f94 | 2023-09-14 09:33:04 +0000 | [diff] [blame] | 129 | impl From<ciborium::value::Error> for RequestProcessingError { |
| 130 | fn from(e: ciborium::value::Error) -> Self { |
| 131 | error!("CborValueError: {e}"); |
| 132 | Self::CborValueError |
| 133 | } |
| 134 | } |
| 135 | |
Alice Wang | 464e473 | 2023-09-06 12:25:22 +0000 | [diff] [blame] | 136 | /// Represents the params passed to GenerateCertificateRequest |
| 137 | #[derive(Clone, Debug, Serialize, Deserialize)] |
| 138 | pub struct GenerateCertificateRequestParams { |
| 139 | /// Contains the set of keys to certify. |
| 140 | pub keys_to_sign: Vec<MacedPublicKey>, |
| 141 | |
| 142 | /// challenge contains a byte strong from the provisioning server which will be |
| 143 | /// included in the signed data of the CSR structure. |
| 144 | /// The supported sizes is between 0 and 64 bytes, inclusive. |
| 145 | pub challenge: Vec<u8>, |
Alice Wang | 33f4cae | 2023-09-05 09:27:39 +0000 | [diff] [blame] | 146 | } |
| 147 | |
| 148 | /// Represents an ECDSA P-256 key pair. |
| 149 | #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] |
| 150 | pub struct EcdsaP256KeyPair { |
| 151 | /// Contains a CBOR-encoded public key specified in: |
| 152 | /// |
| 153 | /// hardware/interfaces/security/rkp/aidl/android/hardware/security/keymint/MacedPublicKey.aidl |
Alice Wang | 464e473 | 2023-09-06 12:25:22 +0000 | [diff] [blame] | 154 | pub maced_public_key: MacedPublicKey, |
Alice Wang | 33f4cae | 2023-09-05 09:27:39 +0000 | [diff] [blame] | 155 | |
| 156 | /// Contains a handle to the private key. |
| 157 | pub key_blob: Vec<u8>, |
Alice Wang | 748b032 | 2023-07-24 12:51:18 +0000 | [diff] [blame] | 158 | } |