1d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* crypto/x509/x509_obj.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 <string.h> 59d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 60d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/buf.h> 61d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/err.h> 62d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/lhash.h> 63d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/mem.h> 64d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/obj.h> 65d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/x509.h> 66d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 67d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 68d9e397b599b13d642138480a28c14db7a136bf0Adam Langleychar *X509_NAME_oneline(X509_NAME *a, char *buf, int len) 69d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 70d9e397b599b13d642138480a28c14db7a136bf0Adam Langley X509_NAME_ENTRY *ne; 71d9e397b599b13d642138480a28c14db7a136bf0Adam Langley size_t i; 72d9e397b599b13d642138480a28c14db7a136bf0Adam Langley int n,lold,l,l1,l2,num,j,type; 73d9e397b599b13d642138480a28c14db7a136bf0Adam Langley const char *s; 74d9e397b599b13d642138480a28c14db7a136bf0Adam Langley char *p; 75d9e397b599b13d642138480a28c14db7a136bf0Adam Langley unsigned char *q; 76d9e397b599b13d642138480a28c14db7a136bf0Adam Langley BUF_MEM *b=NULL; 77d9e397b599b13d642138480a28c14db7a136bf0Adam Langley static const char hex[17]="0123456789ABCDEF"; 78d9e397b599b13d642138480a28c14db7a136bf0Adam Langley int gs_doit[4]; 79d9e397b599b13d642138480a28c14db7a136bf0Adam Langley char tmp_buf[80]; 80d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 81d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (buf == NULL) 82d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 83d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if ((b=BUF_MEM_new()) == NULL) goto err; 84d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (!BUF_MEM_grow(b,200)) goto err; 85d9e397b599b13d642138480a28c14db7a136bf0Adam Langley b->data[0]='\0'; 86d9e397b599b13d642138480a28c14db7a136bf0Adam Langley len=200; 87d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 88d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (a == NULL) 89d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 90d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if(b) 91d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 92d9e397b599b13d642138480a28c14db7a136bf0Adam Langley buf=b->data; 93d9e397b599b13d642138480a28c14db7a136bf0Adam Langley OPENSSL_free(b); 94d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 95d9e397b599b13d642138480a28c14db7a136bf0Adam Langley strncpy(buf,"NO X509_NAME",len); 96d9e397b599b13d642138480a28c14db7a136bf0Adam Langley buf[len-1]='\0'; 97d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return buf; 98d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 99d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 100d9e397b599b13d642138480a28c14db7a136bf0Adam Langley len--; /* space for '\0' */ 101d9e397b599b13d642138480a28c14db7a136bf0Adam Langley l=0; 102d9e397b599b13d642138480a28c14db7a136bf0Adam Langley for (i=0; i<sk_X509_NAME_ENTRY_num(a->entries); i++) 103d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 104d9e397b599b13d642138480a28c14db7a136bf0Adam Langley ne=sk_X509_NAME_ENTRY_value(a->entries,i); 105d9e397b599b13d642138480a28c14db7a136bf0Adam Langley n=OBJ_obj2nid(ne->object); 106d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if ((n == NID_undef) || ((s=OBJ_nid2sn(n)) == NULL)) 107d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 108d9e397b599b13d642138480a28c14db7a136bf0Adam Langley i2t_ASN1_OBJECT(tmp_buf,sizeof(tmp_buf),ne->object); 109d9e397b599b13d642138480a28c14db7a136bf0Adam Langley s=tmp_buf; 110d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 111d9e397b599b13d642138480a28c14db7a136bf0Adam Langley l1=strlen(s); 112d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 113d9e397b599b13d642138480a28c14db7a136bf0Adam Langley type=ne->value->type; 114d9e397b599b13d642138480a28c14db7a136bf0Adam Langley num=ne->value->length; 115d9e397b599b13d642138480a28c14db7a136bf0Adam Langley q=ne->value->data; 116d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 117d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if ((type == V_ASN1_GENERALSTRING) && ((num%4) == 0)) 118d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 119d9e397b599b13d642138480a28c14db7a136bf0Adam Langley gs_doit[0]=gs_doit[1]=gs_doit[2]=gs_doit[3]=0; 120d9e397b599b13d642138480a28c14db7a136bf0Adam Langley for (j=0; j<num; j++) 121d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (q[j] != 0) gs_doit[j&3]=1; 122d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 123d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (gs_doit[0]|gs_doit[1]|gs_doit[2]) 124d9e397b599b13d642138480a28c14db7a136bf0Adam Langley gs_doit[0]=gs_doit[1]=gs_doit[2]=gs_doit[3]=1; 125d9e397b599b13d642138480a28c14db7a136bf0Adam Langley else 126d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 127d9e397b599b13d642138480a28c14db7a136bf0Adam Langley gs_doit[0]=gs_doit[1]=gs_doit[2]=0; 128d9e397b599b13d642138480a28c14db7a136bf0Adam Langley gs_doit[3]=1; 129d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 130d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 131d9e397b599b13d642138480a28c14db7a136bf0Adam Langley else 132d9e397b599b13d642138480a28c14db7a136bf0Adam Langley gs_doit[0]=gs_doit[1]=gs_doit[2]=gs_doit[3]=1; 133d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 134d9e397b599b13d642138480a28c14db7a136bf0Adam Langley for (l2=j=0; j<num; j++) 135d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 136d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (!gs_doit[j&3]) continue; 137d9e397b599b13d642138480a28c14db7a136bf0Adam Langley l2++; 138d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if ((q[j] < ' ') || (q[j] > '~')) l2+=3; 139d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 140d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 141d9e397b599b13d642138480a28c14db7a136bf0Adam Langley lold=l; 142d9e397b599b13d642138480a28c14db7a136bf0Adam Langley l+=1+l1+1+l2; 143d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (b != NULL) 144d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 145d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (!BUF_MEM_grow(b,l+1)) goto err; 146d9e397b599b13d642138480a28c14db7a136bf0Adam Langley p= &(b->data[lold]); 147d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 148d9e397b599b13d642138480a28c14db7a136bf0Adam Langley else if (l > len) 149d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 150d9e397b599b13d642138480a28c14db7a136bf0Adam Langley break; 151d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 152d9e397b599b13d642138480a28c14db7a136bf0Adam Langley else 153d9e397b599b13d642138480a28c14db7a136bf0Adam Langley p= &(buf[lold]); 154d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *(p++)='/'; 155d9e397b599b13d642138480a28c14db7a136bf0Adam Langley memcpy(p,s,(unsigned int)l1); p+=l1; 156d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *(p++)='='; 157d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 158d9e397b599b13d642138480a28c14db7a136bf0Adam Langley q=ne->value->data; 159d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 160d9e397b599b13d642138480a28c14db7a136bf0Adam Langley for (j=0; j<num; j++) 161d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 162d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (!gs_doit[j&3]) continue; 163d9e397b599b13d642138480a28c14db7a136bf0Adam Langley n=q[j]; 164d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if ((n < ' ') || (n > '~')) 165d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 166d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *(p++)='\\'; 167d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *(p++)='x'; 168d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *(p++)=hex[(n>>4)&0x0f]; 169d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *(p++)=hex[n&0x0f]; 170d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 171d9e397b599b13d642138480a28c14db7a136bf0Adam Langley else 172d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *(p++)=n; 173d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 174d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *p='\0'; 175d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 176d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (b != NULL) 177d9e397b599b13d642138480a28c14db7a136bf0Adam Langley { 178d9e397b599b13d642138480a28c14db7a136bf0Adam Langley p=b->data; 179d9e397b599b13d642138480a28c14db7a136bf0Adam Langley OPENSSL_free(b); 180d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 181d9e397b599b13d642138480a28c14db7a136bf0Adam Langley else 182d9e397b599b13d642138480a28c14db7a136bf0Adam Langley p=buf; 183d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (i == 0) 184d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *p = '\0'; 185d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return(p); 186d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyerr: 187b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE); 188d9e397b599b13d642138480a28c14db7a136bf0Adam Langley if (b != NULL) BUF_MEM_free(b); 189d9e397b599b13d642138480a28c14db7a136bf0Adam Langley return(NULL); 190d9e397b599b13d642138480a28c14db7a136bf0Adam Langley } 191d9e397b599b13d642138480a28c14db7a136bf0Adam Langley 192