Commit 742b139f authored by Richard Levitte's avatar Richard Levitte
Browse files

Add the possibility to store arbitrary data in a STORE.

Suggested by Götz Babin-Ebell <babin-ebell@trustcenter.de>.
parent 3b30121b
Loading
Loading
Loading
Loading
+25 −8
Original line number Diff line number Diff line
@@ -135,12 +135,13 @@ const STORE_METHOD *STORE_File(void);
   or fetch */
typedef enum STORE_object_types
	{
	STORE_OBJECT_TYPE_X509_CERTIFICATE=	0x01,
	STORE_OBJECT_TYPE_X509_CRL=		0x02,
	STORE_OBJECT_TYPE_PRIVATE_KEY=		0x03,
	STORE_OBJECT_TYPE_PUBLIC_KEY=		0x04,
	STORE_OBJECT_TYPE_NUMBER=		0x05,
	STORE_OBJECT_TYPE_NUM=			0x05  /* The amount of known
	STORE_OBJECT_TYPE_X509_CERTIFICATE=	0x01, /* X509 * */
	STORE_OBJECT_TYPE_X509_CRL=		0x02, /* X509_CRL * */
	STORE_OBJECT_TYPE_PRIVATE_KEY=		0x03, /* EVP_PKEY * */
	STORE_OBJECT_TYPE_PUBLIC_KEY=		0x04, /* EVP_PKEY * */
	STORE_OBJECT_TYPE_NUMBER=		0x05, /* BIGNUM * */
	STORE_OBJECT_TYPE_ARBITRARY=		0x06, /* BUF_MEM * */
	STORE_OBJECT_TYPE_NUM=			0x06  /* The amount of known
							 object types */
	} STORE_OBJECT_TYPES;
/* List of text strings corresponding to the object types. */
@@ -214,6 +215,7 @@ typedef struct STORE_OBJECT_st
		X509_CRL *crl;
		EVP_PKEY *key;
		BIGNUM *number;
		BUF_MEM *arbitrary;
		} data;
	} STORE_OBJECT;
DECLARE_STACK_OF(STORE_OBJECT);
@@ -275,7 +277,13 @@ int STORE_modify_number(STORE *e, OPENSSL_ITEM search_attributes[],
	OPENSSL_ITEM add_sttributes[], OPENSSL_ITEM modify_attributes[],
	OPENSSL_ITEM delete_attributes[]);
BIGNUM *STORE_get_number(STORE *e, OPENSSL_ITEM attributes[]);
int STORE_delete_number(STORE *e, BIGNUM *data, OPENSSL_ITEM attributes[]);
int STORE_delete_number(STORE *e, OPENSSL_ITEM attributes[]);
int STORE_store_arbitrary(STORE *e, BUF_MEM *data, OPENSSL_ITEM attributes[]);
int STORE_modify_arbitrary(STORE *e, OPENSSL_ITEM search_attributes[],
	OPENSSL_ITEM add_sttributes[], OPENSSL_ITEM modify_attributes[],
	OPENSSL_ITEM delete_attributes[]);
BUF_MEM *STORE_get_arbitrary(STORE *e, OPENSSL_ITEM attributes[]);
int STORE_delete_arbitrary(STORE *e, OPENSSL_ITEM attributes[]);


/* Create and manipulate methods */
@@ -394,6 +402,7 @@ void ERR_load_STORE_strings(void);
#define STORE_F_MEM_LIST_NEXT				 136
#define STORE_F_MEM_LIST_START				 137
#define STORE_F_MEM_STORE				 138
#define STORE_F_STORE_ARBITRARY				 157
#define STORE_F_STORE_ATTR_INFO_GET0_CSTR		 139
#define STORE_F_STORE_ATTR_INFO_GET0_DN			 140
#define STORE_F_STORE_ATTR_INFO_GET0_NUMBER		 141
@@ -408,6 +417,7 @@ void ERR_load_STORE_strings(void);
#define STORE_F_STORE_ATTR_INFO_SET_SHA1STR		 150
#define STORE_F_STORE_CERTIFICATE			 100
#define STORE_F_STORE_CRL				 101
#define STORE_F_STORE_DELETE_ARBITRARY			 158
#define STORE_F_STORE_DELETE_CERTIFICATE		 102
#define STORE_F_STORE_DELETE_CRL			 103
#define STORE_F_STORE_DELETE_NUMBER			 104
@@ -415,6 +425,7 @@ void ERR_load_STORE_strings(void);
#define STORE_F_STORE_DELETE_PUBLIC_KEY			 106
#define STORE_F_STORE_GENERATE_CRL			 107
#define STORE_F_STORE_GENERATE_KEY			 108
#define STORE_F_STORE_GET_ARBITRARY			 159
#define STORE_F_STORE_GET_CERTIFICATE			 109
#define STORE_F_STORE_GET_CRL				 110
#define STORE_F_STORE_GET_NUMBER			 111
@@ -449,11 +460,13 @@ void ERR_load_STORE_strings(void);

