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 main API for the request processing module.
16
17 use crate::client_vm;
18 use crate::rkp;
19 use alloc::vec::Vec;
20 use diced_open_dice::DiceArtifacts;
21 use service_vm_comm::{Request, Response};
22
23 /// Processes a request and returns the corresponding response.
24 /// This function serves as the entry point for the request processing module.
process_request(request: Request, context: &RequestContext) -> Response25 pub fn process_request(request: Request, context: &RequestContext) -> Response {
26 match request {
27 Request::Reverse(v) => Response::Reverse(reverse(v)),
28 Request::GenerateEcdsaP256KeyPair => {
29 rkp::generate_ecdsa_p256_key_pair(context.dice_artifacts)
30 .map_or_else(Response::Err, Response::GenerateEcdsaP256KeyPair)
31 }
32 Request::GenerateCertificateRequest(p) => {
33 rkp::generate_certificate_request(p, context.dice_artifacts)
34 .map_or_else(Response::Err, Response::GenerateCertificateRequest)
35 }
36 Request::RequestClientVmAttestation(p) => client_vm::request_attestation(
37 p,
38 context.dice_artifacts,
39 context.vendor_hashtree_root_digest,
40 )
41 .map_or_else(Response::Err, Response::RequestClientVmAttestation),
42 }
43 }
44
45 /// The context for the request processing.
46 ///
47 /// This struct contains the reference data used during the request processing.
48 pub struct RequestContext<'a> {
49 /// The reference DICE artifacts.
50 pub dice_artifacts: &'a dyn DiceArtifacts,
51
52 /// The reference hash tree root digest of the vendor partition if exists.
53 pub vendor_hashtree_root_digest: Option<&'a [u8]>,
54 }
55
reverse(payload: Vec<u8>) -> Vec<u8>56 fn reverse(payload: Vec<u8>) -> Vec<u8> {
57 payload.into_iter().rev().collect()
58 }
59