=pod

=head1 NAME

ASN1_TYPE_get, ASN1_TYPE_set, ASN1_TYPE_set1, ASN1_TYPE_cmp, ASN1_TYPE_unpack_sequence, ASN1_TYPE_pack_sequence - ASN1_TYPE utility
functions

=head1 SYNOPSIS

 #include <openssl/asn1.h>

 int ASN1_TYPE_get(const ASN1_TYPE *a);
 void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value);
 int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const void *value);
 int ASN1_TYPE_cmp(const ASN1_TYPE *a, const ASN1_TYPE *b);

 void *ASN1_TYPE_unpack_sequence(const ASN1_ITEM *it, const ASN1_TYPE *t);
 ASN1_TYPE *ASN1_TYPE_pack_sequence(const ASN1_ITEM *it, void *s,
                                    ASN1_TYPE **t);

=head1 DESCRIPTION

These functions allow an B<ASN1_TYPE> structure to be manipulated. The
B<ASN1_TYPE> structure can contain any ASN.1 type or constructed type
such as a SEQUENCE: it is effectively equivalent to the ASN.1 ANY type.

ASN1_TYPE_get() returns the type of I<a> or 0 if it fails.

ASN1_TYPE_set() sets the value of I<a> to I<type> and I<value>. This
function uses the pointer I<value> internally so it must B<not> be freed
up after the call.

ASN1_TYPE_set1() sets the value of I<a> to I<type> a copy of I<value>.

ASN1_TYPE_cmp() compares ASN.1 types I<a> and I<b> and returns 0 if
they are identical and nonzero otherwise.

ASN1_TYPE_unpack_sequence() attempts to parse the SEQUENCE present in
I<t> using the ASN.1 structure I<it>. If successful it returns a pointer
to the ASN.1 structure corresponding to I<it> which must be freed by the
caller. If it fails it return NULL.

ASN1_TYPE_pack_sequence() attempts to encode the ASN.1 structure I<s>
corresponding to I<it> into an B<ASN1_TYPE>. If successful the encoded
B<ASN1_TYPE> is returned. If I<t> and I<*t> are not NULL the encoded type
is written to I<t> overwriting any existing data. If I<t> is not NULL
but I<*t> is NULL the returned B<ASN1_TYPE> is written to I<*t>.

=head1 NOTES

The type and meaning of the I<value> parameter for ASN1_TYPE_set() and
ASN1_TYPE_set1() is determined by the I<type> parameter.
If I<type> is B<V_ASN1_NULL> I<value> is ignored. If I<type> is
B<V_ASN1_BOOLEAN>
then the boolean is set to TRUE if I<value> is not NULL. If I<type> is
B<V_ASN1_OBJECT> then value is an B<ASN1_OBJECT> structure. Otherwise I<type>
is and B<ASN1_STRING> structure. If I<type> corresponds to a primitive type
(or a string type) then the contents of the B<ASN1_STRING> contain the content
octets of the type. If I<type> corresponds to a constructed type or
a tagged type (B<V_ASN1_SEQUENCE>, B<V_ASN1_SET> or B<V_ASN1_OTHER>) then the
B<ASN1_STRING> contains the entire ASN.1 encoding verbatim (including tag and
length octets).

ASN1_TYPE_cmp() may not return zero if two types are equivalent but have
different encodings. For example the single content octet of the boolean TRUE
value under BER can have any nonzero encoding but ASN1_TYPE_cmp() will
only return zero if the values are the same.

If either or both of the parameters passed to ASN1_TYPE_cmp() is NULL the
return value is nonzero. Technically if both parameters are NULL the two
types could be absent OPTIONAL fields and so should match, however, passing
NULL values could also indicate a programming error (for example an
unparsable type which returns NULL) for types which do B<not> match. So
applications should handle the case of two absent values separately.

=head1 RETURN VALUES

ASN1_TYPE_get() returns the type of the B<ASN1_TYPE> argument.

ASN1_TYPE_set() does not return a value.

ASN1_TYPE_set1() returns 1 for success and 0 for failure.

ASN1_TYPE_cmp() returns 0 if the types are identical and nonzero otherwise.

ASN1_TYPE_unpack_sequence() returns a pointer to an ASN.1 structure or
NULL on failure.

ASN1_TYPE_pack_sequence() return an B<ASN1_TYPE> structure if it succeeds or
NULL on failure.

=head1 COPYRIGHT

Copyright 2015-2020 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
