dissect.fve 4.2.dev2__tar.gz → 4.3.dev2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/PKG-INFO +5 -6
  2. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect/fve/crypto/__init__.py +5 -18
  3. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect/fve/crypto/_pycryptodome.py +17 -10
  4. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect/fve/crypto/elephant.py +6 -4
  5. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect.fve.egg-info/PKG-INFO +5 -6
  6. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect.fve.egg-info/requires.txt +3 -3
  7. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/pyproject.toml +7 -10
  8. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tox.ini +3 -3
  9. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/.git-blame-ignore-revs +0 -0
  10. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/.gitattributes +0 -0
  11. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/COPYRIGHT +0 -0
  12. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/LICENSE +0 -0
  13. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/MANIFEST.in +0 -0
  14. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/README.md +0 -0
  15. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect/fve/__init__.py +0 -0
  16. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect/fve/bde/__init__.py +0 -0
  17. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect/fve/bde/bde.py +0 -0
  18. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect/fve/bde/c_bde.py +0 -0
  19. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect/fve/bde/eow.py +0 -0
  20. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect/fve/bde/information.py +0 -0
  21. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect/fve/bde/keys.py +0 -0
  22. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect/fve/crypto/base.py +0 -0
  23. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect/fve/crypto/utils.py +0 -0
  24. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect/fve/exceptions.py +0 -0
  25. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect/fve/luks/__init__.py +0 -0
  26. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect/fve/luks/af.py +0 -0
  27. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect/fve/luks/c_luks.py +0 -0
  28. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect/fve/luks/luks.py +0 -0
  29. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect/fve/luks/metadata.py +0 -0
  30. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect/fve/tools/__init__.py +0 -0
  31. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect/fve/tools/dd.py +0 -0
  32. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect.fve.egg-info/SOURCES.txt +0 -0
  33. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect.fve.egg-info/dependency_links.txt +0 -0
  34. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect.fve.egg-info/entry_points.txt +0 -0
  35. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/dissect.fve.egg-info/top_level.txt +0 -0
  36. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/setup.cfg +0 -0
  37. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/__init__.py +0 -0
  38. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/bde/aes-xts_128.bin.gz +0 -0
  39. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/bde/aes-xts_256.bin.gz +0 -0
  40. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/bde/aes_128.bin.gz +0 -0
  41. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/bde/aes_128_diffuser.bin.gz +0 -0
  42. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/bde/aes_256.bin.gz +0 -0
  43. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/bde/aes_256_diffuser.bin.gz +0 -0
  44. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/bde/decrypted.bin.gz +0 -0
  45. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/bde/eow_partial.bin.gz +0 -0
  46. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/bde/recovery_key.bek +0 -0
  47. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/bde/recovery_key.bin.gz +0 -0
  48. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/bde/recovery_password.bin.gz +0 -0
  49. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/bde/startup_key.bek +0 -0
  50. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/bde/startup_key.bin.gz +0 -0
  51. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/bde/suspended.bin.gz +0 -0
  52. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/bde/vista.bin.gz +0 -0
  53. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/bde/win7_partial.bin.gz +0 -0
  54. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/luks1/aes-ecb.bin.gz +0 -0
  55. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/luks1/sha1.bin.gz +0 -0
  56. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/luks2/aes-cbc-essiv.bin.gz +0 -0
  57. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/luks2/aes-cbc-plain.bin.gz +0 -0
  58. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/luks2/aes-ecb-pbkdf2.bin.gz +0 -0
  59. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/luks2/aes-ecb.bin.gz +0 -0
  60. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/luks2/aes-xts-plain64.bin.gz +0 -0
  61. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_data/luks2/multiple-slots.bin.gz +0 -0
  62. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_docs/Makefile +0 -0
  63. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_docs/conf.py +0 -0
  64. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_docs/index.rst +0 -0
  65. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/_utils.py +0 -0
  66. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/conftest.py +0 -0
  67. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/test_bde.py +0 -0
  68. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/test_bde_eow_bitmap.py +0 -0
  69. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/test_crypto.py +0 -0
  70. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/test_luks.py +0 -0
  71. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/test_luks_kdf.py +0 -0
  72. {dissect_fve-4.2.dev2 → dissect_fve-4.3.dev2}/tests/test_luks_metadata.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dissect.fve
3
- Version: 4.2.dev2
3
+ Version: 4.3.dev2
4
4
  Summary: A Dissect module implementing a parsers for full volume encryption implementations, currently Linux Unified Key Setup (LUKS1 and LUKS2) and Microsoft's Bitlocker Disk Encryption
5
5
  Author-email: Dissect Team <dissect@fox-it.com>
6
- License: Affero General Public License v3
6
+ License-Expression: AGPL-3.0-or-later
7
7
  Project-URL: homepage, https://dissect.tools
8
8
  Project-URL: documentation, https://docs.dissect.tools/en/latest/projects/dissect.fve
9
9
  Project-URL: repository, https://github.com/fox-it/dissect.fve
@@ -11,7 +11,6 @@ Classifier: Development Status :: 5 - Production/Stable
11
11
  Classifier: Environment :: Console
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: Intended Audience :: Information Technology
14
- Classifier: License :: OSI Approved
15
14
  Classifier: Operating System :: OS Independent
16
15
  Classifier: Programming Language :: Python :: 3
17
16
  Classifier: Topic :: Internet :: Log Analysis
@@ -23,15 +22,15 @@ Description-Content-Type: text/markdown
23
22
  License-File: LICENSE
24
23
  License-File: COPYRIGHT
25
24
  Requires-Dist: dissect.cstruct<5,>=4
26
- Requires-Dist: dissect.util<4,>=3
27
- Requires-Dist: pycryptodome==3.22.0
25
+ Requires-Dist: dissect.util<4,>=3.22.dev8
26
+ Requires-Dist: pycryptodome
28
27
  Requires-Dist: argon2-cffi
29
28
  Provides-Extra: full
30
29
  Requires-Dist: dissect.target; extra == "full"
31
30
  Requires-Dist: rich; extra == "full"
32
31
  Provides-Extra: dev
33
32
  Requires-Dist: dissect.cstruct<5.0.dev,>=4.0.dev; extra == "dev"
34
- Requires-Dist: dissect.util<4.0.dev,>=3.0.dev; extra == "dev"
33
+ Requires-Dist: dissect.util<4.0.dev,>=3.22.dev; extra == "dev"
35
34
  Dynamic: license-file
36
35
 
37
36
  # dissect.fve
@@ -1,20 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
- from Crypto.Cipher import AES
4
-
3
+ # Only pycryptodome is supported right now
5
4
  from dissect.fve.crypto import _pycryptodome
6
5
  from dissect.fve.crypto.base import Cipher, Plain, Plain64, Plain64BE
7
6
 
