defmodule Pkcs11ex.MixProject do use Mix.Project @version "0.1.0" @source_url "https://github.com/utaladriz/pkcs11ex" @sign_core_version "~> 0.1" @pkcs11ex_audit_version "~> 0.1" def project do [ app: :pkcs11ex, version: @version, elixir: "~> 1.19", start_permanent: Mix.env() == :prod, elixirc_paths: elixirc_paths(Mix.env()), deps: deps(), package: package(), description: description(), docs: docs(), source_url: @source_url, name: "pkcs11ex", test_coverage: [tool: ExCoveralls], dialyzer: [plt_add_apps: [:mix, :ex_unit]] ] end def cli do [ preferred_envs: [ coveralls: :test, "coveralls.html": :test, "coveralls.json": :test ] ] end def application do [ extra_applications: [:logger, :crypto, :public_key, :inets, :ssl, :xmerl], mod: {Pkcs11ex.Application, []} ] end # `test/support/` carries the fixture-only `JWSTestSigner` (with its # `defimpl SignCore.Signer`). Compiling it only under `:test` keeps # the published Hex package free of test-only modules and lets # protocol consolidation run cleanly in :dev / :prod. defp elixirc_paths(:test), do: ["lib", "test/support"] defp elixirc_paths(_), do: ["lib"] defp deps do [ # Runtime {:rustler, "~> 0.37.0"}, {:nimble_options, "~> 1.1"}, {:telemetry, "~> 1.3"}, {:jason, "~> 1.4"}, {:plug, "~> 1.16", optional: true}, # Signer-agnostic format adapters (PDF/PAdES, XML/XAdES, JWS). # `pkcs11ex` provides a `Pkcs11ex.Signer` impl of # `SignCore.Signer` that routes signing through the PKCS#11 # NIF; verify-only and software-keyed deployments depend on # `:sign_core` directly without pulling the NIF. sign_core_dep(), # Test-only fixture support: building X.509 certs that wrap a # SoftHSM-resident public key so verify can mathematically check # SoftHSM-produced signatures. {:x509, "~> 0.8", only: :test}, # Sister library — opt-in audit trail. `optional: true` tells # consumers of `pkcs11ex` that they can omit `pkcs11ex_audit` # from their own deps; `Pkcs11ex.JWS.sign`'s `:audit_to` hook # gates on `Code.ensure_loaded?(Pkcs11ex.Audit)` at runtime. pkcs11ex_audit_dep(), # Dev / test only {:ex_doc, "~> 0.34", only: :dev, runtime: false}, {:credo, "~> 1.7", only: [:dev, :test], runtime: false}, {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false}, {:excoveralls, "~> 0.18", only: :test} ] end # Path dep when developing inside the monorepo; Hex dep when # running from a published `pkcs11ex` package (no sibling # `sign_core/` directory present in the consumer's tree). # # `HEX_PUBLISH=1` forces the Hex dep regardless of local files — # use it when running `mix hex.publish` from inside the monorepo, # since Hex refuses to publish a package with a path dep. defp sign_core_dep do if monorepo_dev?("sign_core"), do: {:sign_core, path: "sign_core"}, else: {:sign_core, @sign_core_version} end defp pkcs11ex_audit_dep do if monorepo_dev?("pkcs11ex_audit"), do: {:pkcs11ex_audit, path: "pkcs11ex_audit", optional: true}, else: {:pkcs11ex_audit, @pkcs11ex_audit_version, optional: true} end defp monorepo_dev?(subdir) do System.get_env("HEX_PUBLISH") in [nil, ""] and File.dir?(subdir) and File.regular?(Path.join(subdir, "mix.exs")) end defp description do "Hardware-backed digital signatures for Elixir, via PKCS#11. " <> "Layered library with first-class adapters for JWS (RFC 7797), PDF (PAdES), " <> "and XML (XML-DSig / XAdES). Backed by HSMs and hardware tokens through a " <> "Rust/Rustler bridge." end defp package do [ licenses: ["Apache-2.0"], links: %{ "GitHub" => @source_url, "Specs" => "#{@source_url}/blob/main/docs/specs/specs.md" }, maintainers: ["Ubaldo Taladriz"], files: ~w( lib native/pkcs11ex_nif/src native/pkcs11ex_nif/Cargo.toml native/pkcs11ex_nif/Cargo.lock .formatter.exs mix.exs README.md LICENSE CHANGELOG.md docs/specs ) ] end defp docs do [ main: "readme", extras: [ "README.md", "CHANGELOG.md", "docs/specs/specs.md", "docs/specs/api.md" ], source_ref: "v#{@version}", source_url: @source_url, groups_for_modules: [ "Layer 2 — Primitives": [Pkcs11ex], "Signer (SignCore.Signer impl)": [Pkcs11ex.Signer], "Convenience wrappers": [ Pkcs11ex.JWS, Pkcs11ex.PDF, Pkcs11ex.XML, Pkcs11ex.X509 ], Operational: [ Pkcs11ex.Slot, Pkcs11ex.PIN, Pkcs11ex.PKCS12, Pkcs11ex.Config ] ] ] end end