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
165
166AWS_CRYPTOSDK_STATIC_INLINE bool aws_cryptosdk_enc_request_is_valid(const struct aws_cryptosdk_enc_request *request) {
167 return request && aws_allocator_is_valid(request->alloc) && aws_hash_table_is_valid(request->enc_ctx);
168}
169
174 struct aws_allocator *alloc;
175 struct aws_byte_buf unencrypted_data_key;
177 struct aws_array_list keyring_trace;
179 struct aws_array_list encrypted_data_keys;
181 struct aws_cryptosdk_sig_ctx *signctx;
183};
184
189 struct aws_allocator *alloc;
190 const struct aws_hash_table *enc_ctx;
191 struct aws_array_list encrypted_data_keys;
193};
194
195AWS_CRYPTOSDK_STATIC_INLINE bool aws_cryptosdk_dec_request_is_valid(const struct aws_cryptosdk_dec_request *request) {
196 return request && aws_allocator_is_valid(request->alloc) &&
197 aws_cryptosdk_edk_list_is_valid(&request->encrypted_data_keys) && aws_hash_table_is_valid(request->enc_ctx);
198}
199
204 struct aws_allocator *alloc;
205 struct aws_byte_buf unencrypted_data_key;
207 struct aws_array_list keyring_trace;
209 struct aws_cryptosdk_sig_ctx *signctx;
211};
212
213AWS_CRYPTOSDK_STATIC_INLINE bool aws_cryptosdk_enc_materials_is_valid(
214 const struct aws_cryptosdk_enc_materials *materials) {
215 if (!AWS_OBJECT_PTR_IS_WRITABLE(materials)) {
216 return false;
217 }
218 bool allocator_valid = aws_allocator_is_valid(materials->alloc);
219 bool unencrypted_data_key_valid = aws_byte_buf_is_valid(&materials->unencrypted_data_key);
220 bool keyring_trace_valid = aws_cryptosdk_keyring_trace_is_valid(&materials->keyring_trace);
221 bool encrypted_data_keys_valid = aws_cryptosdk_edk_list_is_valid(&materials->encrypted_data_keys);
222 bool signctx_valid = (materials->signctx == NULL) || aws_cryptosdk_sig_ctx_is_valid(materials->signctx);
223 return allocator_valid && unencrypted_data_key_valid && keyring_trace_valid && encrypted_data_keys_valid &&
224 signctx_valid;
225}
226
227AWS_CRYPTOSDK_STATIC_INLINE bool aws_cryptosdk_dec_materials_is_valid(
228 const struct aws_cryptosdk_dec_materials *materials) {
229 if (!AWS_OBJECT_PTR_IS_WRITABLE(materials)) {
230 return false;
231 }
232 bool allocator_valid = aws_allocator_is_valid(materials->alloc);
233 bool unencrypted_data_key_valid = aws_byte_buf_is_valid(&materials->unencrypted_data_key);
234 bool keyring_trace_valid = aws_cryptosdk_keyring_trace_is_valid(&materials->keyring_trace);
235 bool signctx_valid = (materials->signctx == NULL) || aws_cryptosdk_sig_ctx_is_valid(materials->signctx);
236 return allocator_valid && unencrypted_data_key_valid && keyring_trace_valid && signctx_valid;
237}
238
239#ifndef AWS_CRYPTOSDK_DOXYGEN /* do not document internal macros */
240
241/*
242 * C99 standard dictates that "..." must have at least one argument behind it. Second arg of
243 * _VF_CALL macros is always struct type, i.e., "cmm" or "keyring". These helper macros allow
244 * us not to make struct_type a named argument, thus handling the case cleanly where there
245 * are no more arguments.
246 *
247 * Note: We work around a VC++ preprocessor bug here. See https://stackoverflow.com/a/4750720
248 */
249# define AWS_CRYPTOSDK_PRIVATE_STRUCT_NAME(...) AWS_CRYPTOSDK_PRIVATE_STRUCT_NAME_2((__VA_ARGS__, throwaway))
250# define AWS_CRYPTOSDK_PRIVATE_STRUCT_NAME_2(args) AWS_CRYPTOSDK_PRIVATE_STRUCT_NAME_3 args
251# define AWS_CRYPTOSDK_PRIVATE_STRUCT_NAME_3(struct_type, ...) struct_type
252
253# define AWS_CRYPTOSDK_PRIVATE_BASE_TYPE(...) AWS_CRYPTOSDK_PRIVATE_BASE_TYPE_2((__VA_ARGS__, throwaway))
254# define AWS_CRYPTOSDK_PRIVATE_BASE_TYPE_2(args) AWS_CRYPTOSDK_PRIVATE_BASE_TYPE_3 args
255# define AWS_CRYPTOSDK_PRIVATE_BASE_TYPE_3(struct_type, ...) const struct aws_cryptosdk_##struct_type
256
267# define AWS_CRYPTOSDK_PRIVATE_VF_CALL(fn_name, ...) \
268 int ret; \
269 do { \
270 AWS_CRYPTOSDK_PRIVATE_BASE_TYPE(__VA_ARGS__) *pbase = \
271 (AWS_CRYPTOSDK_PRIVATE_BASE_TYPE(__VA_ARGS__) *)AWS_CRYPTOSDK_PRIVATE_STRUCT_NAME(__VA_ARGS__); \
272 ptrdiff_t memb_offset = (const uint8_t *)&(pbase->vtable)->fn_name - (const uint8_t *)pbase->vtable; \
273 if (memb_offset + sizeof((pbase->vtable)->fn_name) > (pbase->vtable)->vt_size || \
274 !(pbase->vtable)->fn_name) { \
275 return aws_raise_error(AWS_ERROR_UNIMPLEMENTED); \
276 } \
277 ret = (pbase->vtable)->fn_name(__VA_ARGS__); \
278 } while (0)
279
285# define AWS_CRYPTOSDK_PRIVATE_VF_CALL_NO_RETURN(fn_name, ...) \
286 do { \
287 AWS_CRYPTOSDK_PRIVATE_BASE_TYPE(__VA_ARGS__) *pbase = \
288 (AWS_CRYPTOSDK_PRIVATE_BASE_TYPE(__VA_ARGS__) *)AWS_CRYPTOSDK_PRIVATE_STRUCT_NAME(__VA_ARGS__); \
289 ptrdiff_t memb_offset = (const uint8_t *)&(pbase->vtable)->fn_name - (const uint8_t *)pbase->vtable; \
290 if (memb_offset + sizeof((pbase->vtable)->fn_name) > (pbase->vtable)->vt_size || \
291 !(pbase->vtable)->fn_name) { \
292 aws_raise_error(AWS_ERROR_UNIMPLEMENTED); \
293 } else { \
294 (pbase->vtable)->fn_name(__VA_ARGS__); \
295 } \
296 } while (0)
297
301AWS_CRYPTOSDK_STATIC_INLINE bool aws_cryptosdk_private_refcount_down(struct aws_atomic_var *refcount) {
302 /*
303 * Memory ordering note: We must use release_acquire memory order here. Otherwise, we have the following race:
304 *
305 * Program order:
306 *
307 * Thread A:
308 * Release(obj) [if down() { free(obj) } ]
309 *
310 * Thread B:
311 * obj->foo = 1;
312 * Release(obj)
313 *
314 * Execution order:
315 *
316 * Thread B: down() -> false
317 * Thread A: down() -> true
318 * Thread A: free(obj)
319 * Thread B: obj->foo = 1
320 *
321 * To prevent this we use release_acquire order. The release forbids any memory accesses sequenced-before the
322 * atomic decrement of down() from being reordered later. This prevents thread B from reordering the obj->foo
323 * access to come after the down(). The acquire ensures that the atomic decrements of down() calls correctly
324 * synchronize-with one-another.
325 */
326 size_t old_count = aws_atomic_fetch_sub_explicit(refcount, 1, aws_memory_order_acq_rel);
327
328 assert(old_count != 0);
329
330 return old_count == 1;
331}
332
336AWS_CRYPTOSDK_STATIC_INLINE void aws_cryptosdk_private_refcount_up(struct aws_atomic_var *refcount) {
337 /*
338 * Memory ordering note: It is safe to use relaxed here. As an invariant, we assume that,
339 * on entry, the thread has some guarantee that the refcount will not reach zero until after
340 * refcount_up completes. As long as this guarantee is maintained until the next release barrier,
341 * there is no problem; if we down() on the current thread, we achieve this explicitly. Otherwise,
342 * if we communicate to some other thread that it is safe to release the reference, that communication
343 * needs to be in release order, as it's effectively a proxy down() call, for the same reasons outlined
344 * above in refcount_down().
345 *
346 * Since we've established that our initial reference won't be released until a release barrier
347 * occurs, we are happy to let the increment be deferred until that barrier occurs. We're also
348 * perfectly happy with a refcount increment happening logically earlier than expected, since this
349 * won't cause the object to be freed unexpectedly.
350 *
351 * We also note that acquire order is not required: We know that the object itself is already valid
352 * when we enter refcount_up - that is, refcount_up does not change the internal state of the object.
353 * Therefore, it's okay if some code accesses the logical state of the object "before" the refcount
354 * increment, so long as the object is not actually freed.
355 */
356 size_t old_count = aws_atomic_fetch_add_explicit(refcount, 1, aws_memory_order_relaxed);
357
358 assert(old_count != 0 && old_count != SIZE_MAX);
359
360 // Suppress unused variable warning when NDEBUG is set
361 (void)old_count;
362}
363#endif // AWS_CRYPTOSDK_DOXYGEN
364
373 size_t vt_size;
377 const char *name;
382 void (*destroy)(struct aws_cryptosdk_cmm *cmm);
383
388 struct aws_cryptosdk_cmm *cmm,
389 struct aws_cryptosdk_enc_materials **output,
390 struct aws_cryptosdk_enc_request *request);
395 struct aws_cryptosdk_cmm *cmm,
396 struct aws_cryptosdk_dec_materials **output,
397 struct aws_cryptosdk_dec_request *request);
398};
399
403AWS_CRYPTOSDK_STATIC_INLINE bool aws_atomic_var_is_valid_int(const struct aws_atomic_var *var) {
404 return AWS_MEM_IS_WRITABLE(var, sizeof(size_t));
405}
406
410AWS_CRYPTOSDK_STATIC_INLINE bool aws_atomic_var_is_valid_ptr(const struct aws_atomic_var *var) {
411 return AWS_OBJECT_PTR_IS_WRITABLE(var) && AWS_OBJECT_PTR_IS_WRITABLE((size_t *)aws_atomic_load_ptr(var));
412}
413
417AWS_CRYPTOSDK_STATIC_INLINE bool aws_cryptosdk_cmm_vtable_is_valid(const struct aws_cryptosdk_cmm_vt *vtable) {
418 return AWS_OBJECT_PTR_IS_READABLE(vtable) && vtable->vt_size == sizeof(struct aws_cryptosdk_cmm_vt) &&
419 aws_c_string_is_valid(vtable->name);
420}
421
426AWS_CRYPTOSDK_STATIC_INLINE bool aws_cryptosdk_cmm_base_is_valid(const struct aws_cryptosdk_cmm *cmm) {
427 return AWS_OBJECT_PTR_IS_WRITABLE(cmm) && aws_atomic_var_is_valid_int(&cmm->refcount) &&
428 aws_atomic_load_int(&cmm->refcount) > 0 && aws_atomic_load_int(&cmm->refcount) <= SIZE_MAX &&
430}
431
436AWS_CRYPTOSDK_STATIC_INLINE void aws_cryptosdk_cmm_base_init(
437 struct aws_cryptosdk_cmm *cmm, const struct aws_cryptosdk_cmm_vt *vtable) {
438 AWS_PRECONDITION(AWS_OBJECT_PTR_IS_WRITABLE(cmm));
439 AWS_PRECONDITION(aws_cryptosdk_cmm_vtable_is_valid(vtable));
440 cmm->vtable = vtable;
441 aws_atomic_init_int(&cmm->refcount, 1);
442 AWS_POSTCONDITION(aws_cryptosdk_cmm_base_is_valid(cmm));
443}
444
449AWS_CRYPTOSDK_STATIC_INLINE void aws_cryptosdk_cmm_release(struct aws_cryptosdk_cmm *cmm) {
450 AWS_PRECONDITION(!cmm || aws_cryptosdk_cmm_base_is_valid(cmm));
451 if (cmm && aws_cryptosdk_private_refcount_down(&cmm->refcount)) {
452 AWS_CRYPTOSDK_PRIVATE_VF_CALL_NO_RETURN(destroy, cmm);
453 }
454}
455
460AWS_CRYPTOSDK_STATIC_INLINE struct aws_cryptosdk_cmm *aws_cryptosdk_cmm_retain(struct aws_cryptosdk_cmm *cmm) {
461 AWS_PRECONDITION(aws_cryptosdk_cmm_base_is_valid(cmm));
462 AWS_PRECONDITION(aws_atomic_load_int(&cmm->refcount) < SIZE_MAX);
463 aws_cryptosdk_private_refcount_up(&cmm->refcount);
464 AWS_POSTCONDITION(aws_cryptosdk_cmm_base_is_valid(cmm));
465 return cmm;
466}
467
478AWS_CRYPTOSDK_STATIC_INLINE int aws_cryptosdk_cmm_generate_enc_materials(
479 struct aws_cryptosdk_cmm *cmm,
480 struct aws_cryptosdk_enc_materials **output,
481 struct aws_cryptosdk_enc_request *request) {
482 if (output) {
483 *output = NULL;
484 }
485 AWS_ERROR_PRECONDITION(aws_cryptosdk_cmm_base_is_valid(cmm), AWS_ERROR_UNIMPLEMENTED);
486 AWS_ERROR_PRECONDITION(output == NULL || AWS_OBJECT_PTR_IS_WRITABLE(output));
487 AWS_ERROR_PRECONDITION(request == NULL || aws_cryptosdk_enc_request_is_valid(request));
488 AWS_CRYPTOSDK_PRIVATE_VF_CALL(generate_enc_materials, cmm, output, request);
489 return ret;
490}
491
501AWS_CRYPTOSDK_STATIC_INLINE int aws_cryptosdk_cmm_decrypt_materials(
502 struct aws_cryptosdk_cmm *cmm,
503 struct aws_cryptosdk_dec_materials **output,
504 struct aws_cryptosdk_dec_request *request) {
505 if (output) {
506 *output = NULL;
507 }
508 AWS_ERROR_PRECONDITION(aws_cryptosdk_cmm_base_is_valid(cmm), AWS_ERROR_UNIMPLEMENTED);
509 AWS_ERROR_PRECONDITION(output == NULL || AWS_OBJECT_PTR_IS_WRITABLE(output));
510 AWS_ERROR_PRECONDITION(request == NULL || aws_cryptosdk_dec_request_is_valid(request));
511
512 AWS_CRYPTOSDK_PRIVATE_VF_CALL(decrypt_materials, cmm, output, request);
513 return ret;
514}
515
520 size_t vt_size;
524 const char *name;
529 void (*destroy)(struct aws_cryptosdk_keyring *keyring);
530
541 struct aws_cryptosdk_keyring *keyring,
542 struct aws_allocator *request_alloc,
543 struct aws_byte_buf *unencrypted_data_key,
544 struct aws_array_list *keyring_trace,
545 struct aws_array_list *edks,
546 const struct aws_hash_table *enc_ctx,
547 enum aws_cryptosdk_alg_id alg);
548
558 struct aws_cryptosdk_keyring *keyring,
559 struct aws_allocator *request_alloc,
560 struct aws_byte_buf *unencrypted_data_key,
561 struct aws_array_list *keyring_trace,
562 const struct aws_array_list *edks,
563 const struct aws_hash_table *enc_ctx,
564 enum aws_cryptosdk_alg_id alg);
565};
566
570AWS_CRYPTOSDK_STATIC_INLINE bool aws_cryptosdk_keyring_vt_is_valid(const struct aws_cryptosdk_keyring_vt *vtable) {
571 return AWS_OBJECT_PTR_IS_READABLE(vtable) && aws_c_string_is_valid(vtable->name) &&
572 /* Always set to sizeof(struct aws_cryptosdk_keyring_vt). */
573 (vtable->vt_size == sizeof(struct aws_cryptosdk_keyring_vt));
574}
575
579AWS_CRYPTOSDK_STATIC_INLINE bool aws_cryptosdk_keyring_is_valid(const struct aws_cryptosdk_keyring *keyring) {
580 return AWS_OBJECT_PTR_IS_READABLE(keyring) && aws_atomic_var_is_valid_int(&keyring->refcount) &&
581 (aws_atomic_load_int(&keyring->refcount) > 0) && (aws_atomic_load_int(&keyring->refcount) <= SIZE_MAX) &&
582 (keyring->vtable == NULL || aws_cryptosdk_keyring_vt_is_valid(keyring->vtable));
583}
584
589AWS_CRYPTOSDK_STATIC_INLINE void aws_cryptosdk_keyring_base_init(
590 struct aws_cryptosdk_keyring *keyring, const struct aws_cryptosdk_keyring_vt *vtable) {
591 AWS_PRECONDITION(keyring != NULL);
592 AWS_PRECONDITION(vtable == NULL || aws_cryptosdk_keyring_vt_is_valid(vtable));
593 AWS_PRECONDITION(vtable == NULL || aws_c_string_is_valid(vtable->name));
594 keyring->vtable = vtable;
595 aws_atomic_init_int(&keyring->refcount, 1);
596}
597
602AWS_CRYPTOSDK_STATIC_INLINE void aws_cryptosdk_keyring_release(struct aws_cryptosdk_keyring *keyring) {
603 AWS_PRECONDITION(!keyring || (aws_cryptosdk_keyring_is_valid(keyring) && keyring->vtable != NULL));
604 if (keyring && aws_cryptosdk_private_refcount_down(&keyring->refcount)) {
605 AWS_CRYPTOSDK_PRIVATE_VF_CALL_NO_RETURN(destroy, keyring);
606 }
607}
608
613AWS_CRYPTOSDK_STATIC_INLINE struct aws_cryptosdk_keyring *aws_cryptosdk_keyring_retain(
614 struct aws_cryptosdk_keyring *keyring) {
615 AWS_PRECONDITION(aws_cryptosdk_keyring_is_valid(keyring));
616 AWS_PRECONDITION(aws_atomic_var_is_valid_int(&keyring->refcount));
617 AWS_PRECONDITION(aws_atomic_load_int(&keyring->refcount) < SIZE_MAX);
618 aws_cryptosdk_private_refcount_up(&keyring->refcount);
619 return keyring;
620}
621
638AWS_CRYPTOSDK_API
640 struct aws_cryptosdk_keyring *keyring,
641 struct aws_allocator *request_alloc,
642 struct aws_byte_buf *unencrypted_data_key,
643 struct aws_array_list *keyring_trace,
644 struct aws_array_list *edks,
645 const struct aws_hash_table *enc_ctx,
646 enum aws_cryptosdk_alg_id alg);
647
660AWS_CRYPTOSDK_API
662 struct aws_cryptosdk_keyring *keyring,
663 struct aws_allocator *request_alloc,
664 struct aws_byte_buf *unencrypted_data_key,
665 struct aws_array_list *keyring_trace,
666 const struct aws_array_list *edks,
667 const struct aws_hash_table *enc_ctx,
668 enum aws_cryptosdk_alg_id alg);
669
677AWS_CRYPTOSDK_API
679 struct aws_allocator *alloc, enum aws_cryptosdk_alg_id alg);
680
687AWS_CRYPTOSDK_API
689
697AWS_CRYPTOSDK_API
699 struct aws_allocator *alloc, enum aws_cryptosdk_alg_id alg);
700
706AWS_CRYPTOSDK_API
708
712AWS_CRYPTOSDK_STATIC_INLINE bool aws_cryptosdk_commitment_policy_is_valid(uint32_t commitment_policy) {
713 switch (commitment_policy) {
717 default: return false;
718 }
719}
720
726 enum aws_cryptosdk_commitment_policy commitment_policy) {
727 switch (commitment_policy) {
731 default: return false;
732 }
733}
734
735#ifdef __cplusplus
736}
737#endif
738 // doxygen group cmm_kr_lowlevel
740
741#endif // AWS_CRYPTOSDK_MATERIALS_H
struct aws_cryptosdk_cmm * aws_cryptosdk_cmm_retain(struct aws_cryptosdk_cmm *cmm)
Definition materials.h:460
struct aws_cryptosdk_keyring * aws_cryptosdk_keyring_retain(struct aws_cryptosdk_keyring *keyring)
Definition materials.h:613
void aws_cryptosdk_keyring_release(struct aws_cryptosdk_keyring *keyring)
Definition materials.h:602
void aws_cryptosdk_cmm_release(struct aws_cryptosdk_cmm *cmm)
Definition materials.h:449
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:478
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:501
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:417
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:725
bool aws_cryptosdk_enc_request_is_valid(const struct aws_cryptosdk_enc_request *request)
Definition materials.h:166
bool aws_atomic_var_is_valid_ptr(const struct aws_atomic_var *var)
Definition materials.h:410
bool aws_cryptosdk_enc_materials_is_valid(const struct aws_cryptosdk_enc_materials *materials)
Definition materials.h:213
void aws_cryptosdk_cmm_base_init(struct aws_cryptosdk_cmm *cmm, const struct aws_cryptosdk_cmm_vt *vtable)
Definition materials.h:436
bool aws_cryptosdk_cmm_base_is_valid(const struct aws_cryptosdk_cmm *cmm)
Definition materials.h:426
bool aws_cryptosdk_dec_materials_is_valid(const struct aws_cryptosdk_dec_materials *materials)
Definition materials.h:227
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:570
void aws_cryptosdk_keyring_base_init(struct aws_cryptosdk_keyring *keyring, const struct aws_cryptosdk_keyring_vt *vtable)
Definition materials.h:589
bool aws_cryptosdk_dec_request_is_valid(const struct aws_cryptosdk_dec_request *request)
Definition materials.h:195
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:579
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:403
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:712
@ 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:387
int(* decrypt_materials)(struct aws_cryptosdk_cmm *cmm, struct aws_cryptosdk_dec_materials **output, struct aws_cryptosdk_dec_request *request)
Definition materials.h:394
const char * name
Definition materials.h:377
void(* destroy)(struct aws_cryptosdk_cmm *cmm)
Definition materials.h:382
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:204
enum aws_cryptosdk_alg_id alg
Definition materials.h:210
struct aws_byte_buf unencrypted_data_key
Definition materials.h:205
struct aws_array_list keyring_trace
Definition materials.h:207
struct aws_cryptosdk_sig_ctx * signctx
Definition materials.h:209
enum aws_cryptosdk_alg_id alg
Definition materials.h:192
struct aws_array_list encrypted_data_keys
Definition materials.h:191
const struct aws_hash_table * enc_ctx
Definition materials.h:190
struct aws_allocator * alloc
Definition materials.h:189
struct aws_array_list encrypted_data_keys
Definition materials.h:179
struct aws_cryptosdk_sig_ctx * signctx
Definition materials.h:181
struct aws_array_list keyring_trace
Definition materials.h:177
struct aws_byte_buf unencrypted_data_key
Definition materials.h:175
struct aws_allocator * alloc
Definition materials.h:174
enum aws_cryptosdk_alg_id alg
Definition materials.h:182
struct aws_allocator * alloc
Definition materials.h:134
struct aws_hash_table * enc_ctx
Definition materials.h:140
enum aws_cryptosdk_commitment_policy commitment_policy
Definition materials.h:163
enum aws_cryptosdk_alg_id requested_alg
Definition materials.h:148
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:557
void(* destroy)(struct aws_cryptosdk_keyring *keyring)
Definition materials.h:529
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:540
struct aws_atomic_var refcount
Definition materials.h:97
const struct aws_cryptosdk_keyring_vt * vtable
Definition materials.h:98