📄 dsaparamtype.c
字号:
/* Copyright 2003-2005, Voltage Security, all rights reserved.
*/
#include "vibecrypto.h"
#include "environment.h"
#include "base.h"
#include "libctx.h"
#include "paramobj.h"
#include "dsa.h"
#include "mpint.h"
#include "errorctx.h"
/* Gets the system params out of a parameter object.
*
* @param paramObj The object from which the params are to be extracted.
* @param getInfo The address where the function will deposit the
* pointer to the info.
* @return an int, 0 if the function completed successfully or a
* non-zero error code.
*/
static int VOLT_CALLING_CONV VoltParameterGetDsaParams VOLT_PROTO_LIST ((
VtParameterObject paramObj,
Pointer *getInfo
));
int VtParameterParamDSAParams (
VtParameterObject object,
Pointer info,
unsigned int flag
)
{
int status;
VoltParameterObject *obj = (VoltParameterObject *)object;
VtDSAParamInfo *paramInfo = (VtDSAParamInfo *)info;
VOLT_DECLARE_ERROR_TYPE (errorType)
VOLT_DECLARE_FNCT_LINE (fnctLine)
do
{
if (flag == VOLT_PARAM_GET_TYPE_FLAG)
{
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = VoltParameterGetDsaParams (object, (Pointer *)info);
break;
}
/* Check the flag, it should be VOLT_PARAM_SET_TYPE_FLAG.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_TYPE;
if (flag != VOLT_PARAM_SET_TYPE_FLAG)
break;
/* Check the paramType of the object. It should be 0.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_SET;
if (obj->paramType != 0)
break;
/* The associated info should be a pointer to VoltageDsaParameters.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_ASSOCIATED_INFO;
if (info == (Pointer)0)
break;
/* The primeP must be 1024 bits long and the subprimeQ must be 160
* bits long.
*/
VOLT_SET_FNCT_LINE (fnctLine)
if (paramInfo->primeP.len != 128)
break;
if ((paramInfo->primeP.data[0] & 0x80) == 0)
break;
if (paramInfo->subprimeQ.len != 20)
break;
if ((paramInfo->subprimeQ.data[0] & 0x80) == 0)
break;
/* If using this ParameterParam, the key must already have an mpCtx
* loaded.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_PARAM_OBJ;
if (obj->mpCtx == (VoltMpIntCtx *)0)
break;
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = SetDSAParameters (
obj, &(paramInfo->primeP), &(paramInfo->subprimeQ),
&(paramInfo->baseG));
} while (0);
/* If everything worked, return 0.
*/
if (status == 0)
{
/* Set the FIPS bit in the object type, this object is a FIPS
* object.
*/
obj->voltObject.objectType |= VOLT_OBJECT_TYPE_FIPS;
return (0);
}
/* If something went wrong, indicate that this object is not usable.
*/
obj->paramType = 0;
VOLT_LOG_ERROR (
obj->voltObject.libraryCtx, status, errorType, fnctLine,
"VtParameterParamDSAParams", (char *)0)
return (status);
}
static int VoltParameterGetDsaParams (
VtParameterObject paramObj,
Pointer *getInfo
)
{
int status;
VoltParameterObject *obj = (VoltParameterObject *)paramObj;
VoltDsaParams *params;
VOLT_DECLARE_ERROR_TYPE (errorType)
VOLT_DECLARE_FNCT_LINE (fnctLine)
*getInfo = (Pointer)0;
do
{
/* Check the paramType in the object, it should contain
* VOLT_PARAM_ALG_DSA.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_GET_INFO_UNAVAILABLE;
if(obj->paramType == 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_GET;
if ((obj->paramType & VOLT_PARAM_TYPE_MASK_ALG) != VOLT_PARAM_ALG_DSA)
break;
/* 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 = (VoltDsaParams *)(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_COMPARE (
status, obj->voltObject.libraryCtx, status, errorType, fnctLine,
"VoltParameterGetDsaParams", (char *)0)
return (status);
}
int VtParameterParamDSAParamsFips (
VtParameterObject object,
Pointer info,
unsigned int flag
)
{
int status;
VoltParameterObject *obj = (VoltParameterObject *)object;
VoltDsaParams *params;
Pointer *getInfo = (Pointer *)info;
VOLT_DECLARE_FNCT_LINE (fnctLine)
*getInfo = (Pointer)0;
do
{
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_TYPE;
if (flag != VOLT_PARAM_GET_TYPE_FLAG)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_GET;
if ((obj->paramType & VOLT_PARAM_TYPE_MASK_ALG) != VOLT_PARAM_ALG_DSA)
break;
/* Check the paramType in the object, it should contain
* VOLT_PARAM_ALG_DSA.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_GET;
if (obj->paramType == 0)
break;
/* 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;
/* This works only if the params are in data format.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_GET_INFO_UNAVAILABLE;
if ((obj->paramType & VOLT_PARAM_TYPE_MASK_DATA) != VOLT_PARAM_TYPE_DATA)
break;
params = (VoltDsaParams *)(obj->paramData);
/* The FIPS information may not be there.
*/
VOLT_SET_FNCT_LINE (fnctLine)
if (params->fipsInfo.SEED.data == (unsigned char *)0)
break;
*getInfo = (Pointer)&(params->fipsInfo);
status = 0;
} while (0);
VOLT_LOG_ERROR_COMPARE (
status, obj->voltObject.libraryCtx, status, VT_ERROR_TYPE_PRIMARY,
fnctLine, "VtParameterParamDSAParamsFips", (char *)0)
return (status);
}
int SetDSAParameters (
VoltParameterObject *obj,
VtItem *primePItem,
VtItem *subprimeQItem,
VtItem *baseGItem
)
{
int status;
VoltMpIntCtx *mpCtx = obj->mpCtx;
VoltMpInt *primeP = (VoltMpInt *)0;
VoltMpInt *subprimeQ = (VoltMpInt *)0;
VoltMpInt *baseG = (VoltMpInt *)0;
VOLT_DECLARE_ERROR_TYPE (errorType)
VOLT_DECLARE_FNCT_LINE (fnctLine)
do
{
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_MP_INT_CTX;
if (mpCtx == (VoltMpIntCtx *)0)
break;
/* Create and set MpInt's with the data.
*/
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->CreateMpInt ((Pointer)mpCtx, &primeP);
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->OctetStringToMpInt (
0, primePItem->data, primePItem->len, primeP);
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->CreateMpInt ((Pointer)mpCtx, &subprimeQ);
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->OctetStringToMpInt (
0, subprimeQItem->data, subprimeQItem->len, subprimeQ);
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->CreateMpInt ((Pointer)mpCtx, &baseG);
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->OctetStringToMpInt (
0, baseGItem->data, baseGItem->len, baseG);
if (status != 0)
break;
/* Now call the Add routine that takes MpInt's.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = AddDSAParametersMpInt (
obj, primeP, subprimeQ, baseG, (VoltMpInt *)0,
(unsigned char *)0, 0, 0);
} while (0);
/* If successful, we're done.
*/
if (status == 0)
return (0);
/* If error, clean up some things.
*/
if (mpCtx != (VoltMpIntCtx *)0)
{
mpCtx->DestroyMpInt (&primeP);
mpCtx->DestroyMpInt (&subprimeQ);
mpCtx->DestroyMpInt (&baseG);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -