{
  lib,
  stdenv,
  fetchFromGitHub,
  fetchzip,
  makeWrapper,
  autoreconfHook,
  pkg-config,
  openssl,
  libgcrypt,
  cmocka,
  expect,
  sqlite,
  pcre2,

  # Linux
  libpcap,
  zlib,
  wirelesstools,
  iw,
  ethtool,
  pciutils,
  libnl,
  usbutils,
  tcpdump,
  hostapd,
  wpa_supplicant,
  screen,

  # Cygwin
  libiconv,

  # options
  enableExperimental ? true,
  useGcrypt ? false,
  enableAirolib ? true,
  enableRegex ? true,
  useAirpcap ? stdenv.hostPlatform.isCygwin,
}:
let
  airpcap-sdk = fetchzip {
    pname = "airpcap-sdk";
    version = "4.1.1";
    url = "https://support.riverbed.com/bin/support/download?sid=l3vk3eu649usgu3rj60uncjqqu";
    hash = "sha256-kJhnUvhnF9F/kIJx9NcbRUfIXUSX/SRaO/SWNvdkVT8=";
    stripRoot = false;
    extension = "zip";
  };
in
stdenv.mkDerivation rec {
  pname = "aircrack-ng";
  version = "1.7";

  src = fetchFromGitHub {
    owner = "aircrack-ng";
    repo = "aircrack-ng";
    tag = version;
    hash = "sha256-niQDwiqi5GtBW5HIn0endnqPb/MqllcjsjXw4pTyFKY=";
  };

  postPatch = lib.optionalString stdenv.hostPlatform.isLinux ''
    substituteInPlace lib/osdep/linux.c --replace-warn /usr/local/bin ${
      lib.escapeShellArg (
        lib.makeBinPath [
          wirelesstools
        ]
      )
    }
  '';

  configureFlags = [
    (lib.withFeature enableExperimental "experimental")
    (lib.withFeature useGcrypt "gcrypt")
    (lib.withFeatureAs useAirpcap "airpcap" airpcap-sdk)
  ];

  nativeBuildInputs = [
    pkg-config
    makeWrapper
    autoreconfHook
  ];
  buildInputs =
    lib.singleton (if useGcrypt then libgcrypt else openssl)
    ++ lib.optionals stdenv.hostPlatform.isLinux [
      libpcap
      zlib
      libnl
      iw
      ethtool
      pciutils
    ]
    ++ lib.optional (stdenv.hostPlatform.isCygwin && stdenv.hostPlatform.isClang) libiconv
    ++ lib.optional enableAirolib sqlite
    ++ lib.optional enableRegex pcre2
    ++ lib.optional useAirpcap airpcap-sdk;

  nativeCheckInputs = [
    cmocka
    expect
  ];

  postFixup = lib.optionalString stdenv.hostPlatform.isLinux ''
    wrapProgram "$out/bin/airmon-ng" --prefix PATH : ${
      lib.escapeShellArg (
        lib.makeBinPath [
          ethtool
          iw
          pciutils
          usbutils
        ]
      )
    }
  '';

  installCheckTarget = "integration";
  nativeInstallCheckInputs = [
    cmocka
    expect
  ]
  ++ lib.optionals stdenv.hostPlatform.isLinux [
    tcpdump
    hostapd
    wpa_supplicant
    screen
  ];

  meta = {
    description = "WiFi security auditing tools suite";
    homepage = "https://www.aircrack-ng.org/";
    license = lib.licenses.gpl2Plus;
    maintainers = with lib.maintainers; [ magistau ];
    platforms =
      with lib.platforms;
      builtins.concatLists [
        linux
        darwin
        cygwin
        netbsd
        openbsd
        freebsd
        illumos
      ];
    changelog = "https://github.com/aircrack-ng/aircrack-ng/blob/${src.rev}/ChangeLog";
  };
}
