123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- =pod
- =head1 NAME
- ASN1_EXTERN_FUNCS, ASN1_ex_d2i, ASN1_ex_d2i_ex, ASN1_ex_i2d, ASN1_ex_new_func,
- ASN1_ex_new_ex_func, ASN1_ex_free_func, ASN1_ex_print_func,
- IMPLEMENT_EXTERN_ASN1
- - ASN.1 external function support
- =head1 SYNOPSIS
- #include <openssl/asn1t.h>
- typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len,
- const ASN1_ITEM *it, int tag, int aclass, char opt,
- ASN1_TLC *ctx);
- typedef int ASN1_ex_d2i_ex(ASN1_VALUE **pval, const unsigned char **in, long len,
- const ASN1_ITEM *it, int tag, int aclass, char opt,
- ASN1_TLC *ctx, OSSL_LIB_CTX *libctx,
- const char *propq);
- typedef int ASN1_ex_i2d(const ASN1_VALUE **pval, unsigned char **out,
- const ASN1_ITEM *it, int tag, int aclass);
- typedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it);
- typedef int ASN1_ex_new_ex_func(ASN1_VALUE **pval, const ASN1_ITEM *it,
- OSSL_LIB_CTX *libctx, const char *propq);
- typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it);
- typedef int ASN1_ex_print_func(BIO *out, const ASN1_VALUE **pval,
- int indent, const char *fname,
- const ASN1_PCTX *pctx);
- struct ASN1_EXTERN_FUNCS_st {
- void *app_data;
- ASN1_ex_new_func *asn1_ex_new;
- ASN1_ex_free_func *asn1_ex_free;
- ASN1_ex_free_func *asn1_ex_clear;
- ASN1_ex_d2i *asn1_ex_d2i;
- ASN1_ex_i2d *asn1_ex_i2d;
- ASN1_ex_print_func *asn1_ex_print;
- ASN1_ex_new_ex_func *asn1_ex_new_ex;
- ASN1_ex_d2i_ex *asn1_ex_d2i_ex;
- };
- typedef struct ASN1_EXTERN_FUNCS_st ASN1_EXTERN_FUNCS;
- #define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs)
- =head1 DESCRIPTION
- ASN.1 data structures templates are typically defined in OpenSSL using a series
- of macros such as ASN1_SEQUENCE(), ASN1_SEQUENCE_END() and so on. Instead
- templates can also be defined based entirely on external functions. These
- external functions are called to perform operations such as creating a new
- B<ASN1_VALUE> or converting an B<ASN1_VALUE> to or from DER encoding.
- The macro IMPLEMENT_EXTERN_ASN1() can be used to create such an externally
- defined structure. The name of the structure should be supplied in the I<sname>
- parameter. The tag for the structure (e.g. typically B<V_ASN1_SEQUENCE>) should
- be supplied in the I<tag> parameter. Finally a pointer to an
- B<ASN1_EXTERN_FUNCS> structure should be supplied in the I<fptrs> parameter.
- The B<ASN1_EXTERN_FUNCS> structure has the following entries.
- =over 4
- =item I<app_data>
- A pointer to arbitrary application specific data.
- =item I<asn1_ex_new>
- A "new" function responsible for constructing a new B<ASN1_VALUE> object. The
- newly constructed value should be stored in I<*pval>. The I<it> parameter is a
- pointer to the B<ASN1_ITEM> template object created via the
- IMPLEMENT_EXTERN_ASN1() macro.
- Returns a positive value on success or 0 on error.
- =item I<asn1_ex_free>
- A "free" function responsible for freeing the B<ASN1_VALUE> passed in I<*pval>
- that was previously allocated via a "new" function. The I<it> parameter is a
- pointer to the B<ASN1_ITEM> template object created via the
- IMPLEMENT_EXTERN_ASN1() macro.
- =item I<asn1_ex_clear>
- A "clear" function responsible for clearing any data in the B<ASN1_VALUE> passed
- in I<*pval> and making it suitable for reuse. The I<it> parameter is a pointer
- to the B<ASN1_ITEM> template object created via the IMPLEMENT_EXTERN_ASN1()
- macro.
- =item I<asn1_ex_d2i>
- A "d2i" function responsible for converting DER data with the tag I<tag> and
- class I<class> into an B<ASN1_VALUE>. If I<*pval> is non-NULL then the
- B<ASN_VALUE> it points to should be reused. Otherwise a new B<ASN1_VALUE>
- should be allocated and stored in I<*pval>. I<*in> points to the DER data to be
- decoded and I<len> is the length of that data. After decoding I<*in> should be
- updated to point at the next byte after the decoded data. If the B<ASN1_VALUE>
- is considered optional in this context then I<opt> will be nonzero. Otherwise
- it will be zero. The I<it> parameter is a pointer to the B<ASN1_ITEM> template
- object created via the IMPLEMENT_EXTERN_ASN1() macro. A pointer to the current
- B<ASN1_TLC> context (which may be required for other ASN1 function calls) is
- passed in the I<ctx> parameter.
- The I<asn1_ex_d2i> entry may be NULL if I<asn1_ex_d2i_ex> has been specified
- instead.
- Returns <= 0 on error or a positive value on success.
- =item I<asn1_ex_i2d>
- An "i2d" function responsible for converting an B<ASN1_VALUE> into DER encoding.
- On entry I<*pval> will contain the B<ASN1_VALUE> to be encoded. If default
- tagging is to be used then I<tag> will be -1 on entry. Otherwise if implicit
- tagging should be used then I<tag> and I<aclass> will be the tag and associated
- class.
- If I<out> is not NULL then this function should write the DER encoded data to
- the buffer in I<*out>, and then increment I<*out> to point to immediately after
- the data just written.
- If I<out> is NULL then no data should be written but the length calculated and
- returned as if it were.
- The I<asn1_ex_i2d> entry may be NULL if I<asn1_ex_i2d_ex> has been specified
- instead.
- The return value should be negative if a fatal error occurred, or 0 if a
- non-fatal error occurred. Otherwise it should return the length of the encoded
- data.
- =item I<asn1_ex_print>
- A "print" function. I<out> is the BIO to print the output to. I<*pval> is the
- B<ASN1_VALUE> to be printed. I<indent> is the number of spaces of indenting to
- be printed before any data is printed. I<fname> is currently unused and is
- always "". I<pctx> is a pointer to the B<ASN1_PCTX> for the print operation.
- Returns 0 on error or a positive value on success. If the return value is 2 then
- an additional newline will be printed after the data printed by this function.
- =item I<asn1_ex_new_ex>
- This is the same as I<asn1_ex_new> except that it is additionally passed the
- OSSL_LIB_CTX to be used in I<libctx> and any property query string to be used
- for algorithm fetching in the I<propq> parameter. See
- L<crypto(7)/ALGORITHM FETCHING> for further details. If I<asn1_ex_new_ex> is
- non NULL, then it will always be called in preference to I<asn1_ex_new>.
- =item I<asn1_ex_d2i_ex>
- This is the same as I<asn1_ex_d2i> except that it is additionally passed the
- OSSL_LIB_CTX to be used in I<libctx> and any property query string to be used
- for algorithm fetching in the I<propq> parameter. See
- L<crypto(7)/ALGORITHM FETCHING> for further details. If I<asn1_ex_d2i_ex> is
- non NULL, then it will always be called in preference to I<asn1_ex_d2i>.
- =back
- =head1 RETURN VALUES
- Return values for the various callbacks are as described above.
- =head1 SEE ALSO
- L<ASN1_item_new_ex(3)>
- =head1 HISTORY
- The I<asn1_ex_new_ex> and I<asn1_ex_d2i_ex> callbacks were added in OpenSSL 3.0.
- =head1 COPYRIGHT
- Copyright 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
|