Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
374c3bc
chore: add CDK for basic CI resources
kessplas Aug 6, 2025
df36ec1
add basic S3EC implementation
kessplas Aug 6, 2025
62edf8a
include decryptionMaterials change
kessplas Aug 6, 2025
d4baef1
add Github workflows
kessplas Aug 6, 2025
fae5819
permissions
kessplas Aug 6, 2025
99c9591
fix test
kessplas Aug 6, 2025
52dc9ab
fix region
kessplas Aug 6, 2025
61096c6
debug
kessplas Aug 6, 2025
23362e3
or dict
kessplas Aug 6, 2025
8c76a5b
debug
kessplas Aug 6, 2025
24bcb48
github env vars
kessplas Aug 6, 2025
ef416de
vars not secrets
kessplas Aug 6, 2025
480a398
remove debug, raise error on mismatch
kessplas Aug 6, 2025
21b5906
run formatter, add linting
kessplas Aug 7, 2025
454c0eb
address feedback (ruff, uv, etc)
kessplas Aug 11, 2025
351431a
GHA stuff
kessplas Aug 11, 2025
c15f2da
uv venv
kessplas Aug 11, 2025
5e3f122
black
kessplas Aug 11, 2025
dac7ab7
only ruff, remove isort
kessplas Aug 11, 2025
3cd450b
use makefile
kessplas Aug 11, 2025
be51b70
fix CI
kessplas Aug 11, 2025
8bbae1a
split out integ tests
kessplas Aug 11, 2025
090c8a4
match boto3, use abc
kessplas Aug 11, 2025
15d2144
snake case renaming
kessplas Aug 11, 2025
cac76ce
format
kessplas Aug 11, 2025
f231ab2
remove lock file, format, simplify attrs
kessplas Aug 11, 2025
2d686bc
remove typehint
kessplas Aug 11, 2025
aed461e
use pytest
kessplas Aug 11, 2025
2f6bc1e
remove uv lock
kessplas Aug 11, 2025
fa000a5
ruff fixes
kessplas Aug 12, 2025
6c0b92a
enforce ruff for src
kessplas Aug 12, 2025
bee9218
now fix black
kessplas Aug 12, 2025
4b5ab01
empty body plus tests
kessplas Aug 12, 2025
c440af4
fix type hints
kessplas Aug 12, 2025
d113d54
try client type hint again
kessplas Aug 12, 2025
a73d544
PDK to plaintext_data_key
kessplas Aug 12, 2025
7a3b929
initial Client implementation, KMS keyring, CDK resources, basic CI
kessplas Aug 12, 2025
af724e6
enforce type checking for put_object, encode to utf-8 to match boto3
kessplas Aug 13, 2025
2360ff2
enforce type checking for put_object, encode to utf-8 to match boto3
kessplas Aug 15, 2025
8abfabb
add test-server and CI for it
kessplas Aug 16, 2025
03ef0cb
install poetry
kessplas Aug 16, 2025
af32de4
dont package test server
kessplas Aug 16, 2025
c3489d1
fix Makefile
kessplas Aug 16, 2025
65b0ed4
Fix: Include gradle-wrapper.jar files in repository to fix CI build
kessplas Aug 16, 2025
7357fe1
java slowe
kessplas Aug 16, 2025
b3fa01e
im slowe
kessplas Aug 16, 2025
c03a775
black
kessplas Aug 18, 2025
4fdce1f
ci-fast
kessplas Aug 18, 2025
035dff0
remove print
kessplas Aug 18, 2025
abe7114
default to fast ci
kessplas Aug 18, 2025
a49a018
fix smithy breaking changes, poetry to uv
kessplas Aug 29, 2025
a26d99b
address feedback
kessplas Sep 3, 2025
eb81894
chore(TestServer): add multilanguage test server, run in CI
kessplas Sep 3, 2025
2a79383
chore[dev]: replace poetry with UV in README (#121)
texastony Jan 27, 2026
894aeb9
fix(exceptions): properly initialize BotoCoreError subclasses with me…
texastony Jan 27, 2026
0fde32f
chore(deps): bump black, reformat for black bump
texastony Jan 28, 2026
0cfd218
chore: add all other languages, latest major versions, many more test…
kessplas Feb 4, 2026
4c9a1e9
chore: refactor to make S3EC install itself as plugins (#138)
kessplas Feb 17, 2026
b664766
ci(duvet): add spec and duvet for Python (#139)
texastony Feb 18, 2026
4d8a1a6
chore(duvet): annotate Keyring, S3Keyring, and KmsKeyring classes (#143)
kessplas Mar 3, 2026
f8a6c4c
feat(metadata): Add Instruction File Support (#140)
texastony Mar 4, 2026
268bd4b
feat: add Key Committing AES-GCM and AES-CBC support (#147)
kessplas Mar 18, 2026
e70cf78
chore: add pytest-cov coverage reporting and update GitHub Actions (#…
texastony Mar 20, 2026
d022b98
ci: daily ci with slack webhook (#162)
texastony Mar 27, 2026
c461909
feat(decryption): streaming decryption with cipher-agnostic stream cl…
texastony Apr 2, 2026
52d05f3
fix(error-handling): improve error messages for missing S3 objects an…
texastony Apr 6, 2026
09f3b1e
feat(examples): add usage examples with integration tests (#156)
texastony Apr 16, 2026
099ab77
chore: fill in gaps in testing (#170)
kessplas Apr 17, 2026
586ad4b
chore(perf): add performance testing (#173)
kessplas Apr 18, 2026
515aa4b
feat: delete_object and delete_objects (#175)
texastony Apr 21, 2026
7ca15e8
chore(tests): add security tests (#174)
kessplas Apr 27, 2026
6bbfd0a
feat: add instruction file config to provide a way to disable instruc…
kessplas Apr 27, 2026
732100e
chore: guard against None dict, always default to {} (#177)
kessplas May 7, 2026
08b6eb4
chore: disable ranged gets (#178)
kessplas May 8, 2026
ab05b8c
chore: reduce perf rounds (#180)
kessplas May 11, 2026
c3167c9
chore: bump deps (#181)
kessplas May 11, 2026
b4bfc00
chore: move this project to V4 (#179)
kessplas May 11, 2026
0f336a5
chore: apply user agent string with version (#182)
kessplas May 13, 2026
c4ab1c0
chore: remove Black, use ruff for formatting (#184)
kessplas May 13, 2026
d6edde6
chore(test): fix flaky tests, add more platforms (#183)
kessplas May 14, 2026
d158772
chore: update README etc (#185)
kessplas May 15, 2026
ddf8b67
feat: add low-level Multipart Upload and upload_file(obj) (#172)
texastony May 18, 2026
3d133b1
chore: setup release, readthedocs (#186)
kessplas May 18, 2026
c835e6c
chore: special character fix for windows (#188)
kessplas May 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .duvet/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
reports/
requirements/
specification/
43 changes: 43 additions & 0 deletions .duvet/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
'$schema' = "https://awslabs.github.io/duvet/config/v0.4.0.json"

[[source]]
pattern = "src/**/*.py"
type = "implementation"
comment-style = { meta = "##=", content = "##%" }
[[source]]
pattern = "test/**/*.py"
type = "test"
comment-style = { meta = "##=", content = "##%" }
[[source]]
pattern = "compliance_exceptions/**/*.md"
type = "exception"
comment-style = { meta = "##=", content = "##%" }

# Include required specifications here
[[specification]]
source = "specification/s3-encryption/materials/keyrings.md"
[[specification]]
source = "specification/s3-encryption/materials/s3-keyring.md"
[[specification]]
source = "specification/s3-encryption/materials/s3-kms-keyring.md"
[[specification]]
source = "specification/s3-encryption/client.md"
[[specification]]
source = "specification/s3-encryption/decryption.md"
[[specification]]
source = "specification/s3-encryption/encryption.md"
[[specification]]
source = "specification/s3-encryption/key-commitment.md"
[[specification]]
source = "specification/s3-encryption/key-derivation.md"
[[specification]]
source = "specification/s3-encryption/data-format/content-metadata.md"
[[specification]]
source = "specification/s3-encryption/data-format/metadata-strategy.md"

[report.html]
enabled = true

# Enable snapshots to prevent requirement coverage regressions
[report.snapshot]
enabled = false
66 changes: 66 additions & 0 deletions .github/workflows/all-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: All CI

on:
push:
branches: [ main, staging ]
pull_request:
workflow_dispatch:
inputs:
python-version:
description: 'Python version to use'
default: '3.11'
required: false
type: string

jobs:
python-lint:
name: Lint
uses: ./.github/workflows/lint.yml

run-test-server:
permissions:
id-token: write
contents: read
name: Run TestServer Tests
uses: ./.github/workflows/test-server.yml
with:
python-version: ${{ inputs.python-version || '3.11' }}
secrets: inherit

python-integ:
permissions:
id-token: write
contents: read
name: Python Integration Tests
uses: ./.github/workflows/python-integ.yml
with:
python-version: ${{ inputs.python-version || '3.11' }}
secrets: inherit

python-perf:
permissions:
id-token: write
contents: read
name: Python Performance Tests
uses: ./.github/workflows/python-perf.yml
with:
python-version: ${{ inputs.python-version || '3.11' }}
secrets: inherit

run-duvet:
permissions:
id-token: write
contents: read
pages: write
name: Run Duvet
uses: ./.github/workflows/duvet.yml
secrets: inherit

run-duvet-test-server:
permissions:
id-token: write
contents: read
pages: write
name: Run Duvet
uses: ./.github/workflows/duvet-test-server.yml
secrets: inherit
50 changes: 50 additions & 0 deletions .github/workflows/daily_ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
name: Daily CI

on:
schedule:
# 5 AM PST = 1 PM UTC, Monday–Friday
- cron: "0 13 * * 1-5"
workflow_dispatch:
inputs:
python-version:
description: 'Python version to use'
default: '3.11'
required: false
type: string

jobs:
run-test-server:
permissions:
id-token: write
contents: read
name: Run TestServer Tests
uses: ./.github/workflows/test-server.yml
with:
python-version: ${{ inputs.python-version || '3.11' }}
secrets: inherit

python-integ:
permissions:
id-token: write
contents: read
name: Python Integration Tests
uses: ./.github/workflows/python-integ.yml
with:
python-version: ${{ inputs.python-version || '3.11' }}
secrets: inherit

notify:
needs:
[
run-test-server,
python-integ
]
permissions:
id-token: write
contents: read
if: ${{ failure() }}
uses: aws/aws-cryptographic-material-providers-library/.github/workflows/slack-notification.yml@main
with:
message: "Daily CI failed on `${{ github.repository }}`. View run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
secrets:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL_CI }}
121 changes: 121 additions & 0 deletions .github/workflows/duvet-test-server.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
name: Generate Duvet Report for TestServer

on:
workflow_call:
# Optional inputs that can be provided when calling this workflow

jobs:
duvet:
runs-on: macos-latest
permissions:
id-token: write
contents: read
pages: write

steps:
- name: Checkout code
uses: actions/checkout@v6

# There are a lot of submodules here
# This initializes the checkouts in parallel (--jobs)
# rather than in series the way actions/checkout@v6 does it.

- name: Get CPU count
id: cpu-count
run: echo "count=$(node -p 'require("os").cpus().length')" >> $GITHUB_OUTPUT

- name: Setup git submodules with PAT
run: |
git config --global url."https://github.com/".insteadOf "git@github.com:"
git config --global credential.helper store
echo "https://x-token-auth:${{ secrets.PAT_FOR_SPEC }}@github.com" > ~/.git-credentials

- name: Optimize git for performance
run: |
git config --global fetch.parallel ${{ steps.cpu-count.outputs.count }}
git config --global submodule.fetchJobs ${{ steps.cpu-count.outputs.count }}
git config --global remote.origin.tagOpt --no-tags

- name: Checkout submodules with --jobs
run: |
git submodule update --init --depth 1 --single-branch --jobs ${{ steps.cpu-count.outputs.count }} test-server/


- name: Checkout CPP code cpp-v3
uses: actions/checkout@v6
with:
submodules: recursive
repository: aws/aws-sdk-cpp
ref: main
path: test-server/cpp-v3-server/aws-sdk-cpp/

- name: Setup Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable

- name: Build and install duvet
run: |
cargo install duvet --locked

- name: Run duvet
if: always()
run: cd test-server && make duvet

- name: Upload duvet reports
if: always()
uses: actions/upload-artifact@v7
with:
name: test-server-reports
include-hidden-files: true
path: test-server/*-server/.duvet/reports/report.html

- name: Generate compliance dashboard
if: always()
run: |
cd test-server/spec-compliance-dashboard
python generate_compliance_dashboard.py

- name: Create dashboard redirect index.html
if: always()
run: |
cat > test-server/index.html << 'EOF'
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="refresh" content="0; url=spec-compliance-dashboard/compliance_homepage.html">
<title>Redirecting to Compliance Dashboard...</title>
</head>
<body>
<p>Redirecting to <a href="spec-compliance-dashboard/compliance_homepage.html">Compliance Dashboard</a>...</p>
</body>
</html>
EOF

- name: Upload compliance dashboard
if: always()
uses: actions/upload-artifact@v7
with:
name: compliance-dashboard
include-hidden-files: true
path: |
test-server/spec-compliance-dashboard/compliance_homepage.html
test-server/*/compliance_summary_report.html
test-server/*/.duvet/reports/report.html
test-server/spec-compliance-dashboard/templates/*
test-server/index.html

- name: Setup Pages
if: always() && (github.ref == 'refs/heads/staging' || github.ref == 'refs/heads/fireegg-test-servers') && github.event_name == 'push'
uses: actions/configure-pages@v5

- name: Upload Pages artifact
if: always() && (github.ref == 'refs/heads/staging' || github.ref == 'refs/heads/fireegg-test-servers') && github.event_name == 'push'
uses: actions/upload-pages-artifact@v3
with:
path: test-server/

- name: Deploy to GitHub Pages
if: always() && (github.ref == 'refs/heads/staging' || github.ref == 'refs/heads/fireegg-test-servers') && github.event_name == 'push'
uses: actions/deploy-pages@v4
40 changes: 40 additions & 0 deletions .github/workflows/duvet.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: duvet on the local S3EC-Python

on:
workflow_call:
# Optional inputs that can be provided when calling this workflow

jobs:
test:
runs-on: ubuntu-slim
permissions:
id-token: write
contents: read
pages: write

steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Checkout specific specification
run: git submodule update --init --recursive specification

- name: Setup Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable

- name: Install duvet
run: |
cargo install duvet --locked

- name: Run duvet
run: make duvet

- name: Upload duvet reports
uses: actions/upload-artifact@v7
with:
name: reports
include-hidden-files: true
path: .duvet/reports/report.html

29 changes: 29 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: Lint

on:
push:
branches: [ main ]
workflow_call:
workflow_dispatch:

jobs:
lint:
runs-on: macos-15

steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.11'

- name: Install Uv
run: pip install uv

- name: Install dependencies and run linting
run: |
make install
make format-check
make lint
Loading
Loading