Author: supun
Date: Tue Nov 13 02:15:01 2007
New Revision: 594466
URL: http://svn.apache.org/viewvc?rev=594466&view=rev
Log:
Applied the patch RAMPARTC-44
Modified:
webservices/rampart/trunk/c/include/oxs_sign_part.h
webservices/rampart/trunk/c/src/omxmlsec/sign_part.c
webservices/rampart/trunk/c/src/omxmlsec/transforms_factory.c
webservices/rampart/trunk/c/src/omxmlsec/xml_signature.c
Modified: webservices/rampart/trunk/c/include/oxs_sign_part.h
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/include/oxs_sign_part.h?rev=594466&r1=594465&r2=594466&view=diff
==============================================================================
--- webservices/rampart/trunk/c/include/oxs_sign_part.h (original)
+++ webservices/rampart/trunk/c/include/oxs_sign_part.h Tue Nov 13 02:15:01 2007
@@ -32,6 +32,7 @@
#include <axis2_defines.h>
#include <axutil_env.h>
#include <axiom_node.h>
+#include <axiom_namespace.h>
#ifdef __cplusplus
extern "C"
@@ -77,6 +78,17 @@
const oxs_sign_part_t *sign_part,
const axutil_env_t *env);
+ AXIS2_EXTERN axis2_char_t *AXIS2_CALL
+ oxs_sign_part_get_id_name(
+ const oxs_sign_part_t *sign_part,
+ const axutil_env_t *env);
+
+ AXIS2_EXTERN axiom_namespace_t *AXIS2_CALL
+ oxs_sign_part_get_sign_namespace(
+ const oxs_sign_part_t *sign_part,
+ const axutil_env_t *env);
+
+
/**********************Setter
functions******************************************/
AXIS2_EXTERN axis2_status_t AXIS2_CALL
oxs_sign_part_set_id(
@@ -108,7 +120,17 @@
const axutil_env_t *env,
axutil_array_list_t *transforms);
-
+ AXIS2_EXTERN axis2_status_t AXIS2_CALL
+ oxs_sign_part_set_id_name(
+ oxs_sign_part_t *sign_part,
+ const axutil_env_t *env,
+ axis2_char_t *id_name);
+
+ AXIS2_EXTERN axis2_status_t AXIS2_CALL
+ oxs_sign_part_set_sign_namespace(
+ oxs_sign_part_t *sign_part,
+ const axutil_env_t *env,
+ axiom_namespace_t *sig_ns);
/** @} */
#ifdef __cplusplus
Modified: webservices/rampart/trunk/c/src/omxmlsec/sign_part.c
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/omxmlsec/sign_part.c?rev=594466&r1=594465&r2=594466&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/omxmlsec/sign_part.c (original)
+++ webservices/rampart/trunk/c/src/omxmlsec/sign_part.c Tue Nov 13 02:15:01
2007
@@ -26,8 +26,11 @@
axis2_char_t *id;
axis2_char_t *digest_mtd;
axis2_char_t *digest_val;
+ axiom_namespace_t *sig_ns;
+ axis2_char_t *id_name;
axiom_node_t *node ; /*Shallow copies*/
axutil_array_list_t *transforms; /*Shallow copies*/
+
};
@@ -165,7 +168,8 @@
sign_part->digest_val = NULL;
sign_part->node = NULL;
sign_part->transforms = NULL;
-
+ sign_part->id_name = NULL;
+ sign_part->sig_ns = NULL;
return sign_part;
}
@@ -195,6 +199,18 @@
sign_part->digest_val = NULL;
}
+ if (sign_part->id_name)
+ {
+ AXIS2_FREE(env->allocator, sign_part->id_name);
+ sign_part->id_name = NULL;
+ }
+
+ if (sign_part->sig_ns)
+ {
+ axiom_namespace_free(sign_part->sig_ns, env);
+ sign_part->sig_ns = NULL;
+ }
+
sign_part->node = NULL;
if(sign_part->transforms){
@@ -219,5 +235,54 @@
return AXIS2_SUCCESS;
}
+
+
+AXIS2_EXTERN axis2_char_t *AXIS2_CALL
+oxs_sign_part_get_id_name(
+ const oxs_sign_part_t *sign_part,
+ const axutil_env_t *env)
+{
+ return sign_part->id_name;
+}
+
+AXIS2_EXTERN axiom_namespace_t *AXIS2_CALL
+oxs_sign_part_get_sign_namespace(
+ const oxs_sign_part_t *sign_part,
+ const axutil_env_t *env)
+{
+ return sign_part->sig_ns;
+}
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+oxs_sign_part_set_id_name(
+ oxs_sign_part_t *sign_part,
+ const axutil_env_t *env,
+ axis2_char_t *id_name)
+{
+ if (sign_part->id_name)
+ {
+ AXIS2_FREE(env->allocator, sign_part->id_name);
+ sign_part->id_name = NULL;
+ }
+ sign_part->id_name = axutil_strdup(env, id_name);
+ return AXIS2_SUCCESS;
+}
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+oxs_sign_part_set_sign_namespace(
+ oxs_sign_part_t *sign_part,
+ const axutil_env_t *env,
+ axiom_namespace_t *sig_ns)
+{
+ if (sign_part->sig_ns)
+ {
+ axiom_namespace_free(sign_part->sig_ns, env);
+ sign_part->sig_ns = NULL;
+ }
+ sign_part->sig_ns = sig_ns;
+ return AXIS2_SUCCESS;
+}
+
+
Modified: webservices/rampart/trunk/c/src/omxmlsec/transforms_factory.c
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/omxmlsec/transforms_factory.c?rev=594466&r1=594465&r2=594466&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/omxmlsec/transforms_factory.c (original)
+++ webservices/rampart/trunk/c/src/omxmlsec/transforms_factory.c Tue Nov 13
02:15:01 2007
@@ -51,6 +51,48 @@
return output_dtype;
}
+oxs_tr_dtype_t AXIS2_CALL
+oxs_transforms_enveloped_xmldsig(const axutil_env_t *env,
+ axiom_node_t *input,
+ oxs_tr_dtype_t input_dtype,
+ axis2_char_t **output)
+{
+ axiom_document_t *doc = NULL;
+ axis2_char_t *algo = NULL;
+ axis2_char_t *c14nized = NULL;
+ oxs_tr_dtype_t output_dtype = OXS_TRANSFORM_TYPE_UNKNOWN;
+ axiom_node_t *sig_node = NULL, *child_node = NULL;
+
+ child_node = axiom_node_get_first_element(input, env);
+
+ while(child_node)
+ {
+ axis2_char_t *node_local_name = NULL;
+ node_local_name = axiom_util_get_localname(child_node, env);
+ if(!(axutil_strcmp(node_local_name, OXS_NODE_SIGNATURE)))
+ {
+ sig_node = axiom_node_detach(child_node, env);
+ break;
+ }
+ child_node = axiom_node_get_next_sibling(child_node, env);
+ }
+
+ if(input_dtype != OXS_TRANSFORM_TYPE_NODE){
+ oxs_error(env, ERROR_LOCATION, OXS_ERROR_TRANSFORM_FAILED,"Transform
expects a NODE.");
+ return OXS_TRANSFORM_TYPE_UNKNOWN;
+ }
+
+ doc = axiom_node_get_document(input, env);
+ algo = OXS_HREF_TRANSFORM_XML_EXC_C14N;
+ oxs_c14n_apply_algo(env, doc, &c14nized, NULL, input, algo);
+ AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "[rampart][c14n-OutPut]
is\n\n%s\n\n",c14nized);
+
+ axiom_node_add_child(input, env, sig_node);
+
+ *output= c14nized;
+ output_dtype = OXS_TRANSFORM_TYPE_CHAR;
+ return output_dtype;
+}
/*Public functions*/
AXIS2_EXTERN oxs_transform_t *AXIS2_CALL
oxs_transforms_factory_produce_transform(const axutil_env_t *env,
@@ -66,9 +108,17 @@
oxs_transform_set_output_data_type(tr, env, OXS_TRANSFORM_TYPE_CHAR);
oxs_transform_set_transform_func(tr, env,
(oxs_transform_tr_func)oxs_transforms_exc_c14n);
return tr;
- }else{
- /*Error we do not support*/
- return NULL;
+
+ }else if(0== axutil_strcmp(id, OXS_HREF_TRANSFORM_ENVELOPED_SIGNATURE)){
+ tr = oxs_transform_create(env);
+ oxs_transform_set_id(tr, env, id);
+ oxs_transform_set_input_data_type(tr, env, OXS_TRANSFORM_TYPE_NODE);
+ oxs_transform_set_output_data_type(tr, env, OXS_TRANSFORM_TYPE_CHAR);
+ oxs_transform_set_transform_func(tr, env,
(oxs_transform_tr_func)oxs_transforms_enveloped_xmldsig);
+ return tr;
}
+ else
+ return NULL;
}
+
Modified: webservices/rampart/trunk/c/src/omxmlsec/xml_signature.c
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/omxmlsec/xml_signature.c?rev=594466&r1=594465&r2=594466&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/omxmlsec/xml_signature.c (original)
+++ webservices/rampart/trunk/c/src/omxmlsec/xml_signature.c Tue Nov 13
02:15:01 2007
@@ -132,6 +132,8 @@
axis2_char_t *digest_mtd = NULL;
axis2_char_t *ref_id = NULL;
axis2_char_t *id = NULL;
+ axiom_namespace_t *ns = NULL;
+ axis2_char_t *ns_uri = NULL;
axutil_array_list_t *transforms = NULL;
axiom_node_t *node = NULL;
axiom_node_t *reference_node = NULL;
@@ -142,8 +144,14 @@
/*Get the node to digest*/
node = oxs_sign_part_get_node(sign_part, env);
+ ns = oxs_sign_part_get_sign_namespace(sign_part, env);
+ if(ns)
+ ns_uri = axiom_namespace_get_uri(ns, env);
+ else
+ ns_uri = "";
/*Get the reference ID from the node and hence to the ds:Reference node*/
- id = oxs_axiom_get_attribute_value_of_node_by_name(env, node, "Id",
OXS_WSU_XMLNS);
+ id = oxs_axiom_get_attribute_value_of_node_by_name(env, node,
oxs_sign_part_get_id_name(sign_part, env),
+
ns_uri);
ref_id = axutil_stracat(env, "#", id);/* <ds:Reference URI="#id">*/
reference_node = oxs_token_build_ds_reference_element(env, parent ,NULL,
ref_id, NULL);
@@ -289,7 +297,7 @@
}
/*At this point we have a complete <SignedInfo> node. Now we need to sign
it*/
status = oxs_xml_sig_sign_signed_info(env, signature_node,
signed_info_node, sign_ctx);
-
+ sig_id = axiom_node_to_string(parent, env);
*sig_node = signature_node;
return status;
}
@@ -309,14 +317,72 @@
axiom_node_t *reffed_node = NULL;
axiom_node_t *child_node = NULL;
+ axiom_node_t *next_node = NULL;
+ axis2_char_t *id_name = NULL;
+ axiom_namespace_t *ns = NULL;
+ axis2_char_t *ns_uri = NULL;
+ axiom_attribute_t *attr = NULL;
+ axutil_hash_t *attr_hash = NULL;
+ axutil_hash_index_t *hi = NULL;
+ axiom_element_t *element = NULL;
+
ref_id = oxs_token_get_ds_reference(env, ref_node);
oxs_sign_part_set_id(sign_part, env, ref_id);
-
+
/*Remove the # from the id*/
ref_id2 = axutil_string_substring_starting_at(axutil_strdup(env, ref_id),
1);
-
+ next_node = scope_node;
+ /*Look for the attribute with the Reference URI value*/
+ while(next_node)
+ {
+ element = axiom_node_get_data_element(next_node, env);
+ if(element)
+ attr_hash = axiom_element_get_all_attributes(element,
env);
+
+ for (hi = axutil_hash_first(attr_hash, env); hi; hi =
axutil_hash_next(env, hi))
+ {
+ void *v = NULL;
+ axutil_hash_this(hi, NULL, NULL, &v);
+ if (v)
+ {
+ axis2_char_t *attr_val = NULL;
+ axiom_attribute_t *attribute =
(axiom_attribute_t*)v;
+ attr_val = axiom_attribute_get_value(attribute,
env);
+ if(!axutil_strcmp(attr_val, ref_id2))
+ {
+ attr = attribute;
+ break;
+ }
+ }
+ }
+ if(!attr && (scope_node == next_node))
+ next_node = axiom_node_get_first_element(scope_node,
env); /* Check the Id in child nodes*/
+ else if(!attr)
+ next_node = axiom_node_get_next_sibling(next_node, env);
+ else
+ break;
+
+ }
+
+ if(attr)
+ {
+ oxs_sign_part_set_id_name(sign_part, env,
axiom_attribute_get_localname(attr, env));
+ ns = axiom_attribute_get_namespace(attr, env);
+ }
+ else
+ return AXIS2_FAILURE;
/*Find the node refered by this ref_id2 and set to the sign part*/
- reffed_node = oxs_axiom_get_node_by_id(env, scope_node, "Id", ref_id2,
OXS_WSU_XMLNS );
+ if(ns)
+ ns_uri = axiom_namespace_get_uri(ns, env, ns);
+ else
+ ns_uri = "";
+
+ if((id_name = oxs_sign_part_get_id_name(sign_part, env)))
+ reffed_node = oxs_axiom_get_node_by_id(env, scope_node,
+ id_name, ref_id2, ns_uri);
+ else
+ return AXIS2_FAILURE;
+
if(reffed_node){
oxs_sign_part_set_node(sign_part, env, reffed_node);
}else{