/
githubmirror
/
xmlsec
Обзор
Документация
Войти
/
githubmirror
/
xmlsec
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
1.3.10
src/openssl/symkeys.c
678 строк
23 KB
lsh123
Adding more tests (#1079)
16 мар 2026, 19:25
Не верифицирован
16 мар 2026, 19:25
6d9b98f
Код
Авторство
О чём код?
/* * XML Security Library (http://www.aleksey.com/xmlsec). * * Symmetric keys implementation for OpenSSL. * * This is free software; see the Copyright file in the source * distribution for precise wording. * * Copyright (C) 2002-2024 Aleksey Sanin <aleksey@aleksey.com>. All Rights Reserved. */ /** * SECTION:crypto */ #include "globals.h" #include <stdlib.h> #include <stdio.h> #include <string.h> #include <openssl/rand.h> #include <xmlsec/xmlsec.h> #include <xmlsec/keys.h> #include <xmlsec/keyinfo.h> #include <xmlsec/transforms.h> #include <xmlsec/errors.h> #include <xmlsec/private.h> #include <xmlsec/openssl/crypto.h> #include "openssl_compat.h" #include "../keysdata_helpers.h" /***************************************************************************** * * Symmetic (binary) keys - just a wrapper for xmlSecKeyDataBinary * ****************************************************************************/ static int xmlSecOpenSSLSymKeyDataInitialize (xmlSecKeyDataPtr data); static int xmlSecOpenSSLSymKeyDataDuplicate (xmlSecKeyDataPtr dst, xmlSecKeyDataPtr src); static void xmlSecOpenSSLSymKeyDataFinalize (xmlSecKeyDataPtr data); static int xmlSecOpenSSLSymKeyDataXmlRead (xmlSecKeyDataId id, xmlSecKeyPtr key, xmlNodePtr node, xmlSecKeyInfoCtxPtr keyInfoCtx); static int xmlSecOpenSSLSymKeyDataXmlWrite (xmlSecKeyDataId id, xmlSecKeyPtr key, xmlNodePtr node, xmlSecKeyInfoCtxPtr keyInfoCtx); static int xmlSecOpenSSLSymKeyDataBinRead (xmlSecKeyDataId id, xmlSecKeyPtr key, const xmlSecByte* buf, xmlSecSize bufSize, xmlSecKeyInfoCtxPtr keyInfoCtx); static int xmlSecOpenSSLSymKeyDataBinWrite (xmlSecKeyDataId id, xmlSecKeyPtr key, xmlSecByte** buf, xmlSecSize* bufSize, xmlSecKeyInfoCtxPtr keyInfoCtx); static int xmlSecOpenSSLSymKeyDataGenerate (xmlSecKeyDataPtr data, xmlSecSize sizeBits, xmlSecKeyDataType type); static xmlSecKeyDataType xmlSecOpenSSLSymKeyDataGetType (xmlSecKeyDataPtr data); static xmlSecSize xmlSecOpenSSLSymKeyDataGetSize (xmlSecKeyDataPtr data); static void xmlSecOpenSSLSymKeyDataDebugDump (xmlSecKeyDataPtr data, FILE* output); static void xmlSecOpenSSLSymKeyDataDebugXmlDump (xmlSecKeyDataPtr data, FILE* output); static int xmlSecOpenSSLSymKeyDataKlassCheck (xmlSecKeyDataKlass* klass); #define xmlSecOpenSSLSymKeyDataCheckId(data) \ (xmlSecKeyDataIsValid((data)) && \ xmlSecOpenSSLSymKeyDataKlassCheck((data)->id)) static int xmlSecOpenSSLSymKeyDataInitialize(xmlSecKeyDataPtr data) { xmlSecAssert2(xmlSecOpenSSLSymKeyDataCheckId(data), -1); return(xmlSecKeyDataBinaryValueInitialize(data)); } static int xmlSecOpenSSLSymKeyDataDuplicate(xmlSecKeyDataPtr dst, xmlSecKeyDataPtr src) { xmlSecAssert2(xmlSecOpenSSLSymKeyDataCheckId(dst), -1); xmlSecAssert2(xmlSecOpenSSLSymKeyDataCheckId(src), -1); xmlSecAssert2(dst->id == src->id, -1); return(xmlSecKeyDataBinaryValueDuplicate(dst, src)); } static void xmlSecOpenSSLSymKeyDataFinalize(xmlSecKeyDataPtr data) { xmlSecAssert(xmlSecOpenSSLSymKeyDataCheckId(data)); xmlSecKeyDataBinaryValueFinalize(data); } static int xmlSecOpenSSLSymKeyDataXmlRead(xmlSecKeyDataId id, xmlSecKeyPtr key, xmlNodePtr node, xmlSecKeyInfoCtxPtr keyInfoCtx) { xmlSecAssert2(xmlSecOpenSSLSymKeyDataKlassCheck(id), -1); return(xmlSecKeyDataBinaryValueXmlRead(id, key, node, keyInfoCtx)); } static int xmlSecOpenSSLSymKeyDataXmlWrite(xmlSecKeyDataId id, xmlSecKeyPtr key, xmlNodePtr node, xmlSecKeyInfoCtxPtr keyInfoCtx) { xmlSecAssert2(xmlSecOpenSSLSymKeyDataKlassCheck(id), -1); return(xmlSecKeyDataBinaryValueXmlWrite(id, key, node, keyInfoCtx)); } static int xmlSecOpenSSLSymKeyDataBinRead(xmlSecKeyDataId id, xmlSecKeyPtr key, const xmlSecByte* buf, xmlSecSize bufSize, xmlSecKeyInfoCtxPtr keyInfoCtx) { xmlSecAssert2(xmlSecOpenSSLSymKeyDataKlassCheck(id), -1); return(xmlSecKeyDataBinaryValueBinRead(id, key, buf, bufSize, keyInfoCtx)); } static int xmlSecOpenSSLSymKeyDataBinWrite(xmlSecKeyDataId id, xmlSecKeyPtr key, xmlSecByte** buf, xmlSecSize* bufSize, xmlSecKeyInfoCtxPtr keyInfoCtx) { xmlSecAssert2(xmlSecOpenSSLSymKeyDataKlassCheck(id), -1); return(xmlSecKeyDataBinaryValueBinWrite(id, key, buf, bufSize, keyInfoCtx)); } static int xmlSecOpenSSLSymKeyDataGenerate(xmlSecKeyDataPtr data, xmlSecSize sizeBits, xmlSecKeyDataType type XMLSEC_ATTRIBUTE_UNUSED) { xmlSecBufferPtr buffer; xmlSecSize size; int ret; xmlSecAssert2(xmlSecOpenSSLSymKeyDataCheckId(data), -1); xmlSecAssert2(sizeBits > 0, -1); UNREFERENCED_PARAMETER(type); buffer = xmlSecKeyDataBinaryValueGetBuffer(data); xmlSecAssert2(buffer != NULL, -1); size = (sizeBits + 7) / 8; ret = xmlSecBufferSetSize(buffer, size); if(ret < 0) { xmlSecInternalError2("xmlSecBufferSetSize", NULL, "size=" XMLSEC_SIZE_FMT, size); return(-1); } xmlSecAssert2(xmlSecBufferGetData(buffer) != NULL, -1); return(xmlSecOpenSSLGenerateRandomBytes(xmlSecBufferGetData(buffer), xmlSecBufferGetSize(buffer))); } static xmlSecKeyDataType xmlSecOpenSSLSymKeyDataGetType(xmlSecKeyDataPtr data) { xmlSecBufferPtr buffer; xmlSecAssert2(xmlSecOpenSSLSymKeyDataCheckId(data), xmlSecKeyDataTypeUnknown); buffer = xmlSecKeyDataBinaryValueGetBuffer(data); xmlSecAssert2(buffer != NULL, xmlSecKeyDataTypeUnknown); return((xmlSecBufferGetSize(buffer) > 0) ? xmlSecKeyDataTypeSymmetric : xmlSecKeyDataTypeUnknown); } static xmlSecSize xmlSecOpenSSLSymKeyDataGetSize(xmlSecKeyDataPtr data) { xmlSecAssert2(xmlSecOpenSSLSymKeyDataCheckId(data), 0); return(xmlSecKeyDataBinaryValueGetSize(data)); } static void xmlSecOpenSSLSymKeyDataDebugDump(xmlSecKeyDataPtr data, FILE* output) { xmlSecAssert(xmlSecOpenSSLSymKeyDataCheckId(data)); xmlSecKeyDataBinaryValueDebugDump(data, output); } static void xmlSecOpenSSLSymKeyDataDebugXmlDump(xmlSecKeyDataPtr data, FILE* output) { xmlSecAssert(xmlSecOpenSSLSymKeyDataCheckId(data)); xmlSecKeyDataBinaryValueDebugXmlDump(data, output); } static int xmlSecOpenSSLSymKeyDataKlassCheck(xmlSecKeyDataKlass* klass) { #ifndef XMLSEC_NO_AES if(klass == xmlSecOpenSSLKeyDataAesId) { return(1); } #endif /* XMLSEC_NO_AES */ #ifndef XMLSEC_NO_CAMELLIA if(klass == xmlSecOpenSSLKeyDataCamelliaId) { return(1); } #endif /* XMLSEC_NO_CAMELLIA */ #ifndef XMLSEC_NO_CHACHA20 if(klass == xmlSecOpenSSLKeyDataChaCha20Id) { return(1); } #endif /* XMLSEC_NO_CHACHA20 */ #ifndef XMLSEC_NO_CONCATKDF if(klass == xmlSecOpenSSLKeyDataConcatKdfId) { return(1); } #endif /* XMLSEC_NO_CONCATKDF */ #ifndef XMLSEC_NO_DES if(klass == xmlSecOpenSSLKeyDataDesId) { return(1); } #endif /* XMLSEC_NO_DES */ #ifndef XMLSEC_NO_HMAC if(klass == xmlSecOpenSSLKeyDataHmacId) { return(1); } #endif /* XMLSEC_NO_HMAC */ #ifndef XMLSEC_NO_PBKDF2 if(klass == xmlSecOpenSSLKeyDataPbkdf2Id) { return(1); } #endif /* XMLSEC_NO_PBKDF2 */ #ifndef XMLSEC_NO_HKDF if(klass == xmlSecOpenSSLKeyDataHkdfId) { return(1); } #endif /* XMLSEC_NO_HKDF */ return(0); } /* Helper macros to define the key data klass */ #define XMLSEC_OPENSSL_SYMKEY_KLASS_EX(name, keyName, keyHref, usage, node, ns, xmlRead, xmlWrite) \ static xmlSecKeyDataKlass xmlSecOpenSSLKeyData ## name ## Klass = { \ sizeof(xmlSecKeyDataKlass), /* xmlSecSize klassSize */ \ xmlSecKeyDataBinarySize, /* xmlSecSize objSize */ \ \ /* data */ \ keyName, /* const xmlChar* name; */ \ usage, /* xmlSecKeyDataUsage usage; */ \ keyHref, /* const xmlChar* href; */ \ node, /* const xmlChar* dataNodeName; */ \ ns, /* const xmlChar* dataNodeNs; */ \ \ /* constructors/destructor */ \ xmlSecOpenSSLSymKeyDataInitialize, /* xmlSecKeyDataInitializeMethod initialize; */ \ xmlSecOpenSSLSymKeyDataDuplicate, /* xmlSecKeyDataDuplicateMethod duplicate; */ \ xmlSecOpenSSLSymKeyDataFinalize, /* xmlSecKeyDataFinalizeMethod finalize; */ \ xmlSecOpenSSLSymKeyDataGenerate, /* xmlSecKeyDataGenerateMethod generate; */ \ \ /* get info */ \ xmlSecOpenSSLSymKeyDataGetType, /* xmlSecKeyDataGetTypeMethod getType; */ \ xmlSecOpenSSLSymKeyDataGetSize, /* xmlSecKeyDataGetSizeMethod getSize; */ \ NULL, /* DEPRECATED xmlSecKeyDataGetIdentifier getIdentifier; */ \ \ /* read/write */ \ xmlRead, /* xmlSecKeyDataXmlReadMethod xmlRead; */ \ xmlWrite, /* xmlSecKeyDataXmlWriteMethod xmlWrite; */ \ xmlSecOpenSSLSymKeyDataBinRead, /* xmlSecKeyDataBinReadMethod binRead; */ \ xmlSecOpenSSLSymKeyDataBinWrite, /* xmlSecKeyDataBinWriteMethod binWrite; */ \ \ /* debug */ \ xmlSecOpenSSLSymKeyDataDebugDump, /* xmlSecKeyDataDebugDumpMethod debugDump; */ \ xmlSecOpenSSLSymKeyDataDebugXmlDump, /* xmlSecKeyDataDebugDumpMethod debugXmlDump; */ \ \ /* reserved for the future */ \ NULL, /* void* reserved0; */ \ NULL, /* void* reserved1; */ \ }; #define XMLSEC_OPENSSL_SYMKEY_KLASS(name, keyValueName) \ XMLSEC_OPENSSL_SYMKEY_KLASS_EX(name, \ xmlSecName ## keyValueName ## KeyValue, \ xmlSecHref ## keyValueName ## KeyValue, \ xmlSecKeyDataUsageReadFromFile | xmlSecKeyDataUsageKeyValueNode | xmlSecKeyDataUsageRetrievalMethodNodeXml, \ xmlSecNode ## keyValueName ## KeyValue, \ xmlSecNs, \ xmlSecOpenSSLSymKeyDataXmlRead, \ xmlSecOpenSSLSymKeyDataXmlWrite) #ifndef XMLSEC_NO_AES /************************************************************************** * * <xmlsec:AESKeyValue> processing * *************************************************************************/ XMLSEC_OPENSSL_SYMKEY_KLASS(Aes, AES) /** * xmlSecOpenSSLKeyDataAesGetKlass: * * The AES key data klass. * * Returns: AES key data klass. */ xmlSecKeyDataId xmlSecOpenSSLKeyDataAesGetKlass(void) { return(&xmlSecOpenSSLKeyDataAesKlass); } /** * xmlSecOpenSSLKeyDataAesSet: * @data: the pointer to AES key data. * @buf: the pointer to key value. * @bufSize: the key value size (in bytes). * * Sets the value of AES key data. * * Returns: 0 on success or a negative value if an error occurs. */ int xmlSecOpenSSLKeyDataAesSet(xmlSecKeyDataPtr data, const xmlSecByte* buf, xmlSecSize bufSize) { xmlSecBufferPtr buffer; xmlSecAssert2(xmlSecKeyDataCheckId(data, xmlSecOpenSSLKeyDataAesId), -1); xmlSecAssert2(buf != NULL, -1); xmlSecAssert2(bufSize > 0, -1); buffer = xmlSecKeyDataBinaryValueGetBuffer(data); xmlSecAssert2(buffer != NULL, -1); return(xmlSecBufferSetData(buffer, buf, bufSize)); } #endif /* XMLSEC_NO_AES */ #ifndef XMLSEC_NO_CAMELLIA /************************************************************************** * * <xmlsec:CamelliaKeyValue> processing * *************************************************************************/ XMLSEC_OPENSSL_SYMKEY_KLASS(Camellia, Camellia) /** * xmlSecOpenSSLKeyDataCamelliaGetKlass: * * The Camellia key data klass. * * Returns: Camellia key data klass. */ xmlSecKeyDataId xmlSecOpenSSLKeyDataCamelliaGetKlass(void) { return(&xmlSecOpenSSLKeyDataCamelliaKlass); } /** * xmlSecOpenSSLKeyDataCamelliaSet: * @data: the pointer to Camellia key data. * @buf: the pointer to key value. * @bufSize: the key value size (in bytes). * * Sets the value of Camellia key data. * * Returns: 0 on success or a negative value if an error occurs. */ int xmlSecOpenSSLKeyDataCamelliaSet(xmlSecKeyDataPtr data, const xmlSecByte* buf, xmlSecSize bufSize) { xmlSecBufferPtr buffer; xmlSecAssert2(xmlSecKeyDataCheckId(data, xmlSecOpenSSLKeyDataCamelliaId), -1); xmlSecAssert2(buf != NULL, -1); xmlSecAssert2(bufSize > 0, -1); buffer = xmlSecKeyDataBinaryValueGetBuffer(data); xmlSecAssert2(buffer != NULL, -1); return(xmlSecBufferSetData(buffer, buf, bufSize)); } #endif /* XMLSEC_NO_CAMELLIA */ #ifndef XMLSEC_NO_CHACHA20 /************************************************************************** * * <xmlsec:ChaCha20KeyValue> processing * *************************************************************************/ XMLSEC_OPENSSL_SYMKEY_KLASS(ChaCha20, ChaCha20) /** * xmlSecOpenSSLKeyDataChaCha20GetKlass: * * The ChaCha20 key data klass. * * Returns: ChaCha20 key data klass. */ xmlSecKeyDataId xmlSecOpenSSLKeyDataChaCha20GetKlass(void) { return(&xmlSecOpenSSLKeyDataChaCha20Klass); } /** * xmlSecOpenSSLKeyDataChaCha20Set: * @data: the pointer to ChaCha20 key data. * @buf: the pointer to key value. * @bufSize: the key value size (in bytes). * * Sets the value of ChaCha20 key data. * * Returns: 0 on success or a negative value if an error occurs. */ int xmlSecOpenSSLKeyDataChaCha20Set(xmlSecKeyDataPtr data, const xmlSecByte* buf, xmlSecSize bufSize) { xmlSecBufferPtr buffer; xmlSecAssert2(xmlSecKeyDataCheckId(data, xmlSecOpenSSLKeyDataChaCha20Id), -1); xmlSecAssert2(buf != NULL, -1); xmlSecAssert2(bufSize > 0, -1); buffer = xmlSecKeyDataBinaryValueGetBuffer(data); xmlSecAssert2(buffer != NULL, -1); return(xmlSecBufferSetData(buffer, buf, bufSize)); } #endif /* XMLSEC_NO_CHACHA20 */ #ifndef XMLSEC_NO_CONCATKDF /************************************************************************** * * The ConcatKDF key derivation key * *************************************************************************/ XMLSEC_OPENSSL_SYMKEY_KLASS_EX(ConcatKdf, xmlSecNameConcatKdf, xmlSecHrefConcatKdf, xmlSecKeyDataUsageReadFromFile, NULL, NULL, NULL, NULL) /** * xmlSecOpenSSLKeyDataConcatKdfGetKlass: * * The ConcatKdf key data klass. * * Returns: ConcatKdf key data klass. */ xmlSecKeyDataId xmlSecOpenSSLKeyDataConcatKdfGetKlass(void) { return(&xmlSecOpenSSLKeyDataConcatKdfKlass); } /** * xmlSecOpenSSLKeyDataConcatKdfSet: * @data: the pointer to ConcatKdf key data. * @buf: the pointer to key value. * @bufSize: the key value size (in bytes). * * Sets the value of ConcatKdf key data. * * Returns: 0 on success or a negative value if an error occurs. */ int xmlSecOpenSSLKeyDataConcatKdfSet(xmlSecKeyDataPtr data, const xmlSecByte* buf, xmlSecSize bufSize) { xmlSecBufferPtr buffer; xmlSecAssert2(xmlSecKeyDataCheckId(data, xmlSecOpenSSLKeyDataConcatKdfId), -1); xmlSecAssert2(buf != NULL, -1); xmlSecAssert2(bufSize > 0, -1); buffer = xmlSecKeyDataBinaryValueGetBuffer(data); xmlSecAssert2(buffer != NULL, -1); return(xmlSecBufferSetData(buffer, buf, bufSize)); } #endif /* XMLSEC_NO_CONCATKDF */ #ifndef XMLSEC_NO_DES /************************************************************************** * * <xmlsec:DESKeyValue> processing * *************************************************************************/ XMLSEC_OPENSSL_SYMKEY_KLASS(Des, DES) /** * xmlSecOpenSSLKeyDataDesGetKlass: * * The DES key data klass. * * Returns: DES key data klass. */ xmlSecKeyDataId xmlSecOpenSSLKeyDataDesGetKlass(void) { return(&xmlSecOpenSSLKeyDataDesKlass); } /** * xmlSecOpenSSLKeyDataDesSet: * @data: the pointer to DES key data. * @buf: the pointer to key value. * @bufSize: the key value size (in bytes). * * Sets the value of DES key data. * * Returns: 0 on success or a negative value if an error occurs. */ int xmlSecOpenSSLKeyDataDesSet(xmlSecKeyDataPtr data, const xmlSecByte* buf, xmlSecSize bufSize) { xmlSecBufferPtr buffer; xmlSecAssert2(xmlSecKeyDataCheckId(data, xmlSecOpenSSLKeyDataDesId), -1); xmlSecAssert2(buf != NULL, -1); xmlSecAssert2(bufSize > 0, -1); buffer = xmlSecKeyDataBinaryValueGetBuffer(data); xmlSecAssert2(buffer != NULL, -1); return(xmlSecBufferSetData(buffer, buf, bufSize)); } #endif /* XMLSEC_NO_DES */ #ifndef XMLSEC_NO_HMAC /************************************************************************** * * <xmlsec:HMACKeyValue> processing * *************************************************************************/ XMLSEC_OPENSSL_SYMKEY_KLASS(Hmac, HMAC) /** * xmlSecOpenSSLKeyDataHmacGetKlass: * * The HMAC key data klass. * * Returns: HMAC key data klass. */ xmlSecKeyDataId xmlSecOpenSSLKeyDataHmacGetKlass(void) { return(&xmlSecOpenSSLKeyDataHmacKlass); } /** * xmlSecOpenSSLKeyDataHmacSet: * @data: the pointer to HMAC key data. * @buf: the pointer to key value. * @bufSize: the key value size (in bytes). * * Sets the value of HMAC key data. * * Returns: 0 on success or a negative value if an error occurs. */ int xmlSecOpenSSLKeyDataHmacSet(xmlSecKeyDataPtr data, const xmlSecByte* buf, xmlSecSize bufSize) { xmlSecBufferPtr buffer; xmlSecAssert2(xmlSecKeyDataCheckId(data, xmlSecOpenSSLKeyDataHmacId), -1); xmlSecAssert2(buf != NULL, -1); xmlSecAssert2(bufSize > 0, -1); buffer = xmlSecKeyDataBinaryValueGetBuffer(data); xmlSecAssert2(buffer != NULL, -1); return(xmlSecBufferSetData(buffer, buf, bufSize)); } #endif /* XMLSEC_NO_HMAC */ #ifndef XMLSEC_NO_PBKDF2 /************************************************************************** * * The PBKDF2 key derivation key * *************************************************************************/ XMLSEC_OPENSSL_SYMKEY_KLASS_EX(Pbkdf2, xmlSecNamePbkdf2, xmlSecHrefPbkdf2, xmlSecKeyDataUsageReadFromFile, NULL, NULL, NULL, NULL) /** * xmlSecOpenSSLKeyDataPbkdf2GetKlass: * * The PBKDF2 key data klass. * * Returns: PBKDF2 key data klass. */ xmlSecKeyDataId xmlSecOpenSSLKeyDataPbkdf2GetKlass(void) { return(&xmlSecOpenSSLKeyDataPbkdf2Klass); } /** * xmlSecOpenSSLKeyDataPbkdf2Set: * @data: the pointer to Pbkdf2 key data. * @buf: the pointer to key value. * @bufSize: the key value size (in bytes). * * Sets the value of PBKDF2 key data. * * Returns: 0 on success or a negative value if an error occurs. */ int xmlSecOpenSSLKeyDataPbkdf2Set(xmlSecKeyDataPtr data, const xmlSecByte* buf, xmlSecSize bufSize) { xmlSecBufferPtr buffer; xmlSecAssert2(xmlSecKeyDataCheckId(data, xmlSecOpenSSLKeyDataPbkdf2Id), -1); xmlSecAssert2(buf != NULL, -1); xmlSecAssert2(bufSize > 0, -1); buffer = xmlSecKeyDataBinaryValueGetBuffer(data); xmlSecAssert2(buffer != NULL, -1); return(xmlSecBufferSetData(buffer, buf, bufSize)); } #endif /* XMLSEC_NO_PBKDF2 */ #ifndef XMLSEC_NO_HKDF /************************************************************************** * * The HKDF key derivation key * *************************************************************************/ XMLSEC_OPENSSL_SYMKEY_KLASS_EX(Hkdf, xmlSecNameHkdf, xmlSecHrefHkdf, xmlSecKeyDataUsageReadFromFile, NULL, NULL, NULL, NULL) /** * xmlSecOpenSSLKeyDataHkdfGetKlass: * * The HKDF key data klass. * * Returns: HKDF key data klass. */ xmlSecKeyDataId xmlSecOpenSSLKeyDataHkdfGetKlass(void) { return(&xmlSecOpenSSLKeyDataHkdfKlass); } /** * xmlSecOpenSSLKeyDataHkdfSet: * @data: the pointer to Hkdf key data. * @buf: the pointer to key value. * @bufSize: the key value size (in bytes). * * Sets the value of HKDF key data (IKM). * * Returns: 0 on success or a negative value if an error occurs. */ int xmlSecOpenSSLKeyDataHkdfSet(xmlSecKeyDataPtr data, const xmlSecByte* buf, xmlSecSize bufSize) { xmlSecBufferPtr buffer; xmlSecAssert2(xmlSecKeyDataCheckId(data, xmlSecOpenSSLKeyDataHkdfId), -1); xmlSecAssert2(buf != NULL, -1); xmlSecAssert2(bufSize > 0, -1); buffer = xmlSecKeyDataBinaryValueGetBuffer(data); xmlSecAssert2(buffer != NULL, -1); return(xmlSecBufferSetData(buffer, buf, bufSize)); } #endif /* XMLSEC_NO_HKDF */