CCF
Loading...
Searching...
No Matches
measurement.h
Go to the documentation of this file.
1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the Apache 2.0 License.
3#pragma once
4
5#include "ccf/ds/hex.h"
6#include "ccf/ds/json.h"
8
9#include <array>
10#include <span>
11#include <type_traits>
12
13namespace ccf::pal
14{
15 template <size_t N, typename Tag = void>
17 {
18 std::array<uint8_t, N> measurement;
19
20 static size_t size()
21 {
22 return N;
23 }
24
25 [[nodiscard]] std::string hex_str() const
26 {
27 return ds::to_hex(measurement);
28 }
29
31 AttestationMeasurement(const std::string& hex_str)
32 {
33 ds::from_hex(hex_str, measurement);
34 }
35 AttestationMeasurement(std::span<const uint8_t> data)
36 {
37 if (data.size() != size())
38 {
39 throw std::logic_error(fmt::format(
40 "Cannot initialise AttestationMeasurement with data of size {}, "
41 "expected {}",
42 data.size(),
43 size()));
44 }
45
46 std::copy(data.data(), data.data() + data.size(), measurement.data());
47 }
48 };
49
50 template <typename>
51 struct is_attestation_measurement : std::false_type
52 {};
53
54 template <size_t N, typename Tag>
56 : std::true_type
57 {};
58
59 template <size_t N, typename Tag = void>
60 inline void to_json(
61 nlohmann::json& j, const AttestationMeasurement<N, Tag>& measurement)
62 {
63 j = measurement.hex_str();
64 }
65
66 template <size_t N, typename Tag = void>
67 inline void from_json(
68 const nlohmann::json& j, AttestationMeasurement<N, Tag>& measurement)
69 {
70 if (j.is_string())
71 {
72 measurement = j.get<std::string>();
73 }
74 else
75 {
76 throw ccf::JsonParseError(fmt::format(
77 "Attestation measurement should be hex-encoded string: {}", j.dump()));
78 }
79 }
80
81 template <size_t N, typename Tag = void>
82 inline void fill_json_schema(
83 nlohmann::json& schema,
84 [[maybe_unused]] const AttestationMeasurement<N, Tag>* measurement_type)
85 {
86 schema["type"] = "string";
87
88 // According to the spec, "format is an open value, so you can use any
89 // formats, even not those defined by the OpenAPI Specification"
90 // https://swagger.io/docs/specification/data-models/data-types/#format
91 schema["format"] = "hex";
92 schema["pattern"] =
93 fmt::format("^[a-f0-9]{}$", AttestationMeasurement<N, Tag>::size() * 2);
94 }
95
96 // Virtual
97 using VirtualAttestationMeasurement = std::string;
98
99 // SGX
100 static constexpr size_t sgx_attestation_measurement_size = 32;
103
104 inline std::string schema_name(
105 [[maybe_unused]] const SgxAttestationMeasurement* sgx_measurement_type)
106 {
107 return "SgxAttestationMeasurement";
108 }
109
110 // SNP
111 static constexpr size_t snp_attestation_measurement_size = 48;
114
115 inline std::string schema_name(
116 [[maybe_unused]] const SnpAttestationMeasurement* snp_measurement_type)
117 {
118 return "SnpAttestationMeasurement";
119 }
120
121 // Generic wrapper for code digests on all TEE platforms
123 {
124 std::vector<uint8_t> data;
125
128 default;
129
130 template <size_t N, typename Tag>
132 const AttestationMeasurement<N, Tag>& measurement) :
133 data(measurement.measurement.begin(), measurement.measurement.end())
134 {}
135
137 const PlatformAttestationMeasurement&) = default;
138
139 [[nodiscard]] std::string hex_str() const
140 {
141 return ds::to_hex(data);
142 }
143
144 operator std::span<const uint8_t>() const
145 {
146 return data;
147 }
148 };
151}
152
153namespace ccf::kv::serialisers
154{
155 template <size_t N, typename Tag>
157 {
160 {
161 auto hex_str = measurement.hex_str();
162 return SerialisedEntry(hex_str.begin(), hex_str.end());
163 }
164
166 const SerialisedEntry& data)
167 {
169 ccf::ds::from_hex(std::string(data.data(), data.end()), ret.measurement);
170 return ret;
171 }
172 };
173}
Definition json.h:26
#define DECLARE_JSON_REQUIRED_FIELDS(TYPE,...)
Definition json.h:718
#define DECLARE_JSON_TYPE(TYPE)
Definition json.h:667
Definition sha256_hash.h:88
ccf::ByteVector SerialisedEntry
Definition serialised_entry.h:8
Definition attestation.h:13
void fill_json_schema(nlohmann::json &schema, const AttestationMeasurement< N, Tag > *measurement_type)
Definition measurement.h:82
void to_json(nlohmann::json &j, const AttestationMeasurement< N, Tag > &measurement)
Definition measurement.h:60
std::string VirtualAttestationMeasurement
Definition measurement.h:97
void from_json(const nlohmann::json &j, AttestationMeasurement< N, Tag > &measurement)
Definition measurement.h:67
std::string schema_name(const SgxAttestationMeasurement *sgx_measurement_type)
Definition measurement.h:104
Definition app_interface.h:14
static ccf::pal::AttestationMeasurement< N, Tag > from_serialised(const SerialisedEntry &data)
Definition measurement.h:165
static SerialisedEntry to_serialised(const ccf::pal::AttestationMeasurement< N, Tag > &measurement)
Definition measurement.h:158
Definition blit_serialiser.h:14
Definition measurement.h:17
AttestationMeasurement(const std::string &hex_str)
Definition measurement.h:31
std::string hex_str() const
Definition measurement.h:25
AttestationMeasurement(std::span< const uint8_t > data)
Definition measurement.h:35
std::array< uint8_t, N > measurement
Definition measurement.h:18
static size_t size()
Definition measurement.h:20
Definition measurement.h:123
std::vector< uint8_t > data
Definition measurement.h:124
PlatformAttestationMeasurement(const PlatformAttestationMeasurement &)=default
PlatformAttestationMeasurement & operator=(const PlatformAttestationMeasurement &)=default
std::string hex_str() const
Definition measurement.h:139
PlatformAttestationMeasurement(const AttestationMeasurement< N, Tag > &measurement)
Definition measurement.h:131
Definition measurement.h:52