Share via


Uso de Output Protection Manager

En este tema se describe cómo usar Output Protection Manager (OPM) para proteger el contenido de vídeo cuando se desplaza a una pantalla a través de un conector físico. Este tema contiene las siguientes secciones:

El contenido de vídeo Prémium normalmente se cifra para protegerlo frente a la duplicación no autorizada. Por supuesto, para que el vídeo se pueda ver, antes debe descifrarse. Los fotogramas descifrados y sin comprimir deben desplazarse a través de un conector físico hasta llegar a la pantalla. Los proveedores de contenido pueden requerir que los fotogramas de vídeo estén protegidos en ese momento, ya que viajan a través del conector físico.

Existen varios mecanismos de protección para tal fin, entre los que se incluyen Protección de contenido digital de ancho de banda alto (HDCP) y Protección de contenido de DisplayPort (DPCP) en el caso de las salidas digitales; y Copy Generation Management System - Analog (CGMS-A) en el de las salidas analógicas.Protección de contenido digital de ancho de banda alto. Por lo general, estos mecanismos implican cifrar o rastrear la señal antes de llegue a la pantalla.

OPM permite a las aplicaciones aplicar mecanismos de protección de contenido en la salida de vídeo. Mediante OPM, la aplicación envía comandos y solicitudes de estado al controlador de gráficos a través de un canal seguro de confianza. OPM permite que las aplicaciones:

  • Comprueben que Microsoft ha firmado cualquiera de los controladores de gráficos.
  • Configuren un canal de comunicación de confianza con el controlador.
  • Apliquen mecanismos de protección de contenido en la salida física.

OPM reemplaza el Protocolo de protección de salida certificada (COPP) y usa una API similar. Por no perder la compatibilidad con las versiones anteriores, la interfaz de OPM puede emular la interfaz de COPP. Estas son algunas de las diferencias entre OPM y COPP:

  • OPM usa certificados X.509, mientras que COPP usa un formato de certificado propietario.
  • OPM admite repetidores de HDCP.
  • Las aplicaciones que usan OPM no tienen que analizar los mensajes de renovación del sistema HDCP (SRM).
  • OPM se puede usar cuando la pantalla usa el modo de clonación. COPP no admite el modo de clonación.

Si la aplicación usa el conjunto de tecnologías Protected Media Path (PMP) para reproducir contenido de vídeo, no es preciso usar OPM API, ya que PMP realiza todas las llamadas a OPM necesarias. OPM API está disponible para todas aquellas aplicaciones que no usan PMP.

OPM está disponible tanto en Windows Vista como en las versiones posteriores, pero la API no se hizo pública hasta Windows 7. Para usar OPM en una aplicación, es preciso tener tanto los encabezados como los archivos de biblioteca del SDK de Windows 7. Para usar OPM en Windows Vista o Windows Server 2008 no es necesario redistribuir ningún archivo DLL.

Salidas de vídeo

Las tarjetas gráficas pueden tener varias salidas físicas, cada una de ellas con sus propias funcionalidades. Para que una aplicación pueda reproducir contenido protegido, debe establecer los mecanismos de protección adecuados en todas las salida de vídeo asociadas a la tarjeta gráfica que mostrará el vídeo. Los mecanismos de protección que se van a aplicar dependerán de las reglas de uso del contenido.

Cada salida de vídeo se representa mediante una instancia de la interfaz de IOPMVideoOutput. Para obtener las salidas de vídeo se pueden usar un dispositivo Direct3D o controladores de monitor.

Uso de un dispositivo Direct3D:

  1. Obtenga el puntero IDirect3DDevice9 del dispositivo Direct3D que la aplicación va a usar para crear superficies que contengan los fotogramas de vídeo.
  2. Llame a la función OPMGetVideoOutputsFromIDirect3DDevice9Object. Esta función asigna una matriz de punteros de IOPMVideoOutput, uno para cada salida.

Uso de controladores de monitor:

  1. Llame a EnumDisplayMonitors para obtener los controladores de HMONITOR que corresponden a la ventana de vídeo. Varios monitores se pueden asociar a la misma ventana, por lo que puede obtener varios controladores de HMONITOR.
  2. Para cada controlador de monitor, debe llamar a OPMGetVideoOutputsFromHMONITOR. Esta función asigna una matriz de punteros de IOPMVideoOutput, uno para cada salida.

Inicialización de una sesión de OPM

Antes de que la aplicación envíe comandos o solicitudes de estado de OPM, no solo debe comprobar que la salida de vídeo es de confianza, sino que también debe establecer una clave de sesión. La clave de sesión se usa para firmar los datos que se intercambian entre la aplicación y el controlador de gráficos.

