KDM : Authenticated Public

Préface

Authenticated Public contient les métadonnées utiles et lisibles à tous.

Les informations sont en clair, sans chiffrement, ne nécessite aucune cryptographie, ni aucun certificat privé pour lire les données.

Elle est utilisée pour la gestion commune des KDM :

A l'intérieur d'AuthenticatedPublic

Reprenons la partie AuthenticatedPublic de notre précédent KDM en ajoutant des aérations pour une meilleure lecture 1 :

<AuthenticatedPublic Id="ID_AuthenticatedPublic">

  <MessageId>urn:uuid:324767c2-b6c9-40ab-90a1-cb947849e097</MessageId>
  <MessageType>http://www.smpte-ra.org/430-1/2006/KDM#kdm-key-type</MessageType>
  <AnnotationText language="en">KDM</AnnotationText>
  <IssueDate>2022-10-02T21:07:09+00:00</IssueDate>
  
  <Signer xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:X509IssuerName>dnQualifier=\+LLvuYNO4YBJSp9Jjmlv8oippzQ=,CN=.DC.DMS.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509IssuerName>
    <ds:X509SerialNumber>643</ds:X509SerialNumber>
  </Signer>
  
  <RequiredExtensions>
    <KDMRequiredExtensions xmlns="http://www.smpte-ra.org/schemas/430-1/2006/KDM">
    
      <Recipient>
        <X509IssuerSerial xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
          <ds:X509IssuerName>dnQualifier=BnB0iDJLgyqiWUjn1uqrOy2/DEE=,CN=.US1.DCS.DOLPHIN.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509IssuerName>
          <ds:X509SerialNumber>88529450606517722</ds:X509SerialNumber>
        </X509IssuerSerial>
        <X509SubjectName>dnQualifier=1xGSxNEWLq7EwRnJ2EAEBoOTfIY=,CN=LE SPB MD FM SM.IMB-239697.DC.DOLPHIN.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</X509SubjectName>
      </Recipient>
      
      <CompositionPlaylistId>urn:uuid:1ce461e5-548f-4b91-a70a-60b7bc077fb5</CompositionPlaylistId>
      <ContentTitleText language="en">DCP-INSIDE KDM</ContentTitleText>
      <ContentAuthenticator>86yEpVl81kHxy/8bbkZTeXJcVx4=</ContentAuthenticator>
      <ContentKeysNotValidBefore>2010-01-01T00:00:00+02:00</ContentKeysNotValidBefore>
      <ContentKeysNotValidAfter>2040-12-31T23:59:59+02:00</ContentKeysNotValidAfter>
      
      <AuthorizedDeviceInfo>
        <DeviceListIdentifier>urn:uuid:8d000cc3-1ac2-4b65-a01e-aeb3f17a0211</DeviceListIdentifier>
        <DeviceListDescription language="en">my device list</DeviceListDescription>
        <DeviceList>
          <CertificateThumbprint>2jmj7l5rSw0yVb/vlWAYkK/YBwk=</CertificateThumbprint>
        </DeviceList>
      </AuthorizedDeviceInfo>
      
      <KeyIdList>
        <TypedKeyId>
          <KeyType scope="http://www.smpte-ra.org/430-1/2006/KDM#kdm-key-type">MDIK</KeyType>
          <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000001</KeyId>
        </TypedKeyId>
        <TypedKeyId>
          <KeyType scope="http://www.smpte-ra.org/430-1/2006/KDM#kdm-key-type">MDAK</KeyType>
          <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000002</KeyId>
        </TypedKeyId>
        <TypedKeyId>
          <KeyType scope="http://www.smpte-ra.org/430-1/2006/KDM#kdm-key-type">MDSK</KeyType>
          <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000003</KeyId>
        </TypedKeyId>
        <TypedKeyId>
          <KeyType scope="http://www.dolby.com/cp850/2012/KDM#kdm-key-type">MDEK</KeyType>
          <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000004</KeyId>
        </TypedKeyId>
      </KeyIdList>

      <ForensicMarkFlagList>
          <ForensicMarkFlag>http://www.smpte-ra.org/430-1/2006/KDM#mrkflg-picture-disable</ForensicMarkFlag>
          <ForensicMarkFlag>http://www.smpte-ra.org/430-1/2006/KDM#mrkflg-audio-disable</ForensicMarkFlag>
          <ForensicMarkFlag>http://www.dcimovies.com/430-1/2006/KDM#mrkflg-audio-disable-above-channel-12</ForensicMarkFlag>
      </ForensicMarkFlagList>
      
    </KDMRequiredExtensions>
  </RequiredExtensions>
  
  <NonCriticalExtensions/>

