xmlsecurityengine/xmlsec/inc/xmlsec_keysdata.h
changeset 0 e35f40988205
child 24 74f0b3eb154c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xmlsecurityengine/xmlsec/inc/xmlsec_keysdata.h	Thu Dec 17 09:29:21 2009 +0200
@@ -0,0 +1,837 @@
+/** 
+ * XML Security Library (http://www.aleksey.com/xmlsec).
+ *
+ * Key data.
+ *
+ * This is free software; see Copyright file in the source
+ * distribution for preciese wording.
+ * 
+ * Copyright (C) 2002-2003 Aleksey Sanin <aleksey@aleksey.com>
+ * Portion Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+ */
+#ifndef __XMLSEC_KEYSDATA_H__
+#define __XMLSEC_KEYSDATA_H__    
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */ 
+
+#include <libxml2_tree.h>
+#include "xmlsec_config.h"
+#include "xmlsec_xmlsec.h"
+#include "xmlsec_buffer.h"
+#include "xmlsec_list.h"
+
+/**
+ * Forward declarations
+ */
+typedef const struct _xmlSecKeyDataKlass 		xmlSecKeyDataKlass, 
+							*xmlSecKeyDataId; 						
+typedef const struct _xmlSecKeyDataStoreKlass 		xmlSecKeyDataStoreKlass, 
+							*xmlSecKeyDataStoreId; 
+typedef struct _xmlSecKeyDataList 			xmlSecKeyDataList, 
+							*xmlSecKeyDataListPtr; 
+
+
+/**************************************************************************
+ *
+ * xmlSecKeyDataUsage
+ *
+ *************************************************************************/
+/** 
+ * xmlSecKeyDataUsage:
+ *
+ * The bits mask that determines possible keys data usage.
+ */
+typedef unsigned int					xmlSecKeyDataUsage;
+
+/**
+ * xmlSecKeyDataUsageUnknown:
+ *
+ * The key data usage is unknown.
+ */
+#define xmlSecKeyDataUsageUnknown			0x00000
+
+/**
+ * xmlSecKeyDataUsageKeyInfoNodeRead:
+ *
+ * The key data could be read from a <dsig:KeyInfo/> child.
+ */
+#define xmlSecKeyDataUsageKeyInfoNodeRead		0x00001
+
+/**
+ * xmlSecKeyDataUsageKeyInfoNodeWrite:
+ *
+ * The key data could be written to a <dsig:KeyInfo /> child.
+ */
+#define xmlSecKeyDataUsageKeyInfoNodeWrite		0x00002
+
+/**
+ * xmlSecKeyDataUsageKeyValueNodeRead:
+ *
+ * The key data could be read from a <dsig:KeyValue /> child.
+ */
+#define xmlSecKeyDataUsageKeyValueNodeRead		0x00004
+
+/**
+ * xmlSecKeyDataUsageKeyValueNodeWrite:
+ *
+ * The key data could be written to a <dsig:KeyValue /> child.
+ */
+#define xmlSecKeyDataUsageKeyValueNodeWrite		0x00008
+
+/**
+ * xmlSecKeyDataUsageRetrievalMethodNodeXml:
+ *
+ * The key data could be retrieved using <dsig:RetrievalMethod /> node
+ * in XML format.
+ */
+#define xmlSecKeyDataUsageRetrievalMethodNodeXml	0x00010
+
+/**
+ * xmlSecKeyDataUsageRetrievalMethodNodeBin:
+ *
+ * The key data could be retrieved using <dsig:RetrievalMethod /> node
+ * in binary format.
+ */
+#define xmlSecKeyDataUsageRetrievalMethodNodeBin	0x00020
+
+/**
+ * xmlSecKeyDataUsageAny:
+ *
+ * Any key data usage.
+ */
+#define xmlSecKeyDataUsageAny				0xFFFFF
+
+/**
+ * xmlSecKeyDataUsageKeyInfoNode:
+ *
+ * The key data could be read and written from/to a <dsig:KeyInfo /> child.
+ */
+#define xmlSecKeyDataUsageKeyInfoNode			\
+	(xmlSecKeyDataUsageKeyInfoNodeRead | xmlSecKeyDataUsageKeyInfoNodeWrite)
+
+/**
+ * xmlSecKeyDataUsageKeyValueNode:
+ *
+ * The key data could be read and written from/to a <dsig:KeyValue /> child.
+ */
+#define xmlSecKeyDataUsageKeyValueNode			\
+	(xmlSecKeyDataUsageKeyValueNodeRead | xmlSecKeyDataUsageKeyValueNodeWrite)
+
+/**
+ * xmlSecKeyDataUsageRetrievalMethodNode:
+ *
+ * The key data could be retrieved using <dsig:RetrievalMethod /> node
+ * in any format.
+ */
+#define xmlSecKeyDataUsageRetrievalMethodNode		\
+	(xmlSecKeyDataUsageRetrievalMethodNodeXml | xmlSecKeyDataUsageRetrievalMethodNodeBin)
+
+/**************************************************************************
+ *
+ * xmlSecKeyDataType
+ *
+ *************************************************************************/
+/**
+ * xmlSecKeyDataType:
+ *
+ * The key data type (public/private, session/permanet, etc.).
+ */
+typedef unsigned int				xmlSecKeyDataType;
+
+/**
+ * xmlSecKeyDataTypeUnknown:
+ *
+ * The key data type is unknown (same as #xmlSecKeyDataTypeNone).
+ */
+#define xmlSecKeyDataTypeUnknown			0x0000
+
+/**
+ * xmlSecKeyDataTypeNone:
+ *
+ * The key data type is unknown (same as #xmlSecKeyDataTypeUnknown).
+ */
+#define xmlSecKeyDataTypeNone				xmlSecKeyDataTypeUnknown
+
+/**
+ * xmlSecKeyDataTypePublic:
+ *
+ * The key data contain a public key.
+ */
+#define xmlSecKeyDataTypePublic				0x0001
+
+/**
+ * xmlSecKeyDataTypePrivate:
+ *
+ * The key data contain a private key.
+ */
+#define xmlSecKeyDataTypePrivate			0x0002
+
+/**
+ * xmlSecKeyDataTypeSymmetric:
+ *
+ * The key data contain a symmetric key.
+ */
+#define xmlSecKeyDataTypeSymmetric			0x0004
+
+/**
+ * xmlSecKeyDataTypeSession:
+ *
+ * The key data contain session key (one time key, not stored in keys manager).
+ */
+#define xmlSecKeyDataTypeSession			0x0008
+
+/**
+ * xmlSecKeyDataTypePermanent:
+ *
+ * The key data contain permanent key (stored in keys manager).
+ */
+#define xmlSecKeyDataTypePermanent			0x0010
+
+/**
+ * xmlSecKeyDataTypeTrusted:
+ *
+ * The key data is trusted.
+ */
+#define xmlSecKeyDataTypeTrusted			0x0100
+
+/**
+ * xmlSecKeyDataTypeAny:
+ *
+ * Any key data.
+ */
+#define xmlSecKeyDataTypeAny				0xFFFF
+
+/**************************************************************************
+ *
+ * xmlSecKeyDataFormat
+ *
+ *************************************************************************/
+/**
+ * xmlSecKeyDataFormat:
+ * @xmlSecKeyDataFormatUnknown:		the key data format is unknown.
+ * @xmlSecKeyDataFormatBinary:		the binary key data.
+ * @xmlSecKeyDataFormatPem:		the PEM key data (cert or public/private key).
+ * @xmlSecKeyDataFormatDer:		the DER key data (cert or public/private key).
+ * @xmlSecKeyDataFormatPkcs8Pem:	the PKCS#8 PEM private key.
+ * @xmlSecKeyDataFormatPkcs8Der:	the PKCS#8 DER private key. 
+ * @xmlSecKeyDataFormatPkcs12:		the PKCS12 format (bag of keys and certs)
+ * @xmlSecKeyDataFormatCertPem:		the PEM cert.
+ * @xmlSecKeyDataFormatCertDer:		the DER cert.
+ *
+ * The key data format (binary, der, pem, etc.).
+ */
+typedef enum {
+    xmlSecKeyDataFormatUnknown = 0,
+    xmlSecKeyDataFormatBinary,
+    xmlSecKeyDataFormatPem,
+    xmlSecKeyDataFormatDer,
+    xmlSecKeyDataFormatPkcs8Pem,
+    xmlSecKeyDataFormatPkcs8Der,
+    xmlSecKeyDataFormatPkcs12,
+    xmlSecKeyDataFormatCertPem,
+    xmlSecKeyDataFormatCertDer
+} xmlSecKeyDataFormat;
+
+/**************************************************************************
+ *
+ * Global xmlSecKeyDataIds methods
+ *
+ *************************************************************************/
+XMLSEC_EXPORT xmlSecPtrListPtr	xmlSecKeyDataIdsGet		(void);
+XMLSEC_EXPORT int		xmlSecKeyDataIdsInit		(void);
+XMLSEC_EXPORT void		xmlSecKeyDataIdsShutdown	(void);
+XMLSEC_EXPORT int 		xmlSecKeyDataIdsRegisterDefault	(void);
+XMLSEC_EXPORT int 		xmlSecKeyDataIdsRegister	(xmlSecKeyDataId id);
+	
+/**************************************************************************
+ *
+ * xmlSecKeyData
+ *
+ *************************************************************************/
+/**
+ * xmlSecKeyData:
+ * @id: 		the data id (#xmlSecKeyDataId).
+ * @reserved0: 		reserved for the future.
+ * @reserved1: 		reserved for the future.
+ *
+ * The key data: key value (crypto material), x509 data, pgp data, etc.  
+ */
+struct _xmlSecKeyData {
+    xmlSecKeyDataId			id;
+    void*				reserved0;
+    void*				reserved1;
+};
+
+XMLSEC_EXPORT xmlSecKeyDataPtr	xmlSecKeyDataCreate		(xmlSecKeyDataId id);
+XMLSEC_EXPORT xmlSecKeyDataPtr	xmlSecKeyDataDuplicate		(xmlSecKeyDataPtr data);
+XMLSEC_EXPORT void		xmlSecKeyDataDestroy		(xmlSecKeyDataPtr data);
+XMLSEC_EXPORT int		xmlSecKeyDataGenerate		(xmlSecKeyDataPtr data,
+								 xmlSecSize sizeBits,
+								 xmlSecKeyDataType type);
+XMLSEC_EXPORT xmlSecKeyDataType	xmlSecKeyDataGetType		(xmlSecKeyDataPtr data);
+XMLSEC_EXPORT xmlSecSize	xmlSecKeyDataGetSize		(xmlSecKeyDataPtr data);
+XMLSEC_EXPORT const xmlChar*	xmlSecKeyDataGetIdentifier	(xmlSecKeyDataPtr data);
+XMLSEC_EXPORT void		xmlSecKeyDataDebugDump		(xmlSecKeyDataPtr data,
+								 FILE *output);
+XMLSEC_EXPORT void		xmlSecKeyDataDebugXmlDump	(xmlSecKeyDataPtr data,
+								 FILE *output);
+XMLSEC_EXPORT int		xmlSecKeyDataXmlRead		(xmlSecKeyDataId id,
+								 xmlSecKeyPtr key,
+								 xmlNodePtr node,
+								 xmlSecKeyInfoCtxPtr keyInfoCtx);
+XMLSEC_EXPORT int		xmlSecKeyDataXmlWrite		(xmlSecKeyDataId id,
+								 xmlSecKeyPtr key,
+								 xmlNodePtr node,
+								 xmlSecKeyInfoCtxPtr keyInfoCtx);
+XMLSEC_EXPORT int		xmlSecKeyDataBinRead		(xmlSecKeyDataId id,
+								 xmlSecKeyPtr key,
+								 const xmlSecByte* buf,
+								 xmlSecSize bufSize,
+								 xmlSecKeyInfoCtxPtr keyInfoCtx);
+XMLSEC_EXPORT int		xmlSecKeyDataBinWrite		(xmlSecKeyDataId id,
+								 xmlSecKeyPtr key,
+								 xmlSecByte** buf,
+								 xmlSecSize* bufSize,
+								 xmlSecKeyInfoCtxPtr keyInfoCtx);
+
+
+/**
+ * xmlSecKeyDataGetName:
+ * @data: 		the pointer to key data.
+ *
+ * Macro. Returns the key data name.
+ */
+#define xmlSecKeyDataGetName(data) \
+	((xmlSecKeyDataIsValid((data))) ? \
+	  xmlSecKeyDataKlassGetName((data)->id) : NULL)
+
+/**
+ * xmlSecKeyDataIsValid:
+ * @data: 		the pointer to data.
+ *
+ * Macro. Returns 1 if @data is not NULL and @data->id is not NULL
+ * or 0 otherwise.
+ */ 
+#define xmlSecKeyDataIsValid(data) \
+	((( data ) != NULL) && \
+	 (( data )->id != NULL) && \
+	 (( data )->id->klassSize >= sizeof(xmlSecKeyDataKlass)) && \
+	 (( data )->id->objSize >= sizeof(xmlSecKeyData)) && \
+	 (( data )->id->name != NULL))
+/**
+ * xmlSecKeyDataCheckId:
+ * @data: 		the pointer to data.
+ * @dataId: 		the data Id.
+ *
+ * Macro. Returns 1 if @data is valid and @data's id is equal to @dataId.
+ */
+#define xmlSecKeyDataCheckId(data, dataId) \
+ 	(xmlSecKeyDataIsValid(( data )) && \
+	((( data )->id) == ( dataId )))
+
+/**
+ * xmlSecKeyDataCheckUsage:
+ * @data: 		the pointer to data.
+ * @usg: 		the data usage.
+ *
+ * Macro. Returns 1 if @data is valid and could be used for @usg.
+ */
+#define xmlSecKeyDataCheckUsage(data, usg) \
+ 	(xmlSecKeyDataIsValid(( data )) && \
+	(((( data )->id->usage) & ( usg )) != 0))
+
+/**
+ * xmlSecKeyDataCheckSize:
+ * @data: 		the pointer to data.
+ * @size: 		the expected size.
+ *
+ * Macro. Returns 1 if @data is valid and @data's object has at least @size bytes.
+ */
+#define xmlSecKeyDataCheckSize(data, size) \
+ 	(xmlSecKeyDataIsValid(( data )) && \
+	 (( data )->id->objSize >= size))
+
+/**************************************************************************
+ *
+ * xmlSecKeyDataKlass
+ *
+ *************************************************************************/
+/**
+ * xmlSecKeyDataIdUnknown:
+ *
+ * The "unknown" id.
+ */
+#define xmlSecKeyDataIdUnknown 			((xmlSecKeyDataId)NULL)
+
+/** 
+ * xmlSecKeyDataInitMethod:
+ * @data: 		the pointer to key data.
+ *
+ * Key data specific initialization method.
+ *
+ * Returns 0 on success or a negative value if an error occurs.
+ */
+typedef int			(*xmlSecKeyDataInitMethod)	(xmlSecKeyDataPtr data);
+
+/** 
+ * xmlSecKeyDataDuplicateMethod:
+ * @dst: 		the pointer to destination key data.
+ * @src: 		the poiniter to source key data.
+ *
+ * Key data specific duplication (copy) method.
+ *
+ * Returns 0 on success or a negative value if an error occurs.
+ */
+typedef int			(*xmlSecKeyDataDuplicateMethod)	(xmlSecKeyDataPtr dst,
+								 xmlSecKeyDataPtr src);
+
+/** 
+ * xmlSecKeyDataFinalizeMethod:
+ * @data: 		the data.
+ *
+ * Key data specific finalization method. All the objects and resources allocated
+ * by the key data object must be freed inside this method.
+ */
+typedef void			(*xmlSecKeyDataFinalizeMethod)	(xmlSecKeyDataPtr data);
+
+/** 
+ * xmlSecKeyDataXmlReadMethod:
+ * @id: 		the data id.
+ * @key: 		the key.
+ * @node: 		the pointer to data's value XML node.
+ * @keyInfoCtx: 	the <dsig:KeyInfo/> node processing context.
+ *
+ * Key data specific method for reading XML node. 
+ * 
+ * Returns 0 on success or a negative value if an error occurs.
+ */
+typedef int			(*xmlSecKeyDataXmlReadMethod)	(xmlSecKeyDataId id,
+								 xmlSecKeyPtr key,
+								 xmlNodePtr node,
+								 xmlSecKeyInfoCtxPtr keyInfoCtx);
+/** 
+ * xmlSecKeyDataXmlWriteMethod:
+ * @id: 		the data id.
+ * @key: 		the key.
+ * @node: 		the pointer to data's value XML node.
+ * @keyInfoCtx: 	the <dsig:KeyInfo> node processing context.
+ *
+ * Key data specific method for writing XML node.
+ * 
+ * Returns 0 on success or a negative value if an error occurs.
+ */
+typedef int			(*xmlSecKeyDataXmlWriteMethod)	(xmlSecKeyDataId id,
+								 xmlSecKeyPtr key,
+								 xmlNodePtr node,
+								 xmlSecKeyInfoCtxPtr keyInfoCtx);
+/** 
+ * xmlSecKeyDataBinReadMethod:
+ * @id: 		the data id.
+ * @key: 		the key.
+ * @buf: 		the input buffer.
+ * @bufSize:		the buffer size.
+ * @keyInfoCtx: 	the <dsig:KeyInfo/> node processing context.
+ *
+ * Key data specific method for reading binary buffer.
+ * 
+ * Returns 0 on success or a negative value if an error occurs.
+ */
+typedef int			(*xmlSecKeyDataBinReadMethod)	(xmlSecKeyDataId id,
+								 xmlSecKeyPtr key,
+								 const xmlSecByte* buf,
+								 xmlSecSize bufSize,
+								 xmlSecKeyInfoCtxPtr keyInfoCtx);
+/** 
+ * xmlSecKeyDataBinWriteMethod:
+ * @id: 		the data id.
+ * @key: 		the key.
+ * @buf: 		the output buffer.
+ * @bufSize: 		the buffer size.
+ * @keyInfoCtx: 	the <dsig:KeyInfo/> node processing context.
+ *
+ * Key data specific method for reading binary buffer. 
+ * 
+ * Returns 0 on success or a negative value if an error occurs.
+ */
+typedef int			(*xmlSecKeyDataBinWriteMethod)	(xmlSecKeyDataId id,
+								 xmlSecKeyPtr key,
+								 xmlSecByte** buf,
+								 xmlSecSize* bufSize,
+								 xmlSecKeyInfoCtxPtr keyInfoCtx);
+
+/** 
+ * xmlSecKeyDataGenerateMethod:
+ * @data: 		the pointer to key data.
+ * @sizeBits: 		the key data specific size.
+ * @type:		the required key type (session/permanent, etc.)
+ *
+ * Key data specific method for generating new key data.
+ *
+ * Returns 0 on success or a negative value if an error occurs.
+ */
+typedef int			(*xmlSecKeyDataGenerateMethod)	(xmlSecKeyDataPtr data,
+								 xmlSecSize sizeBits,
+								 xmlSecKeyDataType type);
+
+/** 
+ * xmlSecKeyDataGetTypeMethod:
+ * @data:		 the data.
+ *
+ * Key data specific method to get the key type.
+ *
+ * Returns the key type.
+ */
+typedef xmlSecKeyDataType	(*xmlSecKeyDataGetTypeMethod)	(xmlSecKeyDataPtr data);
+
+/** 
+ * xmlSecKeyDataGetSizeMethod:
+ * @data: 		the pointer to key data.
+ *
+ * Key data specific method to get the key size.
+ *
+ * Returns the key size in bits.
+ */
+typedef xmlSecSize		(*xmlSecKeyDataGetSizeMethod)	(xmlSecKeyDataPtr data);
+
+/** 
+ * xmlSecKeyDataGetIdentifierMethod:
+ * @data: 		the pointer to key data.
+ *
+ * Key data specific method to get the key data identifier string (for example,
+ * X509 data identifier is the subject of the verified cert).
+ *
+ * Returns the identifier string or NULL if an error occurs.
+ */
+typedef const xmlChar*		(*xmlSecKeyDataGetIdentifierMethod) (xmlSecKeyDataPtr data);
+
+/** 
+ * xmlSecKeyDataDebugDumpMethod:
+ * @data: 		the data.
+ * @output: 		the FILE to print debug info (should be open for writing).
+ *
+ * Key data specific method for printing debug info.
+ */
+typedef void			(*xmlSecKeyDataDebugDumpMethod)	(xmlSecKeyDataPtr data,
+								 FILE* output);
+
+/**
+ * xmlSecKeyDataKlass:
+ * @klassSize:		the klass size.
+ * @objSize:		the object size.
+ * @name:		the object name.
+ * @usage:		the allowed data usage.
+ * @href:		the identification string (href).
+ * @dataNodeName:	the data's XML node name.
+ * @dataNodeNs:		the data's XML node namespace.
+ * @initialize:		the initialization method.  
+ * @duplicate:		the duplicate (copy) method.
+ * @finalize:		the finalization (destroy) method.
+ * @generate:		the new data generation method.
+ * @getType:		the method to access data's type information.
+ * @getSize:		the method to access data's size.
+ * @getIdentifier:	the method to access data's string identifier.
+ * @xmlRead:		the method for reading data from XML node.
+ * @xmlWrite:		the method for writing data to XML node.
+ * @binRead:		the method for reading data from a binary buffer.
+ * @binWrite:		the method for writing data to binary buffer.
+ * @debugDump: 		the method for printing debug data information.
+ * @debugXmlDump:	the method for printing debug data information in XML format.
+ * @reserved0:		reserved for the future.
+ * @reserved1:		reserved for the future.
+ *
+ * The data id (klass).
+ */
+struct _xmlSecKeyDataKlass {
+    xmlSecSize				klassSize;
+    xmlSecSize				objSize;
+
+    /* data */
+    const xmlChar*			name;    
+    xmlSecKeyDataUsage			usage;
+    const xmlChar*			href;
+    const xmlChar*			dataNodeName;
+    const xmlChar*			dataNodeNs;
+    
+    /* constructors/destructor */
+    xmlSecKeyDataInitMethod		initialize;
+    xmlSecKeyDataDuplicateMethod	duplicate;
+    xmlSecKeyDataFinalizeMethod		finalize;
+    xmlSecKeyDataGenerateMethod		generate;
+    
+    /* get info */
+    xmlSecKeyDataGetTypeMethod		getType;
+    xmlSecKeyDataGetSizeMethod		getSize;
+    xmlSecKeyDataGetIdentifierMethod	getIdentifier;
+
+    /* read/write */
+    xmlSecKeyDataXmlReadMethod		xmlRead;
+    xmlSecKeyDataXmlWriteMethod		xmlWrite;
+    xmlSecKeyDataBinReadMethod		binRead;
+    xmlSecKeyDataBinWriteMethod		binWrite;
+
+    /* debug */
+    xmlSecKeyDataDebugDumpMethod	debugDump;
+    xmlSecKeyDataDebugDumpMethod	debugXmlDump;
+
+    /* for the future */
+    void*				reserved0;
+    void*				reserved1;
+};
+
+/**
+ * xmlSecKeyDataKlassGetName:
+ * @klass: 		the data klass.
+ *
+ * Macro. Returns data klass name.
+ */
+#define xmlSecKeyDataKlassGetName(klass) \
+	(((klass)) ? ((klass)->name) : NULL)
+
+/***********************************************************************
+ *
+ * Key Data list
+ *
+ **********************************************************************/
+/**
+ * xmlSecKeyDataListId:
+ *
+ *
+ * The key data klasses list klass id.
+ */
+#define xmlSecKeyDataListId	xmlSecKeyDataListGetKlass()
+XMLSEC_EXPORT xmlSecPtrListId	xmlSecKeyDataListGetKlass	(void);
+
+/***********************************************************************
+ *
+ * Key Data Ids list
+ *
+ **********************************************************************/
+/**
+ * xmlSecKeyDataIdListId:
+ *
+ *
+ * The key data list klass id.
+ */
+#define xmlSecKeyDataIdListId	xmlSecKeyDataIdListGetKlass()
+XMLSEC_EXPORT xmlSecPtrListId	xmlSecKeyDataIdListGetKlass	(void);
+XMLSEC_EXPORT int		xmlSecKeyDataIdListFind		(xmlSecPtrListPtr list,
+								 xmlSecKeyDataId dataId);
+XMLSEC_EXPORT xmlSecKeyDataId	xmlSecKeyDataIdListFindByNode	(xmlSecPtrListPtr list,
+								 const xmlChar* nodeName,
+								 const xmlChar* nodeNs,
+								 xmlSecKeyDataUsage usage);
+XMLSEC_EXPORT xmlSecKeyDataId	xmlSecKeyDataIdListFindByHref	(xmlSecPtrListPtr list,
+								 const xmlChar* href,
+								 xmlSecKeyDataUsage usage);
+XMLSEC_EXPORT xmlSecKeyDataId	xmlSecKeyDataIdListFindByName	(xmlSecPtrListPtr list,
+								 const xmlChar* name,
+								 xmlSecKeyDataUsage usage);
+XMLSEC_EXPORT void		xmlSecKeyDataIdListDebugDump	(xmlSecPtrListPtr list,
+								 FILE* output);
+XMLSEC_EXPORT void		xmlSecKeyDataIdListDebugXmlDump	(xmlSecPtrListPtr list,
+								 FILE* output);
+
+/**************************************************************************
+ *
+ * xmlSecKeyDataBinary
+ * 
+ * key (xmlSecBuffer) is located after xmlSecKeyData structure
+ *
+ *************************************************************************/
+/**
+ * xmlSecKeyDataBinarySize:
+ *
+ * The binary key data object size.
+ */
+#define xmlSecKeyDataBinarySize	\
+    (sizeof(xmlSecKeyData) + sizeof(xmlSecBuffer))
+ 
+XMLSEC_EXPORT int		xmlSecKeyDataBinaryValueInitialize	(xmlSecKeyDataPtr data);
+XMLSEC_EXPORT int		xmlSecKeyDataBinaryValueDuplicate	(xmlSecKeyDataPtr dst,
+									xmlSecKeyDataPtr src);
+XMLSEC_EXPORT void		xmlSecKeyDataBinaryValueFinalize	(xmlSecKeyDataPtr data);
+XMLSEC_EXPORT int		xmlSecKeyDataBinaryValueXmlRead		(xmlSecKeyDataId id,
+								         xmlSecKeyPtr key,
+									 xmlNodePtr node,
+								         xmlSecKeyInfoCtxPtr keyInfoCtx);
+XMLSEC_EXPORT int		xmlSecKeyDataBinaryValueXmlWrite	(xmlSecKeyDataId id,
+									 xmlSecKeyPtr key,
+									 xmlNodePtr node,
+									 xmlSecKeyInfoCtxPtr keyInfoCtx);
+XMLSEC_EXPORT int		xmlSecKeyDataBinaryValueBinRead		(xmlSecKeyDataId id,
+									 xmlSecKeyPtr key,
+									 const xmlSecByte* buf,
+									 xmlSecSize bufSize,
+									 xmlSecKeyInfoCtxPtr keyInfoCtx);
+XMLSEC_EXPORT int		xmlSecKeyDataBinaryValueBinWrite	(xmlSecKeyDataId id,
+									 xmlSecKeyPtr key,
+									 xmlSecByte** buf,
+									 xmlSecSize* bufSize,
+									 xmlSecKeyInfoCtxPtr keyInfoCtx);
+XMLSEC_EXPORT void		xmlSecKeyDataBinaryValueDebugDump	(xmlSecKeyDataPtr data,
+									FILE* output);
+XMLSEC_EXPORT void		xmlSecKeyDataBinaryValueDebugXmlDump	(xmlSecKeyDataPtr data,
+									 FILE* output);
+
+XMLSEC_EXPORT xmlSecSize	xmlSecKeyDataBinaryValueGetSize		(xmlSecKeyDataPtr data);
+XMLSEC_EXPORT xmlSecBufferPtr	xmlSecKeyDataBinaryValueGetBuffer	(xmlSecKeyDataPtr data);
+XMLSEC_EXPORT int		xmlSecKeyDataBinaryValueSetBuffer	(xmlSecKeyDataPtr data,
+									 const xmlSecByte* buf,
+									 xmlSecSize bufSize);
+
+/**************************************************************************
+ *
+ * xmlSecKeyDataStore
+ *
+ *************************************************************************/
+/**
+ * xmlSecKeyDataStore:
+ * @id: 		the store id (#xmlSecKeyDataStoreId).
+ * @reserved0:		reserved for the future.
+ * @reserved1:		reserved for the future.
+ *
+ * The key data store. Key data store holds common key data specific information
+ * required for key data processing. For example, X509 data store may hold 
+ * information about trusted (root) certificates.
+ */
+struct _xmlSecKeyDataStore {
+    xmlSecKeyDataStoreId		id;
+
+    /* for the future */
+    void*				reserved0;
+    void*				reserved1;
+};
+
+XMLSEC_EXPORT xmlSecKeyDataStorePtr xmlSecKeyDataStoreCreate	(xmlSecKeyDataStoreId id);
+XMLSEC_EXPORT void		xmlSecKeyDataStoreDestroy	(xmlSecKeyDataStorePtr store);
+
+/**
+ * xmlSecKeyDataStoreGetName:
+ * @store: 		the pointer to store.
+ *
+ * Macro. Returns key data store name.
+ */
+#define xmlSecKeyDataStoreGetName(store) \
+    ((xmlSecKeyDataStoreIsValid((store))) ? \
+      xmlSecKeyDataStoreKlassGetName((store)->id) : NULL)
+
+/**
+ * xmlSecKeyDataStoreIsValid:
+ * @store: 		the pointer to store.
+ *
+ * Macro. Returns 1 if @store is not NULL and @store->id is not NULL
+ * or 0 otherwise.
+ */ 
+#define xmlSecKeyDataStoreIsValid(store) \
+	((( store ) != NULL) && ((( store )->id) != NULL))
+/**
+ * xmlSecKeyDataStoreCheckId:
+ * @store: 		the pointer to store.
+ * @storeId: 		the store Id.
+ *
+ * Macro. Returns 1 if @store is valid and @store's id is equal to @storeId.
+ */
+#define xmlSecKeyDataStoreCheckId(store, storeId) \
+ 	(xmlSecKeyDataStoreIsValid(( store )) && \
+	((( store )->id) == ( storeId )))
+
+/**
+ * xmlSecKeyDataStoreCheckSize:
+ * @store: 		the pointer to store.
+ * @size: 		the expected size.
+ *
+ * Macro. Returns 1 if @data is valid and @stores's object has at least @size bytes.
+ */
+#define xmlSecKeyDataStoreCheckSize(store, size) \
+ 	(xmlSecKeyDataStoreIsValid(( store )) && \
+	 (( store )->id->objSize >= size))
+
+
+/**************************************************************************
+ *
+ * xmlSecKeyDataStoreKlass
+ *
+ *************************************************************************/
+/**
+ * xmlSecKeyDataStoreIdUnknown:
+ *
+ * The "unknown" id.
+ */
+#define xmlSecKeyDataStoreIdUnknown 			NULL
+
+/** 
+ * xmlSecKeyDataStoreInitializeMethod:
+ * @store: 		the data store.
+ *
+ * Key data store specific initialization method.
+ *
+ * Returns 0 on success or a negative value if an error occurs.
+ */
+typedef int			(*xmlSecKeyDataStoreInitializeMethod)	(xmlSecKeyDataStorePtr store);
+
+/** 
+ * xmlSecKeyDataStoreFinalizeMethod:
+ * @store: 		the data store.
+ *
+ * Key data store specific finalization (destroy) method.
+ */
+typedef void			(*xmlSecKeyDataStoreFinalizeMethod)	(xmlSecKeyDataStorePtr store);
+
+/**
+ * xmlSecKeyDataStoreKlass:
+ * @klassSize:		the data store klass size.
+ * @objSize:		the data store obj size.
+ * @name:		the store's name.
+ * @initialize:		the store's initialization method.
+ * @finalize:		the store's finalization (destroy) method.
+ * @reserved0:		reserved for the future.
+ * @reserved1:		reserved for the future.
+ *
+ * The data store id (klass).
+ */
+struct _xmlSecKeyDataStoreKlass {
+    xmlSecSize				klassSize;
+    xmlSecSize				objSize;
+
+    /* data */
+    const xmlChar*			name;    
+        
+    /* constructors/destructor */
+    xmlSecKeyDataStoreInitializeMethod	initialize;
+    xmlSecKeyDataStoreFinalizeMethod	finalize;
+
+    /* for the future */
+    void*				reserved0;
+    void*				reserved1;
+};
+
+/**
+ * xmlSecKeyDataStoreKlassGetName:
+ * @klass:		the pointer to store klass.
+ * 
+ * Macro. Returns store klass name.
+ */
+#define xmlSecKeyDataStoreKlassGetName(klass) \
+	(((klass)) ? ((klass)->name) : NULL)
+
+/***********************************************************************
+ *
+ * Key Data Store list
+ *
+ **********************************************************************/
+/**
+ * xmlSecKeyDataStorePtrListId:
+ *
+ * The data store list id (klass).
+ */
+#define xmlSecKeyDataStorePtrListId	xmlSecKeyDataStorePtrListGetKlass()
+XMLSEC_EXPORT xmlSecPtrListId	xmlSecKeyDataStorePtrListGetKlass	(void);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __XMLSEC_KEYSDATA_H__ */