Méthode IDirect3DCryptoSession9 ::D ecryptionBlt (d3d9.h)

Écrit des données chiffrées dans une surface protégée.

Syntaxe

HRESULT DecryptionBlt(
  IDirect3DSurface9       *pSrcSurface,
  IDirect3DSurface9       *pDstSurface,
  UINT                    SrcSurfaceSize,
  D3DENCRYPTED_BLOCK_INFO *pEncryptedBlockInfo,
  VOID                    *pContentKey,
  VOID                    *pIV
);

Paramètres

pSrcSurface

Pointeur vers la surface qui contient les données sources.

pDstSurface

Pointeur vers la surface protégée où les données chiffrées sont écrites.

SrcSurfaceSize

Taille de la mémoire de surface vers laquelle pSrcSurface pointe, en octets. La taille doit être alignée sur la valeur de BlockAlignmentSize dans la structure des fonctionnalités du pilote ; voir Remarques.

pEncryptedBlockInfo

Pointeur vers une structure D3DENCRYPTED_BLOCK_INFO ou NULL.

Si le pilote prend en charge les mémoires tampons partiellement chiffrées, pEncryptedBlockInfo indique quelles parties de la mémoire tampon sont chiffrées. Si la surface entière est chiffrée, définissez ce paramètre sur NULL.

Pour case activée si le pilote prend en charge les mémoires tampons partiellement chiffrées, appelez IDirect3DDevice9Video ::GetContentProtectionCaps et case activée pour l’indicateur de fonctionnalités de D3DCPCAPS_PARTIALDECRYPTION. Si le pilote ne prend pas en charge les mémoires tampons partiellement chiffrées, définissez ce paramètre sur NULL.

pContentKey

Pointeur vers une mémoire tampon qui contient une clé de chiffrement de contenu ou NULL. Pour savoir si le pilote prend en charge l’utilisation de clés de contenu, appelez IDirect3DDevice9Video ::GetContentProtectionCaps et case activée pour l’indicateur de fonctionnalités D3DCPCAPS_CONTENTKEY.

Si le pilote prend en charge les clés de contenu, utilisez la clé de contenu pour chiffrer la surface. Chiffrez la clé de contenu à l’aide de la clé de session et placez le texte de chiffrement résultant dans pContentKey. Si le pilote ne prend pas en charge les clés de contenu, utilisez la clé de session pour chiffrer la surface et définissez pContentKey sur NULL.

pIV

Pointeur vers une mémoire tampon qui contient le vecteur d’initialisation (IV).

Si le type de chiffrement est D3DCRYPTOTYPE_AES128_CTR, la mémoire tampon est une structure D3DAES_CTR_IV . L’appelant alloue la structure et génère l’IV. Lorsque vous générez le premier iv, initialisez la structure en un nombre aléatoire. Pour chaque IV suivant, incrémentez simplement le membre IV de la structure, en veillant à ce que la valeur augmente toujours. Cette procédure permet au pilote de vérifier que le même IV n’est jamais utilisé plus d’une fois avec la même paire de clés.

Pour d’autres types de chiffrement, une structure différente peut être utilisée ou le chiffrement peut ne pas utiliser d’IV.

Valeur retournée

Si cette méthode réussit, elle retourne S_OK. Sinon, elle retourne un code d’erreur HRESULT.

Remarques

Le matériel ou les pilotes ne prennent pas tous en charge cette fonctionnalité pour tous les types de chiffrement.

La surface source doit être une surface de mémoire système créée avec les restrictions d’alignement appropriées. La mémoire tampon doit être suffisamment grande pour prendre en charge l’inclinaison et la hauteur de la surface protégée, ainsi qu’un remplissage pour prendre en charge les restrictions d’alignement de départ et la taille de transfert de bloc.

Plus précisément, vous devez allouer la surface source comme suit :

  1. Appelez IDirect3DCryptoSession9 ::GetSurfacePitch pour obtenir la foulée de la surface protégée.
  2. Appelez la méthode IDirect3DDevice9Video ::GetContentProtectionCaps pour obtenir la valeur des membres BufferAlignmentStart et BlockAlignmentSize dans la structure D3DCONTENTPROTECTIONCAPS .
  3. Calculez la taille minimale de la mémoire de surface comme SysMemSize = foulée de surface protégée × hauteur de surface protégée.
  4. Ajoutez un remplissage pour prendre en charge les valeurs de BufferAlignmentStart et BlockAlignmentSize.
  5. Allouez une mémoire tampon dans la mémoire système, dont la taille est égale à SysMemSize (y compris le remplissage).
  6. Si l’adresse de la mémoire tampon système n’est pas alignée sur la valeur de BufferAlignmentStart, calculez un pointeur aligné sur la mémoire qui est un décalage par rapport au début de la mémoire tampon.
  7. Appelez IDirect3DDevice9Ex ::CreateOffscreenPlainSurfaceEx pour créer la surface source. Passez le pointeur aligné sur la mémoire comme handle de ressource partagée (pSharedHandle).
Si vous verrouillez la surface, la foulée signalée dans la structure D3DLOCKED_RECT peut ne pas correspondre à la foulée de la surface protégée. Toutefois, lorsque vous interprétez les données, utilisez toujours la foulée de la surface protégée.

Cette méthode ne prend pas en charge l’écriture dans les sous-corrections de la surface.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 7 [applications de bureau uniquement]
Serveur minimal pris en charge Windows Server 2008 R2 [applications de bureau uniquement]
Plateforme cible Windows
En-tête d3d9.h

Voir aussi

Protection du contenu basée sur GPU

IDirect3DCryptoSession9