1295016Sjkim/* crypto/store/str_lib.c */ 2280304Sjkim/* 3280304Sjkim * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project 4280304Sjkim * 2003. 5160814Ssimon */ 6160814Ssimon/* ==================================================================== 7160814Ssimon * Copyright (c) 2003 The OpenSSL Project. All rights reserved. 8160814Ssimon * 9160814Ssimon * Redistribution and use in source and binary forms, with or without 10160814Ssimon * modification, are permitted provided that the following conditions 11160814Ssimon * are met: 12160814Ssimon * 13160814Ssimon * 1. Redistributions of source code must retain the above copyright 14280304Sjkim * notice, this list of conditions and the following disclaimer. 15160814Ssimon * 16160814Ssimon * 2. Redistributions in binary form must reproduce the above copyright 17160814Ssimon * notice, this list of conditions and the following disclaimer in 18160814Ssimon * the documentation and/or other materials provided with the 19160814Ssimon * distribution. 20160814Ssimon * 21160814Ssimon * 3. All advertising materials mentioning features or use of this 22160814Ssimon * software must display the following acknowledgment: 23160814Ssimon * "This product includes software developed by the OpenSSL Project 24160814Ssimon * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" 25160814Ssimon * 26160814Ssimon * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 27160814Ssimon * endorse or promote products derived from this software without 28160814Ssimon * prior written permission. For written permission, please contact 29160814Ssimon * openssl-core@openssl.org. 30160814Ssimon * 31160814Ssimon * 5. Products derived from this software may not be called "OpenSSL" 32160814Ssimon * nor may "OpenSSL" appear in their names without prior written 33160814Ssimon * permission of the OpenSSL Project. 34160814Ssimon * 35160814Ssimon * 6. Redistributions of any form whatsoever must retain the following 36160814Ssimon * acknowledgment: 37160814Ssimon * "This product includes software developed by the OpenSSL Project 38160814Ssimon * for use in the OpenSSL Toolkit (http://www.openssl.org/)" 39160814Ssimon * 40160814Ssimon * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 41160814Ssimon * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42160814Ssimon * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 43160814Ssimon * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 44160814Ssimon * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45160814Ssimon * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 46160814Ssimon * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 47160814Ssimon * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48160814Ssimon * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 49160814Ssimon * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 50160814Ssimon * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 51160814Ssimon * OF THE POSSIBILITY OF SUCH DAMAGE. 52160814Ssimon * ==================================================================== 53160814Ssimon * 54160814Ssimon * This product includes cryptographic software written by Eric Young 55160814Ssimon * (eay@cryptsoft.com). This product includes software written by Tim 56160814Ssimon * Hudson (tjh@cryptsoft.com). 57160814Ssimon * 58160814Ssimon */ 59160814Ssimon 60160814Ssimon#include <string.h> 61160814Ssimon#include <openssl/bn.h> 62160814Ssimon#include <openssl/err.h> 63160814Ssimon#ifndef OPENSSL_NO_ENGINE 64280304Sjkim# include <openssl/engine.h> 65160814Ssimon#endif 66160814Ssimon#include <openssl/sha.h> 67160814Ssimon#include <openssl/x509.h> 68160814Ssimon#include "str_locl.h" 69160814Ssimon 70280304Sjkimconst char *const STORE_object_type_string[STORE_OBJECT_TYPE_NUM + 1] = { 71280304Sjkim 0, 72280304Sjkim "X.509 Certificate", 73280304Sjkim "X.509 CRL", 74280304Sjkim "Private Key", 75280304Sjkim "Public Key", 76280304Sjkim "Number", 77280304Sjkim "Arbitrary Data" 78280304Sjkim}; 79160814Ssimon 80280304Sjkimconst int STORE_param_sizes[STORE_PARAM_TYPE_NUM + 1] = { 81280304Sjkim 0, 82280304Sjkim sizeof(int), /* EVP_TYPE */ 83280304Sjkim sizeof(size_t), /* BITS */ 84280304Sjkim -1, /* KEY_PARAMETERS */ 85280304Sjkim 0 /* KEY_NO_PARAMETERS */ 86280304Sjkim}; 87160814Ssimon 88280304Sjkimconst int STORE_attr_sizes[STORE_ATTR_TYPE_NUM + 1] = { 89280304Sjkim 0, 90280304Sjkim -1, /* FRIENDLYNAME: C string */ 91280304Sjkim SHA_DIGEST_LENGTH, /* KEYID: SHA1 digest, 160 bits */ 92280304Sjkim SHA_DIGEST_LENGTH, /* ISSUERKEYID: SHA1 digest, 160 bits */ 93280304Sjkim SHA_DIGEST_LENGTH, /* SUBJECTKEYID: SHA1 digest, 160 bits */ 94280304Sjkim SHA_DIGEST_LENGTH, /* ISSUERSERIALHASH: SHA1 digest, 160 bits */ 95280304Sjkim sizeof(X509_NAME *), /* ISSUER: X509_NAME * */ 96280304Sjkim sizeof(BIGNUM *), /* SERIAL: BIGNUM * */ 97280304Sjkim sizeof(X509_NAME *), /* SUBJECT: X509_NAME * */ 98280304Sjkim SHA_DIGEST_LENGTH, /* CERTHASH: SHA1 digest, 160 bits */ 99280304Sjkim -1, /* EMAIL: C string */ 100280304Sjkim -1, /* FILENAME: C string */ 101280304Sjkim}; 102160814Ssimon 103160814SsimonSTORE *STORE_new_method(const STORE_METHOD *method) 104280304Sjkim{ 105280304Sjkim STORE *ret; 106160814Ssimon 107280304Sjkim if (method == NULL) { 108280304Sjkim STOREerr(STORE_F_STORE_NEW_METHOD, ERR_R_PASSED_NULL_PARAMETER); 109280304Sjkim return NULL; 110280304Sjkim } 111160814Ssimon 112280304Sjkim ret = (STORE *)OPENSSL_malloc(sizeof(STORE)); 113280304Sjkim if (ret == NULL) { 114280304Sjkim STOREerr(STORE_F_STORE_NEW_METHOD, ERR_R_MALLOC_FAILURE); 115280304Sjkim return NULL; 116280304Sjkim } 117160814Ssimon 118280304Sjkim ret->meth = method; 119160814Ssimon 120280304Sjkim CRYPTO_new_ex_data(CRYPTO_EX_INDEX_STORE, ret, &ret->ex_data); 121280304Sjkim if (ret->meth->init && !ret->meth->init(ret)) { 122280304Sjkim STORE_free(ret); 123280304Sjkim ret = NULL; 124280304Sjkim } 125280304Sjkim return ret; 126280304Sjkim} 127160814Ssimon 128160814SsimonSTORE *STORE_new_engine(ENGINE *engine) 129280304Sjkim{ 130280304Sjkim STORE *ret = NULL; 131280304Sjkim ENGINE *e = engine; 132280304Sjkim const STORE_METHOD *meth = 0; 133160814Ssimon 134160814Ssimon#ifdef OPENSSL_NO_ENGINE 135280304Sjkim e = NULL; 136160814Ssimon#else 137280304Sjkim if (engine) { 138280304Sjkim if (!ENGINE_init(engine)) { 139280304Sjkim STOREerr(STORE_F_STORE_NEW_ENGINE, ERR_R_ENGINE_LIB); 140280304Sjkim return NULL; 141280304Sjkim } 142280304Sjkim e = engine; 143280304Sjkim } else { 144280304Sjkim STOREerr(STORE_F_STORE_NEW_ENGINE, ERR_R_PASSED_NULL_PARAMETER); 145280304Sjkim return NULL; 146280304Sjkim } 147280304Sjkim if (e) { 148280304Sjkim meth = ENGINE_get_STORE(e); 149280304Sjkim if (!meth) { 150280304Sjkim STOREerr(STORE_F_STORE_NEW_ENGINE, ERR_R_ENGINE_LIB); 151280304Sjkim ENGINE_finish(e); 152280304Sjkim return NULL; 153280304Sjkim } 154280304Sjkim } 155160814Ssimon#endif 156160814Ssimon 157280304Sjkim ret = STORE_new_method(meth); 158280304Sjkim if (ret == NULL) { 159280304Sjkim STOREerr(STORE_F_STORE_NEW_ENGINE, ERR_R_STORE_LIB); 160280304Sjkim return NULL; 161280304Sjkim } 162160814Ssimon 163280304Sjkim ret->engine = e; 164160814Ssimon 165280304Sjkim return (ret); 166280304Sjkim} 167160814Ssimon 168160814Ssimonvoid STORE_free(STORE *store) 169280304Sjkim{ 170280304Sjkim if (store == NULL) 171280304Sjkim return; 172280304Sjkim if (store->meth->clean) 173280304Sjkim store->meth->clean(store); 174280304Sjkim CRYPTO_free_ex_data(CRYPTO_EX_INDEX_STORE, store, &store->ex_data); 175280304Sjkim OPENSSL_free(store); 176280304Sjkim} 177160814Ssimon 178280304Sjkimint STORE_ctrl(STORE *store, int cmd, long i, void *p, void (*f) (void)) 179280304Sjkim{ 180280304Sjkim if (store == NULL) { 181280304Sjkim STOREerr(STORE_F_STORE_CTRL, ERR_R_PASSED_NULL_PARAMETER); 182280304Sjkim return 0; 183280304Sjkim } 184280304Sjkim if (store->meth->ctrl) 185280304Sjkim return store->meth->ctrl(store, cmd, i, p, f); 186280304Sjkim STOREerr(STORE_F_STORE_CTRL, STORE_R_NO_CONTROL_FUNCTION); 187280304Sjkim return 0; 188280304Sjkim} 189160814Ssimon 190160814Ssimonint STORE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, 191280304Sjkim CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) 192280304Sjkim{ 193280304Sjkim return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_STORE, argl, argp, 194280304Sjkim new_func, dup_func, free_func); 195280304Sjkim} 196160814Ssimon 197160814Ssimonint STORE_set_ex_data(STORE *r, int idx, void *arg) 198280304Sjkim{ 199280304Sjkim return (CRYPTO_set_ex_data(&r->ex_data, idx, arg)); 200280304Sjkim} 201160814Ssimon 202160814Ssimonvoid *STORE_get_ex_data(STORE *r, int idx) 203280304Sjkim{ 204280304Sjkim return (CRYPTO_get_ex_data(&r->ex_data, idx)); 205280304Sjkim} 206160814Ssimon 207160814Ssimonconst STORE_METHOD *STORE_get_method(STORE *store) 208280304Sjkim{ 209280304Sjkim return store->meth; 210280304Sjkim} 211160814Ssimon 212160814Ssimonconst STORE_METHOD *STORE_set_method(STORE *store, const STORE_METHOD *meth) 213280304Sjkim{ 214280304Sjkim store->meth = meth; 215280304Sjkim return store->meth; 216280304Sjkim} 217160814Ssimon 218160814Ssimon/* API helpers */ 219160814Ssimon 220160814Ssimon#define check_store(s,fncode,fnname,fnerrcode) \ 221280304Sjkim do \ 222280304Sjkim { \ 223280304Sjkim if ((s) == NULL || (s)->meth == NULL) \ 224280304Sjkim { \ 225280304Sjkim STOREerr((fncode), ERR_R_PASSED_NULL_PARAMETER); \ 226280304Sjkim return 0; \ 227280304Sjkim } \ 228280304Sjkim if ((s)->meth->fnname == NULL) \ 229280304Sjkim { \ 230280304Sjkim STOREerr((fncode), (fnerrcode)); \ 231280304Sjkim return 0; \ 232280304Sjkim } \ 233280304Sjkim } \ 234280304Sjkim while(0) 235160814Ssimon 236160814Ssimon/* API functions */ 237160814Ssimon 238160814SsimonX509 *STORE_get_certificate(STORE *s, OPENSSL_ITEM attributes[], 239280304Sjkim OPENSSL_ITEM parameters[]) 240280304Sjkim{ 241280304Sjkim STORE_OBJECT *object; 242280304Sjkim X509 *x; 243160814Ssimon 244280304Sjkim check_store(s, STORE_F_STORE_GET_CERTIFICATE, 245280304Sjkim get_object, STORE_R_NO_GET_OBJECT_FUNCTION); 246160814Ssimon 247280304Sjkim object = s->meth->get_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE, 248280304Sjkim attributes, parameters); 249280304Sjkim if (!object || !object->data.x509.certificate) { 250280304Sjkim STOREerr(STORE_F_STORE_GET_CERTIFICATE, 251280304Sjkim STORE_R_FAILED_GETTING_CERTIFICATE); 252280304Sjkim return 0; 253280304Sjkim } 254280304Sjkim CRYPTO_add(&object->data.x509.certificate->references, 1, 255280304Sjkim CRYPTO_LOCK_X509); 256160814Ssimon#ifdef REF_PRINT 257280304Sjkim REF_PRINT("X509", data); 258160814Ssimon#endif 259280304Sjkim x = object->data.x509.certificate; 260280304Sjkim STORE_OBJECT_free(object); 261280304Sjkim return x; 262280304Sjkim} 263160814Ssimon 264160814Ssimonint STORE_store_certificate(STORE *s, X509 *data, OPENSSL_ITEM attributes[], 265280304Sjkim OPENSSL_ITEM parameters[]) 266280304Sjkim{ 267280304Sjkim STORE_OBJECT *object; 268280304Sjkim int i; 269160814Ssimon 270280304Sjkim check_store(s, STORE_F_STORE_CERTIFICATE, 271280304Sjkim store_object, STORE_R_NO_STORE_OBJECT_FUNCTION); 272160814Ssimon 273280304Sjkim object = STORE_OBJECT_new(); 274280304Sjkim if (!object) { 275280304Sjkim STOREerr(STORE_F_STORE_STORE_CERTIFICATE, ERR_R_MALLOC_FAILURE); 276280304Sjkim return 0; 277280304Sjkim } 278280304Sjkim 279280304Sjkim CRYPTO_add(&data->references, 1, CRYPTO_LOCK_X509); 280160814Ssimon#ifdef REF_PRINT 281280304Sjkim REF_PRINT("X509", data); 282160814Ssimon#endif 283280304Sjkim object->data.x509.certificate = data; 284160814Ssimon 285280304Sjkim i = s->meth->store_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE, 286280304Sjkim object, attributes, parameters); 287160814Ssimon 288280304Sjkim STORE_OBJECT_free(object); 289160814Ssimon 290280304Sjkim if (!i) { 291280304Sjkim STOREerr(STORE_F_STORE_STORE_CERTIFICATE, 292280304Sjkim STORE_R_FAILED_STORING_CERTIFICATE); 293280304Sjkim return 0; 294280304Sjkim } 295280304Sjkim return 1; 296280304Sjkim} 297160814Ssimon 298160814Ssimonint STORE_modify_certificate(STORE *s, OPENSSL_ITEM search_attributes[], 299280304Sjkim OPENSSL_ITEM add_attributes[], 300280304Sjkim OPENSSL_ITEM modify_attributes[], 301280304Sjkim OPENSSL_ITEM delete_attributes[], 302280304Sjkim OPENSSL_ITEM parameters[]) 303280304Sjkim{ 304280304Sjkim check_store(s, STORE_F_STORE_MODIFY_CERTIFICATE, 305280304Sjkim modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION); 306160814Ssimon 307280304Sjkim if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE, 308280304Sjkim search_attributes, add_attributes, 309280304Sjkim modify_attributes, delete_attributes, 310280304Sjkim parameters)) { 311280304Sjkim STOREerr(STORE_F_STORE_MODIFY_CERTIFICATE, 312280304Sjkim STORE_R_FAILED_MODIFYING_CERTIFICATE); 313280304Sjkim return 0; 314280304Sjkim } 315280304Sjkim return 1; 316280304Sjkim} 317160814Ssimon 318160814Ssimonint STORE_revoke_certificate(STORE *s, OPENSSL_ITEM attributes[], 319280304Sjkim OPENSSL_ITEM parameters[]) 320280304Sjkim{ 321280304Sjkim check_store(s, STORE_F_STORE_REVOKE_CERTIFICATE, 322280304Sjkim revoke_object, STORE_R_NO_REVOKE_OBJECT_FUNCTION); 323160814Ssimon 324280304Sjkim if (!s->meth->revoke_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE, 325280304Sjkim attributes, parameters)) { 326280304Sjkim STOREerr(STORE_F_STORE_REVOKE_CERTIFICATE, 327280304Sjkim STORE_R_FAILED_REVOKING_CERTIFICATE); 328280304Sjkim return 0; 329280304Sjkim } 330280304Sjkim return 1; 331280304Sjkim} 332160814Ssimon 333160814Ssimonint STORE_delete_certificate(STORE *s, OPENSSL_ITEM attributes[], 334280304Sjkim OPENSSL_ITEM parameters[]) 335280304Sjkim{ 336280304Sjkim check_store(s, STORE_F_STORE_DELETE_CERTIFICATE, 337280304Sjkim delete_object, STORE_R_NO_DELETE_OBJECT_FUNCTION); 338160814Ssimon 339280304Sjkim if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE, 340280304Sjkim attributes, parameters)) { 341280304Sjkim STOREerr(STORE_F_STORE_DELETE_CERTIFICATE, 342280304Sjkim STORE_R_FAILED_DELETING_CERTIFICATE); 343280304Sjkim return 0; 344280304Sjkim } 345280304Sjkim return 1; 346280304Sjkim} 347160814Ssimon 348160814Ssimonvoid *STORE_list_certificate_start(STORE *s, OPENSSL_ITEM attributes[], 349280304Sjkim OPENSSL_ITEM parameters[]) 350280304Sjkim{ 351280304Sjkim void *handle; 352160814Ssimon 353280304Sjkim check_store(s, STORE_F_STORE_LIST_CERTIFICATE_START, 354280304Sjkim list_object_start, STORE_R_NO_LIST_OBJECT_START_FUNCTION); 355160814Ssimon 356280304Sjkim handle = s->meth->list_object_start(s, 357280304Sjkim STORE_OBJECT_TYPE_X509_CERTIFICATE, 358280304Sjkim attributes, parameters); 359280304Sjkim if (!handle) { 360280304Sjkim STOREerr(STORE_F_STORE_LIST_CERTIFICATE_START, 361280304Sjkim STORE_R_FAILED_LISTING_CERTIFICATES); 362280304Sjkim return 0; 363280304Sjkim } 364280304Sjkim return handle; 365280304Sjkim} 366160814Ssimon 367160814SsimonX509 *STORE_list_certificate_next(STORE *s, void *handle) 368280304Sjkim{ 369280304Sjkim STORE_OBJECT *object; 370280304Sjkim X509 *x; 371160814Ssimon 372280304Sjkim check_store(s, STORE_F_STORE_LIST_CERTIFICATE_NEXT, 373280304Sjkim list_object_next, STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION); 374160814Ssimon 375280304Sjkim object = s->meth->list_object_next(s, handle); 376280304Sjkim if (!object || !object->data.x509.certificate) { 377280304Sjkim STOREerr(STORE_F_STORE_LIST_CERTIFICATE_NEXT, 378280304Sjkim STORE_R_FAILED_LISTING_CERTIFICATES); 379280304Sjkim return 0; 380280304Sjkim } 381280304Sjkim CRYPTO_add(&object->data.x509.certificate->references, 1, 382280304Sjkim CRYPTO_LOCK_X509); 383160814Ssimon#ifdef REF_PRINT 384280304Sjkim REF_PRINT("X509", data); 385160814Ssimon#endif 386280304Sjkim x = object->data.x509.certificate; 387280304Sjkim STORE_OBJECT_free(object); 388280304Sjkim return x; 389280304Sjkim} 390160814Ssimon 391160814Ssimonint STORE_list_certificate_end(STORE *s, void *handle) 392280304Sjkim{ 393280304Sjkim check_store(s, STORE_F_STORE_LIST_CERTIFICATE_END, 394280304Sjkim list_object_end, STORE_R_NO_LIST_OBJECT_END_FUNCTION); 395160814Ssimon 396280304Sjkim if (!s->meth->list_object_end(s, handle)) { 397280304Sjkim STOREerr(STORE_F_STORE_LIST_CERTIFICATE_END, 398280304Sjkim STORE_R_FAILED_LISTING_CERTIFICATES); 399280304Sjkim return 0; 400280304Sjkim } 401280304Sjkim return 1; 402280304Sjkim} 403160814Ssimon 404160814Ssimonint STORE_list_certificate_endp(STORE *s, void *handle) 405280304Sjkim{ 406280304Sjkim check_store(s, STORE_F_STORE_LIST_CERTIFICATE_ENDP, 407280304Sjkim list_object_endp, STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION); 408160814Ssimon 409280304Sjkim if (!s->meth->list_object_endp(s, handle)) { 410280304Sjkim STOREerr(STORE_F_STORE_LIST_CERTIFICATE_ENDP, 411280304Sjkim STORE_R_FAILED_LISTING_CERTIFICATES); 412280304Sjkim return 0; 413280304Sjkim } 414280304Sjkim return 1; 415280304Sjkim} 416160814Ssimon 417160814SsimonEVP_PKEY *STORE_generate_key(STORE *s, OPENSSL_ITEM attributes[], 418280304Sjkim OPENSSL_ITEM parameters[]) 419280304Sjkim{ 420280304Sjkim STORE_OBJECT *object; 421280304Sjkim EVP_PKEY *pkey; 422160814Ssimon 423280304Sjkim check_store(s, STORE_F_STORE_GENERATE_KEY, 424280304Sjkim generate_object, STORE_R_NO_GENERATE_OBJECT_FUNCTION); 425160814Ssimon 426280304Sjkim object = s->meth->generate_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, 427280304Sjkim attributes, parameters); 428280304Sjkim if (!object || !object->data.key) { 429280304Sjkim STOREerr(STORE_F_STORE_GENERATE_KEY, STORE_R_FAILED_GENERATING_KEY); 430280304Sjkim return 0; 431280304Sjkim } 432280304Sjkim CRYPTO_add(&object->data.key->references, 1, CRYPTO_LOCK_EVP_PKEY); 433160814Ssimon#ifdef REF_PRINT 434280304Sjkim REF_PRINT("EVP_PKEY", data); 435160814Ssimon#endif 436280304Sjkim pkey = object->data.key; 437280304Sjkim STORE_OBJECT_free(object); 438280304Sjkim return pkey; 439280304Sjkim} 440160814Ssimon 441160814SsimonEVP_PKEY *STORE_get_private_key(STORE *s, OPENSSL_ITEM attributes[], 442280304Sjkim OPENSSL_ITEM parameters[]) 443280304Sjkim{ 444280304Sjkim STORE_OBJECT *object; 445280304Sjkim EVP_PKEY *pkey; 446160814Ssimon 447280304Sjkim check_store(s, STORE_F_STORE_GET_PRIVATE_KEY, 448280304Sjkim get_object, STORE_R_NO_GET_OBJECT_FUNCTION); 449160814Ssimon 450280304Sjkim object = s->meth->get_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, 451280304Sjkim attributes, parameters); 452280304Sjkim if (!object || !object->data.key || !object->data.key) { 453280304Sjkim STOREerr(STORE_F_STORE_GET_PRIVATE_KEY, STORE_R_FAILED_GETTING_KEY); 454280304Sjkim return 0; 455280304Sjkim } 456280304Sjkim CRYPTO_add(&object->data.key->references, 1, CRYPTO_LOCK_EVP_PKEY); 457160814Ssimon#ifdef REF_PRINT 458280304Sjkim REF_PRINT("EVP_PKEY", data); 459160814Ssimon#endif 460280304Sjkim pkey = object->data.key; 461280304Sjkim STORE_OBJECT_free(object); 462280304Sjkim return pkey; 463280304Sjkim} 464160814Ssimon 465280304Sjkimint STORE_store_private_key(STORE *s, EVP_PKEY *data, 466280304Sjkim OPENSSL_ITEM attributes[], 467280304Sjkim OPENSSL_ITEM parameters[]) 468280304Sjkim{ 469280304Sjkim STORE_OBJECT *object; 470280304Sjkim int i; 471160814Ssimon 472280304Sjkim check_store(s, STORE_F_STORE_STORE_PRIVATE_KEY, 473280304Sjkim store_object, STORE_R_NO_STORE_OBJECT_FUNCTION); 474160814Ssimon 475280304Sjkim object = STORE_OBJECT_new(); 476280304Sjkim if (!object) { 477280304Sjkim STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY, ERR_R_MALLOC_FAILURE); 478280304Sjkim return 0; 479280304Sjkim } 480280304Sjkim object->data.key = EVP_PKEY_new(); 481280304Sjkim if (!object->data.key) { 482280304Sjkim STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY, ERR_R_MALLOC_FAILURE); 483280304Sjkim return 0; 484280304Sjkim } 485280304Sjkim 486280304Sjkim CRYPTO_add(&data->references, 1, CRYPTO_LOCK_EVP_PKEY); 487160814Ssimon#ifdef REF_PRINT 488280304Sjkim REF_PRINT("EVP_PKEY", data); 489160814Ssimon#endif 490280304Sjkim object->data.key = data; 491160814Ssimon 492280304Sjkim i = s->meth->store_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, object, 493280304Sjkim attributes, parameters); 494160814Ssimon 495280304Sjkim STORE_OBJECT_free(object); 496160814Ssimon 497280304Sjkim if (!i) { 498280304Sjkim STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY, STORE_R_FAILED_STORING_KEY); 499280304Sjkim return 0; 500280304Sjkim } 501280304Sjkim return i; 502280304Sjkim} 503160814Ssimon 504160814Ssimonint STORE_modify_private_key(STORE *s, OPENSSL_ITEM search_attributes[], 505280304Sjkim OPENSSL_ITEM add_attributes[], 506280304Sjkim OPENSSL_ITEM modify_attributes[], 507280304Sjkim OPENSSL_ITEM delete_attributes[], 508280304Sjkim OPENSSL_ITEM parameters[]) 509280304Sjkim{ 510280304Sjkim check_store(s, STORE_F_STORE_MODIFY_PRIVATE_KEY, 511280304Sjkim modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION); 512160814Ssimon 513280304Sjkim if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, 514280304Sjkim search_attributes, add_attributes, 515280304Sjkim modify_attributes, delete_attributes, 516280304Sjkim parameters)) { 517280304Sjkim STOREerr(STORE_F_STORE_MODIFY_PRIVATE_KEY, 518280304Sjkim STORE_R_FAILED_MODIFYING_PRIVATE_KEY); 519280304Sjkim return 0; 520280304Sjkim } 521280304Sjkim return 1; 522280304Sjkim} 523160814Ssimon 524160814Ssimonint STORE_revoke_private_key(STORE *s, OPENSSL_ITEM attributes[], 525280304Sjkim OPENSSL_ITEM parameters[]) 526280304Sjkim{ 527280304Sjkim int i; 528160814Ssimon 529280304Sjkim check_store(s, STORE_F_STORE_REVOKE_PRIVATE_KEY, 530280304Sjkim revoke_object, STORE_R_NO_REVOKE_OBJECT_FUNCTION); 531160814Ssimon 532280304Sjkim i = s->meth->revoke_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, 533280304Sjkim attributes, parameters); 534160814Ssimon 535280304Sjkim if (!i) { 536280304Sjkim STOREerr(STORE_F_STORE_REVOKE_PRIVATE_KEY, 537280304Sjkim STORE_R_FAILED_REVOKING_KEY); 538280304Sjkim return 0; 539280304Sjkim } 540280304Sjkim return i; 541280304Sjkim} 542160814Ssimon 543160814Ssimonint STORE_delete_private_key(STORE *s, OPENSSL_ITEM attributes[], 544280304Sjkim OPENSSL_ITEM parameters[]) 545280304Sjkim{ 546280304Sjkim check_store(s, STORE_F_STORE_DELETE_PRIVATE_KEY, 547280304Sjkim delete_object, STORE_R_NO_DELETE_OBJECT_FUNCTION); 548160814Ssimon 549280304Sjkim if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, 550280304Sjkim attributes, parameters)) { 551280304Sjkim STOREerr(STORE_F_STORE_DELETE_PRIVATE_KEY, 552280304Sjkim STORE_R_FAILED_DELETING_KEY); 553280304Sjkim return 0; 554280304Sjkim } 555280304Sjkim return 1; 556280304Sjkim} 557280304Sjkim 558160814Ssimonvoid *STORE_list_private_key_start(STORE *s, OPENSSL_ITEM attributes[], 559280304Sjkim OPENSSL_ITEM parameters[]) 560280304Sjkim{ 561280304Sjkim void *handle; 562160814Ssimon 563280304Sjkim check_store(s, STORE_F_STORE_LIST_PRIVATE_KEY_START, 564280304Sjkim list_object_start, STORE_R_NO_LIST_OBJECT_START_FUNCTION); 565160814Ssimon 566280304Sjkim handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_PRIVATE_KEY, 567280304Sjkim attributes, parameters); 568280304Sjkim if (!handle) { 569280304Sjkim STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_START, 570280304Sjkim STORE_R_FAILED_LISTING_KEYS); 571280304Sjkim return 0; 572280304Sjkim } 573280304Sjkim return handle; 574280304Sjkim} 575160814Ssimon 576160814SsimonEVP_PKEY *STORE_list_private_key_next(STORE *s, void *handle) 577280304Sjkim{ 578280304Sjkim STORE_OBJECT *object; 579280304Sjkim EVP_PKEY *pkey; 580160814Ssimon 581280304Sjkim check_store(s, STORE_F_STORE_LIST_PRIVATE_KEY_NEXT, 582280304Sjkim list_object_next, STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION); 583160814Ssimon 584280304Sjkim object = s->meth->list_object_next(s, handle); 585280304Sjkim if (!object || !object->data.key || !object->data.key) { 586280304Sjkim STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_NEXT, 587280304Sjkim STORE_R_FAILED_LISTING_KEYS); 588280304Sjkim return 0; 589280304Sjkim } 590280304Sjkim CRYPTO_add(&object->data.key->references, 1, CRYPTO_LOCK_EVP_PKEY); 591160814Ssimon#ifdef REF_PRINT 592280304Sjkim REF_PRINT("EVP_PKEY", data); 593160814Ssimon#endif 594280304Sjkim pkey = object->data.key; 595280304Sjkim STORE_OBJECT_free(object); 596280304Sjkim return pkey; 597280304Sjkim} 598160814Ssimon 599160814Ssimonint STORE_list_private_key_end(STORE *s, void *handle) 600280304Sjkim{ 601280304Sjkim check_store(s, STORE_F_STORE_LIST_PRIVATE_KEY_END, 602280304Sjkim list_object_end, STORE_R_NO_LIST_OBJECT_END_FUNCTION); 603160814Ssimon 604280304Sjkim if (!s->meth->list_object_end(s, handle)) { 605280304Sjkim STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_END, 606280304Sjkim STORE_R_FAILED_LISTING_KEYS); 607280304Sjkim return 0; 608280304Sjkim } 609280304Sjkim return 1; 610280304Sjkim} 611160814Ssimon 612160814Ssimonint STORE_list_private_key_endp(STORE *s, void *handle) 613280304Sjkim{ 614280304Sjkim check_store(s, STORE_F_STORE_LIST_PRIVATE_KEY_ENDP, 615280304Sjkim list_object_endp, STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION); 616160814Ssimon 617280304Sjkim if (!s->meth->list_object_endp(s, handle)) { 618280304Sjkim STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_ENDP, 619280304Sjkim STORE_R_FAILED_LISTING_KEYS); 620280304Sjkim return 0; 621280304Sjkim } 622280304Sjkim return 1; 623280304Sjkim} 624160814Ssimon 625160814SsimonEVP_PKEY *STORE_get_public_key(STORE *s, OPENSSL_ITEM attributes[], 626280304Sjkim OPENSSL_ITEM parameters[]) 627280304Sjkim{ 628280304Sjkim STORE_OBJECT *object; 629280304Sjkim EVP_PKEY *pkey; 630160814Ssimon 631280304Sjkim check_store(s, STORE_F_STORE_GET_PUBLIC_KEY, 632280304Sjkim get_object, STORE_R_NO_GET_OBJECT_FUNCTION); 633160814Ssimon 634280304Sjkim object = s->meth->get_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY, 635280304Sjkim attributes, parameters); 636280304Sjkim if (!object || !object->data.key || !object->data.key) { 637280304Sjkim STOREerr(STORE_F_STORE_GET_PUBLIC_KEY, STORE_R_FAILED_GETTING_KEY); 638280304Sjkim return 0; 639280304Sjkim } 640280304Sjkim CRYPTO_add(&object->data.key->references, 1, CRYPTO_LOCK_EVP_PKEY); 641160814Ssimon#ifdef REF_PRINT 642280304Sjkim REF_PRINT("EVP_PKEY", data); 643160814Ssimon#endif 644280304Sjkim pkey = object->data.key; 645280304Sjkim STORE_OBJECT_free(object); 646280304Sjkim return pkey; 647280304Sjkim} 648160814Ssimon 649280304Sjkimint STORE_store_public_key(STORE *s, EVP_PKEY *data, 650280304Sjkim OPENSSL_ITEM attributes[], 651280304Sjkim OPENSSL_ITEM parameters[]) 652280304Sjkim{ 653280304Sjkim STORE_OBJECT *object; 654280304Sjkim int i; 655160814Ssimon 656280304Sjkim check_store(s, STORE_F_STORE_STORE_PUBLIC_KEY, 657280304Sjkim store_object, STORE_R_NO_STORE_OBJECT_FUNCTION); 658160814Ssimon 659280304Sjkim object = STORE_OBJECT_new(); 660280304Sjkim if (!object) { 661280304Sjkim STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY, ERR_R_MALLOC_FAILURE); 662280304Sjkim return 0; 663280304Sjkim } 664280304Sjkim object->data.key = EVP_PKEY_new(); 665280304Sjkim if (!object->data.key) { 666280304Sjkim STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY, ERR_R_MALLOC_FAILURE); 667280304Sjkim return 0; 668280304Sjkim } 669280304Sjkim 670280304Sjkim CRYPTO_add(&data->references, 1, CRYPTO_LOCK_EVP_PKEY); 671160814Ssimon#ifdef REF_PRINT 672280304Sjkim REF_PRINT("EVP_PKEY", data); 673160814Ssimon#endif 674280304Sjkim object->data.key = data; 675160814Ssimon 676280304Sjkim i = s->meth->store_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY, object, 677280304Sjkim attributes, parameters); 678160814Ssimon 679280304Sjkim STORE_OBJECT_free(object); 680160814Ssimon 681280304Sjkim if (!i) { 682280304Sjkim STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY, STORE_R_FAILED_STORING_KEY); 683280304Sjkim return 0; 684280304Sjkim } 685280304Sjkim return i; 686280304Sjkim} 687160814Ssimon 688160814Ssimonint STORE_modify_public_key(STORE *s, OPENSSL_ITEM search_attributes[], 689280304Sjkim OPENSSL_ITEM add_attributes[], 690280304Sjkim OPENSSL_ITEM modify_attributes[], 691280304Sjkim OPENSSL_ITEM delete_attributes[], 692280304Sjkim OPENSSL_ITEM parameters[]) 693280304Sjkim{ 694280304Sjkim check_store(s, STORE_F_STORE_MODIFY_PUBLIC_KEY, 695280304Sjkim modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION); 696160814Ssimon 697280304Sjkim if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY, 698280304Sjkim search_attributes, add_attributes, 699280304Sjkim modify_attributes, delete_attributes, 700280304Sjkim parameters)) { 701280304Sjkim STOREerr(STORE_F_STORE_MODIFY_PUBLIC_KEY, 702280304Sjkim STORE_R_FAILED_MODIFYING_PUBLIC_KEY); 703280304Sjkim return 0; 704280304Sjkim } 705280304Sjkim return 1; 706280304Sjkim} 707160814Ssimon 708160814Ssimonint STORE_revoke_public_key(STORE *s, OPENSSL_ITEM attributes[], 709280304Sjkim OPENSSL_ITEM parameters[]) 710280304Sjkim{ 711280304Sjkim int i; 712160814Ssimon 713280304Sjkim check_store(s, STORE_F_STORE_REVOKE_PUBLIC_KEY, 714280304Sjkim revoke_object, STORE_R_NO_REVOKE_OBJECT_FUNCTION); 715160814Ssimon 716280304Sjkim i = s->meth->revoke_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY, 717280304Sjkim attributes, parameters); 718160814Ssimon 719280304Sjkim if (!i) { 720280304Sjkim STOREerr(STORE_F_STORE_REVOKE_PUBLIC_KEY, 721280304Sjkim STORE_R_FAILED_REVOKING_KEY); 722280304Sjkim return 0; 723280304Sjkim } 724280304Sjkim return i; 725280304Sjkim} 726160814Ssimon 727160814Ssimonint STORE_delete_public_key(STORE *s, OPENSSL_ITEM attributes[], 728280304Sjkim OPENSSL_ITEM parameters[]) 729280304Sjkim{ 730280304Sjkim check_store(s, STORE_F_STORE_DELETE_PUBLIC_KEY, 731280304Sjkim delete_object, STORE_R_NO_DELETE_OBJECT_FUNCTION); 732160814Ssimon 733280304Sjkim if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY, 734280304Sjkim attributes, parameters)) { 735280304Sjkim STOREerr(STORE_F_STORE_DELETE_PUBLIC_KEY, 736280304Sjkim STORE_R_FAILED_DELETING_KEY); 737280304Sjkim return 0; 738280304Sjkim } 739280304Sjkim return 1; 740280304Sjkim} 741280304Sjkim 742160814Ssimonvoid *STORE_list_public_key_start(STORE *s, OPENSSL_ITEM attributes[], 743280304Sjkim OPENSSL_ITEM parameters[]) 744280304Sjkim{ 745280304Sjkim void *handle; 746160814Ssimon 747280304Sjkim check_store(s, STORE_F_STORE_LIST_PUBLIC_KEY_START, 748280304Sjkim list_object_start, STORE_R_NO_LIST_OBJECT_START_FUNCTION); 749160814Ssimon 750280304Sjkim handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_PUBLIC_KEY, 751280304Sjkim attributes, parameters); 752280304Sjkim if (!handle) { 753280304Sjkim STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_START, 754280304Sjkim STORE_R_FAILED_LISTING_KEYS); 755280304Sjkim return 0; 756280304Sjkim } 757280304Sjkim return handle; 758280304Sjkim} 759160814Ssimon 760160814SsimonEVP_PKEY *STORE_list_public_key_next(STORE *s, void *handle) 761280304Sjkim{ 762280304Sjkim STORE_OBJECT *object; 763280304Sjkim EVP_PKEY *pkey; 764160814Ssimon 765280304Sjkim check_store(s, STORE_F_STORE_LIST_PUBLIC_KEY_NEXT, 766280304Sjkim list_object_next, STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION); 767160814Ssimon 768280304Sjkim object = s->meth->list_object_next(s, handle); 769280304Sjkim if (!object || !object->data.key || !object->data.key) { 770280304Sjkim STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_NEXT, 771280304Sjkim STORE_R_FAILED_LISTING_KEYS); 772280304Sjkim return 0; 773280304Sjkim } 774280304Sjkim CRYPTO_add(&object->data.key->references, 1, CRYPTO_LOCK_EVP_PKEY); 775160814Ssimon#ifdef REF_PRINT 776280304Sjkim REF_PRINT("EVP_PKEY", data); 777160814Ssimon#endif 778280304Sjkim pkey = object->data.key; 779280304Sjkim STORE_OBJECT_free(object); 780280304Sjkim return pkey; 781280304Sjkim} 782160814Ssimon 783160814Ssimonint STORE_list_public_key_end(STORE *s, void *handle) 784280304Sjkim{ 785280304Sjkim check_store(s, STORE_F_STORE_LIST_PUBLIC_KEY_END, 786280304Sjkim list_object_end, STORE_R_NO_LIST_OBJECT_END_FUNCTION); 787160814Ssimon 788280304Sjkim if (!s->meth->list_object_end(s, handle)) { 789280304Sjkim STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_END, 790280304Sjkim STORE_R_FAILED_LISTING_KEYS); 791280304Sjkim return 0; 792280304Sjkim } 793280304Sjkim return 1; 794280304Sjkim} 795160814Ssimon 796160814Ssimonint STORE_list_public_key_endp(STORE *s, void *handle) 797280304Sjkim{ 798280304Sjkim check_store(s, STORE_F_STORE_LIST_PUBLIC_KEY_ENDP, 799280304Sjkim list_object_endp, STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION); 800160814Ssimon 801280304Sjkim if (!s->meth->list_object_endp(s, handle)) { 802280304Sjkim STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_ENDP, 803280304Sjkim STORE_R_FAILED_LISTING_KEYS); 804280304Sjkim return 0; 805280304Sjkim } 806280304Sjkim return 1; 807280304Sjkim} 808160814Ssimon 809160814SsimonX509_CRL *STORE_generate_crl(STORE *s, OPENSSL_ITEM attributes[], 810280304Sjkim OPENSSL_ITEM parameters[]) 811280304Sjkim{ 812280304Sjkim STORE_OBJECT *object; 813280304Sjkim X509_CRL *crl; 814160814Ssimon 815280304Sjkim check_store(s, STORE_F_STORE_GENERATE_CRL, 816280304Sjkim generate_object, STORE_R_NO_GENERATE_CRL_FUNCTION); 817160814Ssimon 818280304Sjkim object = s->meth->generate_object(s, STORE_OBJECT_TYPE_X509_CRL, 819280304Sjkim attributes, parameters); 820280304Sjkim if (!object || !object->data.crl) { 821280304Sjkim STOREerr(STORE_F_STORE_GENERATE_CRL, STORE_R_FAILED_GENERATING_CRL); 822280304Sjkim return 0; 823280304Sjkim } 824280304Sjkim CRYPTO_add(&object->data.crl->references, 1, CRYPTO_LOCK_X509_CRL); 825160814Ssimon#ifdef REF_PRINT 826280304Sjkim REF_PRINT("X509_CRL", data); 827160814Ssimon#endif 828280304Sjkim crl = object->data.crl; 829280304Sjkim STORE_OBJECT_free(object); 830280304Sjkim return crl; 831280304Sjkim} 832160814Ssimon 833160814SsimonX509_CRL *STORE_get_crl(STORE *s, OPENSSL_ITEM attributes[], 834280304Sjkim OPENSSL_ITEM parameters[]) 835280304Sjkim{ 836280304Sjkim STORE_OBJECT *object; 837280304Sjkim X509_CRL *crl; 838160814Ssimon 839280304Sjkim check_store(s, STORE_F_STORE_GET_CRL, 840280304Sjkim get_object, STORE_R_NO_GET_OBJECT_FUNCTION); 841160814Ssimon 842280304Sjkim object = s->meth->get_object(s, STORE_OBJECT_TYPE_X509_CRL, 843280304Sjkim attributes, parameters); 844280304Sjkim if (!object || !object->data.crl) { 845280304Sjkim STOREerr(STORE_F_STORE_GET_CRL, STORE_R_FAILED_GETTING_KEY); 846280304Sjkim return 0; 847280304Sjkim } 848280304Sjkim CRYPTO_add(&object->data.crl->references, 1, CRYPTO_LOCK_X509_CRL); 849160814Ssimon#ifdef REF_PRINT 850280304Sjkim REF_PRINT("X509_CRL", data); 851160814Ssimon#endif 852280304Sjkim crl = object->data.crl; 853280304Sjkim STORE_OBJECT_free(object); 854280304Sjkim return crl; 855280304Sjkim} 856160814Ssimon 857160814Ssimonint STORE_store_crl(STORE *s, X509_CRL *data, OPENSSL_ITEM attributes[], 858280304Sjkim OPENSSL_ITEM parameters[]) 859280304Sjkim{ 860280304Sjkim STORE_OBJECT *object; 861280304Sjkim int i; 862160814Ssimon 863280304Sjkim check_store(s, STORE_F_STORE_STORE_CRL, 864280304Sjkim store_object, STORE_R_NO_STORE_OBJECT_FUNCTION); 865160814Ssimon 866280304Sjkim object = STORE_OBJECT_new(); 867280304Sjkim if (!object) { 868280304Sjkim STOREerr(STORE_F_STORE_STORE_CRL, ERR_R_MALLOC_FAILURE); 869280304Sjkim return 0; 870280304Sjkim } 871280304Sjkim 872280304Sjkim CRYPTO_add(&data->references, 1, CRYPTO_LOCK_X509_CRL); 873160814Ssimon#ifdef REF_PRINT 874280304Sjkim REF_PRINT("X509_CRL", data); 875160814Ssimon#endif 876280304Sjkim object->data.crl = data; 877160814Ssimon 878280304Sjkim i = s->meth->store_object(s, STORE_OBJECT_TYPE_X509_CRL, object, 879280304Sjkim attributes, parameters); 880160814Ssimon 881280304Sjkim STORE_OBJECT_free(object); 882160814Ssimon 883280304Sjkim if (!i) { 884280304Sjkim STOREerr(STORE_F_STORE_STORE_CRL, STORE_R_FAILED_STORING_KEY); 885280304Sjkim return 0; 886280304Sjkim } 887280304Sjkim return i; 888280304Sjkim} 889160814Ssimon 890160814Ssimonint STORE_modify_crl(STORE *s, OPENSSL_ITEM search_attributes[], 891280304Sjkim OPENSSL_ITEM add_attributes[], 892280304Sjkim OPENSSL_ITEM modify_attributes[], 893280304Sjkim OPENSSL_ITEM delete_attributes[], 894280304Sjkim OPENSSL_ITEM parameters[]) 895280304Sjkim{ 896280304Sjkim check_store(s, STORE_F_STORE_MODIFY_CRL, 897280304Sjkim modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION); 898160814Ssimon 899280304Sjkim if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_X509_CRL, 900280304Sjkim search_attributes, add_attributes, 901280304Sjkim modify_attributes, delete_attributes, 902280304Sjkim parameters)) { 903280304Sjkim STOREerr(STORE_F_STORE_MODIFY_CRL, STORE_R_FAILED_MODIFYING_CRL); 904280304Sjkim return 0; 905280304Sjkim } 906280304Sjkim return 1; 907280304Sjkim} 908160814Ssimon 909160814Ssimonint STORE_delete_crl(STORE *s, OPENSSL_ITEM attributes[], 910280304Sjkim OPENSSL_ITEM parameters[]) 911280304Sjkim{ 912280304Sjkim check_store(s, STORE_F_STORE_DELETE_CRL, 913280304Sjkim delete_object, STORE_R_NO_DELETE_OBJECT_FUNCTION); 914160814Ssimon 915280304Sjkim if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_X509_CRL, 916280304Sjkim attributes, parameters)) { 917280304Sjkim STOREerr(STORE_F_STORE_DELETE_CRL, STORE_R_FAILED_DELETING_KEY); 918280304Sjkim return 0; 919280304Sjkim } 920280304Sjkim return 1; 921280304Sjkim} 922280304Sjkim 923160814Ssimonvoid *STORE_list_crl_start(STORE *s, OPENSSL_ITEM attributes[], 924280304Sjkim OPENSSL_ITEM parameters[]) 925280304Sjkim{ 926280304Sjkim void *handle; 927160814Ssimon 928280304Sjkim check_store(s, STORE_F_STORE_LIST_CRL_START, 929280304Sjkim list_object_start, STORE_R_NO_LIST_OBJECT_START_FUNCTION); 930160814Ssimon 931280304Sjkim handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_X509_CRL, 932280304Sjkim attributes, parameters); 933280304Sjkim if (!handle) { 934280304Sjkim STOREerr(STORE_F_STORE_LIST_CRL_START, STORE_R_FAILED_LISTING_KEYS); 935280304Sjkim return 0; 936280304Sjkim } 937280304Sjkim return handle; 938280304Sjkim} 939160814Ssimon 940160814SsimonX509_CRL *STORE_list_crl_next(STORE *s, void *handle) 941280304Sjkim{ 942280304Sjkim STORE_OBJECT *object; 943280304Sjkim X509_CRL *crl; 944160814Ssimon 945280304Sjkim check_store(s, STORE_F_STORE_LIST_CRL_NEXT, 946280304Sjkim list_object_next, STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION); 947160814Ssimon 948280304Sjkim object = s->meth->list_object_next(s, handle); 949280304Sjkim if (!object || !object->data.crl) { 950280304Sjkim STOREerr(STORE_F_STORE_LIST_CRL_NEXT, STORE_R_FAILED_LISTING_KEYS); 951280304Sjkim return 0; 952280304Sjkim } 953280304Sjkim CRYPTO_add(&object->data.crl->references, 1, CRYPTO_LOCK_X509_CRL); 954160814Ssimon#ifdef REF_PRINT 955280304Sjkim REF_PRINT("X509_CRL", data); 956160814Ssimon#endif 957280304Sjkim crl = object->data.crl; 958280304Sjkim STORE_OBJECT_free(object); 959280304Sjkim return crl; 960280304Sjkim} 961160814Ssimon 962160814Ssimonint STORE_list_crl_end(STORE *s, void *handle) 963280304Sjkim{ 964280304Sjkim check_store(s, STORE_F_STORE_LIST_CRL_END, 965280304Sjkim list_object_end, STORE_R_NO_LIST_OBJECT_END_FUNCTION); 966160814Ssimon 967280304Sjkim if (!s->meth->list_object_end(s, handle)) { 968280304Sjkim STOREerr(STORE_F_STORE_LIST_CRL_END, STORE_R_FAILED_LISTING_KEYS); 969280304Sjkim return 0; 970280304Sjkim } 971280304Sjkim return 1; 972280304Sjkim} 973160814Ssimon 974160814Ssimonint STORE_list_crl_endp(STORE *s, void *handle) 975280304Sjkim{ 976280304Sjkim check_store(s, STORE_F_STORE_LIST_CRL_ENDP, 977280304Sjkim list_object_endp, STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION); 978160814Ssimon 979280304Sjkim if (!s->meth->list_object_endp(s, handle)) { 980280304Sjkim STOREerr(STORE_F_STORE_LIST_CRL_ENDP, STORE_R_FAILED_LISTING_KEYS); 981280304Sjkim return 0; 982280304Sjkim } 983280304Sjkim return 1; 984280304Sjkim} 985160814Ssimon 986160814Ssimonint STORE_store_number(STORE *s, BIGNUM *data, OPENSSL_ITEM attributes[], 987280304Sjkim OPENSSL_ITEM parameters[]) 988280304Sjkim{ 989280304Sjkim STORE_OBJECT *object; 990280304Sjkim int i; 991160814Ssimon 992280304Sjkim check_store(s, STORE_F_STORE_STORE_NUMBER, 993280304Sjkim store_object, STORE_R_NO_STORE_OBJECT_NUMBER_FUNCTION); 994160814Ssimon 995280304Sjkim object = STORE_OBJECT_new(); 996280304Sjkim if (!object) { 997280304Sjkim STOREerr(STORE_F_STORE_STORE_NUMBER, ERR_R_MALLOC_FAILURE); 998280304Sjkim return 0; 999280304Sjkim } 1000160814Ssimon 1001280304Sjkim object->data.number = data; 1002160814Ssimon 1003280304Sjkim i = s->meth->store_object(s, STORE_OBJECT_TYPE_NUMBER, object, 1004280304Sjkim attributes, parameters); 1005160814Ssimon 1006280304Sjkim STORE_OBJECT_free(object); 1007160814Ssimon 1008280304Sjkim if (!i) { 1009280304Sjkim STOREerr(STORE_F_STORE_STORE_NUMBER, STORE_R_FAILED_STORING_NUMBER); 1010280304Sjkim return 0; 1011280304Sjkim } 1012280304Sjkim return 1; 1013280304Sjkim} 1014280304Sjkim 1015160814Ssimonint STORE_modify_number(STORE *s, OPENSSL_ITEM search_attributes[], 1016280304Sjkim OPENSSL_ITEM add_attributes[], 1017280304Sjkim OPENSSL_ITEM modify_attributes[], 1018280304Sjkim OPENSSL_ITEM delete_attributes[], 1019280304Sjkim OPENSSL_ITEM parameters[]) 1020280304Sjkim{ 1021280304Sjkim check_store(s, STORE_F_STORE_MODIFY_NUMBER, 1022280304Sjkim modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION); 1023160814Ssimon 1024280304Sjkim if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_NUMBER, 1025280304Sjkim search_attributes, add_attributes, 1026280304Sjkim modify_attributes, delete_attributes, 1027280304Sjkim parameters)) { 1028280304Sjkim STOREerr(STORE_F_STORE_MODIFY_NUMBER, 1029280304Sjkim STORE_R_FAILED_MODIFYING_NUMBER); 1030280304Sjkim return 0; 1031280304Sjkim } 1032280304Sjkim return 1; 1033280304Sjkim} 1034160814Ssimon 1035160814SsimonBIGNUM *STORE_get_number(STORE *s, OPENSSL_ITEM attributes[], 1036280304Sjkim OPENSSL_ITEM parameters[]) 1037280304Sjkim{ 1038280304Sjkim STORE_OBJECT *object; 1039280304Sjkim BIGNUM *n; 1040160814Ssimon 1041280304Sjkim check_store(s, STORE_F_STORE_GET_NUMBER, 1042280304Sjkim get_object, STORE_R_NO_GET_OBJECT_NUMBER_FUNCTION); 1043160814Ssimon 1044280304Sjkim object = s->meth->get_object(s, STORE_OBJECT_TYPE_NUMBER, attributes, 1045280304Sjkim parameters); 1046280304Sjkim if (!object || !object->data.number) { 1047280304Sjkim STOREerr(STORE_F_STORE_GET_NUMBER, STORE_R_FAILED_GETTING_NUMBER); 1048280304Sjkim return 0; 1049280304Sjkim } 1050280304Sjkim n = object->data.number; 1051280304Sjkim object->data.number = NULL; 1052280304Sjkim STORE_OBJECT_free(object); 1053280304Sjkim return n; 1054280304Sjkim} 1055160814Ssimon 1056160814Ssimonint STORE_delete_number(STORE *s, OPENSSL_ITEM attributes[], 1057280304Sjkim OPENSSL_ITEM parameters[]) 1058280304Sjkim{ 1059280304Sjkim check_store(s, STORE_F_STORE_DELETE_NUMBER, 1060280304Sjkim delete_object, STORE_R_NO_DELETE_NUMBER_FUNCTION); 1061160814Ssimon 1062280304Sjkim if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_NUMBER, attributes, 1063280304Sjkim parameters)) { 1064280304Sjkim STOREerr(STORE_F_STORE_DELETE_NUMBER, STORE_R_FAILED_DELETING_NUMBER); 1065280304Sjkim return 0; 1066280304Sjkim } 1067280304Sjkim return 1; 1068280304Sjkim} 1069160814Ssimon 1070160814Ssimonint STORE_store_arbitrary(STORE *s, BUF_MEM *data, OPENSSL_ITEM attributes[], 1071280304Sjkim OPENSSL_ITEM parameters[]) 1072280304Sjkim{ 1073280304Sjkim STORE_OBJECT *object; 1074280304Sjkim int i; 1075160814Ssimon 1076280304Sjkim check_store(s, STORE_F_STORE_STORE_ARBITRARY, 1077280304Sjkim store_object, STORE_R_NO_STORE_OBJECT_ARBITRARY_FUNCTION); 1078160814Ssimon 1079280304Sjkim object = STORE_OBJECT_new(); 1080280304Sjkim if (!object) { 1081280304Sjkim STOREerr(STORE_F_STORE_STORE_ARBITRARY, ERR_R_MALLOC_FAILURE); 1082280304Sjkim return 0; 1083280304Sjkim } 1084160814Ssimon 1085280304Sjkim object->data.arbitrary = data; 1086160814Ssimon 1087280304Sjkim i = s->meth->store_object(s, STORE_OBJECT_TYPE_ARBITRARY, object, 1088280304Sjkim attributes, parameters); 1089160814Ssimon 1090280304Sjkim STORE_OBJECT_free(object); 1091160814Ssimon 1092280304Sjkim if (!i) { 1093280304Sjkim STOREerr(STORE_F_STORE_STORE_ARBITRARY, 1094280304Sjkim STORE_R_FAILED_STORING_ARBITRARY); 1095280304Sjkim return 0; 1096280304Sjkim } 1097280304Sjkim return 1; 1098280304Sjkim} 1099280304Sjkim 1100160814Ssimonint STORE_modify_arbitrary(STORE *s, OPENSSL_ITEM search_attributes[], 1101280304Sjkim OPENSSL_ITEM add_attributes[], 1102280304Sjkim OPENSSL_ITEM modify_attributes[], 1103280304Sjkim OPENSSL_ITEM delete_attributes[], 1104280304Sjkim OPENSSL_ITEM parameters[]) 1105280304Sjkim{ 1106280304Sjkim check_store(s, STORE_F_STORE_MODIFY_ARBITRARY, 1107280304Sjkim modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION); 1108160814Ssimon 1109280304Sjkim if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_ARBITRARY, 1110280304Sjkim search_attributes, add_attributes, 1111280304Sjkim modify_attributes, delete_attributes, 1112280304Sjkim parameters)) { 1113280304Sjkim STOREerr(STORE_F_STORE_MODIFY_ARBITRARY, 1114280304Sjkim STORE_R_FAILED_MODIFYING_ARBITRARY); 1115280304Sjkim return 0; 1116280304Sjkim } 1117280304Sjkim return 1; 1118280304Sjkim} 1119160814Ssimon 1120160814SsimonBUF_MEM *STORE_get_arbitrary(STORE *s, OPENSSL_ITEM attributes[], 1121280304Sjkim OPENSSL_ITEM parameters[]) 1122280304Sjkim{ 1123280304Sjkim STORE_OBJECT *object; 1124280304Sjkim BUF_MEM *b; 1125160814Ssimon 1126280304Sjkim check_store(s, STORE_F_STORE_GET_ARBITRARY, 1127280304Sjkim get_object, STORE_R_NO_GET_OBJECT_ARBITRARY_FUNCTION); 1128160814Ssimon 1129280304Sjkim object = s->meth->get_object(s, STORE_OBJECT_TYPE_ARBITRARY, 1130280304Sjkim attributes, parameters); 1131280304Sjkim if (!object || !object->data.arbitrary) { 1132280304Sjkim STOREerr(STORE_F_STORE_GET_ARBITRARY, 1133280304Sjkim STORE_R_FAILED_GETTING_ARBITRARY); 1134280304Sjkim return 0; 1135280304Sjkim } 1136280304Sjkim b = object->data.arbitrary; 1137280304Sjkim object->data.arbitrary = NULL; 1138280304Sjkim STORE_OBJECT_free(object); 1139280304Sjkim return b; 1140280304Sjkim} 1141160814Ssimon 1142160814Ssimonint STORE_delete_arbitrary(STORE *s, OPENSSL_ITEM attributes[], 1143280304Sjkim OPENSSL_ITEM parameters[]) 1144280304Sjkim{ 1145280304Sjkim check_store(s, STORE_F_STORE_DELETE_ARBITRARY, 1146280304Sjkim delete_object, STORE_R_NO_DELETE_ARBITRARY_FUNCTION); 1147160814Ssimon 1148280304Sjkim if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_ARBITRARY, attributes, 1149280304Sjkim parameters)) { 1150280304Sjkim STOREerr(STORE_F_STORE_DELETE_ARBITRARY, 1151280304Sjkim STORE_R_FAILED_DELETING_ARBITRARY); 1152280304Sjkim return 0; 1153280304Sjkim } 1154280304Sjkim return 1; 1155280304Sjkim} 1156160814Ssimon 1157160814SsimonSTORE_OBJECT *STORE_OBJECT_new(void) 1158280304Sjkim{ 1159280304Sjkim STORE_OBJECT *object = OPENSSL_malloc(sizeof(STORE_OBJECT)); 1160280304Sjkim if (object) 1161280304Sjkim memset(object, 0, sizeof(STORE_OBJECT)); 1162280304Sjkim return object; 1163280304Sjkim} 1164280304Sjkim 1165160814Ssimonvoid STORE_OBJECT_free(STORE_OBJECT *data) 1166280304Sjkim{ 1167280304Sjkim if (!data) 1168280304Sjkim return; 1169280304Sjkim switch (data->type) { 1170280304Sjkim case STORE_OBJECT_TYPE_X509_CERTIFICATE: 1171280304Sjkim X509_free(data->data.x509.certificate); 1172280304Sjkim break; 1173280304Sjkim case STORE_OBJECT_TYPE_X509_CRL: 1174280304Sjkim X509_CRL_free(data->data.crl); 1175280304Sjkim break; 1176280304Sjkim case STORE_OBJECT_TYPE_PRIVATE_KEY: 1177280304Sjkim case STORE_OBJECT_TYPE_PUBLIC_KEY: 1178280304Sjkim EVP_PKEY_free(data->data.key); 1179280304Sjkim break; 1180280304Sjkim case STORE_OBJECT_TYPE_NUMBER: 1181280304Sjkim BN_free(data->data.number); 1182280304Sjkim break; 1183280304Sjkim case STORE_OBJECT_TYPE_ARBITRARY: 1184280304Sjkim BUF_MEM_free(data->data.arbitrary); 1185280304Sjkim break; 1186280304Sjkim } 1187280304Sjkim OPENSSL_free(data); 1188280304Sjkim} 1189160814Ssimon 1190160814SsimonIMPLEMENT_STACK_OF(STORE_OBJECT*) 1191160814Ssimon 1192280304Sjkimstruct STORE_attr_info_st { 1193280304Sjkim unsigned char set[(STORE_ATTR_TYPE_NUM + 8) / 8]; 1194280304Sjkim union { 1195280304Sjkim char *cstring; 1196280304Sjkim unsigned char *sha1string; 1197280304Sjkim X509_NAME *dn; 1198280304Sjkim BIGNUM *number; 1199280304Sjkim void *any; 1200280304Sjkim } values[STORE_ATTR_TYPE_NUM + 1]; 1201280304Sjkim size_t value_sizes[STORE_ATTR_TYPE_NUM + 1]; 1202280304Sjkim}; 1203160814Ssimon 1204280304Sjkim#define ATTR_IS_SET(a,i) ((i) > 0 && (i) < STORE_ATTR_TYPE_NUM \ 1205280304Sjkim && ((a)->set[(i) / 8] & (1 << ((i) % 8)))) 1206280304Sjkim#define SET_ATTRBIT(a,i) ((a)->set[(i) / 8] |= (1 << ((i) % 8))) 1207280304Sjkim#define CLEAR_ATTRBIT(a,i) ((a)->set[(i) / 8] &= ~(1 << ((i) % 8))) 1208160814Ssimon 1209280304SjkimSTORE_ATTR_INFO *STORE_ATTR_INFO_new(void) 1210280304Sjkim{ 1211280304Sjkim return (STORE_ATTR_INFO *)OPENSSL_malloc(sizeof(STORE_ATTR_INFO)); 1212280304Sjkim} 1213160814Ssimon 1214160814Ssimonstatic void STORE_ATTR_INFO_attr_free(STORE_ATTR_INFO *attrs, 1215280304Sjkim STORE_ATTR_TYPES code) 1216280304Sjkim{ 1217280304Sjkim if (ATTR_IS_SET(attrs, code)) { 1218280304Sjkim switch (code) { 1219280304Sjkim case STORE_ATTR_FRIENDLYNAME: 1220280304Sjkim case STORE_ATTR_EMAIL: 1221280304Sjkim case STORE_ATTR_FILENAME: 1222280304Sjkim STORE_ATTR_INFO_modify_cstr(attrs, code, NULL, 0); 1223280304Sjkim break; 1224280304Sjkim case STORE_ATTR_KEYID: 1225280304Sjkim case STORE_ATTR_ISSUERKEYID: 1226280304Sjkim case STORE_ATTR_SUBJECTKEYID: 1227280304Sjkim case STORE_ATTR_ISSUERSERIALHASH: 1228280304Sjkim case STORE_ATTR_CERTHASH: 1229280304Sjkim STORE_ATTR_INFO_modify_sha1str(attrs, code, NULL, 0); 1230280304Sjkim break; 1231280304Sjkim case STORE_ATTR_ISSUER: 1232280304Sjkim case STORE_ATTR_SUBJECT: 1233280304Sjkim STORE_ATTR_INFO_modify_dn(attrs, code, NULL); 1234280304Sjkim break; 1235280304Sjkim case STORE_ATTR_SERIAL: 1236280304Sjkim STORE_ATTR_INFO_modify_number(attrs, code, NULL); 1237280304Sjkim break; 1238280304Sjkim default: 1239280304Sjkim break; 1240280304Sjkim } 1241280304Sjkim } 1242280304Sjkim} 1243280304Sjkim 1244160814Ssimonint STORE_ATTR_INFO_free(STORE_ATTR_INFO *attrs) 1245280304Sjkim{ 1246280304Sjkim if (attrs) { 1247280304Sjkim STORE_ATTR_TYPES i; 1248280304Sjkim for (i = 0; i++ < STORE_ATTR_TYPE_NUM;) 1249280304Sjkim STORE_ATTR_INFO_attr_free(attrs, i); 1250280304Sjkim OPENSSL_free(attrs); 1251280304Sjkim } 1252280304Sjkim return 1; 1253280304Sjkim} 1254280304Sjkim 1255160814Ssimonchar *STORE_ATTR_INFO_get0_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code) 1256280304Sjkim{ 1257280304Sjkim if (!attrs) { 1258280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_GET0_CSTR, 1259280304Sjkim ERR_R_PASSED_NULL_PARAMETER); 1260280304Sjkim return NULL; 1261280304Sjkim } 1262280304Sjkim if (ATTR_IS_SET(attrs, code)) 1263280304Sjkim return attrs->values[code].cstring; 1264280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_GET0_CSTR, STORE_R_NO_VALUE); 1265280304Sjkim return NULL; 1266280304Sjkim} 1267280304Sjkim 1268160814Ssimonunsigned char *STORE_ATTR_INFO_get0_sha1str(STORE_ATTR_INFO *attrs, 1269280304Sjkim STORE_ATTR_TYPES code) 1270280304Sjkim{ 1271280304Sjkim if (!attrs) { 1272280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_GET0_SHA1STR, 1273280304Sjkim ERR_R_PASSED_NULL_PARAMETER); 1274280304Sjkim return NULL; 1275280304Sjkim } 1276280304Sjkim if (ATTR_IS_SET(attrs, code)) 1277280304Sjkim return attrs->values[code].sha1string; 1278280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_GET0_SHA1STR, STORE_R_NO_VALUE); 1279280304Sjkim return NULL; 1280280304Sjkim} 1281280304Sjkim 1282280304SjkimX509_NAME *STORE_ATTR_INFO_get0_dn(STORE_ATTR_INFO *attrs, 1283280304Sjkim STORE_ATTR_TYPES code) 1284280304Sjkim{ 1285280304Sjkim if (!attrs) { 1286280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_GET0_DN, 1287280304Sjkim ERR_R_PASSED_NULL_PARAMETER); 1288280304Sjkim return NULL; 1289280304Sjkim } 1290280304Sjkim if (ATTR_IS_SET(attrs, code)) 1291280304Sjkim return attrs->values[code].dn; 1292280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_GET0_DN, STORE_R_NO_VALUE); 1293280304Sjkim return NULL; 1294280304Sjkim} 1295280304Sjkim 1296280304SjkimBIGNUM *STORE_ATTR_INFO_get0_number(STORE_ATTR_INFO *attrs, 1297280304Sjkim STORE_ATTR_TYPES code) 1298280304Sjkim{ 1299280304Sjkim if (!attrs) { 1300280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_GET0_NUMBER, 1301280304Sjkim ERR_R_PASSED_NULL_PARAMETER); 1302280304Sjkim return NULL; 1303280304Sjkim } 1304280304Sjkim if (ATTR_IS_SET(attrs, code)) 1305280304Sjkim return attrs->values[code].number; 1306280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_GET0_NUMBER, STORE_R_NO_VALUE); 1307280304Sjkim return NULL; 1308280304Sjkim} 1309280304Sjkim 1310160814Ssimonint STORE_ATTR_INFO_set_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, 1311280304Sjkim char *cstr, size_t cstr_size) 1312280304Sjkim{ 1313280304Sjkim if (!attrs) { 1314280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR, 1315280304Sjkim ERR_R_PASSED_NULL_PARAMETER); 1316280304Sjkim return 0; 1317280304Sjkim } 1318280304Sjkim if (!ATTR_IS_SET(attrs, code)) { 1319280304Sjkim if ((attrs->values[code].cstring = BUF_strndup(cstr, cstr_size))) 1320280304Sjkim return 1; 1321280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR, ERR_R_MALLOC_FAILURE); 1322280304Sjkim return 0; 1323280304Sjkim } 1324280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR, STORE_R_ALREADY_HAS_A_VALUE); 1325280304Sjkim return 0; 1326280304Sjkim} 1327280304Sjkim 1328160814Ssimonint STORE_ATTR_INFO_set_sha1str(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, 1329280304Sjkim unsigned char *sha1str, size_t sha1str_size) 1330280304Sjkim{ 1331280304Sjkim if (!attrs) { 1332280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR, 1333280304Sjkim ERR_R_PASSED_NULL_PARAMETER); 1334280304Sjkim return 0; 1335280304Sjkim } 1336280304Sjkim if (!ATTR_IS_SET(attrs, code)) { 1337280304Sjkim if ((attrs->values[code].sha1string = 1338280304Sjkim (unsigned char *)BUF_memdup(sha1str, sha1str_size))) 1339280304Sjkim return 1; 1340280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR, ERR_R_MALLOC_FAILURE); 1341280304Sjkim return 0; 1342280304Sjkim } 1343280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR, 1344280304Sjkim STORE_R_ALREADY_HAS_A_VALUE); 1345280304Sjkim return 0; 1346280304Sjkim} 1347280304Sjkim 1348160814Ssimonint STORE_ATTR_INFO_set_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, 1349280304Sjkim X509_NAME *dn) 1350280304Sjkim{ 1351280304Sjkim if (!attrs) { 1352280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN, ERR_R_PASSED_NULL_PARAMETER); 1353280304Sjkim return 0; 1354280304Sjkim } 1355280304Sjkim if (!ATTR_IS_SET(attrs, code)) { 1356280304Sjkim if ((attrs->values[code].dn = X509_NAME_dup(dn))) 1357280304Sjkim return 1; 1358280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN, ERR_R_MALLOC_FAILURE); 1359280304Sjkim return 0; 1360280304Sjkim } 1361280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN, STORE_R_ALREADY_HAS_A_VALUE); 1362280304Sjkim return 0; 1363280304Sjkim} 1364280304Sjkim 1365160814Ssimonint STORE_ATTR_INFO_set_number(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, 1366280304Sjkim BIGNUM *number) 1367280304Sjkim{ 1368280304Sjkim if (!attrs) { 1369280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER, 1370280304Sjkim ERR_R_PASSED_NULL_PARAMETER); 1371280304Sjkim return 0; 1372280304Sjkim } 1373280304Sjkim if (!ATTR_IS_SET(attrs, code)) { 1374280304Sjkim if ((attrs->values[code].number = BN_dup(number))) 1375280304Sjkim return 1; 1376280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER, ERR_R_MALLOC_FAILURE); 1377280304Sjkim return 0; 1378280304Sjkim } 1379280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER, STORE_R_ALREADY_HAS_A_VALUE); 1380280304Sjkim return 0; 1381280304Sjkim} 1382280304Sjkim 1383160814Ssimonint STORE_ATTR_INFO_modify_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, 1384280304Sjkim char *cstr, size_t cstr_size) 1385280304Sjkim{ 1386280304Sjkim if (!attrs) { 1387280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_CSTR, 1388280304Sjkim ERR_R_PASSED_NULL_PARAMETER); 1389280304Sjkim return 0; 1390280304Sjkim } 1391280304Sjkim if (ATTR_IS_SET(attrs, code)) { 1392280304Sjkim OPENSSL_free(attrs->values[code].cstring); 1393280304Sjkim attrs->values[code].cstring = NULL; 1394280304Sjkim CLEAR_ATTRBIT(attrs, code); 1395280304Sjkim } 1396280304Sjkim return STORE_ATTR_INFO_set_cstr(attrs, code, cstr, cstr_size); 1397280304Sjkim} 1398280304Sjkim 1399280304Sjkimint STORE_ATTR_INFO_modify_sha1str(STORE_ATTR_INFO *attrs, 1400280304Sjkim STORE_ATTR_TYPES code, 1401280304Sjkim unsigned char *sha1str, 1402280304Sjkim size_t sha1str_size) 1403280304Sjkim{ 1404280304Sjkim if (!attrs) { 1405280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_SHA1STR, 1406280304Sjkim ERR_R_PASSED_NULL_PARAMETER); 1407280304Sjkim return 0; 1408280304Sjkim } 1409280304Sjkim if (ATTR_IS_SET(attrs, code)) { 1410280304Sjkim OPENSSL_free(attrs->values[code].sha1string); 1411280304Sjkim attrs->values[code].sha1string = NULL; 1412280304Sjkim CLEAR_ATTRBIT(attrs, code); 1413280304Sjkim } 1414280304Sjkim return STORE_ATTR_INFO_set_sha1str(attrs, code, sha1str, sha1str_size); 1415280304Sjkim} 1416280304Sjkim 1417160814Ssimonint STORE_ATTR_INFO_modify_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, 1418280304Sjkim X509_NAME *dn) 1419280304Sjkim{ 1420280304Sjkim if (!attrs) { 1421280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_DN, 1422280304Sjkim ERR_R_PASSED_NULL_PARAMETER); 1423280304Sjkim return 0; 1424280304Sjkim } 1425280304Sjkim if (ATTR_IS_SET(attrs, code)) { 1426280304Sjkim OPENSSL_free(attrs->values[code].dn); 1427280304Sjkim attrs->values[code].dn = NULL; 1428280304Sjkim CLEAR_ATTRBIT(attrs, code); 1429280304Sjkim } 1430280304Sjkim return STORE_ATTR_INFO_set_dn(attrs, code, dn); 1431280304Sjkim} 1432160814Ssimon 1433280304Sjkimint STORE_ATTR_INFO_modify_number(STORE_ATTR_INFO *attrs, 1434280304Sjkim STORE_ATTR_TYPES code, BIGNUM *number) 1435280304Sjkim{ 1436280304Sjkim if (!attrs) { 1437280304Sjkim STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_NUMBER, 1438280304Sjkim ERR_R_PASSED_NULL_PARAMETER); 1439280304Sjkim return 0; 1440280304Sjkim } 1441280304Sjkim if (ATTR_IS_SET(attrs, code)) { 1442280304Sjkim OPENSSL_free(attrs->values[code].number); 1443280304Sjkim attrs->values[code].number = NULL; 1444280304Sjkim CLEAR_ATTRBIT(attrs, code); 1445280304Sjkim } 1446280304Sjkim return STORE_ATTR_INFO_set_number(attrs, code, number); 1447280304Sjkim} 1448280304Sjkim 1449280304Sjkimstruct attr_list_ctx_st { 1450280304Sjkim OPENSSL_ITEM *attributes; 1451280304Sjkim}; 1452160814Ssimonvoid *STORE_parse_attrs_start(OPENSSL_ITEM *attributes) 1453280304Sjkim{ 1454280304Sjkim if (attributes) { 1455280304Sjkim struct attr_list_ctx_st *context = (struct attr_list_ctx_st *) 1456280304Sjkim OPENSSL_malloc(sizeof(struct attr_list_ctx_st)); 1457280304Sjkim if (context) 1458280304Sjkim context->attributes = attributes; 1459280304Sjkim else 1460280304Sjkim STOREerr(STORE_F_STORE_PARSE_ATTRS_START, ERR_R_MALLOC_FAILURE); 1461280304Sjkim return context; 1462280304Sjkim } 1463280304Sjkim STOREerr(STORE_F_STORE_PARSE_ATTRS_START, ERR_R_PASSED_NULL_PARAMETER); 1464280304Sjkim return 0; 1465280304Sjkim} 1466280304Sjkim 1467160814SsimonSTORE_ATTR_INFO *STORE_parse_attrs_next(void *handle) 1468280304Sjkim{ 1469280304Sjkim struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle; 1470160814Ssimon 1471280304Sjkim if (context && context->attributes) { 1472280304Sjkim STORE_ATTR_INFO *attrs = NULL; 1473160814Ssimon 1474280304Sjkim while (context->attributes 1475280304Sjkim && context->attributes->code != STORE_ATTR_OR 1476280304Sjkim && context->attributes->code != STORE_ATTR_END) { 1477280304Sjkim switch (context->attributes->code) { 1478280304Sjkim case STORE_ATTR_FRIENDLYNAME: 1479280304Sjkim case STORE_ATTR_EMAIL: 1480280304Sjkim case STORE_ATTR_FILENAME: 1481280304Sjkim if (!attrs) 1482280304Sjkim attrs = STORE_ATTR_INFO_new(); 1483280304Sjkim if (attrs == NULL) { 1484280304Sjkim STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT, 1485280304Sjkim ERR_R_MALLOC_FAILURE); 1486280304Sjkim goto err; 1487280304Sjkim } 1488280304Sjkim STORE_ATTR_INFO_set_cstr(attrs, 1489280304Sjkim context->attributes->code, 1490280304Sjkim context->attributes->value, 1491280304Sjkim context->attributes->value_size); 1492280304Sjkim break; 1493280304Sjkim case STORE_ATTR_KEYID: 1494280304Sjkim case STORE_ATTR_ISSUERKEYID: 1495280304Sjkim case STORE_ATTR_SUBJECTKEYID: 1496280304Sjkim case STORE_ATTR_ISSUERSERIALHASH: 1497280304Sjkim case STORE_ATTR_CERTHASH: 1498280304Sjkim if (!attrs) 1499280304Sjkim attrs = STORE_ATTR_INFO_new(); 1500280304Sjkim if (attrs == NULL) { 1501280304Sjkim STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT, 1502280304Sjkim ERR_R_MALLOC_FAILURE); 1503280304Sjkim goto err; 1504280304Sjkim } 1505280304Sjkim STORE_ATTR_INFO_set_sha1str(attrs, 1506280304Sjkim context->attributes->code, 1507280304Sjkim context->attributes->value, 1508280304Sjkim context->attributes->value_size); 1509280304Sjkim break; 1510280304Sjkim case STORE_ATTR_ISSUER: 1511280304Sjkim case STORE_ATTR_SUBJECT: 1512280304Sjkim if (!attrs) 1513280304Sjkim attrs = STORE_ATTR_INFO_new(); 1514280304Sjkim if (attrs == NULL) { 1515280304Sjkim STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT, 1516280304Sjkim ERR_R_MALLOC_FAILURE); 1517280304Sjkim goto err; 1518280304Sjkim } 1519280304Sjkim STORE_ATTR_INFO_modify_dn(attrs, 1520280304Sjkim context->attributes->code, 1521280304Sjkim context->attributes->value); 1522280304Sjkim break; 1523280304Sjkim case STORE_ATTR_SERIAL: 1524280304Sjkim if (!attrs) 1525280304Sjkim attrs = STORE_ATTR_INFO_new(); 1526280304Sjkim if (attrs == NULL) { 1527280304Sjkim STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT, 1528280304Sjkim ERR_R_MALLOC_FAILURE); 1529280304Sjkim goto err; 1530280304Sjkim } 1531280304Sjkim STORE_ATTR_INFO_modify_number(attrs, 1532280304Sjkim context->attributes->code, 1533280304Sjkim context->attributes->value); 1534280304Sjkim break; 1535280304Sjkim } 1536280304Sjkim context->attributes++; 1537280304Sjkim } 1538280304Sjkim if (context->attributes->code == STORE_ATTR_OR) 1539280304Sjkim context->attributes++; 1540280304Sjkim return attrs; 1541280304Sjkim err: 1542280304Sjkim while (context->attributes 1543280304Sjkim && context->attributes->code != STORE_ATTR_OR 1544280304Sjkim && context->attributes->code != STORE_ATTR_END) 1545280304Sjkim context->attributes++; 1546280304Sjkim if (context->attributes->code == STORE_ATTR_OR) 1547280304Sjkim context->attributes++; 1548280304Sjkim return NULL; 1549280304Sjkim } 1550280304Sjkim STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT, ERR_R_PASSED_NULL_PARAMETER); 1551280304Sjkim return NULL; 1552280304Sjkim} 1553280304Sjkim 1554160814Ssimonint STORE_parse_attrs_end(void *handle) 1555280304Sjkim{ 1556280304Sjkim struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle; 1557160814Ssimon 1558280304Sjkim if (context && context->attributes) { 1559160814Ssimon#if 0 1560280304Sjkim OPENSSL_ITEM *attributes = context->attributes; 1561160814Ssimon#endif 1562280304Sjkim OPENSSL_free(context); 1563280304Sjkim return 1; 1564280304Sjkim } 1565280304Sjkim STOREerr(STORE_F_STORE_PARSE_ATTRS_END, ERR_R_PASSED_NULL_PARAMETER); 1566280304Sjkim return 0; 1567280304Sjkim} 1568160814Ssimon 1569160814Ssimonint STORE_parse_attrs_endp(void *handle) 1570280304Sjkim{ 1571280304Sjkim struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle; 1572160814Ssimon 1573280304Sjkim if (context && context->attributes) { 1574280304Sjkim return context->attributes->code == STORE_ATTR_END; 1575280304Sjkim } 1576280304Sjkim STOREerr(STORE_F_STORE_PARSE_ATTRS_ENDP, ERR_R_PASSED_NULL_PARAMETER); 1577280304Sjkim return 0; 1578280304Sjkim} 1579160814Ssimon 1580280304Sjkimstatic int attr_info_compare_compute_range(const unsigned char *abits, 1581280304Sjkim const unsigned char *bbits, 1582280304Sjkim unsigned int *alowp, 1583280304Sjkim unsigned int *ahighp, 1584280304Sjkim unsigned int *blowp, 1585280304Sjkim unsigned int *bhighp) 1586280304Sjkim{ 1587280304Sjkim unsigned int alow = (unsigned int)-1, ahigh = 0; 1588280304Sjkim unsigned int blow = (unsigned int)-1, bhigh = 0; 1589280304Sjkim int i, res = 0; 1590160814Ssimon 1591280304Sjkim for (i = 0; i < (STORE_ATTR_TYPE_NUM + 8) / 8; i++, abits++, bbits++) { 1592280304Sjkim if (res == 0) { 1593280304Sjkim if (*abits < *bbits) 1594280304Sjkim res = -1; 1595280304Sjkim if (*abits > *bbits) 1596280304Sjkim res = 1; 1597280304Sjkim } 1598280304Sjkim if (*abits) { 1599280304Sjkim if (alow == (unsigned int)-1) { 1600280304Sjkim alow = i * 8; 1601280304Sjkim if (!(*abits & 0x01)) 1602280304Sjkim alow++; 1603280304Sjkim if (!(*abits & 0x02)) 1604280304Sjkim alow++; 1605280304Sjkim if (!(*abits & 0x04)) 1606280304Sjkim alow++; 1607280304Sjkim if (!(*abits & 0x08)) 1608280304Sjkim alow++; 1609280304Sjkim if (!(*abits & 0x10)) 1610280304Sjkim alow++; 1611280304Sjkim if (!(*abits & 0x20)) 1612280304Sjkim alow++; 1613280304Sjkim if (!(*abits & 0x40)) 1614280304Sjkim alow++; 1615280304Sjkim } 1616280304Sjkim ahigh = i * 8 + 7; 1617280304Sjkim if (!(*abits & 0x80)) 1618280304Sjkim ahigh++; 1619280304Sjkim if (!(*abits & 0x40)) 1620280304Sjkim ahigh++; 1621280304Sjkim if (!(*abits & 0x20)) 1622280304Sjkim ahigh++; 1623280304Sjkim if (!(*abits & 0x10)) 1624280304Sjkim ahigh++; 1625280304Sjkim if (!(*abits & 0x08)) 1626280304Sjkim ahigh++; 1627280304Sjkim if (!(*abits & 0x04)) 1628280304Sjkim ahigh++; 1629280304Sjkim if (!(*abits & 0x02)) 1630280304Sjkim ahigh++; 1631280304Sjkim } 1632280304Sjkim if (*bbits) { 1633280304Sjkim if (blow == (unsigned int)-1) { 1634280304Sjkim blow = i * 8; 1635280304Sjkim if (!(*bbits & 0x01)) 1636280304Sjkim blow++; 1637280304Sjkim if (!(*bbits & 0x02)) 1638280304Sjkim blow++; 1639280304Sjkim if (!(*bbits & 0x04)) 1640280304Sjkim blow++; 1641280304Sjkim if (!(*bbits & 0x08)) 1642280304Sjkim blow++; 1643280304Sjkim if (!(*bbits & 0x10)) 1644280304Sjkim blow++; 1645280304Sjkim if (!(*bbits & 0x20)) 1646280304Sjkim blow++; 1647280304Sjkim if (!(*bbits & 0x40)) 1648280304Sjkim blow++; 1649280304Sjkim } 1650280304Sjkim bhigh = i * 8 + 7; 1651280304Sjkim if (!(*bbits & 0x80)) 1652280304Sjkim bhigh++; 1653280304Sjkim if (!(*bbits & 0x40)) 1654280304Sjkim bhigh++; 1655280304Sjkim if (!(*bbits & 0x20)) 1656280304Sjkim bhigh++; 1657280304Sjkim if (!(*bbits & 0x10)) 1658280304Sjkim bhigh++; 1659280304Sjkim if (!(*bbits & 0x08)) 1660280304Sjkim bhigh++; 1661280304Sjkim if (!(*bbits & 0x04)) 1662280304Sjkim bhigh++; 1663280304Sjkim if (!(*bbits & 0x02)) 1664280304Sjkim bhigh++; 1665280304Sjkim } 1666280304Sjkim } 1667280304Sjkim if (ahigh + alow < bhigh + blow) 1668280304Sjkim res = -1; 1669280304Sjkim if (ahigh + alow > bhigh + blow) 1670280304Sjkim res = 1; 1671280304Sjkim if (alowp) 1672280304Sjkim *alowp = alow; 1673280304Sjkim if (ahighp) 1674280304Sjkim *ahighp = ahigh; 1675280304Sjkim if (blowp) 1676280304Sjkim *blowp = blow; 1677280304Sjkim if (bhighp) 1678280304Sjkim *bhighp = bhigh; 1679280304Sjkim return res; 1680280304Sjkim} 1681160814Ssimon 1682280304Sjkimint STORE_ATTR_INFO_compare(const STORE_ATTR_INFO *const *a, 1683280304Sjkim const STORE_ATTR_INFO *const *b) 1684280304Sjkim{ 1685280304Sjkim if (a == b) 1686280304Sjkim return 0; 1687280304Sjkim if (!a) 1688280304Sjkim return -1; 1689280304Sjkim if (!b) 1690280304Sjkim return 1; 1691280304Sjkim return attr_info_compare_compute_range((*a)->set, (*b)->set, 0, 0, 0, 0); 1692280304Sjkim} 1693238405Sjkim 1694160814Ssimonint STORE_ATTR_INFO_in_range(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b) 1695280304Sjkim{ 1696280304Sjkim unsigned int alow, ahigh, blow, bhigh; 1697160814Ssimon 1698280304Sjkim if (a == b) 1699280304Sjkim return 1; 1700280304Sjkim if (!a) 1701280304Sjkim return 0; 1702280304Sjkim if (!b) 1703280304Sjkim return 0; 1704280304Sjkim attr_info_compare_compute_range(a->set, b->set, 1705280304Sjkim &alow, &ahigh, &blow, &bhigh); 1706280304Sjkim if (alow >= blow && ahigh <= bhigh) 1707280304Sjkim return 1; 1708280304Sjkim return 0; 1709280304Sjkim} 1710238405Sjkim 1711160814Ssimonint STORE_ATTR_INFO_in(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b) 1712280304Sjkim{ 1713280304Sjkim unsigned char *abits, *bbits; 1714280304Sjkim int i; 1715160814Ssimon 1716280304Sjkim if (a == b) 1717280304Sjkim return 1; 1718280304Sjkim if (!a) 1719280304Sjkim return 0; 1720280304Sjkim if (!b) 1721280304Sjkim return 0; 1722280304Sjkim abits = a->set; 1723280304Sjkim bbits = b->set; 1724280304Sjkim for (i = 0; i < (STORE_ATTR_TYPE_NUM + 8) / 8; i++, abits++, bbits++) { 1725280304Sjkim if (*abits && (*bbits & *abits) != *abits) 1726280304Sjkim return 0; 1727280304Sjkim } 1728280304Sjkim return 1; 1729280304Sjkim} 1730238405Sjkim 1731160814Ssimonint STORE_ATTR_INFO_in_ex(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b) 1732280304Sjkim{ 1733280304Sjkim STORE_ATTR_TYPES i; 1734160814Ssimon 1735280304Sjkim if (a == b) 1736280304Sjkim return 1; 1737280304Sjkim if (!STORE_ATTR_INFO_in(a, b)) 1738280304Sjkim return 0; 1739280304Sjkim for (i = 1; i < STORE_ATTR_TYPE_NUM; i++) 1740280304Sjkim if (ATTR_IS_SET(a, i)) { 1741280304Sjkim switch (i) { 1742280304Sjkim case STORE_ATTR_FRIENDLYNAME: 1743280304Sjkim case STORE_ATTR_EMAIL: 1744280304Sjkim case STORE_ATTR_FILENAME: 1745280304Sjkim if (strcmp(a->values[i].cstring, b->values[i].cstring)) 1746280304Sjkim return 0; 1747280304Sjkim break; 1748280304Sjkim case STORE_ATTR_KEYID: 1749280304Sjkim case STORE_ATTR_ISSUERKEYID: 1750280304Sjkim case STORE_ATTR_SUBJECTKEYID: 1751280304Sjkim case STORE_ATTR_ISSUERSERIALHASH: 1752280304Sjkim case STORE_ATTR_CERTHASH: 1753280304Sjkim if (memcmp(a->values[i].sha1string, 1754280304Sjkim b->values[i].sha1string, a->value_sizes[i])) 1755280304Sjkim return 0; 1756280304Sjkim break; 1757280304Sjkim case STORE_ATTR_ISSUER: 1758280304Sjkim case STORE_ATTR_SUBJECT: 1759280304Sjkim if (X509_NAME_cmp(a->values[i].dn, b->values[i].dn)) 1760280304Sjkim return 0; 1761280304Sjkim break; 1762280304Sjkim case STORE_ATTR_SERIAL: 1763280304Sjkim if (BN_cmp(a->values[i].number, b->values[i].number)) 1764280304Sjkim return 0; 1765280304Sjkim break; 1766280304Sjkim default: 1767280304Sjkim break; 1768280304Sjkim } 1769280304Sjkim } 1770160814Ssimon 1771280304Sjkim return 1; 1772280304Sjkim} 1773