Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
175f59b
feat(stegano-inspect): draft of stegano-inspect
sassman Jan 10, 2022
c1c7a7d
fix(stegano-inspect): regenerate corrupted 512x512 test fixture
sassman Jan 22, 2026
b5cb90b
feat(stegano-f5): implement F5 algorithm core (Phase 1)
sassman Jan 22, 2026
9c0084c
feat(stegano-f5): implement JPEG transcoding for F5 steganography
sassman Jan 24, 2026
320675e
refactor(stegano-f5): replace custom JPEG parser with forked codec su…
sassman Jan 24, 2026
481bea8
chore: cargo fmt
sassman Jan 24, 2026
a84d1ba
chore: ignore the planning folder
sassman Jan 24, 2026
4577050
chore(stegano-core): add stegano-f5 dep and jpeg image feature
sassman Jan 24, 2026
2a7d30d
feat(stegano-core): support JPEG input in Media::from_file
sassman Jan 24, 2026
fd24e73
feat(stegano-core): add JpegError variant for F5 errors
sassman Jan 24, 2026
4677358
refactor(stegano-core): add is_jpeg_extension helper
sassman Jan 24, 2026
48a1a88
feat(stegano-core): JPEG hide path via F5 with password as seed
sassman Jan 24, 2026
b9a6905
feat(stegano-core): JPEG unveil path via F5 with password as seed
sassman Jan 24, 2026
5907532
fix: address clippy warnings and formatting for Rust 1.93
sassman Jan 25, 2026
d43f929
ci: add submodule support to all CI jobs
sassman Jan 25, 2026
14799c9
fix: update decoder submodule with Rust 2024 unsafe compatibility
sassman Jan 25, 2026
d75f226
fix: update decoder submodule with is_multiple_of clippy fix
sassman Jan 25, 2026
ea135a4
fix: update decoder submodule with doc comment fix
sassman Jan 25, 2026
cad90af
refactor(stegano-f5): redesign F5Error with string-free variants and …
sassman Jan 25, 2026
a2a27f4
refactor(stegano-core): push F5 encoding logic to Media layer (step 1/2)
sassman Jan 25, 2026
9b2d16c
feat(stegano-core): add F5JpegDecoder wrapper implementing Read trait
sassman Jan 25, 2026
d6df9f3
refactor(stegano-core): eliminate JPEG branching in UnveilApi
sassman Jan 25, 2026
d94cd98
refactor(stegano-core): use F5JpegDecoder in UnveilRawApi
sassman Jan 25, 2026
b05d11f
chore(stegano-core): remove unused is_jpeg_extension helper
sassman Jan 25, 2026
7307662
fix(stegano-cli): update CLI to use LsbCodecOptions after refactor
sassman Jan 25, 2026
5f4638e
refactor(api): replace with_options() with individual builder methods
sassman Jan 25, 2026
01ab7a7
fix(api): propagate color_step_increment to HideApi
sassman Jan 25, 2026
d93403d
fix(stegano-f5): propagate embedding errors during hide operation
sassman Jan 26, 2026
6bfd18c
doc: reduce noise
sassman Jan 26, 2026
c9ef2f6
feat: update stegano-f5-jpeg-encoder to the failable hooks version
sassman Jan 26, 2026
0da283a
refactor: use the already present rgba8 image for png -> jpeg transco…
sassman Jan 26, 2026
922372a
chore: cargo fmt + take the password from the payload codec factory
sassman Jan 26, 2026
ea15223
chore: add a convienient alias `cargo t` for nextest
sassman Jan 26, 2026
232fec3
feat(cli): add --jpeg-quality option for F5 encoding
sassman Jan 26, 2026
5eedc95
chore: cargo fmt
sassman Jan 26, 2026
4f2ea41
feat(core): add encoded_size() to PayloadEncoder trait
sassman Jan 29, 2026
0b7abce
feat(f5): add HEADER_BYTES const and embedded_size() method
sassman Jan 29, 2026
3a100c2
fix(f5): account for header overhead in capacity test
sassman Jan 29, 2026
db9ea63
docs(f5): add capacity checking example to crate documentation
sassman Jan 29, 2026
c2195e1
chore: fix clippy warnings and format code
sassman Jan 29, 2026
61115b0
feat(api): introduce a prelude module with better naming of structs
sassman Feb 9, 2026
b1e3d60
chore: fix lints
sassman Feb 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ lint = "clippy --all-targets"
benchmarks = "bench --features benchmarks --locked"
ntest = "nextest run --locked"
coverage = "llvm-cov --workspace --codecov --output-path codecov.json"
t = "nextest run --locked"
140 changes: 119 additions & 21 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,40 +11,138 @@ on:
required: true