OPM API define un protocolo de enlace que establece tanto la confianza como la clave de sesión. Este protocolo de enlace se debe ejecutar en todas las instancias de la interfaz de IOPMVideoOutput, como se indica a continuación:

  1. Llame a IOPMVideoOutput::StartInitialization. Este método recupera dos datos:

    • Un número aleatorio, que genera el controlador. Este número se usará para completar el protocolo de enlace.
    • La cadena de certificados X.509 del controlador.
  2. Compruebe que Microsoft ha firmado la cadena de certificados.

    Nota:

    La revocación de certificados está fuera del ámbito de OPM.

     

  3. Obtenga de la cadena de certificados la clave pública del controlador.

  4. Genere una clave de sesión AES de 128 bits.

  5. Genere dos números aleatorios de 32 bits:

    • El número de secuencia inicial para las solicitudes de estado de OPM.
    • Número de secuencia inicial para los comandos de OPM.

    Para generar estos números se debe usar un generador de números pseudoaleatorios protegidos criptográficamente, como CryptGenRandom.

  6. Copie el número aleatorio del controlador (obtenido en el paso 1), la clave de sesión y los dos números de secuencia en una estructura OPM_ENCRYPTED_INITIALIZATION_PARAMETERS, como se describe en IOPMVideoOutput::FinishInitialization.

  7. Cifre la estructura OPM_ENCRYPTED_INITIALIZATION_PARAMETERS con RSAES-OAEP, para lo que debe usar la clave pública del controlador, que se encuentra en el certificado del controlador.

  8. Llame a IOPMVideoOutput::FinishInitialization.

Envío de solicitudes de estado de OPM

Las solicitudes de estado de OPM devuelven información sobre la salida de vídeo, como el tipo de conector físico y el nivel de protección actual. Para obtener una lista de los tipos de solicitud, consulte Solicitudes de estado de OPM.

Para enviar una solicitud de estado, siga los pasos que se indican a continuación.

  1. Inicialice una estructura OPM_GET_INFO_PARAMETERS como se muestra en la siguiente tabla.

    Miembro Descripción
    omac Omita este campo por ahora.
    rnRandomNumber Un número aleatorio de 128 bits protegido criptográficamente. Siempre que realice una solicitud de estado tendrá generar un nuevo número aleatorio, aunque realice la misma solicitud. Almacene el número en una variable, ya que tendrá que hacer referencia a él más adelante.
    guidInformation GUID que identifica la solicitud de estado. Para obtener una lista de solicitudes de estado, consulte Solicitudes de estado de OPM.
    ulSequenceNumber El número de secuencia global. En el caso de la primera solicitud de estado, use el número de secuencia inicial que especificó en el método IOPMVideoOutput::FinishInitialization (paso 5 de Inicialización de una sesión de OPM). En cada solicitud de estado posterior, tendrá que incrementar este número en 1.
    abParameters Matriz de bytes que contiene datos de entrada adicionales para la solicitud. El formato de los datos de entrada aparece en el tema de referencia de cada solicitud de estado.
    cbParametersSize El tamaño de los datos válidos de la matriz abParameters. El contenido del resto de la matriz no está definido.

     

  2. Calcule el código CBC-MAC de una clave (OMAC-1) para calcular un hash para el bloque de datos que aparece después del miembro omac y, después, elija este valor para el miembro omac. Consulte Código de ejemplo de OPM.

  3. Llame al método IOPMVideoOutput::GetInformation. Utilice un puntero con la estructura OPM_GET_INFO_PARAMETERS y otro con una estructura OPM_REQUESTED_INFORMATION. La respuesta del controlador se escribe en la estructura OPM_REQUESTED_INFORMATION.

    • El miembro omac de esta estructura contiene un OMAC calculado para los datos que le siguen.
    • El miembro abRequestedInformation es una matriz de bytes que contiene los datos de salida de la respuesta. El formato de los datos de salida aparece en el tema de referencia de cada solicitud de estado.
  4. Calcule un OMAC para la estructura OPM_REQUESTED_INFORMATION, sin incluir el miembro omac. Compruebe que el OMAC coincide con el valor del miembro omac.

  5. Asegúrese de que el miembro cbRequestedInformationSize de la estructura OPM_REQUESTED_INFORMATION proporciona el tamaño correcto a los datos de salida. Por ejemplo, los datos de salida de la consulta OPM_GET_CONNECTOR_TYPE son una estructura OPM_STANDARD_INFORMATION, por lo que el valor de cbRequestedInformationSize debe sersizeof(OPM_STANDARD_INFORMATION).

  6. Convierta el miembro abRequestedInformation de la estructura OPM_REQUESTED_INFORMATION en la estructura de datos de salida correcta. Por ejemplo, si la solicitud de estado es OPM_GET_CONNECTOR_TYPE, convierta abRequestedInformation en una estructura OPM_STANDARD_INFORMATION.

  7. Asegúrese de que el miembro rnRandomNumber de la estructura de datos de salida coincide con el valor de rnRandomNumber del paso 1.

  8. Compruebe el miembro ulStatusFlags de la estructura de datos de salida, como se describe en Control de una salida de vídeo deshabilitada.

