1 /* 2 * Copyright 2019-2023 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 <openssl/core_dispatch.h> 11 #include <openssl/types.h> 12 #include <openssl/safestack.h> 13 #include <openssl/encoder.h> 14 #include <openssl/decoder.h> 15 #include "internal/cryptlib.h" 16 #include "internal/passphrase.h" 17 #include "internal/property.h" 18 #include "internal/refcount.h" 19 20 struct ossl_endecode_base_st { 21 OSSL_PROVIDER *prov; 22 int id; 23 char *name; 24 const OSSL_ALGORITHM *algodef; 25 OSSL_PROPERTY_LIST *parsed_propdef; 26 27 CRYPTO_REF_COUNT refcnt; 28 }; 29 30 struct ossl_encoder_st { 31 struct ossl_endecode_base_st base; 32 OSSL_FUNC_encoder_newctx_fn *newctx; 33 OSSL_FUNC_encoder_freectx_fn *freectx; 34 OSSL_FUNC_encoder_get_params_fn *get_params; 35 OSSL_FUNC_encoder_gettable_params_fn *gettable_params; 36 OSSL_FUNC_encoder_set_ctx_params_fn *set_ctx_params; 37 OSSL_FUNC_encoder_settable_ctx_params_fn *settable_ctx_params; 38 OSSL_FUNC_encoder_does_selection_fn *does_selection; 39 OSSL_FUNC_encoder_encode_fn *encode; 40 OSSL_FUNC_encoder_import_object_fn *import_object; 41 OSSL_FUNC_encoder_free_object_fn *free_object; 42 }; 43 44 struct ossl_decoder_st { 45 struct ossl_endecode_base_st base; 46 OSSL_FUNC_decoder_newctx_fn *newctx; 47 OSSL_FUNC_decoder_freectx_fn *freectx; 48 OSSL_FUNC_decoder_get_params_fn *get_params; 49 OSSL_FUNC_decoder_gettable_params_fn *gettable_params; 50 OSSL_FUNC_decoder_set_ctx_params_fn *set_ctx_params; 51 OSSL_FUNC_decoder_settable_ctx_params_fn *settable_ctx_params; 52 OSSL_FUNC_decoder_does_selection_fn *does_selection; 53 OSSL_FUNC_decoder_decode_fn *decode; 54 OSSL_FUNC_decoder_export_object_fn *export_object; 55 }; 56 57 struct ossl_encoder_instance_st { 58 OSSL_ENCODER *encoder; /* Never NULL */ 59 void *encoderctx; /* Never NULL */ 60 const char *output_type; /* Never NULL */ 61 const char *output_structure; /* May be NULL */ 62 }; 63 64 DEFINE_STACK_OF(OSSL_ENCODER_INSTANCE) 65 66 void ossl_encoder_instance_free(OSSL_ENCODER_INSTANCE *encoder_inst); 67 68 struct ossl_encoder_ctx_st { 69 /* 70 * Select what parts of an object will be encoded. This selection is 71 * bit encoded, and the bits correspond to selection bits available with 72 * the provider side operation. For example, when encoding an EVP_PKEY, 73 * the OSSL_KEYMGMT_SELECT_ macros are used for this. 74 */ 75 int selection; 76 /* 77 * The desired output type. The encoder implementation must have a 78 * gettable "output-type" parameter that this will match against. 79 */ 80 const char *output_type; 81 /* 82 * The desired output structure, if that's relevant for the type of 83 * object being encoded. It may be used for selection of the starting 84 * encoder implementations in a chain. 85 */ 86 const char *output_structure; 87 88 /* 89 * Decoders that are components of any current decoding path. 90 */ 91 STACK_OF(OSSL_ENCODER_INSTANCE) *encoder_insts; 92 93 /* 94 * The constructor and destructor of an object to pass to the first 95 * encoder in a chain. 96 */ 97 OSSL_ENCODER_CONSTRUCT *construct; 98 OSSL_ENCODER_CLEANUP *cleanup; 99 void *construct_data; 100 101 /* For any function that needs a passphrase reader */ 102 struct ossl_passphrase_data_st pwdata; 103 }; 104 105 struct ossl_decoder_instance_st { 106 OSSL_DECODER *decoder; /* Never NULL */ 107 void *decoderctx; /* Never NULL */ 108 const char *input_type; /* Never NULL */ 109 const char *input_structure; /* May be NULL */ 110 int input_type_id; 111 112 unsigned int flag_input_structure_was_set : 1; 113 }; 114 115 DEFINE_STACK_OF(OSSL_DECODER_INSTANCE) 116 117 struct ossl_decoder_ctx_st { 118 /* 119 * The caller may know the input type of the data they pass. If not, 120 * this will remain NULL and the decoding functionality will start 121 * with trying to decode with any desencoder in |decoder_insts|, 122 * regardless of their respective input type. 123 */ 124 const char *start_input_type; 125 /* 126 * The desired input structure, if that's relevant for the type of 127 * object being encoded. It may be used for selection of the ending 128 * decoder implementations in a chain, i.e. those chosen using the 129 * expected output data type. 130 */ 131 const char *input_structure; 132 /* 133 * Select what parts of an object are expected. This may affect what 134 * decoder implementations are selected, because there are structures 135 * that look different depending on this selection; for example, EVP_PKEY 136 * objects often have different encoding structures for private keys, 137 * public keys and key parameters. 138 * This selection is bit encoded, and the bits correspond to selection 139 * bits available with the provider side operation. For example, when 140 * encoding an EVP_PKEY, the OSSL_KEYMGMT_SELECT_ macros are used for 141 * this. 142 */ 143 int selection; 144 145 /* 146 * Decoders that are components of any current decoding path. 147 */ 148 STACK_OF(OSSL_DECODER_INSTANCE) *decoder_insts; 149 150 /* 151 * The constructors of a decoding, and its caller argument. 152 */ 153 OSSL_DECODER_CONSTRUCT *construct; 154 OSSL_DECODER_CLEANUP *cleanup; 155 void *construct_data; 156 157 /* For any function that needs a passphrase reader */ 158 struct ossl_passphrase_data_st pwdata; 159 }; 160 161 const OSSL_PROPERTY_LIST * 162 ossl_decoder_parsed_properties(const OSSL_DECODER *decoder); 163 const OSSL_PROPERTY_LIST * 164 ossl_encoder_parsed_properties(const OSSL_ENCODER *encoder); 165 166 int ossl_decoder_fast_is_a(OSSL_DECODER *decoder, 167 const char *name, int *id_cache); 168