| =pod |
| |
| =head1 NAME |
| |
| provider-decoder - The OSSL_DECODER 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. |
| */ |
| |
| /* Decoder parameter accessor and descriptor */ |
| const OSSL_PARAM *OSSL_FUNC_decoder_gettable_params(void *provctx); |
| int OSSL_FUNC_decoder_get_params(OSSL_PARAM params[]); |
| |
| /* Functions to construct / destruct / manipulate the decoder context */ |
| void *OSSL_FUNC_decoder_newctx(void *provctx); |
| void OSSL_FUNC_decoder_freectx(void *ctx); |
| const OSSL_PARAM *OSSL_FUNC_decoder_settable_ctx_params(void *provctx); |
| int OSSL_FUNC_decoder_set_ctx_params(void *ctx, const OSSL_PARAM params[]); |
| |
| /* Functions to check selection support */ |
| int OSSL_FUNC_decoder_does_selection(void *provctx, int selection); |
| |
| /* Functions to decode object data */ |
| int OSSL_FUNC_decoder_decode(void *ctx, OSSL_CORE_BIO *in, |
| int selection, |
| OSSL_CALLBACK *data_cb, void *data_cbarg, |
| OSSL_PASSPHRASE_CALLBACK *cb, void *cbarg); |
| |
| /* Functions to export a decoded object */ |
| void *OSSL_FUNC_decoder_export_object(void *ctx, |
| const void *objref, size_t objref_sz, |
| OSSL_CALLBACK *export_cb, |
| void *export_cbarg); |
| |
| =head1 DESCRIPTION |
| |
| I<The term "decode" is used throughout this manual. This includes but is |
| not limited to deserialization as individual decoders can also do |
| decoding into intermediate data formats.> |
| |
| The DECODER operation is a generic method to create a provider-native |
| object reference or intermediate decoded data from an encoded form |
| read from the given B<OSSL_CORE_BIO>. If the caller wants to decode |
| data from memory, it should provide a L<BIO_s_mem(3)> B<BIO>. The decoded |
| data or object reference is passed along with eventual metadata |
| to the I<metadata_cb> as B<OSSL_PARAM> parameters. |
| |
| The decoder 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 DECODER implementation may be part of a chain, where data is |
| passed from one to the next. For example, there may be an |
| implementation to decode an object from PEM to DER, and another one |
| that decodes DER to a provider-native object. |
| |
| The last decoding step in the decoding chain is usually supposed to create |
| a provider-native object referenced by an object reference. To import |
| that object into a different provider the OSSL_FUNC_decoder_export_object() |
| can be called as the final step of the decoding process. |
| |
| 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_decoder_decode() has these: |
| |
| typedef int |
| (OSSL_FUNC_decoder_decode_fn)(void *ctx, OSSL_CORE_BIO *in, |
| int selection, |
| OSSL_CALLBACK *data_cb, void *data_cbarg, |
| OSSL_PASSPHRASE_CALLBACK *cb, void *cbarg); |
| static ossl_inline OSSL_FUNC_decoder_decode_fn |
| OSSL_FUNC_decoder_decode(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_decoder_get_params OSSL_FUNC_DECODER_GET_PARAMS |
| OSSL_FUNC_decoder_gettable_params OSSL_FUNC_DECODER_GETTABLE_PARAMS |
| |
| OSSL_FUNC_decoder_newctx OSSL_FUNC_DECODER_NEWCTX |
| OSSL_FUNC_decoder_freectx OSSL_FUNC_DECODER_FREECTX |
| OSSL_FUNC_decoder_set_ctx_params OSSL_FUNC_DECODER_SET_CTX_PARAMS |
| OSSL_FUNC_decoder_settable_ctx_params OSSL_FUNC_DECODER_SETTABLE_CTX_PARAMS |
| |
| OSSL_FUNC_decoder_does_selection OSSL_FUNC_DECODER_DOES_SELECTION |
| |
| OSSL_FUNC_decoder_decode OSSL_FUNC_DECODER_DECODE |
| |
| OSSL_FUNC_decoder_export_object OSSL_FUNC_DECODER_EXPORT_OBJECT |
| |
| =head2 Names and properties |
| |
| The name of an implementation should match the target type of object |
| it decodes. For example, an implementation that decodes an RSA key |
| should be named "RSA". Likewise, an implementation that decodes DER data |
| from PEM input should be named "DER". |
| |
| Properties can be used to further specify details about an implementation: |
| |
| =over 4 |
| |
| =item input |
| |
| This property is used to specify what format of input the implementation |
| can decode. |
| |
| This property is I<mandatory>. |
| |
| OpenSSL providers recognize the following input types: |
| |
| =over 4 |
| |
| =item pem |
| |
| An implementation with that input type decodes PEM formatted data. |
| |
| =item der |
| |
| An implementation with that input type decodes DER formatted data. |
| |
| =item msblob |
| |
| An implementation with that input type decodes MSBLOB formatted data. |
| |
| =item pvk |
| |
| An implementation with that input type decodes PVK formatted data. |
| |
| =back |
| |
| =item structure |
| |
| This property is used to specify the structure that the decoded data is |
| expected to have. |
| |
| This property is I<optional>. |
| |
| Structures currently recognised by built-in decoders: |
| |
| =over 4 |
| |
| =item "type-specific" |
| |
| Type specific structure. |
| |
| =item "pkcs8" |
| |
| Structure according to the PKCS#8 specification. |
| |
| =item "SubjectPublicKeyInfo" |
| |
| Encoding of public keys according to the Subject Public Key Info of RFC 5280. |
| |
| =back |
| |
| =back |
| |
| The possible values of both these properties is open ended. A provider may |
| very well specify input 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 decoded, 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 |
| to be decoded. 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 - e.g., B<OSSL_KEYMGMT_SELECT_PRIVATE_KEY> |
| if the object to be decoded is supposed to contain private key components. |
| |
| OSSL_FUNC_decoder_does_selection() should tell if a particular implementation |
| supports any of the combinations given by I<selection>. |
| |
| =head2 Context functions |
| |
| OSSL_FUNC_decoder_newctx() returns a context to be used with the rest of |
| the functions. |
| |
| OSSL_FUNC_decoder_freectx() frees the given I<ctx> as created by |
| OSSL_FUNC_decoder_newctx(). |
| |
| OSSL_FUNC_decoder_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_decoder_settable_ctx_params() returns a constant B<OSSL_PARAM> |
| array describing the parameters that OSSL_FUNC_decoder_set_ctx_params() |
| can handle. |
| |
| See L<OSSL_PARAM(3)> for further details on the parameters structure used by |
| OSSL_FUNC_decoder_set_ctx_params() and OSSL_FUNC_decoder_settable_ctx_params(). |
| |
| =head2 Export function |
| |
| When a provider-native object is created by a decoder it would be unsuitable |
| for direct use with a foreign provider. The export function allows for |
| exporting the object into that foreign provider if the foreign provider |
| supports the type of the object and provides an import function. |
| |
| OSSL_FUNC_decoder_export_object() should export the object of size I<objref_sz> |
| referenced by I<objref> as an B<OSSL_PARAM> array and pass that into the |
| I<export_cb> as well as the given I<export_cbarg>. |
| |
| =head2 Decoding functions |
| |
| OSSL_FUNC_decoder_decode() should decode the data as read from |
| the B<OSSL_CORE_BIO> I<in> to produce decoded data or an object to be |
| passed as reference in an B<OSSL_PARAM> array along with possible other |
| metadata that was decoded from the input. This B<OSSL_PARAM> array is |
| then passed to the I<data_cb> callback. The I<selection> bits, |
| if relevant, should determine what the input data should contain. |
| The decoding 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. |
| |
| It's important to understand that the return value from this function is |
| interpreted as follows: |
| |
| =over 4 |
| |
| =item True (1) |
| |
| This means "carry on the decoding process", and is meaningful even though |
| this function couldn't decode the input into anything, because there may be |
| another decoder implementation that can decode it into something. |
| |
| The I<data_cb> callback should never be called when this function can't |
| decode the input into anything. |
| |
| =item False (0) |
| |
| This means "stop the decoding process", and is meaningful when the input |
| could be decoded into some sort of object that this function understands, |
| but further treatment of that object results into errors that won't be |
| possible for some other decoder implementation to get a different result. |
| |
| =back |
| |
| The conditions to stop the decoding process are at the discretion of the |
| implementation. |
| |
| =head2 Decoder operation parameters |
| |
| There are currently no operation parameters currently recognised by the |
| built-in decoders. |
| |
| 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_decoder_newctx() returns a pointer to a context, or NULL on |
| failure. |
| |
| OSSL_FUNC_decoder_set_ctx_params() returns 1, unless a recognised |
| parameter was invalid or caused an error, for which 0 is returned. |
| |
| OSSL_FUNC_decoder_settable_ctx_params() returns a pointer to an array of |
| constant B<OSSL_PARAM> elements. |
| |
| OSSL_FUNC_decoder_does_selection() returns 1 if the decoder implementation |
| supports any of the I<selection> bits, otherwise 0. |
| |
| OSSL_FUNC_decoder_decode() returns 1 to signal that the decoding process |
| should continue, or 0 to signal that it should stop. |
| |
| =head1 SEE ALSO |
| |
| L<provider(7)> |
| |
| =head1 HISTORY |
| |
| The DECODER 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 |