1d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* crypto/x509/x509_att.c */ 2d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * All rights reserved. 4d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 5d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * This package is an SSL implementation written 6d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * by Eric Young (eay@cryptsoft.com). 7d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * The implementation was written so as to conform with Netscapes SSL. 8d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 9d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * This library is free for commercial and non-commercial use as long as 10d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * the following conditions are aheared to. The following conditions 11d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * apply to all code found in this distribution, be it the RC4, RSA, 12d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * included with this distribution is covered by the same copyright terms 14d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 16d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Copyright remains Eric Young's, and as such any Copyright notices in 17d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * the code are not to be removed. 18d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * If this package is used in a product, Eric Young should be given attribution 19d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * as the author of the parts of the library used. 20d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * This can be in the form of a textual message at program startup or 21d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * in documentation (online or textual) provided with the package. 22d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 23d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Redistribution and use in source and binary forms, with or without 24d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * modification, are permitted provided that the following conditions 25d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * are met: 26d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 1. Redistributions of source code must retain the copyright 27d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * notice, this list of conditions and the following disclaimer. 28d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 2. Redistributions in binary form must reproduce the above copyright 29d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * notice, this list of conditions and the following disclaimer in the 30d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * documentation and/or other materials provided with the distribution. 31d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 3. All advertising materials mentioning features or use of this software 32d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * must display the following acknowledgement: 33d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * "This product includes cryptographic software written by 34d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Eric Young (eay@cryptsoft.com)" 35d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * The word 'cryptographic' can be left out if the rouines from the library 36d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * being used are not cryptographic related :-). 37d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 4. If you include any Windows specific code (or a derivative thereof) from 38d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * the apps directory (application code) you must include an acknowledgement: 39d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 41d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * SUCH DAMAGE. 52d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * 53d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * The licence and distribution terms for any publically available version or 54d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * derivative of this code cannot be changed. i.e. this code cannot simply be 55d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * copied and put under another distribution licence 56d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * [including the GNU Public Licence.] */ 57d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 58d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/asn1.h> 59d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/err.h> 60d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/evp.h> 61d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/obj.h> 62d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/stack.h> 63d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/x509.h> 64d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 65d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 66d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x) 67d9e397b599b13d642138480a28c14db7a136bf0Adam Langley{ 68d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return sk_X509_ATTRIBUTE_num(x); 69d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 70d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 71d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid, 72d9e397b599b13d642138480a28c14db7a136bf0Adam Langley int lastpos) 73d9e397b599b13d642138480a28c14db7a136bf0Adam Langley{ 74d9e397b599b13d642138480a28c14db7a136bf0Adam Langley const ASN1_OBJECT *obj; 75d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 76d9e397b599b13d642138480a28c14db7a136bf0Adam Langley obj=OBJ_nid2obj(nid); 77d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (obj == NULL) return(-2); 78d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return(X509at_get_attr_by_OBJ(x,obj,lastpos)); 79d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 80d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 81d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, const ASN1_OBJECT *obj, 82d9e397b599b13d642138480a28c14db7a136bf0Adam Langley int lastpos) 83d9e397b599b13d642138480a28c14db7a136bf0Adam Langley{ 84d9e397b599b13d642138480a28c14db7a136bf0Adam Langley int n; 85d9e397b599b13d642138480a28c14db7a136bf0Adam Langley X509_ATTRIBUTE *ex; 86d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 87d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (sk == NULL) return(-1); 88d9e397b599b13d642138480a28c14db7a136bf0Adam Langley lastpos++; 89d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (lastpos < 0) 90d9e397b599b13d642138480a28c14db7a136bf0Adam Langley lastpos=0; 91d9e397b599b13d642138480a28c14db7a136bf0Adam Langley n=sk_X509_ATTRIBUTE_num(sk); 92d9e397b599b13d642138480a28c14db7a136bf0Adam Langley for ( ; lastpos < n; lastpos++) 93d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 94d9e397b599b13d642138480a28c14db7a136bf0Adam Langley ex=sk_X509_ATTRIBUTE_value(sk,lastpos); 95d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (OBJ_cmp(ex->object,obj) == 0) 96d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return(lastpos); 97d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 98d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return(-1); 99d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 100d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 101d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyX509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc) 102d9e397b599b13d642138480a28c14db7a136bf0Adam Langley{ 103d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (x == NULL || loc < 0 || sk_X509_ATTRIBUTE_num(x) <= (size_t) loc) 104d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return NULL; 105d9e397b599b13d642138480a28c14db7a136bf0Adam Langley else 106d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return sk_X509_ATTRIBUTE_value(x,loc); 107d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 108d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 109d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyX509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc) 110d9e397b599b13d642138480a28c14db7a136bf0Adam Langley{ 111d9e397b599b13d642138480a28c14db7a136bf0Adam Langley X509_ATTRIBUTE *ret; 112d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 113d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (x == NULL || loc < 0 || sk_X509_ATTRIBUTE_num(x) <= (size_t) loc) 114d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return(NULL); 115d9e397b599b13d642138480a28c14db7a136bf0Adam Langley ret=sk_X509_ATTRIBUTE_delete(x,loc); 116d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return(ret); 117d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 118d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 119d9e397b599b13d642138480a28c14db7a136bf0Adam LangleySTACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x, 120d9e397b599b13d642138480a28c14db7a136bf0Adam Langley X509_ATTRIBUTE *attr) 121d9e397b599b13d642138480a28c14db7a136bf0Adam Langley{ 122d9e397b599b13d642138480a28c14db7a136bf0Adam Langley X509_ATTRIBUTE *new_attr=NULL; 123d9e397b599b13d642138480a28c14db7a136bf0Adam Langley STACK_OF(X509_ATTRIBUTE) *sk=NULL; 124d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 125d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (x == NULL) 126d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 127d9e397b599b13d642138480a28c14db7a136bf0Adam Langley OPENSSL_PUT_ERROR(X509, X509at_add1_attr, ERR_R_PASSED_NULL_PARAMETER); 128d9e397b599b13d642138480a28c14db7a136bf0Adam Langley goto err2; 129d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 130d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 131d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (*x == NULL) 132d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 133d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if ((sk=sk_X509_ATTRIBUTE_new_null()) == NULL) 134d9e397b599b13d642138480a28c14db7a136bf0Adam Langley goto err; 135d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 136d9e397b599b13d642138480a28c14db7a136bf0Adam Langley else 137d9e397b599b13d642138480a28c14db7a136bf0Adam Langley sk= *x; 138d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 139d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if ((new_attr=X509_ATTRIBUTE_dup(attr)) == NULL) 140d9e397b599b13d642138480a28c14db7a136bf0Adam Langley goto err2; 141d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (!sk_X509_ATTRIBUTE_push(sk,new_attr)) 142d9e397b599b13d642138480a28c14db7a136bf0Adam Langley goto err; 143d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (*x == NULL) 144d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *x=sk; 145d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return(sk); 146d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyerr: 147d9e397b599b13d642138480a28c14db7a136bf0Adam Langley OPENSSL_PUT_ERROR(X509, X509at_add1_attr, ERR_R_MALLOC_FAILURE); 148d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyerr2: 149d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (new_attr != NULL) X509_ATTRIBUTE_free(new_attr); 150d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (sk != NULL) sk_X509_ATTRIBUTE_free(sk); 151d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return(NULL); 152d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 153d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 154d9e397b599b13d642138480a28c14db7a136bf0Adam LangleySTACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) **x, 155d9e397b599b13d642138480a28c14db7a136bf0Adam Langley const ASN1_OBJECT *obj, int type, 156d9e397b599b13d642138480a28c14db7a136bf0Adam Langley const unsigned char *bytes, int len) 157d9e397b599b13d642138480a28c14db7a136bf0Adam Langley{ 158d9e397b599b13d642138480a28c14db7a136bf0Adam Langley X509_ATTRIBUTE *attr; 159d9e397b599b13d642138480a28c14db7a136bf0Adam Langley STACK_OF(X509_ATTRIBUTE) *ret; 160d9e397b599b13d642138480a28c14db7a136bf0Adam Langley attr = X509_ATTRIBUTE_create_by_OBJ(NULL, obj, type, bytes, len); 161d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if(!attr) return 0; 162d9e397b599b13d642138480a28c14db7a136bf0Adam Langley ret = X509at_add1_attr(x, attr); 163d9e397b599b13d642138480a28c14db7a136bf0Adam Langley X509_ATTRIBUTE_free(attr); 164d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return ret; 165d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 166d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 167d9e397b599b13d642138480a28c14db7a136bf0Adam LangleySTACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) **x, 168d9e397b599b13d642138480a28c14db7a136bf0Adam Langley int nid, int type, 169d9e397b599b13d642138480a28c14db7a136bf0Adam Langley const unsigned char *bytes, int len) 170d9e397b599b13d642138480a28c14db7a136bf0Adam Langley{ 171d9e397b599b13d642138480a28c14db7a136bf0Adam Langley X509_ATTRIBUTE *attr; 172d9e397b599b13d642138480a28c14db7a136bf0Adam Langley STACK_OF(X509_ATTRIBUTE) *ret; 173d9e397b599b13d642138480a28c14db7a136bf0Adam Langley attr = X509_ATTRIBUTE_create_by_NID(NULL, nid, type, bytes, len); 174d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if(!attr) return 0; 175d9e397b599b13d642138480a28c14db7a136bf0Adam Langley ret = X509at_add1_attr(x, attr); 176d9e397b599b13d642138480a28c14db7a136bf0Adam Langley X509_ATTRIBUTE_free(attr); 177d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return ret; 178d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 179d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 180d9e397b599b13d642138480a28c14db7a136bf0Adam LangleySTACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) **x, 181d9e397b599b13d642138480a28c14db7a136bf0Adam Langley const char *attrname, int type, 182d9e397b599b13d642138480a28c14db7a136bf0Adam Langley const unsigned char *bytes, int len) 183d9e397b599b13d642138480a28c14db7a136bf0Adam Langley{ 184d9e397b599b13d642138480a28c14db7a136bf0Adam Langley X509_ATTRIBUTE *attr; 185d9e397b599b13d642138480a28c14db7a136bf0Adam Langley STACK_OF(X509_ATTRIBUTE) *ret; 186d9e397b599b13d642138480a28c14db7a136bf0Adam Langley attr = X509_ATTRIBUTE_create_by_txt(NULL, attrname, type, bytes, len); 187d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if(!attr) return 0; 188d9e397b599b13d642138480a28c14db7a136bf0Adam Langley ret = X509at_add1_attr(x, attr); 189d9e397b599b13d642138480a28c14db7a136bf0Adam Langley X509_ATTRIBUTE_free(attr); 190d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return ret; 191d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 192d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 193d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid *X509at_get0_data_by_OBJ(STACK_OF(X509_ATTRIBUTE) *x, 194d9e397b599b13d642138480a28c14db7a136bf0Adam Langley ASN1_OBJECT *obj, int lastpos, int type) 195d9e397b599b13d642138480a28c14db7a136bf0Adam Langley{ 196d9e397b599b13d642138480a28c14db7a136bf0Adam Langley int i; 197d9e397b599b13d642138480a28c14db7a136bf0Adam Langley X509_ATTRIBUTE *at; 198d9e397b599b13d642138480a28c14db7a136bf0Adam Langley i = X509at_get_attr_by_OBJ(x, obj, lastpos); 199d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (i == -1) 200d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return NULL; 201d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if ((lastpos <= -2) && (X509at_get_attr_by_OBJ(x, obj, i) != -1)) 202d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return NULL; 203d9e397b599b13d642138480a28c14db7a136bf0Adam Langley at = X509at_get_attr(x, i); 204d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (lastpos <= -3 && (X509_ATTRIBUTE_count(at) != 1)) 205d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return NULL; 206d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return X509_ATTRIBUTE_get0_data(at, 0, type, NULL); 207d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 208d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 209d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyX509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid, 210d9e397b599b13d642138480a28c14db7a136bf0Adam Langley int atrtype, const void *data, int len) 211d9e397b599b13d642138480a28c14db7a136bf0Adam Langley{ 212d9e397b599b13d642138480a28c14db7a136bf0Adam Langley const ASN1_OBJECT *obj; 213d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 214d9e397b599b13d642138480a28c14db7a136bf0Adam Langley obj=OBJ_nid2obj(nid); 215d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (obj == NULL) 216d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 217d9e397b599b13d642138480a28c14db7a136bf0Adam Langley OPENSSL_PUT_ERROR(X509, X509_ATTRIBUTE_create_by_NID, X509_R_UNKNOWN_NID); 218d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return(NULL); 219d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 220d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return X509_ATTRIBUTE_create_by_OBJ(attr,obj,atrtype,data,len); 221d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 222d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 223d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyX509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr, 224d9e397b599b13d642138480a28c14db7a136bf0Adam Langley const ASN1_OBJECT *obj, int atrtype, const void *data, int len) 225d9e397b599b13d642138480a28c14db7a136bf0Adam Langley{ 226d9e397b599b13d642138480a28c14db7a136bf0Adam Langley X509_ATTRIBUTE *ret; 227d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 228d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if ((attr == NULL) || (*attr == NULL)) 229d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 230d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if ((ret=X509_ATTRIBUTE_new()) == NULL) 231d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 232d9e397b599b13d642138480a28c14db7a136bf0Adam Langley OPENSSL_PUT_ERROR(X509, X509_ATTRIBUTE_create_by_OBJ, ERR_R_MALLOC_FAILURE); 233d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return(NULL); 234d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 235d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 236d9e397b599b13d642138480a28c14db7a136bf0Adam Langley else 237d9e397b599b13d642138480a28c14db7a136bf0Adam Langley ret= *attr; 238d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 239d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (!X509_ATTRIBUTE_set1_object(ret,obj)) 240d9e397b599b13d642138480a28c14db7a136bf0Adam Langley goto err; 241d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (!X509_ATTRIBUTE_set1_data(ret,atrtype,data,len)) 242d9e397b599b13d642138480a28c14db7a136bf0Adam Langley goto err; 243d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 244d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if ((attr != NULL) && (*attr == NULL)) *attr=ret; 245d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return(ret); 246d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyerr: 247d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if ((attr == NULL) || (ret != *attr)) 248d9e397b599b13d642138480a28c14db7a136bf0Adam Langley X509_ATTRIBUTE_free(ret); 249d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return(NULL); 250d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 251d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 252d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyX509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr, 253d9e397b599b13d642138480a28c14db7a136bf0Adam Langley const char *atrname, int type, const unsigned char *bytes, int len) 254d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 255d9e397b599b13d642138480a28c14db7a136bf0Adam Langley ASN1_OBJECT *obj; 256d9e397b599b13d642138480a28c14db7a136bf0Adam Langley X509_ATTRIBUTE *nattr; 257d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 258d9e397b599b13d642138480a28c14db7a136bf0Adam Langley obj=OBJ_txt2obj(atrname, 0); 259d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (obj == NULL) 260d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 261d9e397b599b13d642138480a28c14db7a136bf0Adam Langley OPENSSL_PUT_ERROR(X509, X509_ATTRIBUTE_create_by_txt, X509_R_INVALID_FIELD_NAME); 262d9e397b599b13d642138480a28c14db7a136bf0Adam Langley ERR_add_error_data(2, "name=", atrname); 263d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return(NULL); 264d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 265d9e397b599b13d642138480a28c14db7a136bf0Adam Langley nattr = X509_ATTRIBUTE_create_by_OBJ(attr,obj,type,bytes,len); 266d9e397b599b13d642138480a28c14db7a136bf0Adam Langley ASN1_OBJECT_free(obj); 267d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return nattr; 268d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 269d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 270d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj) 271d9e397b599b13d642138480a28c14db7a136bf0Adam Langley{ 272d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if ((attr == NULL) || (obj == NULL)) 273d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return(0); 274d9e397b599b13d642138480a28c14db7a136bf0Adam Langley ASN1_OBJECT_free(attr->object); 275d9e397b599b13d642138480a28c14db7a136bf0Adam Langley attr->object=OBJ_dup(obj); 276e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley return attr->object != NULL; 277d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 278d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 279d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, const void *data, int len) 280d9e397b599b13d642138480a28c14db7a136bf0Adam Langley{ 281d9e397b599b13d642138480a28c14db7a136bf0Adam Langley ASN1_TYPE *ttmp; 282d9e397b599b13d642138480a28c14db7a136bf0Adam Langley ASN1_STRING *stmp = NULL; 283d9e397b599b13d642138480a28c14db7a136bf0Adam Langley int atype = 0; 284d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (!attr) return 0; 285d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if(attrtype & MBSTRING_FLAG) { 286d9e397b599b13d642138480a28c14db7a136bf0Adam Langley stmp = ASN1_STRING_set_by_NID(NULL, data, len, attrtype, 287d9e397b599b13d642138480a28c14db7a136bf0Adam Langley OBJ_obj2nid(attr->object)); 288d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if(!stmp) { 289d9e397b599b13d642138480a28c14db7a136bf0Adam Langley OPENSSL_PUT_ERROR(X509, X509_ATTRIBUTE_set1_data, ERR_R_ASN1_LIB); 290d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return 0; 291d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 292d9e397b599b13d642138480a28c14db7a136bf0Adam Langley atype = stmp->type; 293d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } else if (len != -1){ 294d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if(!(stmp = ASN1_STRING_type_new(attrtype))) goto err; 295d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if(!ASN1_STRING_set(stmp, data, len)) goto err; 296d9e397b599b13d642138480a28c14db7a136bf0Adam Langley atype = attrtype; 297d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 298d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if(!(attr->value.set = sk_ASN1_TYPE_new_null())) goto err; 299d9e397b599b13d642138480a28c14db7a136bf0Adam Langley attr->single = 0; 300d9e397b599b13d642138480a28c14db7a136bf0Adam Langley /* This is a bit naughty because the attribute should really have 301d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * at least one value but some types use and zero length SET and 302d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * require this. 303d9e397b599b13d642138480a28c14db7a136bf0Adam Langley */ 304d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (attrtype == 0) 305d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return 1; 306d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if(!(ttmp = ASN1_TYPE_new())) goto err; 307d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if ((len == -1) && !(attrtype & MBSTRING_FLAG)) 308d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 309d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (!ASN1_TYPE_set1(ttmp, attrtype, data)) 310d9e397b599b13d642138480a28c14db7a136bf0Adam Langley goto err; 311d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 312d9e397b599b13d642138480a28c14db7a136bf0Adam Langley else 313d9e397b599b13d642138480a28c14db7a136bf0Adam Langley ASN1_TYPE_set(ttmp, atype, stmp); 314d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if(!sk_ASN1_TYPE_push(attr->value.set, ttmp)) goto err; 315d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return 1; 316d9e397b599b13d642138480a28c14db7a136bf0Adam Langley err: 317d9e397b599b13d642138480a28c14db7a136bf0Adam Langley OPENSSL_PUT_ERROR(X509, X509_ATTRIBUTE_set1_data, ERR_R_MALLOC_FAILURE); 318d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return 0; 319d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 320d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 321d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint X509_ATTRIBUTE_count(X509_ATTRIBUTE *attr) 322d9e397b599b13d642138480a28c14db7a136bf0Adam Langley{ 323d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if(!attr->single) return sk_ASN1_TYPE_num(attr->value.set); 324d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if(attr->value.single) return 1; 325d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return 0; 326d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 327d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 328d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr) 329d9e397b599b13d642138480a28c14db7a136bf0Adam Langley{ 330d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (attr == NULL) return(NULL); 331d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return(attr->object); 332d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 333d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 334d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyvoid *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, 335d9e397b599b13d642138480a28c14db7a136bf0Adam Langley int atrtype, void *data) 336d9e397b599b13d642138480a28c14db7a136bf0Adam Langley{ 337d9e397b599b13d642138480a28c14db7a136bf0Adam Langley ASN1_TYPE *ttmp; 338d9e397b599b13d642138480a28c14db7a136bf0Adam Langley ttmp = X509_ATTRIBUTE_get0_type(attr, idx); 339d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if(!ttmp) return NULL; 340d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if(atrtype != ASN1_TYPE_get(ttmp)){ 341d9e397b599b13d642138480a28c14db7a136bf0Adam Langley OPENSSL_PUT_ERROR(X509, X509_ATTRIBUTE_get0_data, X509_R_WRONG_TYPE); 342d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return NULL; 343d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 344d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return ttmp->value.ptr; 345d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 346d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 347d9e397b599b13d642138480a28c14db7a136bf0Adam LangleyASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx) 348d9e397b599b13d642138480a28c14db7a136bf0Adam Langley{ 349d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (attr == NULL) return(NULL); 350d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if(idx >= X509_ATTRIBUTE_count(attr)) return NULL; 351d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if(!attr->single) return sk_ASN1_TYPE_value(attr->value.set, idx); 352d9e397b599b13d642138480a28c14db7a136bf0Adam Langley else return attr->value.single; 353d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} 354