Author: supun
Date: Thu Apr 17 22:58:09 2008
New Revision: 649377

URL: http://svn.apache.org/viewvc?rev=649377&view=rev
Log:
Fixed issue RAMPARTC-89

Modified:
    webservices/rampart/trunk/c/include/saml.h
    webservices/rampart/trunk/c/src/omxmlsec/saml/assertion.c
    webservices/rampart/trunk/c/src/omxmlsec/saml/attr_stmt.c
    webservices/rampart/trunk/c/src/omxmlsec/saml/sutil.c
    webservices/rampart/trunk/c/src/omxmlsec/xml_signature.c
    webservices/rampart/trunk/c/src/util/rampart_saml.c

Modified: webservices/rampart/trunk/c/include/saml.h
URL: 
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/include/saml.h?rev=649377&r1=649376&r2=649377&view=diff
==============================================================================
--- webservices/rampart/trunk/c/include/saml.h (original)
+++ webservices/rampart/trunk/c/include/saml.h Thu Apr 17 22:58:09 2008
@@ -613,8 +613,8 @@
  * @param env pointer to environment struct
  */
 AXIS2_EXTERN int AXIS2_CALL
-saml_assertion_sign(saml_assertion_t *assertion, axutil_env_t *env, 
-                                       oxs_sign_ctx_t *sign_ctx, axiom_node_t 
**node);
+saml_assertion_sign(saml_assertion_t *assertion, 
+                                       axiom_node_t *node, axutil_env_t *env);
 
 /* 
  * Remove the information set for signing or verifying the assertion.

Modified: webservices/rampart/trunk/c/src/omxmlsec/saml/assertion.c
URL: 
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/omxmlsec/saml/assertion.c?rev=649377&r1=649376&r2=649377&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/omxmlsec/saml/assertion.c (original)
+++ webservices/rampart/trunk/c/src/omxmlsec/saml/assertion.c Thu Apr 17 
22:58:09 2008
@@ -34,6 +34,8 @@
                assertion->issuer = NULL;
                assertion->issue_instant = NULL;
                assertion->signature = NULL;
+               assertion->sign_ctx = NULL;
+               assertion->ori_xml = NULL;
        }
        return assertion;
 }
@@ -42,6 +44,8 @@
 saml_assertion_free(saml_assertion_t *assertion, axutil_env_t *env)
 {      
        int i = 0, size = 0;
+
+       
        if (assertion->major_version)
        {
                AXIS2_FREE(env->allocator, assertion->major_version);
@@ -78,7 +82,7 @@
                size = axutil_array_list_size(assertion->conditions, env);
                for (i = 0; i < size; i++)
                {
-                       cond = axutil_array_list_get(assertion->conditions, 
env, i);
+                       cond = 
(saml_condition_t*)axutil_array_list_get(assertion->conditions, env, i);
                        if (cond)
                        {
                                saml_condition_free(cond, env);
@@ -307,14 +311,15 @@
                                }
                        }               
                }
-               if (assertion->signature)
+               /*if (assertion->signature)
                {
                                                                                
                                                                        
-               }
-               /*if (assertion->sign_ctx)
-               {
-                       oxs_xml_sig_sign(env, assertion->sign_ctx, n, 
&assertion->signature); 
                }*/
+               if (assertion->sign_ctx)
+               {
+                       //oxs_xml_sig_sign(env, assertion->sign_ctx, n, 
&assertion->signature); 
+                       saml_assertion_sign(assertion, n, env);
+               }
        }       
        return n;
 }
@@ -551,7 +556,7 @@
 }
 
 AXIS2_EXTERN int AXIS2_CALL
-saml_assertion_sign(saml_assertion_t *a, axutil_env_t *env, oxs_sign_ctx_t 
*sign_ctx, axiom_node_t **node)
+saml_assertion_sign(saml_assertion_t *a, axiom_node_t *node, axutil_env_t *env)
 {
         axiom_node_t *n= NULL;
         oxs_sign_part_t* sig_part = NULL;
@@ -567,12 +572,12 @@
                        sig_part = axutil_array_list_get(sig_parts, env, i);
                        if(sig_part)
                        {
-                               oxs_sign_part_set_node(sig_part, env, *node);
+                               oxs_sign_part_set_node(sig_part, env, node);
                        }
                 }
         }
 
