diff options
Diffstat (limited to 'src/lib/libcrypto/asn1/asn_pack.c')
-rw-r--r-- | src/lib/libcrypto/asn1/asn_pack.c | 56 |
1 files changed, 51 insertions, 5 deletions
diff --git a/src/lib/libcrypto/asn1/asn_pack.c b/src/lib/libcrypto/asn1/asn_pack.c index 662a2626a1..e6051db2dc 100644 --- a/src/lib/libcrypto/asn1/asn_pack.c +++ b/src/lib/libcrypto/asn1/asn_pack.c | |||
@@ -60,12 +60,14 @@ | |||
60 | #include "cryptlib.h" | 60 | #include "cryptlib.h" |
61 | #include <openssl/asn1.h> | 61 | #include <openssl/asn1.h> |
62 | 62 | ||
63 | #ifndef NO_ASN1_OLD | ||
64 | |||
63 | /* ASN1 packing and unpacking functions */ | 65 | /* ASN1 packing and unpacking functions */ |
64 | 66 | ||
65 | /* Turn an ASN1 encoded SEQUENCE OF into a STACK of structures */ | 67 | /* Turn an ASN1 encoded SEQUENCE OF into a STACK of structures */ |
66 | 68 | ||
67 | STACK *ASN1_seq_unpack(unsigned char *buf, int len, char *(*d2i)(), | 69 | STACK *ASN1_seq_unpack(unsigned char *buf, int len, char *(*d2i)(), |
68 | void (*free_func)()) | 70 | void (*free_func)(void *)) |
69 | { | 71 | { |
70 | STACK *sk; | 72 | STACK *sk; |
71 | unsigned char *pbuf; | 73 | unsigned char *pbuf; |
@@ -77,7 +79,7 @@ STACK *ASN1_seq_unpack(unsigned char *buf, int len, char *(*d2i)(), | |||
77 | } | 79 | } |
78 | 80 | ||
79 | /* Turn a STACK structures into an ASN1 encoded SEQUENCE OF structure in a | 81 | /* Turn a STACK structures into an ASN1 encoded SEQUENCE OF structure in a |
80 | * Malloc'ed buffer | 82 | * OPENSSL_malloc'ed buffer |
81 | */ | 83 | */ |
82 | 84 | ||
83 | unsigned char *ASN1_seq_pack(STACK *safes, int (*i2d)(), unsigned char **buf, | 85 | unsigned char *ASN1_seq_pack(STACK *safes, int (*i2d)(), unsigned char **buf, |
@@ -90,7 +92,7 @@ unsigned char *ASN1_seq_pack(STACK *safes, int (*i2d)(), unsigned char **buf, | |||
90 | ASN1err(ASN1_F_ASN1_SEQ_PACK,ASN1_R_ENCODE_ERROR); | 92 | ASN1err(ASN1_F_ASN1_SEQ_PACK,ASN1_R_ENCODE_ERROR); |
91 | return NULL; | 93 | return NULL; |
92 | } | 94 | } |
93 | if (!(safe = Malloc (safelen))) { | 95 | if (!(safe = OPENSSL_malloc (safelen))) { |
94 | ASN1err(ASN1_F_ASN1_SEQ_PACK,ERR_R_MALLOC_FAILURE); | 96 | ASN1err(ASN1_F_ASN1_SEQ_PACK,ERR_R_MALLOC_FAILURE); |
95 | return NULL; | 97 | return NULL; |
96 | } | 98 | } |
@@ -117,7 +119,7 @@ void *ASN1_unpack_string (ASN1_STRING *oct, char *(*d2i)()) | |||
117 | 119 | ||
118 | /* Pack an ASN1 object into an ASN1_STRING */ | 120 | /* Pack an ASN1 object into an ASN1_STRING */ |
119 | 121 | ||
120 | ASN1_STRING *ASN1_pack_string (void *obj, int (*i2d)(), ASN1_STRING **oct) | 122 | ASN1_STRING *ASN1_pack_string(void *obj, int (*i2d)(), ASN1_STRING **oct) |
121 | { | 123 | { |
122 | unsigned char *p; | 124 | unsigned char *p; |
123 | ASN1_STRING *octmp; | 125 | ASN1_STRING *octmp; |
@@ -134,7 +136,7 @@ ASN1_STRING *ASN1_pack_string (void *obj, int (*i2d)(), ASN1_STRING **oct) | |||
134 | ASN1err(ASN1_F_ASN1_PACK_STRING,ASN1_R_ENCODE_ERROR); | 136 | ASN1err(ASN1_F_ASN1_PACK_STRING,ASN1_R_ENCODE_ERROR); |
135 | return NULL; | 137 | return NULL; |
136 | } | 138 | } |
137 | if (!(p = Malloc (octmp->length))) { | 139 | if (!(p = OPENSSL_malloc (octmp->length))) { |
138 | ASN1err(ASN1_F_ASN1_PACK_STRING,ERR_R_MALLOC_FAILURE); | 140 | ASN1err(ASN1_F_ASN1_PACK_STRING,ERR_R_MALLOC_FAILURE); |
139 | return NULL; | 141 | return NULL; |
140 | } | 142 | } |
@@ -143,3 +145,47 @@ ASN1_STRING *ASN1_pack_string (void *obj, int (*i2d)(), ASN1_STRING **oct) | |||
143 | return octmp; | 145 | return octmp; |
144 | } | 146 | } |
145 | 147 | ||
148 | #endif | ||
149 | |||
150 | /* ASN1_ITEM versions of the above */ | ||
151 | |||
152 | ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, ASN1_STRING **oct) | ||
153 | { | ||
154 | ASN1_STRING *octmp; | ||
155 | |||
156 | if (!oct || !*oct) { | ||
157 | if (!(octmp = ASN1_STRING_new ())) { | ||
158 | ASN1err(ASN1_F_ASN1_PACK_STRING,ERR_R_MALLOC_FAILURE); | ||
159 | return NULL; | ||
160 | } | ||
161 | if (oct) *oct = octmp; | ||
162 | } else octmp = *oct; | ||
163 | |||
164 | if(octmp->data) { | ||
165 | OPENSSL_free(octmp->data); | ||
166 | octmp->data = NULL; | ||
167 | } | ||
168 | |||
169 | if (!(octmp->length = ASN1_item_i2d(obj, &octmp->data, it))) { | ||
170 | ASN1err(ASN1_F_ASN1_PACK_STRING,ASN1_R_ENCODE_ERROR); | ||
171 | return NULL; | ||
172 | } | ||
173 | if (!octmp->data) { | ||
174 | ASN1err(ASN1_F_ASN1_PACK_STRING,ERR_R_MALLOC_FAILURE); | ||
175 | return NULL; | ||
176 | } | ||
177 | return octmp; | ||
178 | } | ||
179 | |||
180 | /* Extract an ASN1 object from an ASN1_STRING */ | ||
181 | |||
182 | void *ASN1_item_unpack(ASN1_STRING *oct, const ASN1_ITEM *it) | ||
183 | { | ||
184 | unsigned char *p; | ||
185 | void *ret; | ||
186 | |||
187 | p = oct->data; | ||
188 | if(!(ret = ASN1_item_d2i(NULL, &p, oct->length, it))) | ||
189 | ASN1err(ASN1_F_ASN1_UNPACK_STRING,ASN1_R_DECODE_ERROR); | ||
190 | return ret; | ||
191 | } | ||