Cogniflow Step Package Certification Toolkit - validate, certify, and verify pipeline step packages
Project description
cf-pipeline-cert
Cogniflow Step Package Certification Toolkit
A standalone tool for validating, certifying, and verifying Cogniflow pipeline step packages. Works with step packages from any source - PyPI, GitHub, local development.
Installation
pip install cf-pipeline-cert
Quick Start
Verify an Installed Package
# Check if a step package has a valid certificate
cf pipeline cert verify path/to/cf_basic_signal
# Output:
# Plugin: cf-basic-signal v1.0.0
# Certified at: 2024-01-15T10:30:00Z
# Format: cf-pipeline-cert-v2
# Signed: Yes
#
# Verification Results:
# Hash matches: Yes
# Signature valid: Yes
# Overall: VALID
Validate a Package
# Run contract validation (checks the step manifest metadata)
cf pipeline cert validate path/to/my_plugin
# Output shows validation status and operations
Full CLI Commands
# Generate a new keypair (for setting up CI)
cf pipeline cert keygen
# Compute distribution hash for a package
cf pipeline cert hash path/to/my_plugin
# Create a certification request (unsigned certificate)
cf pipeline cert request path/to/my_plugin -o my_plugin.cert-request.json
# Sign a certification request (certification authority)
cf pipeline cert sign my_plugin.cert-request.json -k $SIGNING_KEY
# Import a signed certificate into the package manifest
cf pipeline cert import my_plugin.cert.json path/to/my_plugin
# One-step certification (validate + sign + embed into the step manifest)
cf pipeline cert certify path/to/my_plugin -k $SIGNING_KEY
Windows Publish Runbook
cf-pipeline-cert publishing in this repository is handled by the Windows-only workflow:
.github/workflows/cf_pipeline_cert_windows_publish.yml
Release tags:
- PyPI:
cf-pipeline-cert-v<version>(example:cf-pipeline-cert-v0.1.0) - TestPyPI:
cf-pipeline-cert-v<version>-test(example:cf-pipeline-cert-v0.1.0-test)
1. Local preflight mimic (required)
Requires Python 3.14 to be installed locally (py -3.14 or equivalent).
powershell -ExecutionPolicy Bypass -File scripts/mimic_windows_python_publish_workflow.ps1 `
-WorkflowFile .github/workflows/cf_pipeline_cert_windows_publish.yml `
-PackageDir sandcastle/cf_pipeline/cf_pipeline_cert `
-PythonExe py `
-PythonVersion 3.14
The scripts under scripts/ are parameterized so the same Windows publish-preflight and queue flow can be reused for other Python modules in this repository by changing -WorkflowFile and -PackageDir.
2. Queue workflow (manual dispatch)
The GitHub publish jobs use PyPI/TestPyPI trusted publishing via GitHub OIDC on Windows. No PYPI_API_TOKEN or TEST_PYPI_API_TOKEN repository secrets are required when the publisher is configured on the package index side.
Dry run (prints exact gh workflow run command without dispatch):
powershell -ExecutionPolicy Bypass -File scripts/queue_windows_python_publish_workflow.ps1 `
-WorkflowFile .github/workflows/cf_pipeline_cert_windows_publish.yml `
-PackageDir sandcastle/cf_pipeline/cf_pipeline_cert `
-PublishTarget testpypi `
-Ref main `
-RequireLocalPass `
-DryRun
Queue TestPyPI publish:
powershell -ExecutionPolicy Bypass -File scripts/queue_windows_python_publish_workflow.ps1 `
-WorkflowFile .github/workflows/cf_pipeline_cert_windows_publish.yml `
-PackageDir sandcastle/cf_pipeline/cf_pipeline_cert `
-PublishTarget testpypi `
-Ref main `
-RequireLocalPass
Queue PyPI publish:
powershell -ExecutionPolicy Bypass -File scripts/queue_windows_python_publish_workflow.ps1 `
-WorkflowFile .github/workflows/cf_pipeline_cert_windows_publish.yml `
-PackageDir sandcastle/cf_pipeline/cf_pipeline_cert `
-PublishTarget pypi `
-Ref cf-pipeline-cert-v0.1.0 `
-RequireLocalPass
3. Monitor queued run
gh run list --workflow cf_pipeline_cert_windows_publish.yml --limit 10
gh run watch --exit-status
If the trusted publisher is configured with repository odea-project/cogniflow-playground and workflow cf_pipeline_cert_windows_publish.yml, the publish job should mint its upload token automatically during the GitHub run.
Trust Model
Decentralized Certification
Step packages can live on any GitHub or PyPI - they don't need to be in a central repository. The certification authority (CA) provides:
- Public key embedded in this package - for verification without network access
- Signing service - via GitHub Actions or manual signing
Certificate Verification Checks
- Signature - Ed25519 cryptographic signature from known CA
- Hash - SHA256 of all source files (.py, .cpp, .hpp) matches certificate
- Format - Certificate format version is recognized
Security Guarantees
| What's Verified | Attack Prevented |
|---|---|
| Signature valid | Certificate tampering, fake certificates |
| Hash matches | Code injection, backdoors |
| Format version | Downgrade attacks |
For Step Package Developers
1. Create a step manifest (steps.nq, steps.nquads, or steps.json)
{
"@context": {
"cf": "https://cogniflow.odea-project.org/cf#",
"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
"rdfs": "http://www.w3.org/2000/01/rdf-schema#"
},
"@graph": [
{
"@id": "pkg:MyPackage",
"@type": "cf:StepPackage",
"cf:packageId": "my-step-package",
"cf:packageVersion": "1.0.0",
"rdfs:label": "My Step Package",
"cf:description": "Steps for my package"
},
{
"@id": "pkg:MyPlugin",
"@type": "cf:PluginArtifact",
"cf:pluginName": "my-step-package",
"cf:pluginVersion": "1.0.0",
"cf:artifactPath": "bin",
"cf:pluginListSymbol": "cf_list_steps",
"cf:pluginResolveSymbol": "cf_resolve_step"
},
{
"@id": "pkg:MyImpl",
"@type": "cf:StepImplementation",
"cf:implementationArtifact": {"@id": "pkg:MyPlugin"},
"cf:operationName": "my_operation",
"cf:operationContract": {
"kind": "example"
}
}
]
}
2. Validate Locally
cf pipeline cert validate my_package/
3. Get Certified
Option A: Self-service via GitHub Actions
Add this workflow to your step package repository:
# .github/workflows/certify.yml
name: Certify Step Package
on:
release:
types: [published]
jobs:
certify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install certification toolkit
run: pip install cf-pipeline-cert
- name: Validate package
run: cf pipeline cert validate my_package/
- name: Create certification request
run: cf pipeline cert request my_package/ -o cert-request.json
- name: Upload request for CA signing
uses: actions/upload-artifact@v4
with:
name: cert-request
path: cert-request.json
Option B: Request Certification from CA
-
Create a certification request:
cf pipeline cert request my_package/ -o cert-request.json
-
Submit the request file via:
- GitHub Issue on the CogniFlow repository
- Email to the certification authority
- Automated API (when available)
-
Receive the signed certificate and import it into the step manifest:
cf pipeline cert import my_package.cert.json my_package/
4. Distribute
The certificate is embedded in your step manifest under cf:pluginCertificate on the plugin artifact node:
my_package/
|-- __init__.py
|-- ops.py
|-- steps.nq <- Contains signed certificate
`-- ...
Users can verify the package after installation:
cf pipeline cert verify $(python -c "import my_package; print(my_package.__path__[0])")
Environment Variables
| Variable | Description |
|---|---|
CF_CERT_SIGNING_KEY_B64 |
Private key for signing (CA use only) |
CF_CERT_VERIFICATION_KEY_B64 |
Public key for verification (optional, embedded in package) |
Programmatic Usage
from pathlib import Path
from cf_pipeline_cert import (
validate_step_package,
verify_certificate,
generate_keypair,
)
# Validate a step package
result = validate_step_package(Path("my_package"))
if result.valid:
print(f"Plugin: {result.plugin_name} v{result.plugin_version}")
print(f"Operations: {len(result.operations)}")
print(f"Hash: {result.distribution_hash}")
# Verify certificate
verification = verify_certificate(
Path("my_package"),
public_key_b64="..." # Optional, uses embedded key if not provided
)
if verification["valid"]:
print("Certificate is valid")
else:
for error in verification["errors"]:
print(f"Error: {error}")
Security
- Ed25519 signatures - Fast, secure, modern elliptic curve cryptography
- SHA256 hashes - Tamper-evident code fingerprints
- No network required - Verification works completely offline
- Deterministic hashing - Same code always produces same hash
What's Included in the Hash
- All
.pyfiles (except in__pycache__,build) - All
.cppand.hppfiles (for native extensions) - File paths are included (protects against file renaming attacks)
- Supported step manifests (
steps.nq,steps.nquads,steps.json) are excluded (to avoid chicken-and-egg problem)
License
Apache-2.0
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cf_pipeline_cert-0.2.2.tar.gz.
File metadata
- Download URL: cf_pipeline_cert-0.2.2.tar.gz
- Upload date:
- Size: 22.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f5ca01629b6fb5e65c9a634979b166bf53d6f193d1e1038f5c20e83a778169a2
|
|
| MD5 |
1a15175ab7a11b830f482b4fbd5b55aa
|
|
| BLAKE2b-256 |
5fbf7dd57ffb1e8ce8f3b28376e34e1cc7efae21133bd0d4da603a6384731352
|
File details
Details for the file cf_pipeline_cert-0.2.2-py3-none-any.whl.
File metadata
- Download URL: cf_pipeline_cert-0.2.2-py3-none-any.whl
- Upload date:
- Size: 17.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ae779527e2436cda95694c5fd7f410efcc4b9abdb00a2983315cd0c72d2fdedd
|
|
| MD5 |
8b6b2960a2af66b5d4e56e299b7eb78e
|
|
| BLAKE2b-256 |
718e19918fbf368f1064ce5099266b820007b27dab9c6a9652f76432f0e98fb1
|