Author: manjula
Date: Wed Jun 13 20:59:57 2007
New Revision: 547106

URL: http://svn.apache.org/viewvc?view=rev&rev=547106
Log:
Encrypting the signature for policy assertion EncryptBeforeSign.

Modified:
    webservices/rampart/trunk/c/include/rampart_context.h
    webservices/rampart/trunk/c/include/rampart_encryption.h
    webservices/rampart/trunk/c/samples/client/sec_echo/echo_helper.c
    webservices/rampart/trunk/c/src/omxmlsec/tokens/token_reference.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_sec_header_builder.c

Modified: webservices/rampart/trunk/c/include/rampart_context.h
URL: 
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/include/rampart_context.h?view=diff&rev=547106&r1=547105&r2=547106
==============================================================================
--- webservices/rampart/trunk/c/include/rampart_context.h (original)
+++ webservices/rampart/trunk/c/include/rampart_context.h Wed Jun 13 20:59:57 
2007
@@ -32,6 +32,8 @@
 #include <rampart_authn_provider.h>
 #include <axis2_key_type.h>
 #include <axis2_msg_ctx.h>
+#include <oxs_key.h>
+
 #ifdef __cplusplus
 extern "C"
 {
@@ -359,6 +361,11 @@
         rampart_context_t *rampart_context,
         const axutil_env_t *env);
 
+    AXIS2_EXTERN axis2_bool_t AXIS2_CALL
+    rampart_context_is_encrypt_signature(
+        rampart_context_t *rampart_context,
+        const axutil_env_t *env);
+    
     AXIS2_EXTERN axis2_status_t AXIS2_CALL
     rampart_context_get_nodes_to_encrypt(
         rampart_context_t *rampart_context,
@@ -509,6 +516,18 @@
         rampart_context_t *rampart_context,
         const axutil_env_t *env);
 
+    AXIS2_EXTERN oxs_key_t *AXIS2_CALL
+    rampart_context_get_session_key(
+        rampart_context_t *rampart_context,
+        const axutil_env_t *env);
+
+    AXIS2_EXTERN axis2_status_t AXIS2_CALL
+    rampart_context_set_session_key(
+        rampart_context_t *rampart_context,
+        const axutil_env_t *env,
+        oxs_key_t *session_key);
+
+    
 
 
 #ifdef __cplusplus

Modified: webservices/rampart/trunk/c/include/rampart_encryption.h
URL: 
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/include/rampart_encryption.h?view=diff&rev=547106&r1=547105&r2=547106
==============================================================================
--- webservices/rampart/trunk/c/include/rampart_encryption.h (original)
+++ webservices/rampart/trunk/c/include/rampart_encryption.h Wed Jun 13 
20:59:57 2007
@@ -48,6 +48,26 @@
                                 axiom_node_t *sec_node);
 
 
+    AXIS2_EXTERN axis2_status_t AXIS2_CALL
+    rampart_enc_add_key_info(
+            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);
+   
+   
+    AXIS2_EXTERN axis2_status_t AXIS2_CALL
+    rampart_enc_encrypt_signature(
+            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);
+ 
+
+    
+
     /* @} */
 #ifdef __cplusplus
 }

Modified: webservices/rampart/trunk/c/samples/client/sec_echo/echo_helper.c
URL: 
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/samples/client/sec_echo/echo_helper.c?view=diff&rev=547106&r1=547105&r2=547106
==============================================================================
--- webservices/rampart/trunk/c/samples/client/sec_echo/echo_helper.c (original)
+++ webservices/rampart/trunk/c/samples/client/sec_echo/echo_helper.c Wed Jun 
13 20:59:57 2007
@@ -101,6 +101,8 @@
             }
         }
     }
+    AXIS2_FREE(env->allocator ,file_name);
+    file_name = NULL;
     printf("Successful\n");
     return AXIS2_SUCCESS;
 }

Modified: webservices/rampart/trunk/c/src/omxmlsec/tokens/token_reference.c
URL: 
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/omxmlsec/tokens/token_reference.c?view=diff&rev=547106&r1=547105&r2=547106
==============================================================================
--- webservices/rampart/trunk/c/src/omxmlsec/tokens/token_reference.c (original)
+++ webservices/rampart/trunk/c/src/omxmlsec/tokens/token_reference.c Wed Jun 
13 20:59:57 2007
@@ -53,11 +53,12 @@
     }
 
     ref_attr =  axiom_attribute_create(env, OXS_ATTR_URI , ref, NULL);
