📄 sha1algid.c
字号:
/* Copyright 2003-2006, Voltage Security, all rights reserved.
*/
#include "vibe.h"
#include "environment.h"
#include "base.h"
#include "libctx.h"
#include "algobj.h"
#include "oidlist.h"
#include "algid.h"
#include "errorctx.h"
int VtDerCoderSHA1 (
VtDerCoderInfo *coderInfo,
Pointer object,
unsigned int flag
)
{
int status;
unsigned int bufferSize;
VoltAlgorithmObject **obj = (VoltAlgorithmObject **) 0;
VoltDerCoderEncodeData *encodeData = &(coderInfo->info.encodeData);
VoltDerCoderGetAlgData *getAlgData = &(coderInfo->info.getAlgData);
VoltDerCoderDecodeData *decodeData = &(coderInfo->info.decodeData);
Asn1AlgorithmId *algId;
VoltLibCtx *libCtx;
unsigned char sha1AlgID[VoltSHA1AlgIdBytesLen] = { VoltSHA1AlgIdBytes };
VOLT_DECLARE_ERROR_TYPE (errorType)
VOLT_DECLARE_FNCT_LINE (fnctLine)
switch (flag)
{
default:
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_TYPE;
break;
case VOLT_DER_TYPE_ENCODE_FLAG:
/* If the flag is ENCODE, return the SHA-1 algID.
*/
/* Check the args.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_NON_NULL_ARG;
if (object != (Pointer)0)
break;
/* The SHA-1 info should be NULL.
*/
VOLT_SET_FNCT_LINE (fnctLine)
if (encodeData->info != (Pointer)0)
break;
/* We need a place to drop the length.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_NULL_ARG;
if (encodeData->encodingLen == (unsigned int *)0)
break;
bufferSize = encodeData->bufferSize;
if (encodeData->encoding == (unsigned char *)0)
bufferSize = 0;
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_BUFFER_TOO_SMALL;
*(encodeData->encodingLen) = VoltSHA1AlgIdBytesLen;
if (bufferSize < VoltSHA1AlgIdBytesLen)
break;
/* There's only one possible SHA-1 alg ID.
*/
libCtx = encodeData->libCtx;
Z2Memcpy (encodeData->encoding, sha1AlgID, VoltSHA1AlgIdBytesLen);
status = 0;
break;
case VOLT_DER_TYPE_DECODE_FLAG:
/* If the flag is decode, set the object to perform SHA-1.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_NULL_ARG;
if (object == (Pointer)0)
break;
obj = (VoltAlgorithmObject **) object;
/* Check the args, the info should be a pointer to a
* VoltDerCoderDecodeData struct, with the type
* VOLT_DER_TYPE_ALG_ID_FLAG.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_UNKNOWN_BER;
if (decodeData->type != VOLT_DER_TYPE_ALG_ID_FLAG)
break;
/* Make sure this is the algId for SHA-1.
*/
VOLT_SET_FNCT_LINE (fnctLine)
algId = (Asn1AlgorithmId *)(decodeData->asn1Object);
if (algId->oid->base.length != VoltSHA1OidBytesLen)
break;
libCtx = (VoltLibCtx *)((*obj)->voltObject.libraryCtx);
VOLT_SET_FNCT_LINE (fnctLine)
if (Z2Memcmp (
algId->oid->base.data, sha1AlgID + VoltSHA1AlgIdOidOffset,
VoltSHA1OidBytesLen) != 0)
break;
VtDestroyAlgorithmObject ((VtAlgorithmObject *)object);
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = VtCreateAlgorithmObject (
libCtx, VtAlgorithmImplSHA1, (Pointer)0,
(VtAlgorithmObject *)object);
break;
case VOLT_DER_TYPE_GET_ALG_FLAG:
/* If the flag is get alg, check the input to see if it's the
* SHA-1 OID.
*/
/* Check the args.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_NON_NULL_ARG;
if (object != (Pointer)0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_NULL_ARG;
if ( (getAlgData->algorithm == (unsigned int *)0) ||
(getAlgData->oid == (unsigned char *)0) )
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_UNKNOWN_BER;
if (getAlgData->oidLen != VoltSHA1OidBytesLen)
break;
libCtx = getAlgData->libCtx;
VOLT_SET_FNCT_LINE (fnctLine)
if (Z2Memcmp (
getAlgData->oid, sha1AlgID + VoltSHA1AlgIdOidOffset,
VoltSHA1OidBytesLen) != 0)
break;
/* The OID matches, the algorithm is SHA-1.
*/
*(getAlgData->algorithm) = VT_ALG_ID_SHA1;
getAlgData->SymKeyParam = (VtKeyParam *)0;
getAlgData->DigestImpl = VtAlgorithmImplSHA1;
status = 0;
}
VOLT_LOG_ERROR_INFO_COMPARE (
status, 0, object, status, 0, errorType,
(char *)0, "VtDerCoderSHA1", fnctLine, (char *)0)
return (status);
}
int VtDerCoderHMACwSHA1 (
VtDerCoderInfo *coderInfo,
Pointer object,
unsigned int flag
)
{
int status;
unsigned int bufferSize;
VoltAlgorithmObject **obj = (VoltAlgorithmObject **) 0;
VoltDerCoderEncodeData *encodeData = &(coderInfo->info.encodeData);
VoltDerCoderGetAlgData *getAlgData = &(coderInfo->info.getAlgData);
VoltDerCoderDecodeData *decodeData = &(coderInfo->info.decodeData);
Asn1AlgorithmId *algId;
VoltLibCtx *libCtx;
VtHMACInfo hmacInfo;
unsigned char hmacSha1AlgID[VoltHMACSHA1AlgIdBytesLen] = { VoltHMACSHA1AlgIdBytes };
VOLT_DECLARE_ERROR_TYPE (errorType)
VOLT_DECLARE_FNCT_LINE (fnctLine)
switch (flag)
{
default:
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_TYPE;
break;
case VOLT_DER_TYPE_ENCODE_FLAG:
/* If the flag is ENCODE, return the SHA-1 algID.
*/
/* Check the args.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_NON_NULL_ARG;
if (object != (Pointer)0)
break;
/* The SHA-1 info should be NULL.
*/
VOLT_SET_FNCT_LINE (fnctLine)
if (encodeData->info != (Pointer)0)
break;
/* We need a place to drop the length.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_NULL_ARG;
if (encodeData->encodingLen == (unsigned int *)0)
break;
bufferSize = encodeData->bufferSize;
if (encodeData->encoding == (unsigned char *)0)
bufferSize = 0;
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_BUFFER_TOO_SMALL;
*(encodeData->encodingLen) = VoltHMACSHA1AlgIdBytesLen;
if (bufferSize < VoltHMACSHA1AlgIdBytesLen)
break;
/* There's only one possible SHA-1 alg ID.
*/
libCtx = encodeData->libCtx;
Z2Memcpy (
encodeData->encoding, hmacSha1AlgID, VoltHMACSHA1AlgIdBytesLen);
status = 0;
break;
case VOLT_DER_TYPE_DECODE_FLAG:
/* If the flag is decode, set the object to perform SHA-1.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_NULL_ARG;
if (object == (Pointer)0)
break;
obj = (VoltAlgorithmObject **) object;
/* Check the args, the info should be a pointer to a
* VoltDerCoderDecodeData struct, with the type
* VOLT_DER_TYPE_ALG_ID_FLAG.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_UNKNOWN_BER;
if (decodeData->type != VOLT_DER_TYPE_ALG_ID_FLAG)
break;
/* Make sure this is the algId for HMAC-SHA-1.
*/
VOLT_SET_FNCT_LINE (fnctLine)
algId = (Asn1AlgorithmId *)(decodeData->asn1Object);
if (algId->oid->base.length != VoltHMACSHA1OidBytesLen)
break;
VOLT_SET_FNCT_LINE (fnctLine)
libCtx = (VoltLibCtx *)((*obj)->voltObject.libraryCtx);
if (Z2Memcmp (
algId->oid->base.data, hmacSha1AlgID + VoltHMACSHA1AlgIdOidOffset,
VoltHMACSHA1OidBytesLen) != 0)
break;
VtDestroyAlgorithmObject ((VtAlgorithmObject *)object);
hmacInfo.digestImpl = VtAlgorithmImplSHA1;
hmacInfo.digestImplInfo = (Pointer)0;
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = VtCreateAlgorithmObject (
libCtx, VtAlgorithmImplHMAC, (Pointer)&hmacInfo,
(VtAlgorithmObject *)object);
break;
case VOLT_DER_TYPE_GET_ALG_FLAG:
/* If the flag is get alg, check the input to see if it's the
* HMAC-SHA-1 OID.
*/
/* Check the args.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_NON_NULL_ARG;
if (object != (Pointer)0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_NULL_ARG;
if ( (getAlgData->algorithm == (unsigned int *)0) ||
(getAlgData->oid == (unsigned char *)0) )
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_UNKNOWN_BER;
if (getAlgData->oidLen != VoltHMACSHA1OidBytesLen)
break;
VOLT_SET_FNCT_LINE (fnctLine)
libCtx = getAlgData->libCtx;
if (Z2Memcmp (
getAlgData->oid, hmacSha1AlgID + VoltHMACSHA1AlgIdOidOffset,
VoltHMACSHA1OidBytesLen) != 0)
break;
/* The OID matches, the algorithm is HMAC-SHA-1.
*/
*(getAlgData->algorithm) = VT_ALG_ID_HMAC_SHA1;
getAlgData->SymKeyParam = (VtKeyParam *)0;
getAlgData->DigestImpl = VtAlgorithmImplSHA1;
status = 0;
}
VOLT_LOG_ERROR_INFO_COMPARE (
status, 0, object, status, 0, errorType,
(char *)0, "VtDerCoderHMACwSHA1", fnctLine, (char *)0)
return (status);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -