diff --git a/pkgs/development/python-modules/chipwhisperer/default.nix b/pkgs/development/python-modules/chipwhisperer/default.nix new file mode 100644 index 000000000000..1cc7fc8657bb --- /dev/null +++ b/pkgs/development/python-modules/chipwhisperer/default.nix @@ -0,0 +1,118 @@ +{ + lib, + buildPythonPackage, + fetchFromGitHub, + + # build + pythonAtLeast, + setuptools, + setuptools-scm, + cython, + + # dependencies + colorama, + configobj, + ecpy, + fastdtw, + libusb1, + numpy, + pyserial, + tqdm, + + # install + udevCheckHook, + + # check + writableTmpDirAsHomeHook, + pytestCheckHook, +}: + +# Usage: +# In NixOS, add the package to services.udev.packages for non-root plugdev +# users to get device access permission: +# services.udev.packages = [ pkgs.python3Packages.chipwhisperer ]; + +buildPythonPackage rec { + pname = "chipwhisperer"; + version = "5.7.0"; + + src = fetchFromGitHub { + owner = "newaetech"; + repo = "chipwhisperer"; + tag = version; + hash = "sha256-C7QP044QEP7vmz1lMseLtMTYoKn5SoFV/q9URY7yQ6I="; + }; + + # Build + + pyproject = true; + + build-system = [ + setuptools + setuptools-scm + ]; + + nativeBuildInputs = [ + cython + ]; + + pythonRelaxDeps = [ + "numpy" + ]; + + dependencies = [ + colorama + configobj + ecpy + fastdtw + libusb1 + pyserial + tqdm + ]; + + # Install + + nativeInstallCheckInputs = [ + udevCheckHook + ]; + + postInstall = '' + # Install udev rules + # The 50-newae.rules file from the repo isn't directly installed, since it + # installs to the chipwhisperer group (and not to uaccess) + + mkdir -p $out/etc/udev/rules.d + + cat < $out/etc/udev/rules.d/50-newae.rules + SUBSYSTEMS=="usb", ATTRS{idVendor}=="2b3e", ATTRS{idProduct}=="*", TAG+="uaccess" + SUBSYSTEM=="tty", ATTRS{idVendor}=="2b3e", ATTRS{idProduct}=="*", TAG+="uaccess", SYMLINK+="cw_serial%n" + SUBSYSTEM=="tty", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="6124", TAG+="uaccess", SYMLINK+="cw_bootloader%n" + EOF + ''; + + # Check + + pythonImportsCheck = [ "chipwhisperer" ]; + + nativeCheckInputs = [ + writableTmpDirAsHomeHook + pytestCheckHook + ]; + + enabledTestPaths = [ + # All other tests require connected hardware + # Error: "Could not find ChipWhisperer. Is it connected?" + # See: https://chipwhisperer.readthedocs.io/en/latest/contributing.html#unit-tests + "tests/test_api.py" + ]; + + disabledTests = [ "TestCPA" ]; # Tries to open a tutorial project + + meta = { + description = "Toolchain for side-channel power analysis and glitching attacks"; + homepage = "https://github.com/newaetech/chipwhisperer"; + changelog = "https://github.com/newaetech/chipwhisperer/releases/tag/${version}"; + license = lib.licenses.asl20; + maintainers = [ lib.maintainers.krishnans2006 ]; + }; +} diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 25030c7b96a6..606e89575e97 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -2555,6 +2555,8 @@ self: super: with self; { chex = callPackage ../development/python-modules/chex { }; + chipwhisperer = callPackage ../development/python-modules/chipwhisperer { }; + chirpstack-api = callPackage ../development/python-modules/chirpstack-api { }; chispa = callPackage ../development/python-modules/chispa { };