-        oxs_xml_sig_sign(env, a->sign_ctx, *node, &n);
+        oxs_xml_sig_sign(env, a->sign_ctx, node, &n);
      /*Finally build KeyInfo*/
         oxs_xml_key_info_build(env, n, 
oxs_sign_ctx_get_certificate(a->sign_ctx, env), 
OXS_KIBP_X509DATA_X509CERTIFICATE);
         return AXIS2_SUCCESS;

Modified: webservices/rampart/trunk/c/src/omxmlsec/saml/attr_stmt.c
URL: 
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/omxmlsec/saml/attr_stmt.c?rev=649377&r1=649376&r2=649377&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/omxmlsec/saml/attr_stmt.c (original)
+++ webservices/rampart/trunk/c/src/omxmlsec/saml/attr_stmt.c Thu Apr 17 
22:58:09 2008
@@ -204,10 +204,10 @@
         axutil_hash_this(hi, NULL, NULL, &v);
                if (v)
                {
-                       axis2_char_t *attr_val = NULL;
+                       axis2_char_t *attr_local_name = NULL;
                        axiom_attribute_t *attr = (axiom_attribute_t*)v;        
                
-                       attr_val = axiom_attribute_get_value(attr, env);        
                
-                       if (0 != axutil_strcmp(attr_val, SAML_ATTRIBUTE_NAME) 
&& 0 != axutil_strcmp(attr_val, SAML_ATTRIBUTE_NAMESPACE))
+                       attr_local_name = axiom_attribute_get_localname(attr, 
env);                     
+                       if (0 != axutil_strcmp(attr_local_name, 
SAML_ATTRIBUTE_NAME) && 0 != axutil_strcmp(attr_local_name, 
SAML_ATTRIBUTE_NAMESPACE))
                        {
                                return AXIS2_FALSE;
                        }               
@@ -218,11 +218,13 @@
        {
                while(AXIS2_TRUE == axiom_child_element_iterator_has_next(ci, 
env))
                {
+               
                        fcn = axiom_child_element_iterator_next(ci, env);
                        fce = axiom_node_get_data_element(fcn, env);
                        if (strcmp(axiom_element_get_localname(fce, env), 
SAML_ATTRIBUTE_VALUE) == 0)
                        {
-                               axutil_array_list_add(attr->attr_value, env, 
axiom_node_get_first_child(fcn, env));                                          
                           
+                               axiom_node_t *temp = 
axiom_node_get_first_child(fcn, env);
+                               axutil_array_list_add(attr->attr_value, env, 
temp);                                                                     
                        }               
                        else
                        {
@@ -258,13 +260,15 @@
                }
                if (sattr->attr_value)
                {                       
+                       size = axutil_array_list_size(sattr->attr_value, env);
+                       
                        for (i = 0; i < size; i++)
                        {
                                ns = axiom_namespace_create(env, SAML_NMSP_URI, 
SAML_PREFIX);
                                ce = axiom_element_create(env, n, 
SAML_ATTRIBUTE_VALUE, ns, &cn);
                                if (ce)
                                {
-                                       axiom_node_add_child(cn, env, 
axutil_array_list_get(sattr->attr_value, env, i));
+                                       axiom_node_add_child(cn, env, 
(axiom_node_t*)axutil_array_list_get(sattr->attr_value, env, i));
                                }
                        }
                }

Modified: webservices/rampart/trunk/c/src/omxmlsec/saml/sutil.c
URL: 
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/omxmlsec/saml/sutil.c?rev=649377&r1=649376&r2=649377&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/omxmlsec/saml/sutil.c (original)
+++ webservices/rampart/trunk/c/src/omxmlsec/saml/sutil.c Thu Apr 17 22:58:09 
2008
@@ -23,20 +23,26 @@
        oxs_sign_part_t* sig_part = NULL;
        oxs_transform_t *tr = NULL;     
        axutil_array_list_t *sig_parts = NULL, *trans = NULL;
-       
+       axiom_namespace_t *ns = NULL;
        trans = axutil_array_list_create(env, SAML_ARRAY_LIST_DEF);
 
        /*create transform sor SAML XML signature with identifier*/
        tr = oxs_transforms_factory_produce_transform(env, 
OXS_HREF_TRANSFORM_ENVELOPED_SIGNATURE);
        axutil_array_list_add(trans, env, tr);
 
+    /*Create the EXCL-C14N Transformation*/
+    tr = oxs_transforms_factory_produce_transform(env, 
OXS_HREF_TRANSFORM_XML_EXC_C14N);
+    axutil_array_list_add(trans, env, tr);
+
        sig_part = oxs_sign_part_create(env);
        oxs_sign_part_set_digest_mtd(sig_part, env, OXS_HREF_SHA1);
 
        
        oxs_sign_part_set_transforms(sig_part, env, trans);
        oxs_sign_part_set_id_name(sig_part, env, id);
-       oxs_sign_part_set_sign_namespace(sig_part,env, NULL);
+
+       //ns = axiom_namespace_create(env, "", "");
+       //oxs_sign_part_set_sign_namespace(sig_part,env, ns);
 
        sig_parts = axutil_array_list_create(env, SAML_ARRAY_LIST_DEF);
        axutil_array_list_add(sig_parts, env, sig_part);

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=649377&r1=649376&r2=649377&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/omxmlsec/xml_signature.c (original)
+++ webservices/rampart/trunk/c/src/omxmlsec/xml_signature.c Thu Apr 17 
22:58:09 2008
@@ -45,11 +45,13 @@
 {
     axis2_char_t *serialized_node = NULL;
     axis2_char_t *digest = NULL;
+       axiom_node_t *ori_node = NULL, *sig_node = NULL;
+       oxs_tr_dtype_t output_dtype = OXS_TRANSFORM_TYPE_UNKNOWN;/*This will 
always be the current dtype*/
+    void *tr_output = NULL;
     int i = 0;
 
     if((transforms) && (0 < axutil_array_list_size(transforms, env))){
-        oxs_tr_dtype_t output_dtype = OXS_TRANSFORM_TYPE_UNKNOWN;/*This will 
always be the current dtype*/
-        void *tr_output = NULL;
+       
         output_dtype = OXS_TRANSFORM_TYPE_NODE; /*We always begin with a node*/
 
         tr_output = node; /*The first transformation is applied to the node*/
@@ -77,6 +79,14 @@
             }else if((input_dtype == OXS_TRANSFORM_TYPE_NODE) && (output_dtype 
== OXS_TRANSFORM_TYPE_CHAR)){
                 /*De-serialize*/
                 tr_input =  oxs_axiom_deserialize_node(env, (axis2_char_t 
*)tr_output);
+                       }else if((input_dtype == OXS_TRANSFORM_TYPE_NODE) && 
(output_dtype == OXS_TRANSFORM_TYPE_NODE_ARRAY_LIST)){
+                               ori_node = 
axutil_array_list_get((axutil_array_list_t*)tr_output, env, 0);
+                               sig_node = 
axutil_array_list_get((axutil_array_list_t*)tr_output, env, 1);
+                               tr_input = ori_node;                            
+                       }else if((input_dtype == OXS_TRANSFORM_TYPE_CHAR) && 
(output_dtype == OXS_TRANSFORM_TYPE_NODE_ARRAY_LIST)){
+                               ori_node = 
axutil_array_list_get((axutil_array_list_t*)tr_output, env, 0);
+                               sig_node = 
axutil_array_list_get((axutil_array_list_t*)tr_output, env, 1);
+                               tr_input = axiom_node_to_string(ori_node, env);
             }else{
                 /*Let it go as it is. */
                 tr_input = tr_output;
@@ -92,18 +102,24 @@
                 oxs_error(env, ERROR_LOCATION, 
OXS_ERROR_TRANSFORM_FAILED,"Transform failed for %s", tr_id);
                 return NULL;
             }
-        }/*eof for loop*/
+               }/*eof for loop*/
         /*We have applied all our transforms now*/
         /*Serialize node*/
         if(OXS_TRANSFORM_TYPE_NODE == output_dtype ){
             serialized_node = axiom_node_to_string((axiom_node_t*)tr_output, 
env);
         }else if(OXS_TRANSFORM_TYPE_CHAR == output_dtype){
             serialized_node = (axis2_char_t*)tr_output;
-        }else{
+        }
+               else if(OXS_TRANSFORM_TYPE_NODE_ARRAY_LIST == output_dtype){
+                       ori_node = 
(axiom_node_t*)axutil_array_list_get((axutil_array_list_t*)tr_output, env, 0);
+                       sig_node = 
(axiom_node_t*)axutil_array_list_get((axutil_array_list_t*)tr_output, env, 1);
+                       serialized_node = axiom_node_to_string(ori_node, env);
+               }
+               else{
             /*Error*/
             oxs_error(env, ERROR_LOCATION, 
OXS_ERROR_TRANSFORM_FAILED,"Unsupported transform data type  %d", output_dtype);
         }
-    }else{
+       }else{
         /*No transforms defined. Thus we simply direct the node, to make the 
digest*/
         serialized_node = axiom_node_to_string(node, env);
     }
@@ -114,11 +130,14 @@
         oxs_error(env, ERROR_LOCATION, OXS_ERROR_TRANSFORM_FAILED,"Unsupported 
digest method  %s", digest_mtd);
         return NULL;
     }
+       
+       if(ori_node && sig_node){                       
+               axiom_node_add_child(ori_node, env, sig_node);
+       }
     if(serialized_node){
         AXIS2_FREE(env->allocator, serialized_node);
         serialized_node = NULL;
     }
-
     return digest;
 }
 
