2020-08-17 03:25:08 +08:00
|
|
|
=pod
|
|
|
|
|
|
|
|
=head1 NAME
|
|
|
|
|
|
|
|
OSSL_ENCODER_CTX,
|
|
|
|
OSSL_ENCODER_CTX_new,
|
|
|
|
OSSL_ENCODER_settable_ctx_params,
|
|
|
|
OSSL_ENCODER_CTX_set_params,
|
2020-09-14 15:20:41 +08:00
|
|
|
OSSL_ENCODER_CTX_free,
|
|
|
|
OSSL_ENCODER_CTX_set_selection,
|
2020-10-17 13:57:04 +08:00
|
|
|
OSSL_ENCODER_CTX_set_output_type,
|
|
|
|
OSSL_ENCODER_CTX_set_output_structure,
|
2020-09-14 15:20:41 +08:00
|
|
|
OSSL_ENCODER_CTX_add_encoder,
|
|
|
|
OSSL_ENCODER_CTX_add_extra,
|
|
|
|
OSSL_ENCODER_CTX_get_num_encoders,
|
|
|
|
OSSL_ENCODER_INSTANCE,
|
|
|
|
OSSL_ENCODER_INSTANCE_get_encoder,
|
|
|
|
OSSL_ENCODER_INSTANCE_get_encoder_ctx,
|
|
|
|
OSSL_ENCODER_INSTANCE_get_output_type,
|
2020-10-17 13:57:04 +08:00
|
|
|
OSSL_ENCODER_INSTANCE_get_output_structure,
|
2020-09-14 15:20:41 +08:00
|
|
|
OSSL_ENCODER_CONSTRUCT,
|
|
|
|
OSSL_ENCODER_CLEANUP,
|
|
|
|
OSSL_ENCODER_CTX_set_construct,
|
|
|
|
OSSL_ENCODER_CTX_set_construct_data,
|
|
|
|
OSSL_ENCODER_CTX_set_cleanup
|
2020-08-17 03:25:08 +08:00
|
|
|
- Encoder context routines
|
|
|
|
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
|
|
|
|
#include <openssl/encoder.h>
|
|
|
|
|
|
|
|
typedef struct ossl_encoder_ctx_st OSSL_ENCODER_CTX;
|
|
|
|
|
2020-09-14 15:20:41 +08:00
|
|
|
OSSL_ENCODER_CTX *OSSL_ENCODER_CTX_new();
|
2020-08-17 03:25:08 +08:00
|
|
|
const OSSL_PARAM *OSSL_ENCODER_settable_ctx_params(OSSL_ENCODER *encoder);
|
|
|
|
int OSSL_ENCODER_CTX_set_params(OSSL_ENCODER_CTX *ctx,
|
|
|
|
const OSSL_PARAM params[]);
|
|
|
|
void OSSL_ENCODER_CTX_free(OSSL_ENCODER_CTX *ctx);
|
|
|
|
|
2020-10-17 13:57:04 +08:00
|
|
|
int OSSL_ENCODER_CTX_set_selection(OSSL_ENCODER_CTX *ctx, int selection);
|
2020-09-14 15:20:41 +08:00
|
|
|
int OSSL_ENCODER_CTX_set_output_type(OSSL_ENCODER_CTX *ctx,
|
|
|
|
const char *output_type);
|
2020-10-17 13:57:04 +08:00
|
|
|
int OSSL_ENCODER_CTX_set_output_structure(OSSL_ENCODER_CTX *ctx,
|
|
|
|
const char *output_structure);
|
2020-09-14 15:20:41 +08:00
|
|
|
|
|
|
|
int OSSL_ENCODER_CTX_add_encoder(OSSL_ENCODER_CTX *ctx, OSSL_ENCODER *encoder);
|
|
|
|
int OSSL_ENCODER_CTX_add_extra(OSSL_ENCODER_CTX *ctx,
|
2020-10-15 17:55:50 +08:00
|
|
|
OSSL_LIB_CTX *libctx, const char *propq);
|
2020-09-14 15:20:41 +08:00
|
|
|
int OSSL_ENCODER_CTX_get_num_encoders(OSSL_ENCODER_CTX *ctx);
|
|
|
|
|
|
|
|
typedef struct ossl_encoder_instance_st OSSL_ENCODER_INSTANCE;
|
|
|
|
OSSL_ENCODER *
|
|
|
|
OSSL_ENCODER_INSTANCE_get_encoder(OSSL_ENCODER_INSTANCE *encoder_inst);
|
|
|
|
void *
|
|
|
|
OSSL_ENCODER_INSTANCE_get_encoder_ctx(OSSL_ENCODER_INSTANCE *encoder_inst);
|
|
|
|
const char *
|
|
|
|
OSSL_ENCODER_INSTANCE_get_output_type(OSSL_ENCODER_INSTANCE *encoder_inst);
|
2020-10-17 13:57:04 +08:00
|
|
|
const char *
|
|
|
|
OSSL_ENCODER_INSTANCE_get_output_structure(OSSL_ENCODER_INSTANCE *encoder_inst);
|
2020-09-14 15:20:41 +08:00
|
|
|
|
|
|
|
typedef const void *OSSL_ENCODER_CONSTRUCT(OSSL_ENCODER_INSTANCE *encoder_inst,
|
|
|
|
void *construct_data);
|
|
|
|
typedef void OSSL_ENCODER_CLEANUP(void *construct_data);
|
|
|
|
|
|
|
|
int OSSL_ENCODER_CTX_set_construct(OSSL_ENCODER_CTX *ctx,
|
|
|
|
OSSL_ENCODER_CONSTRUCT *construct);
|
|
|
|
int OSSL_ENCODER_CTX_set_construct_data(OSSL_ENCODER_CTX *ctx,
|
|
|
|
void *construct_data);
|
|
|
|
int OSSL_ENCODER_CTX_set_cleanup(OSSL_ENCODER_CTX *ctx,
|
|
|
|
OSSL_ENCODER_CLEANUP *cleanup);
|
|
|
|
|
2020-08-17 03:25:08 +08:00
|
|
|
=head1 DESCRIPTION
|
|
|
|
|
2020-09-14 15:20:41 +08:00
|
|
|
Encoding an input object to the desired encoding may be done with a chain of
|
|
|
|
encoder implementations, which means that the output from one encoder may be
|
|
|
|
the input for the next in the chain. The B<OSSL_ENCODER_CTX> holds all the
|
|
|
|
data about these encoders. This allows having generic format encoders such
|
|
|
|
as DER to PEM, as well as more specialized encoders like RSA to DER.
|
2020-08-17 03:25:08 +08:00
|
|
|
|
2020-09-14 15:20:41 +08:00
|
|
|
The final output type must be given, and a chain of encoders must end with
|
|
|
|
an implementation that produces that output type.
|
2020-08-17 03:25:08 +08:00
|
|
|
|
2022-01-03 07:00:27 +08:00
|
|
|
At the beginning of the encoding process, a constructor provided by the
|
2020-09-14 15:20:41 +08:00
|
|
|
caller is called to ensure that there is an appropriate provider-side object
|
|
|
|
to start with.
|
|
|
|
The constructor is set with OSSL_ENCODER_CTX_set_construct().
|
2020-08-17 03:25:08 +08:00
|
|
|
|
2020-09-14 15:20:41 +08:00
|
|
|
B<OSSL_ENCODER_INSTANCE> is an opaque structure that contains data about the
|
|
|
|
encoder that is going to be used, and that may be useful for the
|
|
|
|
constructor. There are some functions to extract data from this type,
|
|
|
|
described in L</Constructor> below.
|
2020-08-17 03:25:08 +08:00
|
|
|
|
2020-09-14 15:20:41 +08:00
|
|
|
=head2 Functions
|
2020-08-17 03:25:08 +08:00
|
|
|
|
2020-09-14 15:20:41 +08:00
|
|
|
OSSL_ENCODER_CTX_new() creates a B<OSSL_ENCODER_CTX>.
|
2020-08-17 03:25:08 +08:00
|
|
|
|
|
|
|
OSSL_ENCODER_settable_ctx_params() returns an L<OSSL_PARAM(3)>
|
|
|
|
array of parameter descriptors.
|
|
|
|
|
|
|
|
OSSL_ENCODER_CTX_set_params() attempts to set parameters specified
|
|
|
|
with an L<OSSL_PARAM(3)> array I<params>. Parameters that the
|
|
|
|
implementation doesn't recognise should be ignored.
|
|
|
|
|
|
|
|
OSSL_ENCODER_CTX_free() frees the given context I<ctx>.
|
|
|
|
|
2020-09-14 15:20:41 +08:00
|
|
|
OSSL_ENCODER_CTX_add_encoder() populates the B<OSSL_ENCODER_CTX>
|
|
|
|
I<ctx> with a encoder, to be used to encode an input object.
|
|
|
|
|
|
|
|
OSSL_ENCODER_CTX_add_extra() finds encoders that further encodes output
|
|
|
|
from already added encoders, and adds them as well. This is used to build
|
|
|
|
encoder chains.
|
|
|
|
|
|
|
|
OSSL_ENCODER_CTX_set_output_type() sets the ending output type. This must
|
|
|
|
be specified, and determines if a complete encoder chain is available.
|
|
|
|
|
2020-10-17 13:57:04 +08:00
|
|
|
OSSL_ENCODER_CTX_set_output_structure() sets the desired output structure.
|
|
|
|
This may be used to determines what encoder implementations may be used.
|
|
|
|
Depending on the type of object being encoded, the output structure may
|
|
|
|
not be relevant.
|
|
|
|
|
|
|
|
OSSL_ENCODER_CTX_get_num_encoders() gets the number of encoders currently
|
|
|
|
added to the context I<ctx>.
|
2020-09-14 15:20:41 +08:00
|
|
|
|
|
|
|
OSSL_ENCODER_CTX_set_construct() sets the constructor I<construct>.
|
|
|
|
|
|
|
|
OSSL_ENCODER_CTX_set_construct_data() sets the constructor data that is
|
|
|
|
passed to the constructor every time it's called.
|
|
|
|
|
|
|
|
OSSL_ENCODER_CTX_set_cleanup() sets the constructor data I<cleanup>
|
|
|
|
function. This is called by L<OSSL_ENCODER_CTX_free(3)>.
|
|
|
|
|
|
|
|
=head2 Constructor
|
|
|
|
|
|
|
|
A B<OSSL_ENCODER_CONSTRUCT> gets the following arguments:
|
|
|
|
|
|
|
|
=over 4
|
|
|
|
|
|
|
|
=item I<encoder_inst>
|
|
|
|
|
|
|
|
The B<OSSL_ENCODER_INSTANCE> for the encoder from which the constructor gets
|
|
|
|
its data.
|
|
|
|
|
|
|
|
=item I<construct_data>
|
|
|
|
|
|
|
|
The pointer that was set with OSSL_ENCODE_CTX_set_construct_data().
|
|
|
|
|
|
|
|
=back
|
|
|
|
|
|
|
|
The constructor is expected to return a valid (non-NULL) pointer to a
|
|
|
|
provider-native object that can be used as first input of an encoding chain,
|
2022-01-03 07:00:27 +08:00
|
|
|
or NULL to indicate that an error has occurred.
|
2020-09-14 15:20:41 +08:00
|
|
|
|
|
|
|
These utility functions may be used by a constructor:
|
|
|
|
|
2020-10-17 13:57:04 +08:00
|
|
|
OSSL_ENCODER_INSTANCE_get_encoder() can be used to get the encoder
|
|
|
|
implementation of the encoder instance I<encoder_inst>.
|
|
|
|
|
|
|
|
OSSL_ENCODER_INSTANCE_get_encoder_ctx() can be used to get the encoder
|
|
|
|
implementation's provider context of the encoder instance I<encoder_inst>.
|
2020-09-14 15:20:41 +08:00
|
|
|
|
2020-10-17 13:57:04 +08:00
|
|
|
OSSL_ENCODER_INSTANCE_get_output_type() can be used to get the output type
|
|
|
|
for the encoder implementation of the encoder instance I<encoder_inst>.
|
|
|
|
This will never be NULL.
|
|
|
|
|
|
|
|
OSSL_ENCODER_INSTANCE_get_output_structure() can be used to get the output
|
|
|
|
structure for the encoder implementation of the encoder instance
|
|
|
|
I<encoder_inst>.
|
|
|
|
This may be NULL.
|
2020-09-14 15:20:41 +08:00
|
|
|
|
2020-08-17 03:25:08 +08:00
|
|
|
=head1 RETURN VALUES
|
|
|
|
|
2020-09-14 15:20:41 +08:00
|
|
|
OSSL_ENCODER_CTX_new() returns a pointer to a B<OSSL_ENCODER_CTX>, or NULL
|
|
|
|
if the context structure couldn't be allocated.
|
2020-08-17 03:25:08 +08:00
|
|
|
|
2020-09-14 15:20:41 +08:00
|
|
|
OSSL_ENCODER_settable_ctx_params() returns an L<OSSL_PARAM(3)> array, or
|
|
|
|
NULL if none is available.
|
2020-08-17 03:25:08 +08:00
|
|
|
|
2020-09-14 15:20:41 +08:00
|
|
|
OSSL_ENCODER_CTX_set_params() returns 1 if all recognised parameters were
|
|
|
|
valid, or 0 if one of them was invalid or caused some other failure in the
|
|
|
|
implementation.
|
|
|
|
|
2020-10-17 13:57:04 +08:00
|
|
|
OSSL_ENCODER_CTX_add_encoder(), OSSL_ENCODER_CTX_add_extra(),
|
|
|
|
OSSL_ENCODER_CTX_set_construct(), OSSL_ENCODER_CTX_set_construct_data() and
|
|
|
|
OSSL_ENCODER_CTX_set_cleanup() return 1 on success, or 0 on failure.
|
2020-09-14 15:20:41 +08:00
|
|
|
|
2020-10-17 13:57:04 +08:00
|
|
|
OSSL_ENCODER_CTX_get_num_encoders() returns the current number of encoders.
|
|
|
|
It returns 0 if I<ctx> is NULL.
|
2020-09-14 15:20:41 +08:00
|
|
|
|
2020-10-17 13:57:04 +08:00
|
|
|
OSSL_ENCODER_INSTANCE_get_encoder() returns an B<OSSL_ENCODER> pointer on
|
2020-09-14 15:20:41 +08:00
|
|
|
success, or NULL on failure.
|
|
|
|
|
2020-10-17 13:57:04 +08:00
|
|
|
OSSL_ENCODER_INSTANCE_get_encoder_ctx() returns a provider context pointer on
|
2020-09-14 15:20:41 +08:00
|
|
|
success, or NULL on failure.
|
|
|
|
|
2020-10-17 13:57:04 +08:00
|
|
|
OSSL_ENCODER_INSTANCE_get_output_type() returns a string with the name of the
|
2020-09-14 15:20:41 +08:00
|
|
|
input type, if relevant. NULL is a valid returned value.
|
2020-08-17 03:25:08 +08:00
|
|
|
|
2020-10-17 13:57:04 +08:00
|
|
|
OSSL_ENCODER_INSTANCE_get_output_type() returns a string with the name of the
|
2020-09-14 15:20:41 +08:00
|
|
|
output type.
|
2020-08-17 03:25:08 +08:00
|
|
|
|
2020-10-17 13:57:04 +08:00
|
|
|
OSSL_ENCODER_INSTANCE_get_output_structure() returns a string with the name
|
|
|
|
of the output structure.
|
|
|
|
|
2020-08-17 03:25:08 +08:00
|
|
|
=head1 SEE ALSO
|
|
|
|
|
|
|
|
L<provider(7)>, L<OSSL_ENCODER(3)>
|
|
|
|
|
|
|
|
=head1 HISTORY
|
|
|
|
|
|
|
|
The functions described here were added in OpenSSL 3.0.
|
|
|
|
|
|
|
|
=head1 COPYRIGHT
|
|
|
|
|
2022-05-03 18:52:38 +08:00
|
|
|
Copyright 2019-2022 The OpenSSL Project Authors. All Rights Reserved.
|
2020-08-17 03:25:08 +08:00
|
|
|
|
|
|
|
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
|
|
|
|
L<https://www.openssl.org/source/license.html>.
|
|
|
|
|
|
|
|
=cut
|