Author: supun
Date: Sun Jun  1 22:21:33 2008
New Revision: 662325

URL: http://svn.apache.org/viewvc?rev=662325&view=rev
Log:
Sample for scenario 24

Added:
    webservices/rampart/trunk/c/samples/client/saml_protect/
    webservices/rampart/trunk/c/samples/client/saml_protect/echo.c

Added: webservices/rampart/trunk/c/samples/client/saml_protect/echo.c
URL: 
http://svn.apache.org/viewvc/webservices/rampart/trunk/c/samples/client/saml_protect/echo.c?rev=662325&view=auto
==============================================================================
--- webservices/rampart/trunk/c/samples/client/saml_protect/echo.c (added)
+++ webservices/rampart/trunk/c/samples/client/saml_protect/echo.c Sun Jun  1 
22:21:33 2008
@@ -0,0 +1,428 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <axiom.h>
+#include <axis2_util.h>
+#include <axiom_soap.h>
+#include <axis2_client.h>
+#include <rampart_constants.h>
+#include <neethi_util.h>
+#include <neethi_policy.h>
+#include <saml.h>
+#include <rampart_config.h>
+#include <rampart_saml_token.h>
+#include <oxs_saml_token.h>
+#include <oxs_sign_ctx.h>
+#include <oxs_tokens.h>
+#include <oxs_xml_encryption.h>
+
+axiom_node_t * AXIS2_CALL
+build_om_payload_for_echo_svc(const axutil_env_t *env);
+
+rampart_saml_token_t * AXIS2_CALL
+create_saml_token(const axutil_env_t *env);
+
+oxs_key_t * AXIS2_CALL
+get_session_key(const axutil_env_t *env, axiom_node_t *assertion);
+
+axiom_node_t * AXIS2_CALL
+create_key_info(const axutil_env_t *env, rampart_saml_token_t *saml);
+
+saml_subject_t * AXIS2_CALL
+create_subject(const axutil_env_t *env, rampart_saml_token_t *saml);
+
+saml_auth_binding_t * AXIS2_CALL
+create_autherity_binding(const axutil_env_t *env);
+
+saml_stmt_t * AXIS2_CALL
+create_auth_statement(const axutil_env_t *env, rampart_saml_token_t *saml);
+
+saml_condition_t * AXIS2_CALL
+create_condition(const axutil_env_t *env);
+
+#define PRIVATE_KEY_FILE            
"/bin/samples/rampart/keys/ahome/alice_key.pem"
+#define PRIVATE_KEY_PASSWORD        "password"
+#define CERTIFICATE_FILE            
"/bin/samples/rampart/keys/ahome/alice_cert.cert"
+#define RECEIVER_CERTIFICATE_FILE   
"/bin/samples/rampart/keys/ahome/bob_cert.cert"
+
+axis2_char_t *axis2c_home;
+
+int main(int argc, char** argv)
+{
+    const axutil_env_t *env = NULL;
+    const axis2_char_t *address = NULL;
+    const axis2_char_t *client_home = NULL;
+    axis2_char_t *file_name = NULL;
+    axis2_char_t *policy_file = NULL;
+    axis2_endpoint_ref_t* endpoint_ref = NULL;
+    axis2_options_t *options = NULL;
+    axis2_svc_client_t* svc_client = NULL;
+    axiom_node_t *payload = NULL;
+    axiom_node_t *ret_node = NULL;
+    axis2_status_t status = AXIS2_FAILURE;
+    neethi_policy_t *policy = NULL;
+    rampart_config_t* client_config = NULL;
+    axutil_property_t *property = NULL;
+    rampart_saml_token_t *saml = NULL;
+    axiom_node_t *assertion = NULL;
+       /* Set up the environment */
+    env = axutil_env_create_all("echo.log", AXIS2_LOG_LEVEL_TRACE);
+
+    printf("SAML PROOF");
+    /* Set end-point-reference of echo service */
+    address = "http://localhost:9090/axis2/services/echo";;
+    if (argc > 2)
+    {
+        address = argv[1];
+        client_home = argv[2];
+        printf("Using endpoint : %s\n", address);
+        printf("Using client_home : %s\n", client_home);
+    }
+
+    if (axutil_strcmp(address, "-h") == 0)
+    {
+        printf("Usage : %s [endpoint_url] [client_home]\n", argv[0]);
+        printf("use -h for help\n");
+        return 0;
+    }
+
+    axis2c_home = AXIS2_GETENV("AXIS2C_HOME");
+    if (!axis2c_home)
+    {
+        printf("AXIS2C_HOME not set. Cannot find the key files");
+        return -1;
+    }
+    /* Create end-point-reference with given address */
+    endpoint_ref = axis2_endpoint_ref_create(env, address);
+
+    /* Setup options */
+    options = axis2_options_create(env);
+    axis2_options_set_to(options, env, endpoint_ref);
+    axis2_options_set_action(options, env,
+            "http://example.com/ws/2004/09/policy/Test/EchoRequest";);
+    /*axis2_options_set_action(options, env,
+            "urn:echo");*/
+
+
+    /*If the client home is not specified, use the AXIS2C_HOME*/
+    if (!client_home)
+    {
+        client_home = axutil_strdup(env, axis2c_home);
+        printf("\nNo client_home specified. Using default %s", client_home);
+    }
+
+    /* Create service client */
+    printf("client_home= %s", client_home);
+    svc_client = axis2_svc_client_create(env, client_home);
+    if (!svc_client)
+    {
+        printf("Error creating service client\n");
+        return -1;
+    }
+
+    client_config = rampart_config_create(env);
+    if(!client_config)
+    {
+        printf("Cannot create rampart config\n");
+        return 0;
+    }
+
+    saml = create_saml_token(env);
+    rampart_config_add_saml_token(client_config, env, saml);
+    property = axutil_property_create_with_args(env, AXIS2_SCOPE_REQUEST ,
+        AXIS2_TRUE, (void *)rampart_config_free, client_config);
+    axis2_options_set_property(options, env, RAMPART_CLIENT_CONFIGURATION, 
property);
+
+    /* Set service client options */
+    axis2_svc_client_set_options(svc_client, env, options);
+
+    /*We need to specify the client's policy file location*/
+    if(client_home)
+    {
+        file_name = axutil_stracat(env, client_home, AXIS2_PATH_SEP_STR);
+        policy_file = axutil_stracat(env, file_name, "policy.xml" );
+        AXIS2_FREE(env->allocator, file_name);
+        file_name = NULL;        
+    }else{
+        printf("Client Home not Specified\n");
+        printf("echo client invoke FAILED!\n");
+        return 0;
+    }
+    /*Create the policy, from file*/   
+    policy = neethi_util_create_policy_from_file(env, policy_file);
+    if(!policy)
+    {
+        printf("\nPolicy creation failed from the file. %s\n", policy_file);
+    }
+       if(policy_file){
+        AXIS2_FREE(env->allocator, policy_file);
+        policy_file = NULL;
+    }
+
+    status = axis2_svc_client_set_policy(svc_client, env, policy);
+
+    if(status == AXIS2_FAILURE)
+    {
+        printf("Policy setting failed\n");
+    }
+    
+    /* Build the SOAP request message payload using OM API.*/
+    payload = build_om_payload_for_echo_svc(env);
+    
+    /*If not engaged in the client's axis2.xml, uncomment this line*/
+    /*axis2_svc_client_engage_module(svc_client, env, "rampart");*/
+    
+    /* Send request */
+    ret_node = axis2_svc_client_send_receive(svc_client, env, payload);
+
+
+    if (axis2_svc_client_get_last_response_has_fault(svc_client, env))
+    {
+        axiom_soap_envelope_t *soap_envelope = NULL;
+        axiom_soap_body_t *soap_body = NULL;
+        axiom_soap_fault_t *soap_fault = NULL;
+
+        printf ("\nResponse has a SOAP fault\n");
+        soap_envelope =
+            axis2_svc_client_get_last_response_soap_envelope(svc_client, env);
+        if (soap_envelope)
+            soap_body = axiom_soap_envelope_get_body(soap_envelope, env);
+        if (soap_body)
+            soap_fault = axiom_soap_body_get_fault(soap_body, env);
+        if (soap_fault)
+        {
+            printf("\nReturned SOAP fault: %s\n",
+            
axiom_node_to_string(axiom_soap_fault_get_base_node(soap_fault,env),
+                env));
+        }
+            printf("echo client invoke FAILED!\n");
+            return -1;
+    }
+    
+    if (ret_node)
+    {
+        axis2_char_t *om_str = NULL;
+        om_str = axiom_node_to_string(ret_node, env);
+        if (om_str)
+        {
+            printf("\nReceived OM : %s\n", om_str);
+        }
+        printf("\necho client invoke SUCCESSFUL!\n");
+        AXIS2_FREE(env->allocator, om_str);
+        ret_node = NULL;
+    }
+    else
+    {
+        printf("echo client invoke FAILED!\n");
+        return -1;
+    }
+
+    if (svc_client)
+    {
+        axis2_svc_client_free(svc_client, env);
+        svc_client = NULL;
+    }
+    if (env)
+    {
+        axutil_env_free((axutil_env_t *) env);
+        env = NULL;
+    }
+    
+    return 0;
+}
+
+axiom_node_t * AXIS2_CALL
+build_om_payload_for_echo_svc(const axutil_env_t *env)
+{
+    axiom_node_t *echo_om_node = NULL;
+    axiom_element_t* echo_om_ele = NULL;
+    axiom_node_t* text_om_node = NULL;
+    axiom_element_t * text_om_ele = NULL;
+    axiom_namespace_t *ns1 = NULL;
+    axis2_char_t *om_str = NULL;
+
+    ns1 = axiom_namespace_create(env, 
"http://ws.apache.org/rampart/c/samples";, "ns1");
+    echo_om_ele = axiom_element_create(env, NULL, "echoIn", ns1, 
&echo_om_node);
+    
+    
+    text_om_ele = axiom_element_create(env, echo_om_node, "text", NULL, 
&text_om_node);
+    axiom_element_set_text(text_om_ele, env, "Hello", text_om_node);
+
+    om_str = axiom_node_to_string(echo_om_node, env);
+    if (om_str){
+        printf("\nSending OM : %s\n", om_str);
+        AXIS2_FREE(env->allocator, om_str);
+        om_str =  NULL;
+    }
+    return echo_om_node;
+}
+
+rampart_saml_token_t * AXIS2_CALL
+create_saml_token(const axutil_env_t *env)
+{
+    oxs_sign_ctx_t *sign_ctx = NULL;
+       oxs_x509_cert_t *cert = NULL;
+       openssl_pkey_t *prv_key = NULL;
+       axiom_node_t *sig_node = NULL;
+       rampart_saml_token_t *saml = NULL;
+
+       axutil_date_time_t *time = NULL;
+       saml_assertion_t *assertion = NULL;
+       axiom_node_t *node = NULL;
+    axis2_char_t *prv_key_file = NULL;
+    axis2_char_t *certificate_file = NULL;
+    /* 
+     * Create a rampart_saml_token_t to give to the Rampart/C 
+     * Here the token type is protection token.
+     */    
+       saml = rampart_saml_token_create(env, NULL, 
RAMPART_ST_CONFIR_TYPE_HOLDER_OF_KEY);
+       time = axutil_date_time_create(env);
+       assertion = saml_assertion_create(env);
+       if (assertion)  
+       {
+               saml_assertion_set_minor_version(assertion, env, 1);            
+               saml_assertion_set_issue_instant(assertion, env, time);
+               saml_assertion_set_issuer(assertion, env, 
"http://ws.apache.org/rampart/c";);    
+               saml_assertion_add_condition(assertion, env, 
create_condition(env));
+               saml_assertion_set_not_before(assertion, env, 
axutil_date_time_create(env));
+               saml_assertion_add_statement(assertion, env, 
create_auth_statement(env, saml));
+       }
+    /* Load the private key from file*/
+    prv_key_file = axutil_stracat(env, axis2c_home, PRIVATE_KEY_FILE);  
+    certificate_file = axutil_stracat(env, axis2c_home, CERTIFICATE_FILE);
+    prv_key = oxs_key_mgr_load_private_key_from_pem_file(env, prv_key_file, 
PRIVATE_KEY_PASSWORD);
+    cert = oxs_key_mgr_load_x509_cert_from_pem_file(env, certificate_file);
+
+       sign_ctx = oxs_sign_ctx_create(env);
+       saml_util_set_sig_ctx_defaults(sign_ctx, env, "AssertionID");
+       oxs_sign_ctx_set_private_key(sign_ctx, env, prv_key);
+    oxs_sign_ctx_set_certificate(sign_ctx, env, cert);
+    saml_assertion_set_signature(assertion, env, sign_ctx);
+
+       node = saml_assertion_to_om(assertion, NULL, env);       
+       rampart_saml_token_set_assertion(saml, env, node);
+    rampart_saml_token_set_token_type(saml, env, 
RAMPART_ST_TYPE_PROTECTION_TOKEN);
+       saml_assertion_free(assertion, env);
+       return saml;
+}
+
+saml_condition_t * AXIS2_CALL
+create_condition(const axutil_env_t *env)
+{
+       saml_audi_restriction_cond_t *arc = NULL;
+       saml_condition_t *condition = AXIS2_MALLOC(env->allocator, 
sizeof(saml_condition_t));   
+       arc = saml_audi_restriction_cond_create(env);
+       saml_audi_restriction_cond_add_audience(arc, env, "www.samle.com");     
+       return condition;
+}
+
+saml_stmt_t * AXIS2_CALL
+create_auth_statement(const axutil_env_t *env, rampart_saml_token_t *saml)
+{
+       saml_auth_stmt_t *a_stmt = NULL;        
+       saml_stmt_t *stmt = saml_stmt_create(env);
+       a_stmt = saml_auth_stmt_create(env);
+       saml_stmt_set_stmt(stmt, env, a_stmt, 
SAML_STMT_AUTHENTICATIONSTATEMENT);
+
+       saml_auth_stmt_set_auth_method(a_stmt, env, 
SAML_AUTH_METHOD_URI_PASSWORD);
+       saml_auth_stmt_set_auth_instant(a_stmt, env, 
axutil_date_time_create(env));
+       
+       saml_auth_stmt_set_subject(a_stmt, env, create_subject(env, saml));     
+       saml_auth_stmt_set_subject_dns(a_stmt, env,  "192.148.5.8");
+       saml_auth_stmt_set_subject_ip(a_stmt, env,  "128.5.6.4");
+       saml_auth_stmt_add_auth_binding(a_stmt, env, 
create_autherity_binding(env));
+       return stmt;    
+}
+
+saml_auth_binding_t * AXIS2_CALL
+create_autherity_binding(const axutil_env_t *env)
+{
+       saml_auth_binding_t *bind = NULL;
+       bind = saml_auth_binding_create(env);
+       saml_auth_binding_set_authority_kind(bind, env, "abc:aa:aa");
+       saml_auth_binding_set_binding(bind, env, "SOAP");
+       saml_auth_binding_set_location(bind, env, 
"http://myhome.com/sevices/echo";);
+       return bind;
+}
+
+saml_subject_t * AXIS2_CALL
+create_subject(const axutil_env_t *env, rampart_saml_token_t *saml)
+{
+       saml_subject_t *subject = NULL;
+       saml_named_id_t *id = NULL;             
+    axiom_node_t *key_info = NULL;
+       subject = saml_subject_create(env);
+
+
+       id = saml_named_id_create(env);
+       saml_named_id_set_name(id, env, "Computer Science & Engineering 
Department");
+       saml_named_id_set_format(id, env, SAML_EMAIL_ADDRESS);
+       saml_named_id_set_name_qualifier(id, env, "University of Moratuwa");
+       saml_subject_set_named_id(subject, env, id);
+
+       saml_subject_add_confirmation(subject, env, 
SAML_SUB_CONFIRMATION_HOLDER_OF_KEY);
+
+    key_info = create_key_info(env, saml);
+    saml_subject_set_key_info(subject, env, key_info);
+       return subject;
+}
+
+axiom_node_t *  AXIS2_CALL
+create_key_info(const axutil_env_t *env, rampart_saml_token_t *saml)
+{
+    axiom_node_t *key_info = NULL;
+    oxs_key_t *session_key = NULL;
+    axis2_status_t status = AXIS2_FAILURE;
+    oxs_asym_ctx_t * asym_ctx = NULL;
+    axis2_char_t *key_info_str = NULL;
+       oxs_x509_cert_t *cert = NULL;
+    /* Set the receiver certificate file. This public key will be used to 
encrypt the session key.*/
+    axis2_char_t *certificate_file = axutil_stracat(env, axis2c_home, 
RECEIVER_CERTIFICATE_FILE);
+
+    session_key = oxs_key_create(env);
+    status = oxs_key_for_algo(session_key, env, NULL);    
+
+    key_info = oxs_token_build_key_info_element(env, NULL);
+
+    /* Create the asym_ctx_t and populate it.*/
+    asym_ctx = oxs_asym_ctx_create(env);
+    oxs_asym_ctx_set_algorithm(asym_ctx, env, OXS_HREF_RSA_PKCS1);
+    oxs_asym_ctx_set_operation(asym_ctx, env,
+                               OXS_ASYM_CTX_OPERATION_PUB_ENCRYPT);
+
+       cert = oxs_key_mgr_load_x509_cert_from_pem_file(env, certificate_file);
+       if (!cert)
+       {
+               AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+                            "Certificate cannot be loaded");
+               return NULL;
+       }
+       oxs_asym_ctx_set_certificate(asym_ctx, env, cert);
+    status = oxs_xml_enc_encrypt_key(env,
+                            asym_ctx,
+                            key_info,
+                            session_key,
+                            NULL);
+       rampart_saml_token_set_session_key(saml, env, session_key);
+    key_info_str = axiom_node_to_string(key_info, env);
+    return key_info;
+}
+
+
+
+


Reply via email to