upload source
[external/xmlsec1.git] / src / dl.c
1 /** 
2  * XML Security Library (http://www.aleksey.com/xmlsec).
3  *
4  *
5  * This is free software; see Copyright file in the source
6  * distribution for preciese wording.
7  * 
8  * Copyright (C) 2002-2003 Aleksey Sanin <aleksey@aleksey.com>
9  */
10 #include "globals.h"
11
12 #include <stdlib.h>
13 #include <stdio.h>
14 #include <stdarg.h>
15 #include <string.h>
16 #include <time.h>
17
18 #include <libxml/tree.h>
19
20 #include <xmlsec/xmlsec.h>
21 #include <xmlsec/app.h>
22 #include <xmlsec/list.h>
23 #include <xmlsec/keysdata.h>
24 #include <xmlsec/keys.h>
25 #include <xmlsec/keysmngr.h>
26 #include <xmlsec/transforms.h>
27 #include <xmlsec/private.h>
28 #include <xmlsec/xmltree.h>
29 #include <xmlsec/errors.h>
30 #include <xmlsec/dl.h>
31
32 #ifndef XMLSEC_NO_CRYPTO_DYNAMIC_LOADING
33
34
35 #ifdef XMLSEC_DL_LIBLTDL
36 #include <ltdl.h>
37 #endif /* XMLSEC_DL_LIBLTDL */
38
39 #ifdef XMLSEC_DL_WIN32
40 #include <windows.h>
41 #endif /* XMLSEC_DL_WIN32 */
42
43 /***********************************************************************
44  *
45  * loaded libraries list
46  *
47  **********************************************************************/
48 typedef struct _xmlSecCryptoDLLibrary                                   xmlSecCryptoDLLibrary,
49                                                                         *xmlSecCryptoDLLibraryPtr;
50 struct _xmlSecCryptoDLLibrary {
51     xmlChar*    name;
52     xmlChar*    filename;
53     xmlChar*    getFunctionsName;
54     xmlSecCryptoDLFunctionsPtr functions;
55
56 #ifdef XMLSEC_DL_LIBLTDL
57     lt_dlhandle handle;
58 #endif /* XMLSEC_DL_LIBLTDL */
59
60 #ifdef XMLSEC_DL_WIN32
61     HINSTANCE   handle;
62 #endif /* XMLSEC_DL_WIN32 */
63 };
64
65 static xmlSecCryptoDLLibraryPtr xmlSecCryptoDLLibraryCreate             (const xmlChar* name);
66 static void                     xmlSecCryptoDLLibraryDestroy            (xmlSecCryptoDLLibraryPtr lib);
67 static xmlSecCryptoDLLibraryPtr xmlSecCryptoDLLibraryDuplicate          (xmlSecCryptoDLLibraryPtr lib);
68 static xmlChar*                 xmlSecCryptoDLLibraryConstructFilename  (const xmlChar* name);
69 static xmlChar*                 xmlSecCryptoDLLibraryConstructGetFunctionsName(const xmlChar* name);
70                                                         
71
72 static xmlSecPtrListKlass xmlSecCryptoDLLibrariesListKlass = {
73     BAD_CAST "dl-libraries-list",
74     (xmlSecPtrDuplicateItemMethod)xmlSecCryptoDLLibraryDuplicate,/* xmlSecPtrDuplicateItemMethod duplicateItem; */
75     (xmlSecPtrDestroyItemMethod)xmlSecCryptoDLLibraryDestroy,   /* xmlSecPtrDestroyItemMethod destroyItem; */
76     NULL,                                                       /* xmlSecPtrDebugDumpItemMethod debugDumpItem; */
77     NULL,                                                       /* xmlSecPtrDebugDumpItemMethod debugXmlDumpItem; */
78 };
79 static xmlSecPtrListId          xmlSecCryptoDLLibrariesListGetKlass     (void);
80 static int                      xmlSecCryptoDLLibrariesListFindByName   (xmlSecPtrListPtr list, 
81                                                                          const xmlChar* name);
82
83 typedef xmlSecCryptoDLFunctionsPtr (*xmlSecCryptoGetFunctionsCallback)(void);
84
85 static xmlSecCryptoDLLibraryPtr 
86 xmlSecCryptoDLLibraryCreate(const xmlChar* name) {
87     xmlSecCryptoDLLibraryPtr lib;
88     xmlSecCryptoGetFunctionsCallback getFunctions;
89     
90     xmlSecAssert2(name != NULL, NULL);
91
92     /* fprintf (stderr, "loading \"library %s\"...\n", name); */
93     
94     /* Allocate a new xmlSecCryptoDLLibrary and fill the fields. */
95     lib = (xmlSecCryptoDLLibraryPtr)xmlMalloc(sizeof(xmlSecCryptoDLLibrary));
96     if(lib == NULL) {
97         xmlSecError(XMLSEC_ERRORS_HERE,
98                     NULL,
99                     NULL,
100                     XMLSEC_ERRORS_R_MALLOC_FAILED,
101                     "size=%d", sizeof(lib)); 
102         return(NULL);
103     }
104     memset(lib, 0, sizeof(xmlSecCryptoDLLibrary));
105     
106     lib->name = xmlStrdup(name);
107     if(lib->name == NULL) {
108         xmlSecError(XMLSEC_ERRORS_HERE,
109                     "xmlStrdup",
110                     NULL,
111                     XMLSEC_ERRORS_R_MALLOC_FAILED,
112                     XMLSEC_ERRORS_NO_MESSAGE); 
113         xmlSecCryptoDLLibraryDestroy(lib);
114         return(NULL);
115     }
116
117     lib->filename = xmlSecCryptoDLLibraryConstructFilename(name);
118     if(lib->filename == NULL) {
119         xmlSecError(XMLSEC_ERRORS_HERE,
120                     "xmlSecCryptoDLLibraryConstructFilename",
121                     NULL,
122                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
123                     XMLSEC_ERRORS_NO_MESSAGE); 
124         xmlSecCryptoDLLibraryDestroy(lib);
125         return(NULL);
126     }
127
128     lib->getFunctionsName = xmlSecCryptoDLLibraryConstructGetFunctionsName(name);
129     if(lib->getFunctionsName == NULL) {
130         xmlSecError(XMLSEC_ERRORS_HERE,
131                     "xmlSecCryptoDLLibraryConstructGetFunctionsName",
132                     NULL,
133                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
134                     XMLSEC_ERRORS_NO_MESSAGE); 
135         xmlSecCryptoDLLibraryDestroy(lib);
136         return(NULL);
137     }
138
139 #ifdef XMLSEC_DL_LIBLTDL
140     lib->handle = lt_dlopenext((char*)lib->filename);
141     if(lib->handle == NULL) {
142         xmlSecError(XMLSEC_ERRORS_HERE,
143                     "lt_dlopenext",
144                     NULL,
145                     XMLSEC_ERRORS_R_IO_FAILED,
146                     "filename=%s",
147                     xmlSecErrorsSafeString(lib->filename));
148         xmlSecCryptoDLLibraryDestroy(lib);
149         return(NULL);
150     }
151
152     getFunctions = (xmlSecCryptoGetFunctionsCallback)lt_dlsym(lib->handle, (char*)lib->getFunctionsName);
153     if(getFunctions == NULL) {
154         xmlSecError(XMLSEC_ERRORS_HERE,
155                     "lt_dlsym",
156                     NULL,
157                     XMLSEC_ERRORS_R_IO_FAILED,
158                     "function=%s",
159                     xmlSecErrorsSafeString(lib->getFunctionsName));
160         xmlSecCryptoDLLibraryDestroy(lib);
161         return(NULL);
162     }
163 #endif /* XMLSEC_DL_LIBLTDL */
164
165 #ifdef XMLSEC_DL_WIN32
166     lib->handle = LoadLibraryA((char*)lib->filename);
167     if(lib->handle == NULL) {
168         xmlSecError(XMLSEC_ERRORS_HERE,
169                     "LoadLibraryA",
170                     NULL,
171                     XMLSEC_ERRORS_R_IO_FAILED,
172                     "filename=%s",
173                     xmlSecErrorsSafeString(lib->filename));
174         xmlSecCryptoDLLibraryDestroy(lib);
175         return(NULL);
176     }
177
178     getFunctions = (xmlSecCryptoGetFunctionsCallback)GetProcAddress(lib->handle, (char*)lib->getFunctionsName);
179     if(getFunctions == NULL) {
180         xmlSecError(XMLSEC_ERRORS_HERE,
181                     "GetProcAddressA",
182                     NULL,
183                     XMLSEC_ERRORS_R_IO_FAILED,
184                     "function=%s",
185                     xmlSecErrorsSafeString(lib->getFunctionsName));
186         xmlSecCryptoDLLibraryDestroy(lib);
187         return(NULL);
188     }
189 #endif /* XMLSEC_DL_WIN32 */
190
191     if(getFunctions == NULL) {
192         xmlSecError(XMLSEC_ERRORS_HERE,
193                     NULL,
194                     NULL,
195                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
196                     "invalid configuration: no way to load library");
197         xmlSecCryptoDLLibraryDestroy(lib);
198         return(NULL);
199     }    
200
201     lib->functions = getFunctions();
202     if(lib->functions == NULL) {
203         xmlSecError(XMLSEC_ERRORS_HERE,
204                     "getFunctions",
205                     NULL,
206                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
207                     XMLSEC_ERRORS_NO_MESSAGE); 
208         xmlSecCryptoDLLibraryDestroy(lib);
209         return(NULL);
210     }
211
212     /* fprintf (stderr, "library %s loaded\n", name); */
213     return(lib);
214 }
215
216 static void 
217 xmlSecCryptoDLLibraryDestroy(xmlSecCryptoDLLibraryPtr lib) {
218     xmlSecAssert(lib != NULL);
219
220     /* fprintf (stderr, "unloading \"library %s\"...\n", lib->name); */
221     if(lib->name != NULL) {
222         xmlFree(lib->name);
223     }
224
225     if(lib->filename != NULL) {
226         xmlFree(lib->filename);
227     }
228     
229     if(lib->getFunctionsName != NULL) {
230         xmlFree(lib->getFunctionsName);
231     }
232
233 #ifdef XMLSEC_DL_LIBLTDL
234     if(lib->handle != NULL) {   
235         int ret;
236         
237         ret = lt_dlclose(lib->handle);
238         if(ret != 0) {
239             xmlSecError(XMLSEC_ERRORS_HERE,
240                         "lt_dlclose",
241                         NULL,
242                         XMLSEC_ERRORS_R_IO_FAILED,
243                         XMLSEC_ERRORS_NO_MESSAGE);
244         }
245     }
246 #endif /* XMLSEC_DL_LIBLTDL */
247
248 #ifdef XMLSEC_DL_WIN32
249     if(lib->handle != NULL) {   
250         BOOL res;
251
252         res = FreeLibrary(lib->handle);
253         if(!res) {
254             xmlSecError(XMLSEC_ERRORS_HERE,
255                         "FreeLibrary",
256                         NULL,
257                         XMLSEC_ERRORS_R_IO_FAILED,
258                         XMLSEC_ERRORS_NO_MESSAGE);
259         }
260         }
261 #endif /* XMLSEC_DL_WIN32*/
262
263     memset(lib, 0, sizeof(xmlSecCryptoDLLibrary));
264     xmlFree(lib);
265 }
266
267 static xmlSecCryptoDLLibraryPtr 
268 xmlSecCryptoDLLibraryDuplicate(xmlSecCryptoDLLibraryPtr lib) {
269     xmlSecAssert2(lib != NULL, NULL);
270     xmlSecAssert2(lib->name != NULL, NULL);
271
272     return(xmlSecCryptoDLLibraryCreate(lib->name));
273 }
274
275 static xmlChar* 
276 xmlSecCryptoDLLibraryConstructFilename(const xmlChar* name) {
277     static xmlChar tmpl[] = "lib%s-%s";
278     xmlChar* res;
279     int len;
280
281     xmlSecAssert2(name != NULL, NULL);
282
283     /* TODO */
284     len = xmlStrlen(BAD_CAST PACKAGE) + xmlStrlen(name) + xmlStrlen(tmpl) + 1;
285     res = (xmlChar*)xmlMalloc(len + 1);
286     if(res == NULL) {
287         xmlSecError(XMLSEC_ERRORS_HERE,
288                     NULL,
289                     NULL,
290                     XMLSEC_ERRORS_R_MALLOC_FAILED,
291                     "size=%d", len + 1); 
292         return(NULL);
293     }
294     xmlSecStrPrintf(res, len, tmpl, PACKAGE, name);
295     
296     return(res);
297 }
298
299 static xmlChar* 
300 xmlSecCryptoDLLibraryConstructGetFunctionsName(const xmlChar* name) {
301     static xmlChar tmpl[] = "xmlSecCryptoGetFunctions_%s";
302     xmlChar* res;
303     int len;
304     
305     xmlSecAssert2(name != NULL, NULL);
306     
307     len = xmlStrlen(name) + xmlStrlen(tmpl) + 1;
308     res = (xmlChar*)xmlMalloc(len + 1);
309     if(res == NULL) {
310         xmlSecError(XMLSEC_ERRORS_HERE,
311                     NULL,
312                     NULL,
313                     XMLSEC_ERRORS_R_MALLOC_FAILED,
314                     "size=%d", len + 1); 
315         return(NULL);
316     }
317     xmlSecStrPrintf(res, len, tmpl, name);
318     
319     return(res);
320 }
321
322 static xmlSecPtrListId 
323 xmlSecCryptoDLLibrariesListGetKlass(void) {
324     return(&xmlSecCryptoDLLibrariesListKlass);
325 }
326
327 static int
328 xmlSecCryptoDLLibrariesListFindByName(xmlSecPtrListPtr list, const xmlChar* name) {
329     xmlSecSize i, size;
330     xmlSecCryptoDLLibraryPtr lib;
331     
332     xmlSecAssert2(xmlSecPtrListCheckId(list, xmlSecCryptoDLLibrariesListGetKlass()), -1);
333     xmlSecAssert2(name != NULL, -1);
334     
335     size = xmlSecPtrListGetSize(list);
336     for(i = 0; i < size; ++i) {
337         lib = (xmlSecCryptoDLLibraryPtr)xmlSecPtrListGetItem(list, i);
338         if((lib != NULL) && (lib->name != NULL) && (xmlStrcmp(lib->name, name) == 0)) {
339             return(i);
340         }
341     }
342     return(-1);
343 }
344
345 /******************************************************************************
346  *
347  * Dynamic load functions
348  *
349  *****************************************************************************/
350 static xmlSecCryptoDLFunctionsPtr gXmlSecCryptoDLFunctions = NULL;
351 static xmlSecPtrList gXmlSecCryptoDLLibraries;
352
353 /**
354  * xmlSecCryptoDLInit:
355  * 
356  * Initializes dynamic loading engine. This is an internal function
357  * and should not be called by application directly.
358  *
359  * Returns: 0 on success or a negative value if an error occurs.
360  */
361 int 
362 xmlSecCryptoDLInit(void) {
363     int ret;
364     
365     ret = xmlSecPtrListInitialize(&gXmlSecCryptoDLLibraries, xmlSecCryptoDLLibrariesListGetKlass());
366     if(ret < 0) {
367         xmlSecError(XMLSEC_ERRORS_HERE,
368                     NULL,
369                     "xmlSecPtrListPtrInitialize",
370                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
371                     "xmlSecCryptoDLLibrariesListGetKlass");
372         return(-1);
373     }
374
375 #ifdef XMLSEC_DL_LIBLTDL
376     ret = lt_dlinit ();
377     if(ret != 0) {
378         xmlSecError(XMLSEC_ERRORS_HERE,
379                     NULL,
380                     "lt_dlinit",
381                     XMLSEC_ERRORS_R_IO_FAILED,
382                     XMLSEC_ERRORS_NO_MESSAGE);
383         return(-1);
384     }
385 #endif /* XMLSEC_DL_LIBLTDL */
386
387     return(0);
388 }
389
390
391 /**
392  * xmlSecCryptoDLShutdown:
393  * 
394  * Shutdowns dynamic loading engine. This is an internal function
395  * and should not be called by application directly.
396  *
397  * Returns: 0 on success or a negative value if an error occurs.
398  */
399 int 
400 xmlSecCryptoDLShutdown(void) {
401     int ret;
402
403     xmlSecPtrListFinalize(&gXmlSecCryptoDLLibraries);
404
405 #ifdef XMLSEC_DL_LIBLTDL
406     ret = lt_dlexit ();
407     if(ret != 0) {
408         xmlSecError(XMLSEC_ERRORS_HERE,
409                     NULL,
410                     "lt_dlexit",
411                     XMLSEC_ERRORS_R_IO_FAILED,
412                     XMLSEC_ERRORS_NO_MESSAGE);
413     }
414 #endif /* XMLSEC_DL_LIBLTDL */
415
416     return(0);
417 }
418
419 /** 
420  * xmlSecCryptoDLLoadLibrary:
421  * @crypto:             the desired crypto library name ("openssl", "nss", ...).
422  *
423  * Loads the xmlsec-<crypto> library. This function is NOT thread safe, 
424  * application MUST NOT call #xmlSecCryptoDLLoadLibrary, #xmlSecCryptoDLGetLibraryFunctions,
425  * and #xmlSecCryptoDLUnloadLibrary functions from multiple threads.
426  *
427  * Returns: 0 on success or a negative value if an error occurs.
428  */
429 int 
430 xmlSecCryptoDLLoadLibrary(const xmlChar* crypto) {
431     xmlSecCryptoDLFunctionsPtr functions;
432     int ret;
433     
434     xmlSecAssert2(crypto != NULL, -1);
435
436     functions = xmlSecCryptoDLGetLibraryFunctions(crypto);
437     if(functions == NULL) {
438         xmlSecError(XMLSEC_ERRORS_HERE,
439                     NULL,
440                     "xmlSecCryptoDLGetLibraryFunctions",
441                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
442                     XMLSEC_ERRORS_NO_MESSAGE);
443         return(-1);
444     }
445     
446     ret = xmlSecCryptoDLSetFunctions(functions);
447     if(ret < 0) {
448         xmlSecError(XMLSEC_ERRORS_HERE,
449                     NULL,
450                     "xmlSecCryptoDLSetFunctions",
451                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
452                     XMLSEC_ERRORS_NO_MESSAGE);
453         return(-1);
454     }
455     return(0);
456 }
457
458 /** 
459  * xmlSecCryptoDLGetLibraryFunctions:
460  * @crypto:             the desired crypto library name ("openssl", "nss", ...).
461  *
462  * Loads the xmlsec-<crypto> library and gets global crypto functions/transforms/keys data/keys store 
463  * table. This function is NOT thread safe, application MUST NOT call #xmlSecCryptoDLLoadLibrary, 
464  * #xmlSecCryptoDLGetLibraryFunctions, and #xmlSecCryptoDLUnloadLibrary functions from multiple threads.
465  *
466  * Returns: the table or NULL if an error occurs.
467  */
468 xmlSecCryptoDLFunctionsPtr 
469 xmlSecCryptoDLGetLibraryFunctions(const xmlChar* crypto) {
470     xmlSecCryptoDLLibraryPtr lib;
471     int pos;
472     int ret;
473         
474     xmlSecAssert2(crypto != NULL, NULL);
475
476     pos = xmlSecCryptoDLLibrariesListFindByName(&gXmlSecCryptoDLLibraries, crypto);
477     if(pos >= 0) {
478         lib = (xmlSecCryptoDLLibraryPtr)xmlSecPtrListGetItem(&gXmlSecCryptoDLLibraries, pos);
479         xmlSecAssert2(lib != NULL, NULL);
480         xmlSecAssert2(lib->functions != NULL, NULL);
481         
482         return(lib->functions);
483     }
484
485     lib = xmlSecCryptoDLLibraryCreate(crypto);
486     if(lib == NULL) {
487         xmlSecError(XMLSEC_ERRORS_HERE,
488                     NULL,
489                     "xmlSecCryptoDLLibraryCreate",
490                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
491                     "crypto=%s",
492                     xmlSecErrorsSafeString(crypto));
493         return(NULL);
494     }
495
496     ret = xmlSecPtrListAdd(&gXmlSecCryptoDLLibraries, lib);    
497     if(ret < 0) {
498         xmlSecError(XMLSEC_ERRORS_HERE,
499                     NULL,
500                     "xmlSecPtrListAdd",
501                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
502                     "crypto=%s",
503                     xmlSecErrorsSafeString(crypto));
504         xmlSecCryptoDLLibraryDestroy(lib);
505         return(NULL);
506     }
507
508     return(lib->functions);
509 }
510
511 /** 
512  * xmlSecCryptoDLUnloadLibrary:
513  * @crypto:             the desired crypto library name ("openssl", "nss", ...).
514  *
515  * Unloads the xmlsec-<crypto> library. All pointers to this library
516  * functions tables became invalid. This function is NOT thread safe, 
517  * application MUST NOT call #xmlSecCryptoDLLoadLibrary, #xmlSecCryptoDLGetLibraryFunctions,
518  * and #xmlSecCryptoDLUnloadLibrary functions from multiple threads.
519  *
520  * Returns: 0 on success or a negative value if an error occurs.
521  */
522 int 
523 xmlSecCryptoDLUnloadLibrary(const xmlChar* crypto) {
524     xmlSecCryptoDLLibraryPtr lib;
525     int pos;
526     int ret;
527     
528     xmlSecAssert2(crypto != NULL, -1);
529
530     pos = xmlSecCryptoDLLibrariesListFindByName(&gXmlSecCryptoDLLibraries, crypto);
531     if(pos < 0) {
532         /* todo: is it an error? */
533         return(0);
534     }
535     
536     lib = (xmlSecCryptoDLLibraryPtr)xmlSecPtrListGetItem(&gXmlSecCryptoDLLibraries, pos);
537     if((lib != NULL) && (lib->functions == gXmlSecCryptoDLFunctions)) {
538         gXmlSecCryptoDLFunctions = NULL;
539     }
540     
541     ret = xmlSecPtrListRemove(&gXmlSecCryptoDLLibraries, pos);
542     if(ret < 0) {
543         xmlSecError(XMLSEC_ERRORS_HERE,
544                     NULL,
545                     "xmlSecPtrListRemove",
546                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
547                     XMLSEC_ERRORS_NO_MESSAGE);
548         return(-1);
549     }
550
551     return(0);
552 }
553
554 /** 
555  * xmlSecCryptoDLSetFunctions:
556  * @functions:          the new table
557  *
558  * Sets global crypto functions/transforms/keys data/keys store table.
559  *
560  * Returns: 0 on success or a negative value if an error occurs.
561  */
562 int
563 xmlSecCryptoDLSetFunctions(xmlSecCryptoDLFunctionsPtr functions) {
564     xmlSecAssert2(functions != NULL, -1);
565
566     gXmlSecCryptoDLFunctions = functions;
567     
568     return(0);
569 }
570
571 /** 
572  * xmlSecCryptoDLGetFunctions:
573  *
574  * Gets global crypto functions/transforms/keys data/keys store table.
575  *
576  * Returns: the table.
577  */
578 xmlSecCryptoDLFunctionsPtr 
579 xmlSecCryptoDLGetFunctions(void) {
580     return(gXmlSecCryptoDLFunctions);
581 }
582
583 #endif /* XMLSEC_NO_CRYPTO_DYNAMIC_LOADING */
584
585 /**
586  * xmlSecCryptoDLFunctionsRegisterKeyDataAndTransforms:
587  * @functions:          the functions table.
588  * 
589  * Registers the key data and transforms klasses from @functions table in xmlsec. 
590  *
591  * Returns: 0 on success or a negative value if an error occurs.
592  */
593 int 
594 xmlSecCryptoDLFunctionsRegisterKeyDataAndTransforms(struct _xmlSecCryptoDLFunctions* functions) {
595     xmlSecAssert2(functions != NULL, -1);
596
597     /** 
598      * Register keys
599      */
600     if((functions->keyDataAesGetKlass != NULL) && (xmlSecKeyDataIdsRegister(functions->keyDataAesGetKlass()) < 0)) {
601         xmlSecError(XMLSEC_ERRORS_HERE,
602                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(functions->keyDataAesGetKlass())),
603                     "xmlSecKeyDataIdsRegister",
604                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
605                     XMLSEC_ERRORS_NO_MESSAGE);
606         return(-1);
607     }
608     if((functions->keyDataDesGetKlass != NULL) && (xmlSecKeyDataIdsRegister(functions->keyDataDesGetKlass()) < 0)) {
609         xmlSecError(XMLSEC_ERRORS_HERE,
610                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(functions->keyDataDesGetKlass())),
611                     "xmlSecKeyDataIdsRegister",
612                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
613                     XMLSEC_ERRORS_NO_MESSAGE);
614         return(-1);
615     }
616     if((functions->keyDataDsaGetKlass != NULL) && (xmlSecKeyDataIdsRegister(functions->keyDataDsaGetKlass()) < 0)) {
617         xmlSecError(XMLSEC_ERRORS_HERE,
618                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(functions->keyDataDsaGetKlass())),
619                     "xmlSecKeyDataIdsRegister",
620                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
621                     XMLSEC_ERRORS_NO_MESSAGE);
622         return(-1);
623     }
624     if((functions->keyDataGost2001GetKlass != NULL) && (xmlSecKeyDataIdsRegister(functions->keyDataGost2001GetKlass()) < 0)) {
625         xmlSecError(XMLSEC_ERRORS_HERE,
626                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(functions->keyDataGost2001GetKlass())),
627                     "xmlSecKeyDataIdsRegister",
628                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
629                     XMLSEC_ERRORS_NO_MESSAGE);
630         return(-1);
631     }
632     if((functions->keyDataHmacGetKlass != NULL) && (xmlSecKeyDataIdsRegister(functions->keyDataHmacGetKlass()) < 0)) {
633         xmlSecError(XMLSEC_ERRORS_HERE,
634                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(functions->keyDataHmacGetKlass())),
635                     "xmlSecKeyDataIdsRegister",
636                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
637                     XMLSEC_ERRORS_NO_MESSAGE);
638         return(-1);
639     }
640     if((functions->keyDataRsaGetKlass != NULL) && (xmlSecKeyDataIdsRegister(functions->keyDataRsaGetKlass()) < 0)) {
641         xmlSecError(XMLSEC_ERRORS_HERE,
642                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(functions->keyDataRsaGetKlass())),
643                     "xmlSecKeyDataIdsRegister",
644                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
645                     XMLSEC_ERRORS_NO_MESSAGE);
646         return(-1);
647     }
648     if((functions->keyDataX509GetKlass != NULL) && (xmlSecKeyDataIdsRegister(functions->keyDataX509GetKlass()) < 0)) {
649         xmlSecError(XMLSEC_ERRORS_HERE,
650                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(functions->keyDataX509GetKlass())),
651                     "xmlSecKeyDataIdsRegister",
652                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
653                     XMLSEC_ERRORS_NO_MESSAGE);
654         return(-1);
655     }
656     if((functions->keyDataRawX509CertGetKlass != NULL) && (xmlSecKeyDataIdsRegister(functions->keyDataRawX509CertGetKlass()) < 0)) {
657         xmlSecError(XMLSEC_ERRORS_HERE,
658                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(functions->keyDataRawX509CertGetKlass())),
659                     "xmlSecKeyDataIdsRegister",
660                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
661                     XMLSEC_ERRORS_NO_MESSAGE);
662         return(-1);
663     }
664
665
666     /** 
667      * Register transforms
668      */
669     if((functions->transformAes128CbcGetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformAes128CbcGetKlass()) < 0) {
670         xmlSecError(XMLSEC_ERRORS_HERE,
671                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformAes128CbcGetKlass())),
672                     "xmlSecTransformIdsRegister",
673                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
674                     XMLSEC_ERRORS_NO_MESSAGE);
675         return(-1);
676     }    
677
678     if((functions->transformAes192CbcGetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformAes192CbcGetKlass()) < 0) {
679         xmlSecError(XMLSEC_ERRORS_HERE,
680                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformAes192CbcGetKlass())),
681                     "xmlSecTransformIdsRegister",
682                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
683                     XMLSEC_ERRORS_NO_MESSAGE);
684         return(-1);
685     }    
686
687     if((functions->transformAes256CbcGetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformAes256CbcGetKlass()) < 0) {
688         xmlSecError(XMLSEC_ERRORS_HERE,
689                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformAes256CbcGetKlass())),
690                     "xmlSecTransformIdsRegister",
691                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
692                     XMLSEC_ERRORS_NO_MESSAGE);
693         return(-1);
694     }    
695
696     if((functions->transformKWAes128GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformKWAes128GetKlass()) < 0) {
697         xmlSecError(XMLSEC_ERRORS_HERE,
698                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformKWAes128GetKlass())),
699                     "xmlSecTransformIdsRegister",
700                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
701                     XMLSEC_ERRORS_NO_MESSAGE);
702         return(-1);
703     }    
704
705     if((functions->transformKWAes192GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformKWAes192GetKlass()) < 0) {
706         xmlSecError(XMLSEC_ERRORS_HERE,
707                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformKWAes192GetKlass())),
708                     "xmlSecTransformIdsRegister",
709                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
710                     XMLSEC_ERRORS_NO_MESSAGE);
711         return(-1);
712     }    
713
714     if((functions->transformKWAes256GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformKWAes256GetKlass()) < 0) {
715         xmlSecError(XMLSEC_ERRORS_HERE,
716                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformKWAes256GetKlass())),
717                     "xmlSecTransformIdsRegister",
718                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
719                     XMLSEC_ERRORS_NO_MESSAGE);
720         return(-1);
721     }    
722
723     if((functions->transformDes3CbcGetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformDes3CbcGetKlass()) < 0) {
724         xmlSecError(XMLSEC_ERRORS_HERE,
725                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformDes3CbcGetKlass())),
726                     "xmlSecTransformIdsRegister",
727                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
728                     XMLSEC_ERRORS_NO_MESSAGE);
729         return(-1);
730     }    
731
732     if((functions->transformKWDes3GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformKWDes3GetKlass()) < 0) {
733         xmlSecError(XMLSEC_ERRORS_HERE,
734                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformKWDes3GetKlass())),
735                     "xmlSecTransformIdsRegister",
736                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
737                     XMLSEC_ERRORS_NO_MESSAGE);
738         return(-1);
739     }    
740
741     if((functions->transformGost2001GostR3411_94GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformGost2001GostR3411_94GetKlass()) < 0) {
742         xmlSecError(XMLSEC_ERRORS_HERE,
743                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformGost2001GostR3411_94GetKlass())),
744                     "xmlSecTransformIdsRegister",
745                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
746                     XMLSEC_ERRORS_NO_MESSAGE);
747         return(-1);
748     }    
749
750     if((functions->transformDsaSha1GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformDsaSha1GetKlass()) < 0) {
751         xmlSecError(XMLSEC_ERRORS_HERE,
752                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformDsaSha1GetKlass())),
753                     "xmlSecTransformIdsRegister",
754                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
755                     XMLSEC_ERRORS_NO_MESSAGE);
756         return(-1);
757     }    
758
759     if((functions->transformHmacMd5GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformHmacMd5GetKlass()) < 0) {
760         xmlSecError(XMLSEC_ERRORS_HERE,
761                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformHmacMd5GetKlass())),
762                     "xmlSecTransformIdsRegister",
763                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
764                     XMLSEC_ERRORS_NO_MESSAGE);
765         return(-1);
766     }    
767
768     if((functions->transformHmacRipemd160GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformHmacRipemd160GetKlass()) < 0) {
769         xmlSecError(XMLSEC_ERRORS_HERE,
770                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformHmacRipemd160GetKlass())),
771                     "xmlSecTransformIdsRegister",
772                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
773                     XMLSEC_ERRORS_NO_MESSAGE);
774         return(-1);
775     }    
776
777     if((functions->transformHmacSha1GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformHmacSha1GetKlass()) < 0) {
778         xmlSecError(XMLSEC_ERRORS_HERE,
779                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformHmacSha1GetKlass())),
780                     "xmlSecTransformIdsRegister",
781                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
782                     XMLSEC_ERRORS_NO_MESSAGE);
783         return(-1);
784     }    
785
786     if((functions->transformHmacSha224GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformHmacSha224GetKlass()) < 0) {
787         xmlSecError(XMLSEC_ERRORS_HERE,
788                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformHmacSha224GetKlass())),
789                     "xmlSecTransformIdsRegister",
790                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
791                     XMLSEC_ERRORS_NO_MESSAGE);
792         return(-1);
793     }    
794
795     if((functions->transformHmacSha256GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformHmacSha256GetKlass()) < 0) {
796         xmlSecError(XMLSEC_ERRORS_HERE,
797                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformHmacSha256GetKlass())),
798                     "xmlSecTransformIdsRegister",
799                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
800                     XMLSEC_ERRORS_NO_MESSAGE);
801         return(-1);
802     }    
803
804     if((functions->transformHmacSha384GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformHmacSha384GetKlass()) < 0) {
805         xmlSecError(XMLSEC_ERRORS_HERE,
806                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformHmacSha384GetKlass())),
807                     "xmlSecTransformIdsRegister",
808                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
809                     XMLSEC_ERRORS_NO_MESSAGE);
810         return(-1);
811     }    
812
813     if((functions->transformHmacSha512GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformHmacSha512GetKlass()) < 0) {
814         xmlSecError(XMLSEC_ERRORS_HERE,
815                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformHmacSha512GetKlass())),
816                     "xmlSecTransformIdsRegister",
817                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
818                     XMLSEC_ERRORS_NO_MESSAGE);
819         return(-1);
820     }
821
822     if((functions->transformMd5GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformMd5GetKlass()) < 0) {
823         xmlSecError(XMLSEC_ERRORS_HERE,
824                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformMd5GetKlass())),
825                     "xmlSecTransformIdsRegister",
826                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
827                     XMLSEC_ERRORS_NO_MESSAGE);
828         return(-1);
829     }    
830
831     if((functions->transformRipemd160GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformRipemd160GetKlass()) < 0) {
832         xmlSecError(XMLSEC_ERRORS_HERE,
833                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformRipemd160GetKlass())),
834                     "xmlSecTransformIdsRegister",
835                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
836                     XMLSEC_ERRORS_NO_MESSAGE);
837         return(-1);
838     }    
839
840     if((functions->transformRsaMd5GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformRsaMd5GetKlass()) < 0) {
841         xmlSecError(XMLSEC_ERRORS_HERE,
842                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformRsaMd5GetKlass())),
843                     "xmlSecTransformIdsRegister",
844                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
845                     XMLSEC_ERRORS_NO_MESSAGE);
846         return(-1);
847     }    
848
849     if((functions->transformRsaRipemd160GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformRsaRipemd160GetKlass()) < 0) {
850         xmlSecError(XMLSEC_ERRORS_HERE,
851                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformRsaRipemd160GetKlass())),
852                     "xmlSecTransformIdsRegister",
853                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
854                     XMLSEC_ERRORS_NO_MESSAGE);
855         return(-1);
856     }    
857
858     if((functions->transformRsaSha1GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformRsaSha1GetKlass()) < 0) {
859         xmlSecError(XMLSEC_ERRORS_HERE,
860                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformRsaSha1GetKlass())),
861                     "xmlSecTransformIdsRegister",
862                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
863                     XMLSEC_ERRORS_NO_MESSAGE);
864         return(-1);
865     }    
866
867     if((functions->transformRsaSha224GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformRsaSha224GetKlass()) < 0) {
868         xmlSecError(XMLSEC_ERRORS_HERE,
869                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformRsaSha224GetKlass())),
870                     "xmlSecTransformIdsRegister",
871                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
872                     XMLSEC_ERRORS_NO_MESSAGE);
873         return(-1);
874     }    
875
876     if((functions->transformRsaSha256GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformRsaSha256GetKlass()) < 0) {
877         xmlSecError(XMLSEC_ERRORS_HERE,
878                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformRsaSha256GetKlass())),
879                     "xmlSecTransformIdsRegister",
880                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
881                     XMLSEC_ERRORS_NO_MESSAGE);
882         return(-1);
883     }    
884
885     if((functions->transformRsaSha384GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformRsaSha384GetKlass()) < 0) {
886         xmlSecError(XMLSEC_ERRORS_HERE,
887                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformRsaSha384GetKlass())),
888                     "xmlSecTransformIdsRegister",
889                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
890                     XMLSEC_ERRORS_NO_MESSAGE);
891         return(-1);
892     }    
893
894     if((functions->transformRsaSha512GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformRsaSha512GetKlass()) < 0) {
895         xmlSecError(XMLSEC_ERRORS_HERE,
896                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformRsaSha512GetKlass())),
897                     "xmlSecTransformIdsRegister",
898                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
899                     XMLSEC_ERRORS_NO_MESSAGE);
900         return(-1);
901     }
902
903     if((functions->transformRsaPkcs1GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformRsaPkcs1GetKlass()) < 0) {
904         xmlSecError(XMLSEC_ERRORS_HERE,
905                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformRsaPkcs1GetKlass())),
906                     "xmlSecTransformIdsRegister",
907                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
908                     XMLSEC_ERRORS_NO_MESSAGE);
909         return(-1);
910     }    
911
912     if((functions->transformRsaOaepGetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformRsaOaepGetKlass()) < 0) {
913         xmlSecError(XMLSEC_ERRORS_HERE,
914                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformRsaOaepGetKlass())),
915                     "xmlSecTransformIdsRegister",
916                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
917                     XMLSEC_ERRORS_NO_MESSAGE);
918         return(-1);
919     }    
920
921     if((functions->transformGostR3411_94GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformGostR3411_94GetKlass()) < 0) {
922         xmlSecError(XMLSEC_ERRORS_HERE,
923                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformGostR3411_94GetKlass())),
924                     "xmlSecTransformIdsRegister",
925                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
926                     XMLSEC_ERRORS_NO_MESSAGE);
927         return(-1);
928     }    
929
930     if((functions->transformSha1GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformSha1GetKlass()) < 0) {
931         xmlSecError(XMLSEC_ERRORS_HERE,
932                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformSha1GetKlass())),
933                     "xmlSecTransformIdsRegister",
934                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
935                     XMLSEC_ERRORS_NO_MESSAGE);
936         return(-1);
937     }    
938
939     if((functions->transformSha224GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformSha224GetKlass()) < 0) {
940         xmlSecError(XMLSEC_ERRORS_HERE,
941                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformSha224GetKlass())),
942                     "xmlSecTransformIdsRegister",
943                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
944                     XMLSEC_ERRORS_NO_MESSAGE);
945         return(-1);
946     }    
947
948     if((functions->transformSha256GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformSha256GetKlass()) < 0) {
949         xmlSecError(XMLSEC_ERRORS_HERE,
950                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformSha256GetKlass())),
951                     "xmlSecTransformIdsRegister",
952                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
953                     XMLSEC_ERRORS_NO_MESSAGE);
954         return(-1);
955     }    
956
957     if((functions->transformSha384GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformSha384GetKlass()) < 0) {
958         xmlSecError(XMLSEC_ERRORS_HERE,
959                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformSha384GetKlass())),
960                     "xmlSecTransformIdsRegister",
961                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
962                     XMLSEC_ERRORS_NO_MESSAGE);
963         return(-1);
964     }    
965
966     if((functions->transformSha512GetKlass != NULL) && xmlSecTransformIdsRegister(functions->transformSha512GetKlass()) < 0) {
967         xmlSecError(XMLSEC_ERRORS_HERE,
968                     xmlSecErrorsSafeString(xmlSecTransformKlassGetName(functions->transformSha512GetKlass())),
969                     "xmlSecTransformIdsRegister",
970                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
971                     XMLSEC_ERRORS_NO_MESSAGE);
972         return(-1);
973     }    
974
975     return(0);     
976 }
977
978