123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- =pod
- =head1 NAME
- ASN1_AUX, ASN1_PRINT_ARG, ASN1_STREAM_ARG, ASN1_aux_cb, ASN1_aux_const_cb
- - ASN.1 auxiliary data
- =head1 SYNOPSIS
- #include <openssl/asn1t.h>
- struct ASN1_AUX_st {
- void *app_data;
- int flags;
- int ref_offset; /* Offset of reference value */
- int ref_lock; /* Offset to an CRYPTO_RWLOCK */
- ASN1_aux_cb *asn1_cb;
- int enc_offset; /* Offset of ASN1_ENCODING structure */
- ASN1_aux_const_cb *asn1_const_cb; /* for ASN1_OP_I2D_ and ASN1_OP_PRINT_ */
- };
- typedef struct ASN1_AUX_st ASN1_AUX;
- struct ASN1_PRINT_ARG_st {
- BIO *out;
- int indent;
- const ASN1_PCTX *pctx;
- };
- typedef struct ASN1_PRINT_ARG_st ASN1_PRINT_ARG;
- struct ASN1_STREAM_ARG_st {
- BIO *out;
- BIO *ndef_bio;
- unsigned char **boundary;
- };
- typedef struct ASN1_STREAM_ARG_st ASN1_STREAM_ARG;
- typedef int ASN1_aux_cb(int operation, ASN1_VALUE **in, const ASN1_ITEM *it,
- void *exarg);
- typedef int ASN1_aux_const_cb(int operation, const ASN1_VALUE **in,
- const ASN1_ITEM *it, void *exarg);
- =head1 DESCRIPTION
- ASN.1 data structures can be associated with an B<ASN1_AUX> object to supply
- additional information about the ASN.1 structure. An B<ASN1_AUX> structure is
- associated with the structure during the definition of the ASN.1 template. For
- example an B<ASN1_AUX> structure will be associated by using one of the various
- ASN.1 template definition macros that supply auxiliary information such as
- ASN1_SEQUENCE_enc(), ASN1_SEQUENCE_ref(), ASN1_SEQUENCE_cb_const_cb(),
- ASN1_SEQUENCE_const_cb(), ASN1_SEQUENCE_cb() or ASN1_NDEF_SEQUENCE_cb().
- An B<ASN1_AUX> structure contains the following information.
- =over 4
- =item I<app_data>
- Arbitrary application data
- =item I<flags>
- Flags which indicate the auxiliarly functionality supported.
- The B<ASN1_AFLG_REFCOUNT> flag indicates that objects support reference counting.
- The B<ASN1_AFLG_ENCODING> flag indicates that the original encoding of the
- object will be saved.
- The B<ASN1_AFLG_BROKEN> flag is a work around for broken encoders where the
- sequence length value may not be correct. This should generally not be used.
- The B<ASN1_AFLG_CONST_CB> flag indicates that the "const" form of the
- B<ASN1_AUX> callback should be used in preference to the non-const form.
- =item I<ref_offset>
- If the B<ASN1_AFLG_REFCOUNT> flag is set then this value is assumed to be an
- offset into the B<ASN1_VALUE> structure where a B<CRYPTO_REF_COUNT> may be
- found for the purposes of reference counting.
- =item I<ref_lock>
- If the B<ASN1_AFLG_REFCOUNT> flag is set then this value is assumed to be an
- offset into the B<ASN1_VALUE> structure where a B<CRYPTO_RWLOCK> may be
- found for the purposes of reference counting.
- =item I<asn1_cb>
- A callback that will be invoked at various points during the processing of
- the the B<ASN1_VALLUE>. See below for further details.
- =item I<enc_offset>
- Offset into the B<ASN1_VALUE> object where the original encoding of the object
- will be saved if the B<ASN1_AFLG_ENCODING> flag has been set.
- =item I<asn1_const_cb>
- A callback that will be invoked at various points during the processing of
- the the B<ASN1_VALLUE>. This is used in preference to the I<asn1_cb> callback if
- the B<ASN1_AFLG_CONST_CB> flag is set. See below for further details.
- =back
- During the processing of an B<ASN1_VALUE> object the callbacks set via
- I<asn1_cb> or I<asn1_const_cb> will be invoked as a result of various events
- indicated via the I<operation> parameter. The value of I<*in> will be the
- B<ASN1_VALUE> object being processed based on the template in I<it>. An
- additional operation specific parameter may be passed in I<exarg>. The currently
- supported operations are as follows. The callbacks should return a positive
- value on success or zero on error, unless otherwise noted below.
- =over 4
- =item B<ASN1_OP_NEW_PRE>
- Invoked when processing a B<CHOICE>, B<SEQUENCE> or B<NDEF_SEQUENCE> structure
- prior to an B<ASN1_VALUE> object being allocated. The callback may allocate the
- B<ASN1_VALUE> itself and store it in I<*pval>. If it does so it should return 2
- from the callback. On error it should return 0.
- =item B<ASN1_OP_NEW_POST>
- Invoked when processing a B<CHOICE>, B<SEQUENCE> or B<NDEF_SEQUENCE> structure
- after an B<ASN1_VALUE> object has been allocated. The allocated object is in
- I<*pval>.
- =item B<ASN1_OP_FREE_PRE>
- Invoked when processing a B<CHOICE>, B<SEQUENCE> or B<NDEF_SEQUENCE> structure
- immediately before an B<ASN1_VALUE> is freed. If the callback originally
- constructed the B<ASN1_VALUE> via B<ASN1_OP_NEW_PRE> then it should free it at
- this point and return 2 from the callback. Otherwise it should return 1 for
- success or 0 on error.
- =item B<ASN1_OP_FREE_POST>
- Invoked when processing a B<CHOICE>, B<SEQUENCE> or B<NDEF_SEQUENCE> structure
- immediately after B<ASN1_VALUE> sub-structures are freed.
- =item B<ASN1_OP_D2I_PRE>
- Invoked when processing a B<CHOICE>, B<SEQUENCE> or B<NDEF_SEQUENCE> structure
- immediately before a "d2i" operation for the B<ASN1_VALUE>.
- =item B<ASN1_OP_D2I_POST>
- Invoked when processing a B<CHOICE>, B<SEQUENCE> or B<NDEF_SEQUENCE> structure
- immediately after a "d2i" operation for the B<ASN1_VALUE>.
- =item B<ASN1_OP_I2D_PRE>
- Invoked when processing a B<CHOICE>, B<SEQUENCE> or B<NDEF_SEQUENCE> structure
- immediately before a "i2d" operation for the B<ASN1_VALUE>.
- =item B<ASN1_OP_I2D_POST>
- Invoked when processing a B<CHOICE>, B<SEQUENCE> or B<NDEF_SEQUENCE> structure
- immediately after a "i2d" operation for the B<ASN1_VALUE>.
- =item B<ASN1_OP_PRINT_PRE>
- Invoked when processing a B<SEQUENCE> or B<NDEF_SEQUENCE> structure immediately
- before printing the B<ASN1_VALUE>. The I<exarg> argument will be a pointer to an
- B<ASN1_PRINT_ARG> structure (see below).
- =item B<ASN1_OP_PRINT_POST>
- Invoked when processing a B<SEQUENCE> or B<NDEF_SEQUENCE> structure immediately
- after printing the B<ASN1_VALUE>. The I<exarg> argument will be a pointer to an
- B<ASN1_PRINT_ARG> structure (see below).
- =item B<ASN1_OP_STREAM_PRE>
- Invoked immediately prior to streaming the B<ASN1_VALUE> data using indefinite
- length encoding. The I<exarg> argument will be a pointer to a B<ASN1_STREAM_ARG>
- structure (see below).
- =item B<ASN1_OP_STREAM_POST>
- Invoked immediately after streaming the B<ASN1_VALUE> data using indefinite
- length encoding. The I<exarg> argument will be a pointer to a B<ASN1_STREAM_ARG>
- structure (see below).
- =item B<ASN1_OP_DETACHED_PRE>
- Invoked immediately prior to processing the B<ASN1_VALUE> data as a "detached"
- value (as used in CMS and PKCS7). The I<exarg> argument will be a pointer to a
- B<ASN1_STREAM_ARG> structure (see below).
- =item B<ASN1_OP_DETACHED_POST>
- Invoked immediately after processing the B<ASN1_VALUE> data as a "detached"
- value (as used in CMS and PKCS7). The I<exarg> argument will be a pointer to a
- B<ASN1_STREAM_ARG> structure (see below).
- =item B<ASN1_OP_DUP_PRE>
- Invoked immediate prior to an ASN1_VALUE being duplicated via a call to
- ASN1_item_dup().
- =item B<ASN1_OP_DUP_POST>
- Invoked immediate after to an ASN1_VALUE has been duplicated via a call to
- ASN1_item_dup().
- =item B<ASN1_OP_GET0_LIBCTX>
- Invoked in order to obtain the B<OSSL_LIB_CTX> associated with an B<ASN1_VALUE>
- if any. A pointer to an B<OSSL_LIB_CTX> should be stored in I<*exarg> if such
- a value exists.
- =item B<ASN1_OP_GET0_PROPQ>
- Invoked in order to obtain the property query string associated with an
- B<ASN1_VALUE> if any. A pointer to the property query string should be stored in
- I<*exarg> if such a value exists.
- =back
- An B<ASN1_PRINT_ARG> object is used during processing of B<ASN1_OP_PRINT_PRE>
- and B<ASN1_OP_PRINT_POST> callback operations. It contains the following
- information.
- =over 4
- =item I<out>
- The B<BIO> being used to print the data out.
- =item I<ndef_bio>
- The current number of indent spaces that should be used for printing this data.
- =item I<pctx>
- The context for the B<ASN1_PCTX> operation.
- =back
- An B<ASN1_STREAM_ARG> object is used during processing of B<ASN1_OP_STREAM_PRE>,
- B<ASN1_OP_STREAM_POST>, B<ASN1_OP_DETACHED_PRE> and B<ASN1_OP_DETACHED_POST>
- callback operations. It contains the following information.
- =over 4
- =item I<out>
- The B<BIO> to stream through
- =item I<ndef_bio>
- The B<BIO> with filters appended
- =item I<boundary>
- The streaming I/O boundary.
- =back
- =head1 RETURN VALUES
- The callbacks return 0 on error and a positive value on success. Some operations
- require specific positive success values as noted above.
- =head1 SEE ALSO
- L<ASN1_item_new_ex(3)>
- =head1 HISTORY
- The ASN1_aux_const_cb() callback and the B<ASN1_OP_GET0_LIBCTX> and
- B<ASN1_OP_GET0_PROPQ> operation types were added in OpenSSL 3.0.
- =head1 COPYRIGHT
- Copyright 2021-2022 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
|