Skip to content
This repository has been archived by the owner on Nov 22, 2024. It is now read-only.

Federation via ActivityPub #37

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
106 commits
Select commit Hold shift + click to select a range
5a8dfe3
Fix Anaconda environment configuration for tests
aj-stein-nist Nov 22, 2023
a7f0c7b
create statement: As standalone file for rev a4645e4bc3e78ad5cfd9f834…
pdxjohnny Nov 10, 2023
232a00a
scitt: create_claim: Update to rev a4645e4bc3e78ad5cfd9f8347c7e0ac826…
pdxjohnny Nov 10, 2023
e9a945d
docs: registration policies: CWT decode and COSESign1.verify_signature
pdxjohnny Nov 10, 2023
6bbff05
verify statement: As standalone file
pdxjohnny Nov 14, 2023
e43457f
create statement: Issuer as public key using did:key if not given
pdxjohnny Nov 17, 2023
a060ba5
Remove unused imports
pdxjohnny Nov 17, 2023
d831b4d
Add server CLI arg for Federation loaded via entrypoint style load pl…
pdxjohnny Oct 16, 2023
a920d9c
Federation plugin via ActivityPub based on bovine and mechanical-bull
pdxjohnny Oct 16, 2023
0851a76
docs: Federation via ActivityPub: Bovine based example
pdxjohnny Oct 16, 2023
dc1f51c
minor edits to be rebased back into prev commits
pdxjohnny Oct 16, 2023
bc47310
sending follow to outbox but nothign happens
pdxjohnny Oct 17, 2023
7bed2aa
Herd attempting to send follow to inbox but failing to lookup URL of …
pdxjohnny Oct 17, 2023
e3f7bbe
Herd following working!
pdxjohnny Oct 17, 2023
386e255
Receiving receipt via federation
pdxjohnny Oct 17, 2023
b0976c5
Receipt verification
pdxjohnny Oct 17, 2023
46b2e37
Update stream 8 link
pdxjohnny Oct 18, 2023
28bcdcf
TODO around submit claim
pdxjohnny Oct 18, 2023
8abcfe1
Use hash of claim as entry ID for content addressabbility
pdxjohnny Oct 18, 2023
76f1511
docs: Federation via ActivityPub: S2C2F Notes: Add ING-4 mirror sourc…
pdxjohnny Oct 18, 2023
b33d67c
docs: Federation via ActivityPub: Only submit claim once
pdxjohnny Oct 18, 2023
9be2c58
Pass entry_id in created_receipt blob
pdxjohnny Oct 18, 2023
a129fe9
Start on moving to blinker signals
pdxjohnny Oct 22, 2023
e1bd60f
Tested sending signal to submit federated claim
pdxjohnny Oct 22, 2023
8eafd4f
Adding signals.py
pdxjohnny Oct 22, 2023
84bf6c0
Remove commented created_entry.send test
pdxjohnny Oct 22, 2023
d9fbbb3
Convert to quart for async support
pdxjohnny Oct 22, 2023
8160db8
Enable middleware handling __call__ to asgi_app to enable addition of…
pdxjohnny Oct 22, 2023
12bb8b0
Adding Bovine ActivityPub routes to server
pdxjohnny Oct 22, 2023
c6cb55f
Remove seperate activitypub server in favor of routes added to SCITT
pdxjohnny Oct 22, 2023
d420a28
Migrating to middleware local addition of actor
pdxjohnny Oct 22, 2023
82f2939
Add -log flag to scitt-emulator server
pdxjohnny Oct 23, 2023
00d9a64
Adding actor via app.config["bovine_store"]
pdxjohnny Oct 23, 2023
da77159
Sending to outbox working again
pdxjohnny Oct 23, 2023
6fd257c
Add back workspace for federation middleware to docs
pdxjohnny Oct 23, 2023
6d21813
Format with black
pdxjohnny Oct 23, 2023
081428e
Removed unused get_actor code
pdxjohnny Oct 23, 2023
1e885a9
bob is following alice but alice for some reason is not following bob
pdxjohnny Oct 24, 2023
5056769
docs: federation activitypub: Update workspace paths
pdxjohnny Oct 25, 2023
7cf2a95
federation fqdn
pdxjohnny Oct 26, 2023
3e77c0c
Pass bovine_db_url hackily via config.json to os.environ
pdxjohnny Oct 26, 2023
5ab2db8
format with black
pdxjohnny Oct 26, 2023
8ad87a3
tests: federation activitypub bovine: Initial commit
pdxjohnny Oct 27, 2023
9b9dcf9
Minor fixes
pdxjohnny Oct 27, 2023
80abc65
tests: federation activitypub bovine: Socket resolution
pdxjohnny Oct 27, 2023
1c688dd
Got the port
pdxjohnny Oct 27, 2023
da4d856
multiprocessing.Process
pdxjohnny Oct 27, 2023
f2da97f
Tests correctly failing, other instance does not yet have the claim, …
pdxjohnny Oct 27, 2023
d73ea5f
tests: federation activitypub bovine: Silent pass for sake of dev
pdxjohnny Oct 27, 2023
b2c8ff7
minor cleanups
pdxjohnny Oct 27, 2023
c8bb04a
Cleanup unittest.mock.patch helpers
pdxjohnny Nov 4, 2023
f7edc44
MockResolver.getaddrinfo
pdxjohnny Nov 4, 2023
2d73cf9
TLS connect fail to correct port
pdxjohnny Nov 4, 2023
8e6fc0f
Issues with following with HTTP
pdxjohnny Nov 4, 2023
015805e
test checks same log claim contents, failing to connect BovineClient …
pdxjohnny Nov 5, 2023
6853bda
404 but hooked the bovine_herd.server.wellknown.webfinger_response_json
pdxjohnny Nov 5, 2023
1af845e
fqdn set scheme to http for tests
pdxjohnny Nov 5, 2023
25a1d51
set bovine_db_url correctly in pass to herd
pdxjohnny Nov 5, 2023
c76bffe
logger.info Actor url on register
pdxjohnny Nov 5, 2023
e00018a
Using mock client requerst
pdxjohnny Nov 5, 2023
6ea7fc5
rebuilt url
pdxjohnny Nov 5, 2023
1cb656f
TESTING WITHOUT RESOLVER AND VIA ssh -nNT
pdxjohnny Nov 5, 2023
0fc150a
Looks like its is now resolving the endpoints
pdxjohnny Nov 6, 2023
18e3c0c
Claim written federated from Alice to Bob
pdxjohnny Nov 6, 2023
0cd99cd
Failing to mock within test cases
pdxjohnny Nov 6, 2023
e1fb268
It works! Successful federation of claim submitted to Alice federated…
pdxjohnny Nov 6, 2023
037efc6
Update Dockerfile
pdxjohnny Nov 8, 2023
f9791d4
.github/workflows/coverity.yml
pdxjohnny Nov 8, 2023
7b6cb2d
Remove dead code and format with black
pdxjohnny Nov 8, 2023
d9ce921
federation activitypub bovine: Inline mechanical-bull patchset for ha…
pdxjohnny Nov 8, 2023
1974fa3
federation activitypub bovine: Remove subprocess call to create mecha…
pdxjohnny Nov 8, 2023
4a4db66
docs: federation activitypub: Add asciinema
pdxjohnny Nov 8, 2023
c93282e
Update federation_activitypub;
pdxjohnny Nov 8, 2023
63e2886
docs: federation activitypub: Link to demo from IETF 118 SCITT WG Mee…
pdxjohnny Nov 8, 2023
5afec44
extras_require[federation-activitypub-bovine] += "tomli-w"
pdxjohnny Nov 10, 2023
1c4a76a
Add subject to federation tests create-claim
pdxjohnny Nov 19, 2023
4716302
tests: federation activitypub bovine: Use ephemeral did:key for issue…
pdxjohnny Nov 19, 2023
8c4d348
TODO support activtypub style key resolution
pdxjohnny Nov 19, 2023
326c3c3
tests: cli: service: Set app as class property
pdxjohnny Nov 19, 2023
91d9536
server: Default middleware and configs to empty lists when loading if…
pdxjohnny Nov 19, 2023
1db14fb
tests: cli: service: Quart updates
pdxjohnny Nov 19, 2023
657980d
tests: cli: Update service call to use list of middleware
pdxjohnny Nov 20, 2023
7b3c008
oidc: Update to quart bytes headers
pdxjohnny Nov 20, 2023
d21d9fd
de-async where not needed
pdxjohnny Nov 20, 2023
e62aa88
tests: docs: Refactor to support quart separate thread service
pdxjohnny Nov 20, 2023
f85d72b
server: submit claim: Refactor to support content addressable claims
pdxjohnny Nov 20, 2023
a239a1b
server: No need to pass signals when signals object present on app
pdxjohnny Nov 20, 2023
836725a
docs: federation activitypub: Pass --subject when creating statement
pdxjohnny Nov 20, 2023
ee908f4
tests: federation: activitypub: bovine: Almost there
pdxjohnny Nov 20, 2023
838cf32
tests: federation: activitypub: bovine: Wait for actors to follow eac…
pdxjohnny Nov 20, 2023
81f76a7
tests: federation: activitypub: bovine: Working testcase
pdxjohnny Nov 20, 2023
ea953a8
ci: Enable testing on 3.11 for bovine
pdxjohnny Nov 20, 2023
9f84ae9
run-tests: Ensure we install federation via activitypub extras (bovin…
pdxjohnny Nov 20, 2023
6cd3a9e
Move coverity Dockerfile USER scitt fix before CMD exec
pdxjohnny Nov 20, 2023
4f1d43b
scitt: signal receiver submit claim: Pass long_running from value of …
pdxjohnny Nov 20, 2023
d364016
tests: federation activitypub bovine: Federation with policy engine a…
pdxjohnny Nov 20, 2023
221e23e
tests: SimpleFileBasedPolicyEngine: gracefully handle errors on state…
pdxjohnny Nov 20, 2023
27738fe
demos: apple: Add bash scripts
pdxjohnny Nov 20, 2023
e2709e1
key loader format url referencing activitypub actor: In progress
pdxjohnny Nov 21, 2023
c153983
key loader format url referencing activitypub actor: In progress
pdxjohnny Nov 21, 2023
b33895f
Rename keyloader for activitypub actor
pdxjohnny Nov 21, 2023
4ae03f9
Rename keyloader for activitypub actor function
pdxjohnny Nov 21, 2023
9a82a17
Remove unused key loader format activitpub for now since we have not …
pdxjohnny Nov 21, 2023
1a4d2b5
Add federation deps to conda
pdxjohnny Nov 23, 2023
e89a605
Enable 3.11 conda for bovine
pdxjohnny Nov 23, 2023
9921e46
key loader format url referencing x509: Initial commit
pdxjohnny Dec 15, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 20 additions & 16 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,34 +11,38 @@ on:
workflow_dispatch:

jobs:
ci-venv:
name: CI (venv)
ci:
name: "CI ${{ matrix.python-version }} (conda: ${{ matrix.conda }})"
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.8"]
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- run: ./run-tests.sh

ci-conda:
name: CI (conda)
runs-on: ubuntu-latest
conda: [true, false]
python-version: ["3.11"]
defaults:
run:
# https://github.com/conda-incubator/setup-miniconda#use-a-default-shell
shell: bash -el {0}
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- uses: conda-incubator/setup-miniconda@v2
if: ${{ matrix.conda == true }}
with:
activate-environment: scitt
environment-file: environment.yml
- run: python -m pytest
python-version: ${{ matrix.python-version }}
- name: Run tests with conda
if: ${{ matrix.conda == true }}
run: |
python -m pip install -e .
python -m pytest
- name: Set up Python ${{ matrix.python-version }}
if: ${{ matrix.conda == false }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Run tests with venv
if: ${{ matrix.conda == false }}
run: ./run-tests.sh

ci-cd-build-and-push-image-container:
name: CI/CD (container)
Expand Down
23 changes: 23 additions & 0 deletions .github/workflows/coverity.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Your .github/workflows/coverity.yml file.
name: Coverity Scan

# We only want to test official release code, not every pull request.
on:
push:
branches:
- '**'

permissions:
contents: read

jobs:
coverity:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: vapier/coverity-scan-action@cae3c096a2eb21c431961a49375ac17aea2670ce # v1.7.0
with:
email: ${{ secrets.COVERITY_SCAN_EMAIL }}
token: ${{ secrets.COVERITY_SCAN_TOKEN }}
build_language: 'other'
command: '--no-command --fs-capture-search ./ --fs-capture-search-exclude-regex /cov-analysis/.*'
6 changes: 5 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# Virtual CCF (non-SGX) build and run:
# $ docker build -t ghcr.io/scitt-community/scitt-api-emulator:main --progress plain .
# $ docker run --rm -ti -w /src/src/scitt-api-emulator -v $PWD:/src/src/scitt-api-emulator -p 8000:8000 ghcr.io/scitt-community/scitt-api-emulator:main
FROM python:3.8
FROM python:3.11

WORKDIR /usr/src/scitt-api-emulater

Expand All @@ -15,4 +15,8 @@ COPY . .

RUN pip install --no-cache-dir -e .

# CWE-269 Configure alternate docker user
RUN useradd scitt
USER scitt

CMD scitt-emulator server --workspace workspace/ --tree-alg CCF
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,13 +91,14 @@ They can be used with the built-in server or an external service implementation.

```sh
./scitt-emulator.sh client create-claim \
--issuer did:web:example.com \
--content-type application/json \
--subject 'solar' \
--payload '{"sun": "yellow"}' \
--out claim.cose
```

_**Note:** The emulator generates an ad-hoc key pair to sign the claim and does not verify claim signatures upon submission._
_**Note:** The emulator generates an ad-hoc key pair to sign the claim if
``--issuer`` and ``--public-key-pem`` are not given. See [Registration Policies](docs/registration_policies.md) docs for more deatiled examples_

2. View the signed claim by uploading `claim.cose` to one of the [CBOR or COSE Debugging Tools](#cose-and-cbor-debugging)

Expand Down
8 changes: 8 additions & 0 deletions demos/apple/alice.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
jq < ${HOME}/Documents/fediverse/scitt_federation_alice/config.json \
&& sleep 2 \
&& scitt-emulator server \
--workspace ${HOME}/Documents/fediverse/scitt_federation_alice/workspace_alice/ \
--tree-alg CCF \
--port 7000 \
--middleware scitt_emulator.federation_activitypub_bovine:SCITTFederationActivityPubBovine \
--middleware-config-path ${HOME}/Documents/fediverse/scitt_federation_alice/config.json
4 changes: 4 additions & 0 deletions demos/apple/bob-webhook.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
gh webhook forward \
--repo=pdxjohnny/scitt-api-emulator \
--events=push \
--url=https://scitt.bob.chadig.com/github-webhook-notary/
12 changes: 12 additions & 0 deletions demos/apple/bob.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
jq < ${HOME}/Documents/fediverse/scitt_federation_bob/config.json \
&& sleep 2 \
&& scitt-emulator server \
--workspace ${HOME}/Documents/fediverse/scitt_federation_bob/workspace_bob/ \
--tree-alg CCF \
--port 6000 \
--middleware \
scitt_emulator.federation_activitypub_bovine:SCITTFederationActivityPubBovine \
scitt_emulator.github_webhook_notary:GitHubWebhookNotaryMiddleware \
--middleware-config-path \
${HOME}/Documents/fediverse/scitt_federation_bob/config.json \
-
3 changes: 3 additions & 0 deletions demos/apple/get_statement_from_alice.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
curl -sfL https://github.com/scitt-community/scitt-api-emulator/archive/$(git log -n 1 --format=%H).tar.gz | sha384sum - | awk '{print $1}'

scitt-emulator client retrieve-claim --entry-id sha384:fe1952f763cf8947b6bc49902d7ec5f4a006c9358d2c6349b07896bf0967ebb7395eba7b30c9b7896b4096bc140a5f42 --url https://scitt.unstable.chadig.com --out webhook.push.cose
198 changes: 198 additions & 0 deletions docs/federation_activitypub.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
# Federation via ActivityPub

- Federation of SCITT events enables near real-time communication between supply
chains.
- Acceptance of claims to SCITT where payload data contains VEX, CSAF, VSA,
SBOM, VDR, VRF, S2C2F alignment attestations, etc. has the side effect of
enabling a consistent pattern for notification of new vulnerability
and other Software Supply Chain Security data.
- References
- [SCITT Architecture: 7. Federation](https://www.ietf.org/archive/id/draft-ietf-scitt-architecture-02.html#name-federation)
- https://www.w3.org/TR/activitypub/
- [OpenSSF Stream 8](https://openssf.org/oss-security-mobilization-plan/):
Coordinate Industry-Wide Data Sharing to Improve the Research That Helps
Determine the Most Critical OSS Components

```mermaid
flowchart LR
subgraph alice[Alice]
subgraph aliceSCITT[SCITT]
alice_submit_claim[Submit Statement]
alice_receipt_created[Receipt Created]

alice_submit_claim --> alice_receipt_created
end
end
subgraph bob[Bob]
subgraph bobSCITT[SCITT]
bob_submit_claim[Submit Statement]
bob_receipt_created[Receipt Created]
bob_make_statement_available_created[Serve Statement]

bob_submit_claim --> bob_receipt_created
bob_submit_claim --> bob_make_statement_available_created
end
subgraph bobActivityPubActor[ActivityPub Actor]
bob_inbox[Inbox]
end

bob_inbox --> bob_submit_claim
end
subgraph eve[Eve]
subgraph eve_client[Submit to Alice, Retrieve from Bob and verify]
eve_submit_claim[Submit Statement]
eve_retrieve_statement[Retrieve Statement]
eve_retrieve_receipt[Retrieve Receipt]
eve_verify_receipt[Verify Receipt]
end
end

eve_submit_claim --> alice_submit_claim

eve_retrieve_statement --> eve_verify_receipt
eve_retrieve_receipt --> eve_verify_receipt
bob_make_statement_available_created --> eve_retrieve_statement
bob_receipt_created --> eve_retrieve_receipt

alice_receipt_created --> bob_inbox
```

> Below links to recording of IETF 118 SCITT Meeting, Corresponding asciinema link: https://asciinema.org/a/619517

[![asciicast-federation-activitypub-bovine](https://asciinema.org/a/619517.svg)](https://www.youtube.com/watch?v=zEGob4oqca4&t=5354s)

## Dependencies

Install the SCITT API Emulator with the `federation-activitypub-bovine` extra.

- https://bovine-herd.readthedocs.io/en/latest/deployment.html
- Bovine and associated libraries **require Python 3.11 or greater!!!**

```console
$ pip install -e .[federation-activitypub-bovine]
```

## Example of Federating Statements / Receipts Across SCITT Instances

> Please refer to the [Registration Policies](registration_policies.md) doc for
> more information about claim insert policies.

In this example Alice and Bob each have their own instance of SCITT. Alice's
insert policy differs from Bob's slightly. Alice and Bob's instances federate
with each other. This means when claims are inserted into one instance and are
given and entry ID and a receipt at notification is sent to the other instance.
The other instance decides if it wants to create a corresponding entry ID and
receipt local to it.

Federation can be helpful when some aspects of insert policy validation are
shared. By federating with entities an instance trusts for those aspects of
insert policy and instance and it's owner(s) may be able to reduce investment in
compute or other activities required for claim validation.

As a more specific example, entities may share a common set of insert policy
criteria defined in a collaborative manner (such as a working group).
Attestations of alignment to the [S2C2F](https://github.com/ossf/s2c2f/blob/main/specification/framework.md#appendix-relation-to-scitt)
are one such example. In addition to the requirements / evaluation criteria
defined by the OpenSSF's Supply Chain Integrity Working Group an entity may
desire to evaluate attestations of alignment with added requirements appropriate
to their usage/deployment context and it's threat model.

By the end of this tutorial you will have four terminals open.

- One for the ActivityPub Server
- One for Bob's SCITT Instance
- One for Alice's SCITT Instance
- One for submitting claims to Bob and Alice's SCITT instances and querying
their ActivityPub Actors.

### S2C2F Notes

- ING-4: Mirror a copy of all OSS source code to an internal location
- One might also want to mirror trust attestations, integrity data, etc. to
ensure availability. Federation could assist with keeping mirrors as up to
date as possible.

### Bring up Bob's SCITT Instance

Populate Bob's federation config

**~/Documents/fediverse/scitt_federation_bob/config.json**

```json
{
"handle_name": "bob",
"fqdn": "scitt.bob.chadig.com",
"workspace": "~/Documents/fediverse/scitt_federation_bob/",
"bovine_db_url": "~/Documents/fediverse/scitt_federation_bob/bovine.sqlite3",
"following": {
"alice": {
"actor_id": "[email protected]"
}
}
}
```

Start the server

```console
$ rm -rf workspace_bob/
$ mkdir -p workspace_bob/storage/operations
$ scitt-emulator server \
--workspace ${HOME}/Documents/fediverse/scitt_federation_bob/workspace_bob/ --tree-alg CCF --port 6000 \
--middleware scitt_emulator.federation_activitypub_bovine:SCITTFederationActivityPubBovine \
--middleware-config-path ${HOME}/Documents/fediverse/scitt_federation_bob/config.json
```

### Bring up Alice's SCITT Instance

Populate Alice's federation config

**~/Documents/fediverse/scitt_federation_alice/config.json**

```json
{
"handle_name": "alice",
"fqdn": "scitt.alice.chadig.com",
"workspace": "~/Documents/fediverse/scitt_federation_alice/",
"bovine_db_url": "~/Documents/fediverse/scitt_federation_alice/bovine.sqlite3",
"following": {
"bob": {
"actor_id": "[email protected]"
}
}
}
```

Start the server

```console
$ rm -rf workspace_alice/
$ mkdir -p workspace_alice/storage/operations
$ scitt-emulator server \
--workspace ${HOME}/Documents/fediverse/scitt_federation_alice/workspace_alice/ --tree-alg CCF --port 7000 \
--middleware scitt_emulator.federation_activitypub_bovine:SCITTFederationActivityPubBovine \
--middleware-config-path ${HOME}/Documents/fediverse/scitt_federation_alice/config.json
```

### Create and Submit Statement to Alice's Instance

```console
$ scitt-emulator client create-claim --issuer did:web:example.org --content-type application/json --subject solar --payload '{"sun": "yellow"}' --out claim.cose
Claim written to claim.cose
$ scitt-emulator client submit-claim --url http://localhost:7000 --claim claim.cose --out claim.receipt.cbor
Claim registered with entry ID sha384:76303a87c3ff728578d1e941ec4422193367e31fd37ab178257536cba79724d6411c457cd3c47654975dc924ff023123
Receipt written to claim.receipt.cbor
```

### Download Receipt from Bob's Instance

```console
$ scitt-emulator client retrieve-claim --url http://localhost:6000 --out federated.claim.cose --entry-id sha384:76303a87c3ff728578d1e941ec4422193367e31fd37ab178257536cba79724d6411c457cd3c47654975dc924ff023123
Claim written to federated.claim.cose
$ scitt-emulator client retrieve-receipt --url http://localhost:6000 --out federated.claim.receipt.cbor --entry-id sha384:76303a87c3ff728578d1e941ec4422193367e31fd37ab178257536cba79724d6411c457cd3c47654975dc924ff023123
Receipt written to federated.claim.receipt.cbor
$ scitt-emulator client verify-receipt --claim federated.claim.cose --receipt federated.claim.receipt.cbor --service-parameters workspace_alice/service_parameters.json
Leaf hash: 7d8501f1aea9b095b9730dab05f8866c0c9d0e33e6f3f2c7131ff4a3ca1ddf61
Root: fceb0aa5ac260542753b5086d512fe3bb074ef39ac3becc5d9ce857b020b85fb
Receipt verified
```
Loading