Author: milinda Date: Tue Jun 10 01:24:25 2008 New Revision: 666005 URL: http://svn.apache.org/viewvc?rev=666005&view=rev Log: Modifying PKCS12 Key Store creation logic and added support to load PKCS12 from buffer.
Modified: webservices/rampart/trunk/c/include/openssl_pkcs12.h webservices/rampart/trunk/c/include/openssl_pkcs12_keystore.h webservices/rampart/trunk/c/src/omxmlsec/openssl/pkcs12.c webservices/rampart/trunk/c/src/omxmlsec/openssl/pkcs12_keystore.c webservices/rampart/trunk/c/src/util/ (props changed) webservices/rampart/trunk/c/src/util/rampart_context.c webservices/rampart/trunk/c/src/util/rampart_engine.c Modified: webservices/rampart/trunk/c/include/openssl_pkcs12.h URL: http://svn.apache.org/viewvc/webservices/rampart/trunk/c/include/openssl_pkcs12.h?rev=666005&r1=666004&r2=666005&view=diff ============================================================================== --- webservices/rampart/trunk/c/include/openssl_pkcs12.h (original) +++ webservices/rampart/trunk/c/include/openssl_pkcs12.h Tue Jun 10 01:24:25 2008 @@ -45,6 +45,11 @@ openssl_pkcs12_load(const axutil_env_t *env, axis2_char_t *filename, PKCS12 **p12); + + AXIS2_EXTERN axis2_status_t AXIS2_CALL + openssl_pkcs12_load_from_buffer(const axutil_env_t *env, + axis2_char_t *buffer, + PKCS12 **p12); /*Parse*/ AXIS2_EXTERN axis2_status_t AXIS2_CALL Modified: webservices/rampart/trunk/c/include/openssl_pkcs12_keystore.h URL: http://svn.apache.org/viewvc/webservices/rampart/trunk/c/include/openssl_pkcs12_keystore.h?rev=666005&r1=666004&r2=666005&view=diff ============================================================================== --- webservices/rampart/trunk/c/include/openssl_pkcs12_keystore.h (original) +++ webservices/rampart/trunk/c/include/openssl_pkcs12_keystore.h Tue Jun 10 01:24:25 2008 @@ -50,6 +50,12 @@ axis2_char_t *filename, axis2_char_t *password); + AXIS2_EXTERN pkcs12_keystore_t * AXIS2_CALL + pkcs12_keystore_create_from_buffer( + const axutil_env_t *env, + axis2_char_t *buffer, + axis2_char_t *password); + axutil_array_list_t * AXIS2_CALL pkcs12_keystore_populate_cert_array( const axutil_env_t *env, STACK_OF(X509) *other_certs); Modified: webservices/rampart/trunk/c/src/omxmlsec/openssl/pkcs12.c URL: http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/omxmlsec/openssl/pkcs12.c?rev=666005&r1=666004&r2=666005&view=diff ============================================================================== --- webservices/rampart/trunk/c/src/omxmlsec/openssl/pkcs12.c (original) +++ webservices/rampart/trunk/c/src/omxmlsec/openssl/pkcs12.c Tue Jun 10 01:24:25 2008 @@ -52,6 +52,55 @@ } AXIS2_EXTERN axis2_status_t AXIS2_CALL +openssl_pkcs12_load_from_buffer(const axutil_env_t *env, + axis2_char_t *buffer, + PKCS12 **p12) +{ + int len = 0; + BIO *in = NULL; + BUF_MEM* bm = NULL; + + SSLeay_add_all_algorithms(); + ERR_load_crypto_strings(); + + len = axutil_strlen(buffer); + + if (!(in = BIO_new(BIO_s_mem()))) + { + oxs_error(env, OXS_ERROR_LOCATION, OXS_ERROR_CREATION_FAILED, "Memory allocation error!"); + return AXIS2_FAILURE; + } + if (!(bm = BUF_MEM_new())) + { + oxs_error(env, OXS_ERROR_LOCATION, OXS_ERROR_CREATION_FAILED, "Memory allocation error!"); + return AXIS2_FAILURE; + } + if (!BUF_MEM_grow(bm, len)) + { + oxs_error(env, OXS_ERROR_LOCATION, OXS_ERROR_CREATION_FAILED, "Memory allocation error!"); + return AXIS2_FAILURE; + } + memcpy(bm->data, buffer, len); + BIO_set_mem_buf(in, bm, 0 /*not used*/); + /*if (!(in = BIO_new_mem_buf((unsigned char*)buffer, len))) { + fprintf(stderr, "Error creating pkcs12 from buffer."); + return AXIS2_FAILURE; + }*/ + /*Load pkcs store*/ + *p12 = d2i_PKCS12_bio(in, NULL); + + + if (!p12) { + fprintf(stderr, "Error reading PKCS#12 from buffer: %s\n", buffer); + ERR_print_errors_fp(stderr); + return AXIS2_FAILURE; + } + BIO_free(in); + return AXIS2_SUCCESS; + +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL openssl_pkcs12_parse(const axutil_env_t *env, axis2_char_t *password , PKCS12 *p12, Modified: webservices/rampart/trunk/c/src/omxmlsec/openssl/pkcs12_keystore.c URL: http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/omxmlsec/openssl/pkcs12_keystore.c?rev=666005&r1=666004&r2=666005&view=diff ============================================================================== --- webservices/rampart/trunk/c/src/omxmlsec/openssl/pkcs12_keystore.c (original) +++ webservices/rampart/trunk/c/src/omxmlsec/openssl/pkcs12_keystore.c Tue Jun 10 01:24:25 2008 @@ -27,7 +27,8 @@ openssl_pkey_t *pvt_key; }; -AXIS2_EXTERN pkcs12_keystore_t * AXIS2_CALL pkcs12_keystore_create( +AXIS2_EXTERN pkcs12_keystore_t * AXIS2_CALL +pkcs12_keystore_create( const axutil_env_t *env, axis2_char_t *filename, axis2_char_t *password) @@ -75,6 +76,55 @@ return keystore; } +AXIS2_EXTERN pkcs12_keystore_t * AXIS2_CALL +pkcs12_keystore_create_from_buffer( + const axutil_env_t *env, + axis2_char_t *buffer, + axis2_char_t *password) +{ + pkcs12_keystore_t *keystore = NULL; + EVP_PKEY *pvt_key = NULL; + SSLeay_add_all_algorithms(); + ERR_load_crypto_strings(); + + keystore = (pkcs12_keystore_t*) AXIS2_MALLOC(env->allocator, sizeof (pkcs12_keystore_t)); + if (!keystore) { + oxs_error(env, OXS_ERROR_LOCATION, OXS_ERROR_CREATION_FAILED, "Memory allocation error!"); + return NULL; + } + + keystore->keystore_file = NULL; + keystore->keystore_password = password; + keystore->other_certs = NULL; + keystore->keystore = NULL; + keystore->cert = NULL; + keystore->pvt_key = NULL; + + if (!openssl_pkcs12_load_from_buffer(env, buffer, &keystore->keystore)) { + oxs_error(env, OXS_ERROR_LOCATION, OXS_ERROR_DEFAULT, + "Error loading pkcs12 keystore from file"); + return NULL; + } + + if (!openssl_pkcs12_parse( + env, + keystore->keystore_password, + keystore->keystore, + &pvt_key, + &keystore->cert, + &keystore->other_certs)) { + oxs_error(env, OXS_ERROR_LOCATION, OXS_ERROR_CREATION_FAILED, "PKCS12 Key Store Parsing failed."); + AXIS2_FREE(env->allocator, keystore); + return NULL; + } + /* We only populate this since openssl_pkey_t is ref counted. */ + if (pvt_key) { + keystore->pvt_key = openssl_pkey_create(env); + openssl_pkey_populate(keystore->pvt_key, env, pvt_key, (axis2_char_t*) keystore->keystore_file, OPENSSL_PKEY_TYPE_PRIVATE_KEY); + } + return keystore; +} + axutil_array_list_t * AXIS2_CALL pkcs12_keystore_populate_cert_array( const axutil_env_t *env, STACK_OF(X509) * other_certs) Propchange: webservices/rampart/trunk/c/src/util/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Tue Jun 10 01:24:25 2008 @@ -0,0 +1,2 @@ +.deps +.libs Modified: webservices/rampart/trunk/c/src/util/rampart_context.c URL: http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/util/rampart_context.c?rev=666005&r1=666004&r2=666005&view=diff ============================================================================== --- webservices/rampart/trunk/c/src/util/rampart_context.c (original) +++ webservices/rampart/trunk/c/src/util/rampart_context.c Tue Jun 10 01:24:25 2008 @@ -40,7 +40,8 @@ int ttl; axis2_char_t *rd_val; int ref; - oxs_key_mgr_t *key_mgr; + oxs_key_mgr_t *key_mgr; + void *key_store_buf; /****************************/ /* Set true when the issued token is aquired and set to the rampart conext*/ issued_token_callback_func aquire_issued_token; @@ -189,7 +190,8 @@ rampart_context->signature_token_id = NULL; rampart_context->key_list = axutil_array_list_create(env, 2); - rampart_context->key_mgr = oxs_key_mgr_create(env); + rampart_context->key_mgr = oxs_key_mgr_create(env); + rampart_context->key_store_buf = NULL; return rampart_context; } @@ -2939,3 +2941,22 @@ return rampart_context->key_mgr; } +AXIS2_EXTERN void * AXIS2_CALL +rampart_context_get_key_store_buff( + rampart_context_t *rampart_context, + const axutil_env_t *env) +{ + return rampart_context->key_store_buf; +} + +AXIS2_EXTERN axis2_status_t AXIS2_CALL +rampart_context_set_key_store_buff( + rampart_context_t *rampart_context, + const axutil_env_t *env, + void *key_store_buf) +{ + AXIS2_PARAM_CHECK(env->error, key_store_buf, AXIS2_FAILURE); + AXIS2_LOG_INFO(env->log, AXIS2_LOG_SI, "[rampart][rampart_context] Seting key store buff."); + rampart_context->key_store_buf = key_store_buf; + return AXIS2_SUCCESS; +} Modified: webservices/rampart/trunk/c/src/util/rampart_engine.c URL: http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/util/rampart_engine.c?rev=666005&r1=666004&r2=666005&view=diff ============================================================================== --- webservices/rampart/trunk/c/src/util/rampart_engine.c (original) +++ webservices/rampart/trunk/c/src/util/rampart_engine.c Tue Jun 10 01:24:25 2008 @@ -189,59 +189,71 @@ rampart_context_free(rampart_context, env); rampart_context = NULL; return NULL; - } - /* Retrieve the password for obtaining private keys */ - enc_user = rampart_context_get_encryption_user(rampart_context, env); - if(!enc_user) + } + + rampart_engine_retrieve_key_mgr_prop_from_policy(rampart_context, env); + } + + key_mgr = rampart_context_get_key_mgr(rampart_context, env); + if (!key_mgr) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, + "[rampart][engine] Key mgr creation failed."); + return NULL; + } + + /* Retrieve the password for obtaining private keys */ + enc_user = rampart_context_get_encryption_user(rampart_context, env); + if(!enc_user) + { + enc_user = rampart_context_get_user(rampart_context, env); + } + if(enc_user) + { + password_function = rampart_context_get_pwcb_function(rampart_context, env); + if(password_function) { - enc_user = rampart_context_get_user(rampart_context, env); + password = (*password_function)(env, enc_user, param); + pkcs12_password = password; } - if(enc_user) + else { - password_function = rampart_context_get_pwcb_function(rampart_context, env); - if(password_function) + password_callback = rampart_context_get_password_callback( + rampart_context, env); + if(password_callback) { - password = (*password_function)(env, enc_user, param); + password = rampart_callback_password(env, password_callback, enc_user); + if((pkcs12_file = rampart_context_get_pkcs12_file_name(rampart_context, env))) + { + pkcs12_password = rampart_callback_pkcs12_password(env, password_callback, enc_user); + } } else { - password_callback = rampart_context_get_password_callback( - rampart_context, env); - if(password_callback) - { - password = rampart_callback_password(env, password_callback, enc_user); - if((pkcs12_file = rampart_context_get_pkcs12_file_name(rampart_context, env))) - { - pkcs12_password = rampart_callback_pkcs12_password(env, password_callback, enc_user); - key_store = pkcs12_keystore_create(env, pkcs12_file, pkcs12_password); - if(!key_store) - { - AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, - "[rampart][engine] PKCS12 KeyStore creation failed."); - return NULL; - } - } - } + password = rampart_context_get_password(rampart_context, env); + pkcs12_password = password; } - } - - key_mgr = rampart_context_get_key_mgr(rampart_context, env); - if (!key_mgr) - { - AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, - "[rampart][engine] Key mgr creation failed."); - return NULL; - } - + } + } + + if(pkcs12_file) + { + key_store = pkcs12_keystore_create(env, pkcs12_file, pkcs12_password); + if(!key_store) + { + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, + "[rampart][engine] PKCS12 KeyStore creation failed."); + return NULL; + } + oxs_key_mgr_set_key_store(key_mgr, env, key_store); - - if (password) - { - oxs_key_mgr_set_prv_key_password(key_mgr, env, password); - } - rampart_engine_retrieve_key_mgr_prop_from_policy(rampart_context, env); - } + if (password) + { + oxs_key_mgr_set_prv_key_password(key_mgr, env, password); + } + } + property = axutil_property_create_with_args(env, AXIS2_SCOPE_REQUEST , AXIS2_TRUE, (void *)rampart_context_free, rampart_context); axis2_msg_ctx_set_property(msg_ctx, env, RAMPART_CONTEXT, property);