X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=crypto%2Fasn1%2Fasn_pack.c;h=e6051db2dc98d6fe81934fd1ed473abfb8a9d2a5;hb=dbfc0f8c2b2d9f122acc246c67cf1150bf3d144f;hp=6e0dd9562243ec55d0a921116dcbf7095aad6eb5;hpb=c5db363e1b75f8452e4c888402a8ecb291b13838;p=oweals%2Fopenssl.git diff --git a/crypto/asn1/asn_pack.c b/crypto/asn1/asn_pack.c index 6e0dd95622..e6051db2dc 100644 --- a/crypto/asn1/asn_pack.c +++ b/crypto/asn1/asn_pack.c @@ -58,17 +58,16 @@ #include #include "cryptlib.h" -#include "asn1.h" +#include + +#ifndef NO_ASN1_OLD /* ASN1 packing and unpacking functions */ /* Turn an ASN1 encoded SEQUENCE OF into a STACK of structures */ -STACK *ASN1_seq_unpack(buf, len, d2i, free_func) -unsigned char *buf; -int len; -char *(*d2i)(); -void (*free_func)(); +STACK *ASN1_seq_unpack(unsigned char *buf, int len, char *(*d2i)(), + void (*free_func)(void *)) { STACK *sk; unsigned char *pbuf; @@ -80,14 +79,11 @@ void (*free_func)(); } /* Turn a STACK structures into an ASN1 encoded SEQUENCE OF structure in a - * Malloc'ed buffer + * OPENSSL_malloc'ed buffer */ -unsigned char *ASN1_seq_pack(safes, i2d, buf, len) -STACK *safes; -int (*i2d)(); -unsigned char **buf; -int *len; +unsigned char *ASN1_seq_pack(STACK *safes, int (*i2d)(), unsigned char **buf, + int *len) { int safelen; unsigned char *safe, *p; @@ -96,7 +92,7 @@ int *len; ASN1err(ASN1_F_ASN1_SEQ_PACK,ASN1_R_ENCODE_ERROR); return NULL; } - if (!(safe = Malloc (safelen))) { + if (!(safe = OPENSSL_malloc (safelen))) { ASN1err(ASN1_F_ASN1_SEQ_PACK,ERR_R_MALLOC_FAILURE); return NULL; } @@ -110,9 +106,7 @@ int *len; /* Extract an ASN1 object from an ASN1_STRING */ -char *ASN1_unpack_string (oct, d2i) -ASN1_STRING *oct; -char *(*d2i)(); +void *ASN1_unpack_string (ASN1_STRING *oct, char *(*d2i)()) { unsigned char *p; char *ret; @@ -125,10 +119,7 @@ char *(*d2i)(); /* Pack an ASN1 object into an ASN1_STRING */ -ASN1_STRING *ASN1_pack_string (obj, i2d, oct) -char *obj; -int (*i2d)(); -ASN1_STRING **oct; +ASN1_STRING *ASN1_pack_string(void *obj, int (*i2d)(), ASN1_STRING **oct) { unsigned char *p; ASN1_STRING *octmp; @@ -145,7 +136,7 @@ ASN1_STRING **oct; ASN1err(ASN1_F_ASN1_PACK_STRING,ASN1_R_ENCODE_ERROR); return NULL; } - if (!(p = Malloc (octmp->length))) { + if (!(p = OPENSSL_malloc (octmp->length))) { ASN1err(ASN1_F_ASN1_PACK_STRING,ERR_R_MALLOC_FAILURE); return NULL; } @@ -154,3 +145,47 @@ ASN1_STRING **oct; return octmp; } +#endif + +/* ASN1_ITEM versions of the above */ + +ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, ASN1_STRING **oct) +{ + ASN1_STRING *octmp; + + if (!oct || !*oct) { + if (!(octmp = ASN1_STRING_new ())) { + ASN1err(ASN1_F_ASN1_PACK_STRING,ERR_R_MALLOC_FAILURE); + return NULL; + } + if (oct) *oct = octmp; + } else octmp = *oct; + + if(octmp->data) { + OPENSSL_free(octmp->data); + octmp->data = NULL; + } + + if (!(octmp->length = ASN1_item_i2d(obj, &octmp->data, it))) { + ASN1err(ASN1_F_ASN1_PACK_STRING,ASN1_R_ENCODE_ERROR); + return NULL; + } + if (!octmp->data) { + ASN1err(ASN1_F_ASN1_PACK_STRING,ERR_R_MALLOC_FAILURE); + return NULL; + } + return octmp; +} + +/* Extract an ASN1 object from an ASN1_STRING */ + +void *ASN1_item_unpack(ASN1_STRING *oct, const ASN1_ITEM *it) +{ + unsigned char *p; + void *ret; + + p = oct->data; + if(!(ret = ASN1_item_d2i(NULL, &p, oct->length, it))) + ASN1err(ASN1_F_ASN1_UNPACK_STRING,ASN1_R_DECODE_ERROR); + return ret; +}