| File: | out/../deps/openssl/openssl/providers/implementations/storemgmt/file_store_any2obj.c |
| Warning: | line 223, column 5 Value stored to 'mem_len' is never read |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* |
| 2 | * Copyright 2020-2021 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 | /* |
| 11 | * This is a decoder that's completely internal to the 'file:' store |
| 12 | * implementation. Only code in file_store.c know about this one. Because |
| 13 | * of this close relationship, we can cut certain corners, such as making |
| 14 | * assumptions about the "provider context", which is currently simply the |
| 15 | * provider context that the file_store.c code operates within. |
| 16 | * |
| 17 | * All this does is to read known binary encodings (currently: DER, MSBLOB, |
| 18 | * PVK) from the input if it can, and passes it on to the data callback as |
| 19 | * an object abstraction, leaving it to the callback to figure out what it |
| 20 | * actually is. |
| 21 | * |
| 22 | * This MUST be made the last decoder in a chain, leaving it to other more |
| 23 | * specialized decoders to recognise and process their stuff first. |
| 24 | */ |
| 25 | |
| 26 | #include <openssl/core_dispatch.h> |
| 27 | #include <openssl/core_names.h> |
| 28 | #include <openssl/core_object.h> |
| 29 | #include <openssl/bio.h> |
| 30 | #include <openssl/buffer.h> |
| 31 | #include <openssl/err.h> |
| 32 | #include <openssl/asn1err.h> |
| 33 | #include <openssl/params.h> |
| 34 | #include "internal/asn1.h" |
| 35 | #include "crypto/pem.h" /* For internal PVK and "blob" headers */ |
| 36 | #include "prov/bio.h" |
| 37 | #include "file_store_local.h" |
| 38 | |
| 39 | /* |
| 40 | * newctx and freectx are not strictly necessary. However, the method creator, |
| 41 | * ossl_decoder_from_algorithm(), demands that they exist, so we make sure to |
| 42 | * oblige. |
| 43 | */ |
| 44 | |
| 45 | static OSSL_FUNC_decoder_newctx_fn any2obj_newctx; |
| 46 | static OSSL_FUNC_decoder_freectx_fn any2obj_freectx; |
| 47 | |
| 48 | static void *any2obj_newctx(void *provctx) |
| 49 | { |
| 50 | return provctx; |
| 51 | } |
| 52 | |
| 53 | static void any2obj_freectx(void *vctx) |
| 54 | { |
| 55 | } |
| 56 | |
| 57 | static int any2obj_decode_final(void *provctx, int objtype, BUF_MEM *mem, |
| 58 | OSSL_CALLBACK *data_cb, void *data_cbarg) |
| 59 | { |
| 60 | /* |
| 61 | * 1 indicates that we successfully decoded something, or not at all. |
| 62 | * Ending up "empty handed" is not an error. |
| 63 | */ |
| 64 | int ok = 1; |
| 65 | |
| 66 | if (mem != NULL((void*)0)) { |
| 67 | OSSL_PARAM params[3]; |
| 68 | |
| 69 | params[0] = |
| 70 | OSSL_PARAM_construct_int(OSSL_OBJECT_PARAM_TYPE"type", &objtype); |
| 71 | params[1] = |
| 72 | OSSL_PARAM_construct_octet_string(OSSL_OBJECT_PARAM_DATA"data", |
| 73 | mem->data, mem->length); |
| 74 | params[2] = OSSL_PARAM_construct_end(); |
| 75 | |
| 76 | ok = data_cb(params, data_cbarg); |
| 77 | BUF_MEM_free(mem); |
| 78 | } |
| 79 | return ok; |
| 80 | } |
| 81 | |
| 82 | static OSSL_FUNC_decoder_decode_fn der2obj_decode; |
| 83 | static int der2obj_decode(void *provctx, OSSL_CORE_BIO *cin, int selection, |
| 84 | OSSL_CALLBACK *data_cb, void *data_cbarg, |
| 85 | OSSL_PASSPHRASE_CALLBACK *pw_cb, void *pw_cbarg) |
| 86 | { |
| 87 | BIO *in = ossl_bio_new_from_core_bio(provctx, cin); |
| 88 | BUF_MEM *mem = NULL((void*)0); |
| 89 | int ok; |
| 90 | |
| 91 | if (in == NULL((void*)0)) |
| 92 | return 0; |
| 93 | |
| 94 | ERR_set_mark(); |
| 95 | ok = (asn1_d2i_read_bio(in, &mem) >= 0); |
| 96 | ERR_pop_to_mark(); |
| 97 | if (!ok && mem != NULL((void*)0)) { |
| 98 | BUF_MEM_free(mem); |
| 99 | mem = NULL((void*)0); |
| 100 | } |
| 101 | BIO_free(in); |
| 102 | |
| 103 | /* any2obj_decode_final() frees |mem| for us */ |
| 104 | return any2obj_decode_final(provctx, OSSL_OBJECT_UNKNOWN0, mem, |
| 105 | data_cb, data_cbarg); |
| 106 | } |
| 107 | |
| 108 | static OSSL_FUNC_decoder_decode_fn msblob2obj_decode; |
| 109 | static int msblob2obj_decode(void *provctx, OSSL_CORE_BIO *cin, int selection, |
| 110 | OSSL_CALLBACK *data_cb, void *data_cbarg, |
| 111 | OSSL_PASSPHRASE_CALLBACK *pw_cb, void *pw_cbarg) |
| 112 | { |
| 113 | BIO *in = ossl_bio_new_from_core_bio(provctx, cin); |
| 114 | BUF_MEM *mem = NULL((void*)0); |
| 115 | size_t mem_len = 0, mem_want; |
| 116 | const unsigned char *p; |
| 117 | unsigned int bitlen, magic; |
| 118 | int isdss = -1; |
| 119 | int ispub = -1; |
| 120 | int ok = 0; |
| 121 | |
| 122 | if (in == NULL((void*)0)) |
| 123 | goto err; |
| 124 | |
| 125 | mem_want = 16; /* The size of the MSBLOB header */ |
| 126 | if ((mem = BUF_MEM_new()) == NULL((void*)0) |
| 127 | || !BUF_MEM_grow(mem, mem_want)) { |
| 128 | ERR_raise(ERR_LIB_PEM, ERR_R_MALLOC_FAILURE)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/providers/implementations/storemgmt/file_store_any2obj.c" ,128,__func__), ERR_set_error)((9),((256|((0x1 << 18L)| (0x2 << 18L)))),((void*)0)); |
| 129 | goto err; |
| 130 | } |
| 131 | |
| 132 | ERR_set_mark(); |
| 133 | ok = BIO_read(in, &mem->data[0], mem_want) == (int)mem_want; |
| 134 | mem_len += mem_want; |
| 135 | ERR_pop_to_mark(); |
| 136 | if (!ok) |
| 137 | goto next; |
| 138 | |
| 139 | |
| 140 | ERR_set_mark(); |
| 141 | p = (unsigned char *)&mem->data[0]; |
| 142 | ok = ossl_do_blob_header(&p, 16, &magic, &bitlen, &isdss, &ispub) > 0; |
| 143 | ERR_pop_to_mark(); |
| 144 | if (!ok) |
| 145 | goto next; |
| 146 | |
| 147 | ok = 0; |
| 148 | mem_want = ossl_blob_length(bitlen, isdss, ispub); |
| 149 | if (!BUF_MEM_grow(mem, mem_len + mem_want)) { |
| 150 | ERR_raise(ERR_LIB_PEM, ERR_R_MALLOC_FAILURE)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/providers/implementations/storemgmt/file_store_any2obj.c" ,150,__func__), ERR_set_error)((9),((256|((0x1 << 18L)| (0x2 << 18L)))),((void*)0)); |
| 151 | goto err; |
| 152 | } |
| 153 | |
| 154 | ERR_set_mark(); |
| 155 | ok = BIO_read(in, &mem->data[mem_len], mem_want) == (int)mem_want; |
| 156 | mem_len += mem_want; |
| 157 | ERR_pop_to_mark(); |
| 158 | |
| 159 | next: |
| 160 | /* Free resources we no longer need. */ |
| 161 | BIO_free(in); |
| 162 | if (!ok && mem != NULL((void*)0)) { |
| 163 | BUF_MEM_free(mem); |
| 164 | mem = NULL((void*)0); |
| 165 | } |
| 166 | |
| 167 | /* any2obj_decode_final() frees |mem| for us */ |
| 168 | return any2obj_decode_final(provctx, OSSL_OBJECT_PKEY2, mem, |
| 169 | data_cb, data_cbarg); |
| 170 | |
| 171 | err: |
| 172 | BIO_free(in); |
| 173 | BUF_MEM_free(mem); |
| 174 | return 0; |
| 175 | } |
| 176 | |
| 177 | static OSSL_FUNC_decoder_decode_fn pvk2obj_decode; |
| 178 | static int pvk2obj_decode(void *provctx, OSSL_CORE_BIO *cin, int selection, |
| 179 | OSSL_CALLBACK *data_cb, void *data_cbarg, |
| 180 | OSSL_PASSPHRASE_CALLBACK *pw_cb, void *pw_cbarg) |
| 181 | { |
| 182 | BIO *in = ossl_bio_new_from_core_bio(provctx, cin); |
| 183 | BUF_MEM *mem = NULL((void*)0); |
| 184 | size_t mem_len = 0, mem_want; |
| 185 | const unsigned char *p; |
| 186 | unsigned int saltlen, keylen; |
| 187 | int ok = 0; |
| 188 | |
| 189 | if (in == NULL((void*)0)) |
| 190 | goto err; |
| 191 | |
| 192 | mem_want = 24; /* The size of the PVK header */ |
| 193 | if ((mem = BUF_MEM_new()) == NULL((void*)0) |
| 194 | || !BUF_MEM_grow(mem, mem_want)) { |
| 195 | ERR_raise(ERR_LIB_PEM, ERR_R_MALLOC_FAILURE)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/providers/implementations/storemgmt/file_store_any2obj.c" ,195,__func__), ERR_set_error)((9),((256|((0x1 << 18L)| (0x2 << 18L)))),((void*)0)); |
| 196 | goto err; |
| 197 | } |
| 198 | |
| 199 | ERR_set_mark(); |
| 200 | ok = BIO_read(in, &mem->data[0], mem_want) == (int)mem_want; |
| 201 | mem_len += mem_want; |
| 202 | ERR_pop_to_mark(); |
| 203 | if (!ok) |
| 204 | goto next; |
| 205 | |
| 206 | |
| 207 | ERR_set_mark(); |
| 208 | p = (unsigned char *)&mem->data[0]; |
| 209 | ok = ossl_do_PVK_header(&p, 24, 0, &saltlen, &keylen) > 0; |
| 210 | ERR_pop_to_mark(); |
| 211 | if (!ok) |
| 212 | goto next; |
| 213 | |
| 214 | ok = 0; |
| 215 | mem_want = saltlen + keylen; |
| 216 | if (!BUF_MEM_grow(mem, mem_len + mem_want)) { |
| 217 | ERR_raise(ERR_LIB_PEM, ERR_R_MALLOC_FAILURE)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/providers/implementations/storemgmt/file_store_any2obj.c" ,217,__func__), ERR_set_error)((9),((256|((0x1 << 18L)| (0x2 << 18L)))),((void*)0)); |
| 218 | goto err; |
| 219 | } |
| 220 | |
| 221 | ERR_set_mark(); |
| 222 | ok = BIO_read(in, &mem->data[mem_len], mem_want) == (int)mem_want; |
| 223 | mem_len += mem_want; |
Value stored to 'mem_len' is never read | |
| 224 | ERR_pop_to_mark(); |
| 225 | |
| 226 | next: |
| 227 | /* Free resources we no longer need. */ |
| 228 | BIO_free(in); |
| 229 | if (!ok && mem != NULL((void*)0)) { |
| 230 | BUF_MEM_free(mem); |
| 231 | mem = NULL((void*)0); |
| 232 | } |
| 233 | |
| 234 | /* any2obj_decode_final() frees |mem| for us */ |
| 235 | return any2obj_decode_final(provctx, OSSL_OBJECT_PKEY2, mem, |
| 236 | data_cb, data_cbarg); |
| 237 | |
| 238 | err: |
| 239 | BIO_free(in); |
| 240 | BUF_MEM_free(mem); |
| 241 | return 0; |
| 242 | } |
| 243 | |
| 244 | #define MAKE_DECODER(fromtype, objtype)static const OSSL_DISPATCH fromtype_to_obj_decoder_functions[ ] = { { 1, (void (*)(void))any2obj_newctx }, { 2, (void (*)(void ))any2obj_freectx }, { 11, (void (*)(void))fromtype2obj_decode }, { 0, ((void*)0) } } \ |
| 245 | static const OSSL_DISPATCH fromtype##_to_obj_decoder_functions[] = { \ |
| 246 | { OSSL_FUNC_DECODER_NEWCTX1, (void (*)(void))any2obj_newctx }, \ |
| 247 | { OSSL_FUNC_DECODER_FREECTX2, (void (*)(void))any2obj_freectx }, \ |
| 248 | { OSSL_FUNC_DECODER_DECODE11, (void (*)(void))fromtype##2obj_decode }, \ |
| 249 | { 0, NULL((void*)0) } \ |
| 250 | } |
| 251 | |
| 252 | MAKE_DECODER(der, OSSL_OBJECT_UNKNOWN)static const OSSL_DISPATCH der_to_obj_decoder_functions[] = { { 1, (void (*)(void))any2obj_newctx }, { 2, (void (*)(void)) any2obj_freectx }, { 11, (void (*)(void))der2obj_decode }, { 0 , ((void*)0) } }; |
| 253 | MAKE_DECODER(msblob, OSSL_OBJECT_PKEY)static const OSSL_DISPATCH msblob_to_obj_decoder_functions[] = { { 1, (void (*)(void))any2obj_newctx }, { 2, (void (*)(void ))any2obj_freectx }, { 11, (void (*)(void))msblob2obj_decode } , { 0, ((void*)0) } }; |
| 254 | MAKE_DECODER(pvk, OSSL_OBJECT_PKEY)static const OSSL_DISPATCH pvk_to_obj_decoder_functions[] = { { 1, (void (*)(void))any2obj_newctx }, { 2, (void (*)(void)) any2obj_freectx }, { 11, (void (*)(void))pvk2obj_decode }, { 0 , ((void*)0) } }; |
| 255 | |
| 256 | const OSSL_ALGORITHM ossl_any_to_obj_algorithm[] = { |
| 257 | { "obj", "input=DER", der_to_obj_decoder_functions }, |
| 258 | { "obj", "input=MSBLOB", msblob_to_obj_decoder_functions }, |
| 259 | { "obj", "input=PVK", pvk_to_obj_decoder_functions }, |
| 260 | { NULL((void*)0), } |
| 261 | }; |