-    value_type_attr =  axiom_attribute_create(env, OXS_ATTR_VALUE_TYPE , 
value_type, NULL);
 
     ret = axiom_element_add_attribute(reference_ele, env, ref_attr, 
reference_node);
-    ret = axiom_element_add_attribute(reference_ele, env, value_type_attr, 
reference_node);
-
+    if(value_type){
+        value_type_attr =  axiom_attribute_create(env, OXS_ATTR_VALUE_TYPE , 
value_type, NULL);
+        ret = axiom_element_add_attribute(reference_ele, env, value_type_attr, 
reference_node);
+    }
     return reference_node;
 }
 

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?view=diff&rev=547106&r1=547105&r2=547106
==============================================================================
--- webservices/rampart/trunk/c/src/util/rampart_context.c (original)
+++ webservices/rampart/trunk/c/src/util/rampart_context.c Wed Jun 13 20:59:57 
2007
@@ -52,7 +52,7 @@
 
     /*This is used in callback functions.*/
     void *ctx;
-
+    oxs_key_t *session_key;
 
 };
 
@@ -676,6 +676,31 @@
     return AXIS2_SUCCESS;
 }
 
+
+AXIS2_EXTERN oxs_key_t *AXIS2_CALL
+rampart_context_get_session_key(
+    rampart_context_t *rampart_context,
+    const axutil_env_t *env)
+{
+    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+
+    return rampart_context->session_key;
+}
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+rampart_context_set_session_key(rampart_context_t *rampart_context,
+                                   const axutil_env_t *env,
+                                   oxs_key_t *session_key)
+{
+    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+    AXIS2_PARAM_CHECK(env->error, session_key, AXIS2_FAILURE);
+
+    rampart_context->session_key = session_key;
+    return AXIS2_SUCCESS;
+}
+
+
+
 AXIS2_EXTERN axis2_bool_t AXIS2_CALL
 rampart_context_get_require_timestamp(
     rampart_context_t *rampart_context,
@@ -1443,6 +1468,24 @@
             return AXIS2_TRUE;
     }
     return AXIS2_FALSE;
+}
+
+AXIS2_EXTERN axis2_bool_t AXIS2_CALL
+rampart_context_is_encrypt_signature(
+    rampart_context_t *rampart_context,
+    const axutil_env_t *env)
+{
+
+    rp_symmetric_asymmetric_binding_commons_t *sym_asym_commons = NULL;
+    sym_asym_commons = 
rampart_context_get_symmetric_asymmetric_binding_commons(rampart_context, env);
+
+    if(!sym_asym_commons)
+        return AXIS2_FALSE;
+
+    else
+    {
+        return 
rp_symmetric_asymmetric_binding_commons_get_signature_protection(sym_asym_commons,
 env);
+    }
 }
 
 /*Following methods will return all the parts in the soap message

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?view=diff&rev=547106&r1=547105&r2=547106
==============================================================================
--- webservices/rampart/trunk/c/src/util/rampart_encryption.c (original)
+++ webservices/rampart/trunk/c/src/util/rampart_encryption.c Wed Jun 13 
20:59:57 2007
@@ -44,9 +44,9 @@
     axis2_status_t status1 = AXIS2_SUCCESS;
     axis2_status_t status2 = AXIS2_SUCCESS;
 
-    status1 = 
rampart_context_get_nodes_to_encrypt(rampart_context,env,soap_envelope,nodes_to_encrypt);
+    status1 = rampart_context_get_nodes_to_encrypt(rampart_context, env, 
soap_envelope, nodes_to_encrypt);
 
-    status2 = 
rampart_context_get_elements_to_encrypt(rampart_context,env,soap_envelope,nodes_to_encrypt);
+    status2 = rampart_context_get_elements_to_encrypt(rampart_context, env, 
soap_envelope, nodes_to_encrypt);
 
     if(status1 == AXIS2_SUCCESS || status2 == AXIS2_SUCCESS)
         return AXIS2_SUCCESS;
@@ -58,12 +58,14 @@
 
 /*Public functions*/
 AXIS2_EXTERN axis2_status_t AXIS2_CALL