/* Reason codes. */
#define STORE_R_ALREADY_HAS_A_VALUE			 127
#define STORE_R_FAILED_DELETING_ARBITRARY		 132
#define STORE_R_FAILED_DELETING_CERTIFICATE		 100
#define STORE_R_FAILED_DELETING_KEY			 101
#define STORE_R_FAILED_DELETING_NUMBER			 102
#define STORE_R_FAILED_GENERATING_CRL			 103
#define STORE_R_FAILED_GENERATING_KEY			 104
#define STORE_R_FAILED_GETTING_ARBITRARY		 133
#define STORE_R_FAILED_GETTING_CERTIFICATE		 105
#define STORE_R_FAILED_GETTING_KEY			 106
#define STORE_R_FAILED_GETTING_NUMBER			 107
@@ -461,14 +474,17 @@ void ERR_load_STORE_strings(void);
#define STORE_R_FAILED_LISTING_KEYS			 109
#define STORE_R_FAILED_REVOKING_CERTIFICATE		 110
#define STORE_R_FAILED_REVOKING_KEY			 111
#define STORE_R_FAILED_STORING_ARBITRARY		 134
#define STORE_R_FAILED_STORING_CERTIFICATE		 112
#define STORE_R_FAILED_STORING_KEY			 113
#define STORE_R_FAILED_STORING_NUMBER			 114
#define STORE_R_NOT_IMPLEMENTED				 128
#define STORE_R_NO_DELETE_ARBITRARY_FUNCTION		 135
#define STORE_R_NO_DELETE_NUMBER_FUNCTION		 115
#define STORE_R_NO_DELETE_OBJECT_FUNCTION		 116
#define STORE_R_NO_GENERATE_CRL_FUNCTION		 117
#define STORE_R_NO_GENERATE_OBJECT_FUNCTION		 118
#define STORE_R_NO_GET_OBJECT_ARBITRARY_FUNCTION	 136
#define STORE_R_NO_GET_OBJECT_FUNCTION			 119
#define STORE_R_NO_GET_OBJECT_NUMBER_FUNCTION		 120
#define STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION		 131
@@ -477,6 +493,7 @@ void ERR_load_STORE_strings(void);
#define STORE_R_NO_LIST_OBJECT_START_FUNCTION		 123
#define STORE_R_NO_REVOKE_OBJECT_FUNCTION		 124
#define STORE_R_NO_STORE				 129
#define STORE_R_NO_STORE_OBJECT_ARBITRARY_FUNCTION	 137
#define STORE_R_NO_STORE_OBJECT_FUNCTION		 125
#define STORE_R_NO_STORE_OBJECT_NUMBER_FUNCTION		 126
#define STORE_R_NO_VALUE				 130
+9 −0
Original line number Diff line number Diff line
@@ -71,6 +71,7 @@ static ERR_STRING_DATA STORE_str_functs[]=
{ERR_PACK(0,STORE_F_MEM_LIST_NEXT,0),	"MEM_LIST_NEXT"},
{ERR_PACK(0,STORE_F_MEM_LIST_START,0),	"MEM_LIST_START"},
{ERR_PACK(0,STORE_F_MEM_STORE,0),	"MEM_STORE"},
{ERR_PACK(0,STORE_F_STORE_ARBITRARY,0),	"STORE_ARBITRARY"},
{ERR_PACK(0,STORE_F_STORE_ATTR_INFO_GET0_CSTR,0),	"STORE_ATTR_INFO_get0_cstr"},
{ERR_PACK(0,STORE_F_STORE_ATTR_INFO_GET0_DN,0),	"STORE_ATTR_INFO_get0_dn"},
{ERR_PACK(0,STORE_F_STORE_ATTR_INFO_GET0_NUMBER,0),	"STORE_ATTR_INFO_get0_number"},
@@ -85,6 +86,7 @@ static ERR_STRING_DATA STORE_str_functs[]=
{ERR_PACK(0,STORE_F_STORE_ATTR_INFO_SET_SHA1STR,0),	"STORE_ATTR_INFO_set_sha1str"},
{ERR_PACK(0,STORE_F_STORE_CERTIFICATE,0),	"STORE_CERTIFICATE"},
{ERR_PACK(0,STORE_F_STORE_CRL,0),	"STORE_CRL"},
{ERR_PACK(0,STORE_F_STORE_DELETE_ARBITRARY,0),	"STORE_delete_arbitrary"},
{ERR_PACK(0,STORE_F_STORE_DELETE_CERTIFICATE,0),	"STORE_delete_certificate"},
{ERR_PACK(0,STORE_F_STORE_DELETE_CRL,0),	"STORE_delete_crl"},
{ERR_PACK(0,STORE_F_STORE_DELETE_NUMBER,0),	"STORE_delete_number"},
@@ -92,6 +94,7 @@ static ERR_STRING_DATA STORE_str_functs[]=
{ERR_PACK(0,STORE_F_STORE_DELETE_PUBLIC_KEY,0),	"STORE_delete_public_key"},
{ERR_PACK(0,STORE_F_STORE_GENERATE_CRL,0),	"STORE_generate_crl"},
{ERR_PACK(0,STORE_F_STORE_GENERATE_KEY,0),	"STORE_generate_key"},
{ERR_PACK(0,STORE_F_STORE_GET_ARBITRARY,0),	"STORE_get_arbitrary"},
{ERR_PACK(0,STORE_F_STORE_GET_CERTIFICATE,0),	"STORE_get_certificate"},
{ERR_PACK(0,STORE_F_STORE_GET_CRL,0),	"STORE_get_crl"},
{ERR_PACK(0,STORE_F_STORE_GET_NUMBER,0),	"STORE_get_number"},
@@ -129,11 +132,13 @@ static ERR_STRING_DATA STORE_str_functs[]=
static ERR_STRING_DATA STORE_str_reasons[]=
	{
{STORE_R_ALREADY_HAS_A_VALUE             ,"already has a value"},
{STORE_R_FAILED_DELETING_ARBITRARY       ,"failed deleting arbitrary"},
{STORE_R_FAILED_DELETING_CERTIFICATE     ,"failed deleting certificate"},
{STORE_R_FAILED_DELETING_KEY             ,"failed deleting key"},
{STORE_R_FAILED_DELETING_NUMBER          ,"failed deleting number"},
{STORE_R_FAILED_GENERATING_CRL           ,"failed generating crl"},
{STORE_R_FAILED_GENERATING_KEY           ,"failed generating key"},
{STORE_R_FAILED_GETTING_ARBITRARY        ,"failed getting arbitrary"},
{STORE_R_FAILED_GETTING_CERTIFICATE      ,"failed getting certificate"},
{STORE_R_FAILED_GETTING_KEY              ,"failed getting key"},
{STORE_R_FAILED_GETTING_NUMBER           ,"failed getting number"},
@@ -141,14 +146,17 @@ static ERR_STRING_DATA STORE_str_reasons[]=
{STORE_R_FAILED_LISTING_KEYS             ,"failed listing keys"},
{STORE_R_FAILED_REVOKING_CERTIFICATE     ,"failed revoking certificate"},
{STORE_R_FAILED_REVOKING_KEY             ,"failed revoking key"},
{STORE_R_FAILED_STORING_ARBITRARY        ,"failed storing arbitrary"},
{STORE_R_FAILED_STORING_CERTIFICATE      ,"failed storing certificate"},
{STORE_R_FAILED_STORING_KEY              ,"failed storing key"},
{STORE_R_FAILED_STORING_NUMBER           ,"failed storing number"},
{STORE_R_NOT_IMPLEMENTED                 ,"not implemented"},
{STORE_R_NO_DELETE_ARBITRARY_FUNCTION    ,"no delete arbitrary function"},
{STORE_R_NO_DELETE_NUMBER_FUNCTION       ,"no delete number function"},
{STORE_R_NO_DELETE_OBJECT_FUNCTION       ,"no delete object function"},
{STORE_R_NO_GENERATE_CRL_FUNCTION        ,"no generate crl function"},
{STORE_R_NO_GENERATE_OBJECT_FUNCTION     ,"no generate object function"},
{STORE_R_NO_GET_OBJECT_ARBITRARY_FUNCTION,"no get object arbitrary function"},
{STORE_R_NO_GET_OBJECT_FUNCTION          ,"no get object function"},
{STORE_R_NO_GET_OBJECT_NUMBER_FUNCTION   ,"no get object number function"},
{STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION    ,"no list object endp function"},
@@ -157,6 +165,7 @@ static ERR_STRING_DATA STORE_str_reasons[]=
{STORE_R_NO_LIST_OBJECT_START_FUNCTION   ,"no list object start function"},
{STORE_R_NO_REVOKE_OBJECT_FUNCTION       ,"no revoke object function"},
{STORE_R_NO_STORE                        ,"no store"},
{STORE_R_NO_STORE_OBJECT_ARBITRARY_FUNCTION,"no store object arbitrary function"},
{STORE_R_NO_STORE_OBJECT_FUNCTION        ,"no store object function"},
{STORE_R_NO_STORE_OBJECT_NUMBER_FUNCTION ,"no store object number function"},
{STORE_R_NO_VALUE                        ,"no value"},
+69 −1
Original line number Diff line number Diff line
@@ -970,7 +970,7 @@ BIGNUM *STORE_get_number(STORE *s, OPENSSL_ITEM attributes[])
	return n;
	}

