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 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, const AttestationMeasurement<N, Tag>*)
84 {
85 schema["type"] = "string";
86
87 // According to the spec, "format is an open value, so you can use any
88 // formats, even not those defined by the OpenAPI Specification"
89 // https://swagger.io/docs/specification/data-models/data-types/#format
90 schema["format"] = "hex";
91 schema["pattern"] =
92 fmt::format("^[a-f0-9]{}$", AttestationMeasurement<N, Tag>::size() * 2);
93 }
94
95 // Virtual
96 using VirtualAttestationMeasurement = std::string;
97
98 // SGX
99 static constexpr size_t sgx_attestation_measurement_size = 32;
102
103 inline std::string schema_name(const SgxAttestationMeasurement*)
104 {
105 return "SgxAttestationMeasurement";
106 }
107
108 // SNP
109 static constexpr size_t snp_attestation_measurement_size = 48;
112
113 inline std::string schema_name(const SnpAttestationMeasurement*)
114 {
115 return "SnpAttestationMeasurement";
116 }
117
118 // Generic wrapper for code digests on all TEE platforms
120 {
121 std::vector<uint8_t> data;
122
125 default;
126
127 template <size_t N, typename Tag>
129 const AttestationMeasurement<N, Tag>& measurement) :
130 data(measurement.measurement.begin(), measurement.measurement.end())
131 {}
132
134 const PlatformAttestationMeasurement&) = default;
135
136 std::string hex_str() const
137 {
138 return ds::to_hex(data);
139 }
140
141 operator std::span<const uint8_t>() const
142 {
143 return data;
144 }
145 };
148}
149
150namespace ccf::kv::serialisers
151{
152 template <size_t N, typename Tag>
154 {
157 {
158 auto hex_str = measurement.hex_str();
159 return SerialisedEntry(hex_str.begin(), hex_str.end());
160 }
161
163 const SerialisedEntry& data)
164 {
166 ccf::ds::from_hex(std::string(data.data(), data.end()), ret.measurement);
167 return ret;
168 }
169 };
170}
Definition json.h:26
#define DECLARE_JSON_REQUIRED_FIELDS(TYPE,...)
Definition json.h:714
#define DECLARE_JSON_TYPE(TYPE)
Definition json.h:663
Definition sha256_hash.h:80
ccf::ByteVector SerialisedEntry
Definition serialised_entry.h:8
Definition attestation.h:20
void fill_json_schema(nlohmann::json &schema, const AttestationMeasurement< N, Tag > *)
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:96
void from_json(const nlohmann::json &j, AttestationMeasurement< N, Tag > &measurement)
Definition measurement.h:67
std::string schema_name(const SgxAttestationMeasurement *)
Definition measurement.h:103
Definition app_interface.h:14
static ccf::pal::AttestationMeasurement< N, Tag > from_serialised(const SerialisedEntry &data)
Definition measurement.h:162
static SerialisedEntry to_serialised(const ccf::pal::AttestationMeasurement< N, Tag > &measurement)
Definition measurement.h:155
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:120
std::vector< uint8_t > data
Definition measurement.h:121
PlatformAttestationMeasurement(const PlatformAttestationMeasurement &)=default
PlatformAttestationMeasurement & operator=(const PlatformAttestationMeasurement &)=default
std::string hex_str() const
Definition measurement.h:136
PlatformAttestationMeasurement(const AttestationMeasurement< N, Tag > &measurement)
Definition measurement.h:128
Definition measurement.h:52