</AuthenticatedPublic>

Prenons la base de notre AuthenticatedPublic:

Tag Name Description Obligatoire/Optionnel
MessageId ID unique et créé à la génération du KDM obligatoire
MessageType URI SMPTE obligatoire
AnnotationText Description lisible à propos du contenu du fichier optionel
IssueDate Date d'émission du KDM obligatoire
Signer Bloc permettant d'identifier le créateur du KDM
via une empreinte normée de son certificat
(voir paragraphe sur les Digital Certificates pour comprendre la nomenclature).
obligatoire
RequiredExtensions Coeur des métadonnées du KDM obligatoire 2
NonCriticalExtensions Métadonnées pour les extensions propriétaires optionel

L'élément RequiredExtensions 3 intègre un élément KDMRequiredExtensions qui est l'ajout apporté par la norme KDM à la norme ETM (SMPTE 430-3 - ETM) pour le bloc AuthenticatedPublic. C'est lui qui va intégrer tout le coeur de la métadonnées du KDM. Tout ce qui se trouve à l'intérieur de KDMRequiredExtensions sera normé dans la norme KDM (SMPTE 430-1 - KDM)

L'élément NonCriticalExtensions - vide à 99,99% - peut être utilisé pour des extensions propriétaires. À l'heure actuelle, je n'ai jamais vu ce champ complété, mais je laisse une chance de 0,01% au cas où au moins un KDM avec un NonCriticalExtensions se balade dans les milliards de KDMs générés ces 15 dernières années.

Ces différents éléments (tags) doivent respecter cet ordre.

Un bref passage du côté de Signer

On doit faire un petit passage sur l'élément Signer car il est particulier, il donne un IssuerName 4 et un SerialNumber.

Comme cela, on se dirait que l'empreinte dans IssuerName est l'empreinte du certificat public de l'encodeur (son SubjectName).

Signer est-il normé ?

Signer est une instance XML de KeyInfoType et respecte la norme xmldsig-core, notamment le passage KeyInfo et son schéma xmldsig-core-schema.xsd

Les différents tags sont utilisés dans les différents XML suivants :

KeyInfoTypeX509Data :

Ce n'est pas le cas, c'est le IssuerName du certificat parent, donc l'empreinte de l'autorité de certification (Certificate Authority / CA).

Voyons les métadonnées du certificat public de l'encodeur :

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 643 (0x283)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: O = DC2.SMPTE.DOREMILABS.COM, OU = DC.DOREMILABS.COM, CN = .DC.DMS.DC2.SMPTE, dnQualifier = "+LLvuYNO4YBJSp9Jjmlv8oippzQ="
        Validity
            Not Before: Jan  1 00:00:00 2007 GMT
            Not After : Dec 31 23:59:59 2025 GMT
        Subject: O = DC2.SMPTE.DOREMILABS.COM, OU = DC.DOREMILABS.COM, CN = CS.DMSJP2K-80119.DC.DC2.SMPTE, dnQualifier = SQFYSSqWwjefppqasMJmfdmS6lI=
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:bc:62:a5:fb:33:4f:73:58:2a:6a:03:37:2b:52:
                    (...)
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Key Usage:
                Digital Signature, Key Encipherment, Data Encipherment
            X509v3 Subject Key Identifier:
                49:01:58:49:2A:96:C2:37:9F:A6:9A:9A:B0:C2:66:7D:D9:92:EA:52
            X509v3 Authority Key Identifier:
                keyid:F8:B2:EF:B9:83:4E:E1:80:49:4A:9F:49:8E:69:6F:F2:88:A9:A7:34
                DirName:/O=DC2.SMPTE.DOREMILABS.COM/OU=DC.DOREMILABS.COM/CN=.DMS.DC2.SMPTE/dnQualifier=RQ\/53RmuLsbzgfPXGlRYmJruwMs=
                serial:02
    Signature Algorithm: sha256WithRSAEncryption
    (...)

Pour résumer :

