blob: c9aa711f31c7383fb154c65c5b51ea899d7ef096 [file] [log] [blame]
Alice Wang748b0322023-07-24 12:51:18 +00001// 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
18use alloc::vec::Vec;
Alice Wangd80e99e2023-09-15 13:26:01 +000019use core::fmt;
20use log::error;
Alice Wang748b0322023-07-24 12:51:18 +000021use serde::{Deserialize, Serialize};
22
Alice Wang464e4732023-09-06 12:25:22 +000023type MacedPublicKey = Vec<u8>;
24
Alice Wangfbdc85b2023-09-07 12:56:46 +000025/// The main request type to be sent to the service VM.
26#[derive(Clone, Debug, Serialize, Deserialize)]
27pub 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 Wang748b0322023-07-24 12:51:18 +000038///
39/// Each request has a corresponding response item.
40#[derive(Clone, Debug, Serialize, Deserialize)]
41pub 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 Wang33f4cae2023-09-05 09:27:39 +000045
46 /// Generates a new ECDSA P-256 key pair that can be attested by the remote
47 /// server.
48 GenerateEcdsaP256KeyPair,
Alice Wang464e4732023-09-06 12:25:22 +000049
50 /// Creates a certificate signing request to be sent to the
51 /// provisioning server.
52 GenerateCertificateRequest(GenerateCertificateRequestParams),
Alice Wang9aeb4062023-10-30 14:19:38 +000053
54 /// Requests the service VM to attest the client VM and issue a certificate
55 /// if the attestation succeeds.
56 RequestClientVmAttestation(ClientVmAttestationParams),
57}
58
Alice Wang2e6cdc12024-02-19 11:36:36 +000059impl Request {
60 /// Returns the name of the request.
61 pub fn name(&self) -> &'static str {
62 match self {
63 Self::Reverse(_) => "Reverse",
64 Self::GenerateEcdsaP256KeyPair => "GenerateEcdsaP256KeyPair",
65 Self::GenerateCertificateRequest(_) => "GenerateCertificateRequest",
66 Self::RequestClientVmAttestation(_) => "RequestClientVmAttestation",
67 }
68 }
69}
70
Alice Wang9aeb4062023-10-30 14:19:38 +000071/// Represents the params passed to `Request::RequestClientVmAttestation`.
72#[derive(Clone, Debug, Serialize, Deserialize)]
73pub struct ClientVmAttestationParams {
74 /// The CBOR-encoded CSR signed by the CDI_Leaf_Priv of the client VM's DICE chain
75 /// and the private key to be attested.
76 /// See client_vm_csr.cddl for the definition of the CSR.
77 pub csr: Vec<u8>,
78
79 /// The key blob retrieved from RKPD by virtualizationservice.
80 pub remotely_provisioned_key_blob: Vec<u8>,
Alice Wang20b8ebc2023-11-17 09:54:47 +000081
82 /// The leaf certificate of the certificate chain retrieved from RKPD by
83 /// virtualizationservice.
84 ///
85 /// This certificate is a DER-encoded X.509 certificate that includes the remotely
86 /// provisioned public key.
87 pub remotely_provisioned_cert: Vec<u8>,
Alice Wang748b0322023-07-24 12:51:18 +000088}
89
90/// Represents a response to a request sent to the service VM.
91///
92/// Each response corresponds to a specific request.
93#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
94pub enum Response {
95 /// Reverse the order of the bytes in the provided byte array.
96 Reverse(Vec<u8>),
Alice Wang33f4cae2023-09-05 09:27:39 +000097
98 /// Returns the new ECDSA P-256 key pair.
99 GenerateEcdsaP256KeyPair(EcdsaP256KeyPair),
Alice Wang464e4732023-09-06 12:25:22 +0000100
101 /// Returns a CBOR Certificate Signing Request (Csr) serialized into a byte array.
102 GenerateCertificateRequest(Vec<u8>),
Alice Wangd80e99e2023-09-15 13:26:01 +0000103
Alice Wang9aeb4062023-10-30 14:19:38 +0000104 /// Returns a certificate covering the public key to be attested in the provided CSR.
105 /// The certificate is signed by the remotely provisioned private key and also
106 /// includes an extension that describes the attested client VM.
107 RequestClientVmAttestation(Vec<u8>),
108
Alice Wangd80e99e2023-09-15 13:26:01 +0000109 /// Encountered an error during the request processing.
110 Err(RequestProcessingError),
111}
112
Alice Wang2e6cdc12024-02-19 11:36:36 +0000113impl Response {
114 /// Returns the name of the response.
115 pub fn name(&self) -> &'static str {
116 match self {
117 Self::Reverse(_) => "Reverse",
118 Self::GenerateEcdsaP256KeyPair(_) => "GenerateEcdsaP256KeyPair",
119 Self::GenerateCertificateRequest(_) => "GenerateCertificateRequest",
120 Self::RequestClientVmAttestation(_) => "RequestClientVmAttestation",
121 Self::Err(_) => "Err",
122 }
123 }
124}
125
Alice Wangd80e99e2023-09-15 13:26:01 +0000126/// Errors related to request processing.
127#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
128pub enum RequestProcessingError {
Alice Wangc8f88f52023-09-25 14:02:17 +0000129 /// An error happened during the interaction with BoringSSL.
130 BoringSslError(bssl_avf_error::Error),
Alice Wangd80e99e2023-09-15 13:26:01 +0000131
132 /// An error happened during the interaction with coset.
133 CosetError,
134
Alice Wang6bc2a702023-09-22 12:42:13 +0000135 /// An unexpected internal error occurred.
136 InternalError,
137
Alice Wangd80e99e2023-09-15 13:26:01 +0000138 /// Any key to sign lacks a valid MAC. Maps to `STATUS_INVALID_MAC`.
139 InvalidMac,
Alice Wangf7c0f942023-09-14 09:33:04 +0000140
141 /// No payload found in a key to sign.
142 KeyToSignHasEmptyPayload,
143
144 /// An error happened when serializing to/from a `Value`.
145 CborValueError,
Alice Wanga2738b72023-09-22 15:31:28 +0000146
147 /// The DICE chain of the service VM is missing.
148 MissingDiceChain,
Alice Wang9aeb4062023-10-30 14:19:38 +0000149
150 /// Failed to decrypt the remotely provisioned key blob.
151 FailedToDecryptKeyBlob,
152
153 /// The requested operation has not been implemented.
154 OperationUnimplemented,
Alice Wang20b8ebc2023-11-17 09:54:47 +0000155
156 /// An error happened during the DER encoding/decoding.
157 DerError,
Alice Wangd3a96402023-11-24 15:37:39 +0000158
159 /// The DICE chain from the client VM is invalid.
160 InvalidDiceChain,
Alice Wang9eebbab2024-04-10 14:57:27 +0000161
162 /// Cannot find the vendor hash tree root digest in the device tree.
163 NoVendorHashTreeRootDigestInDT,
164
165 /// The vendor partition loaded by the client VM is invalid.
166 InvalidVendorPartition,
Alice Wangd80e99e2023-09-15 13:26:01 +0000167}
168
169impl fmt::Display for RequestProcessingError {
170 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
171 match self {
Alice Wangc8f88f52023-09-25 14:02:17 +0000172 Self::BoringSslError(e) => {
173 write!(f, "An error happened during the interaction with BoringSSL: {e}")
Alice Wangd80e99e2023-09-15 13:26:01 +0000174 }
175 Self::CosetError => write!(f, "Encountered an error with coset"),
Alice Wang6bc2a702023-09-22 12:42:13 +0000176 Self::InternalError => write!(f, "An unexpected internal error occurred"),
Alice Wangd80e99e2023-09-15 13:26:01 +0000177 Self::InvalidMac => write!(f, "A key to sign lacks a valid MAC."),
Alice Wangf7c0f942023-09-14 09:33:04 +0000178 Self::KeyToSignHasEmptyPayload => write!(f, "No payload found in a key to sign."),
179 Self::CborValueError => {
180 write!(f, "An error happened when serializing to/from a CBOR Value.")
181 }
Alice Wanga2738b72023-09-22 15:31:28 +0000182 Self::MissingDiceChain => write!(f, "The DICE chain of the service VM is missing"),
Alice Wang9aeb4062023-10-30 14:19:38 +0000183 Self::FailedToDecryptKeyBlob => {
184 write!(f, "Failed to decrypt the remotely provisioned key blob")
185 }
186 Self::OperationUnimplemented => {
187 write!(f, "The requested operation has not been implemented")
188 }
Alice Wang20b8ebc2023-11-17 09:54:47 +0000189 Self::DerError => {
190 write!(f, "An error happened during the DER encoding/decoding")
191 }
Alice Wangd3a96402023-11-24 15:37:39 +0000192 Self::InvalidDiceChain => {
193 write!(f, "The DICE chain from the client VM is invalid")
194 }
Alice Wang9eebbab2024-04-10 14:57:27 +0000195 Self::NoVendorHashTreeRootDigestInDT => {
196 write!(f, "Cannot find the vendor hash tree root digest in the device tree")
197 }
198 Self::InvalidVendorPartition => {
199 write!(f, "The vendor partition loaded by the client VM is invalid")
200 }
Alice Wangd80e99e2023-09-15 13:26:01 +0000201 }
202 }
203}
204
Alice Wangc8f88f52023-09-25 14:02:17 +0000205impl From<bssl_avf_error::Error> for RequestProcessingError {
206 fn from(e: bssl_avf_error::Error) -> Self {
207 Self::BoringSslError(e)
208 }
209}
210
Alice Wangd80e99e2023-09-15 13:26:01 +0000211impl From<coset::CoseError> for RequestProcessingError {
212 fn from(e: coset::CoseError) -> Self {
213 error!("Coset error: {e}");
214 Self::CosetError
215 }
Alice Wang464e4732023-09-06 12:25:22 +0000216}
217
Alice Wangf7c0f942023-09-14 09:33:04 +0000218impl From<ciborium::value::Error> for RequestProcessingError {
219 fn from(e: ciborium::value::Error) -> Self {
220 error!("CborValueError: {e}");
221 Self::CborValueError
222 }
223}
224
Alice Wang20b8ebc2023-11-17 09:54:47 +0000225#[cfg(not(feature = "std"))]
226impl From<der::Error> for RequestProcessingError {
227 fn from(e: der::Error) -> Self {
228 error!("DER encoding/decoding error: {e}");
229 Self::DerError
230 }
231}
232
Alice Wang464e4732023-09-06 12:25:22 +0000233/// Represents the params passed to GenerateCertificateRequest
234#[derive(Clone, Debug, Serialize, Deserialize)]
235pub struct GenerateCertificateRequestParams {
236 /// Contains the set of keys to certify.
237 pub keys_to_sign: Vec<MacedPublicKey>,
238
239 /// challenge contains a byte strong from the provisioning server which will be
240 /// included in the signed data of the CSR structure.
241 /// The supported sizes is between 0 and 64 bytes, inclusive.
242 pub challenge: Vec<u8>,
Alice Wang33f4cae2023-09-05 09:27:39 +0000243}
244
245/// Represents an ECDSA P-256 key pair.
246#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
247pub struct EcdsaP256KeyPair {
248 /// Contains a CBOR-encoded public key specified in:
249 ///
250 /// hardware/interfaces/security/rkp/aidl/android/hardware/security/keymint/MacedPublicKey.aidl
Alice Wang464e4732023-09-06 12:25:22 +0000251 pub maced_public_key: MacedPublicKey,
Alice Wang33f4cae2023-09-05 09:27:39 +0000252
253 /// Contains a handle to the private key.
254 pub key_blob: Vec<u8>,
Alice Wang748b0322023-07-24 12:51:18 +0000255}