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

其他游戏

开发平台:

Visual C++

  1. /* crypto/asn1/a_int.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 "cryptlib.h"
  60. #include <openssl/asn1.h>
  61. #include <openssl/bn.h>
  62. ASN1_INTEGER *ASN1_INTEGER_dup(ASN1_INTEGER *x)
  63. { return M_ASN1_INTEGER_dup(x);}
  64. int ASN1_INTEGER_cmp(ASN1_INTEGER *x, ASN1_INTEGER *y)
  65. int neg, ret;
  66. /* Compare signs */
  67. neg = x->type & V_ASN1_NEG;
  68. if (neg != (y->type & V_ASN1_NEG))
  69. {
  70. if (neg)
  71. return -1;
  72. else
  73. return 1;
  74. }
  75. ret = ASN1_STRING_cmp(x, y);
  76. if (neg)
  77. return -ret;
  78. else
  79. return ret;
  80. }
  81. /* 
  82.  * This converts an ASN1 INTEGER into its content encoding.
  83.  * The internal representation is an ASN1_STRING whose data is a big endian
  84.  * representation of the value, ignoring the sign. The sign is determined by
  85.  * the type: V_ASN1_INTEGER for positive and V_ASN1_NEG_INTEGER for negative. 
  86.  *
  87.  * Positive integers are no problem: they are almost the same as the DER
  88.  * encoding, except if the first byte is >= 0x80 we need to add a zero pad.
  89.  *
  90.  * Negative integers are a bit trickier...
  91.  * The DER representation of negative integers is in 2s complement form.
  92.  * The internal form is converted by complementing each octet and finally 
  93.  * adding one to the result. This can be done less messily with a little trick.
  94.  * If the internal form has trailing zeroes then they will become FF by the
  95.  * complement and 0 by the add one (due to carry) so just copy as many trailing 
  96.  * zeros to the destination as there are in the source. The carry will add one
  97.  * to the last none zero octet: so complement this octet and add one and finally
  98.  * complement any left over until you get to the start of the string.
  99.  *
  100.  * Padding is a little trickier too. If the first bytes is > 0x80 then we pad
  101.  * with 0xff. However if the first byte is 0x80 and one of the following bytes
  102.  * is non-zero we pad with 0xff. The reason for this distinction is that 0x80
  103.  * followed by optional zeros isn't padded.
  104.  */
  105. int i2c_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **pp)
  106. {
  107. int pad=0,ret,i,neg;
  108. unsigned char *p,*n,pb=0;
  109. if ((a == NULL) || (a->data == NULL)) return(0);
  110. neg=a->type & V_ASN1_NEG;
  111. if (a->length == 0)
  112. ret=1;
  113. else
  114. {
  115. ret=a->length;
  116. i=a->data[0];
  117. if (!neg && (i > 127)) {
  118. pad=1;
  119. pb=0;
  120. } else if(neg) {
  121. if(i>128) {
  122. pad=1;
  123. pb=0xFF;
  124. } else if(i == 128) {
  125. /*
  126.  * Special case: if any other bytes non zero we pad:
  127.  * otherwise we don't.
  128.  */
  129. for(i = 1; i < a->length; i++) if(a->data[i]) {
  130. pad=1;
  131. pb=0xFF;
  132. break;
  133. }
  134. }
  135. }
  136. ret+=pad;
  137. }
  138. if (pp == NULL) return(ret);
  139. p= *pp;
  140. if (pad) *(p++)=pb;
  141. if (a->length == 0) *(p++)=0;
  142. else if (!neg) memcpy(p,a->data,(unsigned int)a->length);
  143. else {
  144. /* Begin at the end of the encoding */
  145. n=a->data + a->length - 1;
  146. p += a->length - 1;
  147. i = a->length;
  148. /* Copy zeros to destination as long as source is zero */
  149. while(!*n) {
  150. *(p--) = 0;
  151. n--;
  152. i--;
  153. }
  154. /* Complement and increment next octet */
  155. *(p--) = ((*(n--)) ^ 0xff) + 1;
  156. i--;
  157. /* Complement any octets left */
  158. for(;i > 0; i--) *(p--) = *(n--) ^ 0xff;
  159. }
  160. *pp+=ret;
  161. return(ret);
  162. }
  163. /* Convert just ASN1 INTEGER content octets to ASN1_INTEGER structure */
  164. ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **a, const unsigned char **pp,
  165.      long len)
  166. {
  167. ASN1_INTEGER *ret=NULL;
  168. const unsigned char *p, *pend;
  169. unsigned char *to,*s;
  170. int i;
  171. if ((a == NULL) || ((*a) == NULL))
  172. {
  173. if ((ret=M_ASN1_INTEGER_new()) == NULL) return(NULL);
  174. ret->type=V_ASN1_INTEGER;
  175. }
  176. else
  177. ret=(*a);
  178. p= *pp;
  179. pend = p + len;
  180. /* We must OPENSSL_malloc stuff, even for 0 bytes otherwise it
  181.  * signifies a missing NULL parameter. */
  182. s=(unsigned char *)OPENSSL_malloc((int)len+1);
  183. if (s == NULL)
  184. {
  185. i=ERR_R_MALLOC_FAILURE;
  186. goto err;
  187. }
  188. to=s;
  189. if(!len) {
  190. /* Strictly speaking this is an illegal INTEGER but we
  191.  * tolerate it.
  192.  */
  193. ret->type=V_ASN1_INTEGER;
  194. } else if (*p & 0x80) /* a negative number */
  195. {
  196. ret->type=V_ASN1_NEG_INTEGER;
  197. if ((*p == 0xff) && (len != 1)) {
  198. p++;
  199. len--;
  200. }
  201. i = len;
  202. p += i - 1;
  203. to += i - 1;
  204. while((!*p) && i) {
  205. *(to--) = 0;
  206. i--;
  207. p--;
  208. }
  209. /* Special case: if all zeros then the number will be of
  210.  * the form FF followed by n zero bytes: this corresponds to
  211.  * 1 followed by n zero bytes. We've already written n zeros
  212.  * so we just append an extra one and set the first byte to
  213.  * a 1. This is treated separately because it is the only case
  214.  * where the number of bytes is larger than len.
  215.  */
  216. if(!i) {
  217. *s = 1;
  218. s[len] = 0;
  219. len++;
  220. } else {
  221. *(to--) = (*(p--) ^ 0xff) + 1;
  222. i--;
  223. for(;i > 0; i--) *(to--) = *(p--) ^ 0xff;
  224. }
  225. } else {
  226. ret->type=V_ASN1_INTEGER;
  227. if ((*p == 0) && (len != 1))
  228. {
  229. p++;
  230. len--;
  231. }
  232. memcpy(s,p,(int)len);
  233. }
  234. if (ret->data != NULL) OPENSSL_free(ret->data);
  235. ret->data=s;
  236. ret->length=(int)len;
  237. if (a != NULL) (*a)=ret;
  238. *pp=pend;
  239. return(ret);
  240. err:
  241. ASN1err(ASN1_F_C2I_ASN1_INTEGER,i);
  242. if ((ret != NULL) && ((a == NULL) || (*a != ret)))
  243. M_ASN1_INTEGER_free(ret);
  244. return(NULL);
  245. }
  246. /* This is a version of d2i_ASN1_INTEGER that ignores the sign bit of
  247.  * ASN1 integers: some broken software can encode a positive INTEGER
  248.  * with its MSB set as negative (it doesn't add a padding zero).
  249.  */
  250. ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a, const unsigned char **pp,
  251.      long length)
  252. {
  253. ASN1_INTEGER *ret=NULL;
  254. const unsigned char *p;
  255. unsigned char *to,*s;
  256. long len;
  257. int inf,tag,xclass;
  258. int i;
  259. if ((a == NULL) || ((*a) == NULL))
  260. {
  261. if ((ret=M_ASN1_INTEGER_new()) == NULL) return(NULL);
  262. ret->type=V_ASN1_INTEGER;
  263. }
  264. else
  265. ret=(*a);
  266. p= *pp;
  267. inf=ASN1_get_object(&p,&len,&tag,&xclass,length);
  268. if (inf & 0x80)
  269. {
  270. i=ASN1_R_BAD_OBJECT_HEADER;
  271. goto err;
  272. }
  273. if (tag != V_ASN1_INTEGER)
  274. {
  275. i=ASN1_R_EXPECTING_AN_INTEGER;
  276. goto err;
  277. }
  278. /* We must OPENSSL_malloc stuff, even for 0 bytes otherwise it
  279.  * signifies a missing NULL parameter. */
  280. s=(unsigned char *)OPENSSL_malloc((int)len+1);
  281. if (s == NULL)
  282. {
  283. i=ERR_R_MALLOC_FAILURE;
  284. goto err;
  285. }
  286. to=s;
  287. ret->type=V_ASN1_INTEGER;
  288. if(len) {
  289. if ((*p == 0) && (len != 1))
  290. {
  291. p++;
  292. len--;
  293. }
  294. memcpy(s,p,(int)len);
  295. p+=len;
  296. }
  297. if (ret->data != NULL) OPENSSL_free(ret->data);
  298. ret->data=s;
  299. ret->length=(int)len;
  300. if (a != NULL) (*a)=ret;
  301. *pp=p;
  302. return(ret);
  303. err:
  304. ASN1err(ASN1_F_D2I_ASN1_UINTEGER,i);
  305. if ((ret != NULL) && ((a == NULL) || (*a != ret)))
  306. M_ASN1_INTEGER_free(ret);
  307. return(NULL);
  308. }
  309. int ASN1_INTEGER_set(ASN1_INTEGER *a, long v)
  310. {
  311. int j,k;
  312. unsigned int i;
  313. unsigned char buf[sizeof(long)+1];
  314. long d;
  315. a->type=V_ASN1_INTEGER;
  316. if (a->length < (int)(sizeof(long)+1))
  317. {
  318. if (a->data != NULL)
  319. OPENSSL_free(a->data);
  320. if ((a->data=(unsigned char *)OPENSSL_malloc(sizeof(long)+1)) != NULL)
  321. memset((char *)a->data,0,sizeof(long)+1);
  322. }
  323. if (a->data == NULL)
  324. {
  325. ASN1err(ASN1_F_ASN1_INTEGER_SET,ERR_R_MALLOC_FAILURE);
  326. return(0);
  327. }
  328. d=v;
  329. if (d < 0)
  330. {
  331. d= -d;
  332. a->type=V_ASN1_NEG_INTEGER;
  333. }
  334. for (i=0; i<sizeof(long); i++)
  335. {
  336. if (d == 0) break;
  337. buf[i]=(int)d&0xff;
  338. d>>=8;
  339. }
  340. j=0;
  341. for (k=i-1; k >=0; k--)
  342. a->data[j++]=buf[k];
  343. a->length=j;
  344. return(1);
  345. }
  346. long ASN1_INTEGER_get(ASN1_INTEGER *a)
  347. {
  348. int neg=0,i;
  349. long r=0;
  350. if (a == NULL) return(0L);
  351. i=a->type;
  352. if (i == V_ASN1_NEG_INTEGER)
  353. neg=1;
  354. else if (i != V_ASN1_INTEGER)
  355. return -1;
  356. if (a->length > (int)sizeof(long))
  357. {
  358. /* hmm... a bit ugly */
  359. return(0xffffffffL);
  360. }
  361. if (a->data == NULL)
  362. return 0;
  363. for (i=0; i<a->length; i++)
  364. {
  365. r<<=8;
  366. r|=(unsigned char)a->data[i];
  367. }
  368. if (neg) r= -r;
  369. return(r);
  370. }
  371. ASN1_INTEGER *BN_to_ASN1_INTEGER(BIGNUM *bn, ASN1_INTEGER *ai)
  372. {
  373. ASN1_INTEGER *ret;
  374. int len,j;
  375. if (ai == NULL)
  376. ret=M_ASN1_INTEGER_new();
  377. else
  378. ret=ai;
  379. if (ret == NULL)
  380. {
  381. ASN1err(ASN1_F_BN_TO_ASN1_INTEGER,ERR_R_NESTED_ASN1_ERROR);
  382. goto err;
  383. }
  384. if (BN_is_negative(bn))
  385. ret->type = V_ASN1_NEG_INTEGER;
  386. else ret->type=V_ASN1_INTEGER;
  387. j=BN_num_bits(bn);
  388. len=((j == 0)?0:((j/8)+1));
  389. if (ret->length < len+4)
  390. {
  391. unsigned char *new_data=OPENSSL_realloc(ret->data, len+4);
  392. if (!new_data)
  393. {
  394. ASN1err(ASN1_F_BN_TO_ASN1_INTEGER,ERR_R_MALLOC_FAILURE);
  395. goto err;
  396. }
  397. ret->data=new_data;
  398. }
  399. ret->length=BN_bn2bin(bn,ret->data);
  400. /* Correct zero case */
  401. if(!ret->length)
  402. {
  403. ret->data[0] = 0;
  404. ret->length = 1;
  405. }
  406. return(ret);
  407. err:
  408. if (ret != ai) M_ASN1_INTEGER_free(ret);
  409. return(NULL);
  410. }
  411. BIGNUM *ASN1_INTEGER_to_BN(ASN1_INTEGER *ai, BIGNUM *bn)
  412. {
  413. BIGNUM *ret;
  414. if ((ret=BN_bin2bn(ai->data,ai->length,bn)) == NULL)
  415. ASN1err(ASN1_F_ASN1_INTEGER_TO_BN,ASN1_R_BN_LIB);
  416. else if(ai->type == V_ASN1_NEG_INTEGER)
  417. BN_set_negative(ret, 1);
  418. return(ret);
  419. }
  420. IMPLEMENT_STACK_OF(ASN1_INTEGER)
  421. IMPLEMENT_ASN1_SET_OF(ASN1_INTEGER)