Si nous regardons le Signer d'un KDM signé avec cet encodeur :

<Signer xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:X509IssuerName>dnQualifier=\+LLvuYNO4YBJSp9Jjmlv8oippzQ=,CN=.DC.DMS.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509IssuerName>
    <ds:X509SerialNumber>643</ds:X509SerialNumber>
</Signer>

On trouve IssuerName et SerialNumber mais jamais SubjectName qui est la véritable identité du certificat public de l'encodeur.

Voici une image qui permet de mieux voir les interactions entre un KDM - et le certificat de l'encodeur et le certificat du player :

Restrictions des certificats Feuille (Leaf) Les certificats peuvent avoir des usages et des contraintes.
Si vous voulez en savoir plus, reportez-vous au chapitre Certificats.

À noter que tous les certificats se retrouveront dans la partie Signature > KeyInfo.

A l'intérieur de KDMRequiredExtensions

L'élément KDMRequiredExtensions 5 intègre la grande majorité des métadonnées du KDM : c'est la partie la plus importante de ce bloc.

L'élément KDMRequiredExtensions est un élément ajouté par la norme KDM à la norme ETM (SMPTE 430-3 - ETM) pour le bloc AuthenticatedPublic. C'est lui qui va intégrer tout le coeur de la métadonnées du KDM. Tout ce qui se trouve à l'intérieur de KDMRequiredExtensions sera normé dans la norme KDM (SMPTE 430-1 - KDM)

Cette partie incorpore :

Voyons chaque partie une à une.

Recipient: les informations sur le destinataire

Recipient identifie principalement le récepteur du KDM via des informations provenant des certificats RSA X.509 :

Vous allez me dire pourquoi principalement, car le bloc Recipient intègre l'identité du certificat de l'encodeur mais également l'identité du certificat parent, celui qui a généré le certificat de l'encodeur. C'est donc l'enfant (certificat encodeur) et son parent (autorité de certification) qui seront présent dans le Recipient.

Voici un exemple avec de Recipient pour un player DCP Doremi :

<Recipient>
    <X509IssuerSerial xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509IssuerName>dnQualifier=BnB0iDJLgyqiWUjn1uqrOy2/DEE=,CN=.US1.DCS.DOLPHIN.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509IssuerName>
        <ds:X509SerialNumber>88529450606517722</ds:X509SerialNumber>
    </X509IssuerSerial>
    <X509SubjectName>dnQualifier=1xGSxNEWLq7EwRnJ2EAEBoOTfIY=,CN=LE SPB MD FM SM.IMB-239697.DC.DOLPHIN.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</X509SubjectName>
</Recipient>

Voici un autre exemple pour un player DCP Sony :

<Recipient>
    <X509IssuerSerial xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509IssuerName>dnQualifier=sdc0\+h0GHgU7FAaPqc1qrfFbG3s=,O=DC.CA.Sony.Com,OU=PRO,CN=.Sony.DCIssuerCA.v1</ds:X509IssuerName>
        <ds:X509SerialNumber>8718526774180675236</ds:X509SerialNumber>
    </X509IssuerSerial>
    <X509SubjectName>dnQualifier=Zk3vtTcrDeiozAlBl/VuKiSN6u4=,O=DC.CA.Sony.Com,OU=PRO,CN=SM.Sony.XCT-M10.2400590</X509SubjectName>
</Recipient>

Voici un autre exemple pour un player DCP Christie :

<Recipient>
    <X509IssuerSerial xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509IssuerName>dnQualifier=51kCIGxNmik7js\+N3MPSGt\+ajJ4=,CN=.signer_dcine_christie,OU=Christie Digital Systems,O=ca.christiedigital.com</ds:X509IssuerName>
        <ds:X509SerialNumber>109676</ds:X509SerialNumber>
    </X509IssuerSerial>
    <X509SubjectName>dnQualifier=V4Tuw2ih9WkrBEH/Xlny4ZYNwHI=,CN=SM.Christie.IMB-S2.00000013C935,OU=Christie Digital Systems,O=ca.christiedigital.com</X509SubjectName>
</Recipient>

À l'intérieur de Recipient, vous aurez deux éléments :

Ainsi, le véritable élément qui identifie le player qui doit recevoir ce KDM est le dernier, le X509SubjectName.

