xref: /aosp_15_r20/external/boringssl/src/include/openssl/mem.h (revision 8fb009dc861624b67b6cdb62ea21f0f22d0c584b)
1 /* Copyright (C) 1995-1998 Eric Young ([email protected])
2  * All rights reserved.
3  *
4  * This package is an SSL implementation written
5  * by Eric Young ([email protected]).
6  * The implementation was written so as to conform with Netscapes SSL.
7  *
8  * This library is free for commercial and non-commercial use as long as
9  * the following conditions are aheared to.  The following conditions
10  * apply to all code found in this distribution, be it the RC4, RSA,
11  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
12  * included with this distribution is covered by the same copyright terms
13  * except that the holder is Tim Hudson ([email protected]).
14  *
15  * Copyright remains Eric Young's, and as such any Copyright notices in
16  * the code are not to be removed.
17  * If this package is used in a product, Eric Young should be given attribution
18  * as the author of the parts of the library used.
19  * This can be in the form of a textual message at program startup or
20  * in documentation (online or textual) provided with the package.
21  *
22  * Redistribution and use in source and binary forms, with or without
23  * modification, are permitted provided that the following conditions
24  * are met:
25  * 1. Redistributions of source code must retain the copyright
26  *    notice, this list of conditions and the following disclaimer.
27  * 2. Redistributions in binary form must reproduce the above copyright
28  *    notice, this list of conditions and the following disclaimer in the
29  *    documentation and/or other materials provided with the distribution.
30  * 3. All advertising materials mentioning features or use of this software
31  *    must display the following acknowledgement:
32  *    "This product includes cryptographic software written by
33  *     Eric Young ([email protected])"
34  *    The word 'cryptographic' can be left out if the rouines from the library
35  *    being used are not cryptographic related :-).
36  * 4. If you include any Windows specific code (or a derivative thereof) from
37  *    the apps directory (application code) you must include an acknowledgement:
38  *    "This product includes software written by Tim Hudson ([email protected])"
39  *
40  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50  * SUCH DAMAGE.
51  *
52  * The licence and distribution terms for any publically available version or
53  * derivative of this code cannot be changed.  i.e. this code cannot simply be
54  * copied and put under another distribution licence
55  * [including the GNU Public Licence.] */
56 
57 #ifndef OPENSSL_HEADER_MEM_H
58 #define OPENSSL_HEADER_MEM_H
59 
60 #include <openssl/base.h>
61 
62 #include <stdlib.h>
63 #include <stdarg.h>
64 
65 #if defined(__cplusplus)
66 extern "C" {
67 #endif
68 
69 
70 // Memory and string functions, see also buf.h.
71 //
72 // BoringSSL has its own set of allocation functions, which keep track of
73 // allocation lengths and zero them out before freeing. All memory returned by
74 // BoringSSL API calls must therefore generally be freed using |OPENSSL_free|
75 // unless stated otherwise.
76 
77 
78 #ifndef _BORINGSSL_PROHIBIT_OPENSSL_MALLOC
79 // OPENSSL_malloc is similar to a regular |malloc|, but allocates additional
80 // private data. The resulting pointer must be freed with |OPENSSL_free|. In
81 // the case of a malloc failure, prior to returning NULL |OPENSSL_malloc| will
82 // push |ERR_R_MALLOC_FAILURE| onto the openssl error stack.
83 OPENSSL_EXPORT void *OPENSSL_malloc(size_t size);
84 
85 // OPENSSL_zalloc behaves like |OPENSSL_malloc| except it also initializes the
86 // resulting memory to zero.
87 OPENSSL_EXPORT void *OPENSSL_zalloc(size_t size);
88 
89 // OPENSSL_calloc is similar to a regular |calloc|, but allocates data with
90 // |OPENSSL_malloc|. On overflow, it will push |ERR_R_OVERFLOW| onto the error
91 // queue.
92 OPENSSL_EXPORT void *OPENSSL_calloc(size_t num, size_t size);
93 
94 // OPENSSL_realloc returns a pointer to a buffer of |new_size| bytes that
95 // contains the contents of |ptr|. Unlike |realloc|, a new buffer is always
96 // allocated and the data at |ptr| is always wiped and freed. Memory is
97 // allocated with |OPENSSL_malloc| and must be freed with |OPENSSL_free|.
98 OPENSSL_EXPORT void *OPENSSL_realloc(void *ptr, size_t new_size);
99 #endif // !_BORINGSSL_PROHIBIT_OPENSSL_MALLOC
100 
101 // OPENSSL_free does nothing if |ptr| is NULL. Otherwise it zeros out the
102 // memory allocated at |ptr| and frees it along with the private data.
103 // It must only be used on on |ptr| values obtained from |OPENSSL_malloc|
104 OPENSSL_EXPORT void OPENSSL_free(void *ptr);
105 
106 // OPENSSL_cleanse zeros out |len| bytes of memory at |ptr|. This is similar to
107 // |memset_s| from C11.
108 OPENSSL_EXPORT void OPENSSL_cleanse(void *ptr, size_t len);
109 
110 // CRYPTO_memcmp returns zero iff the |len| bytes at |a| and |b| are equal. It
111 // takes an amount of time dependent on |len|, but independent of the contents
112 // of |a| and |b|. Unlike memcmp, it cannot be used to put elements into a
113 // defined order as the return value when a != b is undefined, other than to be
114 // non-zero.
115 OPENSSL_EXPORT int CRYPTO_memcmp(const void *a, const void *b, size_t len);
116 
117 // OPENSSL_hash32 implements the 32 bit, FNV-1a hash.
118 OPENSSL_EXPORT uint32_t OPENSSL_hash32(const void *ptr, size_t len);
119 
120 // OPENSSL_strhash calls |OPENSSL_hash32| on the NUL-terminated string |s|.
121 OPENSSL_EXPORT uint32_t OPENSSL_strhash(const char *s);
122 
123 // OPENSSL_strdup has the same behaviour as strdup(3).
124 OPENSSL_EXPORT char *OPENSSL_strdup(const char *s);
125 
126 // OPENSSL_strnlen has the same behaviour as strnlen(3).
127 OPENSSL_EXPORT size_t OPENSSL_strnlen(const char *s, size_t len);
128 
129 // OPENSSL_isalpha is a locale-independent, ASCII-only version of isalpha(3), It
130 // only recognizes 'a' through 'z' and 'A' through 'Z' as alphabetic.
131 OPENSSL_EXPORT int OPENSSL_isalpha(int c);
132 
133 // OPENSSL_isdigit is a locale-independent, ASCII-only version of isdigit(3), It
134 // only recognizes '0' through '9' as digits.
135 OPENSSL_EXPORT int OPENSSL_isdigit(int c);
136 
137 // OPENSSL_isxdigit is a locale-independent, ASCII-only version of isxdigit(3),
138 // It only recognizes '0' through '9', 'a' through 'f', and 'A through 'F' as
139 // digits.
140 OPENSSL_EXPORT int OPENSSL_isxdigit(int c);
141 
142 // OPENSSL_fromxdigit returns one if |c| is a hexadecimal digit as recognized
143 // by OPENSSL_isxdigit, and sets |out| to the corresponding value. Otherwise
144 // zero is returned.
145 OPENSSL_EXPORT int OPENSSL_fromxdigit(uint8_t *out, int c);
146 
147 // OPENSSL_isalnum is a locale-independent, ASCII-only version of isalnum(3), It
148 // only recognizes what |OPENSSL_isalpha| and |OPENSSL_isdigit| recognize.
149 OPENSSL_EXPORT int OPENSSL_isalnum(int c);
150 
151 // OPENSSL_tolower is a locale-independent, ASCII-only version of tolower(3). It
152 // only lowercases ASCII values. Other values are returned as-is.
153 OPENSSL_EXPORT int OPENSSL_tolower(int c);
154 
155 // OPENSSL_isspace is a locale-independent, ASCII-only version of isspace(3). It
156 // only recognizes '\t', '\n', '\v', '\f', '\r', and ' '.
157 OPENSSL_EXPORT int OPENSSL_isspace(int c);
158 
159 // OPENSSL_strcasecmp is a locale-independent, ASCII-only version of
160 // strcasecmp(3).
161 OPENSSL_EXPORT int OPENSSL_strcasecmp(const char *a, const char *b);
162 
163 // OPENSSL_strncasecmp is a locale-independent, ASCII-only version of
164 // strncasecmp(3).
165 OPENSSL_EXPORT int OPENSSL_strncasecmp(const char *a, const char *b, size_t n);
166 
167 // DECIMAL_SIZE returns an upper bound for the length of the decimal
168 // representation of the given type.
169 #define DECIMAL_SIZE(type)	((sizeof(type)*8+2)/3+1)
170 
171 // BIO_snprintf has the same behavior as snprintf(3).
172 OPENSSL_EXPORT int BIO_snprintf(char *buf, size_t n, const char *format, ...)
173     OPENSSL_PRINTF_FORMAT_FUNC(3, 4);
174 
175 // BIO_vsnprintf has the same behavior as vsnprintf(3).
176 OPENSSL_EXPORT int BIO_vsnprintf(char *buf, size_t n, const char *format,
177                                  va_list args) OPENSSL_PRINTF_FORMAT_FUNC(3, 0);
178 
179 // OPENSSL_vasprintf has the same behavior as vasprintf(3), except that
180 // memory allocated in a returned string must be freed with |OPENSSL_free|.
181 OPENSSL_EXPORT int OPENSSL_vasprintf(char **str, const char *format,
182                                      va_list args)
183     OPENSSL_PRINTF_FORMAT_FUNC(2, 0);
184 
185 // OPENSSL_asprintf has the same behavior as asprintf(3), except that
186 // memory allocated in a returned string must be freed with |OPENSSL_free|.
187 OPENSSL_EXPORT int OPENSSL_asprintf(char **str, const char *format, ...)
188     OPENSSL_PRINTF_FORMAT_FUNC(2, 3);
189 
190 // OPENSSL_strndup returns an allocated, duplicate of |str|, which is, at most,
191 // |size| bytes. The result is always NUL terminated. The memory allocated
192 // must be freed with |OPENSSL_free|.
193 OPENSSL_EXPORT char *OPENSSL_strndup(const char *str, size_t size);
194 
195 // OPENSSL_memdup returns an allocated, duplicate of |size| bytes from |data| or
196 // NULL on allocation failure. The memory allocated must be freed with
197 // |OPENSSL_free|.
198 OPENSSL_EXPORT void *OPENSSL_memdup(const void *data, size_t size);
199 
200 // OPENSSL_strlcpy acts like strlcpy(3).
201 OPENSSL_EXPORT size_t OPENSSL_strlcpy(char *dst, const char *src,
202                                       size_t dst_size);
203 
204 // OPENSSL_strlcat acts like strlcat(3).
205 OPENSSL_EXPORT size_t OPENSSL_strlcat(char *dst, const char *src,
206                                       size_t dst_size);
207 
208 
209 // Deprecated functions.
210 
211 // CRYPTO_malloc calls |OPENSSL_malloc|. |file| and |line| are ignored.
212 OPENSSL_EXPORT void *CRYPTO_malloc(size_t size, const char *file, int line);
213 
214 // CRYPTO_realloc calls |OPENSSL_realloc|. |file| and |line| are ignored.
215 OPENSSL_EXPORT void *CRYPTO_realloc(void *ptr, size_t new_size,
216                                     const char *file, int line);
217 
218 // CRYPTO_free calls |OPENSSL_free|. |file| and |line| are ignored.
219 OPENSSL_EXPORT void CRYPTO_free(void *ptr, const char *file, int line);
220 
221 // OPENSSL_clear_free calls |OPENSSL_free|. BoringSSL automatically clears all
222 // allocations on free, but we define |OPENSSL_clear_free| for compatibility.
223 OPENSSL_EXPORT void OPENSSL_clear_free(void *ptr, size_t len);
224 
225 // CRYPTO_secure_malloc_init returns zero.
226 OPENSSL_EXPORT int CRYPTO_secure_malloc_init(size_t size, size_t min_size);
227 
228 // CRYPTO_secure_malloc_initialized returns zero.
229 OPENSSL_EXPORT int CRYPTO_secure_malloc_initialized(void);
230 
231 // CRYPTO_secure_used returns zero.
232 OPENSSL_EXPORT size_t CRYPTO_secure_used(void);
233 
234 // OPENSSL_secure_malloc calls |OPENSSL_malloc|.
235 OPENSSL_EXPORT void *OPENSSL_secure_malloc(size_t size);
236 
237 // OPENSSL_secure_clear_free calls |OPENSSL_clear_free|.
238 OPENSSL_EXPORT void OPENSSL_secure_clear_free(void *ptr, size_t len);
239 
240 
241 #if defined(__cplusplus)
242 }  // extern C
243 
244 extern "C++" {
245 
246 BSSL_NAMESPACE_BEGIN
247 
248 BORINGSSL_MAKE_DELETER(char, OPENSSL_free)
249 BORINGSSL_MAKE_DELETER(uint8_t, OPENSSL_free)
250 
251 BSSL_NAMESPACE_END
252 
253 }  // extern C++
254 
255 #endif
256 
257 #endif  // OPENSSL_HEADER_MEM_H
258