Si se produce un error en alguna de las comprobaciones de los pasos 5 a 8, la aplicación debe dejar de mostrar el contenido protegido.

Envío de comandos de OPM

Los comandos de OPM se usan para establecer el nivel de protección y otros valores de configuración en la salida de vídeo. El envío de un comando de OPM es similar al envío de una solicitud de estado, excepto que no hay datos de respuesta del controlador. Para obtener una lista de comandos, consulte Comandos de OPM.

Para enviar un comando de OPM, siga los pasos que se indican a continuación.

  1. Rellene una estructura OPM_CONFIGURE_PARAMETERS como se muestra en la tabla siguiente.

    Miembro Descripción
    omac Omita este campo por ahora.
    guidSetting GUID que identifica el comando. Para obtener una lista de comandos, consulte Comandos de OPM.
    ulSequenceNumber El número de secuencia global. En el caso del primer comando, use el número de secuencia inicial que especificó en el método IOPMVideoOutput::FinishInitialization (paso 5 de Inicialización de una sesión de OPM). En cada envío posterior de un comando, tendrá que incrementar este número en 1.
    abParameters Matriz de bytes que contiene datos de entrada adicionales para el comando. El formato de los datos de entrada aparece en el tema de referencia de cada comando.
    cbSettingDataSize El tamaño de los datos válidos de la matriz abParameters. El contenido del resto de la matriz no está definido.

     

  2. Calcule un OMAC para el bloque de datos que aparece después del miembro omac y, después, elija este valor para el miembro omac.

  3. Llame a IOPMVideoOutput::Configure.

Para la mayoría de los comandos, hay una solicitud de estado correspondiente que devuelve el estado del comando. Por ejemplo, el comando OPM_SET_PROTECTION_LEVEL establece el nivel de protección, mientras que el comando OPM_GET_VIRTUAL_PROTECTION_LEVEL obtiene el nivel de protección actual.

Control de una salida de vídeo deshabilitada

Cualquier salida de vídeo se puede deshabilitar automáticamente en cualquier momento para evitar el uso no autorizado del contenido de vídeo. Esto puede suceder si algún mecanismo de protección deja de funcionar, si el controlador detecta alteraciones o si la pantalla se ha desconectado del conector físico. Durante el proceso de deshabilitación de una salida de vídeo, no se muestran fotogramas de vídeo.

Mientras la protección de contenido esté habilitada, una aplicación debe realizar periódicamente (al menos una vez cada 2 segundos) los siguientes pasos:

  1. Llamar a IOPMVideoOutput::GetInformation para enviar la solicitud de estado de OPM_GET_ACTUAL_PROTECTION_LEVEL o de OPM_GET_VIRTUAL_PROTECTION_LEVEL. Los datos devueltos para ambos comandos son una estructura OPM_STANDARD_INFORMATION.
  2. Compruebe el miembro ulInformation de la estructura OPM_STANDARD_INFORMATION. Este miembro contiene una marca que indica si la protección de contenido sigue habilitada. Si no lo está, deje de reproducir el vídeo de inmediato.
  3. Si la protección de contenido está activada, compruebe el miembro ulStatusFlags de la estructura OPM_STANDARD_INFORMATION. Si no hay marcas, significa que la salida del vídeo funciona correctamente. De lo contrario, la salida del vídeo se deshabilita.

Las siguientes marcas se definen para ulStatusFlags.

Marca Descripción
OPM_STATUS_LINK_LOST La protección de salida dejó de funcionar por algún motivo; por ejemplo, es posible que la pantalla no esté enchufada al conector. Detenga la reproducción y desactive todos los mecanismos de protección de salida.
OPM_STATUS_RENEGOTIATION_REQUIRED La aplicación debe restablecer la sesión de OPM. Responda como se muestra a continuación:
  1. Detener reproducción.
  2. Desactive todos los mecanismos de protección.
  3. Libere la interfaz de IOPMVideoOutput.
  4. Vuelva a crear todas las superficies de vídeo.
  5. Cree un objeto OPM e intente restablecer la protección de contenido. Si no se restablece, muestre un mensaje de error al usuario. No reproduzca más contenido de vídeo.
