metamorphic-crypto 0.3.2

Zero-knowledge end-to-end encryption with post-quantum hybrid KEM (ML-KEM-768/1024 + X25519)
Documentation
name: Release WASM

on:
  push:
    tags: ["v*"]

permissions:
  contents: write
  attestations: write
  id-token: write

env:
  CARGO_TERM_COLOR: always
  # Pin versions for reproducibility
  RUST_TOOLCHAIN: "1.85"
  WASM_PACK_VERSION: "0.14.0"

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ env.RUST_TOOLCHAIN }}
          targets: wasm32-unknown-unknown
          components: clippy, rustfmt

      - uses: Swatinem/rust-cache@v2

      # --- Quality gates ---
      - name: Format check
        run: cargo fmt --check

      - name: Clippy
        run: cargo clippy -- -D warnings

      - name: Tests
        run: cargo test

      # --- Publish to crates.io ---
      - name: Publish to crates.io
        run: cargo publish --no-verify
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}

      # --- WASM build ---
      - name: Install wasm-pack
        run: |
          curl -fsSL "https://github.com/rustwasm/wasm-pack/releases/download/v${WASM_PACK_VERSION}/wasm-pack-v${WASM_PACK_VERSION}-x86_64-unknown-linux-musl.tar.gz" \
            | tar xz --strip-components=1 -C /usr/local/bin "wasm-pack-v${WASM_PACK_VERSION}-x86_64-unknown-linux-musl/wasm-pack"
          wasm-pack --version

      - name: Build WASM (--target web)
        run: wasm-pack build --target web --release

      # --- Checksums ---
      - name: Compute SHA-512 checksums
        working-directory: pkg
        run: sha512sum metamorphic_crypto.js metamorphic_crypto_bg.wasm > SHA512SUMS

      - name: Display checksums
        run: cat pkg/SHA512SUMS

      # --- Cosign (keyless signing via GitHub OIDC) ---
      - name: Install cosign
        uses: sigstore/cosign-installer@v3

      - name: Sign artifacts with cosign
        run: |
          cosign sign-blob --yes --bundle pkg/metamorphic_crypto.js.cosign.bundle pkg/metamorphic_crypto.js
          cosign sign-blob --yes --bundle pkg/metamorphic_crypto_bg.wasm.cosign.bundle pkg/metamorphic_crypto_bg.wasm

      # --- Attestation ---
      - name: Attest WASM artifacts
        uses: actions/attest-build-provenance@v2
        with:
          subject-path: |
            pkg/metamorphic_crypto.js
            pkg/metamorphic_crypto_bg.wasm

      # --- npm publish ---
      - uses: actions/setup-node@v4
        with:
          node-version: "22"
          registry-url: "https://registry.npmjs.org"

      - name: Scope package for npm
        working-directory: pkg
        run: npm pkg set name="@f0rest8/metamorphic-crypto"

      - name: Publish to npm
        working-directory: pkg
        run: npm publish --access public
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

      # --- GitHub Release ---
      - name: Attach artifacts to GitHub Release
        uses: softprops/action-gh-release@v2
        with:
          files: |
            pkg/metamorphic_crypto.js
            pkg/metamorphic_crypto_bg.wasm
            pkg/SHA512SUMS
            pkg/metamorphic_crypto.js.cosign.bundle
            pkg/metamorphic_crypto_bg.wasm.cosign.bundle
          fail_on_unmatched_files: true