Author: manjula
Date: Fri Jun 15 04:37:12 2007
New Revision: 547637

URL: http://svn.apache.org/viewvc?view=rev&rev=547637
Log:
Processing an encrypted signature.

Modified:
    webservices/rampart/trunk/c/src/util/rampart_sec_header_processor.c

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?view=diff&rev=547637&r1=547636&r2=547637
==============================================================================
--- webservices/rampart/trunk/c/src/util/rampart_sec_header_processor.c 
(original)
+++ webservices/rampart/trunk/c/src/util/rampart_sec_header_processor.c Fri Jun 
15 04:37:12 2007
@@ -448,6 +448,115 @@
 
 
 static axis2_status_t
+rampart_shp_process_reference_list(
+            const axutil_env_t *env,
+            axis2_msg_ctx_t *msg_ctx,
+            rampart_context_t *rampart_context,
+            axiom_soap_envelope_t *soap_envelope,
+            axiom_node_t *sec_node,
+            axiom_node_t *ref_list_node)
+{
+
+    axutil_array_list_t *reference_list = NULL;    
+    axis2_status_t status = AXIS2_FAILURE;
+    int i = 0;
+    
+    reference_list = oxs_token_get_reference_list_data(env, ref_list_node);
+
+    if((!reference_list) || (0 == axutil_array_list_size(reference_list, env)))
+    {
+        AXIS2_LOG_INFO(env->log, "[rampart][shp] Nothing Encrypted Outside 
security header");
+        return AXIS2_SUCCESS;
+    }
+
+    for(i=0 ; i < axutil_array_list_size(reference_list, env); i++ )
+    {
+        axis2_char_t *id = NULL;
+        axis2_char_t *id2 = NULL;
+        axiom_node_t *enc_data_node = NULL;
+        axiom_node_t *envelope_node = NULL;
+        axiom_soap_body_t *soap_body = NULL;
+        axiom_node_t *key_info_node = NULL;
+        axiom_node_t *str_node = NULL;
+
+        soap_body = axiom_soap_envelope_get_body(soap_envelope, env);
+
+        id = (axis2_char_t*)axutil_array_list_get(reference_list, env, i);
+
+        id2 = axutil_string_substring_starting_at(id, 1);
+        
+        envelope_node = axiom_soap_envelope_get_base_node(soap_envelope, env);
+
+        /*Search for the node by its ID*/
+        enc_data_node = oxs_axiom_get_node_by_id(env, envelope_node, 
OXS_ATTR_ID, id2);
+        if(!enc_data_node)
+        {
+            AXIS2_LOG_INFO(env->log, "[rampart][shp] Node with ID=%s cannot be 
found", id);
+            /*continue;*/
+            rampart_create_fault_envelope(env, RAMPART_FAULT_FAILED_CHECK,
+                                          "Cannot find EncryptedData element", 
RAMPART_FAULT_IN_ENCRYPTED_DATA, msg_ctx);
+            return AXIS2_FAILURE;
+        }
+        
+        key_info_node = oxs_axiom_get_first_child_node_by_name(env, 
enc_data_node,
+                    OXS_NODE_KEY_INFO, OXS_DSIG_NS, OXS_DS );
+
+        if(key_info_node)
+        {
+            str_node = oxs_axiom_get_first_child_node_by_name(env, 
key_info_node,
+            OXS_NODE_SECURITY_TOKEN_REFRENCE, OXS_WSSE_XMLNS, OXS_WSSE);
+            
+            if(str_node)
+            {
+                axiom_node_t *str_child_node = NULL;
+                axis2_char_t *str_child_name = NULL;
+
+                str_child_node = axiom_node_get_first_element(str_node, env);
+                str_child_name = axiom_util_get_localname(str_child_node, env);
+                if(str_child_name)
+                {
+                    if(axutil_strcmp(str_child_name, OXS_NODE_REFERENCE) == 0)
+                    {
+                        axis2_char_t *ref = NULL;
+                        axis2_char_t *ref_id = NULL;
+                        axiom_node_t *encrypted_key_node = NULL;
+                        
+                        ref = oxs_token_get_reference(env, str_child_node);
+                        ref_id = 
axutil_string_substring_starting_at(axutil_strdup(env, ref), 1);
+
+                        encrypted_key_node = oxs_axiom_get_node_by_id(env, 
sec_node, "wsu:Id", ref_id);
+                        if(encrypted_key_node)
+                        {
+                            axiom_node_t *child_node = NULL;
+                            ref_list_node = axiom_node_detach(ref_list_node, 
env); 
+                            child_node = 
axiom_node_get_first_child(encrypted_key_node, env);
+                            
+                            if(child_node)
+                            {
+                                status = 
axiom_node_insert_sibling_before(child_node, env, ref_list_node);
+                                if(status != AXIS2_SUCCESS)
+                                {
+                                    return status;
+                                }
+                                status = 
rampart_shp_process_encrypted_key(env, msg_ctx, rampart_context, 
+                                                            soap_envelope, 
sec_node, encrypted_key_node); 
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+        } 
+    }
+    
+    return status;    
+}
+
+
+
+
+
+static axis2_status_t
 rampart_shp_process_signature(const axutil_env_t *env,
                               axis2_msg_ctx_t *msg_ctx,
                               rampart_context_t *rampart_context,
@@ -750,31 +859,62 @@
     axiom_node_t *cur_node = NULL;
     axis2_status_t status = AXIS2_FAILURE;
     axis2_bool_t need_replay_detection = AXIS2_FALSE;
+    axis2_bool_t signature_protection = AXIS2_FALSE;
 
     AXIS2_LOG_INFO(env->log, "[rampart][shp] Process security header");
 
+    
 
     if((rampart_context_get_binding_type(rampart_context,env)) == 
RP_BINDING_ASYMMETRIC)
     {
-        if(rampart_context_is_encrypt_before_sign(rampart_context,env))
+
+        signature_protection = 
rampart_context_is_encrypt_signature(rampart_context, env);
+
+        if(rampart_context_is_encrypt_before_sign(rampart_context, env))
         {
+            if(signature_protection)
+            {
+                axiom_node_t *ref_list_node = NULL;
+
+                cur_node = oxs_axiom_get_node_by_local_name(env, sec_node, 
OXS_NODE_ENCRYPTED_KEY);
+                if(!cur_node)
+                {
+                    AXIS2_LOG_INFO(env->log, "[rampart][shp] No Encrypted Key 
element");
+                    return AXIS2_FAILURE;
+                }
+                if(!rampart_shp_validate_qnames(env,cur_node))
+                {
+                    AXIS2_LOG_INFO(env->log, "[rampart][shp] Error in the 
security header");
+                    return AXIS2_FAILURE;
+                }
+                AXIS2_LOG_INFO(env->log, "[rampart][shp] Process 
EncryptedKey");
+                status = rampart_shp_process_encrypted_key(env, msg_ctx, 
rampart_context, soap_envelope, sec_node, cur_node);
+                if(status != AXIS2_SUCCESS)
+                {
+                    return status;
+                }
+                ref_list_node = oxs_axiom_get_first_child_node_by_name(env, 
cur_node, OXS_NODE_REFERENCE_LIST, OXS_ENC_NS, OXS_XENC); 
+
+                axiom_node_detach(ref_list_node, env);
+
+            }
             /*First we should verify signature.*/
-            if(rampart_context_check_whether_to_sign(rampart_context,env))
+            if(rampart_context_check_whether_to_sign(rampart_context, env))
             {
-                cur_node = 
oxs_axiom_get_node_by_local_name(env,sec_node,OXS_NODE_SIGNATURE);
+                cur_node = oxs_axiom_get_node_by_local_name(env, sec_node, 
OXS_NODE_SIGNATURE);
                 if(!cur_node)
                 {
                     AXIS2_LOG_INFO(env->log, "[rampart][shp] No Signature 
element");
                     return AXIS2_FAILURE;
                 }
-                if(!rampart_shp_validate_qnames(env,cur_node))
+                if(!rampart_shp_validate_qnames(env, cur_node))
                 {
                     AXIS2_LOG_INFO(env->log, "[rampart][shp] Error in the 
security header");
                     return AXIS2_FAILURE;
                 }
                 AXIS2_LOG_INFO(env->log, "[rampart][shp] Processing Signature 
element.");
 
-                status = 
rampart_shp_process_signature(env,msg_ctx,rampart_context,soap_envelope,sec_node,cur_node);
+                status = rampart_shp_process_signature(env, msg_ctx, 
rampart_context, soap_envelope, sec_node, cur_node);
 
                 if(status!=AXIS2_SUCCESS){
                     rampart_create_fault_envelope(env, 
RAMPART_FAULT_INVALID_SECURITY, "Signature is not valid", 
RAMPART_FAULT_IN_SIGNATURE, msg_ctx);
@@ -783,7 +923,7 @@
             }
             else
             {
-                cur_node = 
oxs_axiom_get_node_by_local_name(env,sec_node,OXS_NODE_SIGNATURE);
+                cur_node = oxs_axiom_get_node_by_local_name(env, sec_node, 
OXS_NODE_SIGNATURE);
                 if(cur_node)
                 {
                     AXIS2_LOG_INFO(env->log, "[rampart][shp] policy does not 
specify signature.");
@@ -797,21 +937,40 @@
               with a proper verification method before message processing */
             if(rampart_context_check_whether_to_encrypt(rampart_context,env))
             {
-                cur_node = 
oxs_axiom_get_node_by_local_name(env,sec_node,OXS_NODE_ENCRYPTED_KEY);
-                if(!cur_node)
+                if(!signature_protection)
                 {
-                    AXIS2_LOG_INFO(env->log, "[rampart][shp] No Encrypted Key 
element");
-                    return AXIS2_FAILURE;
+                    cur_node = 
oxs_axiom_get_node_by_local_name(env,sec_node,OXS_NODE_ENCRYPTED_KEY);
+                    if(!cur_node)
+                    {
+                        AXIS2_LOG_INFO(env->log, "[rampart][shp] No Encrypted 
Key element");
+                        return AXIS2_FAILURE;
+                    }
+                    if(!rampart_shp_validate_qnames(env,cur_node))
+                    {
+                        AXIS2_LOG_INFO(env->log, "[rampart][shp] Error in the 
security header");
+                        return AXIS2_FAILURE;
+                    }
+                    AXIS2_LOG_INFO(env->log, "[rampart][shp] Process 
EncryptedKey");
+                    status = rampart_shp_process_encrypted_key(env, msg_ctx, 
rampart_context, soap_envelope, sec_node, cur_node);
+                    if(status!=AXIS2_SUCCESS)
+                    {
+                        return status;
+                    }
                 }
-                if(!rampart_shp_validate_qnames(env,cur_node))
+                else
                 {
-                    AXIS2_LOG_INFO(env->log, "[rampart][shp] Error in the 
security header");
-                    return AXIS2_FAILURE;
+                    cur_node = oxs_axiom_get_node_by_local_name(env, sec_node, 
OXS_NODE_REFERENCE_LIST);
+                    if(!cur_node)
+                    {
+                        AXIS2_LOG_INFO(env->log, "[rampart][shp] Nothing 
encrypt outside Security header");
+                        return AXIS2_FAILURE;
+                    }
+                    status = rampart_shp_process_reference_list(env, msg_ctx, 
rampart_context, soap_envelope, sec_node, cur_node);
+                    if(status != AXIS2_SUCCESS)
+                    {
+                        return status;
+                    }
                 }
-                AXIS2_LOG_INFO(env->log, "[rampart][shp] Process 
EncryptedKey");
-                status = rampart_shp_process_encrypted_key(env,msg_ctx, 
rampart_context, soap_envelope, sec_node, cur_node);
-                if(status!=AXIS2_SUCCESS)
-                    return status;
             }
             else
             {
@@ -830,7 +989,7 @@
             /*We should decrypt the message first*/
             if(rampart_context_check_whether_to_encrypt(rampart_context,env))
             {
-                cur_node = 
oxs_axiom_get_node_by_local_name(env,sec_node,OXS_NODE_ENCRYPTED_KEY);
+                cur_node = oxs_axiom_get_node_by_local_name(env, sec_node, 
OXS_NODE_ENCRYPTED_KEY);
                 if(!cur_node)
                 {
                     AXIS2_LOG_INFO(env->log, "[rampart][shp] No Encrypted Key 
element");
@@ -841,6 +1000,15 @@
                     AXIS2_LOG_INFO(env->log, "[rampart][shp] Error in the 
security header");
                     return AXIS2_FAILURE;
                 }
+                
+                if(signature_protection)
+                {
+                    if(oxs_axiom_get_node_by_local_name(env, sec_node, 
OXS_NODE_SIGNATURE))
+                    {
+                        AXIS2_LOG_INFO(env->log, "[rampart][shp] Signature is 
not Encrypted.");
+                        return AXIS2_FAILURE;
+                    }    
+                }    
 
                 AXIS2_LOG_INFO(env->log, "[rampart][shp] Process 
EncryptedKey");
                 status = rampart_shp_process_encrypted_key(env,msg_ctx, 
rampart_context, soap_envelope, sec_node, cur_node);
@@ -849,7 +1017,7 @@
             }
             else
             {
-                cur_node = 
oxs_axiom_get_node_by_local_name(env,sec_node,OXS_NODE_ENCRYPTED_KEY);
+                cur_node = oxs_axiom_get_node_by_local_name(env, sec_node, 
OXS_NODE_ENCRYPTED_KEY);
                 if(cur_node)
                 {
                     AXIS2_LOG_INFO(env->log, "[rampart][shp] policy does not 
specify encryption.");


Reply via email to