L'étude sur leurs valeurs sont en dehors du scope de ce chapitre, elles sont étudiées dans le chapitre Certificats, paragraphe KDM et Recipient pour en savoir plus.

Voici une image qui permet de mieux voir les interactions entre un KDM - et le certificat de l'encodeur et le certificat du player :

CompositionPlaylistId : l'identifiant de la CPL lié au KDM

Un KDM est toujours lié à une CPL via un identifiant (UUID) inscrit dans le tag <CompositionPlaylistId> indiquant l'UUID de la CPL (<Id>). Dit autrement :

KDM.<CompositionPlaylistId> == CPL.<Id>

Il respecte une nomenclature :

Voyons cela avec un exemple de KDM et de CPL côte-à-côte :

KDM CPL
<?xml version="1.0" encoding="UTF-8"?> <DCinemaSecurityMessage (...)> <AuthenticatedPublic (...)> (...) <RequiredExtensions> <KDMRequiredExtensions (...)> <Recipient> <X509IssuerSerial (...)> <ds:X509IssuerName>dnQualifier=xxxx=,CN=xxxx,O=xxxxx</ds:X509IssuerName> <ds:X509SerialNumber>xxx</ds:X509SerialNumber> </X509IssuerSerial> <X509SubjectName>dnQualifier=xxxx,CN=xxxx,OU=xxxx,O=xxxx</X509SubjectName> </Recipient> <CompositionPlaylistId>urn:uuid:1ce461e5-548f-4b91-a70a-60b7bc077fb5</CompositionPlaylistId> <ContentTitleText>xxxx</ContentTitleText> <ContentKeysNotValidBefore>xxxx</ContentKeysNotValidBefore> <ContentKeysNotValidAfter>xxxx</ContentKeysNotValidAfter> (...) <?xml version="1.0" encoding="UTF-8"?> <CompositionPlaylist (...)> <Id>urn:uuid:1ce461e5-548f-4b91-a70a-60b7bc077fb5</Id> <AnnotationText>xxxx</AnnotationText> <IssueDate>xxxx</IssueDate> (...)

A noter que l'UUID de la CPL se retrouvera également dans chaque CipherValue dans le bloc AuthenticatedPrivate.

ContentTitleText : le nom du KDM

Voici quelques exemples valides :

<ContentTitleText>Eiffel_FTR-DVis_S_FR-XX_FR_71-HI-VI-Atmos_4K_PAT_20210630_DGB_SMPTE_OV</ContentTitleText>
<ContentTitleText language="en">Moonlight_FTR_S_EN-XX_51_2K_ALT_20170105_ECL_IOP_OV</ContentTitleText>
<ContentTitleText language="fr">KDM pour le film George</ContentTitleText>

Un simple texte lisible par tous et qui sera utilisé par les différents workflows (TMS, Player DCP) pour afficher la teneur du KDM, en général, on Vous êtes libre de mettre ce que vous voulez, cependant, il est bon de respecter la nomenclature du Digital Cinema Naming Convention.

Notez l'attribut language qui permet de définir la langue utilisée grâce à un code respectant la norme ISO-3166.

ContentAuthenticator (optionnel)

Empreinte de certificat

À COMPLÉTER

ContentKeysNotValid : la gestion des droits à peu de frais

Un KDM a une durée de validité. Un DCP chiffré peut donc être visualisé entre deux dates.

Certains distributeurs (très) paranos font des KDM valides pour seulement quelques heures - ce qui emmerde tout le monde : les laboratoires qui devront faire des KDM à chaque fin de date de validité, et les projectionnistes qui n'ont parfois pas assez de temps pour tester. D'autres sont plus cools et font des dates de validité sur plusieurs mois voire années.

Les deux champs ContentKeysNotValidBefore et ContentKeysNotValidAfter sont donc les dates de validité du KDM et donc de la plage de disponibilité du DCP:

<ContentKeysNotValidBefore>2010-01-01T00:00:00+02:00</ContentKeysNotValidBefore>
<ContentKeysNotValidAfter>2040-12-31T23:59:59+02:00</ContentKeysNotValidAfter>

Voici quelques exemples de dates valides :

