From 674406537c59cb66ef88b104989ed6693d8d0cf3 Mon Sep 17 00:00:00 2001 From: Jagannathan Raman Date: Thu, 22 Aug 2024 15:33:58 -0400 Subject: [PATCH] cocli: move cocli to a standalone repo Relocate cocli to a separate repo under Veraison Organization. Preserve git history during the process. cocli will be available at https://github.com/veraison/cocli Signed-off-by: Jagannathan Raman --- .gitignore | 4 - Makefile | 30 +- README.md | 2 - cocli/README.md | 692 +----------------- cocli/cmd/comid.go | 26 - cocli/cmd/comidCreate.go | 132 ---- cocli/cmd/comidCreate_test.go | 128 ---- cocli/cmd/comidDisplay.go | 98 --- cocli/cmd/comidDisplay_test.go | 101 --- cocli/cmd/comidValidate.go | 108 --- cocli/cmd/comidValidate_test.go | 116 --- cocli/cmd/common.go | 92 --- cocli/cmd/corim.go | 26 - cocli/cmd/corimCreate.go | 238 ------ cocli/cmd/corimCreate_test.go | 266 ------- cocli/cmd/corimDisplay.go | 132 ---- cocli/cmd/corimDisplay_test.go | 146 ---- cocli/cmd/corimExtract.go | 129 ---- cocli/cmd/corimExtract_test.go | 140 ---- cocli/cmd/corimSign.go | 153 ---- cocli/cmd/corimSign_test.go | 264 ------- cocli/cmd/corimSubmit.go | 143 ---- cocli/cmd/corimSubmit_test.go | 174 ----- cocli/cmd/corimVerify.go | 103 --- cocli/cmd/corimVerify_test.go | 133 ---- cocli/cmd/cots.go | 26 - cocli/cmd/cotsCreate.go | 281 ------- cocli/cmd/cotsCreate_test.go | 146 ---- cocli/cmd/cotsDisplay.go | 96 --- cocli/cmd/cotsDisplay_test.go | 101 --- cocli/cmd/isubmitter.go | 19 - cocli/cmd/root.go | 114 --- cocli/cmd/test_vars.go | 66 -- cocli/cmd/testcases/ec-p256.jwk | 9 - cocli/cmd/testcases/psa-refval-orig.cbor | Bin 416 -> 0 bytes cocli/cmd/testcases/psa-refval.cbor | Bin 538 -> 0 bytes cocli/cmd/testcases/regen-from-src.sh | 40 - cocli/cmd/testcases/signed-corim-invalid.cbor | Bin 166 -> 0 bytes .../signed-corim-valid-with-cots.cbor | Bin 2349 -> 0 bytes cocli/cmd/testcases/signed-corim-valid.cbor | Bin 918 -> 0 bytes cocli/cmd/testcases/src/psa-refval.yaml | 76 -- .../src/signed-corim-invalid-meta.yaml | 13 - .../testcases/src/signed-corim-invalid.yaml | 1 - .../src/signed-corim-valid-meta.yaml | 13 - .../signed-corim-valid-with-cots-meta.yaml | 3 - .../src/signed-corim-valid-with-cots.yaml | 6 - .../cmd/testcases/src/signed-corim-valid.yaml | 99 --- cocli/cmd/testcases/src/test-comid.yaml | 76 -- cocli/cmd/testcases/src/test-coswid.yaml | 35 - cocli/cmd/testcases/src/test-cots.yaml | 17 - cocli/cmd/testcases/test-comid.cbor | Bin 538 -> 0 bytes cocli/cmd/testcases/test-coswid.cbor | Bin 377 -> 0 bytes cocli/cmd/testcases/test-cots.cbor | Bin 1943 -> 0 bytes cocli/data/comid/1.cbor | Bin 531 -> 0 bytes cocli/data/comid/2.cbor | Bin 416 -> 0 bytes cocli/data/comid/comid-cca-mult-refval.cbor | Bin 457 -> 0 bytes cocli/data/comid/comid-cca-refval.cbor | Bin 177 -> 0 bytes cocli/data/comid/comid-dice-refval.cbor | Bin 220 -> 0 bytes cocli/data/comid/comid-psa-iakpub.cbor | Bin 637 -> 0 bytes cocli/data/comid/comid-psa-integ-iakpub.cbor | Bin 638 -> 0 bytes cocli/data/comid/comid-psa-refval.cbor | Bin 416 -> 0 bytes .../templates/comid-cca-mult-refval.json | 94 --- .../templates/comid-cca-realm-refval.json | 75 -- .../comid/templates/comid-cca-refval.json | 49 -- .../comid/templates/comid-dice-refval.json | 70 -- .../comid/templates/comid-psa-iakpub.json | 66 -- .../templates/comid-psa-integ-iakpub.json | 66 -- .../comid/templates/comid-psa-refval.json | 81 -- cocli/data/config/example-config.yaml | 24 - cocli/data/corim/corim-full.cbor | Bin 1495 -> 0 bytes .../corim/signed-corim-bad-signature.cbor | Bin 922 -> 0 bytes cocli/data/corim/signed-corim-cbor | Bin 1622 -> 0 bytes cocli/data/corim/signed-corim.cbor | Bin 603 -> 0 bytes .../data/corim/templates/corim-cca-realm.json | 17 - cocli/data/corim/templates/corim-cca.json | 17 - cocli/data/corim/templates/corim-full.json | 23 - cocli/data/corim/templates/corim-mini.json | 3 - cocli/data/corim/templates/meta-full.json | 10 - cocli/data/corim/templates/meta-mini.json | 5 - cocli/data/corim/unsigned-corim.cbor | Bin 815 -> 0 bytes cocli/data/coswid/1.cbor | Bin 377 -> 0 bytes cocli/data/cots/Zesty Hands_ta.ta | Bin 698 -> 0 bytes cocli/data/cots/cts-map.cbor | Bin 2195 -> 0 bytes cocli/data/cots/namedtastore.cbor | Bin 766 -> 0 bytes cocli/data/cots/rubbish.cbor | Bin 1078 -> 0 bytes .../data/cots/templates/claims/exclclaim.json | 1 - .../data/cots/templates/claims/permclaim.json | 1 - cocli/data/cots/templates/env/comid.json | 1 - cocli/data/cots/templates/env/coswid.json | 1 - .../data/cots/templates/env/namedtastore.json | 1 - cocli/data/cots/templates/env/vendor.json | 1 - cocli/data/cots/templates/env/vendor2.json | 1 - cocli/data/cots/templates/env/vendors.json | 1 - cocli/data/cots/vendor.cbor | Bin 674 -> 0 bytes cocli/data/cots/worthlesssea.spki | Bin 91 -> 0 bytes cocli/data/keys/ec-p256.jwk | 9 - cocli/data/pics/cocli-map.graffle | Bin 171894 -> 0 bytes cocli/data/pics/cocli-map.png | Bin 110025 -> 0 bytes cocli/main.go | 12 - .../cots => cots/data}/Snobbish Apparel_ta.ta | Bin {cocli/data/cots => cots/data}/shared_ta.ta | Bin cots/example_test.go | 4 +- scripts/licenses.sh | 1 - 103 files changed, 9 insertions(+), 5438 deletions(-) delete mode 100644 cocli/cmd/comid.go delete mode 100644 cocli/cmd/comidCreate.go delete mode 100644 cocli/cmd/comidCreate_test.go delete mode 100644 cocli/cmd/comidDisplay.go delete mode 100644 cocli/cmd/comidDisplay_test.go delete mode 100644 cocli/cmd/comidValidate.go delete mode 100644 cocli/cmd/comidValidate_test.go delete mode 100644 cocli/cmd/common.go delete mode 100644 cocli/cmd/corim.go delete mode 100644 cocli/cmd/corimCreate.go delete mode 100644 cocli/cmd/corimCreate_test.go delete mode 100644 cocli/cmd/corimDisplay.go delete mode 100644 cocli/cmd/corimDisplay_test.go delete mode 100644 cocli/cmd/corimExtract.go delete mode 100644 cocli/cmd/corimExtract_test.go delete mode 100644 cocli/cmd/corimSign.go delete mode 100644 cocli/cmd/corimSign_test.go delete mode 100644 cocli/cmd/corimSubmit.go delete mode 100644 cocli/cmd/corimSubmit_test.go delete mode 100644 cocli/cmd/corimVerify.go delete mode 100644 cocli/cmd/corimVerify_test.go delete mode 100644 cocli/cmd/cots.go delete mode 100644 cocli/cmd/cotsCreate.go delete mode 100644 cocli/cmd/cotsCreate_test.go delete mode 100644 cocli/cmd/cotsDisplay.go delete mode 100644 cocli/cmd/cotsDisplay_test.go delete mode 100644 cocli/cmd/isubmitter.go delete mode 100644 cocli/cmd/root.go delete mode 100644 cocli/cmd/test_vars.go delete mode 100644 cocli/cmd/testcases/ec-p256.jwk delete mode 100644 cocli/cmd/testcases/psa-refval-orig.cbor delete mode 100644 cocli/cmd/testcases/psa-refval.cbor delete mode 100644 cocli/cmd/testcases/regen-from-src.sh delete mode 100644 cocli/cmd/testcases/signed-corim-invalid.cbor delete mode 100644 cocli/cmd/testcases/signed-corim-valid-with-cots.cbor delete mode 100644 cocli/cmd/testcases/signed-corim-valid.cbor delete mode 100644 cocli/cmd/testcases/src/psa-refval.yaml delete mode 100644 cocli/cmd/testcases/src/signed-corim-invalid-meta.yaml delete mode 100644 cocli/cmd/testcases/src/signed-corim-invalid.yaml delete mode 100644 cocli/cmd/testcases/src/signed-corim-valid-meta.yaml delete mode 100644 cocli/cmd/testcases/src/signed-corim-valid-with-cots-meta.yaml delete mode 100644 cocli/cmd/testcases/src/signed-corim-valid-with-cots.yaml delete mode 100644 cocli/cmd/testcases/src/signed-corim-valid.yaml delete mode 100644 cocli/cmd/testcases/src/test-comid.yaml delete mode 100644 cocli/cmd/testcases/src/test-coswid.yaml delete mode 100644 cocli/cmd/testcases/src/test-cots.yaml delete mode 100644 cocli/cmd/testcases/test-comid.cbor delete mode 100644 cocli/cmd/testcases/test-coswid.cbor delete mode 100644 cocli/cmd/testcases/test-cots.cbor delete mode 100644 cocli/data/comid/1.cbor delete mode 100644 cocli/data/comid/2.cbor delete mode 100644 cocli/data/comid/comid-cca-mult-refval.cbor delete mode 100644 cocli/data/comid/comid-cca-refval.cbor delete mode 100644 cocli/data/comid/comid-dice-refval.cbor delete mode 100644 cocli/data/comid/comid-psa-iakpub.cbor delete mode 100644 cocli/data/comid/comid-psa-integ-iakpub.cbor delete mode 100644 cocli/data/comid/comid-psa-refval.cbor delete mode 100644 cocli/data/comid/templates/comid-cca-mult-refval.json delete mode 100644 cocli/data/comid/templates/comid-cca-realm-refval.json delete mode 100644 cocli/data/comid/templates/comid-cca-refval.json delete mode 100644 cocli/data/comid/templates/comid-dice-refval.json delete mode 100644 cocli/data/comid/templates/comid-psa-iakpub.json delete mode 100644 cocli/data/comid/templates/comid-psa-integ-iakpub.json delete mode 100644 cocli/data/comid/templates/comid-psa-refval.json delete mode 100644 cocli/data/config/example-config.yaml delete mode 100644 cocli/data/corim/corim-full.cbor delete mode 100644 cocli/data/corim/signed-corim-bad-signature.cbor delete mode 100644 cocli/data/corim/signed-corim-cbor delete mode 100644 cocli/data/corim/signed-corim.cbor delete mode 100644 cocli/data/corim/templates/corim-cca-realm.json delete mode 100644 cocli/data/corim/templates/corim-cca.json delete mode 100644 cocli/data/corim/templates/corim-full.json delete mode 100644 cocli/data/corim/templates/corim-mini.json delete mode 100644 cocli/data/corim/templates/meta-full.json delete mode 100644 cocli/data/corim/templates/meta-mini.json delete mode 100644 cocli/data/corim/unsigned-corim.cbor delete mode 100644 cocli/data/coswid/1.cbor delete mode 100644 cocli/data/cots/Zesty Hands_ta.ta delete mode 100644 cocli/data/cots/cts-map.cbor delete mode 100644 cocli/data/cots/namedtastore.cbor delete mode 100644 cocli/data/cots/rubbish.cbor delete mode 100644 cocli/data/cots/templates/claims/exclclaim.json delete mode 100644 cocli/data/cots/templates/claims/permclaim.json delete mode 100644 cocli/data/cots/templates/env/comid.json delete mode 100644 cocli/data/cots/templates/env/coswid.json delete mode 100644 cocli/data/cots/templates/env/namedtastore.json delete mode 100644 cocli/data/cots/templates/env/vendor.json delete mode 100644 cocli/data/cots/templates/env/vendor2.json delete mode 100644 cocli/data/cots/templates/env/vendors.json delete mode 100644 cocli/data/cots/vendor.cbor delete mode 100644 cocli/data/cots/worthlesssea.spki delete mode 100644 cocli/data/keys/ec-p256.jwk delete mode 100644 cocli/data/pics/cocli-map.graffle delete mode 100644 cocli/data/pics/cocli-map.png delete mode 100644 cocli/main.go rename {cocli/data/cots => cots/data}/Snobbish Apparel_ta.ta (100%) rename {cocli/data/cots => cots/data}/shared_ta.ta (100%) diff --git a/.gitignore b/.gitignore index 6bb26a80..06b53509 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,3 @@ # vendor/ mocks/ - -# Generated during testing -cocli/cocli -cocli/cmd/output.cbor diff --git a/Makefile b/Makefile index f5e8bbdb..a22b3fd4 100644 --- a/Makefile +++ b/Makefile @@ -7,14 +7,9 @@ GO111MODULE := on GOPKG := github.com/veraison/corim/corim GOPKG += github.com/veraison/corim/comid GOPKG += github.com/veraison/corim/cots -GOPKG += github.com/veraison/corim/cocli/cmd GOPKG += github.com/veraison/corim/encoding GOPKG += github.com/veraison/corim/extensions -MOCKGEN := $(shell go env GOPATH)/bin/mockgen -INTERFACES := cocli/cmd/isubmitter.go -MOCKPKG := mocks - GOLINT ?= golangci-lint ifeq ($(MAKECMDGOALS),lint) @@ -26,7 +21,8 @@ else endif .PHONY: lint lint-extra -lint lint-extra: _mocks; $(GOLINT) $(GOLINT_ARGS) +lint lint-extra: + $(GOLINT) $(GOLINT_ARGS) ifeq ($(MAKECMDGOALS),test) GOTEST_ARGS ?= -v -race $(GOPKG) @@ -38,28 +34,14 @@ endif COVER_THRESHOLD := $(shell grep '^name: cover' .github/workflows/ci-go-cover.yml | cut -c13-) - -define MOCK_template -mock_$(1): $(1) - $$(MOCKGEN) -source=$$< -destination=cocli/cmd/mocks/$$$$(basename $$@) -package=$$(MOCKPKG) -endef - -$(foreach m,$(INTERFACES),$(eval $(call MOCK_template,$(m)))) -MOCK_FILES := $(foreach m,$(INTERFACES),$(join mock_,$(m))) -CLEANFILES := $(MOCK_FILES) - -_mocks: $(MOCK_FILES) -.PHONY: _mocks - .PHONY: test test-cover -test test-cover: _mocks; go test $(GOTEST_ARGS) +test test-cover: + go test $(GOTEST_ARGS) -realtest: _mocks; go test $(GOTEST_ARGS) +realtest: + go test $(GOTEST_ARGS) .PHONY: realtest -.PHONY: clean -clean: ; $(RM) $(CLEANFILES) - presubmit: @echo @echo ">>> Check that the reported coverage figures are $(COVER_THRESHOLD)" diff --git a/README.md b/README.md index 8dd87998..36ff7bd6 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,6 @@ The [`corim/corim`](corim) and [`corim/comid`](comid) packages provide a golang > These API are still in active development (as is the underlying CoRIM spec). > They are **subject to change** in the future. -The [`corim/cocli`](cocli) package uses the API above (as well as the API from [`veraison/swid`](https://github.com/veraison/swid) package) to provide a user friendly command line interface for working with CoRIM, CoMID, CoSWID and CoTS. Specifically it allows creating, signing, verifying, displaying, uploading, and more. See [`cocli/README.md`](cocli/README.md) for further details. - ## Developer tips Before requesting a PR (and routinely during the dev/test cycle), you are encouraged to run: diff --git a/cocli/README.md b/cocli/README.md index 7d0e3969..338ec40a 100644 --- a/cocli/README.md +++ b/cocli/README.md @@ -1,693 +1,3 @@ # Corim Command Line Interface -In this document we describe how to use Corim Command Line Interface tool `cocli` - -* [Installation](#installing-and-configuring) -* [Command Snapshot](#cocli-command-snapshot) -* [Supported Commands](#supported-commands) - * [CoMID Commands](#comids-manipulation) - * [Create](#create) - * [Display](#display) - * [CoTS Commands](#cotss-manipulation) - * [Create](#create-1) - * [Display](#display-1) - * [CoRIM Commands](#corims-manipulation) - * [Create](#create-2) - * [Sign](#sign) - * [Verify](#verify) - * [Display](#display-2) - * [Extract](#extract-coswids-comids-and-cotss) - * [CoRIM Submission](#corim-submission-to-veraison) - * [Remote Authentication](#remote-service-authentication) - * [Command Synopsis](#visual-synopsis-of-the-available-commands) - -# Installing and configuring - -To install the `cocli` command, do: -``` -$ go install github.com/veraison/corim/cocli@latest -``` - -To configure auto-completion, use the `completion` subcommand. For example, if -`bash` is your shell, you would do something like: -``` -$ cocli completion bash > ~/.bash_completion.d/cocli -$ . ~/.bash_completion -``` -to get automatic command completion and suggestions using the TAB key. - -To get a list of the supported shells, do: -``` -$ cocli completion --help -``` -# Cocli Command Snapshot -This document provides step-by-step instructions for how to use the `cocli` tool to manipulate CoRIMs, CoMIDs and CoTS. - -```mermaid -flowchart TD - subgraph COCLI["COCLI COMMANDS"] - style COCLI fill:#ffffff, stroke:#333,stroke-width:4px - subgraph CORIMCMD["CORIM COMMANDS \n - cocli corim create \n cocli corim display \n cocli corim sign \n cocli corim verify\n cocli corim extract\n cocli corim submit"] - end - subgraph COMIDCMD["COMID COMMANDS \n cocli comid create \n cocli comid display"] - end - - subgraph COTSCMD["COTS COMMANDS \n cocli cots create \n cocli cots display"] - end - end - CORIM ---> CORIMCMD -subgraph CORIM["CoRIM"] - subgraph CoMID["COMIDs\n"] - CM3["CoMID-N"] - CM2["CoMID-2"] - CM1["CoMID-1"] - CM1 -.- CM2 - CM2 -.- CM3 - CM3 ---> COMIDCMD - end - - subgraph CoSWID["CoSWID\n"] - CSW1["CoSWID-1"] - CSW2["CoSWID-2"] - CSW3["CoSWID-N"] - CSW1 -.- CSW2 - CSW2 -.- CSW3 - end - - subgraph CoTS["COTS\n"] - CS3["CoTS-N"] - CS2["CoTS-2"] - CS1["CoTS-1"] - CS1 -.- CS2 - CS2 -.- CS3 - CS3 ---> COTSCMD - end - -end - -``` - -# Supported Commands -This section describes all the available commands supported by `cocli` tool - -## CoMIDs manipulation - -The `comid` subcommand allows you to create, display and validate CoMIDs. - -### Create - -Use the `comid create` subcommand to create a CBOR-encoded CoMID, passing its -JSON representation via the `--template` switch (or equivalently its `-t` shorthand): - -* Please inspect `comid` JSON templates as examples under `data/comid/templates` `comid-*.json` - -``` -$ cocli comid create --template data/comid/templates/comid-dice-refval.json -``` -On success, you should see something like the following printed to stdout: -``` ->> created "comid-dice-refval.cbor" from "comid-dice-refval.json" -``` - -The CBOR-encoded CoMID file is stored in the current working directory with a -name derived from its template. If you want, you can specify a different -target directory using the `--output-dir` command line switch (abbrev. `-o`) -``` -$ cocli comid create --template data/comid/templates/comid-dice-refval.json --output-dir /tmp ->> created "/tmp/comid-dice-refval.cbor" from "comid-dice-refval.json" -``` -Note that the output directory, as well as all its parent directories, MUST -pre-exist. - -You can also create multiple CoMIDs in one go. Suppose all your templates are -stored in the `templates/` folder: -``` -$ tree templates/ -templates/ -├── comid-dice-refval1.json -├── comid-dice-refval2.json -... -└── comid-dice-refvaln.json -``` -Then, you can use the `--template-dir` (abbrev. `-T`), and let the tool load, -validate, and CBOR-encode the templates one by one: -``` -$ cocli comid create --template-dir templates ->> created "comid-dice-refval1.cbor" from "templates/comid-dice-refval1.json" ->> created "comid-dice-refval2.cbor" from "templates/comid-dice-refval2.json" -... ->> created "comid-dice-refvaln.cbor" from "templates/comid-dice-refvaln.json" -``` - -You can specify both the `-T` and `-t` switches as many times as needed, and -even combine them in one invocation: -``` -$ cocli comid create -T comid-templates/ \ - -T comid-templates-aux/ \ - -t extra-comid.json \ - -t yet-another-comid.json \ - -o /var/spool/comid -``` - -**NOTE** that since the output file name is deterministically generated from the -template file name, all the template files (when from different directories) -MUST have different base names. - - -### Display - -Use the `comid display` subcommand to print to stdout one or more CBOR-encoded -CoMIDs in human readable (JSON) format. - -You can supply individual files using the `--file` switch (abbrev. `-f`), or -directories that may (or may not) contain CoMID files using the `--dir` switch -(abbrev. `-d`). Only valid CoMIDs will be displayed, and any decoding or -validation error will be printed alongside the corresponding file name. - -For example: -``` -$ cocli comid display --file data/comid/comid-dice-refval.cbor -``` -provided the `comid-dice-refval.cbor` file contains valid CoMID, would print something like: -``` ->> [comid-dice-refval.cbor] -{ - "tag-identity": { - "id": "1d5a8c7c-1c70-4c56-937e-3c5713ae5a83" - }, - "triples": {} -[...] -} -``` -While a `data/comid/` folder with the following contents: -``` -$ tree data/comid/ -data/comid/ -├── rubbish.cbor -├── 1.cbor -└── 2.cbor -``` -could be inspected in one go using: -``` -$ cocli comid display --dir data/comid/ -``` -which would output something like: -``` ->> failed displaying "comids.d/rubbish.cbor": CBOR decoding failed: EOF ->> [data/comid/1.cbor] -{ - "tag-identity": { - "id": "43bbe37f-2e61-4b33-aed3-53cff1428b16" - }, -[...] -} ->> [data/comid/2.cbor] -{ - "tag-identity": { - "id": "366d0a0a-5988-45ed-8488-2f2a544f6242" - }, -[...] -} -Error: 1/3 display(s) failed -``` - -One or more files and directories can be supplied in the same invocation, e.g.: -``` -$ cocli comid display -f m1.cbor \ - -f comids.d/m2.cbor \ - -d /var/spool/comids \ - -d yet-another-comid-folder/ -``` - -## CoTSs manipulation -The `cots` subcommand allows you to create, display and validate CoTSs. - -### Create - -Use the `cots create` subcommand to create a CBOR-encoded CoTS. The `environment` switch takes in a JSON template specifiying the environments that are valid for the keys specified and the `tas` switch takes in a directory of trust anchors files: - -* Please inspect `data/cots/templates` JSON templates as examples for `environment` and `claims` - - -``` -$ cocli cots create --environment data/cots/env/vendor.json --tafile data/cots/shared_ta.ta -``` -On success, you should see something like the following printed to stdout: -``` ->> created "vendor.cbor" -``` - -The CBOR-encoded CoTS file is stored in the current working directory with a -name derived from its environment template. If you want, you can specify a different -target directory and file name using the `--output` command line switch (abbrev. `-o`) -``` -$ cocli cots create --environment data/cots/env/vendor.json --tafile data/cots/shared_ta.ta --output /tmp/myCots.cbor ->> created "/tmp/myCots.cbor" -``` -Note that the output directory, as well as all its parent directories, MUST pre-exist. - -### Display - -Use the `cots display` subcommand to print to stdout one or more CBOR-encoded -CoTSs in human readable (JSON) format. - -You can supply individual files using the `--file` switch (abbrev. `-f`), or -directories that may (or may not) contain CoTS files using the `--dir` switch -(abbrev. `-d`). Only valid CoTSs will be displayed, and any decoding or -validation error will be printed alongside the corresponding file name. - -For example: -``` -$ cocli cots display --file vendor.cbor -``` -provided the `vendor.cbor` file contains valid CoTS, would print something like: -``` ->> [vendor.cbor] -{ - "environments": [ - { - "environment": { - "class": { - "vendor": "Zesty Hands, Inc." - } - } - } - ], - "keys": { - "tas": [ - { - "format": 1, - "data": "ooICejCCAnYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATjUaoQOSQHpL0DfKC8EVTQ5wHwZ085yyxPkhBpLOu+7B0nl33FYWV1Hg4je/37FTbpmohFkUKWYd81z8C/K1DMBBQBXEXJrLBGKnFd1xCgeMAVSfEBPzCCAgEwPjELMAkGA1UEBgwCVVMxEDAOBgNVBAoMB0V4YW1wbGUxHTAbBgNVBAMMFEV4YW1wbGUgVHJ1c3QgQW5jaG9yoIIBvTCCAWSgAwIBAgIVANCdkL89UlzHc9Ui7XfVniK7pFuIMAoGCCqGSM49BAMCMD4xCzAJBgNVBAYMAlVTMRAwDgYDVQQKDAdFeGFtcGxlMR0wGwYDVQQDDBRFeGFtcGxlIFRydXN0IEFuY2hvcjAeFw0yMjA1MTkxNTEzMDdaFw0zMjA1MTYxNTEzMDdaMD4xCzAJBgNVBAYMAlVTMRAwDgYDVQQKDAdFeGFtcGxlMR0wGwYDVQQDDBRFeGFtcGxlIFRydXN0IEFuY2hvcjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABONRqhA5JAekvQN8oLwRVNDnAfBnTznLLE+SEGks677sHSeXfcVhZXUeDiN7/fsVNumaiEWRQpZh3zXPwL8rUMyjPzA9MB0GA1UdDgQWBBQBXEXJrLBGKnFd1xCgeMAVSfEBPzALBgNVHQ8EBAMCAoQwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiALBidABsfpzG0lTL9Eh9b6AUbqnzF+koEZbgvppvvt9QIgVoE+bhEN0j6wSPzePjLrEdD+PEgyjHJ5rbA11SPq/1M=" - } - ] - } -} - -``` -While a `data/cots` folder with the following contents: -``` -$ tree cots/ -cots/ -├── rubbish.cbor -├── namedtastore.cbor -├── vendor.cbor -``` -could be inspected in one go using: -``` -$ cocli cots display --dir data/cots/ -``` -which would output something like: -``` ->> [data/cots/namedtastore.cbor] -{ - "environments": [ - { - "namedtastore": "Miscellaneous TA Store" - } - ], - "keys": { - "tas": [ - { - "format": 1, - "data": "ooIC1TCCAtEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATN0f5kzywEzZOYbaV23O3N8cku39JoLNjlHPwECbXDDWp0LpAO1z248/hoy6UW/TZMTPPR/93XwHsG16mSFy8XBBSKhM/5gJWjvDbW7qUY1peNm9cfYDCCAlwwXDELMAkGA1UEBgwCVVMxHzAdBgNVBAoMFlNub2JiaXNoIEFwcGFyZWwsIEluYy4xLDAqBgNVBAMMI1Nub2JiaXNoIEFwcGFyZWwsIEluYy4gVHJ1c3QgQW5jaG9yoIIB+jCCAZ+gAwIBAgIUEBuTRGXAEEVEHhu4xafAnqm+qYgwCgYIKoZIzj0EAwIwXDELMAkGA1UEBgwCVVMxHzAdBgNVBAoMFlNub2JiaXNoIEFwcGFyZWwsIEluYy4xLDAqBgNVBAMMI1Nub2JiaXNoIEFwcGFyZWwsIEluYy4gVHJ1c3QgQW5jaG9yMB4XDTIyMDUxOTE1MTMwOFoXDTMyMDUxNjE1MTMwOFowXDELMAkGA1UEBgwCVVMxHzAdBgNVBAoMFlNub2JiaXNoIEFwcGFyZWwsIEluYy4xLDAqBgNVBAMMI1Nub2JiaXNoIEFwcGFyZWwsIEluYy4gVHJ1c3QgQW5jaG9yMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzdH+ZM8sBM2TmG2ldtztzfHJLt/SaCzY5Rz8BAm1ww1qdC6QDtc9uPP4aMulFv02TEzz0f/d18B7BtepkhcvF6M/MD0wHQYDVR0OBBYEFIqEz/mAlaO8NtbupRjWl42b1x9gMAsGA1UdDwQEAwIChDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0kAMEYCIQC2cf43f3PPlCO6/dxv40ftIgxxToKHF72UzENv7+y4ygIhAIGtC/r6SGaFMaP7zD2EloBuIXTtyWu8Hwl+YGdXRY93" - } - ] - } -} ->> failed displaying "data/cots/rubbish.cbor": CBOR decoding failed: cbor: cannot unmarshal primitives into Go value of type cots.ConciseTaStore ->> [data/cots/vendor.cbor] -{ - "environments": [ - { - "environment": { - "class": { - "vendor": "Zesty Hands, Inc." - } - } - } - ], - "keys": { - "tas": [ - { - "format": 1, - "data": "ooICejCCAnYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATjUaoQOSQHpL0DfKC8EVTQ5wHwZ085yyxPkhBpLOu+7B0nl33FYWV1Hg4je/37FTbpmohFkUKWYd81z8C/K1DMBBQBXEXJrLBGKnFd1xCgeMAVSfEBPzCCAgEwPjELMAkGA1UEBgwCVVMxEDAOBgNVBAoMB0V4YW1wbGUxHTAbBgNVBAMMFEV4YW1wbGUgVHJ1c3QgQW5jaG9yoIIBvTCCAWSgAwIBAgIVANCdkL89UlzHc9Ui7XfVniK7pFuIMAoGCCqGSM49BAMCMD4xCzAJBgNVBAYMAlVTMRAwDgYDVQQKDAdFeGFtcGxlMR0wGwYDVQQDDBRFeGFtcGxlIFRydXN0IEFuY2hvcjAeFw0yMjA1MTkxNTEzMDdaFw0zMjA1MTYxNTEzMDdaMD4xCzAJBgNVBAYMAlVTMRAwDgYDVQQKDAdFeGFtcGxlMR0wGwYDVQQDDBRFeGFtcGxlIFRydXN0IEFuY2hvcjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABONRqhA5JAekvQN8oLwRVNDnAfBnTznLLE+SEGks677sHSeXfcVhZXUeDiN7/fsVNumaiEWRQpZh3zXPwL8rUMyjPzA9MB0GA1UdDgQWBBQBXEXJrLBGKnFd1xCgeMAVSfEBPzALBgNVHQ8EBAMCAoQwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiALBidABsfpzG0lTL9Eh9b6AUbqnzF+koEZbgvppvvt9QIgVoE+bhEN0j6wSPzePjLrEdD+PEgyjHJ5rbA11SPq/1M=" - } - ] - } -} - -Note: One of more files and directories can be supplied in the same invocation, using -f and -d directive: - -``` - -## CoSWID manipulation - -Tooling to manipulate `CoSWID` is not currently available under Project Veraison. -However CoSWID can be part of CoRIM by constructing CoSWID CBOR by other indistry available -tools such as [swid-tools](https://github.com/usnistgov/swid-tools) and including them -as mentioned under [CORIM Construction](CORIM.md) - -## CoRIMs manipulation - -The `corim` subcommand allows you to create, display, sign, verify CoRIMs or submit -a CoRIM using the [Veraison provisioning API](https://github.com/veraison/docs/tree/main/api/endorsement-provisioning). -It also provides a means to extract as-is the embedded CoSWIDs, CoMIDs and CoTSs and save -them as separate files. - -### Create - -Use the `corim create` subcommand to create a CBOR-encoded, unsigned CoRIM, by -passing its JSON representation via the `--template` switch (or equivalently its `-t` shorthand) -together with the CBOR-encoded CoMIDs, CoSWIDs and/or CoTS to be embedded. - -* Please inspect `corim` JSON templates as examples under `data/corim/templates` `corim-*.json` - -``` -$ cocli corim create --template data/corim/templates/corim-full.json --comid data/comid/comid-dice-refval.cbor --coswid data/coswid/1.cbor --cots data/cots/vendor.cbor -``` -On success, you should see something like the following printed to stdout: -``` ->> created "corim-full.cbor" from "corim-full.json" -``` - -The CBOR-encoded CoRIM file is stored in the current working directory with a -name derived from its template. If you want, you can specify a different -file name using the `--output` command line switch (abbrev. `-o`): -``` -$ cocli corim create -t data/corim/templates/corim-full.json -m data/comid/comid-dice-refval.cbor -s data/coswid/1.cbor -c data/cots/c1.cbor -o unsigned-corim.cbor ->> created "unsigned-corim.cbor" from "corim-full.json" -``` - -CoMIDs, CoSWIDs and CoTSs can be either supplied as individual files, using the -`--comid` (abbrev. `-m`), `--coswid` (abbrev. `-s`) and `--cots` (abbrev. `-c`) switches respectively, or -as "per-folder" blocks using the `--comid-dir` (abbrev. `-M`), `--coswid-dir` and `--cots-dir` -(abbrev. `-C`) switch. For example: -``` -$ cocli corim create --template data/corim/templates/corim-full.json --comid-dir data/comid/cbor/ -``` - -Creation will fail if *any* of the inputs is non conformant. For example, if -`data/comid/cbor/` contains an invalid CoMID file `rubbish.cbor`, an attempt to create a -CoRIM: -``` -$ cocli corim create -t data/corim/templates/corim-full.json -M data/comid/cbor/ -``` -will fail with: -``` -Error: error loading CoMID from data/comid/cbor/rubbish.cbor: EOF -``` - -### Sign - -Use the `corim sign` subcommand to cryptographically seal the unsigned CoRIM -supplied via the `--file` switch (abbrev. `-f`). The signature is produced -using the key supplied via the `--key` switch (abbrev. `-k`), which is expected -to be in [JWK](https://www.rfc-editor.org/rfc/rfc7517) format. On success, the -resulting COSE Sign1 payload is saved to file whose name can be controlled using -the `--output` switch (abbrev. `-o`). A CoRIM Meta template in JSON format must -also be provided using the `--meta` switch (abbrev.`-m`). - -* Please inspect the `data/corim/templates` directory for `meta` JSON templates. - -For example, with the default output file: -``` -$ cocli corim sign --file corim.cbor --key ec-p256.jwk --meta meta.json ->> "corim.cbor" signed and saved to "signed-corim.cbor" -``` -Or, the same but with a custom output file: -``` -$ cocli corim sign --file data/corim/corim-full.cbor \ - --key data/keys/ec-p256.jwk \ - --meta data/corim/templates/meta-full.json \ - --output /var/spool/signed-corim.cbor ->> "corim-full.cbor" signed and saved to "/var/spool/signed-corim.cbor" -``` - -### Verify - -Use the `corim verify` subcommand to cryptographically verify the signed CoRIM -supplied via the `--file` switch (abbrev. `-f`). The signature is checked -using the key supplied via the `--key` switch (abbrev. `-k`), which is expected -to be in [JWK](https://www.rfc-editor.org/rfc/rfc7517) format. For example: -``` -$ cocli corim verify --file data/corim/signed-corim.cbor --key data/keys/ec-p256.jwk ->> "signed-corim.cbor" verified -``` - -Verification can fail either because the cryptographic processing fails or -because the signed payload or protected headers are themselves invalid. For example: -``` -$ cocli corim verify --file data/corim/signed-corim-bad-signature.cbor --key data/keys/ec-p256.jwk -``` -will give -``` -Error: error verifying signed-corim-bad-signature.cbor with key ec-p256.jwk: verification failed ecdsa.Verify -``` - -### Display - -Use the `corim display` subcommand to print to stdout a signed CoRIM in human -readable (JSON) format. - -You must supply the file you want to display using the `--file` switch (abbrev. -`-f`). Only a valid CoRIM will be displayed, and any occurring decoding or -validation errors will be printed instead. - -The output has two logical sections: one for Meta and one for the (unsigned) -CoRIM: -``` -$ cocli corim display --file data/corim/signed-corim.cbor -Meta: -{ - "signer": { - "name": "ACME Ltd signing key", - "uri": "https://acme.example/signing-key.pub" - }, -[...] -} -Corim: -{ - "corim-id": "5c57e8f4-46cd-421b-91c9-08cf93e13cfc", - "tags": [ - "2QH...", -[...] - ] -} -``` - -By default, the embedded CoMID, CoSWID and CoTS tags are not expanded, and what you -will see is the base64 encoding of their CBOR serialisation. If you want to -peek at the tags' content, supply the `--show-tags` (abbrev. `-v`) switch, which -will add a further Tags section with one entry per each expanded tag: -``` -$ cocli corim display --file data/corim/signed-corim.cbor --show-tags -Meta: -{ -[...] -} -Corim: -{ -[...] -} -Tags: ->> [ 0 ] -{ - "tag-identity": { - "id": "366d0a0a-5988-45ed-8488-2f2a544f6242" - }, -[...] -} ->> [ 1 ] -{ - "tag-identity": { - "id": "43bbe37f-2e61-4b33-aed3-53cff1428b16" - }, -[...] -} ->> [ 2 ] -{ - "tag-id": "com.acme.rrd2013-ce-sp1-v4-1-5-0", -[...] -} -``` - -### Extract CoSWIDs, CoMIDs and CoTSs - -Use the `corim extract` subcommand to extract the embedded CoMIDs, CoSWIDs and CoTSs -from a signed CoRIM. - -You must supply a signed CoRIM file using the `--file` switch (abbrev. `-f`) and -an optional output folder (default is the current working directory) using the -`--output-dir` switch (abbrev. `-o`). Make sure that the output directory as -well as any parent folder exists prior to issuing the command. - -On success, the found CoMIDs, CoSWIDs, CoTS are saved in CBOR format: -``` -$ cocli corim extract --file data/corim/signed-corim.cbor --output-dir output.d/ -$ tree output.d/ -output.d/ -├── 000000-comid.cbor -├── 000001-comid.cbor -├── 000002-coswid.cbor -└── 000003-cots.cbor -``` - -## CoRIM Submission to Veraison - -Use the `corim submit` subcommand to upload a CoRIM using the Veraison provisioning API. -The CoRIM file containing the CoRIM data in CBOR format is supplied via the -`--corim-file` switch (abbrev. `-f`). The server URL where to upload the CoRIM -payload is supplied via the `--api-server` switch (abbrev. `-s`). -Further, it is required to supply the media type of the content via the -`--media-type` switch (abbrev. `-m`) -``` -$ cocli corim submit \ - --corim-file data/corim/unsigned-corim.cbor \ - --api-server "https://veraison.example/endorsement-provisioning/v1/submit" \ - --media-type "application/corim-unsigned+cbor; profile=http://arm.com/psa/iot/1" - ->> "unsigned-corim.cbor" submit ok -``` - -#### Remote Service Authentication - -The above will work if the remote service does not authenticate -endorsement-provisioning API calls. If the service does authenticate, then -cocli must be configured appropriately. This can be done using a `config.yaml` -file located in the current working directory, or in the standard config -path (usually `~/.config/cocli/config.yaml` on XDG-compliant systems). Please -see `./data/config/example-config.yaml` file for details of the configuration -that needs to be provided. - -#### Note on TLS - -If the scheme in the API server URL is HTTPS, `cocli` will attempt to establish -a TLS connection to the server, validating the server certificate using system CA -certs. It is possible to disable server certificate validation with -`-i`/`--insecure` flag. Alternatively, if the CA cert for the server is -available but is not installed in the system, it may be specified using -`-E`/`--ca-cert` flag. - -## Visual Synopsis of the Available Commands - -```mermaid -graph LR - OEM[(OEM/ODM \n DB)] - JSONTmplCoMID[["JSON \n template \n (CoMID)"]] - - JSONTmplCoSWID[["JSON \n template \n (CoSWID)"]] - style JSONTmplCoSWID fill:#71797E - click JSONTmplCoSWID "https://github.com/veraison/corim/issues/81" - - JSONTmplCoRIM[["JSON \n template \n (CoRIM)"]] - JSONTmplMeta[["JSON \n template \n (Meta)"]] - key((key)) - - %% Cots nodes - environments[["Environments"]] - tas(("Trust \n anchors")) - cas(("CA \n certificates")) - permClaims[["Permanant claims"]] - exclClaims[["Excluded claims"]] - - cliComidCreate($ cocli comid create) - cliComidDisplay($ cocli comid display) - style cliComidCreate fill:#00758f - style cliComidDisplay fill:#00758f - - cliCotsCreate($ cocli cots create) - cliCotsDisplay($ cocli cots display) - style cliCotsCreate fill:#00758f - style cliCotsDisplay fill:#00758f - - cliCoswidCreate($ cocli coswid create) - cliCoswidDisplay($ cocli coswid display) - style cliCoswidCreate fill:#71797E - style cliCoswidDisplay fill:#71797E - - - cliCorimCreate($ cocli corim create) - cliCorimSign($ cocli corim sign) - cliCorimVerify($ cocli corim verify) - cliCorimExtract($ cocli corim extract) - cliCorimDisplay($ cocli corim display) - cliCorimSubmit($ cocli corim submit) - style cliCorimCreate fill:#00758f - style cliCorimSign fill:#00758f - style cliCorimVerify fill:#00758f - style cliCorimExtract fill:#00758f - style cliCorimDisplay fill:#00758f - style cliCorimSubmit fill:#00758f - - provisioningEndpoint{{Veraison \n Provisioning \n Service}} - - CBORComid1((CBOR
CoMID)) - CBORSwid1((CBOR
SWID)) - CBORCots1((CBOR
CoTS)) - - CBORComid2((CBOR
CoMID)) - CBORSwid2((CBOR
SWID)) - CBORCots2((CBOR
CoTS)) - - CBORCorim((CBOR CoRIM)) - CoseSign1((COSE Sign1 CoRIM)) - signBool((T/F)) - - OEM --> JSONTmplCoMID - OEM --> JSONTmplCoSWID - - %% Cots items provisioning - OEM --> environments - OEM --> tas - OEM --> cas - OEM --> permClaims - OEM --> exclClaims - - OEM --> JSONTmplCoRIM - OEM --> JSONTmplMeta - OEM --> key - - %% Cots individual items - environments --> cliCotsCreate - tas --> cliCotsCreate - cas --> cliCotsCreate - permClaims --> cliCotsCreate - exclClaims --> cliCotsCreate - - - JSONTmplCoMID --> cliComidCreate - JSONTmplCoSWID --> cliCoswidCreate - JSONTmplCoRIM --> cliCorimCreate - JSONTmplMeta --> cliCorimSign - key --> cliCorimSign - key --> cliCorimVerify - - cliComidCreate --> CBORComid1 - cliCotsCreate --> CBORCots1 - cliCoswidCreate --> CBORSwid1 - - cliCorimCreate --> CBORCorim - cliCorimSign --> CoseSign1 - cliCorimVerify --> signBool - cliCorimSubmit -- to--> provisioningEndpoint - - CBORComid1 --> cliComidDisplay - CBORComid1 --> cliCorimCreate - - CBORCots1 --> cliCorimCreate - CBORCots1 --> cliCotsDisplay - - CBORSwid1 --> cliCoswidDisplay - CBORSwid1 --> cliCorimCreate - - CBORCorim --> cliCorimSubmit - CBORCorim --> cliCorimSign - CoseSign1 --> cliCorimExtract - CoseSign1 --> cliCorimVerify - CoseSign1 --> cliCorimDisplay - - cliCorimExtract --> CBORComid2 - cliCorimExtract --> CBORSwid2 - cliCorimExtract --> CBORCots2 -``` +`cocli` is now available at [https://github.com/veraison/cocli](https://github.com/veraison/cocli) diff --git a/cocli/cmd/comid.go b/cocli/cmd/comid.go deleted file mode 100644 index 0b6c2429..00000000 --- a/cocli/cmd/comid.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2021 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "os" - - "github.com/spf13/cobra" -) - -var comidCmd = &cobra.Command{ - Use: "comid", - Short: "CoMID manipulation", - - Run: func(cmd *cobra.Command, args []string) { - if len(args) == 0 { - cmd.Help() // nolint: errcheck - os.Exit(0) - } - }, -} - -func init() { - rootCmd.AddCommand(comidCmd) -} diff --git a/cocli/cmd/comidCreate.go b/cocli/cmd/comidCreate.go deleted file mode 100644 index 02b1a4d8..00000000 --- a/cocli/cmd/comidCreate.go +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "errors" - "fmt" - - "github.com/spf13/afero" - "github.com/spf13/cobra" - "github.com/veraison/corim/comid" -) - -var ( - comidCreateFiles []string - comidCreateDirs []string - comidCreateOutputDir string -) - -var comidCreateCmd = NewComidCreateCmd() - -func NewComidCreateCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "create", - Short: "create one or more CBOR-encoded CoMID(s) from the supplied JSON template(s)", - Long: `create one or more CBOR-encoded CoMID(s) from the supplied JSON template(s) - - Create CoMIDs from templates t1.json and t2.json, plus any template found in - the templates/ directory. Save them to the current working directory. - - cocli comid create --template=t1.json \ - --template=t2.json \ - --template-dir=templates - - Create one CoMID from template t3.json and save it to the comids/ directory. - Note that the output directory must exist. - - cocli comid create --template=t3.json --output-dir=comids - - Note: since the output file is deterministically generated from the template - file name, all the template file names (when from different directories) - MUST be different. - `, - RunE: func(cmd *cobra.Command, args []string) error { - if err := checkComidCreateArgs(); err != nil { - return err - } - - filesList := filesList(comidCreateFiles, comidCreateDirs, ".json") - if len(filesList) == 0 { - return errors.New("no files found") - } - - errs := 0 - for _, tmplFile := range filesList { - cborFile, err := templateToCBOR(tmplFile, comidCreateOutputDir) - if err != nil { - fmt.Printf(">> creation failed for %q: %v\n", cborFile, err) - errs++ - continue - } - fmt.Printf(">> created %q from %q\n", cborFile, tmplFile) - } - - if errs != 0 { - return fmt.Errorf("%d/%d creations(s) failed", errs, len(filesList)) - } - return nil - }, - } - - cmd.Flags().StringArrayVarP( - &comidCreateFiles, "template", "t", []string{}, "a CoMID template file (in JSON format)", - ) - - cmd.Flags().StringArrayVarP( - &comidCreateDirs, "template-dir", "T", []string{}, "a directory containing CoMID template files", - ) - - cmd.Flags().StringVarP( - &comidCreateOutputDir, "output-dir", "o", ".", "directory where the created files are stored", - ) - - return cmd -} - -func checkComidCreateArgs() error { - if len(comidCreateFiles) == 0 && len(comidCreateDirs) == 0 { - return errors.New("no templates supplied") - } - return nil -} - -func templateToCBOR(tmplFile, outputDir string) (string, error) { - var ( - tmplData, cborData []byte - cborFile string - c comid.Comid - err error - ) - - if tmplData, err = afero.ReadFile(fs, tmplFile); err != nil { - return "", fmt.Errorf("error loading template from %s: %w", tmplFile, err) - } - - if err = c.FromJSON(tmplData); err != nil { - return "", fmt.Errorf("error decoding template from %s: %w", tmplFile, err) - } - - if err = c.Valid(); err != nil { - return "", fmt.Errorf("error validating template %s: %w", tmplFile, err) - } - - cborData, err = c.ToCBOR() - if err != nil { - return "", fmt.Errorf("error encoding template %s to CBOR: %w", tmplFile, err) - } - - cborFile = makeFileName(outputDir, tmplFile, ".cbor") - - err = afero.WriteFile(fs, cborFile, cborData, 0644) - if err != nil { - return "", fmt.Errorf("error saving CBOR file %s: %w", cborFile, err) - } - - return cborFile, nil -} - -func init() { - comidCmd.AddCommand(comidCreateCmd) -} diff --git a/cocli/cmd/comidCreate_test.go b/cocli/cmd/comidCreate_test.go deleted file mode 100644 index 9bac5dca..00000000 --- a/cocli/cmd/comidCreate_test.go +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "testing" - - "github.com/spf13/afero" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "github.com/veraison/corim/comid" -) - -func Test_ComidCreateCmd_unknown_argument(t *testing.T) { - cmd := NewComidCreateCmd() - - args := []string{"--unknown-argument=val"} - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "unknown flag: --unknown-argument") -} - -func Test_ComidCreateCmd_no_templates(t *testing.T) { - cmd := NewComidCreateCmd() - - // no args - - err := cmd.Execute() - assert.EqualError(t, err, "no templates supplied") -} - -func Test_ComidCreateCmd_no_files_found(t *testing.T) { - cmd := NewComidCreateCmd() - - args := []string{ - "--template=unknown", - "--template-dir=unsure", - } - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "no files found") -} - -func Test_ComidCreateCmd_template_with_invalid_json(t *testing.T) { - var err error - - cmd := NewComidCreateCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "invalid.json", []byte("..."), 0644) - require.NoError(t, err) - - args := []string{ - "--template=invalid.json", - } - cmd.SetArgs(args) - - err = cmd.Execute() - assert.EqualError(t, err, "1/1 creations(s) failed") -} - -func Test_ComidCreateCmd_template_with_invalid_comid(t *testing.T) { - var err error - - cmd := NewComidCreateCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "bad-comid.json", []byte("{}"), 0644) - require.NoError(t, err) - - args := []string{ - "--template=bad-comid.json", - } - cmd.SetArgs(args) - - err = cmd.Execute() - assert.EqualError(t, err, "1/1 creations(s) failed") -} - -func Test_ComidCreateCmd_template_from_file_to_default_dir(t *testing.T) { - var err error - - cmd := NewComidCreateCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "ok.json", []byte(comid.PSARefValJSONTemplate), 0644) - require.NoError(t, err) - - args := []string{ - "--template=ok.json", - } - cmd.SetArgs(args) - - err = cmd.Execute() - assert.NoError(t, err) - - expectedFileName := "ok.cbor" - - _, err = fs.Stat(expectedFileName) - assert.NoError(t, err) -} - -func Test_ComidCreateCmd_template_from_dir_to_custom_dir(t *testing.T) { - var err error - - cmd := NewComidCreateCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "testdir/ok.json", []byte(comid.PSARefValJSONTemplate), 0644) - require.NoError(t, err) - - args := []string{ - "--template-dir=testdir", - "--output-dir=testdir", - } - cmd.SetArgs(args) - - err = cmd.Execute() - assert.NoError(t, err) - - expectedFileName := "testdir/ok.cbor" - - _, err = fs.Stat(expectedFileName) - assert.NoError(t, err) -} diff --git a/cocli/cmd/comidDisplay.go b/cocli/cmd/comidDisplay.go deleted file mode 100644 index 41683e66..00000000 --- a/cocli/cmd/comidDisplay.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "errors" - "fmt" - - "github.com/spf13/afero" - "github.com/spf13/cobra" -) - -var ( - comidDisplayFiles []string - comidDisplayDirs []string -) - -var comidDisplayCmd = NewComidDisplayCmd() - -func NewComidDisplayCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "display", - Short: "display one or more CBOR-encoded CoMID(s) in human readable (JSON) format", - Long: `display one or more CBOR-encoded CoMID(s) in human readable (JSON) format. - You can supply individual CoMID files or directories containing CoMID files. - - Display CoMID in file c.cbor. - - cocli comid display --file=c.cbor - - Display CoMIDs in files c1.cbor, c2.cbor and any cbor file in the comids/ - directory. - - cocli comid display --file=c1.cbor --file=c2.cbor --dir=comids - `, - - RunE: func(cmd *cobra.Command, args []string) error { - if err := checkComidDisplayArgs(); err != nil { - return err - } - - filesList := filesList(comidDisplayFiles, comidDisplayDirs, ".cbor") - if len(filesList) == 0 { - return errors.New("no files found") - } - - errs := 0 - for _, file := range filesList { - if err := displayComidFile(file); err != nil { - fmt.Printf(">> failed displaying %q: %v\n", file, err) - errs++ - continue - } - } - - if errs != 0 { - return fmt.Errorf("%d/%d display(s) failed", errs, len(filesList)) - } - return nil - }, - } - - cmd.Flags().StringArrayVarP( - &comidDisplayFiles, "file", "f", []string{}, "a CoMID file (in CBOR format)", - ) - - cmd.Flags().StringArrayVarP( - &comidDisplayDirs, "dir", "d", []string{}, "a directory containing CoMID files (in CBOR format)", - ) - - return cmd -} - -func displayComidFile(file string) error { - var ( - data []byte - err error - ) - - if data, err = afero.ReadFile(fs, file); err != nil { - return fmt.Errorf("error loading CoMID from %s: %w", file, err) - } - - // use file name as heading - return printComid(data, ">> ["+file+"]") -} - -func checkComidDisplayArgs() error { - if len(comidDisplayFiles) == 0 && len(comidDisplayDirs) == 0 { - return errors.New("no files supplied") - } - return nil -} - -func init() { - comidCmd.AddCommand(comidDisplayCmd) -} diff --git a/cocli/cmd/comidDisplay_test.go b/cocli/cmd/comidDisplay_test.go deleted file mode 100644 index cc43a92f..00000000 --- a/cocli/cmd/comidDisplay_test.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2021 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "fmt" - "testing" - - "github.com/spf13/afero" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func Test_ComidDisplayCmd_unknown_argument(t *testing.T) { - cmd := NewComidDisplayCmd() - - args := []string{"--unknown-argument=val"} - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "unknown flag: --unknown-argument") -} - -func Test_ComidDisplayCmd_no_files(t *testing.T) { - cmd := NewComidDisplayCmd() - - // no args - - err := cmd.Execute() - assert.EqualError(t, err, "no files supplied") -} - -func Test_ComidDisplayCmd_no_files_found(t *testing.T) { - cmd := NewComidDisplayCmd() - - args := []string{ - "--file=unknown", - "--dir=unsure", - } - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "no files found") -} - -func Test_ComidDisplayCmd_file_with_invalid_cbor(t *testing.T) { - var err error - - cmd := NewComidDisplayCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "invalid.cbor", []byte{0xff, 0xff}, 0400) - require.NoError(t, err) - - args := []string{ - "--file=invalid.cbor", - } - cmd.SetArgs(args) - - err = cmd.Execute() - assert.EqualError(t, err, "1/1 display(s) failed") -} - -func Test_ComidDisplayCmd_file_with_valid_comid(t *testing.T) { - var err error - - cmd := NewComidDisplayCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "ok.cbor", PSARefValCBOR, 0400) - require.NoError(t, err) - - args := []string{ - "--file=ok.cbor", - } - cmd.SetArgs(args) - - fmt.Printf("%x\n", PSARefValCBOR) - - err = cmd.Execute() - assert.NoError(t, err) -} - -func Test_ComidDisplayCmd_file_with_valid_comid_from_dir(t *testing.T) { - var err error - - cmd := NewComidDisplayCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "testdir/ok.cbor", PSARefValCBOR, 0400) - require.NoError(t, err) - - args := []string{ - "--dir=testdir", - } - cmd.SetArgs(args) - - err = cmd.Execute() - assert.NoError(t, err) -} diff --git a/cocli/cmd/comidValidate.go b/cocli/cmd/comidValidate.go deleted file mode 100644 index 0aef8767..00000000 --- a/cocli/cmd/comidValidate.go +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "errors" - "fmt" - - "github.com/spf13/afero" - "github.com/spf13/cobra" - "github.com/veraison/corim/comid" -) - -var ( - comidValidateFiles []string - comidValidateDirs []string -) - -var comidValidateCmd = NewComidValidateCmd() - -func NewComidValidateCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "validate", - Short: "validate one or more CBOR-encoded CoMID(s)", - Long: `validate one or more CBOR-encoded CoMID(s) - - Validate CoMID in file c.cbor. - - cocli comid validate --file=c.cbor - - Validate CoMIDs in files c1.cbor, c2.cbor and any cbor file in the comids/ - directory. - - cocli comid validate --file=c1.cbor --file=c2.cbor --dir=comids - `, - - RunE: func(cmd *cobra.Command, args []string) error { - if err := checkComidValidateArgs(); err != nil { - return err - } - - filesList := filesList(comidValidateFiles, comidValidateDirs, ".cbor") - if len(filesList) == 0 { - return errors.New("no files found") - } - - errs := 0 - for _, file := range filesList { - err := validateComid(file) - if err != nil { - fmt.Printf("[invalid] %q: %v\n", file, err) - errs++ - continue - } - fmt.Printf("[valid] %q\n", file) - } - - if errs != 0 { - return fmt.Errorf("%d/%d validation(s) failed", errs, len(filesList)) - } - return nil - }, - } - - cmd.Flags().StringArrayVarP( - &comidValidateFiles, "file", "f", []string{}, "a CoMID file (in CBOR format)", - ) - - cmd.Flags().StringArrayVarP( - &comidValidateDirs, "dir", "d", []string{}, "a directory containing CoMID files (in CBOR format)", - ) - - return cmd -} - -func validateComid(file string) error { - var ( - data []byte - err error - c comid.Comid - ) - - if data, err = afero.ReadFile(fs, file); err != nil { - return fmt.Errorf("error loading CoMID from %s: %w", file, err) - } - - if err = c.FromCBOR(data); err != nil { - return fmt.Errorf("error decoding CoMID from %s: %w", file, err) - } - - if err = c.Valid(); err != nil { - return fmt.Errorf("error validating CoMID %s: %w", file, err) - } - - return nil -} - -func checkComidValidateArgs() error { - if len(comidValidateFiles) == 0 && len(comidValidateDirs) == 0 { - return errors.New("no files supplied") - } - return nil -} - -func init() { - comidCmd.AddCommand(comidValidateCmd) -} diff --git a/cocli/cmd/comidValidate_test.go b/cocli/cmd/comidValidate_test.go deleted file mode 100644 index 6c78c200..00000000 --- a/cocli/cmd/comidValidate_test.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2021 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "testing" - - "github.com/spf13/afero" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func Test_ComidValidateCmd_unknown_argument(t *testing.T) { - cmd := NewComidValidateCmd() - - args := []string{"--unknown-argument=val"} - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "unknown flag: --unknown-argument") -} - -func Test_ComidValidateCmd_no_files(t *testing.T) { - cmd := NewComidValidateCmd() - - // no args - - err := cmd.Execute() - assert.EqualError(t, err, "no files supplied") -} - -func Test_ComidValidateCmd_no_files_found(t *testing.T) { - cmd := NewComidValidateCmd() - - args := []string{ - "--file=unknown", - "--dir=unsure", - } - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "no files found") -} - -func Test_ComidValidateCmd_file_with_invalid_cbor(t *testing.T) { - var err error - - cmd := NewComidValidateCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "invalid.cbor", []byte{0xff, 0xff}, 0400) - require.NoError(t, err) - - args := []string{ - "--file=invalid.cbor", - } - cmd.SetArgs(args) - - err = cmd.Execute() - assert.EqualError(t, err, "1/1 validation(s) failed") -} - -func Test_ComidValidateCmd_file_with_invalid_comid(t *testing.T) { - var err error - - cmd := NewComidValidateCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "bad-comid.cbor", []byte{0xa0}, 0400) - require.NoError(t, err) - - args := []string{ - "--file=bad-comid.cbor", - } - cmd.SetArgs(args) - - err = cmd.Execute() - assert.EqualError(t, err, "1/1 validation(s) failed") -} - -func Test_ComidValidateCmd_file_with_valid_comid(t *testing.T) { - var err error - - cmd := NewComidValidateCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "ok.cbor", PSARefValCBOR, 0400) - require.NoError(t, err) - - args := []string{ - "--file=ok.cbor", - } - cmd.SetArgs(args) - - err = cmd.Execute() - assert.NoError(t, err) -} - -func Test_ComidValidateCmd_file_with_valid_comid_from_dir(t *testing.T) { - var err error - - cmd := NewComidValidateCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "testdir/ok.cbor", PSARefValCBOR, 0400) - require.NoError(t, err) - - args := []string{ - "--dir=testdir", - } - cmd.SetArgs(args) - - err = cmd.Execute() - assert.NoError(t, err) -} diff --git a/cocli/cmd/common.go b/cocli/cmd/common.go deleted file mode 100644 index adce111e..00000000 --- a/cocli/cmd/common.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "encoding/json" - "fmt" - "path/filepath" - "strings" - - "github.com/spf13/afero" - "github.com/veraison/corim/comid" - "github.com/veraison/corim/cots" - "github.com/veraison/swid" -) - -func filesList(files, dirs []string, ext string) []string { - var l []string - - for _, file := range files { - if _, err := fs.Stat(file); err == nil { - if filepath.Ext(file) == ext { - l = append(l, file) - } - } - } - - for _, dir := range dirs { - filesInfo, err := afero.ReadDir(fs, dir) - if err != nil { - continue - } - - for _, fileInfo := range filesInfo { - if !fileInfo.IsDir() && filepath.Ext(fileInfo.Name()) == ext { - l = append(l, filepath.Join(dir, fileInfo.Name())) - } - } - } - - return l -} - -type FromCBORLoader interface { - FromCBOR([]byte) error -} - -func printJSONFromCBOR(fcl FromCBORLoader, cbor []byte, heading string) error { - var ( - err error - j []byte - ) - - if err = fcl.FromCBOR(cbor); err != nil { - return fmt.Errorf("CBOR decoding failed: %w", err) - } - - indent := " " - if j, err = json.MarshalIndent(fcl, "", indent); err != nil { - return fmt.Errorf("JSON encoding failed: %w", err) - } - - fmt.Println(heading) - fmt.Println(string(j)) - - return nil -} - -func printComid(cbor []byte, heading string) error { - return printJSONFromCBOR(&comid.Comid{}, cbor, heading) -} - -func printCoswid(cbor []byte, heading string) error { - return printJSONFromCBOR(&swid.SoftwareIdentity{}, cbor, heading) -} - -func printCots(cbor []byte, heading string) error { - return printJSONFromCBOR(&cots.ConciseTaStore{}, cbor, heading) -} - -func makeFileName(dirName, baseName, ext string) string { - return filepath.Join( - dirName, - filepath.Base( - strings.TrimSuffix( - baseName, - filepath.Ext(baseName), - ), - )+ext, - ) -} diff --git a/cocli/cmd/corim.go b/cocli/cmd/corim.go deleted file mode 100644 index 2615064f..00000000 --- a/cocli/cmd/corim.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2021 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "os" - - "github.com/spf13/cobra" -) - -var corimCmd = &cobra.Command{ - Use: "corim", - Short: "CoRIM manipulation", - - Run: func(cmd *cobra.Command, args []string) { - if len(args) == 0 { - cmd.Help() // nolint: errcheck - os.Exit(0) - } - }, -} - -func init() { - rootCmd.AddCommand(corimCmd) -} diff --git a/cocli/cmd/corimCreate.go b/cocli/cmd/corimCreate.go deleted file mode 100644 index c3bfd568..00000000 --- a/cocli/cmd/corimCreate.go +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "errors" - "fmt" - - "github.com/spf13/afero" - "github.com/spf13/cobra" - "github.com/veraison/corim/comid" - "github.com/veraison/corim/corim" - "github.com/veraison/corim/cots" - "github.com/veraison/swid" -) - -var ( - corimCreateCorimFile *string - corimCreateCoswidFiles []string - corimCreateCoswidDirs []string - corimCreateComidFiles []string - corimCreateComidDirs []string - corimCreateCotsFiles []string - corimCreateCotsDirs []string - corimCreateOutputFile *string -) - -var corimCreateCmd = NewCorimCreateCmd() - -func NewCorimCreateCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "create", - Short: "create a CBOR-encoded CoRIM from the supplied JSON template, CoMID(s), CoSWID(s) and/or CoTS", - Long: `create a CBOR-encoded CoRIM from the supplied JSON template, CoMID(s), CoSWID(s) and/or CoTS, - - Create a CoRIM from template t1.json, adding CoMIDs found in the comid/ - directory, CoSWIDs found in the coswid/ directory and CoTS found in the cots/ directory. Since no explicit - output file is set, the (unsigned) CoRIM is saved to the current directory - with tag-id as basename and a .cbor extension. - - cocli corim create --template=t1.json --comid-dir=comid --coswid-dir=coswid --cots-dir=cots - - Create a CoRIM from template corim-template.json, adding CoMID stored in - comid1.cbor and the two CoSWIDs stored in coswid1.cbor and dir/coswid2.cbor - and a CoTS stored in cots1.cbor. - The (unsigned) CoRIM is saved to corim.cbor. - - cocli corim create --template=corim-template.json \ - --comid=comid1.cbor \ - --coswid=coswid1.cbor \ - --coswid=dir/coswid2.cbor \ - --cots=cots1.cbor - --output=corim.cbor - `, - - RunE: func(cmd *cobra.Command, args []string) error { - if err := checkCorimCreateArgs(); err != nil { - return err - } - - comidFilesList := filesList(corimCreateComidFiles, corimCreateComidDirs, ".cbor") - coswidFilesList := filesList(corimCreateCoswidFiles, corimCreateCoswidDirs, ".cbor") - cotsFilesList := filesList(corimCreateCotsFiles, corimCreateCotsDirs, ".cbor") - - if len(comidFilesList)+len(coswidFilesList)+len(cotsFilesList) == 0 { - return errors.New("no CoMID, CoSWID or CoTS files found") - } - - // checkCorimCreateArgs makes sure corimCreateCorimFile is not nil - cborFile, err := corimTemplateToCBOR(*corimCreateCorimFile, - comidFilesList, coswidFilesList, cotsFilesList, corimCreateOutputFile) - if err != nil { - return err - } - fmt.Printf(">> created %q from %q\n", cborFile, *corimCreateCorimFile) - - return nil - }, - } - - corimCreateCorimFile = cmd.Flags().StringP("template", "t", "", "a CoRIM template file (in JSON format)") - - cmd.Flags().StringArrayVarP( - &corimCreateComidDirs, "comid-dir", "M", []string{}, "a directory containing CBOR-encoded CoMID files", - ) - - cmd.Flags().StringArrayVarP( - &corimCreateComidFiles, "comid", "m", []string{}, "a CBOR-encoded CoMID file", - ) - - cmd.Flags().StringArrayVarP( - &corimCreateCoswidDirs, "coswid-dir", "S", []string{}, "a directory containing CBOR-encoded CoSWID files", - ) - - cmd.Flags().StringArrayVarP( - &corimCreateCoswidFiles, "coswid", "s", []string{}, "a CBOR-encoded CoSWID file", - ) - - cmd.Flags().StringArrayVarP( - &corimCreateCotsDirs, "cots-dir", "C", []string{}, "a directory containing CBOR-encoded CoTS files", - ) - - cmd.Flags().StringArrayVarP( - &corimCreateCotsFiles, "cots", "c", []string{}, "a CBOR-encoded CoTS file", - ) - - corimCreateOutputFile = cmd.Flags().StringP("output", "o", "", "name of the generated (unsigned) CoRIM file") - - return cmd -} - -func checkCorimCreateArgs() error { - if corimCreateCorimFile == nil || *corimCreateCorimFile == "" { - return errors.New("no CoRIM template supplied") - } - - if len(corimCreateComidDirs)+len(corimCreateComidFiles)+ - len(corimCreateCoswidDirs)+len(corimCreateCoswidFiles)+ - len(corimCreateCotsDirs)+len(corimCreateCotsFiles) == 0 { - return errors.New("no CoMID, CoSWID or CoTS files or folders supplied") - } - - return nil -} - -func corimTemplateToCBOR(tmplFile string, comidFiles, coswidFiles, cotsFiles []string, outputFile *string) (string, error) { - var ( - tmplData, corimCBOR []byte - c corim.UnsignedCorim - corimFile string - err error - ) - - if tmplData, err = afero.ReadFile(fs, tmplFile); err != nil { - return "", fmt.Errorf("error loading template from %s: %w", tmplFile, err) - } - - if err = c.FromJSON(tmplData); err != nil { - return "", fmt.Errorf("error decoding template from %s: %w", tmplFile, err) - } - - // append CoMID(s) - for _, comidFile := range comidFiles { - var ( - comidCBOR []byte - m comid.Comid - ) - - comidCBOR, err = afero.ReadFile(fs, comidFile) - if err != nil { - return "", fmt.Errorf("error loading CoMID from %s: %w", comidFile, err) - } - - err = m.FromCBOR(comidCBOR) - if err != nil { - return "", fmt.Errorf("error loading CoMID from %s: %w", comidFile, err) - } - - if c.AddComid(m) == nil { - return "", fmt.Errorf( - "error adding CoMID from %s (check its validity using the %q sub-command)", - comidFile, "comid validate", - ) - } - } - - // append CoSWID(s) - for _, coswidFile := range coswidFiles { - var ( - coswidCBOR []byte - s swid.SoftwareIdentity - ) - - coswidCBOR, err = afero.ReadFile(fs, coswidFile) - if err != nil { - return "", fmt.Errorf("error loading CoSWID from %s: %w", coswidFile, err) - } - - err = s.FromCBOR(coswidCBOR) - if err != nil { - return "", fmt.Errorf("error loading CoSWID from %s: %w", coswidFile, err) - } - - if c.AddCoswid(s) == nil { - return "", fmt.Errorf("error adding CoSWID from %s", coswidFile) - } - } - - // append CoTS(s) - for _, cotsFile := range cotsFiles { - var ( - cotsCBOR []byte - t cots.ConciseTaStore - ) - - cotsCBOR, err = afero.ReadFile(fs, cotsFile) - if err != nil { - return "", fmt.Errorf("error loading CoTS from %s: %w", cotsFile, err) - } - - err = t.FromCBOR(cotsCBOR) - if err != nil { - return "", fmt.Errorf("error loading CoTS from %s: %w", cotsFile, err) - } - - if c.AddCots(t) == nil { - return "", fmt.Errorf("error adding CoTS from %s", cotsFile) - } - } - - // check the result - if err = c.Valid(); err != nil { - return "", fmt.Errorf("error validating CoRIM: %w", err) - } - - corimCBOR, err = c.ToCBOR() - if err != nil { - return "", fmt.Errorf("error encoding CoRIM to CBOR: %w", err) - } - - if outputFile == nil || *outputFile == "" { - corimFile = makeFileName("", tmplFile, ".cbor") - } else { - corimFile = *outputFile - } - - err = afero.WriteFile(fs, corimFile, corimCBOR, 0644) - if err != nil { - return "", fmt.Errorf("error saving CoRIM to file %s: %w", corimFile, err) - } - - return corimFile, nil -} - -func init() { - corimCmd.AddCommand(corimCreateCmd) -} diff --git a/cocli/cmd/corimCreate_test.go b/cocli/cmd/corimCreate_test.go deleted file mode 100644 index 3a68e672..00000000 --- a/cocli/cmd/corimCreate_test.go +++ /dev/null @@ -1,266 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "testing" - - "github.com/spf13/afero" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func Test_CorimCreateCmd_unknown_argument(t *testing.T) { - cmd := NewCorimCreateCmd() - - args := []string{"--unknown-argument=val"} - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "unknown flag: --unknown-argument") -} - -func Test_CorimCreateCmd_no_templates(t *testing.T) { - cmd := NewCorimCreateCmd() - - // no args - - err := cmd.Execute() - assert.EqualError(t, err, "no CoRIM template supplied") -} - -func Test_CorimCreateCmd_no_files_found(t *testing.T) { - cmd := NewCorimCreateCmd() - - args := []string{ - "--template=unknown.json", - "--comid=unsure.cbor", - "--comid-dir=somedir", - "--coswid=what.cbor", - "--coswid-dir=someotherdir", - } - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "no CoMID, CoSWID or CoTS files found") -} - -func Test_CorimCreateCmd_no_tag_files(t *testing.T) { - cmd := NewCorimCreateCmd() - - args := []string{ - "--template=unknown.json", - // no --co{m,sw}id,{cots}-{dir,} - } - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "no CoMID, CoSWID or CoTS files or folders supplied") -} - -func Test_CorimCreateCmd_template_not_found(t *testing.T) { - var err error - - cmd := NewCorimCreateCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "ignored-comid.cbor", []byte{}, 0644) - require.NoError(t, err) - - args := []string{ - "--template=nonexistent.json", - "--comid=ignored-comid.cbor", - } - cmd.SetArgs(args) - - err = cmd.Execute() - assert.EqualError(t, err, "error loading template from nonexistent.json: open nonexistent.json: file does not exist") -} - -func Test_CorimCreateCmd_template_with_invalid_json(t *testing.T) { - var err error - - cmd := NewCorimCreateCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "invalid.json", []byte("..."), 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "ignored-comid.cbor", []byte{}, 0644) - require.NoError(t, err) - - args := []string{ - "--template=invalid.json", - "--comid=ignored-comid.cbor", - } - cmd.SetArgs(args) - - err = cmd.Execute() - assert.EqualError(t, err, "error decoding template from invalid.json: invalid character '.' looking for beginning of value") -} - -func Test_CorimCreateCmd_with_a_bad_comid(t *testing.T) { - var err error - - cmd := NewCorimCreateCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "min-tmpl.json", minimalCorimTemplate, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "bad-comid.cbor", badCBOR, 0644) - require.NoError(t, err) - - args := []string{ - "--template=min-tmpl.json", - "--comid=bad-comid.cbor", - } - cmd.SetArgs(args) - - err = cmd.Execute() - assert.EqualError(t, err, `error loading CoMID from bad-comid.cbor: expected map (CBOR Major Type 5), found Major Type 7`) -} - -func Test_CorimCreateCmd_with_an_invalid_comid(t *testing.T) { - var err error - - cmd := NewCorimCreateCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "min-tmpl.json", minimalCorimTemplate, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "invalid-comid.cbor", invalidComid, 0644) - require.NoError(t, err) - - args := []string{ - "--template=min-tmpl.json", - "--comid=invalid-comid.cbor", - } - cmd.SetArgs(args) - - err = cmd.Execute() - assert.EqualError(t, err, `error loading CoMID from invalid-comid.cbor: missing mandatory field "Triples" (4)`) -} - -func Test_CorimCreateCmd_with_a_bad_coswid(t *testing.T) { - var err error - - cmd := NewCorimCreateCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "min-tmpl.json", minimalCorimTemplate, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "bad-coswid.cbor", badCBOR, 0644) - require.NoError(t, err) - - args := []string{ - "--template=min-tmpl.json", - "--coswid=bad-coswid.cbor", - } - cmd.SetArgs(args) - - err = cmd.Execute() - assert.EqualError(t, err, `error loading CoSWID from bad-coswid.cbor: cbor: unexpected "break" code`) -} - -func Test_CorimCreateCmd_with_an_invalid_cots(t *testing.T) { - var err error - - cmd := NewCorimCreateCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "min-tmpl.json", minimalCorimTemplate, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "invalid-cots.cbor", invalidCots, 0644) - require.NoError(t, err) - - args := []string{ - "--template=min-tmpl.json", - "--cots=invalid-cots.cbor", - } - cmd.SetArgs(args) - - err = cmd.Execute() - assert.EqualError(t, err, `error adding CoTS from invalid-cots.cbor`) -} - -func Test_CorimCreateCmd_with_a_bad_cots(t *testing.T) { - var err error - - cmd := NewCorimCreateCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "min-tmpl.json", minimalCorimTemplate, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "bad-cots.cbor", badCBOR, 0644) - require.NoError(t, err) - - args := []string{ - "--template=min-tmpl.json", - "--cots=bad-cots.cbor", - } - cmd.SetArgs(args) - - err = cmd.Execute() - assert.EqualError(t, err, `error loading CoTS from bad-cots.cbor: cbor: unexpected "break" code`) -} - -func Test_CorimCreateCmd_successful_comid_coswid_and_cots_from_file(t *testing.T) { - var err error - - cmd := NewCorimCreateCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "min-tmpl.json", minimalCorimTemplate, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "coswid.cbor", testCoswid, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "comid.cbor", testComid, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "cots.cbor", testCots, 0644) - require.NoError(t, err) - - args := []string{ - "--template=min-tmpl.json", - "--coswid=coswid.cbor", - "--comid=comid.cbor", - "--cots=cots.cbor", - "--output=corim.cbor", - } - cmd.SetArgs(args) - - err = cmd.Execute() - assert.NoError(t, err) - - _, err = fs.Stat("corim.cbor") - assert.NoError(t, err) -} - -func Test_CorimCreateCmd_successful_comid_coswid_and_cots_from_dir(t *testing.T) { - var err error - - cmd := NewCorimCreateCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "min-tmpl.json", minimalCorimTemplate, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "coswid/1.cbor", testCoswid, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "comid/1.cbor", testComid, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "cots/1.cbor", testCots, 0644) - require.NoError(t, err) - - args := []string{ - "--template=min-tmpl.json", - "--coswid-dir=coswid", - "--comid-dir=comid", - "--cots-dir=cots", - } - cmd.SetArgs(args) - - err = cmd.Execute() - assert.NoError(t, err) - - _, err = fs.Stat("min-tmpl.cbor") - assert.NoError(t, err) -} diff --git a/cocli/cmd/corimDisplay.go b/cocli/cmd/corimDisplay.go deleted file mode 100644 index 982b6450..00000000 --- a/cocli/cmd/corimDisplay.go +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - - "github.com/spf13/afero" - "github.com/spf13/cobra" - "github.com/veraison/corim/corim" - "github.com/veraison/corim/cots" -) - -var ( - corimDisplayCorimFile *string - corimDisplayShowTags *bool -) - -var corimDisplayCmd = NewCorimDisplayCmd() - -func NewCorimDisplayCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "display", - Short: "display the content of a CoRIM as JSON", - Long: `display the content of a CoRIM as JSON - - Display the contents of the signed CoRIM signed-corim.cbor - - cocli corim display --file signed-corim.cbor - - Display the contents of the signed CoRIM yet-another-signed-corim.cbor and - also unpack any embedded CoMID, CoSWID and CoTS - - cocli corim display --file yet-another-signed-corim.cbor --show-tags - `, - - RunE: func(cmd *cobra.Command, args []string) error { - if err := checkCorimDisplayArgs(); err != nil { - return err - } - - return display(*corimDisplayCorimFile, *corimDisplayShowTags) - }, - } - - corimDisplayCorimFile = cmd.Flags().StringP("file", "f", "", "a signed CoRIM file (in CBOR format)") - corimDisplayShowTags = cmd.Flags().BoolP("show-tags", "v", false, "display embedded tags") - - return cmd -} - -func checkCorimDisplayArgs() error { - if corimDisplayCorimFile == nil || *corimDisplayCorimFile == "" { - return errors.New("no CoRIM supplied") - } - - return nil -} - -func display(signedCorimFile string, showTags bool) error { - var ( - signedCorimCBOR []byte - metaJSON []byte - corimJSON []byte - err error - s corim.SignedCorim - ) - - if signedCorimCBOR, err = afero.ReadFile(fs, signedCorimFile); err != nil { - return fmt.Errorf("error loading signed CoRIM from %s: %w", signedCorimFile, err) - } - - if err = s.FromCOSE(signedCorimCBOR); err != nil { - return fmt.Errorf("error decoding signed CoRIM from %s: %w", signedCorimFile, err) - } - - if metaJSON, err = json.MarshalIndent(&s.Meta, "", " "); err != nil { - return fmt.Errorf("error decoding CoRIM Meta from %s: %w", signedCorimFile, err) - } - - fmt.Println("Meta:") - fmt.Println(string(metaJSON)) - - if corimJSON, err = json.MarshalIndent(&s.UnsignedCorim, "", " "); err != nil { - return fmt.Errorf("error decoding unsigned CoRIM from %s: %w", signedCorimFile, err) - } - - fmt.Println("Corim:") - fmt.Println(string(corimJSON)) - - if showTags { - fmt.Println("Tags:") - for i, e := range s.UnsignedCorim.Tags { - // need at least 3 bytes for the tag and 1 for the smallest bstr - if len(e) < 3+1 { - fmt.Printf(">> skipping malformed tag at index %d\n", i) - continue - } - - // split tag from data - cborTag, cborData := e[:3], e[3:] - - hdr := fmt.Sprintf(">> [ %d ]", i) - - if bytes.Equal(cborTag, corim.ComidTag) { - if err = printComid(cborData, hdr); err != nil { - fmt.Printf(">> skipping malformed CoMID tag at index %d: %v\n", i, err) - } - } else if bytes.Equal(cborTag, corim.CoswidTag) { - if err = printCoswid(cborData, hdr); err != nil { - fmt.Printf(">> skipping malformed CoSWID tag at index %d: %v\n", i, err) - } - } else if bytes.Equal(cborTag, cots.CotsTag) { - if err = printCots(cborData, hdr); err != nil { - fmt.Printf(">> skipping malformed CoTS tag at index %d: %v\n", i, err) - } - } else { - fmt.Printf(">> unmatched CBOR tag: %x\n", cborTag) - } - } - } - - return nil -} - -func init() { - corimCmd.AddCommand(corimDisplayCmd) -} diff --git a/cocli/cmd/corimDisplay_test.go b/cocli/cmd/corimDisplay_test.go deleted file mode 100644 index 419fef6e..00000000 --- a/cocli/cmd/corimDisplay_test.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "testing" - - "github.com/spf13/afero" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func Test_CorimDisplayCmd_unknown_argument(t *testing.T) { - cmd := NewCorimDisplayCmd() - - args := []string{"--unknown-argument=val"} - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "unknown flag: --unknown-argument") -} - -func Test_CorimDisplayCmd_mandatory_args_missing_corim_file(t *testing.T) { - cmd := NewCorimDisplayCmd() - - args := []string{ - "--show-tags", - } - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "no CoRIM supplied") -} - -func Test_CorimDisplayCmd_non_existent_corim_file(t *testing.T) { - cmd := NewCorimDisplayCmd() - - args := []string{ - "--file=nonexistent.cbor", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - - err := cmd.Execute() - assert.EqualError(t, err, "error loading signed CoRIM from nonexistent.cbor: open nonexistent.cbor: file does not exist") -} - -func Test_CorimDisplayCmd_bad_signed_corim(t *testing.T) { - cmd := NewCorimDisplayCmd() - - args := []string{ - "--file=bad.txt", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "bad.txt", []byte("hello!"), 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.EqualError(t, err, "error decoding signed CoRIM from bad.txt: failed CBOR decoding for COSE-Sign1 signed CoRIM: cbor: invalid COSE_Sign1_Tagged object") -} - -func Test_CorimDisplayCmd_invalid_signed_corim(t *testing.T) { - cmd := NewCorimDisplayCmd() - - args := []string{ - "--file=invalid.cbor", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "invalid.cbor", testSignedCorimInvalid, 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.EqualError(t, err, `error decoding signed CoRIM from invalid.cbor: failed CBOR decoding of unsigned CoRIM: unexpected EOF`) -} - -func Test_CorimDisplayCmd_ok_top_level_view(t *testing.T) { - cmd := NewCorimDisplayCmd() - - args := []string{ - "--file=ok.cbor", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "ok.cbor", testSignedCorimValid, 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.NoError(t, err) -} - -func Test_CorimDisplayCmd_ok_nested_view(t *testing.T) { - cmd := NewCorimDisplayCmd() - - args := []string{ - "--file=ok.cbor", - "--show-tags", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "ok.cbor", testSignedCorimValid, 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.NoError(t, err) -} - -func Test_CorimDisplayCmd_ok_top_level_view_with_cots(t *testing.T) { - cmd := NewCorimDisplayCmd() - - args := []string{ - "--file=ok.cbor", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "ok.cbor", testSignedCorimValidWithCots, 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.NoError(t, err) -} - -func Test_CorimDisplayCmd_ok_nested_view_with_cots(t *testing.T) { - cmd := NewCorimDisplayCmd() - - args := []string{ - "--file=ok.cbor", - "--show-tags", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "ok.cbor", testSignedCorimValidWithCots, 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.NoError(t, err) -} diff --git a/cocli/cmd/corimExtract.go b/cocli/cmd/corimExtract.go deleted file mode 100644 index 3761ee04..00000000 --- a/cocli/cmd/corimExtract.go +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "bytes" - "errors" - "fmt" - "path/filepath" - - "github.com/spf13/afero" - "github.com/spf13/cobra" - "github.com/veraison/corim/corim" - "github.com/veraison/corim/cots" -) - -var ( - corimExtractCorimFile *string - corimExtractOutputDir *string -) - -var corimExtractCmd = NewCorimExtractCmd() - -func NewCorimExtractCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "extract", - Short: "extract, as-is, CoSWIDs CoMIDs, CoTS found in a CoRIM and save them to disk", - Long: `extract, as-is, CoSWIDs and CoMIDs, CoTS found in a CoRIM and save them to disk - - Extract the contents of the signed CoRIM signed-corim.cbor to the current - directory - - cocli corim extract --file=signed-corim.cbor - - Extract the contents of the signed CoRIM yet-another-signed-corim.cbor and - store them to directory my-dir. Note that my-dir must exist. - - cocli corim extract --file=yet-another-signed-corim.cbor \ - --output-dir=my-dir - `, - - RunE: func(cmd *cobra.Command, args []string) error { - if err := checkCorimExtractArgs(); err != nil { - return err - } - - return extract(*corimExtractCorimFile, corimExtractOutputDir) - }, - } - - corimExtractCorimFile = cmd.Flags().StringP("file", "f", "", "a signed CoRIM file (in CBOR format)") - corimExtractOutputDir = cmd.Flags().StringP("output-dir", "o", ".", "folder to which CoSWIDs, CoMIDs, CoTSs are saved") - - return cmd -} - -func checkCorimExtractArgs() error { - if corimExtractCorimFile == nil || *corimExtractCorimFile == "" { - return errors.New("no CoRIM supplied") - } - - return nil -} - -func extract(signedCorimFile string, outputDir *string) error { - var ( - signedCorimCBOR []byte - err error - s corim.SignedCorim - baseDir string - ) - - if signedCorimCBOR, err = afero.ReadFile(fs, signedCorimFile); err != nil { - return fmt.Errorf("error loading signed CoRIM from %s: %w", signedCorimFile, err) - } - - if err = s.FromCOSE(signedCorimCBOR); err != nil { - return fmt.Errorf("error decoding signed CoRIM from %s: %w", signedCorimFile, err) - } - - baseDir = "." - if outputDir != nil { - baseDir = *outputDir - } - - for i, e := range s.UnsignedCorim.Tags { - var ( - outputFile string - ) - - // need at least 3 bytes for the tag and 1 for the smallest bstr - if len(e) < 3+1 { - fmt.Printf(">> skipping malformed tag at index %d\n", i) - continue - } - - // split tag from data - cborTag, cborData := e[:3], e[3:] - - if bytes.Equal(cborTag, corim.ComidTag) { - outputFile = filepath.Join(baseDir, fmt.Sprintf("%06d-comid.cbor", i)) - - if err = afero.WriteFile(fs, outputFile, cborData, 0644); err != nil { - fmt.Printf(">> error saving CoMID tag at index %d: %v\n", i, err) - } - } else if bytes.Equal(cborTag, corim.CoswidTag) { - outputFile = filepath.Join(baseDir, fmt.Sprintf("%06d-coswid.cbor", i)) - - if err = afero.WriteFile(fs, outputFile, cborData, 0644); err != nil { - fmt.Printf(">> error saving CoSWID tag at index %d: %v\n", i, err) - } - } else if bytes.Equal(cborTag, cots.CotsTag) { - outputFile = filepath.Join(baseDir, fmt.Sprintf("%06d-cots.cbor", i)) - - if err = afero.WriteFile(fs, outputFile, cborData, 0644); err != nil { - fmt.Printf(">> error saving CoTS tag at index %d: %v\n", i, err) - } - } else { - fmt.Printf(">> unmatched CBOR tag: %x\n", cborTag) - } - } - - return nil -} - -func init() { - corimCmd.AddCommand(corimExtractCmd) -} diff --git a/cocli/cmd/corimExtract_test.go b/cocli/cmd/corimExtract_test.go deleted file mode 100644 index 34fabaf7..00000000 --- a/cocli/cmd/corimExtract_test.go +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "testing" - - "github.com/spf13/afero" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func Test_CorimExtractCmd_unknown_argument(t *testing.T) { - cmd := NewCorimExtractCmd() - - args := []string{"--unknown-argument=val"} - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "unknown flag: --unknown-argument") -} - -func Test_CorimExtractCmd_mandatory_args_missing_corim_file(t *testing.T) { - cmd := NewCorimExtractCmd() - - args := []string{ - "--output-dir=ignore.d/", - } - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "no CoRIM supplied") -} - -func Test_CorimExtractCmd_non_existent_corim_file(t *testing.T) { - cmd := NewCorimExtractCmd() - - args := []string{ - "--file=nonexistent.cbor", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - - err := cmd.Execute() - assert.EqualError(t, err, "error loading signed CoRIM from nonexistent.cbor: open nonexistent.cbor: file does not exist") -} - -func Test_CorimExtractCmd_bad_signed_corim(t *testing.T) { - cmd := NewCorimExtractCmd() - - args := []string{ - "--file=bad.txt", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "bad.txt", []byte("hello!"), 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.EqualError(t, err, "error decoding signed CoRIM from bad.txt: failed CBOR decoding for COSE-Sign1 signed CoRIM: cbor: invalid COSE_Sign1_Tagged object") -} - -func Test_CorimExtractCmd_invalid_signed_corim(t *testing.T) { - cmd := NewCorimExtractCmd() - - args := []string{ - "--file=invalid.cbor", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "invalid.cbor", testSignedCorimInvalid, 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.EqualError(t, err, `error decoding signed CoRIM from invalid.cbor: failed CBOR decoding of unsigned CoRIM: unexpected EOF`) -} - -func Test_CorimExtractCmd_ok_save_to_default_dir(t *testing.T) { - cmd := NewCorimExtractCmd() - - args := []string{ - "--file=ok.cbor", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "ok.cbor", testSignedCorimValid, 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.NoError(t, err) - - _, err = fs.Stat("000000-comid.cbor") - assert.NoError(t, err) - -} - -func Test_CorimExtractCmd_ok_save_to_non_default_dir(t *testing.T) { - cmd := NewCorimExtractCmd() - - args := []string{ - "--file=ok.cbor", - "--output-dir=my-dir/", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "ok.cbor", testSignedCorimValid, 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.NoError(t, err) - - _, err = fs.Stat("my-dir/000000-comid.cbor") - assert.NoError(t, err) -} - -func Test_CorimExtractCmd_with_cots_ok_save_to_default_dir(t *testing.T) { - cmd := NewCorimExtractCmd() - - args := []string{ - "--file=ok.cbor", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "ok.cbor", testSignedCorimValidWithCots, 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.NoError(t, err) - - _, err = fs.Stat("000000-cots.cbor") - assert.NoError(t, err) - -} diff --git a/cocli/cmd/corimSign.go b/cocli/cmd/corimSign.go deleted file mode 100644 index 74a0c98e..00000000 --- a/cocli/cmd/corimSign.go +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "errors" - "fmt" - - "github.com/spf13/afero" - "github.com/spf13/cobra" - "github.com/veraison/corim/corim" - cose "github.com/veraison/go-cose" -) - -var ( - corimSignCorimFile *string - corimSignKeyFile *string - corimSignOutputFile *string - corimSignMetaFile *string -) - -var corimSignCmd = NewCorimSignCmd() - -func NewCorimSignCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "sign", - Short: "create a signed CoRIM from an unsigned, CBOR-encoded CoRIM using the supplied key", - Long: `create a signed CoRIM from an unsigned, CBOR-encoded CoRIM using the supplied key - - Sign the unsigned CoRIM unsigned-corim.cbor using the key in JWK format from - file key.jwk and save the resulting COSE Sign1 to signed-corim.cbor. Read - the relevant CorimMeta information from file meta.json. - - cocli corim sign --file=unsigned-corim.cbor \ - --key=key.jwk \ - --meta=meta.json \ - --output=signed-corim.cbor - `, - - RunE: func(cmd *cobra.Command, args []string) error { - if err := checkCorimSignArgs(); err != nil { - return err - } - - // checkCorimSignArgs makes sure corimSignCorimFile is not nil - coseFile, err := sign(*corimSignCorimFile, *corimSignKeyFile, - *corimSignMetaFile, corimSignOutputFile) - if err != nil { - return err - } - fmt.Printf(">> %q signed and saved to %q\n", *corimSignCorimFile, coseFile) - - return nil - }, - } - - corimSignCorimFile = cmd.Flags().StringP("file", "f", "", "an unsigned CoRIM file (in CBOR format)") - corimSignMetaFile = cmd.Flags().StringP("meta", "m", "", "CoRIM Meta file (in JSON format)") - corimSignKeyFile = cmd.Flags().StringP("key", "k", "", "signing key in JWK format") - corimSignOutputFile = cmd.Flags().StringP("output", "o", "", "name of the generated COSE Sign1 file") - - return cmd -} - -func checkCorimSignArgs() error { - if corimSignCorimFile == nil || *corimSignCorimFile == "" { - return errors.New("no CoRIM supplied") - } - - if corimSignKeyFile == nil || *corimSignKeyFile == "" { - return errors.New("no key supplied") - } - - if corimSignMetaFile == nil || *corimSignMetaFile == "" { - return errors.New("no CoRIM Meta supplied") - } - - return nil -} - -func sign(unsignedCorimFile, keyFile, metaFile string, outputFile *string) (string, error) { - var ( - unsignedCorimCBOR []byte - signedCorimCBOR []byte - metaJSON []byte - keyJWK []byte - err error - signedCorimFile string - c corim.UnsignedCorim - m corim.Meta - signer cose.Signer - ) - - if unsignedCorimCBOR, err = afero.ReadFile(fs, unsignedCorimFile); err != nil { - return "", fmt.Errorf("error loading unsigned CoRIM from %s: %w", unsignedCorimFile, err) - } - - if err = c.FromCBOR(unsignedCorimCBOR); err != nil { - return "", fmt.Errorf("error decoding unsigned CoRIM from %s: %w", unsignedCorimFile, err) - } - - if err = c.Valid(); err != nil { - return "", fmt.Errorf("error validating CoRIM: %w", err) - } - - if metaJSON, err = afero.ReadFile(fs, metaFile); err != nil { - return "", fmt.Errorf("error loading CoRIM Meta from %s: %w", metaFile, err) - } - - if err = m.FromJSON(metaJSON); err != nil { - return "", fmt.Errorf("error decoding CoRIM Meta from %s: %w", metaFile, err) - } - - if err = m.Valid(); err != nil { - return "", fmt.Errorf("error validating CoRIM Meta: %w", err) - } - - if keyJWK, err = afero.ReadFile(fs, keyFile); err != nil { - return "", fmt.Errorf("error loading signing key from %s: %w", keyFile, err) - } - - if signer, err = corim.NewSignerFromJWK(keyJWK); err != nil { - return "", fmt.Errorf("error loading signing key from %s: %w", keyFile, err) - } - - s := corim.SignedCorim{ - UnsignedCorim: c, - Meta: m, - } - - signedCorimCBOR, err = s.Sign(signer) - if err != nil { - return "", fmt.Errorf("error signing CoRIM: %w", err) - } - - if outputFile == nil || *outputFile == "" { - signedCorimFile = "signed-" + unsignedCorimFile - } else { - signedCorimFile = *outputFile - } - - err = afero.WriteFile(fs, signedCorimFile, signedCorimCBOR, 0644) - if err != nil { - return "", fmt.Errorf("error saving signed CoRIM to file %s: %w", signedCorimFile, err) - } - - return signedCorimFile, nil -} - -func init() { - corimCmd.AddCommand(corimSignCmd) -} diff --git a/cocli/cmd/corimSign_test.go b/cocli/cmd/corimSign_test.go deleted file mode 100644 index f8f78ecc..00000000 --- a/cocli/cmd/corimSign_test.go +++ /dev/null @@ -1,264 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "testing" - - "github.com/spf13/afero" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func Test_CorimSignCmd_unknown_argument(t *testing.T) { - cmd := NewCorimSignCmd() - - args := []string{"--unknown-argument=val"} - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "unknown flag: --unknown-argument") -} - -func Test_CorimSignCmd_mandatory_args_missing_corim_file(t *testing.T) { - cmd := NewCorimSignCmd() - - args := []string{ - "--key=ignored.jwk", - "--meta=ignored.json", - } - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "no CoRIM supplied") -} - -func Test_CorimSignCmd_mandatory_args_missing_meta_file(t *testing.T) { - cmd := NewCorimSignCmd() - - args := []string{ - "--file=ignored.cbor", - "--key=ignored.jwk", - } - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "no CoRIM Meta supplied") -} - -func Test_CorimSignCmd_mandatory_args_missing_key_file(t *testing.T) { - cmd := NewCorimSignCmd() - - args := []string{ - "--file=ignored.cbor", - "--meta=ignored.json", - } - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "no key supplied") -} - -func Test_CorimSignCmd_non_existent_unsigned_corim_file(t *testing.T) { - cmd := NewCorimSignCmd() - - args := []string{ - "--file=nonexistent.cbor", - "--key=ignored.jwk", - "--meta=ignored.json", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - - err := cmd.Execute() - assert.EqualError(t, err, "error loading unsigned CoRIM from nonexistent.cbor: open nonexistent.cbor: file does not exist") -} - -func Test_CorimSignCmd_bad_unsigned_corim(t *testing.T) { - cmd := NewCorimSignCmd() - - args := []string{ - "--file=bad.txt", - "--key=ignored.jwk", - "--meta=ignored.json", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "bad.txt", []byte("hello!"), 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.EqualError(t, err, "error decoding unsigned CoRIM from bad.txt: expected map (CBOR Major Type 5), found Major Type 3") -} - -func Test_CorimSignCmd_invalid_unsigned_corim(t *testing.T) { - cmd := NewCorimSignCmd() - - args := []string{ - "--file=invalid.cbor", - "--key=ignored.jwk", - "--meta=ignored.json", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "invalid.cbor", testCorimInvalid, 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.EqualError(t, err, `error decoding unsigned CoRIM from invalid.cbor: missing mandatory field "Tags" (1)`) -} - -func Test_CorimSignCmd_non_existent_meta_file(t *testing.T) { - cmd := NewCorimSignCmd() - - args := []string{ - "--file=ok.cbor", - "--key=ignored.jwk", - "--meta=nonexistent.json", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "ok.cbor", testCorimValid, 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.EqualError(t, err, "error loading CoRIM Meta from nonexistent.json: open nonexistent.json: file does not exist") -} - -func Test_CorimSignCmd_bad_meta_file(t *testing.T) { - cmd := NewCorimSignCmd() - - args := []string{ - "--file=ok.cbor", - "--key=ignored.jwk", - "--meta=bad.json", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "ok.cbor", testCorimValid, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "bad.json", []byte("{"), 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.EqualError(t, err, "error decoding CoRIM Meta from bad.json: unexpected end of JSON input") -} - -func Test_CorimSignCmd_invalid_meta_file(t *testing.T) { - cmd := NewCorimSignCmd() - - args := []string{ - "--file=ok.cbor", - "--key=ignored.jwk", - "--meta=invalid.json", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "ok.cbor", testCorimValid, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "invalid.json", testMetaInvalid, 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.EqualError(t, err, "error validating CoRIM Meta: invalid signer: empty name") -} - -func Test_CorimSignCmd_non_existent_key_file(t *testing.T) { - cmd := NewCorimSignCmd() - - args := []string{ - "--file=ok.cbor", - "--key=nonexistent.jwk", - "--meta=ok.json", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "ok.cbor", testCorimValid, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "ok.json", testMetaValid, 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.EqualError(t, err, "error loading signing key from nonexistent.jwk: open nonexistent.jwk: file does not exist") -} - -func Test_CorimSignCmd_invalid_key_file(t *testing.T) { - cmd := NewCorimSignCmd() - - args := []string{ - "--file=ok.cbor", - "--key=invalid.jwk", - "--meta=ok.json", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "ok.cbor", testCorimValid, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "ok.json", testMetaValid, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "invalid.jwk", []byte("{}"), 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.EqualError(t, err, "error loading signing key from invalid.jwk: invalid key type from JSON ()") -} - -func Test_CorimSignCmd_ok_with_default_output_file(t *testing.T) { - cmd := NewCorimSignCmd() - - args := []string{ - "--file=ok.cbor", - "--key=ok.jwk", - "--meta=ok.json", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "ok.cbor", testCorimValid, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "ok.json", testMetaValid, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "ok.jwk", testECKey, 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.NoError(t, err) - - _, err = fs.Stat("signed-ok.cbor") - assert.NoError(t, err) -} - -func Test_CorimSignCmd_ok_with_custom_output_file(t *testing.T) { - cmd := NewCorimSignCmd() - - args := []string{ - "--file=ok.cbor", - "--key=ok.jwk", - "--meta=ok.json", - "--output=my-signed-corim.cbor", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "ok.cbor", testCorimValid, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "ok.json", testMetaValid, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "ok.jwk", testECKey, 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.NoError(t, err) - - _, err = fs.Stat("my-signed-corim.cbor") - assert.NoError(t, err) -} diff --git a/cocli/cmd/corimSubmit.go b/cocli/cmd/corimSubmit.go deleted file mode 100644 index 80c1bd3a..00000000 --- a/cocli/cmd/corimSubmit.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "errors" - "fmt" - "net/url" - "strings" - - "github.com/spf13/afero" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/spf13/viper" - "github.com/veraison/apiclient/provisioning" -) - -var ( - corimFile *string - mediaType *string - apiServer string - isInsecure bool - certPaths []string -) - -var ( - submitter ISubmitter = &provisioning.SubmitConfig{} - corimSubmitCmd = NewCorimSubmitCmd(submitter) -) - -func NewCorimSubmitCmd(submitter ISubmitter) *cobra.Command { - cmd := &cobra.Command{ - Use: "submit", - Short: "submit a CBOR-encoded CoRIM payload", - Long: `submit a CBOR-encoded CoRIM payload with supplied media type to the given API Server - - To submit the CBOR-encoded CoRIM from file "unsigned-corim.cbor" with media type - "application/corim-unsigned+cbor; profile=http://arm.com/psa/iot/1" to the Veraison - provisioning API endpoint "https://veraison.example/endorsement-provisioning/v1", do: - - - cocli corim submit \ - --corim-file=unsigned-corim.cbor \ - --api-server="https://veraison.example/endorsement-provisioning/v1/submit" \ - --media-type="application/corim-unsigned+cbor; profile=http://arm.com/psa/iot/1" - `, - - RunE: func(cmd *cobra.Command, args []string) error { - - if err := checkSubmitArgs(); err != nil { - return err - } - - // Load the data from the CBOR File - data, err := readCorimData(*corimFile) - if err != nil { - return fmt.Errorf("read CoRIM payload failed: %w", err) - } - - if err = provisionData(data, submitter, apiServer, *mediaType); err != nil { - return fmt.Errorf("submit CoRIM payload failed reason: %w", err) - } - return nil - }, - } - - corimFile = cmd.Flags().StringP("corim-file", "f", "", "name of the CoRIM file in CBOR format") - mediaType = cmd.Flags().StringP("media-type", "m", "", "media type of the CoRIM file") - - cmd.Flags().StringP("api-server", "s", "", "API server where to submit the corim file") - cmd.Flags().VarP(&authMethod, "auth", "a", - `authentication method, must be one of "none"/"passthrough", "basic", "oauth2"`) - cmd.Flags().StringP("client-id", "C", "", "OAuth2 client ID") - cmd.Flags().StringP("client-secret", "S", "", "OAuth2 client secret") - cmd.Flags().StringP("token-url", "T", "", "token URL of the OAuth2 service") - cmd.Flags().StringP("username", "U", "", "service username") - cmd.Flags().StringP("password", "P", "", "service password") - cmd.Flags().BoolP( - "insecure", "i", false, "Allow insecure connections (e.g. do not verify TLS certs)", - ) - cmd.Flags().StringArrayP( - "ca-cert", "E", nil, "path to a CA cert that will be used in addition to system certs; may be specified multiple times", - ) - - cmd.Flags().VisitAll(func(flag *pflag.Flag) { - cfgName := strings.ReplaceAll(flag.Name, "-", "_") - err := viper.BindPFlag(cfgName, flag) - cobra.CheckErr(err) - }) - - return cmd -} - -func checkSubmitArgs() error { - if corimFile == nil || *corimFile == "" { - return errors.New("no CoRIM input file supplied") - } - - apiServer = viper.GetString("api_server") - if apiServer == "" { - return errors.New("no API server supplied") - } - u, err := url.Parse(apiServer) - if err != nil || !u.IsAbs() { - return fmt.Errorf("malformed API server URL") - } - - if mediaType == nil || *mediaType == "" { - return errors.New("no media type supplied") - } - - isInsecure = viper.GetBool("insecure") - certPaths = viper.GetStringSlice("ca_cert") - - return nil -} - -func provisionData(data []byte, submitter ISubmitter, uri string, mediaType string) error { - submitter.SetAuth(cliConfig.Auth) - - if err := submitter.SetSubmitURI(uri); err != nil { - return fmt.Errorf("unable to set submit URI: %w", err) - } - - submitter.SetIsInsecure(isInsecure) - submitter.SetCerts(certPaths) - - submitter.SetDeleteSession(true) - if err := submitter.Run(data, mediaType); err != nil { - return fmt.Errorf("run failed: %w", err) - } - - return nil -} - -func readCorimData(file string) ([]byte, error) { - return afero.ReadFile(fs, file) -} - -func init() { - corimCmd.AddCommand(corimSubmitCmd) -} diff --git a/cocli/cmd/corimSubmit_test.go b/cocli/cmd/corimSubmit_test.go deleted file mode 100644 index b5ee04a1..00000000 --- a/cocli/cmd/corimSubmit_test.go +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "errors" - "testing" - - "github.com/golang/mock/gomock" - "github.com/spf13/afero" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - mock_deps "github.com/veraison/corim/cocli/cmd/mocks" -) - -func Test_CorimSubmitCmd_bad_server_url(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - - ms := mock_deps.NewMockISubmitter(ctrl) - cmd := NewCorimSubmitCmd(ms) - - args := []string{ - "--corim-file=corim.cbor", - "--api-server=http://www.example.com:80index", - "--media-type=application/corim-unsigned+cbor; profile=http://arm.com/psa/iot/1", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "corim.cbor", testSignedCorimValid, 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.EqualError(t, err, "malformed API server URL") -} - -func Test_CorimSubmitCmd_missing_server_url(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - - ms := mock_deps.NewMockISubmitter(ctrl) - cmd := NewCorimSubmitCmd(ms) - - args := []string{ - "--corim-file=corim.cbor", - "--media-type=application/corim-unsigned+cbor; profile=http://arm.com/psa/iot/1", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "corim.cbor", testSignedCorimValid, 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.EqualError(t, err, "no API server supplied") -} - -func Test_CorimSubmitCmd_missing_media_type(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - - ms := mock_deps.NewMockISubmitter(ctrl) - cmd := NewCorimSubmitCmd(ms) - - args := []string{ - "--corim-file=corim.cbor", - "--api-server=http://www.example.com:8080", - "--media-type=", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "corim.cbor", testSignedCorimValid, 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.EqualError(t, err, "no media type supplied") - -} - -func Test_CorimSubmitCmd_missing_corim_file(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - - ms := mock_deps.NewMockISubmitter(ctrl) - cmd := NewCorimSubmitCmd(ms) - - args := []string{ - "--corim-file=", - "--api-server=http://www.example.com:8080", - "--media-type=application/corim-unsigned+cbor; profile=http://arm.com/psa/iot/1", - } - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "no CoRIM input file supplied") - -} - -func Test_CorimSubmitCmd_non_existent_corim_file(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - - ms := mock_deps.NewMockISubmitter(ctrl) - cmd := NewCorimSubmitCmd(ms) - - args := []string{ - "--corim-file=bad.cbor", - "--api-server=http://www.example.com:8080", - "--media-type=application/corim-unsigned+cbor; profile=http://arm.com/psa/iot/1", - } - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "read CoRIM payload failed: open bad.cbor: file does not exist") -} - -func Test_CorimSubmitCmd_submit_ok(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - - ms := mock_deps.NewMockISubmitter(ctrl) - cmd := NewCorimSubmitCmd(ms) - - args := []string{ - "--corim-file=corim.cbor", - "--api-server=http://veraison.example/endorsement-provisioning/v1/submit", - "--media-type=application/corim-unsigned+cbor; profile=http://arm.com/psa/iot/1", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "corim.cbor", testSignedCorimValid, 0644) - require.NoError(t, err) - ms.EXPECT().SetAuth(gomock.Any()) - ms.EXPECT().SetSubmitURI("http://veraison.example/endorsement-provisioning/v1/submit").Return(nil) - ms.EXPECT().SetIsInsecure(false) - ms.EXPECT().SetCerts([]string{}) - ms.EXPECT().SetDeleteSession(true) - ms.EXPECT().Run(testSignedCorimValid, "application/corim-unsigned+cbor; profile=http://arm.com/psa/iot/1").Return(nil) - err = cmd.Execute() - assert.NoError(t, err) -} - -func Test_CorimSubmitCmd_submit_not_ok(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - - ms := mock_deps.NewMockISubmitter(ctrl) - cmd := NewCorimSubmitCmd(ms) - - args := []string{ - "--corim-file=corim.cbor", - "--api-server=http://veraison.example/endorsement-provisioning/v1/submit", - "--media-type=application/corim-unsigned+cbor; profile=http://arm.com/psa/iot/1", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "corim.cbor", testSignedCorimValid, 0644) - require.NoError(t, err) - ms.EXPECT().SetAuth(gomock.Any()) - ms.EXPECT().SetSubmitURI("http://veraison.example/endorsement-provisioning/v1/submit").Return(nil) - ms.EXPECT().SetIsInsecure(false) - ms.EXPECT().SetCerts([]string{}) - ms.EXPECT().SetDeleteSession(true) - err = errors.New(`unexpected HTTP response code 404`) - - ms.EXPECT().Run(testSignedCorimValid, "application/corim-unsigned+cbor; profile=http://arm.com/psa/iot/1").Return(err) - err = cmd.Execute() - assert.EqualError(t, err, "submit CoRIM payload failed reason: run failed: unexpected HTTP response code 404") -} diff --git a/cocli/cmd/corimVerify.go b/cocli/cmd/corimVerify.go deleted file mode 100644 index d0df48a7..00000000 --- a/cocli/cmd/corimVerify.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "crypto" - "errors" - "fmt" - - "github.com/spf13/afero" - "github.com/spf13/cobra" - "github.com/veraison/corim/corim" -) - -var ( - corimVerifyCorimFile *string - corimVerifyKeyFile *string -) - -var corimVerifyCmd = NewCorimVerifyCmd() - -func NewCorimVerifyCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "verify", - Short: "verify a signed CoRIM using the supplied key", - Long: `verify a signed CoRIM using the supplied key - - Verify the signed CoRIM signed-corim.cbor using the key in JWK format from - file key.jwk - - cocli corim verify --file=signed-corim.cbor --key=key.jwk - `, - - RunE: func(cmd *cobra.Command, args []string) error { - if err := checkCorimVerifyArgs(); err != nil { - return err - } - - // checkCorimVerifyArgs makes sure corimVerifyCorimFile is not nil - err := verify(*corimVerifyCorimFile, *corimVerifyKeyFile) - if err != nil { - return err - } - fmt.Printf(">> %q verified\n", *corimVerifyCorimFile) - - return nil - }, - } - - corimVerifyCorimFile = cmd.Flags().StringP("file", "f", "", "a signed CoRIM file (in CBOR format)") - corimVerifyKeyFile = cmd.Flags().StringP("key", "k", "", "verification key in JWK format") - - return cmd -} - -func checkCorimVerifyArgs() error { - if corimVerifyCorimFile == nil || *corimVerifyCorimFile == "" { - return errors.New("no CoRIM supplied") - } - - if corimVerifyKeyFile == nil || *corimVerifyKeyFile == "" { - return errors.New("no key supplied") - } - - return nil -} - -func verify(signedCorimFile, keyFile string) error { - var ( - signedCorimCBOR []byte - keyJWK []byte - err error - pkey crypto.PublicKey - s corim.SignedCorim - ) - - if signedCorimCBOR, err = afero.ReadFile(fs, signedCorimFile); err != nil { - return fmt.Errorf("error loading signed CoRIM from %s: %w", signedCorimFile, err) - } - - if err = s.FromCOSE(signedCorimCBOR); err != nil { - return fmt.Errorf("error decoding signed CoRIM from %s: %w", signedCorimFile, err) - } - - if keyJWK, err = afero.ReadFile(fs, keyFile); err != nil { - return fmt.Errorf("error loading verifying key from %s: %w", keyFile, err) - } - - if pkey, err = corim.NewPublicKeyFromJWK(keyJWK); err != nil { - return fmt.Errorf("error loading verifying key from %s: %w", keyFile, err) - } - - if err = s.Verify(pkey); err != nil { - return fmt.Errorf("error verifying %s with key %s: %w", signedCorimFile, keyFile, err) - } - - return nil -} - -func init() { - corimCmd.AddCommand(corimVerifyCmd) -} diff --git a/cocli/cmd/corimVerify_test.go b/cocli/cmd/corimVerify_test.go deleted file mode 100644 index f8e5b26d..00000000 --- a/cocli/cmd/corimVerify_test.go +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "testing" - - "github.com/spf13/afero" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func Test_CorimVerifyCmd_unknown_argument(t *testing.T) { - cmd := NewCorimVerifyCmd() - - args := []string{"--unknown-argument=val"} - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "unknown flag: --unknown-argument") -} - -func Test_CorimVerifyCmd_mandatory_args_missing_corim_file(t *testing.T) { - cmd := NewCorimVerifyCmd() - - args := []string{ - "--key=ignored.jwk", - } - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "no CoRIM supplied") -} - -func Test_CorimVerifyCmd_mandatory_args_missing_key_file(t *testing.T) { - cmd := NewCorimVerifyCmd() - - args := []string{ - "--file=ignored.jwk", - } - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "no key supplied") -} - -func Test_CorimVerifyCmd_non_existent_signed_corim_file(t *testing.T) { - cmd := NewCorimVerifyCmd() - - args := []string{ - "--file=nonexistent.cbor", - "--key=ignored.jwk", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - - err := cmd.Execute() - assert.EqualError(t, err, "error loading signed CoRIM from nonexistent.cbor: open nonexistent.cbor: file does not exist") -} - -func Test_CorimVerifyCmd_bad_signed_corim(t *testing.T) { - cmd := NewCorimVerifyCmd() - - args := []string{ - "--file=bad.txt", - "--key=ignored.jwk", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "bad.txt", []byte("hello!"), 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.EqualError(t, err, "error decoding signed CoRIM from bad.txt: failed CBOR decoding for COSE-Sign1 signed CoRIM: cbor: invalid COSE_Sign1_Tagged object") -} - -func Test_CorimVerifyCmd_non_existent_key_file(t *testing.T) { - cmd := NewCorimVerifyCmd() - - args := []string{ - "--file=ok.cbor", - "--key=nonexistent.jwk", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "ok.cbor", testSignedCorimValid, 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.EqualError(t, err, "error loading verifying key from nonexistent.jwk: open nonexistent.jwk: file does not exist") -} - -func Test_CorimVerifyCmd_invalid_key_file(t *testing.T) { - cmd := NewCorimVerifyCmd() - - args := []string{ - "--file=ok.cbor", - "--key=invalid.jwk", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "ok.cbor", testSignedCorimValid, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "invalid.jwk", []byte("{}"), 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.EqualError(t, err, "error loading verifying key from invalid.jwk: invalid key type from JSON ()") -} - -func Test_CorimVerifyCmd_ok(t *testing.T) { - cmd := NewCorimVerifyCmd() - - args := []string{ - "--file=ok.cbor", - "--key=ok.jwk", - } - cmd.SetArgs(args) - - fs = afero.NewMemMapFs() - err := afero.WriteFile(fs, "ok.cbor", testSignedCorimValid, 0644) - require.NoError(t, err) - err = afero.WriteFile(fs, "ok.jwk", testECKey, 0644) - require.NoError(t, err) - - err = cmd.Execute() - assert.NoError(t, err) -} diff --git a/cocli/cmd/cots.go b/cocli/cmd/cots.go deleted file mode 100644 index 3e9090db..00000000 --- a/cocli/cmd/cots.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "os" - - "github.com/spf13/cobra" -) - -var cotsCmd = &cobra.Command{ - Use: "cots", - Short: "CoTS manipulation", - - Run: func(cmd *cobra.Command, args []string) { - if len(args) == 0 { - cmd.Help() // nolint: errcheck - os.Exit(0) - } - }, -} - -func init() { - rootCmd.AddCommand(cotsCmd) -} diff --git a/cocli/cmd/cotsCreate.go b/cocli/cmd/cotsCreate.go deleted file mode 100644 index 9c650a23..00000000 --- a/cocli/cmd/cotsCreate.go +++ /dev/null @@ -1,281 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "errors" - "fmt" - "path/filepath" - - "github.com/google/uuid" - "github.com/spf13/afero" - "github.com/spf13/cobra" - "github.com/veraison/corim/cots" -) - -var ( - cotsCreateLanguage *string - cotsCreateTagID *string - cotsCreateTagUUIDStr *string - cotsCreateTagUUID *bool - cotsCreateTagVersion *uint - cotsCreateCtsEnvFile *string - cotsCreateCtsPermClaimsFile *string - cotsCreateCtsExclClaimsFile *string - cotsCreateCtsPurposes []string - cotsCreateCtsTaDirs []string - cotsCreateCtsTaFiles []string - cotsCreateCtsCaDirs []string - cotsCreateCtsCaFiles []string - cotsCreateCtsOutputFile *string -) - -var cotsCreateCtsCmd = NewCotsCreateCtsCmd() - -func NewCotsCreateCtsCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "create", - Short: "create a CBOR-encoded concise-ta-store-map instance from the supplied JSON environment template, JSON constraints templates, purposes, and TAs/CAs", - Long: `create a CBOR-encoded concise-ta-store-map instance from the supplied JSON environment template, JSON constraints templates, purposes, and TAs/CAs, - - Create a concise-ta-store-map from template env-template.json and TAs from tas directory. Since no explicit output file is set, - the result is saved to the current directory with the env-template as basename and a .cbor extension. - - cocli cots create --environment=env-template.json --tas=tas_dir - - Create a concise-ta-store-map from env-template.json, claims-template.json, TAs from tas_dir directory, CAs from cas_dir directory, and - with eat and corim purposes asserted. The result is saved to cots.cbor. - - cocli cots create --environment=env-template.json \ - --purpose=eat \ - --purpose=corim \ - --permclaims=claims-template.json \ - --tas=tas_dir \ - --cas=cas_dir \ - --output=cots.cbor - - Alternatively one can specify individual TA files (in DER Format) or CA files (binary, DER-encoded X.509 Certificate) - - cocli cots create --environment=env-template.json \ - --purpose=eat \ - --purpose=corim \ - --permclaims=claims-template.json \ - --tafile=tas_dir \ - --cafile=cas_dir \ - --output=cots.cbor - `, - - RunE: func(cmd *cobra.Command, args []string) error { - if err := checkctsCreateCtsArgs(); err != nil { - return err - } - - certFilesList := filesList(cotsCreateCtsTaFiles, cotsCreateCtsTaDirs, ".der") - taiFilesList := filesList(cotsCreateCtsTaFiles, cotsCreateCtsTaDirs, ".ta") - spkiFilesList := filesList(cotsCreateCtsTaFiles, cotsCreateCtsTaDirs, ".spki") - tasFilesList := append(certFilesList, taiFilesList...) - tasFilesList = append(tasFilesList, spkiFilesList...) - casFilesList := filesList(cotsCreateCtsCaFiles, cotsCreateCtsCaDirs, ".der") - - if len(tasFilesList) == 0 { - return errors.New("no TA files found") - } - - cborFile, err := ctsTemplateToCBOR(*cotsCreateLanguage, *cotsCreateTagID, *cotsCreateTagUUID, *cotsCreateTagUUIDStr, cotsCreateTagVersion, *cotsCreateCtsEnvFile, *cotsCreateCtsPermClaimsFile, *cotsCreateCtsExclClaimsFile, cotsCreateCtsPurposes, - tasFilesList, casFilesList, cotsCreateCtsOutputFile) - if err != nil { - return err - } - fmt.Printf(">> created %q\n", cborFile) - - return nil - }, - } - - cotsCreateLanguage = cmd.Flags().StringP("language", "l", "", "language tag") - cotsCreateTagUUIDStr = cmd.Flags().StringP("uuid-str", "", "", "string representation of a UUID to use as tag ID (mutually exclusive from --uuid and --id)") - cotsCreateTagUUID = cmd.Flags().BoolP("uuid", "", false, "boolean indicating a random UUID value should be used as tag ID (mutually exclusive from --id and --uuid-str)") - cotsCreateTagID = cmd.Flags().StringP("id", "", "", "string value containing a tag ID value (mutually exclusive from --uuid and --uuid-str)") - cotsCreateTagVersion = cmd.Flags().UintP("tag-version", "", 0, "integer value indicating version of tag identity (ignored if neither --uuid nor --id are supplied)") - cotsCreateCtsEnvFile = cmd.Flags().StringP("environment", "e", "", "an environment template file (in JSON format)") - cotsCreateCtsPermClaimsFile = cmd.Flags().StringP("permclaims", "p", "", "a permitted claims template file (in JSON format)") - cotsCreateCtsExclClaimsFile = cmd.Flags().StringP("exclclaims", "x", "", "an excluded claims template file (in JSON format)") - - cmd.Flags().StringArrayVarP( - &cotsCreateCtsPurposes, "purpose", "u", []string{}, "string value indicating purpose: cots,corim,comid,coswid,eat,certificate", - ) - - cmd.Flags().StringArrayVarP( - &cotsCreateCtsTaDirs, "tas", "t", []string{}, "a directory containing binary DER-encoded trust anchor files", - ) - cmd.Flags().StringArrayVarP( - &cotsCreateCtsTaFiles, "tafile", "f", []string{}, "a DER-encoded trust anchor file", - ) - - cmd.Flags().StringArrayVarP( - &cotsCreateCtsCaDirs, "cas", "c", []string{}, "a directory containing binary DER-encoded X.509 CA certificate files", - ) - cmd.Flags().StringArrayVarP( - &cotsCreateCtsCaFiles, "cafile", "", []string{}, "a DER-encoded certificate file", - ) - - cotsCreateCtsOutputFile = cmd.Flags().StringP("output", "o", "", "name of the generated CoTS file") - - return cmd -} - -func IsValidUUID(u string) bool { - _, err := uuid.Parse(u) - return err == nil -} - -func checkctsCreateCtsArgs() error { - if cotsCreateCtsEnvFile == nil || *cotsCreateCtsEnvFile == "" { - return errors.New("no environment template supplied") - } - - if (*cotsCreateTagUUID != false && *cotsCreateTagID != "") || (*cotsCreateTagUUID != false && *cotsCreateTagUUIDStr != "") || (*cotsCreateTagUUIDStr != "" && *cotsCreateTagID != "") { - return errors.New("only one of --uuid, --uuid-str and --id can be used at the same time") - } - - if *cotsCreateTagUUIDStr != "" && !IsValidUUID(*cotsCreateTagUUIDStr) { - return errors.New("--uuid-str does not contain a valid UUID") - } - - if len(cotsCreateCtsTaFiles)+len(cotsCreateCtsTaDirs) == 0 { - return errors.New("no TA files or folders supplied") - } - - return nil -} - -func ctsTemplateToCBOR(language string, tagID string, genUUID bool, uuidStr string, version *uint, envFile string, permClaimsFile string, exclClaimsFile string, purposes, taFiles, caFiles []string, outputFile *string) (string, error) { - var ( - envData []byte - env cots.EnvironmentGroups - permClaimsData []byte - permClaims cots.EatCWTClaim - exclClaimsData []byte - exclClaims cots.EatCWTClaim - err error - ctsCBOR []byte - ctsFile string - ) - - cts := cots.ConciseTaStore{} - - if envData, err = afero.ReadFile(fs, envFile); err != nil { - return "", fmt.Errorf("error loading template from %s: %w", envFile, err) - } - - if err = env.FromJSON(envData); err != nil { - return "", fmt.Errorf("error decoding template from %s: %w", envFile, err) - } - - cts.Environments = env - - if language != "" { - cts.Language = &language - } - - if tagID != "" { - cts.SetTagIdentity(tagID, version) - } else if genUUID != false { - u := uuid.New() - b, _ := u.MarshalBinary() - cts.SetTagIdentity(b, version) - } else if uuidStr != "" { - u, _ := uuid.Parse(uuidStr) - b, _ := u.MarshalBinary() - cts.SetTagIdentity(b, version) - } - - if permClaimsFile != "" { - if permClaimsData, err = afero.ReadFile(fs, permClaimsFile); err != nil { - return "", fmt.Errorf("error loading template from %s: %w", permClaimsFile, err) - } - - if err = permClaims.FromJSON(permClaimsData); err != nil { - return "", fmt.Errorf("error decoding template from %s: %w", permClaimsFile, err) - } - cts.AddPermClaims(permClaims) - } - if exclClaimsFile != "" { - if exclClaimsData, err = afero.ReadFile(fs, exclClaimsFile); err != nil { - return "", fmt.Errorf("error loading template from %s: %w", exclClaimsFile, err) - } - - if err = exclClaims.FromJSON(exclClaimsData); err != nil { - return "", fmt.Errorf("error decoding template from %s: %w", exclClaimsFile, err) - } - cts.AddExclClaims(exclClaims) - } - if 0 != len(purposes) { - cts.Purposes = purposes - } - - k := cots.TasAndCas{} - cts.Keys = &k - for _, taFile := range taFiles { - var ( - tadata []byte - trustAnchor cots.TrustAnchor - ) - - tadata, err = afero.ReadFile(fs, taFile) - if err != nil { - return "", fmt.Errorf("error loading TA from %s: %w", taFile, err) - } - if ".der" == filepath.Ext(taFile) { - trustAnchor.Format = cots.TaFormatCertificate - } - if ".spki" == filepath.Ext(taFile) { - trustAnchor.Format = cots.TaFormatSubjectPublicKeyInfo - } - if ".ta" == filepath.Ext(taFile) { - trustAnchor.Format = cots.TaFormatTrustAnchorInfo - } - trustAnchor.Data = tadata - cts.Keys.Tas = append(cts.Keys.Tas, trustAnchor) - } - - for _, caFile := range caFiles { - var ( - cadata []byte - ) - - cadata, err = afero.ReadFile(fs, caFile) - if err != nil { - return "", fmt.Errorf("error loading CA from %s: %w", caFile, err) - } - cts.Keys.Cas = append(cts.Keys.Cas, cadata) - } - - // check the result - if err = cts.Valid(); err != nil { - return "", fmt.Errorf("error validating CoTS: %w", err) - } - - ctsCBOR, err = cts.ToCBOR() - if err != nil { - return "", fmt.Errorf("error encoding CoTS to CBOR: %w", err) - } - - if outputFile == nil || *outputFile == "" { - ctsFile = makeFileName("", envFile, ".cbor") - } else { - ctsFile = *outputFile - } - - err = afero.WriteFile(fs, ctsFile, ctsCBOR, 0644) - if err != nil { - return "", fmt.Errorf("error saving CoTS to file %s: %w", ctsFile, err) - } - - return ctsFile, nil -} - -func init() { - cotsCmd.AddCommand(cotsCreateCtsCmd) -} diff --git a/cocli/cmd/cotsCreate_test.go b/cocli/cmd/cotsCreate_test.go deleted file mode 100644 index 56a5be8c..00000000 --- a/cocli/cmd/cotsCreate_test.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "testing" - - "github.com/spf13/afero" - "github.com/stretchr/testify/assert" -) - -func Test_CotsCreateCtsCmd_unknown_argument(t *testing.T) { - cmd := NewCotsCreateCtsCmd() - - args := []string{"--unknown-argument=val"} - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "unknown flag: --unknown-argument") -} - -func Test_CotsCreateCtsCmd_no_templates(t *testing.T) { - cmd := NewCotsCreateCtsCmd() - - // no args - - err := cmd.Execute() - assert.EqualError(t, err, "no environment template supplied") -} - -func Test_CotsCreateCtsCmd_no_files_found(t *testing.T) { - cmd := NewCotsCreateCtsCmd() - - args := []string{ - "--output=output.cbor", - } - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "no environment template supplied") -} - -func Test_CotsCreateCtsCmd_env_not_found_no_tas(t *testing.T) { - cmd := NewCotsCreateCtsCmd() - - args := []string{ - "--output=output.cbor", - "--environment=nonexistent.json", - } - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "no TA files or folders supplied") -} - -func Test_CotsCreateCtsCmd_too_many_ids(t *testing.T) { - cmd := NewCotsCreateCtsCmd() - - args := []string{ - "--output=output.cbor", - "--uuid", - "--id=some_tag_identity", - "--environment=../data/cots/templates/env/vendor.json", - "--tafile=../data/cots/shared_ta.ta", - } - cmd.SetArgs(args) - fs = afero.NewOsFs() - err := cmd.Execute() - assert.EqualError(t, err, "only one of --uuid, --uuid-str and --id can be used at the same time") -} - -func Test_CotsCreateCtsCmd_invalid_uuid(t *testing.T) { - cmd := NewCotsCreateCtsCmd() - - args := []string{ - "--output=output.cbor", - "--uuid-str=NotAUuid", - "--environment=../data/cots/templates/env/vendor.json", - "--tafile=../data/cots/shared_ta.ta", - } - cmd.SetArgs(args) - fs = afero.NewOsFs() - err := cmd.Execute() - assert.EqualError(t, err, "--uuid-str does not contain a valid UUID") -} - -func Test_CotsCreateCtsCmd_loading_env_template_fail(t *testing.T) { - cmd := NewCotsCreateCtsCmd() - - args := []string{ - "--output=output.cbor", - "--environment=nonexistent.json", - "--tafile=../data/cots/shared_ta.ta", - } - cmd.SetArgs(args) - fs = afero.NewOsFs() - err := cmd.Execute() - assert.EqualError(t, err, "error loading template from nonexistent.json: open nonexistent.json: no such file or directory") -} - -func Test_CotsCreateCtsCmd_loading_permclaims_template_fail(t *testing.T) { - cmd := NewCotsCreateCtsCmd() - - args := []string{ - "--output=output.cbor", - "--environment=../data/cots/templates/env/vendor.json", - "--permclaims=nonexistent.json", - "--tafile=../data/cots/shared_ta.ta", - } - cmd.SetArgs(args) - fs = afero.NewOsFs() - err := cmd.Execute() - assert.EqualError(t, err, "error loading template from nonexistent.json: open nonexistent.json: no such file or directory") -} - -func Test_CotsCreateCtsCmd_loading_exclclaims_template_fail(t *testing.T) { - cmd := NewCotsCreateCtsCmd() - - args := []string{ - "--output=output.cbor", - "--environment=../data/cots/templates/env/vendor.json", - "--exclclaims=nonexistent.json", - "--tafile=../data/cots/shared_ta.ta", - } - cmd.SetArgs(args) - fs = afero.NewOsFs() - err := cmd.Execute() - assert.EqualError(t, err, "error loading template from nonexistent.json: open nonexistent.json: no such file or directory") -} - -func Test_CotsCreateCtsCmd_ok(t *testing.T) { - cmd := NewCotsCreateCtsCmd() - - args := []string{ - "--output=output.cbor", - "--environment=../data/cots/templates/env/vendor.json", - "--exclclaims=../data/cots/templates/claims/exclclaim.json", - "--permclaims=../data/cots/templates/claims/permclaim.json", - "--tafile=../data/cots/shared_ta.ta", - } - cmd.SetArgs(args) - fs = afero.NewOsFs() - err := cmd.Execute() - assert.Nil(t, err) -} diff --git a/cocli/cmd/cotsDisplay.go b/cocli/cmd/cotsDisplay.go deleted file mode 100644 index 54254114..00000000 --- a/cocli/cmd/cotsDisplay.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "errors" - "fmt" - - "github.com/spf13/afero" - "github.com/spf13/cobra" -) - -var ( - cotsDisplayFiles []string - cotsDisplayDirs []string -) - -var cotsDisplayCmd = NewCotsDisplayCmd() - -func NewCotsDisplayCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "display", - Short: "display one or more CBOR-encoded CoTS(s) in human readable (JSON) format", - Long: `display one or more CBOR-encoded CoTS(s) in human readable (JSON) format. - You can supply individual CoTS files or directories containing CoTS files - - Display CoTS in cots.cbor - - cocli cots display --file=cots.cbor - - `, - - RunE: func(cmd *cobra.Command, args []string) error { - if err := checkCotsDisplayArgs(); err != nil { - return err - } - - filesList := filesList(cotsDisplayFiles, cotsDisplayDirs, ".cbor") - if len(filesList) == 0 { - return errors.New("no files found") - } - - errs := 0 - for _, file := range filesList { - if err := displayCotsFile(file); err != nil { - fmt.Printf(">> failed displaying %q: %v\n", file, err) - errs++ - continue - } - } - - if errs != 0 { - return fmt.Errorf("%d/%d display(s) failed", errs, len(filesList)) - } - return nil - }, - } - - cmd.Flags().StringArrayVarP( - &cotsDisplayFiles, "file", "f", []string{}, "a CoTS file (in CBOR format)", - ) - - cmd.Flags().StringArrayVarP( - &cotsDisplayDirs, "dir", "d", []string{}, "a directory containing CoTS files (in CBOR format)", - ) - - return cmd -} - -func displayCotsFile(file string) error { - var ( - data []byte - err error - ) - - if data, err = afero.ReadFile(fs, file); err != nil { - return fmt.Errorf("error loading CoTS from %s: %w", file, err) - } - - // use file name as heading - return printCots(data, ">> ["+file+"]") - -} - -func checkCotsDisplayArgs() error { - if len(cotsDisplayFiles) == 0 && len(cotsDisplayDirs) == 0 { - return errors.New("no files supplied") - } - - return nil -} - -func init() { - cotsCmd.AddCommand(cotsDisplayCmd) -} diff --git a/cocli/cmd/cotsDisplay_test.go b/cocli/cmd/cotsDisplay_test.go deleted file mode 100644 index 8bcd06c5..00000000 --- a/cocli/cmd/cotsDisplay_test.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "fmt" - "testing" - - "github.com/spf13/afero" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func Test_CotsDisplayCmd_unknown_argument(t *testing.T) { - cmd := NewCotsDisplayCmd() - - args := []string{"--unknown-argument=val"} - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "unknown flag: --unknown-argument") -} - -func Test_CotsDisplayCmd_no_files(t *testing.T) { - cmd := NewCotsDisplayCmd() - - err := cmd.Execute() - assert.EqualError(t, err, "no files supplied") -} - -func Test_CotsDisplayCmd_no_files_found(t *testing.T) { - cmd := NewCotsDisplayCmd() - - args := []string{ - "--file=unknown", - "--dir=unsure", - } - cmd.SetArgs(args) - - err := cmd.Execute() - assert.EqualError(t, err, "no files found") -} - -func Test_CotsDisplayCmd_file_with_invalid_cbor(t *testing.T) { - var err error - - cmd := NewCotsDisplayCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "invalid.cbor", []byte{0xff, 0xff}, 0400) - require.NoError(t, err) - - args := []string{ - "--file=invalid.cbor", - } - cmd.SetArgs(args) - - err = cmd.Execute() - assert.EqualError(t, err, "1/1 display(s) failed") -} - -func Test_CotsDisplayCmd_file_with_valid_cots(t *testing.T) { - var err error - - cmd := NewCotsDisplayCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "ok.cbor", testCots, 0400) - require.NoError(t, err) - - args := []string{ - "--file=ok.cbor", - } - cmd.SetArgs(args) - - fmt.Printf("%x\n", testCots) - - err = cmd.Execute() - assert.NoError(t, err) -} - -func Test_CotsDisplayCmd_file_with_valid_cots_from_dir(t *testing.T) { - var err error - - cmd := NewCotsDisplayCmd() - - fs = afero.NewMemMapFs() - err = afero.WriteFile(fs, "testdir/ok.cbor", testCots, 0400) - require.NoError(t, err) - - args := []string{ - "--dir=testdir", - } - cmd.SetArgs(args) - - fmt.Printf("%x\n", testCots) - - err = cmd.Execute() - assert.NoError(t, err) -} diff --git a/cocli/cmd/isubmitter.go b/cocli/cmd/isubmitter.go deleted file mode 100644 index cc9734ed..00000000 --- a/cocli/cmd/isubmitter.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/veraison/apiclient/auth" - "github.com/veraison/apiclient/common" -) - -type ISubmitter interface { - Run([]byte, string) error - SetClient(client *common.Client) error - SetAuth(a auth.IAuthenticator) - SetSubmitURI(uri string) error - SetDeleteSession(session bool) - SetIsInsecure(v bool) - SetCerts(paths []string) -} diff --git a/cocli/cmd/root.go b/cocli/cmd/root.go deleted file mode 100644 index 6297d248..00000000 --- a/cocli/cmd/root.go +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "errors" - "fmt" - "os" - "path/filepath" - - "github.com/spf13/afero" - "github.com/spf13/cobra" - "github.com/spf13/viper" - - "github.com/veraison/apiclient/auth" -) - -var ( - cfgFile string - fs = afero.NewOsFs() - - cliConfig = &ClientConfig{} - authMethod = auth.MethodPassthrough -) - -// rootCmd represents the base command when called without any subcommands -var rootCmd = &cobra.Command{ - Use: "cocli", - Short: "CoRIM & CoMID swiss-army knife", - Version: "0.0.1", - SilenceUsage: true, - SilenceErrors: true, -} - -type ClientConfig struct { - Auth auth.IAuthenticator -} - -func Execute() { - cobra.CheckErr(rootCmd.Execute()) -} - -func init() { - cobra.OnInitialize(initConfig) - - rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $XDG_CONFIG_HOME/cocli/config.yaml)") -} - -// initConfig reads in config file and ENV variables if set -func initConfig() { - v, err := readConfig(cfgFile) - cobra.CheckErr(err) - - err = authMethod.Set(v.GetString("auth")) - cobra.CheckErr(err) - - switch authMethod { - case auth.MethodPassthrough: - cliConfig.Auth = &auth.NullAuthenticator{} - case auth.MethodBasic: - cliConfig.Auth = &auth.BasicAuthenticator{} - err = cliConfig.Auth.Configure(map[string]interface{}{ - "username": v.GetString("username"), - "password": v.GetString("password"), - }) - cobra.CheckErr(err) - case auth.MethodOauth2: - cliConfig.Auth = &auth.Oauth2Authenticator{} - err = cliConfig.Auth.Configure(map[string]interface{}{ - "client_id": v.GetString("client_id"), - "client_secret": v.GetString("client_secret"), - "token_url": v.GetString("token_url"), - "username": v.GetString("username"), - "password": v.GetString("password"), - "ca_certs": v.GetStringSlice("ca_cert"), - }) - cobra.CheckErr(err) - default: - // Should never get here as authMethod value is set via - // Method.Set(), which ensures that it's one of the above. - panic(fmt.Sprintf("unknown auth method: %q", authMethod)) - } -} - -func readConfig(path string) (*viper.Viper, error) { - v := viper.GetViper() - if path != "" { - v.SetConfigFile(path) - } else { - wd, err := os.Getwd() - if err != nil { - return nil, err - } - - userConfigDir, err := os.UserConfigDir() - if err == nil { - v.AddConfigPath(filepath.Join(userConfigDir, "cocli")) - } - v.AddConfigPath(wd) - v.SetConfigType("yaml") - v.SetConfigName("config") - } - - v.SetEnvPrefix("cocli") - v.AutomaticEnv() - - err := v.ReadInConfig() - if errors.As(err, &viper.ConfigFileNotFoundError{}) { - err = nil - } - - return v, err -} diff --git a/cocli/cmd/test_vars.go b/cocli/cmd/test_vars.go deleted file mode 100644 index 99b6ee9a..00000000 --- a/cocli/cmd/test_vars.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - _ "embed" - - "github.com/veraison/corim/comid" -) - -var ( - minimalCorimTemplate = []byte(`{ - "corim-id": "5c57e8f4-46cd-421b-91c9-08cf93e13cfc" - }`) - badCBOR = comid.MustHexDecode(nil, "ffff") - // a "tag-id only" CoMID {1: {0: h'366D0A0A598845ED84882F2A544F6242'}} - invalidComid = comid.MustHexDecode(nil, - "a101a10050366d0a0a598845ed84882f2a544f6242", - ) - // - invalidCots = comid.MustHexDecode(nil, "a2028006a100f6") - // note: embedded CoSWIDs are not validated {0: h'5C57E8F446CD421B91C908CF93E13CFC', 1: [505(h'deadbeef')]} - testCorimValid = comid.MustHexDecode(nil, - "a200505c57e8f446cd421b91c908cf93e13cfc0181d901f944deadbeef", - ) - // {0: h'5C57E8F446CD421B91C908CF93E13CFC'} - testCorimInvalid = comid.MustHexDecode(nil, - "a100505c57e8f446cd421b91c908cf93e13cfc", - ) - testMetaInvalid = []byte("{}") - testMetaValid = []byte(`{ - "signer": { - "name": "ACME Ltd signing key", - "uri": "https://acme.example" - }, - "validity": { - "not-before": "2021-12-31T00:00:00Z", - "not-after": "2025-12-31T00:00:00Z" - } - }`) - - //go:embed testcases/ec-p256.jwk - testECKey []byte - - //go:embed testcases/signed-corim-valid.cbor - testSignedCorimValid []byte - - //go:embed testcases/signed-corim-invalid.cbor - testSignedCorimInvalid []byte - - //go:embed testcases/signed-corim-valid-with-cots.cbor - testSignedCorimValidWithCots []byte - - //go:embed testcases/psa-refval.cbor - PSARefValCBOR []byte - - //go:embed testcases/test-comid.cbor - testComid []byte - - //go:embed testcases/test-coswid.cbor - testCoswid []byte - - //go:embed testcases/test-cots.cbor - testCots []byte -) diff --git a/cocli/cmd/testcases/ec-p256.jwk b/cocli/cmd/testcases/ec-p256.jwk deleted file mode 100644 index e3c07719..00000000 --- a/cocli/cmd/testcases/ec-p256.jwk +++ /dev/null @@ -1,9 +0,0 @@ -{ - "kty": "EC", - "crv": "P-256", - "x": "MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4", - "y": "4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM", - "d": "870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE", - "use": "enc", - "kid": "1" -} diff --git a/cocli/cmd/testcases/psa-refval-orig.cbor b/cocli/cmd/testcases/psa-refval-orig.cbor deleted file mode 100644 index acd824043708af039e2074805c5e0e597566ba72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 416 zcmZ3&keZsO>+Zz3kRiZ%_v3oKL~rADmxIrLbm|skYFx~a>FDh1s^C+SqQ`hcp(LZE zq@dVJUq3N9H&rjSA~ClhCzYw0fsu)2Awy%+LWac*H<=axr6)lMhR(k)ENR0c(W9n%#oOpWIR` zVhyr+a!yJm>fs{GbvD_5=T#Jbe|lrri)_Y)OpQ&95en^2{YRA=Yz^7ss?XVcuzym@ znP&L(LG|7${(A{W&Z{1Wnw=65lpn&9YN%(dXG((UOvz0%JGcFv>R+^Lz5X%pLytbl zX6pJr*KB*$(4RN6(H>^HBiM8UpxaGIFn#gT=b|6ZgnJbq{<&{=_91_x|5vwFTNJq* MI>~vfe3nQB0Gw#8o&W#< diff --git a/cocli/cmd/testcases/psa-refval.cbor b/cocli/cmd/testcases/psa-refval.cbor deleted file mode 100644 index e37b711cb6beda921d18a320c0cc29817e076932..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 538 zcmZ3&keZsO>+Zz3kRiZ%_v3oKL~rADmxIrLbm|skYFx~CL!l(2q@*Hyu%Bt?&9AwzT1LWac*H<=bAO4P$e zmg{V?|IVu@{QmUDt{2&iNlrd2sYZH+dIpROnHrlIBNW=5`j09#*c!6MRiCr@VE?3) zGtKbngX+Ci{Pz-$oL4zTrw#+2MNvvb?uss2T~*6SbhKJ@5= zY^JX7bIrC_4gGmD8|^_(!wd`}LlF{YEU5;-z%U^u=u#YkE`&L4@zUp_AI^k(6(9b& aZ+G?~f203bw^dsdxg0vld8>SuNCg0QKh*F5 diff --git a/cocli/cmd/testcases/regen-from-src.sh b/cocli/cmd/testcases/regen-from-src.sh deleted file mode 100644 index c27f6c69..00000000 --- a/cocli/cmd/testcases/regen-from-src.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/bash -# Copyright 2024 Contributors to the Veraison project. -# SPDX-License-Identifier: Apache-2.0 -set -e - -GEN_TESTCASE=$(go env GOPATH)/bin/gen-testcase - -if [[ ! -f ${GEN_TESTCASE} ]]; then - echo "installing gen-testcase" - - go install github.com/veraison/gen-testcase@v0.0.1 -fi - -testcases=( - psa-refval - test-comid - test-coswid - test-cots -) - -signed_testcases=( - signed-corim-valid - signed-corim-invalid - signed-corim-valid-with-cots -) - -for case in "${testcases[@]}"; do - echo "generating ${case}.cbor" - - ${GEN_TESTCASE} "src/${case}.yaml" -o "${case}.cbor" -done - -for case in "${signed_testcases[@]}"; do - echo "generating ${case}.cbor" - - ${GEN_TESTCASE} -s ec-p256.jwk -m "src/${case}-meta.yaml" "src/${case}.yaml" \ - -o "${case}.cbor" -done - -echo "done." diff --git a/cocli/cmd/testcases/signed-corim-invalid.cbor b/cocli/cmd/testcases/signed-corim-invalid.cbor deleted file mode 100644 index 53fff8fad1da85902d9c27cc916f97ddeca585bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmV;X09pUigjijp0VV@V>Xa%pWVV`6V|2v|X)0HOeNK|@VNAWU>* zAaiMFZfS03AZulL0oWjPXmoUNb2=|CVPkD&E@gOOZE$R50iprH8fjE#fB?Z7Va`YZ zph2KmK+FuATM3=IWAvAgCM%I#mwG1VDfiImdYzd%l)@^fEwK;DibCxVz)bql^|THC UNi{@Ss}~!^X_YsQziU?NU$xam3jhEB diff --git a/cocli/cmd/testcases/signed-corim-valid-with-cots.cbor b/cocli/cmd/testcases/signed-corim-valid-with-cots.cbor deleted file mode 100644 index 69bd669e1b5c24a860b943c51402998b817ee3a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2349 zcmccA5@EWSQH{AIv7jI)GdZy&Ge1wiC^J_(IVr!0BSLZ^!$O7h2qTg zyv)3Gh3wSI1(6)<7BK|GgunRWcGgLH;z^G4lONjrVQh@#n0Ax#_adgog^VE0H}YMy zm|0la7BaLnF-9`oT-3yL)u4&#qCupAFdMs8o5wj@CPp?6FoT(qo!NfOJTp>yM@%pVrct%rHDO7tf1UANuw`A5d-rDA{0e0)A%{D1fQ zfoitvD<_HTi?fJywVeOiFm>@Bvup2`N?e=XJNvqP0?^VJgBU|@15P&PP!={GrqEzR zc>`Gxhl@unI4?gbDYH03!Lgtqu_!f1N5L~MS#G(&7>Y$Gqf> z{GtU-jK2(;80RlwW@2Pw5)qJ|?2>vwz|}=gddJb_2j;EZx3a^43+h!CW+vJ?#z0P- z*T~4g)X>t<)X><#B1)Xs7{oP$a%pTk?P7Pay@4$_+GP1y#BfA4H!#v<`B{L0%+zAQ z58?Yjc+x8Qn~fdfzF$JeW~u8DONsehRvi!;)N(fX=$@@25|=E7s&|380}2ej1IAP6;eOBqN& zQnz4KYH>-Wf=6OrN-;EHs~f0761E(M9D1653QW`8&@|0`$7?}gWq@78r_!rIZpH3< z)^9aN4o_M*0WBq)qo!o@D4N)bJN;4`e`x6!Yh)6iemxirT$vPPmv%q@<)V{w!}Gmq zx{}u<=0mEYooSn-{yKb?)cNc_1DJegsBeC-aP^`A$tRwU*YEJ*n;mCe;*3QWa&mFn7X! z+n|`^#aETymS3Hxw0lW3YWYi{eFW1brRL*KgOo-BS{lR}BgCgccLoC&CIxObbqBWN zFVEzv`s{aUzxIpK?bUq4x=D?adE76T{eJtENg=G!E>Dp6lHCT6Klkj6UJG9MXX9bi zQ&hQjgXvY}SO0^Xm?EO_q`b9VJdC&I-C_#9qkX7I{pN8++aLFZU(DHgcKeDa+jQr= zSUF3#Acnub;dbf)wu_u1N?YoW37)=^ky&gz$HSuK>c0pF;b`gqPhJLaZBBY|?t$a2 z84Kt2F4fuECnj7VvXt5N%g0%9O^?4m+^ID6eScK~^E%$s#^>ZG`lJj%*GxJOI3ySj7GILV(4O!6iur@AcYGh={gqg1gbV3e_)d4Z# zFTS{)b&{TVlH>g3hchdH3Uby+m*0b(e$Be{|{= zV`^NCY9>~1F*P$VGO;XVXl`1_u$VCgT@<9?4Oi!rWrncP`$T`|6an8 z^Qy;z#zih>Nj1_l)H7g>P*}5D@c5HkibbqJHc!q;sYE?oWVy~J`|rGp!tYOS?0S*S znB?RGau;!~z;yj0uzidv0YUj8EUAWi#(Jj2*b4OwQ*zVH&TW6E`WNk5uYb(@(4!Bs znYzBuHQQb_^ykfNw5Qx<#5g9!5$t#aV33)>f_d@M=b|6ZgnJbq{<&{=_91_x|5vwF zTNJq*I>~vfe3nQBQ{y6r8wwQ;uykCISOknWSV{&Z_+tI!`0Gs7ekT@!;e zLtP6Ki&R|$qr?=mREtC-Qo=scQ0lv#qM- zsgiGLghSsev&_|+6M4VXFcfUJ-O{kEajU^eskpmIvo_o+)roxHJbC{@KDE`GIn7V~ a+_m8Mv&ss_Be!>NVo&PY{%OzJlnVerCvFn} diff --git a/cocli/cmd/testcases/src/psa-refval.yaml b/cocli/cmd/testcases/src/psa-refval.yaml deleted file mode 100644 index 9a5d71e7..00000000 --- a/cocli/cmd/testcases/src/psa-refval.yaml +++ /dev/null @@ -1,76 +0,0 @@ ---- -0: en-GB -1: - 0: !!binary |- - Q7vjfy5hSzOu01PP8UKLFg== -2: -- 0: ACME Ltd. - 1: - tag: 32 - value: https://acme.example - 2: - - 0 - - 1 - - 2 -4: - 0: - - - 0: - 0: - tag: 600 - value: !!binary |- - YWNtZS1pbXBsZW1lbnRhdGlvbi1pZC0wMDAwMDAwMDEK - # acme-implementation-id-000000001 - 1: ACME - 2: RoadRunner - - 0: - tag: 601 - value: - 1: BL - 4: 2.1.0 - 5: !!binary |- - rLsRx+TaIXIFUjzkzhokWuGiOa48a/2eeHH35di66Gs= - 1: - 2: - - - 1 - - !!binary |- - h0KPxSKAPTEGXnvOPPA/5HUJZjHl4Hu9eg/eYMTPJcc= - - - 0: - 0: - tag: 600 - value: !!binary |- - YWNtZS1pbXBsZW1lbnRhdGlvbi1pZC0wMDAwMDAwMDEK - # acme-implementation-id-000000001 - 1: ACME - 2: RoadRunner - - 0: - tag: 601 - value: - 1: PRoT - 4: 1.3.5 - 5: !!binary |- - rLsRx+TaIXIFUjzkzhokWuGiOa48a/2eeHH35di66Gs= - 1: - 2: - - - 1 - - !!binary |- - AmOCmYm2/ZVPcrqvL8ZLwuLwHWktTecphuqAj26ZgT8= - - - 0: - 0: - tag: 600 - value: !!binary |- - YWNtZS1pbXBsZW1lbnRhdGlvbi1pZC0wMDAwMDAwMDEK - # acme-implementation-id-000000001 - 1: ACME - 2: RoadRunner - - 0: - tag: 601 - value: - 1: ARoT - 4: 0.1.4 - 5: !!binary |- - rLsRx+TaIXIFUjzkzhokWuGiOa48a/2eeHH35di66Gs= - 1: - 2: - - - 1 - - !!binary |- - o6XnFfDMV0pzw/m+u2vCTzL/1bZ7OHJEwskJ2neaFHg= diff --git a/cocli/cmd/testcases/src/signed-corim-invalid-meta.yaml b/cocli/cmd/testcases/src/signed-corim-invalid-meta.yaml deleted file mode 100644 index f3be19ff..00000000 --- a/cocli/cmd/testcases/src/signed-corim-invalid-meta.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- -0: - 0: ACME Ltd signing key - 1: - tag: 32 - value: https://acme.example -1: - 0: - tag: 1 - value: 1640908800 - 1: - tag: 1 - value: 1767139200 diff --git a/cocli/cmd/testcases/src/signed-corim-invalid.yaml b/cocli/cmd/testcases/src/signed-corim-invalid.yaml deleted file mode 100644 index 2fbf0ffd..00000000 --- a/cocli/cmd/testcases/src/signed-corim-invalid.yaml +++ /dev/null @@ -1 +0,0 @@ ---- {} diff --git a/cocli/cmd/testcases/src/signed-corim-valid-meta.yaml b/cocli/cmd/testcases/src/signed-corim-valid-meta.yaml deleted file mode 100644 index abffebe3..00000000 --- a/cocli/cmd/testcases/src/signed-corim-valid-meta.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- -1: - 0: - tag: 1 - value: 1640908800 - 1: - tag: 1 - value: 1767139200 -0: - 1: - tag: 32 - value: https://acme.example - 0: ACME Ltd signing key diff --git a/cocli/cmd/testcases/src/signed-corim-valid-with-cots-meta.yaml b/cocli/cmd/testcases/src/signed-corim-valid-with-cots-meta.yaml deleted file mode 100644 index e472e598..00000000 --- a/cocli/cmd/testcases/src/signed-corim-valid-with-cots-meta.yaml +++ /dev/null @@ -1,3 +0,0 @@ ---- -0: - 0: ACME Ltd signing key diff --git a/cocli/cmd/testcases/src/signed-corim-valid-with-cots.yaml b/cocli/cmd/testcases/src/signed-corim-valid-with-cots.yaml deleted file mode 100644 index de094026..00000000 --- a/cocli/cmd/testcases/src/signed-corim-valid-with-cots.yaml +++ /dev/null @@ -1,6 +0,0 @@ ---- -0: !!binary |- - XFfo9EbNQhuRyQjPk+E8/A== -1: -- !!binary |- - 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 diff --git a/cocli/cmd/testcases/src/signed-corim-valid.yaml b/cocli/cmd/testcases/src/signed-corim-valid.yaml deleted file mode 100644 index 513f2aeb..00000000 --- a/cocli/cmd/testcases/src/signed-corim-valid.yaml +++ /dev/null @@ -1,99 +0,0 @@ -0: !!binary |- - XFfo9EbNQhuRyQjPk+E8/A== -1: -- encodedCBOR: - tag: 506 - value: - 0: en-GB - 1: - 0: !!binary |- - Q7vjfy5hSzOu01PP8UKLFg== - 2: - - 0: ACME Ltd. - 1: - tag: 32 - value: https://acme.example - 2: - - 0 - - 1 - - 2 - 4: - 0: - - - 0: - 0: - tag: 600 - value: acme-implementation-id-000000001 - 1: ACME - 2: RoadRunner - - 0: - tag: 601 - value: - 1: BL - 4: 2.1.0 - 5: !!binary |- - rLsRx+TaIXIFUjzkzhokWuGiOa48a/2eeHH35di66Gs= - 1: - 2: - - - 1 - - !!binary |- - h0KPxSKAPTEGXnvOPPA/5HUJZjHl4Hu9eg/eYMTPJcc= - - - 0: - 0: - tag: 600 - value: acme-implementation-id-000000001 - 1: ACME - 2: RoadRunner - - 0: - tag: 601 - value: - 1: PRoT - 4: 1.3.5 - 5: !!binary |- - rLsRx+TaIXIFUjzkzhokWuGiOa48a/2eeHH35di66Gs= - 1: - 2: - - - 1 - - !!binary |- - AmOCmYm2/ZVPcrqvL8ZLwuLwHWktTecphuqAj26ZgT8= - - - 0: - 0: - tag: 600 - value: acme-implementation-id-000000001 - 1: ACME - 2: RoadRunner - - 0: - tag: 601 - value: - 1: ARoT - 4: 0.1.4 - 5: !!binary |- - rLsRx+TaIXIFUjzkzhokWuGiOa48a/2eeHH35di66Gs= - 1: - 2: - - - 1 - - !!binary |- - o6XnFfDMV0pzw/m+u2vCTzL/1bZ7OHJEwskJ2neaFHg= -2: -- 0: - tag: 32 - value: https://parent.example/rims/ccb3aa85-61b4-40f1-848e-02ad6e8a254b - 1: - - 1 - - !!binary |- - 5Fty9cDAtXLbTY06t+l/No/3TmI0eoJN7LZ6hOUiTXU= -3: http://arm.com/iot/profile/1 -4: - 0: - tag: 1 - value: 1640908800 - 1: - tag: 1 - value: 1767139200 -5: -- 0: ACME Ltd. - 1: - tag: 32 - value: acme.example - 2: - - 1 - diff --git a/cocli/cmd/testcases/src/test-comid.yaml b/cocli/cmd/testcases/src/test-comid.yaml deleted file mode 100644 index 9a5d71e7..00000000 --- a/cocli/cmd/testcases/src/test-comid.yaml +++ /dev/null @@ -1,76 +0,0 @@ ---- -0: en-GB -1: - 0: !!binary |- - Q7vjfy5hSzOu01PP8UKLFg== -2: -- 0: ACME Ltd. - 1: - tag: 32 - value: https://acme.example - 2: - - 0 - - 1 - - 2 -4: - 0: - - - 0: - 0: - tag: 600 - value: !!binary |- - YWNtZS1pbXBsZW1lbnRhdGlvbi1pZC0wMDAwMDAwMDEK - # acme-implementation-id-000000001 - 1: ACME - 2: RoadRunner - - 0: - tag: 601 - value: - 1: BL - 4: 2.1.0 - 5: !!binary |- - rLsRx+TaIXIFUjzkzhokWuGiOa48a/2eeHH35di66Gs= - 1: - 2: - - - 1 - - !!binary |- - h0KPxSKAPTEGXnvOPPA/5HUJZjHl4Hu9eg/eYMTPJcc= - - - 0: - 0: - tag: 600 - value: !!binary |- - YWNtZS1pbXBsZW1lbnRhdGlvbi1pZC0wMDAwMDAwMDEK - # acme-implementation-id-000000001 - 1: ACME - 2: RoadRunner - - 0: - tag: 601 - value: - 1: PRoT - 4: 1.3.5 - 5: !!binary |- - rLsRx+TaIXIFUjzkzhokWuGiOa48a/2eeHH35di66Gs= - 1: - 2: - - - 1 - - !!binary |- - AmOCmYm2/ZVPcrqvL8ZLwuLwHWktTecphuqAj26ZgT8= - - - 0: - 0: - tag: 600 - value: !!binary |- - YWNtZS1pbXBsZW1lbnRhdGlvbi1pZC0wMDAwMDAwMDEK - # acme-implementation-id-000000001 - 1: ACME - 2: RoadRunner - - 0: - tag: 601 - value: - 1: ARoT - 4: 0.1.4 - 5: !!binary |- - rLsRx+TaIXIFUjzkzhokWuGiOa48a/2eeHH35di66Gs= - 1: - 2: - - - 1 - - !!binary |- - o6XnFfDMV0pzw/m+u2vCTzL/1bZ7OHJEwskJ2neaFHg= diff --git a/cocli/cmd/testcases/src/test-coswid.yaml b/cocli/cmd/testcases/src/test-coswid.yaml deleted file mode 100644 index 912c1a67..00000000 --- a/cocli/cmd/testcases/src/test-coswid.yaml +++ /dev/null @@ -1,35 +0,0 @@ ---- -0: com.acme.rrd2013-ce-sp1-v4-1-5-0 -12: 0 -1: ACME Roadrunner Detector 2013 Coyote Edition SP1 -13: 4.1.5 -5: - 43: trial - 45: '2013' - 47: coyote - 52: Roadrunner Detector - 54: sp1 -2: -- 31: The ACME Corporation - 32: acme.com - 33: - - 1 - - 2 -- 31: Coyote Services, Inc. - 32: mycoyote.com - 33: 4 -4: - 38: www.gnu.org/licenses/gpl.txt - 40: license -6: - 16: - 24: rrdetector - 25: "%programdata%" - 26: - 17: - 24: rrdetector.exe - 20: 532712 - 7: - - 1 - - !!binary |- - oxT8LcZjrnpra8Z4dZQFc5bms/VpzVD9XdtNG7r9K2o= diff --git a/cocli/cmd/testcases/src/test-cots.yaml b/cocli/cmd/testcases/src/test-cots.yaml deleted file mode 100644 index af6af0c2..00000000 --- a/cocli/cmd/testcases/src/test-cots.yaml +++ /dev/null @@ -1,17 +0,0 @@ ---- -1: - 0: !!binary |- - qw9Esb/cRgSrSjD4BAfrzA== -2: -- 3: Miscellaneous TA Store -6: - 0: - - - 0 # pkix-cert-type - - !!binary |- - MIIBvTCCAWSgAwIBAgIVANCdkL89UlzHc9Ui7XfVniK7pFuIMAoGCCqGSM49BAMCMD4xCzAJBgNVBAYMAlVTMRAwDgYDVQQKDAdFeGFtcGxlMR0wGwYDVQQDDBRFeGFtcGxlIFRydXN0IEFuY2hvcjAeFw0yMjA1MTkxNTEzMDdaFw0zMjA1MTYxNTEzMDdaMD4xCzAJBgNVBAYMAlVTMRAwDgYDVQQKDAdFeGFtcGxlMR0wGwYDVQQDDBRFeGFtcGxlIFRydXN0IEFuY2hvcjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABONRqhA5JAekvQN8oLwRVNDnAfBnTznLLE+SEGks677sHSeXfcVhZXUeDiN7/fsVNumaiEWRQpZh3zXPwL8rUMyjPzA9MB0GA1UdDgQWBBQBXEXJrLBGKnFd1xCgeMAVSfEBPzALBgNVHQ8EBAMCAoQwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiALBidABsfpzG0lTL9Eh9b6AUbqnzF+koEZbgvppvvt9QIgVoE+bhEN0j6wSPzePjLrEdD+PEgyjHJ5rbA11SPq/1M= - - - 1 # pkix-tainfo-type - - !!binary |- - ooICtjCCArIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASXz21w12owQAx58euratYWiHEkhxDU9MEgetrvAtGYZxNnkfLCsp9vLcw8ISXC8tL97k9ZCUtnr0MzLw37XKRABBT22tHlEou/DenpU0Ozccb3/+fibjCCAj0wUjELMAkGA1UEBgwCVVMxGjAYBgNVBAoMEVplc3R5IEhhbmRzLCBJbmMuMScwJQYDVQQDDB5aZXN0eSBIYW5kcywgSW5jLiBUcnVzdCBBbmNob3KgggHlMIIBi6ADAgECAhQL3EqgUXlQPljyddVSRnNHvK+1MzAKBggqhkjOPQQDAjBSMQswCQYDVQQGDAJVUzEaMBgGA1UECgwRWmVzdHkgSGFuZHMsIEluYy4xJzAlBgNVBAMMHlplc3R5IEhhbmRzLCBJbmMuIFRydXN0IEFuY2hvcjAeFw0yMjA1MTkxNTEzMDdaFw0zMjA1MTYxNTEzMDdaMFIxCzAJBgNVBAYMAlVTMRowGAYDVQQKDBFaZXN0eSBIYW5kcywgSW5jLjEnMCUGA1UEAwweWmVzdHkgSGFuZHMsIEluYy4gVHJ1c3QgQW5jaG9yMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEl89tcNdqMEAMefHrq2rWFohxJIcQ1PTBIHra7wLRmGcTZ5HywrKfby3MPCElwvLS/e5PWQlLZ69DMy8N+1ykQKM/MD0wHQYDVR0OBBYEFPba0eUSi78N6elTQ7Nxxvf/5+JuMAsGA1UdDwQEAwIChDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0gAMEUCIB2li+f6RCxs2EnvNWciSpIDwiUViWayGv1A8xks80eYAiEAmCez4KGrolFKOZT6bvqf1sYQuJBfvtk/y1JQdUvoqlg= - - - 1 # pkix-tainfo-type - - !!binary |- - ooIC1TCCAtEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATN0f5kzywEzZOYbaV23O3N8cku39JoLNjlHPwECbXDDWp0LpAO1z248/hoy6UW/TZMTPPR/93XwHsG16mSFy8XBBSKhM/5gJWjvDbW7qUY1peNm9cfYDCCAlwwXDELMAkGA1UEBgwCVVMxHzAdBgNVBAoMFlNub2JiaXNoIEFwcGFyZWwsIEluYy4xLDAqBgNVBAMMI1Nub2JiaXNoIEFwcGFyZWwsIEluYy4gVHJ1c3QgQW5jaG9yoIIB+jCCAZ+gAwIBAgIUEBuTRGXAEEVEHhu4xafAnqm+qYgwCgYIKoZIzj0EAwIwXDELMAkGA1UEBgwCVVMxHzAdBgNVBAoMFlNub2JiaXNoIEFwcGFyZWwsIEluYy4xLDAqBgNVBAMMI1Nub2JiaXNoIEFwcGFyZWwsIEluYy4gVHJ1c3QgQW5jaG9yMB4XDTIyMDUxOTE1MTMwOFoXDTMyMDUxNjE1MTMwOFowXDELMAkGA1UEBgwCVVMxHzAdBgNVBAoMFlNub2JiaXNoIEFwcGFyZWwsIEluYy4xLDAqBgNVBAMMI1Nub2JiaXNoIEFwcGFyZWwsIEluYy4gVHJ1c3QgQW5jaG9yMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzdH+ZM8sBM2TmG2ldtztzfHJLt/SaCzY5Rz8BAm1ww1qdC6QDtc9uPP4aMulFv02TEzz0f/d18B7BtepkhcvF6M/MD0wHQYDVR0OBBYEFIqEz/mAlaO8NtbupRjWl42b1x9gMAsGA1UdDwQEAwIChDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0kAMEYCIQC2cf43f3PPlCO6/dxv40ftIgxxToKHF72UzENv7+y4ygIhAIGtC/r6SGaFMaP7zD2EloBuIXTtyWu8Hwl+YGdXRY93 diff --git a/cocli/cmd/testcases/test-comid.cbor b/cocli/cmd/testcases/test-comid.cbor deleted file mode 100644 index 42a79e38bb812fa3ceafc4f2550c66982ded5263..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 538 zcmZ3&vXG&gvgL@s7ba`ItGHPSQGGhmHSShHL3_>)_TMXW(KPtHlHL_J(&xy~m0@4Sk_?@w>+ zdXWus7^aOxI&~4)LY7oRJ!3snA}nJ}2?)v$f%%3hxoKwSw!c&Ti*~KoKjwYt(FfT~ zUEk-LZLb>o^JX^MQzy(8FMTfh;Y_$!@!_BQc4r^*H~N2dTeU@z%b}B;x5{UUR6xQk z#S!Q*mQ({^sF@Jq5r)*%JY9Du#)S+4&buGi>m_;{ue%(4{-aa37*pe7hD=ZlD)^M7 f=rP_85o%W5B1dW diff --git a/cocli/cmd/testcases/test-coswid.cbor b/cocli/cmd/testcases/test-coswid.cbor deleted file mode 100644 index 775208cc9a761b8aec6eef2c47939616eefe07e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 377 zcmZvYu};E39L9lwI%uK^!(TMv955z$2UT!4$lyRi#KFbkay?6-y=$&lS{!)>$tW6!t4;VcU7 z3jY1a%a{GuonOCqc3$Vz0l?s|n~4yUE}_ijBuS6z#xZ6b`<{VE4Q${huCHgZQT?>l zX`>5CO%({i6*^nG(V~G`ax67RZPV7a6sXrVHh6;=q*-``6PCcB%C)ko12|Pc?S`cl zX!!p?bCVd#`m)bas%=T-NktcEK>c)TvKjU!*<1|BamT+bl7@LG2g^A<+XlrPFTSeuw*2ZmrQJ)SI}EtkIJDY4 z&e^gsGa1+!avN~6F^96S@i2u38wwckfjC?|?5-7wxdl0?hO!3IAQ5IB5vYhlNKt8V ziGpKZaz=iUft)z6k&%I^p{1dzp|OE^lsK<3h-(JrQfz*tfiN38*tJZIP-inUvNJm| zusjZ2C19z-zGN?R&4N9GAs3!Aen|JXJgwtDNgz|_^}aW<>eFkFCZ?9k@hMmT{Vi(t za#n}yM5k$q_f5|q*smRMX0g42t${4iZ?b$WVk{zzF|H@qY;e;mjJ+;Hv)`rt+Al`8 zSMv?)CN)atalc&l`|VdIg|J4uJVD+|b{jnY+_N)!EqLLdjfYWBQRUhVrdO3;{SR(p zjAYuisEKKtK@-y^1Khr!em=M0dX|9$PvytgtFx|&brh-Wf=6OrO0kZDXI`?Np}K)8NRF9D4nqzlnJj2x zdD{!hOeUL11NoUBsu-t3htX?t9j6HAW6iS~!7VN~M9fX&8TKsTXTx5}$fK z7z|vQ6l9lnKmX;TlXJuKy=l6V*Cggcs-m4~o233ae3sPt>^_4@kzt1V<_8N`FADUs zoboI0*Zgb81a?e_-*?mgbWlL4_ls2#pyYcKn0&7SQ_@8|-amWsU&?tMma~&*r4rYs_s+g9p8&Kp#vleY`O1UyI57E&1?S}_C1n<8C^!}r zBo?LSK+~{}ffghUD`QuHo{)b56Y_j$LKcvo?2>vwz|}=gddJb_2j;EZw-U8@rKw}k zlC%YC;cF2^+n}If?4l)ZtWiyT;`U@Pa04dYZH52L>x<7%QQr0UPX1%}w@N&PeogJ- xd#9Xn&VT=A$0?wa#jS(!*W*%K;TGgu4I$ diff --git a/cocli/data/comid/1.cbor b/cocli/data/comid/1.cbor deleted file mode 100644 index 35e0cb60c4de7c7d1b865cab7a995b62b114ac9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 531 zcmZ3&keZsO>+Zz3kRiYJ;oafB^f0p z1;tkS`iaT8sd}juiMa(isZ7lbj7%&GnVOmwF)U`d$)p~k0Fu_t1WD$m=9MItWaj7T zW~S&GK!G7+3dmHZtf2hFl%UeQywoDbn@nmEij3!8udD7=+p731z!D1}3`%raQX2K?n}rpGcw|TAm>ZX8n>x8v zll{|hl4 zW#xhU)m%?avJYR`{pQj%qWx$VR$iEDo>6J+ZxLCLsO=Q$8sZb0<>VJ?T;v)N7Ft+Zz3kRiZ%_v3oKL~rADmxIrLbm|skYFx~a>FDh1s^C+SqQ`hcp(LZE zq@dVJUq3N9H&rjSA~ClhCzYw0fsu)2Awy%+LWac*H<{EU6hP9tnIOsB)Vz|!lFa-( z-OLnS11KVliWqlMhR(k)ENR0c(W9n%#oOpWIR` zVhyr+a!yJm>fs{GbvD_5=T#Jbe|lrri)_Y)OpQ&95en^2{YRA=Yz^7ss?XVcuzym@ znP&L(LG|7${(A{W&Z{1Wnw=65lpn&9YN%(dXG((UOvz0%JGcFv>R+^Lz5X%pLytbl zX6pJr*KB*$(4RN6(H>^HBiM8UpxaGIFn#gT=b|6ZgnJbq{<&{=_91_x|5vwFTNJq* MI>~vfe3nQB09sV7Y5)KL diff --git a/cocli/data/comid/comid-cca-mult-refval.cbor b/cocli/data/comid/comid-cca-mult-refval.cbor deleted file mode 100644 index 12761868beeed4160df8c0ff3fb7b1b0adf5fd0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 457 zcmZ3&keZsO>+Zz3kRiZ%_v3oKL~rADmxIrLbm|skYFx~a>FDh1s^C+SqQ`hcp(LZE zq@dVJUq3N9H&rjSA~ClhCzYw0fsu)2Awy%+LWac*H<=fs{GbvD_5=T#Jbe|lrri)_Y)OpQ&95en^2{YRA=Yz^7ss?XVcuzym@ znP&L(LG|7${(A{W&Z{1Wnw=65lpn&9YN%(dXG((UOvz0%JGcFv>R+^Lz5X%pLytbl zX6pJr*KB*$(4RN6(H>^HBiM8UpxaGIFn#gT=b|6ZgnJbq{<&{=_91_x|5vwFTNJq* sI>~vfe3nQB$n>bJ+Zz3kRiZ%_v3oKL~rADmxIrLbm|skYFx~a>FDh1s^C+SqQ`hcp(LZE zq@dVJUq3N9H&rjSA~ClhCzYw0fsu)2Awy%+LWac*H<=Zx5ymkwHGzz4cj`Z?)L?7K7FT`F z=7ar{QqDBPrw^+4R`K6UIC5U~I7m$x>$$8_>#L_#+;=2S@2xrQw*0d-^ZUIUbfziX J>YH`I7695=SZ)9S diff --git a/cocli/data/comid/comid-psa-iakpub.cbor b/cocli/data/comid/comid-psa-iakpub.cbor deleted file mode 100644 index 4975373f7cfcaf72e8c4b4eb0f349ac6f7d67862..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 637 zcmZ3&keZsO>+Zz3kRiYJ;oafB^f0p z1;tkS`iaT8sd}juiMa(isZ7lbj7%&GnVOmwF)U`d$rKTx0Fu_t1WD$m=9MItWaj7T zW~S&GK!G7+3dmHZtf2hFl%UeQywoDbn@nmEij3!8udD7K{S*R1oqRl<6}(*|!Gc`AZrSCo<&hrV`B9!# zSq9FIfsvk2wu@t6vP)pPqpMqlS@T@n0cPIe`;!~L8fP6cDS*JZ&Zk}Ye;5ZrdLY3 ztt}VW39f!F=&qtd!1yeF@|F9O$KmPiOuQNYFT`||l?U!ub3HZ5K73{On@iKE5-?_A z<%Ox{8I{KV7Lf&s+D@UaAwHp5PJW@rMXnKHp_L_;5gtM29$w)-?&c98-hnBWnTFY6 nK@q7=0WLmnd1;YFrH1;cr4>PWUcTlYmZAA>E+Zz3kRiYJ;oafB^f0p z1;tkS`iaT8sd}juiMa(isZ7lbj7%&GnVOmwF)U`d$rKTx0Fu_t1WD$m=9MItWaj7T zW~S&GK!G7+3dmHZtf2hFl%UeQywoDbn@nmEij3!8udD7K{S*R1oqRl<6}(*|!Gc`AZrSCo<&hrV`B9!# zSq9FIfsvk2wu@t6vP)pPqpPpClXHllXR>!_uuEp9pX)HTE>G|R~^)VRnsA}qAB#4^Go$lSv#+{fKKBE&l| t#WK?{J1i(7)hWQm$1N`{vZ&NhKee2&IJGf diff --git a/cocli/data/comid/comid-psa-refval.cbor b/cocli/data/comid/comid-psa-refval.cbor deleted file mode 100644 index acd824043708af039e2074805c5e0e597566ba72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 416 zcmZ3&keZsO>+Zz3kRiZ%_v3oKL~rADmxIrLbm|skYFx~a>FDh1s^C+SqQ`hcp(LZE zq@dVJUq3N9H&rjSA~ClhCzYw0fsu)2Awy%+LWac*H<=axr6)lMhR(k)ENR0c(W9n%#oOpWIR` zVhyr+a!yJm>fs{GbvD_5=T#Jbe|lrri)_Y)OpQ&95en^2{YRA=Yz^7ss?XVcuzym@ znP&L(LG|7${(A{W&Z{1Wnw=65lpn&9YN%(dXG((UOvz0%JGcFv>R+^Lz5X%pLytbl zX6pJr*KB*$(4RN6(H>^HBiM8UpxaGIFn#gT=b|6ZgnJbq{<&{=_91_x|5vwFTNJq* MI>~vfe3nQB0Gw#8o&W#< diff --git a/cocli/data/comid/templates/comid-cca-mult-refval.json b/cocli/data/comid/templates/comid-cca-mult-refval.json deleted file mode 100644 index 229c3b57..00000000 --- a/cocli/data/comid/templates/comid-cca-mult-refval.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "lang": "en-GB", - "tag-identity": { - "id": "43BBE37F-2E61-4B33-AED3-53CFF1428B16", - "version": 0 - }, - "entities": [ - { - "name": "ACME Ltd.", - "regid": "https://acme.example", - "roles": [ - "tagCreator", - "creator", - "maintainer" - ] - } - ], - "triples": { - "reference-values": [ - { - "environment": { - "class": { - "id": { - "type": "psa.impl-id", - "value": "YWNtZS1pbXBsZW1lbnRhdGlvbi1pZC0wMDAwMDAwMDE=" - }, - "vendor": "ACME", - "model": "RoadRunner" - } - }, - "measurements": [ - { - "key": { - "type": "psa.refval-id", - "value": { - "label": "BL", - "version": "2.1.0", - "signer-id": "rLsRx+TaIXIFUjzkzhokWuGiOa48a/2eeHH35di66Gs=" - } - }, - "value": { - "digests": [ - "sha-256:h0KPxSKAPTEGXnvOPPA/5HUJZjHl4Hu9eg/eYMTPJcc=" - ] - } - }, - { - "key": { - "type": "psa.refval-id", - "value": { - "label": "PRoT", - "version": "1.3.5", - "signer-id": "rLsRx+TaIXIFUjzkzhokWuGiOa48a/2eeHH35di66Gs=" - } - }, - "value": { - "digests": [ - "sha-256:AmOCmYm2/ZVPcrqvL8ZLwuLwHWktTecphuqAj26ZgT8=" - ] - } - }, - { - "key": { - "type": "psa.refval-id", - "value": { - "label": "ARoT", - "version": "0.1.4", - "signer-id": "rLsRx+TaIXIFUjzkzhokWuGiOa48a/2eeHH35di66Gs=" - } - }, - "value": { - "digests": [ - "sha-256:o6XnFfDMV0pzw/m+u2vCTzL/1bZ7OHJEwskJ2neaFHg=" - ] - } - }, - { - "key": { - "type": "cca.platform-config-id", - "value": "cfg v1.0.0" - }, - "value": { - "raw-value": { - "type": "bytes", - "value": "cmF3dmFsdWUKcmF3dmFsdWUK" - } - } - } - ] - } - ] - } -} - diff --git a/cocli/data/comid/templates/comid-cca-realm-refval.json b/cocli/data/comid/templates/comid-cca-realm-refval.json deleted file mode 100644 index 965d9fd2..00000000 --- a/cocli/data/comid/templates/comid-cca-realm-refval.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "lang": "en-GB", - "tag-identity": { - "id": "43BBE37F-2E61-4B33-AED3-53CFF1428B16", - "version": 0 - }, - "entities": [ - { - "name": "Workload Client Ltd.", - "regid": "https://workloadclient.example", - "roles": [ - "tagCreator", - "creator", - "maintainer" - ] - } - ], - "triples": { - "reference-values": [ - { - "environment": { - "class": { - "id": { - "type": "uuid", - "value": "CD1F0E55-26F9-460D-B9D8-F7FDE171787C" - }, - "vendor": "Workload Client Ltd" - }, - "instance": { - "type": "bytes", - "value": "QoS1aUymwNLPR4mguVrIAlyBjeUjBDZL580pgbLS7caFsyInfsJYGZYkE9jJssH1" - } - }, - "measurements": [ - { - "value": { - "integrity-registers": { - "rim": { - "key-type": "text", - "value": [ - "sha-384;QoS1aUymwNLPR4mguVrIAlyBjeUjBDZL580pgbLS7caFsyInfsJYGZYkE9jJssH1" - ] - }, - "rem0": { - "key-type": "text", - "value": [ - "sha-384;IQe752H8pS2VE2oTVNt6TdV7Gya+DT2nHZ6yOYazS6YVq/ZRTPNeWp6lWgMtBop4" - ] - }, - "rem1": { - "key-type": "text", - "value": [ - "sha-384;JQe752H8pS2VE2oTVNt6TdV7Gya+DT2nHZ6yOYazS6YVq/ZRTPNeWp6lWgMtBop4" - ] - }, - "rem2": { - "key-type": "text", - "value": [ - "sha-384;MQe752H8pS2VE2oTVNt6TdV7Gya+DT2nHZ6yOYazS6YVq/ZRTPNeWp6lWgMtBop4" - ] - }, - "rem3": { - "key-type": "text", - "value": [ - "sha-384;NQe752H8pS2VE2oTVNt6TdV7Gya+DT2nHZ6yOYazS6YVq/ZRTPNeWp6lWgMtBop4" - ] - } - } - } - } - ] - } - ] - } -} \ No newline at end of file diff --git a/cocli/data/comid/templates/comid-cca-refval.json b/cocli/data/comid/templates/comid-cca-refval.json deleted file mode 100644 index 974a473b..00000000 --- a/cocli/data/comid/templates/comid-cca-refval.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "lang": "en-GB", - "tag-identity": { - "id": "43BBE37F-2E61-4B33-AED3-53CFF1428B16", - "version": 0 - }, - "entities": [ - { - "name": "ACME Ltd.", - "regid": "https://acme.example", - "roles": [ - "tagCreator", - "creator", - "maintainer" - ] - } - ], - "triples": { - "reference-values": [ - { - "environment": { - "class": { - "id": { - "type": "psa.impl-id", - "value": "YWNtZS1pbXBsZW1lbnRhdGlvbi1pZC0wMDAwMDAwMDE=" - }, - "vendor": "ACME", - "model": "RoadRunner" - } - }, - "measurements": [ - { - "key": { - "type": "cca.platform-config-id", - "value": "cfg v1.0.0" - }, - "value": { - "raw-value": { - "type": "bytes", - "value": "cmF3dmFsdWUKcmF3dmFsdWUK" - } - } - } - ] - } - ] - } -} - diff --git a/cocli/data/comid/templates/comid-dice-refval.json b/cocli/data/comid/templates/comid-dice-refval.json deleted file mode 100644 index d598c2d1..00000000 --- a/cocli/data/comid/templates/comid-dice-refval.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "tag-identity": { - "id": "1D5A8C7C-1C70-4C56-937E-3C5713AE5A83" - }, - "triples": { - "reference-values": [ - { - "environment": { - "class": { - "id": { - "type": "uuid", - "value": "DD6661F0-0928-4401-966B-589EA74E3272" - }, - "model": "FMC", - "layer": 0, - "index": 0 - } - }, - "measurements": [ - { - "value": { - "op-flags": [ - "notSecure", - "debug" - ], - "digests": [ - "sha-256:RKozavTLFKh5Qy5T3WVxx/qbzK+3X0iCWSYtbqOk2Rs=" - ], - "svn": { - "type": "exact-value", - "value": 10 - } - } - } - ] - }, - { - "environment": { - "class": { - "id": { - "type": "uuid", - "value": "FFDA7CF3-2333-4A91-99A8-068626203ACA" - }, - "model": "L1", - "layer": 1, - "index": 0 - } - }, - "measurements": [ - { - "value": { - "op-flags": [ - "notSecure", - "debug" - ], - "digests": [ - "sha-256:h0KPxSKAPTEGXnvOPPA/5HUJZjHl4Hu9eg/eYMTPJcc=", - "sha-256:VgXOanU71cskR7hhl418y0an8zsD772wLJYg2o6awD0=" - ], - "svn": { - "type": "exact-value", - "value": 2 - } - } - } - ] - } - ] - } -} diff --git a/cocli/data/comid/templates/comid-psa-iakpub.json b/cocli/data/comid/templates/comid-psa-iakpub.json deleted file mode 100644 index 47ef11d3..00000000 --- a/cocli/data/comid/templates/comid-psa-iakpub.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "lang": "en-GB", - "tag-identity": { - "id": "366D0A0A-5988-45ED-8488-2F2A544F6242", - "version": 0 - }, - "entities": [ - { - "name": "ACME Ltd.", - "regid": "https://acme.example", - "roles": [ - "tagCreator", - "creator", - "maintainer" - ] - } - ], - "triples": { - "attester-verification-keys": [ - { - "environment": { - "class": { - "id": { - "type": "psa.impl-id", - "value": "YWNtZS1pbXBsZW1lbnRhdGlvbi1pZC0wMDAwMDAwMDE=" - }, - "vendor": "ACME", - "model": "RoadRunner" - }, - "instance": { - "type": "ueid", - "value": "Ac7rrnuJJ6MiflMDz14PH3s0u1Qq1yUKwD+83jbsLxUI" - } - }, - "verification-keys": [ - { - "type": "pkix-base64-key", - "value": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFn0taoAwR3PmrKkYLtAsD9o05KSM6mbgfNCgpuL0g6VpTHkZl73wk5BDxoV7n+Oeee0iIqkW3HMZT3ETiniJdg==\n-----END PUBLIC KEY-----" - } - ] - }, - { - "environment": { - "class": { - "id": { - "type": "psa.impl-id", - "value": "YWNtZS1pbXBsZW1lbnRhdGlvbi1pZC0wMDAwMDAwMDE=" - }, - "vendor": "ACME", - "model": "RoadRunner" - }, - "instance": { - "type": "ueid", - "value": "AUyj5PUL8kjDl4cCDWj/0FyIdndRvyZFypI/V6mL7NKW" - } - }, - "verification-keys": [ - { - "type": "pkix-base64-key", - "value": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6Vwqe7hy3O8Ypa+BUETLUjBNU3rEXVUyt9XHR7HJWLG7XTKQd9i1kVRXeBPDLFnfYru1/euxRnJM7H9UoFDLdA==\n-----END PUBLIC KEY-----" - } - ] - } - ] - } -} diff --git a/cocli/data/comid/templates/comid-psa-integ-iakpub.json b/cocli/data/comid/templates/comid-psa-integ-iakpub.json deleted file mode 100644 index 2f421794..00000000 --- a/cocli/data/comid/templates/comid-psa-integ-iakpub.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "lang": "en-GB", - "tag-identity": { - "id": "366D0A0A-5988-45ED-8488-2F2A544F6242", - "version": 0 - }, - "entities": [ - { - "name": "ACME Ltd.", - "regid": "https://acme.example", - "roles": [ - "tagCreator", - "creator", - "maintainer" - ] - } - ], - "triples": { - "attester-verification-keys": [ - { - "environment": { - "class": { - "id": { - "type": "psa.impl-id", - "value": "YWNtZS1pbXBsZW1lbnRhdGlvbi1pZC0wMDAwMDAwMDE=" - }, - "vendor": "ACME", - "model": "RoadRunner" - }, - "instance": { - "type": "ueid", - "value": "Ac7rrnuJJ6MiflMDz14PH3s0u1Qq1yUKwD+83jbsLxUI" - } - }, - "verification-keys": [ - { - "type": "pkix-base64-key", - "value": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEMKBCTNIcKUSDii11ySs3526iDZ8A\niTo7Tu6KPAqv7D7gS2XpJFbZiItSs3m9+9Ue6GnvHw/GW2ZZaVtszggXIw==\n-----END PUBLIC KEY-----" - } - ] - }, - { - "environment": { - "class": { - "id": { - "type": "psa.impl-id", - "value": "YWNtZS1pbXBsZW1lbnRhdGlvbi1pZC0wMDAwMDAwMDE=" - }, - "vendor": "ACME", - "model": "RoadRunner" - }, - "instance": { - "type": "ueid", - "value": "AUyj5PUL8kjDl4cCDWj/0FyIdndRvyZFypI/V6mL7NKW" - } - }, - "verification-keys": [ - { - "type": "pkix-base64-key", - "value": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6Vwqe7hy3O8Ypa+BUETLUjBNU3rEXVUyt9XHR7HJWLG7XTKQd9i1kVRXeBPDLFnfYru1/euxRnJM7H9UoFDLdA==\n-----END PUBLIC KEY-----" - } - ] - } - ] - } -} diff --git a/cocli/data/comid/templates/comid-psa-refval.json b/cocli/data/comid/templates/comid-psa-refval.json deleted file mode 100644 index 8fd66fbc..00000000 --- a/cocli/data/comid/templates/comid-psa-refval.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "lang": "en-GB", - "tag-identity": { - "id": "43BBE37F-2E61-4B33-AED3-53CFF1428B16", - "version": 0 - }, - "entities": [ - { - "name": "ACME Ltd.", - "regid": "https://acme.example", - "roles": [ - "tagCreator", - "creator", - "maintainer" - ] - } - ], - "triples": { - "reference-values": [ - { - "environment": { - "class": { - "id": { - "type": "psa.impl-id", - "value": "YWNtZS1pbXBsZW1lbnRhdGlvbi1pZC0wMDAwMDAwMDE=" - }, - "vendor": "ACME", - "model": "RoadRunner" - } - }, - "measurements": [ - { - "key": { - "type": "psa.refval-id", - "value": { - "label": "BL", - "version": "2.1.0", - "signer-id": "rLsRx+TaIXIFUjzkzhokWuGiOa48a/2eeHH35di66Gs=" - } - }, - "value": { - "digests": [ - "sha-256:h0KPxSKAPTEGXnvOPPA/5HUJZjHl4Hu9eg/eYMTPJcc=" - ] - } - }, - { - "key": { - "type": "psa.refval-id", - "value": { - "label": "PRoT", - "version": "1.3.5", - "signer-id": "rLsRx+TaIXIFUjzkzhokWuGiOa48a/2eeHH35di66Gs=" - } - }, - "value": { - "digests": [ - "sha-256:AmOCmYm2/ZVPcrqvL8ZLwuLwHWktTecphuqAj26ZgT8=" - ] - } - }, - { - "key": { - "type": "psa.refval-id", - "value": { - "label": "ARoT", - "version": "0.1.4", - "signer-id": "rLsRx+TaIXIFUjzkzhokWuGiOa48a/2eeHH35di66Gs=" - } - }, - "value": { - "digests": [ - "sha-256:o6XnFfDMV0pzw/m+u2vCTzL/1bZ7OHJEwskJ2neaFHg=" - ] - } - } - ] - } - ] - } -} diff --git a/cocli/data/config/example-config.yaml b/cocli/data/config/example-config.yaml deleted file mode 100644 index d067efbc..00000000 --- a/cocli/data/config/example-config.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# This file contains example configuration for connecting to Veraison services. -# This configuration is only necessary for the `cocli corim submit` sub-command, -# as that is the only instance where remote service configuration is used. You -# do not need this configuration for creating or manipulating corims/corim and -# related objects locally. - -# API Server submit endpoint URL. -api_server: https://veraison.example/endorsement-provisioning/v1/submit - -# Authentication method used by the remote service. -auth: none # may also be "basic" or "oauth2" - -# Credentials for the remote service. -username: example_user # used only if auth is "basic" or "oauth2" -password: Passw0rd! # used only if auth is "basic" or "oauth2"; this can also - # be specfied on the command line using --password, or by - # setting COCLI_PASSWORD environment variable - -# OAuth2 cofiguration for the authorisation server associated with the remote -# service. -client_id: veraison-client # used only if auth is "oauth2" -client_secret: YifmabB4cVSPPtFLAmHfq7wKaEHQn10Z # used only if auth is "oauth2" -token_url: http://localhost:11111/realms/veraison/protocol/openid-connect/token # used only if auth is "oauth2" - diff --git a/cocli/data/corim/corim-full.cbor b/cocli/data/corim/corim-full.cbor deleted file mode 100644 index 1f895aeb7ff6cd2a1b3011c16ecde85c1621cbc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1495 zcmcIkYfKbp6rFEoS>CSzbp){^2ohm-XZAq>c_=T}hSjYg0%F@?c32j6XP4PoSRSSB zYSbTEi#C|r)Uvy%#I%;AX>Hn4FsTv?0%<}E8nsQe6(1>$lBPULXSUneAMG#GUo-d4 znRD(v_kQ15NLRc2-jmX6g$dnPgCyr>W}nx$O!Lrc1R&2qb}=Zr}kka9RlLbb%_Y_`I_5 z$!KhUTam2%Ceu8!@XpwW7hlo1s#9^++c%T&H{Z(j&d15h7rWo?mmW;Ta=wP^%18t} zrGsIYNO!34*yW^sd8G8^j`7^Nf;;x$dh+h~9fR$Ww_g2fB4tFxR0fPU+BZ#&uHX78 zb@FKEXz97fn~+}y2QqrF>u;PI&Z`EUGvN1r$br!ovy7t6jEv*-3W8MPG=tl$B;KOJ zNnDK+VGwW-TZ*(L*iH+j=j<%Ya9AVH7WW0k%(+vKU)E(tT(MG`#f1BuPbBdL-7&ywTr+6v_jdw>22=*yL#yFVRcqjf{rSiQdisT&ejryB0^xZrle1-B5@M2s|W<3Y`M9t@;Gz83@pB88CT$Cu7WWv>tH z8$>#Lzlg4w{29y{c4Uuc>^L4}%y{tS!^90IU%N~(_O%ho9m|VxnX{)3mvk5QP`A|+ z!$ax1F-a__ExG#sKx6{R#>MQ9$IAp+vA0*(H&N!Mn=IC?Y}(Lc#(| z9F*B=V#q`yLChdwvHlEJ!P#v*wuPk|EL^V(3=%G&??qq$!*S5$yKfHV?W`TKO(i{Q zojRTLdEcJHM2No|2?9T>9+xI#gw$!tH1RB2o-u09cU(5Qy;jr;o^1h$x1!Q0a!v(vjIQb4uAz@u6=Q zKwS6$4o=U#IQVu&k z&@|@Q+`#izTaH|Ar8tJ=g=P0mU(OlLHaSh#DJd#Tjc1Z|DqKa>lX#XYi@^y6rO#xt zD1};82gE~hXAd_&Jp3_tLwhvm;_U00$9~&hr)qa;AAZt);BJ!EjyN5tC?x1moLM}# wa;uG!8!fz?lz5;^@zl5m0+-^A6^4BQPA_EiT@PivUIwNylkZ~i7X~}QpIur4LjV8( diff --git a/cocli/data/corim/signed-corim-bad-signature.cbor b/cocli/data/corim/signed-corim-bad-signature.cbor deleted file mode 100644 index 8116a8c37173a82225f4d23b70116effd29bace1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 922 zcmZWnO-~b16rFZ}6c)OWh2bN4LEDh%beQSTGN_prAz++f5CHkGpHfC=bU@*`?~MG_w$YU?Ci^FA|r>~_gk*b zL$}jb1J}D{Tb&?fmM|(2!cw_@7CsL{zq_ES-1eNT)90Sw za%hCsO>oewT5hAn`TRz;H&m&-~1 zEeEq!#L5}SvNp1N0;P7{0eYi#4FaR=@m0{ih|}L*<1(AWhz@&;B6ss1lsW^WqUaf5 zi}Km&r`vGYuXiG|EXNI@yRd#SesiA(PCJZWojy)iwQVcMd0}43YnGuHb9GHA7zIa} z)A>Q(DR6z>u+BSeGHkXJh$943Pz9(NuvdAZ80hTx=<@|$*6w(! z-{q>?2~{or43~c(wE!l$@t4k0HLUgT|D}E>%p&+cAdIC?cHm`1roEqUAenTLFQ~F z>Y~o63vMoRw8bAWnSf0}gtUZ;k;e{~sbT8zEq{aEAg;Urm9u99~7O z9}L7EY{}P@U1gg3AAWG=)1$8ydn_q9=kFR$c*^(Wa@+mc=`Zhi|Dbwf3bybxTvI|K z;29kZdlb4&dE5Jv)@PCGSJw_^j^*5NhS!oee^}eoI_28y-=0hES1=VJgZ0iuLj!Y` zd`a!z);3Ud;Qk`ym!9sl4(#&VdwR1hplulZaS(E0G;h~Xw4Koif>lS5={U{cqJzZO z=y4J^;6x+@TtvXU6+C4XoE*mpSOFt3w8RUT@&}gBx9}2!6tm_2R$Kp+;JkhCP0CmQ-HHU;){DUU2Y2ps6TU7bsP(8GX?M zU>WBOikC6M8kT0nG;AqHYf!Aw-txDSCID8cd}xYmMssts#>P1{ykOJHlfrN!BWi7q zMvdf>(0R6CO6`sIqiDTsNbs2GbbGQx;B5kBw^9<7jK+IoWCZsNpgGWAC9u#>vK~p6oN-bD1 z#aV*~P|WyB-EZ_!jC1DX*=r{r#TiHTY%bi9*Fjx3oa;TF zYC5Be1yzNoKJG4>-&B1uy3^GgxAa$#BZ~qen~WgB)yPVfIuc%4Mn)5pm0(h2XrYU; zI~o}>kw{Q7NMvjymnx@4r7NK^7(O@u|JMY64v|G9%3dZ; zR=w~a9f?prPf^K6!R^EpC724p6IBR-$d7;eh%AAK0vL->&&^f$kDRe5mmDwH^!-Cn zbmt>--A?y(E@EW=qtS5~t8iy?F;N$?yNe%R%huhEIsa#7v2Lr-@=3R0X!e~aWw6@^ zUBXYXF z#Pr?dp^Wd22stMYPxNPw-`bKAY8?6Oth2qTg zyv)3Gh3wQy#v2MH86_nJ#a88bl^K%Wupp9g z%QA+5nD7^0+|D{lPdv$Se)2<`Ka7nLk8d*mTEw`JAwV{&r$(m0Cv0+^O}Oy7sAiUh z3{6c78I~~IPz|`7miU2F!-a8LcEr5penv%1$!@;R%nU3HjSCqUGu~v<;9_cQVvJC5 zS!JB{<+R9(N@u;`yQzi8f6YF#etWz}Q>2=1-r^-UrJ1>4CjP%w^I6&0YvRlmY;9@^ zR;QSfd<>Zx5e70bHGvFlcj`Z?)L?7K7FT`F=7ar{QqDBPrw^+4R`K6UIC5U~I7m$x z>$$8_>#L_#+;=2S@2xrQw*0d-^ZUIUbfziX>YH`ImKo@{MGQ9-DjZ-TRghSenpXk~ zD^Nfe>nA5C87C%MnChAtCYk7(7^E5MT9{a*>KYg&rkJH#BpR8TBr$@ldlFsr^}vCx zMYnx>t+v0cH|ziImt<1a(Klp4 zix$?##SEFSc+~?&W)5;BGBq+rIIQ-ZvTmM&YIXEQwcUNWhA#~-zBHP6WYU4R(Q_|z pv~1iI^v1}M@l*EcnmC7|`;R)eZI|7|x6th0q=Mh9OzSHWL;#3(?x6qx diff --git a/cocli/data/corim/templates/corim-cca-realm.json b/cocli/data/corim/templates/corim-cca-realm.json deleted file mode 100644 index f6b07666..00000000 --- a/cocli/data/corim/templates/corim-cca-realm.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "corim-id": "5c57e8f4-46cd-421b-91c9-08cf93e13cfc", - "profile": "http://arm.com/cca/realm/1", - "validity": { - "not-before": "2021-12-31T00:00:00Z", - "not-after": "2025-12-31T00:00:00Z" - }, - "entities": [ - { - "name": "ACME Ltd.", - "regid": "acme.example", - "roles": [ - "manifestCreator" - ] - } - ] -} diff --git a/cocli/data/corim/templates/corim-cca.json b/cocli/data/corim/templates/corim-cca.json deleted file mode 100644 index 59e536d5..00000000 --- a/cocli/data/corim/templates/corim-cca.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "corim-id": "5c57e8f4-46cd-421b-91c9-08cf93e13cfc", - "profile": "http://arm.com/cca/ssd/1", - "validity": { - "not-before": "2021-12-31T00:00:00Z", - "not-after": "2025-12-31T00:00:00Z" - }, - "entities": [ - { - "name": "ACME Ltd.", - "regid": "acme.example", - "roles": [ - "manifestCreator" - ] - } - ] -} diff --git a/cocli/data/corim/templates/corim-full.json b/cocli/data/corim/templates/corim-full.json deleted file mode 100644 index db4d772a..00000000 --- a/cocli/data/corim/templates/corim-full.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "corim-id": "5c57e8f4-46cd-421b-91c9-08cf93e13cfc", - "dependent-rims": [ - { - "href": "https://parent.example/rims/ccb3aa85-61b4-40f1-848e-02ad6e8a254b", - "thumbprint": "sha-256:5Fty9cDAtXLbTY06t+l/No/3TmI0eoJN7LZ6hOUiTXU=" - } - ], - "profile": "http://arm.com/psa/iot/1", - "validity": { - "not-before": "2021-12-31T00:00:00Z", - "not-after": "2025-12-31T00:00:00Z" - }, - "entities": [ - { - "name": "ACME Ltd.", - "regid": "acme.example", - "roles": [ - "manifestCreator" - ] - } - ] -} diff --git a/cocli/data/corim/templates/corim-mini.json b/cocli/data/corim/templates/corim-mini.json deleted file mode 100644 index bc7e70ba..00000000 --- a/cocli/data/corim/templates/corim-mini.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "corim-id": "5c57e8f4-46cd-421b-91c9-08cf93e13cfc" -} diff --git a/cocli/data/corim/templates/meta-full.json b/cocli/data/corim/templates/meta-full.json deleted file mode 100644 index 5c465494..00000000 --- a/cocli/data/corim/templates/meta-full.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "signer": { - "name": "ACME Ltd signing key", - "uri": "https://acme.example" - }, - "validity": { - "not-before": "2021-12-31T00:00:00Z", - "not-after": "2025-12-31T00:00:00Z" - } -} diff --git a/cocli/data/corim/templates/meta-mini.json b/cocli/data/corim/templates/meta-mini.json deleted file mode 100644 index fb978cc8..00000000 --- a/cocli/data/corim/templates/meta-mini.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "signer": { - "name": "ACME Ltd signing key" - } -} diff --git a/cocli/data/corim/unsigned-corim.cbor b/cocli/data/corim/unsigned-corim.cbor deleted file mode 100644 index bcbe320de07ab754f17ab3c84100356a37cd43c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 815 zcmZvYZ%7ki9LMi&(=v*Rd~vDK)1Qe@ceis>hAEXZvv4vpO#A=r_H3SRch_?_om0wP zQEw`V!l)qFW+}a}Aj${=g)++2SAi?+4`>(!2^x_kwXH>OdV75C^Z7mB+l2G*ftmTr z(em6&FP4s9{#g2x)a&2J$%QBxA)MF8d+AzV=GlBu@{)2@^9J&tj-vFW?p%4-vyGi)eCE;i zvC`S?Q-LfGKmDQoNoeJ}<4?y;&y!4D##mEe+v}0dyC1=;7dl2Nd*`+pzCO9PwHv&- zczv*}f$WHrKl+Fu5M)0K1wUdjb{Cp?3nL&#Rd}Yw%J57PV_r^>LGw<#V;9&bLpKgc z62hPYX-Lpy43d8UyWA#g2<&o;nkY-4*2%9xR+eXrGH%gZkcLI*qnVVP<~%|QrmgCK zbab(hNK<-@Ua#$ML?D&5%UF>yOsZ+nm^w9aGrd74sRS2D$7>O85e1}f1$!icrGd}i z_NT*B$vrqlg`6mB9B+&gLpgA)iXew_#QomRjBtz)Q?plVZkC(?zSQ99!>BO%8&X~^ AOaK4? diff --git a/cocli/data/coswid/1.cbor b/cocli/data/coswid/1.cbor deleted file mode 100644 index bc78ffccda80397fa234a5b59fc91a52522bb9ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 377 zcmZvYu}%U(5Qc$(T4v9Ph&?2X64-R)&>4-QM7!Pp}) zv9huA0qA@Jd*ch(N#b#m*w{|K`M-bWDHRbRUB-orOewQkF^;J~8u$hs)Tlx0w6dN` zN0rk?t4S^-H&y6)sK^;=6j~~>*dPr#k{U_Vw6!fg(rFtTSYrmO=N_SiTG`wInuJ67 zMkFxQf`8)RM8xXMcnW*^vWq0qHl*^U;)`e?-K1*V8TQBNOw5H#c?Z?N78o3nb5AfJ zjyw7_u>{U$AK)O`9S(=g@iqyqPJx&J diff --git a/cocli/data/cots/Zesty Hands_ta.ta b/cocli/data/cots/Zesty Hands_ta.ta deleted file mode 100644 index 05705fe16fe8846eb32a51baecaedb99f18a0403..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 698 zcmZ3~#I((ziD{ETq=7ISyH=aWIa?-1HV!a@nUS5@iGgMM`P_o*Sq2U~l^CmS6`MPIp6jcv>y7c#*e=1>+k9;VP>Ln#9Z5QmFLFe(rw~$9T3n*wn3tT9U$mf!@u@)*WA_4PCPpSE z5$-!)3j!+x>>@suUJY_9cHgsptFZwW)PpR{Otf%^_4@kzt1V<_8N`FADUs coboI0*Zgb81a?e_-*?mgbWlL4_ls2#0F{=a+uKsDR-m6OEv#aTqUTF(D$n7Vk6*|m2|C9X~Hoqb(C0cdHA zL5v}{0Vf-CC<_}8Q)sZEyn!r;!^I;OoR^=Jlv$ji;8;+QSd^Nhqu`mBtY@fWpaoLE z%%hB5fkH@8X>o~yV_tGbe$j#^#$N_ajPn;TGchtTi3mtfc1b-T;OZhLz2oTe1M^ny zTiId21@$TmGZSqcV<0EaYh+|#YG`R_YG`a=5hc!R4C0zWxiq$&cCowI-oO?dZL)kU zVmP9j8yIP_{4BsgW@<6u2XTZM8UM4e8ZZMXY-1U{=V~%sar5AwYa2G!6Pv*r5Kv9)eTf330n?B4n0jj1*Yk4Xqx7} z$e&shbJwZfR>WYQB$&c6iw{Joqj2eKeY6VH8P1$za9(* zu1pHDOS_-{a?#1T;rZS)UCC<_^C4By&a_QZe;qzc>U?&e0ZhI#)Hgp^xO!2bm*tdS zdB5ggJ0`GWLj1m)_NRjaO1)pKiU1|wI$-jx0;Z%gJjwTQ;3@%274{{2nQIp85e&KT zobf}tzvXEi|49OwIcb&lWGbisfsdOm^)#=ZBWed;;Tw;%dgH;+Px$iwfv>fK7#3zQuA@AK}sV5Ee&Fg z5#rOJJA;7>lL9xJx&zzsmuGTSefGPwU;D-A_G-Ri-K0jzJnomve!u<7q!89$kpL=#juLUpsv+*$MDXLt%!St%~tN+1GOcBv|Qr_Aw9>!bqZZQSl(LPk9e)G7Z z?T`DyFXrq#yM4uzZMt(_temA=5W`>Ja69z?+eJ$ diff --git a/cocli/data/cots/namedtastore.cbor b/cocli/data/cots/namedtastore.cbor deleted file mode 100644 index 2bbbcc174136a5fc0abcfddf0f54a576907cc1dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmZ3))VPqj%r~<*IW;FIF)ua0v{)g;Q6ab_zbKV$Awy#mVL~jD$b=w`Ee`K6qD)!gR$LI6K|97t+sAjvqa+0{dIEzSE%lV%TQy1?syY_CW z#I@ZQ4CKUljf@OT4J{2#4UG*fqQrTPL0mH^m&Uf! zE_N5&8`y%QO_q;E3`bOR10zkAp9L7mOf3fdAdWC2<9`-b17;wF90$yv3+hZX$L?>HcnbZR+Qs)yIpduF{>_e4KqZZ9xqtogNNY7*{QHb;%e00( U#gextv-ikz)+MBeyY`m@0M@k!{{R30 diff --git a/cocli/data/cots/rubbish.cbor b/cocli/data/cots/rubbish.cbor deleted file mode 100644 index 336db72d08713f4f738746202ae0aabe61c3bb8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmaFAe=pPf{d<9kxvaPX0u@3W6@p9hi&EKu!VC~u#z>}{i-1g!Vgnc*X&}tTt_9?I z0I@9-BO3>t!_3Ie?8LwV6o;S`Af>}{b~2F41>!P@D4f)TurhQYv<#49;e@ccvPwX* zd_Zgq5do4JrTjv_ciE|kl8JHSc8k!m!8(2h%a~XrUW>7ATZ6E9j3>Y`|2Dab?BFo1jMrwNF z2BsTXeimRXg0mGrh%3wpN)#-t2FzdvdUP{;G8niqDS~okArPC_7oVS^3}ir1K9F(; zVkMqJKZuApgaVSzAV~;<=m)a7A$*TCAZ-X?14&yrD^IZm!p;U#@|<-E>EW(GRyhFI C(GRTv diff --git a/cocli/data/cots/templates/claims/exclclaim.json b/cocli/data/cots/templates/claims/exclclaim.json deleted file mode 100644 index 409e138c..00000000 --- a/cocli/data/cots/templates/claims/exclclaim.json +++ /dev/null @@ -1 +0,0 @@ -{"swname":"More Bitter Paper"} \ No newline at end of file diff --git a/cocli/data/cots/templates/claims/permclaim.json b/cocli/data/cots/templates/claims/permclaim.json deleted file mode 100644 index e5f304cd..00000000 --- a/cocli/data/cots/templates/claims/permclaim.json +++ /dev/null @@ -1 +0,0 @@ -{"swname":"Bitter Paper"} \ No newline at end of file diff --git a/cocli/data/cots/templates/env/comid.json b/cocli/data/cots/templates/env/comid.json deleted file mode 100644 index d692c138..00000000 --- a/cocli/data/cots/templates/env/comid.json +++ /dev/null @@ -1 +0,0 @@ -[{"environment":{"class":{"id":{"type":"oid","value":"1.2.3.4.5"}}}}] \ No newline at end of file diff --git a/cocli/data/cots/templates/env/coswid.json b/cocli/data/cots/templates/env/coswid.json deleted file mode 100644 index a051b8e7..00000000 --- a/cocli/data/cots/templates/env/coswid.json +++ /dev/null @@ -1 +0,0 @@ -[{"swidtag":{"entity":[{"entity-name":"Zesty Hands, Inc.","role":"softwareCreator"}]}}] \ No newline at end of file diff --git a/cocli/data/cots/templates/env/namedtastore.json b/cocli/data/cots/templates/env/namedtastore.json deleted file mode 100644 index 24e88271..00000000 --- a/cocli/data/cots/templates/env/namedtastore.json +++ /dev/null @@ -1 +0,0 @@ -[{"namedtastore":"Miscellaneous TA Store"}] \ No newline at end of file diff --git a/cocli/data/cots/templates/env/vendor.json b/cocli/data/cots/templates/env/vendor.json deleted file mode 100644 index 571df036..00000000 --- a/cocli/data/cots/templates/env/vendor.json +++ /dev/null @@ -1 +0,0 @@ -[{"environment":{"class":{"vendor":"Zesty Hands, Inc."}}}] \ No newline at end of file diff --git a/cocli/data/cots/templates/env/vendor2.json b/cocli/data/cots/templates/env/vendor2.json deleted file mode 100644 index ae4f2027..00000000 --- a/cocli/data/cots/templates/env/vendor2.json +++ /dev/null @@ -1 +0,0 @@ -[{"environment":{"class":{"vendor":"Worthless Sea, Inc."}}}] \ No newline at end of file diff --git a/cocli/data/cots/templates/env/vendors.json b/cocli/data/cots/templates/env/vendors.json deleted file mode 100644 index f8160924..00000000 --- a/cocli/data/cots/templates/env/vendors.json +++ /dev/null @@ -1 +0,0 @@ -[{"environment":{"class":{"vendor":"Zesty Hands, Inc."}}},{"environment":{"class":{"vendor":"Snobbish Apparel, Inc."}}}] \ No newline at end of file diff --git a/cocli/data/cots/vendor.cbor b/cocli/data/cots/vendor.cbor deleted file mode 100644 index 8996a35a32efaf6d3a32955c4a071879b5de8064..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 674 zcmZ3))VPpwA;Ut(!l=~Zl1c@S#JrSZ9R<(4WIeWp42?~UkxX@qnwY8#nwZKAA`OJu z*tOa`&e<|CvT=YJ%#7^JP7ExM16K)Hs<1EF%UrWyk6_4!=ZqiH{Vh-H_)ikZ)Oo${ zjja0g+M|i7rE+}A)qj7Bn!TLW;X2W2TH<}v^9S~82b^IMVT^G-xn_f#R$=UQfdv%@ zL_I$;+5;_RG_W(|HsEAq4rO8EVG0d46foceakzNcT`LlE3vyBoWeuc3BFsD@P!WZY zqSE3L1;@PPjQpYnO^kaDnix|SFf%bSF^Mu*d> z21)a?00WAt#eg5g5oTok&%$cJ45X05k=dQWz=cVHn@!z;?fA_~{qhucU%Vodceq~Y!YqZM~Nk%o+WxpN{9?|| vv)flZ*`_<^#mZT_1u^{f4YyMduwCR7QQA^}Oz`xTjLc%&IUW`*SN{P3*O4YG diff --git a/cocli/data/keys/ec-p256.jwk b/cocli/data/keys/ec-p256.jwk deleted file mode 100644 index e3c07719..00000000 --- a/cocli/data/keys/ec-p256.jwk +++ /dev/null @@ -1,9 +0,0 @@ -{ - "kty": "EC", - "crv": "P-256", - "x": "MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4", - "y": "4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM", - "d": "870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE", - "use": "enc", - "kid": "1" -} diff --git a/cocli/data/pics/cocli-map.graffle b/cocli/data/pics/cocli-map.graffle deleted file mode 100644 index fc669abf193135cea4443905d589c91d1f3c509a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171894 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%0A10LrC-5=-ZssF@z#{n` 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 diff --git a/cocli/data/pics/cocli-map.png b/cocli/data/pics/cocli-map.png deleted file mode 100644 index bca1faa9b2c5fe031d339e034ad838d05847c063..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110025 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≫loYU!+$ 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

trN`6r1G;sXuCr?RGU3O`NUDBG2 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 diff --git a/cocli/main.go b/cocli/main.go deleted file mode 100644 index b319cc3d..00000000 --- a/cocli/main.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2021-2024 Contributors to the Veraison project. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/veraison/corim/cocli/cmd" -) - -func main() { - cmd.Execute() -} diff --git a/cocli/data/cots/Snobbish Apparel_ta.ta b/cots/data/Snobbish Apparel_ta.ta similarity index 100% rename from cocli/data/cots/Snobbish Apparel_ta.ta rename to cots/data/Snobbish Apparel_ta.ta diff --git a/cocli/data/cots/shared_ta.ta b/cots/data/shared_ta.ta similarity index 100% rename from cocli/data/cots/shared_ta.ta rename to cots/data/shared_ta.ta diff --git a/cots/example_test.go b/cots/example_test.go index 589f79c4..48add10e 100644 --- a/cots/example_test.go +++ b/cots/example_test.go @@ -173,8 +173,8 @@ func Example_decode_CBOR() { } func Example_list_of_cots_roundtrip() { - snobTa, _ := os.ReadFile("../cocli/data/cots/Snobbish Apparel_ta.ta") - sharedTa, _ := os.ReadFile("../cocli/data/cots/shared_ta.ta") + snobTa, _ := os.ReadFile("./data/Snobbish Apparel_ta.ta") + sharedTa, _ := os.ReadFile("./data/shared_ta.ta") // cts1 egSnob := NewEnvironmentGroup() diff --git a/scripts/licenses.sh b/scripts/licenses.sh index accdad92..68fff931 100755 --- a/scripts/licenses.sh +++ b/scripts/licenses.sh @@ -8,7 +8,6 @@ type go-licenses &> /dev/null || go get github.com/google/go-licenses MODULES+=("github.com/veraison/corim/corim") MODULES+=("github.com/veraison/corim/comid") -MODULES+=("github.com/veraison/corim/cocli") for module in ${MODULES[@]} do