Author: kaushalye
Date: Thu Nov 1 05:35:27 2007
New Revision: 590980
URL: http://svn.apache.org/viewvc?rev=590980&view=rev
Log:
Symmetric key signing. Order of the security header rectified.
Modified:
webservices/rampart/trunk/c/include/openssl_constants.h
webservices/rampart/trunk/c/src/omxmlsec/axiom.c
webservices/rampart/trunk/c/src/omxmlsec/cipher.c
webservices/rampart/trunk/c/src/omxmlsec/key.c
webservices/rampart/trunk/c/src/util/rampart_encryption.c
webservices/rampart/trunk/c/src/util/rampart_signature.c
Modified: webservices/rampart/trunk/c/include/openssl_constants.h
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/include/openssl_constants.h?rev=590980&r1=590979&r2=590980&view=diff
==============================================================================
--- webservices/rampart/trunk/c/include/openssl_constants.h (original)
+++ webservices/rampart/trunk/c/include/openssl_constants.h Thu Nov 1 05:35:27
2007
@@ -45,6 +45,9 @@
#define OPENSSL_EVP_aes_192_cbc "EVP_aes_192_cbc"
#define OPENSSL_EVP_aes_256_cbc "EVP_aes_256_cbc"
+#define OPENSSL_HMAC_SHA1 "HmacSha1"
+#define OPENSSL_HMAC_SHA1_KEY_LEN 32
+
#define OPENSSL_RSA_ENCRYPTION "rsaEncryption"
#define OPENSSL_RSA_PKCS1_PADDING "RSA_PKCS1_PADDING"
#define OPENSSL_RSA_PKCS1_OAEP_PADDING "RSA_PKCS1_OAEP_PADDING"
Modified: webservices/rampart/trunk/c/src/omxmlsec/axiom.c
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/omxmlsec/axiom.c?rev=590980&r1=590979&r2=590980&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/omxmlsec/axiom.c (original)
+++ webservices/rampart/trunk/c/src/omxmlsec/axiom.c Thu Nov 1 05:35:27 2007
@@ -417,7 +417,6 @@
axiom_node_t *node_before)
{
axis2_status_t status = AXIS2_FAILURE;
-
axiom_node_t *temp_node = NULL;
temp_node = axiom_node_detach(node_to_move,env);
Modified: webservices/rampart/trunk/c/src/omxmlsec/cipher.c
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/omxmlsec/cipher.c?rev=590980&r1=590979&r2=590980&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/omxmlsec/cipher.c (original)
+++ webservices/rampart/trunk/c/src/omxmlsec/cipher.c Thu Nov 1 05:35:27 2007
@@ -66,22 +66,22 @@
if (0 == axutil_strcmp(url, (axis2_char_t*)OXS_HREF_DES3_CBC))
{
cipher_name = OPENSSL_EVP_des_ede3_cbc;
-
}
else if (0 == axutil_strcmp(url, (axis2_char_t*)OXS_HREF_AES_128_CBC))
{
cipher_name = OPENSSL_EVP_aes_128_cbc;
-
}
else if (0 == axutil_strcmp(url, (axis2_char_t*)OXS_HREF_AES_192_CBC))
{
cipher_name = OPENSSL_EVP_aes_192_cbc;
-
}
else if (0 == axutil_strcmp(url, (axis2_char_t*)OXS_HREF_AES_256_CBC))
{
cipher_name = OPENSSL_EVP_aes_256_cbc;
-
+ }
+ else if (0 == axutil_strcmp(url, (axis2_char_t*)OXS_HREF_HMAC_SHA1))
+ {
+ cipher_name = OPENSSL_HMAC_SHA1;
}
else
{
Modified: webservices/rampart/trunk/c/src/omxmlsec/key.c
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/omxmlsec/key.c?rev=590980&r1=590979&r2=590980&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/omxmlsec/key.c (original)
+++ webservices/rampart/trunk/c/src/omxmlsec/key.c Thu Nov 1 05:35:27 2007
@@ -23,6 +23,7 @@
#include <oxs_error.h>
#include <openssl_cipher_property.h>
#include <openssl_util.h>
+#include <openssl_constants.h>
struct oxs_key_t
{
@@ -369,17 +370,23 @@
axis2_status_t ret = AXIS2_FAILURE;
int size;
- cprop = (openssl_cipher_property_t *)oxs_get_cipher_property_for_url(env,
key_algo);
- if (!cprop)
- {
- oxs_error(env, ERROR_LOCATION, OXS_ERROR_DEFAULT,
+ /*We need to make an special entry for the HMAC-Sha1 as we do not need a
cipher property for it.*/
+ if(0 == axutil_strcmp(key_algo, OXS_HREF_HMAC_SHA1)){
+ size = OPENSSL_HMAC_SHA1_KEY_LEN;
+ }else{
+
+ cprop = (openssl_cipher_property_t
*)oxs_get_cipher_property_for_url(env, key_algo);
+ if (!cprop)
+ {
+ oxs_error(env, ERROR_LOCATION, OXS_ERROR_DEFAULT,
"openssl_get_cipher_property failed");
- return AXIS2_FAILURE;
- }
+ return AXIS2_FAILURE;
+ }
- size = openssl_cipher_property_get_key_size(cprop, env);
- openssl_cipher_property_free(cprop, env);
- cprop = NULL;
+ size = openssl_cipher_property_get_key_size(cprop, env);
+ openssl_cipher_property_free(cprop, env);
+ cprop = NULL;
+ }
key_buf = oxs_buffer_create(env);
/*The actual key generation happens here*/
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?rev=590980&r1=590979&r2=590980&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/util/rampart_encryption.c (original)
+++ webservices/rampart/trunk/c/src/util/rampart_encryption.c Thu Nov 1
05:35:27 2007
@@ -281,16 +281,9 @@
/*Generate the session key*/
session_key = oxs_key_create(env);
rampart_context_set_session_key(rampart_context, env, session_key);
+ status = oxs_key_for_algo(session_key, env, enc_sym_algo);
}
- status = oxs_key_for_algo(session_key, env, enc_sym_algo);
- if(AXIS2_FAILURE == status)
- {
- AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
- "[rampart][rampart_encryption] Cannot generate the key
for the algorithm %s, ", enc_sym_algo);
- return AXIS2_FAILURE;
- }
-
id_list = axutil_array_list_create(env, 5);
dk_list = axutil_array_list_create(env, 5);
/* For each and every encryption part.
@@ -820,11 +813,8 @@
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(
Modified: webservices/rampart/trunk/c/src/util/rampart_signature.c
URL:
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/src/util/rampart_signature.c?rev=590980&r1=590979&r2=590980&view=diff
==============================================================================
--- webservices/rampart/trunk/c/src/util/rampart_signature.c (original)
+++ webservices/rampart/trunk/c/src/util/rampart_signature.c Thu Nov 1
05:35:27 2007
@@ -36,6 +36,7 @@
#include <oxs_sign_ctx.h>
#include <oxs_sign_part.h>
#include <oxs_xml_signature.h>
+#include <oxs_derivation.h>
#include <axis2_key_type.h>
#include <rampart_token_builder.h>
#include <rampart_util.h>
@@ -128,15 +129,17 @@
* 2. If the key used to sign is derrived from the session key, then the
Id of the derived key will be used
*/
if(encrypted_key_id){
+ /*Session key in use. Which is encrypted and hidden in the
EncryptedKey with Id=encrypted_key_id*/
key_id = encrypted_key_id;
value_type = OXS_WSS_11_VALUE_TYPE_ENCRYPTED_KEY;
+ id_ref = axutil_stracat(env, "#",key_id);
}else{
+ /*Derived Keys in use.*/
key_id = oxs_key_get_name(key, env);
value_type = NULL;
+ id_ref = key_id;
}
- id_ref = axutil_stracat(env, "#",key_id);
-
reference_node = oxs_token_build_reference_element(env, str_node,
id_ref, value_type );
@@ -236,21 +239,40 @@
axis2_status_t AXIS2_CALL
rampart_sig_pack_for_sym(const axutil_env_t *env,
rampart_context_t *rampart_context,
- oxs_sign_ctx_t *sign_ctx)
+ oxs_sign_ctx_t *sign_ctx,
+ axis2_msg_ctx_t *msg_ctx)
{
- oxs_key_t *secret = NULL;
-
+ oxs_key_t *session_key = NULL;
+ rp_property_t *token = NULL;
+ axis2_bool_t use_derived_keys = AXIS2_FALSE;
+ axis2_bool_t server_side = AXIS2_FALSE;
+
/*We are trying to reuse the same session key which is used for
encryption*/
- secret = rampart_context_get_session_key(rampart_context, env);
- if(!secret){
+ session_key = rampart_context_get_session_key(rampart_context, env);
+ if(!session_key){
/*Create a new key and set to the rampart_context. This usually
happens when the SignBeforeEncrypt*/
- secret = oxs_key_create(env);
- rampart_context_set_session_key(rampart_context, env, secret);
+ session_key = oxs_key_create(env);
+ oxs_key_for_algo(session_key, env, OXS_HREF_HMAC_SHA1);
+ rampart_context_set_session_key(rampart_context, env, session_key);
+ }
+ /*If we need to use derrived keys, we must sign using a derived key of the
session key*/
+ server_side = axis2_msg_ctx_get_server_side(msg_ctx, env);
+ token = rampart_context_get_token(rampart_context, env, AXIS2_TRUE,
server_side, AXIS2_FALSE);
+ use_derived_keys = rampart_context_check_is_derived_keys (env, token);
+ if(use_derived_keys){
+ oxs_key_t *derived_key = NULL;
+ /*Derive a new key*/
+ derived_key = oxs_key_create(env);
+ oxs_derivation_derive_key(env, session_key, derived_key, AXIS2_TRUE);
+ oxs_sign_ctx_set_secret(sign_ctx, env, derived_key);
+ }else{
+ /*No need to use derived keys, we use the same session key*/
+ oxs_sign_ctx_set_secret(sign_ctx, env, session_key);
}
+
oxs_sign_ctx_set_sign_mtd_algo(sign_ctx, env, OXS_HREF_HMAC_SHA1);
oxs_sign_ctx_set_c14n_mtd(sign_ctx, env, OXS_HREF_XML_EXC_C14N);
oxs_sign_ctx_set_operation(sign_ctx, env, OXS_SIGN_OPERATION_SIGN);
- oxs_sign_ctx_set_secret(sign_ctx, env, secret);
return AXIS2_SUCCESS;
}
@@ -449,8 +471,7 @@
if((axutil_array_list_size(nodes_to_sign, env)==0))
{
- AXIS2_LOG_INFO(env->log,
- "[rampart][rampart_signature] No parts specified or
specified parts can't be found for Signature.");
+ AXIS2_LOG_INFO(env->log, "[rampart][rampart_signature] No parts
specified or specified parts can't be found for Signature.");
axutil_array_list_free(nodes_to_sign, env);
nodes_to_sign = NULL;
return AXIS2_SUCCESS;
@@ -622,7 +643,7 @@
status = rampart_sig_pack_for_asym(env, rampart_context, sign_ctx);
}else if(RP_PROPERTY_SYMMETRIC_BINDING == binding_type){
/* Pack for symmetric signature*/
- status = rampart_sig_pack_for_sym(env, rampart_context, sign_ctx);
+ status = rampart_sig_pack_for_sym(env, rampart_context, sign_ctx,
msg_ctx);
}else{
/*We do not support*/
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,"[rampart][rampart_signature]
Signature support only symmetric and asymmetric bindings.");
@@ -644,9 +665,12 @@
}else if(RP_PROPERTY_SYMMETRIC_BINDING == binding_type){
axiom_node_t *encrypted_key_node = NULL;
oxs_key_t *signed_key = NULL;
+ oxs_key_t *session_key = NULL;
axis2_char_t *enc_key_id = NULL;
signed_key = oxs_sign_ctx_get_secret(sign_ctx, env);
+ session_key = rampart_context_get_session_key(rampart_context, env);
+
/*If there is an EncryptedKey element use the Id. If not, generate an
Id and use it*/
encrypted_key_node = oxs_axiom_get_node_by_local_name(env, sec_node,
OXS_NODE_ENCRYPTED_KEY);
if(!encrypted_key_node){
@@ -666,7 +690,21 @@
/*There is the encrypted key. May be used by the encryption
process. So get the Id and use it*/
enc_key_id = oxs_axiom_get_attribute_value_of_node_by_name(env,
encrypted_key_node, OXS_ATTR_ID, NULL);
}
- rampart_sig_prepare_key_info_for_sym_binding(env, rampart_context,
sign_ctx, sig_node, signed_key, enc_key_id );
+
+ /* Now if the signed key is the session key. We need to Encrypt it. If
it's a derived key, we need to Attach a
+ * DerivedKeyToken and encrypt the session key if not done already */
+ if(0 == axutil_strcmp(oxs_key_get_name(session_key, env),
oxs_key_get_name(signed_key, env))) {
+ /*Now then... we have used the session key to sign*/
+ rampart_sig_prepare_key_info_for_sym_binding(env, rampart_context,
sign_ctx, sig_node, signed_key, enc_key_id );
+ }else{
+ axiom_node_t *dk_token = NULL;
+ /*We have used a derived key to sign. Note the NULL we pass for
the enc_key_id*/
+ rampart_sig_prepare_key_info_for_sym_binding(env, rampart_context,
sign_ctx, sig_node, signed_key, NULL );
+ /*In addition we need to add a DerivedKeyToken after the
EncryptedKey*/
+ dk_token = oxs_derivation_build_derived_key_token(env, signed_key,
sec_node, enc_key_id ,OXS_WSS_11_VALUE_TYPE_ENCRYPTED_KEY);
+ /*We need to make DerivedKeyToken to appear before the sginature
node*/
+ oxs_axiom_interchange_nodes(env, dk_token, sig_node);
+ }
}
/*Free sig ctx*/