<ContentKeysNotValidAfter>2030-01-01T00:00:00+00:00</ContentKeysNotValidAfter>
<ContentKeysNotValidAfter>2021-10-12T00:00:00+02:00</ContentKeysNotValidAfter>
<ContentKeysNotValidAfter>2040-12-31T23:59:59+00:00</ContentKeysNotValidAfter>
<ContentKeysNotValidAfter>2016-01-02T23:59:00+02:00</ContentKeysNotValidAfter>
<ContentKeysNotValidAfter>2017-01-31T18:55:47+08:00</ContentKeysNotValidAfter>
<ContentKeysNotValidAfter>2017-01-31T18:55:47-05:00</ContentKeysNotValidAfter>

Les dates sont normalisées avec la RFC-3339 - Section 5.6 et doivent être de 25 caractères.

Assez rapidement, on constate que :

A noter que ces dates se retrouveront également dans chaque CipherValue dans le bloc AuthenticatedPrivate (et seront donc chiffrés).

A quoi servent ces dates concrètement ?

La specification DCI impose la possibilité de faire de la gestion de droits (DRM).

En cryptographie, il n'existe aucun algorithme à cryptographie temporelle : cela veut dire qu'il est impossible d'imposer à un cryptogramme un déchiffrement possible seulement à une date ou durant durée.

Ainsi, le déchiffrement sur le CipherValue est illimité dans le temps : Si vous possédez le certificat privé qui a servi pour le chiffrement des CipherValue, vous pouvez déchiffrer les CipherValue et récupérer les clefs de déchiffrement AES même après la fin de validité officielle du KDM.

Ces dates ne sont respectées que par les devices ayant leurs certifications DCI. Il est important de ne pas oublier cela: ces dates ne sont que des métadonnées qui n'auront aucun impact sur le déchiffrement RSA si vous possédez la clef privée. 6

AuthorizedDeviceInfo

À COMPLÉTER

Ce bloc permet de définir plus finement qui a le droit d'utiliser ce KDM. Ce bloc ne joue aucun rôle dans la validation du KDM.

Ce bloc contient 3 éléments :

<AuthorizedDeviceInfo>
  <DeviceListIdentifier>urn:uuid:8d000cc3-1ac2-4b65-a01e-aeb3f17a0211</DeviceListIdentifier>
  <DeviceListDescription language="en">my device list</DeviceListDescription>
  <DeviceList>
    <CertificateThumbprint>2jmj7l5rSw0yVb/vlWAYkK/YBwk=</CertificateThumbprint>
  </DeviceList>
</AuthorizedDeviceInfo>

KeyIdList : la liste des identifiants des clefs

Ce bloc effectue une simple liste des différents identifiants - ainsi que les types des assets - liés à nos clefs AES.

<KeyIdList>
  <TypedKeyId>
    <KeyType scope="http://www.smpte-ra.org/430-1/2006/KDM#kdm-key-type">MDIK</KeyType>
    <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000001</KeyId>
  </TypedKeyId>
  <TypedKeyId>
    <KeyType scope="http://www.smpte-ra.org/430-1/2006/KDM#kdm-key-type">MDAK</KeyType>
    <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000002</KeyId>
  </TypedKeyId>
  <TypedKeyId>
    <KeyType scope="http://www.smpte-ra.org/430-1/2006/KDM#kdm-key-type">MDSK</KeyType>
    <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000003</KeyId>
  </TypedKeyId>
  <TypedKeyId>
    <KeyType scope="http://www.dolby.com/cp850/2012/KDM#kdm-key-type">MDEK</KeyType>
    <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000004</KeyId>
  </TypedKeyId>
</KeyIdList>

Chaque entrée TypedKeyId aura son entrée CipherValue dans la partie AuthenticatedPrivate. Ainsi, si nous avons 4 entrées ici, nous savons que nous aurons 4 CipherValue dans AuthenticatedPrivate.

Notez qu'ici, ce ne sont pas nos clefs AES, juste des UUIDs présents dans la CPL et simplement répliquées ici pour aider à la gestion par des équipements tiers ne pouvant déchiffrer la partie chiffrée.

