📄 dsakeytype.c
字号:
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_GET_INFO_UNAVAILABLE;
if (obj->keyData == (Pointer)0)
break;
/* Is the algorithm DSA?
*/
VOLT_SET_FNCT_LINE (fnctLine)
if ((obj->keyType & VOLT_KEY_TYPE_MASK_ASYM_ALG) != VOLT_KEY_ALG_DSA)
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 = (VoltDsaKeyPair *)(obj->keyData);
if (theKeyPair->priKey == (VtKeyObject)0)
break;
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = VtGetKeyParam (
theKeyPair->priKey, VtKeyParamDSAPrivate, 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 = (VoltDsaPrivateKey *)(obj->keyData);
*getInfo = (Pointer)(priKey->keyItems);
if (priKey->keyItems != (VtDSAPriKeyInfo *)0)
break;
/* Call the routine that builds the VtDSAPriKeyInfo 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 = (VtDSAPriKeyInfo *)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 (
libCtx, status, errorType, fnctLine, "VoltKeyGetDsaPrivate", (char *)0)
return (status);
}
static int SetObjectDSAPublic (
VoltKeyObject *obj,
VtDSAPubKeyInfo *keyInfo
)
{
int status;
VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
VoltMpIntCtx *mpCtx = obj->mpCtx;
VoltDsaPublicKey *pubKeyData = (VoltDsaPublicKey *)0;
VOLT_DECLARE_ERROR_TYPE (errorType)
VOLT_DECLARE_FNCT_LINE (fnctLine)
do
{
/* Allocate the VoltDsaPublicKey.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_MEMORY;
pubKeyData = (VoltDsaPublicKey *)Z2Malloc (sizeof (VoltDsaPublicKey), 0);
if (pubKeyData == (VoltDsaPublicKey *)0)
break;
Z2Memset (pubKeyData, 0, sizeof (VoltDsaPublicKey));
pubKeyData->type = VOLT_KEY_TYPE_PUBLIC;
/* This will hold the actual key data.
*/
obj->voltObject.CloneObject = VoltCloneDsaPubKey;
obj->keyData = (Pointer)pubKeyData;
obj->KeyDataDestroy = DSAKeyDataDestroy;
obj->keyType =
VOLT_KEY_ALG_DSA | VOLT_KEY_TYPE_PUBLIC | VOLT_KEY_TYPE_SIGN |
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;
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 (
libCtx, status, errorType, fnctLine, "SetObjectDSAPublic", (char *)0)
return (status);
}
static int SetObjectDSAPrivate (
VoltKeyObject *obj,
VtDSAPriKeyInfo *keyInfo
)
{
int status;
VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
VoltMpIntCtx *mpCtx = obj->mpCtx;
VoltDsaPrivateKey *priKeyData = (VoltDsaPrivateKey *)0;
VOLT_DECLARE_ERROR_TYPE (errorType)
VOLT_DECLARE_FNCT_LINE (fnctLine)
do
{
/* Allocate the VoltDsaPublicKey.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_MEMORY;
priKeyData = (VoltDsaPrivateKey *)Z2Malloc (sizeof (VoltDsaPrivateKey), 0);
if (priKeyData == (VoltDsaPrivateKey *)0)
break;
Z2Memset (priKeyData, 0, sizeof (VoltDsaPrivateKey));
priKeyData->type = VOLT_KEY_TYPE_PRIVATE;
/* This will hold the actual key data.
*/
obj->voltObject.CloneObject = VoltCloneDsaPriKey;
obj->keyData = (Pointer)priKeyData;
obj->KeyDataDestroy = DSAKeyDataDestroy;
obj->keyType =
VOLT_KEY_ALG_DSA | VOLT_KEY_TYPE_PRIVATE | VOLT_KEY_TYPE_SIGN |
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;
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 (
libCtx, status, errorType, fnctLine, "SetObjectDSAPrivate", (char *)0)
return (status);
}
static int SetObjectDSAPubFromPrivate (
VoltLibCtx *libCtx,
VoltMpIntCtx *mpCtx,
VoltDsaPrivateKey *priKey
)
{
int status;
unsigned int sign, priValXLen, pubValYLen;
unsigned int baseLen, primeLen, subprimeLen;
unsigned char *priValX = (unsigned char *)0;
unsigned char *pubValY = (unsigned char *)0;
unsigned char *baseG = (unsigned char *)0;
unsigned char *primeP = (unsigned char *)0;
unsigned char *subprimeQ = (unsigned char *)0;
VtDSAPriKeyInfo keyInfo;
VOLT_DECLARE_ERROR_TYPE (errorType)
VOLT_DECLARE_FNCT_LINE (fnctLine)
do
{
/* First convert all MpInts to octet strings
*/
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToOctetString (
priKey->primeP, &sign, (unsigned char *)0, 0, &primeLen);
if (status != VT_ERROR_BUFFER_TOO_SMALL)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToOctetString (
priKey->subprimeQ, &sign, (unsigned char *)0, 0, &subprimeLen);
if (status != VT_ERROR_BUFFER_TOO_SMALL)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToOctetString (
priKey->baseG, &sign, (unsigned char *)0, 0, &baseLen);
if (status != VT_ERROR_BUFFER_TOO_SMALL)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToOctetString (
priKey->priValX, &sign, (unsigned char *)0, 0, &priValXLen);
if (status != VT_ERROR_BUFFER_TOO_SMALL)
break;
/* allocate memory to hold the octet strings
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_MEMORY;
primeP = (unsigned char *)Z2Malloc (primeLen, 0);
if (primeP == (unsigned char *)0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
subprimeQ = (unsigned char *)Z2Malloc (subprimeLen, 0);
if (subprimeQ == (unsigned char *)0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
baseG = (unsigned char *)Z2Malloc (baseLen, 0);
if (baseG == (unsigned char *)0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
priValX = (unsigned char *)Z2Malloc (priValXLen, 0);
if (priValX == (unsigned char *)0)
break;
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToOctetString (
priKey->primeP, &sign, primeP, primeLen, &primeLen);
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToOctetString (
priKey->subprimeQ, &sign, subprimeQ, subprimeLen, &subprimeLen);
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToOctetString (
priKey->baseG, &sign, baseG, baseLen, &baseLen);
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->MpIntToOctetString (
priKey->priValX, &sign, priValX, priValXLen, &priValXLen);
if (status != 0)
break;
keyInfo.primeP.data = primeP;
keyInfo.primeP.len = primeLen;
keyInfo.subprimeQ.data = subprimeQ;
keyInfo.subprimeQ.len = subprimeLen;
keyInfo.baseG.data = baseG;
keyInfo.baseG.len = baseLen;
keyInfo.priValX.data = priValX;
keyInfo.priValX.len = priValXLen;
VOLT_SET_FNCT_LINE (fnctLine)
status = VoltGeneratePubValAlloc (
libCtx, mpCtx, &(keyInfo.primeP), &(keyInfo.baseG),
keyInfo.priValX.data, VOLT_DSA_PRI_VAL_LEN,
&pubValY, &pubValYLen);
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->CreateMpInt ( (Pointer)mpCtx, &(priKey->pubValY) );
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = mpCtx->OctetStringToMpInt (
0, pubValY, pubValYLen, priKey->pubValY);
if (status != 0)
break;
} while (0);
/* free any memory we allocated
*/
if (primeP != (unsigned char *)0)
Z2Free (primeP);
if (subprimeQ != (unsigned char *)0)
Z2Free (subprimeQ);
if (baseG != (unsigned char *)0)
Z2Free (baseG);
if (priValX != (unsigned char *)0)
Z2Free (priValX);
if (pubValY != (unsigned char *)0)
Z2Free (pubValY);
if (status == 0)
return 0;
VOLT_LOG_ERROR (
libCtx, status, errorType, fnctLine,
"SetObjectDSAPubFromPrivate", (char *)0)
return status;
}
static int BuildPubKeyInfo (
VoltKeyObject *obj,
VoltDsaPublicKey *pubKey,
unsigned char *buffer,
unsigned int *bufferSize
)
{
int status;
unsigned int totalSize, spaceAvailable;
unsigned int sign, primePLen, subprimeQLen, baseGLen, pubValYLen;
VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
VoltMpIntCtx *mpCtx = obj->mpCtx;
VtDSAPubKeyInfo *keyInfo = (VtDSAPubKeyInfo *)buffer;
unsigned char *currentBuf;
VOLT_DECLARE_FNCT_LINE (fnctLine)
/* spaceAvailable is how much space is currently available.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -