You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
-**Replaced** — components could be swapped for compromised versions
16
16
-**Misattributed** — components could falsely claim to come from a trusted source
17
17
18
-
Signing addresses these risks by creating a cryptographic proof that:
18
+
Signing addresses these risks by creating a cryptographic proof of:
19
19
20
20
1.**Integrity**: The component has not changed since it was signed
21
21
2.**Authenticity**: The signature was created by someone with access to the private key
22
-
3.**Non-repudiation**: The signer cannot deny having signed the component
22
+
3.**Provenance**: The signer cannot deny having signed the component
23
23
24
24
## How OCM Signing Works
25
25
@@ -65,9 +65,12 @@ Each artifact's digest is calculated using a type-specific normalization algorit
65
65
66
66
| Artifact Type | Algorithm | Description |
67
67
|---------------|-----------|-------------|
68
-
| Generic blob |`genericBlobDigest/v1`| Direct hash of blob content |
68
+
| OCI artifact |`ociArtifactDigest/v1`| Digest of the OCI manifest (used for container images, Helm charts, and other OCI-native content) |
69
+
| Generic blob |`genericBlobDigest/v1`| Direct hash of blob content (used for executables, blueprints, and other non-OCI content) |
69
70
70
-
This allows OCM to use the most appropriate digest mechanism for each artifact type. For example, OCI artifacts use their manifest digest rather than re-hashing the blob, ensuring consistency with OCI registry behavior.
71
+
This allows OCM to use the most appropriate digest mechanism for each artifact type.
72
+
OCI artifacts use their manifest digest rather than re-hashing the blob,
73
+
improving performance and ensuring consistency with OCI registry behavior. Generic blobs are hashed directly.
71
74
72
75
#### Recursive Component References
73
76
@@ -95,11 +98,56 @@ OCM signs a **digest** of the component descriptor, which includes:
95
98
- Source references
96
99
- Component references
97
100
98
-
The signature does **not** cover the raw resource content directly—instead, it covers the **digests** of those resources as recorded in the component descriptor. This means:
101
+
The signature does **not** cover the raw resource content directly — instead, it covers the **digests** of those resources as recorded in the component descriptor. Crucially, the `access` field (which describes *where* a resource is stored) is **excluded** from the signed digest by the normalization process. This is a key design principle:
99
102
100
-
- Any change to resource content changes its digest, invalidating the signature
101
-
- Signature verification is fast (no need to re-hash large binaries)
102
-
- Resources can be stored separately while still being integrity-protected
103
+
- **Location-independent integrity** — a component version can be transferred to a different registry (changing all `access` references) without invalidating its signature. The digest remains stable because it depends only on *what* the artifacts contain, not *where* they are stored.
104
+
- Any change to resource content changes its digest, invalidating the signature.
105
+
- Signature verification is fast (no need to re-hash large binaries).
106
+
107
+
This separation of content identity from storage location is what enables secure delivery across environments: a producer signs a component version once, and consumers can verify it after any number of transfers — even into air-gapped environments with completely different registries.
108
+
109
+
The following example shows a signed component descriptor. Notice that each resource has both an `access` field (storage location) and a `digest` field (content hash). Only the `digest` is included in the signature — the `access` can change freely during transfers:
0 commit comments