windows-nt/Source/XPSP1/NT/ds/security/inc/ossutil.h
2020-09-26 16:20:57 +08:00

387 lines
11 KiB
C

//+-------------------------------------------------------------------------
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: ossutil.h
//
// Contents: OSS ASN.1 compiler utility functions.
//
// APIs:
// OssUtilAlloc
// OssUtilFree
// OssUtilReverseBytes
// OssUtilAllocAndReverseBytes
// OssUtilGetOctetString
// OssUtilSetHugeInteger
// OssUtilFreeHugeInteger
// OssUtilGetHugeInteger
// OssUtilSetHugeUINT
// OssUtilFreeHugeUINT
// OssUtilGetHugeUINT
// OssUtilSetBitString
// OssUtilSetBitStringWithoutTrailingZeroes
// OssUtilGetBitString
// OssUtilGetIA5String
// OssUtilSetUnicodeConvertedToIA5String
// OssUtilFreeUnicodeConvertedToIA5String
// OssUtilGetIA5StringConvertedToUnicode
// OssUtilGetBMPString
// OssUtilSetAny
// OssUtilGetAny
// OssUtilEncodeInfo
// OssUtilDecodeAndAllocInfo
// OssUtilFreeInfo
// OssUtilEncodeInfoEx
// OssUtilDecodeAndAllocInfo
// OssUtilAllocStructInfoEx
// OssUtilDecodeAndAllocInfoEx
//
// History: 17-Nov-96 philh created
//--------------------------------------------------------------------------
#ifndef __OSSUTIL_H__
#define __OSSUTIL_H__
#include <wincrypt.h>
#include <pkialloc.h>
#include "asn1hdr.h"
#include "ossglobl.h"
#ifdef __cplusplus
extern "C" {
#endif
//+-------------------------------------------------------------------------
// OssUtil allocation and free functions
//--------------------------------------------------------------------------
#define OssUtilAlloc PkiNonzeroAlloc
#define OssUtilFree PkiFree
//+-------------------------------------------------------------------------
// Reverses a buffer of bytes in place
//--------------------------------------------------------------------------
void
WINAPI
OssUtilReverseBytes(
IN OUT PBYTE pbIn,
IN DWORD cbIn
);
//+-------------------------------------------------------------------------
// Reverses a buffer of bytes to a new buffer. OssUtilFree() must be
// called to free allocated bytes.
//--------------------------------------------------------------------------
PBYTE
WINAPI
OssUtilAllocAndReverseBytes(
IN PBYTE pbIn,
IN DWORD cbIn
);
//+-------------------------------------------------------------------------
// Get Octet String
//--------------------------------------------------------------------------
void
WINAPI
OssUtilGetOctetString(
IN unsigned int OssLength,
IN unsigned char *OssValue,
IN DWORD dwFlags,
OUT PCRYPT_DATA_BLOB pInfo,
IN OUT BYTE **ppbExtra,
IN OUT LONG *plRemainExtra
);
//+-------------------------------------------------------------------------
// Set/Free/Get HugeInteger
//
// BYTE reversal::
// - this only needs to be done for little endian processors
//
// OssUtilFreeHugeInteger must be called to free the allocated OssValue.
//--------------------------------------------------------------------------
BOOL
WINAPI
OssUtilSetHugeInteger(
IN PCRYPT_INTEGER_BLOB pInfo,
OUT unsigned int *pOssLength,
OUT unsigned char **ppOssValue
);
void
WINAPI
OssUtilFreeHugeInteger(
IN unsigned char *pOssValue
);
void
WINAPI
OssUtilGetHugeInteger(
IN unsigned int OssLength,
IN unsigned char *pOssValue,
IN DWORD dwFlags,
OUT PCRYPT_INTEGER_BLOB pInfo,
IN OUT BYTE **ppbExtra,
IN OUT LONG *plRemainExtra
);
//+-------------------------------------------------------------------------
// Set/Free/Get Huge Unsigned Integer
//
// Set inserts a leading 0x00 before reversing.
// Get removes a leading 0x00 if present, after reversing.
//
// OssUtilFreeHugeUINT must be called to free the allocated OssValue.
//--------------------------------------------------------------------------
BOOL
WINAPI
OssUtilSetHugeUINT(
IN PCRYPT_UINT_BLOB pInfo,
OUT unsigned int *pOssLength,
OUT unsigned char **ppOssValue
);
#define OssUtilFreeHugeUINT OssUtilFreeHugeInteger
void
WINAPI
OssUtilGetHugeUINT(
IN unsigned int OssLength,
IN unsigned char *pOssValue,
IN DWORD dwFlags,
OUT PCRYPT_UINT_BLOB pInfo,
IN OUT BYTE **ppbExtra,
IN OUT LONG *plRemainExtra
);
//+-------------------------------------------------------------------------
// Set/Get BitString
//--------------------------------------------------------------------------
void
WINAPI
OssUtilSetBitString(
IN PCRYPT_BIT_BLOB pInfo,
OUT unsigned int *pOssBitLength,
OUT unsigned char **ppOssValue
);
void
WINAPI
OssUtilGetBitString(
IN unsigned int OssBitLength,
IN unsigned char *pOssValue,
IN DWORD dwFlags,
OUT PCRYPT_BIT_BLOB pInfo,
IN OUT BYTE **ppbExtra,
IN OUT LONG *plRemainExtra
);
//+-------------------------------------------------------------------------
// Set BitString Without Trailing Zeroes
//--------------------------------------------------------------------------
void
WINAPI
OssUtilSetBitStringWithoutTrailingZeroes(
IN PCRYPT_BIT_BLOB pInfo,
OUT unsigned int *pOssBitLength,
OUT unsigned char **ppOssValue
);
//+-------------------------------------------------------------------------
// Get IA5 String
//--------------------------------------------------------------------------
void
WINAPI
OssUtilGetIA5String(
IN unsigned int OssLength,
IN char *pOssValue,
IN DWORD dwFlags,
OUT LPSTR *ppsz,
IN OUT BYTE **ppbExtra,
IN OUT LONG *plRemainExtra
);
//+-------------------------------------------------------------------------
// Set/Free/Get Unicode mapped to IA5 String
//--------------------------------------------------------------------------
BOOL
WINAPI
OssUtilSetUnicodeConvertedToIA5String(
IN LPWSTR pwsz,
OUT unsigned int *pOssLength,
OUT char **ppOssValue
);
void
WINAPI
OssUtilFreeUnicodeConvertedToIA5String(
IN char *pOssValue
);
void
WINAPI
OssUtilGetIA5StringConvertedToUnicode(
IN unsigned int OssLength,
IN char *pOssValue,
IN DWORD dwFlags,
OUT LPWSTR *ppwsz,
IN OUT BYTE **ppbExtra,
IN OUT LONG *plRemainExtra
);
//+-------------------------------------------------------------------------
// Get BMP String
//--------------------------------------------------------------------------
void
WINAPI
OssUtilGetBMPString(
IN unsigned int OssLength,
IN unsigned short *pOssValue,
IN DWORD dwFlags,
OUT LPWSTR *ppwsz,
IN OUT BYTE **ppbExtra,
IN OUT LONG *plRemainExtra
);
//+-------------------------------------------------------------------------
// Set/Get "Any" DER BLOB
//--------------------------------------------------------------------------
void
WINAPI
OssUtilSetAny(
IN PCRYPT_OBJID_BLOB pInfo,
OUT OpenType *pOss
);
void
WINAPI
OssUtilGetAny(
IN OpenType *pOss,
IN DWORD dwFlags,
OUT PCRYPT_OBJID_BLOB pInfo,
IN OUT BYTE **ppbExtra,
IN OUT LONG *plRemainExtra
);
//+-------------------------------------------------------------------------
// Encode an OSS formatted info structure
//--------------------------------------------------------------------------
BOOL
WINAPI
OssUtilEncodeInfo(
IN OssGlobal *Pog,
IN int pdunum,
IN void *pvOssInfo,
OUT OPTIONAL BYTE *pbEncoded,
IN OUT DWORD *pcbEncoded
);
//+-------------------------------------------------------------------------
// Decode into an allocated, OSS formatted info structure
//--------------------------------------------------------------------------
BOOL
WINAPI
OssUtilDecodeAndAllocInfo(
IN OssGlobal *Pog,
IN int pdunum,
IN const BYTE *pbEncoded,
IN DWORD cbEncoded,
OUT void **ppvOssInfo
);
//+-------------------------------------------------------------------------
// Free an allocated, OSS formatted info structure
//--------------------------------------------------------------------------
void
WINAPI
OssUtilFreeInfo(
IN OssGlobal *Pog,
IN int pdunum,
IN void *pvOssInfo
);
//+-------------------------------------------------------------------------
// Encode an OSS formatted info structure.
//
// If CRYPT_ENCODE_ALLOC_FLAG is set, allocate memory for pbEncoded and
// return *((BYTE **) pvEncoded) = pbAllocEncoded. Otherwise,
// pvEncoded points to byte array to be updated.
//--------------------------------------------------------------------------
BOOL
WINAPI
OssUtilEncodeInfoEx(
IN OssGlobal *Pog,
IN int pdunum,
IN void *pvOssInfo,
IN DWORD dwFlags,
IN OPTIONAL PCRYPT_ENCODE_PARA pEncodePara,
OUT OPTIONAL void *pvEncoded,
IN OUT DWORD *pcbEncoded
);
typedef BOOL (WINAPI *PFN_OSS_UTIL_DECODE_EX_CALLBACK)(
IN void *pvOssInfo,
IN DWORD dwFlags,
IN OPTIONAL PCRYPT_DECODE_PARA pDecodePara,
OUT OPTIONAL void *pvStructInfo,
IN OUT LONG *plRemainExtra
);
//+-------------------------------------------------------------------------
// Call the callback to convert the OSS structure into the 'C' structure.
// If CRYPT_DECODE_ALLOC_FLAG is set allocate memory for the 'C'
// structure and call the callback initially to get the length and then
// a second time to update the allocated 'C' structure.
//
// Allocated structure is returned:
// *((void **) pvStructInfo) = pvAllocStructInfo
//--------------------------------------------------------------------------
BOOL
WINAPI
OssUtilAllocStructInfoEx(
IN void *pvOssInfo,
IN DWORD dwFlags,
IN OPTIONAL PCRYPT_DECODE_PARA pDecodePara,
IN PFN_OSS_UTIL_DECODE_EX_CALLBACK pfnDecodeExCallback,
OUT OPTIONAL void *pvStructInfo,
IN OUT DWORD *pcbStructInfo
);
//+-------------------------------------------------------------------------
// Decode the OSS formatted info structure and call the callback
// function to convert the OSS structure to the 'C' structure.
//
// If CRYPT_DECODE_ALLOC_FLAG is set allocate memory for the 'C'
// structure and call the callback initially to get the length and then
// a second time to update the allocated 'C' structure.
//
// Allocated structure is returned:
// *((void **) pvStructInfo) = pvAllocStructInfo
//--------------------------------------------------------------------------
BOOL
WINAPI
OssUtilDecodeAndAllocInfoEx(
IN OssGlobal *Pog,
IN int pdunum,
IN const BYTE *pbEncoded,
IN DWORD cbEncoded,
IN DWORD dwFlags,
IN OPTIONAL PCRYPT_DECODE_PARA pDecodePara,
IN PFN_OSS_UTIL_DECODE_EX_CALLBACK pfnDecodeExCallback,
OUT OPTIONAL void *pvStructInfo,
IN OUT DWORD *pcbStructInfo
);
#ifdef __cplusplus
} // Balance extern "C" above
#endif
#endif