summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/x509/x509_obj.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/x509/x509_obj.c')
-rw-r--r--src/lib/libcrypto/x509/x509_obj.c76
1 files changed, 29 insertions, 47 deletions
diff --git a/src/lib/libcrypto/x509/x509_obj.c b/src/lib/libcrypto/x509/x509_obj.c
index 5f38315f22..d0c02f833e 100644
--- a/src/lib/libcrypto/x509/x509_obj.c
+++ b/src/lib/libcrypto/x509/x509_obj.c
@@ -64,7 +64,7 @@
64#include <openssl/buffer.h> 64#include <openssl/buffer.h>
65 65
66char *X509_NAME_oneline(X509_NAME *a, char *buf, int len) 66char *X509_NAME_oneline(X509_NAME *a, char *buf, int len)
67 { 67{
68 X509_NAME_ENTRY *ne; 68 X509_NAME_ENTRY *ne;
69int i; 69int i;
70 int n,lold,l,l1,l2,num,j,type; 70 int n,lold,l,l1,l2,num,j,type;
@@ -76,103 +76,85 @@ int i;
76 int gs_doit[4]; 76 int gs_doit[4];
77 char tmp_buf[80]; 77 char tmp_buf[80];
78 78
79 if (buf == NULL) 79 if (buf == NULL) {
80 {
81 if ((b=BUF_MEM_new()) == NULL) goto err; 80 if ((b=BUF_MEM_new()) == NULL) goto err;
82 if (!BUF_MEM_grow(b,200)) goto err; 81 if (!BUF_MEM_grow(b,200)) goto err;
83 b->data[0]='\0'; 82 b->data[0]='\0';
84 len=200; 83 len=200;
84 }
85 if (a == NULL) {
86 if(b) {
87 buf=b->data;
88 free(b);
85 } 89 }
86 if (a == NULL) 90 strlcpy(buf,"NO X509_NAME",len);
87 { 91 return buf;
88 if(b) 92 }
89 {
90 buf=b->data;
91 free(b);
92 }
93 strlcpy(buf,"NO X509_NAME",len);
94 return buf;
95 }
96 93
97 len--; /* space for '\0' */ 94 len--; /* space for '\0' */
98 l=0; 95 l=0;
99 for (i=0; i<sk_X509_NAME_ENTRY_num(a->entries); i++) 96 for (i=0; i<sk_X509_NAME_ENTRY_num(a->entries); i++) {
100 {
101 ne=sk_X509_NAME_ENTRY_value(a->entries,i); 97 ne=sk_X509_NAME_ENTRY_value(a->entries,i);
102 n=OBJ_obj2nid(ne->object); 98 n=OBJ_obj2nid(ne->object);
103 if ((n == NID_undef) || ((s=OBJ_nid2sn(n)) == NULL)) 99 if ((n == NID_undef) || ((s=OBJ_nid2sn(n)) == NULL)) {
104 {
105 i2t_ASN1_OBJECT(tmp_buf,sizeof(tmp_buf),ne->object); 100 i2t_ASN1_OBJECT(tmp_buf,sizeof(tmp_buf),ne->object);
106 s=tmp_buf; 101 s=tmp_buf;
107 } 102 }
108 l1=strlen(s); 103 l1=strlen(s);
109 104
110 type=ne->value->type; 105 type=ne->value->type;
111 num=ne->value->length; 106 num=ne->value->length;
112 q=ne->value->data; 107 q=ne->value->data;
113 if ((type == V_ASN1_GENERALSTRING) && ((num%4) == 0)) 108 if ((type == V_ASN1_GENERALSTRING) && ((num%4) == 0)) {
114 {
115 gs_doit[0]=gs_doit[1]=gs_doit[2]=gs_doit[3]=0; 109 gs_doit[0]=gs_doit[1]=gs_doit[2]=gs_doit[3]=0;
116 for (j=0; j<num; j++) 110 for (j=0; j<num; j++)
117 if (q[j] != 0) gs_doit[j&3]=1; 111 if (q[j] != 0) gs_doit[j&3]=1;
118 112
119 if (gs_doit[0]|gs_doit[1]|gs_doit[2]) 113 if (gs_doit[0]|gs_doit[1]|gs_doit[2])
120 gs_doit[0]=gs_doit[1]=gs_doit[2]=gs_doit[3]=1; 114 gs_doit[0]=gs_doit[1]=gs_doit[2]=gs_doit[3]=1;
121 else 115 else {
122 {
123 gs_doit[0]=gs_doit[1]=gs_doit[2]=0; 116 gs_doit[0]=gs_doit[1]=gs_doit[2]=0;
124 gs_doit[3]=1; 117 gs_doit[3]=1;
125 }
126 } 118 }
127 else 119 } else
128 gs_doit[0]=gs_doit[1]=gs_doit[2]=gs_doit[3]=1; 120 gs_doit[0]=gs_doit[1]=gs_doit[2]=gs_doit[3]=1;
129 121
130 for (l2=j=0; j<num; j++) 122 for (l2=j=0; j<num; j++) {
131 {
132 if (!gs_doit[j&3]) continue; 123 if (!gs_doit[j&3]) continue;
133 l2++; 124 l2++;
134 if ((q[j] < ' ') || (q[j] > '~')) l2+=3; 125 if ((q[j] < ' ') || (q[j] > '~')) l2+=3;
135 } 126 }
136 127
137 lold=l; 128 lold=l;
138 l+=1+l1+1+l2; 129 l+=1+l1+1+l2;
139 if (b != NULL) 130 if (b != NULL) {
140 {
141 if (!BUF_MEM_grow(b,l+1)) goto err; 131 if (!BUF_MEM_grow(b,l+1)) goto err;
142 p= &(b->data[lold]); 132 p= &(b->data[lold]);
143 } 133 } else if (l > len) {
144 else if (l > len)
145 {
146 break; 134 break;
147 } 135 } else
148 else
149 p= &(buf[lold]); 136 p= &(buf[lold]);
150 *(p++)='/'; 137 *(p++)='/';
151 memcpy(p,s,(unsigned int)l1); p+=l1; 138 memcpy(p,s,(unsigned int)l1); p+=l1;
152 *(p++)='='; 139 *(p++)='=';
153 q=ne->value->data; 140 q=ne->value->data;
154 for (j=0; j<num; j++) 141 for (j=0; j<num; j++) {
155 {
156 if (!gs_doit[j&3]) continue; 142 if (!gs_doit[j&3]) continue;
157 n=q[j]; 143 n=q[j];
158 if ((n < ' ') || (n > '~')) 144 if ((n < ' ') || (n > '~')) {
159 {
160 *(p++)='\\'; 145 *(p++)='\\';
161 *(p++)='x'; 146 *(p++)='x';
162 *(p++)=hex[(n>>4)&0x0f]; 147 *(p++)=hex[(n>>4)&0x0f];
163 *(p++)=hex[n&0x0f]; 148 *(p++)=hex[n&0x0f];
164 } 149 } else
165 else
166 *(p++)=n; 150 *(p++)=n;
167 }
168 *p='\0';
169 } 151 }
170 if (b != NULL) 152 *p='\0';
171 { 153 }
154 if (b != NULL) {
172 p=b->data; 155 p=b->data;
173 free(b); 156 free(b);
174 } 157 } else
175 else
176 p=buf; 158 p=buf;
177 if (i == 0) 159 if (i == 0)
178 *p = '\0'; 160 *p = '\0';
@@ -181,5 +163,5 @@ err:
181 X509err(X509_F_X509_NAME_ONELINE,ERR_R_MALLOC_FAILURE); 163 X509err(X509_F_X509_NAME_ONELINE,ERR_R_MALLOC_FAILURE);
182 if (b != NULL) BUF_MEM_free(b); 164 if (b != NULL) BUF_MEM_free(b);
183 return(NULL); 165 return(NULL);
184 } 166}
185 167