@@ -145,15 +164,17 @@
     node = oxs_sign_part_get_node(sign_part, env);
 
        id_name = oxs_sign_part_get_id_name(sign_part, env);
-       if(!id_name)
-               id_name = OXS_ATTR_ID;
-
        ns = oxs_sign_part_get_sign_namespace(sign_part, env);
 
        if(ns)
                ns_uri = axiom_namespace_get_uri(ns, env);
-       else 
+       else if (!ns && !id_name) 
                ns_uri = OXS_WSU_XMLNS;
+    else
+        ns_uri = NULL;
+
+       if(!id_name)
+               id_name = OXS_ATTR_ID;
 
     /*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_name,
@@ -422,8 +443,7 @@
         if(!reffed_node)
         {
             reffed_node = oxs_axiom_get_node_by_id(env, scope_node, "Id", 
ref_id2, NULL );     
-        }
-
+        }              
        }
     /*Find the node refered by this ref_id2 and set to the sign part*/
        

Modified: webservices/rampart/trunk/c/src/util/rampart_saml.c
URL: 
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/util/rampart_saml.c?rev=649377&r1=649376&r2=649377&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/util/rampart_saml.c (original)
+++ webservices/rampart/trunk/c/src/util/rampart_saml.c Thu Apr 17 22:58:09 2008
@@ -28,6 +28,11 @@
                             rampart_saml_token_t *saml);
 
 AXIS2_EXTERN axis2_status_t AXIS2_CALL
