File: | out/../deps/openssl/openssl/crypto/param_build.c |
Warning: | line 339, column 17 Null pointer passed to 1st parameter expecting 'nonnull' |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* | |||
2 | * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. | |||
3 | * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. | |||
4 | * | |||
5 | * Licensed under the Apache License 2.0 (the "License"). You may not use | |||
6 | * this file except in compliance with the License. You can obtain a copy | |||
7 | * in the file LICENSE in the source distribution or at | |||
8 | * https://www.openssl.org/source/license.html | |||
9 | */ | |||
10 | ||||
11 | #include <string.h> | |||
12 | #include <openssl/err.h> | |||
13 | #include <openssl/cryptoerr.h> | |||
14 | #include <openssl/params.h> | |||
15 | #include <openssl/types.h> | |||
16 | #include <openssl/safestack.h> | |||
17 | #include "internal/param_build_set.h" | |||
18 | ||||
19 | /* | |||
20 | * Special internal param type to indicate the end of an allocate OSSL_PARAM | |||
21 | * array. | |||
22 | */ | |||
23 | ||||
24 | typedef struct { | |||
25 | const char *key; | |||
26 | int type; | |||
27 | int secure; | |||
28 | size_t size; | |||
29 | size_t alloc_blocks; | |||
30 | const BIGNUM *bn; | |||
31 | const void *string; | |||
32 | union { | |||
33 | /* | |||
34 | * These fields are never directly addressed, but their sizes are | |||
35 | * imporant so that all native types can be copied here without overrun. | |||
36 | */ | |||
37 | ossl_intmax_t i; | |||
38 | ossl_uintmax_t u; | |||
39 | double d; | |||
40 | } num; | |||
41 | } OSSL_PARAM_BLD_DEF; | |||
42 | ||||
43 | DEFINE_STACK_OF(OSSL_PARAM_BLD_DEF)struct stack_st_OSSL_PARAM_BLD_DEF; typedef int (*sk_OSSL_PARAM_BLD_DEF_compfunc )(const OSSL_PARAM_BLD_DEF * const *a, const OSSL_PARAM_BLD_DEF *const *b); typedef void (*sk_OSSL_PARAM_BLD_DEF_freefunc)(OSSL_PARAM_BLD_DEF *a); typedef OSSL_PARAM_BLD_DEF * (*sk_OSSL_PARAM_BLD_DEF_copyfunc )(const OSSL_PARAM_BLD_DEF *a); static __attribute__((unused) ) inline int sk_OSSL_PARAM_BLD_DEF_num(const struct stack_st_OSSL_PARAM_BLD_DEF *sk) { return OPENSSL_sk_num((const OPENSSL_STACK *)sk); } static __attribute__((unused)) inline OSSL_PARAM_BLD_DEF *sk_OSSL_PARAM_BLD_DEF_value (const struct stack_st_OSSL_PARAM_BLD_DEF *sk, int idx) { return (OSSL_PARAM_BLD_DEF *)OPENSSL_sk_value((const OPENSSL_STACK * )sk, idx); } static __attribute__((unused)) inline struct stack_st_OSSL_PARAM_BLD_DEF *sk_OSSL_PARAM_BLD_DEF_new(sk_OSSL_PARAM_BLD_DEF_compfunc compare ) { return (struct stack_st_OSSL_PARAM_BLD_DEF *)OPENSSL_sk_new ((OPENSSL_sk_compfunc)compare); } static __attribute__((unused )) inline struct stack_st_OSSL_PARAM_BLD_DEF *sk_OSSL_PARAM_BLD_DEF_new_null (void) { return (struct stack_st_OSSL_PARAM_BLD_DEF *)OPENSSL_sk_new_null (); } static __attribute__((unused)) inline struct stack_st_OSSL_PARAM_BLD_DEF *sk_OSSL_PARAM_BLD_DEF_new_reserve(sk_OSSL_PARAM_BLD_DEF_compfunc compare, int n) { return (struct stack_st_OSSL_PARAM_BLD_DEF *)OPENSSL_sk_new_reserve((OPENSSL_sk_compfunc)compare, n); } static __attribute__((unused)) inline int sk_OSSL_PARAM_BLD_DEF_reserve (struct stack_st_OSSL_PARAM_BLD_DEF *sk, int n) { return OPENSSL_sk_reserve ((OPENSSL_STACK *)sk, n); } static __attribute__((unused)) inline void sk_OSSL_PARAM_BLD_DEF_free(struct stack_st_OSSL_PARAM_BLD_DEF *sk) { OPENSSL_sk_free((OPENSSL_STACK *)sk); } static __attribute__ ((unused)) inline void sk_OSSL_PARAM_BLD_DEF_zero(struct stack_st_OSSL_PARAM_BLD_DEF *sk) { OPENSSL_sk_zero((OPENSSL_STACK *)sk); } static __attribute__ ((unused)) inline OSSL_PARAM_BLD_DEF *sk_OSSL_PARAM_BLD_DEF_delete (struct stack_st_OSSL_PARAM_BLD_DEF *sk, int i) { return (OSSL_PARAM_BLD_DEF *)OPENSSL_sk_delete((OPENSSL_STACK *)sk, i); } static __attribute__ ((unused)) inline OSSL_PARAM_BLD_DEF *sk_OSSL_PARAM_BLD_DEF_delete_ptr (struct stack_st_OSSL_PARAM_BLD_DEF *sk, OSSL_PARAM_BLD_DEF * ptr) { return (OSSL_PARAM_BLD_DEF *)OPENSSL_sk_delete_ptr((OPENSSL_STACK *)sk, (const void *)ptr); } static __attribute__((unused)) inline int sk_OSSL_PARAM_BLD_DEF_push(struct stack_st_OSSL_PARAM_BLD_DEF *sk, OSSL_PARAM_BLD_DEF *ptr) { return OPENSSL_sk_push((OPENSSL_STACK *)sk, (const void *)ptr); } static __attribute__((unused)) inline int sk_OSSL_PARAM_BLD_DEF_unshift(struct stack_st_OSSL_PARAM_BLD_DEF *sk, OSSL_PARAM_BLD_DEF *ptr) { return OPENSSL_sk_unshift((OPENSSL_STACK *)sk, (const void *)ptr); } static __attribute__((unused)) inline OSSL_PARAM_BLD_DEF *sk_OSSL_PARAM_BLD_DEF_pop(struct stack_st_OSSL_PARAM_BLD_DEF *sk) { return (OSSL_PARAM_BLD_DEF *)OPENSSL_sk_pop((OPENSSL_STACK *)sk); } static __attribute__((unused)) inline OSSL_PARAM_BLD_DEF *sk_OSSL_PARAM_BLD_DEF_shift(struct stack_st_OSSL_PARAM_BLD_DEF *sk) { return (OSSL_PARAM_BLD_DEF *)OPENSSL_sk_shift((OPENSSL_STACK *)sk); } static __attribute__((unused)) inline void sk_OSSL_PARAM_BLD_DEF_pop_free (struct stack_st_OSSL_PARAM_BLD_DEF *sk, sk_OSSL_PARAM_BLD_DEF_freefunc freefunc) { OPENSSL_sk_pop_free((OPENSSL_STACK *)sk, (OPENSSL_sk_freefunc )freefunc); } static __attribute__((unused)) inline int sk_OSSL_PARAM_BLD_DEF_insert (struct stack_st_OSSL_PARAM_BLD_DEF *sk, OSSL_PARAM_BLD_DEF * ptr, int idx) { return OPENSSL_sk_insert((OPENSSL_STACK *)sk, (const void *)ptr, idx); } static __attribute__((unused)) inline OSSL_PARAM_BLD_DEF *sk_OSSL_PARAM_BLD_DEF_set(struct stack_st_OSSL_PARAM_BLD_DEF *sk, int idx, OSSL_PARAM_BLD_DEF *ptr) { return (OSSL_PARAM_BLD_DEF *)OPENSSL_sk_set((OPENSSL_STACK *)sk, idx, (const void *)ptr ); } static __attribute__((unused)) inline int sk_OSSL_PARAM_BLD_DEF_find (struct stack_st_OSSL_PARAM_BLD_DEF *sk, OSSL_PARAM_BLD_DEF * ptr) { return OPENSSL_sk_find((OPENSSL_STACK *)sk, (const void *)ptr); } static __attribute__((unused)) inline int sk_OSSL_PARAM_BLD_DEF_find_ex (struct stack_st_OSSL_PARAM_BLD_DEF *sk, OSSL_PARAM_BLD_DEF * ptr) { return OPENSSL_sk_find_ex((OPENSSL_STACK *)sk, (const void *)ptr); } static __attribute__((unused)) inline int sk_OSSL_PARAM_BLD_DEF_find_all (struct stack_st_OSSL_PARAM_BLD_DEF *sk, OSSL_PARAM_BLD_DEF * ptr, int *pnum) { return OPENSSL_sk_find_all((OPENSSL_STACK * )sk, (const void *)ptr, pnum); } static __attribute__((unused )) inline void sk_OSSL_PARAM_BLD_DEF_sort(struct stack_st_OSSL_PARAM_BLD_DEF *sk) { OPENSSL_sk_sort((OPENSSL_STACK *)sk); } static __attribute__ ((unused)) inline int sk_OSSL_PARAM_BLD_DEF_is_sorted(const struct stack_st_OSSL_PARAM_BLD_DEF *sk) { return OPENSSL_sk_is_sorted ((const OPENSSL_STACK *)sk); } static __attribute__((unused)) inline struct stack_st_OSSL_PARAM_BLD_DEF * sk_OSSL_PARAM_BLD_DEF_dup (const struct stack_st_OSSL_PARAM_BLD_DEF *sk) { return (struct stack_st_OSSL_PARAM_BLD_DEF *)OPENSSL_sk_dup((const OPENSSL_STACK *)sk); } static __attribute__((unused)) inline struct stack_st_OSSL_PARAM_BLD_DEF *sk_OSSL_PARAM_BLD_DEF_deep_copy(const struct stack_st_OSSL_PARAM_BLD_DEF *sk, sk_OSSL_PARAM_BLD_DEF_copyfunc copyfunc, sk_OSSL_PARAM_BLD_DEF_freefunc freefunc) { return (struct stack_st_OSSL_PARAM_BLD_DEF *)OPENSSL_sk_deep_copy ((const OPENSSL_STACK *)sk, (OPENSSL_sk_copyfunc)copyfunc, (OPENSSL_sk_freefunc )freefunc); } static __attribute__((unused)) inline sk_OSSL_PARAM_BLD_DEF_compfunc sk_OSSL_PARAM_BLD_DEF_set_cmp_func(struct stack_st_OSSL_PARAM_BLD_DEF *sk, sk_OSSL_PARAM_BLD_DEF_compfunc compare) { return (sk_OSSL_PARAM_BLD_DEF_compfunc )OPENSSL_sk_set_cmp_func((OPENSSL_STACK *)sk, (OPENSSL_sk_compfunc )compare); } | |||
44 | ||||
45 | struct ossl_param_bld_st { | |||
46 | size_t total_blocks; | |||
47 | size_t secure_blocks; | |||
48 | STACK_OF(OSSL_PARAM_BLD_DEF)struct stack_st_OSSL_PARAM_BLD_DEF *params; | |||
49 | }; | |||
50 | ||||
51 | static OSSL_PARAM_BLD_DEF *param_push(OSSL_PARAM_BLD *bld, const char *key, | |||
52 | int size, size_t alloc, int type, | |||
53 | int secure) | |||
54 | { | |||
55 | OSSL_PARAM_BLD_DEF *pd = OPENSSL_zalloc(sizeof(*pd))CRYPTO_zalloc(sizeof(*pd), "../deps/openssl/openssl/crypto/param_build.c" , 55); | |||
56 | ||||
57 | if (pd == NULL((void*)0)) { | |||
58 | ERR_raise(ERR_LIB_CRYPTO, ERR_R_MALLOC_FAILURE)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/param_build.c" ,58,__func__), ERR_set_error)((15),((256|((0x1 << 18L)| (0x2 << 18L)))),((void*)0)); | |||
59 | return NULL((void*)0); | |||
60 | } | |||
61 | pd->key = key; | |||
62 | pd->type = type; | |||
63 | pd->size = size; | |||
64 | pd->alloc_blocks = ossl_param_bytes_to_blocks(alloc); | |||
65 | if ((pd->secure = secure) != 0) | |||
66 | bld->secure_blocks += pd->alloc_blocks; | |||
67 | else | |||
68 | bld->total_blocks += pd->alloc_blocks; | |||
69 | if (sk_OSSL_PARAM_BLD_DEF_push(bld->params, pd) <= 0) { | |||
70 | OPENSSL_free(pd)CRYPTO_free(pd, "../deps/openssl/openssl/crypto/param_build.c" , 70); | |||
71 | pd = NULL((void*)0); | |||
72 | } | |||
73 | return pd; | |||
74 | } | |||
75 | ||||
76 | static int param_push_num(OSSL_PARAM_BLD *bld, const char *key, | |||
77 | void *num, size_t size, int type) | |||
78 | { | |||
79 | OSSL_PARAM_BLD_DEF *pd = param_push(bld, key, size, size, type, 0); | |||
80 | ||||
81 | if (pd == NULL((void*)0)) | |||
82 | return 0; | |||
83 | if (size > sizeof(pd->num)) { | |||
84 | ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_TOO_MANY_BYTES)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/param_build.c" ,84,__func__), ERR_set_error)((15),(113),((void*)0)); | |||
85 | return 0; | |||
86 | } | |||
87 | memcpy(&pd->num, num, size); | |||
88 | return 1; | |||
89 | } | |||
90 | ||||
91 | OSSL_PARAM_BLD *OSSL_PARAM_BLD_new(void) | |||
92 | { | |||
93 | OSSL_PARAM_BLD *r = OPENSSL_zalloc(sizeof(OSSL_PARAM_BLD))CRYPTO_zalloc(sizeof(OSSL_PARAM_BLD), "../deps/openssl/openssl/crypto/param_build.c" , 93); | |||
94 | ||||
95 | if (r != NULL((void*)0)) { | |||
96 | r->params = sk_OSSL_PARAM_BLD_DEF_new_null(); | |||
97 | if (r->params == NULL((void*)0)) { | |||
98 | OPENSSL_free(r)CRYPTO_free(r, "../deps/openssl/openssl/crypto/param_build.c" , 98); | |||
99 | r = NULL((void*)0); | |||
100 | } | |||
101 | } | |||
102 | return r; | |||
103 | } | |||
104 | ||||
105 | static void free_all_params(OSSL_PARAM_BLD *bld) | |||
106 | { | |||
107 | int i, n = sk_OSSL_PARAM_BLD_DEF_num(bld->params); | |||
108 | ||||
109 | for (i = 0; i < n; i++) | |||
110 | OPENSSL_free(sk_OSSL_PARAM_BLD_DEF_pop(bld->params))CRYPTO_free(sk_OSSL_PARAM_BLD_DEF_pop(bld->params), "../deps/openssl/openssl/crypto/param_build.c" , 110); | |||
111 | } | |||
112 | ||||
113 | void OSSL_PARAM_BLD_free(OSSL_PARAM_BLD *bld) | |||
114 | { | |||
115 | if (bld == NULL((void*)0)) | |||
116 | return; | |||
117 | free_all_params(bld); | |||
118 | sk_OSSL_PARAM_BLD_DEF_free(bld->params); | |||
119 | OPENSSL_free(bld)CRYPTO_free(bld, "../deps/openssl/openssl/crypto/param_build.c" , 119); | |||
120 | } | |||
121 | ||||
122 | int OSSL_PARAM_BLD_push_int(OSSL_PARAM_BLD *bld, const char *key, int num) | |||
123 | { | |||
124 | return param_push_num(bld, key, &num, sizeof(num), OSSL_PARAM_INTEGER1); | |||
125 | } | |||
126 | ||||
127 | int OSSL_PARAM_BLD_push_uint(OSSL_PARAM_BLD *bld, const char *key, | |||
128 | unsigned int num) | |||
129 | { | |||
130 | return param_push_num(bld, key, &num, sizeof(num), | |||
131 | OSSL_PARAM_UNSIGNED_INTEGER2); | |||
132 | } | |||
133 | ||||
134 | int OSSL_PARAM_BLD_push_long(OSSL_PARAM_BLD *bld, const char *key, | |||
135 | long int num) | |||
136 | { | |||
137 | return param_push_num(bld, key, &num, sizeof(num), OSSL_PARAM_INTEGER1); | |||
138 | } | |||
139 | ||||
140 | int OSSL_PARAM_BLD_push_ulong(OSSL_PARAM_BLD *bld, const char *key, | |||
141 | unsigned long int num) | |||
142 | { | |||
143 | return param_push_num(bld, key, &num, sizeof(num), | |||
144 | OSSL_PARAM_UNSIGNED_INTEGER2); | |||
145 | } | |||
146 | ||||
147 | int OSSL_PARAM_BLD_push_int32(OSSL_PARAM_BLD *bld, const char *key, | |||
148 | int32_t num) | |||
149 | { | |||
150 | return param_push_num(bld, key, &num, sizeof(num), OSSL_PARAM_INTEGER1); | |||
151 | } | |||
152 | ||||
153 | int OSSL_PARAM_BLD_push_uint32(OSSL_PARAM_BLD *bld, const char *key, | |||
154 | uint32_t num) | |||
155 | { | |||
156 | return param_push_num(bld, key, &num, sizeof(num), | |||
157 | OSSL_PARAM_UNSIGNED_INTEGER2); | |||
158 | } | |||
159 | ||||
160 | int OSSL_PARAM_BLD_push_int64(OSSL_PARAM_BLD *bld, const char *key, | |||
161 | int64_t num) | |||
162 | { | |||
163 | return param_push_num(bld, key, &num, sizeof(num), OSSL_PARAM_INTEGER1); | |||
164 | } | |||
165 | ||||
166 | int OSSL_PARAM_BLD_push_uint64(OSSL_PARAM_BLD *bld, const char *key, | |||
167 | uint64_t num) | |||
168 | { | |||
169 | return param_push_num(bld, key, &num, sizeof(num), | |||
170 | OSSL_PARAM_UNSIGNED_INTEGER2); | |||
171 | } | |||
172 | ||||
173 | int OSSL_PARAM_BLD_push_size_t(OSSL_PARAM_BLD *bld, const char *key, | |||
174 | size_t num) | |||
175 | { | |||
176 | return param_push_num(bld, key, &num, sizeof(num), | |||
177 | OSSL_PARAM_UNSIGNED_INTEGER2); | |||
178 | } | |||
179 | ||||
180 | int OSSL_PARAM_BLD_push_time_t(OSSL_PARAM_BLD *bld, const char *key, | |||
181 | time_t num) | |||
182 | { | |||
183 | return param_push_num(bld, key, &num, sizeof(num), | |||
184 | OSSL_PARAM_INTEGER1); | |||
185 | } | |||
186 | ||||
187 | int OSSL_PARAM_BLD_push_double(OSSL_PARAM_BLD *bld, const char *key, | |||
188 | double num) | |||
189 | { | |||
190 | return param_push_num(bld, key, &num, sizeof(num), OSSL_PARAM_REAL3); | |||
191 | } | |||
192 | ||||
193 | int OSSL_PARAM_BLD_push_BN(OSSL_PARAM_BLD *bld, const char *key, | |||
194 | const BIGNUM *bn) | |||
195 | { | |||
196 | return OSSL_PARAM_BLD_push_BN_pad(bld, key, bn, | |||
197 | bn == NULL((void*)0) ? 0 : BN_num_bytes(bn)((BN_num_bits(bn)+7)/8)); | |||
198 | } | |||
199 | ||||
200 | int OSSL_PARAM_BLD_push_BN_pad(OSSL_PARAM_BLD *bld, const char *key, | |||
201 | const BIGNUM *bn, size_t sz) | |||
202 | { | |||
203 | int n, secure = 0; | |||
204 | OSSL_PARAM_BLD_DEF *pd; | |||
205 | ||||
206 | if (bn != NULL((void*)0)) { | |||
207 | if (BN_is_negative(bn)) { | |||
208 | ERR_raise_data(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/param_build.c" ,208,__func__), ERR_set_error)(ERR_LIB_CRYPTO15, ERR_R_UNSUPPORTED(268|(0x2 << 18L)), | |||
209 | "Negative big numbers are unsupported for OSSL_PARAM"); | |||
210 | return 0; | |||
211 | } | |||
212 | ||||
213 | n = BN_num_bytes(bn)((BN_num_bits(bn)+7)/8); | |||
214 | if (n < 0) { | |||
215 | ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_ZERO_LENGTH_NUMBER)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/param_build.c" ,215,__func__), ERR_set_error)((15),(115),((void*)0)); | |||
216 | return 0; | |||
217 | } | |||
218 | if (sz < (size_t)n) { | |||
219 | ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_TOO_SMALL_BUFFER)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/param_build.c" ,219,__func__), ERR_set_error)((15),(116),((void*)0)); | |||
220 | return 0; | |||
221 | } | |||
222 | if (BN_get_flags(bn, BN_FLG_SECURE0x08) == BN_FLG_SECURE0x08) | |||
223 | secure = 1; | |||
224 | } | |||
225 | pd = param_push(bld, key, sz, sz, OSSL_PARAM_UNSIGNED_INTEGER2, secure); | |||
226 | if (pd == NULL((void*)0)) | |||
227 | return 0; | |||
228 | pd->bn = bn; | |||
229 | return 1; | |||
230 | } | |||
231 | ||||
232 | int OSSL_PARAM_BLD_push_utf8_string(OSSL_PARAM_BLD *bld, const char *key, | |||
233 | const char *buf, size_t bsize) | |||
234 | { | |||
235 | OSSL_PARAM_BLD_DEF *pd; | |||
236 | int secure; | |||
237 | ||||
238 | if (bsize == 0) { | |||
239 | bsize = strlen(buf); | |||
240 | } else if (bsize > INT_MAX2147483647) { | |||
241 | ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_STRING_TOO_LONG)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/param_build.c" ,241,__func__), ERR_set_error)((15),(112),((void*)0)); | |||
242 | return 0; | |||
243 | } | |||
244 | secure = CRYPTO_secure_allocated(buf); | |||
245 | pd = param_push(bld, key, bsize, bsize + 1, OSSL_PARAM_UTF8_STRING4, secure); | |||
246 | if (pd == NULL((void*)0)) | |||
247 | return 0; | |||
248 | pd->string = buf; | |||
249 | return 1; | |||
250 | } | |||
251 | ||||
252 | int OSSL_PARAM_BLD_push_utf8_ptr(OSSL_PARAM_BLD *bld, const char *key, | |||
253 | char *buf, size_t bsize) | |||
254 | { | |||
255 | OSSL_PARAM_BLD_DEF *pd; | |||
256 | ||||
257 | if (bsize == 0) { | |||
258 | bsize = strlen(buf); | |||
259 | } else if (bsize > INT_MAX2147483647) { | |||
260 | ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_STRING_TOO_LONG)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/param_build.c" ,260,__func__), ERR_set_error)((15),(112),((void*)0)); | |||
261 | return 0; | |||
262 | } | |||
263 | pd = param_push(bld, key, bsize, sizeof(buf), OSSL_PARAM_UTF8_PTR6, 0); | |||
264 | if (pd == NULL((void*)0)) | |||
265 | return 0; | |||
266 | pd->string = buf; | |||
267 | return 1; | |||
268 | } | |||
269 | ||||
270 | int OSSL_PARAM_BLD_push_octet_string(OSSL_PARAM_BLD *bld, const char *key, | |||
271 | const void *buf, size_t bsize) | |||
272 | { | |||
273 | OSSL_PARAM_BLD_DEF *pd; | |||
274 | int secure; | |||
275 | ||||
276 | if (bsize > INT_MAX2147483647) { | |||
277 | ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_STRING_TOO_LONG)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/param_build.c" ,277,__func__), ERR_set_error)((15),(112),((void*)0)); | |||
278 | return 0; | |||
279 | } | |||
280 | secure = CRYPTO_secure_allocated(buf); | |||
281 | pd = param_push(bld, key, bsize, bsize, OSSL_PARAM_OCTET_STRING5, secure); | |||
282 | if (pd == NULL((void*)0)) | |||
283 | return 0; | |||
284 | pd->string = buf; | |||
285 | return 1; | |||
286 | } | |||
287 | ||||
288 | int OSSL_PARAM_BLD_push_octet_ptr(OSSL_PARAM_BLD *bld, const char *key, | |||
289 | void *buf, size_t bsize) | |||
290 | { | |||
291 | OSSL_PARAM_BLD_DEF *pd; | |||
292 | ||||
293 | if (bsize > INT_MAX2147483647) { | |||
294 | ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_STRING_TOO_LONG)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/param_build.c" ,294,__func__), ERR_set_error)((15),(112),((void*)0)); | |||
295 | return 0; | |||
296 | } | |||
297 | pd = param_push(bld, key, bsize, sizeof(buf), OSSL_PARAM_OCTET_PTR7, 0); | |||
298 | if (pd == NULL((void*)0)) | |||
299 | return 0; | |||
300 | pd->string = buf; | |||
301 | return 1; | |||
302 | } | |||
303 | ||||
304 | static OSSL_PARAM *param_bld_convert(OSSL_PARAM_BLD *bld, OSSL_PARAM *param, | |||
305 | OSSL_PARAM_ALIGNED_BLOCK *blk, | |||
306 | OSSL_PARAM_ALIGNED_BLOCK *secure) | |||
307 | { | |||
308 | int i, num = sk_OSSL_PARAM_BLD_DEF_num(bld->params); | |||
309 | OSSL_PARAM_BLD_DEF *pd; | |||
310 | void *p; | |||
311 | ||||
312 | for (i = 0; i < num; i++) { | |||
313 | pd = sk_OSSL_PARAM_BLD_DEF_value(bld->params, i); | |||
314 | param[i].key = pd->key; | |||
315 | param[i].data_type = pd->type; | |||
316 | param[i].data_size = pd->size; | |||
317 | param[i].return_size = OSSL_PARAM_UNMODIFIED((size_t)-1); | |||
318 | ||||
319 | if (pd->secure) { | |||
320 | p = secure; | |||
321 | secure += pd->alloc_blocks; | |||
322 | } else { | |||
323 | p = blk; | |||
324 | blk += pd->alloc_blocks; | |||
325 | } | |||
326 | param[i].data = p; | |||
327 | if (pd->bn != NULL((void*)0)) { | |||
328 | /* BIGNUM */ | |||
329 | BN_bn2nativepad(pd->bn, (unsigned char *)p, pd->size); | |||
330 | } else if (pd->type == OSSL_PARAM_OCTET_PTR7 | |||
331 | || pd->type == OSSL_PARAM_UTF8_PTR6) { | |||
332 | /* PTR */ | |||
333 | *(const void **)p = pd->string; | |||
334 | } else if (pd->type == OSSL_PARAM_OCTET_STRING5 | |||
335 | || pd->type == OSSL_PARAM_UTF8_STRING4) { | |||
336 | if (pd->string != NULL((void*)0)) | |||
337 | memcpy(p, pd->string, pd->size); | |||
338 | else | |||
339 | memset(p, 0, pd->size); | |||
| ||||
340 | if (pd->type == OSSL_PARAM_UTF8_STRING4) | |||
341 | ((char *)p)[pd->size] = '\0'; | |||
342 | } else { | |||
343 | /* Number, but could also be a NULL BIGNUM */ | |||
344 | if (pd->size > sizeof(pd->num)) | |||
345 | memset(p, 0, pd->size); | |||
346 | else if (pd->size > 0) | |||
347 | memcpy(p, &pd->num, pd->size); | |||
348 | } | |||
349 | } | |||
350 | param[i] = OSSL_PARAM_construct_end(); | |||
351 | return param + i; | |||
352 | } | |||
353 | ||||
354 | OSSL_PARAM *OSSL_PARAM_BLD_to_param(OSSL_PARAM_BLD *bld) | |||
355 | { | |||
356 | OSSL_PARAM_ALIGNED_BLOCK *blk, *s = NULL((void*)0); | |||
| ||||
357 | OSSL_PARAM *params, *last; | |||
358 | const int num = sk_OSSL_PARAM_BLD_DEF_num(bld->params); | |||
359 | const size_t p_blks = ossl_param_bytes_to_blocks((1 + num) * sizeof(*params)); | |||
360 | const size_t total = OSSL_PARAM_ALIGN_SIZEsizeof(OSSL_PARAM_ALIGNED_BLOCK) * (p_blks + bld->total_blocks); | |||
361 | const size_t ss = OSSL_PARAM_ALIGN_SIZEsizeof(OSSL_PARAM_ALIGNED_BLOCK) * bld->secure_blocks; | |||
362 | ||||
363 | if (ss > 0) { | |||
364 | s = OPENSSL_secure_malloc(ss)CRYPTO_secure_malloc(ss, "../deps/openssl/openssl/crypto/param_build.c" , 364); | |||
365 | if (s == NULL((void*)0)) { | |||
366 | ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_SECURE_MALLOC_FAILURE)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/param_build.c" ,366,__func__), ERR_set_error)((15),(111),((void*)0)); | |||
367 | return NULL((void*)0); | |||
368 | } | |||
369 | } | |||
370 | params = OPENSSL_malloc(total)CRYPTO_malloc(total, "../deps/openssl/openssl/crypto/param_build.c" , 370); | |||
371 | if (params == NULL((void*)0)) { | |||
372 | ERR_raise(ERR_LIB_CRYPTO, ERR_R_MALLOC_FAILURE)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/param_build.c" ,372,__func__), ERR_set_error)((15),((256|((0x1 << 18L) |(0x2 << 18L)))),((void*)0)); | |||
373 | OPENSSL_secure_free(s)CRYPTO_secure_free(s, "../deps/openssl/openssl/crypto/param_build.c" , 373); | |||
374 | return NULL((void*)0); | |||
375 | } | |||
376 | blk = p_blks + (OSSL_PARAM_ALIGNED_BLOCK *)(params); | |||
377 | last = param_bld_convert(bld, params, blk, s); | |||
378 | ossl_param_set_secure_block(last, s, ss); | |||
379 | ||||
380 | /* Reset builder for reuse */ | |||
381 | bld->total_blocks = 0; | |||
382 | bld->secure_blocks = 0; | |||
383 | free_all_params(bld); | |||
384 | return params; | |||
385 | } |