X509_ALGOR_DUP(3)

NAME
X509_ALGOR_new, X509_ALGOR_free, X509_ALGOR_dup, X509_ALGOR_set0, X509_ALGOR_get0, X509_ALGOR_set_md, X509_ALGOR_cmp - create, change, and inspect algorithm identifiers

SYNOPSIS
#include <openssl/x509.h>
X509_ALGOR *
X509_ALGOR_new(void);
void
X509_ALGOR_free(X509_ALGOR *alg);
X509_ALGOR *
X509_ALGOR_dup(X509_ALGOR *alg);
int
X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, void *pval);
void
X509_ALGOR_get0(const ASN1_OBJECT **paobj, int *pptype, const void **ppval, const X509_ALGOR *alg);
void
X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md);
int
X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b);

DESCRIPTION
An X509_ALGOR object represents an ASN.1 AlgorithmIdentifier structure defined in RFC 5280 section 4.1.1.2. It specifies a cryptographic algorithm by an ASN.1 object identifier (OID) that can be obtained from OBJ_nid2obj(3), together with optional algorithm-specific parameters of the type ASN1_TYPE, see ASN1_TYPE_set(3). X509_ALGOR objects are used by many other objects, for example certificates, certificate revocation lists, and certificate requests.

X509_ALGOR_new() allocates a new X509_ALGOR object containing the object that OBJ_nid2obj(3) returns for NID_undef as the algorithm and a NULL pointer as the parameters.

X509_ALGOR_free() frees alg and any data contained in it. If alg is NULL, no action occurs.

X509_ALGOR_dup() creates a deep copy of alg. It is implemented by calling ASN1_item_dup(3) with arguments of X509_ALGOR_it and alg, which is equivalent to calling i2d_X509_ALGOR(3) and d2i_X509_ALGOR(3).

X509_ALGOR_set0() sets the algorithm OID of alg to aobj and the associated parameter type to ptype with value pval. If ptype is V_ASN1_UNDEF, the parameter is omitted and pval is ignored. If ptype is zero, pval is ignored and the existing parameter is left unchanged, or if alg does not contain a parameter, a new, empty parameter of type V_ASN1_UNDEF is added. Otherwise ptype and pval have the same meaning as the type and value parameters to ASN1_TYPE_set(3). Ownership of aobj and, unless it is ignored, of pval is transferred to alg on success.

X509_ALGOR_get0() returns alg's algorithm OID in *paobj, its parameter type in *pptype, and its parameter value in *ppval. Any of paobj, pptype, and ppval can be NULL. If pptype is NULL or if *pptype is V_ASN1_UNDEF then *ppval's value is undefined.

X509_ALGOR_set_md() sets alg to appropriate values for the message digest md. If the EVP_MD_FLAG_DIGALGID_ABSENT flag is not set on md, X509_ALGOR_set_md() can leave alg in a corrupted state due to memory allocation failure. This problem can be avoided by preallocating with an error-checked call to X509_ALGOR_set0(alg, NULL, 0, NULL).

X509_ALGOR_cmp() compares a and b.

RETURN VALUES
X509_ALGOR_new() and X509_ALGOR_dup() return a new X509_ALGOR object or NULL if an error occurs.

X509_ALGOR_set0() returns 1 for success or 0 if alg is NULL or memory allocation fails.

X509_ALGOR_cmp() returns 0 if a and b have identical encodings or non-zero otherwise.

SEE ALSO
ASN1_TYPE_set(3), d2i_X509_ALGOR(3), EVP_DigestInit(3), OBJ_nid2obj(3), X509_get0_signature(3), X509_new(3), X509_PUBKEY_get0_param(3), X509_signature_dump(3)

STANDARDS
RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile

HISTORY
X509_ALGOR_new() and X509_ALGOR_free() appeared in SSLeay 0.4 or earlier and have been available since OpenBSD 2.4.

X509_ALGOR_dup() first appeared in SSLeay 0.9.1 and has been available since OpenBSD 2.6.

X509_ALGOR_set0() and X509_ALGOR_get0() first appeared in OpenSSL 0.9.8h and have been available since OpenBSD 4.5.

X509_ALGOR_cmp() first appeared in OpenSSL 0.9.8zd, 1.0.0p, and 1.0.1k and has been available since OpenBSD 4.9.

X509_ALGOR_set_md() first appeared in OpenSSL 1.0.1 and has been available since OpenBSD 5.3.

BUGS
X509_ALGOR_set_md() can fail but cannot communicate failure to the caller.