+rampart_saml_token_validate(const axutil_env_t *env, 
+                            rampart_context_t *rampart_context, 
+                            axiom_node_t *assertion);
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
 rampart_saml_supporting_token_build(const axutil_env_t *env, 
                          rampart_context_t *rampart_context,                   
      
                          axiom_node_t *sec_node, 
@@ -114,10 +119,33 @@
 rampart_saml_token_validate(const axutil_env_t *env, 
                             rampart_context_t *rampart_context, 
                             axiom_node_t *assertion)
-{
-       /* At the moment SAML validation is not done. But we need to validate 
the signature of SAML tokens.
-       We can look at this after the PKS12 integration*/
-    return AXIS2_SUCCESS;
+{      
+    axis2_status_t status = AXIS2_FAILURE;
+    oxs_sign_ctx_t *sign_ctx = NULL;
+       oxs_x509_cert_t *certificate = NULL; 
+       axiom_node_t *sig_node = NULL;
+
+       /* Need to get the certificate of the STS */
+       if (!certificate)
+       {
+               AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+                        "[rampart][rs] Certificate cannot be found for the 
STS");                      
+        return AXIS2_FAILURE;
+       }
+       /*Create sign context*/
+    sign_ctx = oxs_sign_ctx_create(env);
+    
+    /*Set the Certificate*/
+    oxs_sign_ctx_set_certificate(sign_ctx, env, certificate);
+       sig_node = oxs_axiom_get_node_by_local_name(env, assertion, 
OXS_NODE_SIGNATURE);
+       if (!sig_node)
+       {    
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+                        "[rampart][rs] No Signature node in the SAML 
Assertion");                      
+        return AXIS2_FAILURE;
+       }
+    status = oxs_xml_sig_verify(env, sign_ctx, sig_node, assertion);   
+    return status;
 }
 
 AXIS2_EXTERN char * AXIS2_CALL


Reply via email to