-rampart_enc_encrypt_message(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)
+rampart_enc_encrypt_message(
+        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)
 {
+
     axutil_array_list_t *nodes_to_encrypt = NULL;
     axutil_array_list_t *id_list = NULL;
     axis2_status_t status = AXIS2_FAILURE;
@@ -127,6 +129,8 @@
         return AXIS2_FAILURE;
     }
 
+    rampart_context_set_session_key(rampart_context, env, session_key);
+
     /*Create a list to store EncDataIds. This will be used in building the 
ReferenceList*/
     id_list = axutil_array_list_create(env, 5);
 
@@ -247,5 +251,165 @@
 }
 
 
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+rampart_enc_add_key_info(
+        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)
+{
+
+    axis2_char_t *key_id = NULL;
+    axiom_node_t *key_info_node = NULL;
+    axiom_node_t *str_node = NULL;
+    axiom_node_t *reference_node = NULL;
+
+    axiom_node_t *encrypted_data_node = NULL;
+    axiom_node_t *encrypted_key_node = NULL;
+    axiom_node_t *body_node = NULL;
+    axiom_soap_body_t *body = NULL;
+
+    axiom_element_t *body_ele = NULL;
+    axiom_element_t *encrypted_data_ele = NULL;
+
+    encrypted_key_node = oxs_axiom_get_node_by_local_name(env, sec_node,  
OXS_NODE_ENCRYPTED_KEY); 
+    if(!encrypted_key_node)
+    {
+        AXIS2_LOG_INFO(env->log, "[rampart][rampart_encryption]Encrypting 
signature, EncryptedKey Not found");
+        return AXIS2_FAILURE;
+    }    
+
+    key_id = oxs_util_generate_id(env,(axis2_char_t*)OXS_ENCKEY_ID);
+    oxs_axiom_add_attribute(env, encrypted_key_node, OXS_WSU, 
RAMPART_WSU_XMLNS, OXS_ATTR_ID, key_id);
+    
+    body = axiom_soap_envelope_get_body(soap_envelope, env);
+    body_node = axiom_soap_body_get_base_node(body, env);
+
+    body_ele = (axiom_element_t *)
+                            axiom_node_get_data_element(body_node, env);
+
+    encrypted_data_ele = axiom_util_get_first_child_element_with_localname(
+                            body_ele, env, body_node, OXS_NODE_ENCRYPTED_DATA, 
&encrypted_data_node); 
+
+    if(encrypted_data_ele)
+    {
+        key_info_node = oxs_token_build_key_info_element(env, 
encrypted_data_node);
+        if(key_info_node)
+        {
+            str_node = oxs_token_build_security_token_reference_element(env, 
key_info_node);
+            if(str_node)
+            {
+                axis2_char_t *key_id_ref = NULL;
+                key_id_ref = axutil_stracat(env, "#",key_id);
+                reference_node = oxs_token_build_reference_element(env, 
str_node, key_id_ref, NULL);
+                if(!reference_node)
+                {
+                    AXIS2_LOG_INFO(env->log, 
"[rampart][rampart_encryption]Encrypting signature, Reference Node build 
failed");
+                    return AXIS2_FAILURE;
+                }
+                else
+                    return AXIS2_SUCCESS;
+            }
+            else
+                return AXIS2_FAILURE;
+        }
+        else
+            return AXIS2_FAILURE;
+    }
+    else 
+        return AXIS2_FAILURE;
+}
+
+
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+rampart_enc_encrypt_signature(
+        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)
+{
+
+    oxs_key_t *session_key = NULL;
+    axiom_node_t *node_to_enc = NULL;
+    axiom_node_t *enc_data_node = NULL;
+    oxs_ctx_t *enc_ctx = NULL;
+    axis2_char_t *id = NULL;
+    axis2_status_t enc_status = AXIS2_FAILURE;
+    axis2_char_t *enc_sym_algo = NULL;
+    axutil_array_list_t *id_list = NULL;
+    axiom_node_t *encrypted_key_node = NULL;
+    axiom_node_t *temp_node = NULL;
+    axiom_node_t *node_to_move = NULL;
 
+    session_key = rampart_context_get_session_key(rampart_context, env);
 
+    if(!session_key)
+    {
+        AXIS2_LOG_INFO(env->log, "[rampart][rampart_encryption] Encrypting 
Signature.Session key not found");
+        return AXIS2_FAILURE;
+    }
+
+    node_to_enc = oxs_axiom_get_node_by_local_name(env, sec_node, 
OXS_NODE_SIGNATURE); 
+
+    if(!node_to_enc)
+    {
+        AXIS2_LOG_INFO(env->log, "[rampart][rampart_encryption] Encrypting 
Signature. Signature node not found");
+        return AXIS2_FAILURE;
+    }   
+
+    encrypted_key_node = oxs_axiom_get_node_by_local_name(env, sec_node,  
OXS_NODE_ENCRYPTED_KEY);
+    if(!encrypted_key_node)
+    {
+        AXIS2_LOG_INFO(env->log, "[rampart][rampart_encryption]Encrypting 
signature, EncryptedKey Not found");
+        return AXIS2_FAILURE;
+    }
+    
+    enc_ctx = oxs_ctx_create(env);
+    oxs_ctx_set_key(enc_ctx, env, session_key);
+
+    enc_sym_algo = rampart_context_get_enc_sym_algo(rampart_context,env); 
+
+    oxs_ctx_set_enc_mtd_algorithm(enc_ctx, env, enc_sym_algo);
+   
+    id = oxs_util_generate_id(env,(axis2_char_t*)OXS_ENCDATA_ID);
+
+    enc_data_node = oxs_token_build_encrypted_data_element(env, sec_node, 
OXS_TYPE_ENC_ELEMENT, id );
+    enc_status = oxs_xml_enc_encrypt_node(env, enc_ctx, node_to_enc, 
&enc_data_node);
+
+    if(enc_status != AXIS2_SUCCESS)
+    {
+        return AXIS2_FAILURE;
+    }
+
+    node_to_move = oxs_axiom_get_node_by_local_name(env, sec_node,  
OXS_NODE_REFERENCE_LIST);
+
+    if(node_to_move)
+    {
+        temp_node = axiom_node_detach(node_to_move, env);
+        if(temp_node)
+        {
+            enc_status = axiom_node_insert_sibling_after(enc_data_node, env, 
temp_node);
+            if(enc_status != AXIS2_SUCCESS)
+            {
+                AXIS2_LOG_INFO(env->log, 
"[rampart][rampart_encryption]Encrypting signature, Node moving failed.");    
+                return AXIS2_FAILURE;
+            }    
+        }    
+    }    
+
+    id_list = axutil_array_list_create(env, 0);
+
+    axutil_array_list_add(id_list, env, id);
+
+    enc_status = oxs_token_build_data_reference_list(env, encrypted_key_node, 
id_list);    
+    if(enc_status != AXIS2_SUCCESS)
+    {
+        AXIS2_LOG_INFO(env->log, "[rampart][rampart_encryption]Encrypting 
signature,Building reference list failed");
+        return AXIS2_FAILURE;
+    }
+        
+
+    return AXIS2_SUCCESS;
+}

Modified: webservices/rampart/trunk/c/src/util/rampart_sec_header_builder.c
URL: 
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/util/rampart_sec_header_builder.c?view=diff&rev=547106&r1=547105&r2=547106
==============================================================================
--- webservices/rampart/trunk/c/src/util/rampart_sec_header_builder.c (original)
+++ webservices/rampart/trunk/c/src/util/rampart_sec_header_builder.c Wed Jun 
13 20:59:57 2007
@@ -56,10 +56,11 @@
 
 
 AXIS2_EXTERN axis2_status_t AXIS2_CALL
-rampart_shb_build_message(const axutil_env_t *env,
-                          axis2_msg_ctx_t *msg_ctx,
-                          rampart_context_t *rampart_context,
-                          axiom_soap_envelope_t *soap_envelope)
+rampart_shb_build_message(
+        const axutil_env_t *env,
+        axis2_msg_ctx_t *msg_ctx,
+        rampart_context_t *rampart_context,
+        axiom_soap_envelope_t *soap_envelope)
 {
 
     axis2_status_t status = AXIS2_SUCCESS;
@@ -71,6 +72,7 @@
     axiom_node_t *sec_node =  NULL;
     axiom_element_t *sec_ele = NULL;
     axis2_bool_t is_encrypt_before_sign = AXIS2_FALSE;
+    axis2_bool_t signature_protection = AXIS2_FALSE;
     axiom_node_t *sig_node = NULL;
     axiom_node_t *enc_key_node = NULL;
 
@@ -147,19 +149,60 @@
                 }
             }
         }
+
+        signature_protection = 
rampart_context_is_encrypt_signature(rampart_context, env);
+
         /*Check the encryption and signature order*/
-        if(rampart_context_is_encrypt_before_sign(rampart_context,env))
+        if(rampart_context_is_encrypt_before_sign(rampart_context, env))
         {
             is_encrypt_before_sign = AXIS2_TRUE;
-            /*Check what are the parts to encrypt and send them to the encrypt 
method*/
-            status = rampart_enc_encrypt_message(env, 
msg_ctx,rampart_context,soap_envelope,sec_node);
-            if(status != AXIS2_SUCCESS)
-                return AXIS2_FAILURE;
+            
+            if(signature_protection)
+            {
+                /*First Encrypt the parts specified in encrypted parts*/
 
-            /*Then do signature specific things*/
-            status = 
rampart_sig_sign_message(env,msg_ctx,rampart_context,soap_envelope,sec_node);
-            if(status != AXIS2_SUCCESS)
-                return AXIS2_FAILURE;
+                status = rampart_enc_encrypt_message(env, msg_ctx, 
rampart_context, soap_envelope, sec_node);
+                if(status != AXIS2_SUCCESS)
+                {
+                    return AXIS2_FAILURE;
+                }    
+                
+                /*Add a key reference in Encrypted Data in the Body*/
+                
+                status = rampart_enc_add_key_info(env, msg_ctx, 
rampart_context, soap_envelope, sec_node);
+                if(status != AXIS2_SUCCESS)
+                {
+                    return AXIS2_FAILURE;
+                }
+                /*Then Sign the message*/
+
+                status = rampart_sig_sign_message(env, msg_ctx, 
rampart_context, soap_envelope, sec_node);
+                if(status != AXIS2_SUCCESS)
+                {    
+                    return AXIS2_FAILURE;
+                }
+
+                /*Then encrypt the signature */
+
+                status = rampart_enc_encrypt_signature(env, msg_ctx, 
rampart_context, soap_envelope, sec_node);
+                if(status != AXIS2_SUCCESS)
+                {
+                    return AXIS2_FAILURE;
+                }    
+            
+            }    
+            else
+            {    
+                status = rampart_enc_encrypt_message(env, msg_ctx, 
rampart_context, soap_envelope, sec_node);
+                if(status != AXIS2_SUCCESS)
+                    return AXIS2_FAILURE;
+
+                /*Then do signature specific things*/
+                status = rampart_sig_sign_message(env, msg_ctx, 
rampart_context, soap_envelope, sec_node);
+                if(status != AXIS2_SUCCESS)
+                    return AXIS2_FAILURE;
+
+            }    
 
             /*Then Handle Supporting token stuff  */
         }
@@ -167,19 +210,19 @@
         {
             is_encrypt_before_sign = AXIS2_FALSE;
             /*First do signature specific stuff*/
-            status = 
rampart_sig_sign_message(env,msg_ctx,rampart_context,soap_envelope,sec_node);
+            status = rampart_sig_sign_message(env, msg_ctx, rampart_context, 
soap_envelope, sec_node);
             if(status != AXIS2_SUCCESS)
                 return AXIS2_FAILURE;
 
             /*Then Handle Encryption stuff*/
 
-            status = rampart_enc_encrypt_message(env, 
msg_ctx,rampart_context,soap_envelope,sec_node);
+            status = rampart_enc_encrypt_message(env, msg_ctx, 
rampart_context, soap_envelope, sec_node);
             if(status!=AXIS2_SUCCESS )
                 return AXIS2_FAILURE;
         }
 
         /*If both encryption and signature is done we should interchange them.
-         * because the a-ction done last should appear first in the header. */
+         * because the action done last should appear first in the header. */
         sig_node = 
oxs_axiom_get_node_by_local_name(env,sec_node,OXS_NODE_SIGNATURE);
         enc_key_node = 
oxs_axiom_get_node_by_local_name(env,sec_node,OXS_NODE_ENCRYPTED_KEY);
         if(sig_node && enc_key_node)


Reply via email to