AWS Encryption SDK for C v2.4
Loading...
Searching...
No Matches
materials.h
Go to the documentation of this file.
1/*
2 * Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. A copy of the License is
6 * located at
7 *
8 * http://aws.amazon.com/apache2.0/
9 *
10 * or in the "license" file accompanying this file. This file is distributed on an
11 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
12 * implied. See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef AWS_CRYPTOSDK_MATERIALS_H
17#define AWS_CRYPTOSDK_MATERIALS_H
18
19#include <assert.h>
20#include <limits.h>
21#include <stdint.h>
22
23#include <aws/common/array_list.h>
24#include <aws/common/atomics.h>
25#include <aws/common/byte_buf.h>
26#include <aws/common/common.h>
27#include <aws/common/hash_table.h>
28
30#include <aws/cryptosdk/edk.h>
31#include <aws/cryptosdk/error.h>
32#include <aws/cryptosdk/exports.h>
35
36#ifdef __cplusplus
37extern "C" {
38#endif
39
64
71
72// Note: Most of this file will be in the low-level section.
73// To move something to the high-level section, use @ingroup cmm_kr_highlevel
74
84 struct aws_atomic_var refcount;
86};
87
97 struct aws_atomic_var refcount;
99};
100
127
175
176AWS_CRYPTOSDK_STATIC_INLINE bool aws_cryptosdk_enc_request_is_valid(const struct aws_cryptosdk_enc_request *request) {
177 return request && aws_allocator_is_valid(request->alloc) && aws_hash_table_is_valid(request->enc_ctx);
178}
179
184 struct aws_allocator *alloc;
185 struct aws_byte_buf unencrypted_data_key;
187 struct aws_array_list keyring_trace;
189 struct aws_array_list encrypted_data_keys;
191 struct aws_cryptosdk_sig_ctx *signctx;
193};
194
199 struct aws_allocator *alloc;
215 const struct aws_hash_table *enc_ctx;
216 struct aws_array_list encrypted_data_keys;
218};
219
220AWS_CRYPTOSDK_STATIC_INLINE bool aws_cryptosdk_dec_request_is_valid(const struct aws_cryptosdk_dec_request *request) {
221 return request && aws_allocator_is_valid(request->alloc) &&
222 aws_cryptosdk_edk_list_is_valid(&request->encrypted_data_keys) && aws_hash_table_is_valid(request->enc_ctx);
223}
224
229 struct aws_allocator *alloc;
230 struct aws_byte_buf unencrypted_data_key;
232 struct aws_array_list keyring_trace;
234 struct aws_cryptosdk_sig_ctx *signctx;
236};
237
238AWS_CRYPTOSDK_STATIC_INLINE bool aws_cryptosdk_enc_materials_is_valid(
239 const struct aws_cryptosdk_enc_materials *materials) {
240 if (!AWS_OBJECT_PTR_IS_WRITABLE(materials)) {
241 return false;
242 }
243 bool allocator_valid = aws_allocator_is_valid(materials->alloc);
244 bool unencrypted_data_key_valid = aws_byte_buf_is_valid(&materials->unencrypted_data_key);
245 bool keyring_trace_valid = aws_cryptosdk_keyring_trace_is_valid(&materials->keyring_trace);
246 bool encrypted_data_keys_valid = aws_cryptosdk_edk_list_is_valid(&materials->encrypted_data_keys);
247 bool signctx_valid = (materials->signctx == NULL) || aws_cryptosdk_sig_ctx_is_valid(materials->signctx);
248 return allocator_valid && unencrypted_data_key_valid && keyring_trace_valid && encrypted_data_keys_valid &&
249 signctx_valid;
250}
251
252AWS_CRYPTOSDK_STATIC_INLINE bool aws_cryptosdk_dec_materials_is_valid(
253 const struct aws_cryptosdk_dec_materials *materials) {
254 if (!AWS_OBJECT_PTR_IS_WRITABLE(materials)) {
255 return false;
256 }
257 bool allocator_valid = aws_allocator_is_valid(materials->alloc);
258 bool unencrypted_data_key_valid = aws_byte_buf_is_valid(&materials->unencrypted_data_key);
259 bool keyring_trace_valid = aws_cryptosdk_keyring_trace_is_valid(&materials->keyring_trace);
260 bool signctx_valid = (materials->signctx == NULL) || aws_cryptosdk_sig_ctx_is_valid(materials->signctx);
261 return allocator_valid && unencrypted_data_key_valid && keyring_trace_valid && signctx_valid;
262}
263
264#ifndef AWS_CRYPTOSDK_DOXYGEN /* do not document internal macros */
265
266/*
267 * C99 standard dictates that "..." must have at least one argument behind it. Second arg of
268 * _VF_CALL macros is always struct type, i.e., "cmm" or "keyring". These helper macros allow
269 * us not to make struct_type a named argument, thus handling the case cleanly where there
270 * are no more arguments.
271 *
272 * Note: We work around a VC++ preprocessor bug here. See https://stackoverflow.com/a/4750720
273 */
274# define AWS_CRYPTOSDK_PRIVATE_STRUCT_NAME(...) AWS_CRYPTOSDK_PRIVATE_STRUCT_NAME_2((__VA_ARGS__, throwaway))
275# define AWS_CRYPTOSDK_PRIVATE_STRUCT_NAME_2(args) AWS_CRYPTOSDK_PRIVATE_STRUCT_NAME_3 args
276# define AWS_CRYPTOSDK_PRIVATE_STRUCT_NAME_3(struct_type, ...) struct_type
277
278# define AWS_CRYPTOSDK_PRIVATE_BASE_TYPE(...) AWS_CRYPTOSDK_PRIVATE_BASE_TYPE_2((__VA_ARGS__, throwaway))
279# define AWS_CRYPTOSDK_PRIVATE_BASE_TYPE_2(args) AWS_CRYPTOSDK_PRIVATE_BASE_TYPE_3 args
280# define AWS_CRYPTOSDK_PRIVATE_BASE_TYPE_3(struct_type, ...) const struct aws_cryptosdk_##struct_type
281
292# define AWS_CRYPTOSDK_PRIVATE_VF_CALL(fn_name, ...) \
293 int ret; \
294 do { \
295 AWS_CRYPTOSDK_PRIVATE_BASE_TYPE(__VA_ARGS__) *pbase = \
296 (AWS_CRYPTOSDK_PRIVATE_BASE_TYPE(__VA_ARGS__) *)AWS_CRYPTOSDK_PRIVATE_STRUCT_NAME(__VA_ARGS__); \
297 ptrdiff_t memb_offset = (const uint8_t *)&(pbase->vtable)->fn_name - (const uint8_t *)pbase->vtable; \
298 if (memb_offset + sizeof((pbase->vtable)->fn_name) > (pbase->vtable)->vt_size || \
299 !(pbase->vtable)->fn_name) { \
300 return aws_raise_error(AWS_ERROR_UNIMPLEMENTED); \
301 } \
302 ret = (pbase->vtable)->fn_name(__VA_ARGS__); \
303 } while (0)
304
310# define AWS_CRYPTOSDK_PRIVATE_VF_CALL_NO_RETURN(fn_name, ...) \
311 do { \
312 AWS_CRYPTOSDK_PRIVATE_BASE_TYPE(__VA_ARGS__) *pbase = \
313 (AWS_CRYPTOSDK_PRIVATE_BASE_TYPE(__VA_ARGS__) *)AWS_CRYPTOSDK_PRIVATE_STRUCT_NAME(__VA_ARGS__); \
314 ptrdiff_t memb_offset = (const uint8_t *)&(pbase->vtable)->fn_name - (const uint8_t *)pbase->vtable; \
315 if (memb_offset + sizeof((pbase->vtable)->fn_name) > (pbase->vtable)->vt_size || \
316 !(pbase->vtable)->fn_name) { \
317 aws_raise_error(AWS_ERROR_UNIMPLEMENTED); \
318 } else { \
319 (pbase->vtable)->fn_name(__VA_ARGS__); \
320 } \
321 } while (0)
322
326AWS_CRYPTOSDK_STATIC_INLINE bool aws_cryptosdk_private_refcount_down(struct aws_atomic_var *refcount) {
327 /*
328 * Memory ordering note: We must use release_acquire memory order here. Otherwise, we have the following race:
329 *
330 * Program order:
331 *
332 * Thread A:
333 * Release(obj) [if down() { free(obj) } ]
334 *
335 * Thread B:
336 * obj->foo = 1;
337 * Release(obj)
338 *
339 * Execution order:
340 *
341 * Thread B: down() -> false
342 * Thread A: down() -> true
343 * Thread A: free(obj)
344 * Thread B: obj->foo = 1
345 *
346 * To prevent this we use release_acquire order. The release forbids any memory accesses sequenced-before the
347 * atomic decrement of down() from being reordered later. This prevents thread B from reordering the obj->foo
348 * access to come after the down(). The acquire ensures that the atomic decrements of down() calls correctly
349 * synchronize-with one-another.
350 */
351 size_t old_count = aws_atomic_fetch_sub_explicit(refcount, 1, aws_memory_order_acq_rel);
352
353 assert(old_count != 0);
354
355 return old_count == 1;
356}
357
361AWS_CRYPTOSDK_STATIC_INLINE void aws_cryptosdk_private_refcount_up(struct aws_atomic_var *refcount) {
362 /*
363 * Memory ordering note: It is safe to use relaxed here. As an invariant, we assume that,
364 * on entry, the thread has some guarantee that the refcount will not reach zero until after
365 * refcount_up completes. As long as this guarantee is maintained until the next release barrier,
366 * there is no problem; if we down() on the current thread, we achieve this explicitly. Otherwise,
367 * if we communicate to some other thread that it is safe to release the reference, that communication
368 * needs to be in release order, as it's effectively a proxy down() call, for the same reasons outlined
369 * above in refcount_down().
370 *
371 * Since we've established that our initial reference won't be released until a release barrier
372 * occurs, we are happy to let the increment be deferred until that barrier occurs. We're also
373 * perfectly happy with a refcount increment happening logically earlier than expected, since this
374 * won't cause the object to be freed unexpectedly.
375 *
376 * We also note that acquire order is not required: We know that the object itself is already valid
377 * when we enter refcount_up - that is, refcount_up does not change the internal state of the object.
378 * Therefore, it's okay if some code accesses the logical state of the object "before" the refcount
379 * increment, so long as the object is not actually freed.
380 */
381 size_t old_count = aws_atomic_fetch_add_explicit(refcount, 1, aws_memory_order_relaxed);
382
383 assert(old_count != 0 && old_count != SIZE_MAX);
384
385 // Suppress unused variable warning when NDEBUG is set
386 (void)old_count;
387}
388#endif // AWS_CRYPTOSDK_DOXYGEN
389
398 size_t vt_size;
402 const char *name;
407 void (*destroy)(struct aws_cryptosdk_cmm *cmm);
408
413 struct aws_cryptosdk_cmm *cmm,
414 struct aws_cryptosdk_enc_materials **output,
415 struct aws_cryptosdk_enc_request *request);
420 struct aws_cryptosdk_cmm *cmm,
421 struct aws_cryptosdk_dec_materials **output,
422 struct aws_cryptosdk_dec_request *request);
423};
424
428AWS_CRYPTOSDK_STATIC_INLINE bool aws_atomic_var_is_valid_int(const struct aws_atomic_var *var) {
429 return AWS_MEM_IS_WRITABLE(var, sizeof(size_t));
430}
431
435AWS_CRYPTOSDK_STATIC_INLINE bool aws_atomic_var_is_valid_ptr(const struct aws_atomic_var *var) {
436 return AWS_OBJECT_PTR_IS_WRITABLE(var) && AWS_OBJECT_PTR_IS_WRITABLE((size_t *)aws_atomic_load_ptr(var));
437}
438
442AWS_CRYPTOSDK_STATIC_INLINE bool aws_cryptosdk_cmm_vtable_is_valid(const struct aws_cryptosdk_cmm_vt *vtable) {
443 return AWS_OBJECT_PTR_IS_READABLE(vtable) && vtable->vt_size == sizeof(struct aws_cryptosdk_cmm_vt) &&
444 aws_c_string_is_valid(vtable->name);
445}
446
451AWS_CRYPTOSDK_STATIC_INLINE bool aws_cryptosdk_cmm_base_is_valid(const struct aws_cryptosdk_cmm *cmm) {
452 return AWS_OBJECT_PTR_IS_WRITABLE(cmm) && aws_atomic_var_is_valid_int(&cmm->refcount) &&
453 aws_atomic_load_int(&cmm->refcount) > 0 && aws_atomic_load_int(&cmm->refcount) <= SIZE_MAX &&
455}
456
461AWS_CRYPTOSDK_STATIC_INLINE void aws_cryptosdk_cmm_base_init(
462 struct aws_cryptosdk_cmm *cmm, const struct aws_cryptosdk_cmm_vt *vtable) {
463 AWS_PRECONDITION(AWS_OBJECT_PTR_IS_WRITABLE(cmm));
464 AWS_PRECONDITION(aws_cryptosdk_cmm_vtable_is_valid(vtable));
465 cmm->vtable = vtable;
466 aws_atomic_init_int(&cmm->refcount, 1);
467 AWS_POSTCONDITION(aws_cryptosdk_cmm_base_is_valid(cmm));
468}
469
474AWS_CRYPTOSDK_STATIC_INLINE void aws_cryptosdk_cmm_release(struct aws_cryptosdk_cmm *cmm) {
475 AWS_PRECONDITION(!cmm || aws_cryptosdk_cmm_base_is_valid(cmm));
476 if (cmm && aws_cryptosdk_private_refcount_down(&cmm->refcount)) {
477 AWS_CRYPTOSDK_PRIVATE_VF_CALL_NO_RETURN(destroy, cmm);
478 }
479}
480
485AWS_CRYPTOSDK_STATIC_INLINE struct aws_cryptosdk_cmm *aws_cryptosdk_cmm_retain(struct aws_cryptosdk_cmm *cmm) {
486 AWS_PRECONDITION(aws_cryptosdk_cmm_base_is_valid(cmm));
487 AWS_PRECONDITION(aws_atomic_load_int(&cmm->refcount) < SIZE_MAX);
488 aws_cryptosdk_private_refcount_up(&cmm->refcount);
489 AWS_POSTCONDITION(aws_cryptosdk_cmm_base_is_valid(cmm));
490 return cmm;
491}
492
503AWS_CRYPTOSDK_STATIC_INLINE int aws_cryptosdk_cmm_generate_enc_materials(
504 struct aws_cryptosdk_cmm *cmm,
505 struct aws_cryptosdk_enc_materials **output,
506 struct aws_cryptosdk_enc_request *request) {
507 if (output) {
508 *output = NULL;
509 }
510 AWS_ERROR_PRECONDITION(aws_cryptosdk_cmm_base_is_valid(cmm), AWS_ERROR_UNIMPLEMENTED);
511 AWS_ERROR_PRECONDITION(output == NULL || AWS_OBJECT_PTR_IS_WRITABLE(output));
512 AWS_ERROR_PRECONDITION(request == NULL || aws_cryptosdk_enc_request_is_valid(request));
513 AWS_CRYPTOSDK_PRIVATE_VF_CALL(generate_enc_materials, cmm, output, request);
514 return ret;
515}
516
526AWS_CRYPTOSDK_STATIC_INLINE int aws_cryptosdk_cmm_decrypt_materials(
527 struct aws_cryptosdk_cmm *cmm,
528 struct aws_cryptosdk_dec_materials **output,
529 struct aws_cryptosdk_dec_request *request) {
530 if (output) {
531 *output = NULL;
532 }
533 AWS_ERROR_PRECONDITION(aws_cryptosdk_cmm_base_is_valid(cmm), AWS_ERROR_UNIMPLEMENTED);
534 AWS_ERROR_PRECONDITION(output == NULL || AWS_OBJECT_PTR_IS_WRITABLE(output));
535 AWS_ERROR_PRECONDITION(request == NULL || aws_cryptosdk_dec_request_is_valid(request));
536
537 AWS_CRYPTOSDK_PRIVATE_VF_CALL(decrypt_materials, cmm, output, request);
538 return ret;
539}
540
545 size_t vt_size;
549 const char *name;
554 void (*destroy)(struct aws_cryptosdk_keyring *keyring);
555
566 struct aws_cryptosdk_keyring *keyring,
567 struct aws_allocator *request_alloc,
568 struct aws_byte_buf *unencrypted_data_key,
569 struct aws_array_list *keyring_trace,
570 struct aws_array_list *edks,
571 const struct aws_hash_table *enc_ctx,
572 enum aws_cryptosdk_alg_id alg);
573
583 struct aws_cryptosdk_keyring *keyring,
584 struct aws_allocator *request_alloc,
585 struct aws_byte_buf *unencrypted_data_key,
586 struct aws_array_list *keyring_trace,
587 const struct aws_array_list *edks,
588 const struct aws_hash_table *enc_ctx,
589 enum aws_cryptosdk_alg_id alg);
590};
591
595AWS_CRYPTOSDK_STATIC_INLINE bool aws_cryptosdk_keyring_vt_is_valid(const struct aws_cryptosdk_keyring_vt *vtable) {
596 return AWS_OBJECT_PTR_IS_READABLE(vtable) && aws_c_string_is_valid(vtable->name) &&
597 /* Always set to sizeof(struct aws_cryptosdk_keyring_vt). */
598 (vtable->vt_size == sizeof(struct aws_cryptosdk_keyring_vt));
599}
600
604AWS_CRYPTOSDK_STATIC_INLINE bool aws_cryptosdk_keyring_is_valid(const struct aws_cryptosdk_keyring *keyring) {
605 return AWS_OBJECT_PTR_IS_READABLE(keyring) && aws_atomic_var_is_valid_int(&keyring->refcount) &&
606 (aws_atomic_load_int(&keyring->refcount) > 0) && (aws_atomic_load_int(&keyring->refcount) <= SIZE_MAX) &&
607 (keyring->vtable == NULL || aws_cryptosdk_keyring_vt_is_valid(keyring->vtable));
608}
609
614AWS_CRYPTOSDK_STATIC_INLINE void aws_cryptosdk_keyring_base_init(
615 struct aws_cryptosdk_keyring *keyring, const struct aws_cryptosdk_keyring_vt *vtable) {
616 AWS_PRECONDITION(keyring != NULL);
617 AWS_PRECONDITION(vtable == NULL || aws_cryptosdk_keyring_vt_is_valid(vtable));
618 AWS_PRECONDITION(vtable == NULL || aws_c_string_is_valid(vtable->name));
619 keyring->vtable = vtable;
620 aws_atomic_init_int(&keyring->refcount, 1);
621}
622
627AWS_CRYPTOSDK_STATIC_INLINE void aws_cryptosdk_keyring_release(struct aws_cryptosdk_keyring *keyring) {
628 AWS_PRECONDITION(!keyring || (aws_cryptosdk_keyring_is_valid(keyring) && keyring->vtable != NULL));
629 if (keyring && aws_cryptosdk_private_refcount_down(&keyring->refcount)) {
630 AWS_CRYPTOSDK_PRIVATE_VF_CALL_NO_RETURN(destroy, keyring);
631 }
632}
633
638AWS_CRYPTOSDK_STATIC_INLINE struct aws_cryptosdk_keyring *aws_cryptosdk_keyring_retain(
639 struct aws_cryptosdk_keyring *keyring) {
640 AWS_PRECONDITION(aws_cryptosdk_keyring_is_valid(keyring));
641 AWS_PRECONDITION(aws_atomic_var_is_valid_int(&keyring->refcount));
642 AWS_PRECONDITION(aws_atomic_load_int(&keyring->refcount) < SIZE_MAX);
643 aws_cryptosdk_private_refcount_up(&keyring->refcount);
644 return keyring;
645}
646
663AWS_CRYPTOSDK_API
665 struct aws_cryptosdk_keyring *keyring,
666 struct aws_allocator *request_alloc,
667 struct aws_byte_buf *unencrypted_data_key,
668 struct aws_array_list *keyring_trace,
669 struct aws_array_list *edks,
670 const struct aws_hash_table *enc_ctx,
671 enum aws_cryptosdk_alg_id alg);
672
685AWS_CRYPTOSDK_API
687 struct aws_cryptosdk_keyring *keyring,
688 struct aws_allocator *request_alloc,
689 struct aws_byte_buf *unencrypted_data_key,
690 struct aws_array_list *keyring_trace,
691 const struct aws_array_list *edks,
692 const struct aws_hash_table *enc_ctx,
693 enum aws_cryptosdk_alg_id alg);
694
702AWS_CRYPTOSDK_API
704 struct aws_allocator *alloc, enum aws_cryptosdk_alg_id alg);
705
712AWS_CRYPTOSDK_API
714
722AWS_CRYPTOSDK_API
724 struct aws_allocator *alloc, enum aws_cryptosdk_alg_id alg);
725
731AWS_CRYPTOSDK_API
733
737AWS_CRYPTOSDK_STATIC_INLINE bool aws_cryptosdk_commitment_policy_is_valid(uint32_t commitment_policy) {
738 switch (commitment_policy) {
742 default: return false;
743 }
744}
745
751 enum aws_cryptosdk_commitment_policy commitment_policy) {
752 switch (commitment_policy) {
756 default: return false;
757 }
758}
759
760#ifdef __cplusplus
761}
762#endif
763 // doxygen group cmm_kr_lowlevel
765
766#endif // AWS_CRYPTOSDK_MATERIALS_H
struct aws_cryptosdk_cmm * aws_cryptosdk_cmm_retain(struct aws_cryptosdk_cmm *cmm)
Definition materials.h:485
struct aws_cryptosdk_keyring * aws_cryptosdk_keyring_retain(struct aws_cryptosdk_keyring *keyring)
Definition materials.h:638
void aws_cryptosdk_keyring_release(struct aws_cryptosdk_keyring *keyring)
Definition materials.h:627
void aws_cryptosdk_cmm_release(struct aws_cryptosdk_cmm *cmm)
Definition materials.h:474
int aws_cryptosdk_keyring_on_encrypt(struct aws_cryptosdk_keyring *keyring, struct aws_allocator *request_alloc, struct aws_byte_buf *unencrypted_data_key, struct aws_array_list *keyring_trace, struct aws_array_list *edks, const struct aws_hash_table *enc_ctx, enum aws_cryptosdk_alg_id alg)
int aws_cryptosdk_cmm_generate_enc_materials(struct aws_cryptosdk_cmm *cmm, struct aws_cryptosdk_enc_materials **output, struct aws_cryptosdk_enc_request *request)
Definition materials.h:503
int aws_cryptosdk_cmm_decrypt_materials(struct aws_cryptosdk_cmm *cmm, struct aws_cryptosdk_dec_materials **output, struct aws_cryptosdk_dec_request *request)
Definition materials.h:526
int aws_cryptosdk_keyring_on_decrypt(struct aws_cryptosdk_keyring *keyring, struct aws_allocator *request_alloc, struct aws_byte_buf *unencrypted_data_key, struct aws_array_list *keyring_trace, const struct aws_array_list *edks, const struct aws_hash_table *enc_ctx, enum aws_cryptosdk_alg_id alg)
aws_cryptosdk_commitment_policy
Definition materials.h:105
bool aws_cryptosdk_cmm_vtable_is_valid(const struct aws_cryptosdk_cmm_vt *vtable)
Definition materials.h:442
bool aws_cryptosdk_edk_list_is_valid(const struct aws_array_list *edk_list)
bool aws_cryptosdk_commitment_policy_encrypt_must_include_commitment(enum aws_cryptosdk_commitment_policy commitment_policy)
Definition materials.h:750
bool aws_cryptosdk_enc_request_is_valid(const struct aws_cryptosdk_enc_request *request)
Definition materials.h:176
bool aws_atomic_var_is_valid_ptr(const struct aws_atomic_var *var)
Definition materials.h:435
bool aws_cryptosdk_enc_materials_is_valid(const struct aws_cryptosdk_enc_materials *materials)
Definition materials.h:238
void aws_cryptosdk_cmm_base_init(struct aws_cryptosdk_cmm *cmm, const struct aws_cryptosdk_cmm_vt *vtable)
Definition materials.h:461
bool aws_cryptosdk_cmm_base_is_valid(const struct aws_cryptosdk_cmm *cmm)
Definition materials.h:451
bool aws_cryptosdk_dec_materials_is_valid(const struct aws_cryptosdk_dec_materials *materials)
Definition materials.h:252
void aws_cryptosdk_dec_materials_destroy(struct aws_cryptosdk_dec_materials *dec_mat)
bool aws_cryptosdk_keyring_vt_is_valid(const struct aws_cryptosdk_keyring_vt *vtable)
Definition materials.h:595
void aws_cryptosdk_keyring_base_init(struct aws_cryptosdk_keyring *keyring, const struct aws_cryptosdk_keyring_vt *vtable)
Definition materials.h:614
bool aws_cryptosdk_dec_request_is_valid(const struct aws_cryptosdk_dec_request *request)
Definition materials.h:220
struct aws_cryptosdk_enc_materials * aws_cryptosdk_enc_materials_new(struct aws_allocator *alloc, enum aws_cryptosdk_alg_id alg)
bool aws_cryptosdk_keyring_is_valid(const struct aws_cryptosdk_keyring *keyring)
Definition materials.h:604
void aws_cryptosdk_enc_materials_destroy(struct aws_cryptosdk_enc_materials *enc_mat)
bool aws_atomic_var_is_valid_int(const struct aws_atomic_var *var)
Definition materials.h:428
struct aws_cryptosdk_dec_materials * aws_cryptosdk_dec_materials_new(struct aws_allocator *alloc, enum aws_cryptosdk_alg_id alg)
bool aws_cryptosdk_commitment_policy_is_valid(uint32_t commitment_policy)
Definition materials.h:737
@ COMMITMENT_POLICY_REQUIRE_ENCRYPT_REQUIRE_DECRYPT
Definition materials.h:111
@ COMMITMENT_POLICY_REQUIRE_ENCRYPT_ALLOW_DECRYPT
Definition materials.h:118
@ COMMITMENT_POLICY_FORBID_ENCRYPT_ALLOW_DECRYPT
Definition materials.h:125
bool aws_cryptosdk_sig_ctx_is_valid(const struct aws_cryptosdk_sig_ctx *sig_ctx)
aws_cryptosdk_alg_id
Definition header.h:26
bool aws_cryptosdk_keyring_trace_is_valid(const struct aws_array_list *trace)
int(* generate_enc_materials)(struct aws_cryptosdk_cmm *cmm, struct aws_cryptosdk_enc_materials **output, struct aws_cryptosdk_enc_request *request)
Definition materials.h:412
int(* decrypt_materials)(struct aws_cryptosdk_cmm *cmm, struct aws_cryptosdk_dec_materials **output, struct aws_cryptosdk_dec_request *request)
Definition materials.h:419
const char * name
Definition materials.h:402
void(* destroy)(struct aws_cryptosdk_cmm *cmm)
Definition materials.h:407
struct aws_atomic_var refcount
Definition materials.h:84
const struct aws_cryptosdk_cmm_vt * vtable
Definition materials.h:85
struct aws_allocator * alloc
Definition materials.h:229
enum aws_cryptosdk_alg_id alg
Definition materials.h:235
struct aws_byte_buf unencrypted_data_key
Definition materials.h:230
struct aws_array_list keyring_trace
Definition materials.h:232
struct aws_cryptosdk_sig_ctx * signctx
Definition materials.h:234
enum aws_cryptosdk_alg_id alg
Definition materials.h:217
struct aws_array_list encrypted_data_keys
Definition materials.h:216
const struct aws_hash_table * enc_ctx
Definition materials.h:215
struct aws_allocator * alloc
Definition materials.h:199
struct aws_array_list encrypted_data_keys
Definition materials.h:189
struct aws_cryptosdk_sig_ctx * signctx
Definition materials.h:191
struct aws_array_list keyring_trace
Definition materials.h:187
struct aws_byte_buf unencrypted_data_key
Definition materials.h:185
struct aws_allocator * alloc
Definition materials.h:184
enum aws_cryptosdk_alg_id alg
Definition materials.h:192
struct aws_allocator * alloc
Definition materials.h:134
struct aws_hash_table * enc_ctx
Definition materials.h:150
enum aws_cryptosdk_commitment_policy commitment_policy
Definition materials.h:173
enum aws_cryptosdk_alg_id requested_alg
Definition materials.h:158
int(* on_decrypt)(struct aws_cryptosdk_keyring *keyring, struct aws_allocator *request_alloc, struct aws_byte_buf *unencrypted_data_key, struct aws_array_list *keyring_trace, const struct aws_array_list *edks, const struct aws_hash_table *enc_ctx, enum aws_cryptosdk_alg_id alg)
Definition materials.h:582
void(* destroy)(struct aws_cryptosdk_keyring *keyring)
Definition materials.h:554
int(* on_encrypt)(struct aws_cryptosdk_keyring *keyring, struct aws_allocator *request_alloc, struct aws_byte_buf *unencrypted_data_key, struct aws_array_list *keyring_trace, struct aws_array_list *edks, const struct aws_hash_table *enc_ctx, enum aws_cryptosdk_alg_id alg)
Definition materials.h:565
struct aws_atomic_var refcount
Definition materials.h:97
const struct aws_cryptosdk_keyring_vt * vtable
Definition materials.h:98