The high-level explanation of what OmniBOR is. #41
Replies: 6 comments 14 replies
-
I like the overall a structure of this. It builds nicely from “There are things” to “We should probably identify them” to “We should probably capture their relationships” |
Beta Was this translation helpful? Give feedback.
-
How might we project this sort of messaging into our website? |
Beta Was this translation helpful? Give feedback.
-
Jeremy has raised the question of whether "Artifact Input Manifest" confuses the target of the "input," because the inputs aren't to the artifact, but to a process which produces the artifact. This may need some workshopping. |
Beta Was this translation helpful? Give feedback.
-
There seems to be general positive feelings about the use of the "Manifest" over other terms we've considered like "Document". The sense is that "Manifest" is both 1) more specific than "Document," and also 2) more consistent with other supply chain and real-world shipping terminology. |
Beta Was this translation helpful? Give feedback.
-
This is also connected to our ongoing discussion of rewriting the spec introduction: #30 |
Beta Was this translation helpful? Give feedback.
-
Given that this new language has been adopted into the spec and into our public communication about OmniBOR, I'm going to close this thread. Of course new ones can be opened up if new angles or points of contention ought to be raised. |
Beta Was this translation helpful? Give feedback.
-
Had a conversation this morning which has crystallized my sense of how best to explain OmniBOR, and it goes like this:
You start out with identifiers, Artifact Identifiers (implemented as GitOIDs), which are hashes of whatever artifacts you have related to your software. Could be source files, configuration files, object files created during a build, the final executable made after linking, or anything else. These Artifact Identifiers give you a consistent, independently reproducible way to identify these objects. However, these identifiers only give you identity, no relationship or knowledge of how artifacts relate to one another in a build.
So next you have an Artifact Input Manifest, one for each object which is built using some inputs. Objects which are created without prior inputs don't have an Artifact Input Manifest, but anything with prior inputs does get a Manifest. Manifests may be in their own file, or they may be embedded within the file whose build inputs they describe. Each Manifest lists, in a canonical order, the Artifact Identifier of each build input for the object the Manifest describes. Each Manifest, whether in its own file or embedded, also has its own Artifact Identifier based on the Manifest's contents. Manifest listings only ever show one "layer" of dependencies; if an input to the object being described has its own inputs, then the object's Manifest simply notes that its input has its own Manifest.
You can then take a collection of objects and manifests and construct an Artifact Dependency Graph which describes the full graph of inputs which produce an artifact. This is a directed acyclic graph (DAG), not a tree.
So, when distributing a software artifact like an executable, you can also distribute its Manifest (either separately or embedded). Whenever an input anywhere in that artifact's Artifact Dependency Graph changes, the hashes for all Manifests of objects which use the changed input are themselves changed. This creates a clear signal of supply chain input changes, and allows comparison of two sets of artifacts and manifests to identify what specific differences exist in their inputs.
All of this said, I think this gives a clear way to explain OmniBOR to others:
EDIT: The terms above where changed from OmniBor Identifier to Artifact Identifier, and from OmniBOR Manifest to Artifact Input Manifest, based on the conversations with Ed below.
Beta Was this translation helpful? Give feedback.
All reactions