Author: kaushalye Date: Fri Nov 16 00:27:32 2007 New Revision: 595589 URL: http://svn.apache.org/viewvc?rev=595589&view=rev Log: Introducing new strict security header processor for Rampart/C. This would be more strict on the order of elements in the security header. The approach is taken in order to enhance the interoprability between Rampart/C and other WS-Security implementations. This is the common approach for Rampart/Java as well.
Modified: webservices/rampart/trunk/c/src/handlers/rampart_in_handler.c webservices/rampart/trunk/c/src/omxmlsec/xml_encryption.c webservices/rampart/trunk/c/src/util/rampart_sec_header_processor.c Modified: webservices/rampart/trunk/c/src/handlers/rampart_in_handler.c URL: http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/handlers/rampart_in_handler.c?rev=595589&r1=595588&r2=595589&view=diff ============================================================================== --- webservices/rampart/trunk/c/src/handlers/rampart_in_handler.c (original) +++ webservices/rampart/trunk/c/src/handlers/rampart_in_handler.c Fri Nov 16 00:27:32 2007 @@ -134,8 +134,10 @@ "[rampart][rampart_in_handler] Unable to set the security processed results"); } - status = rampart_shp_process_message(env, msg_ctx, rampart_context, - soap_envelope, sec_node); + /*status = rampart_shp_process_message(env, msg_ctx, rampart_context, + soap_envelope, sec_node);*/ + status = rampart_shp_strict_process_message(env, msg_ctx, rampart_context, + soap_envelope, sec_node); if(status!=AXIS2_SUCCESS) { Modified: webservices/rampart/trunk/c/src/omxmlsec/xml_encryption.c URL: http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/omxmlsec/xml_encryption.c?rev=595589&r1=595588&r2=595589&view=diff ============================================================================== --- webservices/rampart/trunk/c/src/omxmlsec/xml_encryption.c (original) +++ webservices/rampart/trunk/c/src/omxmlsec/xml_encryption.c Fri Nov 16 00:27:32 2007 @@ -354,8 +354,10 @@ /*Replace the encrypted node with the de-serialized node*/ parent_of_enc_node = axiom_node_get_parent(enc_type_node, env); - axiom_node_add_child(parent_of_enc_node, env, deserialized_node); + + axiom_node_insert_sibling_after(enc_type_node, env, deserialized_node); axiom_node_detach(enc_type_node, env); + axiom_node_free_tree(enc_type_node, env); enc_type_node = NULL; 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=595589&r1=595588&r2=595589&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 Fri Nov 16 00:27:32 2007 @@ -43,20 +43,17 @@ /*Private functions*/ -/*Process a KeyInfo and return the referred node*/ -#if 1 -static axiom_node_t* -rampart_shp_process_key_info_for_ref(const axutil_env_t *env, - axiom_node_t *key_info_node, - axiom_node_t *root_node) +/*Process a KeyInfo and return the reference value*/ +static axis2_char_t * +rampart_shp_process_key_info_for_ref_val(const axutil_env_t *env, + axiom_node_t *key_info_node) { axiom_node_t *str_node = NULL; axiom_node_t *ref_node = NULL; - axiom_node_t *refed_node = NULL; axis2_char_t *ref_val = NULL; axis2_char_t *id = NULL; - /*Get the STR*/ + /*Get the STR*/ str_node = oxs_axiom_get_first_child_node_by_name(env, key_info_node, OXS_NODE_SECURITY_TOKEN_REFRENCE, OXS_WSSE_XMLNS, NULL); /*Get Reference element*/ @@ -66,21 +63,33 @@ /*Get the reference value in the @URI*/ if(ref_node){ ref_val = oxs_token_get_reference(env, ref_node); - /*Need to remove # sign from the ID*/ id = axutil_string_substring_starting_at(ref_val, 1); + } + } + return id; +} - /*Search for an element with the val(@wsu:Id)[EMAIL PROTECTED]/ - refed_node = oxs_axiom_get_node_by_id(env, root_node, OXS_ATTR_ID, id, OXS_WSU_XMLNS); - if(!refed_node){ - /*Search for an element with the val(@Id)[EMAIL PROTECTED]/ - refed_node = oxs_axiom_get_node_by_id(env, root_node, OXS_ATTR_ID, id, NULL); - /*If we still cannot find its an error*/ - if(!refed_node){ - AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,"[rampart][shp] Node cannot be found with the Id=%s.", id); - return NULL; - } - } +/*Process a KeyInfo and return the referred node*/ +#if 0 +static axiom_node_t* +rampart_shp_process_key_info_for_ref(const axutil_env_t *env, + axiom_node_t *key_info_node, + axiom_node_t *root_node) +{ + axiom_node_t *refed_node = NULL; + axis2_char_t *id = NULL; + + id = rampart_shp_process_key_info_for_ref_val(env, key_info_node); + /*Search for an element with the val(@wsu:Id)[EMAIL PROTECTED]/ + refed_node = oxs_axiom_get_node_by_id(env, root_node, OXS_ATTR_ID, id, OXS_WSU_XMLNS); + if(!refed_node){ + /*Search for an element with the val(@Id)[EMAIL PROTECTED]/ + refed_node = oxs_axiom_get_node_by_id(env, root_node, OXS_ATTR_ID, id, NULL); + /*If we still cannot find its an error*/ + if(!refed_node){ + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,"[rampart][shp] Node cannot be found with the Id=%s.", id); + return NULL; } } @@ -468,7 +477,17 @@ asym_ctx = NULL; return AXIS2_FAILURE; } - + /*We need to set the session key name= [EMAIL PROTECTED]/ + if(decrypted_sym_key){ + axis2_char_t *key_id = NULL; + + key_id = oxs_axiom_get_attribute_value_of_node_by_name(env, encrypted_key_node, OXS_ATTR_ID, NULL); + if(!key_id){ + key_id = "SESSION_KEY"; + } + + oxs_key_set_name(decrypted_sym_key, env, key_id); + } /*Now we need to set this to the rampart context for future use*/ rampart_context_set_session_key(rampart_context, env, decrypted_sym_key); @@ -680,6 +699,7 @@ OXS_NODE_KEY_INFO, OXS_DSIG_NS, NULL); if(key_info_node){ +#if 0 axiom_node_t *reffed_node = NULL; axis2_char_t *reffed_node_name = NULL; @@ -747,7 +767,51 @@ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[rampart][shp] Reffered node is not supported %s", reffed_node_name); return AXIS2_FAILURE; } +#endif + axis2_char_t *key_name = NULL; + oxs_key_t *session_key = NULL; + oxs_key_t *key_to_decrypt = NULL; + + key_name = rampart_shp_process_key_info_for_ref_val(env, key_info_node); + /*Get the sesison key*/ + session_key = rampart_context_get_session_key(rampart_context, env); + /*Search for the key using key_name. It can be either the session or a derived key*/ + if(0 == axutil_strcmp(key_name, oxs_key_get_name(session_key, env))){ + /*OK the key used to encrypt is the session key*/ + key_to_decrypt = session_key; + }else{ + /*The key used to decrypt can be a derived key*/ + key_to_decrypt = rampart_context_get_derived_key(rampart_context, env, key_name); + } + + if(key_to_decrypt){ + /*Now if everything is fine we need to decrypt*/ + oxs_ctx_t *ctx = NULL; + axiom_node_t *decrypted_node = NULL; + + ctx = oxs_ctx_create(env); + oxs_ctx_set_key(ctx, env, key_to_decrypt); + status = oxs_xml_enc_decrypt_node(env, ctx, enc_data_node, &decrypted_node); + + if(AXIS2_FAILURE == status) + { + rampart_create_fault_envelope(env, RAMPART_FAULT_FAILED_CHECK, + "Data decryption failed", RAMPART_FAULT_IN_ENCRYPTED_DATA, msg_ctx); + return AXIS2_FAILURE; + } + + /*Free*/ + oxs_ctx_free(ctx, env); + ctx = NULL; + + break; + }else{ + /*Can't help. Error retrieving the key to decrypt the reference. */ + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[rampart][shp] On processing ReferenceList, failed to get the key to decrypt"); + return AXIS2_FAILURE; + } } + } axutil_array_list_free(reference_list, env); @@ -782,8 +846,8 @@ key_info_node = oxs_axiom_get_first_child_node_by_name(env, sig_node, OXS_NODE_KEY_INFO, OXS_DSIG_NS, NULL); if(key_info_node){ - axiom_node_t *reffed_node = NULL; - axis2_char_t *reffed_node_name = NULL; + /* axiom_node_t *reffed_node = NULL; + axis2_char_t *reffed_node_name = NULL;*/ /*Now we need to decrypt the EncryptedKey if not done already*/ if(!session_key){ @@ -793,7 +857,7 @@ status = rampart_shp_process_encrypted_key(env, msg_ctx, rampart_context, soap_envelope, sec_node, encrypted_key_node); session_key = rampart_context_get_session_key(rampart_context, env); } - +#if 0 /*This can be a derrived key or an EncryptedKey. Whatever it is, it should be within the Security header*/ reffed_node = rampart_shp_process_key_info_for_ref(env, key_info_node, sec_node); if(!reffed_node){ @@ -819,6 +883,30 @@ }else{ key_to_verify = session_key; } +#endif + } + if(session_key){ + axis2_char_t *key_name = NULL; + + key_name = rampart_shp_process_key_info_for_ref_val(env, key_info_node); + /*Search for the key using key_name. It can be either the session or a derived key*/ + if(0 == axutil_strcmp(key_name, oxs_key_get_name(session_key, env))){ + /*OK the key used to sign is the session key*/ + key_to_verify = session_key; + }else{ + /*The key used to sign can be a derived key*/ + key_to_verify = rampart_context_get_derived_key(rampart_context, env, key_name); + } + } + if(!key_to_verify){ + /*It's an error*/ + rampart_create_fault_envelope(env, RAMPART_FAULT_FAILED_CHECK, + "Signature Verification failed. Cannot get the key to verify", + RAMPART_FAULT_IN_SIGNATURE, msg_ctx); + AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[Rampart][shp] Signature Verification failed. Cannot get the key to verify"); + + return AXIS2_FAILURE; + } /*Create sign context*/ sign_ctx = oxs_sign_ctx_create(env); oxs_sign_ctx_set_operation(sign_ctx, env, OXS_SIGN_OPERATION_VERIFY); @@ -1408,13 +1496,16 @@ }else if(0 == axutil_strcmp(cur_local_name, OXS_NODE_SIGNATURE_CONFIRMATION)){ /*TODO*/ status = AXIS2_SUCCESS; + }else if(0 == axutil_strcmp(cur_local_name, OXS_NODE_BINARY_SECURITY_TOKEN)){ + /*We do nothing.*/ + status = AXIS2_SUCCESS; }else{ AXIS2_LOG_INFO(env->log, "[rampart][shp] Unknown security header %s", cur_local_name); status = AXIS2_SUCCESS; } if(status != AXIS2_SUCCESS){ AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[rampart][shp] %s processing failed", cur_local_name); - return status; + return AXIS2_FAILURE; } /*Get next node*/