CCF
Loading...
Searching...
No Matches
cose_rs_ffi.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
4#pragma once
5
6#include <cstddef>
7#include <cstdint>
8
9#ifdef __cplusplus
10extern "C"
11{
12#endif
13
15 struct CoseEvpKey;
16
22 const uint8_t* key_der_ptr,
23 size_t key_der_len,
24 uint8_t** err_ptr,
25 size_t* err_len);
26
28 void cose_key_free(CoseEvpKey* key);
29
35 const CoseEvpKey* key,
36 const uint8_t* kid_ptr,
37 size_t kid_len,
38 int64_t iat,
39 const uint8_t* issuer_ptr,
40 size_t issuer_len,
41 const uint8_t* subject_ptr,
42 size_t subject_len,
43 const uint8_t* txid_ptr,
44 size_t txid_len,
45 const uint8_t* payload_ptr,
46 size_t payload_len,
47 uint8_t** out_ptr,
48 size_t* out_len,
49 uint8_t** err_ptr,
50 size_t* err_len);
51
58 const CoseEvpKey* key,
59 int64_t iat,
60 const uint8_t* epoch_begin_ptr,
61 size_t epoch_begin_len,
62 const uint8_t* epoch_end_ptr,
63 size_t epoch_end_len,
64 const uint8_t* prev_root_ptr,
65 size_t prev_root_len,
66 const uint8_t* payload_ptr,
67 size_t payload_len,
68 uint8_t** out_ptr,
69 size_t* out_len,
70 uint8_t** err_ptr,
71 size_t* err_len);
72
78 const uint8_t* key_der_ptr,
79 size_t key_der_len,
80 uint8_t** err_ptr,
81 size_t* err_len);
82
88 const uint8_t* pem_ptr, size_t pem_len, uint8_t** err_ptr, size_t* err_len);
89
95 const uint8_t* pem_ptr, size_t pem_len, uint8_t** err_ptr, size_t* err_len);
96
102 const uint8_t* der_ptr, size_t der_len, uint8_t** err_ptr, size_t* err_len);
103
110 const CoseEvpKey* key,
111 int64_t alg,
112 const uint8_t* phdr_cbor_ptr,
113 size_t phdr_cbor_len,
114 const uint8_t* payload_ptr,
115 size_t payload_len,
116 const uint8_t* sig_ptr,
117 size_t sig_len,
118 uint8_t** err_ptr,
119 size_t* err_len);
120
122 void cose_free(uint8_t* ptr, size_t len);
123
124#ifdef __cplusplus
125}
126
127# include <stdexcept>
128# include <string>
129# include <vector>
130
138class CoseBuffer
139{
140 uint8_t* ptr = nullptr;
141 size_t len = 0;
142
143public:
144 CoseBuffer() = default;
145 CoseBuffer(const CoseBuffer&) = delete;
146 CoseBuffer& operator=(const CoseBuffer&) = delete;
147
148 CoseBuffer(CoseBuffer&& other) noexcept : ptr(other.ptr), len(other.len)
149 {
150 other.ptr = nullptr;
151 other.len = 0;
152 }
153
154 CoseBuffer& operator=(CoseBuffer&& other) noexcept
155 {
156 if (this != &other)
157 {
158 reset();
159 ptr = other.ptr;
160 len = other.len;
161 other.ptr = nullptr;
162 other.len = 0;
163 }
164 return *this;
165 }
166
167 ~CoseBuffer()
168 {
169 reset();
170 }
171
172 uint8_t** data()
173 {
174 return &ptr;
175 }
176
177 size_t* size()
178 {
179 return &len;
180 }
181
182 void reset()
183 {
184 if (ptr != nullptr)
185 {
186 cose_free(ptr, len);
187 ptr = nullptr;
188 len = 0;
189 }
190 }
191
192 // -- Buffer accessors --
193
194 [[nodiscard]] std::vector<uint8_t> to_vector() const
195 {
196 return {ptr, ptr + len};
197 }
198
199 [[nodiscard]] std::string to_string() const
200 {
201 if (ptr != nullptr && len > 0)
202 {
203 return {reinterpret_cast<const char*>(ptr), len};
204 }
205 return {};
206 }
207
208 [[nodiscard]] bool is_set() const
209 {
210 return ptr != nullptr && len > 0;
211 }
212};
213
218class CoseKey
219{
220 CoseEvpKey* key = nullptr;
221
222 explicit CoseKey(CoseEvpKey* k) : key(k) {}
223
224public:
225 CoseKey() = default;
226
228 static CoseKey from_private(
229 const uint8_t* der_ptr, size_t der_len, CoseBuffer& err)
230 {
231 return CoseKey(
232 cose_key_from_der_private(der_ptr, der_len, err.data(), err.size()));
233 }
234
236 static CoseKey from_public(
237 const uint8_t* der_ptr, size_t der_len, CoseBuffer& err)
238 {
239 return CoseKey(
240 cose_key_from_der_public(der_ptr, der_len, err.data(), err.size()));
241 }
242
244 static CoseKey from_pem_public(
245 const uint8_t* pem_ptr, size_t pem_len, CoseBuffer& err)
246 {
247 return CoseKey(
248 cose_key_from_pem_public(pem_ptr, pem_len, err.data(), err.size()));
249 }
250
252 static CoseKey from_pem_cert(
253 const uint8_t* pem_ptr, size_t pem_len, CoseBuffer& err)
254 {
255 return CoseKey(
256 cose_key_from_pem_cert(pem_ptr, pem_len, err.data(), err.size()));
257 }
258
260 static CoseKey from_der_cert(
261 const uint8_t* der_ptr, size_t der_len, CoseBuffer& err)
262 {
263 return CoseKey(
264 cose_key_from_der_cert(der_ptr, der_len, err.data(), err.size()));
265 }
266
267 CoseKey(const CoseKey&) = delete;
268 CoseKey& operator=(const CoseKey&) = delete;
269
270 CoseKey(CoseKey&& other) noexcept : key(other.key)
271 {
272 other.key = nullptr;
273 }
274
275 CoseKey& operator=(CoseKey&& other) noexcept
276 {
277 if (this != &other)
278 {
279 reset();
280 key = other.key;
281 other.key = nullptr;
282 }
283 return *this;
284 }
285
286 ~CoseKey()
287 {
288 reset();
289 }
290
291 void reset()
292 {
293 if (key != nullptr)
294 {
295 cose_key_free(key);
296 key = nullptr;
297 }
298 }
299
300 [[nodiscard]] const CoseEvpKey* get() const
301 {
302 return key;
303 }
304
305 [[nodiscard]] bool is_set() const
306 {
307 return key != nullptr;
308 }
309};
310
314inline int cose_sign_ledger(
315 const CoseKey& key,
316 const uint8_t* kid_ptr,
317 size_t kid_len,
318 int64_t iat,
319 const uint8_t* issuer_ptr,
320 size_t issuer_len,
321 const uint8_t* subject_ptr,
322 size_t subject_len,
323 const uint8_t* txid_ptr,
324 size_t txid_len,
325 const uint8_t* payload_ptr,
326 size_t payload_len,
327 CoseBuffer& out,
328 CoseBuffer& err)
329{
330 return ::cose_sign_ledger(
331 key.get(),
332 kid_ptr,
333 kid_len,
334 iat,
335 issuer_ptr,
336 issuer_len,
337 subject_ptr,
338 subject_len,
339 txid_ptr,
340 txid_len,
341 payload_ptr,
342 payload_len,
343 out.data(),
344 out.size(),
345 err.data(),
346 err.size());
347}
348
353inline int cose_sign_endorsement(
354 const CoseKey& key,
355 int64_t iat,
356 const uint8_t* epoch_begin_ptr,
357 size_t epoch_begin_len,
358 const uint8_t* epoch_end_ptr,
359 size_t epoch_end_len,
360 const uint8_t* prev_root_ptr,
361 size_t prev_root_len,
362 const uint8_t* payload_ptr,
363 size_t payload_len,
364 CoseBuffer& out,
365 CoseBuffer& err)
366{
367 return ::cose_sign_endorsement(
368 key.get(),
369 iat,
370 epoch_begin_ptr,
371 epoch_begin_len,
372 epoch_end_ptr,
373 epoch_end_len,
374 prev_root_ptr,
375 prev_root_len,
376 payload_ptr,
377 payload_len,
378 out.data(),
379 out.size(),
380 err.data(),
381 err.size());
382}
383
387inline int cose_verify1(
388 const CoseKey& key,
389 int64_t alg,
390 const uint8_t* phdr_cbor_ptr,
391 size_t phdr_cbor_len,
392 const uint8_t* payload_ptr,
393 size_t payload_len,
394 const uint8_t* sig_ptr,
395 size_t sig_len,
396 CoseBuffer& err)
397{
398 return ::cose_verify1(
399 key.get(),
400 alg,
401 phdr_cbor_ptr,
402 phdr_cbor_len,
403 payload_ptr,
404 payload_len,
405 sig_ptr,
406 sig_len,
407 err.data(),
408 err.size());
409}
410
411#endif
int cose_sign_endorsement(const CoseEvpKey *key, int64_t iat, const uint8_t *epoch_begin_ptr, size_t epoch_begin_len, const uint8_t *epoch_end_ptr, size_t epoch_end_len, const uint8_t *prev_root_ptr, size_t prev_root_len, const uint8_t *payload_ptr, size_t payload_len, uint8_t **out_ptr, size_t *out_len, uint8_t **err_ptr, size_t *err_len)
int cose_verify1(const CoseEvpKey *key, int64_t alg, const uint8_t *phdr_cbor_ptr, size_t phdr_cbor_len, const uint8_t *payload_ptr, size_t payload_len, const uint8_t *sig_ptr, size_t sig_len, uint8_t **err_ptr, size_t *err_len)
int cose_sign_ledger(const CoseEvpKey *key, const uint8_t *kid_ptr, size_t kid_len, int64_t iat, const uint8_t *issuer_ptr, size_t issuer_len, const uint8_t *subject_ptr, size_t subject_len, const uint8_t *txid_ptr, size_t txid_len, const uint8_t *payload_ptr, size_t payload_len, uint8_t **out_ptr, size_t *out_len, uint8_t **err_ptr, size_t *err_len)
CoseEvpKey * cose_key_from_der_private(const uint8_t *key_der_ptr, size_t key_der_len, uint8_t **err_ptr, size_t *err_len)
CoseEvpKey * cose_key_from_der_public(const uint8_t *key_der_ptr, size_t key_der_len, uint8_t **err_ptr, size_t *err_len)
CoseEvpKey * cose_key_from_pem_cert(const uint8_t *pem_ptr, size_t pem_len, uint8_t **err_ptr, size_t *err_len)
void cose_key_free(CoseEvpKey *key)
Free a CoseEvpKey.
CoseEvpKey * cose_key_from_pem_public(const uint8_t *pem_ptr, size_t pem_len, uint8_t **err_ptr, size_t *err_len)
void cose_free(uint8_t *ptr, size_t len)
Free a byte buffer or error string allocated by any cose_* call.
CoseEvpKey * cose_key_from_der_cert(const uint8_t *der_ptr, size_t der_len, uint8_t **err_ptr, size_t *err_len)
uint8_t * key
Definition kv_helpers.h:80
std::string to_string(ProductName product)
Definition sev_snp_cpuid.h:93