| OLD | NEW |
| 1 /* crypto/objects/obj_dat.c */ | 1 /* crypto/objects/obj_dat.c */ |
| 2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
| 3 * All rights reserved. | 3 * All rights reserved. |
| 4 * | 4 * |
| 5 * This package is an SSL implementation written | 5 * This package is an SSL implementation written |
| 6 * by Eric Young (eay@cryptsoft.com). | 6 * by Eric Young (eay@cryptsoft.com). |
| 7 * The implementation was written so as to conform with Netscapes SSL. | 7 * The implementation was written so as to conform with Netscapes SSL. |
| 8 * | 8 * |
| 9 * This library is free for commercial and non-commercial use as long as | 9 * This library is free for commercial and non-commercial use as long as |
| 10 * the following conditions are aheared to. The following conditions | 10 * the following conditions are aheared to. The following conditions |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 | 67 |
| 68 /* obj_dat.h is generated from objects.h by obj_dat.pl */ | 68 /* obj_dat.h is generated from objects.h by obj_dat.pl */ |
| 69 #ifndef OPENSSL_NO_OBJECT | 69 #ifndef OPENSSL_NO_OBJECT |
| 70 #include "obj_dat.h" | 70 #include "obj_dat.h" |
| 71 #else | 71 #else |
| 72 /* You will have to load all the objects needed manually in the application */ | 72 /* You will have to load all the objects needed manually in the application */ |
| 73 #define NUM_NID 0 | 73 #define NUM_NID 0 |
| 74 #define NUM_SN 0 | 74 #define NUM_SN 0 |
| 75 #define NUM_LN 0 | 75 #define NUM_LN 0 |
| 76 #define NUM_OBJ 0 | 76 #define NUM_OBJ 0 |
| 77 static unsigned char lvalues[1]; | 77 static const unsigned char lvalues[1]; |
| 78 static ASN1_OBJECT nid_objs[1]; | 78 static const ASN1_OBJECT nid_objs[1]; |
| 79 static ASN1_OBJECT *sn_objs[1]; | 79 static const unsigned int sn_objs[1]; |
| 80 static ASN1_OBJECT *ln_objs[1]; | 80 static const unsigned int ln_objs[1]; |
| 81 static ASN1_OBJECT *obj_objs[1]; | 81 static const unsigned int obj_objs[1]; |
| 82 #endif | 82 #endif |
| 83 | 83 |
| 84 static int sn_cmp(const void *a, const void *b); | 84 DECLARE_OBJ_BSEARCH_CMP_FN(const ASN1_OBJECT *, unsigned int, sn); |
| 85 static int ln_cmp(const void *a, const void *b); | 85 DECLARE_OBJ_BSEARCH_CMP_FN(const ASN1_OBJECT *, unsigned int, ln); |
| 86 static int obj_cmp(const void *a, const void *b); | 86 DECLARE_OBJ_BSEARCH_CMP_FN(const ASN1_OBJECT *, unsigned int, obj); |
| 87 |
| 87 #define ADDED_DATA 0 | 88 #define ADDED_DATA 0 |
| 88 #define ADDED_SNAME 1 | 89 #define ADDED_SNAME 1 |
| 89 #define ADDED_LNAME 2 | 90 #define ADDED_LNAME 2 |
| 90 #define ADDED_NID 3 | 91 #define ADDED_NID 3 |
| 91 | 92 |
| 92 typedef struct added_obj_st | 93 typedef struct added_obj_st |
| 93 { | 94 { |
| 94 int type; | 95 int type; |
| 95 ASN1_OBJECT *obj; | 96 ASN1_OBJECT *obj; |
| 96 } ADDED_OBJ; | 97 } ADDED_OBJ; |
| 98 DECLARE_LHASH_OF(ADDED_OBJ); |
| 97 | 99 |
| 98 static int new_nid=NUM_NID; | 100 static int new_nid=NUM_NID; |
| 99 static LHASH *added=NULL; | 101 static LHASH_OF(ADDED_OBJ) *added=NULL; |
| 100 | 102 |
| 101 static int sn_cmp(const void *a, const void *b) | 103 static int sn_cmp(const ASN1_OBJECT * const *a, const unsigned int *b) |
| 102 » { | 104 » { return(strcmp((*a)->sn,nid_objs[*b].sn)); } |
| 103 » const ASN1_OBJECT * const *ap = a, * const *bp = b; | |
| 104 » return(strcmp((*ap)->sn,(*bp)->sn)); | |
| 105 » } | |
| 106 | 105 |
| 107 static int ln_cmp(const void *a, const void *b) | 106 IMPLEMENT_OBJ_BSEARCH_CMP_FN(const ASN1_OBJECT *, unsigned int, sn); |
| 108 » { | |
| 109 » const ASN1_OBJECT * const *ap = a, * const *bp = b; | |
| 110 » return(strcmp((*ap)->ln,(*bp)->ln)); | |
| 111 » } | |
| 112 | 107 |
| 113 /* static unsigned long add_hash(ADDED_OBJ *ca) */ | 108 static int ln_cmp(const ASN1_OBJECT * const *a, const unsigned int *b) |
| 114 static unsigned long add_hash(const void *ca_void) | 109 » { return(strcmp((*a)->ln,nid_objs[*b].ln)); } |
| 110 |
| 111 IMPLEMENT_OBJ_BSEARCH_CMP_FN(const ASN1_OBJECT *, unsigned int, ln); |
| 112 |
| 113 static unsigned long added_obj_hash(const ADDED_OBJ *ca) |
| 115 { | 114 { |
| 116 const ASN1_OBJECT *a; | 115 const ASN1_OBJECT *a; |
| 117 int i; | 116 int i; |
| 118 unsigned long ret=0; | 117 unsigned long ret=0; |
| 119 unsigned char *p; | 118 unsigned char *p; |
| 120 const ADDED_OBJ *ca = (const ADDED_OBJ *)ca_void; | |
| 121 | 119 |
| 122 a=ca->obj; | 120 a=ca->obj; |
| 123 switch (ca->type) | 121 switch (ca->type) |
| 124 { | 122 { |
| 125 case ADDED_DATA: | 123 case ADDED_DATA: |
| 126 ret=a->length<<20L; | 124 ret=a->length<<20L; |
| 127 p=(unsigned char *)a->data; | 125 p=(unsigned char *)a->data; |
| 128 for (i=0; i<a->length; i++) | 126 for (i=0; i<a->length; i++) |
| 129 ret^=p[i]<<((i*3)%24); | 127 ret^=p[i]<<((i*3)%24); |
| 130 break; | 128 break; |
| 131 case ADDED_SNAME: | 129 case ADDED_SNAME: |
| 132 ret=lh_strhash(a->sn); | 130 ret=lh_strhash(a->sn); |
| 133 break; | 131 break; |
| 134 case ADDED_LNAME: | 132 case ADDED_LNAME: |
| 135 ret=lh_strhash(a->ln); | 133 ret=lh_strhash(a->ln); |
| 136 break; | 134 break; |
| 137 case ADDED_NID: | 135 case ADDED_NID: |
| 138 ret=a->nid; | 136 ret=a->nid; |
| 139 break; | 137 break; |
| 140 default: | 138 default: |
| 141 /* abort(); */ | 139 /* abort(); */ |
| 142 return 0; | 140 return 0; |
| 143 } | 141 } |
| 144 ret&=0x3fffffffL; | 142 ret&=0x3fffffffL; |
| 145 ret|=ca->type<<30L; | 143 ret|=ca->type<<30L; |
| 146 return(ret); | 144 return(ret); |
| 147 } | 145 } |
| 146 static IMPLEMENT_LHASH_HASH_FN(added_obj, ADDED_OBJ) |
| 148 | 147 |
| 149 /* static int add_cmp(ADDED_OBJ *ca, ADDED_OBJ *cb) */ | 148 static int added_obj_cmp(const ADDED_OBJ *ca, const ADDED_OBJ *cb) |
| 150 static int add_cmp(const void *ca_void, const void *cb_void) | |
| 151 { | 149 { |
| 152 ASN1_OBJECT *a,*b; | 150 ASN1_OBJECT *a,*b; |
| 153 int i; | 151 int i; |
| 154 const ADDED_OBJ *ca = (const ADDED_OBJ *)ca_void; | |
| 155 const ADDED_OBJ *cb = (const ADDED_OBJ *)cb_void; | |
| 156 | 152 |
| 157 i=ca->type-cb->type; | 153 i=ca->type-cb->type; |
| 158 if (i) return(i); | 154 if (i) return(i); |
| 159 a=ca->obj; | 155 a=ca->obj; |
| 160 b=cb->obj; | 156 b=cb->obj; |
| 161 switch (ca->type) | 157 switch (ca->type) |
| 162 { | 158 { |
| 163 case ADDED_DATA: | 159 case ADDED_DATA: |
| 164 i=(a->length - b->length); | 160 i=(a->length - b->length); |
| 165 if (i) return(i); | 161 if (i) return(i); |
| 166 return(memcmp(a->data,b->data,(size_t)a->length)); | 162 return(memcmp(a->data,b->data,(size_t)a->length)); |
| 167 case ADDED_SNAME: | 163 case ADDED_SNAME: |
| 168 if (a->sn == NULL) return(-1); | 164 if (a->sn == NULL) return(-1); |
| 169 else if (b->sn == NULL) return(1); | 165 else if (b->sn == NULL) return(1); |
| 170 else return(strcmp(a->sn,b->sn)); | 166 else return(strcmp(a->sn,b->sn)); |
| 171 case ADDED_LNAME: | 167 case ADDED_LNAME: |
| 172 if (a->ln == NULL) return(-1); | 168 if (a->ln == NULL) return(-1); |
| 173 else if (b->ln == NULL) return(1); | 169 else if (b->ln == NULL) return(1); |
| 174 else return(strcmp(a->ln,b->ln)); | 170 else return(strcmp(a->ln,b->ln)); |
| 175 case ADDED_NID: | 171 case ADDED_NID: |
| 176 return(a->nid-b->nid); | 172 return(a->nid-b->nid); |
| 177 default: | 173 default: |
| 178 /* abort(); */ | 174 /* abort(); */ |
| 179 return 0; | 175 return 0; |
| 180 } | 176 } |
| 181 } | 177 } |
| 178 static IMPLEMENT_LHASH_COMP_FN(added_obj, ADDED_OBJ) |
| 182 | 179 |
| 183 static int init_added(void) | 180 static int init_added(void) |
| 184 { | 181 { |
| 185 if (added != NULL) return(1); | 182 if (added != NULL) return(1); |
| 186 » added=lh_new(add_hash,add_cmp); | 183 » added=lh_ADDED_OBJ_new(); |
| 187 return(added != NULL); | 184 return(added != NULL); |
| 188 } | 185 } |
| 189 | 186 |
| 190 static void cleanup1(ADDED_OBJ *a) | 187 static void cleanup1_doall(ADDED_OBJ *a) |
| 191 { | 188 { |
| 192 a->obj->nid=0; | 189 a->obj->nid=0; |
| 193 a->obj->flags|=ASN1_OBJECT_FLAG_DYNAMIC| | 190 a->obj->flags|=ASN1_OBJECT_FLAG_DYNAMIC| |
| 194 ASN1_OBJECT_FLAG_DYNAMIC_STRINGS| | 191 ASN1_OBJECT_FLAG_DYNAMIC_STRINGS| |
| 195 ASN1_OBJECT_FLAG_DYNAMIC_DATA; | 192 ASN1_OBJECT_FLAG_DYNAMIC_DATA; |
| 196 } | 193 } |
| 197 | 194 |
| 198 static void cleanup2(ADDED_OBJ *a) | 195 static void cleanup2_doall(ADDED_OBJ *a) |
| 199 { a->obj->nid++; } | 196 { a->obj->nid++; } |
| 200 | 197 |
| 201 static void cleanup3(ADDED_OBJ *a) | 198 static void cleanup3_doall(ADDED_OBJ *a) |
| 202 { | 199 { |
| 203 if (--a->obj->nid == 0) | 200 if (--a->obj->nid == 0) |
| 204 ASN1_OBJECT_free(a->obj); | 201 ASN1_OBJECT_free(a->obj); |
| 205 OPENSSL_free(a); | 202 OPENSSL_free(a); |
| 206 } | 203 } |
| 207 | 204 |
| 208 static IMPLEMENT_LHASH_DOALL_FN(cleanup1, ADDED_OBJ *) | 205 static IMPLEMENT_LHASH_DOALL_FN(cleanup1, ADDED_OBJ) |
| 209 static IMPLEMENT_LHASH_DOALL_FN(cleanup2, ADDED_OBJ *) | 206 static IMPLEMENT_LHASH_DOALL_FN(cleanup2, ADDED_OBJ) |
| 210 static IMPLEMENT_LHASH_DOALL_FN(cleanup3, ADDED_OBJ *) | 207 static IMPLEMENT_LHASH_DOALL_FN(cleanup3, ADDED_OBJ) |
| 208 |
| 209 /* The purpose of obj_cleanup_defer is to avoid EVP_cleanup() attempting |
| 210 * to use freed up OIDs. If neccessary the actual freeing up of OIDs is |
| 211 * delayed. |
| 212 */ |
| 213 |
| 214 int obj_cleanup_defer = 0; |
| 215 |
| 216 void check_defer(int nid) |
| 217 » { |
| 218 » if (!obj_cleanup_defer && nid >= NUM_NID) |
| 219 » » » obj_cleanup_defer = 1; |
| 220 » } |
| 211 | 221 |
| 212 void OBJ_cleanup(void) | 222 void OBJ_cleanup(void) |
| 213 { | 223 { |
| 224 if (obj_cleanup_defer) |
| 225 { |
| 226 obj_cleanup_defer = 2; |
| 227 return ; |
| 228 } |
| 214 if (added == NULL) return; | 229 if (added == NULL) return; |
| 215 » added->down_load=0; | 230 » lh_ADDED_OBJ_down_load(added) = 0; |
| 216 » lh_doall(added,LHASH_DOALL_FN(cleanup1)); /* zero counters */ | 231 » lh_ADDED_OBJ_doall(added,LHASH_DOALL_FN(cleanup1)); /* zero counters */ |
| 217 » lh_doall(added,LHASH_DOALL_FN(cleanup2)); /* set counters */ | 232 » lh_ADDED_OBJ_doall(added,LHASH_DOALL_FN(cleanup2)); /* set counters */ |
| 218 » lh_doall(added,LHASH_DOALL_FN(cleanup3)); /* free objects */ | 233 » lh_ADDED_OBJ_doall(added,LHASH_DOALL_FN(cleanup3)); /* free objects */ |
| 219 » lh_free(added); | 234 » lh_ADDED_OBJ_free(added); |
| 220 added=NULL; | 235 added=NULL; |
| 221 } | 236 } |
| 222 | 237 |
| 223 int OBJ_new_nid(int num) | 238 int OBJ_new_nid(int num) |
| 224 { | 239 { |
| 225 int i; | 240 int i; |
| 226 | 241 |
| 227 i=new_nid; | 242 i=new_nid; |
| 228 new_nid+=num; | 243 new_nid+=num; |
| 229 return(i); | 244 return(i); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 245 if (!(ao[ADDED_SNAME]=(ADDED_OBJ *)OPENSSL_malloc(sizeof(ADDED_O
BJ)))) goto err2; | 260 if (!(ao[ADDED_SNAME]=(ADDED_OBJ *)OPENSSL_malloc(sizeof(ADDED_O
BJ)))) goto err2; |
| 246 if (o->ln != NULL) | 261 if (o->ln != NULL) |
| 247 if (!(ao[ADDED_LNAME]=(ADDED_OBJ *)OPENSSL_malloc(sizeof(ADDED_O
BJ)))) goto err2; | 262 if (!(ao[ADDED_LNAME]=(ADDED_OBJ *)OPENSSL_malloc(sizeof(ADDED_O
BJ)))) goto err2; |
| 248 | 263 |
| 249 for (i=ADDED_DATA; i<=ADDED_NID; i++) | 264 for (i=ADDED_DATA; i<=ADDED_NID; i++) |
| 250 { | 265 { |
| 251 if (ao[i] != NULL) | 266 if (ao[i] != NULL) |
| 252 { | 267 { |
| 253 ao[i]->type=i; | 268 ao[i]->type=i; |
| 254 ao[i]->obj=o; | 269 ao[i]->obj=o; |
| 255 » » » aop=(ADDED_OBJ *)lh_insert(added,ao[i]); | 270 » » » aop=lh_ADDED_OBJ_insert(added,ao[i]); |
| 256 /* memory leak, buit should not normally matter */ | 271 /* memory leak, buit should not normally matter */ |
| 257 if (aop != NULL) | 272 if (aop != NULL) |
| 258 OPENSSL_free(aop); | 273 OPENSSL_free(aop); |
| 259 } | 274 } |
| 260 } | 275 } |
| 261 o->flags&= ~(ASN1_OBJECT_FLAG_DYNAMIC|ASN1_OBJECT_FLAG_DYNAMIC_STRINGS| | 276 o->flags&= ~(ASN1_OBJECT_FLAG_DYNAMIC|ASN1_OBJECT_FLAG_DYNAMIC_STRINGS| |
| 262 ASN1_OBJECT_FLAG_DYNAMIC_DATA); | 277 ASN1_OBJECT_FLAG_DYNAMIC_DATA); |
| 263 | 278 |
| 264 return(o->nid); | 279 return(o->nid); |
| 265 err2: | 280 err2: |
| (...skipping 19 matching lines...) Expand all Loading... |
| 285 } | 300 } |
| 286 return((ASN1_OBJECT *)&(nid_objs[n])); | 301 return((ASN1_OBJECT *)&(nid_objs[n])); |
| 287 } | 302 } |
| 288 else if (added == NULL) | 303 else if (added == NULL) |
| 289 return(NULL); | 304 return(NULL); |
| 290 else | 305 else |
| 291 { | 306 { |
| 292 ad.type=ADDED_NID; | 307 ad.type=ADDED_NID; |
| 293 ad.obj= &ob; | 308 ad.obj= &ob; |
| 294 ob.nid=n; | 309 ob.nid=n; |
| 295 » » adp=(ADDED_OBJ *)lh_retrieve(added,&ad); | 310 » » adp=lh_ADDED_OBJ_retrieve(added,&ad); |
| 296 if (adp != NULL) | 311 if (adp != NULL) |
| 297 return(adp->obj); | 312 return(adp->obj); |
| 298 else | 313 else |
| 299 { | 314 { |
| 300 OBJerr(OBJ_F_OBJ_NID2OBJ,OBJ_R_UNKNOWN_NID); | 315 OBJerr(OBJ_F_OBJ_NID2OBJ,OBJ_R_UNKNOWN_NID); |
| 301 return(NULL); | 316 return(NULL); |
| 302 } | 317 } |
| 303 } | 318 } |
| 304 } | 319 } |
| 305 | 320 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 317 } | 332 } |
| 318 return(nid_objs[n].sn); | 333 return(nid_objs[n].sn); |
| 319 } | 334 } |
| 320 else if (added == NULL) | 335 else if (added == NULL) |
| 321 return(NULL); | 336 return(NULL); |
| 322 else | 337 else |
| 323 { | 338 { |
| 324 ad.type=ADDED_NID; | 339 ad.type=ADDED_NID; |
| 325 ad.obj= &ob; | 340 ad.obj= &ob; |
| 326 ob.nid=n; | 341 ob.nid=n; |
| 327 » » adp=(ADDED_OBJ *)lh_retrieve(added,&ad); | 342 » » adp=lh_ADDED_OBJ_retrieve(added,&ad); |
| 328 if (adp != NULL) | 343 if (adp != NULL) |
| 329 return(adp->obj->sn); | 344 return(adp->obj->sn); |
| 330 else | 345 else |
| 331 { | 346 { |
| 332 OBJerr(OBJ_F_OBJ_NID2SN,OBJ_R_UNKNOWN_NID); | 347 OBJerr(OBJ_F_OBJ_NID2SN,OBJ_R_UNKNOWN_NID); |
| 333 return(NULL); | 348 return(NULL); |
| 334 } | 349 } |
| 335 } | 350 } |
| 336 } | 351 } |
| 337 | 352 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 349 } | 364 } |
| 350 return(nid_objs[n].ln); | 365 return(nid_objs[n].ln); |
| 351 } | 366 } |
| 352 else if (added == NULL) | 367 else if (added == NULL) |
| 353 return(NULL); | 368 return(NULL); |
| 354 else | 369 else |
| 355 { | 370 { |
| 356 ad.type=ADDED_NID; | 371 ad.type=ADDED_NID; |
| 357 ad.obj= &ob; | 372 ad.obj= &ob; |
| 358 ob.nid=n; | 373 ob.nid=n; |
| 359 » » adp=(ADDED_OBJ *)lh_retrieve(added,&ad); | 374 » » adp=lh_ADDED_OBJ_retrieve(added,&ad); |
| 360 if (adp != NULL) | 375 if (adp != NULL) |
| 361 return(adp->obj->ln); | 376 return(adp->obj->ln); |
| 362 else | 377 else |
| 363 { | 378 { |
| 364 OBJerr(OBJ_F_OBJ_NID2LN,OBJ_R_UNKNOWN_NID); | 379 OBJerr(OBJ_F_OBJ_NID2LN,OBJ_R_UNKNOWN_NID); |
| 365 return(NULL); | 380 return(NULL); |
| 366 } | 381 } |
| 367 } | 382 } |
| 368 } | 383 } |
| 369 | 384 |
| 385 static int obj_cmp(const ASN1_OBJECT * const *ap, const unsigned int *bp) |
| 386 { |
| 387 int j; |
| 388 const ASN1_OBJECT *a= *ap; |
| 389 const ASN1_OBJECT *b= &nid_objs[*bp]; |
| 390 |
| 391 j=(a->length - b->length); |
| 392 if (j) return(j); |
| 393 return(memcmp(a->data,b->data,a->length)); |
| 394 } |
| 395 |
| 396 IMPLEMENT_OBJ_BSEARCH_CMP_FN(const ASN1_OBJECT *, unsigned int, obj); |
| 397 |
| 370 int OBJ_obj2nid(const ASN1_OBJECT *a) | 398 int OBJ_obj2nid(const ASN1_OBJECT *a) |
| 371 { | 399 { |
| 372 » ASN1_OBJECT **op; | 400 » const unsigned int *op; |
| 373 ADDED_OBJ ad,*adp; | 401 ADDED_OBJ ad,*adp; |
| 374 | 402 |
| 375 if (a == NULL) | 403 if (a == NULL) |
| 376 return(NID_undef); | 404 return(NID_undef); |
| 377 if (a->nid != 0) | 405 if (a->nid != 0) |
| 378 return(a->nid); | 406 return(a->nid); |
| 379 | 407 |
| 380 if (added != NULL) | 408 if (added != NULL) |
| 381 { | 409 { |
| 382 ad.type=ADDED_DATA; | 410 ad.type=ADDED_DATA; |
| 383 ad.obj=(ASN1_OBJECT *)a; /* XXX: ugly but harmless */ | 411 ad.obj=(ASN1_OBJECT *)a; /* XXX: ugly but harmless */ |
| 384 » » adp=(ADDED_OBJ *)lh_retrieve(added,&ad); | 412 » » adp=lh_ADDED_OBJ_retrieve(added,&ad); |
| 385 if (adp != NULL) return (adp->obj->nid); | 413 if (adp != NULL) return (adp->obj->nid); |
| 386 } | 414 } |
| 387 » op=(ASN1_OBJECT **)OBJ_bsearch((const char *)&a,(const char *)obj_objs, | 415 » op=OBJ_bsearch_obj(&a, obj_objs, NUM_OBJ); |
| 388 » » NUM_OBJ, sizeof(ASN1_OBJECT *),obj_cmp); | |
| 389 if (op == NULL) | 416 if (op == NULL) |
| 390 return(NID_undef); | 417 return(NID_undef); |
| 391 » return((*op)->nid); | 418 » return(nid_objs[*op].nid); |
| 392 } | 419 } |
| 393 | 420 |
| 394 /* Convert an object name into an ASN1_OBJECT | 421 /* Convert an object name into an ASN1_OBJECT |
| 395 * if "noname" is not set then search for short and long names first. | 422 * if "noname" is not set then search for short and long names first. |
| 396 * This will convert the "dotted" form into an object: unlike OBJ_txt2nid | 423 * This will convert the "dotted" form into an object: unlike OBJ_txt2nid |
| 397 * it can be used with any objects, not just registered ones. | 424 * it can be used with any objects, not just registered ones. |
| 398 */ | 425 */ |
| 399 | 426 |
| 400 ASN1_OBJECT *OBJ_txt2obj(const char *s, int no_name) | 427 ASN1_OBJECT *OBJ_txt2obj(const char *s, int no_name) |
| 401 { | 428 { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 434 op=d2i_ASN1_OBJECT(NULL,&cp,j); | 461 op=d2i_ASN1_OBJECT(NULL,&cp,j); |
| 435 OPENSSL_free(buf); | 462 OPENSSL_free(buf); |
| 436 return op; | 463 return op; |
| 437 } | 464 } |
| 438 | 465 |
| 439 int OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name) | 466 int OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name) |
| 440 { | 467 { |
| 441 int i,n=0,len,nid, first, use_bn; | 468 int i,n=0,len,nid, first, use_bn; |
| 442 BIGNUM *bl; | 469 BIGNUM *bl; |
| 443 unsigned long l; | 470 unsigned long l; |
| 444 » unsigned char *p; | 471 » const unsigned char *p; |
| 445 char tbuf[DECIMAL_SIZE(i)+DECIMAL_SIZE(l)+2]; | 472 char tbuf[DECIMAL_SIZE(i)+DECIMAL_SIZE(l)+2]; |
| 446 | 473 |
| 447 if ((a == NULL) || (a->data == NULL)) { | 474 if ((a == NULL) || (a->data == NULL)) { |
| 448 buf[0]='\0'; | 475 buf[0]='\0'; |
| 449 return(0); | 476 return(0); |
| 450 } | 477 } |
| 451 | 478 |
| 452 | 479 |
| 453 if (!no_name && (nid=OBJ_obj2nid(a)) != NID_undef) | 480 if (!no_name && (nid=OBJ_obj2nid(a)) != NID_undef) |
| 454 { | 481 { |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 603 ASN1_OBJECT *obj; | 630 ASN1_OBJECT *obj; |
| 604 int nid; | 631 int nid; |
| 605 obj = OBJ_txt2obj(s, 0); | 632 obj = OBJ_txt2obj(s, 0); |
| 606 nid = OBJ_obj2nid(obj); | 633 nid = OBJ_obj2nid(obj); |
| 607 ASN1_OBJECT_free(obj); | 634 ASN1_OBJECT_free(obj); |
| 608 return nid; | 635 return nid; |
| 609 } | 636 } |
| 610 | 637 |
| 611 int OBJ_ln2nid(const char *s) | 638 int OBJ_ln2nid(const char *s) |
| 612 { | 639 { |
| 613 » ASN1_OBJECT o,*oo= &o,**op; | 640 » ASN1_OBJECT o; |
| 641 » const ASN1_OBJECT *oo= &o; |
| 614 ADDED_OBJ ad,*adp; | 642 ADDED_OBJ ad,*adp; |
| 643 const unsigned int *op; |
| 615 | 644 |
| 616 o.ln=s; | 645 o.ln=s; |
| 617 if (added != NULL) | 646 if (added != NULL) |
| 618 { | 647 { |
| 619 ad.type=ADDED_LNAME; | 648 ad.type=ADDED_LNAME; |
| 620 ad.obj= &o; | 649 ad.obj= &o; |
| 621 » » adp=(ADDED_OBJ *)lh_retrieve(added,&ad); | 650 » » adp=lh_ADDED_OBJ_retrieve(added,&ad); |
| 622 if (adp != NULL) return (adp->obj->nid); | 651 if (adp != NULL) return (adp->obj->nid); |
| 623 } | 652 } |
| 624 » op=(ASN1_OBJECT **)OBJ_bsearch((char *)&oo,(char *)ln_objs, NUM_LN, | 653 » op=OBJ_bsearch_ln(&oo, ln_objs, NUM_LN); |
| 625 » » sizeof(ASN1_OBJECT *),ln_cmp); | |
| 626 if (op == NULL) return(NID_undef); | 654 if (op == NULL) return(NID_undef); |
| 627 » return((*op)->nid); | 655 » return(nid_objs[*op].nid); |
| 628 } | 656 } |
| 629 | 657 |
| 630 int OBJ_sn2nid(const char *s) | 658 int OBJ_sn2nid(const char *s) |
| 631 { | 659 { |
| 632 » ASN1_OBJECT o,*oo= &o,**op; | 660 » ASN1_OBJECT o; |
| 661 » const ASN1_OBJECT *oo= &o; |
| 633 ADDED_OBJ ad,*adp; | 662 ADDED_OBJ ad,*adp; |
| 663 const unsigned int *op; |
| 634 | 664 |
| 635 o.sn=s; | 665 o.sn=s; |
| 636 if (added != NULL) | 666 if (added != NULL) |
| 637 { | 667 { |
| 638 ad.type=ADDED_SNAME; | 668 ad.type=ADDED_SNAME; |
| 639 ad.obj= &o; | 669 ad.obj= &o; |
| 640 » » adp=(ADDED_OBJ *)lh_retrieve(added,&ad); | 670 » » adp=lh_ADDED_OBJ_retrieve(added,&ad); |
| 641 if (adp != NULL) return (adp->obj->nid); | 671 if (adp != NULL) return (adp->obj->nid); |
| 642 } | 672 } |
| 643 » op=(ASN1_OBJECT **)OBJ_bsearch((char *)&oo,(char *)sn_objs,NUM_SN, | 673 » op=OBJ_bsearch_sn(&oo, sn_objs, NUM_SN); |
| 644 » » sizeof(ASN1_OBJECT *),sn_cmp); | |
| 645 if (op == NULL) return(NID_undef); | 674 if (op == NULL) return(NID_undef); |
| 646 » return((*op)->nid); | 675 » return(nid_objs[*op].nid); |
| 647 } | 676 } |
| 648 | 677 |
| 649 static int obj_cmp(const void *ap, const void *bp) | 678 const void *OBJ_bsearch_(const void *key, const void *base, int num, int size, |
| 679 » » » int (*cmp)(const void *, const void *)) |
| 650 { | 680 { |
| 651 » int j; | 681 » return OBJ_bsearch_ex_(key, base, num, size, cmp, 0); |
| 652 » const ASN1_OBJECT *a= *(ASN1_OBJECT * const *)ap; | |
| 653 » const ASN1_OBJECT *b= *(ASN1_OBJECT * const *)bp; | |
| 654 | |
| 655 » j=(a->length - b->length); | |
| 656 if (j) return(j); | |
| 657 » return(memcmp(a->data,b->data,a->length)); | |
| 658 } | |
| 659 | |
| 660 const char *OBJ_bsearch(const char *key, const char *base, int num, int size, | |
| 661 » int (*cmp)(const void *, const void *)) | |
| 662 » { | |
| 663 » return OBJ_bsearch_ex(key, base, num, size, cmp, 0); | |
| 664 } | 682 } |
| 665 | 683 |
| 666 const char *OBJ_bsearch_ex(const char *key, const char *base, int num, | 684 const void *OBJ_bsearch_ex_(const void *key, const void *base_, int num, |
| 667 » int size, int (*cmp)(const void *, const void *), int flags) | 685 » » » int size, |
| 686 » » » int (*cmp)(const void *, const void *), |
| 687 » » » int flags) |
| 668 { | 688 { |
| 689 const char *base=base_; |
| 669 int l,h,i=0,c=0; | 690 int l,h,i=0,c=0; |
| 670 const char *p = NULL; | 691 const char *p = NULL; |
| 671 | 692 |
| 672 if (num == 0) return(NULL); | 693 if (num == 0) return(NULL); |
| 673 l=0; | 694 l=0; |
| 674 h=num; | 695 h=num; |
| 675 while (l < h) | 696 while (l < h) |
| 676 { | 697 { |
| 677 i=(l+h)/2; | 698 i=(l+h)/2; |
| 678 p= &(base[i*size]); | 699 p= &(base[i*size]); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 780 op=(ASN1_OBJECT *)ASN1_OBJECT_create(OBJ_new_nid(1),buf,i,sn,ln); | 801 op=(ASN1_OBJECT *)ASN1_OBJECT_create(OBJ_new_nid(1),buf,i,sn,ln); |
| 781 if (op == NULL) | 802 if (op == NULL) |
| 782 goto err; | 803 goto err; |
| 783 ok=OBJ_add_object(op); | 804 ok=OBJ_add_object(op); |
| 784 err: | 805 err: |
| 785 ASN1_OBJECT_free(op); | 806 ASN1_OBJECT_free(op); |
| 786 OPENSSL_free(buf); | 807 OPENSSL_free(buf); |
| 787 return(ok); | 808 return(ok); |
| 788 } | 809 } |
| 789 | 810 |
| OLD | NEW |