From: Dr. Stephen Henson Date: Sat, 28 Mar 2015 13:27:11 +0000 (+0000) Subject: Remove old ASN.1 code from evp_asn1.c X-Git-Tag: OpenSSL_1_1_0-pre1~1358 X-Git-Url: https://git.openssl.org/?p=openssl.git;a=commitdiff_plain;h=b9395187df44e630fbc90dcc530e55e37a920ed4;ds=sidebyside Remove old ASN.1 code from evp_asn1.c Rewrite ASN1_TYPE_set_int_octetstring and ASN1_TYPE_get_int_octetstring to use the new ASN.1 code instead of the old macros. Reviewed-by: Rich Salz --- diff --git a/crypto/asn1/evp_asn1.c b/crypto/asn1/evp_asn1.c index e6a5b5f28f..bf131a44f0 100644 --- a/crypto/asn1/evp_asn1.c +++ b/crypto/asn1/evp_asn1.c @@ -59,7 +59,7 @@ #include #include "cryptlib.h" #include -#include +#include int ASN1_TYPE_set_octetstring(ASN1_TYPE *a, unsigned char *data, int len) { @@ -95,100 +95,70 @@ int ASN1_TYPE_get_octetstring(ASN1_TYPE *a, unsigned char *data, int max_len) return (ret); } -int ASN1_TYPE_set_int_octetstring(ASN1_TYPE *a, long num, unsigned char *data, - int len) -{ - int n, size; - ASN1_OCTET_STRING os, *osp; - ASN1_INTEGER in; - unsigned char *p; - unsigned char buf[32]; /* when they have 256bit longs, I'll be in - * trouble */ - in.data = buf; - in.length = 32; - os.data = data; - os.type = V_ASN1_OCTET_STRING; - os.length = len; - ASN1_INTEGER_set(&in, num); - n = i2d_ASN1_INTEGER(&in, NULL); - n += i2d_ASN1_OCTET_STRING(&os, NULL); - - size = ASN1_object_size(1, n, V_ASN1_SEQUENCE); - - if ((osp = ASN1_STRING_new()) == NULL) - return (0); - /* Grow the 'string' */ - if (!ASN1_STRING_set(osp, NULL, size)) { - ASN1_STRING_free(osp); - return (0); - } +typedef struct { + long num; + ASN1_OCTET_STRING *oct; +} asn1_int_oct; - ASN1_STRING_length_set(osp, size); - p = ASN1_STRING_data(osp); +ASN1_SEQUENCE(asn1_int_oct) = { + ASN1_SIMPLE(asn1_int_oct, num, LONG), + ASN1_SIMPLE(asn1_int_oct, oct, ASN1_OCTET_STRING) +} ASN1_SEQUENCE_END(asn1_int_oct) - ASN1_put_object(&p, 1, n, V_ASN1_SEQUENCE, V_ASN1_UNIVERSAL); - i2d_ASN1_INTEGER(&in, &p); - i2d_ASN1_OCTET_STRING(&os, &p); +DECLARE_ASN1_ITEM(asn1_int_oct) - ASN1_TYPE_set(a, V_ASN1_SEQUENCE, osp); - return (1); +int ASN1_TYPE_set_int_octetstring(ASN1_TYPE *a, long num, unsigned char *data, + int len) +{ + asn1_int_oct atmp; + ASN1_OCTET_STRING oct; + + atmp.num = num; + atmp.oct = &oct; + oct.data = data; + oct.type = V_ASN1_OCTET_STRING; + oct.length = len; + oct.flags = 0; + + if (ASN1_TYPE_pack_sequence(ASN1_ITEM_rptr(asn1_int_oct), &atmp, &a)) + return 1; + return 0; } /* - * we return the actual length..., num may be missing, in which case, set it - * to zero + * we return the actual length... */ /* int max_len: for returned value */ int ASN1_TYPE_get_int_octetstring(ASN1_TYPE *a, long *num, unsigned char *data, int max_len) { + asn1_int_oct *atmp = NULL; int ret = -1, n; - ASN1_INTEGER *ai = NULL; - ASN1_OCTET_STRING *os = NULL; - const unsigned char *p; - long length; - ASN1_const_CTX c; if ((a->type != V_ASN1_SEQUENCE) || (a->value.sequence == NULL)) { goto err; } - p = ASN1_STRING_data(a->value.sequence); - length = ASN1_STRING_length(a->value.sequence); - c.pp = &p; - c.p = p; - c.max = p + length; - c.error = ASN1_R_DATA_IS_WRONG; + atmp = ASN1_TYPE_unpack_sequence(ASN1_ITEM_rptr(asn1_int_oct), a); - M_ASN1_D2I_start_sequence(); - c.q = c.p; - if ((ai = d2i_ASN1_INTEGER(NULL, &c.p, c.slen)) == NULL) - goto err; - c.slen -= (c.p - c.q); - c.q = c.p; - if ((os = d2i_ASN1_OCTET_STRING(NULL, &c.p, c.slen)) == NULL) - goto err; - c.slen -= (c.p - c.q); - if (!M_ASN1_D2I_end_sequence()) + if (atmp == NULL) goto err; if (num != NULL) - *num = ASN1_INTEGER_get(ai); + *num = atmp->num; - ret = ASN1_STRING_length(os); + ret = ASN1_STRING_length(atmp->oct); if (max_len > ret) n = ret; else n = max_len; if (data != NULL) - memcpy(data, ASN1_STRING_data(os), n); - if (0) { + memcpy(data, ASN1_STRING_data(atmp->oct), n); + if (ret == -1) { err: ASN1err(ASN1_F_ASN1_TYPE_GET_INT_OCTETSTRING, ASN1_R_DATA_IS_WRONG); } - ASN1_OCTET_STRING_free(os); - if (ai != NULL) - ASN1_INTEGER_free(ai); - return (ret); + M_ASN1_free_of(atmp, asn1_int_oct); + return ret; }