Par exemple, si nous ne sommes pas le récepteur (donc nous n'avons pas le certificat privé pour déchiffrer la partie AuthenticatedPrivate), nous pouvons contrôler si le KDM possède le même nombre d'entrées de clefs que notre CPL 7 :

$ grep "<KeyId>" CPL.xml
  <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000001</KeyId>
  <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000002</KeyId>
  <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000003</KeyId>
  <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000004</KeyId>

$ grep "<KeyId>" KDM.xml
  <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000001</KeyId>
  <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000002</KeyId>
  <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000003</KeyId>
  <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000004</KeyId>

KeyType : le type de l'asset lié à la clef

<TypedKeyId>
  <KeyType scope="http://www.smpte-ra.org/430-1/2006/KDM#kdm-key-type">MDIK</KeyType>
  <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000001</KeyId>
</TypedKeyId>

Le KeyType indique le type de l'asset lié à cette clef et est résumé par un code à 4 lettres.

Le type d'asset est déterminé dans la CPL : par exemple, un MainPicture dans une CPL devient un MDIK dans un KDM.

Voici les codes définis dans la norme et courants dans les KDM :

Code Type Type d'asset dans la CPL
MDIK Image Essence Key MainPicture
MainSteroscopicPicture
MDAK Sound Essence Key MainSound
MDSK Subtitle Essence Key MainSubtitle
MainCaption
MainClosedCaption
ClosedCaption
ClosedSubtitle
MDEK AuxData Essence Key AuxData
Enhanced Audio (Immersive Audio / DolbyAtmos / DTS-X / Auro, ...)

Et des codes définis dans la norme mais jamais rencontrés sur le terrain :

Code Type
FMIK Image Forensic Marking Key
FMAK Sound Forensic Marking Key
MDX1 Aux Data Type 1 Key
MDX2 Aux Data Type 2 Key
MDMK MIC Key
Et les autres assets dans une CPL ? Sauf si les normes SMPTE évoluent, les autres assets n'ont pas de chiffrement : Si vous tentez de placer un KeyId dans ces assets au sein de la CPL, vu qu'ils n'ont pas de code car ne contenant pas d'éléments cryptographiques normés, certains encodeurs vont créer un KDM avec ces assets mais leur code resteront vide ou nul (NULL, None, Undefined, ...). D'autres peuvent très bien refuser de créer un KDM.

Ce code est également présent dans la partie CipherValue.

KeyId : l'identifiant de la clef de l'asset chiffré

<TypedKeyId> <KeyType scope="http://www.smpte-ra.org/430-1/2006/KDM#kdm-key-type">MDIK</KeyType> <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000001</KeyId> </TypedKeyId>

Les KeyId sont les identifiants uniques (UUID) des clefs AES servant à chiffrer les MXF.

Dans un MXF chiffré, cet UUID est inscrit dans le KLV Cryptographic Context dans le champ Cryptographic Key ID.

Dans chaque CPL, vous avez plusieurs assets, ceux chiffrés comportent un tag KeyId contenant un UUID.

Selon la norme KDM, il faut l'intégralité des KeyId placés dans une CPL. [6]

Un exemple de partie AssetList d'une CPL :

<!-- Exemple partie CPL -->
  (...)
  <ReelList>
    <Reel>
      <Id>urn:uuid:1db4c5eb-89f5-45e6-87d2-ea8894f9aa5d</Id>
      <AssetList>
        <MainPicture>
          <Id>urn:uuid:3bd3d849-117b-46b0-bc45-3d3228c987c6</Id>
          <EditRate>24 1</EditRate>
          <IntrinsicDuration>24</IntrinsicDuration>
          <EntryPoint>0</EntryPoint>
          <Duration>24</Duration>
          <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000001</KeyId>
          <Hash>hnBSgENJXOvI6bfpat7GA1VImss=</Hash>
          <FrameRate>24 1</FrameRate>
          <ScreenAspectRatio>4096 2160</ScreenAspectRatio>
        </MainPicture>
        <MainSound>
          <Id>urn:uuid:3433a00f-4bc8-4c16-b33c-b0b0d65711af</Id>
          <EditRate>24 1</EditRate>
          <IntrinsicDuration>24</IntrinsicDuration>
          <EntryPoint>0</EntryPoint>
          <Duration>24</Duration>
          <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000002</KeyId>
          <Hash>ACd4Aky39E608RNnVfAOisPICZ4=</Hash>
        </MainSound>
      </AssetList>
    </Reel>
  </ReelList>
  (...)

Lors d'une création d'un KDM, le générateur de KDM va tout d'abord lire une CPL pour en extraire différents éléments :

Il va inscrire chaque KeyId dans la KeyIdList (partie AuthenticatedPublic), puis va piocher dans sa banque de clefs AES pour démarrer le processus de chiffrement RSA - avec des informations en sus - et stocker le tout dans les CipherValue (partie AuthenticatedPrivate).

Si vous n'avez pas tout compris sur la partie CipherValue, pas de panique, on verra cela plus en détail dans le paragraphe AuthenticatedPrivate. Il faut juste retenir que les différentes KeyId d'une CPL seront intégrés dans notre KeyIdList de notre AuthenticatedPublic.

ForensicMarkFlag : les options du KDM

<!-- Exemple avec beaucoup (trop) de ForensicMarkFlag -->
<ForensicMarkFlagList>
    <ForensicMarkFlag>http://www.smpte-ra.org/430-1/2006/KDM#mrkflg-picture-disable</ForensicMarkFlag>
    <ForensicMarkFlag>http://www.smpte-ra.org/430-1/2006/KDM#mrkflg-audio-disable</ForensicMarkFlag>
    <ForensicMarkFlag>http://www.dcimovies.com/430-1/2006/KDM#mrkflg-audio-disable-above-channel-12</ForensicMarkFlag>
</ForensicMarkFlagList>

Les Forensics Mark Flags sont des éléments un peu particuliers, ils permettent de contrôler l'activation ou la désactivation de certains paramètres de sécurité (Forensic Mark / Watermarking).

Ils sont utiles dans des cas de figure particuliers liés aux matériels en salle et suivant leurs paramètres, leurs (non-)fonctionnalités ou autres. Certains matériels peuvent ne pas supporter certains types de forensic-mark ou bien refuser de jouer certains assets avec certains forensic-marks.

Par exemple, le mrkflg-audio-disable-above-channel-12 est utile que pour certains players DCI dans un contexte précis avec un DCP contenant des pistes Dolby Atmos qui pourraient ne pas être correctement jouées (voir le chapitre Immersive Audio, paragraphe KDM, pour plus d'informations).

Les laboratoires doivent être parfaitement au courant du type de Forensic Mark Flags à activer suivant le type de récepteur.

Les Forensic Mark Flags tendent à être de moins en moins utiliser avec les évolutions de matériel en salle et le support de certaines nouvelles fonctionnalités supportées à chaque mise-à-jour.

Code ForensicMarkFlag Description
mrkflg-picture-disable Désactive le forensic-mark pour les assets liés à à la KeyType MDIK (Picture)
mrkflg-audio-disable Désactive le forensic-mark pour les assets liés à à la KeyType MDAK (utilisé pour DBOX par exemple)
mrkflg-audio-disable-above-channel-<XX> Désactive le forensic-mark pour les channels de <XX> et supérieurs
mrkflg-audio-disable-above-channel-12 Désactive le forensic-mark du channel 12 à au delà (utile dans certains cas pour l'Immersive Audio / Dolby Atmos)
mrkflg-mdx1-<UUID>-disable Désactive le forensic-mark pour les KeyType MDX1 et avec comme KeyId <UUID>
mrkflg-mdx2-<UUID>-disable Désactive le forensic-mark pour les KeyType MDX2 et avec comme KeyId <UUID>
mrkflg-enh-audio-disable Désactive le forensic-mark pour les KeyType MDEK (utilisé pour le signal de synchronisation de l'Immersive Audio / Dolby Atmos)

Et avec (l'ancien) encodeur KDM de Doremi ?

Petite interlude historique 8, pour générer des KDM avec (l'ancien) encodeur KDM de Doremi, il faudra fournir un fichier ORCA dont voici quelques paramètres spécifiques pour le Forensic:

* Normal
    <ForensicVideo>On</ForensicVideo>
    <ForensicAudio>On</ForensicAudio>

* Atmos
    <FirstForensicAudioDisabledChannel>12</FirstForensicAudioDisabledChannel>
    <ForensicVideo>On</ForensicVideo>
    <ForensicAudio>On</ForensicAudio>

* Dbox
    <FirstForensicAudioDisabledChannel>12</FirstForensicAudioDisabledChannel>
    <ForensicVideo>On</ForensicVideo>
    <ForensicAudio>On</ForensicAudio>

* Disable Audio Watermarking
    <ForensicAudio>Off</ForensicAudio>

    Le KDM aura un flag supplémentaire :
    <ForensicMarkFlag>http://www.smpte-ra.org/430-1/2006/KDM#mrkflg-audio-disable</ForensicMarkFlag>

* Disable Video Watermarking
    <ForensicVideo>On</ForensicVideo>

    Le KDM aura un flag supplémentaire :
    <ForensicMarkFlag>http://www.smpte-ra.org/430-1/2006/KDM#mrkflg-picture-disable</ForensicMarkFlag>

NonCriticalExtensions : les extensions propriétaires

C'est la partie utilisée par des extensions propriétaires. Jamais rencontré depuis la création (2005), il me sera difficile d'en dire plus. Si vous avez des KDM possédant des éléments, je suis (très) preneur.

Sous chapitres

Chapitres connexes

Notes


  1. Le format des UUID des KeyId dans les exemples ne respectent pas ««« totalement »»» la norme SMPTE : 

    <KeyId>urn:uuid:abadcafe-abad-cafe-abad-cafe00000001</KeyId>
    

    Alors qu'il devrait avoir le Field Version à 4:

    <KeyId>urn:uuid:abadcafe-abad-4afe-abad-cafe00000001</KeyId

    C'est pour les exemples :)

  2. Dans la norme ETM, elle est considérée comme optionnelle, mais avec l'application de la norme KDM, elle devient obligatoire car elle contient des informations essentielles à la bonne gestion du KDM. 

  3. Dans la norme ETM, elle est considérée comme optionnelle, elle devient obligatoire avec la norme KDM 

  4. Pourquoi le IssuerName à la place de SubjectName comme identité du certificat ? Voici quelques pistes normatives :  

    • An X.509 certificate is identified by name of the Certificate Authority (CA) that issued it, called IssuerName, and the unique serial number assigned by the CA, called SerialNumber -- SMPTE 430-3 - KDM

    • The issuer name and serial number identify a unique certificate -- RFC 2459 - Serial Number

    • Les KeyUsage et BasicConstraint peuvent empêcher des certificats de pouvoir signer des documents, dont des KDM (SMPTE 430-2 - Certificates)

  5. Dans la norme ETM, elle est considérée comme optionnelle, elle devient obligatoire avec la norme KDM 

  6. C'est un tout petit mensonge pour éviter certaines confusions : les dates font partie des données du CipherValue, elles auront donc un impact sur le résultat final lors d'un chiffrement et donc d'un déchiffrement car, dans toute cryptographie un peu sérieuse, chaque bit supplémentaire dans les données à chiffrer entraine un changement irrémédiablement sur l'entièreté du résultat final chiffré. La première affirmation reste vraie dans l'absolue : même après la date de validité, si vous possédez le certificat privé, vous pourrez déchiffrer les différents CipherValue sans aucune limitation dans le temps. 

  7. Notez qu'il est possible de ne pas avoir le même nombre d'entrées, c'est extrêmement rare mais j'en ai déjà rencontré. 

    Pas de panique, la norme demande à ce que toutes les clefs soient intégrées dans un seul et même KDM : All keys shall be for use with the assets referenced by the Composition Playlist -- SMPTE 430-1 - KDM. Vous aurez donc autant d'entrées KeyId des deux côtés.

    Cependant, dans les normes ETM et KDM, il n'existe aucun tag ou élement indiquant qu'un KDM est partiel. Certains encodeurs peuvent mettre en commentaire ce type d'information mais cela reste en dehors des normes et non-interprété par les différents gestionnaires de KDM, players inclus.

    Techniquement, rien n'empêche de générer plusieurs KDMs avec une partie des clefs avec nos propres outils (ou même générer une fausse CPL avec un CPLId déjà existant et que certaines KeyId. Mais là, on tire l'idée à l'extrème, même si techniquement, elle reste valide).

    Enfin, dans les faits, un projectionniste peut recevoir un KDM en amont, avant son DCP et il doit pouvoir quand même ingester ce KDM sans souci. Sans possibilité de comparer avec la CPL liée, il est exclu de refuser un KDM. Après, est-ce que certains players peuvent refuser lorsqu'ils possèdent enfin la CPL ? Je n'ai jamais eu de retour à ce sujet.

  8. Depuis le rachat de Doremi par Dolby, l'encodeur KDM Doremi n'est plus vendu.