1 /* 2 * Copyright 2019-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 #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 CRYPTO_RWLOCK *lock; 29 }; 30 31 struct ossl_encoder_st { 32 struct ossl_endecode_base_st base; 33 OSSL_FUNC_encoder_newctx_fn *newctx; 34 OSSL_FUNC_encoder_freectx_fn *freectx; 35 OSSL_FUNC_encoder_get_params_fn *get_params; 36 OSSL_FUNC_encoder_gettable_params_fn *gettable_params; 37 OSSL_FUNC_encoder_set_ctx_params_fn *set_ctx_params; 38 OSSL_FUNC_encoder_settable_ctx_params_fn *settable_ctx_params; 39 OSSL_FUNC_encoder_does_selection_fn *does_selection; 40 OSSL_FUNC_encoder_encode_fn *encode; 41 OSSL_FUNC_encoder_import_object_fn *import_object; 42 OSSL_FUNC_encoder_free_object_fn *free_object; 43 }; 44 45 struct ossl_decoder_st { 46 struct ossl_endecode_base_st base; 47 OSSL_FUNC_decoder_newctx_fn *newctx; 48 OSSL_FUNC_decoder_freectx_fn *freectx; 49 OSSL_FUNC_decoder_get_params_fn *get_params; 50 OSSL_FUNC_decoder_gettable_params_fn *gettable_params; 51 OSSL_FUNC_decoder_set_ctx_params_fn *set_ctx_params; 52 OSSL_FUNC_decoder_settable_ctx_params_fn *settable_ctx_params; 53 OSSL_FUNC_decoder_does_selection_fn *does_selection; 54 OSSL_FUNC_decoder_decode_fn *decode; 55 OSSL_FUNC_decoder_export_object_fn *export_object; 56 }; 57 58 struct ossl_encoder_instance_st { 59 OSSL_ENCODER *encoder; /* Never NULL */ 60 void *encoderctx; /* Never NULL */ 61 const char *output_type; /* Never NULL */ 62 const char *output_structure; /* May be NULL */ 63 }; 64 65 DEFINE_STACK_OF(OSSL_ENCODER_INSTANCE) 66 67 void ossl_encoder_instance_free(OSSL_ENCODER_INSTANCE *encoder_inst); 68 69 struct ossl_encoder_ctx_st { 70 /* 71 * Select what parts of an object will be encoded. This selection is 72 * bit encoded, and the bits correspond to selection bits available with 73 * the provider side operation. For example, when encoding an EVP_PKEY, 74 * the OSSL_KEYMGMT_SELECT_ macros are used for this. 75 */ 76 int selection; 77 /* 78 * The desired output type. The encoder implementation must have a 79 * gettable "output-type" parameter that this will match against. 80 */ 81 const char *output_type; 82 /* 83 * The desired output structure, if that's relevant for the type of 84 * object being encoded. It may be used for selection of the starting 85 * encoder implementations in a chain. 86 */ 87 const char *output_structure; 88 89 /* 90 * Decoders that are components of any current decoding path. 91 */ 92 STACK_OF(OSSL_ENCODER_INSTANCE) *encoder_insts; 93 94 /* 95 * The constructor and destructor of an object to pass to the first 96 * encoder in a chain. 97 */ 98 OSSL_ENCODER_CONSTRUCT *construct; 99 OSSL_ENCODER_CLEANUP *cleanup; 100 void *construct_data; 101 102 /* For any function that needs a passphrase reader */ 103 struct ossl_passphrase_data_st pwdata; 104 }; 105 106 struct ossl_decoder_instance_st { 107 OSSL_DECODER *decoder; /* Never NULL */ 108 void *decoderctx; /* Never NULL */ 109 const char *input_type; /* Never NULL */ 110 const char *input_structure; /* May be NULL */ 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