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>
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>
56 {};
57
58 template <size_t N>
59 inline void to_json(
60 nlohmann::json& j, const AttestationMeasurement<N>& measurement)
61 {
62 j = measurement.hex_str();
63 }
64
65 template <size_t N>
66 inline void from_json(
67 const nlohmann::json& j, AttestationMeasurement<N>& measurement)
68 {
69 if (j.is_string())
70 {
71 measurement = j.get<std::string>();
72 }
73 else
74 {
75 throw ccf::JsonParseError(fmt::format(
76 "Attestation measurement should be hex-encoded string: {}", j.dump()));
77 }
78 }
79
80 template <size_t N>
81 inline void fill_json_schema(
82 nlohmann::json& schema, const AttestationMeasurement<N>*)
83 {
84 schema["type"] = "string";
85
86 // According to the spec, "format is an open value, so you can use any
87 // formats, even not those defined by the OpenAPI Specification"
88 // https://swagger.io/docs/specification/data-models/data-types/#format
89 schema["format"] = "hex";
90 schema["pattern"] =
91 fmt::format("^[a-f0-9]{}$", AttestationMeasurement<N>::size() * 2);
92 }
93
94 // SGX
95 static constexpr size_t sgx_attestation_measurement_size = 32;
98
99 inline std::string schema_name(const SgxAttestationMeasurement*)
100 {
101 return "SgxAttestationMeasurement";
102 }
103
104 // SNP
105 static constexpr size_t snp_attestation_measurement_size = 48;
108
109 inline std::string schema_name(const SnpAttestationMeasurement*)
110 {
111 return "SnpAttestationMeasurement";
112 }
113
114 // Generic wrapper for code digests on all TEE platforms
116 {
117 std::vector<uint8_t> data;
118
121 default;
122
123 template <size_t N>
125 const AttestationMeasurement<N>& measurement) :
126 data(measurement.measurement.begin(), measurement.measurement.end())
127 {}
128
130 const PlatformAttestationMeasurement&) = default;
131
132 std::string hex_str() const
133 {
134 return ds::to_hex(data);
135 }
136
137 operator std::span<const uint8_t>() const
138 {
139 return data;
140 }
141 };
144}
145
146namespace ccf::kv::serialisers
147{
148 template <size_t N>
150 {
152 const ccf::pal::AttestationMeasurement<N>& measurement)
153 {
154 auto hex_str = measurement.hex_str();
155 return SerialisedEntry(hex_str.begin(), hex_str.end());
156 }
157
159 const SerialisedEntry& data)
160 {
162 ccf::ds::from_hex(std::string(data.data(), data.end()), ret.measurement);
163 return ret;
164 }
165 };
166}
Definition json.h:24
#define DECLARE_JSON_REQUIRED_FIELDS(TYPE,...)
Definition json.h:712
#define DECLARE_JSON_TYPE(TYPE)
Definition json.h:661
Definition sha256_hash.h:80
ccf::ByteVector SerialisedEntry
Definition serialised_entry.h:8
Definition attestation.h:28
void to_json(nlohmann::json &j, const AttestationMeasurement< N > &measurement)
Definition measurement.h:59
void fill_json_schema(nlohmann::json &schema, const AttestationMeasurement< N > *)
Definition measurement.h:81
void from_json(const nlohmann::json &j, AttestationMeasurement< N > &measurement)
Definition measurement.h:66
AttestationMeasurement< snp_attestation_measurement_size > SnpAttestationMeasurement
Definition measurement.h:107
AttestationMeasurement< sgx_attestation_measurement_size > SgxAttestationMeasurement
Definition measurement.h:97
std::string schema_name(const SgxAttestationMeasurement *)
Definition measurement.h:99
Definition app_interface.h:15
static SerialisedEntry to_serialised(const ccf::pal::AttestationMeasurement< N > &measurement)
Definition measurement.h:151
static ccf::pal::AttestationMeasurement< N > from_serialised(const SerialisedEntry &data)
Definition measurement.h:158
Definition blit_serialiser.h:14
Definition measurement.h:17
AttestationMeasurement(const std::string &hex_str)
Definition measurement.h:31
static size_t size()
Definition measurement.h:20
std::array< uint8_t, N > measurement
Definition measurement.h:18
AttestationMeasurement(std::span< const uint8_t > data)
Definition measurement.h:35
std::string hex_str() const
Definition measurement.h:25
Definition measurement.h:116
std::vector< uint8_t > data
Definition measurement.h:117
PlatformAttestationMeasurement(const PlatformAttestationMeasurement &)=default
PlatformAttestationMeasurement & operator=(const PlatformAttestationMeasurement &)=default
std::string hex_str() const
Definition measurement.h:132
PlatformAttestationMeasurement(const AttestationMeasurement< N > &measurement)
Definition measurement.h:124
Definition measurement.h:52