File: | out/../deps/openssl/openssl/apps/pkeyutl.c |
Warning: | line 502, column 9 3rd function call argument is an uninitialized value |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* | ||||
2 | * Copyright 2006-2022 The OpenSSL Project Authors. All Rights Reserved. | ||||
3 | * | ||||
4 | * Licensed under the Apache License 2.0 (the "License"). You may not use | ||||
5 | * this file except in compliance with the License. You can obtain a copy | ||||
6 | * in the file LICENSE in the source distribution or at | ||||
7 | * https://www.openssl.org/source/license.html | ||||
8 | */ | ||||
9 | |||||
10 | #include "apps.h" | ||||
11 | #include "progs.h" | ||||
12 | #include <string.h> | ||||
13 | #include <openssl/err.h> | ||||
14 | #include <openssl/pem.h> | ||||
15 | #include <openssl/evp.h> | ||||
16 | #include <sys/stat.h> | ||||
17 | |||||
18 | #define KEY_NONE0 0 | ||||
19 | #define KEY_PRIVKEY1 1 | ||||
20 | #define KEY_PUBKEY2 2 | ||||
21 | #define KEY_CERT3 3 | ||||
22 | |||||
23 | static EVP_PKEY_CTX *init_ctx(const char *kdfalg, int *pkeysize, | ||||
24 | const char *keyfile, int keyform, int key_type, | ||||
25 | char *passinarg, int pkey_op, ENGINE *e, | ||||
26 | const int impl, int rawin, EVP_PKEY **ppkey, | ||||
27 | EVP_MD_CTX *mctx, const char *digestname, | ||||
28 | OSSL_LIB_CTX *libctx, const char *propq); | ||||
29 | |||||
30 | static int setup_peer(EVP_PKEY_CTX *ctx, int peerform, const char *file, | ||||
31 | ENGINE *e); | ||||
32 | |||||
33 | static int do_keyop(EVP_PKEY_CTX *ctx, int pkey_op, | ||||
34 | unsigned char *out, size_t *poutlen, | ||||
35 | const unsigned char *in, size_t inlen); | ||||
36 | |||||
37 | static int do_raw_keyop(int pkey_op, EVP_MD_CTX *mctx, | ||||
38 | EVP_PKEY *pkey, BIO *in, | ||||
39 | int filesize, unsigned char *sig, int siglen, | ||||
40 | unsigned char **out, size_t *poutlen); | ||||
41 | |||||
42 | typedef enum OPTION_choice { | ||||
43 | OPT_COMMONOPT_ERR = -1, OPT_EOF = 0, OPT_HELP, | ||||
44 | OPT_ENGINE, OPT_ENGINE_IMPL, OPT_IN, OPT_OUT, | ||||
45 | OPT_PUBIN, OPT_CERTIN, OPT_ASN1PARSE, OPT_HEXDUMP, OPT_SIGN, | ||||
46 | OPT_VERIFY, OPT_VERIFYRECOVER, OPT_REV, OPT_ENCRYPT, OPT_DECRYPT, | ||||
47 | OPT_DERIVE, OPT_SIGFILE, OPT_INKEY, OPT_PEERKEY, OPT_PASSIN, | ||||
48 | OPT_PEERFORM, OPT_KEYFORM, OPT_PKEYOPT, OPT_PKEYOPT_PASSIN, OPT_KDF, | ||||
49 | OPT_KDFLEN, OPT_R_ENUMOPT_R__FIRST=1500, OPT_R_RAND, OPT_R_WRITERAND, OPT_R__LAST, OPT_PROV_ENUMOPT_PROV__FIRST=1600, OPT_PROV_PROVIDER, OPT_PROV_PROVIDER_PATH , OPT_PROV_PROPQUERY, OPT_PROV__LAST, | ||||
50 | OPT_CONFIG, | ||||
51 | OPT_RAWIN, OPT_DIGEST | ||||
52 | } OPTION_CHOICE; | ||||
53 | |||||
54 | const OPTIONS pkeyutl_options[] = { | ||||
55 | OPT_SECTION("General"){ OPT_SECTION_STR, 1, '-', "General" " options:\n" }, | ||||
56 | {"help", OPT_HELP, '-', "Display this summary"}, | ||||
57 | #ifndef OPENSSL_NO_ENGINE | ||||
58 | {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, | ||||
59 | {"engine_impl", OPT_ENGINE_IMPL, '-', | ||||
60 | "Also use engine given by -engine for crypto operations"}, | ||||
61 | #endif | ||||
62 | {"sign", OPT_SIGN, '-', "Sign input data with private key"}, | ||||
63 | {"verify", OPT_VERIFY, '-', "Verify with public key"}, | ||||
64 | {"encrypt", OPT_ENCRYPT, '-', "Encrypt input data with public key"}, | ||||
65 | {"decrypt", OPT_DECRYPT, '-', "Decrypt input data with private key"}, | ||||
66 | {"derive", OPT_DERIVE, '-', "Derive shared secret"}, | ||||
67 | OPT_CONFIG_OPTION{ "config", OPT_CONFIG, '<', "Load a configuration file (this may load modules)" }, | ||||
68 | |||||
69 | OPT_SECTION("Input"){ OPT_SECTION_STR, 1, '-', "Input" " options:\n" }, | ||||
70 | {"in", OPT_IN, '<', "Input file - default stdin"}, | ||||
71 | {"rawin", OPT_RAWIN, '-', "Indicate the input data is in raw form"}, | ||||
72 | {"pubin", OPT_PUBIN, '-', "Input is a public key"}, | ||||
73 | {"inkey", OPT_INKEY, 's', "Input private key file"}, | ||||
74 | {"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, | ||||
75 | {"peerkey", OPT_PEERKEY, 's', "Peer key file used in key derivation"}, | ||||
76 | {"peerform", OPT_PEERFORM, 'E', "Peer key format (DER/PEM/P12/ENGINE)"}, | ||||
77 | {"certin", OPT_CERTIN, '-', "Input is a cert with a public key"}, | ||||
78 | {"rev", OPT_REV, '-', "Reverse the order of the input buffer"}, | ||||
79 | {"sigfile", OPT_SIGFILE, '<', "Signature file (verify operation only)"}, | ||||
80 | {"keyform", OPT_KEYFORM, 'E', "Private key format (ENGINE, other values ignored)"}, | ||||
81 | |||||
82 | OPT_SECTION("Output"){ OPT_SECTION_STR, 1, '-', "Output" " options:\n" }, | ||||
83 | {"out", OPT_OUT, '>', "Output file - default stdout"}, | ||||
84 | {"asn1parse", OPT_ASN1PARSE, '-', "asn1parse the output data"}, | ||||
85 | {"hexdump", OPT_HEXDUMP, '-', "Hex dump output"}, | ||||
86 | {"verifyrecover", OPT_VERIFYRECOVER, '-', | ||||
87 | "Verify with public key, recover original data"}, | ||||
88 | |||||
89 | OPT_SECTION("Signing/Derivation"){ OPT_SECTION_STR, 1, '-', "Signing/Derivation" " options:\n" }, | ||||
90 | {"digest", OPT_DIGEST, 's', | ||||
91 | "Specify the digest algorithm when signing the raw input data"}, | ||||
92 | {"pkeyopt", OPT_PKEYOPT, 's', "Public key options as opt:value"}, | ||||
93 | {"pkeyopt_passin", OPT_PKEYOPT_PASSIN, 's', | ||||
94 | "Public key option that is read as a passphrase argument opt:passphrase"}, | ||||
95 | {"kdf", OPT_KDF, 's', "Use KDF algorithm"}, | ||||
96 | {"kdflen", OPT_KDFLEN, 'p', "KDF algorithm output length"}, | ||||
97 | |||||
98 | OPT_R_OPTIONS{ OPT_SECTION_STR, 1, '-', "Random state" " options:\n" }, {"rand" , OPT_R_RAND, 's', "Load the given file(s) into the random number generator" }, {"writerand", OPT_R_WRITERAND, '>', "Write random data to the specified file" }, | ||||
99 | OPT_PROV_OPTIONS{ OPT_SECTION_STR, 1, '-', "Provider" " options:\n" }, { "provider-path" , OPT_PROV_PROVIDER_PATH, 's', "Provider load path (must be before 'provider' argument if required)" }, { "provider", OPT_PROV_PROVIDER, 's', "Provider to load (can be specified multiple times)" }, { "propquery", OPT_PROV_PROPQUERY, 's', "Property query used when fetching algorithms" }, | ||||
100 | {NULL((void*)0)} | ||||
101 | }; | ||||
102 | |||||
103 | int pkeyutl_main(int argc, char **argv) | ||||
104 | { | ||||
105 | CONF *conf = NULL((void*)0); | ||||
106 | BIO *in = NULL((void*)0), *out = NULL((void*)0); | ||||
107 | ENGINE *e = NULL((void*)0); | ||||
108 | EVP_PKEY_CTX *ctx = NULL((void*)0); | ||||
109 | EVP_PKEY *pkey = NULL((void*)0); | ||||
110 | char *infile = NULL((void*)0), *outfile = NULL((void*)0), *sigfile = NULL((void*)0), *passinarg = NULL((void*)0); | ||||
111 | char hexdump = 0, asn1parse = 0, rev = 0, *prog; | ||||
112 | unsigned char *buf_in = NULL((void*)0), *buf_out = NULL((void*)0), *sig = NULL((void*)0); | ||||
113 | OPTION_CHOICE o; | ||||
114 | int buf_inlen = 0, siglen = -1; | ||||
115 | int keyform = FORMAT_UNDEF0, peerform = FORMAT_UNDEF0; | ||||
116 | int keysize = -1, pkey_op = EVP_PKEY_OP_SIGN(1<<4), key_type = KEY_PRIVKEY1; | ||||
117 | int engine_impl = 0; | ||||
118 | int ret = 1, rv = -1; | ||||
119 | size_t buf_outlen; | ||||
| |||||
120 | const char *inkey = NULL((void*)0); | ||||
121 | const char *peerkey = NULL((void*)0); | ||||
122 | const char *kdfalg = NULL((void*)0), *digestname = NULL((void*)0); | ||||
123 | int kdflen = 0; | ||||
124 | STACK_OF(OPENSSL_STRING)struct stack_st_OPENSSL_STRING *pkeyopts = NULL((void*)0); | ||||
125 | STACK_OF(OPENSSL_STRING)struct stack_st_OPENSSL_STRING *pkeyopts_passin = NULL((void*)0); | ||||
126 | int rawin = 0; | ||||
127 | EVP_MD_CTX *mctx = NULL((void*)0); | ||||
128 | EVP_MD *md = NULL((void*)0); | ||||
129 | int filesize = -1; | ||||
130 | OSSL_LIB_CTX *libctx = app_get0_libctx(); | ||||
131 | |||||
132 | prog = opt_init(argc, argv, pkeyutl_options); | ||||
133 | while ((o = opt_next()) != OPT_EOF) { | ||||
134 | switch (o) { | ||||
135 | case OPT_EOF: | ||||
136 | case OPT_ERR: | ||||
137 | opthelp: | ||||
138 | BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); | ||||
139 | goto end; | ||||
140 | case OPT_HELP: | ||||
141 | opt_help(pkeyutl_options); | ||||
142 | ret = 0; | ||||
143 | goto end; | ||||
144 | case OPT_IN: | ||||
145 | infile = opt_arg(); | ||||
146 | break; | ||||
147 | case OPT_OUT: | ||||
148 | outfile = opt_arg(); | ||||
149 | break; | ||||
150 | case OPT_SIGFILE: | ||||
151 | sigfile = opt_arg(); | ||||
152 | break; | ||||
153 | case OPT_ENGINE_IMPL: | ||||
154 | engine_impl = 1; | ||||
155 | break; | ||||
156 | case OPT_INKEY: | ||||
157 | inkey = opt_arg(); | ||||
158 | break; | ||||
159 | case OPT_PEERKEY: | ||||
160 | peerkey = opt_arg(); | ||||
161 | break; | ||||
162 | case OPT_PASSIN: | ||||
163 | passinarg = opt_arg(); | ||||
164 | break; | ||||
165 | case OPT_PEERFORM: | ||||
166 | if (!opt_format(opt_arg(), OPT_FMT_ANY( (1L << 1) | (1L << 2) | (1L << 3) | (1L << 4) | (1L << 5) | (1L << 7) | (1L << 8) | ( 1L << 9) | (1L << 10)), &peerform)) | ||||
167 | goto opthelp; | ||||
168 | break; | ||||
169 | case OPT_KEYFORM: | ||||
170 | if (!opt_format(opt_arg(), OPT_FMT_ANY( (1L << 1) | (1L << 2) | (1L << 3) | (1L << 4) | (1L << 5) | (1L << 7) | (1L << 8) | ( 1L << 9) | (1L << 10)), &keyform)) | ||||
171 | goto opthelp; | ||||
172 | break; | ||||
173 | case OPT_R_CASESOPT_R__FIRST: case OPT_R__LAST: break; case OPT_R_RAND: case OPT_R_WRITERAND: | ||||
174 | if (!opt_rand(o)) | ||||
175 | goto end; | ||||
176 | break; | ||||
177 | case OPT_CONFIG: | ||||
178 | conf = app_load_config_modules(opt_arg()); | ||||
179 | if (conf == NULL((void*)0)) | ||||
180 | goto end; | ||||
181 | break; | ||||
182 | case OPT_PROV_CASESOPT_PROV__FIRST: case OPT_PROV__LAST: break; case OPT_PROV_PROVIDER : case OPT_PROV_PROVIDER_PATH: case OPT_PROV_PROPQUERY: | ||||
183 | if (!opt_provider(o)) | ||||
184 | goto end; | ||||
185 | break; | ||||
186 | case OPT_ENGINE: | ||||
187 | e = setup_engine(opt_arg(), 0)setup_engine_methods(opt_arg(), (unsigned int)-1, 0); | ||||
188 | break; | ||||
189 | case OPT_PUBIN: | ||||
190 | key_type = KEY_PUBKEY2; | ||||
191 | break; | ||||
192 | case OPT_CERTIN: | ||||
193 | key_type = KEY_CERT3; | ||||
194 | break; | ||||
195 | case OPT_ASN1PARSE: | ||||
196 | asn1parse = 1; | ||||
197 | break; | ||||
198 | case OPT_HEXDUMP: | ||||
199 | hexdump = 1; | ||||
200 | break; | ||||
201 | case OPT_SIGN: | ||||
202 | pkey_op = EVP_PKEY_OP_SIGN(1<<4); | ||||
203 | break; | ||||
204 | case OPT_VERIFY: | ||||
205 | pkey_op = EVP_PKEY_OP_VERIFY(1<<5); | ||||
206 | break; | ||||
207 | case OPT_VERIFYRECOVER: | ||||
208 | pkey_op = EVP_PKEY_OP_VERIFYRECOVER(1<<6); | ||||
209 | break; | ||||
210 | case OPT_ENCRYPT: | ||||
211 | pkey_op = EVP_PKEY_OP_ENCRYPT(1<<9); | ||||
212 | break; | ||||
213 | case OPT_DECRYPT: | ||||
214 | pkey_op = EVP_PKEY_OP_DECRYPT(1<<10); | ||||
215 | break; | ||||
216 | case OPT_DERIVE: | ||||
217 | pkey_op = EVP_PKEY_OP_DERIVE(1<<11); | ||||
218 | break; | ||||
219 | case OPT_KDF: | ||||
220 | pkey_op = EVP_PKEY_OP_DERIVE(1<<11); | ||||
221 | key_type = KEY_NONE0; | ||||
222 | kdfalg = opt_arg(); | ||||
223 | break; | ||||
224 | case OPT_KDFLEN: | ||||
225 | kdflen = atoi(opt_arg()); | ||||
226 | break; | ||||
227 | case OPT_REV: | ||||
228 | rev = 1; | ||||
229 | break; | ||||
230 | case OPT_PKEYOPT: | ||||
231 | if ((pkeyopts == NULL((void*)0) && | ||||
232 | (pkeyopts = sk_OPENSSL_STRING_new_null()((struct stack_st_OPENSSL_STRING *)OPENSSL_sk_new_null())) == NULL((void*)0)) || | ||||
233 | sk_OPENSSL_STRING_push(pkeyopts, opt_arg())OPENSSL_sk_push(ossl_check_OPENSSL_STRING_sk_type(pkeyopts), ossl_check_OPENSSL_STRING_type (opt_arg())) == 0) { | ||||
234 | BIO_puts(bio_err, "out of memory\n"); | ||||
235 | goto end; | ||||
236 | } | ||||
237 | break; | ||||
238 | case OPT_PKEYOPT_PASSIN: | ||||
239 | if ((pkeyopts_passin == NULL((void*)0) && | ||||
240 | (pkeyopts_passin = sk_OPENSSL_STRING_new_null()((struct stack_st_OPENSSL_STRING *)OPENSSL_sk_new_null())) == NULL((void*)0)) || | ||||
241 | sk_OPENSSL_STRING_push(pkeyopts_passin, opt_arg())OPENSSL_sk_push(ossl_check_OPENSSL_STRING_sk_type(pkeyopts_passin ), ossl_check_OPENSSL_STRING_type(opt_arg())) == 0) { | ||||
242 | BIO_puts(bio_err, "out of memory\n"); | ||||
243 | goto end; | ||||
244 | } | ||||
245 | break; | ||||
246 | case OPT_RAWIN: | ||||
247 | rawin = 1; | ||||
248 | break; | ||||
249 | case OPT_DIGEST: | ||||
250 | digestname = opt_arg(); | ||||
251 | break; | ||||
252 | } | ||||
253 | } | ||||
254 | |||||
255 | /* No extra arguments. */ | ||||
256 | argc = opt_num_rest(); | ||||
257 | if (argc != 0) | ||||
258 | goto opthelp; | ||||
259 | |||||
260 | if (!app_RAND_load()) | ||||
261 | goto end; | ||||
262 | |||||
263 | if (rawin
| ||||
264 | BIO_printf(bio_err, | ||||
265 | "%s: -rawin can only be used with -sign or -verify\n", | ||||
266 | prog); | ||||
267 | goto opthelp; | ||||
268 | } | ||||
269 | |||||
270 | if (digestname
| ||||
271 | BIO_printf(bio_err, | ||||
272 | "%s: -digest can only be used with -rawin\n", | ||||
273 | prog); | ||||
274 | goto opthelp; | ||||
275 | } | ||||
276 | |||||
277 | if (rawin
| ||||
278 | BIO_printf(bio_err, "%s: -rev cannot be used with raw input\n", | ||||
279 | prog); | ||||
280 | goto opthelp; | ||||
281 | } | ||||
282 | |||||
283 | if (kdfalg
| ||||
284 | if (kdflen == 0) { | ||||
285 | BIO_printf(bio_err, | ||||
286 | "%s: no KDF length given (-kdflen parameter).\n", prog); | ||||
287 | goto opthelp; | ||||
288 | } | ||||
289 | } else if (inkey == NULL((void*)0)) { | ||||
290 | BIO_printf(bio_err, | ||||
291 | "%s: no private key given (-inkey parameter).\n", prog); | ||||
292 | goto opthelp; | ||||
293 | } else if (peerkey
| ||||
294 | BIO_printf(bio_err, | ||||
295 | "%s: no peer key given (-peerkey parameter).\n", prog); | ||||
296 | goto opthelp; | ||||
297 | } | ||||
298 | |||||
299 | if (rawin
| ||||
300 | if ((mctx = EVP_MD_CTX_new()) == NULL((void*)0)) { | ||||
301 | BIO_printf(bio_err, "Error: out of memory\n"); | ||||
302 | goto end; | ||||
303 | } | ||||
304 | } | ||||
305 | ctx = init_ctx(kdfalg, &keysize, inkey, keyform, key_type, | ||||
306 | passinarg, pkey_op, e, engine_impl, rawin, &pkey, | ||||
307 | mctx, digestname, libctx, app_get0_propq()); | ||||
308 | if (ctx
| ||||
309 | BIO_printf(bio_err, "%s: Error initializing context\n", prog); | ||||
310 | goto end; | ||||
311 | } | ||||
312 | if (peerkey
| ||||
313 | BIO_printf(bio_err, "%s: Error setting up peer key\n", prog); | ||||
314 | goto end; | ||||
315 | } | ||||
316 | if (pkeyopts
| ||||
317 | int num = sk_OPENSSL_STRING_num(pkeyopts)OPENSSL_sk_num(ossl_check_const_OPENSSL_STRING_sk_type(pkeyopts )); | ||||
318 | int i; | ||||
319 | |||||
320 | for (i = 0; i < num; ++i) { | ||||
321 | const char *opt = sk_OPENSSL_STRING_value(pkeyopts, i)((char *)OPENSSL_sk_value(ossl_check_const_OPENSSL_STRING_sk_type (pkeyopts), (i))); | ||||
322 | |||||
323 | if (pkey_ctrl_string(ctx, opt) <= 0) { | ||||
324 | BIO_printf(bio_err, "%s: Can't set parameter \"%s\":\n", | ||||
325 | prog, opt); | ||||
326 | goto end; | ||||
327 | } | ||||
328 | } | ||||
329 | } | ||||
330 | if (pkeyopts_passin
| ||||
331 | int num = sk_OPENSSL_STRING_num(pkeyopts_passin)OPENSSL_sk_num(ossl_check_const_OPENSSL_STRING_sk_type(pkeyopts_passin )); | ||||
332 | int i; | ||||
333 | |||||
334 | for (i = 0; i < num; i++) { | ||||
335 | char *opt = sk_OPENSSL_STRING_value(pkeyopts_passin, i)((char *)OPENSSL_sk_value(ossl_check_const_OPENSSL_STRING_sk_type (pkeyopts_passin), (i))); | ||||
336 | char *passin = strchr(opt, ':'); | ||||
337 | char *passwd; | ||||
338 | |||||
339 | if (passin == NULL((void*)0)) { | ||||
340 | /* Get password interactively */ | ||||
341 | char passwd_buf[4096]; | ||||
342 | int r; | ||||
343 | |||||
344 | BIO_snprintf(passwd_buf, sizeof(passwd_buf), "Enter %s: ", opt); | ||||
345 | r = EVP_read_pw_string(passwd_buf, sizeof(passwd_buf) - 1, | ||||
346 | passwd_buf, 0); | ||||
347 | if (r < 0) { | ||||
348 | if (r == -2) | ||||
349 | BIO_puts(bio_err, "user abort\n"); | ||||
350 | else | ||||
351 | BIO_puts(bio_err, "entry failed\n"); | ||||
352 | goto end; | ||||
353 | } | ||||
354 | passwd = OPENSSL_strdup(passwd_buf)CRYPTO_strdup(passwd_buf, "../deps/openssl/openssl/apps/pkeyutl.c" , 354); | ||||
355 | if (passwd == NULL((void*)0)) { | ||||
356 | BIO_puts(bio_err, "out of memory\n"); | ||||
357 | goto end; | ||||
358 | } | ||||
359 | } else { | ||||
360 | /* Get password as a passin argument: First split option name | ||||
361 | * and passphrase argument into two strings */ | ||||
362 | *passin = 0; | ||||
363 | passin++; | ||||
364 | if (app_passwd(passin, NULL((void*)0), &passwd, NULL((void*)0)) == 0) { | ||||
365 | BIO_printf(bio_err, "failed to get '%s'\n", opt); | ||||
366 | goto end; | ||||
367 | } | ||||
368 | } | ||||
369 | |||||
370 | if (EVP_PKEY_CTX_ctrl_str(ctx, opt, passwd) <= 0) { | ||||
371 | BIO_printf(bio_err, "%s: Can't set parameter \"%s\":\n", | ||||
372 | prog, opt); | ||||
373 | goto end; | ||||
374 | } | ||||
375 | OPENSSL_free(passwd)CRYPTO_free(passwd, "../deps/openssl/openssl/apps/pkeyutl.c", 375); | ||||
376 | } | ||||
377 | } | ||||
378 | |||||
379 | if (sigfile
| ||||
380 | BIO_printf(bio_err, | ||||
381 | "%s: Signature file specified for non verify\n", prog); | ||||
382 | goto end; | ||||
383 | } | ||||
384 | |||||
385 | if (sigfile
| ||||
386 | BIO_printf(bio_err, | ||||
387 | "%s: No signature file specified for verify\n", prog); | ||||
388 | goto end; | ||||
389 | } | ||||
390 | |||||
391 | if (pkey_op != EVP_PKEY_OP_DERIVE(1<<11)) { | ||||
392 | in = bio_open_default(infile, 'r', FORMAT_BINARY2); | ||||
393 | if (infile
| ||||
394 | struct stat st; | ||||
395 | |||||
396 | if (stat(infile, &st) == 0 && st.st_size <= INT_MAX2147483647) | ||||
397 | filesize = (int)st.st_size; | ||||
398 | } | ||||
399 | if (in == NULL((void*)0)) | ||||
400 | goto end; | ||||
401 | } | ||||
402 | out = bio_open_default(outfile, 'w', FORMAT_BINARY2); | ||||
403 | if (out == NULL((void*)0)) | ||||
404 | goto end; | ||||
405 | |||||
406 | if (sigfile
| ||||
407 | BIO *sigbio = BIO_new_file(sigfile, "rb"); | ||||
408 | |||||
409 | if (sigbio == NULL((void*)0)) { | ||||
410 | BIO_printf(bio_err, "Can't open signature file %s\n", sigfile); | ||||
411 | goto end; | ||||
412 | } | ||||
413 | siglen = bio_to_mem(&sig, keysize * 10, sigbio); | ||||
414 | BIO_free(sigbio); | ||||
415 | if (siglen < 0) { | ||||
416 | BIO_printf(bio_err, "Error reading signature data\n"); | ||||
417 | goto end; | ||||
418 | } | ||||
419 | } | ||||
420 | |||||
421 | /* Raw input data is handled elsewhere */ | ||||
422 | if (in
| ||||
423 | /* Read the input data */ | ||||
424 | buf_inlen = bio_to_mem(&buf_in, keysize * 10, in); | ||||
425 | if (buf_inlen < 0) { | ||||
426 | BIO_printf(bio_err, "Error reading input Data\n"); | ||||
427 | goto end; | ||||
428 | } | ||||
429 | if (rev) { | ||||
430 | size_t i; | ||||
431 | unsigned char ctmp; | ||||
432 | size_t l = (size_t)buf_inlen; | ||||
433 | for (i = 0; i < l / 2; i++) { | ||||
434 | ctmp = buf_in[i]; | ||||
435 | buf_in[i] = buf_in[l - 1 - i]; | ||||
436 | buf_in[l - 1 - i] = ctmp; | ||||
437 | } | ||||
438 | } | ||||
439 | } | ||||
440 | |||||
441 | /* Sanity check the input if the input is not raw */ | ||||
442 | if (!rawin |
28.4 | 'rawin' is 1 |
29.1 | 'rawin' is 1 |
47.1 | 'asn1parse' is 0 |
48.1 | 'hexdump' is 0 |
50 | 3rd function call argument is an uninitialized value |