Listing 6
typedef struct _SecBufferDesc {
unsigned long ulVersion;
unsigned long cBuffers;
PSecBuffer pBuffers;
} SecBufferDesc
typedef struct _SecBuffer {
unsigned long cbBuffer;
unsigned long BufferType;
void SEC_FAR * pvBuffer;
} SecBuffer;
SecPkgContext_Sizes sizes;
SECURITY_STATUS err =
m_pSSP>QueryContextAttributes(
&m_hctx,
SECPKG_ATTR_SIZES,
&sizes
);
unsigned char* pMessage =
(unsigned char*) malloc(
micdata.length
);
unsigned char* pSignature =
(unsigned char*) malloc(
sizes.cbMaxSignature
);
memcpy(pMessage,
micdata.value,
micdata.length);
memset(pSignature,
0,
sizes.cbMaxSignature);
SecBuffer rgsb[] =
{
{micdata.length,
SECBUFFER_DATA,
(void*) pMessage
},
{sizes.cbMaxSignature,
SECBUFFER_TOKEN,
(void*) pSignature
},
};
SecBufferDesc sbd =
{
SECBUFFER_VERSION,
sizeof rgsb / sizeof *rgsb,
(SecBuffer*) &rgsb
};
DWORD lSequenceNum = 0;
lStatus =
m_pSSPI->MakeSignature(
&m_hctx,
0,
&sbd,
lSequenceNum);