From 38a4809f8cbc288c29bd10559fad0a87e000ebde Mon Sep 17 00:00:00 2001 From: Mihai Maruseac Date: Mon, 12 Aug 2024 16:24:28 -0700 Subject: [PATCH 01/11] Reorganize code to enable wheel publishing This commits moves files around to get to a `src/` layout (https://packaging.python.org/en/latest/discussions/src-layout-vs-flat-layout/#src-layout-vs-flat-layout) for the code. There are more benefits for a `src/` layout than a flat layout, such as: - documentation is easier to generate - we won't accidentally test against code that is different than what users would see - we can include only the source in the wheel, reducing PyPI bandwidth - it makes it clearer which parts of the repo go into the wheel and which ones are ancillary. Incidentally, we might now want to move the SLSA parts to another repo and maybe rename this one? We can do this at a later time. For this commit I only moved the files around. The only change is in `README.md` where I replaced the pointer to `model_signing/README.md` with one to `README.model_signing.md`, as I'm creating this file now. Since we would need to change `README.model_signing.md` anyway once the API is ready, I have not updated it besides just fixing the image pointer. I have deleted old files from when this was a POC. Since we're working on releasing the library, we no longer need those. The alternative to not moving the files to the root of the folder would have been to duplicate LICENSE, etc. inside the `model-signing` directory, so that packaging tools would see it. I decided against that, since we still needed to move files around to make a `src/` directory and it did no longer make sense to also do file duplication. Signed-off-by: Mihai Maruseac --- README.md | 2 +- .../README.md => README.model_signing.md | 2 +- .../images/sigstore-model-diagram.png | Bin .../install => install}/requirements.in | 0 .../requirements_Darwin.txt | 0 .../requirements_Linux.txt | 0 .../requirements_Windows.txt | 0 .../install => install}/requirements_dev.in | 0 .../requirements_dev_Darwin.txt | 0 .../requirements_dev_Linux.txt | 0 .../install => install}/requirements_test.in | 0 .../requirements_test_Darwin.txt | 0 .../requirements_test_Linux.txt | 0 .../requirements_test_Windows.txt | 0 model_signing/benchmarks/run.sh | 169 ---- model_signing/main.py | 104 --- model_signing/model.py | 161 ---- model_signing/serialize.py | 392 --------- model_signing/serialize_test.py | 818 ------------------ .../pyproject.toml => pyproject.toml | 0 .../model_signing}/__init__.py | 0 .../model_signing}/hashing/__init__.py | 0 .../model_signing}/hashing/file.py | 0 .../model_signing}/hashing/hashing.py | 0 .../model_signing}/hashing/memory.py | 0 .../model_signing}/manifest/__init__.py | 0 .../model_signing}/manifest/manifest.py | 0 .../model_signing}/serialization/__init__.py | 0 .../serialization/serialization.py | 0 .../serialization/serialize_by_file.py | 0 .../serialization/serialize_by_file_shard.py | 0 .../model_signing}/signature/__init__.py | 0 .../model_signing}/signature/encoding.py | 0 .../model_signing}/signature/fake.py | 0 .../model_signing}/signature/key.py | 0 .../model_signing}/signature/pki.py | 0 .../model_signing}/signature/signing.py | 0 .../model_signing}/signature/sigstore.py | 0 .../model_signing}/signature/verifying.py | 0 .../model_signing}/signing/__init__.py | 0 .../model_signing}/signing/as_bytes.py | 0 .../model_signing}/signing/empty_signing.py | 0 .../model_signing}/signing/in_toto.py | 0 .../model_signing}/signing/signing.py | 0 .../model_signing}/signing/sigstore.py | 0 {model_signing => tests}/conftest.py | 0 {model_signing => tests}/hashing/file_test.py | 0 .../hashing/memory_test.py | 0 .../manifest/manifest_test.py | 0 .../serialize_by_file_shard_test.py | 0 .../serialization/serialize_by_file_test.py | 0 .../TestDigestSerializer/deep_model_folder | 0 .../TestDigestSerializer/empty_model_file | 0 .../TestDigestSerializer/empty_model_folder | 0 .../model_folder_with_empty_file | 0 .../TestDigestSerializer/sample_model_file | 0 .../TestDigestSerializer/sample_model_folder | 0 .../TestDigestSerializer/symlink_model_folder | 0 .../TestManifestSerializer/deep_model_folder | 0 .../TestManifestSerializer/empty_model_file | 0 .../TestManifestSerializer/empty_model_folder | 0 .../model_folder_with_empty_file | 0 .../TestManifestSerializer/sample_model_file | 0 .../sample_model_folder | 0 .../symlink_model_folder | 0 .../TestDigestSerializer/deep_model_folder | 0 .../deep_model_folder_small_shards | 0 .../TestDigestSerializer/empty_model_file | 0 .../empty_model_file_small_shards | 0 .../TestDigestSerializer/empty_model_folder | 0 .../empty_model_folder_small_shards | 0 .../model_folder_with_empty_file | 0 .../model_folder_with_empty_file_small_shards | 0 .../TestDigestSerializer/sample_model_file | 0 .../sample_model_file_small_shards | 0 .../TestDigestSerializer/sample_model_folder | 0 .../sample_model_folder_small_shards | 0 .../TestDigestSerializer/symlink_model_folder | 0 .../symlink_model_folder_small_shards | 0 .../TestManifestSerializer/deep_model_folder | 0 .../deep_model_folder_small_shards | 0 .../TestManifestSerializer/empty_model_file | 0 .../empty_model_file_small_shards | 0 .../TestManifestSerializer/empty_model_folder | 0 .../empty_model_folder_small_shards | 0 .../model_folder_with_empty_file | 0 .../model_folder_with_empty_file_small_shards | 0 .../TestManifestSerializer/sample_model_file | 0 .../sample_model_file_small_shards | 0 .../sample_model_folder | 0 .../sample_model_folder_small_shards | 0 .../TestManifestSerializer/symlink_model_file | 0 .../symlink_model_folder | 0 .../symlink_model_folder_small_shards | 0 .../signature/key_test.py | 0 .../signing/as_bytes_test.py | 0 .../signing/empty_signing_test.py | 0 .../signing/in_toto_test.py | 0 .../TestBytesPayload/deep_model_folder | 0 .../TestBytesPayload/empty_model_file | 0 .../TestBytesPayload/empty_model_folder | 0 .../model_folder_with_empty_file | 0 .../TestBytesPayload/sample_model_file | 0 .../TestBytesPayload/sample_model_folder | 0 .../TestBytesPayload/symlink_model_folder | 0 .../deep_model_folder | 0 .../empty_model_file | 0 .../empty_model_folder | 0 .../model_folder_with_empty_file | 0 .../sample_model_file | 0 .../sample_model_folder | 0 .../symlink_model_folder | 0 .../deep_model_folder | 0 .../empty_model_file | 0 .../empty_model_folder | 0 .../model_folder_with_empty_file | 0 .../sample_model_file | 0 .../sample_model_folder | 0 .../symlink_model_folder | 0 .../deep_model_folder | 0 .../TestDigestsIntotoPayload/empty_model_file | 0 .../empty_model_folder | 0 .../model_folder_with_empty_file | 0 .../sample_model_file | 0 .../sample_model_folder | 0 .../symlink_model_folder | 0 .../deep_model_folder | 0 .../empty_model_file | 0 .../empty_model_folder | 0 .../model_folder_with_empty_file | 0 .../sample_model_file | 0 .../sample_model_folder | 0 .../symlink_model_folder | 0 .../deep_model_folder | 0 .../empty_model_file | 0 .../empty_model_folder | 0 .../model_folder_with_empty_file | 0 .../sample_model_file | 0 .../sample_model_folder | 0 .../symlink_model_folder | 0 {model_signing => tests}/test_support.py | 0 141 files changed, 2 insertions(+), 1646 deletions(-) rename model_signing/README.md => README.model_signing.md (99%) rename {model_signing => docs}/images/sigstore-model-diagram.png (100%) rename {model_signing/install => install}/requirements.in (100%) rename {model_signing/install => install}/requirements_Darwin.txt (100%) rename {model_signing/install => install}/requirements_Linux.txt (100%) rename {model_signing/install => install}/requirements_Windows.txt (100%) rename {model_signing/install => install}/requirements_dev.in (100%) rename {model_signing/install => install}/requirements_dev_Darwin.txt (100%) rename {model_signing/install => install}/requirements_dev_Linux.txt (100%) rename {model_signing/install => install}/requirements_test.in (100%) rename {model_signing/install => install}/requirements_test_Darwin.txt (100%) rename {model_signing/install => install}/requirements_test_Linux.txt (100%) rename {model_signing/install => install}/requirements_test_Windows.txt (100%) delete mode 100644 model_signing/benchmarks/run.sh delete mode 100644 model_signing/main.py delete mode 100644 model_signing/model.py delete mode 100644 model_signing/serialize.py delete mode 100644 model_signing/serialize_test.py rename model_signing/pyproject.toml => pyproject.toml (100%) rename {model_signing => src/model_signing}/__init__.py (100%) rename {model_signing => src/model_signing}/hashing/__init__.py (100%) rename {model_signing => src/model_signing}/hashing/file.py (100%) rename {model_signing => src/model_signing}/hashing/hashing.py (100%) rename {model_signing => src/model_signing}/hashing/memory.py (100%) rename {model_signing => src/model_signing}/manifest/__init__.py (100%) rename {model_signing => src/model_signing}/manifest/manifest.py (100%) rename {model_signing => src/model_signing}/serialization/__init__.py (100%) rename {model_signing => src/model_signing}/serialization/serialization.py (100%) rename {model_signing => src/model_signing}/serialization/serialize_by_file.py (100%) rename {model_signing => src/model_signing}/serialization/serialize_by_file_shard.py (100%) rename {model_signing => src/model_signing}/signature/__init__.py (100%) rename {model_signing => src/model_signing}/signature/encoding.py (100%) rename {model_signing => src/model_signing}/signature/fake.py (100%) rename {model_signing => src/model_signing}/signature/key.py (100%) rename {model_signing => src/model_signing}/signature/pki.py (100%) rename {model_signing => src/model_signing}/signature/signing.py (100%) rename {model_signing => src/model_signing}/signature/sigstore.py (100%) rename {model_signing => src/model_signing}/signature/verifying.py (100%) rename {model_signing => src/model_signing}/signing/__init__.py (100%) rename {model_signing => src/model_signing}/signing/as_bytes.py (100%) rename {model_signing => src/model_signing}/signing/empty_signing.py (100%) rename {model_signing => src/model_signing}/signing/in_toto.py (100%) rename {model_signing => src/model_signing}/signing/signing.py (100%) rename {model_signing => src/model_signing}/signing/sigstore.py (100%) rename {model_signing => tests}/conftest.py (100%) rename {model_signing => tests}/hashing/file_test.py (100%) rename {model_signing => tests}/hashing/memory_test.py (100%) rename {model_signing => tests}/manifest/manifest_test.py (100%) rename {model_signing => tests}/serialization/serialize_by_file_shard_test.py (100%) rename {model_signing => tests}/serialization/serialize_by_file_test.py (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file/TestDigestSerializer/deep_model_folder (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file/TestDigestSerializer/empty_model_file (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file/TestDigestSerializer/empty_model_folder (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file/TestDigestSerializer/model_folder_with_empty_file (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file/TestDigestSerializer/sample_model_file (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file/TestDigestSerializer/sample_model_folder (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file/TestDigestSerializer/symlink_model_folder (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file/TestManifestSerializer/deep_model_folder (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file/TestManifestSerializer/empty_model_file (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file/TestManifestSerializer/empty_model_folder (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file/TestManifestSerializer/model_folder_with_empty_file (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file/TestManifestSerializer/sample_model_file (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file/TestManifestSerializer/sample_model_folder (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file/TestManifestSerializer/symlink_model_folder (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/deep_model_folder (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/deep_model_folder_small_shards (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/empty_model_file (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/empty_model_file_small_shards (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/empty_model_folder (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/empty_model_folder_small_shards (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/model_folder_with_empty_file (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/model_folder_with_empty_file_small_shards (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/sample_model_file (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/sample_model_file_small_shards (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/sample_model_folder (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/sample_model_folder_small_shards (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/symlink_model_folder (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/symlink_model_folder_small_shards (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/deep_model_folder (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/deep_model_folder_small_shards (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/empty_model_file (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/empty_model_file_small_shards (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/empty_model_folder (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/empty_model_folder_small_shards (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/model_folder_with_empty_file (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/model_folder_with_empty_file_small_shards (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/sample_model_file (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/sample_model_file_small_shards (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/sample_model_folder (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/sample_model_folder_small_shards (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/symlink_model_file (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/symlink_model_folder (100%) rename {model_signing => tests}/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/symlink_model_folder_small_shards (100%) rename {model_signing => tests}/signature/key_test.py (100%) rename {model_signing => tests}/signing/as_bytes_test.py (100%) rename {model_signing => tests}/signing/empty_signing_test.py (100%) rename {model_signing => tests}/signing/in_toto_test.py (100%) rename {model_signing => tests}/signing/testdata/as_bytes/TestBytesPayload/deep_model_folder (100%) rename {model_signing => tests}/signing/testdata/as_bytes/TestBytesPayload/empty_model_file (100%) rename {model_signing => tests}/signing/testdata/as_bytes/TestBytesPayload/empty_model_folder (100%) rename {model_signing => tests}/signing/testdata/as_bytes/TestBytesPayload/model_folder_with_empty_file (100%) rename {model_signing => tests}/signing/testdata/as_bytes/TestBytesPayload/sample_model_file (100%) rename {model_signing => tests}/signing/testdata/as_bytes/TestBytesPayload/sample_model_folder (100%) rename {model_signing => tests}/signing/testdata/as_bytes/TestBytesPayload/symlink_model_folder (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/deep_model_folder (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/empty_model_file (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/empty_model_folder (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/model_folder_with_empty_file (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/sample_model_file (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/sample_model_folder (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/symlink_model_folder (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/deep_model_folder (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/empty_model_file (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/empty_model_folder (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/model_folder_with_empty_file (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/sample_model_file (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/sample_model_folder (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/symlink_model_folder (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestsIntotoPayload/deep_model_folder (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestsIntotoPayload/empty_model_file (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestsIntotoPayload/empty_model_folder (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestsIntotoPayload/model_folder_with_empty_file (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestsIntotoPayload/sample_model_file (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestsIntotoPayload/sample_model_folder (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestDigestsIntotoPayload/symlink_model_folder (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestShardDigestsIntotoPayload/deep_model_folder (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestShardDigestsIntotoPayload/empty_model_file (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestShardDigestsIntotoPayload/empty_model_folder (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestShardDigestsIntotoPayload/model_folder_with_empty_file (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestShardDigestsIntotoPayload/sample_model_file (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestShardDigestsIntotoPayload/sample_model_folder (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestShardDigestsIntotoPayload/symlink_model_folder (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestSingleDigestIntotoPayload/deep_model_folder (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestSingleDigestIntotoPayload/empty_model_file (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestSingleDigestIntotoPayload/empty_model_folder (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestSingleDigestIntotoPayload/model_folder_with_empty_file (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestSingleDigestIntotoPayload/sample_model_file (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestSingleDigestIntotoPayload/sample_model_folder (100%) rename {model_signing => tests}/signing/testdata/in_toto/TestSingleDigestIntotoPayload/symlink_model_folder (100%) rename {model_signing => tests}/test_support.py (100%) diff --git a/README.md b/README.md index 7d10d16d..a0a73d0b 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ table shows: | bert-base-uncased | 3.3G | 1.6s | 1.1s | | tiiuae/falcon-7b | 14GB | 2.1s | 1.8s | -See [model_signing/README.md](model_signing/README.md) for more information. +See [README.model_signing.md](README.model_signing.md) for more information. ### SLSA for ML diff --git a/model_signing/README.md b/README.model_signing.md similarity index 99% rename from model_signing/README.md rename to README.model_signing.md index b82a6e2a..f7d7ef66 100644 --- a/model_signing/README.md +++ b/README.model_signing.md @@ -19,7 +19,7 @@ Model signers should monitor for occurences of their signing identity in the log. Sigstore is actively developing a [log monitor](https://github.com/sigstore/rekor-monitor) that runs on GitHub Actions. -![Signing models with Sigstore](images/sigstore-model-diagram.png) +![Signing models with Sigstore](docs/images/sigstore-model-diagram.png) ## Usage diff --git a/model_signing/images/sigstore-model-diagram.png b/docs/images/sigstore-model-diagram.png similarity index 100% rename from model_signing/images/sigstore-model-diagram.png rename to docs/images/sigstore-model-diagram.png diff --git a/model_signing/install/requirements.in b/install/requirements.in similarity index 100% rename from model_signing/install/requirements.in rename to install/requirements.in diff --git a/model_signing/install/requirements_Darwin.txt b/install/requirements_Darwin.txt similarity index 100% rename from model_signing/install/requirements_Darwin.txt rename to install/requirements_Darwin.txt diff --git a/model_signing/install/requirements_Linux.txt b/install/requirements_Linux.txt similarity index 100% rename from model_signing/install/requirements_Linux.txt rename to install/requirements_Linux.txt diff --git a/model_signing/install/requirements_Windows.txt b/install/requirements_Windows.txt similarity index 100% rename from model_signing/install/requirements_Windows.txt rename to install/requirements_Windows.txt diff --git a/model_signing/install/requirements_dev.in b/install/requirements_dev.in similarity index 100% rename from model_signing/install/requirements_dev.in rename to install/requirements_dev.in diff --git a/model_signing/install/requirements_dev_Darwin.txt b/install/requirements_dev_Darwin.txt similarity index 100% rename from model_signing/install/requirements_dev_Darwin.txt rename to install/requirements_dev_Darwin.txt diff --git a/model_signing/install/requirements_dev_Linux.txt b/install/requirements_dev_Linux.txt similarity index 100% rename from model_signing/install/requirements_dev_Linux.txt rename to install/requirements_dev_Linux.txt diff --git a/model_signing/install/requirements_test.in b/install/requirements_test.in similarity index 100% rename from model_signing/install/requirements_test.in rename to install/requirements_test.in diff --git a/model_signing/install/requirements_test_Darwin.txt b/install/requirements_test_Darwin.txt similarity index 100% rename from model_signing/install/requirements_test_Darwin.txt rename to install/requirements_test_Darwin.txt diff --git a/model_signing/install/requirements_test_Linux.txt b/install/requirements_test_Linux.txt similarity index 100% rename from model_signing/install/requirements_test_Linux.txt rename to install/requirements_test_Linux.txt diff --git a/model_signing/install/requirements_test_Windows.txt b/install/requirements_test_Windows.txt similarity index 100% rename from model_signing/install/requirements_test_Windows.txt rename to install/requirements_test_Windows.txt diff --git a/model_signing/benchmarks/run.sh b/model_signing/benchmarks/run.sh deleted file mode 100644 index 4c2e0542..00000000 --- a/model_signing/benchmarks/run.sh +++ /dev/null @@ -1,169 +0,0 @@ -#!/bin/bash -set -euo pipefail - -if [ "$#" -lt 2 ]; then - echo "Usage: $0 identity-provider identity output_path " - echo "Example: $0 https://accounts.google.com myemail@gmail.com" - exit 1 -fi - -time_cmd() { - local cmd="$1" - local arguments="$2" - # shellcheck disable=SC2086 # We want word splitting - { time "${cmd}" ${arguments} >/dev/null; } 2>&1 | grep real | cut -f2 -} - -run() { - local model_name="$1" - local model_path="$2" - local model_init="$3" - - echo "Initializing ${model_name} ..." - eval "${model_init}" - # Replace the '/' character. - model_name="${model_name/\//_}" - - echo "Running sign / verify for ${model_name} ..." - results["${model_name}[size]"]=$(du -hs "${model_path}" | cut -f1) - results["${model_name}[sign_time]"]=$(time_cmd python3 "main.py sign --path ${model_path}") - results["${model_name}[verify_time]"]=$(time_cmd python3 "main.py verify --path ${model_path} --identity-provider ${identity_provider} --identity ${identity}") - if [[ "${cleanup}" == "true" ]]; then - rm -rf "${model_path}" "${model_path}.sig" 2>/dev/null || true - fi -} - -# shellcheck disable=SC2317 # Called via model_init(). -download_github_repository() { - local repository="$1" - local model_path="$2" - - # We download the zip which does _not_ contain the .git folder. - wget "https://github.com/${repository}/archive/main.zip" -O "${model_path}".zip - mkdir -p "${model_path}" - shopt -s dotglob - cd "${model_path}" && unzip ../"${model_path}".zip && rm ../"${model_path}".zip && mv "${model_path}"-main/* . && rmdir "${model_path}"-main/ && cd - - shopt -u dotglob -} - -# shellcheck disable=SC2317 # Called via model_init(). -download_hf_repository() { - local repository="$1" - local model_path="$2" - git clone --depth=1 "https://huggingface.co/${repository}" "${model_path}" - # We delete the .git folder. - rm -rf "${model_path}"/.git -} - -# User inputs. -identity_provider="$1" -identity="$2" -cleanup="" - -if [ "$#" -eq 3 ]; then - cleanup="$3" -fi - -echo -echo "INFO: Be patient, this will take a few minutes!" -echo - -# Variable holding results. -declare -A results - -# Init the environment. -if [[ ! -d "test_env/" ]]; then - python3 -m venv test_env -fi -# shellcheck disable=SC1091 # We have access to source=test_env/bin/activate. -source test_env/bin/activate -python3 -m pip install --require-hashes -r install/requirements_Linux.txt - -# ========================================= -# Warm up! -# ========================================= -# We need to have the identity in the environment, so perform one signature. -file=$(mktemp) -python3 main.py sign --path "${file}" -python3 main.py verify --path "${file}" --identity-provider "${identity_provider}" --identity "${identity}" -rm "${file}" "${file}.sig" - -# ========================================= -# PyTorch YOLOP model -# ========================================= -model_name=hustvl/YOLOP -model_path=$(echo "${model_name}" | cut -d/ -f2) -# shellcheck disable=SC2317 # Reachable via run() call. -model_init() { - if [[ ! -d "${model_path}" ]]; then - download_github_repository "${model_name}" "${model_path}" - fi -} -run "${model_name}" "${model_path}" model_init - -# ========================================= -# ONNX Roberta-base-11 model -# ========================================= -model_name=roberta-base-11 -model_path="${model_name}.onnx" -# shellcheck disable=SC2317 # Reachable via run() call. -model_init() { - if [[ ! -f "${model_path}" ]]; then - wget "https://github.com/onnx/models/tree/857a3434216bd6f2be1ea1ff045fb94a437cbe10/text/machine_comprehension/roberta/model/${model_name}.onnx" - fi -} -run "${model_name}" "${model_path}" model_init - -# ========================================= -# tfhub bertseq2seq model -# ========================================= -model_name=bertseq2seq -model_path="${model_name}" -# shellcheck disable=SC2317 # Reachable via run() call. -model_init() { - if [[ ! -d "${model_path}" ]]; then - wget "https://tfhub.dev/google/bertseq2seq/bert24_en_de/1?tf-hub-format=compressed" -O "${model_path}".tgz - mkdir -p "${model_path}" - cd "${model_path}" && tar xvzf ../"${model_path}".tgz && rm ../"${model_path}".tgz && cd - - fi -} -run "${model_name}" "${model_path}" model_init - -# ========================================= -# Huggingface bert base model -# (Tensorflow and PyTorch) -# ========================================= -model_name=bert-base-uncased -model_path="${model_name}" -# shellcheck disable=SC2317 # Reachable via run() call. -model_init() { - if [[ ! -d "${model_path}" ]]; then - download_hf_repository "${model_name}" "${model_path}" - fi -} -run "${model_name}" "${model_path}" model_init - -# ========================================= -# PyTorch falcon-7b model -# ========================================= -model_name=tiiuae/falcon-7b -model_path=$(echo "${model_name}" | cut -d/ -f2) -# shellcheck disable=SC2317 # Reachable via run() call. -model_init() { - if [[ ! -d "${model_path}" ]]; then - download_hf_repository "${model_name}" "${model_path}" - fi -} -run "${model_name}" "${model_path}" model_init - - -echo -echo "===== RESULTS ======" -# NOTE: Requires bash >= 4.4. -echo "results:" "${!results[@]}" -mapfile -d '' sorted < <(printf '%s\0' "${!results[@]}" | sort -z) -for key in "${sorted[@]}"; do - echo "$key = ${results[${key}]}" -done - -deactivate diff --git a/model_signing/main.py b/model_signing/main.py deleted file mode 100644 index 6194c39b..00000000 --- a/model_signing/main.py +++ /dev/null @@ -1,104 +0,0 @@ -# Copyright 2024 The Sigstore Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import argparse -import sys -from pathlib import Path -import model - - -# https://github.com/sigstore/sigstore-python/issues/661 -# contains the logic to start the web browser. - -def readOptions(): - parser = argparse.ArgumentParser("CLI for signing AI models") - subcommands = parser.add_subparsers(required=True, dest="subcommand") - - # TODO: option for a path to store the signature. - # Sign group. - sign = subcommands.add_parser( - "sign", formatter_class=argparse.ArgumentDefaultsHelpFormatter - ) - sign.add_argument("--path", required=True, help="The path to sign") - sign.add_argument("--disable-ambient", required=False, - default=False, action='store_true', - help="Auto detect ambient authority") - - # Verify group. - verify = subcommands.add_parser( - "verify", formatter_class=argparse.ArgumentDefaultsHelpFormatter - ) - verify.add_argument("--path", required=True, - help="The path to a file to verify") - verify.add_argument("--identity", required=True, - help="The identity (email, workload identity) to " + - "verify") - verify.add_argument("--identity-provider", required=True, - help="The OIDC provider to verify") - - args = parser.parse_args() - return args - - -def signature_path(modelfn: Path) -> Path: - if modelfn.is_file(): - return Path(modelfn.parent).joinpath(f"{modelfn.name}.sig") - return modelfn.joinpath("model.sig") - - -def ignored_paths(modelfn: Path) -> [Path]: - if modelfn.is_file(): - return [] - return [modelfn.joinpath(".git")] - - -# Sign function -def sign(modelfn: Path, disable_ambient: bool) -> model.SignatureResult: - signer = model.SigstoreSigner(disable_ambient=disable_ambient) - return signer.sign(modelfn, signature_path(modelfn), - ignored_paths(modelfn)) - - -def verify(modelfn: Path, issuer: str, identity: str, - offline=False) -> model.VerificationResult: - verifier = model.SigstoreVerifier(oidc_provider=issuer, identity=identity) - return verifier.verify(modelfn, signature_path(modelfn), - ignored_paths(modelfn), offline) - - -def main(args) -> int: - if args.subcommand == "sign": - result = sign(Path(args.path), disable_ambient=args.disable_ambient) - if result: - print("signature success") - else: - print(f"signature failure: {str(result)}") - return -1 - elif args.subcommand == "verify": - modelfn = Path(args.path) - result = verify(modelfn=modelfn, - issuer=args.identity_provider, - identity=args.identity) - if result: - print("verification success") - else: - print(f"verification failure: {str(result)}") - return -1 - return 0 - - -if __name__ == '__main__': - args = readOptions() - - sys.exit(main(args)) diff --git a/model_signing/model.py b/model_signing/model.py deleted file mode 100644 index fc55ffa5..00000000 --- a/model_signing/model.py +++ /dev/null @@ -1,161 +0,0 @@ -# Copyright 2024 The Sigstore Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from sigstore.sign import SigningContext - -from sigstore.oidc import ( - IdentityToken, - ExpiredIdentity, - Issuer, - detect_credential, -) -from sigstore.models import Bundle - -from sigstore.verify import ( - policy, - Verifier, -) - -from sigstore._internal.fulcio.client import ( - ExpiredCertificate, -) - -import io -from pathlib import Path -from typing import Optional -from serialize import Serializer -import psutil -import sys - - -def chunk_size() -> int: - return int(psutil.virtual_memory().available // 2) - - -# TODO: Update this class to have a status instead of success. -class BaseResult: - def __init__(self, success: bool = True, reason: str = "success"): - self.success = success - self.reason = reason - - def __bool__(self) -> bool: - return self.success - - def __str__(self) -> str: - return f"success=\"{self.success}\" reason=\"{self.reason}\"" - - -class SignatureResult(BaseResult): - pass - - -class SigstoreSigner(): - def __init__(self, - disable_ambient: bool = False, - start_default_browser: bool = False, - oidc_issuer: str = None): - self.signing_ctx = SigningContext.production() - self.disable_ambient = disable_ambient - self.start_default_browser = start_default_browser - self.oidc_issuer = oidc_issuer - # NOTE: The client ID to use during OAuth2 flow. - self.client_id = "sigstore" - - def get_identity_token(self) -> Optional[IdentityToken]: - token: IdentityToken - client_id = self.client_id - if not self.disable_ambient: - token = detect_credential() - # Happy path: we've detected an ambient credential, - # so we can return early. - if token: - return IdentityToken(token) - - # TODO(): Support staging for testing. - if self.oidc_issuer is not None: - issuer = Issuer(self.oidc_issuer) - else: - issuer = Issuer.production() - - token = issuer.identity_token(client_id=client_id, - force_oob=not self.start_default_browser) - return token - - # NOTE: Only path in the top-level folder are considered for ignorepaths. - def sign(self, inputfn: Path, signaturefn: Path, - ignorepaths: [Path]) -> SignatureResult: - try: - oidc_token = self.get_identity_token() - if not oidc_token: - raise ValueError("No identity token supplied or detected!") - # Calling the private attribute IdentityToken._federated issuer - # is a workaround for earlier versions of sigstore-python (<3.0.0) - # that do not support the federated_issuer property. - print(f"identity-provider: {oidc_token._federated_issuer}", - file=sys.stderr) - print(f"identity: {oidc_token.identity}", file=sys.stderr) - - contentio = io.BytesIO(Serializer.serialize_v1( - inputfn, chunk_size(), signaturefn, ignorepaths)) - with self.signing_ctx.signer(oidc_token) as signer: - result = signer.sign_artifact(input_=contentio) - with signaturefn.open(mode="w") as b: - print(result.to_json(), file=b) - return SignatureResult() - except ExpiredIdentity: - return SignatureResult(success=False, - reason="exception caught: Signature failed: identity token has expired") # noqa: E501 - except ExpiredCertificate: - return SignatureResult(success=False, - reason="exception caught: Signature failed: Fulcio signing certificate has expired") # noqa: E501 - except Exception as e: - return SignatureResult(success=False, - reason=f"exception caught: {str(e)}") - - -# TODO: re-visit error handling and use a verbosity mode -# to avoid leaking info -class VerificationResult(BaseResult): - pass - - -class SigstoreVerifier(): - def __init__(self, oidc_provider: str, identity: str): - self.oidc_provider = oidc_provider - self.identity = identity - self.verifier = Verifier.production() - - # NOTE: Only path in the top-level folder are considered for ignorepaths. - def verify(self, inputfn: Path, signaturefn: Path, - ignorepaths: [Path], offline: bool) -> VerificationResult: - try: - bundle_bytes = signaturefn.read_bytes() - bundle = Bundle.from_json(bundle_bytes) - - contentio = io.BytesIO(Serializer.serialize_v1( - inputfn, chunk_size(), signaturefn, ignorepaths)) - policy_ = policy.Identity( - identity=self.identity, - issuer=self.oidc_provider, - ) - result = self.verifier.verify_artifact(input_=contentio, - bundle=bundle, - policy=policy_) - if result is None: - return VerificationResult() - return VerificationResult(success=False, reason=result.reason) - except Exception as e: - return VerificationResult(success=False, - reason=f"exception caught: {str(e)}") - raise ValueError("unreachable") diff --git a/model_signing/serialize.py b/model_signing/serialize.py deleted file mode 100644 index 3c3ba0f1..00000000 --- a/model_signing/serialize.py +++ /dev/null @@ -1,392 +0,0 @@ -# Copyright 2024 The Sigstore Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import hashlib -import base64 -import os -from concurrent.futures import ProcessPoolExecutor -from multiprocessing import get_start_method, set_start_method -from pathlib import Path -import platform - -# Use for testing while keeping disk size low. -allow_symlinks = False - - -class Hasher: - @staticmethod - def node_header(name: str, ty: str) -> bytes: - header = ty.encode('utf-8') + b'.' + \ - base64.b64encode(name.encode('utf-8')) + b'.' - return header - - @staticmethod - def root_folder(path: Path, content: bytes) -> str: - return Hasher._node_folder_compute(name="root", content=content) - - @staticmethod - def node_folder(path: Path, content: bytes) -> str: - return Hasher._node_folder_compute(name=path.name, content=content) - - @staticmethod - def _node_folder_compute(name: str, content: bytes) -> bytes: - value = Hasher.node_header(name, "dir") + content - return hashlib.sha256(value).digest() - - @staticmethod - def root_file(path: Path, chunk: int) -> bytes: - return Hasher._node_file_compute(path, b'', chunk) - - @staticmethod - def node_file(path: Path, chunk: int = 0) -> bytes: - if not path.is_file(): - raise ValueError(f"path {path} is not a file") - header = Hasher.node_header(path.name, "file") - return Hasher._node_file_compute(path, header, chunk) - - @staticmethod - def _node_file_compute(path: Path, header: bytes, chunk: int) -> bytes: - h = hashlib.sha256(header) - with open(path, "rb") as f: - if chunk == 0: - all_data = f.read() - h.update(all_data) - else: - # Compute the hash by reading chunk bytes at a time. - while True: - chunk_data = f.read(chunk) - if not chunk_data: - break - h.update(chunk_data) - return h.digest() - - @staticmethod - def _node_file_compute_v1(path: Path, header: bytes, - start: int, end: int, chunk: int) -> bytes: - h = hashlib.sha256(header) - with open(path, "rb") as f: - # WARNING: We must start reading the file at the starting offset. - f.seek(start) - # Read all at once. - if chunk == 0 or chunk >= (end - start): - content = f.read(end - start) - # print(f"all: {f.name}: {start}-{end}") - h.update(content) - else: - # Compute the hash by reading chunk bytes at a time. - remains = end - start - while remains != 0: - # read = (end - start) - remains - # print(f"loop {i}: {f.name}: - # {read}-{read + min(chunk, remains)}") - processed = min(chunk, remains) - chunk_data = f.read(processed) - if processed != len(chunk_data): - raise ValueError("internal: unread bytes: " + - f"{processed} != {len(chunk_data)}") - if not chunk_data: - raise ValueError("internal: no data: " + - f"filename={str(path)}, " + - f"remains={remains}, " + - f"{processed} != {len(chunk_data)}") - h.update(chunk_data) - remains -= processed - return h.digest() - - -def remove_prefix(text, prefix): - if text.startswith(prefix): - return text[len(prefix):] - return text - - -def validate_signature_path(model_path: Path, sig_path: Path): - if model_path.is_file(): - return - # Note: Only allow top-level folder to have the signature for simplicity. - if sig_path is not None and sig_path.is_relative_to(model_path) and \ - sig_path.parent != model_path: - raise ValueError(f"{sig_path} must be in the folder root") - - -def is_relative_to(p: Path, path_list: [Path]) -> bool: - for e in path_list: - if p.is_relative_to(e): - return True - return False - - -# TODO(): add a context "AI model"? -class Serializer: - @staticmethod - # TODO: type of returned value. - def _ordered_files(path: Path, ignorepaths: [Path]) -> []: - children: [Path] - if path.is_file(): - children = [path] - else: - # NOTE: the parent (..) and current directory (.) are not present. - # NOTE: this returns hidden files as well. - # TODO: tests that this pattern reports all files, - # regardless of their depth. - children = sorted(path.glob("**/*")) - - filtered = [] - total_size = 0 - for child in children: - if is_relative_to(child, ignorepaths): - continue - - # To avoid bugs where we read the link rather than its target, - # we don't allow symlinks for now. - # NOTE: It seems that Python's read() *always* follows symlinks, - # so it may be safe to allow them. (readlink() is the function - # to read the link metadata). - if not allow_symlinks and child.is_symlink(): - raise ValueError(f"{str(child)} is symlink") - - if not child.is_file() and not child.is_dir(): - raise ValueError(f"{str(child)} is not a dir or file") - - # The recorded path must *not* contains the folder name, - # since users may rename it. - record_path = remove_prefix( - str(child.as_posix()), str(path.as_posix() + '/')) - record_type = "file" if child.is_file() else "dir" - record_size = \ - os.path.getsize(str(child)) if record_type == "file" else 0 - filtered += [(record_path, record_type, record_size)] - total_size += record_size - return filtered - - @staticmethod - # TODO: type of returned value. - def _create_tasks(children: [], shard_size: int) -> [[]]: - tasks = [[]] * 0 - curr_file = 0 - curr_pos = 0 - - while True: - # All files have been processed. - if curr_file >= len(children): - break - - name, typ, size = children[curr_file] - - # It's a directory. - # NOTE: It is fast to compute the hash because there's no data - # besides the name and the type. - # TODO(#12): do we need this at all? This only matters - # if we care about empty directories, since non-empty ones have - # their file + path recorded. - if typ == "dir": - # Record the task. - tasks += [(name, typ, 0, size)] - curr_file += 1 - curr_pos = 0 - continue - - # It's a file. - - # Sanity checks. - if size <= curr_pos and size > 0: - raise ValueError(f"internal: size={size}, " + - f"curr_pos={curr_pos} " + - f"for {children[curr_file]}") - - # Compute the number of bytes to process. - remains = size - curr_pos - if remains < 0: - raise ValueError(f"internal: remains is {remains}") - processed = min(remains, shard_size) - end_pos = curr_pos + processed - - # Record the task. - tasks += [(name, typ, curr_pos, end_pos)] - - # Update position. - curr_pos += processed - - # If we have processed all bytes, we move on to the next file. - if remains == processed: - curr_file += 1 - curr_pos = 0 - return tasks - - @staticmethod - # TODO: type of tasks - def _run_tasks(path: Path, chunk: int, tasks: []) -> bytes: - # See https://superfastpython.com/processpoolexecutor-in-python/ - # NOTE: 32 = length of sha256 digest. - digest_len = 32 - all_hashes = [None] * (digest_len*len(tasks)) - org_len = len(all_hashes) - - # Use fork on Linux as it's supposed to be faster. - if platform.system() == "Linux" and get_start_method() != "fork": - set_start_method('fork') - with ProcessPoolExecutor() as ppe: - futures = [ppe.submit(Serializer.task, (path, chunk, task)) - for task in tasks] - results = [f.result() for f in futures] - for i, result in enumerate(results): - all_hashes[i*digest_len:(i+1)*digest_len] = result - # Sanity check. - if len(all_hashes) != org_len: - raise ValueError(f"internal: {len(all_hashes)} != {org_len}") - return bytes(all_hashes) - - @staticmethod - # TODO: type of task_info. - def task(task_info: []): - # NOTE: we can get process info using: - # from multiprocessing import current_process - # worker = current_process() - # print(f'Task {task_info}, - # worker name={worker.name}, pid={worker.pid}', flush=True) - - model_path, chunk, (name, ty, start_pos, end_pos) = task_info - - # Header format is: "type.b64(filename).start-end." - header = ty.encode('utf-8') + b'.' + \ - base64.b64encode(name.encode('utf-8')) + \ - b'.' + f"{start_pos}-{end_pos}".encode('utf-8') + b'.' - - # To hash a directory, we use "none" content. - # TODO(#12): do we need this at all? This only matters - # if we care about empty directories, since non-empty ones have - # their file + path recorded. - if ty == "dir": - value = header + b'none' - return hashlib.sha256(value).digest() - - # We need to hash a file. - - # The model is a directory. - if model_path.is_dir(): - return Hasher._node_file_compute_v1(model_path.joinpath(name), - header, start_pos, - end_pos, chunk) - - # The model is a single file. - # We update the file name to a generic "root". - header = ty.encode('utf-8') + b'.' + \ - base64.b64encode("root".encode('utf-8')) + \ - b'.' + f"{start_pos}-{end_pos}".encode('utf-8') + b'.' - return Hasher._node_file_compute_v1(name, - header, start_pos, end_pos, chunk) - - @staticmethod - def _serialize_v1(path: Path, chunk: int, shard: int, signature_path: Path, - ignorepaths: [Path] = []) -> bytes: - if not path.exists(): - raise ValueError(f"{str(path)} does not exist") - - if not allow_symlinks and path.is_symlink(): - raise ValueError(f"{str(path)} is a symlink") - - if chunk < 0: - raise ValueError(f"{str(chunk)} is invalid") - - if not path.is_file() and not path.is_dir(): - raise ValueError(f"{str(path)} is not a dir or file") - - # Validate the signature path. - validate_signature_path(path, signature_path) - - # Children to hash. - children = Serializer._ordered_files(path, - [signature_path] + ignorepaths) - - # We shard the computation by creating independent "tasks". - if shard < 0: - raise ValueError(f"{str(shard)} is invalid") - tasks = Serializer._create_tasks(children, shard) - - # Share the computation of hashes. - # For simplicity, we pre-allocate the entire array that will hold - # the concatenation of all hashes. - all_hashes = Serializer._run_tasks(path, chunk, tasks) - - # Finally, we hash everything. - return hashlib.sha256(bytes(all_hashes)).digest() - - def serialize_v1(path: Path, chunk: int, signature_path: Path, - ignorepaths: [Path] = []) -> bytes: - # NOTE: The shard size must be the same for all clients for - # compatibility. We could make it configurable; but in this - # case the signature file must contain the value used by the signer. - shard_size = 1000000000 # 1GB - return Serializer._serialize_v1(path, chunk, shard_size, - signature_path, ignorepaths) - - @staticmethod - def serialize_v0(path: Path, chunk: int, signature_path: Path, - ignorepaths: [Path] = []) -> bytes: - if not path.exists(): - raise ValueError(f"{str(path)} does not exist") - - if not allow_symlinks and path.is_symlink(): - raise ValueError(f"{str(path)} is a symlink") - - if chunk < 0: - raise ValueError(f"{str(chunk)} is invalid") - - if path.is_file(): - return Hasher.root_file(path, chunk) - - if not path.is_dir(): - raise ValueError(f"{str(path)} is not a dir") - - # Validate the signature path. - validate_signature_path(path, signature_path) - - children = sorted([x for x in path.iterdir() - if x != signature_path and x not in ignorepaths]) - # TODO: remove this special case? - if len(children) == 0: - return Hasher.root_folder(path, b"empty") - - hash = hashlib.sha256() - for child in children: - child_hash = Serializer._serialize_node(child, chunk, " ", - ignorepaths) - hash.update(child_hash) - content = hash.digest() - return Hasher.root_folder(path, content) - - @staticmethod - def _serialize_node(path: Path, chunk: int, indent="", - ignorepaths: [Path] = []) -> bytes: - if not allow_symlinks and path.is_symlink(): - raise ValueError(f"{str(path)} is a symlink") - - if path.is_file(): - return Hasher.node_file(path, chunk) - - if not path.is_dir(): - raise ValueError(f"{str(path)} is not a dir") - - children = sorted([x for x in path.iterdir() if x not in ignorepaths]) - # TODO: remove this special case? - if len(children) == 0: - return Hasher.node_folder(path, b"empty") - - hash = hashlib.sha256() - for child in children: - child_hash = Serializer._serialize_node(child, chunk, indent + " ", - ignorepaths) - hash.update(child_hash) - content = hash.digest() - return Hasher.node_folder(path, content) diff --git a/model_signing/serialize_test.py b/model_signing/serialize_test.py deleted file mode 100644 index 2afc46e8..00000000 --- a/model_signing/serialize_test.py +++ /dev/null @@ -1,818 +0,0 @@ -# Copyright 2024 The Sigstore Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -from pathlib import Path -import pytest -from model_signing.serialize import Serializer -import shutil - - -testdata_dir = "testdata" - - -# Utility functions. -def create_empty_folder(name: str) -> Path: - p = os.path.join(os.getcwd(), testdata_dir, name) - os.makedirs(p) - return Path(p) - - -def create_random_folders(name: str) -> (Path, int, [Path], [Path]): - p = os.path.join(os.getcwd(), testdata_dir, name) - - content = os.urandom(1) - dirs = [p] - # Generate 8 directories. - for i in range(8): - bit = (content[0] >> i) & 1 - if bit > 0: - # Add depth to the previously-created directory. - dirs[-1] = os.path.join(dirs[-1], "dir_%d" % i) - else: - # Add a directory in the same directory as the previous entry. - parent = os.path.dirname(dirs[-1]) - if Path(parent) == Path(p).parent: - parent = str(p) - dirs += [os.path.join(parent, "dir_%d" % i)] - for d in dirs: - os.makedirs(d) - - # Create at most 3 files in each directory. - files = [] - for d in dirs: - b = os.urandom(1) - n = b[0] & 3 - for i in range(n): - files += [os.path.join(d, "file_%d" % n)] - content = os.urandom(28) - with open(files[-1], "wb") as f: - f.write(content) - - return Path(p), 28, [Path(d) for d in sorted(dirs)], [Path(f) for f in sorted(files)] # noqa: E501 ignore long line warning - - -def create_symlinks(src: str, dst: str) -> Path: - psrc = os.path.join(os.getcwd(), testdata_dir, src) - pdst = os.path.join(os.getcwd(), testdata_dir, dst) - os.symlink(psrc, pdst) - return Path(dst) - - -def cleanup_model(p: Path) -> None: - if p.is_dir(): - shutil.rmtree(p) - elif p.is_file(): - os.unlink(p) - try: - os.unlink(p.with_suffix(".sig")) - except FileNotFoundError: - pass - - -def create_file(name: str, data: bytes) -> Path: - p = os.path.join(os.getcwd(), testdata_dir, name) - with open(p, "wb") as f: - f.write(data) - return Path(p) - - -def create_random_file(name: str, size: int) -> (Path, bytes): - p = os.path.join(os.getcwd(), testdata_dir, name) - content = os.urandom(size) - with open(p, "wb") as f: - f.write(content) - return Path(p), content - - -def signature_path(model: Path) -> Path: - if model.is_file(): - return model.with_suffix(".sig") - return model.joinpath("model.sig") - - -class Test_serialize_v0: - # File serialization works. - def test_known_file(self): - file = "v0_test_known_file" - data = b"hellow world content" - model = create_file(file, data) - sig_path = signature_path(model) - expected = b'x\x9d\xa4N\x9f\xeajd\xd8\x87\x84\x1a\xd3\xb3\xfc\xeb\xf6\r\x01\x9fi8#\xd8qU\x90\xca\x9d\x83\xe1\x8b' # noqa: E501 ignore long line warning - computed = Serializer.serialize_v0(model, 0, sig_path) - assert (computed == expected) - cleanup_model(model) - - # File serialization returns the same results for different chunk sizes. - def test_file_chunks(self): - file = "v0_test_file_chunks" - file_size = 999 - model, _ = create_random_file(file, file_size) - sig_path = signature_path(model) - result = Serializer.serialize_v0(model, 0, sig_path) - # NOTE: we want to also test a chunk size larger than the files size. - for c in range(1, file_size + 1): - r = Serializer.serialize_v0(model, c, sig_path) - assert (r == result) - cleanup_model(model) - - # File serialization raises error for negative chunk values. - def test_file_negative_chunks(self): - file = "v0_test_file_negative_chunks" - data = b"hellow world content" - model = create_file(file, data) - sig_path = signature_path(model) - with pytest.raises(ValueError): - _ = Serializer.serialize_v0(model, -1, sig_path) - cleanup_model(model) - - # File serialization returns the same results for different file names. - def test_different_filename(self): - file = "v0_test_different_filename" - data = b"hellow world content" - model = create_file(file, data) - sig_path = signature_path(model) - r0 = Serializer.serialize_v0(model, 0, sig_path) - cleanup_model(model) - - file = "v0_test_different_filename2" - model = create_file(file, data) - sig_path = signature_path(model) - r1 = Serializer.serialize_v0(model, 0, sig_path) - cleanup_model(model) - - assert (r0 == r1) - - # File serialization returns a different result for different model - # contents. - def test_altered_file(self): - file = "v0_test_altered_file" - file_size = 999 - model, content = create_random_file(file, file_size) - sig_path = signature_path(model) - result = Serializer.serialize_v0(model, 0, sig_path) - for c in range(file_size): - altered_content = content[:c] + bytes([content[c] ^ 1]) + \ - content[c+1:] - altered_file = file + (".%d" % c) - altered_model = create_file(altered_file, altered_content) - altered_sig_path = signature_path(altered_model) - altered_result = Serializer.serialize_v0(altered_model, 0, - altered_sig_path) - assert (altered_result != result) - cleanup_model(altered_model) - cleanup_model(model) - - # symlink in root folder raises ValueError exception. - def test_folder_symlink_root(self): - folder = "v0_test_folder_symlink_root" - model = create_empty_folder(folder) - sig = signature_path(model) - create_symlinks(".", os.path.join(folder, "root_link")) - with pytest.raises(ValueError): - Serializer.serialize_v0(Path(folder), 0, sig) - cleanup_model(model) - - # symlink in non-root folder raises ValueError exception. - def test_folder_symlink_nonroot(self): - model = create_empty_folder("v0_test_folder_symlink_nonroot") - sub_folder = model.joinpath("sub") - create_empty_folder(str(sub_folder)) - sig = signature_path(model) - create_symlinks(".", os.path.join(sub_folder, "sub_link")) - with pytest.raises(ValueError): - Serializer.serialize_v0(model, 0, sig) - cleanup_model(model) - - # Folder serialization works. - def test_known_folder(self): - folder = "v0_test_known_folder" - model = create_empty_folder(folder) - sig = signature_path(model) - os.mkdir(model.joinpath("dir1")) - os.mkdir(model.joinpath("dir2")) - os.mkdir(model.joinpath("dir3")) - with open(model.joinpath("dir1", "f11"), "wb") as f: - f.write(b"content f11") - with open(model.joinpath("dir1", "f12"), "wb") as f: - f.write(b"content f12") - with open(model.joinpath("dir3", "f31"), "wb") as f: - f.write(b"content f31") - result = Serializer.serialize_v0(model, 0, sig) - expected = b's\xac\xf7\xbdC\x14\x97fv\x97\x9c\xd3\xe4=,\xe7\x99.d(oP\xff\xe2\xd8~\xa2\x9cS\xe2/\xd9' # noqa: E501 ignore long line warning - assert (result == expected) - cleanup_model(model) - - # Folder serialization raises error for negative chunk values. - def test_folder_negative_chunks(self): - dir = "v0_test_folder_negative_chunks" - model = create_empty_folder(dir) - sig_path = signature_path(model) - with pytest.raises(ValueError): - _ = Serializer.serialize_v0(model, -1, sig_path) - cleanup_model(model) - - # Folder serialization returns the same results for different folder names. - def test_different_dirname(self): - folder = "v0_test_different_dirname" - model = create_empty_folder(folder) - sig = signature_path(model) - os.mkdir(model.joinpath("dir1")) - os.mkdir(model.joinpath("dir2")) - os.mkdir(model.joinpath("dir3")) - with open(model.joinpath("dir1", "f11"), "wb") as f: - f.write(b"content f11") - with open(model.joinpath("dir1", "f12"), "wb") as f: - f.write(b"content f12") - with open(model.joinpath("dir3", "f31"), "wb") as f: - f.write(b"content f31") - r0 = Serializer.serialize_v0(model, 0, sig) - - # Rename the folder. - new_model = model.parent.joinpath("model_dir2") - os.rename(model, new_model) - sig_path = signature_path(new_model) - r1 = Serializer.serialize_v0(new_model, 0, sig_path) - cleanup_model(new_model) - - assert (r0 == r1) - - # Folder serialization returns the same results for different folder or - # file names and / or file contents. - def test_different_ignored_paths(self): - folder = "v0_test_different_ignored_paths" - model = create_empty_folder(folder) - sig = signature_path(model) - os.mkdir(model.joinpath("dir1")) - os.mkdir(model.joinpath("dir2")) - os.mkdir(model.joinpath("dir2/dir3")) - with open(model.joinpath("dir1", "f11"), "wb") as f: - f.write(b"content f11") - with open(model.joinpath("dir2", "f21"), "wb") as f: - f.write(b"content f21") - with open(model.joinpath("dir2/dir3", "f31"), "wb") as f: - f.write(b"content f31") - r0 = Serializer.serialize_v1(model, 0, sig) - r1 = Serializer.serialize_v0(model, 0, sig, [model.joinpath("dir1")]) - r2 = Serializer.serialize_v0(model, 0, sig, [model.joinpath("dir2")]) - r3 = Serializer.serialize_v0(model, 0, sig, [model.joinpath("dir2/dir3")]) # noqa: E501 ignore long line warning - r4 = Serializer.serialize_v0(model, 0, sig, [model.joinpath("dir2/dir3/f31")]) # noqa: E501 ignore long line warning - - # Sanity checks. - s = set({r0, r1, r2, r3, r4}) - assert (len(s) == 5) - - # Rename the file under dir1. - new_file = model.joinpath("dir1/f11_altered") - os.rename(model.joinpath("dir1/f11"), new_file) - r11 = Serializer.serialize_v0(model, 0, sig, [model.joinpath("dir1")]) - assert (r11 == r1) - os.rename(new_file, model.joinpath("dir1/f11")) - - # Update the file under dir1. - r11 = Serializer.serialize_v0(model, 0, sig, [model.joinpath("dir1")]) - with open(model.joinpath("dir1", "f11"), "wb") as f: - f.write(b"content f11 altered") - assert (r11 == r1) - with open(model.joinpath("dir1", "f11"), "wb") as f: - f.write(b"content f11") - - # Rename the folder dir2. - new_dir = model.joinpath("dir2/dir3_altered") - os.rename(model.joinpath("dir2/dir3"), new_dir) - r22 = Serializer.serialize_v0(model, 0, sig, [model.joinpath("dir2")]) - assert (r22 == r2) - os.rename(new_dir, model.joinpath("dir2/dir3")) - - # Add a file under dir2. - with open(model.joinpath("dir2", "new_file"), "wb") as f: - f.write(b"new file!!") - r22 = Serializer.serialize_v0(model, 0, sig, [model.joinpath("dir2")]) - assert (r22 == r2) - os.unlink(model.joinpath("dir2", "new_file")) - - # Update the content of f31 file. - with open(model.joinpath("dir2/dir3", "f31"), "wb") as f: - f.write(b"content f31 altered") - r22 = Serializer.serialize_v0(model, 0, sig, [model.joinpath("dir2")]) - assert (r22 == r2) - r33 = Serializer.serialize_v0(model, 0, sig, [model.joinpath("dir2/dir3")]) # noqa: E501 ignore long line warning - assert (r33 == r3) - r44 = Serializer.serialize_v0(model, 0, sig, [model.joinpath("dir2/dir3/f31")]) # noqa: E501 ignore long line warning - assert (r44 == r4) - with open(model.joinpath("dir2/dir3", "f31"), "wb") as f: - f.write(b"content f31") - - cleanup_model(model) - - # Folder serialization returns different results - # for an empty file or directory with the same name. - def test_file_dir(self): - folder = "v0_test_file_dir" - model = create_empty_folder(folder) - sig = signature_path(model) - os.mkdir(model.joinpath("dir1")) - os.mkdir(model.joinpath("dir2")) - os.mkdir(model.joinpath("dir3")) - with open(model.joinpath("dir1", "f11"), "wb") as f: - f.write(b"content f11") - with open(model.joinpath("dir1", "f12"), "wb") as f: - f.write(b"content f12") - with open(model.joinpath("dir3", "f31"), "wb") as f: - f.write(b"content f31") - r0 = Serializer.serialize_v0(model, 0, sig) - - # Remove dir2 and create an empty file with the same name. - dir2 = model.joinpath("dir2") - os.rmdir(dir2) - with open(dir2, 'w') as _: - pass - r1 = Serializer.serialize_v0(model, 0, sig) - assert (r0 != r1) - cleanup_model(model) - - # Folder serialization return different values for different - # sub-directory names. - def test_random_folder_different_folder_names(self): - dir = "v0_test_random_folder_different_folder_names" - model, _, dirs, _ = create_random_folders(dir) - sig_path = signature_path(model) - result = Serializer.serialize_v0(model, 0, sig_path) - for d in dirs: - if d == model: - # Ignore the model folder. - continue - new_folder = d.parent.joinpath(d.name + "_altered") - os.rename(d, new_folder) - r = Serializer.serialize_v0(model, 0, sig_path) - os.rename(new_folder, d) - assert (r != result) - cleanup_model(model) - - # Folder serialization return different values for different file names. - def test_random_folder_different_filenames(self): - dir = "v0_test_random_folder_different_filenames" - model, _, _, files = create_random_folders(dir) - sig_path = signature_path(model) - result = Serializer.serialize_v0(model, 0, sig_path) - for f in files: - new_file = f.parent.joinpath(f.name + "_altered") - os.rename(f, new_file) - r = Serializer.serialize_v0(model, 0, sig_path) - os.rename(new_file, f) - assert (r != result) - cleanup_model(model) - - # Folder serialization return different values for different file contents. - def test_random_folder_different_file_content(self): - dir = "v0_test_random_folder_different_file_content" - model, _, _, files = create_random_folders(dir) - sig_path = signature_path(model) - result = Serializer.serialize_v0(model, 0, sig_path) - for f in files: - content = b'' - with open(f, "rb") as ff: - content = ff.read() - for c in range(len(content)): - # Alter the file content, one byte at a time. - altered_content = content[:c] + bytes([content[c] ^ 1]) + \ - content[c+1:] - with open(f, "wb") as ff: - ff.write(altered_content) - r = Serializer.serialize_v0(model, 0, sig_path) - assert (r != result) - # Write the original content back to the file. - with open(f, "wb") as ff: - ff.write(content) - cleanup_model(model) - - # Folder serialization return same results for different chunk sizes. - def test_random_folder_different_chunks(self): - dir = "v0_test_random_folder_different_chunks" - model, max_size, _, _ = create_random_folders(dir) - sig_path = signature_path(model) - result = Serializer.serialize_v0(model, 0, sig_path) - # NOTE: we want to also test a chunk size larger than the files size. - for c in range(1, max_size + 1): - r = Serializer.serialize_v0(model, c, sig_path) - assert (r == result) - cleanup_model(model) - - # Folder serialization raises an exception if the signature - # file is not in the root folder. - def test_folfer_invalid_sign_path(self): - dir = "v0_test_folfer_invalid_sign_path" - model = create_empty_folder(dir) - sig_path = model.joinpath("sub/model.sig") - with pytest.raises(ValueError): - _ = Serializer.serialize_v0(model, 0, sig_path) - cleanup_model(model) - - -class Test_serialize_v1: - # File serialization works. - def test_known_file(self): - file = "v1_test_known_file" - data = b"hellow world content" - model = create_file(file, data) - sig_path = signature_path(model) - expected = b'\xfd\xe0s^{ \xf8\xed\xb4\x9c\xbf\xc0\xf6\x87\x0f\x1a\x896~\xeeBH\xec\xf57<\x9d\x04B"7\xb1' # noqa: E501 ignore long line warning - computed = Serializer.serialize_v1(model, 0, sig_path) - assert (computed == expected) - cleanup_model(model) - - # File serialization returns the same results for different chunk sizes. - def test_file_chunks(self): - file = "v1_test_file_chunks" - file_size = 99 - model, _ = create_random_file(file, file_size) - sig_path = signature_path(model) - result = Serializer.serialize_v1(model, 0, sig_path) - # NOTE: we want to also test a chunk size larger than the files size. - for c in range(1, file_size + 1): - r = Serializer.serialize_v1(model, c, sig_path) - assert (r == result) - cleanup_model(model) - - # File serialization raises an exception for negative shard sizes. - def test_file_negative_shards(self): - file = "v1_test_file_negative_shards" - data = b"hellow world content" - model = create_file(file, data) - sig_path = signature_path(model) - with pytest.raises(ValueError): - _ = Serializer._serialize_v1(model, 0, -1, sig_path) - cleanup_model(model) - - # File serialization returns different results for different shard sizes. - def test_file_shards(self): - file = "v1_test_file_shards" - file_size = 99 - model, _ = create_random_file(file, file_size) - sig_path = signature_path(model) - result = Serializer._serialize_v1(model, 1, 1, sig_path) - results = [result] - for shard in range(2, file_size + 1): - r = Serializer._serialize_v1(model, 1, shard, sig_path) - assert (r not in results) - results += [r] - cleanup_model(model) - - # File serialization returns different results for different shard sizes - # but same results for different chunk sizes with shard size fixed. - def test_file_shard_chunks(self): - file = "v1_test_file_shard_chunks" - file_size = 21 - model, _ = create_random_file(file, file_size) - sig_path = signature_path(model) - result = Serializer._serialize_v1(model, 1, 1, sig_path) - results = [result] - for shard in range(2, file_size + 1): - r = Serializer._serialize_v1(model, 1, shard, sig_path) - assert (r not in results) - results += [r] - for c in range(1, file_size + 1): - rc = Serializer._serialize_v1(model, c, shard, sig_path) - assert (rc == r) - cleanup_model(model) - - # File serialization returns the same results for different file names. - def test_different_filename(self): - file = "v1_test_different_filename" - data = b"hellow world content" - model = create_file(file, data) - sig_path = signature_path(model) - r0 = Serializer.serialize_v1(model, 0, sig_path) - cleanup_model(model) - - file = "v1_test_different_filename2" - model = create_file(file, data) - sig_path = signature_path(model) - r1 = Serializer.serialize_v1(model, 0, sig_path) - cleanup_model(model) - - assert (r0 == r1) - - # File serialization returns a different result for different model - # contents. - def test_altered_file(self): - file = "v1_test_altered_file" - file_size = 99 - model, content = create_random_file(file, file_size) - sig_path = signature_path(model) - result = Serializer._serialize_v1(model, 0, 19, sig_path) - for c in range(file_size): - altered_content = content[:c] + bytes([content[c] ^ 1]) + \ - content[c+1:] - altered_file = file + (".%d" % c) - altered_model = create_file(altered_file, altered_content) - altered_sig_path = signature_path(altered_model) - altered_result = Serializer._serialize_v1(altered_model, 0, - 19, altered_sig_path) - assert (altered_result != result) - cleanup_model(altered_model) - cleanup_model(model) - - # File serialization works on large files. - def test_large_file(self): - file = "v1_test_large_file" - file_size = 1000100001 - model, _ = create_random_file(file, file_size) - sig_path = signature_path(model) - _ = Serializer.serialize_v1(model, 0, sig_path) - cleanup_model(model) - - # symlink in root folder raises ValueError exception. - def test_folder_symlink_root(self): - folder = "v1_test_folder_symlink_root" - model = create_empty_folder(folder) - sig = signature_path(model) - create_symlinks(".", os.path.join(folder, "root_link")) - with pytest.raises(ValueError): - Serializer.serialize_v1(Path(folder), 0, sig) - cleanup_model(model) - - # symlink in non-root folder raises ValueError exception. - def test_folder_symlink_nonroot(self): - model = create_empty_folder("v1_test_folder_symlink_nonroot") - sub_folder = model.joinpath("sub") - create_empty_folder(str(sub_folder)) - sig = signature_path(model) - create_symlinks(".", os.path.join(sub_folder, "sub_link")) - with pytest.raises(ValueError): - Serializer.serialize_v1(model, 0, sig) - cleanup_model(model) - - # Folder serialization works. - def test_known_folder(self): - folder = "v1_test_known_folder" - model = create_empty_folder(folder) - sig = signature_path(model) - os.mkdir(model.joinpath("dir1")) - os.mkdir(model.joinpath("dir2")) - os.mkdir(model.joinpath("dir3")) - with open(model.joinpath("dir1", "f11"), "wb") as f: - f.write(b"content f11") - with open(model.joinpath("dir1", "f12"), "wb") as f: - f.write(b"content f12") - with open(model.joinpath("dir3", "f31"), "wb") as f: - f.write(b"content f31") - result = Serializer.serialize_v1(model, 0, sig) - expected = b'\x8b\xc3\xdc\xf1\xaf\xd8\x1b\x1f\xa0\x18&\x0eo|\xc4\xc6f~]]\xd6\x91\x15\x94-Vm\xf6\xa5\xed\xc8L' # noqa: E501 ignore long line warning - assert (result == expected) - cleanup_model(model) - - # Folder serialization raises error for negative chunk values. - def test_folder_negative_chunks(self): - dir = "v1_test_folder_negative_chunks" - model = create_empty_folder(dir) - sig_path = signature_path(model) - with pytest.raises(ValueError): - _ = Serializer.serialize_v1(model, -1, sig_path) - cleanup_model(model) - - # Folder serialization returns the same results for different folder names. - def test_different_dirname(self): - folder = "v1_test_different_dirname" - model = create_empty_folder(folder) - sig = signature_path(model) - os.mkdir(model.joinpath("dir1")) - os.mkdir(model.joinpath("dir2")) - os.mkdir(model.joinpath("dir3")) - with open(model.joinpath("dir1", "f11"), "wb") as f: - f.write(b"content f11") - with open(model.joinpath("dir1", "f12"), "wb") as f: - f.write(b"content f12") - with open(model.joinpath("dir3", "f31"), "wb") as f: - f.write(b"content f31") - r0 = Serializer.serialize_v1(model, 0, sig) - - # Rename the folder. - new_model = model.parent.joinpath("model_dir2") - os.rename(model, new_model) - sig_path = signature_path(new_model) - r1 = Serializer.serialize_v1(new_model, 0, sig_path) - cleanup_model(new_model) - - assert (r0 == r1) - - # Folder serialization returns the same results for different folder or - # file names and / or file contents. - def test_different_ignored_paths(self): - folder = "v1_test_different_ignored_paths" - model = create_empty_folder(folder) - sig = signature_path(model) - os.mkdir(model.joinpath("dir1")) - os.mkdir(model.joinpath("dir2")) - os.mkdir(model.joinpath("dir2/dir3")) - with open(model.joinpath("dir1", "f11"), "wb") as f: - f.write(b"content f11") - with open(model.joinpath("dir2", "f21"), "wb") as f: - f.write(b"content f21") - with open(model.joinpath("dir2/dir3", "f31"), "wb") as f: - f.write(b"content f31") - r0 = Serializer.serialize_v1(model, 0, sig) - r1 = Serializer.serialize_v1(model, 0, sig, [model.joinpath("dir1")]) - r2 = Serializer.serialize_v1(model, 0, sig, [model.joinpath("dir2")]) - r3 = Serializer.serialize_v1(model, 0, sig, [model.joinpath("dir2/dir3")]) # noqa: E501 ignore long line warning - r4 = Serializer.serialize_v1(model, 0, sig, [model.joinpath("dir2/dir3/f31")]) # noqa: E501 ignore long line warning - - # Sanity checks. - s = set({r0, r1, r2, r3, r4}) - assert (len(s) == 5) - - # Rename the file under dir1. - new_file = model.joinpath("dir1/f11_altered") - os.rename(model.joinpath("dir1/f11"), new_file) - r11 = Serializer.serialize_v1(model, 0, sig, [model.joinpath("dir1")]) - assert (r11 == r1) - os.rename(new_file, model.joinpath("dir1/f11")) - - # Update the file under dir1. - r11 = Serializer.serialize_v1(model, 0, sig, [model.joinpath("dir1")]) - with open(model.joinpath("dir1", "f11"), "wb") as f: - f.write(b"content f11 altered") - assert (r11 == r1) - with open(model.joinpath("dir1", "f11"), "wb") as f: - f.write(b"content f11") - - # Rename the folder dir2. - new_dir = model.joinpath("dir2/dir3_altered") - os.rename(model.joinpath("dir2/dir3"), new_dir) - r22 = Serializer.serialize_v1(model, 0, sig, [model.joinpath("dir2")]) - assert (r22 == r2) - os.rename(new_dir, model.joinpath("dir2/dir3")) - - # Add a file under dir2. - with open(model.joinpath("dir2", "new_file"), "wb") as f: - f.write(b"new file!!") - r22 = Serializer.serialize_v1(model, 0, sig, [model.joinpath("dir2")]) - assert (r22 == r2) - os.unlink(model.joinpath("dir2", "new_file")) - - # Update the content of f31 file. - with open(model.joinpath("dir2/dir3", "f31"), "wb") as f: - f.write(b"content f31 altered") - r22 = Serializer.serialize_v1(model, 0, sig, [model.joinpath("dir2")]) - assert (r22 == r2) - r33 = Serializer.serialize_v1(model, 0, sig, [model.joinpath("dir2/dir3")]) # noqa: E501 ignore long line warning - assert (r33 == r3) - r44 = Serializer.serialize_v1(model, 0, sig, [model.joinpath("dir2/dir3/f31")]) # noqa: E501 ignore long line warning - assert (r44 == r4) - with open(model.joinpath("dir2/dir3", "f31"), "wb") as f: - f.write(b"content f31") - - cleanup_model(model) - - # Folder serialization returns different results - # for an empty file or directory with the same name. - def test_file_dir(self): - folder = "v1_test_file_dir" - model = create_empty_folder(folder) - sig = signature_path(model) - os.mkdir(model.joinpath("dir1")) - os.mkdir(model.joinpath("dir2")) - os.mkdir(model.joinpath("dir3")) - with open(model.joinpath("dir1", "f11"), "wb") as f: - f.write(b"content f11") - with open(model.joinpath("dir1", "f12"), "wb") as f: - f.write(b"content f12") - with open(model.joinpath("dir3", "f31"), "wb") as f: - f.write(b"content f31") - r0 = Serializer.serialize_v1(model, 0, sig) - - # Remove dir2 and create an empty file with the same name. - dir2 = model.joinpath("dir2") - os.rmdir(dir2) - with open(dir2, 'w') as _: - pass - r1 = Serializer.serialize_v1(model, 0, sig) - assert (r0 != r1) - cleanup_model(model) - - # Folder serialization return different values for different - # sub-directory names. - def test_random_folder_different_folder_names(self): - dir = "v1_test_random_folder_different_folder_names" - model, _, dirs, _ = create_random_folders(dir) - sig_path = signature_path(model) - result = Serializer.serialize_v1(model, 0, sig_path) - for d in dirs: - if d == model: - # Ignore the model folder. - continue - new_folder = d.parent.joinpath(d.name + "_altered") - os.rename(d, new_folder) - r = Serializer.serialize_v1(model, 0, sig_path) - os.rename(new_folder, d) - assert (r != result) - cleanup_model(model) - - # Folder serialization return different values for different file names. - def test_random_folder_different_filenames(self): - dir = "v1_test_random_folder_different_filenames" - model, _, _, files = create_random_folders(dir) - sig_path = signature_path(model) - result = Serializer.serialize_v1(model, 0, sig_path) - for f in files: - new_file = f.parent.joinpath(f.name + "_altered") - os.rename(f, new_file) - r = Serializer.serialize_v1(model, 0, sig_path) - os.rename(new_file, f) - assert (r != result) - cleanup_model(model) - - # Folder serialization return different values for different file contents. - def test_random_folder_different_file_content(self): - dir = "v1_test_random_folder_different_file_content" - model, _, _, files = create_random_folders(dir) - sig_path = signature_path(model) - result = Serializer.serialize_v1(model, 0, sig_path) - for f in files: - content = b'' - with open(f, "rb") as ff: - content = ff.read() - for c in range(len(content)): - # Alter the file content, one byte at a time. - altered_content = content[:c] + bytes([content[c] ^ 1]) + \ - content[c+1:] - with open(f, "wb") as ff: - ff.write(altered_content) - r = Serializer.serialize_v1(model, 0, sig_path) - assert (r != result) - # Write the original content back to the file. - with open(f, "wb") as ff: - ff.write(content) - cleanup_model(model) - - # Folder serialization return same results for different chunk sizes. - def test_random_folder_different_chunks(self): - dir = "v1_test_random_folder_different_chunks" - model, max_size, _, _ = create_random_folders(dir) - sig_path = signature_path(model) - result = Serializer.serialize_v1(model, 0, sig_path) - # NOTE: we want to also test a chunk size larger than the files size. - for c in range(1, max_size + 1): - r = Serializer.serialize_v1(model, c, sig_path) - assert (r == result) - cleanup_model(model) - - # Folder serialization raises an exception if the signature - # file is not in the root folder. - def test_folfer_invalid_sign_path(self): - dir = "v1_test_folfer_invalid_sign_path" - model = create_empty_folder(dir) - sig_path = model.joinpath("sub/model.sig") - with pytest.raises(ValueError): - _ = Serializer.serialize_v1(model, 0, sig_path) - cleanup_model(model) - - # Folder serialization raises an exception for negative shard sizes. - def test_folder_negative_shards(self): - folder = "v1_test_folder_negative_shards" - model = create_empty_folder(folder) - sig_path = signature_path(model) - with pytest.raises(ValueError): - _ = Serializer._serialize_v1(model, 0, -1, sig_path) - cleanup_model(model) - - # Folder serialization returns different results for different shard sizes. - def test_folder_shards(self): - dir = "v1_test_folder_shards" - model, max_size, _, files = create_random_folders(dir) - sig_path = signature_path(model) - result = Serializer._serialize_v1(model, 1, 1, sig_path) - results = [result] - for shard in range(2, max_size + 1): - r = Serializer._serialize_v1(model, 1, shard, sig_path) - assert (r not in results) - results += [r] - cleanup_model(model) - - # Folder serialization returns different results for different shard sizes - # but same results for different chunk sizes with shard size fixed. - def test_folder_shard_chunks(self): - dir = "v1_test_folder_shard_chunks" - model, max_size, _, _ = create_random_folders(dir) - sig_path = signature_path(model) - result = Serializer._serialize_v1(model, 1, 1, sig_path) - results = [result] - for shard in range(2, max_size + 1): - r = Serializer._serialize_v1(model, 1, shard, sig_path) - assert (r not in results) - results += [r] - for c in range(1, max_size + 1): - rc = Serializer._serialize_v1(model, c, shard, sig_path) - assert (rc == r) - cleanup_model(model) diff --git a/model_signing/pyproject.toml b/pyproject.toml similarity index 100% rename from model_signing/pyproject.toml rename to pyproject.toml diff --git a/model_signing/__init__.py b/src/model_signing/__init__.py similarity index 100% rename from model_signing/__init__.py rename to src/model_signing/__init__.py diff --git a/model_signing/hashing/__init__.py b/src/model_signing/hashing/__init__.py similarity index 100% rename from model_signing/hashing/__init__.py rename to src/model_signing/hashing/__init__.py diff --git a/model_signing/hashing/file.py b/src/model_signing/hashing/file.py similarity index 100% rename from model_signing/hashing/file.py rename to src/model_signing/hashing/file.py diff --git a/model_signing/hashing/hashing.py b/src/model_signing/hashing/hashing.py similarity index 100% rename from model_signing/hashing/hashing.py rename to src/model_signing/hashing/hashing.py diff --git a/model_signing/hashing/memory.py b/src/model_signing/hashing/memory.py similarity index 100% rename from model_signing/hashing/memory.py rename to src/model_signing/hashing/memory.py diff --git a/model_signing/manifest/__init__.py b/src/model_signing/manifest/__init__.py similarity index 100% rename from model_signing/manifest/__init__.py rename to src/model_signing/manifest/__init__.py diff --git a/model_signing/manifest/manifest.py b/src/model_signing/manifest/manifest.py similarity index 100% rename from model_signing/manifest/manifest.py rename to src/model_signing/manifest/manifest.py diff --git a/model_signing/serialization/__init__.py b/src/model_signing/serialization/__init__.py similarity index 100% rename from model_signing/serialization/__init__.py rename to src/model_signing/serialization/__init__.py diff --git a/model_signing/serialization/serialization.py b/src/model_signing/serialization/serialization.py similarity index 100% rename from model_signing/serialization/serialization.py rename to src/model_signing/serialization/serialization.py diff --git a/model_signing/serialization/serialize_by_file.py b/src/model_signing/serialization/serialize_by_file.py similarity index 100% rename from model_signing/serialization/serialize_by_file.py rename to src/model_signing/serialization/serialize_by_file.py diff --git a/model_signing/serialization/serialize_by_file_shard.py b/src/model_signing/serialization/serialize_by_file_shard.py similarity index 100% rename from model_signing/serialization/serialize_by_file_shard.py rename to src/model_signing/serialization/serialize_by_file_shard.py diff --git a/model_signing/signature/__init__.py b/src/model_signing/signature/__init__.py similarity index 100% rename from model_signing/signature/__init__.py rename to src/model_signing/signature/__init__.py diff --git a/model_signing/signature/encoding.py b/src/model_signing/signature/encoding.py similarity index 100% rename from model_signing/signature/encoding.py rename to src/model_signing/signature/encoding.py diff --git a/model_signing/signature/fake.py b/src/model_signing/signature/fake.py similarity index 100% rename from model_signing/signature/fake.py rename to src/model_signing/signature/fake.py diff --git a/model_signing/signature/key.py b/src/model_signing/signature/key.py similarity index 100% rename from model_signing/signature/key.py rename to src/model_signing/signature/key.py diff --git a/model_signing/signature/pki.py b/src/model_signing/signature/pki.py similarity index 100% rename from model_signing/signature/pki.py rename to src/model_signing/signature/pki.py diff --git a/model_signing/signature/signing.py b/src/model_signing/signature/signing.py similarity index 100% rename from model_signing/signature/signing.py rename to src/model_signing/signature/signing.py diff --git a/model_signing/signature/sigstore.py b/src/model_signing/signature/sigstore.py similarity index 100% rename from model_signing/signature/sigstore.py rename to src/model_signing/signature/sigstore.py diff --git a/model_signing/signature/verifying.py b/src/model_signing/signature/verifying.py similarity index 100% rename from model_signing/signature/verifying.py rename to src/model_signing/signature/verifying.py diff --git a/model_signing/signing/__init__.py b/src/model_signing/signing/__init__.py similarity index 100% rename from model_signing/signing/__init__.py rename to src/model_signing/signing/__init__.py diff --git a/model_signing/signing/as_bytes.py b/src/model_signing/signing/as_bytes.py similarity index 100% rename from model_signing/signing/as_bytes.py rename to src/model_signing/signing/as_bytes.py diff --git a/model_signing/signing/empty_signing.py b/src/model_signing/signing/empty_signing.py similarity index 100% rename from model_signing/signing/empty_signing.py rename to src/model_signing/signing/empty_signing.py diff --git a/model_signing/signing/in_toto.py b/src/model_signing/signing/in_toto.py similarity index 100% rename from model_signing/signing/in_toto.py rename to src/model_signing/signing/in_toto.py diff --git a/model_signing/signing/signing.py b/src/model_signing/signing/signing.py similarity index 100% rename from model_signing/signing/signing.py rename to src/model_signing/signing/signing.py diff --git a/model_signing/signing/sigstore.py b/src/model_signing/signing/sigstore.py similarity index 100% rename from model_signing/signing/sigstore.py rename to src/model_signing/signing/sigstore.py diff --git a/model_signing/conftest.py b/tests/conftest.py similarity index 100% rename from model_signing/conftest.py rename to tests/conftest.py diff --git a/model_signing/hashing/file_test.py b/tests/hashing/file_test.py similarity index 100% rename from model_signing/hashing/file_test.py rename to tests/hashing/file_test.py diff --git a/model_signing/hashing/memory_test.py b/tests/hashing/memory_test.py similarity index 100% rename from model_signing/hashing/memory_test.py rename to tests/hashing/memory_test.py diff --git a/model_signing/manifest/manifest_test.py b/tests/manifest/manifest_test.py similarity index 100% rename from model_signing/manifest/manifest_test.py rename to tests/manifest/manifest_test.py diff --git a/model_signing/serialization/serialize_by_file_shard_test.py b/tests/serialization/serialize_by_file_shard_test.py similarity index 100% rename from model_signing/serialization/serialize_by_file_shard_test.py rename to tests/serialization/serialize_by_file_shard_test.py diff --git a/model_signing/serialization/serialize_by_file_test.py b/tests/serialization/serialize_by_file_test.py similarity index 100% rename from model_signing/serialization/serialize_by_file_test.py rename to tests/serialization/serialize_by_file_test.py diff --git a/model_signing/serialization/testdata/serialize_by_file/TestDigestSerializer/deep_model_folder b/tests/serialization/testdata/serialize_by_file/TestDigestSerializer/deep_model_folder similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file/TestDigestSerializer/deep_model_folder rename to tests/serialization/testdata/serialize_by_file/TestDigestSerializer/deep_model_folder diff --git a/model_signing/serialization/testdata/serialize_by_file/TestDigestSerializer/empty_model_file b/tests/serialization/testdata/serialize_by_file/TestDigestSerializer/empty_model_file similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file/TestDigestSerializer/empty_model_file rename to tests/serialization/testdata/serialize_by_file/TestDigestSerializer/empty_model_file diff --git a/model_signing/serialization/testdata/serialize_by_file/TestDigestSerializer/empty_model_folder b/tests/serialization/testdata/serialize_by_file/TestDigestSerializer/empty_model_folder similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file/TestDigestSerializer/empty_model_folder rename to tests/serialization/testdata/serialize_by_file/TestDigestSerializer/empty_model_folder diff --git a/model_signing/serialization/testdata/serialize_by_file/TestDigestSerializer/model_folder_with_empty_file b/tests/serialization/testdata/serialize_by_file/TestDigestSerializer/model_folder_with_empty_file similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file/TestDigestSerializer/model_folder_with_empty_file rename to tests/serialization/testdata/serialize_by_file/TestDigestSerializer/model_folder_with_empty_file diff --git a/model_signing/serialization/testdata/serialize_by_file/TestDigestSerializer/sample_model_file b/tests/serialization/testdata/serialize_by_file/TestDigestSerializer/sample_model_file similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file/TestDigestSerializer/sample_model_file rename to tests/serialization/testdata/serialize_by_file/TestDigestSerializer/sample_model_file diff --git a/model_signing/serialization/testdata/serialize_by_file/TestDigestSerializer/sample_model_folder b/tests/serialization/testdata/serialize_by_file/TestDigestSerializer/sample_model_folder similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file/TestDigestSerializer/sample_model_folder rename to tests/serialization/testdata/serialize_by_file/TestDigestSerializer/sample_model_folder diff --git a/model_signing/serialization/testdata/serialize_by_file/TestDigestSerializer/symlink_model_folder b/tests/serialization/testdata/serialize_by_file/TestDigestSerializer/symlink_model_folder similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file/TestDigestSerializer/symlink_model_folder rename to tests/serialization/testdata/serialize_by_file/TestDigestSerializer/symlink_model_folder diff --git a/model_signing/serialization/testdata/serialize_by_file/TestManifestSerializer/deep_model_folder b/tests/serialization/testdata/serialize_by_file/TestManifestSerializer/deep_model_folder similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file/TestManifestSerializer/deep_model_folder rename to tests/serialization/testdata/serialize_by_file/TestManifestSerializer/deep_model_folder diff --git a/model_signing/serialization/testdata/serialize_by_file/TestManifestSerializer/empty_model_file b/tests/serialization/testdata/serialize_by_file/TestManifestSerializer/empty_model_file similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file/TestManifestSerializer/empty_model_file rename to tests/serialization/testdata/serialize_by_file/TestManifestSerializer/empty_model_file diff --git a/model_signing/serialization/testdata/serialize_by_file/TestManifestSerializer/empty_model_folder b/tests/serialization/testdata/serialize_by_file/TestManifestSerializer/empty_model_folder similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file/TestManifestSerializer/empty_model_folder rename to tests/serialization/testdata/serialize_by_file/TestManifestSerializer/empty_model_folder diff --git a/model_signing/serialization/testdata/serialize_by_file/TestManifestSerializer/model_folder_with_empty_file b/tests/serialization/testdata/serialize_by_file/TestManifestSerializer/model_folder_with_empty_file similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file/TestManifestSerializer/model_folder_with_empty_file rename to tests/serialization/testdata/serialize_by_file/TestManifestSerializer/model_folder_with_empty_file diff --git a/model_signing/serialization/testdata/serialize_by_file/TestManifestSerializer/sample_model_file b/tests/serialization/testdata/serialize_by_file/TestManifestSerializer/sample_model_file similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file/TestManifestSerializer/sample_model_file rename to tests/serialization/testdata/serialize_by_file/TestManifestSerializer/sample_model_file diff --git a/model_signing/serialization/testdata/serialize_by_file/TestManifestSerializer/sample_model_folder b/tests/serialization/testdata/serialize_by_file/TestManifestSerializer/sample_model_folder similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file/TestManifestSerializer/sample_model_folder rename to tests/serialization/testdata/serialize_by_file/TestManifestSerializer/sample_model_folder diff --git a/model_signing/serialization/testdata/serialize_by_file/TestManifestSerializer/symlink_model_folder b/tests/serialization/testdata/serialize_by_file/TestManifestSerializer/symlink_model_folder similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file/TestManifestSerializer/symlink_model_folder rename to tests/serialization/testdata/serialize_by_file/TestManifestSerializer/symlink_model_folder diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/deep_model_folder b/tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/deep_model_folder similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/deep_model_folder rename to tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/deep_model_folder diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/deep_model_folder_small_shards b/tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/deep_model_folder_small_shards similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/deep_model_folder_small_shards rename to tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/deep_model_folder_small_shards diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/empty_model_file b/tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/empty_model_file similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/empty_model_file rename to tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/empty_model_file diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/empty_model_file_small_shards b/tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/empty_model_file_small_shards similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/empty_model_file_small_shards rename to tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/empty_model_file_small_shards diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/empty_model_folder b/tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/empty_model_folder similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/empty_model_folder rename to tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/empty_model_folder diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/empty_model_folder_small_shards b/tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/empty_model_folder_small_shards similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/empty_model_folder_small_shards rename to tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/empty_model_folder_small_shards diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/model_folder_with_empty_file b/tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/model_folder_with_empty_file similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/model_folder_with_empty_file rename to tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/model_folder_with_empty_file diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/model_folder_with_empty_file_small_shards b/tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/model_folder_with_empty_file_small_shards similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/model_folder_with_empty_file_small_shards rename to tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/model_folder_with_empty_file_small_shards diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/sample_model_file b/tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/sample_model_file similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/sample_model_file rename to tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/sample_model_file diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/sample_model_file_small_shards b/tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/sample_model_file_small_shards similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/sample_model_file_small_shards rename to tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/sample_model_file_small_shards diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/sample_model_folder b/tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/sample_model_folder similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/sample_model_folder rename to tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/sample_model_folder diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/sample_model_folder_small_shards b/tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/sample_model_folder_small_shards similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/sample_model_folder_small_shards rename to tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/sample_model_folder_small_shards diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/symlink_model_folder b/tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/symlink_model_folder similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/symlink_model_folder rename to tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/symlink_model_folder diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/symlink_model_folder_small_shards b/tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/symlink_model_folder_small_shards similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/symlink_model_folder_small_shards rename to tests/serialization/testdata/serialize_by_file_shard/TestDigestSerializer/symlink_model_folder_small_shards diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/deep_model_folder b/tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/deep_model_folder similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/deep_model_folder rename to tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/deep_model_folder diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/deep_model_folder_small_shards b/tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/deep_model_folder_small_shards similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/deep_model_folder_small_shards rename to tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/deep_model_folder_small_shards diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/empty_model_file b/tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/empty_model_file similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/empty_model_file rename to tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/empty_model_file diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/empty_model_file_small_shards b/tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/empty_model_file_small_shards similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/empty_model_file_small_shards rename to tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/empty_model_file_small_shards diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/empty_model_folder b/tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/empty_model_folder similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/empty_model_folder rename to tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/empty_model_folder diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/empty_model_folder_small_shards b/tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/empty_model_folder_small_shards similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/empty_model_folder_small_shards rename to tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/empty_model_folder_small_shards diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/model_folder_with_empty_file b/tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/model_folder_with_empty_file similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/model_folder_with_empty_file rename to tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/model_folder_with_empty_file diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/model_folder_with_empty_file_small_shards b/tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/model_folder_with_empty_file_small_shards similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/model_folder_with_empty_file_small_shards rename to tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/model_folder_with_empty_file_small_shards diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/sample_model_file b/tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/sample_model_file similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/sample_model_file rename to tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/sample_model_file diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/sample_model_file_small_shards b/tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/sample_model_file_small_shards similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/sample_model_file_small_shards rename to tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/sample_model_file_small_shards diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/sample_model_folder b/tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/sample_model_folder similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/sample_model_folder rename to tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/sample_model_folder diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/sample_model_folder_small_shards b/tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/sample_model_folder_small_shards similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/sample_model_folder_small_shards rename to tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/sample_model_folder_small_shards diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/symlink_model_file b/tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/symlink_model_file similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/symlink_model_file rename to tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/symlink_model_file diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/symlink_model_folder b/tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/symlink_model_folder similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/symlink_model_folder rename to tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/symlink_model_folder diff --git a/model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/symlink_model_folder_small_shards b/tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/symlink_model_folder_small_shards similarity index 100% rename from model_signing/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/symlink_model_folder_small_shards rename to tests/serialization/testdata/serialize_by_file_shard/TestManifestSerializer/symlink_model_folder_small_shards diff --git a/model_signing/signature/key_test.py b/tests/signature/key_test.py similarity index 100% rename from model_signing/signature/key_test.py rename to tests/signature/key_test.py diff --git a/model_signing/signing/as_bytes_test.py b/tests/signing/as_bytes_test.py similarity index 100% rename from model_signing/signing/as_bytes_test.py rename to tests/signing/as_bytes_test.py diff --git a/model_signing/signing/empty_signing_test.py b/tests/signing/empty_signing_test.py similarity index 100% rename from model_signing/signing/empty_signing_test.py rename to tests/signing/empty_signing_test.py diff --git a/model_signing/signing/in_toto_test.py b/tests/signing/in_toto_test.py similarity index 100% rename from model_signing/signing/in_toto_test.py rename to tests/signing/in_toto_test.py diff --git a/model_signing/signing/testdata/as_bytes/TestBytesPayload/deep_model_folder b/tests/signing/testdata/as_bytes/TestBytesPayload/deep_model_folder similarity index 100% rename from model_signing/signing/testdata/as_bytes/TestBytesPayload/deep_model_folder rename to tests/signing/testdata/as_bytes/TestBytesPayload/deep_model_folder diff --git a/model_signing/signing/testdata/as_bytes/TestBytesPayload/empty_model_file b/tests/signing/testdata/as_bytes/TestBytesPayload/empty_model_file similarity index 100% rename from model_signing/signing/testdata/as_bytes/TestBytesPayload/empty_model_file rename to tests/signing/testdata/as_bytes/TestBytesPayload/empty_model_file diff --git a/model_signing/signing/testdata/as_bytes/TestBytesPayload/empty_model_folder b/tests/signing/testdata/as_bytes/TestBytesPayload/empty_model_folder similarity index 100% rename from model_signing/signing/testdata/as_bytes/TestBytesPayload/empty_model_folder rename to tests/signing/testdata/as_bytes/TestBytesPayload/empty_model_folder diff --git a/model_signing/signing/testdata/as_bytes/TestBytesPayload/model_folder_with_empty_file b/tests/signing/testdata/as_bytes/TestBytesPayload/model_folder_with_empty_file similarity index 100% rename from model_signing/signing/testdata/as_bytes/TestBytesPayload/model_folder_with_empty_file rename to tests/signing/testdata/as_bytes/TestBytesPayload/model_folder_with_empty_file diff --git a/model_signing/signing/testdata/as_bytes/TestBytesPayload/sample_model_file b/tests/signing/testdata/as_bytes/TestBytesPayload/sample_model_file similarity index 100% rename from model_signing/signing/testdata/as_bytes/TestBytesPayload/sample_model_file rename to tests/signing/testdata/as_bytes/TestBytesPayload/sample_model_file diff --git a/model_signing/signing/testdata/as_bytes/TestBytesPayload/sample_model_folder b/tests/signing/testdata/as_bytes/TestBytesPayload/sample_model_folder similarity index 100% rename from model_signing/signing/testdata/as_bytes/TestBytesPayload/sample_model_folder rename to tests/signing/testdata/as_bytes/TestBytesPayload/sample_model_folder diff --git a/model_signing/signing/testdata/as_bytes/TestBytesPayload/symlink_model_folder b/tests/signing/testdata/as_bytes/TestBytesPayload/symlink_model_folder similarity index 100% rename from model_signing/signing/testdata/as_bytes/TestBytesPayload/symlink_model_folder rename to tests/signing/testdata/as_bytes/TestBytesPayload/symlink_model_folder diff --git a/model_signing/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/deep_model_folder b/tests/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/deep_model_folder similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/deep_model_folder rename to tests/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/deep_model_folder diff --git a/model_signing/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/empty_model_file b/tests/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/empty_model_file similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/empty_model_file rename to tests/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/empty_model_file diff --git a/model_signing/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/empty_model_folder b/tests/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/empty_model_folder similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/empty_model_folder rename to tests/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/empty_model_folder diff --git a/model_signing/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/model_folder_with_empty_file b/tests/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/model_folder_with_empty_file similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/model_folder_with_empty_file rename to tests/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/model_folder_with_empty_file diff --git a/model_signing/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/sample_model_file b/tests/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/sample_model_file similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/sample_model_file rename to tests/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/sample_model_file diff --git a/model_signing/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/sample_model_folder b/tests/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/sample_model_folder similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/sample_model_folder rename to tests/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/sample_model_folder diff --git a/model_signing/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/symlink_model_folder b/tests/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/symlink_model_folder similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/symlink_model_folder rename to tests/signing/testdata/in_toto/TestDigestOfDigestsIntotoPayload/symlink_model_folder diff --git a/model_signing/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/deep_model_folder b/tests/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/deep_model_folder similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/deep_model_folder rename to tests/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/deep_model_folder diff --git a/model_signing/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/empty_model_file b/tests/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/empty_model_file similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/empty_model_file rename to tests/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/empty_model_file diff --git a/model_signing/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/empty_model_folder b/tests/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/empty_model_folder similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/empty_model_folder rename to tests/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/empty_model_folder diff --git a/model_signing/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/model_folder_with_empty_file b/tests/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/model_folder_with_empty_file similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/model_folder_with_empty_file rename to tests/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/model_folder_with_empty_file diff --git a/model_signing/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/sample_model_file b/tests/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/sample_model_file similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/sample_model_file rename to tests/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/sample_model_file diff --git a/model_signing/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/sample_model_folder b/tests/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/sample_model_folder similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/sample_model_folder rename to tests/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/sample_model_folder diff --git a/model_signing/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/symlink_model_folder b/tests/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/symlink_model_folder similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/symlink_model_folder rename to tests/signing/testdata/in_toto/TestDigestOfShardDigestsIntotoPayload/symlink_model_folder diff --git a/model_signing/signing/testdata/in_toto/TestDigestsIntotoPayload/deep_model_folder b/tests/signing/testdata/in_toto/TestDigestsIntotoPayload/deep_model_folder similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestsIntotoPayload/deep_model_folder rename to tests/signing/testdata/in_toto/TestDigestsIntotoPayload/deep_model_folder diff --git a/model_signing/signing/testdata/in_toto/TestDigestsIntotoPayload/empty_model_file b/tests/signing/testdata/in_toto/TestDigestsIntotoPayload/empty_model_file similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestsIntotoPayload/empty_model_file rename to tests/signing/testdata/in_toto/TestDigestsIntotoPayload/empty_model_file diff --git a/model_signing/signing/testdata/in_toto/TestDigestsIntotoPayload/empty_model_folder b/tests/signing/testdata/in_toto/TestDigestsIntotoPayload/empty_model_folder similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestsIntotoPayload/empty_model_folder rename to tests/signing/testdata/in_toto/TestDigestsIntotoPayload/empty_model_folder diff --git a/model_signing/signing/testdata/in_toto/TestDigestsIntotoPayload/model_folder_with_empty_file b/tests/signing/testdata/in_toto/TestDigestsIntotoPayload/model_folder_with_empty_file similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestsIntotoPayload/model_folder_with_empty_file rename to tests/signing/testdata/in_toto/TestDigestsIntotoPayload/model_folder_with_empty_file diff --git a/model_signing/signing/testdata/in_toto/TestDigestsIntotoPayload/sample_model_file b/tests/signing/testdata/in_toto/TestDigestsIntotoPayload/sample_model_file similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestsIntotoPayload/sample_model_file rename to tests/signing/testdata/in_toto/TestDigestsIntotoPayload/sample_model_file diff --git a/model_signing/signing/testdata/in_toto/TestDigestsIntotoPayload/sample_model_folder b/tests/signing/testdata/in_toto/TestDigestsIntotoPayload/sample_model_folder similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestsIntotoPayload/sample_model_folder rename to tests/signing/testdata/in_toto/TestDigestsIntotoPayload/sample_model_folder diff --git a/model_signing/signing/testdata/in_toto/TestDigestsIntotoPayload/symlink_model_folder b/tests/signing/testdata/in_toto/TestDigestsIntotoPayload/symlink_model_folder similarity index 100% rename from model_signing/signing/testdata/in_toto/TestDigestsIntotoPayload/symlink_model_folder rename to tests/signing/testdata/in_toto/TestDigestsIntotoPayload/symlink_model_folder diff --git a/model_signing/signing/testdata/in_toto/TestShardDigestsIntotoPayload/deep_model_folder b/tests/signing/testdata/in_toto/TestShardDigestsIntotoPayload/deep_model_folder similarity index 100% rename from model_signing/signing/testdata/in_toto/TestShardDigestsIntotoPayload/deep_model_folder rename to tests/signing/testdata/in_toto/TestShardDigestsIntotoPayload/deep_model_folder diff --git a/model_signing/signing/testdata/in_toto/TestShardDigestsIntotoPayload/empty_model_file b/tests/signing/testdata/in_toto/TestShardDigestsIntotoPayload/empty_model_file similarity index 100% rename from model_signing/signing/testdata/in_toto/TestShardDigestsIntotoPayload/empty_model_file rename to tests/signing/testdata/in_toto/TestShardDigestsIntotoPayload/empty_model_file diff --git a/model_signing/signing/testdata/in_toto/TestShardDigestsIntotoPayload/empty_model_folder b/tests/signing/testdata/in_toto/TestShardDigestsIntotoPayload/empty_model_folder similarity index 100% rename from model_signing/signing/testdata/in_toto/TestShardDigestsIntotoPayload/empty_model_folder rename to tests/signing/testdata/in_toto/TestShardDigestsIntotoPayload/empty_model_folder diff --git a/model_signing/signing/testdata/in_toto/TestShardDigestsIntotoPayload/model_folder_with_empty_file b/tests/signing/testdata/in_toto/TestShardDigestsIntotoPayload/model_folder_with_empty_file similarity index 100% rename from model_signing/signing/testdata/in_toto/TestShardDigestsIntotoPayload/model_folder_with_empty_file rename to tests/signing/testdata/in_toto/TestShardDigestsIntotoPayload/model_folder_with_empty_file diff --git a/model_signing/signing/testdata/in_toto/TestShardDigestsIntotoPayload/sample_model_file b/tests/signing/testdata/in_toto/TestShardDigestsIntotoPayload/sample_model_file similarity index 100% rename from model_signing/signing/testdata/in_toto/TestShardDigestsIntotoPayload/sample_model_file rename to tests/signing/testdata/in_toto/TestShardDigestsIntotoPayload/sample_model_file diff --git a/model_signing/signing/testdata/in_toto/TestShardDigestsIntotoPayload/sample_model_folder b/tests/signing/testdata/in_toto/TestShardDigestsIntotoPayload/sample_model_folder similarity index 100% rename from model_signing/signing/testdata/in_toto/TestShardDigestsIntotoPayload/sample_model_folder rename to tests/signing/testdata/in_toto/TestShardDigestsIntotoPayload/sample_model_folder diff --git a/model_signing/signing/testdata/in_toto/TestShardDigestsIntotoPayload/symlink_model_folder b/tests/signing/testdata/in_toto/TestShardDigestsIntotoPayload/symlink_model_folder similarity index 100% rename from model_signing/signing/testdata/in_toto/TestShardDigestsIntotoPayload/symlink_model_folder rename to tests/signing/testdata/in_toto/TestShardDigestsIntotoPayload/symlink_model_folder diff --git a/model_signing/signing/testdata/in_toto/TestSingleDigestIntotoPayload/deep_model_folder b/tests/signing/testdata/in_toto/TestSingleDigestIntotoPayload/deep_model_folder similarity index 100% rename from model_signing/signing/testdata/in_toto/TestSingleDigestIntotoPayload/deep_model_folder rename to tests/signing/testdata/in_toto/TestSingleDigestIntotoPayload/deep_model_folder diff --git a/model_signing/signing/testdata/in_toto/TestSingleDigestIntotoPayload/empty_model_file b/tests/signing/testdata/in_toto/TestSingleDigestIntotoPayload/empty_model_file similarity index 100% rename from model_signing/signing/testdata/in_toto/TestSingleDigestIntotoPayload/empty_model_file rename to tests/signing/testdata/in_toto/TestSingleDigestIntotoPayload/empty_model_file diff --git a/model_signing/signing/testdata/in_toto/TestSingleDigestIntotoPayload/empty_model_folder b/tests/signing/testdata/in_toto/TestSingleDigestIntotoPayload/empty_model_folder similarity index 100% rename from model_signing/signing/testdata/in_toto/TestSingleDigestIntotoPayload/empty_model_folder rename to tests/signing/testdata/in_toto/TestSingleDigestIntotoPayload/empty_model_folder diff --git a/model_signing/signing/testdata/in_toto/TestSingleDigestIntotoPayload/model_folder_with_empty_file b/tests/signing/testdata/in_toto/TestSingleDigestIntotoPayload/model_folder_with_empty_file similarity index 100% rename from model_signing/signing/testdata/in_toto/TestSingleDigestIntotoPayload/model_folder_with_empty_file rename to tests/signing/testdata/in_toto/TestSingleDigestIntotoPayload/model_folder_with_empty_file diff --git a/model_signing/signing/testdata/in_toto/TestSingleDigestIntotoPayload/sample_model_file b/tests/signing/testdata/in_toto/TestSingleDigestIntotoPayload/sample_model_file similarity index 100% rename from model_signing/signing/testdata/in_toto/TestSingleDigestIntotoPayload/sample_model_file rename to tests/signing/testdata/in_toto/TestSingleDigestIntotoPayload/sample_model_file diff --git a/model_signing/signing/testdata/in_toto/TestSingleDigestIntotoPayload/sample_model_folder b/tests/signing/testdata/in_toto/TestSingleDigestIntotoPayload/sample_model_folder similarity index 100% rename from model_signing/signing/testdata/in_toto/TestSingleDigestIntotoPayload/sample_model_folder rename to tests/signing/testdata/in_toto/TestSingleDigestIntotoPayload/sample_model_folder diff --git a/model_signing/signing/testdata/in_toto/TestSingleDigestIntotoPayload/symlink_model_folder b/tests/signing/testdata/in_toto/TestSingleDigestIntotoPayload/symlink_model_folder similarity index 100% rename from model_signing/signing/testdata/in_toto/TestSingleDigestIntotoPayload/symlink_model_folder rename to tests/signing/testdata/in_toto/TestSingleDigestIntotoPayload/symlink_model_folder diff --git a/model_signing/test_support.py b/tests/test_support.py similarity index 100% rename from model_signing/test_support.py rename to tests/test_support.py From faeb99a1249dfbe4c32dcff76de23c87436770c7 Mon Sep 17 00:00:00 2001 From: Mihai Maruseac Date: Mon, 12 Aug 2024 18:13:11 -0700 Subject: [PATCH 02/11] Add publishing metadata to pyproject.toml Decided to use [`hatch`](https://hatch.pypa.io/latest/). Well, `hatchling` for the build backend and `hatch` as project manager. While not important for this step, using `hatch` allows us to have multiple environments for different usage scenarios. We can have one environment for tests, one for type checking, etc. For this commit, I just focused on making sure that `hatch build` builds the wheel and the tarball. As a bonus, `hatch shell` drops us into a virtual environment with the package locally installed, in an editable fashion: we can just edit the files and can immediately test the code without having to reinstall the wheel somewhere else. So, we get the benefits of testing exactly the wheel that is shipped to the users without having to have a separate virtual environment to install the wheel in, without having to manually manage that. The wheel that gets built is minimal. Here's the corresponding tarball's contents (output of `tar tf`): ``` model_signing-0.0.1a0/model_signing/__init__.py model_signing-0.0.1a0/model_signing/hashing/__init__.py model_signing-0.0.1a0/model_signing/hashing/file.py model_signing-0.0.1a0/model_signing/hashing/hashing.py model_signing-0.0.1a0/model_signing/hashing/memory.py model_signing-0.0.1a0/model_signing/manifest/__init__.py model_signing-0.0.1a0/model_signing/manifest/manifest.py model_signing-0.0.1a0/model_signing/serialization/__init__.py model_signing-0.0.1a0/model_signing/serialization/serialization.py model_signing-0.0.1a0/model_signing/serialization/serialize_by_file.py model_signing-0.0.1a0/model_signing/serialization/serialize_by_file_shard.py model_signing-0.0.1a0/model_signing/signature/__init__.py model_signing-0.0.1a0/model_signing/signature/encoding.py model_signing-0.0.1a0/model_signing/signature/fake.py model_signing-0.0.1a0/model_signing/signature/key.py model_signing-0.0.1a0/model_signing/signature/pki.py model_signing-0.0.1a0/model_signing/signature/signing.py model_signing-0.0.1a0/model_signing/signature/sigstore.py model_signing-0.0.1a0/model_signing/signature/verifying.py model_signing-0.0.1a0/model_signing/signing/__init__.py model_signing-0.0.1a0/model_signing/signing/as_bytes.py model_signing-0.0.1a0/model_signing/signing/empty_signing.py model_signing-0.0.1a0/model_signing/signing/in_toto.py model_signing-0.0.1a0/model_signing/signing/signing.py model_signing-0.0.1a0/model_signing/signing/sigstore.py model_signing-0.0.1a0/.gitignore model_signing-0.0.1a0/LICENSE model_signing-0.0.1a0/README.model_signing.md model_signing-0.0.1a0/pyproject.toml model_signing-0.0.1a0/PKG-INFO ``` Signed-off-by: Mihai Maruseac --- pyproject.toml | 55 +++++++++++++++++++++++++++++++++++ src/model_signing/__init__.py | 2 ++ 2 files changed, 57 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 94150345..0b26db83 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,3 +1,58 @@ +[build-system] +requires = ["hatchling>=1.25"] +build-backend = "hatchling.build" + +[project] +name = "model_signing" +dynamic = ["version"] +description = "A tool for signing and verifying ML models" +readme = "README.model_signing.md" # TODO: Merge READMEs and update +license = { file = "LICENSE" } +authors = [ + { name = "Sigstore Authors", email = "sigstore-dev@googlegroups.com" } +] +classifiers = [ + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "Topic :: Security", + "Topic :: Security :: Cryptography", + "Topic :: Scientific/Engineering :: Artificial Intelligence", + "Typing :: Typed", +] +dependencies = [ + # TODO: trim list of dependencies and add here + # TODO: optional dependencies for testing, benchmarking +] +requires-python = ">=3.11" +keywords = [ + "machine learning", + "artificial intelligence", + "model signing", + "AI security", + "ML security", + "AI supply chain security", + "ML supply chain security", +] + +[project.urls] +Homepage = "https://pypi.org/project/model-signing/" +Changelog = "https://github.com/sigstore/model-transparency/blob/main/CHANGELOG.md" +# TODO: https://github.com/sigstore/model-transparency/pull/279 - Documentation = "...." +Source = "https://github.com/sigstore/model-transparency" +Issues = "https://github.com/sigstore/model-transparency/issues" +PyPI = "https://pypi.org/project/model-signing/" + +[tool.hatch.version] +path = "src/model_signing/__init__.py" + +[tool.hatch.build] +packages = ["src/model_signing"] + [tool.ruff] line-length = 80 target-version = "py311" diff --git a/src/model_signing/__init__.py b/src/model_signing/__init__.py index 0888a055..68a6d461 100644 --- a/src/model_signing/__init__.py +++ b/src/model_signing/__init__.py @@ -11,3 +11,5 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + +__version__ = "0.0.1-alpha" From a4cb209c3f49d938d7a1cbd7429e8ffaf0212e77 Mon Sep 17 00:00:00 2001 From: Mihai Maruseac Date: Tue, 13 Aug 2024 12:39:14 -0700 Subject: [PATCH 03/11] Add required deps to install/use the package. Tested by running `hatch shell` then `python` then ``` >>> import model_signing >>> import model_signing.hashing >>> import model_signing.hashing.hashing >>> import model_signing.hashing.file >>> import model_signing.hashing.memory >>> import model_signing.manifest >>> import model_signing.manifest.manifest >>> import model_signing.serialization >>> import model_signing.serialization.serialization >>> import model_signing.serialization.serialize_by_file >>> import model_signing.serialization.serialize_by_file_shard >>> import model_signing.signing >>> import model_signing.signing.as_bytes >>> import model_signing.signing.in_toto >>> import model_signing.signing.signing >>> import model_signing.signing.sigstore >>> import model_signing.signature >>> import model_signing.signature.fake >>> import model_signing.signature.key >>> import model_signing.signature.pki >>> import model_signing.signature.signing >>> import model_signing.signature.sigstore >>> import model_signing.signature.verifying >>> ^D ``` Tested the same with `hatch build`, copying the wheel to outside the soruce tree, creating a virtual env, and installing the wheel in the empty env, after which I ran the above imports again. Signed-off-by: Mihai Maruseac --- pyproject.toml | 6 ++++-- src/model_signing/signature/sigstore.py | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 0b26db83..4016cb52 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,8 +25,10 @@ classifiers = [ "Typing :: Typed", ] dependencies = [ - # TODO: trim list of dependencies and add here - # TODO: optional dependencies for testing, benchmarking + "cryptography", # TODO: make pki a feature + "in-toto-attestation", + "sigstore", + "typing_extensions", ] requires-python = ">=3.11" keywords = [ diff --git a/src/model_signing/signature/sigstore.py b/src/model_signing/signature/sigstore.py index 074a3f17..4ce8c039 100644 --- a/src/model_signing/signature/sigstore.py +++ b/src/model_signing/signature/sigstore.py @@ -13,9 +13,9 @@ # limitations under the License. """This package provides the functionality to sign and verify models with sigstore.""" +import logging as log from typing import Optional -from absl import logging as log from in_toto_attestation.v1 import statement from sigstore import dsse from sigstore import models as sig_models From 0c1a9b7e9d184e0075d9b37b519d4b1d7e59686a Mon Sep 17 00:00:00 2001 From: Mihai Maruseac Date: Tue, 13 Aug 2024 13:09:03 -0700 Subject: [PATCH 04/11] Add testing support via `hatch test`. Enable random order testing to surface out cases where one test case depends on another. Enable parallel testing to speed up testing. Will add matrix support later. ``` plugins: xdist-3.6.1, mock-3.14.0, rerunfailures-14.0, randomly-3.15.0 12 workers [233 items] ......................................................................................................................................................................................................................................... [100%] ================================================================================================================================== 233 passed in 2.18s =================================================================================================================================== ``` Signed-off-by: Mihai Maruseac --- pyproject.toml | 5 +++++ tests/__init__.py | 13 +++++++++++++ tests/conftest.py | 2 +- tests/serialization/serialize_by_file_shard_test.py | 2 +- tests/serialization/serialize_by_file_test.py | 2 +- tests/signing/as_bytes_test.py | 2 +- tests/signing/empty_signing_test.py | 2 +- tests/signing/in_toto_test.py | 2 +- 8 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 tests/__init__.py diff --git a/pyproject.toml b/pyproject.toml index 4016cb52..450c5dfb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,6 +55,11 @@ path = "src/model_signing/__init__.py" [tool.hatch.build] packages = ["src/model_signing"] +[tool.hatch.envs.hatch-test] +installer = "pip" +parallel = true +randomize = true + [tool.ruff] line-length = 80 target-version = "py311" diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..0888a055 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2024 The Sigstore Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/tests/conftest.py b/tests/conftest.py index 5ec64035..82e0793f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -19,7 +19,7 @@ import pytest -from model_signing import test_support +from tests import test_support def pytest_addoption(parser): diff --git a/tests/serialization/serialize_by_file_shard_test.py b/tests/serialization/serialize_by_file_shard_test.py index ef0ee6e7..2e016308 100644 --- a/tests/serialization/serialize_by_file_shard_test.py +++ b/tests/serialization/serialize_by_file_shard_test.py @@ -24,7 +24,7 @@ import pytest -from model_signing import test_support +from tests import test_support from model_signing.hashing import file from model_signing.hashing import memory from model_signing.manifest import manifest diff --git a/tests/serialization/serialize_by_file_test.py b/tests/serialization/serialize_by_file_test.py index 299eaf9f..1996d351 100644 --- a/tests/serialization/serialize_by_file_test.py +++ b/tests/serialization/serialize_by_file_test.py @@ -25,7 +25,7 @@ import pytest -from model_signing import test_support +from tests import test_support from model_signing.hashing import file from model_signing.hashing import memory from model_signing.manifest import manifest diff --git a/tests/signing/as_bytes_test.py b/tests/signing/as_bytes_test.py index 74ae5bb2..59a97349 100644 --- a/tests/signing/as_bytes_test.py +++ b/tests/signing/as_bytes_test.py @@ -22,7 +22,7 @@ import pytest -from model_signing import test_support +from tests import test_support from model_signing.hashing import file from model_signing.hashing import memory from model_signing.serialization import serialize_by_file diff --git a/tests/signing/empty_signing_test.py b/tests/signing/empty_signing_test.py index bff330da..ab825c3c 100644 --- a/tests/signing/empty_signing_test.py +++ b/tests/signing/empty_signing_test.py @@ -18,7 +18,7 @@ import pytest from typing_extensions import override -from model_signing import test_support +from tests import test_support from model_signing.hashing import hashing from model_signing.manifest import manifest from model_signing.signing import empty_signing diff --git a/tests/signing/in_toto_test.py b/tests/signing/in_toto_test.py index 51ccbe0a..1dc07575 100644 --- a/tests/signing/in_toto_test.py +++ b/tests/signing/in_toto_test.py @@ -26,7 +26,7 @@ from in_toto_attestation.v1 import statement_pb2 import pytest -from model_signing import test_support +from tests import test_support from model_signing.hashing import file from model_signing.hashing import hashing from model_signing.hashing import memory From 8753dae4e2bd1d9d1d26515dea606ebd9735f045 Mon Sep 17 00:00:00 2001 From: Mihai Maruseac Date: Tue, 13 Aug 2024 15:15:46 -0700 Subject: [PATCH 05/11] Standardize formatting with `hatch fmt` Did some minor fixes here and there, but left a bunch for future PRs. Signed-off-by: Mihai Maruseac --- pyproject.toml | 18 +++- .../kubeflow/model_transparency.py | 23 +++-- slsa_for_models/main.py | 17 ++-- slsa_for_models/pytorch_cifar10.py | 65 +++++++------- slsa_for_models/tensorflow_cifar10.py | 86 ++++++++++--------- .../serialization/serialize_by_file.py | 28 +++--- .../serialization/serialize_by_file_shard.py | 18 ++-- src/model_signing/signature/encoding.py | 11 ++- src/model_signing/signature/fake.py | 14 +-- src/model_signing/signature/key.py | 25 +++--- src/model_signing/signature/pki.py | 79 ++++++++++------- src/model_signing/signature/signing.py | 3 +- src/model_signing/signature/sigstore.py | 30 +++---- src/model_signing/signature/verifying.py | 4 +- src/model_signing/signing/in_toto.py | 21 +++-- src/model_signing/signing/sigstore.py | 34 ++++---- tests/conftest.py | 3 +- tests/hashing/file_test.py | 4 +- tests/hashing/memory_test.py | 2 - tests/manifest/manifest_test.py | 4 - .../serialize_by_file_shard_test.py | 4 +- tests/serialization/serialize_by_file_test.py | 5 +- tests/signature/key_test.py | 21 +++-- tests/signing/as_bytes_test.py | 3 +- tests/signing/empty_signing_test.py | 14 +-- tests/signing/in_toto_test.py | 23 ++--- tests/test_support.py | 2 + 27 files changed, 281 insertions(+), 280 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 450c5dfb..98c1c7a0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,11 +62,19 @@ randomize = true [tool.ruff] line-length = 80 -target-version = "py311" + +[tool.ruff.format] +docstring-code-format = true +line-ending = "lf" +skip-magic-trailing-comma = true [tool.ruff.lint] -select = ["B", "E", "F", "I", "N", "PLC", "PLE", "PT", "SIM", "W"] -ignore = ["B024"] +select = ["B", "D", "E", "F", "I", "N", "PLC", "PLE", "PT", "SIM", "W"] +# TODO: selectively enable back most of these in subsequent PRs +ignore = ["B024", "D100", "D101", "D102", "D103", "D104", "D105", "D107", "D417"] + +[tool.ruff.lint.flake8-tidy-imports] +ban-relative-imports = "all" [tool.ruff.lint.flake8-pytest-style] fixture-parentheses = false @@ -74,4 +82,8 @@ fixture-parentheses = false [tool.ruff.lint.isort] force-single-line = true force-sort-within-sections = true +lines-after-imports = 2 single-line-exclusions = ["collections.abc", "typing"] + +[tool.ruff.lint.pydocstyle] +convention = "google" diff --git a/slsa_for_models/kubeflow/model_transparency.py b/slsa_for_models/kubeflow/model_transparency.py index 11f58ae4..c43aa396 100644 --- a/slsa_for_models/kubeflow/model_transparency.py +++ b/slsa_for_models/kubeflow/model_transparency.py @@ -1,11 +1,11 @@ -import kfp_tekton -from kfp import dsl, components -from kubernetes.client.models import ( - V1PersistentVolumeClaimSpec, - V1ResourceRequirements, -) import json +from kfp import components +from kfp import dsl +import kfp_tekton +from kubernetes.client.models import V1PersistentVolumeClaimSpec +from kubernetes.client.models import V1ResourceRequirements + def git_clone(url: str, target: str): return components.load_component_from_text( @@ -36,7 +36,7 @@ def git_clone(url: str, target: str): )(url=url, target=target) -def build_model(requirements: str, source: str, model: str, workDir: str): +def build_model(requirements: str, source: str, model: str, work_dir: str): return components.load_component_from_text( """ name: build-model @@ -65,10 +65,10 @@ def build_model(requirements: str, source: str, model: str, workDir: str): - -d - {outputPath: digest} """ - )(requirements=requirements, source=source, model=model, work=workDir) + )(requirements=requirements, source=source, model=model, work=work_dir) -def upload_model(location: str, source: str, workDir: str): +def upload_model(location: str, source: str, work_dir: str): return components.load_component_from_text( """ name: upload-model @@ -97,7 +97,7 @@ def upload_model(location: str, source: str, workDir: str): - -l - {inputValue: location} """ - )(location=location, source=source, work=workDir) + )(location=location, source=source, work=work_dir) @dsl.pipeline( @@ -110,7 +110,6 @@ def clone_build_push( model: str = "pytorch_model.pth", ): """A three-step pipeline with the first two steps running in parallel.""" - source_code = "$(workspaces.shared-ws.path)/source" relative_main_path = "slsa_for_models/main.py" relative_requirements = "slsa_for_models/install/requirements_Linux.txt" @@ -122,7 +121,7 @@ def clone_build_push( build_task = build_model( requirements=relative_requirements, - workDir=source_code, + work_dir=source_code, source=relative_main_path, model=model, ) diff --git a/slsa_for_models/main.py b/slsa_for_models/main.py index 7da17b4a..b802c61b 100644 --- a/slsa_for_models/main.py +++ b/slsa_for_models/main.py @@ -14,16 +14,19 @@ import argparse -import tensorflow_cifar10 as tf import pytorch_cifar10 as pt +import tensorflow_cifar10 as tf -def readOptions(): - parser = argparse.ArgumentParser('Train CIFAR10 models with TF/PT') +def read_options(): + parser = argparse.ArgumentParser("Train CIFAR10 models with TF/PT") model_formats = list(tf.supported_models().keys()) model_formats += list(pt.supported_models().keys()) - parser.add_argument('model', choices=model_formats, - help='Model to generate (name implies framework)') + parser.add_argument( + "model", + choices=model_formats, + help="Model to generate (name implies framework)", + ) return parser.parse_args() @@ -42,6 +45,6 @@ def main(args): raise ValueError("Model format not supported") -if __name__ == '__main__': - args = readOptions() +if __name__ == "__main__": + args = read_options() main(args) diff --git a/slsa_for_models/pytorch_cifar10.py b/slsa_for_models/pytorch_cifar10.py index 686f0ad1..5fd9a9d3 100644 --- a/slsa_for_models/pytorch_cifar10.py +++ b/slsa_for_models/pytorch_cifar10.py @@ -18,7 +18,7 @@ # libraries only if we want to train a PyTorch model. torch = None nn = None -F = None +functional = None optim = None torchvision = None transforms = None @@ -32,13 +32,13 @@ def pretraining(): """ global torch global nn - global F + global functional global optim global torchvision global transforms import torch import torch.nn as nn - import torch.nn.functional as F + import torch.nn.functional as functional import torch.optim as optim import torchvision import torchvision.transforms as transforms @@ -55,24 +55,28 @@ def load_data(): Returns iterators to train and test sets. """ - transform = transforms.Compose([ - transforms.ToTensor(), - transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) - ]) + transform = transforms.Compose( + [ + transforms.ToTensor(), + transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)), + ] + ) batch_size = 4 num_workers = 2 - trainset = torchvision.datasets.CIFAR10(root='./data', train=True, - download=True, transform=transform) - trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, - shuffle=True, - num_workers=num_workers) - testset = torchvision.datasets.CIFAR10(root='./data', train=False, - download=True, transform=transform) - testloader = torch.utils.data.DataLoader(testset, batch_size=batch_size, - shuffle=True, - num_workers=num_workers) + trainset = torchvision.datasets.CIFAR10( + root="./data", train=True, download=True, transform=transform + ) + trainloader = torch.utils.data.DataLoader( + trainset, batch_size=batch_size, shuffle=True, num_workers=num_workers + ) + testset = torchvision.datasets.CIFAR10( + root="./data", train=False, download=True, transform=transform + ) + testloader = torch.utils.data.DataLoader( + testset, batch_size=batch_size, shuffle=True, num_workers=num_workers + ) return trainloader, testloader @@ -85,6 +89,7 @@ def create_model(): Returns the model. """ + # Train a model based on tutorial from # https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html. # We inline the class to be able to use lazy loading of PyTorch modules. @@ -99,11 +104,11 @@ def __init__(self): self.fc3 = nn.Linear(84, 10) def forward(self, x): - x = self.pool(F.relu(self.conv1(x))) - x = self.pool(F.relu(self.conv2(x))) + x = self.pool(functional.relu(self.conv1(x))) + x = self.pool(functional.relu(self.conv2(x))) x = torch.flatten(x, 1) - x = F.relu(self.fc1(x)) - x = F.relu(self.fc2(x)) + x = functional.relu(self.fc1(x)) + x = functional.relu(self.fc2(x)) x = self.fc3(x) return x @@ -133,8 +138,10 @@ def train_model(model, loss, optimizer, train): optimizer.step() running_loss += loss_score.item() if i % batch_size == 0: - print(f'[{epoch}, {i:5d}], ' - f'loss: {running_loss / batch_size :.3f}') + print( + f"[{epoch}, {i:5d}], " + f"loss: {running_loss / batch_size :.3f}" + ) running_loss = 0.0 @@ -149,15 +156,15 @@ def score_model(model, test): _, predicted = torch.max(outputs.data, 1) total += y.size(0) correct += (predicted == y).sum().item() - print(f'Test accuracy: {correct / total}') + print(f"Test accuracy: {correct / total}") def supported_models(): """Returns supported model types paired with method to save them.""" return { - 'pytorch_model.pth': lambda m, p: torch.save(m.state_dict(), p), - 'pytorch_full_model.pth': lambda m, p: torch.save(m, p), - 'pytorch_jitted_model.pt': lambda m, p: torch.jit.script(m).save(p), + "pytorch_model.pth": lambda m, p: torch.save(m.state_dict(), p), + "pytorch_full_model.pth": lambda m, p: torch.save(m, p), + "pytorch_jitted_model.pt": lambda m, p: torch.jit.script(m).save(p), } @@ -168,8 +175,8 @@ def save_model(model, model_format): """ saver = supported_models().get(model_format, None) if not saver: - raise ValueError('Requested a model format not supported by PyTorch') - saver(model, './' + model_format) + raise ValueError("Requested a model format not supported by PyTorch") + saver(model, "./" + model_format) def model_pipeline(model_format): diff --git a/slsa_for_models/tensorflow_cifar10.py b/slsa_for_models/tensorflow_cifar10.py index 5f7d4d20..ec7d649f 100644 --- a/slsa_for_models/tensorflow_cifar10.py +++ b/slsa_for_models/tensorflow_cifar10.py @@ -30,6 +30,7 @@ def pretraining(): global tfds import tensorflow as tf import tensorflow_datasets as tfds + # Also compile model using XLA for ~20% performance gain tf.config.optimizer.set_jit(True) @@ -46,15 +47,15 @@ def load_data(): Returns train and test pairs. Each pair consists of features and labels vectors of similar size. """ - result = tfds.load('cifar10', batch_size=-1) - x_train = result['train']['image'] - y_train = result['train']['label'] - x_test = result['test']['image'] - y_test = result['test']['label'] + result = tfds.load("cifar10", batch_size=-1) + x_train = result["train"]["image"] + y_train = result["train"]["label"] + x_test = result["test"]["image"] + y_test = result["test"]["label"] # transform input - x_train = x_train.numpy().astype('float32') / 256 - x_test = x_test.numpy().astype('float32') / 256 + x_train = x_train.numpy().astype("float32") / 256 + x_test = x_test.numpy().astype("float32") / 256 y_train = tf.keras.utils.to_categorical(y_train, num_classes=10) y_test = tf.keras.utils.to_categorical(y_test, num_classes=10) @@ -72,35 +73,38 @@ def create_model(in_shape): Returns the model. """ x, _, c = in_shape - return tf.keras.models.Sequential([ - tf.keras.layers.Conv2D(x, (c, c), padding='same', - input_shape=in_shape), - tf.keras.layers.Activation('relu'), - tf.keras.layers.Conv2D(x, (c, c)), - tf.keras.layers.Activation('relu'), - tf.keras.layers.MaxPooling2D(pool_size=(2, 2)), - tf.keras.layers.Dropout(0.25), - tf.keras.layers.Conv2D(2*x, (c, c), padding='same'), - tf.keras.layers.Activation('relu'), - tf.keras.layers.Conv2D(2*x, (c, c)), - tf.keras.layers.Activation('relu'), - tf.keras.layers.MaxPooling2D(pool_size=(2, 2)), - tf.keras.layers.Dropout(0.25), - tf.keras.layers.Flatten(), - tf.keras.layers.Dense(512), - tf.keras.layers.Activation('relu'), - tf.keras.layers.Dropout(0.5), - tf.keras.layers.Dense(10), - tf.keras.layers.Activation('softmax'), - ]) + return tf.keras.models.Sequential( + [ + tf.keras.layers.Conv2D( + x, (c, c), padding="same", input_shape=in_shape + ), + tf.keras.layers.Activation("relu"), + tf.keras.layers.Conv2D(x, (c, c)), + tf.keras.layers.Activation("relu"), + tf.keras.layers.MaxPooling2D(pool_size=(2, 2)), + tf.keras.layers.Dropout(0.25), + tf.keras.layers.Conv2D(2 * x, (c, c), padding="same"), + tf.keras.layers.Activation("relu"), + tf.keras.layers.Conv2D(2 * x, (c, c)), + tf.keras.layers.Activation("relu"), + tf.keras.layers.MaxPooling2D(pool_size=(2, 2)), + tf.keras.layers.Dropout(0.25), + tf.keras.layers.Flatten(), + tf.keras.layers.Dense(512), + tf.keras.layers.Activation("relu"), + tf.keras.layers.Dropout(0.5), + tf.keras.layers.Dense(10), + tf.keras.layers.Activation("softmax"), + ] + ) def prepare_model(model): """Prepare model for training with loss and optimizer.""" opt = tf.keras.optimizers.RMSprop(learning_rate=0.0001) - model.compile(loss='categorical_crossentropy', - optimizer=opt, - metrics=['accuracy']) + model.compile( + loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"] + ) return model @@ -110,30 +114,31 @@ def train_model(model, train, test): The test set is used for cross validation. """ x, y = train - model.fit(x, y, batch_size=256, epochs=16, - validation_data=test, shuffle=True) + model.fit( + x, y, batch_size=256, epochs=16, validation_data=test, shuffle=True + ) def score_model(model, test): """Score a trained model on the test set.""" x, y = test scores = model.evaluate(x, y, verbose=1) - print(f'Test loss: {scores[0]}') - print(f'Test accuracy: {scores[1]}') + print(f"Test loss: {scores[0]}") + print(f"Test accuracy: {scores[1]}") def supported_models(): """Returns supported model types paired with method to save them.""" return { # New Keras format - 'tensorflow_model.keras': lambda m, p: m.save(p, save_format='keras'), + "tensorflow_model.keras": lambda m, p: m.save(p, save_format="keras"), # TF SavedModel formats, full model and weights only # TODO: Re-enable support for these when SLSA supports directories # 'tensorflow_saved_model': lambda m, p: m.save(p, save_format='tf'), # 'tensorflow_exported_model': lambda m, p: m.export(p), # Legacy HDFS format, full model and weights only - 'tensorflow_hdf5_model.h5': lambda m, p: m.save(p, save_format='h5'), - 'tensorflow_hdf5.weights.h5': lambda m, p: m.save_weights(p), + "tensorflow_hdf5_model.h5": lambda m, p: m.save(p, save_format="h5"), + "tensorflow_hdf5.weights.h5": lambda m, p: m.save_weights(p), } @@ -144,9 +149,8 @@ def save_model(model, model_format): """ saver = supported_models().get(model_format, None) if not saver: - raise ValueError( - 'Requested a model format not supported by TensorFlow') - saver(model, './' + model_format) + raise ValueError("Requested a model format not supported by TensorFlow") + saver(model, "./" + model_format) def model_pipeline(model_format): diff --git a/src/model_signing/serialization/serialize_by_file.py b/src/model_signing/serialization/serialize_by_file.py index 489aca05..4e6f61a9 100644 --- a/src/model_signing/serialization/serialize_by_file.py +++ b/src/model_signing/serialization/serialize_by_file.py @@ -31,9 +31,7 @@ def check_file_or_directory( - path: pathlib.Path, - *, - allow_symlinks: bool = False, + path: pathlib.Path, *, allow_symlinks: bool = False ) -> None: """Checks that the given path is either a file or a directory. @@ -66,11 +64,7 @@ def check_file_or_directory( ) -def _build_header( - *, - entry_name: str, - entry_type: str, -) -> bytes: +def _build_header(*, entry_name: str, entry_type: str) -> bytes: """Builds a header to encode a path with given name and type. Args: @@ -88,6 +82,7 @@ def _build_header( # Note: empty string at the end, to terminate header with a "." return b".".join([encoded_type, encoded_name, b""]) + def _ignored(path: pathlib.Path, ignore_paths: Iterable[pathlib.Path]) -> bool: """Determines if the provided path should be ignored. @@ -100,6 +95,7 @@ def _ignored(path: pathlib.Path, ignore_paths: Iterable[pathlib.Path]) -> bool: """ return any(path.is_relative_to(ignore_path) for ignore_path in ignore_paths) + class FilesSerializer(serialization.Serializer): """Generic file serializer. @@ -133,7 +129,8 @@ def __init__( self._allow_symlinks = allow_symlinks @override - def serialize(self, + def serialize( + self, model_path: pathlib.Path, *, ignore_paths: Iterable[pathlib.Path] = frozenset(), @@ -159,9 +156,7 @@ def serialize(self, # with `pathlib.Path.walk` for a clearer interface, and some speed # improvement. for path in itertools.chain((model_path,), model_path.glob("**/*")): - check_file_or_directory( - path, allow_symlinks=self._allow_symlinks - ) + check_file_or_directory(path, allow_symlinks=self._allow_symlinks) if path.is_file() and not _ignored(path, ignore_paths): paths.append(path) @@ -211,7 +206,8 @@ class ManifestSerializer(FilesSerializer): """ @override - def serialize(self, + def serialize( + self, model_path: pathlib.Path, *, ignore_paths: Iterable[pathlib.Path] = frozenset(), @@ -299,8 +295,7 @@ def build_tree( return path_to_node[pathlib.PurePosixPath()] def get_digest( - self, - hasher_factory: Callable[[], hashing.StreamingHashEngine], + self, hasher_factory: Callable[[], hashing.StreamingHashEngine] ) -> hashing.Digest: """Returns the digest of this tree of files. @@ -366,7 +361,8 @@ def _factory(path: pathlib.Path) -> file.FileHasher: self._merge_hasher_factory = merge_hasher_factory @override - def serialize(self, + def serialize( + self, model_path: pathlib.Path, *, ignore_paths: Iterable[pathlib.Path] = frozenset(), diff --git a/src/model_signing/serialization/serialize_by_file_shard.py b/src/model_signing/serialization/serialize_by_file_shard.py index 3a51b0e9..36d240f2 100644 --- a/src/model_signing/serialization/serialize_by_file_shard.py +++ b/src/model_signing/serialization/serialize_by_file_shard.py @@ -31,12 +31,7 @@ from model_signing.serialization import serialize_by_file -def _build_header( - *, - name: str, - start: int, - end: int, -) -> bytes: +def _build_header(*, name: str, start: int, end: int) -> bytes: """Builds a header to encode a path with given name and shard range. Args: @@ -123,7 +118,8 @@ def __init__( self._shard_size = hasher.shard_size @override - def serialize(self, + def serialize( + self, model_path: pathlib.Path, *, ignore_paths: Iterable[pathlib.Path] = frozenset(), @@ -152,9 +148,8 @@ def serialize(self, serialize_by_file.check_file_or_directory( path, allow_symlinks=self._allow_symlinks ) - if ( - path.is_file() - and not serialize_by_file._ignored(path, ignore_paths) + if path.is_file() and not serialize_by_file._ignored( + path, ignore_paths ): shards.extend(self._get_shards(path)) @@ -302,7 +297,8 @@ def __init__( self._merge_hasher = merge_hasher @override - def serialize(self, + def serialize( + self, model_path: pathlib.Path, *, ignore_paths: Iterable[pathlib.Path] = frozenset(), diff --git a/src/model_signing/signature/encoding.py b/src/model_signing/signature/encoding.py index 19064599..9acbae6c 100644 --- a/src/model_signing/signature/encoding.py +++ b/src/model_signing/signature/encoding.py @@ -14,11 +14,12 @@ from google.protobuf import json_format from in_toto_attestation.v1 import statement_pb2 as statement_pb + PAYLOAD_TYPE = "application/vnd.in-toto+json" def pae( - statement: statement_pb.Statement # pylint: disable=no-member + statement: statement_pb.Statement, # pylint: disable=no-member ) -> bytes: """Generates the PAE encoding of the statement. @@ -33,8 +34,10 @@ def pae( """ enc_payload = json_format.MessageToJson(statement).encode() payload_len = len(enc_payload) - pae = ('DSSEV1' - f' {len(PAYLOAD_TYPE)} {PAYLOAD_TYPE}' - f' {payload_len} {enc_payload}') + pae = ( + "DSSEV1" + f" {len(PAYLOAD_TYPE)} {PAYLOAD_TYPE}" + f" {payload_len} {enc_payload}" + ) pae = pae.encode() return pae diff --git a/src/model_signing/signature/fake.py b/src/model_signing/signature/fake.py index d7b07bd8..206b6d45 100644 --- a/src/model_signing/signature/fake.py +++ b/src/model_signing/signature/fake.py @@ -11,8 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -"""This package provides the functionality to generate and verify -bundles without invoking signing.""" +"""Functionality to generate and verify bundles without signing.""" from google.protobuf import json_format from in_toto_attestation.v1 import statement @@ -27,20 +26,20 @@ class FakeSigner(Signer): """Provides a Signer that just returns the bundle.""" + def sign(self, stmnt: statement.Statement) -> bundle_pb.Bundle: env = intoto_pb.Envelope( payload=json_format.MessageToJson(stmnt.pb).encode(), payload_type=PAYLOAD_TYPE, - signatures=[intoto_pb.Signature(sig=b'', keyid=None)], + signatures=[intoto_pb.Signature(sig=b"", keyid=None)], ) bdl = bundle_pb.Bundle( - media_type='application/vnd.dev.sigstore.bundle.v0.3+json', + media_type="application/vnd.dev.sigstore.bundle.v0.3+json", verification_material=bundle_pb.VerificationMaterial( public_key=common_pb.PublicKey( raw_bytes=None, - key_details=common_pb. - PublicKeyDetails.PKIX_ECDSA_P256_SHA_256, - ), + key_details=common_pb.PublicKeyDetails.PKIX_ECDSA_P256_SHA_256, + ) ), dsse_envelope=env, ) @@ -49,5 +48,6 @@ def sign(self, stmnt: statement.Statement) -> bundle_pb.Bundle: class FakeVerifier(Verifier): """Provides a fake verifier that always passes.""" + def verify(self, bundle: bundle_pb.Bundle) -> None: pass diff --git a/src/model_signing/signature/key.py b/src/model_signing/signature/key.py index 4acf71e5..9ea0e1a6 100644 --- a/src/model_signing/signature/key.py +++ b/src/model_signing/signature/key.py @@ -11,8 +11,8 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -"""This package provides the functionality to sign and verify models -with keys.""" +"""Functionality to sign and verify models with keys.""" + from typing import Optional from cryptography.hazmat.primitives import serialization @@ -32,8 +32,8 @@ def load_ec_private_key( - path: str, password: Optional[str] = None - ) -> ec.EllipticCurvePrivateKey: + path: str, password: Optional[str] = None +) -> ec.EllipticCurvePrivateKey: private_key: ec.EllipticCurvePrivateKey with open(path, "rb") as fd: serialized_key = fd.read() @@ -63,16 +63,15 @@ def sign(self, stmnt: statement.Statement) -> bundle_pb.Bundle: signatures=[intoto_pb.Signature(sig=sig, keyid=None)], ) bdl = bundle_pb.Bundle( - media_type='application/vnd.dev.sigstore.bundle.v0.3+json', + media_type="application/vnd.dev.sigstore.bundle.v0.3+json", verification_material=bundle_pb.VerificationMaterial( public_key=common_pb.PublicKey( raw_bytes=self._private_key.public_key().public_bytes( encoding=serialization.Encoding.PEM, format=serialization.PublicFormat.SubjectPublicKeyInfo, ), - key_details=common_pb. - PublicKeyDetails.PKIX_ECDSA_P256_SHA_256, - ), + key_details=common_pb.PublicKeyDetails.PKIX_ECDSA_P256_SHA_256, + ) ), dsse_envelope=env, ) @@ -88,7 +87,7 @@ def __init__(self, public_key: ec.EllipticCurvePublicKey): @classmethod def from_path(cls, key_path: str): - with open(key_path, 'rb') as fd: + with open(key_path, "rb") as fd: serialized_key = fd.read() public_key = serialization.load_pem_public_key(serialized_key) return cls(public_key) @@ -96,14 +95,14 @@ def from_path(cls, key_path: str): def verify(self, bundle: bundle_pb.Bundle) -> None: statement = json_format.Parse( bundle.dsse_envelope.payload, - statement_pb.Statement() # pylint: disable=no-member + statement_pb.Statement(), # pylint: disable=no-member ) pae = encoding.pae(statement) try: self._public_key.verify( - bundle.dsse_envelope.signatures[0].sig, - pae, ec.ECDSA(SHA256())) + bundle.dsse_envelope.signatures[0].sig, pae, ec.ECDSA(SHA256()) + ) except Exception as e: raise VerificationError( - 'signature verification failed ' + str(e) + "signature verification failed " + str(e) ) from e diff --git a/src/model_signing/signature/pki.py b/src/model_signing/signature/pki.py index aa4f7e19..536496ee 100644 --- a/src/model_signing/signature/pki.py +++ b/src/model_signing/signature/pki.py @@ -11,8 +11,8 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -"""This package provides the functionality to sign and verify models -with certificates.""" +"""Functionality to sign and verify models with certificates.""" + from typing import Optional, Self import certifi @@ -34,28 +34,31 @@ def _load_single_cert(path: str) -> x509.Certificate: - with open(path, 'rb') as fd: + with open(path, "rb") as fd: cert = x509.load_pem_x509_certificate(fd.read()) return cert def _load_multiple_certs(paths: list[str]) -> list[x509.Certificate]: - certs = b'' + certs = b"" for p in paths: - with open(p, 'rb') as fd: + with open(p, "rb") as fd: certs += fd.read() return x509.load_pem_x509_certificates(certs) class PKISigner(Signer): - """Provides a Signer using an elliptic curve private key for signing and - adds the provided certificate information as verification material.""" + """Signer using an elliptic curve private key. + + The signer can be used for signing and adds the provided certificate + information as verification material. + """ def __init__( self, private_key: ec.EllipticCurvePrivateKey, signing_cert: x509.Certificate, - cert_chain: list[x509.Certificate] + cert_chain: list[x509.Certificate], ) -> None: self._key_signer = ECKeySigner(private_key) self._signing_cert = signing_cert @@ -64,15 +67,20 @@ def __init__( cert_pub_key = self._signing_cert.public_key() if pub_key != cert_pub_key: raise ValueError( - ('the private key\'s public key does not match the' - ' signing certificates public key')) + ( + "the private key's public key does not match the" + " signing certificates public key" + ) + ) self._cert_chain = cert_chain @classmethod - def from_path(cls, - private_key_path: str, - signing_cert_path: str, - cert_chain_paths: list[str]) -> Self: + def from_path( + cls, + private_key_path: str, + signing_cert_path: str, + cert_chain_paths: list[str], + ) -> Self: private_key = load_ec_private_key(private_key_path) signing_cert = _load_single_cert(signing_cert_path) cert_chain = _load_multiple_certs(cert_chain_paths) @@ -80,13 +88,12 @@ def from_path(cls, @staticmethod def __chain( - signing_cert: x509.Certificate, - chain: list[x509.Certificate] + signing_cert: x509.Certificate, chain: list[x509.Certificate] ) -> list[common_pb.X509Certificate]: result_chain = [ common_pb.X509Certificate( raw_bytes=signing_cert.public_bytes( - encoding=serialization.Encoding.DER, + encoding=serialization.Encoding.DER ) ) ] @@ -94,7 +101,7 @@ def __chain( result_chain.append( common_pb.X509Certificate( raw_bytes=cert.public_bytes( - encoding=serialization.Encoding.DER, + encoding=serialization.Encoding.DER ) ) ) @@ -114,15 +121,17 @@ def sign(self, stmnt: statement.Statement) -> bundle_pb.Bundle: class PKIVerifier(Verifier): """Provides a verifier based on root certificates.""" - def __init__(self, - root_certs: list[x509.Certificate] | None = None) -> None: + def __init__( + self, root_certs: list[x509.Certificate] | None = None + ) -> None: self._store = ssl_crypto.X509Store() for c in root_certs: self._store.add_cert(ssl_crypto.X509.from_cryptography(c)) @classmethod def from_paths( - cls, root_cert_paths: Optional[list[str]] | None = None) -> Self: + cls, root_cert_paths: Optional[list[str]] | None = None + ) -> Self: crypto_trust_roots: list[x509.Certificate] = [] if root_cert_paths: crypto_trust_roots = _load_multiple_certs(root_cert_paths) @@ -133,11 +142,13 @@ def from_paths( def verify(self, bundle: bundle_pb.Bundle) -> None: signing_chain = bundle.verification_material.x509_certificate_chain signing_cert_crypto = x509.load_der_x509_certificate( - signing_chain.certificates[0].raw_bytes) + signing_chain.certificates[0].raw_bytes + ) sign_time = signing_cert_crypto.not_valid_before_utc self._store.set_time(sign_time) signing_cert_ossl = ssl_crypto.X509.from_cryptography( - signing_cert_crypto) + signing_cert_crypto + ) chain = [] for cert in signing_chain.certificates[1:]: chain.append( @@ -147,28 +158,30 @@ def verify(self, bundle: bundle_pb.Bundle) -> None: ) store_ctx = ssl_crypto.X509StoreContext( - self._store, signing_cert_ossl, chain) + self._store, signing_cert_ossl, chain + ) try: store_ctx.verify_certificate() except ssl_crypto.X509StoreContextError as err: raise VerificationError( - f'signing certificate verification failed: {err}' + f"signing certificate verification failed: {err}" ) from err usage = signing_cert_crypto.extensions.get_extension_for_class( - x509.KeyUsage) + x509.KeyUsage + ) if not usage.value.digital_signature: raise VerificationError( - ('the certificate is not valid for digital' - ' signature usage')) + ("the certificate is not valid for digital" " signature usage") + ) ext_usage = signing_cert_crypto.extensions.get_extension_for_class( - x509.ExtendedKeyUsage) + x509.ExtendedKeyUsage + ) if crypto_oid.ExtendedKeyUsageOID.CODE_SIGNING not in ext_usage.value: raise VerificationError( - ('the certificate is not valid for code' - ' signing usage')) + ("the certificate is not valid for code" " signing usage") + ) # Verify the contents with a key verifier - pub_key: ec.EllipticCurvePublicKey = \ - signing_cert_crypto.public_key + pub_key: ec.EllipticCurvePublicKey = signing_cert_crypto.public_key verifier = ECKeyVerifier(pub_key) return verifier.verify(bundle) diff --git a/src/model_signing/signature/signing.py b/src/model_signing/signature/signing.py index 4818ef50..f48aa796 100644 --- a/src/model_signing/signature/signing.py +++ b/src/model_signing/signature/signing.py @@ -11,7 +11,8 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -"""This package provides the functionality to sign models""" +"""This package provides the functionality to sign models.""" + import abc from in_toto_attestation.v1 import statement diff --git a/src/model_signing/signature/sigstore.py b/src/model_signing/signature/sigstore.py index 4ce8c039..64ab09e1 100644 --- a/src/model_signing/signature/sigstore.py +++ b/src/model_signing/signature/sigstore.py @@ -11,8 +11,8 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -"""This package provides the functionality to sign and verify models -with sigstore.""" +"""Functionality to sign and verify models with sigstore.""" + import logging as log from typing import Optional @@ -36,19 +36,17 @@ class SigstoreSigner(Signer): CLIENT_ID = "sigstore" def __init__( - self, - disable_ambient: bool = True, - id_provider: str | None = None - ): + self, disable_ambient: bool = True, id_provider: str | None = None + ): token = self.__get_identity_token(disable_ambient, id_provider) if not token: raise ValueError("No identity token supplied or detected!") log.info( - f"Signing identity provider: {token.expected_certificate_subject}") + f"Signing identity provider: {token.expected_certificate_subject}" + ) log.info(f"Signing identity: {token.identity}") self._signer = sign.Signer( - identity_token=token, - signing_ctx=sign.SigningContext.production(), + identity_token=token, signing_ctx=sign.SigningContext.production() ) @staticmethod @@ -58,8 +56,7 @@ def __convert_stmnt(stmnt: statement.Statement) -> dsse.Statement: for s in subjects: sigstore_subjects.append( dsse._Subject( - name=s.name, - digest={"sha256": s.digest["sha256"]}, + name=s.name, digest={"sha256": s.digest["sha256"]} ) ) return dsse._StatementBuilder( @@ -70,15 +67,17 @@ def __convert_stmnt(stmnt: statement.Statement) -> dsse.Statement: @staticmethod def __get_identity_token( - disable_ambient: bool = True, - id_provider: Optional[str] = None, + disable_ambient: bool = True, id_provider: Optional[str] = None ) -> Optional[oidc.IdentityToken]: token: oidc.IdentityToken if not disable_ambient: return oidc.detect_credential() - issuer = oidc.Issuer(id_provider) if id_provider \ + issuer = ( + oidc.Issuer(id_provider) + if id_provider else oidc.Issuer.production() + ) token = issuer.identity_token( client_id=SigstoreSigner.CLIENT_ID, force_oob=True ) @@ -94,8 +93,7 @@ class SigstoreVerifier(Verifier): def __init__(self, oidc_provider: str, identity: str): self._verifier = sig_verifier.Verifier.production() self._policy = sig_policy.Identity( - identity=identity, - issuer=oidc_provider, + identity=identity, issuer=oidc_provider ) def verify(self, bundle: bundle_pb.Bundle) -> None: diff --git a/src/model_signing/signature/verifying.py b/src/model_signing/signature/verifying.py index 0ee506c7..41b2e033 100644 --- a/src/model_signing/signature/verifying.py +++ b/src/model_signing/signature/verifying.py @@ -12,13 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. """This package provides the functionality to verify signed models.""" + import abc from sigstore_protobuf_specs.dev.sigstore.bundle import v1 as bundle_pb class VerificationError(Exception): - """Typed verification error to provide error handling information""" + """Typed verification error to provide error handling information.""" + def __init__(self, message: str) -> None: super().__init__(message) diff --git a/src/model_signing/signing/in_toto.py b/src/model_signing/signing/in_toto.py index 8f119340..c797e639 100644 --- a/src/model_signing/signing/in_toto.py +++ b/src/model_signing/signing/in_toto.py @@ -158,8 +158,7 @@ def from_manifest(cls, manifest: manifest_module.Manifest) -> Self: subject = list(manifest.resource_descriptors())[0] digest = subject.digest return cls( - digest_hex=digest.digest_hex, - digest_algorithm=digest.algorithm, + digest_hex=digest.digest_hex, digest_algorithm=digest.algorithm ) @classmethod @@ -209,11 +208,13 @@ def _convert_descriptors_to_hashed_statement( subjects = [] for descriptor in manifest.resource_descriptors(): hasher.update(descriptor.digest.digest_value) - subjects.append({ - "name": descriptor.identifier, - "digest": descriptor.digest.digest_hex, - "algorithm": descriptor.digest.algorithm, - }) + subjects.append( + { + "name": descriptor.identifier, + "digest": descriptor.digest.digest_hex, + "algorithm": descriptor.digest.algorithm, + } + ) digest = {"sha256": hasher.compute().digest_hex} descriptor = statement.ResourceDescriptor(name=".", digest=digest).pb @@ -533,7 +534,7 @@ def _convert_descriptors_to_direct_statement( subjects=subjects, predicate_type=predicate_type, # https://github.com/in-toto/attestation/issues/374 - predicate={"unused":"Unused, just passed due to API requirements"}, + predicate={"unused": "Unused, just passed due to API requirements"}, ) @@ -735,9 +736,7 @@ class ShardDigestsIntotoPayload(IntotoPayload): See also https://github.com/sigstore/sigstore-python/issues/1018. """ - predicate_type: Final[str] = ( - "https://model_signing/ShardDigests/v0.1" - ) + predicate_type: Final[str] = "https://model_signing/ShardDigests/v0.1" def __init__(self, statement: statement.Statement): """Builds an instance of this in-toto payload. diff --git a/src/model_signing/signing/sigstore.py b/src/model_signing/signing/sigstore.py index d6162da7..10da0271 100644 --- a/src/model_signing/signing/sigstore.py +++ b/src/model_signing/signing/sigstore.py @@ -32,8 +32,9 @@ from model_signing.signing import in_toto from model_signing.signing import signing -_IN_TOTO_JSON_PAYLOAD_TYPE : str = "application/vnd.in-toto+json" -_IN_TOTO_STATEMENT_TYPE : str = "https://in-toto.io/Statement/v1" + +_IN_TOTO_JSON_PAYLOAD_TYPE: str = "application/vnd.in-toto+json" +_IN_TOTO_STATEMENT_TYPE: str = "https://in-toto.io/Statement/v1" class SigstoreSignature(signing.Signature): @@ -113,14 +114,14 @@ def __init__( is supposed to be set to True only when testing. Default is False. """ if use_staging: - self._signing_context = sigstore_signer.SigningContext.staging() - self._issuer = sigstore_oidc.Issuer.staging() + self._signing_context = sigstore_signer.SigningContext.staging() + self._issuer = sigstore_oidc.Issuer.staging() else: - self._signing_context = sigstore_signer.SigningContext.production() - if oidc_issuer is not None: - self._issuer = sigstore_oidc.Issuer(oidc_issuer) - else: - self._issuer = sigstore_oidc.Issuer.production() + self._signing_context = sigstore_signer.SigningContext.production() + if oidc_issuer is not None: + self._issuer = sigstore_oidc.Issuer(oidc_issuer) + else: + self._issuer = sigstore_oidc.Issuer.production() self._use_ambient_credentials = use_ambient_credentials @@ -212,11 +213,7 @@ class SigstoreVerifier(signing.Verifier): """ def __init__( - self, - *, - identity: str, - oidc_issuer: str, - use_staging: bool = False, + self, *, identity: str, oidc_issuer: str, use_staging: bool = False ): """Initializes Sigstore verifiers. @@ -232,9 +229,9 @@ def __init__( is supposed to be set to True only when testing. Default is False. """ if use_staging: - self._verifier = sigstore_verifier.Verifier.staging() + self._verifier = sigstore_verifier.Verifier.staging() else: - self._verifier = sigstore_verifier.Verifier.production() + self._verifier = sigstore_verifier.Verifier.production() # TODO: https://github.com/sigstore/model-transparency/issues/271 - # Support additional verification policies @@ -303,7 +300,7 @@ def verify(self, signature: signing.Signature) -> manifest.DigestManifest: self._verifier.verify_artifact( input_=self._expected_digest, bundle=signature.bundle, - policy=self._policy + policy=self._policy, ) digest = hashing.Digest("sha256", self._expected_digest) @@ -335,8 +332,7 @@ def verify(self, signature: signing.Signature) -> manifest.Manifest: raise TypeError("Only `SigstoreSignature` signatures are supported") payload_type, payload = self._verifier.verify_dsse( - bundle=signature.bundle, - policy=self._policy + bundle=signature.bundle, policy=self._policy ) if payload_type != _IN_TOTO_JSON_PAYLOAD_TYPE: diff --git a/tests/conftest.py b/tests/conftest.py index 82e0793f..efd76117 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -106,9 +106,10 @@ def deep_model_folder(tmp_path_factory): return model_root + @pytest.fixture def symlink_model_folder( - tmp_path_factory: pytest.TempPathFactory + tmp_path_factory: pytest.TempPathFactory, ) -> pathlib.Path: """A model folder with a symlink to an external file.""" external_file = tmp_path_factory.mktemp("external") / "file" diff --git a/tests/hashing/file_test.py b/tests/hashing/file_test.py index 3902a3b1..3b118da9 100644 --- a/tests/hashing/file_test.py +++ b/tests/hashing/file_test.py @@ -19,6 +19,7 @@ from model_signing.hashing import file from model_signing.hashing import memory + # some constants used throughout testing _HEADER: str = "Some " _CONTENT: str = "text." # note that these have the same length @@ -65,7 +66,6 @@ def expected_content_digest(): class TestSimpleFileHasher: - def test_fails_with_negative_chunk_size(self): with pytest.raises(ValueError, match="Chunk size must be non-negative"): file.SimpleFileHasher(_UNUSED_PATH, memory.SHA256(), chunk_size=-2) @@ -151,7 +151,6 @@ def test_digest_size(self): class TestShardedFileHasher: - def test_fails_with_negative_shard_size(self): with pytest.raises( ValueError, match="Shard size must be strictly positive" @@ -415,7 +414,6 @@ def test_digest_size(self): class TestOpenedFileHasher: - def test_hash_of_known_file(self, sample_file, expected_digest): with open(sample_file, "rb") as f: hasher = file.OpenedFileHasher(f) diff --git a/tests/hashing/memory_test.py b/tests/hashing/memory_test.py index a1d847f3..2838a561 100644 --- a/tests/hashing/memory_test.py +++ b/tests/hashing/memory_test.py @@ -16,7 +16,6 @@ class TestSHA256: - def test_hash_known_value(self): hasher = memory.SHA256(b"Test string") digest = hasher.compute() @@ -72,7 +71,6 @@ def test_digest_size(self): class TestBLAKE2: - def test_hash_known_value(self): hasher = memory.BLAKE2(b"Test string") digest = hasher.compute() diff --git a/tests/manifest/manifest_test.py b/tests/manifest/manifest_test.py index a5466098..7458efe7 100644 --- a/tests/manifest/manifest_test.py +++ b/tests/manifest/manifest_test.py @@ -21,7 +21,6 @@ class TestDigestManifest: - def test_manifest_has_just_one_resource_descriptor(self): digest = hashing.Digest("test", b"test_digest") manifest_file = manifest.DigestManifest(digest) @@ -40,7 +39,6 @@ def test_manifest_has_the_correct_resource_descriptor(self): class TestFileLevelManifest: - def test_insert_order_does_not_matter(self): path1 = pathlib.PurePath("file1") digest1 = hashing.Digest("test", b"abcd") @@ -90,7 +88,6 @@ def test_manifest_has_the_correct_resource_descriptors(self): class TestShard: - def test_round_trip_from_shard(self): shard = manifest.Shard(pathlib.PurePosixPath("file"), 0, 42) shard_str = str(shard) @@ -127,7 +124,6 @@ def test_invalid_shard_bad_type_for_endart_offset(self): class TestShardLevelManifest: - def test_insert_order_does_not_matter(self): path1 = pathlib.PurePath("file1") digest1 = hashing.Digest("test", b"abcd") diff --git a/tests/serialization/serialize_by_file_shard_test.py b/tests/serialization/serialize_by_file_shard_test.py index 2e016308..c0e0ad18 100644 --- a/tests/serialization/serialize_by_file_shard_test.py +++ b/tests/serialization/serialize_by_file_shard_test.py @@ -24,15 +24,14 @@ import pytest -from tests import test_support from model_signing.hashing import file from model_signing.hashing import memory from model_signing.manifest import manifest from model_signing.serialization import serialize_by_file_shard +from tests import test_support class TestDigestSerializer: - def _hasher_factory( self, path: pathlib.Path, start: int, end: int ) -> file.ShardedFileHasher: @@ -353,7 +352,6 @@ def _parse_shard_and_digest(line: str) -> tuple[manifest.Shard, str]: class TestManifestSerializer: - def _hasher_factory( self, path: pathlib.Path, start: int, end: int ) -> file.ShardedFileHasher: diff --git a/tests/serialization/serialize_by_file_test.py b/tests/serialization/serialize_by_file_test.py index 1996d351..d0922382 100644 --- a/tests/serialization/serialize_by_file_test.py +++ b/tests/serialization/serialize_by_file_test.py @@ -25,15 +25,14 @@ import pytest -from tests import test_support from model_signing.hashing import file from model_signing.hashing import memory from model_signing.manifest import manifest from model_signing.serialization import serialize_by_file +from tests import test_support class TestDigestSerializer: - @pytest.mark.parametrize("model_fixture_name", test_support.all_test_models) def test_known_models(self, request, model_fixture_name): # Set up variables (arrange) @@ -304,7 +303,6 @@ def test_ignore_list_respects_directories(self, sample_model_folder): class TestManifestSerializer: - def _hasher_factory(self, path: pathlib.Path) -> file.FileHasher: return file.SimpleFileHasher(path, memory.SHA256()) @@ -586,7 +584,6 @@ def test_ignore_list_respects_directories(self, sample_model_folder): class TestUtilities: - def test_check_file_or_directory_raises_on_pipes(self, sample_model_file): pipe = sample_model_file.with_name("pipe") diff --git a/tests/signature/key_test.py b/tests/signature/key_test.py index f98c4cf9..dd875624 100644 --- a/tests/signature/key_test.py +++ b/tests/signature/key_test.py @@ -22,6 +22,7 @@ from model_signing.signature.key import ECKeyVerifier from model_signing.signature.verifying import VerificationError + _PRIV_KEY_1 = b"""-----BEGIN EC PRIVATE KEY----- MHQCAQEEIDcpvDIigb10Ys3SbkoAd+yquWkiu/GW4Qx495pnsZh4oAcGBSuBBAAK oUQDQgAEU+HLGtq3jwrv3i3oT7pq3NAMnfoWBuPOeeiZOl32+7dpuhkbXs4nTDSC @@ -41,9 +42,9 @@ def __dump_keys(path: pathlib.Path) -> tuple[str, str]: - priv_key_path = path.joinpath('private.pem') + priv_key_path = path.joinpath("private.pem") priv_key_path.write_bytes(_PRIV_KEY_1) - pub_key_path = path.joinpath('public.pem') + pub_key_path = path.joinpath("public.pem") pub_key_path.write_bytes(_PUB_KEY_1) return str(priv_key_path), str(pub_key_path) @@ -52,14 +53,17 @@ def __get_stmnt() -> statement.Statement: return statement.Statement( subjects=[ res_desc.ResourceDescriptor( - name='abc', digest={'myhash': b'12345'}).pb, + name="abc", digest={"myhash": b"12345"} + ).pb, res_desc.ResourceDescriptor( - name='def', digest={'myhash': b'67890'}).pb, + name="def", digest={"myhash": b"67890"} + ).pb, res_desc.ResourceDescriptor( - name='ghi', digest={'myhash': b'11111'}).pb, + name="ghi", digest={"myhash": b"11111"} + ).pb, ], - predicate_type='model_signing/v1', - predicate={'name': 'unknown'}, + predicate_type="model_signing/v1", + predicate={"name": "unknown"}, ) @@ -75,7 +79,6 @@ def test_key_signature_success(tmp_path: pathlib.Path): verifier.verify(bdl) - def test_key_signature_failure(tmp_path: pathlib.Path): priv_key_path, pub_key_path = __dump_keys(tmp_path) @@ -85,7 +88,7 @@ def test_key_signature_failure(tmp_path: pathlib.Path): verifier = ECKeyVerifier.from_path(pub_key_path) bdl = signer.sign(stmnt) - bdl.dsse_envelope.signatures[0].sig += b'modified' + bdl.dsse_envelope.signatures[0].sig += b"modified" with pytest.raises(VerificationError): verifier.verify(bdl) diff --git a/tests/signing/as_bytes_test.py b/tests/signing/as_bytes_test.py index 59a97349..b53cda8f 100644 --- a/tests/signing/as_bytes_test.py +++ b/tests/signing/as_bytes_test.py @@ -22,15 +22,14 @@ import pytest -from tests import test_support from model_signing.hashing import file from model_signing.hashing import memory from model_signing.serialization import serialize_by_file from model_signing.signing import as_bytes +from tests import test_support class TestBytesPayload: - @pytest.mark.parametrize("model_fixture_name", test_support.all_test_models) def test_known_models(self, request, model_fixture_name): # Set up variables (arrange) diff --git a/tests/signing/empty_signing_test.py b/tests/signing/empty_signing_test.py index ab825c3c..0ac5239e 100644 --- a/tests/signing/empty_signing_test.py +++ b/tests/signing/empty_signing_test.py @@ -18,15 +18,14 @@ import pytest from typing_extensions import override -from tests import test_support from model_signing.hashing import hashing from model_signing.manifest import manifest from model_signing.signing import empty_signing from model_signing.signing import signing +from tests import test_support class TestEmptySigningPayload: - def test_build_from_digest_manifest(self): digest = hashing.Digest("test", b"test_digest") manifest_file = manifest.DigestManifest(digest) @@ -51,7 +50,6 @@ def test_build_from_itemized_manifest(self): class TestEmptySignature: - def test_write_and_read(self): signature = empty_signing.EmptySignature() signature.write(test_support.UNUSED_PATH) @@ -64,7 +62,6 @@ def test_write_and_read(self): class TestEmptySigner: - def test_sign_gives_empty_signature(self): payload = empty_signing.EmptySigningPayload() signer = empty_signing.EmptySigner() @@ -89,14 +86,12 @@ def read(cls, path: pathlib.Path) -> Self: class TestEmptyVerifier: - def test_only_empty_signatures_allowed(self): signature = _FakeSignature() verifier = empty_signing.EmptyVerifier() with pytest.raises( - TypeError, - match="Only `EmptySignature` instances are supported", + TypeError, match="Only `EmptySignature` instances are supported" ): verifier.verify(signature) @@ -104,8 +99,5 @@ def test_verification_always_fails(self): signature = empty_signing.EmptySignature() verifier = empty_signing.EmptyVerifier() - with pytest.raises( - ValueError, - match="Signature verification failed", - ): + with pytest.raises(ValueError, match="Signature verification failed"): verifier.verify(signature) diff --git a/tests/signing/in_toto_test.py b/tests/signing/in_toto_test.py index 1dc07575..05226266 100644 --- a/tests/signing/in_toto_test.py +++ b/tests/signing/in_toto_test.py @@ -26,7 +26,6 @@ from in_toto_attestation.v1 import statement_pb2 import pytest -from tests import test_support from model_signing.hashing import file from model_signing.hashing import hashing from model_signing.hashing import memory @@ -34,10 +33,10 @@ from model_signing.serialization import serialize_by_file from model_signing.serialization import serialize_by_file_shard from model_signing.signing import in_toto +from tests import test_support class TestSingleDigestIntotoPayload: - @pytest.mark.parametrize("model_fixture_name", test_support.all_test_models) def test_known_models(self, request, model_fixture_name): # Set up variables (arrange) @@ -91,7 +90,6 @@ def test_only_runs_on_expected_manifest_types(self, sample_model_folder): class TestDigestOfDigestsIntotoPayload: - def _hasher_factory(self, path: pathlib.Path) -> file.FileHasher: return file.SimpleFileHasher(path, memory.SHA256()) @@ -140,14 +138,12 @@ def test_only_runs_on_expected_manifest_types(self): manifest = manifest_module.DigestManifest(digest) with pytest.raises( - TypeError, - match="Only FileLevelManifest is supported", + TypeError, match="Only FileLevelManifest is supported" ): in_toto.DigestOfDigestsIntotoPayload.from_manifest(manifest) class TestDigestOfShardDigestsIntotoPayload: - def _hasher_factory( self, path: pathlib.Path, start: int, end: int ) -> file.ShardedFileHasher: @@ -204,14 +200,12 @@ def test_only_runs_on_expected_manifest_types(self): manifest = manifest_module.DigestManifest(digest) with pytest.raises( - TypeError, - match="Only ShardLevelManifest is supported", + TypeError, match="Only ShardLevelManifest is supported" ): in_toto.DigestOfShardDigestsIntotoPayload.from_manifest(manifest) class TestDigestsIntotoPayload: - def _hasher_factory(self, path: pathlib.Path) -> file.FileHasher: return file.SimpleFileHasher(path, memory.SHA256()) @@ -260,14 +254,12 @@ def test_only_runs_on_expected_manifest_types(self): manifest = manifest_module.DigestManifest(digest) with pytest.raises( - TypeError, - match="Only FileLevelManifest is supported", + TypeError, match="Only FileLevelManifest is supported" ): in_toto.DigestsIntotoPayload.from_manifest(manifest) class TestShardDigestsIntotoPayload: - def _hasher_factory( self, path: pathlib.Path, start: int, end: int ) -> file.ShardedFileHasher: @@ -311,9 +303,7 @@ def test_produces_valid_statements(self, sample_model_folder): ) manifest = serializer.serialize(sample_model_folder) - payload = in_toto.ShardDigestsIntotoPayload.from_manifest( - manifest - ) + payload = in_toto.ShardDigestsIntotoPayload.from_manifest(manifest) payload.statement.validate() @@ -322,7 +312,6 @@ def test_only_runs_on_expected_manifest_types(self): manifest = manifest_module.DigestManifest(digest) with pytest.raises( - TypeError, - match="Only ShardLevelManifest is supported", + TypeError, match="Only ShardLevelManifest is supported" ): in_toto.ShardDigestsIntotoPayload.from_manifest(manifest) diff --git a/tests/test_support.py b/tests/test_support.py index 1b6676f3..0791595f 100644 --- a/tests/test_support.py +++ b/tests/test_support.py @@ -19,6 +19,7 @@ from model_signing.manifest import manifest + # Model contents KNOWN_MODEL_TEXT: bytes = b"This is a simple model" ANOTHER_MODEL_TEXT: bytes = b"This is another simple model" @@ -101,6 +102,7 @@ def extract_items_from_manifest( for path, digest in manifest._item_to_digest.items() } + def count_files(path: pathlib.Path) -> int: """Counts the number of files that are children of path. From 7e910c78621279d66ba5c223bf34d981ade356fc Mon Sep 17 00:00:00 2001 From: Mihai Maruseac Date: Tue, 13 Aug 2024 17:42:23 -0700 Subject: [PATCH 06/11] Add `pytype` support via `hatch run type:check` This builds a custom environment in which we run `pytype` for just the library and the test. Unlike style linting, here we completely ignore `slsa_for_models`. Signed-off-by: Mihai Maruseac --- pyproject.toml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 98c1c7a0..99734f2c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,6 +60,20 @@ installer = "pip" parallel = true randomize = true +[tool.hatch.envs.type] +description = """Custom environment for pytype. +Use `hatch run type:check` to check types. +""" +extra-dependencies = [ + "pytest", + "pytype", +] +installer = "pip" +python = "3.11" + +[tool.hatch.envs.type.scripts] +check = "pytype -k -j auto src tests" + [tool.ruff] line-length = 80 From 2dd5c872bb8e6e4097ff5659558b4cb415090f23 Mon Sep 17 00:00:00 2001 From: Mihai Maruseac Date: Tue, 13 Aug 2024 17:49:35 -0700 Subject: [PATCH 07/11] Update `.gitignore` to exclude all cache artifacts Signed-off-by: Mihai Maruseac --- .gitignore | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index b94a2f0e..04decd85 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ -__pycache__/ -.venv/ .pytest_cache/ -test_material/ \ No newline at end of file +.pytype/ +.ruff_cache/ +.venv/ +__pycache__/ +dist/ From 2cd0cd79efbffdd0db4a50574e7e30caadbe62f4 Mon Sep 17 00:00:00 2001 From: Mihai Maruseac Date: Mon, 12 Aug 2024 20:45:40 -0700 Subject: [PATCH 08/11] Update GHAs to use hatch for testing and linting The scripts are now much simpler and easier to update to newer versions of Python. I also added copyright notices to all files. Removed the workflows that are no longer relevant (slsa_for_ml needs to be pinned right now to first make sure it works -- probably we'll move it to a separate repo). Signed-off-by: Mihai Maruseac --- .github/workflows/codeql.yml | 14 +++ .github/workflows/dependency_review.yml | 4 +- .github/workflows/lint.yml | 51 +++++---- .github/workflows/pin_deps.yml | 117 --------------------- .github/workflows/scorecard.yml | 14 +++ .github/workflows/scripts/venv_activate.sh | 14 +++ .github/workflows/slsa_for_ml.yml | 14 +++ .github/workflows/unit_tests.yml | 50 ++++----- .github/workflows/validate_deps.yml | 73 ------------- pyproject.toml | 3 + 10 files changed, 105 insertions(+), 249 deletions(-) delete mode 100644 .github/workflows/pin_deps.yml delete mode 100644 .github/workflows/validate_deps.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index c971693b..30f041d0 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -1,3 +1,17 @@ +# Copyright 2024 The Sigstore Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: "CodeQL" on: diff --git a/.github/workflows/dependency_review.yml b/.github/workflows/dependency_review.yml index 065ea6b7..bb0826c8 100644 --- a/.github/workflows/dependency_review.yml +++ b/.github/workflows/dependency_review.yml @@ -1,10 +1,10 @@ -# Copyright Google LLC +# Copyright 2024 The Sigstore Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# http://www.apache.org/licenses/LICENSE-2.0 +# http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 37f2a52c..c09e3291 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,3 +1,17 @@ +# Copyright 2024 The Sigstore Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: Lint on: @@ -16,8 +30,9 @@ jobs: uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Detect empty lines at end of file and trailing whitespace run: | - set -euxo pipefail # No -x here! + set -euxo pipefail failed=0 + # First, check for empty files at end for file in $(for f in $(git ls-files --eol | grep 'i/[cr]*lf' | awk '{print $4}'); do egrep -l "^$" $file; done); do line=$(wc -l "$file" | cut -d ' ' -f1) @@ -54,19 +69,10 @@ jobs: steps: - name: Check out source repository uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - - name: Set up Python environment - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - with: - python-version: "3.11" - - name: run pytype - run: | - python -m venv venv - .github/workflows/scripts/venv_activate.sh - pip install -r model_signing/install/requirements_Linux.txt - pip install -r model_signing/install/requirements_test_Linux.txt - pip install -r model_signing/install/requirements_dev_Linux.txt - # TODO: https://github.com/sigstore/model-transparency/issues/231 - Support all repo - pytype --keep-going model_signing/{conftest.py,hashing,manifest,serialization,signature,signing} + - name: Set up Hatch + uses: pypa/hatch@a3c83ab3d481fbc2dc91dd0088628817488dd1d5 + - name: Run type check + run: hatch run type:check ruff-lint: runs-on: ubuntu-latest @@ -74,16 +80,7 @@ jobs: steps: - name: Check out source repository uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - - name: Set up Python environment - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - with: - python-version: "3.11" - - name: run ruff - run: | - python -m venv venv - .github/workflows/scripts/venv_activate.sh - pip install -r model_signing/install/requirements_Linux.txt - pip install -r model_signing/install/requirements_test_Linux.txt - pip install -r model_signing/install/requirements_dev_Linux.txt - # TODO: https://github.com/sigstore/model-transparency/issues/231 - Support all repo - ruff check model_signing/{conftest.py,hashing,manifest,serialization,signature,signing} + - name: Set up Hatch + uses: pypa/hatch@a3c83ab3d481fbc2dc91dd0088628817488dd1d5 + - name: Run python linting + run: hatch fmt --check diff --git a/.github/workflows/pin_deps.yml b/.github/workflows/pin_deps.yml deleted file mode 100644 index cebb4a03..00000000 --- a/.github/workflows/pin_deps.yml +++ /dev/null @@ -1,117 +0,0 @@ -name: Pin dependencies -on: - workflow_dispatch: - schedule: - - cron: '0 0 * * TUE' # run every Tuesday at midnight - -permissions: {} - -defaults: - run: - shell: bash - -jobs: - pin: - name: Generate dependency lock - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false # Don't cancel other jobs if one fails - matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - include: - - os: ubuntu-latest - os_family: Linux - - os: macos-latest - os_family: Darwin - - os: windows-latest - os_family: Windows - steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - with: - python-version: 3.11 - cache: pip - cache-dependency-path: | - model_signing/install/requirements_${{ matrix.os_family }}.txt - model_signing/install/requirements_test_${{ matrix.os_family }}.txt - model_signing/install/requirements_dev_${{ matrix.os_family }}.txt - slsa_for_models/install/requirements_${{ matrix.os_family }}.txt - - name: Create an empty virtualenv and install `pip-tools` - run: | - set -exuo pipefail - python -m venv venv - .github/workflows/scripts/venv_activate.sh - pip install pip-tools - pip list # For debugging - - name: Use `pip-compile` to generate all freeze files - run: | - set -exuo pipefail - .github/workflows/scripts/venv_activate.sh - pip-compile --upgrade --generate-hashes --strip-extras --output-file=model_signing/install/requirements_${{ matrix.os_family }}.txt model_signing/install/requirements.in - pip-compile --upgrade --generate-hashes --strip-extras --output-file=model_signing/install/requirements_test_${{ matrix.os_family }}.txt model_signing/install/requirements_test.in - pip-compile --upgrade --generate-hashes --strip-extras --output-file=slsa_for_models/install/requirements_${{ matrix.os_family }}.txt slsa_for_models/install/requirements.in - # pytype doesn't support Windows - if [[ "${{ matrix.os_family }}" != "Windows" ]]; then - pip-compile --upgrade --generate-hashes --strip-extras --output-file=model_signing/install/requirements_dev_${{ matrix.os_family }}.txt model_signing/install/requirements_dev.in - fi - - name: Test freeze file (for model signing) - run: | - set -exuo pipefail - rm -rf venv # Need clean sandbox - python -m venv venv - .github/workflows/scripts/venv_activate.sh - pip install -r model_signing/install/requirements_${{ matrix.os_family }}.txt - pip list # For debugging - - name: Test freeze file (for testing model signing) - run: | - set -exuo pipefail - rm -rf venv # Need clean sandbox - python -m venv venv - .github/workflows/scripts/venv_activate.sh - pip install -r model_signing/install/requirements_test_${{ matrix.os_family }}.txt - pip list # For debugging - - name: Test freeze file (for dev tools model signing) - if: ${{ matrix.os_family != 'Windows' }} # pytype doesn't support Windows - run: | - set -exuo pipefail - rm -rf venv # Need clean sandbox - python -m venv venv - .github/workflows/scripts/venv_activate.sh - pip install -r model_signing/install/requirements_dev_${{ matrix.os_family }}.txt - pip list # For debugging - - name: Test freeze file (for SLSA for models) - run: | - set -exuo pipefail - rm -rf venv # Need clean sandbox - python -m venv venv - .github/workflows/scripts/venv_activate.sh - pip install -r slsa_for_models/install/requirements_${{ matrix.os_family }}.txt - pip list # For debugging - - name: Upload freeze files - uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 - with: - name: freeze-files-${{ matrix.os }} - path: ./*/install/requirements*${{ matrix.os_family }}*txt - - # Separate PR creation job to make sure it creates only one single PR with - # all changed files, eliminate race-conditions and restrict permissions only - # to this specific job. - create-pr: - needs: [pin] - runs-on: ubuntu-latest - permissions: - contents: write - pull-requests: write - steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 - with: - path: . - merge-multiple: true - - name: Create dependent PR with dependency changes - uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c # v6.1.0 - with: - title: "Update frozen python dependencies" - commit-message: "Bump frozen dependencies" - signoff: true - delete-branch: true diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 263ed53f..c63d5c80 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -1,3 +1,17 @@ +# Copyright 2024 The Sigstore Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + # This workflow uses actions that are not certified by GitHub. They are provided # by a third-party and are governed by separate terms of service, privacy # policy, and support documentation. diff --git a/.github/workflows/scripts/venv_activate.sh b/.github/workflows/scripts/venv_activate.sh index f2d8a85b..e899cc80 100755 --- a/.github/workflows/scripts/venv_activate.sh +++ b/.github/workflows/scripts/venv_activate.sh @@ -1,3 +1,17 @@ +# Copyright 2024 The Sigstore Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + #!/bin/bash # shellcheck source=/dev/null diff --git a/.github/workflows/slsa_for_ml.yml b/.github/workflows/slsa_for_ml.yml index 92273e78..124cc9b6 100644 --- a/.github/workflows/slsa_for_ml.yml +++ b/.github/workflows/slsa_for_ml.yml @@ -1,3 +1,17 @@ +# Copyright 2024 The Sigstore Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: SLSA for ML models example on: workflow_dispatch: diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index ad778bec..a57e39c5 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -1,3 +1,17 @@ +# Copyright 2024 The Sigstore Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: Run unit tests on: pull_request: @@ -15,40 +29,16 @@ defaults: jobs: model-signing-unit-tests: - name: Run unit tests for signing + name: Signing with Python ${{ matrix.python-version }} on ${{ startsWith(matrix.os, 'macos-') && 'macOS' || startsWith(matrix.os, 'windows-') && 'Windows' || 'Linux' }} runs-on: ${{ matrix.os }} strategy: fail-fast: false # Don't cancel other jobs if one fails matrix: os: [ubuntu-latest, macos-latest, windows-latest] - include: - - os: macos-latest - os_family: Darwin - - os: ubuntu-latest - os_family: Linux - - os: windows-latest - os_family: Windows + python-version: ['3.11', '3.12'] steps: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - with: - python-version: 3.11 - cache: pip - cache-dependency-path: | - model_signing/install/requirements_${{ matrix.os_family }}.txt - model_signing/install/requirements_test_${{ matrix.os_family }}.txt - - name: Install dependencies - run: | - set -exuo pipefail - python -m venv venv - .github/workflows/scripts/venv_activate.sh - python -m pip install --require-hashes -r model_signing/install/requirements_${{ matrix.os_family }}.txt - python -m pip install --require-hashes -r model_signing/install/requirements_test_${{ matrix.os_family }}.txt - - name: Run unit tests - run: | - set -euo pipefail - .github/workflows/scripts/venv_activate.sh - # NOTE: option --full-trace may be useful for troubleshooting. - # TODO(#68): Remove the need to create this folder. - mkdir testdata - pytest -v . + - name: Set up Hatch + uses: pypa/hatch@a3c83ab3d481fbc2dc91dd0088628817488dd1d5 + - name: Run unit tests (with coverage report at the end) + run: hatch test -c -py ${{ matrix.python-version }} diff --git a/.github/workflows/validate_deps.yml b/.github/workflows/validate_deps.yml deleted file mode 100644 index df68800c..00000000 --- a/.github/workflows/validate_deps.yml +++ /dev/null @@ -1,73 +0,0 @@ -name: Validate all Python dependencies work together -on: - push: - branches: [main] - pull_request: - branches: [main] - types: [opened, synchronize] - paths-ignore: - - '**/*.md' - - '*.md' - -permissions: {} - -defaults: - run: - shell: bash - -jobs: - model-signing: - name: Test model signing dependencies - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false # Don't cancel other jobs if one fails - matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - include: - - os: macos-latest - os_family: Darwin - - os: ubuntu-latest - os_family: Linux - - os: windows-latest - os_family: Windows - steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - with: - python-version: 3.11 - cache: pip - cache-dependency-path: model_signing/install/requirements_${{ matrix.os_family }}.txt - - name: Install dependencies - run: | - set -exuo pipefail - python -m venv venv - .github/workflows/scripts/venv_activate.sh - python -m pip install --require-hashes -r model_signing/install/requirements_${{ matrix.os_family }}.txt - - slsa-for-ml: - name: Test SLSA for ML demo dependencies - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false # Don't cancel other jobs if one fails - matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - include: - - os: macos-latest - os_family: Darwin - - os: ubuntu-latest - os_family: Linux - - os: windows-latest - os_family: Windows - steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - - uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1 - with: - python-version: 3.11 - cache: pip - cache-dependency-path: slsa_for_models/install/requirements_${{ matrix.os_family }}.txt - - name: Install dependencies - run: | - set -exuo pipefail - python -m venv venv - .github/workflows/scripts/venv_activate.sh - python -m pip install --require-hashes -r slsa_for_models/install/requirements_${{ matrix.os_family }}.txt diff --git a/pyproject.toml b/pyproject.toml index 99734f2c..c9ecc9b2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,6 +60,9 @@ installer = "pip" parallel = true randomize = true +[[tool.hatch.envs.hatch-test.matrix]] +python = ["3.11", "3.12"] + [tool.hatch.envs.type] description = """Custom environment for pytype. Use `hatch run type:check` to check types. From 90831d6a4916ee77432a8b9bf3f480f1499f4065 Mon Sep 17 00:00:00 2001 From: Mihai Maruseac Date: Wed, 14 Aug 2024 09:20:26 -0700 Subject: [PATCH 09/11] Remove old model signing requirements files. We now use hatch to install and manage the dependencies. Signed-off-by: Mihai Maruseac --- install/requirements.in | 9 - install/requirements_Darwin.txt | 552 -------------------------- install/requirements_Linux.txt | 552 -------------------------- install/requirements_Windows.txt | 552 -------------------------- install/requirements_dev.in | 2 - install/requirements_dev_Darwin.txt | 284 ------------- install/requirements_dev_Linux.txt | 284 ------------- install/requirements_test.in | 1 - install/requirements_test_Darwin.txt | 22 - install/requirements_test_Linux.txt | 22 - install/requirements_test_Windows.txt | 26 -- 11 files changed, 2306 deletions(-) delete mode 100644 install/requirements.in delete mode 100644 install/requirements_Darwin.txt delete mode 100644 install/requirements_Linux.txt delete mode 100644 install/requirements_Windows.txt delete mode 100644 install/requirements_dev.in delete mode 100644 install/requirements_dev_Darwin.txt delete mode 100644 install/requirements_dev_Linux.txt delete mode 100644 install/requirements_test.in delete mode 100644 install/requirements_test_Darwin.txt delete mode 100644 install/requirements_test_Linux.txt delete mode 100644 install/requirements_test_Windows.txt diff --git a/install/requirements.in b/install/requirements.in deleted file mode 100644 index 0fd24582..00000000 --- a/install/requirements.in +++ /dev/null @@ -1,9 +0,0 @@ -absl-py -betterproto -cryptography -in-toto-attestation -pyOpenSSL -protobuf -psutil -sigstore -sigstore-protobuf-specs diff --git a/install/requirements_Darwin.txt b/install/requirements_Darwin.txt deleted file mode 100644 index ca54acb8..00000000 --- a/install/requirements_Darwin.txt +++ /dev/null @@ -1,552 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --generate-hashes --output-file=model_signing/install/requirements_Darwin.txt --strip-extras model_signing/install/requirements.in -# -absl-py==2.1.0 \ - --hash=sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308 \ - --hash=sha256:7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff - # via -r model_signing/install/requirements.in -annotated-types==0.7.0 \ - --hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 \ - --hash=sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89 - # via pydantic -betterproto==2.0.0b6 \ - --hash=sha256:720ae92697000f6fcf049c69267d957f0871654c8b0d7458906607685daee784 \ - --hash=sha256:a0839ec165d110a69d0d116f4d0e2bec8d186af4db826257931f0831dab73fcf - # via - # -r model_signing/install/requirements.in - # sigstore-protobuf-specs -certifi==2024.7.4 \ - --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ - --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 - # via requests -cffi==1.16.0 \ - --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ - --hash=sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a \ - --hash=sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417 \ - --hash=sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab \ - --hash=sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520 \ - --hash=sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36 \ - --hash=sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743 \ - --hash=sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8 \ - --hash=sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed \ - --hash=sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684 \ - --hash=sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56 \ - --hash=sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324 \ - --hash=sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d \ - --hash=sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235 \ - --hash=sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e \ - --hash=sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088 \ - --hash=sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000 \ - --hash=sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7 \ - --hash=sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e \ - --hash=sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673 \ - --hash=sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c \ - --hash=sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe \ - --hash=sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2 \ - --hash=sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098 \ - --hash=sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8 \ - --hash=sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a \ - --hash=sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0 \ - --hash=sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b \ - --hash=sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896 \ - --hash=sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e \ - --hash=sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9 \ - --hash=sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2 \ - --hash=sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b \ - --hash=sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6 \ - --hash=sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404 \ - --hash=sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f \ - --hash=sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0 \ - --hash=sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4 \ - --hash=sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc \ - --hash=sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936 \ - --hash=sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba \ - --hash=sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872 \ - --hash=sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb \ - --hash=sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614 \ - --hash=sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1 \ - --hash=sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d \ - --hash=sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969 \ - --hash=sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b \ - --hash=sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4 \ - --hash=sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627 \ - --hash=sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956 \ - --hash=sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357 - # via cryptography -charset-normalizer==3.3.2 \ - --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ - --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \ - --hash=sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786 \ - --hash=sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8 \ - --hash=sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09 \ - --hash=sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185 \ - --hash=sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574 \ - --hash=sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e \ - --hash=sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519 \ - --hash=sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898 \ - --hash=sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269 \ - --hash=sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3 \ - --hash=sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f \ - --hash=sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6 \ - --hash=sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8 \ - --hash=sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a \ - --hash=sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73 \ - --hash=sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc \ - --hash=sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714 \ - --hash=sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2 \ - --hash=sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc \ - --hash=sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce \ - --hash=sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d \ - --hash=sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e \ - --hash=sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6 \ - --hash=sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269 \ - --hash=sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 \ - --hash=sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d \ - --hash=sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a \ - --hash=sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4 \ - --hash=sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77 \ - --hash=sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d \ - --hash=sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0 \ - --hash=sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed \ - --hash=sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068 \ - --hash=sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac \ - --hash=sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25 \ - --hash=sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 \ - --hash=sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab \ - --hash=sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26 \ - --hash=sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2 \ - --hash=sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db \ - --hash=sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f \ - --hash=sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5 \ - --hash=sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99 \ - --hash=sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c \ - --hash=sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d \ - --hash=sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811 \ - --hash=sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa \ - --hash=sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a \ - --hash=sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03 \ - --hash=sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b \ - --hash=sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04 \ - --hash=sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c \ - --hash=sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001 \ - --hash=sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458 \ - --hash=sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389 \ - --hash=sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99 \ - --hash=sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985 \ - --hash=sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537 \ - --hash=sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238 \ - --hash=sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f \ - --hash=sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d \ - --hash=sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796 \ - --hash=sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a \ - --hash=sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143 \ - --hash=sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8 \ - --hash=sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c \ - --hash=sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5 \ - --hash=sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5 \ - --hash=sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711 \ - --hash=sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4 \ - --hash=sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6 \ - --hash=sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c \ - --hash=sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7 \ - --hash=sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4 \ - --hash=sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b \ - --hash=sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae \ - --hash=sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12 \ - --hash=sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c \ - --hash=sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae \ - --hash=sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8 \ - --hash=sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887 \ - --hash=sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b \ - --hash=sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4 \ - --hash=sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f \ - --hash=sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5 \ - --hash=sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33 \ - --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ - --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 - # via requests -cryptography==43.0.0 \ - --hash=sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709 \ - --hash=sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069 \ - --hash=sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2 \ - --hash=sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b \ - --hash=sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e \ - --hash=sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70 \ - --hash=sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778 \ - --hash=sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22 \ - --hash=sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895 \ - --hash=sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf \ - --hash=sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431 \ - --hash=sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f \ - --hash=sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947 \ - --hash=sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74 \ - --hash=sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc \ - --hash=sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66 \ - --hash=sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66 \ - --hash=sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf \ - --hash=sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f \ - --hash=sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5 \ - --hash=sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e \ - --hash=sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f \ - --hash=sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55 \ - --hash=sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1 \ - --hash=sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47 \ - --hash=sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5 \ - --hash=sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0 - # via - # -r model_signing/install/requirements.in - # pyopenssl - # sigstore -dnspython==2.6.1 \ - --hash=sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50 \ - --hash=sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc - # via email-validator -email-validator==2.2.0 \ - --hash=sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631 \ - --hash=sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7 - # via pydantic -grpclib==0.4.7 \ - --hash=sha256:2988ef57c02b22b7a2e8e961792c41ccf97efc2ace91ae7a5b0de03c363823c3 - # via betterproto -h2==4.1.0 \ - --hash=sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d \ - --hash=sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb - # via grpclib -hpack==4.0.0 \ - --hash=sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c \ - --hash=sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095 - # via h2 -hyperframe==6.0.1 \ - --hash=sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15 \ - --hash=sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914 - # via h2 -id==1.4.0 \ - --hash=sha256:23c06772e8bd3e3a44ee3f167868bf5a8e385b0c1e2cc707ad36eb7486b4765b \ - --hash=sha256:a0391117c98fa9851ebd2b22df0dc6fd6aacbd89a4ec95c173f1311ca9bb7329 - # via sigstore -idna==3.7 \ - --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ - --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 - # via - # email-validator - # requests -in-toto-attestation==0.9.3 \ - --hash=sha256:1f44d3f3bded1ed551e260c5e9f834ee05de03f1d2f360bada5a172c11d748ff \ - --hash=sha256:cc0cf97417d94953b9fee6e9d415a11c59b4d47cee4f13746ffe935b28e3e8c4 - # via -r model_signing/install/requirements.in -markdown-it-py==3.0.0 \ - --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ - --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb - # via rich -mdurl==0.1.2 \ - --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ - --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba - # via markdown-it-py -multidict==6.0.5 \ - --hash=sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556 \ - --hash=sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c \ - --hash=sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29 \ - --hash=sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b \ - --hash=sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8 \ - --hash=sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7 \ - --hash=sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd \ - --hash=sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40 \ - --hash=sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6 \ - --hash=sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3 \ - --hash=sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c \ - --hash=sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9 \ - --hash=sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5 \ - --hash=sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae \ - --hash=sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442 \ - --hash=sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9 \ - --hash=sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc \ - --hash=sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c \ - --hash=sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea \ - --hash=sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5 \ - --hash=sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50 \ - --hash=sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182 \ - --hash=sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453 \ - --hash=sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e \ - --hash=sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600 \ - --hash=sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733 \ - --hash=sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda \ - --hash=sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241 \ - --hash=sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461 \ - --hash=sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e \ - --hash=sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e \ - --hash=sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b \ - --hash=sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e \ - --hash=sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7 \ - --hash=sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386 \ - --hash=sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd \ - --hash=sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9 \ - --hash=sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf \ - --hash=sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee \ - --hash=sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5 \ - --hash=sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a \ - --hash=sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271 \ - --hash=sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54 \ - --hash=sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4 \ - --hash=sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496 \ - --hash=sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb \ - --hash=sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319 \ - --hash=sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3 \ - --hash=sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f \ - --hash=sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527 \ - --hash=sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed \ - --hash=sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604 \ - --hash=sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef \ - --hash=sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8 \ - --hash=sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5 \ - --hash=sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5 \ - --hash=sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626 \ - --hash=sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c \ - --hash=sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d \ - --hash=sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c \ - --hash=sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc \ - --hash=sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc \ - --hash=sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b \ - --hash=sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38 \ - --hash=sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450 \ - --hash=sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1 \ - --hash=sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f \ - --hash=sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3 \ - --hash=sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755 \ - --hash=sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226 \ - --hash=sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a \ - --hash=sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046 \ - --hash=sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf \ - --hash=sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479 \ - --hash=sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e \ - --hash=sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1 \ - --hash=sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a \ - --hash=sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83 \ - --hash=sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929 \ - --hash=sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93 \ - --hash=sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a \ - --hash=sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c \ - --hash=sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44 \ - --hash=sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89 \ - --hash=sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba \ - --hash=sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e \ - --hash=sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da \ - --hash=sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24 \ - --hash=sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423 \ - --hash=sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef - # via grpclib -platformdirs==4.2.2 \ - --hash=sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee \ - --hash=sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3 - # via sigstore -protobuf==5.27.3 \ - --hash=sha256:043853dcb55cc262bf2e116215ad43fa0859caab79bb0b2d31b708f128ece035 \ - --hash=sha256:16ddf3f8c6c41e1e803da7abea17b1793a97ef079a912e42351eabb19b2cffe7 \ - --hash=sha256:68248c60d53f6168f565a8c76dc58ba4fa2ade31c2d1ebdae6d80f969cdc2d4f \ - --hash=sha256:82460903e640f2b7e34ee81a947fdaad89de796d324bcbc38ff5430bcdead82c \ - --hash=sha256:8572c6533e544ebf6899c360e91d6bcbbee2549251643d32c52cf8a5de295ba5 \ - --hash=sha256:a55c48f2a2092d8e213bd143474df33a6ae751b781dd1d1f4d953c128a415b25 \ - --hash=sha256:af7c0b7cfbbb649ad26132e53faa348580f844d9ca46fd3ec7ca48a1ea5db8a1 \ - --hash=sha256:b8a994fb3d1c11156e7d1e427186662b64694a62b55936b2b9348f0a7c6625ce \ - --hash=sha256:c2a105c24f08b1e53d6c7ffe69cb09d0031512f0b72f812dd4005b8112dbe91e \ - --hash=sha256:c84eee2c71ed83704f1afbf1a85c3171eab0fd1ade3b399b3fad0884cbcca8bf \ - --hash=sha256:dcb307cd4ef8fec0cf52cb9105a03d06fbb5275ce6d84a6ae33bc6cf84e0a07b - # via - # -r model_signing/install/requirements.in - # in-toto-attestation -psutil==6.0.0 \ - --hash=sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35 \ - --hash=sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0 \ - --hash=sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c \ - --hash=sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1 \ - --hash=sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3 \ - --hash=sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c \ - --hash=sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd \ - --hash=sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3 \ - --hash=sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0 \ - --hash=sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2 \ - --hash=sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6 \ - --hash=sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d \ - --hash=sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c \ - --hash=sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0 \ - --hash=sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132 \ - --hash=sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14 \ - --hash=sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0 - # via -r model_signing/install/requirements.in -pyasn1==0.6.0 \ - --hash=sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c \ - --hash=sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473 - # via sigstore -pycparser==2.22 \ - --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ - --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc - # via cffi -pydantic==2.8.2 \ - --hash=sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a \ - --hash=sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8 - # via - # id - # sigstore - # sigstore-rekor-types -pydantic-core==2.20.1 \ - --hash=sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d \ - --hash=sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f \ - --hash=sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686 \ - --hash=sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482 \ - --hash=sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006 \ - --hash=sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83 \ - --hash=sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6 \ - --hash=sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88 \ - --hash=sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86 \ - --hash=sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a \ - --hash=sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6 \ - --hash=sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a \ - --hash=sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6 \ - --hash=sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6 \ - --hash=sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43 \ - --hash=sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c \ - --hash=sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4 \ - --hash=sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e \ - --hash=sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203 \ - --hash=sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd \ - --hash=sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1 \ - --hash=sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24 \ - --hash=sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc \ - --hash=sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc \ - --hash=sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3 \ - --hash=sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598 \ - --hash=sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98 \ - --hash=sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331 \ - --hash=sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2 \ - --hash=sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a \ - --hash=sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6 \ - --hash=sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688 \ - --hash=sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91 \ - --hash=sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa \ - --hash=sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b \ - --hash=sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0 \ - --hash=sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840 \ - --hash=sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c \ - --hash=sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd \ - --hash=sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3 \ - --hash=sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231 \ - --hash=sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1 \ - --hash=sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953 \ - --hash=sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250 \ - --hash=sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a \ - --hash=sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2 \ - --hash=sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20 \ - --hash=sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434 \ - --hash=sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab \ - --hash=sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703 \ - --hash=sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a \ - --hash=sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2 \ - --hash=sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac \ - --hash=sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611 \ - --hash=sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121 \ - --hash=sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e \ - --hash=sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b \ - --hash=sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09 \ - --hash=sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906 \ - --hash=sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9 \ - --hash=sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7 \ - --hash=sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b \ - --hash=sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987 \ - --hash=sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c \ - --hash=sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b \ - --hash=sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e \ - --hash=sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237 \ - --hash=sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1 \ - --hash=sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19 \ - --hash=sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b \ - --hash=sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad \ - --hash=sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0 \ - --hash=sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94 \ - --hash=sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312 \ - --hash=sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f \ - --hash=sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669 \ - --hash=sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1 \ - --hash=sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe \ - --hash=sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99 \ - --hash=sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a \ - --hash=sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a \ - --hash=sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52 \ - --hash=sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c \ - --hash=sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad \ - --hash=sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1 \ - --hash=sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a \ - --hash=sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f \ - --hash=sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a \ - --hash=sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27 - # via pydantic -pygments==2.18.0 \ - --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ - --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a - # via rich -pyjwt==2.9.0 \ - --hash=sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850 \ - --hash=sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c - # via sigstore -pyopenssl==24.2.1 \ - --hash=sha256:4247f0dbe3748d560dcbb2ff3ea01af0f9a1a001ef5f7c4c647956ed8cbf0e95 \ - --hash=sha256:967d5719b12b243588573f39b0c677637145c7a1ffedcd495a487e58177fbb8d - # via - # -r model_signing/install/requirements.in - # sigstore -python-dateutil==2.9.0.post0 \ - --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ - --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 - # via betterproto -requests==2.32.3 \ - --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ - --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 - # via - # id - # sigstore - # tuf -rfc8785==0.1.3 \ - --hash=sha256:167efe3b5cdd09dded9d0cfc8fec1f48f5cd9f8f13b580ada4efcac138925048 \ - --hash=sha256:6116062831c62e7ac5d027973a1fe07b601ccd854bca4a2b401938a00a20b0c0 - # via sigstore -rich==13.7.1 \ - --hash=sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222 \ - --hash=sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432 - # via sigstore -securesystemslib==1.1.0 \ - --hash=sha256:100bf04e60b260e1c7c51e3232647697fde2c5ca5772fda4932d841d3fb6dd0e \ - --hash=sha256:27143a8e04b5573636f260f21d7e26b48bcedcf394e6f74ec31e9a5287e0c38b - # via tuf -sigstore==3.1.0 \ - --hash=sha256:3cfe2da19a053757a06bd9ecae322fa539fece7df3e8139d30e32172e41cb812 \ - --hash=sha256:cc0b52acff3ae25f7f1993e21dec4ebed44213c48e2ec095e8c06f69b3751fdf - # via -r model_signing/install/requirements.in -sigstore-protobuf-specs==0.3.2 \ - --hash=sha256:50c99fa6747a3a9c5c562a43602cf76df0b199af28f0e9d4319b6775630425ea \ - --hash=sha256:cae041b40502600b8a633f43c257695d0222a94efa1e5110a7ec7ada78c39d99 - # via - # -r model_signing/install/requirements.in - # sigstore -sigstore-rekor-types==0.0.13 \ - --hash=sha256:377fee942d5fc66437a4f54599472157149affaece9bbc7deb05e5b42f34ceba \ - --hash=sha256:63e9306a26931ed74411911948c250da7c5adc51c53507227738170424e6ae2d - # via sigstore -six==1.16.0 \ - --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ - --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 - # via python-dateutil -tuf==5.0.0 \ - --hash=sha256:91a4ca279c33222ac1451a5b0bcdcbbf12c965e0d22278bead5bf8d3ab95117a \ - --hash=sha256:9c5d87d3822ae2f83c756d5a208c6942a2829ae1ea63c18c363124497d04da4f - # via sigstore -typing-extensions==4.12.2 \ - --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ - --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 - # via - # pydantic - # pydantic-core -urllib3==2.2.2 \ - --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ - --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 - # via requests diff --git a/install/requirements_Linux.txt b/install/requirements_Linux.txt deleted file mode 100644 index 104c041d..00000000 --- a/install/requirements_Linux.txt +++ /dev/null @@ -1,552 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --generate-hashes --output-file=model_signing/install/requirements_Linux.txt --strip-extras model_signing/install/requirements.in -# -absl-py==2.1.0 \ - --hash=sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308 \ - --hash=sha256:7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff - # via -r model_signing/install/requirements.in -annotated-types==0.7.0 \ - --hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 \ - --hash=sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89 - # via pydantic -betterproto==2.0.0b6 \ - --hash=sha256:720ae92697000f6fcf049c69267d957f0871654c8b0d7458906607685daee784 \ - --hash=sha256:a0839ec165d110a69d0d116f4d0e2bec8d186af4db826257931f0831dab73fcf - # via - # -r model_signing/install/requirements.in - # sigstore-protobuf-specs -certifi==2024.7.4 \ - --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ - --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 - # via requests -cffi==1.16.0 \ - --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ - --hash=sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a \ - --hash=sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417 \ - --hash=sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab \ - --hash=sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520 \ - --hash=sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36 \ - --hash=sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743 \ - --hash=sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8 \ - --hash=sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed \ - --hash=sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684 \ - --hash=sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56 \ - --hash=sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324 \ - --hash=sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d \ - --hash=sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235 \ - --hash=sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e \ - --hash=sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088 \ - --hash=sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000 \ - --hash=sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7 \ - --hash=sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e \ - --hash=sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673 \ - --hash=sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c \ - --hash=sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe \ - --hash=sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2 \ - --hash=sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098 \ - --hash=sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8 \ - --hash=sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a \ - --hash=sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0 \ - --hash=sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b \ - --hash=sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896 \ - --hash=sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e \ - --hash=sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9 \ - --hash=sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2 \ - --hash=sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b \ - --hash=sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6 \ - --hash=sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404 \ - --hash=sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f \ - --hash=sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0 \ - --hash=sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4 \ - --hash=sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc \ - --hash=sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936 \ - --hash=sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba \ - --hash=sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872 \ - --hash=sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb \ - --hash=sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614 \ - --hash=sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1 \ - --hash=sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d \ - --hash=sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969 \ - --hash=sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b \ - --hash=sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4 \ - --hash=sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627 \ - --hash=sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956 \ - --hash=sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357 - # via cryptography -charset-normalizer==3.3.2 \ - --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ - --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \ - --hash=sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786 \ - --hash=sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8 \ - --hash=sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09 \ - --hash=sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185 \ - --hash=sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574 \ - --hash=sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e \ - --hash=sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519 \ - --hash=sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898 \ - --hash=sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269 \ - --hash=sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3 \ - --hash=sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f \ - --hash=sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6 \ - --hash=sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8 \ - --hash=sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a \ - --hash=sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73 \ - --hash=sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc \ - --hash=sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714 \ - --hash=sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2 \ - --hash=sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc \ - --hash=sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce \ - --hash=sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d \ - --hash=sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e \ - --hash=sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6 \ - --hash=sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269 \ - --hash=sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 \ - --hash=sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d \ - --hash=sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a \ - --hash=sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4 \ - --hash=sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77 \ - --hash=sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d \ - --hash=sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0 \ - --hash=sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed \ - --hash=sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068 \ - --hash=sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac \ - --hash=sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25 \ - --hash=sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 \ - --hash=sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab \ - --hash=sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26 \ - --hash=sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2 \ - --hash=sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db \ - --hash=sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f \ - --hash=sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5 \ - --hash=sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99 \ - --hash=sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c \ - --hash=sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d \ - --hash=sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811 \ - --hash=sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa \ - --hash=sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a \ - --hash=sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03 \ - --hash=sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b \ - --hash=sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04 \ - --hash=sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c \ - --hash=sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001 \ - --hash=sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458 \ - --hash=sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389 \ - --hash=sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99 \ - --hash=sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985 \ - --hash=sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537 \ - --hash=sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238 \ - --hash=sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f \ - --hash=sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d \ - --hash=sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796 \ - --hash=sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a \ - --hash=sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143 \ - --hash=sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8 \ - --hash=sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c \ - --hash=sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5 \ - --hash=sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5 \ - --hash=sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711 \ - --hash=sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4 \ - --hash=sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6 \ - --hash=sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c \ - --hash=sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7 \ - --hash=sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4 \ - --hash=sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b \ - --hash=sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae \ - --hash=sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12 \ - --hash=sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c \ - --hash=sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae \ - --hash=sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8 \ - --hash=sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887 \ - --hash=sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b \ - --hash=sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4 \ - --hash=sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f \ - --hash=sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5 \ - --hash=sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33 \ - --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ - --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 - # via requests -cryptography==43.0.0 \ - --hash=sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709 \ - --hash=sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069 \ - --hash=sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2 \ - --hash=sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b \ - --hash=sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e \ - --hash=sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70 \ - --hash=sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778 \ - --hash=sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22 \ - --hash=sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895 \ - --hash=sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf \ - --hash=sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431 \ - --hash=sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f \ - --hash=sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947 \ - --hash=sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74 \ - --hash=sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc \ - --hash=sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66 \ - --hash=sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66 \ - --hash=sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf \ - --hash=sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f \ - --hash=sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5 \ - --hash=sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e \ - --hash=sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f \ - --hash=sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55 \ - --hash=sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1 \ - --hash=sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47 \ - --hash=sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5 \ - --hash=sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0 - # via - # -r model_signing/install/requirements.in - # pyopenssl - # sigstore -dnspython==2.6.1 \ - --hash=sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50 \ - --hash=sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc - # via email-validator -email-validator==2.2.0 \ - --hash=sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631 \ - --hash=sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7 - # via pydantic -grpclib==0.4.7 \ - --hash=sha256:2988ef57c02b22b7a2e8e961792c41ccf97efc2ace91ae7a5b0de03c363823c3 - # via betterproto -h2==4.1.0 \ - --hash=sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d \ - --hash=sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb - # via grpclib -hpack==4.0.0 \ - --hash=sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c \ - --hash=sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095 - # via h2 -hyperframe==6.0.1 \ - --hash=sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15 \ - --hash=sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914 - # via h2 -id==1.4.0 \ - --hash=sha256:23c06772e8bd3e3a44ee3f167868bf5a8e385b0c1e2cc707ad36eb7486b4765b \ - --hash=sha256:a0391117c98fa9851ebd2b22df0dc6fd6aacbd89a4ec95c173f1311ca9bb7329 - # via sigstore -idna==3.7 \ - --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ - --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 - # via - # email-validator - # requests -in-toto-attestation==0.9.3 \ - --hash=sha256:1f44d3f3bded1ed551e260c5e9f834ee05de03f1d2f360bada5a172c11d748ff \ - --hash=sha256:cc0cf97417d94953b9fee6e9d415a11c59b4d47cee4f13746ffe935b28e3e8c4 - # via -r model_signing/install/requirements.in -markdown-it-py==3.0.0 \ - --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ - --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb - # via rich -mdurl==0.1.2 \ - --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ - --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba - # via markdown-it-py -multidict==6.0.5 \ - --hash=sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556 \ - --hash=sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c \ - --hash=sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29 \ - --hash=sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b \ - --hash=sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8 \ - --hash=sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7 \ - --hash=sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd \ - --hash=sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40 \ - --hash=sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6 \ - --hash=sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3 \ - --hash=sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c \ - --hash=sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9 \ - --hash=sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5 \ - --hash=sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae \ - --hash=sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442 \ - --hash=sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9 \ - --hash=sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc \ - --hash=sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c \ - --hash=sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea \ - --hash=sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5 \ - --hash=sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50 \ - --hash=sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182 \ - --hash=sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453 \ - --hash=sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e \ - --hash=sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600 \ - --hash=sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733 \ - --hash=sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda \ - --hash=sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241 \ - --hash=sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461 \ - --hash=sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e \ - --hash=sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e \ - --hash=sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b \ - --hash=sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e \ - --hash=sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7 \ - --hash=sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386 \ - --hash=sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd \ - --hash=sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9 \ - --hash=sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf \ - --hash=sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee \ - --hash=sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5 \ - --hash=sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a \ - --hash=sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271 \ - --hash=sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54 \ - --hash=sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4 \ - --hash=sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496 \ - --hash=sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb \ - --hash=sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319 \ - --hash=sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3 \ - --hash=sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f \ - --hash=sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527 \ - --hash=sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed \ - --hash=sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604 \ - --hash=sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef \ - --hash=sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8 \ - --hash=sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5 \ - --hash=sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5 \ - --hash=sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626 \ - --hash=sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c \ - --hash=sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d \ - --hash=sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c \ - --hash=sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc \ - --hash=sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc \ - --hash=sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b \ - --hash=sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38 \ - --hash=sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450 \ - --hash=sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1 \ - --hash=sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f \ - --hash=sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3 \ - --hash=sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755 \ - --hash=sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226 \ - --hash=sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a \ - --hash=sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046 \ - --hash=sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf \ - --hash=sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479 \ - --hash=sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e \ - --hash=sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1 \ - --hash=sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a \ - --hash=sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83 \ - --hash=sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929 \ - --hash=sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93 \ - --hash=sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a \ - --hash=sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c \ - --hash=sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44 \ - --hash=sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89 \ - --hash=sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba \ - --hash=sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e \ - --hash=sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da \ - --hash=sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24 \ - --hash=sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423 \ - --hash=sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef - # via grpclib -platformdirs==4.2.2 \ - --hash=sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee \ - --hash=sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3 - # via sigstore -protobuf==5.27.3 \ - --hash=sha256:043853dcb55cc262bf2e116215ad43fa0859caab79bb0b2d31b708f128ece035 \ - --hash=sha256:16ddf3f8c6c41e1e803da7abea17b1793a97ef079a912e42351eabb19b2cffe7 \ - --hash=sha256:68248c60d53f6168f565a8c76dc58ba4fa2ade31c2d1ebdae6d80f969cdc2d4f \ - --hash=sha256:82460903e640f2b7e34ee81a947fdaad89de796d324bcbc38ff5430bcdead82c \ - --hash=sha256:8572c6533e544ebf6899c360e91d6bcbbee2549251643d32c52cf8a5de295ba5 \ - --hash=sha256:a55c48f2a2092d8e213bd143474df33a6ae751b781dd1d1f4d953c128a415b25 \ - --hash=sha256:af7c0b7cfbbb649ad26132e53faa348580f844d9ca46fd3ec7ca48a1ea5db8a1 \ - --hash=sha256:b8a994fb3d1c11156e7d1e427186662b64694a62b55936b2b9348f0a7c6625ce \ - --hash=sha256:c2a105c24f08b1e53d6c7ffe69cb09d0031512f0b72f812dd4005b8112dbe91e \ - --hash=sha256:c84eee2c71ed83704f1afbf1a85c3171eab0fd1ade3b399b3fad0884cbcca8bf \ - --hash=sha256:dcb307cd4ef8fec0cf52cb9105a03d06fbb5275ce6d84a6ae33bc6cf84e0a07b - # via - # -r model_signing/install/requirements.in - # in-toto-attestation -psutil==6.0.0 \ - --hash=sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35 \ - --hash=sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0 \ - --hash=sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c \ - --hash=sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1 \ - --hash=sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3 \ - --hash=sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c \ - --hash=sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd \ - --hash=sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3 \ - --hash=sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0 \ - --hash=sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2 \ - --hash=sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6 \ - --hash=sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d \ - --hash=sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c \ - --hash=sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0 \ - --hash=sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132 \ - --hash=sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14 \ - --hash=sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0 - # via -r model_signing/install/requirements.in -pyasn1==0.6.0 \ - --hash=sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c \ - --hash=sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473 - # via sigstore -pycparser==2.22 \ - --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ - --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc - # via cffi -pydantic==2.8.2 \ - --hash=sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a \ - --hash=sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8 - # via - # id - # sigstore - # sigstore-rekor-types -pydantic-core==2.20.1 \ - --hash=sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d \ - --hash=sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f \ - --hash=sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686 \ - --hash=sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482 \ - --hash=sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006 \ - --hash=sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83 \ - --hash=sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6 \ - --hash=sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88 \ - --hash=sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86 \ - --hash=sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a \ - --hash=sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6 \ - --hash=sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a \ - --hash=sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6 \ - --hash=sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6 \ - --hash=sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43 \ - --hash=sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c \ - --hash=sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4 \ - --hash=sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e \ - --hash=sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203 \ - --hash=sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd \ - --hash=sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1 \ - --hash=sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24 \ - --hash=sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc \ - --hash=sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc \ - --hash=sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3 \ - --hash=sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598 \ - --hash=sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98 \ - --hash=sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331 \ - --hash=sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2 \ - --hash=sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a \ - --hash=sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6 \ - --hash=sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688 \ - --hash=sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91 \ - --hash=sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa \ - --hash=sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b \ - --hash=sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0 \ - --hash=sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840 \ - --hash=sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c \ - --hash=sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd \ - --hash=sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3 \ - --hash=sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231 \ - --hash=sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1 \ - --hash=sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953 \ - --hash=sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250 \ - --hash=sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a \ - --hash=sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2 \ - --hash=sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20 \ - --hash=sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434 \ - --hash=sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab \ - --hash=sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703 \ - --hash=sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a \ - --hash=sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2 \ - --hash=sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac \ - --hash=sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611 \ - --hash=sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121 \ - --hash=sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e \ - --hash=sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b \ - --hash=sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09 \ - --hash=sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906 \ - --hash=sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9 \ - --hash=sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7 \ - --hash=sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b \ - --hash=sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987 \ - --hash=sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c \ - --hash=sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b \ - --hash=sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e \ - --hash=sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237 \ - --hash=sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1 \ - --hash=sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19 \ - --hash=sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b \ - --hash=sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad \ - --hash=sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0 \ - --hash=sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94 \ - --hash=sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312 \ - --hash=sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f \ - --hash=sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669 \ - --hash=sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1 \ - --hash=sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe \ - --hash=sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99 \ - --hash=sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a \ - --hash=sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a \ - --hash=sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52 \ - --hash=sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c \ - --hash=sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad \ - --hash=sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1 \ - --hash=sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a \ - --hash=sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f \ - --hash=sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a \ - --hash=sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27 - # via pydantic -pygments==2.18.0 \ - --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ - --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a - # via rich -pyjwt==2.9.0 \ - --hash=sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850 \ - --hash=sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c - # via sigstore -pyopenssl==24.2.1 \ - --hash=sha256:4247f0dbe3748d560dcbb2ff3ea01af0f9a1a001ef5f7c4c647956ed8cbf0e95 \ - --hash=sha256:967d5719b12b243588573f39b0c677637145c7a1ffedcd495a487e58177fbb8d - # via - # -r model_signing/install/requirements.in - # sigstore -python-dateutil==2.9.0.post0 \ - --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ - --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 - # via betterproto -requests==2.32.3 \ - --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ - --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 - # via - # id - # sigstore - # tuf -rfc8785==0.1.3 \ - --hash=sha256:167efe3b5cdd09dded9d0cfc8fec1f48f5cd9f8f13b580ada4efcac138925048 \ - --hash=sha256:6116062831c62e7ac5d027973a1fe07b601ccd854bca4a2b401938a00a20b0c0 - # via sigstore -rich==13.7.1 \ - --hash=sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222 \ - --hash=sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432 - # via sigstore -securesystemslib==1.1.0 \ - --hash=sha256:100bf04e60b260e1c7c51e3232647697fde2c5ca5772fda4932d841d3fb6dd0e \ - --hash=sha256:27143a8e04b5573636f260f21d7e26b48bcedcf394e6f74ec31e9a5287e0c38b - # via tuf -sigstore==3.1.0 \ - --hash=sha256:3cfe2da19a053757a06bd9ecae322fa539fece7df3e8139d30e32172e41cb812 \ - --hash=sha256:cc0b52acff3ae25f7f1993e21dec4ebed44213c48e2ec095e8c06f69b3751fdf - # via -r model_signing/install/requirements.in -sigstore-protobuf-specs==0.3.2 \ - --hash=sha256:50c99fa6747a3a9c5c562a43602cf76df0b199af28f0e9d4319b6775630425ea \ - --hash=sha256:cae041b40502600b8a633f43c257695d0222a94efa1e5110a7ec7ada78c39d99 - # via - # -r model_signing/install/requirements.in - # sigstore -sigstore-rekor-types==0.0.13 \ - --hash=sha256:377fee942d5fc66437a4f54599472157149affaece9bbc7deb05e5b42f34ceba \ - --hash=sha256:63e9306a26931ed74411911948c250da7c5adc51c53507227738170424e6ae2d - # via sigstore -six==1.16.0 \ - --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ - --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 - # via python-dateutil -tuf==5.0.0 \ - --hash=sha256:91a4ca279c33222ac1451a5b0bcdcbbf12c965e0d22278bead5bf8d3ab95117a \ - --hash=sha256:9c5d87d3822ae2f83c756d5a208c6942a2829ae1ea63c18c363124497d04da4f - # via sigstore -typing-extensions==4.12.2 \ - --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ - --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 - # via - # pydantic - # pydantic-core -urllib3==2.2.2 \ - --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ - --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 - # via requests diff --git a/install/requirements_Windows.txt b/install/requirements_Windows.txt deleted file mode 100644 index e3ccd7b0..00000000 --- a/install/requirements_Windows.txt +++ /dev/null @@ -1,552 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --generate-hashes --output-file=model_signing/install/requirements_Windows.txt --strip-extras model_signing/install/requirements.in -# -absl-py==2.1.0 \ - --hash=sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308 \ - --hash=sha256:7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff - # via -r model_signing/install/requirements.in -annotated-types==0.7.0 \ - --hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 \ - --hash=sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89 - # via pydantic -betterproto==2.0.0b6 \ - --hash=sha256:720ae92697000f6fcf049c69267d957f0871654c8b0d7458906607685daee784 \ - --hash=sha256:a0839ec165d110a69d0d116f4d0e2bec8d186af4db826257931f0831dab73fcf - # via - # -r model_signing/install/requirements.in - # sigstore-protobuf-specs -certifi==2024.7.4 \ - --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ - --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 - # via requests -cffi==1.16.0 \ - --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ - --hash=sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a \ - --hash=sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417 \ - --hash=sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab \ - --hash=sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520 \ - --hash=sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36 \ - --hash=sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743 \ - --hash=sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8 \ - --hash=sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed \ - --hash=sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684 \ - --hash=sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56 \ - --hash=sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324 \ - --hash=sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d \ - --hash=sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235 \ - --hash=sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e \ - --hash=sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088 \ - --hash=sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000 \ - --hash=sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7 \ - --hash=sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e \ - --hash=sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673 \ - --hash=sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c \ - --hash=sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe \ - --hash=sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2 \ - --hash=sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098 \ - --hash=sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8 \ - --hash=sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a \ - --hash=sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0 \ - --hash=sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b \ - --hash=sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896 \ - --hash=sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e \ - --hash=sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9 \ - --hash=sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2 \ - --hash=sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b \ - --hash=sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6 \ - --hash=sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404 \ - --hash=sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f \ - --hash=sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0 \ - --hash=sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4 \ - --hash=sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc \ - --hash=sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936 \ - --hash=sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba \ - --hash=sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872 \ - --hash=sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb \ - --hash=sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614 \ - --hash=sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1 \ - --hash=sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d \ - --hash=sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969 \ - --hash=sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b \ - --hash=sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4 \ - --hash=sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627 \ - --hash=sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956 \ - --hash=sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357 - # via cryptography -charset-normalizer==3.3.2 \ - --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ - --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \ - --hash=sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786 \ - --hash=sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8 \ - --hash=sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09 \ - --hash=sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185 \ - --hash=sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574 \ - --hash=sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e \ - --hash=sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519 \ - --hash=sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898 \ - --hash=sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269 \ - --hash=sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3 \ - --hash=sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f \ - --hash=sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6 \ - --hash=sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8 \ - --hash=sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a \ - --hash=sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73 \ - --hash=sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc \ - --hash=sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714 \ - --hash=sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2 \ - --hash=sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc \ - --hash=sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce \ - --hash=sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d \ - --hash=sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e \ - --hash=sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6 \ - --hash=sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269 \ - --hash=sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 \ - --hash=sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d \ - --hash=sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a \ - --hash=sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4 \ - --hash=sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77 \ - --hash=sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d \ - --hash=sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0 \ - --hash=sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed \ - --hash=sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068 \ - --hash=sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac \ - --hash=sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25 \ - --hash=sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 \ - --hash=sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab \ - --hash=sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26 \ - --hash=sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2 \ - --hash=sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db \ - --hash=sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f \ - --hash=sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5 \ - --hash=sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99 \ - --hash=sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c \ - --hash=sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d \ - --hash=sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811 \ - --hash=sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa \ - --hash=sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a \ - --hash=sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03 \ - --hash=sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b \ - --hash=sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04 \ - --hash=sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c \ - --hash=sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001 \ - --hash=sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458 \ - --hash=sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389 \ - --hash=sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99 \ - --hash=sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985 \ - --hash=sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537 \ - --hash=sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238 \ - --hash=sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f \ - --hash=sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d \ - --hash=sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796 \ - --hash=sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a \ - --hash=sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143 \ - --hash=sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8 \ - --hash=sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c \ - --hash=sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5 \ - --hash=sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5 \ - --hash=sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711 \ - --hash=sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4 \ - --hash=sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6 \ - --hash=sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c \ - --hash=sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7 \ - --hash=sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4 \ - --hash=sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b \ - --hash=sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae \ - --hash=sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12 \ - --hash=sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c \ - --hash=sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae \ - --hash=sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8 \ - --hash=sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887 \ - --hash=sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b \ - --hash=sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4 \ - --hash=sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f \ - --hash=sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5 \ - --hash=sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33 \ - --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ - --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 - # via requests -cryptography==43.0.0 \ - --hash=sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709 \ - --hash=sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069 \ - --hash=sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2 \ - --hash=sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b \ - --hash=sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e \ - --hash=sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70 \ - --hash=sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778 \ - --hash=sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22 \ - --hash=sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895 \ - --hash=sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf \ - --hash=sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431 \ - --hash=sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f \ - --hash=sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947 \ - --hash=sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74 \ - --hash=sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc \ - --hash=sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66 \ - --hash=sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66 \ - --hash=sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf \ - --hash=sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f \ - --hash=sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5 \ - --hash=sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e \ - --hash=sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f \ - --hash=sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55 \ - --hash=sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1 \ - --hash=sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47 \ - --hash=sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5 \ - --hash=sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0 - # via - # -r model_signing/install/requirements.in - # pyopenssl - # sigstore -dnspython==2.6.1 \ - --hash=sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50 \ - --hash=sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc - # via email-validator -email-validator==2.2.0 \ - --hash=sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631 \ - --hash=sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7 - # via pydantic -grpclib==0.4.7 \ - --hash=sha256:2988ef57c02b22b7a2e8e961792c41ccf97efc2ace91ae7a5b0de03c363823c3 - # via betterproto -h2==4.1.0 \ - --hash=sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d \ - --hash=sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb - # via grpclib -hpack==4.0.0 \ - --hash=sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c \ - --hash=sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095 - # via h2 -hyperframe==6.0.1 \ - --hash=sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15 \ - --hash=sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914 - # via h2 -id==1.4.0 \ - --hash=sha256:23c06772e8bd3e3a44ee3f167868bf5a8e385b0c1e2cc707ad36eb7486b4765b \ - --hash=sha256:a0391117c98fa9851ebd2b22df0dc6fd6aacbd89a4ec95c173f1311ca9bb7329 - # via sigstore -idna==3.7 \ - --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ - --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 - # via - # email-validator - # requests -in-toto-attestation==0.9.3 \ - --hash=sha256:1f44d3f3bded1ed551e260c5e9f834ee05de03f1d2f360bada5a172c11d748ff \ - --hash=sha256:cc0cf97417d94953b9fee6e9d415a11c59b4d47cee4f13746ffe935b28e3e8c4 - # via -r model_signing/install/requirements.in -markdown-it-py==3.0.0 \ - --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ - --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb - # via rich -mdurl==0.1.2 \ - --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ - --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba - # via markdown-it-py -multidict==6.0.5 \ - --hash=sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556 \ - --hash=sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c \ - --hash=sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29 \ - --hash=sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b \ - --hash=sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8 \ - --hash=sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7 \ - --hash=sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd \ - --hash=sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40 \ - --hash=sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6 \ - --hash=sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3 \ - --hash=sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c \ - --hash=sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9 \ - --hash=sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5 \ - --hash=sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae \ - --hash=sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442 \ - --hash=sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9 \ - --hash=sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc \ - --hash=sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c \ - --hash=sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea \ - --hash=sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5 \ - --hash=sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50 \ - --hash=sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182 \ - --hash=sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453 \ - --hash=sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e \ - --hash=sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600 \ - --hash=sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733 \ - --hash=sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda \ - --hash=sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241 \ - --hash=sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461 \ - --hash=sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e \ - --hash=sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e \ - --hash=sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b \ - --hash=sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e \ - --hash=sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7 \ - --hash=sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386 \ - --hash=sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd \ - --hash=sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9 \ - --hash=sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf \ - --hash=sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee \ - --hash=sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5 \ - --hash=sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a \ - --hash=sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271 \ - --hash=sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54 \ - --hash=sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4 \ - --hash=sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496 \ - --hash=sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb \ - --hash=sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319 \ - --hash=sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3 \ - --hash=sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f \ - --hash=sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527 \ - --hash=sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed \ - --hash=sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604 \ - --hash=sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef \ - --hash=sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8 \ - --hash=sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5 \ - --hash=sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5 \ - --hash=sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626 \ - --hash=sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c \ - --hash=sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d \ - --hash=sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c \ - --hash=sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc \ - --hash=sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc \ - --hash=sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b \ - --hash=sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38 \ - --hash=sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450 \ - --hash=sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1 \ - --hash=sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f \ - --hash=sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3 \ - --hash=sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755 \ - --hash=sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226 \ - --hash=sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a \ - --hash=sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046 \ - --hash=sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf \ - --hash=sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479 \ - --hash=sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e \ - --hash=sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1 \ - --hash=sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a \ - --hash=sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83 \ - --hash=sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929 \ - --hash=sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93 \ - --hash=sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a \ - --hash=sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c \ - --hash=sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44 \ - --hash=sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89 \ - --hash=sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba \ - --hash=sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e \ - --hash=sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da \ - --hash=sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24 \ - --hash=sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423 \ - --hash=sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef - # via grpclib -platformdirs==4.2.2 \ - --hash=sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee \ - --hash=sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3 - # via sigstore -protobuf==5.27.3 \ - --hash=sha256:043853dcb55cc262bf2e116215ad43fa0859caab79bb0b2d31b708f128ece035 \ - --hash=sha256:16ddf3f8c6c41e1e803da7abea17b1793a97ef079a912e42351eabb19b2cffe7 \ - --hash=sha256:68248c60d53f6168f565a8c76dc58ba4fa2ade31c2d1ebdae6d80f969cdc2d4f \ - --hash=sha256:82460903e640f2b7e34ee81a947fdaad89de796d324bcbc38ff5430bcdead82c \ - --hash=sha256:8572c6533e544ebf6899c360e91d6bcbbee2549251643d32c52cf8a5de295ba5 \ - --hash=sha256:a55c48f2a2092d8e213bd143474df33a6ae751b781dd1d1f4d953c128a415b25 \ - --hash=sha256:af7c0b7cfbbb649ad26132e53faa348580f844d9ca46fd3ec7ca48a1ea5db8a1 \ - --hash=sha256:b8a994fb3d1c11156e7d1e427186662b64694a62b55936b2b9348f0a7c6625ce \ - --hash=sha256:c2a105c24f08b1e53d6c7ffe69cb09d0031512f0b72f812dd4005b8112dbe91e \ - --hash=sha256:c84eee2c71ed83704f1afbf1a85c3171eab0fd1ade3b399b3fad0884cbcca8bf \ - --hash=sha256:dcb307cd4ef8fec0cf52cb9105a03d06fbb5275ce6d84a6ae33bc6cf84e0a07b - # via - # -r model_signing/install/requirements.in - # in-toto-attestation -psutil==6.0.0 \ - --hash=sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35 \ - --hash=sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0 \ - --hash=sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c \ - --hash=sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1 \ - --hash=sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3 \ - --hash=sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c \ - --hash=sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd \ - --hash=sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3 \ - --hash=sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0 \ - --hash=sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2 \ - --hash=sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6 \ - --hash=sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d \ - --hash=sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c \ - --hash=sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0 \ - --hash=sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132 \ - --hash=sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14 \ - --hash=sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0 - # via -r model_signing/install/requirements.in -pyasn1==0.6.0 \ - --hash=sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c \ - --hash=sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473 - # via sigstore -pycparser==2.22 \ - --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ - --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc - # via cffi -pydantic==2.8.2 \ - --hash=sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a \ - --hash=sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8 - # via - # id - # sigstore - # sigstore-rekor-types -pydantic-core==2.20.1 \ - --hash=sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d \ - --hash=sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f \ - --hash=sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686 \ - --hash=sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482 \ - --hash=sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006 \ - --hash=sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83 \ - --hash=sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6 \ - --hash=sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88 \ - --hash=sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86 \ - --hash=sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a \ - --hash=sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6 \ - --hash=sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a \ - --hash=sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6 \ - --hash=sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6 \ - --hash=sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43 \ - --hash=sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c \ - --hash=sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4 \ - --hash=sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e \ - --hash=sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203 \ - --hash=sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd \ - --hash=sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1 \ - --hash=sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24 \ - --hash=sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc \ - --hash=sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc \ - --hash=sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3 \ - --hash=sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598 \ - --hash=sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98 \ - --hash=sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331 \ - --hash=sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2 \ - --hash=sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a \ - --hash=sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6 \ - --hash=sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688 \ - --hash=sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91 \ - --hash=sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa \ - --hash=sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b \ - --hash=sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0 \ - --hash=sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840 \ - --hash=sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c \ - --hash=sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd \ - --hash=sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3 \ - --hash=sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231 \ - --hash=sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1 \ - --hash=sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953 \ - --hash=sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250 \ - --hash=sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a \ - --hash=sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2 \ - --hash=sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20 \ - --hash=sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434 \ - --hash=sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab \ - --hash=sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703 \ - --hash=sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a \ - --hash=sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2 \ - --hash=sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac \ - --hash=sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611 \ - --hash=sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121 \ - --hash=sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e \ - --hash=sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b \ - --hash=sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09 \ - --hash=sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906 \ - --hash=sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9 \ - --hash=sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7 \ - --hash=sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b \ - --hash=sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987 \ - --hash=sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c \ - --hash=sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b \ - --hash=sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e \ - --hash=sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237 \ - --hash=sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1 \ - --hash=sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19 \ - --hash=sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b \ - --hash=sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad \ - --hash=sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0 \ - --hash=sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94 \ - --hash=sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312 \ - --hash=sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f \ - --hash=sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669 \ - --hash=sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1 \ - --hash=sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe \ - --hash=sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99 \ - --hash=sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a \ - --hash=sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a \ - --hash=sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52 \ - --hash=sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c \ - --hash=sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad \ - --hash=sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1 \ - --hash=sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a \ - --hash=sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f \ - --hash=sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a \ - --hash=sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27 - # via pydantic -pygments==2.18.0 \ - --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ - --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a - # via rich -pyjwt==2.9.0 \ - --hash=sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850 \ - --hash=sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c - # via sigstore -pyopenssl==24.2.1 \ - --hash=sha256:4247f0dbe3748d560dcbb2ff3ea01af0f9a1a001ef5f7c4c647956ed8cbf0e95 \ - --hash=sha256:967d5719b12b243588573f39b0c677637145c7a1ffedcd495a487e58177fbb8d - # via - # -r model_signing/install/requirements.in - # sigstore -python-dateutil==2.9.0.post0 \ - --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ - --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 - # via betterproto -requests==2.32.3 \ - --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ - --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 - # via - # id - # sigstore - # tuf -rfc8785==0.1.3 \ - --hash=sha256:167efe3b5cdd09dded9d0cfc8fec1f48f5cd9f8f13b580ada4efcac138925048 \ - --hash=sha256:6116062831c62e7ac5d027973a1fe07b601ccd854bca4a2b401938a00a20b0c0 - # via sigstore -rich==13.7.1 \ - --hash=sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222 \ - --hash=sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432 - # via sigstore -securesystemslib==1.1.0 \ - --hash=sha256:100bf04e60b260e1c7c51e3232647697fde2c5ca5772fda4932d841d3fb6dd0e \ - --hash=sha256:27143a8e04b5573636f260f21d7e26b48bcedcf394e6f74ec31e9a5287e0c38b - # via tuf -sigstore==3.1.0 \ - --hash=sha256:3cfe2da19a053757a06bd9ecae322fa539fece7df3e8139d30e32172e41cb812 \ - --hash=sha256:cc0b52acff3ae25f7f1993e21dec4ebed44213c48e2ec095e8c06f69b3751fdf - # via -r model_signing/install/requirements.in -sigstore-protobuf-specs==0.3.2 \ - --hash=sha256:50c99fa6747a3a9c5c562a43602cf76df0b199af28f0e9d4319b6775630425ea \ - --hash=sha256:cae041b40502600b8a633f43c257695d0222a94efa1e5110a7ec7ada78c39d99 - # via - # -r model_signing/install/requirements.in - # sigstore -sigstore-rekor-types==0.0.13 \ - --hash=sha256:377fee942d5fc66437a4f54599472157149affaece9bbc7deb05e5b42f34ceba \ - --hash=sha256:63e9306a26931ed74411911948c250da7c5adc51c53507227738170424e6ae2d - # via sigstore -six==1.16.0 \ - --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ - --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 - # via python-dateutil -tuf==5.0.0 \ - --hash=sha256:91a4ca279c33222ac1451a5b0bcdcbbf12c965e0d22278bead5bf8d3ab95117a \ - --hash=sha256:9c5d87d3822ae2f83c756d5a208c6942a2829ae1ea63c18c363124497d04da4f - # via sigstore -typing-extensions==4.12.2 \ - --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ - --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 - # via - # pydantic - # pydantic-core -urllib3==2.2.2 \ - --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ - --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 - # via requests diff --git a/install/requirements_dev.in b/install/requirements_dev.in deleted file mode 100644 index bdb14567..00000000 --- a/install/requirements_dev.in +++ /dev/null @@ -1,2 +0,0 @@ -pytype -ruff diff --git a/install/requirements_dev_Darwin.txt b/install/requirements_dev_Darwin.txt deleted file mode 100644 index c51e2f9b..00000000 --- a/install/requirements_dev_Darwin.txt +++ /dev/null @@ -1,284 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --generate-hashes --output-file=model_signing/install/requirements_dev_Darwin.txt --strip-extras model_signing/install/requirements_dev.in -# -attrs==24.1.0 \ - --hash=sha256:377b47448cb61fea38533f671fba0d0f8a96fd58facd4dc518e3dac9dbea0905 \ - --hash=sha256:adbdec84af72d38be7628e353a09b6a6790d15cd71819f6e9d7b0faa8a125745 - # via pytype -immutabledict==4.2.0 \ - --hash=sha256:d728b2c2410d698d95e6200237feb50a695584d20289ad3379a439aa3d90baba \ - --hash=sha256:e003fd81aad2377a5a758bf7e1086cf3b70b63e9a5cc2f46bce8d0a2b4727c5f - # via pytype -importlab==0.8.1 \ - --hash=sha256:124cfa00e8a34fefe8aac1a5e94f56c781b178c9eb61a1d3f60f7e03b77338d3 \ - --hash=sha256:b3893853b1f6eb027da509c3b40e6787e95dd66b4b66f1b3613aad77556e1465 - # via pytype -jinja2==3.1.4 \ - --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ - --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d - # via pytype -libcst==1.4.0 \ - --hash=sha256:061d6855ef30efe38b8a292b7e5d57c8e820e71fc9ec9846678b60a934b53bbb \ - --hash=sha256:17d71001cb25e94cfe8c3d997095741a8c4aa7a6d234c0f972bc42818c88dfaf \ - --hash=sha256:279b54568ea1f25add50ea4ba3d76d4f5835500c82f24d54daae4c5095b986aa \ - --hash=sha256:2d47de16d105e7dd5f4e01a428d9f4dc1e71efd74f79766daf54528ce37f23c3 \ - --hash=sha256:3399e6c95df89921511b44d8c5bf6a75bcbc2d51f1f6429763609ba005c10f6b \ - --hash=sha256:3401dae41fe24565387a65baee3887e31a44e3e58066b0250bc3f3ccf85b1b5a \ - --hash=sha256:3c6a8faab9da48c5b371557d0999b4ca51f4f2cbd37ee8c2c4df0ac01c781465 \ - --hash=sha256:449e0b16604f054fa7f27c3ffe86ea7ef6c409836fe68fe4e752a1894175db00 \ - --hash=sha256:48601e3e590e2d6a7ab8c019cf3937c70511a78d778ab3333764531253acdb33 \ - --hash=sha256:5da9d7dc83801aba3b8d911f82dc1a375db0d508318bad79d9fb245374afe068 \ - --hash=sha256:62e2682ee1567b6a89c91853865372bf34f178bfd237853d84df2b87b446e654 \ - --hash=sha256:7c54aa66c86d8ece9c93156a2cf5ca512b0dce40142fe9e072c86af2bf892411 \ - --hash=sha256:7ece51d935bc9bf60b528473d2e5cc67cbb88e2f8146297e40ee2c7d80be6f13 \ - --hash=sha256:81653dea1cdfa4c6520a7c5ffb95fa4d220cbd242e446c7a06d42d8636bfcbba \ - --hash=sha256:8e54c777b8d27339b70f304d16fc8bc8674ef1bd34ed05ea874bf4921eb5a313 \ - --hash=sha256:9d0cc3c5a2a51fa7e1d579a828c0a2e46b2170024fd8b1a0691c8a52f3abb2d9 \ - --hash=sha256:addc6d585141a7677591868886f6bda0577529401a59d210aa8112114340e129 \ - --hash=sha256:b8ecdba8934632b4dadacb666cd3816627a6ead831b806336972ccc4ba7ca0e9 \ - --hash=sha256:bb0abf627ee14903d05d0ad9b2c6865f1b21eb4081e2c7bea1033f85db2b8bae \ - --hash=sha256:cb4e42ea107a37bff7f9fdbee9532d39f9ea77b89caa5c5112b37057b12e0838 \ - --hash=sha256:d024f44059a853b4b852cfc04fec33e346659d851371e46fc8e7c19de24d3da9 \ - --hash=sha256:d1989fa12d3cd79118ebd29ebe2a6976d23d509b1a4226bc3d66fcb7cb50bd5d \ - --hash=sha256:e6227562fc5c9c1efd15dfe90b0971ae254461b8b6b23c1b617139b6003de1c1 \ - --hash=sha256:f42797309bb725f0f000510d5463175ccd7155395f09b5e7723971b0007a976d \ - --hash=sha256:f6abce0e66bba2babfadc20530fd3688f672d565674336595b4623cd800b91ef - # via pytype -markupsafe==2.1.5 \ - --hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \ - --hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \ - --hash=sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f \ - --hash=sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 \ - --hash=sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532 \ - --hash=sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f \ - --hash=sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 \ - --hash=sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df \ - --hash=sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4 \ - --hash=sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906 \ - --hash=sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f \ - --hash=sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 \ - --hash=sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8 \ - --hash=sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371 \ - --hash=sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2 \ - --hash=sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465 \ - --hash=sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52 \ - --hash=sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6 \ - --hash=sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169 \ - --hash=sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad \ - --hash=sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 \ - --hash=sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0 \ - --hash=sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029 \ - --hash=sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f \ - --hash=sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a \ - --hash=sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced \ - --hash=sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5 \ - --hash=sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c \ - --hash=sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf \ - --hash=sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9 \ - --hash=sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb \ - --hash=sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad \ - --hash=sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3 \ - --hash=sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 \ - --hash=sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46 \ - --hash=sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc \ - --hash=sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a \ - --hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \ - --hash=sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900 \ - --hash=sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 \ - --hash=sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea \ - --hash=sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f \ - --hash=sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5 \ - --hash=sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e \ - --hash=sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a \ - --hash=sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f \ - --hash=sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50 \ - --hash=sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a \ - --hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \ - --hash=sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4 \ - --hash=sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff \ - --hash=sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2 \ - --hash=sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46 \ - --hash=sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b \ - --hash=sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf \ - --hash=sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 \ - --hash=sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5 \ - --hash=sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab \ - --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \ - --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68 - # via jinja2 -msgspec==0.18.6 \ - --hash=sha256:06acbd6edf175bee0e36295d6b0302c6de3aaf61246b46f9549ca0041a9d7177 \ - --hash=sha256:0e24539b25c85c8f0597274f11061c102ad6b0c56af053373ba4629772b407be \ - --hash=sha256:1003c20bfe9c6114cc16ea5db9c5466e49fae3d7f5e2e59cb70693190ad34da0 \ - --hash=sha256:1a76b60e501b3932782a9da039bd1cd552b7d8dec54ce38332b87136c64852dd \ - --hash=sha256:37f67c1d81272131895bb20d388dd8d341390acd0e192a55ab02d4d6468b434c \ - --hash=sha256:3ac4dd63fd5309dd42a8c8c36c1563531069152be7819518be0a9d03be9788e4 \ - --hash=sha256:40a4df891676d9c28a67c2cc39947c33de516335680d1316a89e8f7218660410 \ - --hash=sha256:41cf758d3f40428c235c0f27bc6f322d43063bc32da7b9643e3f805c21ed57b4 \ - --hash=sha256:46eb2f6b22b0e61c137e65795b97dc515860bf6ec761d8fb65fdb62aa094ba61 \ - --hash=sha256:6aa85198f8f154cf35d6f979998f6dadd3dc46a8a8c714632f53f5d65b315c07 \ - --hash=sha256:7481355a1adcf1f08dedd9311193c674ffb8bf7b79314b4314752b89a2cf7f1c \ - --hash=sha256:77f30b0234eceeff0f651119b9821ce80949b4d667ad38f3bfed0d0ebf9d6d8f \ - --hash=sha256:9080eb12b8f59e177bd1eb5c21e24dd2ba2fa88a1dbc9a98e05ad7779b54c681 \ - --hash=sha256:974d3520fcc6b824a6dedbdf2b411df31a73e6e7414301abac62e6b8d03791b4 \ - --hash=sha256:9da21f804c1a1471f26d32b5d9bc0480450ea77fbb8d9db431463ab64aaac2cf \ - --hash=sha256:a59fc3b4fcdb972d09138cb516dbde600c99d07c38fd9372a6ef500d2d031b4e \ - --hash=sha256:a6896f4cd5b4b7d688018805520769a8446df911eb93b421c6c68155cdf9dd5a \ - --hash=sha256:ad237100393f637b297926cae1868b0d500f764ccd2f0623a380e2bcfb2809ca \ - --hash=sha256:b5c390b0b0b7da879520d4ae26044d74aeee5144f83087eb7842ba59c02bc090 \ - --hash=sha256:c3232fabacef86fe8323cecbe99abbc5c02f7698e3f5f2e248e3480b66a3596b \ - --hash=sha256:c61ee4d3be03ea9cd089f7c8e36158786cd06e51fbb62529276452bbf2d52ece \ - --hash=sha256:c8355b55c80ac3e04885d72db515817d9fbb0def3bab936bba104e99ad22cf46 \ - --hash=sha256:cc001cf39becf8d2dcd3f413a4797c55009b3a3cdbf78a8bf5a7ca8fdb76032c \ - --hash=sha256:ce13981bfa06f5eb126a3a5a38b1976bddb49a36e4f46d8e6edecf33ccf11df1 \ - --hash=sha256:d0feb7a03d971c1c0353de1a8fe30bb6579c2dc5ccf29b5f7c7ab01172010492 \ - --hash=sha256:d5351afb216b743df4b6b147691523697ff3a2fc5f3d54f771e91219f5c23aaa \ - --hash=sha256:d70cb3d00d9f4de14d0b31d38dfe60c88ae16f3182988246a9861259c6722af6 \ - --hash=sha256:d86f5071fe33e19500920333c11e2267a31942d18fed4d9de5bc2fbab267d28c \ - --hash=sha256:db1d8626748fa5d29bbd15da58b2d73af25b10aa98abf85aab8028119188ed57 \ - --hash=sha256:e3b524df6ea9998bbc99ea6ee4d0276a101bcc1aa8d14887bb823914d9f60d07 \ - --hash=sha256:e77e56ffe2701e83a96e35770c6adb655ffc074d530018d1b584a8e635b4f36f \ - --hash=sha256:e97dec6932ad5e3ee1e3c14718638ba333befc45e0661caa57033cd4cc489466 \ - --hash=sha256:f7d9faed6dfff654a9ca7d9b0068456517f63dbc3aa704a527f493b9200b210a \ - --hash=sha256:fac5834e14ac4da1fca373753e0c4ec9c8069d1fe5f534fa5208453b6065d5be \ - --hash=sha256:fd62e5818731a66aaa8e9b0a1e5543dc979a46278da01e85c3c9a1a4f047ef7e \ - --hash=sha256:fda4c357145cf0b760000c4ad597e19b53adf01382b711f281720a10a0fe72b7 - # via pytype -networkx==3.1 \ - --hash=sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36 \ - --hash=sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61 - # via - # importlab - # pytype -ninja==1.11.1.1 \ - --hash=sha256:18302d96a5467ea98b68e1cae1ae4b4fb2b2a56a82b955193c637557c7273dbd \ - --hash=sha256:185e0641bde601e53841525c4196278e9aaf4463758da6dd1e752c0a0f54136a \ - --hash=sha256:376889c76d87b95b5719fdd61dd7db193aa7fd4432e5d52d2e44e4c497bdbbee \ - --hash=sha256:3e0f9be5bb20d74d58c66cc1c414c3e6aeb45c35b0d0e41e8d739c2c0d57784f \ - --hash=sha256:73b93c14046447c7c5cc892433d4fae65d6364bec6685411cb97a8bcf815f93a \ - --hash=sha256:7563ce1d9fe6ed5af0b8dd9ab4a214bf4ff1f2f6fd6dc29f480981f0f8b8b249 \ - --hash=sha256:76482ba746a2618eecf89d5253c0d1e4f1da1270d41e9f54dfbd91831b0f6885 \ - --hash=sha256:84502ec98f02a037a169c4b0d5d86075eaf6afc55e1879003d6cab51ced2ea4b \ - --hash=sha256:95da904130bfa02ea74ff9c0116b4ad266174fafb1c707aa50212bc7859aebf1 \ - --hash=sha256:9d793b08dd857e38d0b6ffe9e6b7145d7c485a42dcfea04905ca0cdb6017cc3c \ - --hash=sha256:9df724344202b83018abb45cb1efc22efd337a1496514e7e6b3b59655be85205 \ - --hash=sha256:aad34a70ef15b12519946c5633344bc775a7656d789d9ed5fdb0d456383716ef \ - --hash=sha256:d491fc8d89cdcb416107c349ad1e3a735d4c4af5e1cb8f5f727baca6350fdaea \ - --hash=sha256:ecf80cf5afd09f14dcceff28cb3f11dc90fb97c999c89307aea435889cb66877 \ - --hash=sha256:fa2ba9d74acfdfbfbcf06fad1b8282de8a7a8c481d9dee45c859a8c93fcc1082 - # via pytype -pycnite==2024.7.31 \ - --hash=sha256:5125f1c95aef4a23b9bec3b32fae76873dcd46324fa68e39c10fa852ecdea340 \ - --hash=sha256:9ff9c09d35056435b867e14ebf79626ca94b6017923a0bf9935377fa90d4cbb3 - # via pytype -pydot==3.0.1 \ - --hash=sha256:43f1e878dc1ff7c1c2e3470a6999d4e9e97771c5c862440c2f0af0ba844c231f \ - --hash=sha256:e18cf7f287c497d77b536a3d20a46284568fea390776dface6eabbdf1b1b5efc - # via pytype -pyparsing==3.1.2 \ - --hash=sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad \ - --hash=sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742 - # via pydot -pytype==2024.4.11 \ - --hash=sha256:2986961d1a2ef778a9fea2f81c90cbe6f4a196ff783b26a30e7f3c9be1545c10 \ - --hash=sha256:3315f51ce482d8c07e2f1857c47ccd17beb4a9bfde9afa7d1e6669f1e8881081 \ - --hash=sha256:4484bbe24c58c289cea0c7549a507f20eea29caa68dcaf1e857eba584324641e \ - --hash=sha256:50da73a6a24337d00c9c88697ced74909dd00e3b9238ad619490ff83a6588d52 \ - --hash=sha256:51c5470061ace9908a8306e3aa460e89e8fc15e63557625c387f932b852d3fa8 \ - --hash=sha256:8ad2f7cbfc9843a3f6f1d776318a2f4d96b0ca2d054128280be58eef293c0795 \ - --hash=sha256:a3483a44f457766be85c2a2ef779f3c23f2a95973e5fdb844a030149fc1d92e3 \ - --hash=sha256:aa1069fcaaa9859273ec31650632e7bba9af0e82083e8f7d08f9b742d6d36055 \ - --hash=sha256:ad59ed48b185d61f5ab8bceb173e6680eeabf109c5f15290ad88b7be1096e493 \ - --hash=sha256:ae6c825b7067f420810f8846147df4fdc966c340a859f51317ba26c860cda906 \ - --hash=sha256:b140b180cb287bbbce025e4c929cf3b020aecf4f91899ef609073ab02f2ba8e2 \ - --hash=sha256:b3647b554eea009c9069d58440aed6b9e66d2f3ba20ef2674ffd5cd3b0bf83d7 \ - --hash=sha256:fd24126c5b7bbda52fb48ad9d5b4811a7b090a944c8f39a45b94246668722e8c - # via -r model_signing/install/requirements_dev.in -pyyaml==6.0.1 \ - --hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \ - --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ - --hash=sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df \ - --hash=sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741 \ - --hash=sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206 \ - --hash=sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27 \ - --hash=sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595 \ - --hash=sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62 \ - --hash=sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98 \ - --hash=sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696 \ - --hash=sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290 \ - --hash=sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9 \ - --hash=sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d \ - --hash=sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6 \ - --hash=sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867 \ - --hash=sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47 \ - --hash=sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486 \ - --hash=sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6 \ - --hash=sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3 \ - --hash=sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 \ - --hash=sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938 \ - --hash=sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0 \ - --hash=sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c \ - --hash=sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735 \ - --hash=sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d \ - --hash=sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28 \ - --hash=sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4 \ - --hash=sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba \ - --hash=sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8 \ - --hash=sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef \ - --hash=sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5 \ - --hash=sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd \ - --hash=sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3 \ - --hash=sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0 \ - --hash=sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515 \ - --hash=sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c \ - --hash=sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c \ - --hash=sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924 \ - --hash=sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 \ - --hash=sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43 \ - --hash=sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859 \ - --hash=sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673 \ - --hash=sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54 \ - --hash=sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a \ - --hash=sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b \ - --hash=sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab \ - --hash=sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa \ - --hash=sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c \ - --hash=sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585 \ - --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \ - --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f - # via libcst -ruff==0.5.6 \ - --hash=sha256:07c9e3c2a8e1fe377dd460371c3462671a728c981c3205a5217291422209f642 \ - --hash=sha256:111a99cdb02f69ddb2571e2756e017a1496c2c3a2aeefe7b988ddab38b416d36 \ - --hash=sha256:1f77c1c3aa0669fb230b06fb24ffa3e879391a3ba3f15e3d633a752da5a3e670 \ - --hash=sha256:4d394940f61f7720ad371ddedf14722ee1d6250fd8d020f5ea5a86e7be217daf \ - --hash=sha256:563a7ae61ad284187d3071d9041c08019975693ff655438d8d4be26e492760bd \ - --hash=sha256:57c6c0dd997b31b536bff49b9eee5ed3194d60605a4427f735eeb1f9c1b8d264 \ - --hash=sha256:80521b88d26a45e871f31e4b88938fd87db7011bb961d8afd2664982dfc3641a \ - --hash=sha256:94fe60869bfbf0521e04fd62b74cbca21cbc5beb67cbb75ab33fe8c174f54414 \ - --hash=sha256:a0ef5930799a05522985b9cec8290b185952f3fcd86c1772c3bdbd732667fdcd \ - --hash=sha256:b652dc14f6ef5d1552821e006f747802cc32d98d5509349e168f6bf0ee9f8f42 \ - --hash=sha256:c476acb43c3c51e3c614a2e878ee1589655fa02dab19fe2db0423a06d6a5b1b6 \ - --hash=sha256:c94e084ba3eaa80c2172918c2ca2eb2230c3f15925f4ed8b6297260c6ef179ad \ - --hash=sha256:d7fe7dccb1a89dc66785d7aa0ac283b2269712d8ed19c63af908fdccca5ccc1a \ - --hash=sha256:d9bc8f328a9f1309ae80e4d392836e7dbc77303b38ed4a7112699e63d3b066ab \ - --hash=sha256:e2ff8003f5252fd68425fd53d27c1f08b201d7ed714bb31a55c9ac1d4c13e2eb \ - --hash=sha256:e395daba77a79f6dc0d07311f94cc0560375ca20c06f354c7c99af3bf4560c5d \ - --hash=sha256:e6a584c1de6f8591c2570e171cc7ce482bb983d49c70ddf014393cd39e9dfaed \ - --hash=sha256:f908148c93c02873210a52cad75a6eda856b2cbb72250370ce3afef6fb99b1ed - # via -r model_signing/install/requirements_dev.in -tabulate==0.9.0 \ - --hash=sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c \ - --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f - # via pytype -toml==0.10.2 \ - --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b \ - --hash=sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f - # via pytype -typing-extensions==4.12.2 \ - --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ - --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 - # via pytype diff --git a/install/requirements_dev_Linux.txt b/install/requirements_dev_Linux.txt deleted file mode 100644 index c670d266..00000000 --- a/install/requirements_dev_Linux.txt +++ /dev/null @@ -1,284 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --generate-hashes --output-file=model_signing/install/requirements_dev_Linux.txt --strip-extras model_signing/install/requirements_dev.in -# -attrs==24.1.0 \ - --hash=sha256:377b47448cb61fea38533f671fba0d0f8a96fd58facd4dc518e3dac9dbea0905 \ - --hash=sha256:adbdec84af72d38be7628e353a09b6a6790d15cd71819f6e9d7b0faa8a125745 - # via pytype -immutabledict==4.2.0 \ - --hash=sha256:d728b2c2410d698d95e6200237feb50a695584d20289ad3379a439aa3d90baba \ - --hash=sha256:e003fd81aad2377a5a758bf7e1086cf3b70b63e9a5cc2f46bce8d0a2b4727c5f - # via pytype -importlab==0.8.1 \ - --hash=sha256:124cfa00e8a34fefe8aac1a5e94f56c781b178c9eb61a1d3f60f7e03b77338d3 \ - --hash=sha256:b3893853b1f6eb027da509c3b40e6787e95dd66b4b66f1b3613aad77556e1465 - # via pytype -jinja2==3.1.4 \ - --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ - --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d - # via pytype -libcst==1.4.0 \ - --hash=sha256:061d6855ef30efe38b8a292b7e5d57c8e820e71fc9ec9846678b60a934b53bbb \ - --hash=sha256:17d71001cb25e94cfe8c3d997095741a8c4aa7a6d234c0f972bc42818c88dfaf \ - --hash=sha256:279b54568ea1f25add50ea4ba3d76d4f5835500c82f24d54daae4c5095b986aa \ - --hash=sha256:2d47de16d105e7dd5f4e01a428d9f4dc1e71efd74f79766daf54528ce37f23c3 \ - --hash=sha256:3399e6c95df89921511b44d8c5bf6a75bcbc2d51f1f6429763609ba005c10f6b \ - --hash=sha256:3401dae41fe24565387a65baee3887e31a44e3e58066b0250bc3f3ccf85b1b5a \ - --hash=sha256:3c6a8faab9da48c5b371557d0999b4ca51f4f2cbd37ee8c2c4df0ac01c781465 \ - --hash=sha256:449e0b16604f054fa7f27c3ffe86ea7ef6c409836fe68fe4e752a1894175db00 \ - --hash=sha256:48601e3e590e2d6a7ab8c019cf3937c70511a78d778ab3333764531253acdb33 \ - --hash=sha256:5da9d7dc83801aba3b8d911f82dc1a375db0d508318bad79d9fb245374afe068 \ - --hash=sha256:62e2682ee1567b6a89c91853865372bf34f178bfd237853d84df2b87b446e654 \ - --hash=sha256:7c54aa66c86d8ece9c93156a2cf5ca512b0dce40142fe9e072c86af2bf892411 \ - --hash=sha256:7ece51d935bc9bf60b528473d2e5cc67cbb88e2f8146297e40ee2c7d80be6f13 \ - --hash=sha256:81653dea1cdfa4c6520a7c5ffb95fa4d220cbd242e446c7a06d42d8636bfcbba \ - --hash=sha256:8e54c777b8d27339b70f304d16fc8bc8674ef1bd34ed05ea874bf4921eb5a313 \ - --hash=sha256:9d0cc3c5a2a51fa7e1d579a828c0a2e46b2170024fd8b1a0691c8a52f3abb2d9 \ - --hash=sha256:addc6d585141a7677591868886f6bda0577529401a59d210aa8112114340e129 \ - --hash=sha256:b8ecdba8934632b4dadacb666cd3816627a6ead831b806336972ccc4ba7ca0e9 \ - --hash=sha256:bb0abf627ee14903d05d0ad9b2c6865f1b21eb4081e2c7bea1033f85db2b8bae \ - --hash=sha256:cb4e42ea107a37bff7f9fdbee9532d39f9ea77b89caa5c5112b37057b12e0838 \ - --hash=sha256:d024f44059a853b4b852cfc04fec33e346659d851371e46fc8e7c19de24d3da9 \ - --hash=sha256:d1989fa12d3cd79118ebd29ebe2a6976d23d509b1a4226bc3d66fcb7cb50bd5d \ - --hash=sha256:e6227562fc5c9c1efd15dfe90b0971ae254461b8b6b23c1b617139b6003de1c1 \ - --hash=sha256:f42797309bb725f0f000510d5463175ccd7155395f09b5e7723971b0007a976d \ - --hash=sha256:f6abce0e66bba2babfadc20530fd3688f672d565674336595b4623cd800b91ef - # via pytype -markupsafe==2.1.5 \ - --hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \ - --hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \ - --hash=sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f \ - --hash=sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 \ - --hash=sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532 \ - --hash=sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f \ - --hash=sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 \ - --hash=sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df \ - --hash=sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4 \ - --hash=sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906 \ - --hash=sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f \ - --hash=sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 \ - --hash=sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8 \ - --hash=sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371 \ - --hash=sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2 \ - --hash=sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465 \ - --hash=sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52 \ - --hash=sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6 \ - --hash=sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169 \ - --hash=sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad \ - --hash=sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 \ - --hash=sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0 \ - --hash=sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029 \ - --hash=sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f \ - --hash=sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a \ - --hash=sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced \ - --hash=sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5 \ - --hash=sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c \ - --hash=sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf \ - --hash=sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9 \ - --hash=sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb \ - --hash=sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad \ - --hash=sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3 \ - --hash=sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 \ - --hash=sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46 \ - --hash=sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc \ - --hash=sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a \ - --hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \ - --hash=sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900 \ - --hash=sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 \ - --hash=sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea \ - --hash=sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f \ - --hash=sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5 \ - --hash=sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e \ - --hash=sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a \ - --hash=sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f \ - --hash=sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50 \ - --hash=sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a \ - --hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \ - --hash=sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4 \ - --hash=sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff \ - --hash=sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2 \ - --hash=sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46 \ - --hash=sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b \ - --hash=sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf \ - --hash=sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 \ - --hash=sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5 \ - --hash=sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab \ - --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \ - --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68 - # via jinja2 -msgspec==0.18.6 \ - --hash=sha256:06acbd6edf175bee0e36295d6b0302c6de3aaf61246b46f9549ca0041a9d7177 \ - --hash=sha256:0e24539b25c85c8f0597274f11061c102ad6b0c56af053373ba4629772b407be \ - --hash=sha256:1003c20bfe9c6114cc16ea5db9c5466e49fae3d7f5e2e59cb70693190ad34da0 \ - --hash=sha256:1a76b60e501b3932782a9da039bd1cd552b7d8dec54ce38332b87136c64852dd \ - --hash=sha256:37f67c1d81272131895bb20d388dd8d341390acd0e192a55ab02d4d6468b434c \ - --hash=sha256:3ac4dd63fd5309dd42a8c8c36c1563531069152be7819518be0a9d03be9788e4 \ - --hash=sha256:40a4df891676d9c28a67c2cc39947c33de516335680d1316a89e8f7218660410 \ - --hash=sha256:41cf758d3f40428c235c0f27bc6f322d43063bc32da7b9643e3f805c21ed57b4 \ - --hash=sha256:46eb2f6b22b0e61c137e65795b97dc515860bf6ec761d8fb65fdb62aa094ba61 \ - --hash=sha256:6aa85198f8f154cf35d6f979998f6dadd3dc46a8a8c714632f53f5d65b315c07 \ - --hash=sha256:7481355a1adcf1f08dedd9311193c674ffb8bf7b79314b4314752b89a2cf7f1c \ - --hash=sha256:77f30b0234eceeff0f651119b9821ce80949b4d667ad38f3bfed0d0ebf9d6d8f \ - --hash=sha256:9080eb12b8f59e177bd1eb5c21e24dd2ba2fa88a1dbc9a98e05ad7779b54c681 \ - --hash=sha256:974d3520fcc6b824a6dedbdf2b411df31a73e6e7414301abac62e6b8d03791b4 \ - --hash=sha256:9da21f804c1a1471f26d32b5d9bc0480450ea77fbb8d9db431463ab64aaac2cf \ - --hash=sha256:a59fc3b4fcdb972d09138cb516dbde600c99d07c38fd9372a6ef500d2d031b4e \ - --hash=sha256:a6896f4cd5b4b7d688018805520769a8446df911eb93b421c6c68155cdf9dd5a \ - --hash=sha256:ad237100393f637b297926cae1868b0d500f764ccd2f0623a380e2bcfb2809ca \ - --hash=sha256:b5c390b0b0b7da879520d4ae26044d74aeee5144f83087eb7842ba59c02bc090 \ - --hash=sha256:c3232fabacef86fe8323cecbe99abbc5c02f7698e3f5f2e248e3480b66a3596b \ - --hash=sha256:c61ee4d3be03ea9cd089f7c8e36158786cd06e51fbb62529276452bbf2d52ece \ - --hash=sha256:c8355b55c80ac3e04885d72db515817d9fbb0def3bab936bba104e99ad22cf46 \ - --hash=sha256:cc001cf39becf8d2dcd3f413a4797c55009b3a3cdbf78a8bf5a7ca8fdb76032c \ - --hash=sha256:ce13981bfa06f5eb126a3a5a38b1976bddb49a36e4f46d8e6edecf33ccf11df1 \ - --hash=sha256:d0feb7a03d971c1c0353de1a8fe30bb6579c2dc5ccf29b5f7c7ab01172010492 \ - --hash=sha256:d5351afb216b743df4b6b147691523697ff3a2fc5f3d54f771e91219f5c23aaa \ - --hash=sha256:d70cb3d00d9f4de14d0b31d38dfe60c88ae16f3182988246a9861259c6722af6 \ - --hash=sha256:d86f5071fe33e19500920333c11e2267a31942d18fed4d9de5bc2fbab267d28c \ - --hash=sha256:db1d8626748fa5d29bbd15da58b2d73af25b10aa98abf85aab8028119188ed57 \ - --hash=sha256:e3b524df6ea9998bbc99ea6ee4d0276a101bcc1aa8d14887bb823914d9f60d07 \ - --hash=sha256:e77e56ffe2701e83a96e35770c6adb655ffc074d530018d1b584a8e635b4f36f \ - --hash=sha256:e97dec6932ad5e3ee1e3c14718638ba333befc45e0661caa57033cd4cc489466 \ - --hash=sha256:f7d9faed6dfff654a9ca7d9b0068456517f63dbc3aa704a527f493b9200b210a \ - --hash=sha256:fac5834e14ac4da1fca373753e0c4ec9c8069d1fe5f534fa5208453b6065d5be \ - --hash=sha256:fd62e5818731a66aaa8e9b0a1e5543dc979a46278da01e85c3c9a1a4f047ef7e \ - --hash=sha256:fda4c357145cf0b760000c4ad597e19b53adf01382b711f281720a10a0fe72b7 - # via pytype -networkx==3.1 \ - --hash=sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36 \ - --hash=sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61 - # via - # importlab - # pytype -ninja==1.11.1.1 \ - --hash=sha256:18302d96a5467ea98b68e1cae1ae4b4fb2b2a56a82b955193c637557c7273dbd \ - --hash=sha256:185e0641bde601e53841525c4196278e9aaf4463758da6dd1e752c0a0f54136a \ - --hash=sha256:376889c76d87b95b5719fdd61dd7db193aa7fd4432e5d52d2e44e4c497bdbbee \ - --hash=sha256:3e0f9be5bb20d74d58c66cc1c414c3e6aeb45c35b0d0e41e8d739c2c0d57784f \ - --hash=sha256:73b93c14046447c7c5cc892433d4fae65d6364bec6685411cb97a8bcf815f93a \ - --hash=sha256:7563ce1d9fe6ed5af0b8dd9ab4a214bf4ff1f2f6fd6dc29f480981f0f8b8b249 \ - --hash=sha256:76482ba746a2618eecf89d5253c0d1e4f1da1270d41e9f54dfbd91831b0f6885 \ - --hash=sha256:84502ec98f02a037a169c4b0d5d86075eaf6afc55e1879003d6cab51ced2ea4b \ - --hash=sha256:95da904130bfa02ea74ff9c0116b4ad266174fafb1c707aa50212bc7859aebf1 \ - --hash=sha256:9d793b08dd857e38d0b6ffe9e6b7145d7c485a42dcfea04905ca0cdb6017cc3c \ - --hash=sha256:9df724344202b83018abb45cb1efc22efd337a1496514e7e6b3b59655be85205 \ - --hash=sha256:aad34a70ef15b12519946c5633344bc775a7656d789d9ed5fdb0d456383716ef \ - --hash=sha256:d491fc8d89cdcb416107c349ad1e3a735d4c4af5e1cb8f5f727baca6350fdaea \ - --hash=sha256:ecf80cf5afd09f14dcceff28cb3f11dc90fb97c999c89307aea435889cb66877 \ - --hash=sha256:fa2ba9d74acfdfbfbcf06fad1b8282de8a7a8c481d9dee45c859a8c93fcc1082 - # via pytype -pycnite==2024.7.31 \ - --hash=sha256:5125f1c95aef4a23b9bec3b32fae76873dcd46324fa68e39c10fa852ecdea340 \ - --hash=sha256:9ff9c09d35056435b867e14ebf79626ca94b6017923a0bf9935377fa90d4cbb3 - # via pytype -pydot==3.0.1 \ - --hash=sha256:43f1e878dc1ff7c1c2e3470a6999d4e9e97771c5c862440c2f0af0ba844c231f \ - --hash=sha256:e18cf7f287c497d77b536a3d20a46284568fea390776dface6eabbdf1b1b5efc - # via pytype -pyparsing==3.1.2 \ - --hash=sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad \ - --hash=sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742 - # via pydot -pytype==2024.4.11 \ - --hash=sha256:2986961d1a2ef778a9fea2f81c90cbe6f4a196ff783b26a30e7f3c9be1545c10 \ - --hash=sha256:3315f51ce482d8c07e2f1857c47ccd17beb4a9bfde9afa7d1e6669f1e8881081 \ - --hash=sha256:4484bbe24c58c289cea0c7549a507f20eea29caa68dcaf1e857eba584324641e \ - --hash=sha256:50da73a6a24337d00c9c88697ced74909dd00e3b9238ad619490ff83a6588d52 \ - --hash=sha256:51c5470061ace9908a8306e3aa460e89e8fc15e63557625c387f932b852d3fa8 \ - --hash=sha256:8ad2f7cbfc9843a3f6f1d776318a2f4d96b0ca2d054128280be58eef293c0795 \ - --hash=sha256:a3483a44f457766be85c2a2ef779f3c23f2a95973e5fdb844a030149fc1d92e3 \ - --hash=sha256:aa1069fcaaa9859273ec31650632e7bba9af0e82083e8f7d08f9b742d6d36055 \ - --hash=sha256:ad59ed48b185d61f5ab8bceb173e6680eeabf109c5f15290ad88b7be1096e493 \ - --hash=sha256:ae6c825b7067f420810f8846147df4fdc966c340a859f51317ba26c860cda906 \ - --hash=sha256:b140b180cb287bbbce025e4c929cf3b020aecf4f91899ef609073ab02f2ba8e2 \ - --hash=sha256:b3647b554eea009c9069d58440aed6b9e66d2f3ba20ef2674ffd5cd3b0bf83d7 \ - --hash=sha256:fd24126c5b7bbda52fb48ad9d5b4811a7b090a944c8f39a45b94246668722e8c - # via -r model_signing/install/requirements_dev.in -pyyaml==6.0.1 \ - --hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \ - --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ - --hash=sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df \ - --hash=sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741 \ - --hash=sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206 \ - --hash=sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27 \ - --hash=sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595 \ - --hash=sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62 \ - --hash=sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98 \ - --hash=sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696 \ - --hash=sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290 \ - --hash=sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9 \ - --hash=sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d \ - --hash=sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6 \ - --hash=sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867 \ - --hash=sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47 \ - --hash=sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486 \ - --hash=sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6 \ - --hash=sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3 \ - --hash=sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 \ - --hash=sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938 \ - --hash=sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0 \ - --hash=sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c \ - --hash=sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735 \ - --hash=sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d \ - --hash=sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28 \ - --hash=sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4 \ - --hash=sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba \ - --hash=sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8 \ - --hash=sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef \ - --hash=sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5 \ - --hash=sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd \ - --hash=sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3 \ - --hash=sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0 \ - --hash=sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515 \ - --hash=sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c \ - --hash=sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c \ - --hash=sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924 \ - --hash=sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 \ - --hash=sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43 \ - --hash=sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859 \ - --hash=sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673 \ - --hash=sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54 \ - --hash=sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a \ - --hash=sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b \ - --hash=sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab \ - --hash=sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa \ - --hash=sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c \ - --hash=sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585 \ - --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \ - --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f - # via libcst -ruff==0.5.6 \ - --hash=sha256:07c9e3c2a8e1fe377dd460371c3462671a728c981c3205a5217291422209f642 \ - --hash=sha256:111a99cdb02f69ddb2571e2756e017a1496c2c3a2aeefe7b988ddab38b416d36 \ - --hash=sha256:1f77c1c3aa0669fb230b06fb24ffa3e879391a3ba3f15e3d633a752da5a3e670 \ - --hash=sha256:4d394940f61f7720ad371ddedf14722ee1d6250fd8d020f5ea5a86e7be217daf \ - --hash=sha256:563a7ae61ad284187d3071d9041c08019975693ff655438d8d4be26e492760bd \ - --hash=sha256:57c6c0dd997b31b536bff49b9eee5ed3194d60605a4427f735eeb1f9c1b8d264 \ - --hash=sha256:80521b88d26a45e871f31e4b88938fd87db7011bb961d8afd2664982dfc3641a \ - --hash=sha256:94fe60869bfbf0521e04fd62b74cbca21cbc5beb67cbb75ab33fe8c174f54414 \ - --hash=sha256:a0ef5930799a05522985b9cec8290b185952f3fcd86c1772c3bdbd732667fdcd \ - --hash=sha256:b652dc14f6ef5d1552821e006f747802cc32d98d5509349e168f6bf0ee9f8f42 \ - --hash=sha256:c476acb43c3c51e3c614a2e878ee1589655fa02dab19fe2db0423a06d6a5b1b6 \ - --hash=sha256:c94e084ba3eaa80c2172918c2ca2eb2230c3f15925f4ed8b6297260c6ef179ad \ - --hash=sha256:d7fe7dccb1a89dc66785d7aa0ac283b2269712d8ed19c63af908fdccca5ccc1a \ - --hash=sha256:d9bc8f328a9f1309ae80e4d392836e7dbc77303b38ed4a7112699e63d3b066ab \ - --hash=sha256:e2ff8003f5252fd68425fd53d27c1f08b201d7ed714bb31a55c9ac1d4c13e2eb \ - --hash=sha256:e395daba77a79f6dc0d07311f94cc0560375ca20c06f354c7c99af3bf4560c5d \ - --hash=sha256:e6a584c1de6f8591c2570e171cc7ce482bb983d49c70ddf014393cd39e9dfaed \ - --hash=sha256:f908148c93c02873210a52cad75a6eda856b2cbb72250370ce3afef6fb99b1ed - # via -r model_signing/install/requirements_dev.in -tabulate==0.9.0 \ - --hash=sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c \ - --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f - # via pytype -toml==0.10.2 \ - --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b \ - --hash=sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f - # via pytype -typing-extensions==4.12.2 \ - --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ - --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 - # via pytype diff --git a/install/requirements_test.in b/install/requirements_test.in deleted file mode 100644 index e079f8a6..00000000 --- a/install/requirements_test.in +++ /dev/null @@ -1 +0,0 @@ -pytest diff --git a/install/requirements_test_Darwin.txt b/install/requirements_test_Darwin.txt deleted file mode 100644 index b73895f8..00000000 --- a/install/requirements_test_Darwin.txt +++ /dev/null @@ -1,22 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --generate-hashes --output-file=model_signing/install/requirements_test_Darwin.txt --strip-extras model_signing/install/requirements_test.in -# -iniconfig==2.0.0 \ - --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ - --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 - # via pytest -packaging==24.1 \ - --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ - --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 - # via pytest -pluggy==1.5.0 \ - --hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \ - --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 - # via pytest -pytest==8.3.2 \ - --hash=sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5 \ - --hash=sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce - # via -r model_signing/install/requirements_test.in diff --git a/install/requirements_test_Linux.txt b/install/requirements_test_Linux.txt deleted file mode 100644 index e16accc5..00000000 --- a/install/requirements_test_Linux.txt +++ /dev/null @@ -1,22 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --generate-hashes --output-file=model_signing/install/requirements_test_Linux.txt --strip-extras model_signing/install/requirements_test.in -# -iniconfig==2.0.0 \ - --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ - --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 - # via pytest -packaging==24.1 \ - --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ - --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 - # via pytest -pluggy==1.5.0 \ - --hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \ - --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 - # via pytest -pytest==8.3.2 \ - --hash=sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5 \ - --hash=sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce - # via -r model_signing/install/requirements_test.in diff --git a/install/requirements_test_Windows.txt b/install/requirements_test_Windows.txt deleted file mode 100644 index 945d1036..00000000 --- a/install/requirements_test_Windows.txt +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --generate-hashes --output-file=model_signing/install/requirements_test_Windows.txt --strip-extras model_signing/install/requirements_test.in -# -colorama==0.4.6 \ - --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ - --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 - # via pytest -iniconfig==2.0.0 \ - --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ - --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 - # via pytest -packaging==24.1 \ - --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ - --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 - # via pytest -pluggy==1.5.0 \ - --hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \ - --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 - # via pytest -pytest==8.3.2 \ - --hash=sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5 \ - --hash=sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce - # via -r model_signing/install/requirements_test.in From 38fa5f9ffa9b512869607aba85da14a13c04efff Mon Sep 17 00:00:00 2001 From: Mihai Maruseac Date: Wed, 14 Aug 2024 09:23:33 -0700 Subject: [PATCH 10/11] Fix codeQL scan: remove unused file. We already have a Sigstore signer in the main library, this is no longer needed. If the CodeQL scanner would not have failed here, I would have kept it around for a future cleanup. Signed-off-by: Mihai Maruseac --- src/model_signing/signature/sigstore.py | 104 ------------------------ 1 file changed, 104 deletions(-) delete mode 100644 src/model_signing/signature/sigstore.py diff --git a/src/model_signing/signature/sigstore.py b/src/model_signing/signature/sigstore.py deleted file mode 100644 index 64ab09e1..00000000 --- a/src/model_signing/signature/sigstore.py +++ /dev/null @@ -1,104 +0,0 @@ -# Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Functionality to sign and verify models with sigstore.""" - -import logging as log -from typing import Optional - -from in_toto_attestation.v1 import statement -from sigstore import dsse -from sigstore import models as sig_models -from sigstore import oidc -from sigstore import sign -from sigstore.verify import policy as sig_policy -from sigstore.verify import verifier as sig_verifier -from sigstore_protobuf_specs.dev.sigstore.bundle import v1 as bundle_pb - -from model_signing.signature.signing import Signer -from model_signing.signature.verifying import VerificationError -from model_signing.signature.verifying import Verifier - - -class SigstoreSigner(Signer): - """Provides a Signer that uses sigstore for signing.""" - - CLIENT_ID = "sigstore" - - def __init__( - self, disable_ambient: bool = True, id_provider: str | None = None - ): - token = self.__get_identity_token(disable_ambient, id_provider) - if not token: - raise ValueError("No identity token supplied or detected!") - log.info( - f"Signing identity provider: {token.expected_certificate_subject}" - ) - log.info(f"Signing identity: {token.identity}") - self._signer = sign.Signer( - identity_token=token, signing_ctx=sign.SigningContext.production() - ) - - @staticmethod - def __convert_stmnt(stmnt: statement.Statement) -> dsse.Statement: - subjects = stmnt.pb.subject - sigstore_subjects = [] - for s in subjects: - sigstore_subjects.append( - dsse._Subject( - name=s.name, digest={"sha256": s.digest["sha256"]} - ) - ) - return dsse._StatementBuilder( - predicate_type=stmnt.pb.predicate_type, - predicate=stmnt.pb.predicate, - subjects=sigstore_subjects, - ).build() - - @staticmethod - def __get_identity_token( - disable_ambient: bool = True, id_provider: Optional[str] = None - ) -> Optional[oidc.IdentityToken]: - token: oidc.IdentityToken - if not disable_ambient: - return oidc.detect_credential() - - issuer = ( - oidc.Issuer(id_provider) - if id_provider - else oidc.Issuer.production() - ) - token = issuer.identity_token( - client_id=SigstoreSigner.CLIENT_ID, force_oob=True - ) - return token - - def sign(self, stmnt: statement.Statement) -> bundle_pb.Bundle: - return self._signer.sign_dsse(self.__convert_stmnt(stmnt))._inner - - -class SigstoreVerifier(Verifier): - """Provides a verifier using sigstore.""" - - def __init__(self, oidc_provider: str, identity: str): - self._verifier = sig_verifier.Verifier.production() - self._policy = sig_policy.Identity( - identity=identity, issuer=oidc_provider - ) - - def verify(self, bundle: bundle_pb.Bundle) -> None: - try: - sig_bundle = sig_models.Bundle(bundle) - _ = self._verifier.verify_dsse(sig_bundle, self._policy) - except Exception as e: - raise VerificationError(str(e)) from e From 696c2769c350b9f68c3ad443de87e3838b91403d Mon Sep 17 00:00:00 2001 From: Mihai Maruseac Date: Wed, 14 Aug 2024 11:39:36 -0700 Subject: [PATCH 11/11] Handle review comments Signed-off-by: Mihai Maruseac --- pyproject.toml | 6 +++++- src/model_signing/signature/pki.py | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c9ecc9b2..b42bee02 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ requires = ["hatchling>=1.25"] build-backend = "hatchling.build" [project] -name = "model_signing" +name = "model-signing" dynamic = ["version"] description = "A tool for signing and verifying ML models" readme = "README.model_signing.md" # TODO: Merge READMEs and update @@ -77,6 +77,10 @@ python = "3.11" [tool.hatch.envs.type.scripts] check = "pytype -k -j auto src tests" +# Add support for testing via the old `pytest .` way, too. +[tool.pytest.ini_options] +pythonpath = "src" + [tool.ruff] line-length = 80 diff --git a/src/model_signing/signature/pki.py b/src/model_signing/signature/pki.py index 536496ee..111a2a02 100644 --- a/src/model_signing/signature/pki.py +++ b/src/model_signing/signature/pki.py @@ -171,14 +171,14 @@ def verify(self, bundle: bundle_pb.Bundle) -> None: ) if not usage.value.digital_signature: raise VerificationError( - ("the certificate is not valid for digital" " signature usage") + ("the certificate is not valid for digital signature usage") ) ext_usage = signing_cert_crypto.extensions.get_extension_for_class( x509.ExtendedKeyUsage ) if crypto_oid.ExtendedKeyUsageOID.CODE_SIGNING not in ext_usage.value: raise VerificationError( - ("the certificate is not valid for code" " signing usage") + ("the certificate is not valid for code signing usage") ) # Verify the contents with a key verifier