windows-nt/Source/XPSP1/NT/printscan/fax/provider/t30/headers/lhutil.h
2020-09-26 16:20:57 +08:00

198 lines
5.8 KiB
C

/// hdrutil.h
// Macros and types to support encode/decode of linearized headers
#ifndef _LHUTIL_H
#define _LHUTIL_H
#ifdef __cplusplus
extern "C" {
#endif
#include <awrt.h>
#include <lineariz.h>
#include <sosmapi.h>
#include <awsec.h>
#include <lhprot.h>
///////////////////////////////////////////////////////////////////////////
/// Extern variables
///
// DEBUG
#ifdef DEBUG
extern DBGPARAM dpCurSettings;
#define ZONE_LINEARIZER (0x0001 & dpCurSettings.ulZoneMask)
#define ZONE_LIN_VERBOSE (0x0002 & dpCurSettings.ulZoneMask)
extern WORD wHashSize;
#endif
///////////////////////////////////////////////////////////////////////////
/// Errors
///
#ifndef NO_ERROR
# define NO_ERROR (0)
#endif
#define ERR_MEMORY_ERROR (1)
#define ERR_INVALID_OCTETS (2)
#define ERR_UNEXPECTED_OCTETS (3)
#define ERR_UNEXPECTED_LENGTH (4)
#define ERR_DATASTREAM_ERROR (5)
// Define this small because we only use it on the header !!
#define MAX_OCTETBLOCK_SIZE 256
///////////////////////////////////////////////////////////////////////////
/// Types
///
typedef unsigned char OCTET;
typedef DWORD OCTETSINK;
typedef DWORD OCTETSOURCE;
typedef DWORD OCTETFILE;
typedef struct _LININST {
DWORD octets; // Source/sink for linearized format. This
// is used to get at all the data.
DWORD dwGlobalError; // Error for this job
LPDATACB lpfnData; // Callback to read/write source/sink
DWORD dwHashInstance; // Hashing instance ...
BYTE rgb[MAX_OCTETBLOCK_SIZE]; // For decoding memory ...
} LININST, FAR *LPLININST, NEAR *NPLININST;
//------------------------------------------------------------------------
// This def relies on the fact that there is a variable called
// lininst in the calling function which pts to the instance
#define AllocLinMemMacro(lpRet, uSize) lpRet = lplinst->rgb;
// Nothing to do since its in the instance
#define FreeLinMemMacro(lpVal) (VOID)(0)
#define OctetInMacro(lplinst, pOctet) OctetDataMacro(GPM_GETDATA, lplinst, (LPBYTE)pOctet, 1)
#define OctetOutMacro(lplinst, Octet) \
{ \
OCTET oct = Octet; \
OctetDataMacro(GPM_PUTDATA, lplinst, (LPBYTE)&oct, 1); \
}
#define OctetBlockInMacro(lplinst, lpb, size) OctetDataMacro(GPM_GETDATA, lplinst, lpb, size)
#define OctetBlockOutMacro(lplinst, lpb, size) OctetDataMacro(GPM_PUTDATA, lplinst, lpb, size)
#define OctetDataMacro(gpm, lplinst, lpb, size) \
do { \
if ((*lplinst->lpfnData)(gpm, lplinst->octets, (LPBYTE)(lpb), size, NULL)!=size) \
{ \
DEBUGMSG(1, (THIS_FUNCTION ":Octet read/write Failed !!\r\n")); \
lplinst->dwGlobalError = ERR_DATASTREAM_ERROR; \
goto error; \
} \
/* Hash it if necessary */ \
if (lplinst->dwHashInstance) \
{ \
DEBUGSTMT(wHashSize+=size); \
DEBUGCHK(size <= 0xffff); \
SendBFTHash(lplinst->dwHashInstance, (LPBYTE)(lpb), (WORD)size); \
} \
} \
while (0)
/// Utility functions to encode / decode a header
#define WriteHdrOpen(lplinst) \
{ \
OctetOutMacro(lplinst, TAG_MESSAGE_HEADER); \
ASN1EncodeIndefiniteLengthMacro(lplinst); \
}
#define WriteHdrClose(lplinst) \
{ \
ASN1EncodeEndOfContentsOctetsMacro(lplinst); \
WriteHashMacro(lplinst); \
}
#define WriteOrigOpen(lplinst) \
OctetOutMacro (lplinst, TAG_FROM); \
ASN1EncodeIndefiniteLengthMacro(lplinst); \
OctetOutMacro (lplinst, TAG_RECIP_DESC); \
ASN1EncodeIndefiniteLengthMacro(lplinst);
#define WriteOrigClose(lplinst) \
ASN1EncodeEndOfContentsOctetsMacro(lplinst); \
ASN1EncodeEndOfContentsOctetsMacro(lplinst);
#define WriteRecipOpen(lplinst) \
OctetOutMacro (lplinst, TAG_TO); \
ASN1EncodeIndefiniteLengthMacro(lplinst); \
OctetOutMacro (lplinst, TAG_RECIP_DESC); \
ASN1EncodeIndefiniteLengthMacro(lplinst);
#define WriteRecipClose(lplinst) WriteOrigClose(lplinst)
#define WriteString(lplinst, tag, string) \
ASN1EncodePrimitiveStringImplicitMacro(lplinst, tag, string, lstrlen(string)+1)
// Hashing macros
#define StartHashMacro(lplinst) \
{ \
if (!(lplinst->dwHashInstance = StartBFTHash())) \
{ \
DEBUGMSG(1, (THIS_FUNCTION ":Error getting hash instance!\n\r")); \
lplinst->dwGlobalError = ERR_NOMEMORY; \
goto error; \
} \
DEBUGSTMT(wHashSize=0); \
}
#define WriteHashMacro(lplinst) \
{ \
BYTE bHash[16]; \
BYTE bSalt[3]; \
_fmemset(bHash, 0, sizeof(bHash)); \
_fmemset(bSalt, 0, sizeof(bSalt)); \
/* Complete the hash if we initialized it */ \
if (lplinst->dwHashInstance) \
{ \
DoneBFTHash(lplinst->dwHashInstance, bSalt, bHash); \
lplinst->dwHashInstance = 0; \
} \
OctetBlockOutMacro(lplinst, bSalt, sizeof(bSalt)); \
OctetBlockOutMacro(lplinst, bHash, sizeof(bHash)); \
DEBUGMSG(ZONE_LINEARIZER, ("Lhutil: Hdr Hash Size %u\r\n", wHashSize)); \
}
#define CheckHashMacro(lplinst) \
{ \
BYTE rgbMsgHash[19], rgbNewHash[16]; \
DWORD dwInstance = lplinst->dwHashInstance; \
/* Reset instance so we dont hash the msg hash */ \
lplinst->dwHashInstance = 0; \
OctetBlockInMacro(lplinst, rgbMsgHash, sizeof(rgbMsgHash)); \
/* Generate current hash using same salt */ \
DoneBFTHash(dwInstance, rgbMsgHash, rgbNewHash); \
/* Compare them */ \
if (! BinComp(sizeof(rgbNewHash), rgbMsgHash+3, \
sizeof(rgbNewHash), rgbNewHash) != 0) \
{ \
DEBUGMSG(1, ("ERROR: Hash Does not match !!!\n\r")); \
lplinst->dwGlobalError = ERR_GENERAL_FAILURE; \
goto error; \
} \
}
///////////////////////////////////////////////////////////////////////////
/// Internal funcion prototypes
///
BOOL __fastcall BinComp(DWORD cbA, PVOID lpA, DWORD cbB, PVOID lpB);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // hdrutil_inc