diff options
Diffstat (limited to 'src/lib/libcrypto/asn1/a_int.c')
-rw-r--r-- | src/lib/libcrypto/asn1/a_int.c | 64 |
1 files changed, 8 insertions, 56 deletions
diff --git a/src/lib/libcrypto/asn1/a_int.c b/src/lib/libcrypto/asn1/a_int.c index 6f0413f885..496704b9a5 100644 --- a/src/lib/libcrypto/asn1/a_int.c +++ b/src/lib/libcrypto/asn1/a_int.c | |||
@@ -60,33 +60,12 @@ | |||
60 | #include "cryptlib.h" | 60 | #include "cryptlib.h" |
61 | #include <openssl/asn1.h> | 61 | #include <openssl/asn1.h> |
62 | 62 | ||
63 | ASN1_INTEGER *ASN1_INTEGER_new(void) | ||
64 | { return M_ASN1_INTEGER_new();} | ||
65 | |||
66 | void ASN1_INTEGER_free(ASN1_INTEGER *x) | ||
67 | { M_ASN1_INTEGER_free(x);} | ||
68 | |||
69 | ASN1_INTEGER *ASN1_INTEGER_dup(ASN1_INTEGER *x) | 63 | ASN1_INTEGER *ASN1_INTEGER_dup(ASN1_INTEGER *x) |
70 | { return M_ASN1_INTEGER_dup(x);} | 64 | { return M_ASN1_INTEGER_dup(x);} |
71 | 65 | ||
72 | int ASN1_INTEGER_cmp(ASN1_INTEGER *x, ASN1_INTEGER *y) | 66 | int ASN1_INTEGER_cmp(ASN1_INTEGER *x, ASN1_INTEGER *y) |
73 | { return M_ASN1_INTEGER_cmp(x,y);} | 67 | { return M_ASN1_INTEGER_cmp(x,y);} |
74 | 68 | ||
75 | /* Output ASN1 INTEGER including tag+length */ | ||
76 | |||
77 | int 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 | |||
90 | /* | 69 | /* |
91 | * This converts an ASN1 INTEGER into its content encoding. | 70 | * This converts an ASN1 INTEGER into its content encoding. |
92 | * The internal representation is an ASN1_STRING whose data is a big endian | 71 | * The internal representation is an ASN1_STRING whose data is a big endian |
@@ -174,39 +153,6 @@ int i2c_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **pp) | |||
174 | return(ret); | 153 | return(ret); |
175 | } | 154 | } |
176 | 155 | ||
177 | /* Convert DER encoded ASN1 INTEGER to ASN1_INTEGER structure */ | ||
178 | ASN1_INTEGER *d2i_ASN1_INTEGER(ASN1_INTEGER **a, unsigned char **pp, | ||
179 | long length) | ||
180 | { | ||
181 | unsigned char *p; | ||
182 | long len; | ||
183 | int i; | ||
184 | int inf,tag,xclass; | ||
185 | ASN1_INTEGER *ret; | ||
186 | |||
187 | p= *pp; | ||
188 | inf=ASN1_get_object(&p,&len,&tag,&xclass,length); | ||
189 | if (inf & 0x80) | ||
190 | { | ||
191 | i=ASN1_R_BAD_OBJECT_HEADER; | ||
192 | goto err; | ||
193 | } | ||
194 | |||
195 | if (tag != V_ASN1_INTEGER) | ||
196 | { | ||
197 | i=ASN1_R_EXPECTING_AN_INTEGER; | ||
198 | goto err; | ||
199 | } | ||
200 | ret = c2i_ASN1_INTEGER(a, &p, len); | ||
201 | if(ret) *pp = p; | ||
202 | return ret; | ||
203 | err: | ||
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 */ | 156 | /* Convert just ASN1 INTEGER content octets to ASN1_INTEGER structure */ |
211 | 157 | ||
212 | ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **a, unsigned char **pp, | 158 | ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **a, unsigned char **pp, |
@@ -414,7 +360,7 @@ long ASN1_INTEGER_get(ASN1_INTEGER *a) | |||
414 | if (i == V_ASN1_NEG_INTEGER) | 360 | if (i == V_ASN1_NEG_INTEGER) |
415 | neg=1; | 361 | neg=1; |
416 | else if (i != V_ASN1_INTEGER) | 362 | else if (i != V_ASN1_INTEGER) |
417 | return(0); | 363 | return -1; |
418 | 364 | ||
419 | if (a->length > sizeof(long)) | 365 | if (a->length > sizeof(long)) |
420 | { | 366 | { |
@@ -422,7 +368,7 @@ long ASN1_INTEGER_get(ASN1_INTEGER *a) | |||
422 | return(0xffffffffL); | 368 | return(0xffffffffL); |
423 | } | 369 | } |
424 | if (a->data == NULL) | 370 | if (a->data == NULL) |
425 | return(0); | 371 | return 0; |
426 | 372 | ||
427 | for (i=0; i<a->length; i++) | 373 | for (i=0; i<a->length; i++) |
428 | { | 374 | { |
@@ -453,6 +399,12 @@ ASN1_INTEGER *BN_to_ASN1_INTEGER(BIGNUM *bn, ASN1_INTEGER *ai) | |||
453 | len=((j == 0)?0:((j/8)+1)); | 399 | len=((j == 0)?0:((j/8)+1)); |
454 | ret->data=(unsigned char *)OPENSSL_malloc(len+4); | 400 | ret->data=(unsigned char *)OPENSSL_malloc(len+4); |
455 | ret->length=BN_bn2bin(bn,ret->data); | 401 | ret->length=BN_bn2bin(bn,ret->data); |
402 | /* Correct zero case */ | ||
403 | if(!ret->length) | ||
404 | { | ||
405 | ret->data[0] = 0; | ||
406 | ret->length = 1; | ||
407 | } | ||
456 | return(ret); | 408 | return(ret); |
457 | err: | 409 | err: |
458 | if (ret != ai) M_ASN1_INTEGER_free(ret); | 410 | if (ret != ai) M_ASN1_INTEGER_free(ret); |