Line data Source code
1 : #ifndef AWS_COMMON_ZERO_H
2 : #define AWS_COMMON_ZERO_H
3 :
4 : /**
5 : * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
6 : * SPDX-License-Identifier: Apache-2.0.
7 : */
8 :
9 : #include <aws/common/stdbool.h>
10 : #include <aws/common/stdint.h>
11 :
12 : #include <string.h>
13 :
14 : AWS_EXTERN_C_BEGIN
15 :
16 : /**
17 : * Set each byte in the struct to zero.
18 : */
19 : #define AWS_ZERO_STRUCT(object) \
20 512468 : do { \
21 512468 : memset(&(object), 0, sizeof(object)); \
22 512468 : } while (0)
23 :
24 : /**
25 : * Set each byte in the array to zero.
26 : * Does not work with arrays of unknown bound.
27 : */
28 : #define AWS_ZERO_ARRAY(array) memset((void *)(array), 0, sizeof(array))
29 :
30 : /**
31 : * Returns whether each byte in the object is zero.
32 : */
33 : #ifdef CBMC
34 : /* clang-format off */
35 : # define AWS_IS_ZEROED(object) \
36 : __CPROVER_forall { \
37 : int i; \
38 : (i >= 0 && i < sizeof(object)) ==> ((const uint8_t *)&object)[i] == 0 \
39 : }
40 : /* clang-format on */
41 : #else
42 257392 : # define AWS_IS_ZEROED(object) aws_is_mem_zeroed(&(object), sizeof(object))
43 : #endif
44 :
45 : /**
46 : * Returns whether each byte is zero.
47 : */
48 : AWS_STATIC_IMPL
49 : bool aws_is_mem_zeroed(const void *buf, size_t bufsize);
50 :
51 : /**
52 : * Securely zeroes a memory buffer. This function will attempt to ensure that
53 : * the compiler will not optimize away this zeroing operation.
54 : */
55 : AWS_COMMON_API
56 : void aws_secure_zero(void *pBuf, size_t bufsize);
57 :
58 : #ifndef AWS_NO_STATIC_IMPL
59 : # include <aws/common/zero.inl>
60 : #endif /* AWS_NO_STATIC_IMPL */
61 :
62 : AWS_EXTERN_C_END
63 :
64 : #endif /* AWS_COMMON_ZERO_H */
|