summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Dauvergne <bdauvergne@entrouvert.com>2009-03-09 14:05:31 +0000
committerBenjamin Dauvergne <bdauvergne@entrouvert.com>2009-03-09 14:05:31 +0000
commit95d27816ee81f3c6b2cdea2bb2f0584a2df0b1a2 (patch)
tree538662515d216902765734bc4857914953236c03
parentcf50ac6da229df840409217ece42119a0292d1ba (diff)
downloadlasso-95d27816ee81f3c6b2cdea2bb2f0584a2df0b1a2.tar.gz
lasso-95d27816ee81f3c6b2cdea2bb2f0584a2df0b1a2.tar.xz
lasso-95d27816ee81f3c6b2cdea2bb2f0584a2df0b1a2.zip
Core: add a method to decrypt nameid, handling error cases
* lasso/id-dff/serverprivate.h: * lasso/id-ff/server.c: lasso_server_decrypt_nameid handle error case of NameID decryption, and update passed field pointers. * lasso/errors.h: add new error codes: LASSO_DS_ERROR_DECRYPTION_FAILED -118 - Decryption of an encrypted node failed LASSO_PROFILE_ERROR_MISSING_SERVER -438 - No server object set in the profile
-rw-r--r--lasso/errors.c4
-rw-r--r--lasso/errors.h2
-rw-r--r--lasso/id-ff/server.c41
-rw-r--r--lasso/id-ff/serverprivate.h3
4 files changed, 50 insertions, 0 deletions
diff --git a/lasso/errors.c b/lasso/errors.c
index e90b8cf5..852cd93c 100644
--- a/lasso/errors.c
+++ b/lasso/errors.c
@@ -129,6 +129,8 @@ lasso_strerror(int error_code)
return "LASSO_XML_ERROR_MISSING_NAMESPACE";
case LASSO_DS_ERROR_INVALID_SIGNATURE:
return "Invalid signature.";
+ case LASSO_DS_ERROR_DECRYPTION_FAILED:
+ return "Decryption of an encrypted node failed";
case LASSO_LOGIN_ERROR_ASSERTION_DOES_NOT_MATCH_REQUEST_ID:
return "If inResponseTo attribute is present, a matching request must be present too in the LassoLogin object";
case LASSO_SERVER_ERROR_SET_ENCRYPTION_PRIVATE_KEY_FAILED:
@@ -205,6 +207,8 @@ lasso_strerror(int error_code)
return "Invalid XML file";
case LASSO_WSF_PROFILE_ERROR_MISSING_ENDPOINT:
return "Cannot find an WSP endpoint for the ID-WSF service";
+ case LASSO_PROFILE_ERROR_MISSING_SERVER:
+ return "No server object set in the profile";
case LASSO_XML_ERROR_NODE_NOT_FOUND:
return "Unable to get child of element.";
case LASSO_ERROR_UNIMPLEMENTED:
diff --git a/lasso/errors.h b/lasso/errors.h
index e6145269..79cdae03 100644
--- a/lasso/errors.h
+++ b/lasso/errors.h
@@ -57,6 +57,7 @@
#define LASSO_DS_ERROR_SIGNATURE_TEMPLATE_NOT_FOUND -115 /* Signature template has not been found. */
#define LASSO_DS_ERROR_TOO_MUCH_REFERENCES -116 /* SAML signature must contain only one reference */
#define LASSO_DS_ERROR_INVALID_REFERENCE_FOR_SAML -117 /* SAML signature reference must be to a Request, a Reponse or an Assertion ID attribute */
+#define LASSO_DS_ERROR_DECRYPTION_FAILED -118 /* Decryption of an encrypted node failed */
/* Server */
#define LASSO_SERVER_ERROR_PROVIDER_NOT_FOUND -201 /* ProviderID unknown to LassoServer. */
@@ -109,6 +110,7 @@
#define LASSO_PROFILE_ERROR_MISSING_ENDPOINT_REFERENCE -435 /* Missing endpoint reference */
#define LASSO_PROFILE_ERROR_MISSING_ENDPOINT_REFERENCE_ADDRESS -436 /* Missing endpoint reference address */
#define LASSO_PROFILE_ERROR_INVALID_ISSUER -437 /* Assertion issuer is not thesame as the requested issuer */
+#define LASSO_PROFILE_ERROR_MISSING_SERVER -438 /* No server object set in the profile */
/* functions/methods parameters checking */
#define LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ -501 /* An object type provided as parameter */
diff --git a/lasso/id-ff/server.c b/lasso/id-ff/server.c
index f7649e44..f3a5bacf 100644
--- a/lasso/id-ff/server.c
+++ b/lasso/id-ff/server.c
@@ -837,3 +837,44 @@ lasso_server_dump(LassoServer *server)
{
return lasso_node_dump(LASSO_NODE(server));
}
+
+/**
+ * lasso_decrypt_nameid:
+ * @profile: a #LassoProfile object
+ * @nameid_field: reference to the nameid pointer.
+ * @encryptedid_field: reference to the encryptedid pointer.
+ *
+ * Decrypt the LassoNode pointed by the first field pointer, and try to place the result in the
+ * second field.
+ *
+ * Return value: LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ,
+ * LASSO_PROFILE_ERROR_MISSING_SERVER,
+ * LASSO_PROFILE_ERROR_MISSING_ENCRYPTION_PRIVATE_KEY,
+ * LASSO_PROFILE_ERROR_NAME_IDENTIFIER_NOT_FOUND,
+ * LASSO_DS_ERROR_DECRYPTION_FAILED
+ */
+int
+lasso_server_decrypt_nameid(LassoServer *server,
+ LassoSaml2EncryptedElement **encryptedid_field,
+ LassoNode **nameid_field)
+{
+ LassoNode *new_name_id;
+ xmlSecKey *encryption_private_key;
+
+ lasso_bad_param(SERVER, server);
+ lasso_null_param(encryptedid_field);
+ lasso_null_param(nameid_field);
+
+ encryption_private_key = server->private_data->encryption_private_key;
+ g_return_val_if_fail(encryption_private_key != NULL, LASSO_PROFILE_ERROR_MISSING_ENCRYPTION_PRIVATE_KEY);
+ new_name_id = lasso_node_decrypt(*encryptedid_field, encryption_private_key);
+
+ if (new_name_id) {
+ return LASSO_DS_ERROR_DECRYPTION_FAILED;
+ }
+ lasso_assign_new_gobject(*nameid_field, new_name_id);
+ lasso_release_gobject(*encryptedid_field);
+
+ return 0;
+}
+
diff --git a/lasso/id-ff/serverprivate.h b/lasso/id-ff/serverprivate.h
index 1c4ef9db..bcdcbafb 100644
--- a/lasso/id-ff/serverprivate.h
+++ b/lasso/id-ff/serverprivate.h
@@ -38,6 +38,9 @@ struct _LassoServerPrivate
gchar* lasso_server_get_first_providerID(LassoServer *server);
gchar* lasso_server_get_providerID_from_hash(LassoServer *server, gchar *b64_hash);
+int lasso_server_decrypt_nameid(LassoServer *profile,
+ LassoSaml2EncryptedElement **encryptedid_field,
+ LassoNode **nameid_field);
#ifdef __cplusplus
}