OVHcloud LabsOVHcloud LabsoCCAM

TransparencyTransparence

DemoDémo (opens in a new tab) (s'ouvre dans un nouvel onglet)

OVHcloud Confidential Computing Attestation Manager

Check the verifier yourselfVérifiez vous-même le vérificateur

oCCAM is OVHcloud's attestation service for confidential VMs on AMD SEV-SNP and Intel TDX. Its verdicts are signed by the decision plane, which runs in AMD SEV-SNP guests. This is oCCAM's public page in one region: the items below let you recompute the decision plane's measurement and check how it was released, on your own machine, without trusting the operator.oCCAM est le service d'attestation d'OVHcloud pour les VM confidentielles sur AMD SEV-SNP et Intel TDX. Ses verdicts sont signés par le plan de décision, qui tourne dans des invités AMD SEV-SNP. Voici la page publique d'oCCAM dans une région : les éléments ci-dessous vous permettent de recalculer la mesure du plan de décision et de vérifier comment il a été publié, sur votre propre machine, sans faire confiance à l'opérateur.

The decision plane in serviceLe plan de décision en serviceThe commandsLes commandesThe demoLa démo

The demo is a demonstration: VMs of a demonstration tenant attested step by step in your browser. This page is where its verifier is checked.La démo est une démonstration : des VM d'un tenant de démonstration attestées pas à pas dans votre navigateur. C'est ici que son vérificateur se vérifie.

1. What you verify1. Ce que vous vérifiez

sources, archive, launch bundle, SEV-SNP measurement, release log, AMD-signed report, signing key, verdicts NAMEDNOMMÉ Sources at one commitLes sources d'un commit named in the bundle's manifestnommé dans le manifeste du lot LIVEEN SERVICE Reproducible buildConstruction reproductible the archive rebuilt from the commitl'archive reconstruite du commit LIVEEN SERVICE Launch bundleLot de lancement OVMF · kernel · initrd · command lineOVMF · noyau · initrd · ligne de commande /.well-known/decision-plane-bundle LIVEEN SERVICE SEV-SNP measurementMesure SEV-SNP 48 bytes, the value you pin48 octets, la valeur que vous épinglez LIVEEN SERVICE Release logJournal signed offline, RFC 9162 treesigné hors ligne, arbre RFC 9162 LIVEEN SERVICE Guest report, signed by AMDRapport signé par AMD VCEK, ASK, ARK: AMD's chainVCEK, ASK, ARK : la chaîne d'AMD /.well-known/signer-evidence LIVEEN SERVICE Result-signing keyClé des résultats born in the guest, bound by REPORT_DATAnée dans l'invité, liée par REPORT_DATA LIVEEN SERVICE Verdicts (EAT, ES256)Verdicts (EAT, ES256) checked with that key and no othervérifiés avec cette clé et nulle autre
  1. The measurement in serviceLa mesure en service LIVEEN SERVICE
    48 bytes: the digest of exactly what the decision-plane guests booted. The value a Relying Party pins. Record: /.well-known/decision-plane-bundle.48 octets : l'empreinte exacte de ce qu'ont démarré les invités du plan de décision. La valeur qu'un Relying Party épingle. Enregistrement : /.well-known/decision-plane-bundle.
  2. The launch bundleLe lot de lancement LIVEEN SERVICE
    OVMF.fd, vmlinuz, initrd.img, manifest.json, SHA256SUMS: each with its SHA-256 and size, public objects under Object Lock (COMPLIANCE), named by the measurement.OVMF.fd, vmlinuz, initrd.img, manifest.json, SHA256SUMS : chacun avec son SHA-256 et sa taille, objets publics sous Object Lock (COMPLIANCE), nommés par la mesure.
  3. The release logLe journal des publications LIVEEN SERVICE
    release-key.pub.pem, entries/NNNNNN.dsse.json, heads/NNNNNN.dsse.json: statements signed offline, each naming a measurement and its commit. Its key id you obtain outside oCCAM.release-key.pub.pem, entries/NNNNNN.dsse.json, heads/NNNNNN.dsse.json : des déclarations signées hors ligne, chacune nommant une mesure et son commit. L'identifiant de sa clé s'obtient hors d'oCCAM.
  4. The reproducible buildLa construction reproductible LIVEEN SERVICE
    The commit the manifest names and the bundle's initrd.img: the three decision-plane binaries rebuilt from that commit give the published archive back.Le commit que nomme le manifeste et l'initrd.img du lot : les trois binaires du plan de décision reconstruits depuis ce commit redonnent l'archive publiée.
  5. The signer evidenceLa preuve du signataire LIVEEN SERVICE
    /.well-known/signer-evidence?kid=<kid>: each guest's SEV-SNP report, its AMD certificates and its result-signing key./.well-known/signer-evidence?kid=<kid> : le rapport SEV-SNP de chaque invité, ses certificats AMD et sa clé de signature des résultats.

LIVEEN SERVICE published and verifiable.publié et vérifiable. NAMEDNOMMÉ named by a published file.nommé par un fichier publié.

2. The decision plane in service2. Le plan de décision en service

Read by your browser from Lu par votre navigateur dans /.well-known/decision-plane-bundle. The page recomputes nothing: it compares the record's measurement with the value you hold. With no verifier in service it shows the newest record (. La page ne recalcule rien : elle compare la mesure de l'enregistrement à la valeur que vous détenez. Sans vérificateur en service, elle montre l'enregistrement le plus récent (?latest=1), never green.), jamais en vert.

Reading the record...Lecture de l'enregistrement...

The discovery documentLe document de découverte

Reading...Lecture...

3. The release log3. Le journal des publications

Read from the bucket and verified in your browser as the SDK's occam.release_log does: each statement's and each head's ECDSA P-256 signature, each payload its canonical JSON, each head's root recomputed (RFC 9162). The key is read from the same bucket: what makes it the release key is its id, which you obtain outside this service and type below.Lu dans le seau et vérifié dans votre navigateur comme le fait occam.release_log du SDK : la signature ECDSA P-256 de chaque déclaration et de chaque tête, chaque contenu en JSON canonique, la racine de chaque tête recalculée (RFC 9162). La clé est lue dans le même seau : ce qui en fait la clé de publication, c'est son identifiant, que vous obtenez hors de ce service et saisissez ci-dessous.

Reading the discovery document...Lecture du document de découverte...

4. The reproducible build4. La construction reproductible

The inputs: the commit the bundle's manifest names, and the bundle's archive. Rebuilt from that commit, the three decision-plane binaries packed in place of the archive's own give the published bytes back. The archive's other members (the host's libraries, busybox, the kernel modules, the measured configuration) are read from it, not rebuilt.Les entrées : le commit que nomme le manifeste du lot, et l'archive du lot. Reconstruits depuis ce commit, les trois binaires du plan de décision remis à la place de ceux de l'archive redonnent les octets publiés. Les autres membres de l'archive (les bibliothèques de l'hôte, busybox, les modules du noyau, la configuration mesurée) y sont lus, pas reconstruits.

5. Check it on your own machine5. Le vérifier sur votre propre machine

With the Python SDK (Python 3.11 or newer). The commands carry the values read above, or placeholders. None of them depends on this page.Avec le SDK Python (Python 3.11 ou plus récent). Les commandes portent les valeurs lues ci-dessus, ou des emplacements. Aucune ne dépend de cette page.

The launch bundle and its measurementLe lot de lancement et sa mesure

fetch holds the bucket's manifest to the control plane's record, each file to the manifest's size and SHA-256, then recomputes the measurement with virtee's sev-snp-measure, not oCCAM's code, and requires your value.fetch confronte le manifeste du seau à l'enregistrement du plan de contrôle, chaque fichier à la taille et au SHA-256 du manifeste, puis recalcule la mesure avec sev-snp-measure de virtee, pas le code d'oCCAM, et exige votre valeur.

pip install 'occam-sdk[image]'
occam-dp-bundle fetch --cp https://<domain> --measurement <measurement> --out dp-bundle

On a directory you already have, then the sev-snp-measure command alone:Sur un répertoire que vous avez déjà, puis la commande sev-snp-measure seule :

occam-dp-bundle verify dp-bundle/<measurement> --measurement <measurement>
occam-dp-bundle command dp-bundle/<measurement>

In Python (occam.dp_bundle):En Python (occam.dp_bundle) :

from pathlib import Path
from occam import dp_bundle

M = "<measurement>"
record = dp_bundle.discover("https://<domain>", M)
d = dp_bundle.fetch(dp_bundle.base_of(record), M, Path("dp-bundle"), record=record)
for line in dp_bundle.verify(d, M):
    print(line)

The release logLe journal des publications

Fetch the key, compare its id with the one you obtained outside oCCAM, then fetch and verify the whole log under it (occam-release-log):Récupérez la clé, comparez son identifiant à celui obtenu hors d'oCCAM, puis récupérez et vérifiez le journal entier sous cette clé (occam-release-log) :

pip install occam-sdk

Your releasers then accept a measurement only from a logged statement at least DAYS old (--min-statement-age, state in --release-log-state):Vos releasers n'acceptent alors une mesure que d'une déclaration journalisée âgée d'au moins DAYS jours (--min-statement-age, état dans --release-log-state) :

occam-share-releaser

A Relying Party takes the measurements to trust from the log (occam.release_log.trusted_measurements):Un Relying Party prend les mesures à croire dans le journal (occam.release_log.trusted_measurements) :

from occam import release_log

The reproducible buildLa construction reproductible

On Linux with GNU cpio 2.13 or newer and a checkout of the repository: build the binaries from the commit, then rebuild-from repacks the bundle's archive around them and requires the published bytes back.Sous Linux avec GNU cpio 2.13 ou plus récent et une copie du dépôt : construisez les binaires depuis le commit, puis rebuild-from réempaquette l'archive du lot autour d'eux et exige les octets publiés.

python3 tools/build-dp-binaries.py --out bins --rev <commit>
python3 tools/check-dp-reproducible.py rebuild-from dp-bundle/<measurement>/initrd.img --bins bins

The key that signed a resultLa clé qui a signé un résultat

A result names its key by kid: check that guest's evidence to AMD's root and to your measurement, then the result with that key and no other (the SDK kit's chapter 4, Verify results; the demo does it in your browser):Un résultat nomme sa clé par son kid : vérifiez la preuve de cet invité jusqu'à la racine d'AMD et à votre mesure, puis le résultat avec cette clé et nulle autre (chapitre 4 du kit SDK, Verify results ; la démo le fait dans votre navigateur) :

import base64, json
from occam import VerifyOptions, verify
from occam.signer_evidence import fetch_signer_evidence, verify_signer_evidence

ISSUER = "https://<domain>/api"
kid = json.loads(base64.urlsafe_b64decode(token.split(".")[0] + "=="))["kid"]
key = verify_signer_evidence(fetch_signer_evidence(ISSUER, kid),
                             trusted_measurements=["<measurement>"], expected_kid=kid)
jwks = json.dumps({"keys": [key.jwk]}).encode()
result = verify(token, jwks, VerifyOptions(issuer=ISSUER, audience=AUDIENCE, expected_nonce=None))

6. What this proves, and what it does not6. Ce que cela prouve, et ce que cela ne prouve pas

The customer chooses each image's key mode when building it (occam-image build --key-mode). The first rows hold whatever the mode; the others depend on it.Le client choisit le mode de clés de chaque image quand il la construit (occam-image build --key-mode). Les premières lignes valent quel que soit le mode ; les suivantes en dépendent.

WhatQuoiWholeEntierwholeSplit 2-of-2Partagé 2-of-2splitCustomerClientcustomerWhyPourquoi
A verdict (the result a Relying Party checks)Un verdict (le résultat qu'un Relying Party vérifie)YesOuifor a Relying Party that checks the signer evidence against its own measurementpour un Relying Party qui vérifie la preuve du signataire contre sa propre mesurethe key is born in a measured SEV-SNP guest and bound to its AMD-signed reportla clé naît dans un invité SEV-SNP mesuré et est liée à son rapport signé par AMD
Which bytes the pinned measurement stands forQuels octets la mesure épinglée désigneYesOuithe launch bundle recomputes it with a tool that is not oCCAM's; a byte changed gives another measurementle lot de lancement la recalcule avec un outil qui n'est pas celui d'oCCAM ; un octet changé donne une autre mesure
That those bytes come from oCCAM's sourcesQue ces octets viennent des sources d'oCCAMYesOuifor oCCAM's three binariespour les trois binaires d'oCCAMthe archive in service is rebuilt from the commit its manifest names (section 4); the archive's other members are read from it (cpio -t < initrd.img), not rebuilt from sourcesl'archive en service est reconstruite depuis le commit que nomme son manifeste (section 4) ; ses autres membres se lisent dans l'archive (cpio -t < initrd.img), sans être reconstruits depuis les sources
That the operator runs this decision planeQue l'opérateur fait tourner ce plan de décisionYesOuithrough the signer evidence, not through the bundlepar la preuve du signataire, pas par le lota guest's report, verified to AMD's root, carries the measurement it was launched withle rapport d'un invité, vérifié jusqu'à la racine d'AMD, porte la mesure avec laquelle il a été lancé
That no other decision plane was released in secretQu'aucun autre plan de décision n'a été publié en secretPartlyEn partiethrough the release logpar le journal des versionsa releaser that requires the log accepts only a logged statement, and refuses a log that goes back on a head it accepted; the log is the operator's bucket under Object Lock, the release key one the operator holds offline, and no witness compares heads for youun releaser qui exige le journal n'accepte qu'une déclaration journalisée et refuse un journal qui revient sur une tête déjà acceptée ; le journal est le bucket de l'opérateur sous Object Lock, la clé de publication une clé que l'opérateur garde hors ligne, et aucun témoin ne compare les têtes pour vous
The VM's memory is encrypted by the processor (AMD SEV-SNP, Intel TDX)La mémoire de la VM est chiffrée par le processeur (AMD SEV-SNP, Intel TDX)YesOuiYesOuiYesOuineither the host nor OVHcloud reads itni l'hôte ni OVHcloud ne la lisent
Only the registered image gets its keysSeule l'image enregistrée obtient ses clésYesOuiYesOuiYesOuieverything that boots is measured, and the keys go only to the registered measurementtout ce qui démarre est mesuré, et les clés ne vont qu'à la mesure enregistrée
The keys are handed over only after verificationLes clés ne sont remises qu'après vérificationYesOuiYesOuiYesOuiwrapped to the key the VM's quote committed to, inside its encrypted memorychiffrées vers la clé à laquelle la quote de la VM s'est engagée, dans sa mémoire chiffrée
The operator cannot read the keys and secretsL'opérateur ne peut pas lire les clés et les secretsNoNonYesOuiwhile the customer's releaser runstant que le releaser du client tourneYesOuiwhile the customer's releaser runstant que le releaser du client tournesplit: the customer's releaser verifies the result itself and wraps its share; oCCAM's share alone is not the secret. Customer: oCCAM stores no value, the customer's releaser holds each key whole and releases it on a result it verified itself. With the releaser stopped, no key is handed over and the disks stay locked. Whole: sealed under the tenant's key in OVHcloud KMS, which the operator can use without the decision plane; the service refuses one unless its caller acknowledges thispartagé : le releaser du client vérifie lui-même le résultat et chiffre sa part ; la part d'oCCAM seule n'est pas le secret. Client : oCCAM ne stocke aucune valeur, le releaser du client garde chaque clé entière et la remet sur un résultat qu'il a vérifié lui-même. Le releaser arrêté, aucune clé n'est remise et les disques restent fermés. Entier : scellés sous la clé du tenant dans OVHcloud KMS, que l'opérateur peut utiliser sans le plan de décision ; le service en refuse un sans que l'appelant l'accepte
oCCAM holds no part of the keysoCCAM ne détient aucune part des clésNoNonNoNonYesOuiin the customer mode oCCAM stores no value at allen mode client oCCAM ne stocke aucune valeur
oCCAM signs a receipt for every key it hands overoCCAM signe un reçu pour chaque clé qu'il remetYesOuiYesOuiNoNonin the customer mode oCCAM hands over nothing, so there is nothing to signen mode client oCCAM ne remet rien, donc il n'a rien à signer
The VM boots without a service run by the customerLa VM démarre sans service du clientYesOuiNoNonNoNonsplit and customer need the customer's releaser to answer at bootpartagé et client ont besoin que le releaser du client réponde au démarrage

What this page cannot exclude: the host terminates TLS and could serve other bytes under this address without going through a guest. The commands above do not depend on this page: run them on your own machine.Ce que cette page ne peut pas exclure : l'hôte termine TLS et pourrait servir d'autres octets à cette adresse sans passer par un invité. Les commandes ci-dessus ne dépendent pas de cette page : lancez-les sur votre propre machine.