# Sistemas DRM

Source: https://airi.live/docs/drm
Language: es. The other: https://airi.live/docs/drm.md?lang=en
Index: https://airi.live/llms.txt — every page in one file: https://airi.live/llms-full.txt

Widevine, PlayReady, FairPlay y WisePlay hacen lo mismo para fabricantes distintos. Estas son las diferencias que te van a afectar.

## Por qué necesitas más de uno

Ningún sistema DRM funciona en todos los dispositivos, y no es un problema técnico que vaya a resolverse: cada uno pertenece a un fabricante que lo incorpora en su propio hardware y software. Apple no instala Widevine en un iPhone, ni Google instala FairPlay en Android.

Para llegar a todo el mundo hay que cifrar el contenido de forma que varios sistemas puedan abrirlo, cada uno con su propia licencia. Eso es lo que hace el estándar **Common Encryption**: un mismo archivo cifrado, varias cabeceras de protección, una por sistema.

> **Con tres cubres prácticamente todo:** Widevine, PlayReady y FairPlay entre los tres alcanzan casi cualquier pantalla del mercado occidental. WisePlay solo hace falta si te diriges al ecosistema Huawei.

En Airi eso es la lista `drmSystems` al crear una clave. Cada sistema que añades genera los datos de protección correspondientes; la clave de cifrado es la misma para todos.

## De un vistazo

|  | Widevine | PlayReady | FairPlay | WisePlay |
| --- | --- | --- | --- | --- |
| Fabricante | Google | Microsoft | Apple | Huawei |
| Dónde reproduce | Android, Chrome, Firefox, Edge, Android TV, Chromecast, muchos televisores | Windows, Xbox, Edge, televisores Samsung y LG, descodificadores | iPhone, iPad, Mac (Safari), Apple TV | Dispositivos Huawei y HarmonyOS |
| Formato de streaming | DASH y HLS | DASH y HLS | Solo HLS | DASH y HLS |
| Esquemas de cifrado | `cenc` y `cbcs` | `cenc` y `cbcs` (desde PlayReady 4) | Solo `cbcs` | `cenc` y `cbcs` |
| Señalización | Caja `pssh` | Caja `pssh` + cabecera de protección | `EXT-X-KEY` con URI `skd://` — **no hay pssh** | Caja `pssh` |
| Niveles de seguridad | L1 / L2 / L3 | SL150 / SL2000 / SL3000 | Sin niveles nombrados | Niveles 1 a 3 |
| Control de HDCP | Sí | Sí | Distinto (ver abajo) | Sí |

