📄 dsaparamtype.c
字号:
VOLT_LOG_ERROR (
obj->voltObject.libraryCtx, status, errorType, fnctLine,
"SetDSAParameters", (char *)0)
return (status);
}
int AddDSAParametersMpInt (
VoltParameterObject *obj,
VoltMpInt *primeP,
VoltMpInt *subprimeQ,
VoltMpInt *baseG,
VoltMpInt *hVal,
unsigned char *SEED,
unsigned int seedLen,
unsigned int counter
)
{
int status;
unsigned int primePLen, subprimeQLen, baseGLen, hLen, sLen;
unsigned int totalSize, offset;
VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
VoltMpIntCtx *mpCtx = obj->mpCtx;
unsigned char *buffer = (unsigned char *)0;
VoltDsaParams *params;
VOLT_DECLARE_ERROR_TYPE (errorType)
VOLT_DECLARE_FNCT_LINE (fnctLine)
primePLen = 0;
subprimeQLen = 0;
baseGLen = 0;
hLen = 0;
sLen = 0;
do
{
/* Add these params only if the object is not set yet.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_PARAM_OBJ;
if (obj->paramData != (Pointer)0)
break;
/* How big will the byte arrays be? Use offset as a temp variable
* (as someplace to put the sign).
*/
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
mpCtx->MpIntToOctetString (
primeP, &offset, (unsigned char *)0, 0, &primePLen);
VOLT_SET_FNCT_LINE (fnctLine)
mpCtx->MpIntToOctetString (
subprimeQ, &offset, (unsigned char *)0, 0, &subprimeQLen);
VOLT_SET_FNCT_LINE (fnctLine)
mpCtx->MpIntToOctetString (
baseG, &offset, (unsigned char *)0, 0, &baseGLen);
if ( (hVal != (VoltMpInt *)0) && (SEED != (unsigned char *)0) &&
(seedLen != 0) && (counter != 0) )
{
VOLT_SET_FNCT_LINE (fnctLine)
mpCtx->MpIntToOctetString (
hVal, &offset, (unsigned char *)0, 0, &hLen);
sLen = seedLen;
}
/* Allocate space for the struct and byte arrays.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_MEMORY;
totalSize =
sizeof (VoltDsaParams) + primePLen + subprimeQLen + baseGLen +
hLen + sLen;
buffer = (unsigned char *)Z2Malloc (totalSize, 0);
if (buffer == (unsigned char *)0)
break;
Z2Memset (buffer, 0, totalSize);
params = (VoltDsaParams *)buffer;
/* The pointers after the struct will point to byte arrays, no need
* to worry about alignment.
*/
offset = sizeof (VoltDsaParams);
/* Set the fields.
*/
params->primeP = primeP;
params->subprimeQ = subprimeQ;
params->baseG = baseG;
params->paramInfo.primeP.data = buffer + offset;
offset += primePLen;
params->paramInfo.subprimeQ.data = buffer + offset;
offset += subprimeQLen;
params->paramInfo.baseG.data = buffer + offset;
/* If there is FIPS material, point out where it should go.
*/
if (sLen != 0)
{
offset += baseGLen;
params->fipsInfo.SEED.data = buffer + offset;
offset += sLen;
params->fipsInfo.hVal.data = buffer + offset;
}
/* Place the values as byte arrays.
*/
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToOctetString (
primeP, &offset, params->paramInfo.primeP.data, primePLen,
&(params->paramInfo.primeP.len));
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToOctetString (
subprimeQ, &offset, params->paramInfo.subprimeQ.data, subprimeQLen,
&(params->paramInfo.subprimeQ.len));
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToOctetString (
baseG, &offset, params->paramInfo.baseG.data, baseGLen,
&(params->paramInfo.baseG.len));
if (status != 0)
break;
if (sLen != 0)
{
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToOctetString (
hVal, &offset, params->fipsInfo.hVal.data, hLen,
&(params->fipsInfo.hVal.len));
Z2Memcpy (params->fipsInfo.SEED.data, SEED, sLen);
params->fipsInfo.SEED.len = sLen;
params->fipsInfo.counter = counter;
}
/* Copy the pointers to the FIPS params struct.
*/
params->fipsInfo.primeP.data = params->paramInfo.primeP.data;
params->fipsInfo.primeP.len = params->paramInfo.primeP.len;
params->fipsInfo.subprimeQ.data = params->paramInfo.subprimeQ.data;
params->fipsInfo.subprimeQ.len = params->paramInfo.subprimeQ.len;
params->fipsInfo.baseG.data = params->paramInfo.baseG.data;
params->fipsInfo.baseG.len = params->paramInfo.baseG.len;
obj->paramType =
VOLT_PARAM_ALG_DSA | VOLT_PARAM_TYPE_CONTENTS |
VOLT_PARAM_TYPE_PARAMS | VOLT_PARAM_TYPE_DATA;
obj->paramData = (Pointer)params;
obj->ParamDataDestroy = DSAParameterDataDestroy;
obj->CopyParams = DSACopyParams;
status = 0;
} while (0);
/* If successful, we're done.
*/
if (status == 0)
return (0);
/* If error, clean up some things.
*/
if (buffer != (unsigned char *)0)
Z2Free (buffer);
VOLT_LOG_ERROR (
(VtLibCtx)libCtx, status, errorType, fnctLine,
"AddDSAParametersMpInt", (char *)0)
return (status);
}
void DSAParameterDataDestroy (
Pointer paramObj,
Pointer ctx
)
{
VoltParameterObject *obj = (VoltParameterObject *)paramObj;
VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
VoltDsaParams *params = (VoltDsaParams *)obj->paramData;
VoltMpIntCtx *mpCtx;
if (params == (VoltDsaParams *)0)
return;
/* Destroy each of the MPInt's.
*/
if (params->primeP != (VoltMpInt *)0)
{
mpCtx = (VoltMpIntCtx *)(params->primeP->mpCtx);
mpCtx->DestroyMpInt (&(params->primeP));
}
if (params->subprimeQ != (VoltMpInt *)0)
{
mpCtx = (VoltMpIntCtx *)(params->subprimeQ->mpCtx);
mpCtx->DestroyMpInt (&(params->subprimeQ));
}
if (params->baseG != (VoltMpInt *)0)
{
mpCtx = (VoltMpIntCtx *)(params->baseG->mpCtx);
mpCtx->DestroyMpInt (&(params->baseG));
}
/* Now free up the memory of the params struct.
*/
Z2Free (params);
}
int DSACopyParams (
Pointer sourceParamObj,
Pointer destParamObj
)
{
int status;
VoltParameterObject *src = (VoltParameterObject *)sourceParamObj;
VoltParameterObject *dest = (VoltParameterObject *)destParamObj;
VoltDsaParams *params = (VoltDsaParams *)(src->paramData);
VoltMpIntCtx *mpCtx;
VoltMpInt *primeP = (VoltMpInt *)0;
VoltMpInt *subprimeQ = (VoltMpInt *)0;
VoltMpInt *baseG = (VoltMpInt *)0;
VoltMpInt *hVal = (VoltMpInt *)0;
VOLT_DECLARE_FNCT_LINE (fnctLine)
do
{
dest->paramType = src->paramType;
/* Do we need to copy the mpCtx.
*/
if (dest->mpCtx == (VoltMpIntCtx *)0)
{
VOLT_SET_FNCT_LINE (fnctLine)
status = VtCloneObject (
(Pointer)(src->mpCtx), (Pointer *)&(dest->mpCtx));
if (status != 0)
break;
}
mpCtx = dest->mpCtx;
/* Build new MpInt's from the old.
*/
if (params->primeP != (VoltMpInt *)0)
{
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->CreateMpInt ((Pointer)mpCtx, &primeP);
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToMpInt (params->primeP, primeP);
if (status != 0)
break;
}
if (params->subprimeQ != (VoltMpInt *)0)
{
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->CreateMpInt ((Pointer)mpCtx, &subprimeQ);
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToMpInt (params->subprimeQ, subprimeQ);
if (status != 0)
break;
}
if (params->baseG != (VoltMpInt *)0)
{
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->CreateMpInt ((Pointer)mpCtx, &baseG);
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToMpInt (params->baseG, baseG);
if (status != 0)
break;
}
if (params->fipsInfo.hVal.data != (unsigned char *)0)
{
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->CreateMpInt ((Pointer)mpCtx, &hVal);
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->OctetStringToMpInt (
0, params->fipsInfo.hVal.data, params->fipsInfo.hVal.len, hVal);
if (status != 0)
break;
}
/* Add these copies to the copy object.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = AddDSAParametersMpInt (
dest, primeP, subprimeQ, baseG, hVal,
params->fipsInfo.SEED.data, params->fipsInfo.SEED.len,
params->fipsInfo.counter);
if (status != 0)
break;
dest->GetParamData = src->GetParamData;
} while (0);
mpCtx->DestroyMpInt (&hVal);
if (status == 0)
return (0);
/* If error, destroy what we created.
*/
mpCtx->DestroyMpInt (&primeP);
mpCtx->DestroyMpInt (&subprimeQ);
mpCtx->DestroyMpInt (&baseG);
VOLT_LOG_ERROR (
src->voltObject.libraryCtx, status, 0, fnctLine,
"DSACopyParams", (char *)0)
return (status);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -