| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 | 
							- =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 */
 
-  int 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 L<OSSL_PARAM(3)> 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 L<OSSL_DISPATCH(3)> arrays via
 
- L<OSSL_ALGORITHM(3)> 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 L<OSSL_DISPATCH(3)> 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);
 
- L<OSSL_DISPATCH(3)> 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 L<OSSL_PARAM(3)>
 
- 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 L<OSSL_PARAM(3)> 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 L<OSSL_PARAM(3)> array along with possible other
 
- metadata that was decoded from the input. This L<OSSL_PARAM(3)> 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 L<OSSL_PASSPHRASE_CALLBACK(3)> 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 L<OSSL_PARAM(3)> 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-2023 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
 
 
  |