1 /* $Id$
2  *
3  * Lasso - A free implementation of the Liberty Alliance specifications.
4  *
5  * Copyright (C) 2004-2007 Entr'ouvert
6  * http://lasso.entrouvert.org
7  *
8  * Authors: See AUTHORS file in top-level directory.
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, see <http://www.gnu.org/licenses/>.
22  */
23 
24 #ifndef __LASSO_XML_H__
25 #define __LASSO_XML_H__
26 
27 #ifdef __cplusplus
28 extern "C" {
29 #endif /* __cplusplus */
30 
31 #include <string.h>
32 
33 #include <glib.h>
34 #include <glib-object.h>
35 
36 #include <libxml/uri.h>
37 #include <libxml/tree.h>
38 #include <libxml/xmlreader.h>
39 
40 #include "../export.h"
41 #include "../errors.h"
42 #include "strings.h"
43 
44 #define LASSO_TYPE_NODE (lasso_node_get_type())
45 #define LASSO_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), LASSO_TYPE_NODE, LassoNode))
46 #define LASSO_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), LASSO_TYPE_NODE, LassoNodeClass))
47 #define LASSO_IS_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), LASSO_TYPE_NODE))
48 #define LASSO_IS_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LASSO_TYPE_NODE))
49 #define LASSO_NODE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), LASSO_TYPE_NODE, LassoNodeClass))
50 
51 /**
52  * LassoMessageFormat:
53  * @LASSO_MESSAGE_FORMAT_ERROR: error while determining format
54  * @LASSO_MESSAGE_FORMAT_UNKNOWN: unknown format
55  * @LASSO_MESSAGE_FORMAT_XML: XML
56  * @LASSO_MESSAGE_FORMAT_BASE64: base-64 encoded
57  * @LASSO_MESSAGE_FORMAT_QUERY: query string
58  * @LASSO_MESSAGE_FORMAT_SOAP: SOAP
59  *
60  * Return code for lasso_node_init_from_message; it describes the type of the
61  * message that was passed to that function.
62  **/
63 typedef enum {
64 	LASSO_MESSAGE_FORMAT_XSCHEMA_ERROR = -2,
65 	LASSO_MESSAGE_FORMAT_ERROR = -1,
66 	LASSO_MESSAGE_FORMAT_UNKNOWN,
67 	LASSO_MESSAGE_FORMAT_XML,
68 	LASSO_MESSAGE_FORMAT_BASE64,
69 	LASSO_MESSAGE_FORMAT_QUERY,
70 	LASSO_MESSAGE_FORMAT_SOAP
71 } LassoMessageFormat;
72 
73 
74 /**
75  * LassoSignatureType:
76  * @LASSO_SIGNATURE_TYPE_NONE: no signature
77  * @LASSO_SIGNATURE_TYPE_SIMPLE: sign with the private key, copy the public part in the signature.
78  * @LASSO_SIGNATURE_TYPE_WITHX509: sign with the private key, copy the associated certificat in the
79  * signature.
80  *
81  * Signature type.
82  **/
83 typedef enum {
84 	LASSO_SIGNATURE_TYPE_NONE = 0,
85 	LASSO_SIGNATURE_TYPE_SIMPLE,
86 	LASSO_SIGNATURE_TYPE_WITHX509,
87 	LASSO_SIGNATURE_TYPE_LAST
88 } LassoSignatureType;
89 
90 
91 /**
92  * LassoSignatureMethod:
93  * @LASSO_SIGNATURE_METHOD_RSA_SHA1: sign using a RSA private key
94  * @LASSO_SIGNATURE_METHOD_DSA_SHA1: sign using a DSA private key
95  * @LASSO_SIGNATURE_METHOD_HMAC_SHA1: sign using a HMAC-SHA1 secret key
96  * @LASSO_SIGNATURE_METHOD_RSA_SHA256: sign using a RSA private key and use SHA256 digest
97  * @LASSO_SIGNATURE_METHOD_HMAC_SHA256: sign using a HMAC-SHA256 secret key
98  * @LASSO_SIGNATURE_METHOD_RSA_SHA384: sign using a RSA private key and use SHA384 digest
99  * @LASSO_SIGNATURE_METHOD_HMAC_SHA384: sign using a HMAC-SHA384 secret key
100  * @LASSO_SIGNATURE_METHOD_RSA_SHA512: sign using a RSA private key and use SHA521 digest
101  * @LASSO_SIGNATURE_METHOD_HMAC_SHA512: sign using a HMAC-SHA512 secret key
102  *
103  * Signature method.
104  **/
105 typedef enum {
106 	LASSO_SIGNATURE_METHOD_NONE = 0,
107 	LASSO_SIGNATURE_METHOD_RSA_SHA1,
108 	LASSO_SIGNATURE_METHOD_DSA_SHA1,
109 	LASSO_SIGNATURE_METHOD_HMAC_SHA1,
110 	LASSO_SIGNATURE_METHOD_RSA_SHA256,
111 	LASSO_SIGNATURE_METHOD_HMAC_SHA256,
112 	LASSO_SIGNATURE_METHOD_RSA_SHA384,
113 	LASSO_SIGNATURE_METHOD_HMAC_SHA384,
114 	LASSO_SIGNATURE_METHOD_RSA_SHA512,
115 	LASSO_SIGNATURE_METHOD_HMAC_SHA512,
116 	LASSO_SIGNATURE_METHOD_LAST
117 } LassoSignatureMethod;
118 
119 static inline gboolean
lasso_validate_signature_method(LassoSignatureMethod signature_method)120 lasso_validate_signature_method(LassoSignatureMethod signature_method)
121 {
122 	return signature_method > (LassoSignatureMethod)LASSO_SIGNATURE_TYPE_NONE \
123 		&& signature_method < (LassoSignatureMethod)LASSO_SIGNATURE_METHOD_LAST;
124 }
125 
126 typedef struct _LassoNode LassoNode;
127 typedef struct _LassoNodeClass LassoNodeClass;
128 typedef struct _LassoNodeClassData LassoNodeClassData;
129 
130 /**
131  * LassoNode:
132  *
133  * Base type for all XML contents, or for object using serialization to XML.
134  **/
135 struct _LassoNode {
136 	GObject parent;
137 };
138 
139 struct _LassoNodeClass {
140 	GObjectClass parent_class;
141 	LassoNodeClassData *node_data;
142 
143 	void     (* destroy)            (LassoNode *node);
144 	char*    (* build_query)        (LassoNode *node);
145 	gboolean (* init_from_query)    (LassoNode *node, char **query_fields);
146 	int      (* init_from_xml)      (LassoNode *node, xmlNode *xmlnode);
147 	xmlNode* (* get_xmlNode)        (LassoNode *node, gboolean lasso_dump);
148 };
149 
150 #include "../xml/saml-2.0/samlp2_idp_list.h"
151 
152 
153 LASSO_EXPORT GType lasso_node_get_type(void);
154 
155 LASSO_EXPORT LassoNode* lasso_node_new(void);
156 LASSO_EXPORT LassoNode* lasso_node_new_from_dump(const char *dump);
157 LASSO_EXPORT LassoNode* lasso_node_new_from_soap(const char *soap);
158 LASSO_EXPORT LassoNode* lasso_node_new_from_xmlNode(xmlNode* node);
159 
160 LASSO_EXPORT void lasso_node_cleanup_original_xmlnodes(LassoNode *node);
161 LASSO_EXPORT void lasso_node_destroy(LassoNode *node);
162 LASSO_EXPORT char* lasso_node_dump(LassoNode *node);
163 LASSO_EXPORT char* lasso_node_export_to_base64(LassoNode *node);
164 
165 LASSO_EXPORT char* lasso_node_export_to_query(LassoNode *node,
166 		LassoSignatureMethod sign_method, const char *private_key_file);
167 
168 LASSO_EXPORT char* lasso_node_export_to_query_with_password(LassoNode *node,
169 		LassoSignatureMethod sign_method, const char *private_key_file,
170 		const char *private_key_file_password);
171 
172 LASSO_EXPORT char* lasso_node_export_to_soap(LassoNode *node);
173 
174 LASSO_EXPORT char* lasso_node_export_to_soap_with_headers(LassoNode *node, GList *headers);
175 
176 LASSO_EXPORT gchar* lasso_node_export_to_xml(LassoNode *node);
177 
178 LASSO_EXPORT char* lasso_node_export_to_paos_request(LassoNode *node, const char *issuer,
179 				const char *responseConsumerURL, const char *relay_state);
180 
181 LASSO_EXPORT char* lasso_node_export_to_paos_request_full(LassoNode *node, const char *issuer,
182 									   const char *responseConsumerURL, const char *message_id,
183 									   const char *relay_state, gboolean is_passive, gchar *provider_name,
184 									   LassoSamlp2IDPList *idp_list);
185 
186 LASSO_EXPORT char* lasso_node_export_to_ecp_soap_response(LassoNode *node,
187 				const char *assertionConsumerURL);
188 
189 LASSO_EXPORT xmlNode* lasso_node_get_xmlNode(LassoNode *node, gboolean lasso_dump);
190 
191 LASSO_EXPORT xmlNode* lasso_node_get_original_xmlnode(LassoNode *node);
192 
193 LASSO_EXPORT void lasso_node_set_original_xmlnode(LassoNode *node, xmlNode* xmlnode);
194 
195 LASSO_EXPORT void lasso_node_set_custom_namespace(LassoNode *node, const char *prefix,
196 		const char *href);
197 
198 LASSO_EXPORT void lasso_node_set_custom_nodename(LassoNode *node, const char *nodename);
199 
200 LASSO_EXPORT const char* lasso_node_get_name(LassoNode *node);
201 
202 LASSO_EXPORT const char* lasso_node_get_namespace(LassoNode *node);
203 
204 LASSO_EXPORT LassoMessageFormat lasso_node_init_from_message(LassoNode *node, const char *message);
205 
206 LASSO_EXPORT gboolean lasso_node_init_from_query(LassoNode *node, const char *query);
207 LASSO_EXPORT lasso_error_t lasso_node_init_from_xml(LassoNode *node, xmlNode *xmlnode);
208 
209 LASSO_EXPORT void lasso_register_dst_service(const char *prefix, const char *href);
210 
211 LASSO_EXPORT char* lasso_get_prefix_for_dst_service_href(const char *href);
212 
213 LASSO_EXPORT void lasso_register_idwsf2_dst_service(const gchar *prefix, const gchar *href);
214 
215 LASSO_EXPORT gchar* lasso_get_prefix_for_idwsf2_dst_service_href(const gchar *href);
216 
217 LASSO_EXPORT char* lasso_node_debug(LassoNode *node, int level);
218 
219 struct _LassoKey;
220 
221 LASSO_EXPORT char* lasso_node_export_to_saml2_query(LassoNode *node, const char *param_name, const
222 		char *url, struct _LassoKey *key);
223 
224 #ifdef __cplusplus
225 }
226 #endif /* __cplusplus */
227 
228 #endif /* __LASSO_XML_H__ */
229