> **La fila que más problemas causa es la de esquemas de cifrado:** FairPlay solo entiende `cbcs`. Si empaquetas en `cenc` para Widevine y PlayReady, los dispositivos Apple no podrán reproducir tu contenido, hagas lo que hagas con las licencias. Está explicado en [Esquemas de cifrado](#esquemas).

## Widevine

- **Fabricante:** Google
- **System ID:** `edef8ba9-79d6-4ace-a3c8-27dcd51d21ed`
- **En Airi:** `"widevine"`

Es el sistema con más alcance: Android, los navegadores de escritorio basados en Chromium, Firefox, la mayoría de televisores conectados y los dispositivos Chromecast. Si solo vas a activar uno para empezar, activa este.

### L1, L2 y L3

Widevine clasifica los dispositivos según cuánta parte del proceso ocurre dentro de un entorno seguro de hardware (un TEE), fuera del alcance del sistema operativo:

- **L1** — el descifrado y la decodificación de vídeo ocurren dentro del hardware seguro. Es lo que exigen los estudios para 4K y, muchas veces, para 1080p.
- **L2** — el descifrado va en hardware seguro, pero la decodificación no. Poco frecuente en la práctica.
- **L3** — todo en software. El dispositivo no tiene hardware seguro, o no lo expone. Es el caso de casi todos los navegadores de escritorio.

> **Chrome en un ordenador es L3:** Es la causa número uno de «no me funciona en el navegador». Si exiges hardware, estás excluyendo el escritorio entero. Por eso nuestro nivel Estricto avisa de ello, y por eso conviene servir el 1080p y por debajo con reglas más permisivas.

### Lo que configuras en Airi

El campo `security_level` de la política va del 1 al 5 y expresa lo que el dispositivo debe cumplir para recibir la licencia. No es lo mismo que la etiqueta L1/L2/L3, aunque se correspondan a grandes rasgos:

| `security_level` | Qué exige | Equivale más o menos a |
| --- | --- | --- |
| 1 | Criptografía en software | L3 — cualquier dispositivo |
| 2 | Criptografía en software, con la clave protegida |  |
| 3 | Criptografía dentro del hardware seguro | Territorio L1 |
| 4 | Además, decodificación en hardware seguro |  |
| 5 | Toda la cadena en hardware, hasta la salida de vídeo | L1 estricto |

### HDCP

HDCP protege el cable entre el dispositivo y la pantalla, para que no se pueda grabar la señal con un capturador. Se configura con `hdcp`:

- `HDCP_NONE` — sin exigencia. Lo que permite reproducir en monitores viejos y en máquinas virtuales.
- `HDCP_V1` — protección básica; la cumple casi cualquier pantalla moderna.
- `HDCP_V2_2` — lo habitual para 4K. Deja fuera bastantes televisores y adaptadores anteriores a 2015.
- `HDCP_NO_DIGITAL_OUTPUT` — prohíbe cualquier salida digital. Solo pantalla integrada.

También puedes cortar la salida analógica con `disable_analog_output`, y controlar la duración de la licencia y de la reproducción offline con `license_duration_seconds`, `playback_duration_seconds` y `can_persist`.

## PlayReady

- **Fabricante:** Microsoft
- **System ID:** `9a04f079-9840-4286-ab92-e65be0885f95`
- **En Airi:** `"playready"`

Cubre el mundo Microsoft —Windows, Xbox, Edge— y, sobre todo, buena parte de los televisores conectados y descodificadores de operador. Muchos televisores Samsung y LG traen PlayReady además de, o en lugar de, Widevine.

### Niveles de seguridad

| Nivel | Qué es | Cuándo usarlo |
| --- | --- | --- |
| `150` | Solo desarrollo y pruebas. No ofrece protección real. | **Nunca en producción.** |
| `2000` | Implementación en software. El nivel más extendido. | Lo normal para SD y HD. |
| `3000` | Implementación en hardware seguro. | Para 4K y cuando el estudio lo exija. |

> **SL150 no protege nada:** Existe para que los desarrolladores puedan probar sin hardware certificado. Un contenido servido con SL150 está, a efectos prácticos, sin proteger. Nuestros niveles predefinidos nunca lo usan.

### Una particularidad

PlayReady, además de la caja `pssh`, devuelve una **cabecera de protección** (`protectionHeader`) que algunos empaquetadores necesitan por separado. La encontrarás en el campo `drmSystemsData` de la respuesta, junto al `pssh`.

Ojo también con el tipo: en PlayReady el nivel de seguridad es una **cadena de texto** (`"2000"`), no un número. Es la vocabulario del propio sistema y lo respetamos tal cual para que puedas contrastar cualquier traza con lo que tienes configurado.

## FairPlay Streaming

- **Fabricante:** Apple
- **System ID:** `94ce86fb-07ff-4f43-adb8-93d2fa968ca2`
- **En Airi:** `"fairplay"`

El único camino para llegar a iPhone, iPad, Mac con Safari y Apple TV. También el más distinto de los cuatro: si algo se comporta de forma rara en tu integración, casi siempre es FairPlay.

> **FairPlay no devuelve pssh, y no es un error:** Los otros tres sistemas señalizan la protección con una caja `pssh` dentro del vídeo. FairPlay no usa ese mecanismo: la señalización va en la etiqueta `EXT-X-KEY` del manifiesto HLS, con una URI `skd://`. Por eso en nuestra respuesta verás `uriExtXKey` en lugar de `pssh`. Es exactamente lo que tu empaquetador espera.

### Tres restricciones que conviene conocer antes de empezar

1. **Solo HLS.** FairPlay no funciona sobre DASH. Si publicas únicamente DASH, los dispositivos Apple se quedan fuera.
2. **Solo `cbcs`.** No admite `cenc`. Este es el motivo principal por el que hoy se recomienda empaquetar en `cbcs`.
3. **Necesitas un certificado de Apple.** El servidor de licencias FairPlay requiere un certificado emitido por Apple a tu cuenta de desarrollador. Se solicita desde tu cuenta de Apple Developer y lo configura tu proveedor de DRM.

### Qué se puede configurar

FairPlay no tiene niveles de seguridad numerados como Widevine o PlayReady. Su modelo de protección de salida lo gestiona el propio sistema operativo. Lo que sí controlas son las duraciones y la persistencia:

- `rental_duration_seconds` — cuánto vale la licencia desde que se emite.
- `playback_duration_seconds` — cuánto dura la ventana desde que se empieza a reproducir.
- `persistence_is_allowed` — si se permite descargar para ver sin conexión.
- `lease_duration` — para licencias de tipo préstamo.

## WisePlay

- **Fabricante:** Huawei
- **System ID:** `3d5e6d35-9b9a-41e8-b843-dd3c6e72c42c`
- **En Airi:** `"wiseplay"`

El sistema de Huawei, presente en sus móviles con HMS, en HarmonyOS y en sus televisores. Importa sobre todo en el mercado chino y allí donde los dispositivos Huawei tienen peso, porque esos equipos no traen los servicios de Google y por tanto no traen Widevine.

Si tu audiencia está en Europa o América, es muy probable que no lo necesites. Actívalo solo si sabes que lo necesitas: cada sistema que añades no cuesta más dinero —el precio va por clave, no por sistema—, pero sí añade una pieza más que mantener y depurar.

Se configura con `security_level` (1 a 3), `license_type` (`ONLINE` o `PERSISTENT`) y `license_duration_seconds`. Internamente maneja fechas absolutas de inicio y caducidad, que calculamos por ti a partir de la duración.

## Esquemas de cifrado: cenc y cbcs

Esta es la decisión técnica que más caro sale equivocar, porque cambiarla obliga a volver a cifrar todo el catálogo.

Common Encryption define dos formas de cifrar los mismos bytes de vídeo:

|  | `cenc` | `cbcs` |
| --- | --- | --- |
| Cómo cifra | AES en modo CTR, la muestra completa | AES en modo CBC, por patrones (cifra un bloque de cada diez) |
| Widevine | Sí | Sí |
| PlayReady | Sí | Desde PlayReady 4 |
| FairPlay | **No** | Sí |
| WisePlay | Sí | Sí |

> **Un archivo cifrado en cenc no lo puede abrir FairPlay:** No es cuestión de licencias ni de configuración: los bytes están cifrados de una forma que el dispositivo Apple no sabe descifrar. La única salida es volver a empaquetar el contenido en `cbcs`, o mantener dos copias cifradas del catálogo.

> **PlayReady en navegador suele admitir solo `cenc`:** Que un sistema *pueda* hacer `cbcs` no significa que el cliente que tienes delante lo haga. Medido en Edge sobre Windows: EME acepta la robustez `3000`, y aun así el cliente **no admite `cbcs`**. El servidor concede la licencia correcta, el reproductor la recibe, y no puede descifrar. Compruébalo en tu propio equipo desde [la demo](/drm/demo).
> 
> Y hay una trampa mayor esperando debajo: **en Windows no hay un cliente PlayReady, hay dos**, y el nombre del sistema de claves decide cuál te atiende. `com.microsoft.playready` a secas te da el de software, cuyo certificado dice `SecurityLevel: 2000` por muy capaz que sea la máquina. El de hardware solo responde si lo nombras: `com.microsoft.playready.recommendation.3000`. Medido en el mismo equipo, el mismo día: por el primero, el servidor rechaza la clave SL3000; por el segundo, la concede y el 1080p reproduce. Si pides hardware con el cliente de software, la negativa que recibes describe al mensajero, no al aparato — y en Shaka el nombre se cambia con `drm.keySystemsMapping`, no con `preferredKeySystems`.

> **Y hay un segundo motivo, que no depende del navegador:** La cabecera de protección que emite el proveedor para PlayReady declara siempre `ALGID=AESCTR`, es decir, cifrado en modo CTR — aunque el contenido esté empaquetado en `cbcs`, que es CBC. Lo comprobamos pidiéndosela de todas las formas posibles y no cambia. Un cliente PlayReady que sí supiera leer `cbcs` recibiría igualmente una cabecera diciéndole que el vídeo es CTR. **Si necesitas PlayReady, empaqueta en `cenc`**: no es solo una limitación de Edge, es también lo único que la cabecera sabe describir.

### Qué elegir

Depende de si necesitas **PlayReady y Apple a la vez**, y la respuesta honesta es que con un solo juego de archivos no siempre se puede.

| Tu caso | Qué empaquetar |
| --- | --- |
| Web y Android, sin Apple ni PlayReady | `cbcs` o `cenc`, da igual. Widevine hace los dos. |
| Necesitas Apple | `cbcs` obligatorio para el HLS que sirve a FairPlay. |
| Necesitas PlayReady en navegador | `cenc`, porque muchos clientes de Edge no leen `cbcs`. |
| **Necesitas los dos** | Dos empaquetados: **DASH en `cenc`** para Widevine y PlayReady, **HLS en `cbcs`** para FairPlay. Es lo que hacen los servicios grandes. |

Las claves son las mismas en los dos empaquetados: pides una vez y cifras dos. Lo que se duplica es el almacenamiento, no el coste de claves ni de licencias.

> **La elección no pasa por Airi:** El esquema lo decides en tu empaquetador, no al pedir la clave: la misma clave sirve para ambos. Nosotros no vemos ni condicionamos ese paso.

## Cómo elegir para tu caso

### Un catálogo normal, audiencia occidental

Widevine, PlayReady y FairPlay, empaquetado en `cbcs`. Nivel Equilibrado para 1080p y por debajo, Estricto solo si sirves 4K o el estudio lo exige.

### Solo web, sin Apple

Widevine y PlayReady bastan. Ten presente que si algún día quieres llegar a Safari o a iPhone tendrás que reempaquetar, así que empaquetar ya en `cbcs` es una precaución barata.

### Contenido con licencia de estudio

El contrato manda: normalmente exige hardware para 4K y a veces para 1080p. Configura una clave por calidad y aplica el nivel que te pidan a cada una — es exactamente el caso para el que existen las claves por calidad.

### Mercado chino o dispositivos Huawei

Añade WisePlay a los tres anteriores. Los equipos Huawei recientes no tienen Widevine.
