Partager via


Utilisation de la session de chiffrement avec le décodeur DirectX Video Accelerator 2.0

Cette section s’applique uniquement à Windows 7 et versions ultérieures, ainsi qu’à Windows Server 2008 R2 et versions ultérieures du système d’exploitation Windows.

Le pilote d’affichage en mode utilisateur peut associer une session de chiffrement à un périphérique de décodage DirectX Video Accelerator (VA) 2.0 pour que le périphérique de décodage DirectX VA 2.0 utilise la clé de session de la session de chiffrement. Si le runtime Direct3D spécifie un GUID de décodage valide dans le membre DecodeProfile de la structure D3DDDIARG_CREATECRYPTOSESSION lorsque le runtime appelle la fonction CreateCryptoSession du pilote pour créer la session de chiffrement, le runtime peut ensuite appeler la fonction ConfigureAuthenticatedChannel du pilote avec D3DAUTHETICATEDCONFIGURE_CRYPTOSESSION défini pour configurer la session de chiffrement avec le périphérique de décodage DirectX VA 2.0. Avant de configurer la session de chiffrement avec le périphérique de décodage DirectX VA 2.0, le runtime doit appeler la fonction DecodeExtensionExecute du pilote pour récupérer un handle de pilote pour le périphérique de décodage DirectX VA 2.0. Le runtime définit les membres de la structure D3DDDIARG_DECODEEXTENSIONEXECUTE sur les valeurs suivantes pour récupérer le handle de pilote pour le périphérique de décodage DirectX VA 2.0 :

#define DXVA2_DECODE_GET_DRIVER_HANDLE    0x725
D3DDDIARG_DECODEEXTENSIONEXECUTE.Function = DXVA2_DECODE_GET_DRIVER_HANDLE;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateInput->pData = NULL;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateInput->DataSize = 0;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateOutput->pData = HANDLE*;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateOutput->DataSize = sizeof(HANDLE);

Lorsque le runtime appelle la fonction CreateDecodeDevice du pilote pour créer le périphérique de décodage DirectX VA 2.0, le runtime spécifie des zéros pour les GUID de chiffrement de décod au sein de la structure DXVADDI_CONFIGPICTUREDECODE .

Une fois que le runtime a appelé la fonction CreateCryptoSession du pilote avec le membre CryptoType de la structure D3DDDIARG_CREATECRYPTOSESSION défini sur D3DCRYPTOTYPE_AES128_CTR pour créer la session de chiffrement, le paramètre du membre pPVPSetKey de la structure D3DDDIARG_DECODEBEGINFRAME dans un appel à la fonction DecodeBeginFrame du pilote pour décoder une trame indique les significations suivantes :

  • Si pPVPSetKey est défini sur NULL, aucune des mémoires tampons de la trame ne contient de données chiffrées et ne nécessite donc pas de déchiffrement.

  • Si pPVPSetKey pointe vers le NULL_GUID (tous les zéros), les mémoires tampons pour le frame sont chiffrées avec la clé de session.

  • Si pPVPSetKey pointe vers une clé de contenu, cela indique qu’une application a utilisé la clé de session pour chiffrer la clé de contenu. Le pilote doit utiliser cette clé de contenu pour déchiffrer toutes les mémoires tampons chiffrées associées à ce frame.

Le vecteur d’initialisation pour chaque mémoire tampon chiffrée apparaît dans le membre pCipherCounter de la structure DXVADDI_DECODEBUFFERDESC dans un appel à la fonction DecodeExecute du pilote. Le pilote doit échouer l’appel à sa fonction DecodeExecute s’il détermine que le vecteur d’initialisation a été précédemment utilisé pour la même clé de contenu (ou la clé de session si la clé de contenu n’est pas utilisée). L’application doit incrémenter le membre IV du DXVADDI_PVP_HW_IV pour chaque mémoire tampon chiffrée par l’application. Par conséquent, la fonction DecodeExecute du pilote peut échouer si le membre IV est inférieur ou égal à la valeur IV précédente qui a été passée à DecodeExecute.

Si le runtime doit chiffrer partiellement les mémoires tampons, il appelle la fonction DecodeExtensionExecute du pilote et définit les membres de la structure D3DDDIARG_DECODEEXTENSIONEXECUTE sur les valeurs suivantes pour spécifier les blocs que le pilote doit chiffrer :

#define DXVA2_DECODE_SPECIFY_ENCRYPTED_BLOCKS    0x724
D3DDDIARG_DECODEEXTENSIONEXECUTE.Function = DXVA2_DECODE_SPECIFY_ENCRYPTED_BLOCKS;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateInput->pData = D3DENCRYPTED_BLOCK_INFO*;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateInput->DataSize = sizeof(D3DENCRYPTED_BLOCK_INFO);
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateOutput->pData = NULL;
D3DDDIARG_DECODEEXTENSIONEXECUTE.pPrivateOutput->DataSize = 0;