📄 dsakgtype.c
字号:
/* Copyright 2003-2004, Voltage Security, all rights reserved.
*/
#include "vibecrypto.h"
#include "environment.h"
#include "base.h"
#include "libctx.h"
#include "keyobj.h"
#include "dsa.h"
#include "mpint.h"
#include "random.h"
#include "errorctx.h"
/* This routine does the work. It allocates and fills in the contexts.
*
* @param obj The algorithm object to set.
* @param primeSizeBits The size of the primeP in bits.
* @param paramInfo Contains the params from which the keys will be
* generated.
* @return an int, 0 if the function completed successfully or a
* non-zero error code.
*/
static int VOLT_CALLING_CONV SetObjectDSAKeyGen VOLT_PROTO_LIST ((
VoltKeyObject *obj,
unsigned int primeSizeBits,
VtDSAParamInfo *paramInfo
));
int VtKeyPairGenDSAAndParams (
VtKeyObject object,
Pointer info,
unsigned int flag,
VtRandomObject random
)
{
int status;
unsigned int primeSizeBits;
VoltKeyObject *obj = (VoltKeyObject *)object;
VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
VtDSAParamInfo paramInfo;
VOLT_DECLARE_ERROR_TYPE (errorType)
VOLT_DECLARE_FNCT_LINE (fnctLine)
Z2Memset (¶mInfo, 0, sizeof (paramInfo));
do
{
/* Check the flag, it should be VOLT_KEY_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_KEY_SET_TYPE_FLAG)
break;
/* Check the keyType of the object. It should be 0.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_SET;
if (obj->keyType != 0)
break;
/* The associated info should be a pointer to an unsigned int.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_ASSOCIATED_INFO;
if (info == (Pointer)0)
break;
primeSizeBits = *((unsigned int *)info);
/* For now we support only 1024 bits.
*/
VOLT_SET_FNCT_LINE (fnctLine)
if (primeSizeBits != 1024)
break;
/* If using this KeyGenImpl, the key must already have an mpCtx
* loaded.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_KEY_OBJ;
if (obj->mpCtx == (VoltMpIntCtx *)0)
break;
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = SetObjectDSAKeyGen (obj, primeSizeBits, ¶mInfo);
} 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->keyType = 0;
VOLT_LOG_ERROR (
(VtLibCtx)libCtx, status, errorType, fnctLine,
"VtKeyPairGenDSAAndParams", (char *)0)
return (status);
}
int VtKeyPairGenDSA (
VtKeyObject object,
Pointer info,
unsigned int flag,
VtRandomObject random
)
{
int status;
unsigned int msByte, primeSizeBits;
VoltKeyObject *obj = (VoltKeyObject *)object;
VtParameterObject pObj = (VtParameterObject)info;
VtDSAParamInfo *paramInfo;
VOLT_DECLARE_ERROR_TYPE (errorType)
VOLT_DECLARE_FNCT_LINE (fnctLine)
do
{
/* Check the flag, it should be VOLT_KEY_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_KEY_SET_TYPE_FLAG)
break;
/* Check the keyType of the object. It should be 0.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_SET;
if (obj->keyType != 0)
break;
/* The associated info should be a parameter object.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_ASSOCIATED_INFO;
if (info == (Pointer)0)
break;
/* Get the params.
*/
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = VtGetParameterParam (
pObj, VtParameterParamDSAParams, (Pointer *)¶mInfo);
if (status != 0)
{
if (status == VT_ERROR_GET_INFO_UNAVAILABLE)
status = VT_ERROR_INVALID_ASSOCIATED_INFO;
break;
}
/* How big is the subprime?
*/
primeSizeBits = 8;
msByte = (unsigned int)(paramInfo->subprimeQ.data[0]) & 0xff;
while ((msByte & 0x80) == 0)
{
msByte <<= 1;
primeSizeBits--;
}
primeSizeBits += (paramInfo->subprimeQ.len - 1) * 8;
if (primeSizeBits != 160)
break;
/* How big is the prime?
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_ASSOCIATED_INFO;
primeSizeBits = 8;
msByte = (unsigned int)(paramInfo->primeP.data[0]) & 0xff;
while ((msByte & 0x80) == 0)
{
msByte <<= 1;
primeSizeBits--;
}
primeSizeBits += (paramInfo->primeP.len - 1) * 8;
if (primeSizeBits != 1024)
break;
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = SetObjectDSAKeyGen (obj, primeSizeBits, paramInfo);
} 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->keyType = 0;
VOLT_LOG_ERROR (
obj->voltObject.libraryCtx, status, errorType, fnctLine,
"VtKeyPairGenDSA", (char *)0)
return (status);
}
static int SetObjectDSAKeyGen (
VoltKeyObject *obj,
unsigned int primeSizeBits,
VtDSAParamInfo *paramInfo
)
{
int status;
unsigned int bufferSize, primePLen, subprimeQLen, baseGLen;
unsigned char *buffer = (unsigned char *)0;
VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
VoltDsaKeyGenCtx *dsaGenCtx;
VOLT_DECLARE_FNCT_LINE (fnctLine)
do
{
/* If we have params, get the lengths from them. If not, use
* defaults.
*/
if (paramInfo->primeP.data != (unsigned char *)0)
{
primePLen = paramInfo->primeP.len;
subprimeQLen = paramInfo->subprimeQ.len;
baseGLen = paramInfo->baseG.len;
}
else
{
primePLen = (primeSizeBits + 7) / 8;
subprimeQLen = 20;
baseGLen = primePLen;
}
/* Allocate enough space for a DsaKeyGenCtx. The buffers after the
* struct will be byte arrays, so no need to worry about alignment.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_MEMORY;
bufferSize =
sizeof (VoltDsaKeyGenCtx) + primePLen + subprimeQLen + baseGLen;
buffer = (unsigned char *)Z2Malloc (bufferSize, VOLT_MEMORY_SENSITIVE);
if (buffer == (unsigned char *)0)
break;
Z2Memset (buffer, 0, bufferSize);
/* Locate the context.
*/
dsaGenCtx = (VoltDsaKeyGenCtx *)buffer;
/* Populate the context.
*/
dsaGenCtx->mpCtx = (VtMpIntCtx)(obj->mpCtx);
dsaGenCtx->primeSizeBits = primeSizeBits;
dsaGenCtx->primeP.data = buffer + sizeof (VoltDsaKeyGenCtx);
dsaGenCtx->subprimeQ.data = dsaGenCtx->primeP.data + primePLen;
dsaGenCtx->baseG.data = dsaGenCtx->subprimeQ.data + subprimeQLen;
/* Copy the params, if we have them.
*/
if (paramInfo->primeP.data != (unsigned char *)0)
{
Z2Memcpy (dsaGenCtx->primeP.data, paramInfo->primeP.data, primePLen);
dsaGenCtx->primeP.len = primePLen;
Z2Memcpy (
dsaGenCtx->subprimeQ.data, paramInfo->subprimeQ.data, subprimeQLen);
dsaGenCtx->subprimeQ.len = subprimeQLen;
Z2Memcpy (dsaGenCtx->baseG.data, paramInfo->baseG.data, baseGLen);
dsaGenCtx->baseG.len = baseGLen;
}
obj->keyType = VOLT_KEY_ALG_DSA | VOLT_KEY_TYPE_GEN_PAIR;
obj->GenerateKey = DSAGenerateKeyPair;
obj->localGenerateCtx = (Pointer)dsaGenCtx;
obj->LocalGenerateCtxDestroy = VoltSimpleCtxDestroy;
status = 0;
} while (0);
/* If everything worked, return 0.
*/
if (status == 0)
return (0);
/* If something went wrong, destroy anything we created and indicate
* that this object is not usable.
*/
if (buffer != (unsigned char *)0)
Z2Free (buffer);
obj->keyType = 0;
VOLT_LOG_ERROR (
(VtLibCtx)libCtx, status, VT_ERROR_TYPE_PRIMARY, fnctLine,
"SetObjectDSAKeyGen", (char *)0)
return (status);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -