recrypt 0.16.0

A pure-Rust implementation of Transform Encryption, a Proxy Re-encryption scheme
Documentation
on:
  push:
    branches:
      - main
  pull_request:

name: CI

jobs:
  # Abort if the code isn't formatted according to rustfmt standards from nightly.
  fmt:
    name: Rustfmt
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v6
      - name: Cache cargo
        uses: Swatinem/rust-cache@v2
      - uses: IronCoreLabs/rust-toolchain@v1
        with:
          toolchain: nightly
          components: rustfmt
      - uses: actions-rs/cargo@v1
        with:
          command: fmt
          args: --all -- --check
      - name: Cancel workflow
        if: failure()
        uses: andymckay/cancel-action@0.5

  # Build on all the architectures we intend to support, including cross compiled ones.
  build:
    name: Builds
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        include:
          - os: ubuntu-24.04
            target: aarch64-linux-android # Android x64
          - os: ubuntu-24.04
            target: x86_64-unknown-linux-musl # Alpine Linux x86_64
          - os: ubuntu-24.04
            target: wasm32-unknown-unknown
            features: --features wasm --no-default-features
          - os: macos-15-intel
            target: aarch64-apple-ios
          - os: macos-15-intel
            target: x86_64-apple-darwin # 64-bit OSX
          - os: macos-14
            target: aarch64-apple-darwin # 64-bit M1 OSX
          - os: windows-2025
            target: x86_64-pc-windows-msvc
    steps:
      - uses: actions/checkout@v6
      - name: Cache cargo
        uses: Swatinem/rust-cache@v2
      - uses: IronCoreLabs/rust-toolchain@v1
        with:
          toolchain: stable
          target: ${{ matrix.target }}
      - uses: actions-rs/cargo@v1
        with:
          use-cross: true
          command: build
          args: --release --target=${{ matrix.target }} ${{ matrix.features }}

  # Run the tests on only one architecture, against various Rust versions.
  test:
    name: Test Suite
    runs-on: ubuntu-24.04
    strategy:
      matrix:
        rust:
          - stable
          - beta
          - 1.88.0 #MSRV
      fail-fast: false
    steps:
      - uses: actions/checkout@v6
      - name: Cache cargo
        uses: Swatinem/rust-cache@v2
      - uses: IronCoreLabs/rust-toolchain@v1
        with:
          toolchain: ${{ matrix.rust }}
      - uses: actions-rs/cargo@v1
        with:
          command: test

  # Benchmark current and base revisions, if this is a PR.
  bench:
    name: Bench
    runs-on: ubuntu-24.04
    if: github.base_ref != ''
    strategy:
      matrix:
        include:
          - name: current
            ref: ${{ github.ref }}
          - name: base
            ref: ${{ github.base_ref }}
    steps:
      - uses: actions/checkout@v6
        with:
          ref: ${{ matrix.ref }}
      - name: Cache cargo
        uses: Swatinem/rust-cache@v2
      - uses: IronCoreLabs/rust-toolchain@v1
        with:
          toolchain: stable
      - uses: actions-rs/cargo@v1
        with:
          command: install
          args: critcmp
      - uses: actions-rs/cargo@v1
        with:
          command: bench
          args: -- --save-baseline ${{ matrix.name }}
      - run: critcmp --export ${{ matrix.name }} > results.json
      - name: Store benchmark results
        uses: actions/upload-artifact@v6
        with:
          name: bench-${{ matrix.name }}
          path: results.json

  # Add a comment to the PR with benchmark results. Only if everything else passed, and this is a PR.
  bench_results:
    needs:
      - bench
    name: Upload benchmark results
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v6
      - name: Cache cargo
        uses: Swatinem/rust-cache@v2
      - name: Retrieve benchmark results
        uses: actions/download-artifact@v7
        with:
          name: bench-current
      - name: Delete artifact
        uses: geekyeggo/delete-artifact@v5
        with:
          name: bench-current
          failOnError: false
      - name: Retrieve benchmark results
        uses: actions/download-artifact@v7
        with:
          name: bench-base
      - name: Delete artifact
        uses: geekyeggo/delete-artifact@v5
        with:
          name: bench-base
          failOnError: false
      - uses: IronCoreLabs/rust-toolchain@v1
        with:
          toolchain: stable
      - uses: actions-rs/cargo@v1
        with:
          command: install
          args: critcmp
      - name: Compare benchmarks
        run: |
          if ! critcmp bench-base/results.json bench-current/results.json -t 10 ; then
            echo "# Benchmark blew big budget! Bad!" > comment.md
          fi
          echo "Benchmark results comparing with base:" >> comment.md
          echo '```' >> comment.md
          critcmp bench-base/results.json bench-current/results.json -t 2 >> comment.md || true
          echo '```' >> comment.md
          cat comment.md
          mv comment.md .github/workflows/comment.md