jobs:
build:
uses: steganogram/.github/.github/workflows/build.yml@main
check:
name: check
strategy:
fail-fast: false
matrix:
os: ["macos-latest", "ubuntu-latest", "windows-latest"]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: setup | rust
uses: steganogram/.github/.github/actions/rust-toolchain@main
- run: cargo check

lint:
name: lint
strategy:
fail-fast: false
matrix:
os: ["macos-latest", "ubuntu-latest", "windows-latest"]
cargo-cmd:
- fmt --all -- --check
- clippy --all-targets -- -D warnings
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: setup | rust
uses: steganogram/.github/.github/actions/rust-toolchain@main
- run: cargo ${{ matrix['cargo-cmd'] }}

tests:
name: tests
strategy:
fail-fast: false
matrix:
os: ["macos-latest", "ubuntu-latest", "windows-latest"]
channel: ["nightly", "stable"]
runs-on: ${{ matrix.os }}
continue-on-error: ${{ matrix.channel == 'nightly' }}
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: setup | rust
uses: steganogram/.github/.github/actions/rust-toolchain@main
with:
channel: ${{ matrix.channel }}
default: true
profile: minimal
- name: cargo test
if: matrix.os != 'windows-latest'
run: |
if [ -f "Cargo.lock" ]; then
cargo test --all --locked
else
cargo test --all
fi
- name: cargo test
if: matrix.os == 'windows-latest'
run: |
if (Test-Path "Cargo.lock") {
cargo test --all --locked
} else {
cargo test --all
}

audit:
name: security audit
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: setup | rust
uses: steganogram/.github/.github/actions/rust-toolchain@main
- uses: taiki-e/install-action@v2
with:
tool: cargo-deny
- name: audit
run: cargo deny check advisories bans sources
continue-on-error: true

docs:
name: docs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: setup | rust
uses: steganogram/.github/.github/actions/rust-toolchain@main
- name: check documentation
env:
RUSTDOCFLAGS: -D warnings
run: cargo doc --no-deps

coverage:
name: code coverage
uses: steganogram/.github/.github/workflows/coverage.yml@main
secrets:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: setup | rust
uses: steganogram/.github/.github/actions/rust-toolchain@main
with:
channel: nightly
- uses: taiki-e/install-action@cargo-llvm-cov
- name: run code coverage
run: cargo +nightly llvm-cov --all-features --workspace --lcov --output-path lcov.info
- name: upload to codecov.io
uses: codecov/codecov-action@v5
continue-on-error: true
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: lcov.info
fail_ci_if_error: true

benchmark:
name: benchmark
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: setup | rust
uses: steganogram/.github/.github/actions/rust-toolchain@main
with:
channel: nightly
- name: run benchmarks
run: cargo +nightly benchmarks

# pkg-deb:
# name: binaray package .deb
# needs: check
# runs-on: ubuntu-latest
# steps:
# - uses: actions/checkout@v4
# - name: cargo deb
# uses: sassman/rust-deb-builder@v1
# with:
# package: stegano-cli
# - name: Archive deb artifact
# uses: actions/upload-artifact@v2
# with:
# name: stegano-cli-amd64-static.deb
# path: target/x86_64-unknown-linux-musl/debian/stegano-cli*.deb
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
target
tmp
.planning/
6 changes: 6 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
[submodule "crates/stegano-f5-jpeg-decoder"]
path = crates/stegano-f5-jpeg-decoder
url = git@github.com:steganogram/stegano-f5-jpeg-decoder.git
[submodule "crates/stegano-f5-jpeg-encoder"]
path = crates/stegano-f5-jpeg-encoder
url = git@github.com:steganogram/stegano-f5-jpeg-encoder.git
Loading
Loading