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;
+}
+
+
+
+