Fonction DRMDecrypt (msdrm.h)
[Le Kit de développement logiciel (SDK) AD RMS tirant parti des fonctionnalités exposées par
le client dans Msdrm.dll peut être utilisé dans Windows Server 2008, Windows Vista, Windows Server 2008 R2, Windows 7, Windows Server 2012 et Windows 8. Il peut être modifié ou
non disponible dans les versions suivantes. Utilisez plutôt active Directory Rights Management Services SDK 2.1.
qui tire parti des fonctionnalités exposées par le client dans Msipc.dll.]
La fonction DRMDecrypt déchiffre le contenu chiffré.
Syntaxe
DRMEXPORT HRESULT UDAPICALL DRMDecrypt(
[in] DRMHANDLE hCryptoProvider,
[in] UINT iPosition,
[in] UINT cNumInBytes,
[in] BYTE *pbInData,
[in, out] UINT *pcNumOutBytes,
[out] BYTE *pbOutData
);
Paramètres
[in] hCryptoProvider
Handle vers un objet de déchiffrement AD RMS créé par DRMCreateEnablingBitsDecryptor.
[in] iPosition
Position dans la mémoire tampon à partir de laquelle commencer le déchiffrement. 0 correspond au premier bloc d’une mémoire tampon, 1 correspond au deuxième bloc, et ainsi de suite. Consultez l'exemple décrit plus loin dans cette rubrique.
[in] cNumInBytes
Nombre d’octets à déchiffrer.
[in] pbInData
Pointeur vers une mémoire tampon qui contient les octets à déchiffrer.
[in, out] pcNumOutBytes
Taille, en octets, des données déchiffrées.
[out] pbOutData
Données déchiffrées.
Valeur retournée
Si la fonction réussit, la fonction retourne S_OK.
Si la fonction échoue, elle retourne une valeur HRESULT qui indique l’erreur. Pour obtenir la liste des codes d’erreur courants, consultez Valeurs HRESULT courantes.
Notes
L’allocation de mémoire et la libération du contenu déchiffré sont de la responsabilité de la fonction appelante. L’exemple de code suivant, de Déchiffrement de contenu, montre comment déchiffrer le contenu dans des blocs. Cet exemple particulier connaît déjà la taille du contenu à déchiffrer et alloue de la mémoire au préalable. Toutefois, si vous devez déterminer le nombre d’octets à allouer, la taille de mémoire tampon requise est retournée dans le paramètre pcNumOutBytes après le premier appel. Allouez de la mémoire et appelez à nouveau la fonction avec pbOutData défini pour pointer vers la nouvelle mémoire.
#include "DecryptingContent.h"
/*===================================================================
File: Decryption_DecryptContent.cpp
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (C) Microsoft. All rights reserved.
===================================================================*/
/////////////////////////////////////////////////////////////////////
// The DecryptContent function decrypts content. The content to be
// decrypted was created by the EncryptingContent example shown
// earlier in this documentation.
//
HRESULT DecryptContent(
DRMHANDLE hBoundLic,
UINT uiEncrypted,
BYTE* pbEncrypted,
BYTE** ppbDecrypted)
{
HRESULT hr = S_OK; // HRESULT return code
UINT uiBlock = 0; // Decryption block size (16)
UINT uiBytes = 0; // Size of uiBlock variable (4)
UINT uiDecrypted = 0; // Number of decrypted bytes
UINT uiOffset = 0; // Decryption buffer offset
DRMHANDLE hEBDecryptor = NULL; // Decrypting object handle
DRMENCODINGTYPE eType;
wprintf(L"\r\nEntering DecryptContent.\r\n");
// Validate the input parameters.
if ( NULL==hBoundLic ||
NULL==pbEncrypted ||
NULL==ppbDecrypted)
return E_INVALIDARG;
// Create a decrypting object.
hr = DRMCreateEnablingBitsDecryptor(
hBoundLic, // Bound license handle
L"EDIT", // Requested right
NULL, // Reserved
NULL, // Reserved
&hEBDecryptor); // Decrypting object pointer
if (FAILED(hr)) goto e_Exit;
wprintf(L"DRMCreateEnablingBitsDecryptor: hEBDecryptor = %i\r\n",
hEBDecryptor);
// Retrieve the size, in bytes, of the memory block that must
// be passed to DRMDecrypt.
uiBytes= sizeof(uiBlock);
hr = DRMGetInfo(
hEBDecryptor, // Decrypting object handle
g_wszQUERY_BLOCKSIZE, // Attribute to query for
&eType, // Type of encoding to apply
&uiBytes, // Size of uiBlock variable
(BYTE*)&uiBlock); // Size of memory block
if(FAILED(hr)) goto e_Exit;
wprintf(L"DRMGetInfo: uiBlock = %u\r\n", uiBlock);
// Allocate memory for the decrypted content.
// Note: This example uses a buffer of known size to store the
// decrypted content. Typically, however, the buffer to
// store the content should be allocated based on the size
// returned by the first call to DRMDecrypt.
*ppbDecrypted = new BYTE[uiEncrypted];
if (NULL == *ppbDecrypted)
{
hr = E_OUTOFMEMORY;
goto e_Exit;
}
// Decrypt the content.
for ( int j = 0; (UINT)j * uiBlock < uiEncrypted; j++ )
{
hr = DRMDecrypt(
hEBDecryptor, // Decrypting object handle
j * uiBlock, // Position in the buffer
uiBlock, // Number of bytes to decrypt
pbEncrypted + (j*uiBlock), // Bytes to decrypt
&uiDecrypted, // Number of decrypted bytes
NULL); // Set to NULL on first call
if(FAILED(hr)) goto e_Exit;
hr = DRMDecrypt(
hEBDecryptor, // Decrypting object handle
j * uiBlock, // Position in the buffer
uiBlock, // Number of bytes to decrypt
pbEncrypted + (j*uiBlock), // Bytes to decrypt
&uiDecrypted, // Number of decrypted bytes
*ppbDecrypted + uiOffset); // Decrypted data
if(FAILED(hr)) goto e_Exit;
uiOffset += uiDecrypted; // Increment the buffer offset
}
e_Exit:
if (NULL != hEBDecryptor)
{
hr = DRMCloseHandle(hEBDecryptor);
hEBDecryptor = NULL;
}
wprintf(L"Leaving DecryptContent: hr = %x\r\n", hr);
return hr;
}
Spécifications
Plateforme cible | Windows |
En-tête | msdrm.h |
Bibliothèque | Msdrm.lib |
DLL | Msdrm.dll |
Voir aussi
DRMCreateEnablingBitsDecryptor