int STORE_delete_number(STORE *s, BIGNUM *data, OPENSSL_ITEM attributes[])
int STORE_delete_number(STORE *s, OPENSSL_ITEM attributes[])
	{
	check_store(s,STORE_F_STORE_DELETE_NUMBER,
		delete_object,STORE_R_NO_DELETE_NUMBER_FUNCTION);
@@ -984,6 +984,71 @@ int STORE_delete_number(STORE *s, BIGNUM *data, OPENSSL_ITEM attributes[])
	return 1;
	}

int store_arbitrary(STORE *s, BUF_MEM *data, OPENSSL_ITEM attributes[])
	{
	STORE_OBJECT *object = STORE_OBJECT_new();
	int i;

	check_store(s,STORE_F_STORE_ARBITRARY,
		store_object,STORE_R_NO_STORE_OBJECT_ARBITRARY_FUNCTION);

	if (!object)
		{
		STOREerr(STORE_F_STORE_ARBITRARY,
			ERR_R_MALLOC_FAILURE);
		return 0;
		}
	
	object->data.arbitrary = data;

	i = s->meth->store_object(s, STORE_OBJECT_TYPE_ARBITRARY, object, attributes);

	STORE_OBJECT_free(object);

	if (!i)
		{
		STOREerr(STORE_F_STORE_ARBITRARY,
			STORE_R_FAILED_STORING_ARBITRARY);
		return 0;
		}
	return 1;
	}

