Résumé
- Le projet actif du groupe de travail CBOR distingue trois ensembles : sérialisation générale, preferred-plus et déterministe. Le dernier ajoute à preferred-plus un tri lexicographique, octet par octet, des clés de carte déjà encodées de façon déterministe ; ce tri stabilise les octets, sans conférer un ordre métier à la carte.
- Le déterminisme devient nécessaire lorsque deux parties reconstruisent séparément l’entrée d’une signature, d’un hachage, d’une adresse de contenu ou d’une comparaison. Il ne l’est normalement pas lorsque les octets protégés sont transmis tels quels, et il ne prouve jamais qu’une donnée est complète, actuelle ou autorisée.
L’incident aurait pu être classé comme « erreur cryptographique ». La signature était invalide côté destinataire et valide côté émetteur. Pourtant, avant l’encodage, les journaux montraient la même carte et les mêmes valeurs. Une inspection binaire a révélé deux libertés invisibles dans l’affichage : l’une des bibliothèques avait utilisé une largeur d’argument plus longue, l’autre avait émis les clés selon leur ordre d’insertion. Les deux suites d’octets étaient du CBOR valide. Elles n’étaient pas identiques.
Ce cas fictif concentre l’enjeu de draft-ietf-cbor-serialization-08. Daté du 29 juillet 2026, le texte est un Internet-Draft actif du groupe de travail CBOR, en dernière consultation du groupe. Le Datatracker lui attribue encore l’état IESG I-D Exists. Il ne faut donc ni le présenter comme un RFC achevé, ni en déduire qu’une bibliothèque ou un déploiement donné le respecte. Sa contribution est de fournir un vocabulaire opérationnel pour choisir la quantité exacte de liberté qu’un protocole laisse à ses encodeurs.
CBOR sépare utilement le modèle de données de sa représentation. Une même valeur peut avoir plusieurs sérialisations permises. Cette souplesse aide le streaming, les appareils contraints et l’interopérabilité avec des producteurs variés. Elle devient un défaut uniquement lorsqu’une couche ultérieure suppose, sans le dire, que la valeur possède une représentation binaire unique.
Trois périmètres de compatibilité
La sérialisation générale est le choix théorique par défaut quand un protocole fondé sur CBOR ne précise rien. Pour chaque type pris en charge, le décodeur doit accepter toutes les représentations que CBOR permet, y compris les longueurs définies et indéfinies. Le projet signale toutefois que cette largeur d’acceptation est peu répandue en pratique. L’étiquette « compatible CBOR » ne suffit donc pas à prédire ce que le binaire réellement déployé acceptera.
La sérialisation preferred-plus réduit les degrés de liberté de l’émetteur. Les arguments prennent leur forme la plus courte ; les flottants utilisent la représentation exacte la plus courte ; les longueurs sont définies ; le traitement prévu pour NaN s’applique ; les entiers et grands entiers sont normalisés selon les règles héritées. Elle vise le cas courant sans imposer le tri des cartes.
La sérialisation déterministe ajoute à preferred-plus une règle décisive : les éléments d’une carte sont triés selon l’ordre lexicographique des octets qui composent l’encodage déterministe de leurs clés. Deux encodeurs indépendants, recevant le même modèle bien défini, disposent ainsi d’une voie vers les mêmes octets.
Il ne s’agit pas d’une échelle où le dernier niveau serait toujours supérieur. La sérialisation générale conserve des possibilités dont certains protocoles ont besoin : émission progressive par longueurs indéfinies, distinction applicative entre grand entier et entier ordinaire, ou conservation de NaN non triviaux. Le déterminisme retire volontairement ces choix. Il faut donc le sélectionner pour une propriété requise, non pour afficher une pureté abstraite.
Le versant décodage évite une autre confusion. Le décodage dit déterministe n’ajoute aucune obligation au-delà de preferred-plus. Produire une forme déterministe n’implique pas automatiquement de rejeter toute autre forme reçue. Un protocole peut choisir un encodeur étroit et un décodeur plus large. S’il veut interdire les autres représentations à l’entrée, il doit l’énoncer et tester ce refus séparément.
Suivre les octets protégés
La bonne question n’est pas « utilisons-nous une signature ? », mais « le vérificateur reçoit-il les octets signés ou doit-il les reconstruire ? »
Quand l’émetteur signe une charge utile CBOR puis transmet exactement cette suite d’octets avec la signature, le destinataire peut vérifier ce qu’il a reçu. Il n’a pas à décoder puis réencoder la valeur. Le projet prend les charges utiles COSE comme cas intuitif : la cryptographie exige une entrée binaire commune, pas nécessairement une sérialisation déterministe de tout objet imaginable.
À l’inverse, la structure Sig_structure de COSE est assemblée séparément par le signataire et le vérificateur. Si chacun laisse ses valeurs par défaut décider des largeurs, des flottants ou de l’ordre des clés, les entrées cryptographiques peuvent diverger malgré l’égalité apparente des valeurs. Le même besoin surgit pour une adresse de contenu, une clé de cache, une déduplication ou un manifeste reproductible.
Cette frontière doit être dessinée avec précision. Rendre déterministe Sig_structure ne rend pas nécessairement déterministe une charge utile intégrée, une enveloppe externe ni tous les futurs objets du système. Une règle locale ne doit pas devenir par accident une politique globale qui rendrait le streaming impossible ou casserait des données historiques.
Un diagramme simple suffit souvent : quelles suites d’octets franchissent la liaison intactes ? Quelles structures sont décodées puis réencodées ? Où deux systèmes construisent-ils indépendamment une entrée supposée identique ? Chaque réponse doit pointer vers un profil, une version, une bibliothèque et un test observable.
Le tri binaire n’invente pas un ordre métier
Dans le modèle générique de CBOR, une carte n’est pas ordonnée. La règle déterministe trie les clés pour obtenir une représentation répétable. Elle ne décide pas quelle règle doit être appliquée en premier, quel champ prévaut ou dans quel ordre une interface doit afficher les éléments.
Cette erreur est tentante parce qu’un analyseur de paquets présente toujours une séquence. Un langage conserve parfois l’ordre d’insertion ; une autre bibliothèque restitue l’ordre reçu ; une table de hachage peut encore faire autrement. Tous peuvent exposer la même carte. Une application qui a besoin de priorité doit la modéliser par un tableau, un champ de rang ou une règle explicite.
Le tri ne règle pas davantage les clés dupliquées, les balises autorisées, l’évolution de schéma, les champs inconnus ou l’équivalence de deux valeurs. Preferred-plus devient de fait déterministe lorsqu’il n’existe aucune carte, mais cette propriété binaire ne tranche pas le sens d’une balise ni la conséquence d’un membre absent.
L’égalité des octets peut être plus stricte que l’égalité sémantique. Deux valeurs que le métier juge équivalentes peuvent être rejetées par une comparaison binaire. À l’inverse, deux octets identiques peuvent décrire une demande périmée ou insuffisante. Normalisation Unicode, types numériques, valeurs par défaut et interprétation des balises appartiennent au contrat applicatif.
Le terme « canonique » masque souvent ces choix. Le profil applicatif distinct décrit par draft-mcnally-deterministic-cbor-17 réduit encore l’espace CBOR. Ses contraintes ne doivent pas être attribuées au projet du groupe de travail. Un dossier d’audit doit nommer le profil et sa révision, pas se contenter de « CBOR canonique ».
La signature atteste des octets, pas la décision
Une signature valide sur une structure reconstruite de manière déterministe fournit un reçu précieux : un algorithme et une clé déterminés ont protégé cette suite d’octets. Elle ne prouve pas que cette suite contenait toutes les informations pertinentes.
Elle ne garantit ni que le schéma était complet, ni que la balise était autorisée dans ce contexte, ni que l’horodatage était actuel. Elle ne démontre pas que l’émetteur avait encore compétence, qu’un champ facultatif important n’a pas été omis ou que la politique locale autorisait l’action. Elle n’observe pas non plus l’effet final.
Il faut conserver des reçus distincts pour le modèle d’information, le modèle CBOR, les octets sérialisés, la vérification cryptographique, la validation sémantique, la politique, l’autorisation, la tentative d’exécution et l’effet constaté. Un indicateur vert ne doit pas absorber l’autorité du suivant.
CDDL décrit utilement la forme de données CBOR. Le mécanisme de contrôle de sérialisation évoqué par le projet peut associer une exigence de représentation à cette description. Mais un schéma n’est ni le code exécuté ni une décision d’autorisation. Une correspondance CDDL ne dit pas quelle version du parseur a tourné, comment les doublons ont été traités ou si la mutation attendue a été validée dans l’état persistant.
COSE et CWT montrent pourquoi l’autorité reste distribuée. Un cadre générique sert plusieurs protocoles de bout en bout. Il ne peut connaître toutes leurs contraintes de reconstruction, de streaming ou d’équivalence. Lorsque le cadre ne fixe pas l’ensemble, le projet recommande preferred-plus, puis laisse au protocole intégrateur le soin d’énoncer ses exigences. La valeur par défaut d’une bibliothèque ne constitue pas ce contrat.
Tester l’acceptation réelle
Le décalage entre l’obligation générale et les décodeurs courants est une dette mesurable. Une équipe peut acheter « du CBOR » et découvrir qu’un service refuse les chaînes de longueur indéfinie, qu’un autre accepte des largeurs alternatives jamais exercées, et qu’un troisième transforme silencieusement un grand entier.
La preuve de fonctionnement doit nommer la bibliothèque, sa version, ses options, le profil d’encodage, le profil de décodage, le schéma, la valeur d’entrée, les octets émis, les variantes acceptées et le résultat applicatif. Des vecteurs dorés doivent comparer plusieurs implémentations indépendantes, pas seulement faire aller-retour dans la même bibliothèque.
Les essais négatifs révèlent les frontières : soumettre une forme générale légale à un décodeur qui revendique l’ensemble général ; soumettre une largeur non minimale à une porte preferred-plus ; permuter l’insertion des clés ; franchir les limites entre entier et grand entier ; varier longueurs définies et indéfinies ; exercer flottants et NaN. Il faut enregistrer le modèle obtenu et la décision qui suit, pas seulement « parse OK ».
Un test d’encodeur ne prouve pas la largeur du décodeur. Un test d’acceptation ne prouve pas les octets émis. Un aller-retour local peut masquer les deux, car la même bibliothèque reproduit ses propres habitudes. L’interopérabilité commence lorsque deux chemins indépendants comparent des artefacts exacts.
Les valeurs spéciales révèlent le modèle caché
Preferred-plus choisit la représentation flottante exacte la plus courte et la forme silencieuse triviale prévue pour NaN. Or certains domaines conservent une charge utile NaN ou lui accordent une signification. Si cette information compte, le protocole a besoin d’un contrat particulier ; il ne peut promettre simultanément sa conservation et appliquer sans nuance le profil déterministe.
La même logique vaut pour les grands entiers distingués des entiers ordinaires ou pour un producteur qui ne connaît pas encore la taille finale d’un flux. Ce sont des motifs valables de conserver une sérialisation générale ou spéciale. L’exception doit être écrite comme exigence de bout en bout et testée, au lieu de survivre comme option secrète d’un encodeur.
Le meilleur périmètre commun est souvent le plus petit qui résout le désaccord. Imposer le déterminisme là où des octets sont reconstruits ; préférer preferred-plus pour les échanges ordinaires compatibles avec ses restrictions ; garder une forme plus large lorsque l’application en dépend. C’est la logique de spécification initiale minimale : coordonner ce qui doit être commun, laisser les décisions futures locales lorsqu’elles ne menacent pas l’interopérabilité.
Réduire un canal caché sans déclarer la victoire
Plusieurs représentations légales d’une même valeur peuvent transporter un signal absent du modèle décodé. Un composant compromis peut choisir des largeurs d’arguments, segmenter des chaînes indéfinies ou exploiter d’autres variantes pour exfiltrer quelques bits. Les règles preferred-plus et déterministes réduisent cette marge et rendent la variation anormale plus visible.
Elles ne prouvent pas l’absence de tout canal. Un attaquant peut sélectionner des valeurs autorisées, manipuler des horodatages, choisir des balises, exploiter une couche de remplissage, le rythme des paquets ou l’ordre des événements avant même l’encodage. Le contrôle doit donc être formulé avec exactitude : pour ce corpus sémantique figé, ce producteur a émis les octets attendus.
Enregistrer un condensat des octets et le modèle normalisé à une frontière de confiance peut aider, sous réserve de minimisation et de durée de conservation. Une divergence d’un producteur censé être déterministe mérite une alerte. Elle indique une option, une version ou une entrée différente ; elle ne révèle pas automatiquement une compromission.
Un reçu qui résiste au changement de bibliothèque
Le dossier utile relie le protocole et sa révision, l’ensemble de sérialisation exigé à chaque frontière, le profil du modèle CBOR, les balises et types de clés permis, la politique de doublons, le schéma, la bibliothèque d’encodage et ses options, le décodeur et sa matrice d’acceptation, la valeur source, les octets ou leur condensat vérifiable, l’entrée cryptographique, la provenance de clé, le résultat de vérification, la validation sémantique, la politique, l’autorisation et l’effet.
Les responsabilités restent séparées. Les auteurs de protocole définissent la frontière binaire. Les développeurs prouvent ce qui est émis et accepté. La sécurité tient la preuve cryptographique et la robustesse du parseur. Le propriétaire applicatif définit le sens ; l’autorité métier accorde ou refuse l’action ; l’exploitation constate le résultat. Un identifiant borné et un horodatage permettent de joindre les reçus sans les confondre.
La primauté du code exécuté, chez Lu Heng, demande quelle version et quelle option ont effectivement tourné. Les couches de réalité empêchent les octets déterministes d’emprunter l’autorité du schéma, puis la signature d’emprunter celle de la décision. Cette discipline ne diminue pas la norme : elle lui confie exactement le rôle qu’elle peut remplir.
Le déterminisme CBOR résout donc un problème précis. Il permet à des encodeurs indépendants de converger sur une suite d’octets. La valeur peut être égale alors que les octets divergent ; les octets peuvent être égaux alors que le sens demeure incomplet ; le sens peut être accepté alors que l’action reste interdite. L’architecture robuste conserve ces trois constats séparés.
Sources
- CBOR Serialization Considerations, révision 08
- Fiche Datatracker de CBOR Serialization Considerations
- Historique des révisions de CBOR Serialization Considerations
- CBOR Serialization Considerations, révision 07
- RFC 8949 : Concise Binary Object Representation
- RFC 9052 : CBOR Object Signing and Encryption
- RFC 8392 : CBOR Web Token
- RFC 8610 : Concise Data Definition Language
- RFC 9413 : Maintaining Robust Protocols
- Profil applicatif Deterministic CBOR, révision 17
- Lu Heng : Running-Code Primacy
- Lu Heng : Minimum Initial Specification, Localized Future Decision, and Voluntary Adoption
- Lu Heng : On Reality Layers, Symbolic Power, and Why Clarity Feels So Hostile
Briefing des membres
Contexte approfondi du profil
Connectez-vous avec le bon niveau d'adhésion pour débloquer le briefing complet et les notes de source.
Réservé à Strategic Circle
Strategic Circle
Ouvert à tous les lecteurs. Débloquez les briefings de profil après adhésion et connexion.
Rejoindre Strategic CircleRéservé aux membres de Leadership Alliance
Leadership Alliance
Réservé aux propriétaires et dirigeants qualifiés d'actifs IP ; connectez-vous pour débloquer les briefings Alliance.
Rejoindre Leadership Alliance
