178 lines
4.5 KiB
C++
178 lines
4.5 KiB
C++
//+-------------------------------------------------------------------------
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1995 - 1999
|
|
//
|
|
// File: pkioss.cpp
|
|
//
|
|
// Contents: PKI OSS support functions.
|
|
//
|
|
// Functions: PkiOssEncode
|
|
// PkiOssEncode2
|
|
// PkiAsn1Decode
|
|
// PkiAsn1Decode2
|
|
//
|
|
// History: 23-Oct-98 philh created
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include "global.hxx"
|
|
#include <msasn1.h>
|
|
#include <dbgdef.h>
|
|
|
|
//+-------------------------------------------------------------------------
|
|
// OSS Encode function. The encoded output is allocated and must be freed
|
|
// by calling ossFreeBuf
|
|
//--------------------------------------------------------------------------
|
|
int
|
|
WINAPI
|
|
PkiOssEncode(
|
|
IN OssGlobal *Pog,
|
|
IN void *pvOssInfo,
|
|
IN int id,
|
|
OUT BYTE **ppbEncoded,
|
|
OUT DWORD *pcbEncoded
|
|
)
|
|
{
|
|
int iStatus;
|
|
OssBuf ossBuf;
|
|
|
|
ossBuf.length = 0;
|
|
ossBuf.value = NULL;
|
|
iStatus = ossEncode(Pog, id, pvOssInfo, &ossBuf);
|
|
|
|
if (0 == iStatus) {
|
|
*ppbEncoded = ossBuf.value;
|
|
*pcbEncoded = ossBuf.length;
|
|
} else {
|
|
*ppbEncoded = NULL;
|
|
*pcbEncoded = 0;
|
|
}
|
|
|
|
return iStatus;
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
// OSS Encode function. The encoded output isn't allocated.
|
|
//
|
|
// If pbEncoded is NULL, does a length only calculation.
|
|
//--------------------------------------------------------------------------
|
|
int
|
|
WINAPI
|
|
PkiOssEncode2(
|
|
IN OssGlobal *Pog,
|
|
IN void *pvOssInfo,
|
|
IN int id,
|
|
OUT OPTIONAL BYTE *pbEncoded,
|
|
IN OUT DWORD *pcbEncoded
|
|
)
|
|
{
|
|
int iStatus;
|
|
OssBuf ossBuf;
|
|
DWORD cbEncoded;
|
|
|
|
if (NULL == pbEncoded)
|
|
cbEncoded = 0;
|
|
else
|
|
cbEncoded = *pcbEncoded;
|
|
|
|
if (0 == cbEncoded) {
|
|
// Length only calculation
|
|
|
|
ossBuf.length = 0;
|
|
ossBuf.value = NULL;
|
|
iStatus = ossEncode(Pog, id, pvOssInfo, &ossBuf);
|
|
|
|
if (0 == iStatus) {
|
|
if (pbEncoded)
|
|
iStatus = (int) ASN1_ERR_OVERFLOW;
|
|
cbEncoded = ossBuf.length;
|
|
if (ossBuf.value)
|
|
ossFreeBuf(Pog, ossBuf.value);
|
|
}
|
|
} else {
|
|
ossBuf.length = cbEncoded;
|
|
ossBuf.value = pbEncoded;
|
|
iStatus = ossEncode(Pog, id, pvOssInfo, &ossBuf);
|
|
|
|
if (0 == iStatus)
|
|
cbEncoded = ossBuf.length;
|
|
else if (MORE_BUF == iStatus) {
|
|
// Re-do as length only calculation
|
|
iStatus = PkiOssEncode2(
|
|
Pog,
|
|
pvOssInfo,
|
|
id,
|
|
NULL, // pbEncoded
|
|
&cbEncoded
|
|
);
|
|
if (0 == iStatus)
|
|
iStatus = (int) ASN1_ERR_OVERFLOW;
|
|
} else
|
|
cbEncoded = 0;
|
|
}
|
|
|
|
*pcbEncoded = cbEncoded;
|
|
return iStatus;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
// OSS Decode function. The allocated, decoded structure, **pvOssInfo, must
|
|
// be freed by calling ossFreePDU().
|
|
//--------------------------------------------------------------------------
|
|
int
|
|
WINAPI
|
|
PkiOssDecode(
|
|
IN OssGlobal *Pog,
|
|
OUT void **ppvOssInfo,
|
|
IN int id,
|
|
IN const BYTE *pbEncoded,
|
|
IN DWORD cbEncoded
|
|
)
|
|
{
|
|
int iStatus;
|
|
OssBuf ossBuf;
|
|
int pdunum = id;
|
|
|
|
ossBuf.length = cbEncoded;
|
|
ossBuf.value = (BYTE *) pbEncoded;
|
|
*ppvOssInfo = NULL;
|
|
iStatus = ossDecode(Pog, &pdunum, &ossBuf, ppvOssInfo);
|
|
return iStatus;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
// OSS Decode function. The allocated, decoded structure, **pvOssInfo, must
|
|
// be freed by calling ossFreePDU().
|
|
//
|
|
// For a successful decode, *ppbEncoded is advanced
|
|
// past the decoded bytes and *pcbDecoded is decremented by the number
|
|
// of decoded bytes.
|
|
//--------------------------------------------------------------------------
|
|
int
|
|
WINAPI
|
|
PkiOssDecode2(
|
|
IN OssGlobal *Pog,
|
|
OUT void **ppvOssInfo,
|
|
IN int id,
|
|
IN OUT BYTE **ppbEncoded,
|
|
IN OUT DWORD *pcbEncoded
|
|
)
|
|
{
|
|
int iStatus;
|
|
OssBuf ossBuf;
|
|
int pdunum = id;
|
|
|
|
ossBuf.length = *pcbEncoded;
|
|
ossBuf.value = *ppbEncoded;
|
|
*ppvOssInfo = NULL;
|
|
iStatus = ossDecode(Pog, &pdunum, &ossBuf, ppvOssInfo);
|
|
if (0 == iStatus) {
|
|
*ppbEncoded = ossBuf.value;
|
|
*pcbEncoded = ossBuf.length;
|
|
} else if (MORE_INPUT == iStatus)
|
|
iStatus = (int) ASN1_ERR_EOD;
|
|
return iStatus;
|
|
}
|
|
|