Author: milinda
Date: Wed Jun 11 03:42:46 2008
New Revision: 666614
URL: http://svn.apache.org/viewvc?rev=666614&view=rev
Log:
Adding multiple client handling support using PKCS12 Key Store and adding
support for ceating PKCS12 key store from character buffer.
Modified:
webservices/rampart/trunk/c/include/openssl_pkcs12.h
webservices/rampart/trunk/c/include/openssl_pkcs12_keystore.h
webservices/rampart/trunk/c/include/oxs_key_mgr.h
webservices/rampart/trunk/c/include/rampart_context.h
webservices/rampart/trunk/c/src/omxmlsec/asym_ctx.c
webservices/rampart/trunk/c/src/omxmlsec/key_mgr.c
webservices/rampart/trunk/c/src/omxmlsec/openssl/pkcs12.c
webservices/rampart/trunk/c/src/omxmlsec/openssl/pkcs12_keystore.c
webservices/rampart/trunk/c/src/omxmlsec/sign_ctx.c
webservices/rampart/trunk/c/src/util/rampart_context.c
webservices/rampart/trunk/c/src/util/rampart_encryption.c
webservices/rampart/trunk/c/src/util/rampart_engine.c
webservices/rampart/trunk/c/src/util/rampart_sec_header_processor.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=666614&r1=666613&r2=666614&view=diff
==============================================================================
--- webservices/rampart/trunk/c/include/openssl_pkcs12.h (original)
+++ webservices/rampart/trunk/c/include/openssl_pkcs12.h Wed Jun 11 03:42:46
2008
@@ -49,7 +49,8 @@
AXIS2_EXTERN axis2_status_t AXIS2_CALL
openssl_pkcs12_load_from_buffer(const axutil_env_t *env,
axis2_char_t *buffer,
- PKCS12 **p12);
+ PKCS12 **p12,
+ int len);
/*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=666614&r1=666613&r2=666614&view=diff
==============================================================================
--- webservices/rampart/trunk/c/include/openssl_pkcs12_keystore.h (original)
+++ webservices/rampart/trunk/c/include/openssl_pkcs12_keystore.h Wed Jun 11
03:42:46 2008
@@ -50,12 +50,6 @@
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);
@@ -88,10 +82,18 @@
const axutil_env_t *env,
axis2_char_t *ski);
- AXIS2_EXTERN oxs_x509_cert_t * AXIS2_CALL
+ AXIS2_EXTERN oxs_x509_cert_t * AXIS2_CALL
pkcs12_keystore_get_other_certificate(
pkcs12_keystore_t *keystore,
const axutil_env_t *env);
+
+ 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,
+ int len);
+
#ifdef __cplusplus
Modified: webservices/rampart/trunk/c/include/oxs_key_mgr.h
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/include/oxs_key_mgr.h?rev=666614&r1=666613&r2=666614&view=diff
==============================================================================
--- webservices/rampart/trunk/c/include/oxs_key_mgr.h (original)
+++ webservices/rampart/trunk/c/include/oxs_key_mgr.h Wed Jun 11 03:42:46 2008
@@ -318,11 +318,31 @@
oxs_key_mgr_t *key_mgr,
const axutil_env_t *env);
+ AXIS2_EXTERN oxs_x509_cert_t * AXIS2_CALL
+ oxs_key_mgr_get_receiver_certificate_from_ski(
+ oxs_key_mgr_t *key_mgr,
+ const axutil_env_t *env,
+ axis2_char_t *ski);
+
+ AXIS2_EXTERN oxs_x509_cert_t * AXIS2_CALL
+ oxs_key_mgr_get_receiver_certificate_from_issuer_serial(
+ oxs_key_mgr_t *key_mgr,
+ const axutil_env_t *env,
+ axis2_char_t *issuer,
+ int serial);
+
+ AXIS2_EXTERN int AXIS2_CALL
+ oxs_key_mgr_get_key_store_buff_len(
+ oxs_key_mgr_t *key_mgr,
+ const axutil_env_t *env);
+
AXIS2_EXTERN axis2_status_t AXIS2_CALL
oxs_key_mgr_set_key_store_buff(
oxs_key_mgr_t *key_mgr,
const axutil_env_t *env,
- void *key_store_buf);
+ void *key_store_buf,
+ int len);
+
/** @} */
#ifdef __cplusplus
Modified: webservices/rampart/trunk/c/include/rampart_context.h
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/include/rampart_context.h?rev=666614&r1=666613&r2=666614&view=diff
==============================================================================
--- webservices/rampart/trunk/c/include/rampart_context.h (original)
+++ webservices/rampart/trunk/c/include/rampart_context.h Wed Jun 11 03:42:46
2008
@@ -1443,10 +1443,11 @@
* AXIS2_SUCCESS on success and AXIS2_FAILURE on error
*/
- AXIS2_EXTERN axis2_status_t AXIS2_CALL
- rampart_context_set_saml_tokens(rampart_context_t *rampart_context,
- const axutil_env_t *env,
- axutil_array_list_t *tokens);
+ AXIS2_EXTERN axis2_status_t AXIS2_CALL
+ rampart_context_set_saml_tokens(
+ rampart_context_t *rampart_context,
+ const axutil_env_t *env,
+ axutil_array_list_t *tokens);
/**
*
* @param rampart_context
@@ -1455,10 +1456,10 @@
* AXIS2_SUCCESS on success and AXIS2_FAILURE on error
*/
- AXIS2_EXTERN issued_token_callback_func AXIS2_CALL
- rampart_context_get_issued_token_aquire_function(
-
rampart_context_t *rampart_context,
- const
axutil_env_t *env);
+ AXIS2_EXTERN issued_token_callback_func AXIS2_CALL
+ rampart_context_get_issued_token_aquire_function(
+ rampart_context_t *rampart_context,
+ const axutil_env_t *env);
/**
*
* @param rampart_context
@@ -1468,11 +1469,11 @@
* AXIS2_SUCCESS on success and AXIS2_FAILURE on error
*/
- AXIS2_EXTERN axis2_status_t AXIS2_CALL
- rampart_context_set_issued_token_aquire_function(
-
rampart_context_t *rampart_context,
- const
axutil_env_t *env,
-
issued_token_callback_func issued_token_aquire);
+ AXIS2_EXTERN axis2_status_t AXIS2_CALL
+ rampart_context_set_issued_token_aquire_function(
+ rampart_context_t *rampart_context,
+ const axutil_env_t *env,
+ issued_token_callback_func issued_token_aquire);
/**
*
* @param rampart_context
@@ -1509,17 +1510,37 @@
rampart_context_get_algorithmsuite(
rampart_context_t *rampart_context,
const axutil_env_t *env);
-
- AXIS2_EXTERN oxs_key_mgr_t * AXIS2_CALL
+
+ /**
+ * Get the key manager from rampart context.
+ * @param rampart_context Pointer to rampart context struct.
+ * @param Pointer to environment struct
+ * @returns pointer Key manager struct
+ */
+ AXIS2_EXTERN oxs_key_mgr_t * AXIS2_CALL
rampart_context_get_key_mgr(
rampart_context_t *rampart_context,
const axutil_env_t *env);
+ /**
+ * Set the key manager to rampart context.
+ * @param rampart_context Pointer to rampart context struct.
+ * @param Pointer to environment struct
+ * @param key_mgr Pointer to key manager struct.
+ * @returns status of the operation. AXIS2_SUCCESS on success
AXIS2_FAILURE otherwise.
+ */
AXIS2_EXTERN axis2_status_t AXIS2_CALL
- rampart_context_set_key_mgr(rampart_context_t *rampart_context,
- const axutil_env_t
*env,
- oxs_key_mgr_t *key_mgr);
+ rampart_context_set_key_mgr(
+ rampart_context_t *rampart_context,
+ const axutil_env_t *env,
+ oxs_key_mgr_t *key_mgr);
+ /**
+ * Get the pkcs12 file name from rampart context.
+ * @param rampart_context Pointer to rampart context struct.
+ * @param Pointer to environment struct
+ * @returns PKCS12 file name
+ */
AXIS2_EXTERN axis2_char_t *AXIS2_CALL
rampart_context_get_pkcs12_file_name(
rampart_context_t *rampart_context,
@@ -1550,22 +1571,77 @@
rampart_context_get_custom_tokens(rampart_context_t *rampart_context,
const axutil_env_t *env);
- AXIS2_EXTERN axis2_char_t *AXIS2_CALL
- rampart_context_get_receiver_certificate_file(
- rampart_context_t *rampart_context,
- const axutil_env_t *env);
-
-
- AXIS2_EXTERN void * AXIS2_CALL
- rampart_context_get_key_store_buff(
- rampart_context_t *rampart_context,
- const axutil_env_t *env);
-
- 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);
+ /**
+ * Get the receiver certificate file name from rampart context.
+ * @param rampart_context Pointer to rampart context struct.
+ * @param env Pointer to environment struct
+ * @returns Receiver certificate file name
+ */
+ AXIS2_EXTERN axis2_char_t *AXIS2_CALL
+ rampart_context_get_receiver_certificate_file(
+ rampart_context_t *rampart_context,
+ const axutil_env_t *env);
+
+ /**
+ * Get the found_cert_in_shp from rampart context.
+ * @param rampart_context Pointer to rampart context struct.
+ * @param env Pointer to environment struct
+ * @returns axis2_bool_t
+ */
+ AXIS2_EXTERN axis2_bool_t AXIS2_CALL
+ rampart_context_get_found_cert_in_shp(
+ rampart_context_t *rampart_context,
+ const axutil_env_t *env);
+
+ /**
+ * Set the certificate found status to rampart context.
+ * @param rampart_context Pointer to rampart context struct.
+ * @param env Pointer to environment struct
+ * @param found_cert_in_shp boolean value which specify the certificate
found status
+ * @returns status of the operation
+ */
+ AXIS2_EXTERN axis2_status_t AXIS2_CALL
+ rampart_context_set_found_cert_in_shp(
+ rampart_context_t *rampart_context,
+ const axutil_env_t *env,
+ axis2_bool_t found_cert_in_shp);
+
+ /**
+ * Get the certificate found in shp from rampart context.
+ * @param rampart_context Pointer to rampart context struct.
+ * @param env Pointer to environment struct
+ * @returns oxs_x509_cert_t Client certificate found when processing sec
header, otherwise NULL
+ */
+ AXIS2_EXTERN oxs_x509_cert_t *AXIS2_CALL
+ rampart_context_get_receiver_cert_found_in_shp(
+ rampart_context_t *rampart_context,
+ const axutil_env_t *env);
+
+ /**
+ * Set the found_cert_in_shp to rampart context.
+ * @param rampart_context Pointer to rampart context struct.
+ * @param env Pointer to environment struct
+ * @param cert pointer to the certficate
+ * @returns status of the operation
+ */
+ AXIS2_EXTERN axis2_status_t AXIS2_CALL
+ rampart_context_set_receiver_cert_found_in_shp(
+ rampart_context_t *rampart_context,
+ const axutil_env_t *env,
+ oxs_x509_cert_t *cert);
+
+ AXIS2_EXTERN void * AXIS2_CALL
+ rampart_context_get_key_store_buff(
+ rampart_context_t *rampart_context,
+ const axutil_env_t *env);
+
+ 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,
+ int length);
+
#ifdef __cplusplus
}
#endif
Modified: webservices/rampart/trunk/c/src/omxmlsec/asym_ctx.c
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/omxmlsec/asym_ctx.c?rev=666614&r1=666613&r2=666614&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/omxmlsec/asym_ctx.c (original)
+++ webservices/rampart/trunk/c/src/omxmlsec/asym_ctx.c Wed Jun 11 03:42:46 2008
@@ -75,12 +75,18 @@
AXIS2_FREE(env->allocator, asym_ctx->st_ref_pattern);
asym_ctx->st_ref_pattern = NULL;
}
-
- if (asym_ctx->certificate)
+
+ /**
+ * in current impleemtnation we set the certificate found in the signature
processing
+ * to rampart context. Because of that rampart context must free the cert.
But have to
+ * fix the free logic when we use certificate directly from file.
+ */
+
+ /*if (asym_ctx->certificate)
{
oxs_x509_cert_free(asym_ctx->certificate, env);
asym_ctx->certificate = NULL;
- }
+ }*/
if (asym_ctx->private_key)
{
Modified: webservices/rampart/trunk/c/src/omxmlsec/key_mgr.c
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/omxmlsec/key_mgr.c?rev=666614&r1=666613&r2=666614&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/omxmlsec/key_mgr.c (original)
+++ webservices/rampart/trunk/c/src/omxmlsec/key_mgr.c Wed Jun 11 03:42:46 2008
@@ -58,6 +58,8 @@
pkcs12_keystore_t *key_store;
void *pkcs12_buf;
+
+ int pkcs12_buff_len;
/* Buffer holding keys and certs */
void *pem_buf;
@@ -105,7 +107,7 @@
oxs_x509_cert_free(key_mgr->receiver_certificate, env);
key_mgr->receiver_certificate = NULL;
}
- AXIS2_FREE(env->allocator, key_mgr);
+ AXIS2_FREE(env->allocator, key_mgr);
return AXIS2_SUCCESS;
}
@@ -910,16 +912,52 @@
return key_mgr->pkcs12_buf;
}
+AXIS2_EXTERN int AXIS2_CALL
+oxs_key_mgr_get_key_store_buff_len(
+ oxs_key_mgr_t *key_mgr,
+ const axutil_env_t *env)
+{
+ return key_mgr->pkcs12_buff_len;
+}
+
AXIS2_EXTERN axis2_status_t AXIS2_CALL
oxs_key_mgr_set_key_store_buff(
oxs_key_mgr_t *key_mgr,
const axutil_env_t *env,
- void *key_store_buf)
+ void *key_store_buf,
+ int len)
{
AXIS2_PARAM_CHECK(env->error, key_store_buf, AXIS2_FAILURE);
key_mgr->pkcs12_buf = key_store_buf;
+ key_mgr->pkcs12_buff_len = len;
return AXIS2_SUCCESS;
}
+
+AXIS2_EXTERN oxs_x509_cert_t * AXIS2_CALL
+oxs_key_mgr_get_receiver_certificate_from_ski(
+ oxs_key_mgr_t *key_mgr,
+ const axutil_env_t *env,
+ axis2_char_t *ski)
+{
+ AXIS2_PARAM_CHECK(env->error, ski, NULL);
+
+ return
pkcs12_keystore_get_certificate_for_subject_key_id(key_mgr->key_store, env,
ski);
+}
+
+AXIS2_EXTERN oxs_x509_cert_t * AXIS2_CALL
+oxs_key_mgr_get_receiver_certificate_from_issuer_serial(
+ oxs_key_mgr_t *key_mgr,
+ const axutil_env_t *env,
+ axis2_char_t *issuer,
+ int serial)
+{
+ AXIS2_PARAM_CHECK(env->error, issuer, NULL);
+ AXIS2_PARAM_CHECK(env->error, serial, NULL)
+
+ return
pkcs12_keystore_get_certificate_for_issuer_serial(key_mgr->key_store, env,
issuer, serial);
+}
+
+
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=666614&r1=666613&r2=666614&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/omxmlsec/openssl/pkcs12.c (original)
+++ webservices/rampart/trunk/c/src/omxmlsec/openssl/pkcs12.c Wed Jun 11
03:42:46 2008
@@ -52,19 +52,18 @@
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
-openssl_pkcs12_load_from_buffer(const axutil_env_t *env,
- axis2_char_t *buffer,
- PKCS12 **p12)
+openssl_pkcs12_load_from_buffer(
+ const axutil_env_t *env,
+ axis2_char_t *buffer,
+ PKCS12 **p12,
+ int len)
{
- 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!");
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=666614&r1=666613&r2=666614&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/omxmlsec/openssl/pkcs12_keystore.c
(original)
+++ webservices/rampart/trunk/c/src/omxmlsec/openssl/pkcs12_keystore.c Wed Jun
11 03:42:46 2008
@@ -80,7 +80,8 @@
pkcs12_keystore_create_from_buffer(
const axutil_env_t *env,
axis2_char_t *buffer,
- axis2_char_t *password)
+ axis2_char_t *password,
+ int len)
{
pkcs12_keystore_t *keystore = NULL;
EVP_PKEY *pvt_key = NULL;
@@ -100,7 +101,7 @@
keystore->cert = NULL;
keystore->pvt_key = NULL;
- if (!openssl_pkcs12_load_from_buffer(env, buffer, &keystore->keystore)) {
+ if (!openssl_pkcs12_load_from_buffer(env, buffer, &keystore->keystore,
len)) {
oxs_error(env, OXS_ERROR_LOCATION, OXS_ERROR_DEFAULT,
"Error loading pkcs12 keystore from file");
return NULL;
Modified: webservices/rampart/trunk/c/src/omxmlsec/sign_ctx.c
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/omxmlsec/sign_ctx.c?rev=666614&r1=666613&r2=666614&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/omxmlsec/sign_ctx.c (original)
+++ webservices/rampart/trunk/c/src/omxmlsec/sign_ctx.c Wed Jun 11 03:42:46 2008
@@ -332,10 +332,17 @@
sign_ctx->sign_parts = NULL;
}
+ /**
+ * in current impleemtnation we set the certificate found in the signature
processing
+ * to rampart context. Because of that rampart context must free the cert.
But have to
+ * fix the free logic when we use certificate directly from file.
+ */
+ /*
if(sign_ctx->certificate){
oxs_x509_cert_free(sign_ctx->certificate, env);
sign_ctx->certificate = NULL;
- }
+ }*/
+
sign_ctx->operation = OXS_SIGN_OPERATION_NONE;
AXIS2_FREE(env->allocator, sign_ctx);
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=666614&r1=666613&r2=666614&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/util/rampart_context.c (original)
+++ webservices/rampart/trunk/c/src/util/rampart_context.c Wed Jun 11 03:42:46
2008
@@ -73,6 +73,11 @@
/*This is used in callback functions.*/
void *ctx;
+ /* Used to store and track whether we found the clients certificate while
processing
+ * the security headers key info element. found_cert_in_shp is used to
track the status.
+ */
+ axis2_bool_t found_cert_in_shp;
+ oxs_x509_cert_t *receiver_cert;
};
/*void rampart_context_set_callback_fn(axutil_env_t *env,
@@ -194,6 +199,9 @@
rampart_context->key_list = axutil_array_list_create(env, 2);
rampart_context->key_mgr = oxs_key_mgr_create(env);
+ rampart_context->found_cert_in_shp = AXIS2_FALSE;
+ rampart_context->receiver_cert = NULL;
+
return rampart_context;
}
@@ -323,6 +331,13 @@
axutil_array_list_free(rampart_context->custom_tokens, env);
rampart_context->custom_tokens = NULL;
}
+
+ /* Free receiver certificate we found when processing incoming
security header */
+ if(rampart_context->receiver_cert &&
rampart_context->found_cert_in_shp)
+ {
+ oxs_x509_cert_free(rampart_context->receiver_cert, env);
+ rampart_context->receiver_cert = NULL;
+ }
AXIS2_FREE(env->allocator,rampart_context);
rampart_context = NULL;
@@ -2955,12 +2970,57 @@
rampart_context_set_key_store_buff(
rampart_context_t *rampart_context,
const axutil_env_t *env,
- void *key_store_buf)
+ void *key_store_buf,
+ int len)
{
AXIS2_PARAM_CHECK(env->error, key_store_buf, AXIS2_FAILURE);
- oxs_key_mgr_set_key_store_buff(rampart_context->key_mgr, env,
key_store_buf);
+ oxs_key_mgr_set_key_store_buff(rampart_context->key_mgr, env,
key_store_buf, len);
return AXIS2_SUCCESS;
}
+AXIS2_EXTERN axis2_bool_t AXIS2_CALL
+rampart_context_get_found_cert_in_shp(
+ rampart_context_t *rampart_context,
+ const axutil_env_t *env)
+{
+ return rampart_context->found_cert_in_shp;
+}
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+rampart_context_set_found_cert_in_shp(
+ rampart_context_t *rampart_context,
+ const axutil_env_t *env,
+ axis2_bool_t found_cert_in_shp)
+{
+ rampart_context->found_cert_in_shp = found_cert_in_shp;
+ return AXIS2_SUCCESS;
+}
+
+/* This certificate is set to rampart context when we process the incoming
security header
+ * with key info
+ */
+AXIS2_EXTERN oxs_x509_cert_t *AXIS2_CALL
+rampart_context_get_receiver_cert_found_in_shp(
+ rampart_context_t *rampart_context,
+ const axutil_env_t *env)
+{
+ return rampart_context->receiver_cert;
+}
+
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+rampart_context_set_receiver_cert_found_in_shp(
+ rampart_context_t *rampart_context,
+ const axutil_env_t *env,
+ oxs_x509_cert_t *cert)
+{
+ AXIS2_PARAM_CHECK(env->error, cert, AXIS2_FAILURE);
+
+ rampart_context->receiver_cert = cert;
+
+ return AXIS2_SUCCESS;
+}
+
+
Modified: webservices/rampart/trunk/c/src/util/rampart_encryption.c
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/util/rampart_encryption.c?rev=666614&r1=666613&r2=666614&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/util/rampart_encryption.c (original)
+++ webservices/rampart/trunk/c/src/util/rampart_encryption.c Wed Jun 11
03:42:46 2008
@@ -122,14 +122,21 @@
/*Create asymmetric encryption context*/
asym_ctx = oxs_asym_ctx_create(env);
oxs_asym_ctx_set_algorithm(asym_ctx, env, enc_asym_algo);
- certificate = oxs_key_mgr_get_receiver_certificate(key_mgr, env);
- if (!certificate)
- {
- AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
- "[rampart][rampart_encryption] Receiver certificate
cannot be loaded.");
- return AXIS2_FAILURE;
- }
- oxs_asym_ctx_set_certificate(asym_ctx, env, certificate);
+ if(rampart_context_get_found_cert_in_shp(rampart_context, env))
+ {
+ certificate =
rampart_context_get_receiver_cert_found_in_shp(rampart_context, env);
+ }
+ else
+ {
+ certificate = oxs_key_mgr_get_receiver_certificate(key_mgr, env);
+ }
+ if (!certificate)
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+ "[rampart][rampart_encryption] Receiver certificate cannot
be loaded.");
+ return AXIS2_FAILURE;
+ }
+ oxs_asym_ctx_set_certificate(asym_ctx, env, certificate);
oxs_asym_ctx_set_operation(asym_ctx, env,
OXS_ASYM_CTX_OPERATION_PUB_ENCRYPT);
oxs_asym_ctx_set_st_ref_pattern(asym_ctx, env, eki);
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=666614&r1=666613&r2=666614&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/util/rampart_engine.c (original)
+++ webservices/rampart/trunk/c/src/util/rampart_engine.c Wed Jun 11 03:42:46
2008
@@ -247,7 +247,8 @@
}
else if(pkcs12_password && (pkcs12_buf =
(axis2_char_t*)rampart_context_get_key_store_buff(rampart_context, env)))
{
- key_store = pkcs12_keystore_create_from_buffer(env, pkcs12_buf,
password);
+ key_store = pkcs12_keystore_create_from_buffer(env, pkcs12_buf,
password,
+ oxs_key_mgr_get_key_store_buff_len(key_mgr, env));
if(!key_store)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
Modified: webservices/rampart/trunk/c/src/util/rampart_sec_header_processor.c
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/util/rampart_sec_header_processor.c?rev=666614&r1=666613&r2=666614&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/util/rampart_sec_header_processor.c
(original)
+++ webservices/rampart/trunk/c/src/util/rampart_sec_header_processor.c Wed Jun
11 03:42:46 2008
@@ -26,6 +26,7 @@
#include <rampart_handler_util.h>
#include <rampart_token_processor.h>
#include <rampart_policy_validator.h>
+#include <oxs_constants.h>
#include <oxs_ctx.h>
#include <oxs_error.h>
#include <oxs_utility.h>
@@ -76,6 +77,127 @@
return AXIS2_SUCCESS;
}
+/* Get the client certificaate from key manager by giving
+ * subject key identifier
+ */
+static oxs_x509_cert_t * get_certificate_by_key_identifier(
+ const axutil_env_t *env,
+ rampart_context_t *rampart_ctx,
+ axiom_node_t *key_id_node)
+{
+ oxs_x509_cert_t *cert = NULL;
+ axis2_char_t *value_type = NULL;
+ axiom_element_t *key_id_element = NULL;
+ axis2_char_t *ski = NULL;
+ oxs_key_mgr_t *key_mgr = NULL;
+
+ if(rampart_context_get_receiver_certificate_file(rampart_ctx, env))
+ {
+ /* In the client side, it is prefered to use certificate files instead
+ * of key store, because one client normally interact with only one
+ * service. To handle this scenario, if we found reciever certificate
file
+ * specified in rampart_context we directly call the
get_reciever_certificate.
+ */
+ return rampart_context_get_receiver_certificate(rampart_ctx, env);
+ }
+
+ key_id_element = axiom_node_get_data_element(key_id_node, env);
+ value_type = axiom_element_get_attribute_value_by_name(key_id_element,
env, "ValueType");
+
+ key_mgr = rampart_context_get_key_mgr(rampart_ctx, env);
+ if(strcmp(value_type, OXS_X509_SUBJ_KI) == 0)
+ {
+ ski = axiom_element_get_text(key_id_element, env, key_id_node);
+ cert = oxs_key_mgr_get_receiver_certificate_from_ski(key_mgr, env,
ski);
+ }
+ else
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+ "[rampart][shp] Other KeyIdentifier ValueTypes are
not supported.");
+ return NULL;
+ }
+
+ return cert;
+}
+
+/* Get the client certificaate from key manager by giving
+ * issuer and serial number of the certificate
+ */
+static oxs_x509_cert_t * get_certificate_by_issuer_serial(
+ const axutil_env_t *env,
+ rampart_context_t *rampart_ctx,
+ axiom_node_t *x509_data_node)
+{
+ oxs_x509_cert_t *cert = NULL;
+ axiom_node_t *issuer_serial_node = NULL;
+ axiom_element_t *issuer_serial_ele = NULL;
+ axiom_child_element_iterator_t *child_itr = NULL;
+ axiom_node_t *child_node = NULL;
+ axiom_element_t *child_ele = NULL;
+ axis2_char_t *ele_name = NULL;
+ axis2_char_t *issuer_name_str = NULL;
+ axis2_char_t *serial_num_str = NULL;
+ int serial_num = -1;
+ oxs_key_mgr_t *key_mgr = NULL;
+
+ if(rampart_context_get_receiver_certificate_file(rampart_ctx, env))
+ {
+ /* In the client side, it is prefered to use certificate files instead
+ * of key store, because one client normally interact with only one
+ * service. To handle this scenario, if we found reciever certificate
file
+ * specified in rampart_context we directly call the
get_reciever_certificate.
+ */
+ return rampart_context_get_receiver_certificate(rampart_ctx, env);
+ }
+
+ issuer_serial_node = axiom_node_get_first_child(x509_data_node, env);
+ issuer_serial_ele = axiom_node_get_data_element(issuer_serial_node, env);
+
+ child_itr = axiom_element_get_child_elements(issuer_serial_ele, env,
issuer_serial_node);
+ while(axiom_child_element_iterator_has_next(child_itr, env))
+ {
+ child_node = axiom_child_element_iterator_next(child_itr,env);
+ child_ele = axiom_node_get_data_element(child_node, env);
+ ele_name = axiom_element_get_localname(child_ele, env);
+ if(axutil_strcmp(ele_name, OXS_NODE_X509_ISSUER_NAME) == 0)
+ {
+ issuer_name_str = axiom_element_get_text(child_ele, env,
child_node);
+ if(!issuer_name_str)
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+ "[rampart][shp]Issuer Name cannot be NULL.");
+ return NULL;
+ }
+ AXIS2_LOG_INFO(env->log, AXIS2_LOG_SI,
+ "[rampart][shp]X509 Certificate Issuer Name Found: %s",
issuer_name_str);
+ }
+ else if(axutil_strcmp(ele_name, OXS_NODE_X509_SERIAL_NUMBER) == 0)
+ {
+ serial_num_str = axiom_element_get_text(child_ele, env,
child_node);
+ if(!serial_num_str)
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+ "[rampart][shp]Serial number cannot be null.");
+ }
+ AXIS2_LOG_INFO(env->log, AXIS2_LOG_SI,
+ "[rampart][shp]X509 Certificate Serial Number Found: %s",
serial_num_str);
+ }
+ else
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+ "[rampart][shp]Error in incoming key info. These types not
supported: %", ele_name);
+ return NULL;
+ }
+ }
+
+ serial_num = atoi(serial_num_str);
+ key_mgr = rampart_context_get_key_mgr(rampart_ctx, env);
+
+ cert = oxs_key_mgr_get_receiver_certificate_from_issuer_serial(key_mgr,
env, issuer_name_str, serial_num);
+
+ return cert;
+}
+
static void
rampart_shp_store_token_id(const axutil_env_t *env,
axiom_node_t *key_info_node,
@@ -284,7 +406,7 @@
key = rampart_saml_token_get_session_key(saml, env);
if (!key)
{
- key = saml_assertion_get_session_key(env,
assertion,
+ key = saml_assertion_get_session_key(env,
assertion,
pvt_key);
rampart_saml_token_set_session_key(saml, env,
key);
oxs_key_set_name(key, env, "for-algo");
@@ -414,12 +536,12 @@
return AXIS2_FALSE;
}
-static oxs_x509_cert_t *get_receiver_x509_cert(
+/*static oxs_x509_cert_t *get_receiver_x509_cert(
const axutil_env_t *env,
rampart_context_t *rampart_context)
{
return rampart_context_get_receiver_certificate(rampart_context, env);
-}
+}*/
static axis2_status_t
rampart_shp_process_signature_confirmation(const axutil_env_t *env,
@@ -1198,6 +1320,16 @@
if(str_node)
{
+ /* A <wsse:SecurityTokenReference> element MAY reference an X.509
token type
+ * by one of the following means:
+ * - Reference to a Subject Key Identifier (<wsse:KeyIdentifier>)
+ * - Reference to a Binary Security Token (<wsse:Reference> element
that
+ * references a local <wsse:BinarySecurityToken> element or a
remote data
+ * source that contains the token data itself)
+ * - Reference to an Issuer and Serial Number (<ds:X509Data> element
that
+ * contains a <ds:X509IssuerSerial> element that uniquely
identifies an
+ * end entity certificate)
+ */
str_child_node = axiom_node_get_first_element(str_node,env);
if(str_child_node)
{
@@ -1206,6 +1338,9 @@
{
if(is_include_token)
{
+ /* The <wsse:Reference> element is used to reference
+ * an X.509 security token value by means of a URI
reference.
+ */
if(axutil_strcmp(str_child_name, OXS_NODE_REFERENCE)!=0)
{
rampart_create_fault_envelope(env,
RAMPART_FAULT_INVALID_SECURITY,
@@ -1217,6 +1352,22 @@
}
cert = oxs_x509_cert_create(env);
status = rampart_token_process_direct_ref(env,
str_child_node, sec_node, cert);
+ if(status == AXIS2_FAILURE)
+ {
+ rampart_create_fault_envelope(env,
RAMPART_FAULT_INVALID_SECURITY,
+ "Processing Direct
Reference Failed .", RAMPART_FAULT_IN_SIGNATURE, msg_ctx);
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+ "[Rampart][shp]Processing Direct
Reference Failed.");
+ return AXIS2_FAILURE;
+ }
+ status =
rampart_context_set_found_cert_in_shp(rampart_context, env, AXIS2_TRUE);
+ if(status == AXIS2_FAILURE)
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+ "[Rampart][shp]Setting Certificate
into rmapart context failed.");
+ return AXIS2_FAILURE;
+ }
+ status =
rampart_context_set_receiver_cert_found_in_shp(rampart_context, env, cert);
}
else
{
@@ -1233,6 +1384,22 @@
}
cert = oxs_x509_cert_create(env);
status = rampart_token_process_embedded(env,
str_child_node, cert);
+ if(status == AXIS2_FAILURE)
+ {
+ rampart_create_fault_envelope(env,
RAMPART_FAULT_INVALID_SECURITY,
+ "Processing Embedded
Token Failed .", RAMPART_FAULT_IN_SIGNATURE, msg_ctx);
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+ "[Rampart][shp]Processing Embedded
Token Failed.");
+ return AXIS2_FAILURE;
+ }
+ status =
rampart_context_set_found_cert_in_shp(rampart_context, env, AXIS2_TRUE);
+ if(status == AXIS2_FAILURE)
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+ "[Rampart][shp]Setting Certificate
into rmapart context failed.");
+ return AXIS2_FAILURE;
+ }
+ status =
rampart_context_set_receiver_cert_found_in_shp(rampart_context, env, cert);
}
else if(0 == axutil_strcmp(str_child_name,
OXS_NODE_KEY_IDENTIFIER))
{
@@ -1245,11 +1412,25 @@
"[Rampart][shp]Key Reference Info
mismatch (%s, %s)", str_child_name, OXS_NODE_KEY_IDENTIFIER);
return AXIS2_FAILURE;
}
- cert = get_receiver_x509_cert(env, rampart_context);
+ cert = get_certificate_by_key_identifier(env,
rampart_context, str_child_node);
+ if(!cert)
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+ "[Rampart][shp]Couldn't find a
certificate which matched given key information.");
+ return AXIS2_FAILURE;
+ }
+
+ rampart_context_set_found_cert_in_shp(rampart_context,
env, AXIS2_TRUE);
+
rampart_context_set_receiver_cert_found_in_shp(rampart_context, env, cert);
status = AXIS2_SUCCESS;
}
else if(0 == axutil_strcmp(str_child_name,
OXS_NODE_X509_DATA))
{
+ /* The <ds:X509IssuerSerial> element is used to
specify
+ * a reference to an X.509 security token by means of
+ * the certificate issuer name and serial number.
+ */
+
if(!rampart_context_is_key_identifier_type_supported(
rampart_context, token,
RAMPART_STR_ISSUER_SERIAL, env))
{
@@ -1259,7 +1440,16 @@
"[Rampart][shp]Key Reference Info
mismatch (%s, %s)", str_child_name, OXS_NODE_X509_DATA);
return AXIS2_FAILURE;
}
- cert = get_receiver_x509_cert(env,rampart_context);
+ cert = get_certificate_by_issuer_serial(env,
rampart_context, str_child_node);
+ if(!cert)
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+ "[Rampart][shp]Couldn't find a
certificate which matched given key information.");
+ return AXIS2_FAILURE;
+ }
+
+ rampart_context_set_found_cert_in_shp(rampart_context,
env, AXIS2_TRUE);
+
rampart_context_set_receiver_cert_found_in_shp(rampart_context, env, cert);
status = AXIS2_SUCCESS;
}
else
@@ -1573,11 +1763,11 @@
axis2_char_t *sub_conf = NULL;
server_side = axis2_msg_ctx_get_server_side(msg_ctx, env);
- if (AXIS2_FAILURE == rampart_saml_token_validate(env, rampart_context,
saml_node))
- {
- AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
- "[rampart][shp] SAML Signature Verification Failed");
- return AXIS2_FAILURE;
+ if (AXIS2_FAILURE == rampart_saml_token_validate(env, rampart_context,
saml_node))
+ {
+ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+ "[rampart][shp] SAML Signature Verification Failed");
+ return AXIS2_FAILURE;
}
sub_conf = rampart_saml_token_get_subject_confirmation(env, saml_node);
if (sub_conf && axutil_strcmp(sub_conf,
SAML_SUB_CONFIRMATION_SENDER_VOUCHES) == 0)