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

其他游戏

开发平台:

Visual C++

  1. /* crypto/asn1/asn1_lib.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 <limits.h>
  60. #include "cryptlib.h"
  61. #include <openssl/asn1.h>
  62. #include <openssl/asn1_mac.h>
  63. static int asn1_get_length(const unsigned char **pp,int *inf,long *rl,int max);
  64. static void asn1_put_length(unsigned char **pp, int length);
  65. const char *ASN1_version="ASN.1" OPENSSL_VERSION_PTEXT;
  66. static int _asn1_check_infinite_end(const unsigned char **p, long len)
  67. {
  68. /* If there is 0 or 1 byte left, the length check should pick
  69.  * things up */
  70. if (len <= 0)
  71. return(1);
  72. else if ((len >= 2) && ((*p)[0] == 0) && ((*p)[1] == 0))
  73. {
  74. (*p)+=2;
  75. return(1);
  76. }
  77. return(0);
  78. }
  79. int ASN1_check_infinite_end(unsigned char **p, long len)
  80. {
  81. return _asn1_check_infinite_end((const unsigned char **)p, len);
  82. }
  83. int ASN1_const_check_infinite_end(const unsigned char **p, long len)
  84. {
  85. return _asn1_check_infinite_end(p, len);
  86. }
  87. int ASN1_get_object(const unsigned char **pp, long *plength, int *ptag,
  88. int *pclass, long omax)
  89. {
  90. int i,ret;
  91. long l;
  92. const unsigned char *p= *pp;
  93. int tag,xclass,inf;
  94. long max=omax;
  95. if (!max) goto err;
  96. ret=(*p&V_ASN1_CONSTRUCTED);
  97. xclass=(*p&V_ASN1_PRIVATE);
  98. i= *p&V_ASN1_PRIMITIVE_TAG;
  99. if (i == V_ASN1_PRIMITIVE_TAG)
  100. { /* high-tag */
  101. p++;
  102. if (--max == 0) goto err;
  103. l=0;
  104. while (*p&0x80)
  105. {
  106. l<<=7L;
  107. l|= *(p++)&0x7f;
  108. if (--max == 0) goto err;
  109. if (l > (INT_MAX >> 7L)) goto err;
  110. }
  111. l<<=7L;
  112. l|= *(p++)&0x7f;
  113. tag=(int)l;
  114. if (--max == 0) goto err;
  115. }
  116. else
  117. tag=i;
  118. p++;
  119. if (--max == 0) goto err;
  120. }
  121. *ptag=tag;
  122. *pclass=xclass;
  123. if (!asn1_get_length(&p,&inf,plength,(int)max)) goto err;
  124. #if 0
  125. fprintf(stderr,"p=%d + *plength=%ld > omax=%ld + *pp=%d  (%d > %d)n", 
  126. (int)p,*plength,omax,(int)*pp,(int)(p+ *plength),
  127. (int)(omax+ *pp));
  128. #endif
  129. if (*plength > (omax - (p - *pp)))
  130. {
  131. ASN1err(ASN1_F_ASN1_GET_OBJECT,ASN1_R_TOO_LONG);
  132. /* Set this so that even if things are not long enough
  133.  * the values are set correctly */
  134. ret|=0x80;
  135. }
  136. *pp=p;
  137. return(ret|inf);
  138. err:
  139. ASN1err(ASN1_F_ASN1_GET_OBJECT,ASN1_R_HEADER_TOO_LONG);
  140. return(0x80);
  141. }
  142. static int asn1_get_length(const unsigned char **pp, int *inf, long *rl, int max)
  143. {
  144. const unsigned char *p= *pp;
  145. unsigned long ret=0;
  146. unsigned int i;
  147. if (max-- < 1) return(0);
  148. if (*p == 0x80)
  149. {
  150. *inf=1;
  151. ret=0;
  152. p++;
  153. }
  154. else
  155. {
  156. *inf=0;
  157. i= *p&0x7f;
  158. if (*(p++) & 0x80)
  159. {
  160. if (i > sizeof(long))
  161. return 0;
  162. if (max-- == 0) return(0);
  163. while (i-- > 0)
  164. {
  165. ret<<=8L;
  166. ret|= *(p++);
  167. if (max-- == 0) return(0);
  168. }
  169. }
  170. else
  171. ret=i;
  172. }
  173. if (ret > LONG_MAX)
  174. return 0;
  175. *pp=p;
  176. *rl=(long)ret;
  177. return(1);
  178. }
  179. /* class 0 is constructed
  180.  * constructed == 2 for indefinite length constructed */
  181. void ASN1_put_object(unsigned char **pp, int constructed, int length, int tag,
  182.      int xclass)
  183. {
  184. unsigned char *p= *pp;
  185. int i, ttag;
  186. i=(constructed)?V_ASN1_CONSTRUCTED:0;
  187. i|=(xclass&V_ASN1_PRIVATE);
  188. if (tag < 31)
  189. *(p++)=i|(tag&V_ASN1_PRIMITIVE_TAG);
  190. else
  191. {
  192. *(p++)=i|V_ASN1_PRIMITIVE_TAG;
  193. for(i = 0, ttag = tag; ttag > 0; i++) ttag >>=7;
  194. ttag = i;
  195. while(i-- > 0)
  196. {
  197. p[i] = tag & 0x7f;
  198. if(i != (ttag - 1)) p[i] |= 0x80;
  199. tag >>= 7;
  200. }
  201. p += ttag;
  202. }
  203. if (constructed == 2)
  204. *(p++)=0x80;
  205. else
  206. asn1_put_length(&p,length);
  207. *pp=p;
  208. }
  209. int ASN1_put_eoc(unsigned char **pp)
  210. {
  211. unsigned char *p = *pp;
  212. *p++ = 0;
  213. *p++ = 0;
  214. *pp = p;
  215. return 2;
  216. }
  217. static void asn1_put_length(unsigned char **pp, int length)
  218. {
  219. unsigned char *p= *pp;
  220. int i,l;
  221. if (length <= 127)
  222. *(p++)=(unsigned char)length;
  223. else
  224. {
  225. l=length;
  226. for (i=0; l > 0; i++)
  227. l>>=8;
  228. *(p++)=i|0x80;
  229. l=i;
  230. while (i-- > 0)
  231. {
  232. p[i]=length&0xff;
  233. length>>=8;
  234. }
  235. p+=l;
  236. }
  237. *pp=p;
  238. }
  239. int ASN1_object_size(int constructed, int length, int tag)
  240. {
  241. int ret;
  242. ret=length;
  243. ret++;
  244. if (tag >= 31)
  245. {
  246. while (tag > 0)
  247. {
  248. tag>>=7;
  249. ret++;
  250. }
  251. }
  252. if (constructed == 2)
  253. return ret + 3;
  254. ret++;
  255. if (length > 127)
  256. {
  257. while (length > 0)
  258. {
  259. length>>=8;
  260. ret++;
  261. }
  262. }
  263. return(ret);
  264. }
  265. static int _asn1_Finish(ASN1_const_CTX *c)
  266. {
  267. if ((c->inf == (1|V_ASN1_CONSTRUCTED)) && (!c->eos))
  268. {
  269. if (!ASN1_const_check_infinite_end(&c->p,c->slen))
  270. {
  271. c->error=ERR_R_MISSING_ASN1_EOS;
  272. return(0);
  273. }
  274. }
  275. if ( ((c->slen != 0) && !(c->inf & 1)) ||
  276. ((c->slen < 0) && (c->inf & 1)))
  277. {
  278. c->error=ERR_R_ASN1_LENGTH_MISMATCH;
  279. return(0);
  280. }
  281. return(1);
  282. }
  283. int asn1_Finish(ASN1_CTX *c)
  284. {
  285. return _asn1_Finish((ASN1_const_CTX *)c);
  286. }
  287. int asn1_const_Finish(ASN1_const_CTX *c)
  288. {
  289. return _asn1_Finish(c);
  290. }
  291. int asn1_GetSequence(ASN1_const_CTX *c, long *length)
  292. {
  293. const unsigned char *q;
  294. q=c->p;
  295. c->inf=ASN1_get_object(&(c->p),&(c->slen),&(c->tag),&(c->xclass),
  296. *length);
  297. if (c->inf & 0x80)
  298. {
  299. c->error=ERR_R_BAD_GET_ASN1_OBJECT_CALL;
  300. return(0);
  301. }
  302. if (c->tag != V_ASN1_SEQUENCE)
  303. {
  304. c->error=ERR_R_EXPECTING_AN_ASN1_SEQUENCE;
  305. return(0);
  306. }
  307. (*length)-=(c->p-q);
  308. if (c->max && (*length < 0))
  309. {
  310. c->error=ERR_R_ASN1_LENGTH_MISMATCH;
  311. return(0);
  312. }
  313. if (c->inf == (1|V_ASN1_CONSTRUCTED))
  314. c->slen= *length+ *(c->pp)-c->p;
  315. c->eos=0;
  316. return(1);
  317. }
  318. ASN1_STRING *ASN1_STRING_dup(ASN1_STRING *str)
  319. {
  320. ASN1_STRING *ret;
  321. if (str == NULL) return(NULL);
  322. if ((ret=ASN1_STRING_type_new(str->type)) == NULL)
  323. return(NULL);
  324. if (!ASN1_STRING_set(ret,str->data,str->length))
  325. {
  326. ASN1_STRING_free(ret);
  327. return(NULL);
  328. }
  329. ret->flags = str->flags;
  330. return(ret);
  331. }
  332. int ASN1_STRING_set(ASN1_STRING *str, const void *_data, int len)
  333. {
  334. unsigned char *c;
  335. const char *data=_data;
  336. if (len < 0)
  337. {
  338. if (data == NULL)
  339. return(0);
  340. else
  341. len=strlen(data);
  342. }
  343. if ((str->length < len) || (str->data == NULL))
  344. {
  345. c=str->data;
  346. if (c == NULL)
  347. str->data=OPENSSL_malloc(len+1);
  348. else
  349. str->data=OPENSSL_realloc(c,len+1);
  350. if (str->data == NULL)
  351. {
  352. ASN1err(ASN1_F_ASN1_STRING_SET,ERR_R_MALLOC_FAILURE);
  353. str->data=c;
  354. return(0);
  355. }
  356. }
  357. str->length=len;
  358. if (data != NULL)
  359. {
  360. memcpy(str->data,data,len);
  361. /* an allowance for strings :-) */
  362. str->data[len]='';
  363. }
  364. return(1);
  365. }
  366. ASN1_STRING *ASN1_STRING_new(void)
  367. {
  368. return(ASN1_STRING_type_new(V_ASN1_OCTET_STRING));
  369. }
  370. ASN1_STRING *ASN1_STRING_type_new(int type)
  371. {
  372. ASN1_STRING *ret;
  373. ret=(ASN1_STRING *)OPENSSL_malloc(sizeof(ASN1_STRING));
  374. if (ret == NULL)
  375. {
  376. ASN1err(ASN1_F_ASN1_STRING_TYPE_NEW,ERR_R_MALLOC_FAILURE);
  377. return(NULL);
  378. }
  379. ret->length=0;
  380. ret->type=type;
  381. ret->data=NULL;
  382. ret->flags=0;
  383. return(ret);
  384. }
  385. void ASN1_STRING_free(ASN1_STRING *a)
  386. {
  387. if (a == NULL) return;
  388. if (a->data != NULL) OPENSSL_free(a->data);
  389. OPENSSL_free(a);
  390. }
  391. int ASN1_STRING_cmp(ASN1_STRING *a, ASN1_STRING *b)
  392. {
  393. int i;
  394. i=(a->length-b->length);
  395. if (i == 0)
  396. {
  397. i=memcmp(a->data,b->data,a->length);
  398. if (i == 0)
  399. return(a->type-b->type);
  400. else
  401. return(i);
  402. }
  403. else
  404. return(i);
  405. }
  406. void asn1_add_error(const unsigned char *address, int offset)
  407. {
  408. char buf1[DECIMAL_SIZE(address)+1],buf2[DECIMAL_SIZE(offset)+1];
  409. BIO_snprintf(buf1,sizeof buf1,"%lu",(unsigned long)address);
  410. BIO_snprintf(buf2,sizeof buf2,"%d",offset);
  411. ERR_add_error_data(4,"address=",buf1," offset=",buf2);
  412. }
  413. int ASN1_STRING_length(ASN1_STRING *x)
  414. { return M_ASN1_STRING_length(x); }
  415. void ASN1_STRING_length_set(ASN1_STRING *x, int len)
  416. { M_ASN1_STRING_length_set(x, len); return; }
  417. int ASN1_STRING_type(ASN1_STRING *x)
  418. { return M_ASN1_STRING_type(x); }
  419. unsigned char * ASN1_STRING_data(ASN1_STRING *x)
  420. { return M_ASN1_STRING_data(x); }