diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libcrypto/x509/x509_lib.c | 147 |
1 files changed, 42 insertions, 105 deletions
diff --git a/src/lib/libcrypto/x509/x509_lib.c b/src/lib/libcrypto/x509/x509_lib.c index 93f8dc207b..c78b600677 100644 --- a/src/lib/libcrypto/x509/x509_lib.c +++ b/src/lib/libcrypto/x509/x509_lib.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: x509_lib.c,v 1.14 2023/04/25 10:56:58 tb Exp $ */ | 1 | /* $OpenBSD: x509_lib.c,v 1.15 2024/01/25 12:20:17 tb Exp $ */ |
| 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 | */ |
| @@ -65,8 +65,6 @@ | |||
| 65 | 65 | ||
| 66 | #include "x509_local.h" | 66 | #include "x509_local.h" |
| 67 | 67 | ||
| 68 | static STACK_OF(X509V3_EXT_METHOD) *ext_list = NULL; | ||
| 69 | |||
| 70 | extern const X509V3_EXT_METHOD v3_bcons, v3_nscert, v3_key_usage, v3_ext_ku; | 68 | extern const X509V3_EXT_METHOD v3_bcons, v3_nscert, v3_key_usage, v3_ext_ku; |
| 71 | extern const X509V3_EXT_METHOD v3_pkey_usage_period, v3_info, v3_sinfo; | 69 | extern const X509V3_EXT_METHOD v3_pkey_usage_period, v3_info, v3_sinfo; |
| 72 | extern const X509V3_EXT_METHOD v3_ns_ia5_list[], v3_alt[], v3_skey_id, v3_akey_id; | 70 | extern const X509V3_EXT_METHOD v3_ns_ia5_list[], v3_alt[], v3_skey_id, v3_akey_id; |
| @@ -142,62 +140,17 @@ static const X509V3_EXT_METHOD *standard_exts[] = { | |||
| 142 | 140 | ||
| 143 | #define STANDARD_EXTENSION_COUNT (sizeof(standard_exts) / sizeof(standard_exts[0])) | 141 | #define STANDARD_EXTENSION_COUNT (sizeof(standard_exts) / sizeof(standard_exts[0])) |
| 144 | 142 | ||
| 145 | static int | ||
| 146 | ext_cmp(const X509V3_EXT_METHOD * const *a, const X509V3_EXT_METHOD * const *b) | ||
| 147 | { | ||
| 148 | return ((*a)->ext_nid - (*b)->ext_nid); | ||
| 149 | } | ||
| 150 | |||
| 151 | int | ||
| 152 | X509V3_EXT_add(X509V3_EXT_METHOD *ext) | ||
| 153 | { | ||
| 154 | if (!ext_list && !(ext_list = sk_X509V3_EXT_METHOD_new(ext_cmp))) { | ||
| 155 | X509V3error(ERR_R_MALLOC_FAILURE); | ||
| 156 | return 0; | ||
| 157 | } | ||
| 158 | if (!sk_X509V3_EXT_METHOD_push(ext_list, ext)) { | ||
| 159 | X509V3error(ERR_R_MALLOC_FAILURE); | ||
| 160 | return 0; | ||
| 161 | } | ||
| 162 | return 1; | ||
| 163 | } | ||
| 164 | LCRYPTO_ALIAS(X509V3_EXT_add); | ||
| 165 | |||
| 166 | static int | ||
| 167 | ext_cmp_BSEARCH_CMP_FN(const void *a_, const void *b_) | ||
| 168 | { | ||
| 169 | const X509V3_EXT_METHOD * const *a = a_; | ||
| 170 | const X509V3_EXT_METHOD * const *b = b_; | ||
| 171 | return ext_cmp(a, b); | ||
| 172 | } | ||
| 173 | |||
| 174 | static const X509V3_EXT_METHOD ** | ||
| 175 | OBJ_bsearch_ext(const X509V3_EXT_METHOD **key, | ||
| 176 | const X509V3_EXT_METHOD *const *base, int num) | ||
| 177 | { | ||
| 178 | return (const X509V3_EXT_METHOD **)OBJ_bsearch_(key, base, num, | ||
| 179 | sizeof(const X509V3_EXT_METHOD *), ext_cmp_BSEARCH_CMP_FN); | ||
| 180 | } | ||
| 181 | |||
| 182 | const X509V3_EXT_METHOD * | 143 | const X509V3_EXT_METHOD * |
| 183 | X509V3_EXT_get_nid(int nid) | 144 | X509V3_EXT_get_nid(int nid) |
| 184 | { | 145 | { |
| 185 | X509V3_EXT_METHOD tmp; | 146 | size_t i; |
| 186 | const X509V3_EXT_METHOD *t = &tmp, * const *ret; | ||
| 187 | int idx; | ||
| 188 | 147 | ||
| 189 | if (nid < 0) | 148 | for (i = 0; i < STANDARD_EXTENSION_COUNT; i++) { |
| 190 | return NULL; | 149 | if (standard_exts[i]->ext_nid == nid) |
| 191 | tmp.ext_nid = nid; | 150 | return standard_exts[i]; |
| 192 | ret = OBJ_bsearch_ext(&t, standard_exts, STANDARD_EXTENSION_COUNT); | 151 | } |
| 193 | if (ret) | 152 | |
| 194 | return *ret; | 153 | return NULL; |
| 195 | if (!ext_list) | ||
| 196 | return NULL; | ||
| 197 | idx = sk_X509V3_EXT_METHOD_find(ext_list, &tmp); | ||
| 198 | if (idx == -1) | ||
| 199 | return NULL; | ||
| 200 | return sk_X509V3_EXT_METHOD_value(ext_list, idx); | ||
| 201 | } | 154 | } |
| 202 | LCRYPTO_ALIAS(X509V3_EXT_get_nid); | 155 | LCRYPTO_ALIAS(X509V3_EXT_get_nid); |
| 203 | 156 | ||
| @@ -213,56 +166,6 @@ X509V3_EXT_get(X509_EXTENSION *ext) | |||
| 213 | LCRYPTO_ALIAS(X509V3_EXT_get); | 166 | LCRYPTO_ALIAS(X509V3_EXT_get); |
| 214 | 167 | ||
| 215 | int | 168 | int |
| 216 | X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist) | ||
| 217 | { | ||
| 218 | for (; extlist->ext_nid!=-1; extlist++) | ||
| 219 | if (!X509V3_EXT_add(extlist)) | ||
| 220 | return 0; | ||
| 221 | return 1; | ||
| 222 | } | ||
| 223 | LCRYPTO_ALIAS(X509V3_EXT_add_list); | ||
| 224 | |||
| 225 | int | ||
| 226 | X509V3_EXT_add_alias(int nid_to, int nid_from) | ||
| 227 | { | ||
| 228 | const X509V3_EXT_METHOD *ext; | ||
| 229 | X509V3_EXT_METHOD *tmpext; | ||
| 230 | |||
| 231 | if (!(ext = X509V3_EXT_get_nid(nid_from))) { | ||
| 232 | X509V3error(X509V3_R_EXTENSION_NOT_FOUND); | ||
| 233 | return 0; | ||
| 234 | } | ||
| 235 | if (!(tmpext = malloc(sizeof(X509V3_EXT_METHOD)))) { | ||
| 236 | X509V3error(ERR_R_MALLOC_FAILURE); | ||
| 237 | return 0; | ||
| 238 | } | ||
| 239 | *tmpext = *ext; | ||
| 240 | tmpext->ext_nid = nid_to; | ||
| 241 | tmpext->ext_flags |= X509V3_EXT_DYNAMIC; | ||
| 242 | if (!X509V3_EXT_add(tmpext)) { | ||
| 243 | free(tmpext); | ||
| 244 | return 0; | ||
| 245 | } | ||
| 246 | return 1; | ||
| 247 | } | ||
| 248 | LCRYPTO_ALIAS(X509V3_EXT_add_alias); | ||
| 249 | |||
| 250 | static void | ||
| 251 | ext_list_free(X509V3_EXT_METHOD *ext) | ||
| 252 | { | ||
| 253 | if (ext->ext_flags & X509V3_EXT_DYNAMIC) | ||
| 254 | free(ext); | ||
| 255 | } | ||
| 256 | |||
| 257 | void | ||
| 258 | X509V3_EXT_cleanup(void) | ||
| 259 | { | ||
| 260 | sk_X509V3_EXT_METHOD_pop_free(ext_list, ext_list_free); | ||
| 261 | ext_list = NULL; | ||
| 262 | } | ||
| 263 | LCRYPTO_ALIAS(X509V3_EXT_cleanup); | ||
| 264 | |||
| 265 | int | ||
| 266 | X509V3_add_standard_extensions(void) | 169 | X509V3_add_standard_extensions(void) |
| 267 | { | 170 | { |
| 268 | return 1; | 171 | return 1; |
| @@ -434,3 +337,37 @@ err: | |||
| 434 | return 0; | 337 | return 0; |
| 435 | } | 338 | } |
| 436 | LCRYPTO_ALIAS(X509V3_add1_i2d); | 339 | LCRYPTO_ALIAS(X509V3_add1_i2d); |
| 340 | |||
| 341 | /* | ||
| 342 | * XXX - remove all the functions below in the next major bump. | ||
| 343 | */ | ||
| 344 | |||
| 345 | int | ||
| 346 | X509V3_EXT_add(X509V3_EXT_METHOD *ext) | ||
| 347 | { | ||
| 348 | X509V3error(ERR_R_DISABLED); | ||
| 349 | return 0; | ||
| 350 | } | ||
| 351 | LCRYPTO_ALIAS(X509V3_EXT_add); | ||
| 352 | |||
| 353 | int | ||
| 354 | X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist) | ||
| 355 | { | ||
| 356 | X509V3error(ERR_R_DISABLED); | ||
| 357 | return 0; | ||
| 358 | } | ||
| 359 | LCRYPTO_ALIAS(X509V3_EXT_add_list); | ||
| 360 | |||
| 361 | int | ||
| 362 | X509V3_EXT_add_alias(int nid_to, int nid_from) | ||
| 363 | { | ||
| 364 | X509V3error(ERR_R_DISABLED); | ||
| 365 | return 0; | ||
| 366 | } | ||
| 367 | LCRYPTO_ALIAS(X509V3_EXT_add_alias); | ||
| 368 | |||
| 369 | void | ||
| 370 | X509V3_EXT_cleanup(void) | ||
| 371 | { | ||
| 372 | } | ||
| 373 | LCRYPTO_ALIAS(X509V3_EXT_cleanup); | ||