8
- # Only pycryptodome is supported right now
9
- _pycryptodome.install()
10
-
11
-
12
- CIPHER_MODE_MAP = {
13
- "ecb": AES.MODE_FVE_ECB,
14
- "cbc": AES.MODE_FVE_CBC,
15
- "xts": AES.MODE_FVE_XTS,
16
- }
17
-
18
7
  IV_MODE_MAP = {
19
8
  "plain": Plain,
20
9
  "plain64": Plain64,
@@ -45,17 +34,15 @@ def create_cipher(
45
34
  if cipher_name != "aes":
46
35
  raise ValueError("Only AES support is implemented")
47
36
 
48
- mode = CIPHER_MODE_MAP.get(cipher_mode)
49
- if not mode:
37
+ if cipher_mode not in ("ecb", "cbc", "xts"):
50
38
  raise ValueError(f"Invalid cipher mode: {cipher_name}-{cipher_mode} (from {spec})")
51
39
 
52
- iv = IV_MODE_MAP.get(iv_name)
53
- if not iv:
40
+ if (iv := IV_MODE_MAP.get(iv_name)) is None:
54
41
  raise ValueError(f"Invalid iv mode: {iv_name}:{iv_options} (from {spec})")
55
42
 
56
- return AES.new(
43
+ return _pycryptodome.new(
57
44
  key,
58
- mode,
45
+ cipher_mode,
59
46
  key_size=key_size,
60
47
  iv_mode=iv,
61
48
  iv_options=iv_options,
@@ -5,7 +5,7 @@ import platform
5
5
  import sys
6
6
  from typing import Any, Callable
7
7
 
8
- from Crypto.Cipher import AES, _extra_modes
8
+ from Crypto.Cipher import AES
9
9
  from Crypto.Util import _raw_api
10
10
 
11
11
  from dissect.fve.crypto import elephant
@@ -250,14 +250,21 @@ def _create_cipher_factory(mode: type[Cipher]) -> Callable[..., Cipher]:
250
250
  return cipher_factory
251
251
 
252
252
 
253
- def install() -> None:
254
- """Install the cipher modes into pycryptotome."""
253
+ _create_fve_ecb_cipher = _create_cipher_factory(EcbMode)
254
+ _create_fve_cbc_cipher = _create_cipher_factory(CbcMode)
255
+ _create_fve_xts_cipher = _create_cipher_factory(XtsMode)
255
256
 
256
- # Only support AES for now
257
- AES.MODE_FVE_ECB = 50
258
- AES.MODE_FVE_CBC = 51
259
- AES.MODE_FVE_XTS = 52
260
257
 
261
- _extra_modes[AES.MODE_FVE_ECB] = _create_cipher_factory(EcbMode)
262
- _extra_modes[AES.MODE_FVE_CBC] = _create_cipher_factory(CbcMode)
263
- _extra_modes[AES.MODE_FVE_XTS] = _create_cipher_factory(XtsMode)
258
+ def new(key: bytes, mode: int, *args, **kwargs) -> Cipher:
259
+ """Create a new cipher object."""
260
+ if mode not in ("ecb", "cbc", "xts"):
261
+ return AES.new(key, mode, *args, **kwargs)
262
+
263
+ if mode == "ecb":
264
+ return _create_fve_ecb_cipher(AES, key=key, mode=mode, **kwargs)
265
+ if mode == "cbc":
266
+ return _create_fve_cbc_cipher(AES, key=key, mode=mode, **kwargs)
267
+ if mode == "xts":
268
+ return _create_fve_xts_cipher(AES, key=key, mode=mode, **kwargs)
269
+
270
+ raise ValueError(f"Unsupported mode: {mode} (key: {key!r}, args: {args}, kwargs: {kwargs})")
@@ -1,12 +1,14 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from dissect.util.xmemoryview import xmemoryview
4
+
3
5
 
4
6
  def diffuser_a_decrypt(buffer: memoryview, sector_size: int) -> None:
5
7
  a_cycles = 5
6
8
  r_a = [9, 0, 13, 0]
7
9
  int_size = sector_size >> 2
8
10
 
9
- buffer_i = buffer.cast("I")
11
+ buffer_i = xmemoryview(buffer, "<I")
10
12
 
11
13
  for _ in range(a_cycles):
12
14
  for i in range(int_size):
@@ -18,7 +20,7 @@ def diffuser_a_encrypt(buffer: memoryview, sector_size: int) -> None:
18
20
  r_a = [9, 0, 13, 0]
19
21
  int_size = sector_size >> 2
20
22
 
21
- buffer_i = buffer.cast("I")
23
+ buffer_i = xmemoryview(buffer, "<I")
22
24
 
23
25
  for _ in range(a_cycles):
24
26
  for i in range(int_size - 1, -1, -1):
@@ -30,7 +32,7 @@ def diffuser_b_decrypt(buffer: memoryview, sector_size: int) -> None:
30
32
  r_b = [0, 10, 0, 25]
31
33
  int_size = sector_size >> 2
32
34
 
33
- buffer_i = buffer.cast("I")
35
+ buffer_i = xmemoryview(buffer, "<I")
34
36
 
35
37
  for _ in range(b_cycles):
36
38
  for i in range(int_size):
@@ -44,7 +46,7 @@ def diffuser_b_encrypt(buffer: memoryview, sector_size: int) -> None:
44
46
  r_b = [0, 10, 0, 25]
45
47
  int_size = sector_size >> 2
46
48
 
47
- buffer_i = buffer.cast("I")
49
+ buffer_i = xmemoryview(buffer, "<I")
48
50
 
49
51
  for _ in range(b_cycles):
50
52
  for i in range(int_size - 1, -1, -1):
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dissect.fve
3
- Version: 4.2.dev2
3
+ Version: 4.3.dev2
4
4
  Summary: A Dissect module implementing a parsers for full volume encryption implementations, currently Linux Unified Key Setup (LUKS1 and LUKS2) and Microsoft's Bitlocker Disk Encryption
5
5
  Author-email: Dissect Team <dissect@fox-it.com>
6
- License: Affero General Public License v3
6
+ License-Expression: AGPL-3.0-or-later
7
7
  Project-URL: homepage, https://dissect.tools
8
8
  Project-URL: documentation, https://docs.dissect.tools/en/latest/projects/dissect.fve
9
9
  Project-URL: repository, https://github.com/fox-it/dissect.fve
@@ -11,7 +11,6 @@ Classifier: Development Status :: 5 - Production/Stable
11
11
  Classifier: Environment :: Console
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: Intended Audience :: Information Technology
14
- Classifier: License :: OSI Approved
15
14
  Classifier: Operating System :: OS Independent
16
15
  Classifier: Programming Language :: Python :: 3
17
16
  Classifier: Topic :: Internet :: Log Analysis
@@ -23,15 +22,15 @@ Description-Content-Type: text/markdown
23
22
  License-File: LICENSE
24
23
  License-File: COPYRIGHT
25
24
  Requires-Dist: dissect.cstruct<5,>=4
26
- Requires-Dist: dissect.util<4,>=3
27
- Requires-Dist: pycryptodome==3.22.0
25
+ Requires-Dist: dissect.util<4,>=3.22.dev8
26
+ Requires-Dist: pycryptodome
28
27
  Requires-Dist: argon2-cffi
29
28
  Provides-Extra: full
30
29
  Requires-Dist: dissect.target; extra == "full"
31
30
  Requires-Dist: rich; extra == "full"
32
31
  Provides-Extra: dev
33
32
  Requires-Dist: dissect.cstruct<5.0.dev,>=4.0.dev; extra == "dev"
34
- Requires-Dist: dissect.util<4.0.dev,>=3.0.dev; extra == "dev"
33
+ Requires-Dist: dissect.util<4.0.dev,>=3.22.dev; extra == "dev"
35
34
  Dynamic: license-file
36
35
 
37
36
  # dissect.fve
@@ -1,11 +1,11 @@
1
1
  dissect.cstruct<5,>=4
2
- dissect.util<4,>=3
3
- pycryptodome==3.22.0
2
+ dissect.util<4,>=3.22.dev8
3
+ pycryptodome
4
4
  argon2-cffi
5
5
 
6
6
  [dev]
7
7
  dissect.cstruct<5.0.dev,>=4.0.dev
8
- dissect.util<4.0.dev,>=3.0.dev
8
+ dissect.util<4.0.dev,>=3.22.dev
9
9
 
10
10
  [full]
11
11
  dissect.target
@@ -1,5 +1,5 @@
1
1
  [build-system]
2
- requires = ["setuptools>=65.5.0", "setuptools_scm[toml]>=6.4.0"]
2
+ requires = ["setuptools>=77.0.0", "setuptools_scm[toml]>=6.4.0"]
3
3
  build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
@@ -7,7 +7,8 @@ name = "dissect.fve"
7
7
  description = "A Dissect module implementing a parsers for full volume encryption implementations, currently Linux Unified Key Setup (LUKS1 and LUKS2) and Microsoft's Bitlocker Disk Encryption"
8
8
  readme = "README.md"
9
9
  requires-python = "~=3.9"
10
- license.text = "Affero General Public License v3"
10
+ license = "AGPL-3.0-or-later"
11
+ license-files = ["LICENSE", "COPYRIGHT"]
11
12
  authors = [
12
13
  {name = "Dissect Team", email = "dissect@fox-it.com"}
13
14
  ]
@@ -16,7 +17,6 @@ classifiers = [
16
17
  "Environment :: Console",
17
18
  "Intended Audience :: Developers",
18
19
  "Intended Audience :: Information Technology",
19
- "License :: OSI Approved",
20
20
  "Operating System :: OS Independent",
21
21
  "Programming Language :: Python :: 3",
22
22
  "Topic :: Internet :: Log Analysis",
@@ -26,8 +26,8 @@ classifiers = [
26
26
  ]
27
27
  dependencies = [
28
28
  "dissect.cstruct>=4,<5",
29
- "dissect.util>=3,<4",
30
- "pycryptodome==3.22.0",
29
+ "dissect.util>=3.22.dev8,<4", # TODO: update on release
30
+ "pycryptodome",
31
31
  "argon2-cffi",
32
32
  ]
33
33
  dynamic = ["version"]
@@ -44,7 +44,7 @@ full = [
44
44
  ]
45
45
  dev = [
46
46
  "dissect.cstruct>=4.0.dev,<5.0.dev",
47
- "dissect.util>=3.0.dev,<4.0.dev",
47
+ "dissect.util>=3.22.dev,<4.0.dev",
48
48
  ]
49
49
 
50
50
  [project.scripts]
@@ -52,7 +52,7 @@ fve-dd = "dissect.fve.tools.dd:main"
52
52
 
53
53
  [tool.ruff]
54
54
  line-length = 120
55
- required-version = ">=0.9.0"
55
+ required-version = ">=0.12.0"
56
56
 
57
57
  [tool.ruff.format]
58
58
  docstring-code-format = true
@@ -101,9 +101,6 @@ ignore = ["E203", "B904", "UP024", "ANN002", "ANN003", "ANN204", "ANN401", "SIM1
101
101
  known-first-party = ["dissect.fve"]
102
102
  known-third-party = ["dissect"]
103
103
 
104
- [tool.setuptools]
105
- license-files = ["LICENSE", "COPYRIGHT"]
106
-
107
104
  [tool.setuptools.packages.find]
108
105
  include = ["dissect.*"]
109
106
 
@@ -18,7 +18,7 @@ deps =
18
18
  pytest-cov
19
19
  coverage
20
20
  commands =
21
- pytest --basetemp="{envtmpdir}" {posargs:--color=yes --cov=dissect --cov-report=term-missing -v tests}
21
+ pytest --basetemp="{envtmpdir}" --import-mode="append" {posargs:--color=yes --cov=dissect --cov-report=term-missing -v tests}
22
22
  coverage report
23
23
  coverage xml
24
24
 
@@ -32,7 +32,7 @@ commands =
32
32
  [testenv:fix]
33
33
  package = skip
34
34
  deps =
35
- ruff==0.9.2
35
+ ruff==0.12.1
36
36
  commands =
37
37
  ruff format dissect tests
38
38
  ruff check --fix dissect tests
@@ -40,7 +40,7 @@ commands =
40
40
  [testenv:lint]
41
41
  package = skip
42
42
  deps =
43
- ruff==0.9.2
43
+ ruff==0.12.1
44
44
  vermin
45
45
  commands =
46
46
  ruff check dissect tests
File without changes
File without changes
File without changes
File without changes