obj_dat.c
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:17k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* crypto/objects/obj_dat.c */
  2. /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  3.  * All rights reserved.
  4.  *
  5.  * This package is an SSL implementation written
  6.  * by Eric Young (eay@cryptsoft.com).
  7.  * The implementation was written so as to conform with Netscapes SSL.
  8.  * 
  9.  * This library is free for commercial and non-commercial use as long as
  10.  * the following conditions are aheared to.  The following conditions
  11.  * apply to all code found in this distribution, be it the RC4, RSA,
  12.  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
  13.  * included with this distribution is covered by the same copyright terms
  14.  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
  15.  * 
  16.  * Copyright remains Eric Young's, and as such any Copyright notices in
  17.  * the code are not to be removed.
  18.  * If this package is used in a product, Eric Young should be given attribution
  19.  * as the author of the parts of the library used.
  20.  * This can be in the form of a textual message at program startup or
  21.  * in documentation (online or textual) provided with the package.
  22.  * 
  23.  * Redistribution and use in source and binary forms, with or without
  24.  * modification, are permitted provided that the following conditions
  25.  * are met:
  26.  * 1. Redistributions of source code must retain the copyright
  27.  *    notice, this list of conditions and the following disclaimer.
  28.  * 2. Redistributions in binary form must reproduce the above copyright
  29.  *    notice, this list of conditions and the following disclaimer in the
  30.  *    documentation and/or other materials provided with the distribution.
  31.  * 3. All advertising materials mentioning features or use of this software
  32.  *    must display the following acknowledgement:
  33.  *    "This product includes cryptographic software written by
  34.  *     Eric Young (eay@cryptsoft.com)"
  35.  *    The word 'cryptographic' can be left out if the rouines from the library
  36.  *    being used are not cryptographic related :-).
  37.  * 4. If you include any Windows specific code (or a derivative thereof) from 
  38.  *    the apps directory (application code) you must include an acknowledgement:
  39.  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
  40.  * 
  41.  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
  42.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  43.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  44.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  45.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  46.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  47.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  48.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  49.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  50.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  51.  * SUCH DAMAGE.
  52.  * 
  53.  * The licence and distribution terms for any publically available version or
  54.  * derivative of this code cannot be changed.  i.e. this code cannot simply be
  55.  * copied and put under another distribution licence
  56.  * [including the GNU Public Licence.]
  57.  */
  58. #include <stdio.h>
  59. #include <ctype.h>
  60. #include <limits.h>
  61. #include "cryptlib.h"
  62. #include <openssl/lhash.h>
  63. #include <openssl/asn1.h>
  64. #include <openssl/objects.h>
  65. /* obj_dat.h is generated from objects.h by obj_dat.pl */
  66. #ifndef OPENSSL_NO_OBJECT
  67. #include "obj_dat.h"
  68. #else
  69. /* You will have to load all the objects needed manually in the application */
  70. #define NUM_NID 0
  71. #define NUM_SN 0
  72. #define NUM_LN 0
  73. #define NUM_OBJ 0
  74. static unsigned char lvalues[1];
  75. static ASN1_OBJECT nid_objs[1];
  76. static ASN1_OBJECT *sn_objs[1];
  77. static ASN1_OBJECT *ln_objs[1];
  78. static ASN1_OBJECT *obj_objs[1];
  79. #endif
  80. static int sn_cmp(const void *a, const void *b);
  81. static int ln_cmp(const void *a, const void *b);
  82. static int obj_cmp(const void *a, const void *b);
  83. #define ADDED_DATA 0
  84. #define ADDED_SNAME 1
  85. #define ADDED_LNAME 2
  86. #define ADDED_NID 3
  87. typedef struct added_obj_st
  88. {
  89. int type;
  90. ASN1_OBJECT *obj;
  91. } ADDED_OBJ;
  92. static int new_nid=NUM_NID;
  93. static LHASH *added=NULL;
  94. static int sn_cmp(const void *a, const void *b)
  95. {
  96. const ASN1_OBJECT * const *ap = a, * const *bp = b;
  97. return(strcmp((*ap)->sn,(*bp)->sn));
  98. }
  99. static int ln_cmp(const void *a, const void *b)
  100. const ASN1_OBJECT * const *ap = a, * const *bp = b;
  101. return(strcmp((*ap)->ln,(*bp)->ln));
  102. }
  103. /* static unsigned long add_hash(ADDED_OBJ *ca) */
  104. static unsigned long add_hash(const void *ca_void)
  105. {
  106. const ASN1_OBJECT *a;
  107. int i;
  108. unsigned long ret=0;
  109. unsigned char *p;
  110. const ADDED_OBJ *ca = (const ADDED_OBJ *)ca_void;
  111. a=ca->obj;
  112. switch (ca->type)
  113. {
  114. case ADDED_DATA:
  115. ret=a->length<<20L;
  116. p=(unsigned char *)a->data;
  117. for (i=0; i<a->length; i++)
  118. ret^=p[i]<<((i*3)%24);
  119. break;
  120. case ADDED_SNAME:
  121. ret=lh_strhash(a->sn);
  122. break;
  123. case ADDED_LNAME:
  124. ret=lh_strhash(a->ln);
  125. break;
  126. case ADDED_NID:
  127. ret=a->nid;
  128. break;
  129. default:
  130. /* abort(); */
  131. return 0;
  132. }
  133. ret&=0x3fffffffL;
  134. ret|=ca->type<<30L;
  135. return(ret);
  136. }
  137. /* static int add_cmp(ADDED_OBJ *ca, ADDED_OBJ *cb) */
  138. static int add_cmp(const void *ca_void, const void *cb_void)
  139. {
  140. ASN1_OBJECT *a,*b;
  141. int i;
  142. const ADDED_OBJ *ca = (const ADDED_OBJ *)ca_void;
  143. const ADDED_OBJ *cb = (const ADDED_OBJ *)cb_void;
  144. i=ca->type-cb->type;
  145. if (i) return(i);
  146. a=ca->obj;
  147. b=cb->obj;
  148. switch (ca->type)
  149. {
  150. case ADDED_DATA:
  151. i=(a->length - b->length);
  152. if (i) return(i);
  153. return(memcmp(a->data,b->data,(size_t)a->length));
  154. case ADDED_SNAME:
  155. if (a->sn == NULL) return(-1);
  156. else if (b->sn == NULL) return(1);
  157. else return(strcmp(a->sn,b->sn));
  158. case ADDED_LNAME:
  159. if (a->ln == NULL) return(-1);
  160. else if (b->ln == NULL) return(1);
  161. else return(strcmp(a->ln,b->ln));
  162. case ADDED_NID:
  163. return(a->nid-b->nid);
  164. default:
  165. /* abort(); */
  166. return 0;
  167. }
  168. }
  169. static int init_added(void)
  170. {
  171. if (added != NULL) return(1);
  172. added=lh_new(add_hash,add_cmp);
  173. return(added != NULL);
  174. }
  175. static void cleanup1(ADDED_OBJ *a)
  176. {
  177. a->obj->nid=0;
  178. a->obj->flags|=ASN1_OBJECT_FLAG_DYNAMIC|
  179.                 ASN1_OBJECT_FLAG_DYNAMIC_STRINGS|
  180. ASN1_OBJECT_FLAG_DYNAMIC_DATA;
  181. }
  182. static void cleanup2(ADDED_OBJ *a)
  183. { a->obj->nid++; }
  184. static void cleanup3(ADDED_OBJ *a)
  185. {
  186. if (--a->obj->nid == 0)
  187. ASN1_OBJECT_free(a->obj);
  188. OPENSSL_free(a);
  189. }
  190. static IMPLEMENT_LHASH_DOALL_FN(cleanup1, ADDED_OBJ *)
  191. static IMPLEMENT_LHASH_DOALL_FN(cleanup2, ADDED_OBJ *)
  192. static IMPLEMENT_LHASH_DOALL_FN(cleanup3, ADDED_OBJ *)
  193. void OBJ_cleanup(void)
  194. {
  195. if (added == NULL) return;
  196. added->down_load=0;
  197. lh_doall(added,LHASH_DOALL_FN(cleanup1)); /* zero counters */
  198. lh_doall(added,LHASH_DOALL_FN(cleanup2)); /* set counters */
  199. lh_doall(added,LHASH_DOALL_FN(cleanup3)); /* free objects */
  200. lh_free(added);
  201. added=NULL;
  202. }
  203. int OBJ_new_nid(int num)
  204. {
  205. int i;
  206. i=new_nid;
  207. new_nid+=num;
  208. return(i);
  209. }
  210. int OBJ_add_object(const ASN1_OBJECT *obj)
  211. {
  212. ASN1_OBJECT *o;
  213. ADDED_OBJ *ao[4]={NULL,NULL,NULL,NULL},*aop;
  214. int i;
  215. if (added == NULL)
  216. if (!init_added()) return(0);
  217. if ((o=OBJ_dup(obj)) == NULL) goto err;
  218. if (!(ao[ADDED_NID]=(ADDED_OBJ *)OPENSSL_malloc(sizeof(ADDED_OBJ)))) goto err2;
  219. if ((o->length != 0) && (obj->data != NULL))
  220. if (!(ao[ADDED_DATA]=(ADDED_OBJ *)OPENSSL_malloc(sizeof(ADDED_OBJ)))) goto err2;
  221. if (o->sn != NULL)
  222. if (!(ao[ADDED_SNAME]=(ADDED_OBJ *)OPENSSL_malloc(sizeof(ADDED_OBJ)))) goto err2;
  223. if (o->ln != NULL)
  224. if (!(ao[ADDED_LNAME]=(ADDED_OBJ *)OPENSSL_malloc(sizeof(ADDED_OBJ)))) goto err2;
  225. for (i=ADDED_DATA; i<=ADDED_NID; i++)
  226. {
  227. if (ao[i] != NULL)
  228. {
  229. ao[i]->type=i;
  230. ao[i]->obj=o;
  231. aop=(ADDED_OBJ *)lh_insert(added,ao[i]);
  232. /* memory leak, buit should not normally matter */
  233. if (aop != NULL)
  234. OPENSSL_free(aop);
  235. }
  236. }
  237. o->flags&= ~(ASN1_OBJECT_FLAG_DYNAMIC|ASN1_OBJECT_FLAG_DYNAMIC_STRINGS|
  238. ASN1_OBJECT_FLAG_DYNAMIC_DATA);
  239. return(o->nid);
  240. err2:
  241. OBJerr(OBJ_F_OBJ_ADD_OBJECT,ERR_R_MALLOC_FAILURE);
  242. err:
  243. for (i=ADDED_DATA; i<=ADDED_NID; i++)
  244. if (ao[i] != NULL) OPENSSL_free(ao[i]);
  245. if (o != NULL) OPENSSL_free(o);
  246. return(NID_undef);
  247. }
  248. ASN1_OBJECT *OBJ_nid2obj(int n)
  249. {
  250. ADDED_OBJ ad,*adp;
  251. ASN1_OBJECT ob;
  252. if ((n >= 0) && (n < NUM_NID))
  253. {
  254. if ((n != NID_undef) && (nid_objs[n].nid == NID_undef))
  255. {
  256. OBJerr(OBJ_F_OBJ_NID2OBJ,OBJ_R_UNKNOWN_NID);
  257. return(NULL);
  258. }
  259. return((ASN1_OBJECT *)&(nid_objs[n]));
  260. }
  261. else if (added == NULL)
  262. return(NULL);
  263. else
  264. {
  265. ad.type=ADDED_NID;
  266. ad.obj= &ob;
  267. ob.nid=n;
  268. adp=(ADDED_OBJ *)lh_retrieve(added,&ad);
  269. if (adp != NULL)
  270. return(adp->obj);
  271. else
  272. {
  273. OBJerr(OBJ_F_OBJ_NID2OBJ,OBJ_R_UNKNOWN_NID);
  274. return(NULL);
  275. }
  276. }
  277. }
  278. const char *OBJ_nid2sn(int n)
  279. {
  280. ADDED_OBJ ad,*adp;
  281. ASN1_OBJECT ob;
  282. if ((n >= 0) && (n < NUM_NID))
  283. {
  284. if ((n != NID_undef) && (nid_objs[n].nid == NID_undef))
  285. {
  286. OBJerr(OBJ_F_OBJ_NID2SN,OBJ_R_UNKNOWN_NID);
  287. return(NULL);
  288. }
  289. return(nid_objs[n].sn);
  290. }
  291. else if (added == NULL)
  292. return(NULL);
  293. else
  294. {
  295. ad.type=ADDED_NID;
  296. ad.obj= &ob;
  297. ob.nid=n;
  298. adp=(ADDED_OBJ *)lh_retrieve(added,&ad);
  299. if (adp != NULL)
  300. return(adp->obj->sn);
  301. else
  302. {
  303. OBJerr(OBJ_F_OBJ_NID2SN,OBJ_R_UNKNOWN_NID);
  304. return(NULL);
  305. }
  306. }
  307. }
  308. const char *OBJ_nid2ln(int n)
  309. {
  310. ADDED_OBJ ad,*adp;
  311. ASN1_OBJECT ob;
  312. if ((n >= 0) && (n < NUM_NID))
  313. {
  314. if ((n != NID_undef) && (nid_objs[n].nid == NID_undef))
  315. {
  316. OBJerr(OBJ_F_OBJ_NID2LN,OBJ_R_UNKNOWN_NID);
  317. return(NULL);
  318. }
  319. return(nid_objs[n].ln);
  320. }
  321. else if (added == NULL)
  322. return(NULL);
  323. else
  324. {
  325. ad.type=ADDED_NID;
  326. ad.obj= &ob;
  327. ob.nid=n;
  328. adp=(ADDED_OBJ *)lh_retrieve(added,&ad);
  329. if (adp != NULL)
  330. return(adp->obj->ln);
  331. else
  332. {
  333. OBJerr(OBJ_F_OBJ_NID2LN,OBJ_R_UNKNOWN_NID);
  334. return(NULL);
  335. }
  336. }
  337. }
  338. int OBJ_obj2nid(const ASN1_OBJECT *a)
  339. {
  340. ASN1_OBJECT **op;
  341. ADDED_OBJ ad,*adp;
  342. if (a == NULL)
  343. return(NID_undef);
  344. if (a->nid != 0)
  345. return(a->nid);
  346. if (added != NULL)
  347. {
  348. ad.type=ADDED_DATA;
  349. ad.obj=(ASN1_OBJECT *)a; /* XXX: ugly but harmless */
  350. adp=(ADDED_OBJ *)lh_retrieve(added,&ad);
  351. if (adp != NULL) return (adp->obj->nid);
  352. }
  353. op=(ASN1_OBJECT **)OBJ_bsearch((const char *)&a,(const char *)obj_objs,
  354. NUM_OBJ, sizeof(ASN1_OBJECT *),obj_cmp);
  355. if (op == NULL)
  356. return(NID_undef);
  357. return((*op)->nid);
  358. }
  359. /* Convert an object name into an ASN1_OBJECT
  360.  * if "noname" is not set then search for short and long names first.
  361.  * This will convert the "dotted" form into an object: unlike OBJ_txt2nid
  362.  * it can be used with any objects, not just registered ones.
  363.  */
  364. ASN1_OBJECT *OBJ_txt2obj(const char *s, int no_name)
  365. {
  366. int nid = NID_undef;
  367. ASN1_OBJECT *op=NULL;
  368. unsigned char *buf;
  369. unsigned char *p;
  370. const unsigned char *cp;
  371. int i, j;
  372. if(!no_name) {
  373. if( ((nid = OBJ_sn2nid(s)) != NID_undef) ||
  374. ((nid = OBJ_ln2nid(s)) != NID_undef) ) 
  375. return OBJ_nid2obj(nid);
  376. }
  377. /* Work out size of content octets */
  378. i=a2d_ASN1_OBJECT(NULL,0,s,-1);
  379. if (i <= 0) {
  380. /* Don't clear the error */
  381. /*ERR_clear_error();*/
  382. return NULL;
  383. }
  384. /* Work out total size */
  385. j = ASN1_object_size(0,i,V_ASN1_OBJECT);
  386. if((buf=(unsigned char *)OPENSSL_malloc(j)) == NULL) return NULL;
  387. p = buf;
  388. /* Write out tag+length */
  389. ASN1_put_object(&p,0,i,V_ASN1_OBJECT,V_ASN1_UNIVERSAL);
  390. /* Write out contents */
  391. a2d_ASN1_OBJECT(p,i,s,-1);
  392. cp=buf;
  393. op=d2i_ASN1_OBJECT(NULL,&cp,j);
  394. OPENSSL_free(buf);
  395. return op;
  396. }
  397. int OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name)
  398. {
  399. int i,n=0,len,nid, first, use_bn;
  400. BIGNUM *bl;
  401. unsigned long l;
  402. unsigned char *p;
  403. char tbuf[DECIMAL_SIZE(i)+DECIMAL_SIZE(l)+2];
  404. if ((a == NULL) || (a->data == NULL)) {
  405. buf[0]='';
  406. return(0);
  407. }
  408. if (!no_name && (nid=OBJ_obj2nid(a)) != NID_undef)
  409. {
  410. const char *s;
  411. s=OBJ_nid2ln(nid);
  412. if (s == NULL)
  413. s=OBJ_nid2sn(nid);
  414. if (buf)
  415. BUF_strlcpy(buf,s,buf_len);
  416. n=strlen(s);
  417. return n;
  418. }
  419. len=a->length;
  420. p=a->data;
  421. first = 1;
  422. bl = NULL;
  423. while (len > 0)
  424. {
  425. l=0;
  426. use_bn = 0;
  427. for (;;)
  428. {
  429. unsigned char c = *p++;
  430. len--;
  431. if ((len == 0) && (c & 0x80))
  432. goto err;
  433. if (use_bn)
  434. {
  435. if (!BN_add_word(bl, c & 0x7f))
  436. goto err;
  437. }
  438. else
  439. l |= c  & 0x7f;
  440. if (!(c & 0x80))
  441. break;
  442. if (!use_bn && (l > (ULONG_MAX >> 7L)))
  443. {
  444. if (!bl && !(bl = BN_new()))
  445. goto err;
  446. if (!BN_set_word(bl, l))
  447. goto err;
  448. use_bn = 1;
  449. }
  450. if (use_bn)
  451. {
  452. if (!BN_lshift(bl, bl, 7))
  453. goto err;
  454. }
  455. else
  456. l<<=7L;
  457. }
  458. if (first)
  459. {
  460. first = 0;
  461. if (l >= 80)
  462. {
  463. i = 2;
  464. if (use_bn)
  465. {
  466. if (!BN_sub_word(bl, 80))
  467. goto err;
  468. }
  469. else
  470. l -= 80;
  471. }
  472. else
  473. {
  474. i=(int)(l/40);
  475. l-=(long)(i*40);
  476. }
  477. if (buf && (buf_len > 0))
  478. {
  479. *buf++ = i + '0';
  480. buf_len--;
  481. }
  482. n++;
  483. }
  484. if (use_bn)
  485. {
  486. char *bndec;
  487. bndec = BN_bn2dec(bl);
  488. if (!bndec)
  489. goto err;
  490. i = strlen(bndec);
  491. if (buf)
  492. {
  493. if (buf_len > 0)
  494. {
  495. *buf++ = '.';
  496. buf_len--;
  497. }
  498. BUF_strlcpy(buf,bndec,buf_len);
  499. if (i > buf_len)
  500. {
  501. buf += buf_len;
  502. buf_len = 0;
  503. }
  504. else
  505. {
  506. buf+=i;
  507. buf_len-=i;
  508. }
  509. }
  510. n++;
  511. n += i;
  512. OPENSSL_free(bndec);
  513. }
  514. else
  515. {
  516. BIO_snprintf(tbuf,sizeof tbuf,".%lu",l);
  517. i=strlen(tbuf);
  518. if (buf && (buf_len > 0))
  519. {
  520. BUF_strlcpy(buf,tbuf,buf_len);
  521. if (i > buf_len)
  522. {
  523. buf += buf_len;
  524. buf_len = 0;
  525. }
  526. else
  527. {
  528. buf+=i;
  529. buf_len-=i;
  530. }
  531. }
  532. n+=i;
  533. l=0;
  534. }
  535. }
  536. if (bl)
  537. BN_free(bl);
  538. return n;
  539. err:
  540. if (bl)
  541. BN_free(bl);
  542. return -1;
  543. }
  544. int OBJ_txt2nid(const char *s)
  545. {
  546. ASN1_OBJECT *obj;
  547. int nid;
  548. obj = OBJ_txt2obj(s, 0);
  549. nid = OBJ_obj2nid(obj);
  550. ASN1_OBJECT_free(obj);
  551. return nid;
  552. }
  553. int OBJ_ln2nid(const char *s)
  554. {
  555. ASN1_OBJECT o,*oo= &o,**op;
  556. ADDED_OBJ ad,*adp;
  557. o.ln=s;
  558. if (added != NULL)
  559. {
  560. ad.type=ADDED_LNAME;
  561. ad.obj= &o;
  562. adp=(ADDED_OBJ *)lh_retrieve(added,&ad);
  563. if (adp != NULL) return (adp->obj->nid);
  564. }
  565. op=(ASN1_OBJECT **)OBJ_bsearch((char *)&oo,(char *)ln_objs, NUM_LN,
  566. sizeof(ASN1_OBJECT *),ln_cmp);
  567. if (op == NULL) return(NID_undef);
  568. return((*op)->nid);
  569. }
  570. int OBJ_sn2nid(const char *s)
  571. {
  572. ASN1_OBJECT o,*oo= &o,**op;
  573. ADDED_OBJ ad,*adp;
  574. o.sn=s;
  575. if (added != NULL)
  576. {
  577. ad.type=ADDED_SNAME;
  578. ad.obj= &o;
  579. adp=(ADDED_OBJ *)lh_retrieve(added,&ad);
  580. if (adp != NULL) return (adp->obj->nid);
  581. }
  582. op=(ASN1_OBJECT **)OBJ_bsearch((char *)&oo,(char *)sn_objs,NUM_SN,
  583. sizeof(ASN1_OBJECT *),sn_cmp);
  584. if (op == NULL) return(NID_undef);
  585. return((*op)->nid);
  586. }
  587. static int obj_cmp(const void *ap, const void *bp)
  588. {
  589. int j;
  590. const ASN1_OBJECT *a= *(ASN1_OBJECT * const *)ap;
  591. const ASN1_OBJECT *b= *(ASN1_OBJECT * const *)bp;
  592. j=(a->length - b->length);
  593.         if (j) return(j);
  594. return(memcmp(a->data,b->data,a->length));
  595.         }
  596. const char *OBJ_bsearch(const char *key, const char *base, int num, int size,
  597. int (*cmp)(const void *, const void *))
  598. {
  599. return OBJ_bsearch_ex(key, base, num, size, cmp, 0);
  600. }
  601. const char *OBJ_bsearch_ex(const char *key, const char *base, int num,
  602. int size, int (*cmp)(const void *, const void *), int flags)
  603. {
  604. int l,h,i=0,c=0;
  605. const char *p = NULL;
  606. if (num == 0) return(NULL);
  607. l=0;
  608. h=num;
  609. while (l < h)
  610. {
  611. i=(l+h)/2;
  612. p= &(base[i*size]);
  613. c=(*cmp)(key,p);
  614. if (c < 0)
  615. h=i;
  616. else if (c > 0)
  617. l=i+1;
  618. else
  619. break;
  620. }
  621. #ifdef CHARSET_EBCDIC
  622. /* THIS IS A KLUDGE - Because the *_obj is sorted in ASCII order, and
  623.  * I don't have perl (yet), we revert to a *LINEAR* search
  624.  * when the object wasn't found in the binary search.
  625.  */
  626. if (c != 0)
  627. {
  628. for (i=0; i<num; ++i)
  629. {
  630. p= &(base[i*size]);
  631. c = (*cmp)(key,p);
  632. if (c == 0 || (c < 0 && (flags & OBJ_BSEARCH_VALUE_ON_NOMATCH)))
  633. return p;
  634. }
  635. }
  636. #endif
  637. if (c != 0 && !(flags & OBJ_BSEARCH_VALUE_ON_NOMATCH))
  638. p = NULL;
  639. else if (c == 0 && (flags & OBJ_BSEARCH_FIRST_VALUE_ON_MATCH))
  640. {
  641. while(i > 0 && (*cmp)(key,&(base[(i-1)*size])) == 0)
  642. i--;
  643. p = &(base[i*size]);
  644. }
  645. return(p);
  646. }
  647. int OBJ_create_objects(BIO *in)
  648. {
  649. MS_STATIC char buf[512];
  650. int i,num=0;
  651. char *o,*s,*l=NULL;
  652. for (;;)
  653. {
  654. s=o=NULL;
  655. i=BIO_gets(in,buf,512);
  656. if (i <= 0) return(num);
  657. buf[i-1]='';
  658. if (!isalnum((unsigned char)buf[0])) return(num);
  659. o=s=buf;
  660. while (isdigit((unsigned char)*s) || (*s == '.'))
  661. s++;
  662. if (*s != '')
  663. {
  664. *(s++)='';
  665. while (isspace((unsigned char)*s))
  666. s++;
  667. if (*s == '')
  668. s=NULL;
  669. else
  670. {
  671. l=s;
  672. while ((*l != '') && !isspace((unsigned char)*l))
  673. l++;
  674. if (*l != '')
  675. {
  676. *(l++)='';
  677. while (isspace((unsigned char)*l))
  678. l++;
  679. if (*l == '') l=NULL;
  680. }
  681. else
  682. l=NULL;
  683. }
  684. }
  685. else
  686. s=NULL;
  687. if ((o == NULL) || (*o == '')) return(num);
  688. if (!OBJ_create(o,s,l)) return(num);
  689. num++;
  690. }
  691. /* return(num); */
  692. }
  693. int OBJ_create(const char *oid, const char *sn, const char *ln)
  694. {
  695. int ok=0;
  696. ASN1_OBJECT *op=NULL;
  697. unsigned char *buf;
  698. int i;
  699. i=a2d_ASN1_OBJECT(NULL,0,oid,-1);
  700. if (i <= 0) return(0);
  701. if ((buf=(unsigned char *)OPENSSL_malloc(i)) == NULL)
  702. {
  703. OBJerr(OBJ_F_OBJ_CREATE,ERR_R_MALLOC_FAILURE);
  704. return(0);
  705. }
  706. i=a2d_ASN1_OBJECT(buf,i,oid,-1);
  707. if (i == 0)
  708. goto err;
  709. op=(ASN1_OBJECT *)ASN1_OBJECT_create(OBJ_new_nid(1),buf,i,sn,ln);
  710. if (op == NULL) 
  711. goto err;
  712. ok=OBJ_add_object(op);
  713. err:
  714. ASN1_OBJECT_free(op);
  715. OPENSSL_free(buf);
  716. return(ok);
  717. }