dhparams.c
来自「IBE是一种非对称密码技术」· C语言 代码 · 共 554 行 · 第 1/2 页
C
554 行
/* Make sure this object contains params and is not set to generate.
*/
VOLT_SET_FNCT_LINE (fnctLine)
if ((obj->paramType & VOLT_PARAM_TYPE_CONTENTS) == 0)
break;
/* Are the parameters in data format? If so, we're done. (Set the
* return values.)
*/
if ((obj->paramType & VOLT_PARAM_TYPE_MASK_DATA) == VOLT_PARAM_TYPE_DATA)
{
status = 0;
params = (VoltDHParams *)(obj->paramData);
*getInfo = (Pointer)&(params->paramInfo);
break;
}
/* The data is not available, does the object have a GetData
* function?
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_GET_INFO_UNAVAILABLE;
if (obj->GetParamData == (VGetParamData)0)
break;
/* Call the Get function.
*/
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = obj->GetParamData ((VtParameterObject)obj, getInfo);
} while (0);
VOLT_LOG_ERROR_INFO_COMPARE (
status, 0, paramObj, status, 0, errorType,
(char *)0, "VoltParameterGetDHParams", fnctLine, (char *)0)
return (status);
}
int VoltAddDHParametersMpInt (
VoltParameterObject *obj,
VoltMpInt *primeP,
VoltMpInt *subprimeQ,
VoltMpInt *baseG,
unsigned char *SEED,
unsigned int seedLen,
unsigned int counter
)
{
int status;
unsigned int sign, bufferSize, offset, pLen, qLen, gLen;
VoltMpIntCtx *mpCtx = obj->mpCtx;
VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
unsigned char *buffer = (unsigned char *)0;
VoltDHParams *dhParams = (VoltDHParams *)0;
VOLT_DECLARE_ERROR_TYPE (errorType)
VOLT_DECLARE_FNCT_LINE (fnctLine)
do
{
/* How big are the mpInts?
*/
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToOctetString (
primeP, &sign, (unsigned char *)0, 0, &pLen);
if (status == 0)
status = VT_ERROR_GENERAL;
if (status != VT_ERROR_BUFFER_TOO_SMALL)
break;
qLen = 0;
if (subprimeQ != (VoltMpInt *)0)
{
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToOctetString (
subprimeQ, &sign, (unsigned char *)0, 0, &qLen);
if (status == 0)
status = VT_ERROR_GENERAL;
if (status != VT_ERROR_BUFFER_TOO_SMALL)
break;
}
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToOctetString (
baseG, &sign, (unsigned char *)0, 0, &gLen);
if (status == 0)
status = VT_ERROR_GENERAL;
if (status != VT_ERROR_BUFFER_TOO_SMALL)
break;
bufferSize = sizeof (VoltDHParams) + pLen + qLen + gLen + seedLen;
/* Allocate a buffer big enough for the data struct and all the
* data.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_MEMORY;
buffer = (unsigned char *)Z2Malloc (bufferSize, VOLT_MEMORY_SENSITIVE);
if (buffer == (unsigned char *)0)
break;
Z2Memset (buffer, 0, bufferSize);
dhParams = (VoltDHParams *)buffer;
offset = sizeof (VoltDHParams);
dhParams->paramInfo.primeP.data = buffer + offset;
dhParams->fipsInfo.primeP.data = buffer + offset;
offset += pLen;
dhParams->paramInfo.baseG.data = buffer + offset;
dhParams->fipsInfo.baseG.data = buffer + offset;
offset += gLen;
if (subprimeQ != (VoltMpInt *)0)
{
dhParams->paramInfo.subprimeQ.data = buffer + offset;
dhParams->fipsInfo.subprimeQ.data = buffer + offset;
offset += qLen;
}
if (seedLen != 0)
dhParams->fipsInfo.SEED.data = buffer + offset;
/* Build mpInts for the prime, subprime, and base
*/
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(dhParams->primeP));
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToMpInt (primeP, dhParams->primeP);
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToOctetString (
primeP, &sign, dhParams->paramInfo.primeP.data, pLen,
&(dhParams->paramInfo.primeP.len));
if (status != 0)
break;
dhParams->fipsInfo.primeP.len = dhParams->paramInfo.primeP.len;
if (subprimeQ != (VoltMpInt *)0)
{
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(dhParams->subprimeQ));
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToMpInt (subprimeQ, dhParams->subprimeQ);
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToOctetString (
subprimeQ, &sign, dhParams->paramInfo.subprimeQ.data, qLen,
&(dhParams->paramInfo.subprimeQ.len));
if (status != 0)
break;
dhParams->fipsInfo.subprimeQ.len = dhParams->paramInfo.subprimeQ.len;
}
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(dhParams->baseG));
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToMpInt (baseG, dhParams->baseG);
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToOctetString (
baseG, &sign, dhParams->paramInfo.baseG.data, pLen,
&(dhParams->paramInfo.baseG.len));
if (status != 0)
break;
dhParams->fipsInfo.baseG.len = dhParams->paramInfo.baseG.len;
if (SEED != (unsigned char *)0)
{
Z2Memcpy (dhParams->fipsInfo.SEED.data, SEED, seedLen);
dhParams->fipsInfo.SEED.len = seedLen;
dhParams->fipsInfo.counter = counter;
}
obj->paramType =
VOLT_PARAM_ALG_DH | VOLT_PARAM_TYPE_CONTENTS |
VOLT_PARAM_TYPE_PARAMS | VOLT_PARAM_TYPE_DATA;
obj->paramData = (Pointer)dhParams;
obj->ParamDataDestroy = DHParameterDataDestroy;
obj->CopyParams = DHCopyParams;
} while (0);
if (status == 0)
return (0);
/* If there was an error, destroy/free anything we created/allocated.
*/
if (dhParams != (VoltDHParams *)0)
{
mpCtx->DestroyMpInt (&(dhParams->primeP));
mpCtx->DestroyMpInt (&(dhParams->subprimeQ));
mpCtx->DestroyMpInt (&(dhParams->baseG));
}
if (buffer != (unsigned char *)0)
Z2Free (buffer);
VOLT_LOG_ERROR_INFO_COMPARE (
status, 0, obj, status, 0, errorType,
(char *)0, "VoltAddDHParametersMpInt", fnctLine, (char *)0)
return (status);
}
void DHParameterDataDestroy (
Pointer paramObj,
Pointer ctx
)
{
VoltParameterObject *obj;
VoltLibCtx *libCtx;
VoltDHParams *dhParams;
if ( (paramObj == (Pointer)0) || (ctx == (Pointer)0) )
return;
obj = (VoltParameterObject *)paramObj;
libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
dhParams = (VoltDHParams *)ctx;
/* Destroy the MpInts.
*/
if (dhParams->primeP != (VoltMpInt *)0)
obj->mpCtx->DestroyMpInt (&(dhParams->primeP));
if (dhParams->subprimeQ != (VoltMpInt *)0)
obj->mpCtx->DestroyMpInt (&(dhParams->subprimeQ));
if (dhParams->baseG != (VoltMpInt *)0)
obj->mpCtx->DestroyMpInt (&(dhParams->baseG));
Z2Free (ctx);
}
int DHCopyParams (
Pointer sourceParamObj,
Pointer destParamObj
)
{
int status;
VoltParameterObject *src = (VoltParameterObject *)sourceParamObj;
VoltParameterObject *dest = (VoltParameterObject *)destParamObj;
VoltDHParams *dhParams = (VoltDHParams *)(src->paramData);
VOLT_DECLARE_FNCT_LINE (fnctLine)
VOLT_SET_FNCT_LINE (fnctLine)
status = VoltAddDHParametersMpInt (
dest, dhParams->primeP, dhParams->subprimeQ, dhParams->baseG,
dhParams->fipsInfo.SEED.data, dhParams->fipsInfo.SEED.len,
dhParams->fipsInfo.counter);
VOLT_LOG_ERROR_INFO_COMPARE (
status, 0, sourceParamObj, status, 0, 0,
(char *)0, "DHCopyParams", fnctLine, (char *)0)
return (status);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?