BUF_MEM *STORE_get_arbitrary(STORE *s, OPENSSL_ITEM attributes[])
	{
	STORE_OBJECT *object;
	BUF_MEM *b;

	check_store(s,STORE_F_STORE_GET_ARBITRARY,
		get_object,STORE_R_NO_GET_OBJECT_ARBITRARY_FUNCTION);

	object = s->meth->get_object(s, STORE_OBJECT_TYPE_ARBITRARY, attributes);
	if (!object || !object->data.arbitrary)
		{
		STOREerr(STORE_F_STORE_GET_ARBITRARY,
			STORE_R_FAILED_GETTING_ARBITRARY);
		return 0;
		}
	b = object->data.arbitrary;
	object->data.arbitrary = NULL;
	STORE_OBJECT_free(object);
	return b;
	}

int STORE_delete_arbitrary(STORE *s, OPENSSL_ITEM attributes[])
	{
	check_store(s,STORE_F_STORE_DELETE_ARBITRARY,
		delete_object,STORE_R_NO_DELETE_ARBITRARY_FUNCTION);

	if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_ARBITRARY, attributes))
		{
		STOREerr(STORE_F_STORE_DELETE_ARBITRARY,
			STORE_R_FAILED_DELETING_ARBITRARY);
		return 0;
		}
	return 1;
	}

STORE_OBJECT *STORE_OBJECT_new(void)
	{
	STORE_OBJECT *object = OPENSSL_malloc(sizeof(STORE_OBJECT));
@@ -1008,6 +1073,9 @@ void STORE_OBJECT_free(STORE_OBJECT *data)
	case STORE_OBJECT_TYPE_NUMBER:
		BN_free(data->data.number);
		break;
	case STORE_OBJECT_TYPE_ARBITRARY:
		BUF_MEM_free(data->data.arbitrary);
		break;
		}
	OPENSSL_free(data);
	}