summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lasso/saml-2.0/login.c20
-rw-r--r--lasso/xml/private.h1
-rw-r--r--lasso/xml/saml-2.0/saml2_encrypted_element.c2
-rw-r--r--lasso/xml/saml-2.0/saml2_encrypted_element.h2
-rw-r--r--lasso/xml/xml.c6
5 files changed, 28 insertions, 3 deletions
diff --git a/lasso/saml-2.0/login.c b/lasso/saml-2.0/login.c
index 2e93877f..283295e5 100644
--- a/lasso/saml-2.0/login.c
+++ b/lasso/saml-2.0/login.c
@@ -39,7 +39,6 @@
#include <lasso/xml/saml-2.0/saml2_audience_restriction.h>
#include <lasso/xml/saml-2.0/saml2_authn_statement.h>
-
static int lasso_saml20_login_process_federation(LassoLogin *login, gboolean is_consent_obtained);
static gboolean lasso_saml20_login_must_ask_for_consent_private(LassoLogin *login);
static gint lasso_saml20_login_process_response_status_and_assertion(LassoLogin *login);
@@ -497,6 +496,7 @@ lasso_saml20_login_process_federation(LassoLogin *login, gboolean is_consent_obt
return 0;
}
+
int
lasso_saml20_login_build_assertion(LassoLogin *login,
const char *authenticationMethod,
@@ -512,6 +512,9 @@ lasso_saml20_login_build_assertion(LassoLogin *login,
LassoSamlp2NameIDPolicy *name_id_policy;
LassoSaml2NameID *name_id = NULL;
LassoSaml2AuthnStatement *authentication_statement;
+ LassoProvider *provider = NULL;
+ xmlNode *encrypted_node = NULL;
+ LassoSaml2EncryptedElement *encrypted_name_id = NULL;
federation = g_hash_table_lookup(profile->identity->federations,
profile->remote_providerID);
@@ -558,6 +561,21 @@ lasso_saml20_login_build_assertion(LassoLogin *login,
federation->local_nameIdentifier);
}
}
+
+ provider = g_hash_table_lookup(profile->server->providers, profile->remote_providerID);
+
+ /* If there is a key, encrypt. Maybe there should be another condition ? */
+ if (provider && provider->private_data->encryption_public_key != NULL) {
+ encrypted_node = lasso_node_encrypt(LASSO_NODE(assertion->Subject->NameID),
+ provider->private_data->encryption_public_key);
+ if (encrypted_node != NULL) {
+ encrypted_name_id = LASSO_SAML2_ENCRYPTED_ELEMENT(
+ lasso_saml2_encrypted_element_new());
+ encrypted_name_id->EncryptedData = encrypted_node;
+ assertion->Subject->EncryptedID = encrypted_name_id;
+ assertion->Subject->NameID = NULL;
+ }
+ }
authentication_statement = LASSO_SAML2_AUTHN_STATEMENT(lasso_saml2_authn_statement_new());
authentication_statement->AuthnInstant = g_strdup(authenticationInstant);
diff --git a/lasso/xml/private.h b/lasso/xml/private.h
index 267bde4b..4345bd03 100644
--- a/lasso/xml/private.h
+++ b/lasso/xml/private.h
@@ -44,6 +44,7 @@ typedef enum {
SNIPPET_EXTENSION,
SNIPPET_SIGNATURE,
SNIPPET_LIST_XMLNODES,
+ SNIPPET_XMLNODE,
/* transformers for content transformation */
SNIPPET_STRING = 1 << 0, /* default, can be omitted */
diff --git a/lasso/xml/saml-2.0/saml2_encrypted_element.c b/lasso/xml/saml-2.0/saml2_encrypted_element.c
index 84b69923..ba7558a1 100644
--- a/lasso/xml/saml-2.0/saml2_encrypted_element.c
+++ b/lasso/xml/saml-2.0/saml2_encrypted_element.c
@@ -41,7 +41,7 @@
static struct XmlSnippet schema_snippets[] = {
- { "EncryptedData", SNIPPET_NODE,
+ { "EncryptedData", SNIPPET_XMLNODE,
G_STRUCT_OFFSET(LassoSaml2EncryptedElement, EncryptedData) },
{ "EncryptedKey", SNIPPET_NODE,
G_STRUCT_OFFSET(LassoSaml2EncryptedElement, EncryptedKey) },
diff --git a/lasso/xml/saml-2.0/saml2_encrypted_element.h b/lasso/xml/saml-2.0/saml2_encrypted_element.h
index 8ef58871..c48da752 100644
--- a/lasso/xml/saml-2.0/saml2_encrypted_element.h
+++ b/lasso/xml/saml-2.0/saml2_encrypted_element.h
@@ -55,7 +55,7 @@ struct _LassoSaml2EncryptedElement {
/*< public >*/
/* elements */
- /* XXX */ void *EncryptedData;
+ xmlNode *EncryptedData;
/* XXX */ void *EncryptedKey;
};
diff --git a/lasso/xml/xml.c b/lasso/xml/xml.c
index c131a4e3..7e83c140 100644
--- a/lasso/xml/xml.c
+++ b/lasso/xml/xml.c
@@ -746,6 +746,9 @@ lasso_node_dispose(GObject *object)
case SNIPPET_NODE_IN_CHILD:
lasso_node_destroy(*value);
break;
+ case SNIPPET_XMLNODE:
+ xmlFreeNode(*value);
+ break;
case SNIPPET_EXTENSION:
case SNIPPET_LIST_NODES:
case SNIPPET_LIST_CONTENT:
@@ -1265,6 +1268,9 @@ lasso_node_build_xmlNode_from_snippets(LassoNode *node, xmlNode *xmlnode,
elem = g_list_next(elem);
}
break;
+ case SNIPPET_XMLNODE:
+ xmlAddChild(xmlnode, xmlCopyNode((xmlNode *)value, 1));
+ break;
case SNIPPET_SIGNATURE:
lasso_node_add_signature_template(node, xmlnode, snippet);
break;