PROPID_M_DEST_SYMM_KEY

 

Applies To: Windows 10, Windows 7, Windows 8, Windows 8.1, Windows Server 2008, Windows Server 2008 R2, Windows Server 2012, Windows Server 2012 R2, Windows Server Technical Preview, Windows Vista

The PROPID_M_DEST_SYMM_KEY property specifies the symmetric key used to encrypt the message.

Property ID

PROPID_M_DEST_SYMM_KEY

Type Indicator

VT_VECTOR | VT_UI1

MQPROPVARIANT Field

caub

Property Value

Encrypted symmetric key

Remarks

PROPID_M_DEST_SYMM_KEY is required when you send application-encrypted messages, or when you send encrypted messages to a foreign queue. In both cases, this property contains an encrypted version of the symmetric key that the sending application used to encrypt the body of the message.

When sending an application-encrypted message, the sending application must encrypt the symmetric key that it used to encrypt the message body using the public key of the destination queue manager. The destination queue manager uses the decrypted symmetric key to decrypt the message before placing it in its destination queue.

Messages sent to a foreign queue are first received by the appropriate connector application and then passed on to the foreign queue. When the connector application receives an application-encrypted message, it can decrypt the message body itself or forward the encrypted message body with the attached symmetric key on to the foreign queue. If the connector application does not decrypt the message, it is the responsibility of the receiving application to decrypt the symmetric key and the body of the message.

To send the symmetric key with a message, specify PROPID_M_DEST_SYMM_KEY and PROPID_M_CONNECTOR_TYPE in the MQMSGPROPS structure and call MQSendMessage. PROPID_M_CONNECTOR_TYPE must be set to tell Message Queuing to use the symmetric key provided by the sending application.

To retrieve the symmetric key from a message, specify PROPID_M_DEST_SYMM_KEY and PROPID_M_DEST_SYMM_KEY_LEN in the MQMSGPROPS structure (the length property is used to verify that the symmetric key was sent). Then call MQReceiveMessage or MQReceiveMessageByLookupId and examine the returned values.

If MQReceiveMessage or MQReceiveMessageByLookupId fails, returning an MQ_ERROR_SYMM_KEY_BUFFER_TOO_SMALL error, use the returned value of PROPID_M_DEST_SYMM_KEY_LEN to reallocate the symmetric key buffer and call the applicable function again.

Before using the returned symmetric key, always check the length property PROPID_M_DEST_SYMM_KEY_LEN to see if a symmetric key was sent. If the returned value of the length property is 0, no key was sent. If the returned value is nopn-0, PROPID_M_DEST_SYMM_KEY contains the symmetric key.

Equivalent COM Property

With COM components, the equivalent property for setting and retrieving the destination symmetric key is MSMQMessage.DestinationSymmetricKey.

For information on See
Sending messages to foreign queues Connector Services
Encrypting messages Application-Encrypted Messages
Testing the returned length of the symmetric key PROPID_M_DEST_SYMM_KEY_LEN

Example Code

The following code fragments show how PROPID_M_DEST_SYMM_KEY is specified in arrays that can be used to initialize an MQMSGPROPS structure when sending and retrieving the symmetric key.

To Send the Destination Symmetric Key

aMsgPropId[i] = PROPID_M_DEST_SYMM_KEY;     // Property ID  
aMsgPropVar[i].vt = VT_VECTOR | VT_UI1;     // Type indicator  
aMsgPropVar[i].caub.pElems = DestSymmetricKey;  
aMsgPropVar[i].caub.cElems = sizeof(DestSymmetricKey);  
i++;  
  
aMsgPropId[i] = PROPID_M_CONNECTOR_TYPE;            // Property ID  
aMsgPropVar[i].vt = VT_CLSID;                       // Type indicator  
aMsgPropVar[i].puuid = &guidConnectorType;  
i++;  
To Retrieve the Destination Symmetric Key  
aMsgPropId[i] = PROPID_M_DEST_SYMM_KEY_LEN;         // Property ID  
aMsgPropVar[i].vt = VT_NULL;                        // Type indicator  
i++;  
  
ULONG ulKeyBufferSize = 1024;  
UCHAR * pucKeyBuffer = NULL;  
pucKeyBuffer = (UCHAR *)malloc(ulKeyBufferSize);  
if (pucKeyBuffer == NULL)  
{  
  return MQ_ERROR_INSUFFICIENT_RESOURCES;  
}  
memset(pucKeyBuffer, 0, ulKeyBufferSize);  
aMsgPropId[i] = PROPID_M_DEST_SYMM_KEY;             // Property ID  
aMsgPropVar[i].vt = VT_VECTOR | VT_UI1;             // Type indicator  
aMsgPropVar[i].caub.pElems = pucKeyBuffer;  
aMsgPropVar[i].caub.cElems = ulKeyBufferSize;  
i++;  
  
// Reallocate memory for the symmetric key buffer if necessary.  
ulKeyBufferSize = aMsgPropVar[0].ulVal*sizeof(UCHAR);  
pucKeyBuffer = (UCHAR*)realloc(pucKeyBuffer, ulKeyBufferSize);  
if (pucKeyBuffer == NULL)  
{  
  return MQ_ERROR_INSUFFICIENT_RESOURCES;  
}  
memset(pucKeyBuffer, 0, ulKeyBufferSize);  
aMsgPropVar[1].caub.pElems = (UCHAR*)pucKeyBuffer;  // Pointer to the new buffer  
aMsgPropVar[1].caub.cElems = ulKeySize;             // New buffer size  

See Also

Message Properties
MQMSGPROPS
MQReceiveMessage
MQReceiveMessageByLookupId
MQSendMessage
PROPID_M_DEST_SYMM_KEY_LEN
MSMQMessage.DestinationSymmetricKey