| =pod |
| |
| =head1 NAME |
| |
| provider-encoder - The OSSL_ENCODER library E<lt>-E<gt> provider functions |
| |
| =head1 SYNOPSIS |
| |
| #include <openssl/core_dispatch.h> |
| |
| /* |
| * None of these are actual functions, but are displayed like this for |
| * the function signatures for functions that are offered as function |
| * pointers in OSSL_DISPATCH arrays. |
| */ |
| |
| /* Encoder parameter accessor and descriptor */ |
| const OSSL_PARAM *OSSL_FUNC_encoder_gettable_params(void *provctx); |
| int OSSL_FUNC_encoder_get_params(OSSL_PARAM params[]); |
| |
| /* Functions to construct / destruct / manipulate the encoder context */ |
| void *OSSL_FUNC_encoder_newctx(void *provctx); |
| void OSSL_FUNC_encoder_freectx(void *ctx); |
| int OSSL_FUNC_encoder_set_ctx_params(void *ctx, const OSSL_PARAM params[]); |
| const OSSL_PARAM *OSSL_FUNC_encoder_settable_ctx_params(void *provctx); |
| |
| /* Functions to check selection support */ |
| int OSSL_FUNC_encoder_does_selection(void *provctx, int selection); |
| |
| /* Functions to encode object data */ |
| int OSSL_FUNC_encoder_encode(void *ctx, OSSL_CORE_BIO *out, |
| const void *obj_raw, |
| const OSSL_PARAM obj_abstract[], |
| int selection, |
| OSSL_PASSPHRASE_CALLBACK *cb, |
| void *cbarg); |
| |
| /* Functions to import and free a temporary object to be encoded */ |
| void *OSSL_FUNC_encoder_import_object(void *ctx, int selection, |
| const OSSL_PARAM params[]); |
| void OSSL_FUNC_encoder_free_object(void *obj); |
| |
| |
| =head1 DESCRIPTION |
| |
| I<We use the wide term "encode" in this manual. This includes but is |
| not limited to serialization.> |
| |
| The ENCODER operation is a generic method to encode a provider-native |
| object (I<obj_raw>) or an object abstraction (I<object_abstract>, see |
| L<provider-object(7)>) into an encoded form, and write the result to |
| the given OSSL_CORE_BIO. If the caller wants to get the encoded |
| stream to memory, it should provide a L<BIO_s_mem(3)> B<BIO>. |
| |
| The encoder doesn't need to know more about the B<OSSL_CORE_BIO> |
| pointer than being able to pass it to the appropriate BIO upcalls (see |
| L<provider-base(7)/Core functions>). |
| |
| The ENCODER implementation may be part of a chain, where data is |
| passed from one to the next. For example, there may be an |
| implementation to encode an object to DER (that object is assumed to |
| be provider-native and thereby passed via I<obj_raw>), and another one |
| that encodes DER to PEM (that one would receive the DER encoding via |
| I<obj_abstract>). |
| |
| =begin comment |
| |
| Having the DER encoding passed via I<obj_abstract> may seem |
| complicated. However, there may be associated meta-data, such as the |
| original data type, that need to be passed alongside it, and since |
| L<provider-object(7)> already defines a way to pass such data, |
| inventing another way to do it makes things even more complicated. |
| |
| =end comment |
| |
| The encoding using the L<OSSL_PARAM(3)> array form allows a |
| encoder to be used for data that's been exported from another |
| provider, and thereby allow them to exist independently of each |
| other. |
| |
| The encoding using a provider side object can only be safely used |
| with provider data coming from the same provider, for example keys |
| with the L<KEYMGMT|provider-keymgmt(7)> provider. |
| |
| All "functions" mentioned here are passed as function pointers between |
| F<libcrypto> and the provider in B<OSSL_DISPATCH> arrays via |
| B<OSSL_ALGORITHM> arrays that are returned by the provider's |
| provider_query_operation() function |
| (see L<provider-base(7)/Provider Functions>). |
| |
| All these "functions" have a corresponding function type definition |
| named B<OSSL_FUNC_{name}_fn>, and a helper function to retrieve the |
| function pointer from an B<OSSL_DISPATCH> element named |
| B<OSSL_FUNC_{name}>. |
| For example, the "function" OSSL_FUNC_encoder_encode() has these: |
| |
| typedef int |
| (OSSL_FUNC_encoder_encode_fn)(void *ctx, OSSL_CORE_BIO *out, |
| const void *obj_raw, |
| const OSSL_PARAM obj_abstract[], |
| int selection, |
| OSSL_PASSPHRASE_CALLBACK *cb, void *cbarg); |
| static ossl_inline OSSL_FUNC_encoder_encode_fn |
| OSSL_FUNC_encoder_encode(const OSSL_DISPATCH *opf); |
| |
| B<OSSL_DISPATCH> arrays are indexed by numbers that are provided as |
| macros in L<openssl-core_dispatch.h(7)>, as follows: |
| |
| OSSL_FUNC_encoder_get_params OSSL_FUNC_ENCODER_GET_PARAMS |
| OSSL_FUNC_encoder_gettable_params OSSL_FUNC_ENCODER_GETTABLE_PARAMS |
| |
| OSSL_FUNC_encoder_newctx OSSL_FUNC_ENCODER_NEWCTX |
| OSSL_FUNC_encoder_freectx OSSL_FUNC_ENCODER_FREECTX |
| OSSL_FUNC_encoder_set_ctx_params OSSL_FUNC_ENCODER_SET_CTX_PARAMS |
| OSSL_FUNC_encoder_settable_ctx_params OSSL_FUNC_ENCODER_SETTABLE_CTX_PARAMS |
| |
| OSSL_FUNC_encoder_does_selection OSSL_FUNC_ENCODER_DOES_SELECTION |
| |
| OSSL_FUNC_encoder_encode OSSL_FUNC_ENCODER_ENCODE |
| |
| OSSL_FUNC_encoder_import_object OSSL_FUNC_ENCODER_IMPORT_OBJECT |
| OSSL_FUNC_encoder_free_object OSSL_FUNC_ENCODER_FREE_OBJECT |
| |
| =head2 Names and properties |
| |
| The name of an implementation should match the type of object it handles. |
| For example, an implementation that encodes an RSA key should be named "RSA". |
| Likewise, an implementation that further encodes DER should be named "DER". |
| |
| Properties can be used to further specify details about an implementation: |
| |
| =over 4 |
| |
| =item output |
| |
| This property is used to specify what type of output the implementation |
| produces. |
| |
| This property is I<mandatory>. |
| |
| OpenSSL providers recognize the following output types: |
| |
| =over 4 |
| |
| =item text |
| |
| An implementation with that output type outputs human readable text, making |
| that implementation suitable for C<-text> output in diverse L<openssl(1)> |
| commands. |
| |
| =item pem |
| |
| An implementation with that output type outputs PEM formatted data. |
| |
| =item der |
| |
| An implementation with that output type outputs DER formatted data. |
| |
| =item msblob |
| |
| An implementation with that output type outputs MSBLOB formatted data. |
| |
| =item pvk |
| |
| An implementation with that output type outputs PVK formatted data. |
| |
| =back |
| |
| =item structure |
| |
| This property is used to specify the structure that is used for the encoded |
| object. An example could be C<pkcs8>, to specify explicitly that an object |
| (presumably an asymmetric key pair, in this case) will be wrapped in a |
| PKCS#8 structure as part of the encoding. |
| |
| This property is I<optional>. |
| |
| =back |
| |
| The possible values of both these properties is open ended. A provider may |
| very well specify output types and structures that libcrypto doesn't know |
| anything about. |
| |
| =head2 Subset selections |
| |
| Sometimes, an object has more than one subset of data that is interesting to |
| treat separately or together. It's possible to specify what subsets are to |
| be encoded, with a set of bits I<selection> that are passed in an B<int>. |
| |
| This set of bits depend entirely on what kind of provider-side object is |
| passed. For example, those bits are assumed to be the same as those used |
| with L<provider-keymgmt(7)> (see L<provider-keymgmt(7)/Key Objects>) when |
| the object is an asymmetric keypair. |
| |
| ENCODER implementations are free to regard the I<selection> as a set of |
| hints, but must do so with care. In the end, the output must make sense, |
| and if there's a corresponding decoder, the resulting decoded object must |
| match the original object that was encoded. |
| |
| OSSL_FUNC_encoder_does_selection() should tell if a particular implementation |
| supports any of the combinations given by I<selection>. |
| |
| =head2 Context functions |
| |
| OSSL_FUNC_encoder_newctx() returns a context to be used with the rest of |
| the functions. |
| |
| OSSL_FUNC_encoder_freectx() frees the given I<ctx>, if it was created by |
| OSSL_FUNC_encoder_newctx(). |
| |
| OSSL_FUNC_encoder_set_ctx_params() sets context data according to parameters |
| from I<params> that it recognises. Unrecognised parameters should be |
| ignored. |
| Passing NULL for I<params> should return true. |
| |
| OSSL_FUNC_encoder_settable_ctx_params() returns a constant B<OSSL_PARAM> |
| array describing the parameters that OSSL_FUNC_encoder_set_ctx_params() |
| can handle. |
| |
| See L<OSSL_PARAM(3)> for further details on the parameters structure used by |
| OSSL_FUNC_encoder_set_ctx_params() and OSSL_FUNC_encoder_settable_ctx_params(). |
| |
| =head2 Import functions |
| |
| A provider-native object may be associated with a foreign provider, and may |
| therefore be unsuitable for direct use with a given ENCODER implementation. |
| Provided that the foreign provider's implementation to handle the object has |
| a function to export that object in L<OSSL_PARAM(3)> array form, the ENCODER |
| implementation should be able to import that array and create a suitable |
| object to be passed to OSSL_FUNC_encoder_encode()'s I<obj_raw>. |
| |
| OSSL_FUNC_encoder_import_object() should import the subset of I<params> |
| given with I<selection> to create a provider-native object that can be |
| passed as I<obj_raw> to OSSL_FUNC_encoder_encode(). |
| |
| OSSL_FUNC_encoder_free_object() should free the object that was created with |
| OSSL_FUNC_encoder_import_object(). |
| |
| =head2 Encoding functions |
| |
| OSSL_FUNC_encoder_encode() should take a provider-native object (in |
| I<obj_raw>) or an object abstraction (in I<obj_abstract>), and should output |
| the object in encoded form to the B<OSSL_CORE_BIO>. The I<selection> bits, |
| if relevant, should determine in greater detail what will be output. |
| The encoding functions also take an B<OSSL_PASSPHRASE_CALLBACK> function |
| pointer along with a pointer to application data I<cbarg>, which should be |
| used when a pass phrase prompt is needed. |
| |
| =head2 Encoder operation parameters |
| |
| Operation parameters currently recognised by built-in encoders are as |
| follows: |
| |
| =over 4 |
| |
| =item "cipher" (B<OSSL_ENCODER_PARAM_CIPHER>) <UTF8 string> |
| |
| The name of the encryption cipher to be used when generating encrypted |
| encoding. This is used when encoding private keys, as well as |
| other objects that need protection. |
| |
| If this name is invalid for the encoding implementation, the |
| implementation should refuse to perform the encoding, i.e. |
| OSSL_FUNC_encoder_encode_data() and OSSL_FUNC_encoder_encode_object() |
| should return an error. |
| |
| =item "properties" (B<OSSL_ENCODER_PARAM_PROPERTIES>) <UTF8 string> |
| |
| The properties to be queried when trying to fetch the algorithm given |
| with the "cipher" parameter. |
| This must be given together with the "cipher" parameter to be |
| considered valid. |
| |
| The encoding implementation isn't obligated to use this value. |
| However, it is recommended that implementations that do not handle |
| property strings return an error on receiving this parameter unless |
| its value NULL or the empty string. |
| |
| =item "save-parameters" (B<OSSL_ENCODER_PARAM_SAVE_PARAMETERS>) <integer> |
| |
| If set to 0 disables saving of key domain parameters. Default is 1. |
| It currently has an effect only on DSA keys. |
| |
| =back |
| |
| Parameters currently recognised by the built-in pass phrase callback: |
| |
| =over 4 |
| |
| =item "info" (B<OSSL_PASSPHRASE_PARAM_INFO>) <UTF8 string> |
| |
| A string of information that will become part of the pass phrase |
| prompt. This could be used to give the user information on what kind |
| of object it's being prompted for. |
| |
| =back |
| |
| =head1 RETURN VALUES |
| |
| OSSL_FUNC_encoder_newctx() returns a pointer to a context, or NULL on |
| failure. |
| |
| OSSL_FUNC_encoder_set_ctx_params() returns 1, unless a recognised |
| parameter was invalid or caused an error, for which 0 is returned. |
| |
| OSSL_FUNC_encoder_settable_ctx_params() returns a pointer to an array of |
| constant B<OSSL_PARAM> elements. |
| |
| OSSL_FUNC_encoder_does_selection() returns 1 if the encoder implementation |
| supports any of the I<selection> bits, otherwise 0. |
| |
| OSSL_FUNC_encoder_encode() returns 1 on success, or 0 on failure. |
| |
| =head1 SEE ALSO |
| |
| L<provider(7)> |
| |
| =head1 HISTORY |
| |
| The ENCODER interface was introduced in OpenSSL 3.0. |
| |
| =head1 COPYRIGHT |
| |
| Copyright 2019-2021 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 |
| L<https://www.openssl.org/source/license.html>. |
| |
| =cut |