📄 dhkeytype.c
字号:
pubKey->keyItems = (VtDHPubKeyInfo *)buffer;
*getInfo = (Pointer)buffer;
} while (0);
/* If no error, we're done.
*/
if (status == 0)
return (0);
/* If there was an error, free memory we allocated.
*/
if (buffer != (unsigned char *)0)
Z2Free (buffer);
VOLT_LOG_ERROR_INFO (
0, object, status, 0, errorType,
(char *)0, "VoltKeyGetDHPublic", fnctLine, (char *)0)
return (status);
}
static int VoltKeyGetDHPrivate (
VtKeyObject object,
Pointer *getInfo
)
{
int status;
unsigned int bufferSize;
VoltKeyObject *obj = (VoltKeyObject *)object;
VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
unsigned char *buffer = (unsigned char *)0;
VoltDHPrivateKey *priKey;
VoltDHKeyPair *theKeyPair;
VOLT_DECLARE_ERROR_TYPE (errorType)
VOLT_DECLARE_FNCT_LINE (fnctLine)
do
{
/* Is there data?
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_GET_INFO_UNAVAILABLE;
if (obj->keyData == (Pointer)0)
break;
/* Is the algorithm DH?
*/
VOLT_SET_FNCT_LINE (fnctLine)
if ((obj->keyType & VOLT_KEY_TYPE_MASK_ASYM_ALG) != VOLT_KEY_ALG_DH)
break;
/* Check the keyType in the object, if it contains
* VOLT_KEY_ALG_ASYM_PAIR, the contents are a key pair.
*/
if ((obj->keyType & VOLT_KEY_TYPE_ASYM_PAIR) != 0)
{
VOLT_SET_FNCT_LINE (fnctLine)
theKeyPair = (VoltDHKeyPair *)(obj->keyData);
if (theKeyPair->priKey == (VtKeyObject)0)
break;
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = VtGetKeyParam (
theKeyPair->priKey, VtKeyParamDHPrivate, getInfo);
break;
}
/* It's not a key pair. If it's not private, we can't work with it.
*/
VOLT_SET_FNCT_LINE (fnctLine)
if ((obj->keyType & VOLT_KEY_TYPE_PRIVATE) == 0)
break;
/* Is the key in data form?
*/
if ((obj->keyType & VOLT_KEY_TYPE_MASK_DATA) != VOLT_KEY_TYPE_DATA)
{
/* The data is not available, does the object have a GetData
* function?
*/
VOLT_SET_FNCT_LINE (fnctLine)
*getInfo = (Pointer)0;
if (obj->GetKeyData == (VGetKeyData)0)
break;
/* Call the Get function.
*/
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = obj->GetKeyData ((VtKeyObject)obj, getInfo);
break;
}
/* Do we have the data in the appropriate format already?
*/
status = 0;
priKey = (VoltDHPrivateKey *)(obj->keyData);
*getInfo = (Pointer)(priKey->keyItems);
if (priKey->keyItems != (VtDHPriKeyInfo *)0)
break;
/* Call the routine that builds the VtDHPriKeyInfo struct.
* This routine actually will return BufferTooSmall and set
* bufferSize to the space needed. We'll allocate the space and
* call it again.
*/
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
bufferSize = 0;
status = BuildPriKeyInfo (obj, priKey, buffer, &bufferSize);
if (status == 0)
status = VT_ERROR_INVALID_KEY_OBJ;
if (status != VT_ERROR_BUFFER_TOO_SMALL)
break;
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);
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = BuildPriKeyInfo (obj, priKey, buffer, &bufferSize);
if (status != 0)
break;
priKey->keyItems = (VtDHPriKeyInfo *)buffer;
*getInfo = (Pointer)buffer;
} while (0);
/* If no error, we're done.
*/
if (status == 0)
return (0);
/* If there was an error, free memory we allocated.
*/
if (buffer != (unsigned char *)0)
Z2Free (buffer);
VOLT_LOG_ERROR_INFO (
0, object, status, 0, errorType,
(char *)0, "VoltKeyGetDHPrivate", fnctLine, (char *)0)
return (status);
}
static int SetObjectDHPublic (
VoltKeyObject *obj,
VtDHPubKeyInfo *keyInfo
)
{
int status;
VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
VoltMpIntCtx *mpCtx = obj->mpCtx;
VoltDHPublicKey *pubKeyData = (VoltDHPublicKey *)0;
VOLT_DECLARE_ERROR_TYPE (errorType)
VOLT_DECLARE_FNCT_LINE (fnctLine)
do
{
/* Allocate the VoltDHPublicKey.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_MEMORY;
pubKeyData = (VoltDHPublicKey *)Z2Malloc (sizeof (VoltDHPublicKey), 0);
if (pubKeyData == (VoltDHPublicKey *)0)
break;
Z2Memset (pubKeyData, 0, sizeof (VoltDHPublicKey));
pubKeyData->type = VOLT_KEY_TYPE_PUBLIC;
/* This will hold the actual key data.
*/
obj->voltObject.CloneObject = VoltCloneDHPubKey;
obj->keyData = (Pointer)pubKeyData;
obj->KeyDataDestroy = DHKeyDataDestroy;
obj->keyType =
VOLT_KEY_ALG_DH | VOLT_KEY_TYPE_PUBLIC | VOLT_KEY_TYPE_AGREE |
VOLT_KEY_TYPE_DATA;
/* Build MpInt's of the data.
*/
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(pubKeyData->primeP));
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->OctetStringToMpInt (
0, keyInfo->primeP.data, keyInfo->primeP.len, pubKeyData->primeP);
if (status != 0)
break;
if (keyInfo->subprimeQ.data != (unsigned char *)0)
{
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(pubKeyData->subprimeQ));
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->OctetStringToMpInt (
0, keyInfo->subprimeQ.data, keyInfo->subprimeQ.len,
pubKeyData->subprimeQ);
if (status != 0)
break;
}
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(pubKeyData->baseG));
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->OctetStringToMpInt (
0, keyInfo->baseG.data, keyInfo->baseG.len, pubKeyData->baseG);
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(pubKeyData->pubValY));
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->OctetStringToMpInt (
0, keyInfo->pubValY.data, keyInfo->pubValY.len, pubKeyData->pubValY);
if (status != 0)
break;
} while (0);
if (status == 0)
return (0);
obj->keyType = 0;
VOLT_LOG_ERROR_INFO (
0, obj, status, 0, errorType,
(char *)0, "SetObjectDHPublic", fnctLine, (char *)0)
return (status);
}
static int SetObjectDHPrivate (
VoltKeyObject *obj,
VtDHPriKeyInfo *keyInfo
)
{
int status;
VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
VoltMpIntCtx *mpCtx = obj->mpCtx;
VoltDHPrivateKey *priKeyData = (VoltDHPrivateKey *)0;
VOLT_DECLARE_ERROR_TYPE (errorType)
VOLT_DECLARE_FNCT_LINE (fnctLine)
do
{
/* Allocate the VoltDHPublicKey.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_MEMORY;
priKeyData = (VoltDHPrivateKey *)Z2Malloc (sizeof (VoltDHPrivateKey), 0);
if (priKeyData == (VoltDHPrivateKey *)0)
break;
Z2Memset (priKeyData, 0, sizeof (VoltDHPrivateKey));
priKeyData->type = VOLT_KEY_TYPE_PRIVATE;
/* This will hold the actual key data.
*/
obj->voltObject.CloneObject = VoltCloneDHPriKey;
obj->keyData = (Pointer)priKeyData;
obj->KeyDataDestroy = DHKeyDataDestroy;
obj->keyType =
VOLT_KEY_ALG_DH | VOLT_KEY_TYPE_PRIVATE | VOLT_KEY_TYPE_AGREE |
VOLT_KEY_TYPE_DATA;
/* Build MpInt's of the data.
*/
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(priKeyData->primeP));
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->OctetStringToMpInt (
0, keyInfo->primeP.data, keyInfo->primeP.len, priKeyData->primeP);
if (status != 0)
break;
if (keyInfo->subprimeQ.data != (unsigned char *)0)
{
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(priKeyData->subprimeQ));
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->OctetStringToMpInt (
0, keyInfo->subprimeQ.data, keyInfo->subprimeQ.len,
priKeyData->subprimeQ);
if (status != 0)
break;
}
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(priKeyData->baseG));
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->OctetStringToMpInt (
0, keyInfo->baseG.data, keyInfo->baseG.len, priKeyData->baseG);
if (status != 0)
break;
if ( (keyInfo->pubValY.data != (unsigned char *)0) &&
(keyInfo->pubValY.len != 0) )
{
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(priKeyData->pubValY));
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->OctetStringToMpInt (
0, keyInfo->pubValY.data, keyInfo->pubValY.len, priKeyData->pubValY);
if (status != 0)
break;
}
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(priKeyData->priValX));
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->OctetStringToMpInt (
0, keyInfo->priValX.data, keyInfo->priValX.len, priKeyData->priValX);
if (status != 0)
break;
} while (0);
if (status == 0)
return (0);
obj->keyType = 0;
VOLT_LOG_ERROR_INFO (
0, obj, status, 0, errorType,
(char *)0, "SetObjectDHPrivate", fnctLine, (char *)0)
return (status);
}
static int BuildPubKeyInfo (
VoltKeyObject *obj,
VoltDHPublicKey *pubKey,
unsigned char *buffer,
unsigned int *bufferSize
)
{
int status;
unsigned int totalSize, spaceAvailable;
unsigned int sign, pLen, qLen, gLen, pubValYLen;
VoltMpIntCtx *mpCtx = obj->mpCtx;
VtDHPubKeyInfo *keyInfo = (VtDHPubKeyInfo *)buffer;
unsigned char *currentBuf;
VOLT_DECLARE_FNCT_LINE (fnctLine)
/* spaceAvailable is how much space is currently available.
*/
spaceAvailable = 0;
totalSize = sizeof (VtDHPubKeyInfo);
if (*bufferSize > sizeof (VtDHPubKeyInfo))
spaceAvailable = *bufferSize - sizeof (VtDHPubKeyInfo);
do
{
currentBuf = (unsigned char *)0;
if (spaceAvailable != 0)
currentBuf = (buffer + sizeof (VtDHPubKeyInfo));
/* Try to get the prime.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToOctetString (
pubKey->primeP, &sign, currentBuf, spaceAvailable, &pLen);
if (status == 0)
{
keyInfo->primeP.data = currentBuf;
keyInfo->primeP.len = pLen;
currentBuf += pLen;
spaceAvailable -= pLen;
}
else
{
/* If not 0, then status should be BufferTooSmall.
*/
if (status != VT_ERROR_BUFFER_TOO_SMALL)
break;
spaceAvailable = 0;
}
totalSize += pLen;
/* Try to get the subprime.
*/
if (pubKey->subprimeQ != (VoltMpInt *)0)
{
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToOctetString (
pubKey->subprimeQ, &sign, currentBuf, spaceAvailable, &qLen);
if (status == 0)
{
keyInfo->subprimeQ.data = currentBuf;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -