LCOV - code coverage report
Current view: top level - libreoffice/workdir/unxlngi6.pro/UnpackedTarball/xmlsec/src - keysdata.c (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 453 0.0 %
Date: 2012-12-17 Functions: 0 41 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       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             :  */
      11             : 
      12             : #include "globals.h"
      13             : 
      14             : #include <stdlib.h>
      15             : #include <string.h>
      16             :  
      17             : #include <libxml/tree.h>
      18             : 
      19             : #include <xmlsec/xmlsec.h>
      20             : #include <xmlsec/xmltree.h>
      21             : #include <xmlsec/keys.h>
      22             : #include <xmlsec/keyinfo.h>
      23             : #include <xmlsec/transforms.h>
      24             : #include <xmlsec/base64.h>
      25             : #include <xmlsec/keyinfo.h>
      26             : #include <xmlsec/errors.h>
      27             : 
      28             : 
      29             : /**************************************************************************
      30             :  *
      31             :  * Global xmlSecKeyDataIds list functions
      32             :  *
      33             :  *************************************************************************/
      34             : static xmlSecPtrList xmlSecAllKeyDataIds;
      35             : 
      36             : /** 
      37             :  * xmlSecKeyDataIdsGet:
      38             :  *
      39             :  * Gets global registered key data klasses list.
      40             :  * 
      41             :  * Returns: the pointer to list of all registered key data klasses.
      42             :  */
      43             : xmlSecPtrListPtr
      44           0 : xmlSecKeyDataIdsGet(void) {
      45           0 :     return(&xmlSecAllKeyDataIds);
      46             : }
      47             : 
      48             : /** 
      49             :  * xmlSecKeyDataIdsInit:
      50             :  *
      51             :  * Initializes the key data klasses. This function is called from the 
      52             :  * #xmlSecInit function and the application should not call it directly.
      53             :  *
      54             :  * Returns: 0 on success or a negative value if an error occurs.
      55             :  */
      56             : int 
      57           0 : xmlSecKeyDataIdsInit(void) {
      58             :     int ret;
      59             :     
      60           0 :     ret = xmlSecPtrListInitialize(xmlSecKeyDataIdsGet(), xmlSecKeyDataIdListId);
      61           0 :     if(ret < 0) {
      62           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
      63             :                     NULL,
      64             :                     "xmlSecPtrListPtrInitialize",
      65             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
      66             :                     "xmlSecKeyDataIdListId");
      67           0 :         return(-1);
      68             :     }
      69             :     
      70           0 :     ret = xmlSecKeyDataIdsRegisterDefault();
      71           0 :     if(ret < 0) {
      72           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
      73             :                     NULL,
      74             :                     "xmlSecKeyDataIdsRegisterDefault",
      75             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
      76             :                     XMLSEC_ERRORS_NO_MESSAGE);
      77           0 :         return(-1);
      78             :     }
      79             :     
      80           0 :     return(0);
      81             : }
      82             : 
      83             : /**
      84             :  * xmlSecKeyDataIdsShutdown:
      85             :  * 
      86             :  * Shuts down the keys data klasses. This function is called from the 
      87             :  * #xmlSecShutdown function and the application should not call it directly.
      88             :  */
      89             : void
      90           0 : xmlSecKeyDataIdsShutdown(void) {
      91           0 :     xmlSecPtrListFinalize(xmlSecKeyDataIdsGet());
      92           0 : }
      93             : 
      94             : /** 
      95             :  * xmlSecKeyDataIdsRegister:
      96             :  * @id:                 the key data klass.
      97             :  *
      98             :  * Registers @id in the global list of key data klasses.
      99             :  *
     100             :  * Returns: 0 on success or a negative value if an error occurs.
     101             :  */
     102             : int 
     103           0 : xmlSecKeyDataIdsRegister(xmlSecKeyDataId id) {
     104             :     int ret;
     105             :         
     106           0 :     xmlSecAssert2(id != xmlSecKeyDataIdUnknown, -1);
     107             :     
     108           0 :     ret = xmlSecPtrListAdd(xmlSecKeyDataIdsGet(), (xmlSecPtr)id);
     109           0 :     if(ret < 0) {
     110           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
     111             :                     NULL,
     112             :                     "xmlSecPtrListAdd",
     113             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
     114             :                     "dataId=%s",
     115           0 :                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)));
     116           0 :         return(-1);
     117             :     }
     118             :     
     119           0 :     return(0);    
     120             : }
     121             : 
     122             : /**
     123             :  * xmlSecKeyDataIdsRegisterDefault:
     124             :  *
     125             :  * Registers default (implemented by XML Security Library)
     126             :  * key data klasses: <dsig:KeyName/> element processing klass, 
     127             :  * <dsig:KeyValue/> element processing klass, ...
     128             :  *
     129             :  * Returns: 0 on success or a negative value if an error occurs.
     130             :  */
     131             : int 
     132           0 : xmlSecKeyDataIdsRegisterDefault(void) {
     133           0 :     if(xmlSecKeyDataIdsRegister(xmlSecKeyDataNameId) < 0) {
     134           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
     135             :                     NULL,
     136             :                     "xmlSecKeyDataIdsRegister",
     137             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
     138             :                     "xmlSecKeyDataNameId");
     139           0 :         return(-1);     
     140             :     }
     141             : 
     142           0 :     if(xmlSecKeyDataIdsRegister(xmlSecKeyDataValueId) < 0) {
     143           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
     144             :                     NULL,
     145             :                     "xmlSecKeyDataIdsRegister",
     146             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
     147             :                     "xmlSecKeyDataValueId");
     148           0 :         return(-1);     
     149             :     }
     150             : 
     151           0 :     if(xmlSecKeyDataIdsRegister(xmlSecKeyDataRetrievalMethodId) < 0) {
     152           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
     153             :                     NULL,
     154             :                     "xmlSecKeyDataIdsRegister",
     155             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
     156             :                     "xmlSecKeyDataRetrievalMethodId");
     157           0 :         return(-1);     
     158             :     }
     159             : 
     160             : #ifndef XMLSEC_NO_XMLENC
     161           0 :     if(xmlSecKeyDataIdsRegister(xmlSecKeyDataEncryptedKeyId) < 0) {
     162           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
     163             :                     NULL,
     164             :                     "xmlSecKeyDataIdsRegister",
     165             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
     166             :                     "xmlSecKeyDataEncryptedKeyId");
     167           0 :         return(-1);     
     168             :     }
     169             : #endif /* XMLSEC_NO_XMLENC */
     170             :     
     171           0 :     return(0);
     172             : }
     173             : 
     174             : /**************************************************************************
     175             :  *
     176             :  * xmlSecKeyData functions
     177             :  *
     178             :  *************************************************************************/
     179             : /**
     180             :  * xmlSecKeyDataCreate:
     181             :  * @id:                 the data id.
     182             :  *
     183             :  * Allocates and initializes new key data of the specified type @id.
     184             :  * Caller is responsible for destroing returend object with 
     185             :  * #xmlSecKeyDataDestroy function.
     186             :  *
     187             :  * Returns: the pointer to newly allocated key data structure
     188             :  * or NULL if an error occurs.
     189             :  */
     190             : xmlSecKeyDataPtr        
     191           0 : xmlSecKeyDataCreate(xmlSecKeyDataId id)  {
     192             :     xmlSecKeyDataPtr data;
     193             :     int ret;
     194             :         
     195           0 :     xmlSecAssert2(id != NULL, NULL);
     196           0 :     xmlSecAssert2(id->klassSize >= sizeof(xmlSecKeyDataKlass), NULL);
     197           0 :     xmlSecAssert2(id->objSize >= sizeof(xmlSecKeyData), NULL);
     198           0 :     xmlSecAssert2(id->name != NULL, NULL);
     199             :         
     200             :     /* Allocate a new xmlSecKeyData and fill the fields. */
     201           0 :     data = (xmlSecKeyDataPtr)xmlMalloc(id->objSize);
     202           0 :     if(data == NULL) {
     203           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
     204           0 :                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)),
     205             :                     NULL,
     206             :                     XMLSEC_ERRORS_R_MALLOC_FAILED,
     207             :                     "size=%d", id->objSize); 
     208           0 :         return(NULL);
     209             :     }
     210           0 :     memset(data, 0, id->objSize);    
     211           0 :     data->id = id;
     212             : 
     213           0 :     if(id->initialize != NULL) {
     214           0 :         ret = (id->initialize)(data);
     215           0 :         if(ret < 0) {
     216           0 :             xmlSecError(XMLSEC_ERRORS_HERE,
     217           0 :                         xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)),
     218             :                         "id->initialize",
     219             :                         XMLSEC_ERRORS_R_XMLSEC_FAILED,
     220             :                         XMLSEC_ERRORS_NO_MESSAGE);
     221           0 :             xmlSecKeyDataDestroy(data);
     222           0 :             return(NULL);
     223             :         }
     224             :     }
     225             :     
     226           0 :     return(data);
     227             : }
     228             : 
     229             : /**
     230             :  * xmlSecKeyDataDuplicate:
     231             :  * @data:               the pointer to the key data.
     232             :  *
     233             :  * Creates a duplicate of the given @data. Caller is responsible for 
     234             :  * destroing returend object with #xmlSecKeyDataDestroy function.
     235             :  *
     236             :  * Returns: the pointer to newly allocated key data structure
     237             :  * or NULL if an error occurs.
     238             :  */
     239             : xmlSecKeyDataPtr        
     240           0 : xmlSecKeyDataDuplicate(xmlSecKeyDataPtr data) {
     241             :     xmlSecKeyDataPtr newData;
     242             :     int ret;
     243             : 
     244           0 :     xmlSecAssert2(xmlSecKeyDataIsValid(data), NULL);
     245           0 :     xmlSecAssert2(data->id->duplicate != NULL, NULL);
     246             : 
     247           0 :     newData = xmlSecKeyDataCreate(data->id);
     248           0 :     if(newData == NULL) {
     249           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
     250           0 :                     xmlSecErrorsSafeString(xmlSecKeyDataGetName(data)),
     251             :                     "xmlSecKeyDataCreate",
     252             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
     253             :                     XMLSEC_ERRORS_NO_MESSAGE); 
     254           0 :         return(NULL);
     255             :     }
     256             : 
     257           0 :     ret = (data->id->duplicate)(newData, data);
     258           0 :     if(newData == NULL) {
     259           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
     260           0 :                     xmlSecErrorsSafeString(xmlSecKeyDataGetName(data)),
     261             :                     "id->duplicate",
     262             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
     263             :                     XMLSEC_ERRORS_NO_MESSAGE);
     264           0 :         xmlSecKeyDataDestroy(newData);
     265           0 :         return(NULL);   
     266             :     }
     267             :     
     268           0 :     return(newData);
     269             : }
     270             : 
     271             : /**
     272             :  * xmlSecKeyDataDestroy:
     273             :  * @data:               the pointer to the key data.
     274             :  *
     275             :  * Destroys the data and frees all allocated memory. 
     276             :  */
     277             : void
     278           0 : xmlSecKeyDataDestroy(xmlSecKeyDataPtr data) {
     279           0 :     xmlSecAssert(xmlSecKeyDataIsValid(data));    
     280           0 :     xmlSecAssert(data->id->objSize > 0);
     281             :     
     282           0 :     if(data->id->finalize != NULL) { 
     283           0 :         (data->id->finalize)(data);
     284             :     }
     285           0 :     memset(data, 0, data->id->objSize);
     286           0 :     xmlFree(data);
     287             : }
     288             : 
     289             : 
     290             : /**
     291             :  * xmlSecKeyDataXmlRead:
     292             :  * @id:                 the data klass.
     293             :  * @key:                the destination key.
     294             :  * @node:               the pointer to an XML node.
     295             :  * @keyInfoCtx:         the pointer to <dsig:KeyInfo/> element processing context.
     296             :  * 
     297             :  * Reads the key data of klass @id from XML @node and adds them to @key.
     298             :  *
     299             :  * Returns: 0 on success or a negative value otherwise.
     300             :  */
     301             : int
     302           0 : xmlSecKeyDataXmlRead(xmlSecKeyDataId id, xmlSecKeyPtr key, xmlNodePtr node, xmlSecKeyInfoCtxPtr keyInfoCtx) {
     303           0 :     xmlSecAssert2(id != NULL, -1);
     304           0 :     xmlSecAssert2(id->xmlRead != NULL, -1);
     305           0 :     xmlSecAssert2(key != NULL, -1);
     306           0 :     xmlSecAssert2(node != NULL, -1);
     307             : 
     308           0 :     return((id->xmlRead)(id, key, node, keyInfoCtx));
     309             : }
     310             : 
     311             : /**
     312             :  * xmlSecKeyDataXmlWrite:
     313             :  * @id:                 the data klass.
     314             :  * @key:                the source key.
     315             :  * @node:               the pointer to an XML node.
     316             :  * @keyInfoCtx:         the pointer to <dsig:KeyInfo/> element processing context.
     317             :  * 
     318             :  * Writes the key data of klass @id from @key to an XML @node.
     319             :  *
     320             :  * Returns: 0 on success or a negative value otherwise.
     321             :  */
     322             : int
     323           0 : xmlSecKeyDataXmlWrite(xmlSecKeyDataId id, xmlSecKeyPtr key, xmlNodePtr node, xmlSecKeyInfoCtxPtr keyInfoCtx) {
     324           0 :     xmlSecAssert2(id != NULL, -1);
     325           0 :     xmlSecAssert2(id->xmlWrite != NULL, -1);
     326           0 :     xmlSecAssert2(key != NULL, -1);
     327           0 :     xmlSecAssert2(node != NULL, -1);
     328             : 
     329           0 :     return((id->xmlWrite)(id, key, node, keyInfoCtx));
     330             : }
     331             : 
     332             : /** 
     333             :  * xmlSecKeyDataBinRead:
     334             :  * @id:                 the data klass.
     335             :  * @key:                the destination key.
     336             :  * @buf:                the input binary buffer.
     337             :  * @bufSize:            the input buffer size.
     338             :  * @keyInfoCtx:         the <dsig:KeyInfo/> node processing context.
     339             :  *
     340             :  * Reads the key data of klass @id from binary buffer @buf to @key.
     341             :  * 
     342             :  * Returns: 0 on success or a negative value if an error occurs.
     343             :  */
     344             : int
     345           0 : xmlSecKeyDataBinRead(xmlSecKeyDataId id, xmlSecKeyPtr key, 
     346             :                     const xmlSecByte* buf, xmlSecSize bufSize, 
     347             :                     xmlSecKeyInfoCtxPtr keyInfoCtx) {
     348           0 :     xmlSecAssert2(id != NULL, -1);
     349           0 :     xmlSecAssert2(id->binRead != NULL, -1);
     350           0 :     xmlSecAssert2(key != NULL, -1);
     351           0 :     xmlSecAssert2(buf != NULL, -1);
     352             : 
     353           0 :     return((id->binRead)(id, key, buf, bufSize, keyInfoCtx));
     354             : }
     355             : 
     356             : /** 
     357             :  * xmlSecKeyDataBinWrite:
     358             :  * @id:                 the data klass.
     359             :  * @key:                the source key.
     360             :  * @buf:                the output binary buffer.
     361             :  * @bufSize:            the output buffer size.
     362             :  * @keyInfoCtx:         the <dsig:KeyInfo/> node processing context.
     363             :  *
     364             :  * Writes the key data of klass @id from the @key to a binary buffer @buf. 
     365             :  * 
     366             :  * Returns: 0 on success or a negative value if an error occurs.
     367             :  */
     368             : int
     369           0 : xmlSecKeyDataBinWrite(xmlSecKeyDataId id, xmlSecKeyPtr key, 
     370             :                     xmlSecByte** buf, xmlSecSize* bufSize, 
     371             :                     xmlSecKeyInfoCtxPtr keyInfoCtx) {
     372           0 :     xmlSecAssert2(id != NULL, -1);
     373           0 :     xmlSecAssert2(id->binWrite != NULL, -1);
     374           0 :     xmlSecAssert2(key != NULL, -1);
     375           0 :     xmlSecAssert2(buf != NULL, -1);
     376             : 
     377           0 :     return((id->binWrite)(id, key, buf, bufSize, keyInfoCtx));
     378             : }
     379             : 
     380             : /** 
     381             :  * xmlSecKeyDataGenerate:
     382             :  * @data:               the pointer to key data.
     383             :  * @sizeBits:           the desired key data size (in bits).
     384             :  * @type:               the desired key data type.
     385             :  *
     386             :  * Generates new key data of given size and type.
     387             :  *
     388             :  * Returns: 0 on success or a negative value otherwise.
     389             :  */
     390             : int
     391           0 : xmlSecKeyDataGenerate(xmlSecKeyDataPtr data, xmlSecSize sizeBits, 
     392             :                       xmlSecKeyDataType type) {
     393             :     int ret;
     394             : 
     395           0 :     xmlSecAssert2(xmlSecKeyDataIsValid(data), -1);
     396           0 :     xmlSecAssert2(data->id->generate != NULL, -1);
     397             :     
     398             :     /* write data */
     399           0 :     ret = data->id->generate(data, sizeBits, type);
     400           0 :     if(ret < 0) {
     401           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
     402           0 :                     xmlSecErrorsSafeString(xmlSecKeyDataGetName(data)),
     403             :                     "id->generate",
     404             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
     405             :                     "size=%d", sizeBits);
     406           0 :         return(-1);         
     407             :     }
     408           0 :     return(0);    
     409             : }
     410             : 
     411             : /** 
     412             :  * xmlSecKeyDataGetType:
     413             :  * @data:               the pointer to key data.
     414             :  *
     415             :  * Gets key data type.
     416             :  *
     417             :  * Returns: key data type.
     418             :  */  
     419             : xmlSecKeyDataType       
     420           0 : xmlSecKeyDataGetType(xmlSecKeyDataPtr data) {
     421           0 :     xmlSecAssert2(xmlSecKeyDataIsValid(data), xmlSecKeyDataTypeUnknown);
     422           0 :     xmlSecAssert2(data->id->getType != NULL, xmlSecKeyDataTypeUnknown);
     423             :     
     424           0 :     return(data->id->getType(data));
     425             : }
     426             : 
     427             : /** 
     428             :  * xmlSecKeyDataGetSize:
     429             :  * @data:               the pointer to key data.
     430             :  *
     431             :  * Gets key data size.
     432             :  *
     433             :  * Returns: key data size (in bits).
     434             :  */
     435             : xmlSecSize
     436           0 : xmlSecKeyDataGetSize(xmlSecKeyDataPtr data) {
     437           0 :     xmlSecAssert2(xmlSecKeyDataIsValid(data), 0);
     438           0 :     xmlSecAssert2(data->id->getSize != NULL, 0);
     439             :     
     440           0 :     return(data->id->getSize(data));
     441             : }
     442             : 
     443             : /**
     444             :  * xmlSecKeyDataGetIdentifier:
     445             :  * @data:               the pointer to key data.
     446             :  * 
     447             :  * Gets key data identifier string.
     448             :  *
     449             :  * Returns: key data id string.
     450             :  */
     451             : const xmlChar*
     452           0 : xmlSecKeyDataGetIdentifier(xmlSecKeyDataPtr data) {
     453           0 :     xmlSecAssert2(xmlSecKeyDataIsValid(data), NULL);
     454           0 :     xmlSecAssert2(data->id->getIdentifier != NULL, NULL);
     455             :     
     456           0 :     return(data->id->getIdentifier(data));
     457             : }
     458             : 
     459             : /** 
     460             :  * xmlSecKeyDataDebugDump:
     461             :  * @data:               the pointer to key data.
     462             :  * @output:             the pointer to output FILE.
     463             :  *
     464             :  * Prints key data debug info.
     465             :  */
     466             : void
     467           0 : xmlSecKeyDataDebugDump(xmlSecKeyDataPtr data, FILE *output) {
     468           0 :     xmlSecAssert(xmlSecKeyDataIsValid(data));
     469           0 :     xmlSecAssert(data->id->debugDump != NULL);
     470           0 :     xmlSecAssert(output != NULL);
     471             :     
     472           0 :     data->id->debugDump(data, output);
     473             : }
     474             : 
     475             : /** 
     476             :  * xmlSecKeyDataDebugXmlDump:
     477             :  * @data:               the pointer to key data.
     478             :  * @output:             the pointer to output FILE.
     479             :  *
     480             :  * Prints key data debug info in XML format.
     481             :  */ 
     482             : void 
     483           0 : xmlSecKeyDataDebugXmlDump(xmlSecKeyDataPtr data, FILE *output) {
     484           0 :     xmlSecAssert(xmlSecKeyDataIsValid(data));
     485           0 :     xmlSecAssert(data->id->debugXmlDump != NULL);
     486           0 :     xmlSecAssert(output != NULL);
     487             :     
     488           0 :     data->id->debugXmlDump(data, output);
     489             : }
     490             : 
     491             : /**************************************************************************
     492             :  *
     493             :  * xmlSecKeyDataBinary methods
     494             :  *
     495             :  * key (xmlSecBuffer) is located after xmlSecKeyData structure
     496             :  *
     497             :  *************************************************************************/
     498             : /** 
     499             :  * xmlSecKeyDataBinaryValueInitialize:
     500             :  * @data:               the pointer to binary key data.
     501             :  *
     502             :  * Initializes key data.
     503             :  * 
     504             :  * Returns: 0 on success or a negative value otherwise.
     505             :  */
     506             : int
     507           0 : xmlSecKeyDataBinaryValueInitialize(xmlSecKeyDataPtr data) {
     508             :     xmlSecBufferPtr buffer;
     509             :     int ret;
     510             :     
     511           0 :     xmlSecAssert2(xmlSecKeyDataIsValid(data), -1);
     512           0 :     xmlSecAssert2(xmlSecKeyDataCheckSize(data, xmlSecKeyDataBinarySize), -1);
     513             :         
     514             :     /* initialize buffer */
     515           0 :     buffer = xmlSecKeyDataBinaryValueGetBuffer(data);
     516           0 :     xmlSecAssert2(buffer != NULL, -1);
     517             :     
     518           0 :     ret = xmlSecBufferInitialize(buffer, 0);
     519           0 :     if(ret < 0) {
     520           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
     521           0 :                     xmlSecErrorsSafeString(xmlSecKeyDataGetName(data)),
     522             :                     "xmlSecBufferInitialize",
     523             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
     524             :                     XMLSEC_ERRORS_NO_MESSAGE);
     525           0 :         return(-1);
     526             :     }
     527             :     
     528           0 :     return(0);    
     529             : }
     530             : 
     531             : /** 
     532             :  * xmlSecKeyDataBinaryValueDuplicate:
     533             :  * @dst:                the pointer to destination binary key data.
     534             :  * @src:                the pointer to source binary key data.
     535             :  *
     536             :  * Copies binary key data from @src to @dst.
     537             :  * 
     538             :  * Returns: 0 on success or a negative value otherwise.
     539             :  */
     540             : int
     541           0 : xmlSecKeyDataBinaryValueDuplicate(xmlSecKeyDataPtr dst, xmlSecKeyDataPtr src) {
     542             :     xmlSecBufferPtr buffer;
     543             :     int ret;
     544             :     
     545           0 :     xmlSecAssert2(xmlSecKeyDataIsValid(dst), -1);
     546           0 :     xmlSecAssert2(xmlSecKeyDataCheckSize(dst, xmlSecKeyDataBinarySize), -1);
     547           0 :     xmlSecAssert2(xmlSecKeyDataIsValid(src), -1);
     548           0 :     xmlSecAssert2(xmlSecKeyDataCheckSize(src, xmlSecKeyDataBinarySize), -1);
     549             : 
     550           0 :     buffer = xmlSecKeyDataBinaryValueGetBuffer(src);
     551           0 :     xmlSecAssert2(buffer != NULL, -1);
     552             :     
     553             :     /* copy data */
     554           0 :     ret = xmlSecKeyDataBinaryValueSetBuffer(dst,
     555           0 :                     xmlSecBufferGetData(buffer),
     556             :                     xmlSecBufferGetSize(buffer));
     557           0 :     if(ret < 0) {
     558           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
     559           0 :                     xmlSecErrorsSafeString(xmlSecKeyDataGetName(dst)),
     560             :                     "xmlSecKeyDataBinaryValueSetBuffer",
     561             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
     562             :                     XMLSEC_ERRORS_NO_MESSAGE);
     563           0 :         return(-1);
     564             :     }
     565             : 
     566           0 :     return(0);
     567             : }
     568             : 
     569             : /** 
     570             :  * xmlSecKeyDataBinaryValueFinalize:
     571             :  * @data:               the pointer to binary key data.
     572             :  *
     573             :  * Cleans up binary key data.
     574             :  */
     575             : void 
     576           0 : xmlSecKeyDataBinaryValueFinalize(xmlSecKeyDataPtr data) {
     577             :     xmlSecBufferPtr buffer;
     578             :     
     579           0 :     xmlSecAssert(xmlSecKeyDataIsValid(data));
     580           0 :     xmlSecAssert(xmlSecKeyDataCheckSize(data, xmlSecKeyDataBinarySize));
     581             :     
     582             :     /* initialize buffer */
     583           0 :     buffer = xmlSecKeyDataBinaryValueGetBuffer(data);
     584           0 :     xmlSecAssert(buffer != NULL);
     585             :     
     586           0 :     xmlSecBufferFinalize(buffer);    
     587             : }
     588             : 
     589             : /** 
     590             :  * xmlSecKeyDataBinaryValueXmlRead:
     591             :  * @id:                 the data klass.
     592             :  * @key:                the pointer to destination key.
     593             :  * @node:               the pointer to an XML node.
     594             :  * @keyInfoCtx:         the pointer to <dsig:KeyInfo/> element processing context.
     595             :  *
     596             :  * Reads binary key data from @node to the key by base64 decoding the @node content.
     597             :  * 
     598             :  * Returns: 0 on success or a negative value otherwise.
     599             :  */
     600             : int 
     601           0 : xmlSecKeyDataBinaryValueXmlRead(xmlSecKeyDataId id, xmlSecKeyPtr key, 
     602             :                                 xmlNodePtr node, xmlSecKeyInfoCtxPtr keyInfoCtx) {
     603             :     xmlChar* str;
     604             :     xmlSecSize len;
     605             :     xmlSecKeyDataPtr data;
     606             :     int ret;
     607             :     
     608           0 :     xmlSecAssert2(id != xmlSecKeyDataIdUnknown, -1);
     609           0 :     xmlSecAssert2(key != NULL, -1);
     610           0 :     xmlSecAssert2(node != NULL, -1);
     611           0 :     xmlSecAssert2(keyInfoCtx != NULL, -1);
     612             : 
     613           0 :     str = xmlNodeGetContent(node);
     614           0 :     if(str == NULL) {
     615           0 :         xmlSecError(XMLSEC_ERRORS_HERE, 
     616           0 :                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)),
     617           0 :                     xmlSecErrorsSafeString(xmlSecNodeGetName(node)),
     618             :                     XMLSEC_ERRORS_R_INVALID_NODE_CONTENT,
     619             :                     XMLSEC_ERRORS_NO_MESSAGE);
     620           0 :         return(-1);
     621             :     }
     622             : 
     623             :     /* usual trick: decode into the same buffer */
     624           0 :     ret = xmlSecBase64Decode(str, (xmlSecByte*)str, xmlStrlen(str));
     625           0 :     if(ret < 0) {
     626           0 :         xmlSecError(XMLSEC_ERRORS_HERE, 
     627           0 :                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)),
     628             :                     "xmlSecBase64Decode",
     629             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
     630             :                     XMLSEC_ERRORS_NO_MESSAGE);
     631           0 :         xmlFree(str);
     632           0 :         return(-1);
     633             :     }
     634           0 :     len = ret;
     635             : 
     636             :     /* check do we have a key already */
     637           0 :     data = xmlSecKeyGetValue(key);
     638           0 :     if(data != NULL) {
     639             :         xmlSecBufferPtr buffer;
     640             :         
     641           0 :         if(!xmlSecKeyDataCheckId(data, id)) {
     642           0 :             xmlSecError(XMLSEC_ERRORS_HERE,
     643           0 :                         xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)),
     644           0 :                         xmlSecErrorsSafeString(xmlSecKeyDataGetName(data)),
     645             :                         XMLSEC_ERRORS_R_KEY_DATA_ALREADY_EXIST,
     646             :                         XMLSEC_ERRORS_NO_MESSAGE);
     647           0 :             xmlFree(str);
     648           0 :             return(-1); 
     649             :         }
     650             :         
     651           0 :         buffer = xmlSecKeyDataBinaryValueGetBuffer(data);       
     652           0 :         if((buffer != NULL) && ((xmlSecSize)xmlSecBufferGetSize(buffer) != len)) {
     653           0 :             xmlSecError(XMLSEC_ERRORS_HERE,
     654           0 :                         xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)),
     655           0 :                         xmlSecErrorsSafeString(xmlSecKeyDataGetName(data)),
     656             :                         XMLSEC_ERRORS_R_KEY_DATA_ALREADY_EXIST,
     657             :                         "cur-data-size=%d;new-data-size=%d",
     658             :                         xmlSecBufferGetSize(buffer), len);
     659           0 :             xmlFree(str);
     660           0 :             return(-1);         
     661             :         }
     662           0 :         if((buffer != NULL) && (len > 0) && (memcmp(xmlSecBufferGetData(buffer), str, len) != 0)) {
     663           0 :             xmlSecError(XMLSEC_ERRORS_HERE,
     664           0 :                         xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)),
     665           0 :                         xmlSecErrorsSafeString(xmlSecKeyDataGetName(data)),
     666             :                         XMLSEC_ERRORS_R_KEY_DATA_ALREADY_EXIST,
     667             :                         "key already has a different value");
     668           0 :             xmlFree(str);
     669           0 :             return(-1);         
     670             :         }
     671           0 :         if(buffer != NULL) {
     672             :             /* we already have exactly the same key */
     673           0 :             xmlFree(str);
     674           0 :             return(0);
     675             :         }
     676             :         
     677             :         /* we have binary key value with empty buffer */
     678             :     }
     679             : 
     680             :     
     681           0 :     data = xmlSecKeyDataCreate(id);
     682           0 :     if(data == NULL ) {
     683           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
     684           0 :                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)),
     685             :                     "xmlSecKeyDataCreate",
     686             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
     687             :                     XMLSEC_ERRORS_NO_MESSAGE);
     688           0 :         xmlFree(str);
     689           0 :         return(-1);
     690             :     }
     691             :         
     692           0 :     ret = xmlSecKeyDataBinaryValueSetBuffer(data, (xmlSecByte*)str, len);
     693           0 :     if(ret < 0) {
     694           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
     695           0 :                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)),
     696             :                     "xmlSecKeyDataBinaryValueSetBuffer",
     697             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
     698             :                     "size=%d", len);
     699           0 :         xmlSecKeyDataDestroy(data);
     700           0 :         xmlFree(str);
     701           0 :         return(-1);
     702             :     }
     703           0 :     xmlFree(str);
     704             : 
     705           0 :     if(xmlSecKeyReqMatchKeyValue(&(keyInfoCtx->keyReq), data) != 1) {
     706           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
     707           0 :                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)),
     708             :                     "xmlSecKeyReqMatchKeyValue",
     709             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
     710             :                     XMLSEC_ERRORS_NO_MESSAGE);
     711           0 :         xmlSecKeyDataDestroy(data);
     712           0 :         return(0);
     713             :     }
     714             :     
     715           0 :     ret = xmlSecKeySetValue(key, data);
     716           0 :     if(ret < 0) {
     717           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
     718           0 :                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)),
     719             :                     "xmlSecKeySetValue",
     720             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
     721             :                     XMLSEC_ERRORS_NO_MESSAGE);
     722           0 :         xmlSecKeyDataDestroy(data);
     723           0 :         return(-1);
     724             :     }
     725             : 
     726           0 :     return(0);
     727             : }
     728             : 
     729             : /** 
     730             :  * xmlSecKeyDataBinaryValueXmlWrite:
     731             :  * @id:                 the data klass.
     732             :  * @key:                the pointer to source key.
     733             :  * @node:               the pointer to an XML node.
     734             :  * @keyInfoCtx:         the pointer to <dsig:KeyInfo/> element processing context.
     735             :  *
     736             :  * Base64 encodes binary key data of klass @id from the @key and 
     737             :  * sets to the @node content. 
     738             :  * 
     739             :  * Returns: 0 on success or a negative value otherwise.
     740             :  */
     741             : int 
     742           0 : xmlSecKeyDataBinaryValueXmlWrite(xmlSecKeyDataId id, xmlSecKeyPtr key, 
     743             :                             xmlNodePtr node, xmlSecKeyInfoCtxPtr keyInfoCtx) {
     744             :     xmlSecBufferPtr buffer;
     745             :     xmlSecKeyDataPtr value;
     746             :     xmlChar* str;
     747             :     
     748           0 :     xmlSecAssert2(id != xmlSecKeyDataIdUnknown, -1);
     749           0 :     xmlSecAssert2(key != NULL, -1);
     750           0 :     xmlSecAssert2(node != NULL, -1);
     751           0 :     xmlSecAssert2(keyInfoCtx != NULL, -1);
     752             : 
     753           0 :     if((xmlSecKeyDataTypeSymmetric & keyInfoCtx->keyReq.keyType) == 0) {
     754             :         /* we can have only symmetric key */
     755           0 :         return(0);
     756             :     }    
     757             : 
     758           0 :     value = xmlSecKeyGetValue(key);
     759           0 :     xmlSecAssert2(xmlSecKeyDataIsValid(value), -1);
     760             : 
     761           0 :     buffer = xmlSecKeyDataBinaryValueGetBuffer(value);
     762           0 :     xmlSecAssert2(buffer != NULL, -1);
     763             : 
     764           0 :     str = xmlSecBase64Encode(xmlSecBufferGetData(buffer),
     765             :                              xmlSecBufferGetSize(buffer),
     766             :                              keyInfoCtx->base64LineSize);
     767           0 :     if(str == NULL) {
     768           0 :         xmlSecError(XMLSEC_ERRORS_HERE, 
     769           0 :                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)),
     770             :                     "xmlSecBase64Encode",
     771             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
     772             :                     XMLSEC_ERRORS_NO_MESSAGE);
     773           0 :         return(-1);
     774             :     }    
     775           0 :     xmlNodeSetContent(node, str);
     776           0 :     xmlFree(str);
     777           0 :     return(0);
     778             : }
     779             : 
     780             : /** 
     781             :  * xmlSecKeyDataBinaryValueBinRead:
     782             :  * @id:                 the data klass.
     783             :  * @key:                the pointer to destination key.
     784             :  * @buf:                the source binary buffer.
     785             :  * @bufSize:            the source binary buffer size.
     786             :  * @keyInfoCtx:         the pointer to <dsig:KeyInfo/> element processing context.
     787             :  *
     788             :  * Reads binary key data of the klass @id from @buf to the @key.
     789             :  * 
     790             :  * Returns: 0 on success or a negative value otherwise.
     791             :  */
     792             : int 
     793           0 : xmlSecKeyDataBinaryValueBinRead(xmlSecKeyDataId id, xmlSecKeyPtr key, 
     794             :                                 const xmlSecByte* buf, xmlSecSize bufSize, 
     795             :                                 xmlSecKeyInfoCtxPtr keyInfoCtx) {
     796             :     xmlSecKeyDataPtr data;
     797             :     int ret;
     798             :     
     799           0 :     xmlSecAssert2(id != xmlSecKeyDataIdUnknown, -1);
     800           0 :     xmlSecAssert2(key != NULL, -1);
     801           0 :     xmlSecAssert2(buf != NULL, -1);
     802           0 :     xmlSecAssert2(bufSize > 0, -1);
     803           0 :     xmlSecAssert2(keyInfoCtx != NULL, -1);
     804             : 
     805             :     /* check do we have a key already */
     806           0 :     data = xmlSecKeyGetValue(key);
     807           0 :     if(data != NULL) {
     808             :         xmlSecBufferPtr buffer;
     809             :         
     810           0 :         if(!xmlSecKeyDataCheckId(data, id)) {
     811           0 :             xmlSecError(XMLSEC_ERRORS_HERE,
     812           0 :                         xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)),
     813           0 :                         xmlSecErrorsSafeString(xmlSecKeyDataGetName(data)),
     814             :                         XMLSEC_ERRORS_R_KEY_DATA_ALREADY_EXIST,
     815             :                         XMLSEC_ERRORS_NO_MESSAGE);
     816           0 :             return(-1); 
     817             :         }
     818             :         
     819           0 :         buffer = xmlSecKeyDataBinaryValueGetBuffer(data);       
     820           0 :         if((buffer != NULL) && ((xmlSecSize)xmlSecBufferGetSize(buffer) != bufSize)) {
     821           0 :             xmlSecError(XMLSEC_ERRORS_HERE,
     822           0 :                         xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)),
     823           0 :                         xmlSecErrorsSafeString(xmlSecKeyDataGetName(data)),
     824             :                         XMLSEC_ERRORS_R_KEY_DATA_ALREADY_EXIST,
     825             :                         "cur-data-size=%d;new-data-size=%d",
     826             :                         xmlSecBufferGetSize(buffer), bufSize);
     827           0 :             return(-1);         
     828             :         }
     829           0 :         if((buffer != NULL) && (bufSize > 0) && (memcmp(xmlSecBufferGetData(buffer), buf, bufSize) != 0)) {
     830           0 :             xmlSecError(XMLSEC_ERRORS_HERE,
     831           0 :                         xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)),
     832           0 :                         xmlSecErrorsSafeString(xmlSecKeyDataGetName(data)),
     833             :                         XMLSEC_ERRORS_R_KEY_DATA_ALREADY_EXIST,
     834             :                         "key already has a different value");
     835           0 :             return(-1);         
     836             :         }
     837           0 :         if(buffer != NULL) {
     838             :             /* we already have exactly the same key */
     839           0 :             return(0);
     840             :         }
     841             :         
     842             :         /* we have binary key value with empty buffer */
     843             :     }
     844             :     
     845           0 :     data = xmlSecKeyDataCreate(id);
     846           0 :     if(data == NULL ) {
     847           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
     848           0 :                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)),
     849             :                     "xmlSecKeyDataCreate",
     850             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
     851             :                     XMLSEC_ERRORS_NO_MESSAGE);
     852           0 :         return(-1);
     853             :     }
     854             :         
     855           0 :     ret = xmlSecKeyDataBinaryValueSetBuffer(data, buf, bufSize);
     856           0 :     if(ret < 0) {
     857           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
     858           0 :                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)),
     859             :                     "xmlSecKeyDataBinaryValueSetBuffer",
     860             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
     861             :                     "size=%d", bufSize);
     862           0 :         xmlSecKeyDataDestroy(data);
     863           0 :         return(-1);
     864             :     }
     865             : 
     866           0 :     if(xmlSecKeyReqMatchKeyValue(&(keyInfoCtx->keyReq), data) != 1) {
     867           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
     868           0 :                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)),
     869             :                     "xmlSecKeyReqMatchKeyValue",
     870             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
     871             :                     XMLSEC_ERRORS_NO_MESSAGE);
     872           0 :         xmlSecKeyDataDestroy(data);
     873           0 :         return(0);
     874             :     }
     875             :     
     876           0 :     ret = xmlSecKeySetValue(key, data);
     877           0 :     if(ret < 0) {
     878           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
     879           0 :                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)),
     880             :                     "xmlSecKeySetValue",
     881             :                     XMLSEC_ERRORS_R_XMLSEC_FAILED,
     882             :                     XMLSEC_ERRORS_NO_MESSAGE);
     883           0 :         xmlSecKeyDataDestroy(data);
     884           0 :         return(-1);
     885             :     }
     886             : 
     887           0 :     return(0);
     888             : }
     889             : 
     890             : /** 
     891             :  * xmlSecKeyDataBinaryValueBinWrite:
     892             :  * @id:                 the data klass.
     893             :  * @key:                the pointer to source key.
     894             :  * @buf:                the destination binary buffer.
     895             :  * @bufSize:            the destination binary buffer size.
     896             :  * @keyInfoCtx:         the pointer to <dsig:KeyInfo/> element processing context.
     897             :  *
     898             :  * Writes binary key data of klass @id from the @key to @buf.
     899             :  * 
     900             :  * Returns: 0 on success or a negative value otherwise.
     901             :  */
     902             : int 
     903           0 : xmlSecKeyDataBinaryValueBinWrite(xmlSecKeyDataId id, xmlSecKeyPtr key, 
     904             :                                 xmlSecByte** buf, xmlSecSize* bufSize, 
     905             :                                 xmlSecKeyInfoCtxPtr keyInfoCtx) {
     906             :     xmlSecKeyDataPtr value;
     907             :     xmlSecBufferPtr buffer;
     908             : 
     909           0 :     xmlSecAssert2(id != xmlSecKeyDataIdUnknown, -1);
     910           0 :     xmlSecAssert2(key != NULL, -1);
     911           0 :     xmlSecAssert2(buf != NULL, -1);
     912           0 :     xmlSecAssert2(bufSize != NULL, -1);
     913           0 :     xmlSecAssert2(keyInfoCtx != NULL, -1);
     914             : 
     915           0 :     if((xmlSecKeyDataTypeSymmetric & keyInfoCtx->keyReq.keyType) == 0) {
     916             :         /* we can have only symmetric key */
     917           0 :         return(0);
     918             :     }    
     919             : 
     920           0 :     value = xmlSecKeyGetValue(key);
     921           0 :     xmlSecAssert2(xmlSecKeyDataIsValid(value), -1);
     922             : 
     923           0 :     buffer = xmlSecKeyDataBinaryValueGetBuffer(key->value);
     924           0 :     xmlSecAssert2(buffer != NULL, -1);
     925             : 
     926           0 :     (*bufSize) = xmlSecBufferGetSize(buffer);
     927           0 :     (*buf) = (xmlSecByte*) xmlMalloc((*bufSize));
     928           0 :     if((*buf) == NULL) {
     929           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
     930           0 :                     xmlSecErrorsSafeString(xmlSecKeyDataKlassGetName(id)),
     931             :                     NULL,
     932             :                     XMLSEC_ERRORS_R_MALLOC_FAILED,
     933             :                     XMLSEC_ERRORS_NO_MESSAGE);
     934           0 :         return(-1);
     935             :     }
     936           0 :     memcpy((*buf), xmlSecBufferGetData(buffer), (*bufSize));    
     937           0 :     return(0);
     938             : }
     939             : 
     940             : /** 
     941             :  * xmlSecKeyDataBinaryValueDebugDump:
     942             :  * @data:               the pointer to binary key data.
     943             :  * @output:             the pointer to output FILE.
     944             :  * 
     945             :  * Prints binary key data debug information to @output.
     946             :  */
     947             : void 
     948           0 : xmlSecKeyDataBinaryValueDebugDump(xmlSecKeyDataPtr data, FILE* output) {
     949             :     xmlSecBufferPtr buffer;
     950             :     
     951           0 :     xmlSecAssert(xmlSecKeyDataIsValid(data));
     952           0 :     xmlSecAssert(xmlSecKeyDataCheckSize(data, xmlSecKeyDataBinarySize));
     953           0 :     xmlSecAssert(data->id->dataNodeName != NULL);
     954           0 :     xmlSecAssert(output != NULL);
     955             : 
     956           0 :     buffer = xmlSecKeyDataBinaryValueGetBuffer(data);
     957           0 :     xmlSecAssert(buffer != NULL);
     958             : 
     959             :     /* print only size, everything else is sensitive */    
     960           0 :     fprintf(output, "=== %s: size=%d\n", data->id->dataNodeName, 
     961             :                                          xmlSecKeyDataGetSize(data));
     962             : }
     963             : 
     964             : /** 
     965             :  * xmlSecKeyDataBinaryValueDebugXmlDump:
     966             :  * @data:               the pointer to binary key data.
     967             :  * @output:             the pointer to output FILE.
     968             :  * 
     969             :  * Prints binary key data debug information to @output in XML format.
     970             :  */
     971             : void 
     972           0 : xmlSecKeyDataBinaryValueDebugXmlDump(xmlSecKeyDataPtr data, FILE* output) {
     973             :     xmlSecBufferPtr buffer;
     974             : 
     975           0 :     xmlSecAssert(xmlSecKeyDataIsValid(data));
     976           0 :     xmlSecAssert(xmlSecKeyDataCheckSize(data, xmlSecKeyDataBinarySize));
     977           0 :     xmlSecAssert(data->id->dataNodeName != NULL);
     978           0 :     xmlSecAssert(output != NULL);
     979             : 
     980           0 :     buffer = xmlSecKeyDataBinaryValueGetBuffer(data);
     981           0 :     xmlSecAssert(buffer != NULL);
     982             :     
     983             :     /* print only size, everything else is sensitive */    
     984           0 :     fprintf(output, "<%s size=\"%d\" />\n", data->id->dataNodeName, 
     985             :                                             xmlSecKeyDataGetSize(data));
     986             : }
     987             : 
     988             : /** 
     989             :  * xmlSecKeyDataBinaryValueGetSize:
     990             :  * @data:               the pointer to binary key data.
     991             :  *
     992             :  * Gets the binary key data size.
     993             :  *
     994             :  * Returns: binary key data size in bits.
     995             :  */
     996             : xmlSecSize
     997           0 : xmlSecKeyDataBinaryValueGetSize(xmlSecKeyDataPtr data) {
     998             :     xmlSecBufferPtr buffer;
     999             : 
    1000           0 :     xmlSecAssert2(xmlSecKeyDataIsValid(data), 0);
    1001           0 :     xmlSecAssert2(xmlSecKeyDataCheckSize(data, xmlSecKeyDataBinarySize), 0);
    1002             : 
    1003           0 :     buffer = xmlSecKeyDataBinaryValueGetBuffer(data);
    1004           0 :     xmlSecAssert2(buffer != NULL, 0);
    1005             : 
    1006             :     /* return size in bits */    
    1007           0 :     return(8 * xmlSecBufferGetSize(buffer));    
    1008             : }
    1009             : 
    1010             : /** 
    1011             :  * xmlSecKeyDataBinaryValueGetBuffer:
    1012             :  * @data:               the pointer to binary key data.
    1013             :  *
    1014             :  * Gets the binary key data buffer.
    1015             :  *
    1016             :  * Returns: pointer to binary key data buffer.
    1017             :  */
    1018             : xmlSecBufferPtr 
    1019           0 : xmlSecKeyDataBinaryValueGetBuffer(xmlSecKeyDataPtr data) {
    1020           0 :     xmlSecAssert2(xmlSecKeyDataIsValid(data), NULL);
    1021           0 :     xmlSecAssert2(xmlSecKeyDataCheckSize(data, xmlSecKeyDataBinarySize), NULL);
    1022             : 
    1023             :     /* key (xmlSecBuffer) is located after xmlSecKeyData structure */
    1024           0 :     return((xmlSecBufferPtr)(((xmlSecByte*)data) + sizeof(xmlSecKeyData)));
    1025             : }
    1026             : 
    1027             : /** 
    1028             :  * xmlSecKeyDataBinaryValueSetBuffer:
    1029             :  * @data:               the pointer to binary key data.
    1030             :  * @buf:                the pointer to binary buffer.
    1031             :  * @bufSize:            the binary buffer size.
    1032             :  *
    1033             :  * Sets the value of @data to @buf.
    1034             :  * 
    1035             :  * Returns: 0 on success or a negative value otherwise.
    1036             :  */
    1037             : int
    1038           0 : xmlSecKeyDataBinaryValueSetBuffer(xmlSecKeyDataPtr data, 
    1039             :                         const xmlSecByte* buf, xmlSecSize bufSize) {
    1040             :     xmlSecBufferPtr buffer;
    1041             : 
    1042           0 :     xmlSecAssert2(xmlSecKeyDataIsValid(data), -1);
    1043           0 :     xmlSecAssert2(xmlSecKeyDataCheckSize(data, xmlSecKeyDataBinarySize), -1);
    1044           0 :     xmlSecAssert2(buf != NULL, -1);
    1045           0 :     xmlSecAssert2(bufSize > 0, -1);
    1046             : 
    1047           0 :     buffer = xmlSecKeyDataBinaryValueGetBuffer(data);
    1048           0 :     xmlSecAssert2(buffer != NULL, -1);
    1049             : 
    1050           0 :     return(xmlSecBufferSetData(buffer, buf, bufSize));
    1051             : }
    1052             : 
    1053             : /***********************************************************************
    1054             :  *
    1055             :  * Keys Data list
    1056             :  *
    1057             :  **********************************************************************/
    1058             : static xmlSecPtrListKlass xmlSecKeyDataListKlass = {
    1059             :     BAD_CAST "key-data-list",
    1060             :     (xmlSecPtrDuplicateItemMethod)xmlSecKeyDataDuplicate,       /* xmlSecPtrDuplicateItemMethod duplicateItem; */
    1061             :     (xmlSecPtrDestroyItemMethod)xmlSecKeyDataDestroy,           /* xmlSecPtrDestroyItemMethod destroyItem; */
    1062             :     (xmlSecPtrDebugDumpItemMethod)xmlSecKeyDataDebugDump,       /* xmlSecPtrDebugDumpItemMethod debugDumpItem; */
    1063             :     (xmlSecPtrDebugDumpItemMethod)xmlSecKeyDataDebugXmlDump,    /* xmlSecPtrDebugDumpItemMethod debugXmlDumpItem; */
    1064             : };
    1065             : 
    1066             : /**
    1067             :  * xmlSecKeyDataListGetKlass:
    1068             :  * 
    1069             :  * The key data list klass.
    1070             :  *
    1071             :  * Returns: pointer to the key data list klass.
    1072             :  */
    1073             : xmlSecPtrListId 
    1074           0 : xmlSecKeyDataListGetKlass(void) {
    1075           0 :     return(&xmlSecKeyDataListKlass);
    1076             : }
    1077             : 
    1078             : 
    1079             : /***********************************************************************
    1080             :  *
    1081             :  * Keys Data Ids list
    1082             :  *
    1083             :  **********************************************************************/
    1084             : static xmlSecPtrListKlass xmlSecKeyDataIdListKlass = {
    1085             :     BAD_CAST "key-data-ids-list",
    1086             :     NULL,                                                       /* xmlSecPtrDuplicateItemMethod duplicateItem; */
    1087             :     NULL,                                                       /* xmlSecPtrDestroyItemMethod destroyItem; */
    1088             :     NULL,                                                       /* xmlSecPtrDebugDumpItemMethod debugDumpItem; */
    1089             :     NULL,                                                       /* xmlSecPtrDebugDumpItemMethod debugXmlDumpItem; */
    1090             : };
    1091             : 
    1092             : /**
    1093             :  * xmlSecKeyDataIdListGetKlass:
    1094             :  * 
    1095             :  * The key data id list klass.
    1096             :  *
    1097             :  * Returns: pointer to the key data id list klass.
    1098             :  */
    1099             : xmlSecPtrListId 
    1100           0 : xmlSecKeyDataIdListGetKlass(void) {
    1101           0 :     return(&xmlSecKeyDataIdListKlass);
    1102             : }
    1103             : 
    1104             : /**
    1105             :  * xmlSecKeyDataIdListFind:
    1106             :  * @list:               the pointer to key data ids list.
    1107             :  * @dataId:             the key data klass.
    1108             :  *
    1109             :  * Lookups @dataId in @list.
    1110             :  *
    1111             :  * Returns: 1 if @dataId is found in the @list, 0 if not and a negative
    1112             :  * value if an error occurs.
    1113             :  */
    1114             : int 
    1115           0 : xmlSecKeyDataIdListFind(xmlSecPtrListPtr list, xmlSecKeyDataId dataId) {
    1116             :     xmlSecSize i, size;
    1117             :     
    1118           0 :     xmlSecAssert2(xmlSecPtrListCheckId(list, xmlSecKeyDataIdListId), 0);
    1119           0 :     xmlSecAssert2(dataId != NULL, 0);
    1120             :     
    1121           0 :     size = xmlSecPtrListGetSize(list);
    1122           0 :     for(i = 0; i < size; ++i) {
    1123           0 :         if((xmlSecKeyDataId)xmlSecPtrListGetItem(list, i) == dataId) {
    1124           0 :             return(1);
    1125             :         }
    1126             :     }
    1127           0 :     return(0);
    1128             : }
    1129             : 
    1130             : /** 
    1131             :  * xmlSecKeyDataIdListFindByNode:
    1132             :  * @list:               the pointer to key data ids list.
    1133             :  * @nodeName:           the desired key data klass XML node name.
    1134             :  * @nodeNs:             the desired key data klass XML node namespace.
    1135             :  * @usage:              the desired key data usage.
    1136             :  *
    1137             :  * Lookups data klass in the list with given @nodeName, @nodeNs and 
    1138             :  * @usage in the @list.
    1139             :  *
    1140             :  * Returns: key data klass is found and NULL otherwise.
    1141             :  */ 
    1142             : xmlSecKeyDataId 
    1143           0 : xmlSecKeyDataIdListFindByNode(xmlSecPtrListPtr list, const xmlChar* nodeName,
    1144             :                             const xmlChar* nodeNs, xmlSecKeyDataUsage usage) {
    1145             :     xmlSecKeyDataId dataId;
    1146             :     xmlSecSize i, size;
    1147             :     
    1148           0 :     xmlSecAssert2(xmlSecPtrListCheckId(list, xmlSecKeyDataIdListId), xmlSecKeyDataIdUnknown);
    1149           0 :     xmlSecAssert2(nodeName != NULL, xmlSecKeyDataIdUnknown);
    1150             :     
    1151           0 :     size = xmlSecPtrListGetSize(list);
    1152           0 :     for(i = 0; i < size; ++i) {
    1153           0 :         dataId = (xmlSecKeyDataId)xmlSecPtrListGetItem(list, i);
    1154           0 :         xmlSecAssert2(dataId != xmlSecKeyDataIdUnknown, xmlSecKeyDataIdUnknown);
    1155             : 
    1156           0 :         if(((usage & dataId->usage) != 0) &&
    1157           0 :            xmlStrEqual(nodeName, dataId->dataNodeName) &&
    1158           0 :            xmlStrEqual(nodeNs, dataId->dataNodeNs)) {
    1159             :             
    1160           0 :            return(dataId);         
    1161             :         }
    1162             :     }
    1163           0 :     return(xmlSecKeyDataIdUnknown);
    1164             : }
    1165             : 
    1166             : /** 
    1167             :  * xmlSecKeyDataIdListFindByHref:
    1168             :  * @list:               the pointer to key data ids list.
    1169             :  * @href:               the desired key data klass href.
    1170             :  * @usage:              the desired key data usage.
    1171             :  *
    1172             :  * Lookups data klass in the list with given @href and @usage in @list.
    1173             :  *
    1174             :  * Returns: key data klass is found and NULL otherwise.
    1175             :  */ 
    1176             : xmlSecKeyDataId 
    1177           0 : xmlSecKeyDataIdListFindByHref(xmlSecPtrListPtr list, const xmlChar* href,
    1178             :                             xmlSecKeyDataUsage usage) {
    1179             :     xmlSecKeyDataId dataId;
    1180             :     xmlSecSize i, size;
    1181             :     
    1182           0 :     xmlSecAssert2(xmlSecPtrListCheckId(list, xmlSecKeyDataIdListId), xmlSecKeyDataIdUnknown);
    1183           0 :     xmlSecAssert2(href != NULL, xmlSecKeyDataIdUnknown);
    1184             :     
    1185           0 :     size = xmlSecPtrListGetSize(list);
    1186           0 :     for(i = 0; i < size; ++i) {
    1187           0 :         dataId = (xmlSecKeyDataId)xmlSecPtrListGetItem(list, i);
    1188           0 :         xmlSecAssert2(dataId != xmlSecKeyDataIdUnknown, xmlSecKeyDataIdUnknown);
    1189             : 
    1190           0 :         if(((usage & dataId->usage) != 0) && (dataId->href != NULL) &&
    1191           0 :            xmlStrEqual(href, dataId->href)) {
    1192             :            
    1193           0 :            return(dataId);         
    1194             :         }
    1195             :     }
    1196           0 :     return(xmlSecKeyDataIdUnknown);
    1197             : }
    1198             : 
    1199             : /** 
    1200             :  * xmlSecKeyDataIdListFindByName:
    1201             :  * @list:               the pointer to key data ids list.
    1202             :  * @name:               the desired key data klass name.
    1203             :  * @usage:              the desired key data usage.
    1204             :  *
    1205             :  * Lookups data klass in the list with given @name and @usage in @list.
    1206             :  *
    1207             :  * Returns: key data klass is found and NULL otherwise.
    1208             :  */ 
    1209             : xmlSecKeyDataId 
    1210           0 : xmlSecKeyDataIdListFindByName(xmlSecPtrListPtr list, const xmlChar* name, 
    1211             :                             xmlSecKeyDataUsage usage) {
    1212             :     xmlSecKeyDataId dataId;
    1213             :     xmlSecSize i, size;
    1214             :     
    1215           0 :     xmlSecAssert2(xmlSecPtrListCheckId(list, xmlSecKeyDataIdListId), xmlSecKeyDataIdUnknown);
    1216           0 :     xmlSecAssert2(name != NULL, xmlSecKeyDataIdUnknown);
    1217             :     
    1218           0 :     size = xmlSecPtrListGetSize(list);
    1219           0 :     for(i = 0; i < size; ++i) {
    1220           0 :         dataId = (xmlSecKeyDataId)xmlSecPtrListGetItem(list, i);
    1221           0 :         xmlSecAssert2(dataId != xmlSecKeyDataIdUnknown, xmlSecKeyDataIdUnknown);
    1222             : 
    1223           0 :         if(((usage & dataId->usage) != 0) && (dataId->name != NULL) && 
    1224           0 :            xmlStrEqual(name, BAD_CAST dataId->name)) {
    1225             :            
    1226           0 :            return(dataId);         
    1227             :         }
    1228             :     }
    1229           0 :     return(xmlSecKeyDataIdUnknown);
    1230             : }
    1231             : 
    1232             : /** 
    1233             :  * xmlSecKeyDataIdListDebugDump:
    1234             :  * @list:               the pointer to key data ids list.
    1235             :  * @output:             the pointer to output FILE.
    1236             :  * 
    1237             :  * Prints binary key data debug information to @output.
    1238             :  */
    1239             : void 
    1240           0 : xmlSecKeyDataIdListDebugDump(xmlSecPtrListPtr list, FILE* output) {
    1241             :     xmlSecKeyDataId dataId;
    1242             :     xmlSecSize i, size;
    1243             :     
    1244           0 :     xmlSecAssert(xmlSecPtrListCheckId(list, xmlSecKeyDataIdListId));
    1245           0 :     xmlSecAssert(output != NULL);
    1246             : 
    1247           0 :     size = xmlSecPtrListGetSize(list);
    1248           0 :     for(i = 0; i < size; ++i) {
    1249           0 :         dataId = (xmlSecKeyDataId)xmlSecPtrListGetItem(list, i);
    1250           0 :         xmlSecAssert(dataId != NULL);
    1251           0 :         xmlSecAssert(dataId->name != NULL);
    1252             :             
    1253           0 :         if(i > 0) {
    1254           0 :             fprintf(output, ",\"%s\"", dataId->name);
    1255             :         } else {
    1256           0 :             fprintf(output, "\"%s\"", dataId->name);
    1257             :         }           
    1258             :     }
    1259           0 :     fprintf(output, "\n");
    1260             : }
    1261             : 
    1262             : /** 
    1263             :  * xmlSecKeyDataIdListDebugXmlDump:
    1264             :  * @list:               the pointer to key data ids list.
    1265             :  * @output:             the pointer to output FILE.
    1266             :  * 
    1267             :  * Prints binary key data debug information to @output in XML format.
    1268             :  */
    1269             : void 
    1270           0 : xmlSecKeyDataIdListDebugXmlDump(xmlSecPtrListPtr list, FILE* output) {
    1271             :     xmlSecKeyDataId dataId;
    1272             :     xmlSecSize i, size;
    1273             : 
    1274           0 :     xmlSecAssert(xmlSecPtrListCheckId(list, xmlSecKeyDataIdListId));
    1275           0 :     xmlSecAssert(output != NULL);
    1276             : 
    1277           0 :     fprintf(output, "<KeyDataIdsList>\n");
    1278           0 :     size = xmlSecPtrListGetSize(list);
    1279           0 :     for(i = 0; i < size; ++i) {
    1280           0 :         dataId = (xmlSecKeyDataId)xmlSecPtrListGetItem(list, i);
    1281           0 :         xmlSecAssert(dataId != NULL);
    1282           0 :         xmlSecAssert(dataId->name != NULL);
    1283             :             
    1284           0 :         fprintf(output, "<DataId name=\"");
    1285           0 :         xmlSecPrintXmlString(output, dataId->name);
    1286           0 :         fprintf(output, "\"/>");
    1287             :     }
    1288           0 :     fprintf(output, "</KeyDataIdsList>\n");
    1289             : }
    1290             : 
    1291             : /**************************************************************************
    1292             :  *
    1293             :  * xmlSecKeyDataStore functions
    1294             :  *
    1295             :  *************************************************************************/
    1296             : /**
    1297             :  * xmlSecKeyDataStoreCreate:
    1298             :  * @id:                 the store id.
    1299             :  *
    1300             :  * Creates new key data store of the specified klass @id. Caller is responsible
    1301             :  * for freeng returned object with #xmlSecKeyDataStoreDestroy function.
    1302             :  *
    1303             :  * Returns: the pointer to newly allocated key data store structure
    1304             :  * or NULL if an error occurs.
    1305             :  */
    1306             : xmlSecKeyDataStorePtr   
    1307           0 : xmlSecKeyDataStoreCreate(xmlSecKeyDataStoreId id)  {
    1308             :     xmlSecKeyDataStorePtr store;
    1309             :     int ret;
    1310             :         
    1311           0 :     xmlSecAssert2(id != NULL, NULL);
    1312           0 :     xmlSecAssert2(id->objSize > 0, NULL);
    1313             :         
    1314             :     /* Allocate a new xmlSecKeyDataStore and fill the fields. */
    1315           0 :     store = (xmlSecKeyDataStorePtr)xmlMalloc(id->objSize);
    1316           0 :     if(store == NULL) {
    1317           0 :         xmlSecError(XMLSEC_ERRORS_HERE,
    1318           0 :                     xmlSecErrorsSafeString(xmlSecKeyDataStoreKlassGetName(id)),
    1319             :                     NULL,
    1320             :                     XMLSEC_ERRORS_R_MALLOC_FAILED,
    1321             :                     "size=%d", id->objSize); 
    1322           0 :         return(NULL);
    1323             :     }
    1324           0 :     memset(store, 0, id->objSize);    
    1325           0 :     store->id = id;
    1326             : 
    1327           0 :     if(id->initialize != NULL) {
    1328           0 :         ret = (id->initialize)(store);
    1329           0 :         if(ret < 0) {
    1330           0 :             xmlSecError(XMLSEC_ERRORS_HERE,
    1331           0 :                         xmlSecErrorsSafeString(xmlSecKeyDataStoreKlassGetName(id)),
    1332             :                         "id->initialize",
    1333             :                         XMLSEC_ERRORS_R_XMLSEC_FAILED,
    1334             :                         XMLSEC_ERRORS_NO_MESSAGE);
    1335           0 :             xmlSecKeyDataStoreDestroy(store);
    1336           0 :             return(NULL);
    1337             :         }
    1338             :     }
    1339             :     
    1340           0 :     return(store);
    1341             : }
    1342             : 
    1343             : /**
    1344             :  * xmlSecKeyDataStoreDestroy:
    1345             :  * @store:              the pointer to the key data store..
    1346             :  *
    1347             :  * Destroys the key data store created with #xmlSecKeyDataStoreCreate
    1348             :  * function.
    1349             :  */
    1350             : void
    1351           0 : xmlSecKeyDataStoreDestroy(xmlSecKeyDataStorePtr store) {
    1352           0 :     xmlSecAssert(xmlSecKeyDataStoreIsValid(store));    
    1353           0 :     xmlSecAssert(store->id->objSize > 0);
    1354             :     
    1355           0 :     if(store->id->finalize != NULL) {  
    1356           0 :         (store->id->finalize)(store);
    1357             :     }
    1358           0 :     memset(store, 0, store->id->objSize);
    1359           0 :     xmlFree(store);
    1360             : }
    1361             : 
    1362             : /***********************************************************************
    1363             :  *
    1364             :  * Keys Data Store list
    1365             :  *
    1366             :  **********************************************************************/
    1367             : static xmlSecPtrListKlass xmlSecKeyDataStorePtrListKlass = {
    1368             :     BAD_CAST "keys-data-store-list",
    1369             :     NULL,                                                       /* xmlSecPtrDuplicateItemMethod duplicateItem; */
    1370             :     (xmlSecPtrDestroyItemMethod)xmlSecKeyDataStoreDestroy,      /* xmlSecPtrDestroyItemMethod destroyItem; */
    1371             :     NULL,                                                       /* xmlSecPtrDebugDumpItemMethod debugDumpItem; */
    1372             :     NULL,                                                       /* xmlSecPtrDebugDumpItemMethod debugXmlDumpItem; */
    1373             : };
    1374             : 
    1375             : /**
    1376             :  * xmlSecKeyDataStorePtrListGetKlass:
    1377             :  * 
    1378             :  * Key data stores list.
    1379             :  *
    1380             :  * Returns: key data stores list klass.
    1381             :  */
    1382             : xmlSecPtrListId 
    1383           0 : xmlSecKeyDataStorePtrListGetKlass(void) {
    1384           0 :     return(&xmlSecKeyDataStorePtrListKlass);
    1385             : }
    1386             : 
    1387             : 

Generated by: LCOV version 1.10