summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederic Peters <fpeters@entrouvert.com>2004-12-14 13:50:46 +0000
committerFrederic Peters <fpeters@entrouvert.com>2004-12-14 13:50:46 +0000
commit45f00e1aa4002dcdfd8b45948b3ab099c1193f7a (patch)
tree9e52957e92f899c7a77f0338d576ce2cb8bdec16
parentc13df5834335830c9aca6f65f972890fdfbceeaf (diff)
downloadlasso-45f00e1aa4002dcdfd8b45948b3ab099c1193f7a.tar.gz
lasso-45f00e1aa4002dcdfd8b45948b3ab099c1193f7a.tar.xz
lasso-45f00e1aa4002dcdfd8b45948b3ab099c1193f7a.zip
properly check signature on soap samlp:Request (login/artifact)
-rw-r--r--lasso/id-ff/login.c44
-rw-r--r--lasso/id-ff/login.h3
-rw-r--r--lasso/id-ff/provider.c3
3 files changed, 50 insertions, 0 deletions
diff --git a/lasso/id-ff/login.c b/lasso/id-ff/login.c
index c4196ee6..c5686666 100644
--- a/lasso/id-ff/login.c
+++ b/lasso/id-ff/login.c
@@ -31,6 +31,12 @@
#include <lasso/id-ff/login.h>
#include <lasso/id-ff/provider.h>
+
+struct _LassoLoginPrivate
+{
+ char *soap_request_msg;
+};
+
/*****************************************************************************/
/* static methods/functions */
/*****************************************************************************/
@@ -815,6 +821,12 @@ lasso_login_build_response_msg(LassoLogin *login, gchar *remote_providerID)
LASSO_PROFILE(login)->remote_providerID = g_strdup(remote_providerID);
remote_provider = g_hash_table_lookup(LASSO_PROFILE(login)->server->providers,
LASSO_PROFILE(login)->remote_providerID);
+ ret = lasso_provider_verify_signature(remote_provider,
+ login->private_data->soap_request_msg,
+ "RequestID", LASSO_MESSAGE_FORMAT_SOAP);
+ g_free(login->private_data->soap_request_msg);
+ login->private_data->soap_request_msg = NULL;
+
/* changed status code into RequestDenied
if signature is invalid or not found
if an error occurs during verification */
@@ -1229,6 +1241,11 @@ lasso_login_process_request_msg(LassoLogin *login, gchar *request_msg)
login->assertionArtifact = g_strdup(
LASSO_SAMLP_REQUEST(profile->request)->AssertionArtifact);
+ /* Keep a copy of request msg so signature can be verified when we get
+ * the providerId in lasso_login_build_response_msg()
+ */
+ login->private_data->soap_request_msg = g_strdup(request_msg);
+
return ret;
}
@@ -1308,6 +1325,27 @@ init_from_xml(LassoNode *node, xmlNode *xmlnode)
return 0;
}
+
+/*****************************************************************************/
+/* overridden parent class methods */
+/*****************************************************************************/
+
+static void
+dispose(GObject *object)
+{
+ LassoLogin *login = LASSO_LOGIN(object);
+ g_free(login->private_data->soap_request_msg);
+ G_OBJECT_CLASS(parent_class)->dispose(object);
+}
+
+static void
+finalize(GObject *object)
+{
+ LassoLogin *login = LASSO_LOGIN(object);
+ g_free(login->private_data);
+ G_OBJECT_CLASS(parent_class)->finalize(object);
+}
+
/*****************************************************************************/
/* instance and class init functions */
/*****************************************************************************/
@@ -1315,6 +1353,9 @@ init_from_xml(LassoNode *node, xmlNode *xmlnode)
static void
instance_init(LassoLogin *login)
{
+ login->private_data = g_new(LassoLoginPrivate, 1);
+ login->private_data->soap_request_msg = NULL;
+
login->protocolProfile = 0;
login->assertionArtifact = NULL;
login->nameIDPolicy = NULL;
@@ -1332,6 +1373,9 @@ class_init(LassoLoginClass *klass)
nclass->node_data = g_new0(LassoNodeClassData, 1);
lasso_node_class_set_nodename(nclass, "Login");
lasso_node_class_add_snippets(nclass, schema_snippets);
+
+ G_OBJECT_CLASS(klass)->dispose = dispose;
+ G_OBJECT_CLASS(klass)->finalize = finalize;
}
GType
diff --git a/lasso/id-ff/login.h b/lasso/id-ff/login.h
index 18e3c77b..3cab7cee 100644
--- a/lasso/id-ff/login.h
+++ b/lasso/id-ff/login.h
@@ -49,6 +49,7 @@ extern "C" {
typedef struct _LassoLogin LassoLogin;
typedef struct _LassoLoginClass LassoLoginClass;
+typedef struct _LassoLoginPrivate LassoLoginPrivate;
typedef enum {
LASSO_LOGIN_PROTOCOL_PROFILE_BRWS_ART = 1,
@@ -64,6 +65,8 @@ struct _LassoLogin {
/*< private >*/
gchar *nameIDPolicy;
lassoHttpMethod http_method;
+
+ LassoLoginPrivate *private_data;
};
struct _LassoLoginClass {
diff --git a/lasso/id-ff/provider.c b/lasso/id-ff/provider.c
index 8e4e99a7..8daf4654 100644
--- a/lasso/id-ff/provider.c
+++ b/lasso/id-ff/provider.c
@@ -518,6 +518,9 @@ int lasso_provider_verify_signature(LassoProvider *provider,
msg = (char*)message;
+ if (message == NULL)
+ return -2;
+
if (format == LASSO_MESSAGE_FORMAT_ERROR)
return -2;
if (format == LASSO_MESSAGE_FORMAT_UNKNOWN)