📄 md5algid.c
字号:
/* Copyright 2003-2005, 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"
int VtDerCoderMD5 (
VtDerCoderInfo *coderInfo,
Pointer object,
unsigned int flag
)
{
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 md5AlgID[VoltMD5AlgIdBytesLen] = { VoltMD5AlgIdBytes };
switch (flag)
{
default:
return (VT_ERROR_INVALID_TYPE);
case VOLT_DER_TYPE_ENCODE_FLAG:
/* If the flag is ENCODE, return the MD5 algID.
*/
/* Check the args.
*/
if (object != (Pointer)0)
return (VT_ERROR_NON_NULL_ARG);
/* The MD5 info should be NULL.
*/
if (encodeData->info != (Pointer)0)
return (VT_ERROR_NON_NULL_ARG);
/* We need a place to drop the length.
*/
if (encodeData->encodingLen == (unsigned int *)0)
return (VT_ERROR_NULL_ARG);
bufferSize = encodeData->bufferSize;
if (encodeData->encoding == (unsigned char *)0)
bufferSize = 0;
*(encodeData->encodingLen) = VoltMD5AlgIdBytesLen;
if (bufferSize < VoltMD5AlgIdBytesLen)
return (VT_ERROR_BUFFER_TOO_SMALL);
/* There's only one possible MD5 alg ID.
*/
libCtx = encodeData->libCtx;
Z2Memcpy (encodeData->encoding, md5AlgID, VoltMD5AlgIdBytesLen);
return (0);
case VOLT_DER_TYPE_DECODE_FLAG:
/* If the flag is decode, set the object to perform MD5.
*/
if(object == (Pointer) 0)
return VT_ERROR_NULL_ARG;
obj = (VoltAlgorithmObject **)object;
/* Check the args, the type should be VOLT_DER_TYPE_ALG_ID_FLAG.
*/
if (decodeData->type != VOLT_DER_TYPE_ALG_ID_FLAG)
return (VT_ERROR_UNKNOWN_BER);
/* Make sure this is the algId for MD5.
*/
algId = (Asn1AlgorithmId *)(decodeData->asn1Object);
if (algId->oid->base.length != VoltMD5OidBytesLen)
return (VT_ERROR_UNKNOWN_BER);
libCtx = (VoltLibCtx *)((*obj)->voltObject.libraryCtx);
if (Z2Memcmp (
algId->oid->base.data, md5AlgID + VoltMD5AlgIdOidOffset,
VoltMD5OidBytesLen) != 0)
return (VT_ERROR_UNKNOWN_BER);
VtDestroyAlgorithmObject ((VtAlgorithmObject *)object);
return (VtCreateAlgorithmObject (
libCtx, VtAlgorithmImplMD5, (Pointer)0,
(VtAlgorithmObject *)object));
case VOLT_DER_TYPE_GET_ALG_FLAG:
/* If the flag is get alg, check the input to see if it's the
* MD5 OID.
*/
/* Check the args.
*/
if (object != (Pointer)0)
return (VT_ERROR_NON_NULL_ARG);
/* The info should be a pointer to a VoltDerCoderEncodeData struct.
*/
if ( (getAlgData->algorithm == (unsigned int *)0) ||
(getAlgData->oid == (unsigned char *)0) )
return (VT_ERROR_NULL_ARG);
if (getAlgData->oidLen != VoltMD5OidBytesLen)
return (VT_ERROR_UNKNOWN_BER);
libCtx = getAlgData->libCtx;
if (Z2Memcmp (
getAlgData->oid, md5AlgID + VoltMD5AlgIdOidOffset,
VoltMD5OidBytesLen) != 0)
return (VT_ERROR_UNKNOWN_BER);
/* The OID matches, the algorithm is MD5.
*/
*(getAlgData->algorithm) = VT_ALG_ID_MD5;
getAlgData->SymKeyParam = (VtKeyParam *)0;
getAlgData->DigestImpl = VtAlgorithmImplMD5;
return (0);
}
}
int VtDerCoderHMACwMD5 (
VtDerCoderInfo *coderInfo,
Pointer object,
unsigned int flag
)
{
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 hmacMd5AlgID[VoltHMACMD5AlgIdBytesLen] = { VoltHMACMD5AlgIdBytes };
switch (flag)
{
default:
return (VT_ERROR_INVALID_TYPE);
case VOLT_DER_TYPE_ENCODE_FLAG:
/* If the flag is ENCODE, return the MD5 algID.
*/
/* Check the args.
*/
if (object != (Pointer)0)
return (VT_ERROR_NON_NULL_ARG);
/* The MD5 info should be NULL.
*/
if (encodeData->info != (Pointer)0)
return (VT_ERROR_NON_NULL_ARG);
/* We need a place to drop the length.
*/
if (encodeData->encodingLen == (unsigned int *)0)
return (VT_ERROR_NULL_ARG);
bufferSize = encodeData->bufferSize;
if (encodeData->encoding == (unsigned char *)0)
bufferSize = 0;
*(encodeData->encodingLen) = VoltHMACMD5AlgIdBytesLen;
if (bufferSize < VoltHMACMD5AlgIdBytesLen)
return (VT_ERROR_BUFFER_TOO_SMALL);
/* There's only one possible HMAC-MD5 alg ID.
*/
libCtx = encodeData->libCtx;
Z2Memcpy (encodeData->encoding, hmacMd5AlgID, VoltHMACMD5AlgIdBytesLen);
return (0);
case VOLT_DER_TYPE_DECODE_FLAG:
/* If the flag is decode, set the object to perform HMAC-MD5.
*/
if(object == (Pointer) 0)
return VT_ERROR_NULL_ARG;
obj = (VoltAlgorithmObject **)object;
/* Check the args, the type should be VOLT_DER_TYPE_ALG_ID_FLAG.
*/
if (decodeData->type != VOLT_DER_TYPE_ALG_ID_FLAG)
return (VT_ERROR_UNKNOWN_BER);
/* Make sure this is the algId for HMAC-MD5.
*/
algId = (Asn1AlgorithmId *)(decodeData->asn1Object);
if (algId->oid->base.length != VoltHMACMD5OidBytesLen)
return (VT_ERROR_UNKNOWN_BER);
libCtx = (VoltLibCtx *)((*obj)->voltObject.libraryCtx);
if (Z2Memcmp (
algId->oid->base.data, hmacMd5AlgID + VoltHMACMD5AlgIdOidOffset,
VoltHMACMD5OidBytesLen) != 0)
return (VT_ERROR_UNKNOWN_BER);
VtDestroyAlgorithmObject((VtAlgorithmObject *)object);
hmacInfo.digestImpl = VtAlgorithmImplMD5;
hmacInfo.digestImplInfo = (Pointer)0;
return VtCreateAlgorithmObject(
libCtx,
VtAlgorithmImplHMAC,
(Pointer)&hmacInfo,
(VtAlgorithmObject *)object);
case VOLT_DER_TYPE_GET_ALG_FLAG:
/* If the flag is get alg, check the input to see if it's the
* HMAC-MD5 OID.
*/
/* Check the args.
*/
if (object != (Pointer)0)
return (VT_ERROR_NON_NULL_ARG);
/* The info should be a pointer to a VoltDerCoderEncodeData struct.
*/
if ( (getAlgData->algorithm == (unsigned int *)0) ||
(getAlgData->oid == (unsigned char *)0) )
return (VT_ERROR_NULL_ARG);
if (getAlgData->oidLen != VoltHMACMD5OidBytesLen)
return (VT_ERROR_UNKNOWN_BER);
libCtx = getAlgData->libCtx;
if (Z2Memcmp (
getAlgData->oid, hmacMd5AlgID + VoltHMACMD5AlgIdOidOffset,
VoltHMACMD5OidBytesLen) != 0)
return (VT_ERROR_UNKNOWN_BER);
/* The OID matches, the algorithm is HMAC-MD5.
*/
*(getAlgData->algorithm) = VT_ALG_ID_HMAC_MD5;
getAlgData->SymKeyParam = (VtKeyParam *)0;
getAlgData->DigestImpl = VtAlgorithmImplMD5;
return (0);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -