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

Escribe datos cifrados en una superficie protegida.

Sintaxis

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

Parámetros

pSrcSurface

Puntero a la superficie que contiene los datos de origen.

pDstSurface

Puntero a la superficie protegida donde se escriben los datos cifrados.

SrcSurfaceSize

Tamaño de la memoria expuesta a la que pSrcSurface apunta, en bytes. El tamaño debe estar alineado con el valor de BlockAlignmentSize en la estructura de funcionalidades del controlador; vea Comentarios.

pEncryptedBlockInfo

Puntero a una estructura D3DENCRYPTED_BLOCK_INFO o NULL.

Si el controlador admite búferes parcialmente cifrados, pEncryptedBlockInfo indica qué partes del búfer se cifran. Si toda la superficie está cifrada, establezca este parámetro en NULL.

Para comprobar si el controlador admite búferes parcialmente cifrados, llame a IDirect3DDevice9Video::GetContentProtectionCaps y compruebe la marca de funcionalidades de D3DCPCAPS_PARTIALDECRYPTION . Si el controlador no admite búferes parcialmente cifrados, establezca este parámetro en NULL.

pContentKey

Puntero a un búfer que contiene una clave de cifrado de contenido o NULL. Para consultar si el controlador admite el uso de claves de contenido, llame a IDirect3DDevice9Video::GetContentProtectionCaps y compruebe la marca de funcionalidades de D3DCPCAPS_CONTENTKEY .

Si el controlador admite claves de contenido, use la clave de contenido para cifrar la superficie. Cifre la clave de contenido mediante la clave de sesión y coloque el texto cifrado resultante en pContentKey. Si el controlador no admite claves de contenido, use la clave de sesión para cifrar la superficie y establecer pContentKey en NULL.

pIV

Puntero a un búfer que contiene el vector de inicialización (IV).

Si el tipo de cifrado es D3DCRYPTOTYPE_AES128_CTR, el búfer es una estructura de D3DAES_CTR_IV . El autor de la llamada asigna la estructura y genera el IV. Al generar el primer IV, inicialice la estructura en un número aleatorio. Para cada IV posterior, simplemente incremente el miembro IV de la estructura, asegurándose de que el valor siempre aumenta. Este procedimiento permite al controlador validar que el mismo IV nunca se usa más de una vez con el mismo par de claves.

En el caso de otros tipos de cifrado, se puede usar una estructura diferente o el cifrado podría no usar un IV.

Valor devuelto

Si este método se realiza correctamente, devuelve S_OK. De lo contrario, devuelve un código de error de HRESULT.

Comentarios

No todos los controladores o hardware admiten esta funcionalidad para todos los tipos criptográficos.

La superficie de origen debe ser una superficie de memoria del sistema creada con las restricciones de alineación adecuadas. El búfer debe ser lo suficientemente grande como para acomodar el tono y la altura de la superficie protegida, además de relleno para dar cabida a las restricciones de alineación iniciales y el tamaño de transferencia de bloques.

En concreto, debe asignar la superficie de origen de la siguiente manera:

  1. Llame a IDirect3DCryptoSession9::GetSurfacePitch para obtener el paso de la superficie protegida.
  2. Llame al método IDirect3DDevice9Video::GetContentProtectionCaps para obtener el valor de los miembros BufferAlignmentStart y BlockAlignmentSize de la estructura D3DCONTENTPROTECTIONCAPS .
  3. Calcule el tamaño mínimo de la memoria expuesta como SysMemSize = intervalo de superficie protegido × alto de superficie protegida.
  4. Agregue relleno para dar cabida a los valores de BufferAlignmentStart y BlockAlignmentSize.
  5. Asigne un búfer en la memoria del sistema, con el tamaño igual a SysMemSize (incluido el relleno).
  6. Si la dirección del búfer de memoria del sistema no está alineada con el valor de BufferAlignmentStart, calcule un puntero alineado con memoria que sea un desplazamiento desde el inicio del búfer.
  7. Llame a IDirect3DDevice9Ex::CreateOffscreenPlainSurfaceEx para crear la superficie de origen. Pase el puntero alineado con memoria como identificador de recursos compartidos (pSharedHandle).
Si bloquea la superficie, es posible que el paso notificado en la estructura de D3DLOCKED_RECT no coincida con el paso de la superficie protegida. Sin embargo, al interpretar los datos, use siempre el paso de la superficie protegida.

Este método no admite la escritura en subrectangles de la superficie.

Requisitos

Requisito Value
Cliente mínimo compatible Windows 7 [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2008 R2 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado d3d9.h

Consulte también

Protección de contenido basada en GPU

IDirect3DCryptoSession9