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);