mirror of
https://github.com/QuasarApp/openssl.git
synced 2025-04-30 19:54:39 +00:00
The pass phrase prompter that's part of OSSL_ENCODER and OSSL_DECODER is really a passphrase callback bridge between the diverse forms of prompters that exist within OpenSSL: pem_password_cb, ui_method and OSSL_PASSPHRASE_CALLBACK. This can be generalised, to be re-used by other parts of OpenSSL, and to thereby allow the users to specify whatever form of pass phrase callback they need, while being able to pass that on to other APIs that are called internally, in the form that those APIs demand. Additionally, we throw in the possibility to cache pass phrases during a "session" (we leave it to each API to define what a "session" is). This is useful for any API that implements discovery and therefore may need to get the same password more than once, such as OSSL_DECODER and OSSL_STORE. Reviewed-by: Shane Lontis <shane.lontis@oracle.com> (Merged from https://github.com/openssl/openssl/pull/12512)
103 lines
3.1 KiB
C
103 lines
3.1 KiB
C
/*
|
|
* Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved.
|
|
*
|
|
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
|
* this file except in compliance with the License. You can obtain a copy
|
|
* in the file LICENSE in the source distribution or at
|
|
* https://www.openssl.org/source/license.html
|
|
*/
|
|
|
|
#include <openssl/core_dispatch.h>
|
|
#include <openssl/types.h>
|
|
#include <openssl/safestack.h>
|
|
#include <openssl/encoder.h>
|
|
#include <openssl/decoder.h>
|
|
#include "internal/cryptlib.h"
|
|
#include "internal/passphrase.h"
|
|
#include "internal/refcount.h"
|
|
|
|
struct ossl_serdes_base_st {
|
|
OSSL_PROVIDER *prov;
|
|
int id;
|
|
const char *propdef;
|
|
|
|
CRYPTO_REF_COUNT refcnt;
|
|
CRYPTO_RWLOCK *lock;
|
|
};
|
|
|
|
struct ossl_encoder_st {
|
|
struct ossl_serdes_base_st base;
|
|
OSSL_FUNC_encoder_newctx_fn *newctx;
|
|
OSSL_FUNC_encoder_freectx_fn *freectx;
|
|
OSSL_FUNC_encoder_set_ctx_params_fn *set_ctx_params;
|
|
OSSL_FUNC_encoder_settable_ctx_params_fn *settable_ctx_params;
|
|
OSSL_FUNC_encoder_encode_data_fn *encode_data;
|
|
OSSL_FUNC_encoder_encode_object_fn *encode_object;
|
|
};
|
|
|
|
struct ossl_decoder_st {
|
|
struct ossl_serdes_base_st base;
|
|
OSSL_FUNC_decoder_newctx_fn *newctx;
|
|
OSSL_FUNC_decoder_freectx_fn *freectx;
|
|
OSSL_FUNC_decoder_get_params_fn *get_params;
|
|
OSSL_FUNC_decoder_gettable_params_fn *gettable_params;
|
|
OSSL_FUNC_decoder_set_ctx_params_fn *set_ctx_params;
|
|
OSSL_FUNC_decoder_settable_ctx_params_fn *settable_ctx_params;
|
|
OSSL_FUNC_decoder_decode_fn *decode;
|
|
OSSL_FUNC_decoder_export_object_fn *export_object;
|
|
};
|
|
|
|
struct ossl_encoder_ctx_st {
|
|
OSSL_ENCODER *encoder;
|
|
void *serctx;
|
|
|
|
int selection;
|
|
|
|
/*-
|
|
* Output / encoding data, used by OSSL_ENCODER_to_{bio,fp}
|
|
*
|
|
* |object| is the libcrypto object to handle.
|
|
* |do_output| performs the actual encoding.
|
|
*
|
|
* |do_output| must have intimate knowledge of |object|.
|
|
*/
|
|
const void *object;
|
|
int (*do_output)(OSSL_ENCODER_CTX *ctx, BIO *out);
|
|
|
|
/* For any function that needs a passphrase reader */
|
|
struct ossl_passphrase_data_st pwdata;
|
|
};
|
|
|
|
struct ossl_decoder_instance_st {
|
|
OSSL_DECODER *decoder; /* Never NULL */
|
|
void *deserctx; /* Never NULL */
|
|
const char *input_type; /* Never NULL */
|
|
};
|
|
|
|
DEFINE_STACK_OF(OSSL_DECODER_INSTANCE)
|
|
|
|
struct ossl_decoder_ctx_st {
|
|
/*
|
|
* The caller may know the input type of the data they pass. If not,
|
|
* this will remain NULL and the decoding functionality will start
|
|
* with trying to decode with any desencoder in |decoder_insts|,
|
|
* regardless of their respective input type.
|
|
*/
|
|
const char *start_input_type;
|
|
|
|
/*
|
|
* Decoders that are components of any current decoding path.
|
|
*/
|
|
STACK_OF(OSSL_DECODER_INSTANCE) *decoder_insts;
|
|
|
|
/*
|
|
* The constructors of a decoding, and its caller argument.
|
|
*/
|
|
OSSL_DECODER_CONSTRUCT *construct;
|
|
OSSL_DECODER_CLEANUP *cleanup;
|
|
void *construct_data;
|
|
|
|
/* For any function that needs a passphrase reader */
|
|
struct ossl_passphrase_data_st pwdata;
|
|
};
|