Export (0) Print
Expand All
Expand Minimize

PROPID_M_SIGNATURE

The PROPID_M_SIGNATURE property specifies the MSMQ 1.0 signature or application-generated signature that is attached to the message.

Property ID

PROPID_M_SIGNATURE

Type Indicator

VT_VECTOR | VT_UI1

MQPROPVARIANT Field

caub

Property Value

Digital signature.

Remarks

In most cases, this property is set by the Message Queuing runtime when the sending application requests authentication. This property can also be set by connector applications sending messages to Message Queuing. In these cases, the receiving application can use this property to retrieve the MSMQ 1.0 or application-generated signature attached to the message.

ms699802.note(en-us,VS.85).gifNote
This property contains an MSMQ 1.0 signature only if the sending application specified an MSMQ 1.0 signature when requesting authentication.

Connector applications may also set this property when they call MQSendMessage. However, when a connector application sets this property, Message Queuing does not generate a digital signature for this property. The connector application must generate the digital signature itself based on the certificate of the user sending the message.

When connector applications set PROPID_M_SIGNATURE, the PROPID_M_CONNECTOR_TYPE property must also be set so that Message Queuing does not generate a digital signature. PROPID_M_SIGNATURE is ignored if PROPID_M_CONNECTOR_TYPE is not also set when the message is sent.

Setting the Digital Signature

To set the digital signature, the connector application must specify PROPID_M_SIGNATURE and PROPID_M_SIGNATURE_LEN in the MQMSGPROPS structure and call MQSendMessage.

Retrieving the Digital Signature

To retrieve the digital signature, specify PROPID_M_SIGNATURE and PROPID_M_SIGNATURE_LEN in the MQMSGPROPS structure. Then call MQReceiveMessage or MQReceiveMessageByLookupId and examine the returned value.

If MQReceiveMessage or MQReceiveMessageByLookupId fails, returning an MQ_ERROR_SIGNATURE_BUFFER_OVERFLOW error, use the returned value of PROPID_M_SIGNATURE_LEN to reallocate the message body buffer and call the applicable function again.

Before using the retrieved digital signature, always check the length property PROPID_M_SIGNATURE_LEN to see whether the digital signature was sent in this property with the message. If the returned value of PROPID_M_SIGNATURE_LEN is 0, no signature was sent in this property with the message. If the returned value is non-0, PROPID_M_SIGNATURE contains a digital signature.

ms699802.note(en-us,VS.85).gifNote
If the sending application sent an MSMQ 2.0 signature, but did not attach an MSMQ 1.0 signature, this property will contain a buffer of 4 zeroed bytes.

Equivalent COM Property

With COM components, the equivalent property for setting and retrieving the MSMQ 1.0 or application-generated signature attached to the message is MSMQMessage.Signature.

For information on See

How Message Queuing creates digital signatures

How Message Queuing Authenticates Messages

MSMQ 1.0 signatures

Digital Signatures

Authenticating messages sent by a connector application

Connector Application Security

Example Code

The following code fragments show how PROPID_M_SIGNATURE and PROPID_M_SIGNATURE_LEN are specified in arrays that can be used to initialize an MQMSGPROPS structure for attaching and retrieving a digital signature.

To Attach the Digital Signature

aMsgPropId[i] = PROPID_M_SIGNATURE;                       // Property ID
aMsgPropVar[i].vt = VT_VECTOR | VT_UI1;                   // Type indicator
aMsgPropVar[i].caub.pElems = (LPBYTE)Signature;
aMsgPropVar[i].caub.cElems = sizeof(Signature);
i++;

To Retrieve the Digital Signature

ULONG ulSignatureBufferSize = 1024;
UCHAR * pucSignatureBuffer = NULL;
pucSignatureBuffer = (UCHAR *)malloc(ulSignatureBufferSize);
if (pucSignatureBuffer == NULL)
{
  return MQ_ERROR_INSUFFICIENT_RESOURCES;
}
memset(pucSignatureBuffer, 0, ulSignatureBufferSize);
aMsgPropID[i] = PROPID_M_SIGNATURE;                       // Property ID
aMsgPropVar[i].vt = VT_VECTOR | VT_UI1;                   // Type indicator
aMsgPropVar[i].caub.pElems = (UCHAR*)pucSignatureBuffer;
aMsgPropVar[i].caub.cElems = ulSignatureBufferSize;
i++

aMsgPropId[i] = PROPID_M_SIGNATURE_LEN;                   // Property ID
aMsgPropVar[i].vt = VT_UI4;                               // Type indicator
i++;

// Reallocate memory for the Signature buffer if necessary.
ulSignatureBufferSize = aMsgPropVar[1].ulVal*sizeof(UCHAR);
pucSignatureBuffer = (UCHAR*)realloc(pucSignatureBuffer, ulSignatureBufferSize);
if (pucSignatureBuffer == NULL)
{
  return MQ_ERROR_INSUFFICIENT_RESOURCES;
}
memset(pucSignatureBuffer, 0, ulSignatureBufferSize);
aMsgPropVar[0].caub.pElems = (UCHAR*)pucSignatureBuffer;  // Pointer to the new buffer
aMsgPropVar[0].caub.cElems = ulSignatureBufferSize;       // New buffer size

See Also

Show:
© 2014 Microsoft