source: EcnlProtoTool/trunk/openssl-1.1.0e/crypto/x509/x509name.c@ 331

Last change on this file since 331 was 331, checked in by coas-nagasima, 6 years ago

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc
File size: 9.9 KB
Line 
1/*
2 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9
10#include <stdio.h>
11#include <openssl/stack.h>
12#include "internal/cryptlib.h"
13#include <openssl/asn1.h>
14#include <openssl/objects.h>
15#include <openssl/evp.h>
16#include <openssl/x509.h>
17#include "internal/x509_int.h"
18
19int X509_NAME_get_text_by_NID(X509_NAME *name, int nid, char *buf, int len)
20{
21 ASN1_OBJECT *obj;
22
23 obj = OBJ_nid2obj(nid);
24 if (obj == NULL)
25 return (-1);
26 return (X509_NAME_get_text_by_OBJ(name, obj, buf, len));
27}
28
29int X509_NAME_get_text_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj, char *buf,
30 int len)
31{
32 int i;
33 const ASN1_STRING *data;
34
35 i = X509_NAME_get_index_by_OBJ(name, obj, -1);
36 if (i < 0)
37 return (-1);
38 data = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(name, i));
39 i = (data->length > (len - 1)) ? (len - 1) : data->length;
40 if (buf == NULL)
41 return (data->length);
42 memcpy(buf, data->data, i);
43 buf[i] = '\0';
44 return (i);
45}
46
47int X509_NAME_entry_count(const X509_NAME *name)
48{
49 if (name == NULL)
50 return (0);
51 return (sk_X509_NAME_ENTRY_num(name->entries));
52}
53
54int X509_NAME_get_index_by_NID(X509_NAME *name, int nid, int lastpos)
55{
56 ASN1_OBJECT *obj;
57
58 obj = OBJ_nid2obj(nid);
59 if (obj == NULL)
60 return (-2);
61 return (X509_NAME_get_index_by_OBJ(name, obj, lastpos));
62}
63
64/* NOTE: you should be passing -1, not 0 as lastpos */
65int X509_NAME_get_index_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj, int lastpos)
66{
67 int n;
68 X509_NAME_ENTRY *ne;
69 STACK_OF(X509_NAME_ENTRY) *sk;
70
71 if (name == NULL)
72 return (-1);
73 if (lastpos < 0)
74 lastpos = -1;
75 sk = name->entries;
76 n = sk_X509_NAME_ENTRY_num(sk);
77 for (lastpos++; lastpos < n; lastpos++) {
78 ne = sk_X509_NAME_ENTRY_value(sk, lastpos);
79 if (OBJ_cmp(ne->object, obj) == 0)
80 return (lastpos);
81 }
82 return (-1);
83}
84
85X509_NAME_ENTRY *X509_NAME_get_entry(const X509_NAME *name, int loc)
86{
87 if (name == NULL || sk_X509_NAME_ENTRY_num(name->entries) <= loc
88 || loc < 0)
89 return (NULL);
90 else
91 return (sk_X509_NAME_ENTRY_value(name->entries, loc));
92}
93
94X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc)
95{
96 X509_NAME_ENTRY *ret;
97 int i, n, set_prev, set_next;
98 STACK_OF(X509_NAME_ENTRY) *sk;
99
100 if (name == NULL || sk_X509_NAME_ENTRY_num(name->entries) <= loc
101 || loc < 0)
102 return (NULL);
103 sk = name->entries;
104 ret = sk_X509_NAME_ENTRY_delete(sk, loc);
105 n = sk_X509_NAME_ENTRY_num(sk);
106 name->modified = 1;
107 if (loc == n)
108 return (ret);
109
110 /* else we need to fixup the set field */
111 if (loc != 0)
112 set_prev = (sk_X509_NAME_ENTRY_value(sk, loc - 1))->set;
113 else
114 set_prev = ret->set - 1;
115 set_next = sk_X509_NAME_ENTRY_value(sk, loc)->set;
116
117 /*-
118 * set_prev is the previous set
119 * set is the current set
120 * set_next is the following
121 * prev 1 1 1 1 1 1 1 1
122 * set 1 1 2 2
123 * next 1 1 2 2 2 2 3 2
124 * so basically only if prev and next differ by 2, then
125 * re-number down by 1
126 */
127 if (set_prev + 1 < set_next)
128 for (i = loc; i < n; i++)
129 sk_X509_NAME_ENTRY_value(sk, i)->set--;
130 return (ret);
131}
132
133int X509_NAME_add_entry_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj, int type,
134 const unsigned char *bytes, int len, int loc,
135 int set)
136{
137 X509_NAME_ENTRY *ne;
138 int ret;
139 ne = X509_NAME_ENTRY_create_by_OBJ(NULL, obj, type, bytes, len);
140 if (!ne)
141 return 0;
142 ret = X509_NAME_add_entry(name, ne, loc, set);
143 X509_NAME_ENTRY_free(ne);
144 return ret;
145}
146
147int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type,
148 const unsigned char *bytes, int len, int loc,
149 int set)
150{
151 X509_NAME_ENTRY *ne;
152 int ret;
153 ne = X509_NAME_ENTRY_create_by_NID(NULL, nid, type, bytes, len);
154 if (!ne)
155 return 0;
156 ret = X509_NAME_add_entry(name, ne, loc, set);
157 X509_NAME_ENTRY_free(ne);
158 return ret;
159}
160
161int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type,
162 const unsigned char *bytes, int len, int loc,
163 int set)
164{
165 X509_NAME_ENTRY *ne;
166 int ret;
167 ne = X509_NAME_ENTRY_create_by_txt(NULL, field, type, bytes, len);
168 if (!ne)
169 return 0;
170 ret = X509_NAME_add_entry(name, ne, loc, set);
171 X509_NAME_ENTRY_free(ne);
172 return ret;
173}
174
175/*
176 * if set is -1, append to previous set, 0 'a new one', and 1, prepend to the
177 * guy we are about to stomp on.
178 */
179int X509_NAME_add_entry(X509_NAME *name, const X509_NAME_ENTRY *ne, int loc,
180 int set)
181{
182 X509_NAME_ENTRY *new_name = NULL;
183 int n, i, inc;
184 STACK_OF(X509_NAME_ENTRY) *sk;
185
186 if (name == NULL)
187 return (0);
188 sk = name->entries;
189 n = sk_X509_NAME_ENTRY_num(sk);
190 if (loc > n)
191 loc = n;
192 else if (loc < 0)
193 loc = n;
194
195 name->modified = 1;
196
197 if (set == -1) {
198 if (loc == 0) {
199 set = 0;
200 inc = 1;
201 } else {
202 set = sk_X509_NAME_ENTRY_value(sk, loc - 1)->set;
203 inc = 0;
204 }
205 } else { /* if (set >= 0) */
206
207 if (loc >= n) {
208 if (loc != 0)
209 set = sk_X509_NAME_ENTRY_value(sk, loc - 1)->set + 1;
210 else
211 set = 0;
212 } else
213 set = sk_X509_NAME_ENTRY_value(sk, loc)->set;
214 inc = (set == 0) ? 1 : 0;
215 }
216
217 /*
218 * X509_NAME_ENTRY_dup is ASN1 generated code, that can't be easily
219 * const'ified; harmless cast as dup() don't modify its input.
220 */
221 if ((new_name = X509_NAME_ENTRY_dup((X509_NAME_ENTRY *)ne)) == NULL)
222 goto err;
223 new_name->set = set;
224 if (!sk_X509_NAME_ENTRY_insert(sk, new_name, loc)) {
225 X509err(X509_F_X509_NAME_ADD_ENTRY, ERR_R_MALLOC_FAILURE);
226 goto err;
227 }
228 if (inc) {
229 n = sk_X509_NAME_ENTRY_num(sk);
230 for (i = loc + 1; i < n; i++)
231 sk_X509_NAME_ENTRY_value(sk, i - 1)->set += 1;
232 }
233 return (1);
234 err:
235 X509_NAME_ENTRY_free(new_name);
236 return (0);
237}
238
239X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne,
240 const char *field, int type,
241 const unsigned char *bytes,
242 int len)
243{
244 ASN1_OBJECT *obj;
245 X509_NAME_ENTRY *nentry;
246
247 obj = OBJ_txt2obj(field, 0);
248 if (obj == NULL) {
249 X509err(X509_F_X509_NAME_ENTRY_CREATE_BY_TXT,
250 X509_R_INVALID_FIELD_NAME);
251 ERR_add_error_data(2, "name=", field);
252 return (NULL);
253 }
254 nentry = X509_NAME_ENTRY_create_by_OBJ(ne, obj, type, bytes, len);
255 ASN1_OBJECT_free(obj);
256 return nentry;
257}
258
259X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid,
260 int type,
261 const unsigned char *bytes,
262 int len)
263{
264 ASN1_OBJECT *obj;
265 X509_NAME_ENTRY *nentry;
266
267 obj = OBJ_nid2obj(nid);
268 if (obj == NULL) {
269 X509err(X509_F_X509_NAME_ENTRY_CREATE_BY_NID, X509_R_UNKNOWN_NID);
270 return (NULL);
271 }
272 nentry = X509_NAME_ENTRY_create_by_OBJ(ne, obj, type, bytes, len);
273 ASN1_OBJECT_free(obj);
274 return nentry;
275}
276
277X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne,
278 const ASN1_OBJECT *obj, int type,
279 const unsigned char *bytes,
280 int len)
281{
282 X509_NAME_ENTRY *ret;
283
284 if ((ne == NULL) || (*ne == NULL)) {
285 if ((ret = X509_NAME_ENTRY_new()) == NULL)
286 return (NULL);
287 } else
288 ret = *ne;
289
290 if (!X509_NAME_ENTRY_set_object(ret, obj))
291 goto err;
292 if (!X509_NAME_ENTRY_set_data(ret, type, bytes, len))
293 goto err;
294
295 if ((ne != NULL) && (*ne == NULL))
296 *ne = ret;
297 return (ret);
298 err:
299 if ((ne == NULL) || (ret != *ne))
300 X509_NAME_ENTRY_free(ret);
301 return (NULL);
302}
303
304int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, const ASN1_OBJECT *obj)
305{
306 if ((ne == NULL) || (obj == NULL)) {
307 X509err(X509_F_X509_NAME_ENTRY_SET_OBJECT,
308 ERR_R_PASSED_NULL_PARAMETER);
309 return (0);
310 }
311 ASN1_OBJECT_free(ne->object);
312 ne->object = OBJ_dup(obj);
313 return ((ne->object == NULL) ? 0 : 1);
314}
315
316int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type,
317 const unsigned char *bytes, int len)
318{
319 int i;
320
321 if ((ne == NULL) || ((bytes == NULL) && (len != 0)))
322 return (0);
323 if ((type > 0) && (type & MBSTRING_FLAG))
324 return ASN1_STRING_set_by_NID(&ne->value, bytes,
325 len, type,
326 OBJ_obj2nid(ne->object)) ? 1 : 0;
327 if (len < 0)
328 len = strlen((const char *)bytes);
329 i = ASN1_STRING_set(ne->value, bytes, len);
330 if (!i)
331 return (0);
332 if (type != V_ASN1_UNDEF) {
333 if (type == V_ASN1_APP_CHOOSE)
334 ne->value->type = ASN1_PRINTABLE_type(bytes, len);
335 else
336 ne->value->type = type;
337 }
338 return (1);
339}
340
341ASN1_OBJECT *X509_NAME_ENTRY_get_object(const X509_NAME_ENTRY *ne)
342{
343 if (ne == NULL)
344 return (NULL);
345 return (ne->object);
346}
347
348ASN1_STRING *X509_NAME_ENTRY_get_data(const X509_NAME_ENTRY *ne)
349{
350 if (ne == NULL)
351 return (NULL);
352 return (ne->value);
353}
354
355int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne)
356{
357 return ne->set;
358}
Note: See TracBrowser for help on using the repository browser.