OPM_STATUS_REVOKED_HDCP_DEVICE_ATTACHED Esta marca solo se aplica cuando se usa HDCP e indica que hay algún dispositivo HDCP revocado. Detenga la reproducción y desactive todos los mecanismos de protección en esta salida de vídeo. Siempre que se establece esta marca, también se establece la marca OPM_STATUS_LINK_LOST.
OPM_STATUS_REVOKED_HDCP_DEVICE_ATTACHED El controlador ha detectado alteraciones. Detenga la reproducción y no reproduzca más vídeos con esta salida de vídeo. También se recomienda dejar de usar cualquier otra salida de vídeo, ya que ello podría suponer un peligro para el sistema.

 

Uso de HDCP para proteger contenido

En esta sección se describe cómo habilitar la protección de salida HDCP mediante OPM. Este es un esquema general de los pasos que debe realizar la aplicación. Más adelante se proporciona detalles al respecto.

  1. Es posible que la aplicación tenga que proporcionar un SRM a la salida de vídeo. El mecanismo para recibir SRM está fuera del ámbito de la interfaz OPM. Por ejemplo, los SRM se podrían entregar como parte de una secuencia de difusión.
  2. La aplicación habilita la protección de salida HDCP.
  3. La aplicación reproduce el contenido de vídeo. Periódicamente, la aplicación sondea el controlador para asegurarse de que HDCP está activado.
  4. Una vez completada la reproducción, la aplicación desactiva HDCP.

Establecimiento del SRM

Para establecer el SRM, siga los pasos que se indican a continuación.

  1. Inicialice una estructura OPM_SET_HDCP_SRM_PARAMETERS con el número de versión de SRM.
  2. Almacene el SRM en una variable.
  3. Envíe un comando de OPM_SET_HDCP_SRM a la salida del vídeo. Use el procedimiento descrito en Envío de comandos de OPM.
  4. Envíe una solicitud de estado OPM_GET_CURRENT_HDCP_SRM_VERSION a la salida del vídeo. Use el procedimiento que se describe en Envío de solicitudes de estado de OPM. Esta solicitud de estado no tiene datos de entrada, por lo que el contenido del miembro abParameters de la estructura OPM_GET_INFO_PARAMETERS no está definido.
  5. Cuando el método IOPMVideoOutput::GetInformation vuelve, la matriz abRequestedInformation de la estructura OPM_REQUESTED_INFORMATION contiene una estructura OPM_STANDARD_INFORMATION. El miembro ulInformation de esta estructura contiene el número de versión del SRM actual. Este valor debe ser igual al del paso 2.

Habilitación de HDCP

Para habilitar HDCP, siga los pasos que se indican a continuación.

  1. Inicialice una estructura OPM_SET_PROTECTION_LEVEL_PARAMETERS con los siguientes valores:
    • ulProtectionType = OPM_PROTECTION_TYPE_HDCP
    • ulProtectionLevel = OPM_HDCP_ON
    • Reserved = 0
    • Reserved2 = 0
  2. Envíe un comando de OPM_SET_PROTECTION_LEVEL. Los datos de entrada de la matriz abParameters son la estructura OPM_SET_PROTECTION_LEVEL_PARAMETERS.
  3. Envíe una solicitud de estado OPM_GET_VIRTUAL_PROTECTION_LEVEL para comprobar si HDCP está habilitado. Los cuatro primeros bytes del miembro abParameters de la estructura OPM_GET_INFO_PARAMETERS contienen el valor OPM_PROTECTION_TYPE_HDCP.

Cuando el método GetInformation vuelve, la matriz abRequestedInformation de la estructura OPM_REQUESTED_INFORMATION contiene una estructura OPM_STANDARD_INFORMATION. El miembro ulInformation de esta estructura contiene un valor de la enumeración OPM_HDCP_PROTECTION_LEVEL. Si el valor es OPM_HDCP_ON, significa que HDCP está habilitado. De lo contrario, repita los pasos 1 a 2 hasta que HDCP esté habilitado o se produzca un error (recuerde incrementar el número de secuencia y generar un nuevo número aleatorio cada vez).

Normalmente se tardan entre 100 y 200 milisegundos para habilitar HDCP, pero puede tardar más tiempo. No suponga que HDCP está habilitado hasta que lo haya comprobado.

Cuando la aplicación termine de reproducir contenido protegido, desactive HDCP. Los pasos son los mismos que para habilitar HDCP, pero en el paso 1, establezca ulProtectionLevel en OPM_HDCP_OFF.

Nota:

No habilite HDCP si el tipo de conector es OPM_CONNECTOR_TYPE_DISPLAYPORT_EMBEDDED (consulte Marcas del tipo de conector de OPM).

 

Output Protection Manager