OLD | NEW |
1 /* v3_lib.c */ | 1 /* v3_lib.c */ |
2 /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 * project 1999. | 3 * project 1999. |
4 */ | 4 */ |
5 /* ==================================================================== | 5 /* ==================================================================== |
6 * Copyright (c) 1999 The OpenSSL Project. All rights reserved. | 6 * Copyright (c) 1999 The OpenSSL Project. All rights reserved. |
7 * | 7 * |
8 * Redistribution and use in source and binary forms, with or without | 8 * Redistribution and use in source and binary forms, with or without |
9 * modification, are permitted provided that the following conditions | 9 * modification, are permitted provided that the following conditions |
10 * are met: | 10 * are met: |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 return 0; | 77 return 0; |
78 } | 78 } |
79 if(!sk_X509V3_EXT_METHOD_push(ext_list, ext)) { | 79 if(!sk_X509V3_EXT_METHOD_push(ext_list, ext)) { |
80 X509V3err(X509V3_F_X509V3_EXT_ADD,ERR_R_MALLOC_FAILURE); | 80 X509V3err(X509V3_F_X509V3_EXT_ADD,ERR_R_MALLOC_FAILURE); |
81 return 0; | 81 return 0; |
82 } | 82 } |
83 return 1; | 83 return 1; |
84 } | 84 } |
85 | 85 |
86 static int ext_cmp(const X509V3_EXT_METHOD * const *a, | 86 static int ext_cmp(const X509V3_EXT_METHOD * const *a, |
87 » » const X509V3_EXT_METHOD * const *b) | 87 » » const X509V3_EXT_METHOD * const *b) |
88 { | 88 { |
89 return ((*a)->ext_nid - (*b)->ext_nid); | 89 return ((*a)->ext_nid - (*b)->ext_nid); |
90 } | 90 } |
91 | 91 |
92 X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid) | 92 DECLARE_OBJ_BSEARCH_CMP_FN(const X509V3_EXT_METHOD *, const X509V3_EXT_METHOD *, |
| 93 » » » ext); |
| 94 IMPLEMENT_OBJ_BSEARCH_CMP_FN(const X509V3_EXT_METHOD *, |
| 95 » » » const X509V3_EXT_METHOD *, ext); |
| 96 |
| 97 const X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid) |
93 { | 98 { |
94 » X509V3_EXT_METHOD tmp, *t = &tmp, **ret; | 99 » X509V3_EXT_METHOD tmp; |
| 100 » const X509V3_EXT_METHOD *t = &tmp, * const *ret; |
95 int idx; | 101 int idx; |
96 if(nid < 0) return NULL; | 102 if(nid < 0) return NULL; |
97 tmp.ext_nid = nid; | 103 tmp.ext_nid = nid; |
98 » ret = (X509V3_EXT_METHOD **) OBJ_bsearch((char *)&t, | 104 » ret = OBJ_bsearch_ext(&t, standard_exts, STANDARD_EXTENSION_COUNT); |
99 » » » (char *)standard_exts, STANDARD_EXTENSION_COUNT, | |
100 » » » sizeof(X509V3_EXT_METHOD *), (int (*)(const void *, cons
t void *))ext_cmp); | |
101 if(ret) return *ret; | 105 if(ret) return *ret; |
102 if(!ext_list) return NULL; | 106 if(!ext_list) return NULL; |
103 idx = sk_X509V3_EXT_METHOD_find(ext_list, &tmp); | 107 idx = sk_X509V3_EXT_METHOD_find(ext_list, &tmp); |
104 if(idx == -1) return NULL; | 108 if(idx == -1) return NULL; |
105 return sk_X509V3_EXT_METHOD_value(ext_list, idx); | 109 return sk_X509V3_EXT_METHOD_value(ext_list, idx); |
106 } | 110 } |
107 | 111 |
108 X509V3_EXT_METHOD *X509V3_EXT_get(X509_EXTENSION *ext) | 112 const X509V3_EXT_METHOD *X509V3_EXT_get(X509_EXTENSION *ext) |
109 { | 113 { |
110 int nid; | 114 int nid; |
111 if((nid = OBJ_obj2nid(ext->object)) == NID_undef) return NULL; | 115 if((nid = OBJ_obj2nid(ext->object)) == NID_undef) return NULL; |
112 return X509V3_EXT_get_nid(nid); | 116 return X509V3_EXT_get_nid(nid); |
113 } | 117 } |
114 | 118 |
115 | 119 |
116 int X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist) | 120 int X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist) |
117 { | 121 { |
118 for(;extlist->ext_nid!=-1;extlist++) | 122 for(;extlist->ext_nid!=-1;extlist++) |
119 if(!X509V3_EXT_add(extlist)) return 0; | 123 if(!X509V3_EXT_add(extlist)) return 0; |
120 return 1; | 124 return 1; |
121 } | 125 } |
122 | 126 |
123 int X509V3_EXT_add_alias(int nid_to, int nid_from) | 127 int X509V3_EXT_add_alias(int nid_to, int nid_from) |
124 { | 128 { |
125 » X509V3_EXT_METHOD *ext, *tmpext; | 129 » const X509V3_EXT_METHOD *ext; |
| 130 » X509V3_EXT_METHOD *tmpext; |
| 131 |
126 if(!(ext = X509V3_EXT_get_nid(nid_from))) { | 132 if(!(ext = X509V3_EXT_get_nid(nid_from))) { |
127 X509V3err(X509V3_F_X509V3_EXT_ADD_ALIAS,X509V3_R_EXTENSION_NOT_F
OUND); | 133 X509V3err(X509V3_F_X509V3_EXT_ADD_ALIAS,X509V3_R_EXTENSION_NOT_F
OUND); |
128 return 0; | 134 return 0; |
129 } | 135 } |
130 if(!(tmpext = (X509V3_EXT_METHOD *)OPENSSL_malloc(sizeof(X509V3_EXT_METH
OD)))) { | 136 if(!(tmpext = (X509V3_EXT_METHOD *)OPENSSL_malloc(sizeof(X509V3_EXT_METH
OD)))) { |
131 X509V3err(X509V3_F_X509V3_EXT_ADD_ALIAS,ERR_R_MALLOC_FAILURE); | 137 X509V3err(X509V3_F_X509V3_EXT_ADD_ALIAS,ERR_R_MALLOC_FAILURE); |
132 return 0; | 138 return 0; |
133 } | 139 } |
134 *tmpext = *ext; | 140 *tmpext = *ext; |
135 tmpext->ext_nid = nid_to; | 141 tmpext->ext_nid = nid_to; |
(...skipping 18 matching lines...) Expand all Loading... |
154 | 160 |
155 int X509V3_add_standard_extensions(void) | 161 int X509V3_add_standard_extensions(void) |
156 { | 162 { |
157 return 1; | 163 return 1; |
158 } | 164 } |
159 | 165 |
160 /* Return an extension internal structure */ | 166 /* Return an extension internal structure */ |
161 | 167 |
162 void *X509V3_EXT_d2i(X509_EXTENSION *ext) | 168 void *X509V3_EXT_d2i(X509_EXTENSION *ext) |
163 { | 169 { |
164 » X509V3_EXT_METHOD *method; | 170 » const X509V3_EXT_METHOD *method; |
165 const unsigned char *p; | 171 const unsigned char *p; |
166 | 172 |
167 if(!(method = X509V3_EXT_get(ext))) return NULL; | 173 if(!(method = X509V3_EXT_get(ext))) return NULL; |
168 p = ext->value->data; | 174 p = ext->value->data; |
169 if(method->it) return ASN1_item_d2i(NULL, &p, ext->value->length, ASN1_I
TEM_ptr(method->it)); | 175 if(method->it) return ASN1_item_d2i(NULL, &p, ext->value->length, ASN1_I
TEM_ptr(method->it)); |
170 return method->d2i(NULL, &p, ext->value->length); | 176 return method->d2i(NULL, &p, ext->value->length); |
171 } | 177 } |
172 | 178 |
173 /* Get critical flag and decoded version of extension from a NID. | 179 /* Get critical flag and decoded version of extension from a NID. |
174 * The "idx" variable returns the last found extension and can | 180 * The "idx" variable returns the last found extension and can |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
294 | 300 |
295 return 1; | 301 return 1; |
296 | 302 |
297 err: | 303 err: |
298 if(!(flags & X509V3_ADD_SILENT)) | 304 if(!(flags & X509V3_ADD_SILENT)) |
299 X509V3err(X509V3_F_X509V3_ADD1_I2D, errcode); | 305 X509V3err(X509V3_F_X509V3_ADD1_I2D, errcode); |
300 return 0; | 306 return 0; |
301 } | 307 } |
302 | 308 |
303 IMPLEMENT_STACK_OF(X509V3_EXT_METHOD) | 309 IMPLEMENT_STACK_OF(X509V3_EXT_METHOD) |
OLD | NEW |