diff options
author | Richard Levitte <levitte@openssl.org> | 2003-05-06 08:02:14 +0000 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2003-05-06 08:02:14 +0000 |
commit | 742b139f543db9d469dca1b8679492a80c22021f (patch) | |
tree | bb1501fcbe9e5a968bca625b08646ddcb5e0d578 | |
parent | 3b30121bd989bc79b8cb4a5440f55acf7442b3d2 (diff) |
Add the possibility to store arbitrary data in a STORE.
Suggested by Götz Babin-Ebell <babin-ebell@trustcenter.de>.
-rw-r--r-- | crypto/store/store.h | 33 | ||||
-rw-r--r-- | crypto/store/str_err.c | 9 | ||||
-rw-r--r-- | crypto/store/str_lib.c | 70 |
3 files changed, 103 insertions, 9 deletions
diff --git a/crypto/store/store.h b/crypto/store/store.h index 164165e7b0..d1e3862801 100644 --- a/crypto/store/store.h +++ b/crypto/store/store.h @@ -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. */ @@ -154,7 +155,7 @@ typedef enum STORE_params STORE_PARAM_EVP_TYPE= 0x01, /* int */ STORE_PARAM_BITS= 0x02, /* size_t */ STORE_PARAM_KEY_PARAMETERS= 0x03, /* ??? */ - STORE_PARAM_KEY_NO_PARAMETERS= 0x04, /* N/A */ + STORE_PARAM_KEY_NO_PARAMETERS= 0x04, /* N/A */ STORE_PARAM_TYPE_NUM= 0x04 /* The amount of known parameter types */ } STORE_PARAM_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 diff --git a/crypto/store/str_err.c b/crypto/store/str_err.c index 2ef7f9277c..2c2779bd7f 100644 --- a/crypto/store/str_err.c +++ b/crypto/store/str_err.c @@ -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"}, diff --git a/crypto/store/str_lib.c b/crypto/store/str_lib.c index cdba3dd115..3528ebec94 100644 --- a/crypto/store/str_lib.c +++ b/crypto/store/str_lib.c @@ -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); } |