xmlsecurityengine/xmlsec/inc/xmlsec_keysdata.h
changeset 0 e35f40988205
child 24 74f0b3eb154c
equal deleted inserted replaced
-1:000000000000 0:e35f40988205
       
     1 /** 
       
     2  * XML Security Library (http://www.aleksey.com/xmlsec).
       
     3  *
       
     4  * Key data.
       
     5  *
       
     6  * This is free software; see Copyright file in the source
       
     7  * distribution for preciese wording.
       
     8  * 
       
     9  * Copyright (C) 2002-2003 Aleksey Sanin <aleksey@aleksey.com>
       
    10  * Portion Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
       
    11  */
       
    12 #ifndef __XMLSEC_KEYSDATA_H__
       
    13 #define __XMLSEC_KEYSDATA_H__    
       
    14 
       
    15 #ifdef __cplusplus
       
    16 extern "C" {
       
    17 #endif /* __cplusplus */ 
       
    18 
       
    19 #include <libxml2_tree.h>
       
    20 #include "xmlsec_config.h"
       
    21 #include "xmlsec_xmlsec.h"
       
    22 #include "xmlsec_buffer.h"
       
    23 #include "xmlsec_list.h"
       
    24 
       
    25 /**
       
    26  * Forward declarations
       
    27  */
       
    28 typedef const struct _xmlSecKeyDataKlass 		xmlSecKeyDataKlass, 
       
    29 							*xmlSecKeyDataId; 						
       
    30 typedef const struct _xmlSecKeyDataStoreKlass 		xmlSecKeyDataStoreKlass, 
       
    31 							*xmlSecKeyDataStoreId; 
       
    32 typedef struct _xmlSecKeyDataList 			xmlSecKeyDataList, 
       
    33 							*xmlSecKeyDataListPtr; 
       
    34 
       
    35 
       
    36 /**************************************************************************
       
    37  *
       
    38  * xmlSecKeyDataUsage
       
    39  *
       
    40  *************************************************************************/
       
    41 /** 
       
    42  * xmlSecKeyDataUsage:
       
    43  *
       
    44  * The bits mask that determines possible keys data usage.
       
    45  */
       
    46 typedef unsigned int					xmlSecKeyDataUsage;
       
    47 
       
    48 /**
       
    49  * xmlSecKeyDataUsageUnknown:
       
    50  *
       
    51  * The key data usage is unknown.
       
    52  */
       
    53 #define xmlSecKeyDataUsageUnknown			0x00000
       
    54 
       
    55 /**
       
    56  * xmlSecKeyDataUsageKeyInfoNodeRead:
       
    57  *
       
    58  * The key data could be read from a <dsig:KeyInfo/> child.
       
    59  */
       
    60 #define xmlSecKeyDataUsageKeyInfoNodeRead		0x00001
       
    61 
       
    62 /**
       
    63  * xmlSecKeyDataUsageKeyInfoNodeWrite:
       
    64  *
       
    65  * The key data could be written to a <dsig:KeyInfo /> child.
       
    66  */
       
    67 #define xmlSecKeyDataUsageKeyInfoNodeWrite		0x00002
       
    68 
       
    69 /**
       
    70  * xmlSecKeyDataUsageKeyValueNodeRead:
       
    71  *
       
    72  * The key data could be read from a <dsig:KeyValue /> child.
       
    73  */
       
    74 #define xmlSecKeyDataUsageKeyValueNodeRead		0x00004
       
    75 
       
    76 /**
       
    77  * xmlSecKeyDataUsageKeyValueNodeWrite:
       
    78  *
       
    79  * The key data could be written to a <dsig:KeyValue /> child.
       
    80  */
       
    81 #define xmlSecKeyDataUsageKeyValueNodeWrite		0x00008
       
    82 
       
    83 /**
       
    84  * xmlSecKeyDataUsageRetrievalMethodNodeXml:
       
    85  *
       
    86  * The key data could be retrieved using <dsig:RetrievalMethod /> node
       
    87  * in XML format.
       
    88  */
       
    89 #define xmlSecKeyDataUsageRetrievalMethodNodeXml	0x00010
       
    90 
       
    91 /**
       
    92  * xmlSecKeyDataUsageRetrievalMethodNodeBin:
       
    93  *
       
    94  * The key data could be retrieved using <dsig:RetrievalMethod /> node
       
    95  * in binary format.
       
    96  */
       
    97 #define xmlSecKeyDataUsageRetrievalMethodNodeBin	0x00020
       
    98 
       
    99 /**
       
   100  * xmlSecKeyDataUsageAny:
       
   101  *
       
   102  * Any key data usage.
       
   103  */
       
   104 #define xmlSecKeyDataUsageAny				0xFFFFF
       
   105 
       
   106 /**
       
   107  * xmlSecKeyDataUsageKeyInfoNode:
       
   108  *
       
   109  * The key data could be read and written from/to a <dsig:KeyInfo /> child.
       
   110  */
       
   111 #define xmlSecKeyDataUsageKeyInfoNode			\
       
   112 	(xmlSecKeyDataUsageKeyInfoNodeRead | xmlSecKeyDataUsageKeyInfoNodeWrite)
       
   113 
       
   114 /**
       
   115  * xmlSecKeyDataUsageKeyValueNode:
       
   116  *
       
   117  * The key data could be read and written from/to a <dsig:KeyValue /> child.
       
   118  */
       
   119 #define xmlSecKeyDataUsageKeyValueNode			\
       
   120 	(xmlSecKeyDataUsageKeyValueNodeRead | xmlSecKeyDataUsageKeyValueNodeWrite)
       
   121 
       
   122 /**
       
   123  * xmlSecKeyDataUsageRetrievalMethodNode:
       
   124  *
       
   125  * The key data could be retrieved using <dsig:RetrievalMethod /> node
       
   126  * in any format.
       
   127  */
       
   128 #define xmlSecKeyDataUsageRetrievalMethodNode		\
       
   129 	(xmlSecKeyDataUsageRetrievalMethodNodeXml | xmlSecKeyDataUsageRetrievalMethodNodeBin)
       
   130 
       
   131 /**************************************************************************
       
   132  *
       
   133  * xmlSecKeyDataType
       
   134  *
       
   135  *************************************************************************/
       
   136 /**
       
   137  * xmlSecKeyDataType:
       
   138  *
       
   139  * The key data type (public/private, session/permanet, etc.).
       
   140  */
       
   141 typedef unsigned int				xmlSecKeyDataType;
       
   142 
       
   143 /**
       
   144  * xmlSecKeyDataTypeUnknown:
       
   145  *
       
   146  * The key data type is unknown (same as #xmlSecKeyDataTypeNone).
       
   147  */
       
   148 #define xmlSecKeyDataTypeUnknown			0x0000
       
   149 
       
   150 /**
       
   151  * xmlSecKeyDataTypeNone:
       
   152  *
       
   153  * The key data type is unknown (same as #xmlSecKeyDataTypeUnknown).
       
   154  */
       
   155 #define xmlSecKeyDataTypeNone				xmlSecKeyDataTypeUnknown
       
   156 
       
   157 /**
       
   158  * xmlSecKeyDataTypePublic:
       
   159  *
       
   160  * The key data contain a public key.
       
   161  */
       
   162 #define xmlSecKeyDataTypePublic				0x0001
       
   163 
       
   164 /**
       
   165  * xmlSecKeyDataTypePrivate:
       
   166  *
       
   167  * The key data contain a private key.
       
   168  */
       
   169 #define xmlSecKeyDataTypePrivate			0x0002
       
   170 
       
   171 /**
       
   172  * xmlSecKeyDataTypeSymmetric:
       
   173  *
       
   174  * The key data contain a symmetric key.
       
   175  */
       
   176 #define xmlSecKeyDataTypeSymmetric			0x0004
       
   177 
       
   178 /**
       
   179  * xmlSecKeyDataTypeSession:
       
   180  *
       
   181  * The key data contain session key (one time key, not stored in keys manager).
       
   182  */
       
   183 #define xmlSecKeyDataTypeSession			0x0008
       
   184 
       
   185 /**
       
   186  * xmlSecKeyDataTypePermanent:
       
   187  *
       
   188  * The key data contain permanent key (stored in keys manager).
       
   189  */
       
   190 #define xmlSecKeyDataTypePermanent			0x0010
       
   191 
       
   192 /**
       
   193  * xmlSecKeyDataTypeTrusted:
       
   194  *
       
   195  * The key data is trusted.
       
   196  */
       
   197 #define xmlSecKeyDataTypeTrusted			0x0100
       
   198 
       
   199 /**
       
   200  * xmlSecKeyDataTypeAny:
       
   201  *
       
   202  * Any key data.
       
   203  */
       
   204 #define xmlSecKeyDataTypeAny				0xFFFF
       
   205 
       
   206 /**************************************************************************
       
   207  *
       
   208  * xmlSecKeyDataFormat
       
   209  *
       
   210  *************************************************************************/
       
   211 /**
       
   212  * xmlSecKeyDataFormat:
       
   213  * @xmlSecKeyDataFormatUnknown:		the key data format is unknown.
       
   214  * @xmlSecKeyDataFormatBinary:		the binary key data.
       
   215  * @xmlSecKeyDataFormatPem:		the PEM key data (cert or public/private key).
       
   216  * @xmlSecKeyDataFormatDer:		the DER key data (cert or public/private key).
       
   217  * @xmlSecKeyDataFormatPkcs8Pem:	the PKCS#8 PEM private key.
       
   218  * @xmlSecKeyDataFormatPkcs8Der:	the PKCS#8 DER private key. 
       
   219  * @xmlSecKeyDataFormatPkcs12:		the PKCS12 format (bag of keys and certs)
       
   220  * @xmlSecKeyDataFormatCertPem:		the PEM cert.
       
   221  * @xmlSecKeyDataFormatCertDer:		the DER cert.
       
   222  *
       
   223  * The key data format (binary, der, pem, etc.).
       
   224  */
       
   225 typedef enum {
       
   226     xmlSecKeyDataFormatUnknown = 0,
       
   227     xmlSecKeyDataFormatBinary,
       
   228     xmlSecKeyDataFormatPem,
       
   229     xmlSecKeyDataFormatDer,
       
   230     xmlSecKeyDataFormatPkcs8Pem,
       
   231     xmlSecKeyDataFormatPkcs8Der,
       
   232     xmlSecKeyDataFormatPkcs12,
       
   233     xmlSecKeyDataFormatCertPem,
       
   234     xmlSecKeyDataFormatCertDer
       
   235 } xmlSecKeyDataFormat;
       
   236 
       
   237 /**************************************************************************
       
   238  *
       
   239  * Global xmlSecKeyDataIds methods
       
   240  *
       
   241  *************************************************************************/
       
   242 XMLSEC_EXPORT xmlSecPtrListPtr	xmlSecKeyDataIdsGet		(void);
       
   243 XMLSEC_EXPORT int		xmlSecKeyDataIdsInit		(void);
       
   244 XMLSEC_EXPORT void		xmlSecKeyDataIdsShutdown	(void);
       
   245 XMLSEC_EXPORT int 		xmlSecKeyDataIdsRegisterDefault	(void);
       
   246 XMLSEC_EXPORT int 		xmlSecKeyDataIdsRegister	(xmlSecKeyDataId id);
       
   247 	
       
   248 /**************************************************************************
       
   249  *
       
   250  * xmlSecKeyData
       
   251  *
       
   252  *************************************************************************/
       
   253 /**
       
   254  * xmlSecKeyData:
       
   255  * @id: 		the data id (#xmlSecKeyDataId).
       
   256  * @reserved0: 		reserved for the future.
       
   257  * @reserved1: 		reserved for the future.
       
   258  *
       
   259  * The key data: key value (crypto material), x509 data, pgp data, etc.  
       
   260  */
       
   261 struct _xmlSecKeyData {
       
   262     xmlSecKeyDataId			id;
       
   263     void*				reserved0;
       
   264     void*				reserved1;
       
   265 };
       
   266 
       
   267 XMLSEC_EXPORT xmlSecKeyDataPtr	xmlSecKeyDataCreate		(xmlSecKeyDataId id);
       
   268 XMLSEC_EXPORT xmlSecKeyDataPtr	xmlSecKeyDataDuplicate		(xmlSecKeyDataPtr data);
       
   269 XMLSEC_EXPORT void		xmlSecKeyDataDestroy		(xmlSecKeyDataPtr data);
       
   270 XMLSEC_EXPORT int		xmlSecKeyDataGenerate		(xmlSecKeyDataPtr data,
       
   271 								 xmlSecSize sizeBits,
       
   272 								 xmlSecKeyDataType type);
       
   273 XMLSEC_EXPORT xmlSecKeyDataType	xmlSecKeyDataGetType		(xmlSecKeyDataPtr data);
       
   274 XMLSEC_EXPORT xmlSecSize	xmlSecKeyDataGetSize		(xmlSecKeyDataPtr data);
       
   275 XMLSEC_EXPORT const xmlChar*	xmlSecKeyDataGetIdentifier	(xmlSecKeyDataPtr data);
       
   276 XMLSEC_EXPORT void		xmlSecKeyDataDebugDump		(xmlSecKeyDataPtr data,
       
   277 								 FILE *output);
       
   278 XMLSEC_EXPORT void		xmlSecKeyDataDebugXmlDump	(xmlSecKeyDataPtr data,
       
   279 								 FILE *output);
       
   280 XMLSEC_EXPORT int		xmlSecKeyDataXmlRead		(xmlSecKeyDataId id,
       
   281 								 xmlSecKeyPtr key,
       
   282 								 xmlNodePtr node,
       
   283 								 xmlSecKeyInfoCtxPtr keyInfoCtx);
       
   284 XMLSEC_EXPORT int		xmlSecKeyDataXmlWrite		(xmlSecKeyDataId id,
       
   285 								 xmlSecKeyPtr key,
       
   286 								 xmlNodePtr node,
       
   287 								 xmlSecKeyInfoCtxPtr keyInfoCtx);
       
   288 XMLSEC_EXPORT int		xmlSecKeyDataBinRead		(xmlSecKeyDataId id,
       
   289 								 xmlSecKeyPtr key,
       
   290 								 const xmlSecByte* buf,
       
   291 								 xmlSecSize bufSize,
       
   292 								 xmlSecKeyInfoCtxPtr keyInfoCtx);
       
   293 XMLSEC_EXPORT int		xmlSecKeyDataBinWrite		(xmlSecKeyDataId id,
       
   294 								 xmlSecKeyPtr key,
       
   295 								 xmlSecByte** buf,
       
   296 								 xmlSecSize* bufSize,
       
   297 								 xmlSecKeyInfoCtxPtr keyInfoCtx);
       
   298 
       
   299 
       
   300 /**
       
   301  * xmlSecKeyDataGetName:
       
   302  * @data: 		the pointer to key data.
       
   303  *
       
   304  * Macro. Returns the key data name.
       
   305  */
       
   306 #define xmlSecKeyDataGetName(data) \
       
   307 	((xmlSecKeyDataIsValid((data))) ? \
       
   308 	  xmlSecKeyDataKlassGetName((data)->id) : NULL)
       
   309 
       
   310 /**
       
   311  * xmlSecKeyDataIsValid:
       
   312  * @data: 		the pointer to data.
       
   313  *
       
   314  * Macro. Returns 1 if @data is not NULL and @data->id is not NULL
       
   315  * or 0 otherwise.
       
   316  */ 
       
   317 #define xmlSecKeyDataIsValid(data) \
       
   318 	((( data ) != NULL) && \
       
   319 	 (( data )->id != NULL) && \
       
   320 	 (( data )->id->klassSize >= sizeof(xmlSecKeyDataKlass)) && \
       
   321 	 (( data )->id->objSize >= sizeof(xmlSecKeyData)) && \
       
   322 	 (( data )->id->name != NULL))
       
   323 /**
       
   324  * xmlSecKeyDataCheckId:
       
   325  * @data: 		the pointer to data.
       
   326  * @dataId: 		the data Id.
       
   327  *
       
   328  * Macro. Returns 1 if @data is valid and @data's id is equal to @dataId.
       
   329  */
       
   330 #define xmlSecKeyDataCheckId(data, dataId) \
       
   331  	(xmlSecKeyDataIsValid(( data )) && \
       
   332 	((( data )->id) == ( dataId )))
       
   333 
       
   334 /**
       
   335  * xmlSecKeyDataCheckUsage:
       
   336  * @data: 		the pointer to data.
       
   337  * @usg: 		the data usage.
       
   338  *
       
   339  * Macro. Returns 1 if @data is valid and could be used for @usg.
       
   340  */
       
   341 #define xmlSecKeyDataCheckUsage(data, usg) \
       
   342  	(xmlSecKeyDataIsValid(( data )) && \
       
   343 	(((( data )->id->usage) & ( usg )) != 0))
       
   344 
       
   345 /**
       
   346  * xmlSecKeyDataCheckSize:
       
   347  * @data: 		the pointer to data.
       
   348  * @size: 		the expected size.
       
   349  *
       
   350  * Macro. Returns 1 if @data is valid and @data's object has at least @size bytes.
       
   351  */
       
   352 #define xmlSecKeyDataCheckSize(data, size) \
       
   353  	(xmlSecKeyDataIsValid(( data )) && \
       
   354 	 (( data )->id->objSize >= size))
       
   355 
       
   356 /**************************************************************************
       
   357  *
       
   358  * xmlSecKeyDataKlass
       
   359  *
       
   360  *************************************************************************/
       
   361 /**
       
   362  * xmlSecKeyDataIdUnknown:
       
   363  *
       
   364  * The "unknown" id.
       
   365  */
       
   366 #define xmlSecKeyDataIdUnknown 			((xmlSecKeyDataId)NULL)
       
   367 
       
   368 /** 
       
   369  * xmlSecKeyDataInitMethod:
       
   370  * @data: 		the pointer to key data.
       
   371  *
       
   372  * Key data specific initialization method.
       
   373  *
       
   374  * Returns 0 on success or a negative value if an error occurs.
       
   375  */
       
   376 typedef int			(*xmlSecKeyDataInitMethod)	(xmlSecKeyDataPtr data);
       
   377 
       
   378 /** 
       
   379  * xmlSecKeyDataDuplicateMethod:
       
   380  * @dst: 		the pointer to destination key data.
       
   381  * @src: 		the poiniter to source key data.
       
   382  *
       
   383  * Key data specific duplication (copy) method.
       
   384  *
       
   385  * Returns 0 on success or a negative value if an error occurs.
       
   386  */
       
   387 typedef int			(*xmlSecKeyDataDuplicateMethod)	(xmlSecKeyDataPtr dst,
       
   388 								 xmlSecKeyDataPtr src);
       
   389 
       
   390 /** 
       
   391  * xmlSecKeyDataFinalizeMethod:
       
   392  * @data: 		the data.
       
   393  *
       
   394  * Key data specific finalization method. All the objects and resources allocated
       
   395  * by the key data object must be freed inside this method.
       
   396  */
       
   397 typedef void			(*xmlSecKeyDataFinalizeMethod)	(xmlSecKeyDataPtr data);
       
   398 
       
   399 /** 
       
   400  * xmlSecKeyDataXmlReadMethod:
       
   401  * @id: 		the data id.
       
   402  * @key: 		the key.
       
   403  * @node: 		the pointer to data's value XML node.
       
   404  * @keyInfoCtx: 	the <dsig:KeyInfo/> node processing context.
       
   405  *
       
   406  * Key data specific method for reading XML node. 
       
   407  * 
       
   408  * Returns 0 on success or a negative value if an error occurs.
       
   409  */
       
   410 typedef int			(*xmlSecKeyDataXmlReadMethod)	(xmlSecKeyDataId id,
       
   411 								 xmlSecKeyPtr key,
       
   412 								 xmlNodePtr node,
       
   413 								 xmlSecKeyInfoCtxPtr keyInfoCtx);
       
   414 /** 
       
   415  * xmlSecKeyDataXmlWriteMethod:
       
   416  * @id: 		the data id.
       
   417  * @key: 		the key.
       
   418  * @node: 		the pointer to data's value XML node.
       
   419  * @keyInfoCtx: 	the <dsig:KeyInfo> node processing context.
       
   420  *
       
   421  * Key data specific method for writing XML node.
       
   422  * 
       
   423  * Returns 0 on success or a negative value if an error occurs.
       
   424  */
       
   425 typedef int			(*xmlSecKeyDataXmlWriteMethod)	(xmlSecKeyDataId id,
       
   426 								 xmlSecKeyPtr key,
       
   427 								 xmlNodePtr node,
       
   428 								 xmlSecKeyInfoCtxPtr keyInfoCtx);
       
   429 /** 
       
   430  * xmlSecKeyDataBinReadMethod:
       
   431  * @id: 		the data id.
       
   432  * @key: 		the key.
       
   433  * @buf: 		the input buffer.
       
   434  * @bufSize:		the buffer size.
       
   435  * @keyInfoCtx: 	the <dsig:KeyInfo/> node processing context.
       
   436  *
       
   437  * Key data specific method for reading binary buffer.
       
   438  * 
       
   439  * Returns 0 on success or a negative value if an error occurs.
       
   440  */
       
   441 typedef int			(*xmlSecKeyDataBinReadMethod)	(xmlSecKeyDataId id,
       
   442 								 xmlSecKeyPtr key,
       
   443 								 const xmlSecByte* buf,
       
   444 								 xmlSecSize bufSize,
       
   445 								 xmlSecKeyInfoCtxPtr keyInfoCtx);
       
   446 /** 
       
   447  * xmlSecKeyDataBinWriteMethod:
       
   448  * @id: 		the data id.
       
   449  * @key: 		the key.
       
   450  * @buf: 		the output buffer.
       
   451  * @bufSize: 		the buffer size.
       
   452  * @keyInfoCtx: 	the <dsig:KeyInfo/> node processing context.
       
   453  *
       
   454  * Key data specific method for reading binary buffer. 
       
   455  * 
       
   456  * Returns 0 on success or a negative value if an error occurs.
       
   457  */
       
   458 typedef int			(*xmlSecKeyDataBinWriteMethod)	(xmlSecKeyDataId id,
       
   459 								 xmlSecKeyPtr key,
       
   460 								 xmlSecByte** buf,
       
   461 								 xmlSecSize* bufSize,
       
   462 								 xmlSecKeyInfoCtxPtr keyInfoCtx);
       
   463 
       
   464 /** 
       
   465  * xmlSecKeyDataGenerateMethod:
       
   466  * @data: 		the pointer to key data.
       
   467  * @sizeBits: 		the key data specific size.
       
   468  * @type:		the required key type (session/permanent, etc.)
       
   469  *
       
   470  * Key data specific method for generating new key data.
       
   471  *
       
   472  * Returns 0 on success or a negative value if an error occurs.
       
   473  */
       
   474 typedef int			(*xmlSecKeyDataGenerateMethod)	(xmlSecKeyDataPtr data,
       
   475 								 xmlSecSize sizeBits,
       
   476 								 xmlSecKeyDataType type);
       
   477 
       
   478 /** 
       
   479  * xmlSecKeyDataGetTypeMethod:
       
   480  * @data:		 the data.
       
   481  *
       
   482  * Key data specific method to get the key type.
       
   483  *
       
   484  * Returns the key type.
       
   485  */
       
   486 typedef xmlSecKeyDataType	(*xmlSecKeyDataGetTypeMethod)	(xmlSecKeyDataPtr data);
       
   487 
       
   488 /** 
       
   489  * xmlSecKeyDataGetSizeMethod:
       
   490  * @data: 		the pointer to key data.
       
   491  *
       
   492  * Key data specific method to get the key size.
       
   493  *
       
   494  * Returns the key size in bits.
       
   495  */
       
   496 typedef xmlSecSize		(*xmlSecKeyDataGetSizeMethod)	(xmlSecKeyDataPtr data);
       
   497 
       
   498 /** 
       
   499  * xmlSecKeyDataGetIdentifierMethod:
       
   500  * @data: 		the pointer to key data.
       
   501  *
       
   502  * Key data specific method to get the key data identifier string (for example,
       
   503  * X509 data identifier is the subject of the verified cert).
       
   504  *
       
   505  * Returns the identifier string or NULL if an error occurs.
       
   506  */
       
   507 typedef const xmlChar*		(*xmlSecKeyDataGetIdentifierMethod) (xmlSecKeyDataPtr data);
       
   508 
       
   509 /** 
       
   510  * xmlSecKeyDataDebugDumpMethod:
       
   511  * @data: 		the data.
       
   512  * @output: 		the FILE to print debug info (should be open for writing).
       
   513  *
       
   514  * Key data specific method for printing debug info.
       
   515  */
       
   516 typedef void			(*xmlSecKeyDataDebugDumpMethod)	(xmlSecKeyDataPtr data,
       
   517 								 FILE* output);
       
   518 
       
   519 /**
       
   520  * xmlSecKeyDataKlass:
       
   521  * @klassSize:		the klass size.
       
   522  * @objSize:		the object size.
       
   523  * @name:		the object name.
       
   524  * @usage:		the allowed data usage.
       
   525  * @href:		the identification string (href).
       
   526  * @dataNodeName:	the data's XML node name.
       
   527  * @dataNodeNs:		the data's XML node namespace.
       
   528  * @initialize:		the initialization method.  
       
   529  * @duplicate:		the duplicate (copy) method.
       
   530  * @finalize:		the finalization (destroy) method.
       
   531  * @generate:		the new data generation method.
       
   532  * @getType:		the method to access data's type information.
       
   533  * @getSize:		the method to access data's size.
       
   534  * @getIdentifier:	the method to access data's string identifier.
       
   535  * @xmlRead:		the method for reading data from XML node.
       
   536  * @xmlWrite:		the method for writing data to XML node.
       
   537  * @binRead:		the method for reading data from a binary buffer.
       
   538  * @binWrite:		the method for writing data to binary buffer.
       
   539  * @debugDump: 		the method for printing debug data information.
       
   540  * @debugXmlDump:	the method for printing debug data information in XML format.
       
   541  * @reserved0:		reserved for the future.
       
   542  * @reserved1:		reserved for the future.
       
   543  *
       
   544  * The data id (klass).
       
   545  */
       
   546 struct _xmlSecKeyDataKlass {
       
   547     xmlSecSize				klassSize;
       
   548     xmlSecSize				objSize;
       
   549 
       
   550     /* data */
       
   551     const xmlChar*			name;    
       
   552     xmlSecKeyDataUsage			usage;
       
   553     const xmlChar*			href;
       
   554     const xmlChar*			dataNodeName;
       
   555     const xmlChar*			dataNodeNs;
       
   556     
       
   557     /* constructors/destructor */
       
   558     xmlSecKeyDataInitMethod		initialize;
       
   559     xmlSecKeyDataDuplicateMethod	duplicate;
       
   560     xmlSecKeyDataFinalizeMethod		finalize;
       
   561     xmlSecKeyDataGenerateMethod		generate;
       
   562     
       
   563     /* get info */
       
   564     xmlSecKeyDataGetTypeMethod		getType;
       
   565     xmlSecKeyDataGetSizeMethod		getSize;
       
   566     xmlSecKeyDataGetIdentifierMethod	getIdentifier;
       
   567 
       
   568     /* read/write */
       
   569     xmlSecKeyDataXmlReadMethod		xmlRead;
       
   570     xmlSecKeyDataXmlWriteMethod		xmlWrite;
       
   571     xmlSecKeyDataBinReadMethod		binRead;
       
   572     xmlSecKeyDataBinWriteMethod		binWrite;
       
   573 
       
   574     /* debug */
       
   575     xmlSecKeyDataDebugDumpMethod	debugDump;
       
   576     xmlSecKeyDataDebugDumpMethod	debugXmlDump;
       
   577 
       
   578     /* for the future */
       
   579     void*				reserved0;
       
   580     void*				reserved1;
       
   581 };
       
   582 
       
   583 /**
       
   584  * xmlSecKeyDataKlassGetName:
       
   585  * @klass: 		the data klass.
       
   586  *
       
   587  * Macro. Returns data klass name.
       
   588  */
       
   589 #define xmlSecKeyDataKlassGetName(klass) \
       
   590 	(((klass)) ? ((klass)->name) : NULL)
       
   591 
       
   592 /***********************************************************************
       
   593  *
       
   594  * Key Data list
       
   595  *
       
   596  **********************************************************************/
       
   597 /**
       
   598  * xmlSecKeyDataListId:
       
   599  *
       
   600  *
       
   601  * The key data klasses list klass id.
       
   602  */
       
   603 #define xmlSecKeyDataListId	xmlSecKeyDataListGetKlass()
       
   604 XMLSEC_EXPORT xmlSecPtrListId	xmlSecKeyDataListGetKlass	(void);
       
   605 
       
   606 /***********************************************************************
       
   607  *
       
   608  * Key Data Ids list
       
   609  *
       
   610  **********************************************************************/
       
   611 /**
       
   612  * xmlSecKeyDataIdListId:
       
   613  *
       
   614  *
       
   615  * The key data list klass id.
       
   616  */
       
   617 #define xmlSecKeyDataIdListId	xmlSecKeyDataIdListGetKlass()
       
   618 XMLSEC_EXPORT xmlSecPtrListId	xmlSecKeyDataIdListGetKlass	(void);
       
   619 XMLSEC_EXPORT int		xmlSecKeyDataIdListFind		(xmlSecPtrListPtr list,
       
   620 								 xmlSecKeyDataId dataId);
       
   621 XMLSEC_EXPORT xmlSecKeyDataId	xmlSecKeyDataIdListFindByNode	(xmlSecPtrListPtr list,
       
   622 								 const xmlChar* nodeName,
       
   623 								 const xmlChar* nodeNs,
       
   624 								 xmlSecKeyDataUsage usage);
       
   625 XMLSEC_EXPORT xmlSecKeyDataId	xmlSecKeyDataIdListFindByHref	(xmlSecPtrListPtr list,
       
   626 								 const xmlChar* href,
       
   627 								 xmlSecKeyDataUsage usage);
       
   628 XMLSEC_EXPORT xmlSecKeyDataId	xmlSecKeyDataIdListFindByName	(xmlSecPtrListPtr list,
       
   629 								 const xmlChar* name,
       
   630 								 xmlSecKeyDataUsage usage);
       
   631 XMLSEC_EXPORT void		xmlSecKeyDataIdListDebugDump	(xmlSecPtrListPtr list,
       
   632 								 FILE* output);
       
   633 XMLSEC_EXPORT void		xmlSecKeyDataIdListDebugXmlDump	(xmlSecPtrListPtr list,
       
   634 								 FILE* output);
       
   635 
       
   636 /**************************************************************************
       
   637  *
       
   638  * xmlSecKeyDataBinary
       
   639  * 
       
   640  * key (xmlSecBuffer) is located after xmlSecKeyData structure
       
   641  *
       
   642  *************************************************************************/
       
   643 /**
       
   644  * xmlSecKeyDataBinarySize:
       
   645  *
       
   646  * The binary key data object size.
       
   647  */
       
   648 #define xmlSecKeyDataBinarySize	\
       
   649     (sizeof(xmlSecKeyData) + sizeof(xmlSecBuffer))
       
   650  
       
   651 XMLSEC_EXPORT int		xmlSecKeyDataBinaryValueInitialize	(xmlSecKeyDataPtr data);
       
   652 XMLSEC_EXPORT int		xmlSecKeyDataBinaryValueDuplicate	(xmlSecKeyDataPtr dst,
       
   653 									xmlSecKeyDataPtr src);
       
   654 XMLSEC_EXPORT void		xmlSecKeyDataBinaryValueFinalize	(xmlSecKeyDataPtr data);
       
   655 XMLSEC_EXPORT int		xmlSecKeyDataBinaryValueXmlRead		(xmlSecKeyDataId id,
       
   656 								         xmlSecKeyPtr key,
       
   657 									 xmlNodePtr node,
       
   658 								         xmlSecKeyInfoCtxPtr keyInfoCtx);
       
   659 XMLSEC_EXPORT int		xmlSecKeyDataBinaryValueXmlWrite	(xmlSecKeyDataId id,
       
   660 									 xmlSecKeyPtr key,
       
   661 									 xmlNodePtr node,
       
   662 									 xmlSecKeyInfoCtxPtr keyInfoCtx);
       
   663 XMLSEC_EXPORT int		xmlSecKeyDataBinaryValueBinRead		(xmlSecKeyDataId id,
       
   664 									 xmlSecKeyPtr key,
       
   665 									 const xmlSecByte* buf,
       
   666 									 xmlSecSize bufSize,
       
   667 									 xmlSecKeyInfoCtxPtr keyInfoCtx);
       
   668 XMLSEC_EXPORT int		xmlSecKeyDataBinaryValueBinWrite	(xmlSecKeyDataId id,
       
   669 									 xmlSecKeyPtr key,
       
   670 									 xmlSecByte** buf,
       
   671 									 xmlSecSize* bufSize,
       
   672 									 xmlSecKeyInfoCtxPtr keyInfoCtx);
       
   673 XMLSEC_EXPORT void		xmlSecKeyDataBinaryValueDebugDump	(xmlSecKeyDataPtr data,
       
   674 									FILE* output);
       
   675 XMLSEC_EXPORT void		xmlSecKeyDataBinaryValueDebugXmlDump	(xmlSecKeyDataPtr data,
       
   676 									 FILE* output);
       
   677 
       
   678 XMLSEC_EXPORT xmlSecSize	xmlSecKeyDataBinaryValueGetSize		(xmlSecKeyDataPtr data);
       
   679 XMLSEC_EXPORT xmlSecBufferPtr	xmlSecKeyDataBinaryValueGetBuffer	(xmlSecKeyDataPtr data);
       
   680 XMLSEC_EXPORT int		xmlSecKeyDataBinaryValueSetBuffer	(xmlSecKeyDataPtr data,
       
   681 									 const xmlSecByte* buf,
       
   682 									 xmlSecSize bufSize);
       
   683 
       
   684 /**************************************************************************
       
   685  *
       
   686  * xmlSecKeyDataStore
       
   687  *
       
   688  *************************************************************************/
       
   689 /**
       
   690  * xmlSecKeyDataStore:
       
   691  * @id: 		the store id (#xmlSecKeyDataStoreId).
       
   692  * @reserved0:		reserved for the future.
       
   693  * @reserved1:		reserved for the future.
       
   694  *
       
   695  * The key data store. Key data store holds common key data specific information
       
   696  * required for key data processing. For example, X509 data store may hold 
       
   697  * information about trusted (root) certificates.
       
   698  */
       
   699 struct _xmlSecKeyDataStore {
       
   700     xmlSecKeyDataStoreId		id;
       
   701 
       
   702     /* for the future */
       
   703     void*				reserved0;
       
   704     void*				reserved1;
       
   705 };
       
   706 
       
   707 XMLSEC_EXPORT xmlSecKeyDataStorePtr xmlSecKeyDataStoreCreate	(xmlSecKeyDataStoreId id);
       
   708 XMLSEC_EXPORT void		xmlSecKeyDataStoreDestroy	(xmlSecKeyDataStorePtr store);
       
   709 
       
   710 /**
       
   711  * xmlSecKeyDataStoreGetName:
       
   712  * @store: 		the pointer to store.
       
   713  *
       
   714  * Macro. Returns key data store name.
       
   715  */
       
   716 #define xmlSecKeyDataStoreGetName(store) \
       
   717     ((xmlSecKeyDataStoreIsValid((store))) ? \
       
   718       xmlSecKeyDataStoreKlassGetName((store)->id) : NULL)
       
   719 
       
   720 /**
       
   721  * xmlSecKeyDataStoreIsValid:
       
   722  * @store: 		the pointer to store.
       
   723  *
       
   724  * Macro. Returns 1 if @store is not NULL and @store->id is not NULL
       
   725  * or 0 otherwise.
       
   726  */ 
       
   727 #define xmlSecKeyDataStoreIsValid(store) \
       
   728 	((( store ) != NULL) && ((( store )->id) != NULL))
       
   729 /**
       
   730  * xmlSecKeyDataStoreCheckId:
       
   731  * @store: 		the pointer to store.
       
   732  * @storeId: 		the store Id.
       
   733  *
       
   734  * Macro. Returns 1 if @store is valid and @store's id is equal to @storeId.
       
   735  */
       
   736 #define xmlSecKeyDataStoreCheckId(store, storeId) \
       
   737  	(xmlSecKeyDataStoreIsValid(( store )) && \
       
   738 	((( store )->id) == ( storeId )))
       
   739 
       
   740 /**
       
   741  * xmlSecKeyDataStoreCheckSize:
       
   742  * @store: 		the pointer to store.
       
   743  * @size: 		the expected size.
       
   744  *
       
   745  * Macro. Returns 1 if @data is valid and @stores's object has at least @size bytes.
       
   746  */
       
   747 #define xmlSecKeyDataStoreCheckSize(store, size) \
       
   748  	(xmlSecKeyDataStoreIsValid(( store )) && \
       
   749 	 (( store )->id->objSize >= size))
       
   750 
       
   751 
       
   752 /**************************************************************************
       
   753  *
       
   754  * xmlSecKeyDataStoreKlass
       
   755  *
       
   756  *************************************************************************/
       
   757 /**
       
   758  * xmlSecKeyDataStoreIdUnknown:
       
   759  *
       
   760  * The "unknown" id.
       
   761  */
       
   762 #define xmlSecKeyDataStoreIdUnknown 			NULL
       
   763 
       
   764 /** 
       
   765  * xmlSecKeyDataStoreInitializeMethod:
       
   766  * @store: 		the data store.
       
   767  *
       
   768  * Key data store specific initialization method.
       
   769  *
       
   770  * Returns 0 on success or a negative value if an error occurs.
       
   771  */
       
   772 typedef int			(*xmlSecKeyDataStoreInitializeMethod)	(xmlSecKeyDataStorePtr store);
       
   773 
       
   774 /** 
       
   775  * xmlSecKeyDataStoreFinalizeMethod:
       
   776  * @store: 		the data store.
       
   777  *
       
   778  * Key data store specific finalization (destroy) method.
       
   779  */
       
   780 typedef void			(*xmlSecKeyDataStoreFinalizeMethod)	(xmlSecKeyDataStorePtr store);
       
   781 
       
   782 /**
       
   783  * xmlSecKeyDataStoreKlass:
       
   784  * @klassSize:		the data store klass size.
       
   785  * @objSize:		the data store obj size.
       
   786  * @name:		the store's name.
       
   787  * @initialize:		the store's initialization method.
       
   788  * @finalize:		the store's finalization (destroy) method.
       
   789  * @reserved0:		reserved for the future.
       
   790  * @reserved1:		reserved for the future.
       
   791  *
       
   792  * The data store id (klass).
       
   793  */
       
   794 struct _xmlSecKeyDataStoreKlass {
       
   795     xmlSecSize				klassSize;
       
   796     xmlSecSize				objSize;
       
   797 
       
   798     /* data */
       
   799     const xmlChar*			name;    
       
   800         
       
   801     /* constructors/destructor */
       
   802     xmlSecKeyDataStoreInitializeMethod	initialize;
       
   803     xmlSecKeyDataStoreFinalizeMethod	finalize;
       
   804 
       
   805     /* for the future */
       
   806     void*				reserved0;
       
   807     void*				reserved1;
       
   808 };
       
   809 
       
   810 /**
       
   811  * xmlSecKeyDataStoreKlassGetName:
       
   812  * @klass:		the pointer to store klass.
       
   813  * 
       
   814  * Macro. Returns store klass name.
       
   815  */
       
   816 #define xmlSecKeyDataStoreKlassGetName(klass) \
       
   817 	(((klass)) ? ((klass)->name) : NULL)
       
   818 
       
   819 /***********************************************************************
       
   820  *
       
   821  * Key Data Store list
       
   822  *
       
   823  **********************************************************************/
       
   824 /**
       
   825  * xmlSecKeyDataStorePtrListId:
       
   826  *
       
   827  * The data store list id (klass).
       
   828  */
       
   829 #define xmlSecKeyDataStorePtrListId	xmlSecKeyDataStorePtrListGetKlass()
       
   830 XMLSEC_EXPORT xmlSecPtrListId	xmlSecKeyDataStorePtrListGetKlass	(void);
       
   831 
       
   832 
       
   833 #ifdef __cplusplus
       
   834 }
       
   835 #endif /* __cplusplus */
       
   836 
       
   837 #endif /* __XMLSEC_KEYSDATA_H__ */