summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/asn1/a_int.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/asn1/a_int.c')
-rw-r--r--src/lib/libcrypto/asn1/a_int.c108
1 files changed, 73 insertions, 35 deletions
diff --git a/src/lib/libcrypto/asn1/a_int.c b/src/lib/libcrypto/asn1/a_int.c
index 8b6794e8c1..6f0413f885 100644
--- a/src/lib/libcrypto/asn1/a_int.c
+++ b/src/lib/libcrypto/asn1/a_int.c
@@ -72,8 +72,23 @@ ASN1_INTEGER *ASN1_INTEGER_dup(ASN1_INTEGER *x)
72int ASN1_INTEGER_cmp(ASN1_INTEGER *x, ASN1_INTEGER *y) 72int ASN1_INTEGER_cmp(ASN1_INTEGER *x, ASN1_INTEGER *y)
73{ return M_ASN1_INTEGER_cmp(x,y);} 73{ return M_ASN1_INTEGER_cmp(x,y);}
74 74
75/* Output ASN1 INTEGER including tag+length */
76
77int i2d_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **pp)
78{
79 int len, ret;
80 if(!a) return 0;
81 len = i2c_ASN1_INTEGER(a, NULL);
82 ret=ASN1_object_size(0,len,V_ASN1_INTEGER);
83 if(pp) {
84 ASN1_put_object(pp,0,len,V_ASN1_INTEGER,V_ASN1_UNIVERSAL);
85 i2c_ASN1_INTEGER(a, pp);
86 }
87 return ret;
88}
89
75/* 90/*
76 * This converts an ASN1 INTEGER into its DER encoding. 91 * This converts an ASN1 INTEGER into its content encoding.
77 * The internal representation is an ASN1_STRING whose data is a big endian 92 * The internal representation is an ASN1_STRING whose data is a big endian
78 * representation of the value, ignoring the sign. The sign is determined by 93 * representation of the value, ignoring the sign. The sign is determined by
79 * the type: V_ASN1_INTEGER for positive and V_ASN1_NEG_INTEGER for negative. 94 * the type: V_ASN1_INTEGER for positive and V_ASN1_NEG_INTEGER for negative.
@@ -97,23 +112,23 @@ int ASN1_INTEGER_cmp(ASN1_INTEGER *x, ASN1_INTEGER *y)
97 * followed by optional zeros isn't padded. 112 * followed by optional zeros isn't padded.
98 */ 113 */
99 114
100int i2d_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **pp) 115int i2c_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **pp)
101 { 116 {
102 int pad=0,ret,r,i,t; 117 int pad=0,ret,i,neg;
103 unsigned char *p,*n,pb=0; 118 unsigned char *p,*n,pb=0;
104 119
105 if ((a == NULL) || (a->data == NULL)) return(0); 120 if ((a == NULL) || (a->data == NULL)) return(0);
106 t=a->type; 121 neg=a->type & V_ASN1_NEG;
107 if (a->length == 0) 122 if (a->length == 0)
108 ret=1; 123 ret=1;
109 else 124 else
110 { 125 {
111 ret=a->length; 126 ret=a->length;
112 i=a->data[0]; 127 i=a->data[0];
113 if ((t == V_ASN1_INTEGER) && (i > 127)) { 128 if (!neg && (i > 127)) {
114 pad=1; 129 pad=1;
115 pb=0; 130 pb=0;
116 } else if(t == V_ASN1_NEG_INTEGER) { 131 } else if(neg) {
117 if(i>128) { 132 if(i>128) {
118 pad=1; 133 pad=1;
119 pb=0xFF; 134 pb=0xFF;
@@ -131,14 +146,12 @@ int i2d_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **pp)
131 } 146 }
132 ret+=pad; 147 ret+=pad;
133 } 148 }
134 r=ASN1_object_size(0,ret,V_ASN1_INTEGER); 149 if (pp == NULL) return(ret);
135 if (pp == NULL) return(r);
136 p= *pp; 150 p= *pp;
137 151
138 ASN1_put_object(&p,0,ret,V_ASN1_INTEGER,V_ASN1_UNIVERSAL);
139 if (pad) *(p++)=pb; 152 if (pad) *(p++)=pb;
140 if (a->length == 0) *(p++)=0; 153 if (a->length == 0) *(p++)=0;
141 else if (t == V_ASN1_INTEGER) memcpy(p,a->data,(unsigned int)a->length); 154 else if (!neg) memcpy(p,a->data,(unsigned int)a->length);
142 else { 155 else {
143 /* Begin at the end of the encoding */ 156 /* Begin at the end of the encoding */
144 n=a->data + a->length - 1; 157 n=a->data + a->length - 1;
@@ -157,30 +170,22 @@ int i2d_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **pp)
157 for(;i > 0; i--) *(p--) = *(n--) ^ 0xff; 170 for(;i > 0; i--) *(p--) = *(n--) ^ 0xff;
158 } 171 }
159 172
160 *pp+=r; 173 *pp+=ret;
161 return(r); 174 return(ret);
162 } 175 }
163 176
177/* Convert DER encoded ASN1 INTEGER to ASN1_INTEGER structure */
164ASN1_INTEGER *d2i_ASN1_INTEGER(ASN1_INTEGER **a, unsigned char **pp, 178ASN1_INTEGER *d2i_ASN1_INTEGER(ASN1_INTEGER **a, unsigned char **pp,
165 long length) 179 long length)
166 { 180{
167 ASN1_INTEGER *ret=NULL; 181 unsigned char *p;
168 unsigned char *p,*to,*s, *pend;
169 long len; 182 long len;
170 int inf,tag,xclass;
171 int i; 183 int i;
172 184 int inf,tag,xclass;
173 if ((a == NULL) || ((*a) == NULL)) 185 ASN1_INTEGER *ret;
174 {
175 if ((ret=M_ASN1_INTEGER_new()) == NULL) return(NULL);
176 ret->type=V_ASN1_INTEGER;
177 }
178 else
179 ret=(*a);
180 186
181 p= *pp; 187 p= *pp;
182 inf=ASN1_get_object(&p,&len,&tag,&xclass,length); 188 inf=ASN1_get_object(&p,&len,&tag,&xclass,length);
183 pend = p + len;
184 if (inf & 0x80) 189 if (inf & 0x80)
185 { 190 {
186 i=ASN1_R_BAD_OBJECT_HEADER; 191 i=ASN1_R_BAD_OBJECT_HEADER;
@@ -192,10 +197,39 @@ ASN1_INTEGER *d2i_ASN1_INTEGER(ASN1_INTEGER **a, unsigned char **pp,
192 i=ASN1_R_EXPECTING_AN_INTEGER; 197 i=ASN1_R_EXPECTING_AN_INTEGER;
193 goto err; 198 goto err;
194 } 199 }
200 ret = c2i_ASN1_INTEGER(a, &p, len);
201 if(ret) *pp = p;
202 return ret;
203err:
204 ASN1err(ASN1_F_D2I_ASN1_INTEGER,i);
205 return(NULL);
206
207}
208
209
210/* Convert just ASN1 INTEGER content octets to ASN1_INTEGER structure */
211
212ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **a, unsigned char **pp,
213 long len)
214 {
215 ASN1_INTEGER *ret=NULL;
216 unsigned char *p,*to,*s, *pend;
217 int i;
218
219 if ((a == NULL) || ((*a) == NULL))
220 {
221 if ((ret=M_ASN1_INTEGER_new()) == NULL) return(NULL);
222 ret->type=V_ASN1_INTEGER;
223 }
224 else
225 ret=(*a);
195 226
196 /* We must Malloc stuff, even for 0 bytes otherwise it 227 p= *pp;
228 pend = p + len;
229
230 /* We must OPENSSL_malloc stuff, even for 0 bytes otherwise it
197 * signifies a missing NULL parameter. */ 231 * signifies a missing NULL parameter. */
198 s=(unsigned char *)Malloc((int)len+1); 232 s=(unsigned char *)OPENSSL_malloc((int)len+1);
199 if (s == NULL) 233 if (s == NULL)
200 { 234 {
201 i=ERR_R_MALLOC_FAILURE; 235 i=ERR_R_MALLOC_FAILURE;
@@ -248,7 +282,7 @@ ASN1_INTEGER *d2i_ASN1_INTEGER(ASN1_INTEGER **a, unsigned char **pp,
248 memcpy(s,p,(int)len); 282 memcpy(s,p,(int)len);
249 } 283 }
250 284
251 if (ret->data != NULL) Free(ret->data); 285 if (ret->data != NULL) OPENSSL_free(ret->data);
252 ret->data=s; 286 ret->data=s;
253 ret->length=(int)len; 287 ret->length=(int)len;
254 if (a != NULL) (*a)=ret; 288 if (a != NULL) (*a)=ret;
@@ -261,6 +295,7 @@ err:
261 return(NULL); 295 return(NULL);
262 } 296 }
263 297
298
264/* This is a version of d2i_ASN1_INTEGER that ignores the sign bit of 299/* This is a version of d2i_ASN1_INTEGER that ignores the sign bit of
265 * ASN1 integers: some broken software can encode a positive INTEGER 300 * ASN1 integers: some broken software can encode a positive INTEGER
266 * with its MSB set as negative (it doesn't add a padding zero). 301 * with its MSB set as negative (it doesn't add a padding zero).
@@ -297,9 +332,9 @@ ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a, unsigned char **pp,
297 goto err; 332 goto err;
298 } 333 }
299 334
300 /* We must Malloc stuff, even for 0 bytes otherwise it 335 /* We must OPENSSL_malloc stuff, even for 0 bytes otherwise it
301 * signifies a missing NULL parameter. */ 336 * signifies a missing NULL parameter. */
302 s=(unsigned char *)Malloc((int)len+1); 337 s=(unsigned char *)OPENSSL_malloc((int)len+1);
303 if (s == NULL) 338 if (s == NULL)
304 { 339 {
305 i=ERR_R_MALLOC_FAILURE; 340 i=ERR_R_MALLOC_FAILURE;
@@ -317,7 +352,7 @@ ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a, unsigned char **pp,
317 p+=len; 352 p+=len;
318 } 353 }
319 354
320 if (ret->data != NULL) Free(ret->data); 355 if (ret->data != NULL) OPENSSL_free(ret->data);
321 ret->data=s; 356 ret->data=s;
322 ret->length=(int)len; 357 ret->length=(int)len;
323 if (a != NULL) (*a)=ret; 358 if (a != NULL) (*a)=ret;
@@ -340,8 +375,8 @@ int ASN1_INTEGER_set(ASN1_INTEGER *a, long v)
340 if (a->length < (sizeof(long)+1)) 375 if (a->length < (sizeof(long)+1))
341 { 376 {
342 if (a->data != NULL) 377 if (a->data != NULL)
343 Free(a->data); 378 OPENSSL_free(a->data);
344 if ((a->data=(unsigned char *)Malloc(sizeof(long)+1)) != NULL) 379 if ((a->data=(unsigned char *)OPENSSL_malloc(sizeof(long)+1)) != NULL)
345 memset((char *)a->data,0,sizeof(long)+1); 380 memset((char *)a->data,0,sizeof(long)+1);
346 } 381 }
347 if (a->data == NULL) 382 if (a->data == NULL)
@@ -416,7 +451,7 @@ ASN1_INTEGER *BN_to_ASN1_INTEGER(BIGNUM *bn, ASN1_INTEGER *ai)
416 else ret->type=V_ASN1_INTEGER; 451 else ret->type=V_ASN1_INTEGER;
417 j=BN_num_bits(bn); 452 j=BN_num_bits(bn);
418 len=((j == 0)?0:((j/8)+1)); 453 len=((j == 0)?0:((j/8)+1));
419 ret->data=(unsigned char *)Malloc(len+4); 454 ret->data=(unsigned char *)OPENSSL_malloc(len+4);
420 ret->length=BN_bn2bin(bn,ret->data); 455 ret->length=BN_bn2bin(bn,ret->data);
421 return(ret); 456 return(ret);
422err: 457err:
@@ -430,6 +465,9 @@ BIGNUM *ASN1_INTEGER_to_BN(ASN1_INTEGER *ai, BIGNUM *bn)
430 465
431 if ((ret=BN_bin2bn(ai->data,ai->length,bn)) == NULL) 466 if ((ret=BN_bin2bn(ai->data,ai->length,bn)) == NULL)
432 ASN1err(ASN1_F_ASN1_INTEGER_TO_BN,ASN1_R_BN_LIB); 467 ASN1err(ASN1_F_ASN1_INTEGER_TO_BN,ASN1_R_BN_LIB);
433 if(ai->type == V_ASN1_NEG_INTEGER) bn->neg = 1; 468 else if(ai->type == V_ASN1_NEG_INTEGER) ret->neg = 1;
434 return(ret); 469 return(ret);
435 } 470 }
471
472IMPLEMENT_STACK_OF(ASN1_INTEGER)
473IMPLEMENT_ASN1_SET_OF(ASN1_INTEGER)