
この文書における「MUST」、「MUST NOT」、「REQUIRED」、「SHALL」、「SHALL NOT」、「SHOULD」、「SHOULD NOT」、「RECOMMENDED」、「MAY」、「OPTIONAL」というキーワードは、RFC 2119 に記載されているとおりに解釈されるものとする。
バージョンを比較する場合:
比較の例:
マニフェストファイルは、VEX データリポジトリに関するメタデータを提供する。 このファイルには、VEX データの取得と更新に必要な情報が含まれていなければならない(MUST)。
https://<domain>/.well-known/vex-repository.json に配置しなければならない(MUST)。vex-repository.json はメインブランチのルートディレクトリに配置しなければならない(MUST)。マニフェストファイルの JSON スキーマはこちらで定義されている。
{
"name": "Example Org VEX Repository",
"description": "VEX repository for Example Organization",
"versions": [
{
"spec_version": "0.1",
"locations": [
{
"url": "https://example.com/vex-hub/v0/vex-data-v0.tar.gz"
}
],
"update_interval": "24h",
"repository_specific": {
"location": {
"repository_type": "db",
"db_type": "bbolt",
"url": "oci://ghcr.io/example.com/vex-db:0"
}
}
},
{
"spec_version": "1.0",
"locations": [
{
"url": "https://example.com/vex-hub/v1/vex-data-v1.tar.gz//subdirectory"
},
{
"url": "https://example.com/vex-api/v1"
}
],
"update_interval": "1h"
}
]
}
| フィールド | 必須 | 説明と使用上の注意 |
|---|---|---|
| name | ✓ | リポジトリの名前。 |
| description | ✓ | リポジトリの簡単な説明。 |
| versions | ✓ |
| フィールド | 必須 | 説明と使用上の注意 |
|---|---|---|
| url | ✓ | VEX データのロケーションの URL。"https://" で始まる。コンテンツはセクション 3および4のリポジトリ構造の仕様に準拠する。URL には、'//' に続けてサブディレクトリパスを付加することで、サブディレクトリの指定を含めることができる。 |
リポジトリは以下の構造でなければならない(MUST):
vex-repository.<archive_extension>
[optional_subdirectory/]
├── index.json
└── pkg/
├── <type>/
│ ├── <namespace>/
│ │ ├── <name>/
│ │ │ └── vex.json
│ │ └── ...
│ └── ...
└── ...
ここで <archive_extension> は、サポートされているアーカイブ形式のいずれかである。
[optional_subdirectory/] は、locations フィールドの URL が // に続くサブディレクトリパスで終わる場合に含まれる。
これにより、特に GitHub リポジトリなどの既存のリポジトリレイアウトを使用する場合に、リポジトリ構造の柔軟性が確保される。
例えば、URL が https://github.com/org/repo/archive/refs/heads/main.tar.gz//repo-main の場合、ファイル構造は次のようになる:
main.tar.gz
└──repo-main/
├── index.json
└── pkg/
└── ...
この場合、repo-main/ が tar.gz ファイル内の VEX リポジトリのルートディレクトリとなる。
index.json ファイルは、アーカイブファイルの内容のマニフェストとして機能する。 これは、アーカイブのルートディレクトリ、または URL でサブディレクトリが定義されている場合はその指定されたサブディレクトリに配置しなければならない(MUST)。 このファイルは以下の構造でなければならない(MUST):
{
"updated_at": "2023-07-04T12:00:00Z",
"packages": [
{
"id": "pkg:deb/debian/curl",
"location": "pkg/deb/debian/curl/vex.json"
},
{
"id": "pkg:npm/lodash",
"location": "pkg/npm/lodash/vex.json",
"format": "csaf"
}
]
}
フィールドの説明:
インデックスファイルのスキーマはこちらで定義されている。
各パッケージの VEX 情報は、index.json ファイルで定義されたパス構造に従って、個別の JSON ファイルに格納しなければならない(MUST)。これらのファイルの内容は、format フィールドで指定された VEX 形式仕様(OpenVEX または CSAF VEX)に準拠しなければならない(MUST)。
単一の VEX ドキュメントには、同じパッケージの異なるバージョン、クォリファイア、サブパスの情報を含めてもよい(MAY)。
OpenVEX ドキュメントの例については、OpenVEX 仕様を参照のこと。
repository_url クォリファイアをディレクトリ構造の作成に使用してもよい(MAY)。例えば、PURL が "pkg:oci/debian@sha256:3e45770a143ee5afd1ebde5a6aea6e32a71d2bt5602f5dac8025db0d9cc19f10?repository_url=docker.io/library/debian" のパッケージは、"pkg/oci/docker.io/library/debian/vex.json" に格納できる。location フィールドで自由に定義してもよい(MAY)。VEX リポジトリを更新する場合:
updated_at タイムスタンプの更新も含む。locations URL を更新する。VEX リポジトリは、VEX データと関連メタデータを含むアーカイブファイルとして配布しなければならない(MUST)。 このアーカイブは、vex-repository.json ファイルの locations フィールドで参照されなければならず(MUST)、VEX 情報を配布する主要な手段である。
アーカイブファイルは、以下の形式のいずれかでなければならない(MUST):
tar.gz および tgztar.bz2 および tbz2tar.xz および txzzipgzbz2xzversions 配列からバージョンを選択する場合:
spec_version フィールドに基づいてサポートするバージョンを選択しなければならない(MUST)。locations 配列内の複数のロケーションを扱う場合:
クライアントは、複数の VEX リポジトリをサポートするように設計されるべきである(SHOULD)。
クライアントは、更新を確認するために以下のプロセスを使用すべきである(SHOULD):
update_interval を取得する。update_interval を加算して、次の更新時刻を計算する。効率的な運用のために、クライアントは以下の戦略を実装してもよい(MAY):
update_interval が非常に短い場合に有効である。| 利用可能なバージョンの詳細を含む配列。配列内の各オブジェクトは、VEX リポジトリ仕様のバージョンを実装するバージョンを表す。バージョンは古いものから新しいものへ昇順にソートされなければならない(MUST)。サブフィールドについては別表を参照。 |
| フィールド | 必須 | 説明と使用上の注意 |
|---|
| spec_version | ✓ | 実装されている VEX リポジトリ仕様のバージョン(例:"0.1")。形式はセクション 1で定義されているとおり "X.Y" でなければならない(MUST)。 |
| locations | ✓ | VEX データのロケーションを記述するオブジェクトの配列。少なくとも 1 つのロケーションオブジェクトを含まなければならない(MUST)。サブフィールドについては別表を参照。 |
| update_interval | ✓ | このバージョンの VEX データに対する推奨される更新確認間隔。Go の duration 形式を使用する(例:"1h"、"30m"、"24h")。 |
| repository_specific | - | リポジトリ固有の追加情報。 |
| フィールド | 必須 | 説明 |
|---|
| updated_at | ✓ | この index.json が最後に更新された日時を示すタイムスタンプ。 |
| packages | ✓ | オブジェクトの配列。各オブジェクトはリポジトリ内のパッケージを表す。 |
| packages[].id | ✓ | パッケージの識別子。現時点では Package URL(PURL)のみが受け入れられる。バージョン、クォリファイア、サブパスは VEX ドキュメントに含まれるため、省略しなければならない(MUST)。OCI タイプのパッケージの場合、repository_url クォリファイアを id に含めなければならない(MUST)。 |
| packages[].location | ✓ | アーカイブ内のこのパッケージの VEX ファイルへの相対パス。クライアントは、特定のパッケージの VEX ファイルを特定するためにこのフィールドを使用しなければならない(MUST)。 |
| packages[].format | - | VEX データの形式。"openvex" または "csaf" のいずれか。省略された場合は "openvex" とみなされる。 |