Commit f86c5c9a authored by Dr. Stephen Henson's avatar Dr. Stephen Henson
Browse files

ASN1_ITEM version of ASN1_dup(). Might want

something more efficient later...
parent 66a0def8
Loading
Loading
Loading
Loading
+25 −1
Original line number Diff line number Diff line
@@ -60,7 +60,7 @@
#include "cryptlib.h"
#include <openssl/asn1.h>

#define READ_CHUNK   2048
#ifndef NO_OLD_ASN1

char *ASN1_dup(int (*i2d)(), char *(*d2i)(), char *x)
	{
@@ -81,3 +81,27 @@ char *ASN1_dup(int (*i2d)(), char *(*d2i)(), char *x)
	OPENSSL_free(b);
	return(ret);
	}

#endif

/* ASN1_ITEM version of dup: this follows the model above except we don't need
 * to allocate the buffer. At some point this could be rewritten to directly dup
 * the underlying structure instead of doing and encode and decode.
 */

void *ASN1_item_dup(const ASN1_ITEM *it, void *x)
	{
	unsigned char *b = NULL, *p;
	long i;
	void *ret;

	if (x == NULL) return(NULL);

	i=ASN1_item_i2d(x,&b,it);
	if (b == NULL)
		{ ASN1err(ASN1_F_ASN1_DUP,ERR_R_MALLOC_FAILURE); return(NULL); }
	p= b;
	ret=ASN1_item_d2i(NULL,&p,i, it);
	OPENSSL_free(b);
	return(ret);
	}
+2 −0
Original line number Diff line number Diff line
@@ -801,6 +801,8 @@ int ASN1_object_size(int constructed, int length, int tag);
/* Used to implement other functions */
char *ASN1_dup(int (*i2d)(),char *(*d2i)(),char *x);

void *ASN1_item_dup(const ASN1_ITEM *it, void *x);

#ifndef NO_FP_API
char *ASN1_d2i_fp(char *(*xnew)(),char *(*d2i)(),FILE *fp,unsigned char **x);
int ASN1_i2d_fp(int (*i2d)(),FILE *out,unsigned char *x);