aboutsummaryrefslogtreecommitdiff
name: Build

on:
  push:
  workflow_dispatch:

jobs:
  applet:
    runs-on: ubuntu-24.04
    permissions:
      contents: read

    strategy:
      matrix:
        java: [ "8", "11", "17"]
    env:
      JAVA_VERSION: ${{ matrix.java }}
    name: Build applet with Java ${{ matrix.java }}
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: recursive

      - name: Set up JDK
        uses: actions/setup-java@v4
        with:
          java-version: ${{ matrix.java }}
          distribution: "temurin"

      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@v3

      - name: Build applets
        run: ./gradlew applet:buildJavaCard

      - name: Test
        run: ./gradlew applet:test

      - name: Upload build artifacts
        uses: actions/upload-artifact@v4
        with:
          name: built-applet-${{ matrix.java }}
          path: |
            applet/build/javacard/*.cap

  reader:
    runs-on: ubuntu-24.04
    permissions:
      contents: read

    strategy:
      matrix:
        java: [ "17", "21"]
    name: Build reader on Java ${{ matrix.java }}
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: recursive

      - name: Set up JDK
        uses: actions/setup-java@v4
        with:
          java-version: ${{ matrix.java }}
          distribution: "temurin"

      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@v3

      - name: Build reader
        run: ./gradlew reader:uberJar

      - name: Test
        run: ./gradlew reader:test

      - name: Upload build artifacts
        uses: actions/upload-artifact@v4
        with:
          name: built-reader-${{ matrix.java }}
          path: |
            reader/build/libs/ECTesterReader.jar

      - name: Upload code coverage
        uses: codecov/codecov-action@v4
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          slug: crocs-muni/ECTester

  standalone:
    runs-on: ubuntu-24.04
    permissions:
      contents: read

    strategy:
      matrix:
        java: [ "17", "21"]
    env:
      # ffs: https://github.com/adoptium/adoptium-support/issues/485 !!!
      # also, add the wolfcrypt JNI path
      LD_LIBRARY_PATH: "/usr/lib/x86_64-linux-gnu/:${{github.workspace}}/ext/wolfcrypt-jni/lib/"
    name: Build standalone on Java ${{ matrix.java }}
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: recursive
          fetch-tags: true
          fetch-depth: -1

      - name: Set up JDK
        uses: actions/setup-java@v4
        with:
          java-version: ${{ matrix.java }}
          distribution: "temurin"

      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@v3

      - name: Setup libraries
        run: |
          sudo apt update
          sudo apt install asciidoc xmlto libtomcrypt-dev libtommath-dev libssl-dev libcrypto++-dev libgcrypt20-dev nettle-dev libbotan-2-dev libwolfssl-dev
          #wget https://www.nasm.us/pub/nasm/releasebuilds/2.16.03/nasm-2.16.03.tar.gz
          wget https://github.com/netwide-assembler/nasm/archive/refs/tags/nasm-2.16.03.tar.gz
          tar -xzvf nasm-2.16.03.tar.gz
          cd nasm-nasm-2.16.03
            ./autogen.sh
            ./configure
            make -j4
            make manpages
            sudo make install
          cd ..
          echo "BORINGSSL_VERSION=$(git submodule status ext/boringssl | cut -f2 -d' ' | cut -c1-10)" >> $GITHUB_ENV
          echo "LIBRESSL_VERSION=$(git submodule status ext/libressl | cut -f2 -d' ' | cut -c1-10)" >> $GITHUB_ENV
          echo "IPPCP_VERSION=$(git submodule status ext/ipp-crypto | cut -f2 -d' ' | cut -c1-10)" >> $GITHUB_ENV
          echo "MBEDTLS_VERSION=$(git submodule status ext/mbedtls | cut -f2 -d' ' | cut -c1-10)" >> $GITHUB_ENV
          echo "WOLFCRYPT_VERSION=$(git submodule status ext/wolfcrypt-jni | cut -f2 -d' ' | cut -c1-10)" >> $GITHUB_ENV
          echo "WOLFSSL_VERSION=$(dpkg -s libwolfssl-dev | grep 'Version' | cut -f2 -d' ')" >> $GITHUB_ENV

      - name: Cache libs
        uses: actions/cache@v4
        id: cache-libs
        with:
          key: libs-${{ env.BORINGSSL_VERSION }}-${{ env.LIBRESSL_VERSION }}-${{ env.LIBRESSL_VERSION }}-${{ env.IPPCP_VERSION }}-${{ env.WOLFCRYPT_VERSION }}-${{ env.WOLFSSL_VERSION }}-${{ hashFiles('.github/workflows/build.yml') }}-${{ matrix.java }}
          path: |
            ext/boringssl/build/
            ext/libressl/build/
            ext/ipp-crypto/build/
            ext/mbedtls/build/
            ext/wolfcrypt-jni/lib/wolfcrypt-jni.jar
            ext/wolfcrypt-jni/lib/libwolfcryptjni.so

      - name: Build libs
        if: steps.cache-libs.outputs.cache-hit != 'true'
        run: |
          # ------------ Build BoringSSL ------------
          cd ext/boringssl
          cmake -DBUILD_SHARED_LIBS=1 -Bbuild -G "Unix Makefiles"
          cd build
          make -j4 crypto
          cd ../../..
          # ------------ Build LibreSSL ------------
          cd ext/libressl
          ./autogen.sh
          cmake -DBUILD_SHARED_LIBS=ON -Bbuild -G "Unix Makefiles"
          cd build
          make -j4 crypto
          cd ../../..
          # ------------ Build IPP-crypto ------------
          cd ext/ipp-crypto
          CC=clang CXX=clang++ cmake CMakeLists.txt -Bbuild -DARCH=intel64 -G "Unix Makefiles"
          cd build
          make -j4
          cd ../../..
          # ------------ Build wolfcrypt-jni ------------
          cd ext/wolfcrypt-jni
          mkdir junit
          wget -P junit/ https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar 
          wget -P junit/ https://repo1.maven.org/maven2/org/hamcrest/hamcrest-all/1.3/hamcrest-all-1.3.jar
          make -j4 -f makefile.linux
          env JUNIT_HOME=junit/ ant build-jce-release
          cd ../..
          # ------------ Build mbedTLS ------------
          cd ext/mbedtls
          python -m venv virt
          . virt/bin/activate
          pip install -r scripts/basic.requirements.txt
          cmake -DUSE_SHARED_MBEDTLS_LIBRARY=On -Bbuild -G "Unix Makefiles"
          cd build
          make -j4
          cd ../../..

      - name: Build standalone
        run: |
          ./gradlew standalone:libs || true
          ./gradlew standalone:uberJar

      - name: List libraries
        run: ./gradlew standalone:run --args="list-libs"

      - name: Test
        run: ./gradlew standalone:test --continue

      - name: Upload build artifacts
        uses: actions/upload-artifact@v4
        with:
          name: built-standalone-${{ matrix.java }}
          path: |
            standalone/build/libs/ECTesterStandalone.jar

      - name: Upload results
        uses: actions/upload-artifact@v4
        with:
          name: results-standalone-${{ matrix.java }}
          path: |
            standalone/build/results/

      - name: Upload tests
        uses: actions/upload-artifact@v4
        with:
          name: tests-standalone-${{ matrix.java }}
          path: |
            standalone/build/reports/tests/test/

      - name: Upload code coverage
        uses: codecov/codecov-action@v4
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          slug: crocs-muni/ECTester

      - name: Upload test coverage
        uses: codecov/test-results-action@v1
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          slug: crocs-muni/ECTester
          files: >-
            standalone/build/test-results/test/TEST-cz.crcs.ectester.standalone.AppTests.xml, standalone/build/test-results/test/TEST-cz.crcs.ectester.standalone.DeterministicTests.xml,
            standalone/build/test-results/test/TEST-cz.crcs.ectester.standalone.IdentTests.xml, standalone/build/test-results/test/TEST-cz.crcs.ectester.standalone.LibTests.xml,
            standalone/build/test-results/test/TEST-cz.crcs.ectester.standalone.OutputTests.xml