1*e0c4386eSCy Schubert=pod 2*e0c4386eSCy Schubert 3*e0c4386eSCy Schubert=head1 NAME 4*e0c4386eSCy Schubert 5*e0c4386eSCy SchubertX509_REQ_get_attr_count, 6*e0c4386eSCy SchubertX509_REQ_get_attr_by_NID, X509_REQ_get_attr_by_OBJ, X509_REQ_get_attr, 7*e0c4386eSCy SchubertX509_REQ_delete_attr, 8*e0c4386eSCy SchubertX509_REQ_add1_attr, X509_REQ_add1_attr_by_OBJ, X509_REQ_add1_attr_by_NID, 9*e0c4386eSCy SchubertX509_REQ_add1_attr_by_txt 10*e0c4386eSCy Schubert- B<X509_ATTRIBUTE> support for signed certificate requests 11*e0c4386eSCy Schubert 12*e0c4386eSCy Schubert=head1 SYNOPSIS 13*e0c4386eSCy Schubert 14*e0c4386eSCy Schubert #include <openssl/x509.h> 15*e0c4386eSCy Schubert 16*e0c4386eSCy Schubert int X509_REQ_get_attr_count(const X509_REQ *req); 17*e0c4386eSCy Schubert int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, int lastpos); 18*e0c4386eSCy Schubert int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, const ASN1_OBJECT *obj, 19*e0c4386eSCy Schubert int lastpos); 20*e0c4386eSCy Schubert X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc); 21*e0c4386eSCy Schubert X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc); 22*e0c4386eSCy Schubert int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr); 23*e0c4386eSCy Schubert int X509_REQ_add1_attr_by_OBJ(X509_REQ *req, 24*e0c4386eSCy Schubert const ASN1_OBJECT *obj, int type, 25*e0c4386eSCy Schubert const unsigned char *bytes, int len); 26*e0c4386eSCy Schubert int X509_REQ_add1_attr_by_NID(X509_REQ *req, 27*e0c4386eSCy Schubert int nid, int type, 28*e0c4386eSCy Schubert const unsigned char *bytes, int len); 29*e0c4386eSCy Schubert int X509_REQ_add1_attr_by_txt(X509_REQ *req, 30*e0c4386eSCy Schubert const char *attrname, int type, 31*e0c4386eSCy Schubert const unsigned char *bytes, int len); 32*e0c4386eSCy Schubert 33*e0c4386eSCy Schubert=head1 DESCRIPTION 34*e0c4386eSCy Schubert 35*e0c4386eSCy SchubertX509_REQ_get_attr_by_OBJ() finds the location of the first matching object I<obj> 36*e0c4386eSCy Schubertin the I<req> attribute list. The search starts at the position after I<lastpos>. 37*e0c4386eSCy SchubertIf the returned value is positive then it can be used on the next call to 38*e0c4386eSCy SchubertX509_REQ_get_attr_by_OBJ() as the value of I<lastpos> in order to iterate through 39*e0c4386eSCy Schubertthe remaining attributes. I<lastpos> can be set to any negative value on the 40*e0c4386eSCy Schubertfirst call, in order to start searching from the start of the attribute list. 41*e0c4386eSCy Schubert 42*e0c4386eSCy SchubertX509_REQ_get_attr_by_NID() is similar to X509_REQ_get_attr_by_OBJ() except that 43*e0c4386eSCy Schubertit passes the numerical identifier (NID) I<nid> associated with the object. 44*e0c4386eSCy SchubertSee <openssl/obj_mac.h> for a list of NID_*. 45*e0c4386eSCy Schubert 46*e0c4386eSCy SchubertX509_REQ_get_attr() returns the B<X509_ATTRIBUTE> object at index I<loc> in the 47*e0c4386eSCy SchubertI<req> attribute list. I<loc> should be in the range from 0 to 48*e0c4386eSCy SchubertX509_REQ_get_attr_count() - 1. 49*e0c4386eSCy Schubert 50*e0c4386eSCy SchubertX509_REQ_delete_attr() removes the B<X509_ATTRIBUTE> object at index I<loc> in 51*e0c4386eSCy Schubertthe I<req> objects list of attributes. An error occurs if I<req> is NULL. 52*e0c4386eSCy Schubert 53*e0c4386eSCy SchubertX509_REQ_add1_attr() pushes a copy of the passed in B<X509_ATTRIBUTE> I<>attr> 54*e0c4386eSCy Schubertto the I<req> object's attribute list. An error will occur if either the 55*e0c4386eSCy Schubertattribute list is NULL or the attribute already exists. 56*e0c4386eSCy Schubert 57*e0c4386eSCy SchubertX509_REQ_add1_attr_by_OBJ() creates a new B<X509_ATTRIBUTE> using 58*e0c4386eSCy SchubertX509_ATTRIBUTE_set1_object() and X509_ATTRIBUTE_set1_data() to assign a new 59*e0c4386eSCy SchubertI<obj> with type I<type> and data I<bytes> of length I<len> and then pushes it 60*e0c4386eSCy Schubertto the I<req> object's attribute list. I<req> must be non NULL or an error 61*e0c4386eSCy Schubertwill occur. If I<obj> already exists in the attribute list then an error occurs. 62*e0c4386eSCy Schubert 63*e0c4386eSCy SchubertX509_REQ_add1_attr_by_NID() is similar to X509_REQ_add1_attr_by_OBJ() except 64*e0c4386eSCy Schubertthat it passes the numerical identifier (NID) I<nid> associated with the object. 65*e0c4386eSCy SchubertSee <openssl/obj_mac.h> for a list of NID_*. 66*e0c4386eSCy Schubert 67*e0c4386eSCy SchubertX509_REQ_add1_attr_by_txt() is similar to X509_REQ_add1_attr_by_OBJ() except 68*e0c4386eSCy Schubertthat it passes a name I<attrname> associated with the object. 69*e0c4386eSCy SchubertSee <openssl/obj_mac.h> for a list of SN_* names. 70*e0c4386eSCy Schubert 71*e0c4386eSCy SchubertRefer to L<X509_ATTRIBUTE(3)> for information related to attributes. 72*e0c4386eSCy Schubert 73*e0c4386eSCy Schubert=head1 RETURN VALUES 74*e0c4386eSCy Schubert 75*e0c4386eSCy SchubertX509_REQ_get_attr_count() returns the number of attributes in the I<req> object 76*e0c4386eSCy Schubertattribute list or -1 if the attribute list is NULL. 77*e0c4386eSCy Schubert 78*e0c4386eSCy SchubertX509_REQ_get_attr_by_OBJ() returns -1 if either the I<req> object's attribute 79*e0c4386eSCy Schubertlist is empty OR I<obj> is not found, otherwise it returns the location of the 80*e0c4386eSCy SchubertI<obj> in the attribute list. 81*e0c4386eSCy Schubert 82*e0c4386eSCy SchubertX509_REQ_get_attr_by_NID() is similar to X509_REQ_get_attr_by_OBJ(), except that 83*e0c4386eSCy Schubertit returns -2 if the I<nid> is not known by OpenSSL. 84*e0c4386eSCy Schubert 85*e0c4386eSCy SchubertX509_REQ_get_attr() returns either an B<X509_ATTRIBUTE> or NULL on error. 86*e0c4386eSCy Schubert 87*e0c4386eSCy SchubertX509_REQ_delete_attr() returns either the removed B<X509_ATTRIBUTE> or NULL if 88*e0c4386eSCy Schubertthere is a error. 89*e0c4386eSCy Schubert 90*e0c4386eSCy SchubertX509_REQ_add1_attr(), X509_REQ_add1_attr_by_OBJ(), X509_REQ_add1_attr_by_NID() 91*e0c4386eSCy Schubertand X509_REQ_add1_attr_by_txt() return 1 on success or 0 on error. 92*e0c4386eSCy Schubert 93*e0c4386eSCy Schubert=head1 NOTES 94*e0c4386eSCy Schubert 95*e0c4386eSCy SchubertAny functions that modify the attributes (add or delete) internally set a flag 96*e0c4386eSCy Schubertto indicate the ASN.1 encoding has been modified. 97*e0c4386eSCy Schubert 98*e0c4386eSCy Schubert=head1 SEE ALSO 99*e0c4386eSCy Schubert 100*e0c4386eSCy SchubertL<X509_ATTRIBUTE(3)> 101*e0c4386eSCy Schubert 102*e0c4386eSCy Schubert=head1 COPYRIGHT 103*e0c4386eSCy Schubert 104*e0c4386eSCy SchubertCopyright 2023-2024 The OpenSSL Project Authors. All Rights Reserved. 105*e0c4386eSCy Schubert 106*e0c4386eSCy SchubertLicensed under the Apache License 2.0 (the "License"). You may not use 107*e0c4386eSCy Schubertthis file except in compliance with the License. You can obtain a copy 108*e0c4386eSCy Schubertin the file LICENSE in the source distribution or at 109*e0c4386eSCy SchubertL<https://www.openssl.org/source/license.html>. 110*e0c4386eSCy Schubert 111*e0c4386eSCy Schubert=cut 112