* changes v7.1.2 -> v7.1.x

##
## Release Highlights
##

Hashcat generates candidates in new ways, and several longstanding bottlenecks in distributed work,
device setup and hash management are gone.

1. Feed plugins and attack-mode 8

Attack-mode 8 runs candidate generators as feed plugins, with one instance per device. Unlike a
generator connected through stdin, a feed participates in keyspace calculation, work distribution,
restore, status and debug output. Plugins can be written in C or Rust and selected by name.

The included feeds cover wordlists, stdin, random generation, association, PCFG, tables, hybrids
and masks. Wordlist and stdin processing now use this interface. The wordlist feed also supplies
dictionaries to attack-modes 0, 1, 6, 7 and 12 and the wordlist form of attack-mode 9.

Feeds can use the GPU to expand base words into candidates without sending each result over the
host-to-device bus. The PCFG and table feeds use this for most fast hash modes and fall back to
host generation where needed. See "docs/hashcat-generic-attack-mode.md" for usage and
"docs/hashcat-generic-attack-mode-development-guide.md" for writing feeds.

2. Probability-ordered PCFG and targeted hints in attack-mode 4

Attack-mode 4 draws candidates from a trained probabilistic grammar, trying more likely
password shapes first. Hashcat can count candidates at each probability level without generating
them, so keyspace ranges, restore, multiple devices and the brain all work with PCFG attacks.
The included "default-passwords" ruleset runs when no other ruleset is selected.

The "hints" ruleset keeps learned password patterns but fills word slots from facts supplied
about a target, such as names, dates or previous passwords. This focuses all available devices
on one target. The "tools/pcfg_hints.py" script can make a hint ruleset from a custom grammar.

When the password shape is partly known, a "mask" setting restricts the grammar before
generation. For example, "mask=?u?l?l?l?l?l?d?d" keeps candidates with one uppercase letter,
five lowercase letters and two digits. Excluded shapes do not consume keyspace. Attack-mode 9
also uses the hint ruleset to work across many individually salted accounts.
See "docs/hashcat-pcfg.md".

3. Device-accelerated table attacks in attack-mode 5

The table attack returns under its original mode number. It replaces tokens in wordlist entries
and combines the results on the device. Tables can change case, add leetspeak or emoji, expand
sports templates, or map one keyboard layout to another.

Replacements may be longer, shorter or empty. Multiple tables can be combined, while "single=1"
tries one substitution at a time instead of every combination. The "maxperm" and "cap=N"
settings bound the work. See "docs/hashcat-table.md".

4. Wordlists inside masks with attack-mode 12

Attack-mode 12 places wordlists anywhere within a mask. The required "?w" marker inserts the
first wordlist, and optional "?q" inserts a second. For example, "?w?d?d" adds two digits after
each word, while "?w?q" combines two wordlists. Literal text and mask tokens may appear on
either side of a word.

Attack-modes 1, 6 and 7 remain available and use this engine internally without changing their
candidate order or keyspace. Mask files work when every mask contains "?w". Increment mode
cannot be used because shortening a mask could remove the word marker.
See the "Attack-Mode 12 Markers" table in "--help".

5. Account-aware association in attack-mode 9

Attack-mode 9 can now build candidates from usernames and other information tied to each hash.
It splits account names at separators, case changes and letter-to-digit boundaries. Passwd
records also provide real names and the final home-directory component. Modules can add
mode-specific hints. For WPA captures, mode 22000 supplies the network name and MAC addresses.

The default pipeline tries account words, the first 1k rules from "rules/rockyou-30000.rule",
then the "hints" PCFG ruleset. The grammar phase has no fixed end, so the "phases" setting can
limit a run. The existing one-word-per-hash input form keeps its previous behavior.
Association still requires one salt per hash. See "docs/hashcat-association.md".

6. Seekable wordlists and one cache location

Seek databases store periodic offsets in wordlists. A device can start near its assigned range
rather than read and discard every earlier line. Multiple wordlists and directories form one
keyspace, as do mask files and increment lengths within their queue.

Hashcat can seek directly in multi-block xz files from "xz -T0", multi-frame zstd files from
"pzstd", and concatenated xz streams. Single-stream files still decode from the beginning,
and gzip does not support direct seeking. Seek data lives in "cache/feeds/wordlist".
The "--cache-path" option can relocate feed caches and compiled kernels for shared use.

7. A brain server built for large sessions

The brain server divides candidate storage into 1024 shards, so lookups and commits scale with
active batches instead of the whole database. One reserved address range also reduces the
processing time and resident memory used by large sessions. The server needs unrestricted
virtual address space, though it does not reserve that amount of physical memory.

The "--brain-feed" option adds candidates from stdin while the server keeps running.
Brain protocol and session IDs have changed, so clients and servers must be upgraded together
and old coverage files are not loaded automatically. See "docs/hashcat-brain.md".

8. Rules in every attack-mode

Rules now work in attack-modes 1, 3, 6, 7 and 12 as well as 0 and 9. These modes generate base
candidates on the host when rules are enabled, then apply the rules on the device. The existing
mask parser still handles mask files, increments, Markov settings and custom charsets.

Host generation can reduce throughput for fast hashes. Hashcat reports that switch at startup.
Larger rulesets can offset some of the cost by doing more work per base candidate. Attacks
without rules continue to generate candidates on the device.

9. A Python bridge that uses every CPU thread

Mode 73000 now starts one ordinary Python worker process per CPU thread and sends it candidates.
It works on Windows and macOS as well as Linux. The interpreter comes from PATH, so virtual
environments work without a special build, and hashcat no longer needs Python headers to build.
Mode 72000 is removed.

A plugin is now a normal Python module with "calc_hash()" and a self-test pair. The old
"kernel_loop()" hook and "hcsp" and "hcmp" helpers are gone. Worker exceptions stop the run and
show a traceback. On 28 i7-14700K threads, a SHA-256 plugin reached 611 kH/s, up from
16 kH/s. See "docs/hashcat-python-plugin-development-guide.md"
for the upgrade steps.

10. Hash recipes in hash-mode 4000

Hash-mode 4000 cracks hashes described by a recipe on the command line, such as
"md5(md5(salt) . pass)" or "hmac_sha256(salt, upper(pass))". Hashcat compiles the recipe into a
kernel at startup, so most recipes run close to the speed of a matching built-in pure kernel.

Recipes use the syntax of hx, the hash expression language. They combine MD4, MD5, SHA-1, SHA-2,
RIPEMD-160, BLAKE2, SM3 and their HMACs. Functions such as upper, rev and pad transform passwords
and salts, while digests can be sliced or re-encoded. Many custom schemes can now use a recipe in
place of a dedicated mode or the slower dynamic plugin of mode 74000.
See "docs/hashcat-hash-recipe.md".

The same engine now replaces the pure kernels of 145 fast hash modes, including MD5, NTLM and the
HMAC modes. Each module keeps its hash parser, self-test and optimized kernels. This removes 428
kernel files and about 85,000 lines, while the engine, documentation and tests add about 5,700.
A new fast hash mode built from these families needs only a module that parses the hash line and
names its recipe. See "Kernel: fast hash type (recipe)" in
"docs/hashcat-plugin-development-guide.md".

##
## Migration and Compatibility
##

Check this section before updating scripts, plugins, packages or distributed jobs. It covers
changes that may require action.

## Distributed work and progress

- Attack-modes 0, 6 and 7 now count multiple inputs as one keyspace. Attack-mode 1 accepts a
  directory on the
  left. The "--skip", "--limit" and "--keyspace" options cover the full queue
- Keyspace positions count base words. Rules and remaining mask positions expand them later
- Separate dictionary rounds, including multi-phase association, reject "--skip", "--limit" and
  "--keyspace". The "--limit" option conflicts with "--loopback". Both range options conflict with
  "--restore" across multiple masks
- Progress now measures the requested range. The "CURKU" and "Restore.Point" fields still refer to
  the full keyspace. Monitoring tools must stop adding "--skip" to "PROGRESS"

## Restore files

- Restoring a session no longer runs the command stored in its restore file. To prevent command
  injection (CVE-2026-68766), hashcat prints a shell-quoted command using "--restore-position"
  instead
- If a command cannot be quoted safely for the current shell, hashcat prints an escaped argument
  list. This includes non-printable bytes and certain Windows arguments with "%", "!" or quotes

## Runtime libraries and compressed input

- Hashcat loads zlib, liblzma and libzstd only when needed. Missing libraries are reported when
  their features are used. See "docs/hashcat-compression-libraries.md"
- Attack-modes 1, 3, 6, 7 and 12, plus "--benchmark", need liblzma for "hashcat.hcstat2".
  Mode 11600 needs liblzma for LZMA/LZMA2 and zlib for DEFLATE. Without them, those archive
  candidates cannot be verified
- Input from ".zip" files is no longer supported for wordlists, hashes or rules. Gzip, xz and zstd
  still work
- Encoding conversion now loads iconv only when used. Windows uses native conversion and no longer
  supports EBCDIC, ISO-2022, "//TRANSLIT" or "//IGNORE". Unsupported names are rejected

## Commands, devices, paths and tuning

- Removing the segmented wordlist reader also removed "-c" and "--segment-size". Both now produce an
  unknown-option error, and "-c" will not be reused
- With "--dynamic-x", hashcat reads the mode from the first "$dynamic_N$" tag. It rejects a missing
  or unknown tag, and skips later lines that carry another number, with a warning. An explicit "-m"
  takes precedence
- Bundled keyboard layouts moved from "layouts/*.hckmap" to "tables/layouts/*.table".
  Update paths such as "layouts/de.hckmap" to "tables/layouts/de.table". Custom files in the old
  format still work
- Installed builds now put potfiles and sessions in the XDG profile directory and rebuilt data in
  the XDG cache directory. Old "$HOME/.hashcat" files are not moved automatically.
  Hashcat displays both new paths and the old one
- Rebuildable data now lives under "cache": kernels in "cache/kernels" and feed data in
  "cache/feeds/<feed>". Update scripts that clear the kernel cache
- Hashcat removed "--backend-devices-keepfree" and now checks free memory or probes allocations. The
  "HASHCAT_NO_AMD_FREE_MEM=1" setting skips the AMD query and uses the desktop reserve as a last
  resort
- When a discrete GPU is present, integrated GPUs are disabled by default. Select one with "-d"
- If a device chosen with "-d" cannot start, the run stops. The "--force" option allows other
  devices to continue. Without "-d", hashcat reports failures and keeps compatible devices
- Minimum system and backend versions changed. OpenCL 1.0 and 1.1 and accelerator devices are no
  longer supported. The "-D 3" option reports their removal. See "docs/hashcat-requirements.md"
- Workload profiles are now ignored, although "-w" and "--workload-profile" remain accepted. All
  runs use the former profile 3 budget, which may reduce desktop responsiveness
- The second ".hctune" column now names attack kernel 0, 1, 3 or 4, not the attack mode.
  Attack-modes 1, 6, 7 and 12 share one row. Custom mode 9 rows must use kernel 0
- The PCFG device engine now rejects "-j" and "-k". These options still work with host generation,
  including slow hashes, "--stdout" and "--slow-candidates"

## Hash mode output formats

- Modes 22000 and 22001 now write the original hash line to the outfile and "--show". The
  "--outfile-check-dir" option can read these lines for both PMKID and EAPOL. Hash lists for these
  modes are loaded on one thread again
- Mode 22001 now uses 1240 bytes of salt data per hash, up from 956, matching mode 22000, to hold
  802.11r fields. Large hash lists will need more host and device memory

## Brain protocol and stored sessions

- Brain clients now default to value 3, enabling range and candidate deduplication. In-kernel
  modes with fewer than 1024 salts skip candidate storage while keeping range reservation.
  An explicit setting overrides this choice
- Brain protocol version 2 changes candidate identities and uses stretched SHA-256 authentication.
  Upgrade clients and servers together. A mismatch reports both versions
- Existing brain databases stay on disk but are not loaded because session IDs changed.
  Reusing a "--brain-session" value starts with empty deduplication data
- Range-only brain clients no longer enable "-S", keeping fast hashes on the device. Use
  "--brain-client-features=2" for this path. The default still enables "-S", and automatic
  downgrades cannot undo it
- Attack identity now includes whether "-S" is active because host and device positions count
  different units. Old coverage records are not loaded. Candidate identity databases are unchanged

## Python bridge and plugins

- Fixed modes 72000 and 73000 pairing hashes with the wrong salts when a salt had several hashes, so
  most of the list went uncracked and nothing was reported wrong. Workers now use the salt's
  "digests_offset" to find each extended salt
- Mode 72000 was removed. Use "-m 73000" for the same hash format and plugin interface.
  Mode 73000 now uses every CPU thread without a free-threaded Python build
- Python plugins no longer need "kernel_loop()". The "init()" and "term()" hooks are optional, and
  "hcsp" and "hcmp" are gone. Keep "calc_hash()" and "extract_esalts()" as before
- Python plugins must define "ST_HASH" and "ST_PASS". Missing self-test values stop startup
- A "calc_hash()" exception now stops the attack and prints its traceback. Plugins must handle
  candidates they cannot hash instead of relying on the old "invalid-password" fallback
- The "hcshared.dump_hashcat_ctx()" and "hcshared.load_ctx()" functions and "Python/example.ctx"
  file were removed. Import a plugin as a normal module for standalone debugging. See the
  development guide
- The "hcshared" salt field getters now read fixed "salt_t" fields instead of looking in the
  extended salt. The "get_salt_buf()" function still reads the extended salt
- Hashcat uses "python3" from PATH, or "python" on Windows. Virtual environments and pyenv work
  without manual environment changes. Use "--bridge-parameter2" for another interpreter
- Child processes now close hashcat's file handles and brain socket. Python workers no longer
  inherit the potfile or a live brain connection
- Each Python worker keeps its own salt copy. With 20k salts, 28 workers use ~4.7 GB. Use "-d" to
  run fewer workers if memory is limited
- The default plugin and worker now load from hashcat's shared folder. The "make install" target
  includes "Python", so installed mode 73000 runs from any working directory
- Python extension modules no longer need free-threaded support because workers are separate
  processes

## Builds and third-party plugins

- The build no longer searches for Python or needs Python headers. The "WIN_PYTHON" setting and the
  MSYS2 Python cross-build dependency were removed
- The "SHARED=1" setting is now the default on Linux and macOS. Android, BSD, CYGWIN and MSYS2 keep
  "SHARED=0". The Windows release is shared, but a native Windows build needs an explicit
  "SHARED=1" for shared plugins
- Modules, bridges and feeds now link to "libhashcat.so.7", "libhashcat.7.dylib" or "hashcat.dll"
  above their plugin directory. Ship it beside the frontend and rebuild plugins for interface 720
- The core exports a defined plugin API. Host hash and cipher functions remain available even
  when no bundled plugin uses them
- Module ports must remove "module_dictstat_disable", set defaults for "module_hash_hints",
  "module_length_sort", "module_usage_notice" and "module_advice_notice", and pass
  "hashcat_ctx" to extra-parameter init and term hooks
- The "hc_device_param_t" structure now stores kernels, programs and buffers in arrays indexed by
  "hc_dev_kern_t", "hc_dev_program_t" and "hc_dev_buf_t". Update old numbered member accesses
- Bridge entry points now receive "hashcat_ctx". Bridges must set work-item granularity and
  seven monitoring hooks, using "BRIDGE_DEFAULT" when no sensor is available. Removed
  matching and forced-work-item flags have no replacement
- Association bridges must use "bridge_salt_pos()" and "salt_per_pw" to choose each salt
- Kernel availability now uses "hashconfig_t.kern_bits" and the "module_kern_bits()" hook. Use
  "KERN_BIT_*" constants in place of the 16 removed kernel "OPTS_TYPE" flags: INIT, LOOP, COMP,
  LOOP_PREPARE, LOOP_EXTENDED, HOOK12, HOOK23, INIT2, LOOP2_PREPARE, LOOP2, TM_KERNEL and AUX1 to
  AUX5. There are now 6 auxiliary kernel slots instead of 5
- Modules have a new "module_hash_recipe()" hook, with which a module runs its pure kernels as a
  hash recipe instead of kernels of its own. Every module sets it in "module_init()", and
  "MODULE_DEFAULT" if it has no recipe. See "Kernel: fast hash type (recipe)" and the porting
  section in the plugin guide
- Native builds now target the build CPU. Use "MAINTAINER_MODE=1" for release builds or
  "MCPU=<core>" for a chosen target. Mixed native and cross targets are rejected
- Rust plugins now require Cargo 1.85
- Source builds default to "PRODUCTION=0". Set "PRODUCTION=1" for release packaging. The
  "SOURCE_DATE_EPOCH" variable makes builds of the same commit reproducible
- Remove "USE_SYSTEM_ZLIB", "USE_SYSTEM_LZMA", "ENABLE_UNRAR", "USE_SYSTEM_UNRAR" and
  "USE_SYSTEM_XXHASH" from build scripts. They are no longer supported
- The plugin development guide at "docs/hashcat-plugin-development-guide.md" lists the core-library
  contract and the changes needed to port a v7.1.2 plugin

##
## New Hash Modes
##

- Added mode 36100: yescrypt
- Added mode 36200: gost-yescrypt
- Added mode 36300: scryptcrypt, scrypt (Unix)
- Added mode 35600: gost12512crypt [$gost12512hash$] (Unix)
- Added mode 34301: KeePass AESKDF (KDBX v4)
- Added mode 17050: GPG (AES-OCB-128 (SHA-1($pass)))
- Added mode 26150: Mozilla "key4.db" SHA384
- Added mode 35300: Kerberos 5, etype 23, TGS-REP (NT)
- Added mode 35400: Kerberos 5, etype 23, AS-REP (NT)
- Added mode 36800: OpenSSH Private Keys (bcrypt-pbkdf)
- Added mode 36000: BIP39 Passphrase Recovery (ASCII, P2SH/P2PKH/P2WPKH)
- Added mode 36400: KDE KWallet 4.13+ (PBKDF2-HMAC-SHA512, Blowfish)
- Added mode 36410: KDE KWallet < 4.13 (SHA-1, Blowfish)
- Added mode 36500: NTLM(NTLM_bin($pass))
- Added mode 35500: WordPress bcrypt(hmac-sha384($pass))
- Added mode 35700: phpass(md5($pass))
- Added mode 35800: Symfony Legacy SHA256
- Added mode 38000: Mikrotik RouterOS EC-SRP5 (Curve25519)
- Added mode 37700: Cardano Eternl Wallet (PBKDF2-HMAC-SHA512 + ChaCha20-Poly1305)
- Added mode 36600: PBKDF2-HMAC-SHA512(utf16le($pass))
- Added mode 36601: MSSQL (2025)
- Added mode 3300: MD5(Sun), SunMD5
- Added mode 36900: iClass Standard (DES + hash0 + iClass Cipher, dual-MAC)
- Added mode 36901: iClass Legacy Brute-Force (partial div_key + iClass Cipher, dual-MAC)
- Added mode 37000: MIFARE Ultralight C 3DES Key Recovery
- Added mode 37300: SAP CODVN H (PWDSALTEDHASH) iSSHA-256
- Added mode 37301: SAP CODVN H (PWDSALTEDHASH) iSSHA-384
- Added mode 37400: RACF DES Passphrase
- Added mode 37500: RACF KDFAES Passphrase
- Added mode 37600: SASL DIGEST-MD5
- Added mode 37601: POP3 APOP
- Added mode 29491: VeraCrypt BLAKE2s-256 + XTS 512 bit
- Added mode 29492: VeraCrypt BLAKE2s-256 + XTS 1024 bit
- Added mode 29493: VeraCrypt BLAKE2s-256 + XTS 1536 bit
- Added mode 24430: PKCS#12 (.pfx, .p12) (SHA1 + HMAC-SHA1)
- Added mode 24440: PKCS#12 (.pfx, .p12) (SHA256 + HMAC-SHA256)
- Added mode 38200: Cisco-IOS $14$ (convoluted Type 9)
- Added mode 4000: Hash Recipe, a recipe of MD4, MD5, SHA-1, SHA-2, RIPEMD-160, BLAKE2, SM3 and HMAC
  calls over the password and salt, and string transforms such as upper(), rev() and pad() of
  either, given with "--hash-recipe"

##
## New Features and Options
##

## Hash formats and recovered data

- Mode 23800 uses a built-in RAR3 decoder for both coding paths and all six standard filters.
  It counts candidates that reach an unsupported construct
- Mode 11000 accepts 56- to 64-byte PrestaShop salts. Its optimized kernels were removed because
  they cannot handle those longer salts
- Modes 10000, 10900, 12000, 12100, 20200, 20300 and 20400 accept eight-digit iteration
  counts instead of six-digit counts
- GPG (CAST5 (SHA-1($pass))) accepts nonzero IVs and "s2ktype" 3
- Mode 74000 adds a dynamic hash plugin. The "--bridge-parameter2" option describes combinations of
  12 digests, HMAC, PBKDF2-HMAC, bcrypt, slicing, UTF-16LE, case changes and hex/base64 encoding
- Option "--hash-recipe" gives mode 4000 its hash as a recipe in hx expression syntax, such as
  "md5(md5(salt) . pass)". The recipe is compiled into the kernel, so it runs close to the speed of
  the matching built-in pure kernel. See "docs/hashcat-hash-recipe.md"
- Wordlists, hash lists and rules accept zstd files as well as gzip and xz. Hashcat can seek
  directly in multi-frame files created by "pzstd"
- John's dynamic format covers 56 built-in formats. The "--show", "--left" and "--remove" options
  keep John's original hash spelling
- Use "--hash-copy" to keep the input spelling of cracked hashes in outfiles, potfiles and status
  output
- Encrypt recovered plaintext with "--encrypt-with-pubkey" and an RSA key of at least 3344 bits. It
  loads OpenSSL 3 only when used, hides plaintext in status and rejects plaintext output and restore
  options. See "docs/hashcat-encrypted-plains.md"
- Windows builds support long paths and include native version information
- Mode 11600 supports 7-Zip ZSTD compression (indicator 8). Hashes using it require libzstd
  and are rejected at load time if that library is unavailable
- Mode 31900 reads and writes an optional "rounds=" field for vaults using a count other than
  the default 5000 iterations

## Candidate generation and inspection

- Rule operands for "$", "^", "i", "v" and "o" accept non-ASCII characters directly, without
  one "\xHH" escape per byte
- Use "--rules-concat" to join rule files into one sequence. Their rule counts add instead of
  multiply
- Use "--lookup" to find a candidate's position in an attack. It accepts "$HEX[...]" and shows
  progress and an ETA during long wordlist scans
- Rules now work in every attack-mode. Modes 1, 3, 6, 7 and 12 create base candidates on the
  host, then apply rules on the device
- Debug output now identifies the producing rule in attack-modes 1, 3, 6, 7 and 12, as in
  attack-mode 0
- Stdin attacks support "--skip", "--limit" and "--restore" when given the same stream again
- Attack-modes 1, 6 and 7 accept "--slow-candidates"
- Feed attacks can use "--debug-mode" without "-r" or "-g". The "Finding-Rule" field describes the
  feed, and "--debug-mode 6" prints the attack-mode 4 layout
- New rules convert text to lower or upper hex ("h", "H"), insert a byte every N characters
  ("vNX"), change case ("S") or add a byte at position N ("BNX")
- The PCFG device engine now includes OMEN candidates for fast hashes. Set "omen=0" to omit
  them and keep the earlier candidate rate
- PCFG attacks with "-r" or "-g" now stay on the device engine and also accept "-u"

## Runtime control and reporting

- Rewind or advance a running attack with "r", "a", the arrow keys, "<" or ">".
  Holding a key moves faster
- Press "e" to change a running attack's "--runtime" limit
- Pure-kernel benchmarks use "--benchmark-pure" ("-B"). Optimized-kernel benchmarks still use "-b",
  and results identify the kernel used
- Stage times and peak memory use are available through "--task-time-breakdown". See
  "docs/hashcat-task-time-breakdown.md"
- Per-device pipeline timing is available through "--pipeline-stats" for feeding, copies, setup,
  transfers, loops and comparisons. It includes effective hash rate and machine-readable JSON
- All caches can now move to shared storage through "--cache-path". Feed caches fall back to memory
  on read-only storage, while kernel-cache writes still require permission

## Extraction tools

- Added "tools/rar32hashcat.py" to extract mode 23800 hashes from RAR3 archives
- Added "tools/gpg-ocb-aes2hashcat.py" for mode 17050 GnuPG keys in "private-keys-v1.d"
- Updated "tools/mozilla2hashcat.py" for Firefox 146 "key4.db" files (mode 26150)
- Added "tools/routeros2hashcat.py" for mode 38000 RouterOS backups, unpacked directories
  and monolithic config stores
- Added "tools/pkcs12_to_hashcat.py" for modes 24430 and 24440 ".pfx" and ".p12" stores
- The "tools/metamask2hashcat.py" tool now reads vaults from both "persist-root" and
  "persist-KeyringController" browser storage
- The "tools/bitwarden2hashcat.py" tool now reads mode 23400 key hashes and KDF iterations stored
  under the active account ID

##
## Performance
##

Results depend on the device, runtime and workload.

- Brain sharding cuts commit, lookup and insertion time by 92-99% and resident memory overhead by
  95%
- Modes 73000 and 74000 handle up to 1k candidates per bridge launch, up from 8. On 28 i7-14700K
  threads, a SHA-256 Python plugin rises from 16 to 611 kH/s and the mode 74000 Rust crate from 16
  to 74 kH/s, and the shipped Python plugin gains 10%
- Mode 74000 copies only output digests between host and device and lets autotune size launches of
  up to 16k candidates. With 32 Ryzen 9 7950X threads and an RX 7900 XTX, the dynamic plugin runs
  md5(md5($p)) 12x faster, and a bcrypt cost 10 launch falls from 29 to 0.4 seconds
- PKZIP mode 17200 runs 12.8x faster on an RTX 4090 and 87% faster on an RX 7900 XTX
- DPAPI mode 15910 gains 19% on NVIDIA and 97% on AMD
- Raw private key modes 30901, 30902, 30905 and 30906 gain 35-45x on an RTX 4090 with "-a 3" and
  unknown leading hex digits by advancing public keys with point addition
- Limiting kernels that use at least 8 KiB of private memory per item to one warp or wavefront makes
  PKZIP 2.5x faster on an RTX 4090 and 3.2x faster on an RX 7900 XTX
- Fewer launch measurements and shared tuning results cut autotune time by 32% across equivalent
  devices and association rounds
- Rate-based launch selection avoids undersized launches and raises tested PCFG throughput by 4.5 to
  5.6 times on NVIDIA and AMD GPUs
- Candidate preparation now overlaps device work. Brain clients keep their ordered reserve, lookup
  and commit path. The "HASHCAT_PIPE_SYNC" setting selects that path for any attack
- Candidate staging no longer clears whole buffers, avoiding hundreds of megabytes of work in large
  batches
- Reusing autotune results across wordlist queues, mask files and increments speeds repeated rounds
  with matching loop bounds. A 30-mask file falls from 71 to 6 seconds, and a 200-mask file from
  243 to 4 seconds
- Markov statistics now fit the longest queued mask instead of the maximum possible mask. A
  four-character "--keyspace" probe falls from 543 to 22 ms and 405 to 26 MB. Attack-mode 1 skips
  the table. Option "--markov-classic" still needs the whole table and is unchanged
- Mask rounds now clear and upload only the Markov table they need. A "--keyspace" probe across 200
  masks runs 9x faster
- Removing an unused event backlog saves 160 MiB of memory per attack
- With "--show" or "--left" and "-o", hashcat skips per-hash records that output discards
- Devices sharing a kernel cache entry now compile it only once
- Excluded CUDA devices no longer create a context just to query memory
- Omitting an integrated GPU cuts cold mode 0 startup by 26% at a 1% throughput cost
- Removing an unused OpenCL helper cuts cold builds by 42% and backend-info startup by 70% under
  ROCm 7.0.1
- CPU kernels shift a buffer by a byte offset with one loop instead of a switch over every word
  offset. On the Intel CPU runtime a first run of mode 2600 falls from 12 minutes to 44 seconds and
  of mode 1410 from 10 to 3 minutes, almost all of it kernel compile, at the same cracking speed
- Sizing register-spill reserves for resident work items cuts the mode 0 reserve by 99% on a
  GeForce RTX 4090
- Unified-memory devices reserve only needed host buffers instead of half their pool
- Argon2 buffers now follow attack size rather than self-test size, permitting higher acceleration
  without reserving unused memory
- Bitmap filters now account for hash count and device memory and use all four digest words. Large
  NTLM lists gain the most
- Parallel counting, parsing, sorting, deduplication and indexing speed large hash-list loads
- Duplicate hashes can share one stored plaintext, reducing time and memory for repeated hashes
- If another run has completed the hash list, hashcat skips bitmap setup, kernel builds, device
  buffers and autotune. It scans "--outfile-check-dir" before starting the attack
- Outfiles and potfiles lock and flush once per launch. Digest-prefix buckets speed unsalted potfile
  lookups
- Sorting LM halves and using binary search makes pairing nearly linear instead of quadratic
- Reusing parsed rules and growing buffers geometrically speed large rule-file loads while reducing
  memory use
- AVX2 or NEON line scanning and stream locking speed initial wordlist and hash-list scans
- Piped input now arrives in blocks, improving multi-device attacks
- Wide bridge units receive full iteration ranges and tune launch size with two measurements
- Uncompressed wordlist seek-index scans run over 20 times faster, cutting database build time by
  72%
- Brain and seek data now use "paw64", which runs 1.6x faster than the former xxHash
- Parallel parsing and compact tables reduce large PCFG startup time by up to 95% and memory use by
  more than 75%
- Hash-indexed table loading and longest-match indexing make large table builds scale linearly
- Rule processing under "--stdout" now spans host cores and uses a larger buffer without device
  readback. Output bytes remain unchanged
- Sorting candidates by length raises throughput by 50-200% in 19 opted-in modes. The
  "module_length_sort()" function enables it and "--length-sort-disable" turns it off
- Vector width 2 raises seven fast modes by 3.0-35.6% on Apple M-series GPUs under Metal and OpenCL
- Reading "u32" words during UTF-8 to UTF-16 conversion speeds 41 modes by 2.3-9.0%
- Halving AES round-key byte lookups speeds modes 16600, 22500, 22931, 22941, 22951 and 23001
  through 23003 by 15-41% on an RTX 4090
- Native AMD OpenCL byte operations speed Argon2 modes by 2-79% and mode 1700 by 27.6% on an RX 7900
  XTX
- Register-held yescrypt state speeds modes 36100 and 36200 by 13-45%. Local S-box placement can
  add 39% more
- Native byte operations speed big-endian alignment in mode 100 by 4.1% on an RX 9070 XT with Mesa
  rusticl
- Compiler-generated swaps and bit fields speed HIP modes 0, 1700 and 10800 by less than 1%
- On an RTX 4090, rule "Z" with counts of at least 3 runs ~40% faster in optimized kernels. Rule "z"
  with counts of at least 2 reaches up to 2.3x in pure kernels
- A SHA-1-order shared hex table speeds mode 18500 by less than 1% on an RX 7900 XTX
- Avoiding width conversion through a union improves mode 6100 under Mesa rusticl
- Removing unneeded register limits improves compiler allocation for modes 1800, 8300, 10700 and
  16600
- The built-in RAR3 decoder uses less device memory than UnRAR
- Plain wordlist attacks no longer reserve unused mask buffers on the device
- The outfile check thread exits without waiting for another polling interval
- Scrypt TMTO values above 2 raise underfilled high-memory GPU throughput by 5-46%. Already full
  devices are unaffected
- Precomputed md5crypt message templates speed optimized mode 500 by 5-33% across AMD, NVIDIA and
  Intel GPUs
- Removing zero-valued message words speeds optimized mode 0 combinator attacks by 10-92% across
  AMD, NVIDIA and Intel GPUs
- Correct RACF KDFAES iteration reporting improves autotune. Throughput rises 27% on an RX 7900 XTX
  and 14% on an RTX 4070 Ti Super
- Specialized RC4 calls speed 5 modes on an RTX 4090: mode 9700 by 34.7%, mode 9800 by 30.4% and
  mode 10500 by 16.4%
- Moving the scrypt state shuffle before Salsa speeds modes 8900, 22700, 27700 and 28200 by 18% on
  an RTX 3070. Modes with r=1, such as 9300, are unchanged
- Mode 3000 with "-a 3" now rejects single-hash candidates during the final DES rounds. NVIDIA
  Maxwell and newer compute only the needed S-box outputs at each of three stages
- Unrolled bitsliced DES rounds on NVIDIA GPUs give mode 3000 ~10% more speed with "-a 3" on an
  RTX 4090
- Optimized mode 12500 cuts its private buffer from 3264 to 264 bytes per work item by storing
  four records and a prefix instead of 64 expanded records
- Mode 17400 simplifies the first Keccak round and unrolls later rounds in pairs, speeding "-a 3"
  with "-O"
- Mode 28501 delays secp256k1 basepoint setup until a candidate passes validation under "-a 0",
  "-a 1" and "-a 3". With "-a 3", it also decodes the 48 fixed Base58 digits once per work item and
  rejects invalid compressed-key markers before the candidate loop
- Mode 31100 moves fixed schedule words outside the mask loop and rejects candidates one round
  earlier, speeding "-a 3" with "-O"
- Modes 31100 and 35100 use an NVIDIA byte permute for the second SM3 P0/P1 rotate
- Modes 16600, 22500, 22951 and 23003 fold the AES-256 decrypt key schedule into the decrypt rounds
  instead of building a 60-word array first, for +8% to +36% on a GeForce RTX 4090 and +22% to +45%
  on a Radeon RX 7900 XTX

##
## Improvements
##

## Backends: OpenCL, tuning and memory

- OpenCL clones now share contexts and programs and split the physical device's memory budget. The
  "HASHCAT_CLSHARE=0" setting restores separate contexts
- Runtime discovery now chooses the newest available NVRTC, HIPRTC and HIP runtime libraries, so
  Linux needs only runtime packages. It no longer needs nonexistent NVRTC names or HIP DLL names
  inferred from "HIP_PATH"
- HIP selects its ABI from the loaded runtime, so one binary supports ROCm and Hygon DTK
- AMD GPUs under Mesa rusticl now expose temperature, fan and clock readings through
  "cl_khr_pci_bus_info"
- Bridged modes accept "-n" and "--kernel-accel" up to 16k candidates per launch. Other modes
  remain limited to 1024
- Diagnostics now show NVIDIA NVML throttling reasons, accepted "-u" ranges, device memory
  budgets through "HASHCAT_MEMORY", and cache sizes and bridge units through "-I"
- Set per-process memory budgets with "HASHCAT_DEVICE_MEM_LIMIT" and "HASHCAT_HOST_MEM_LIMIT" (MiB)
  when sharing a machine
- The compressed candidate buffer is sized by the mode's maximum password length instead of PW_MAX,
  a packed arena where charging 256 bytes per work item made it as large as the buffer it feeds. On
  "-m 0 -a 0 -O" the host allocation falls from 2583 to 1305 MB and kernel_accel from 141 to 316
- HIP no longer sets "AMD_DIRECT_DISPATCH=0". Tests on ROCm 7 and an RX 7900 XTX found
  no benefit for host CPU use or cracking speed
- Removed obsolete "OCL_CODE_CACHE_ENABLE" and "CL_CONFIG_USE_VECTORIZER" settings.
  Debug builds still use "CUDA_CACHE_DISABLE" and "POCL_KERNEL_CACHE"
- Mask attacks no longer allocate the device and host buffers for host-built candidates, which they
  never use
- The 8 krb5 modes that derive a key with PBKDF2-HMAC-SHA1 declare their tmp buffers at the size
  their kernels write, which lowers device memory per work item: modes 19600, 19700, 19800, 19900,
  28800, 28900, 32100 and 32200

## Autotune and tuning database

- The tuning database adds measured "kernel_accel" rows and NVIDIA GB10 values.
  Vendor rows now match backend vendor IDs rather than device names
- Explicit module thread counts remain intact and visible. Mode 23800 chooses a count by device.
  Metal uses the compiled pipeline limit rather than a 32-thread cap
- Set "HASHCAT_AUTOTUNE2_VERBOSE" to see probe times, the cost model and the chosen launch. See
  "docs/hashcat-tuningdb.md" for custom rows

## Kernels

- Set "HASHCAT_FORCE_NO_INLINE" to build kernels with "FORCE_NO_INLINE" when inlined helpers
  compile slowly
- Fast kernels reserve constant memory only for data the attack reads. Mask attacks regain
  28 KB and combinator attacks 32 KB of the 64 KB budget
- The pure kernels of 145 fast hash modes (MD4, MD5, SHA-1, SHA-2, RIPEMD-160, BLAKE2 and SM3
  compositions, their HMAC modes, and Radmin2) now run as hash recipes through the mode 4000
  kernels, and their 428 pure kernel files are removed. Optimized kernels, hash formats and mode
  numbers are unchanged

## Attack modes and candidate input

- Wordlist keyspace now counts physical lines. Unusable lines appear as rejects without
  shifting later positions
- Set "HASHCAT_A0_LEGACY_READER=1" to restore the old attack-mode 0 reader. Loopback and induction
  use it automatically because their input changes between rounds
- Pure-kernel attack-mode 7 keeps its mask-first path for one wordlist. Multiple wordlists and
  directories use the general path
- Set "HASHCAT_SALT_INNER=1" to test each amplifier item against all active salts first, favoring
  early candidates when a run stops
- Feeds can find shared data and skip keyspace positions without candidates through
  "GENERIC_RC_SKIP". The "rust_random" feed builds when Rust is available

## Hash lists and potfile

- Hash display now accepts "--username" with "--dynamic-x" under "--show" and "--left"
- Hashcat names a detected nondefault hash-list format because it changes how every line
  is interpreted
- The message-pair filter is now called "--eapol-message-pair" instead of "--hccapx-message-pair"
  for modes 22000 and 22001. The old option name still works

## Extraction tools

- Extraction scripts and modules identify the relevant hash mode or extraction tool more clearly
- APFS extraction skips two known recovery-key entries and prints standard volume and key UUIDs
  instead of raw hex

## Wordlists and compression

- Invalid "--encoding-from" and "--encoding-to" names now produce an explicit error

## Brain

- Status, machine-readable and JSON output now split "Brain.Rejects" into ranges reserved
  elsewhere and candidates already seen by the server

## Startup and diagnostics

- Kernel cache keys now use all 64 bits of "paw64". Older cache entries rebuild once
- Parse errors name hashes passed on the command line. Separator and token-length errors
  show the failing text and expected format
- Initial wordlist scans now display throughput in MiB/s

## Interface and status

- Paused attacks poll more often, making quit and resume respond sooner
- Tab completion now covers attack-modes 4, 5, 8 and 12, "--lookup", "--cache-path" and
  paths starting with "$HOME"
- Tab completion adds custom charsets 5 through 8, all debug modes, "-D" and
  "--rules-concat", and removes unsupported device type 3
- Status now labels wordlists as feeds and shows positions in their shared queue.
  It reports "Host Generator + PCIe" when candidates are not amplified on the device
- Status now combines amplifier and iteration positions in "Restore.Sub" for three devices per
  update. The "Restore.Point" field shows salt, amplifier and iteration counts only when greater
  than one
- Candidate windows, bridge speeds and grouped temperatures summarize large device sets
  instead of printing every unit on each update

## Benchmark

- Default "-b" now includes yescrypt, gost-yescrypt, scryptcrypt, KeePass KDBX4 and
  Kerberos 5 etype 23 AS-REP. MyBB replaces vBulletin
- Redundant "md5($pass.$salt)" benchmark modes were removed. The differing
  "md5($salt.$pass)" forms remain

## Plugins and bridges

- Bridge sensor readings, unit names and "--hwmon-temp-abort" now identify the hardware
  doing the work
- Mode 70100 now allocates "128 * r * N" scratch per candidate, sizes batches from free host memory
  and reports "2 * N * p" iterations. Chunks set with "-u" show progress for large N
- Python bridge status names its interpreter, and Rust bridge status names the loaded plugin
- Plugins can receive bridge parameters, describe multi-part units and use core device
  allocation, compilation and launch functions
- OpenCL hash and HMAC helpers read only input-length words. Plugins no longer need to pad
  to a full block. Existing padded callers still work
- The "hc_fopen_mem()" function reads an existing memory buffer through the normal file interface
- Rust bridges share "hashcat-sys" and build crates under "Rust/bridges" into
  "bridges/subs". CI builds and tests both plugin families

## Modules

- Modes 8500, 14200, 16000, 22001, 27000 and 27100 declare ASCII-only passwords. The "--hash-info"
  option reports this, and other plaintext is displayed as "$HEX[...]"
- Mode 34300 is now called "KeePass Argon2 (KDBX v4)", distinguishing it from
  mode 34301, the KDBX v4 AESKDF mode
- Usage notices now cover 124 modes and name the tool that extracts the hash. Mode 1000 can display
  an additional advice notice
- Modes 22000 and 22001 now accept hcxpcapngtool's 802.11r FT record types 03 and 04
  alongside PMKID and EAPOL types 01 and 02. Both crack under the existing modes

## Package maintainers

- Release builds enable link-time optimization with "ENABLE_LTO=1". A shared core also cuts unpacked
  release size by ~78%
- Development installs now include public plugin headers and an unversioned "libhashcat.so". The
  "make install" target also includes feeds, rules and PCFG rulesets
- Added Android and Termux, little-endian LoongArch, PowerPC and MIPS targets, plus
  scrypt-jane ARM support through sse2neon. OpenBSD builds with its base compiler
- Apple Silicon builds are native by default. The "MACOS_UNIVERSAL_BINARY=1" setting creates arm64
  and x86_64 output on Apple Silicon and disables LTO
- Added the "hashcat_binaries" cross-build container and Ubuntu 26.04 CUDA and AMD images.
  Patches live in "docker/patches" and fail builds if they do not apply. Packaging images honor
  "HASHCAT_REF"
- CI builds FreeBSD and Pi 4 Linux ARM64 on every push and OpenBSD, NetBSD and DragonFlyBSD weekly.
  The "tools/test_package.sh" script checks artifacts before upload
- Build dependencies now track shared module bodies, feed headers and bundled libraries
- System zlib and LZMA replace bundled sources
- The built-in RAR3 decoder replaces "deps/unrar" and removes the C++ compiler and runtime
  requirement
- The "paw64" hash replaces the bundled xxHash library

## Testing framework

- The Python program "tools/test.py" replaces the shell test, edge and coverage scripts.
  It provides "--edge", "--test-coverage" and parallel runs with "-j"
- All test modules are now Python. The suite installs pinned packages from
  "tools/requirements.txt" and no longer needs Perl modules
- Added independent test oracles for 29 modes, including 4 GPG, 5 PKZIP and 6 collider
  modes. The "-S" option tests self-test vectors where no oracle exists
- Container tests under "-g" create and crack real containers for 105 LUKS, TrueCrypt, VeraCrypt,
  GPG, PKZIP, RAR, 7-Zip, PDF and OpenSSH modes alongside their normal oracles
- The suite covers attack-modes 4, 8, 9 and 12. The "-M" option selects 24 modes covering every
  distinct path at vector width 1, and "--test-coverage" requires an exemption for each untestable
  mode
- Generated test passwords now include multibyte characters
- The "tools/requirements.txt" file uses PyPI packages only. The "gostcrypto" package replaces
  pygost. DiskCryptor XTS now uses pycryptodome instead of pycryptoplus
- Added "tools/README.md", "tools/install_dependencies.sh" and
  "tools/requirements.txt" for test setup. Failed installs name each package
- The 14000 oracle keys DES with the first 8 bytes of the password, and the 33501
  hybrid run skips a slot whose mask would be empty, so both pass the pure/opt suite
- The "--bridge" option cracks each selected mode's own test oracle through the Python
  bridge (mode 73000) with no mode kernel, so the parser and candidate handling are checked
  against the reference implementation
- The weekly CI run now tests the pure kernels, the bridge pass, and a container pass that
  cracks the TrueCrypt, VeraCrypt, CryptoLoop and LUKS container files, beside the optimized
  kernels, as parallel jobs

## Documentation and licensing

- Added "docs/hashcat-rust-plugin-quickstart.md" for Rust bridges and feeds
- Added "docs/packages.md" with shipped files, runtime dependencies and build settings
  for package maintainers
- Rewrote the Camellia kernel from RFC 3713 under the project license without changing its 16 modes.
  Added license texts for bundled Argon2, scrypt-jane, yescrypt, PPMd and the Windows liblzma and
  libzstd libraries
- Added "SECURITY.md", "CONTRIBUTING.md" and "AGENTS.md", and revised "README.md"
- The "--keep-guessing" section of "docs/limits.txt" now explains that it can miss one of two
  candidates matching a hash in the same kernel call, with separate fast- and slow-hash cases
- Added "docs/plugin-development-workshop/" with a syllabus, starter templates,
  a finished plugin and exercises for building a hash mode and pure kernel

##
## Bug Fixes
##

## Memory safety: hash parsing and encoding

- Fixed short or malformed hashes causing out-of-bounds reads in modules 7100, 7900, 8500,
  8501, 11600, 19600, 19700, 28800, 28900, 29100, 32100 and 32200
- Fixed a hash that specifies zero iterations underflowing the salt iteration count, which could
  hang the device
- Fixed modules 400, 3200, 6400, 6500, 6700, 7900, 11600, 13000, 25600, 25800, 28400, 30600,
  30601, 33800, 35500 and 35700 not rejecting an iteration-count shift of 32 or more, which exceeded
  the type's width and gave the wrong iteration count
- Fixed modules 8900, 15700, 27700, 28200 and 29800 underflowing "salt_repeats"
- Fixed scrypt kernels hanging when a hash specifies zero parallelism
- Fixed a salt buffer sized for the longest "generic_salt_encode()" output leaving no room for the
  terminator, which was then written just past it. This was a one byte stack buffer overflow in 39
  modules
- Fixed pure kernels overflowing "salt_buf" when decoding base64 salts
- Fixed encoders not capping reported hash lengths to their output buffers. Potfile and status paths
  that bypass "hash_encode()" now also enforce bounds
- Fixed modules 111, 1411, 1711, 5300, 5400, 11400, 13100, 13600 and 18200 writing a "0x80"
  padding byte beyond a full buffer. The pure kernels of modes 111, 1411 and 1711 also accept
  their advertised 256-byte salts
- Fixed encoding at maximum data length overflowing buffers under "--show" or "--left" in modules
  13100, 16900, 18200, 19600, 19700, 32100 and 32200
- Fixed outfile construction not checking bounds before copying long usernames, hashes or plaintexts
- Fixed username parsing not allocating the full field length, which let "--show" and "--left" read
  unrelated heap data
- Fixed digest offsets using too few bits to address hashes beyond 4 GB
- Fixed decode errors in damaged gzip, xz or zip files becoming byte counts that overrun hash-list,
  brain or charset buffers
- Fixed line reading in "fgetl()" writing beyond a buffer filled exactly by one line
- Fixed hccapx modules 2500, 2501, 22000 and 22001 sizing decompressed data incorrectly, not
  validating ESSID and EAPOL lengths, and accepting short potfile lines
- Fixed modules 16800 and 16801 not checking potfile line length before reading a 64-character PMKID
- Fixed KeePass modules 13400, 29700 and 34300 accepting invalid content lengths and leaving encoded
  output uncapped
- Fixed mode 34300 not checking KeePass 4 line length before indexing back from its end
- Fixed Kerberos modules 13100, 18200, 19600, 19700, 19800, 19900, 28800, 28900, 32100 and 32200
  leaving account and realm copies unbounded
- Fixed module 25400 appending a stray byte to a full 32-character PDF user password, and not
  respecting input length and buffer bounds
- Fixed PKZIP modules 17200, 17210, 17220, 17225 and 17230 not bounding decoded hex tokens
- Fixed modules 11600, 70000, 33500, 33501 and 33502 not rejecting decoded tokens too large for
  their destination fields
- Fixed LM hash-file growth writing past the hash list when one line adds 2 entries
- Fixed split-hash display not bounding both plaintext halves copied from the potfile under "--show"
- Fixed modules 8900, 10200, 21500, 21501, 28200, 70100 and 70200 accepting oversized unpadded
  base64 fields
- Fixed SAP CODVN F/G modes 7800 and 7801 not bounding the combined password and salt buffer
- Fixed module 10000 accepting salts beyond its buffer and reserving no space for the encoded
  terminator
- Fixed module 28600 not sizing its encoding buffers for the 64-byte salts its parser accepts
- Fixed module 26900 reading beyond its esalt for an all-zero SNMPv3 engine ID
- Fixed mode 32300 letting salts, joined strings and parser allocations exceed kernel field sizes
- Fixed modules 34000 and 23400 not bounding decoded base64 hash and salt fields
- Fixed GPG modes 17010, 17020 and 17030 not terminating encoded data before "--show", "--left" or
  outfile output, which printed uninitialized bytes
- Fixed modes 70100 and 70200 not validating scratch parameters, a yescrypt size overflow, and
  missing allocation failure checks in scrypt-jane, yescrypt and Argon2
- Fixed secp256k1 "point_mul_xy()" reading beyond its buffer for a zero scalar
- Fixed TrueCrypt and VeraCrypt modes not freeing container headers after either parse error, which
  leaked 512 bytes per rejected container across 36 modes
- Fixed mode 29100 not writing the salt terminator at the correct byte within "salt_buf"
- Fixed mode 14200 not rejecting memory factors outside its supported range before shifting or
  filling the 256-word buffer
- Fixed odd-length hex tokens being accepted, which "input_tokenizer()" now rejects centrally
- Fixed modes 34000, 34100 and 34300 not reserving enough self-test buffer space for hashes with an
  Argon2 memory cost below the built-in test vector
- Fixed module 32500 printing bytes from uninitialized stack memory into every hash it encoded, so
  cracked hashes in the outfile and potfile could not be loaded or matched again

## Memory safety: candidates, rules and masks

- Fixed random rule generation reading beyond its operator and character tables
- Fixed rule "/Xyp" not bounding the local buffer when duplicating a long word
- Fixed rule rejection checks reading beyond a candidate or inspecting the first or last character
  of an empty candidate
- Fixed rule compilation not bounding class-selector lookahead
- Fixed stacked rule files corrupting memory or miscalculating device allocation instead of
  rejecting combinations above 31 functions or 32-bit rule counts
- Fixed debug output not reserving room for a maximum-length password produced by a rule
- Fixed 33 combinator kernels not skipping word pairs whose combined length exceeds their 256-byte
  candidate buffer
- Fixed masks and custom charsets longer than 1023 characters overwriting their length field
- Fixed incremental masks letting masks over 255 characters, expanded charsets and mask-file data
  overflow their 256-byte buffers
- Fixed random rule generation selecting past a rule group in 17 paths, and empty
  "--generate-rules-func-sel" values dividing by zero instead of returning an error
- Fixed modes 26900 and 27300 ending the session with an illegal memory access when a rule shortened
  a candidate to zero length, which their loop kernels divided by

## Memory safety: services and interface

- Fixed brain peers with negative lengths, more than 64 dumps or more than 64 whitelist entries
  overflowing client or server buffers
- Fixed keyboard mappings leaving TrueCrypt and VeraCrypt passwords unbounded and accepting mapping
  files with more than 256 entries
- Fixed status candidates triggering unbounded reads from device memory
- Fixed the status rule-file list not truncating safely within its 4 KB buffer
- Fixed outfile checks reading or writing beyond their line buffer
- Fixed restore loading not bounding an unterminated 256-byte directory field
- Fixed tuning files overflowing tokens on lines with more than 7 fields
- Fixed mode 11600 not calculating 7-Zip encoded length safely, including for future longer hashes
- Fixed early failures in "outer_loop()" and "--identify" not releasing their allocations
- Fixed running from the install directory leaking "profile_dir", "session_dir" or "shared_dir"
- Fixed libhashcat sessions not freeing argument vectors read from restore files
- Fixed the JSON output writing one byte past its buffer for a string made only of characters that
  need escaping, which a session name or hash file name can be

## Hash modes and kernels

- Fixed modes 22000 and 22001 not accepting EAPOL frames longer than 256 bytes, including M2 frames
  with vendor RSN extensions
- Fixed modes 22000 and 22001 failing to parse older PMKID lines separated with ":" instead of "*"
- Fixed mode 3000 truncating wordlist entries longer than 7 characters rather than rejecting them
- Fixed modes 19800 and 19900 not reading the explicit salt field, which blocked nondefault
  principal salts and kept hash lines that carry that field from loading
- Fixed the 41 UTF-8-to-UTF-16 kernel modes not recognizing valid 3 and 4 byte UTF-8 characters,
  including the euro sign and Japanese kana
- Fixed modules 130, 140, 170, 1430, 1440, 1470, 1730, 1740, 1770, 10830, 10840, 10870,
  13500, 13800, 29000 and 29200 widening non-ASCII UTF-8 with "-a 3" instead of decoding it, which
  kept valid passwords from cracking
- The non-ASCII "-a 3" fix requires "--backend-vector-width 1" on CPU devices
- Fixed mode 22100 not synchronizing workgroup threads before reusing shared salt data, which could
  give wrong results
- Fixed keyboard layout mapping not working for the 15 TrueCrypt and VeraCrypt container modes
  6241-6243, 13721-13723, 13741-13743, 13761-13763 and 13781-13783
- Fixed VeraCrypt modes 13723, 13733, 13751, 13753, 13761 and 13763 failing self-tests and hanging
  after a crack with "--self-test-disable"
- Fixed mode 1500 not cracking "-a 3" lists with several hashes sharing one salt
- Fixed PKZIP modes 17200, 17220 and 17225 not decoding stored DEFLATE blocks on AMD HIP and
  OpenCL. The fix also covers mode 17230 under attack-modes 1, 3, 6, 7 and 12
- Fixed mode 10500 rejecting PDF hashes with an empty ID
- Fixed mode 24420 not reading "$PEM$2" lines emitted by "pem2john.py" for non-SHA-1 PRFs, and
  treating unsupported KDF or PRF values as SHA-256
- Fixed GPG modes 17010 through 17050 mishandling some iteration counts and password lengths because
  of stale salt bytes. Mode 17030 also reads AES-128 keys at the correct width
- Fixed modes 7800 and 7801 truncating SHA-1 messages past byte 119, which kept a matching candidate
  from cracking
- Fixed SNMPv3 modules 25000, 25100, 25200, 26700, 26800, 26900 and 27300 rejecting engine IDs
  shorter than 13 bytes, and modes 26900 and 27300 padding every ID to 17 bytes with zeros, which
  kept a shorter ID from cracking during password localization
- Fixed 8 scrypt modules reporting a misleading self-test or configuration error instead of
  rejecting hashes whose large "r" and "p" values require too much memory
- Fixed optimized modes 3710, 4010 and 4110 accepting salts beyond their kernel limits
- Fixed mode 35100 rejecting passwords longer than 15 characters, which its new pure kernel now
  accepts
- Fixed association workgroups not using each hash's salt, keyboard map and page table, and not
  passing the correct salt to host hooks in modules 1100, 5300, 5400, 5600, 6211-6233, 7300,
  8000, 11600, 13711-13773, 13800, 17200-17230, 22100 and 23800
- Fixed PKZIP modes 17220 and 17225 exceeding the AMD private-memory aperture, which could prevent
  HIP launches or severely reduce throughput
- Fixed mode 31100 hanging at vector width 16 in its optimized "-a 3" kernel on AMD, and returning
  into its own SM3 schedule function
- Fixed secp256k1 "inv_mod()" looping forever for zero input on CPU devices
- Fixed pure kernels in modes 1500, 3000, 8500, 14000, 14100 and 16000 assuming CPU devices have
  dedicated shared memory
- Fixed modes 8500, 8501, 12400 and 14100 failing to build when OpenCL reports local memory as
  global memory
- Fixed mode 17220 failing to build with "-a 3" after the CRC32 include rename
- Fixed modes 3730, 18100, 19300, 19500, 21310, 21900, 29000, 30700, 31700, 32300 and 33000 not
  using fixed separators for internal hash fields. Module 30700 now uses the colon its parser
  expects, leaving "--separator" for the plaintext boundary
- Fixed Mega.nz password-protected links having the wrong hash category
- Fixed a module file that cannot load crashing detection, help or hash-info commands. The
  "module_load()" function now also frees resources when opening or initialization fails
- Fixed shifts into the sign bit in the kernel "append_0x80_*" helpers and 8 parsers
- Fixed modes 9710 and 25400 failing to crack under PoCL by keeping their RC4 S-box helpers
  inline for that runtime
- Fixed mode 12150 not running every candidate at vector widths above 1, including the CPU default
- Fixed modes 20011, 20012, 20013, 31200 and 33700 deriving the wrong HMAC key when a decoded UTF-16
  password exceeds the hash block
- Fixed modes 15400, 25700, 26401, 26402, 26403, 27800, 34200, 34201 and 34211 not rejecting
  passwords longer than their optimized kernels hash, which could output a full-length plaintext
  that does not match the reported digest
- Fixed optimized combinator attacks reporting a plaintext cut to 55 characters that does not
  match its digest
- Fixed modes 34200, 34201 and 34211 not reporting a 32-byte password limit with "-O" under "-a 0"
  and "-a 1". Their "-a 3" limit remains 64 bytes
- Fixed modes 34200, 34201 and 34211 failing to build "-a 3" kernels at vector widths above 1,
  including widths selected by OpenCL CPU devices
- Fixed mode 31900 rejecting MetaMask Mobile vaults with 44-character base64 salts, which encode 32
  bytes instead of the previously assumed 16
- Fixed mode 22001 not reading its own potfile entries or recognizing previously cracked hashes
- Fixed modes 17200, 17220, 17225 and 21800 refusing to run on Apple Metal. The PKZIP decoder was
  miniz's coroutine form, which resumed at a case label inside the loop it had stopped in, and no
  Metal compiler would build that
- Fixed modes 17200, 17220 and 17225 aborting on Apple OpenCL over an AMD GPU, a device no guard
  covered, so the run died with no output instead of declining
- Fixed modes 7700 and 7701 never cracking under a rule that changes the candidate length. The two
  attack mode 0 kernels handed the walldorf transform the length the word had before the rule
  engine ran, so the digest covered the wrong number of bytes
- Fixed modes 7800, 7801, 11700, 11800 and 28000 never cracking under a rule that changes the
  candidate length, in the optimized kernels. The attack mode 0 kernel used the length the word had
  before the rule ran, the same fault fixed for modes 7700 and 7701
- Fixed modes 34000, 34100 and 34300 rejecting a hash list in which 2 hashes share a salt string but
  differ only in the Argon2 memory cost or parallelism
- Fixed pure mask attacks on 22 UTF-16 modes, such as NTLM and DCC, missing passwords with non-ASCII
  characters on devices running at a vector width above 1, which includes most CPUs
- Fixed mode 14500 reading the key size of every hash after the first from the wrong place, so a
  list of several 128 or 192 bit hashes could miss all but the first
- Fixed mode 8300 never cracking a domain written with uppercase letters, which RFC 4034 hashes in
  lowercase, and accepting owner names, salts and iteration counts outside what the RFCs and its
  kernels allow
- Fixed the SNMPv3 modules rejecting engine IDs of 18 to 32 bytes, which RFC 3411 allows, and
  accepting the all zero and all 0xff IDs it forbids
- Fixed the optimized mask attack of mode 8000 never returning on AMD GPUs at a vector width of 4
  or 8
- Fixed modes 22000 and 22001 never cracking PMKIDs from AKM 6 (PSK-SHA256) networks, which
  hcxpcapngtool marks with message pair 03
- Fixed nonce error correction never correcting a key version 3 handshake in modes 2500, 2501, 22000
  and 22001
- Fixed the pure mask attack of modes 4410 and 4420 failing its self-test or not building on CPU
  devices, which hashed the wrong salt bytes at vector widths above 1
- Fixed mode 32500 hashing only 1 in 4 candidates on CPU devices at vector width 4
- Changed mode 29700 to take its keyfile hash as 64 hex characters that the kernel decodes, so every
  attack mode can supply it. Older potfile entries still count as cracked and show as $HEX[...]

## Backends: OpenCL, tuning and memory

- Fixed Windows HIP comparing runtime versions on the wrong scale
- Fixed OpenCL 1.2 devices needing obsolete atomic and byte-store extension strings, and Beignet
  and Mesa version strings triggering an old-driver rejection
- Fixed OpenCL C standard selection and too-old diagnostics using the platform version instead of
  the device version
- Fixed optimized rule kernels not starting on Apple Silicon OpenCL at vector width 2. Rule helpers
  are now kept out of line, as Metal already does
- Fixed OpenCL work sizes not respecting each device's first-dimension limit
- Fixed shared tuning values not respecting each device's own acceleration, thread and batch limits,
  including lower memory available on display-attached cards
- Fixed OpenCL 1.2 platforms not compiling static file-scope data as OpenCL C 1.2
- Fixed kernel cache writes not using a temporary file and atomic rename, so another process
  could read a partially written kernel
- Fixed unparseable OpenCL driver versions disabling the device rather than producing one warning
- Fixed oversized acceleration pinned by a tuning row dropping the device. It is now reduced to fit
  device memory after other tuning choices are tried
- Fixed autotune mishandling one-thread kernels and misaligning thread steps with wavefronts
- Fixed scrypt and Argon2 memory checks underflowing into enormous allocations when available memory
  is below the reserve
- Fixed OpenCL spill estimates inspecting "aux1" for every slot instead of the correct auxiliary
  kernel
- Fixed OpenCL "loop2" launches using the wrong work-item count in modes 14800, 15310, 15910, 27500
  and 27600
- Fixed per-work-item buffers not accounting for rounded vectorized launch sizes
- Fixed disabling a mode's JIT cache also disabling shared, Markov or amplifier caches
- Fixed failed worker creation not running that work on the calling thread, and failed cracking,
  monitor or outfile-check threads being joined uninitialized rather than reported
- Fixed module-generated tuning rows not applying their "Vector_Width" column
- Fixed PoCL builds without LLVM, including remote-device builds, being rejected as outdated
- Fixed NVIDIA devices below compute capability 3.2 receiving unsupported funnel-shift instructions
- Fixed devices with hash lists above a single OpenCL allocation limit failing rather than being
  skipped with the required buffer size and the device limit
- Fixed explicit device selection under "--stdout" not keeping the requested device when an
  OpenCL CPU is also present
- Fixed device listing with "-I" ignoring the type filter set by "-D"
- Fixed autotune running some kernels over an empty password buffer when it had nothing to tune,
  which kept mode 10700 with -O in autotune indefinitely and crashed modes 26900 and 27300 under an
  association attack on a single salt

## Backends: Metal and resource lifecycle

- Fixed CUDA benchmarks not releasing register-spill allocations between modes
- Fixed leaks in NVRTC and HIPRTC options, module JIT option strings, an autotune event and 2 Metal
  strings
- Fixed Metal failing to build larger kernels, especially SHA-512 modes, by using size optimization
- Fixed Metal not releasing per-launch placeholder buffers and per-device pipeline objects
- Fixed hashcat ending the run when the Metal version cannot be read. It now disables Metal and
  continues with available OpenCL devices
- Fixed Metal pipeline compilation crashing on macOS Tahoe at maximum concurrency
- Fixed the AMD "V_PERM_B32" probe reading an unprobed slot instead of reusing the neighboring
  device's result by its actual index
- Fixed HIP setting blocking synchronization flags only on the first AMD GPU instead of after
  selecting each one
- Fixed backend sessions not closing after startup failures outside benchmarks
- Fixed CUDA context creation and cleanup not using the correct threads and device contexts

## Backends: bridges and hardware monitoring

- Fixed mode 74000 not finding its Rust library in hashcat's shared folder, which prevented runs
  from other working directories and from installed builds
- Fixed bridged-mode autotune measuring an empty loop instead of actual bridge work
- Fixed bridge units not keeping their own tuning results when width or speed differs
- Fixed wide bridge buffers not sizing for acceleration in waves, where an undersized buffer could
  cause an illegal memory access. The "-n" option now counts waves, and bridge speed output labels
  the value "Accel"
- Fixed bridged modes ignoring "-d" and failing to report nonexistent device numbers
- Fixed choosing both Metal and OpenCL devices with "-d" silently disabling Metal
- Fixed runs succeeding if every device is lost, including during benchmarks
- Fixed values above the default 1024 for "-u" being rejected when the mode supports them
- Fixed bridged modes not honoring "-n" when their candidate limit exceeds 1024
- Fixed CUDA installed without an NVIDIA GPU, or HIP without an AMD GPU, causing a backend
  initialization error
- Fixed benchmarking all modes with "-b --benchmark-all" crashing at the first mode needing a
  bridge, where its hooks were called before the required bridge was loaded
- Fixed hardware monitoring with "-Y 4" not printing one set of readings per physical card
- Fixed monitoring probing unsupported sensors, using wrong vendor handles, and omitting bridge
  units
- Fixed HIP property errors not naming the affected device or reporting the right operation
- Fixed outdated-driver warnings not naming the actual Intel, AMD, NVIDIA or Apple vendor
- Fixed device information from "-I" listing every bridge unit instead of physical devices
- Fixed kernel cache keys not including source content, which kept modified kernels from recompiling
- Fixed Apple IOKit initializing more than once, causing an SMC connection and IOReport leak
- Fixed AMD GPUs without a sysfs hwmon directory printing repeated bare
  "First_file_in_directory() failed" errors. They now get one named warning, then hardware
  monitoring is disabled
- Fixed AMD sysfs sensor reads spinning on a full CPU core instead of stopping on EBUSY
- Fixed failed "/proc/stat" reads appearing as valid 0% CPU utilization
- Fixed Intel xe GPU temperature monitoring not reading "temp2_input" when needed
- Fixed one throttling GPU producing unstable warnings across its virtual devices
- Fixed failed Apple power readings showing 0 watts instead of no value
- Fixed the macOS GPU utilization sensor reporting a failed read as 0 percent. Its return type is
  int and its caller tests for -1, but it returned true or false, so a registry it could not read
  came back as a valid reading and the sensor stayed enabled to repeat it
- Fixed the macOS GPU power sensor printing a wattage it had not measured. The first sample divided
  the energy counter by the machine's uptime, giving an average since boot, a counter that reset or
  read as zero wrapped the unsigned subtraction into an enormous figure, and a GPU with no energy
  counter showed a flat 0 mW

## Attack modes and candidates

- Fixed candidate output under "--stdout" not encoding line endings as one "$HEX[...]" line
- Fixed 27 InsidePro-specific lines in "rules/InsidePro-HashManager.rule" that hashcat previously
  skipped or interpreted differently
- Fixed random rule seeds not affecting "-g" outside Windows, where every run produced the same
  rules
- Fixed 3 attack-mode 9 paths not capping work items at the salt count, allowing out-of-bounds reads
  that could abort a run on a small hash list
- Fixed bridged association modes not using each candidate's salt. Modes 70000, 73000 and
  74000 recovered only one hash, while 70100 and 70200 did not handle differing costs
- Fixed 2 large rule files reporting false completion after 64k candidates
- Fixed queued work or the restore file being lost when a checkpoint is cancelled after a device
  stops. Restore positions past keyspace no longer wrap to a huge remaining count
- Fixed rejected words under "--slow-candidates" shifting positions or reusing stale candidates.
  Attack-mode 1 now applies case and encoding conversion before size checks
- Fixed mask-file lines with all 8 custom charsets reusing the previous mask
- Fixed the Danish keyboard layout, and reject empty or ambiguous mapping files before an attack
  starts
- Fixed host title-case and memory rules not matching GPU behavior, and the "-g" option omitting 9
  parameterless rules
- Fixed candidate output under "--stdout" not reporting full-disk and closed-pipe errors
- Fixed stdin lines longer than the reader buffer not being discarded in full
- Fixed pure-kernel "-a 7" and loaded rulesets leaking file handles and buffers
- Fixed attack-mode 9 accepting "--keyspace" and "--total-candidates" and then treating the hash
  file as a wordlist
- Fixed candidate output under "--stdout" not preserving order. It now uses one device, while
  cracking runs still use all selected devices
- Fixed attack mode 9 reading past the end of the salt or esalt array in modes 6231, 6232, 6233,
  8000, 22100 and 33400, which could make the run fail at autotune or self-test
- Fixed the 51 VeraCrypt modes not building their kernels under attack mode 9

## Hash lists, potfile and outfile

- Fixed combinator and hybrid output truncating plaintexts at 256 characters
- Fixed attack-mode 7 writing invalid outfile records for candidates longer than 256 bytes
- Fixed LM display with "--show" mishandling hashes with an unusable right half and pairing split
  halves incorrectly
- Fixed outfile checks not protecting digest counters from cracking-thread races
- Fixed induction reading an undeletable dictionary forever instead of stopping and reporting it
- Fixed induction rescans and loopback rounds not releasing scanned paths, filenames and the
  persistent 4 KB buffer
- Fixed slow-candidate attacks not reporting crack positions in the full keyspace, including in
  "--outfile-format 4"
- Fixed potfile, outfile, loopback, logfile and stdout writes not honoring file lock failures
- Fixed potfile and debug output warning on every crack when a filesystem does not support locking,
  instead of warning once
- Fixed hash-list format detection not needing more than half of the scanned lines to match before
  interpreting a file as pwdump, passwd or shadow
- Fixed hash-list format detection picking a format other than the one matching the most lines
- Fixed "--left" output of modes 9710, 9810, 10410 and 29700 ending each hash with a separator,
  which hashcat could not load again. These modes also ignored "--outfile-format"
- Fixed module 26900 dropping trailing zero bytes of the engine ID from every hash it printed, so
  cracked hashes in the outfile and potfile did not match the hash that was loaded
- Fixed loading a large potfile taking hours for modes with a large esalt or hook salt, such as
  BitLocker, 7-Zip, KeePass and WinZip, which cleared it for every line of the potfile

## Brain

- Fixed brain session hashes overflowing at 32 bits
- Fixed brain attack identities not including "--skip", which left partial and full runs sharing one
  identity
- Fixed the brain server not saving databases on "SIGTERM" and not flushing redirected logs after
  each line
- Fixed brain clients not stopping with the host and port named when the server cannot be reached
- Fixed brain session whitelists crashing on values that match no session
- Fixed attack-mode 0 brain clients launching short batches after another client's reservation, and
  "-S" option clients in attack-modes 1 and 3 counting reserved keyspace twice
- Fixed empty brain attack databases reporting enormous read or write sizes

## Interface and status

- Fixed "--bitmap-max" accepting values above 28 instead of producing an error
- Fixed bitmap overflow warnings suggesting a higher "--bitmap-max" when that cannot select a
  larger table
- Fixed the startup "Bitmaps" row reporting a rotation count for removed shifts
- Fixed runtime limits not stopping "--stdout" runs
- Fixed final status and "hashinfo_t" allocations not being released correctly between rounds
- Fixed the "POSIXLY_CORRECT" environment variable making hashcat pass its options into the attack
  arguments
- Fixed candidate output writing diagnostics into the "--stdout" stream
- Fixed speed estimates under "--speed-only" not using the full bitmap for large hash lists
- Fixed progress estimates under "--progress-only" ignoring bitmap settings and reporting the wrong
  progress step for large hash lists
- Fixed speed estimates under "--progress-only" not using all base-word batches, which severely
  understated rates on fast attacks
- Fixed messages from concurrent threads overwriting one another, which a protected formatting
  buffer now prevents
- Fixed the "No devices found/left." message not explaining device removals or bridge units without
  a physical device
- Fixed invalid "--backend-devices-virthost" values not naming the missing device number
- Fixed help and brain documentation examples using the nonexistent "rules/best64.rule" instead of
  "rules/best66.rule"
- Fixed hash information not naming the kernel type for modes 14500, 14600, 16500, 16501 and 24600,
  which select it from the hash
- Fixed idle devices showing stale speed, ETA or candidates instead of 0 H/s and "[Idle]"
- Fixed status and hash-list progress rounding to 100.00% before completion or 0.00% after work has
  started
- Fixed "--status-json" writing invalid JSON for bridged hash modes, because their device entry was
  never closed
- Fixed the dictionary cache summary reporting its read speed 2.4 percent too high

## Windows

- Fixed Windows paths and arguments losing Unicode, which broke install paths, masks, rules, PID
  files, tuning files and potfiles
- Fixed libraries loaded by name being searched in the working directory. Libraries beside
  "hashcat.exe" still load
- Fixed mode 23800 needing "libstdc++-6.dll" or "libgcc_s_seh-1.dll" on "PATH" in release and
  MSYS2 builds
- Fixed Windows file locking letting 2 processes interleave potfile writes
- Fixed Windows threads not using the right entry-point width or releasing joined handles,
  including host hooks in mode 11600
- Fixed Python plugins failing to load with bundled runtimes other than 3.12
- Fixed mode 74000's "generic_hash.dll" not including Windows version information, which caused
  antivirus false positives
- Fixed console messages not using UTF-8, which required "chcp 65001"
- Fixed stderr colors targeting stdout's console instead of stderr's
- Fixed hashcat locating shared files from the working directory rather than its executable path,
  which kept it from starting in other working directories
- Fixed UNC install paths leaving kernel include definitions empty, as hashcat no longer puts the
  install path inside a "-D" value
- Fixed CUDA not receiving "OpenCL/inc_*" headers in memory, which broke kernel builds when the
  install path contains non-ASCII characters

## Build and packaging

- Fixed package archives not using the built binary's version, including for development commits
- Fixed builds with "DEBUG=2" not linking with AddressSanitizer
- Fixed failed build steps not removing partial output, which kept later "make" runs from
  rebuilding it
- Fixed the "make linux" target not linking modules, bridges and feeds against the Linux core
- Fixed the build not finding Rust libraries when "CARGO_TARGET_DIR" is set
- Fixed argon2id and scrypt bridges failing to build with "-march=native" where the compiler
  rejects it, on DragonFly BSD and affected hypervisors
- Fixed the tab-completion installer not finding the repository root, and installing completion for
  root rather than the invoking user when it reruns itself under "sudo"
- Fixed the "qsort_r()" conflict and a "cpuset" warning in NetBSD builds
- Fixed an install with a different "PREFIX" not rebuilding paths tied to the build prefix
- Fixed cross compiling for Windows on older Ubuntu LTS releases, whose mingw headers default to a
  Windows version older than Vista. Both Windows builds now target Windows 7

## Tools and tests

- Fixed LUKS extraction printing keyslot names as hashes and treating LUKS2 reencrypt slots as
  password slots
- Fixed edge tests not handling hashes containing a single quote
- Fixed test fields passing through unsafe quoting and "eval" rather than as hex
- Fixed edge tests not telling 43 modules whether the pure or optimized kernel is under test
- Fixed edge tests not passing binary-container hashes for modes 5200 and 9000 correctly or
  accepting one-character mode 99999 hashes
- Fixed multi-hash tests not verifying each hash/plaintext pair. Edge tests now read cracks
  separately from stdout warnings
- Fixed test modules 28504 and 30904 generating no P2WPKH hashes from uncompressed keys, and mode
  30906's password limit not covering its vectors
- Fixed the test installer using an incompatible "pycryptoplus" package. It now verifies Python
  dependencies after installing them
- Fixed the test installer not recognizing multi-digit pyenv patch versions such as 3.14.10
- Fixed test modules 14400 and 15000 not using the right password-length budget, and the mode 25700
  oracle not handling non-ASCII bytes as unsigned
- Fixed VeraCrypt boot tests not covering 18 hash types, including the 3 required Streebog boot
  containers
- Fixed edge tests passing when a mode defines no kernel type
- Fixed MetaMask Mobile extraction leaving out "rounds=" when a vault uses other than 5000
  iterations, which kept mode 31900 from cracking it
- Fixed APFS extraction using a checkpoint block as a container superblock without checking NXSB
  magic, and failing to skip containers without one
- Fixed APFS extraction not reading keybag records by the header's count and lengths, so stale
  records in unused block space could be read

* changes v7.1.1 -> v7.1.2

##
## New Algorithms
##

- Added hash-mode: Generic Hash [Bridged: Rust] with the new Rust Bridge
- Added hash-mode: Besder Authentication MD5

##
## Improvements
##

- CRC Libraries: CRC restructure
- GOST Libraries: GOST R 34.11-94 restructure
- SAP CODVN H: Raised the maximum salt length for hash-mode 35000 (isSHA512) from 16 to 192

##
## Bugs
##

- Argon2 Libraries: fixed call to vector helper functions when only using scalar buffers
- Argon2 Libraries: fixed esalt access pattern across Argon2, LUKS2, and KeePass KDBX4 kernels
- Argon2 Libraries: fixed false negatives for password and salt combinations longer than 64 characters
- Folders: fixed hc_mkdir_rec(), which was not creating directories correctly
- Status View: fixed broken backward compatibility in machine-readable mode introduced in v7.1.0
- sha224(sha224($pass)) and sha224(sha1($pass)): Fix hash category as unsalted

* changes v7.1.0 -> v7.1.1

##
## Improvements
##

Docker: Add initial support for AMD GPUs when running Hashcat inside Docker using HIP and OpenCL
Hardware Monitor: Suppress fan speed warnings for unified memory setups (typically internal GPUs)
Testing Framework: Enable hardware monitor to improve testing of memory-heavy algorithms
Unit tests: Updated install_modules.sh to use an external module for Digest::MD6

##
## Bugs
##

- Fixed multi-hash handling in LUKS2 and KeePass (KDBX4), while single-hash remained unaffected

* changes v7.0.0 -> v7.1.0

##
## New Algorithms
##

## Endpoint

- Added hash-mode: AS/400 DES
- Added hash-mode: AS/400 SSHA1
- Added hash-mode: Blockchain, My Wallet, Legacy Wallets
- Added hash-mode: Cisco-ISE Hashed Password (SHA256)
- Added hash-mode: Keepass4
- Added hash-mode: SAP CODVN H (PWDSALTEDHASH) isSHA512
- Added hash-mode: sm3crypt $sm3$, SM3 (Unix)

## Primitives, KDFs, Libraries

- Added hash-mode: BLAKE2b-256
- Added hash-mode: MD6 (256)

## Constructs

- Added hash-mode: BLAKE2b-256($pass.$salt)
- Added hash-mode: BLAKE2b-256($salt.$pass)
- Added hash-mode: sha224($pass.$salt)
- Added hash-mode: sha224($salt.$pass)
- Added hash-mode: sha224(sha1($pass))
- Added hash-mode: sha224(sha224($pass))

##
## Improvements
##

- Attack-Modes: Use 64-bit counters for amplifier keyspace
- Host Memory: Update method to query free host memory using /proc/meminfo when available
- Docker: Add initial support for running hashcat inside Docker
- Device Memory: Warn instead of waiting on high GPU memory usage
- Backends: Enhanced AMD Windows OpenCL and HIP compatibility for legacy models
- Rules: Add early syntax check for -j and -k rules
- Device Memory: Do not disable hwmon interface by default in speed-only and progress-only mode
- JSON output: Refactor Bridge unit reporting for clarity
- Backends: Ignore devices from Microsoft OpenCL D3D12 platform
- Building: Add MAINTAINER_MODE flag to disable hardcoded CPU optimization flags
- Bash: Add missing parameters to bash completion script
- Dependencies: Downgraded unrar source from 6.2.7 to 6.0.5
- Benchmark: Update default hash-mode selection
- Libraries: DES and Blowfish restructure
- Building: Add initial support for OpenBSD and DragonflyBSD

##
## Bugs
##

- Fix broken JSON formatting when using the --status-json flag
- Fix issue where -k single rules were ignored when used with -a 1 and -S

##
## Python Bridge
##

- Fix unsalted hashlist support
- Fix the esalt structure, it was too large
- Improve support from 1:1 password-to-hash to 1:N password-to-hashes
- Improve stand-alone debugging of Python Bridge stubs
- Improve salt/esalt debugging of Python Bridge stubs
- Enable potfile output by default for -m 73000 and 72000

##
## Other changes
##

- Argon2: Add argon2_init() wrappers to support private address space
- Change hash-category for hash-modes 25600, 25800, 28400 and 30600 to HASH_CATEGORY_RAW_HASH_SALTED
- Suppress optimization advice in final approach mode
- Backend: Split backend_session_begin() into smaller compute-runtime specific functions
- Sanity check: Abort if a custom-charset is defined on the command line and a mask file is used
- Building: Disable Argon2 optimized path on RISC-V
- Shared: improved 32-bit and 64-bit add and multiply overflow helper functions

* changes v6.2.6 -> v7.0.0

##
## New Algorithms
##

## Primitives, KDFs, Libraries

- Added hash-mode: AES-GCM
- Added hash-mode: Argon2 (Argon2i/d/id)
- Added hash-mode: BLAKE2s-256
- Added hash-mode: CAST
- Added hash-mode: PBKDF1-SHA1
- Added hash-mode: RC4-40/72/104/128
- Added hash-mode: RIPEMD-320
- Added hash-mode: ShangMi 3 (SM3)
- Added hash-mode: HMAC-BLAKE2S (key = $pass)
- Added hash-mode: HMAC-RIPEMD160 (key = $pass)
- Added hash-mode: HMAC-RIPEMD160 (key = $salt)
- Added hash-mode: HMAC-RIPEMD320 (key = $pass)
- Added hash-mode: HMAC-RIPEMD320 (key = $salt)

## Bridged

- Added hash-mode: argon2id [Bridged: reference implementation + tunings]
- Added hash-mode: scrypt [Bridged: Scrypt-Jane ROMix]
- Added hash-mode: scrypt [Bridged: Scrypt-Yescrypt]
- Added hash-mode: Generic Hash [Bridged: Python Interpreter free-threading]
- Added hash-mode: Generic Hash [Bridged: Python Interpreter with GIL]

## Endpoint

- Added hash-mode: 1Password, mobilekeychain (1Password 8)
- Added hash-mode: Adobe AEM (SSPR, SHA-256 with Salt)
- Added hash-mode: Adobe AEM (SSPR, SHA-512 with Salt)
- Added hash-mode: Anope IRC Services (enc_sha256)
- Added hash-mode: Apache Shiro 1 SHA-512
- Added hash-mode: BestCrypt v4 Volume Encryption
- Added hash-mode: Bisq .wallet (scrypt)
- Added hash-mode: Bitcoin raw private key (P2PKH), compressed
- Added hash-mode: Bitcoin raw private key (P2PKH), uncompressed
- Added hash-mode: Bitcoin raw private key (P2SH(P2WPKH)), compressed
- Added hash-mode: Bitcoin raw private key (P2SH(P2WPKH)), uncompressed
- Added hash-mode: Bitcoin raw private key (P2WPKH, Bech32), compressed
- Added hash-mode: Bitcoin raw private key (P2WPKH, Bech32), uncompressed
- Added hash-mode: Citrix NetScaler (PBKDF2-HMAC-SHA256)
- Added hash-mode: CubeCart (whirlpool($salt.$pass.$salt))
- Added hash-mode: DANE RFC7929/RFC8162 SHA2-256
- Added hash-mode: Dogechain.info Wallet
- Added hash-mode: Domain Cached Credentials 2 (DCC2), MS Cache 2, (NT)
- Added hash-mode: Domain Cached Credentials (DCC), MS Cache (NT)
- Added hash-mode: Empire CMS (Admin password)
- Added hash-mode: ENCsecurity Datavault (MD5/keychain)
- Added hash-mode: ENCsecurity Datavault (MD5/no keychain)
- Added hash-mode: ENCsecurity Datavault (PBKDF2/keychain)
- Added hash-mode: ENCsecurity Datavault (PBKDF2/no keychain)
- Added hash-mode: GPG (AES-128/AES-256 (SHA-256($pass)))
- Added hash-mode: GPG (AES-128/AES-256 (SHA-512($pass)))
- Added hash-mode: GPG (CAST5 (SHA-1($pass)))
- Added hash-mode: IPMI2 RAKP HMAC-MD5
- Added hash-mode: Kerberos 5, etype 17, AS-REP
- Added hash-mode: Kerberos 5, etype 18, AS-REP
- Added hash-mode: Kremlin Encrypt 3.0 w/NewDES
- Added hash-mode: mega.nz password-protected link (PBKDF2-HMAC-SHA512)
- Added hash-mode: MetaMask Mobile Wallet
- Added hash-mode: MetaMask Wallet (short hash, plaintext check)
- Added hash-mode: Microsoft Online Account (PBKDF2-HMAC-SHA256 + AES256)
- Added hash-mode: MS SNTP
- Added hash-mode: NetIQ SSPR (MD5)
- Added hash-mode: NetIQ SSPR (PBKDF2WithHmacSHA1)
- Added hash-mode: NetIQ SSPR (PBKDF2WithHmacSHA256)
- Added hash-mode: NetIQ SSPR (PBKDF2WithHmacSHA512)
- Added hash-mode: NetIQ SSPR (SHA1)
- Added hash-mode: NetIQ SSPR (SHA-1 with Salt)
- Added hash-mode: NetIQ SSPR (SHA-256 with Salt)
- Added hash-mode: NetIQ SSPR (SHA-512 with Salt)
- Added hash-mode: PDF 1.3 - 1.6 (Acrobat 4 - 8) w/ RC4-40
- Added hash-mode: Perl Mojolicious session cookie (HMAC-SHA256, >= v9.19)
- Added hash-mode: QNX 7 /etc/shadow (SHA512)
- Added hash-mode: RACF KDFAES
- Added hash-mode: RC4 104-bit DropN
- Added hash-mode: RC4 40-bit DropN
- Added hash-mode: RC4 72-bit DropN
- Added hash-mode: RSA Security Analytics / NetWitness (sha256)
- Added hash-mode: SecureCRT MasterPassphrase v2
- Added hash-mode: Veeam VBK
- Added hash-mode: WBB4 (Woltlab Burning Board) Plugin [bcrypt(bcrypt($pass))]

## Constructs

- Added hash-mode: bcrypt(sha256($pass)) / bcryptsha256
- Added hash-mode: bcrypt-sha256 v2 bcrypt(HMAC-SHA256($pass))
- Added hash-mode: md5($salt1.$pass.$salt2)
- Added hash-mode: md5($salt1.sha1($salt2.$pass))
- Added hash-mode: md5($salt1.strtoupper(md5($salt2.$pass)))
- Added hash-mode: md5($salt.md5($pass).$salt)
- Added hash-mode: md5(md5($pass.$salt))
- Added hash-mode: md5(md5($salt).md5(md5($pass)))
- Added hash-mode: md5(md5(md5($pass)).$salt)
- Added hash-mode: md5(md5(md5($pass).$salt1).$salt2)
- Added hash-mode: md5(md5(md5($pass.$salt1)).$salt2)
- Added hash-mode: md5(sha1($pass.$salt))
- Added hash-mode: md5(sha1($salt.$pass))
- Added hash-mode: md5(sha1(md5($pass)))
- Added hash-mode: sha256(sha256($pass.$salt))
- Added hash-mode: sha512(sha512($pass).$salt)
- Added hash-mode: sha512(sha512_bin($pass).$salt)

## Backends

- New: HIP (an OpenCL alternative for AMD on both Linux and Windows)
- New: Metal (an OpenCL alternative on macOS, supporting both ARM and x64)
- New: Microsoft OpenCL D3D12 platform
- Improved handling of devices with unified memory (iGPU, APU, etc.)
- Switched all asynchronous and non-blocking calls to synchronous and blocking ones. This prevents race conditions, such as the one fixed in the previous commit, without any performance impact.
- Revisited the Apple OpenCL 2 GiB bug (still present)
- Added support for longer OpenCL device names
- New: Hardware Monitor support for AMD GPUs via sysfs (Linux)
- New: Hardware Monitor support for CPUs via sysfs (Linux)
- New: Hardware Monitor support for Intel GPUs via sysfs (Linux)

##
## Features
##

## Assimilation Bridge

- Added Assimilation Bridge (See forum post or added documentation for more details)
- Virtual Devices
- Embedded Python interpreter
- Comprehensive documentation

## Docker Support

- Add Dockerfiles for binary compilation
- Compiles both Linux and Windows binaries
- Used to produce official releases for hashcat.net
- Includes Dockerfiles for Ubuntu 20.04 and Arch-based environments
- Supports optional user patches via docker/patches/

## User Features

- Increased custom charset count from 4 to 8
- Added XML support for KeePass keyfiles
- Added true UTF-8 password support for RAR3
- Added JSON format support for backend-info, hash-info, status-screen, progress-info, speed-info, and outfiles
- Added --increment-inverse option
- Added new charset files: Romanian, Russian
- Added support for using --debug-mode in attack-mode 9 (Association Attack)
- Added display of password length mininum and maximum in the Kernel.Feature status line
- Added new feature (-Y) that creates N virtual instances for each device in your system at the cost of N times the device memory consumption
- Added new feature (--bypass-delay / --bypass-threshold) that skips an attack if it does not produce enough cracks per $timeframe
- Added options --benchmark-min and --benchmark-max to set a hash-mode range to be used during the benchmark
- Added option --total-candidates to provide the total candidate count for an attack instead of the internal "--keyspace" value
- Added option --backend-devices-keepfree to configure X percentage of device memory available to keep free
- Added options --benchmark-min and --benchmark-max to set a hash-mode range to be used during the benchmark
- Added the 'edge' test type to test.pl and the corresponding tool test_edge.sh

## Developer Features

- Added support to the tokenizer for multiple signatures per hash mode
- Added option OPTS_TYPE_THREAD_MULTI_DISABLE: allows plugin developers to disable scaling the candidate batch size based on device thread count. Useful for very slow algorithms that parallelize differently
- Added options OPTI_TYPE_SLOW_HASH_DIMY_INIT/LOOP/COMP: enables 2D kernel launches for slow hashes. Y dimension must be set via salt->salt_dimy
- Removed deprecated attribute: OPTS_TYPE_MAXIMUM_ACCEL
- Added KERNEL_FA: a new kernel macro to inform the JIT compiler of thread limits for thread-optimized kernels
- Introduced hashes_init_stage5(), which now calls module_extra_tmp_size(). Self-test hash is fully initialized at this stage
- Improved kernel compiler behavior using hints for register spilling, max threads, and warnings for excessive thread counts
- Improved mapping of functions like hc_bytealign_be(), hc_swap32(), etc., using intrinsics or inline assembly to match hardware capabilities
- Re-enabled USE_BITSELECT, USE_ROTATE, and USE_SWIZZLE for OpenCL
- Improved get_opencl_kernel_wgs() to better derive base values from compute runtimes before autotuning
- Removed --device-as-default-execution-space from nvrtc for hiprtc compatibility. Re-added __device__ to DECLSPEC
- Added support for funnelshift and warp shuffle instructions, including runtime detection and kernel disabling if unsupported
- Added autotune attribute "overtune_unfriendly": allows overtuning thread count under specific conditions
- Added next_power_of_two() and moved both next_power_of_two() and previous_power_of_two() into shared utilities
- Removed default 'rocm-smi' call from benchmark_deep.pl to prevent skewed results
- Reduced default runtime in benchmark_deep.pl due to improved benchmark accuracy
- Redesigned "4-buffer" strategy to prevent excessive memory use from naive division by four, especially in high scrypt configs (e.g., 256k:8:1)
- Added CPU SIMD detection at runtime, relevant for bridge plugins
- Status Code: added specific return code for self-test failure (-11)
- Prepared an enum type to represent final return codes
- Added hcmalloc_aligned() and hcfree_aligned()

## Test framework

- Added new offline testing framework (Test-Edge)
- Added GitHub Actions support for automated build scripts
- Completed large-scale test runs with rarely used combinations (e.g., attack-mode 1 with vector size 16 in ChaCha20)
- Fully reworked install_modules.sh script to automate installation of required Perl and Python modules for the test framework
- Removed many outdated and unstable warnings from existing plugins
- Created repositories to maintain discontinued Perl modules used in the testing framework
- Improved unit test for -m 8300: optimized mode now supports longer passwords, domain names, and salts; both modes enforce a domain name limit of 63 characters
- Fixed SNMPv3 unit test to ensure passwords are at least 8 characters, as required by RFC 3414
- Removed PHP from unit tests entirely
- Added workaround for Net::SSLeay on Apple
- Removed Crypt::GCrypt from the test suite
- Updated install_modules.sh to use cpanm instead of cpan
- Fixed invalid module_constraints for hash-modes 15000, 11100, 10100, 8700, 7801, 7800, 20712, 14400, 21100, 400, and 3100

## Extraction tools

- Added: apfs2hashcat.py
- Added: bisq2hashcat.py
- Added: bitlocker2hashcat.py
- Added: bitwarden2hashcat.py
- Added: cache2data2hashcat.py
- Added: cryptoloop2hashcat.py
- Added: exodus2hashcat.py
- Added: gitea2hashcat.py
- Added: keybag2hashcat.py
- Added: kremlin2hashcat.py
- Added: lastpass2hashcat.py
- Added: luks2hashcat.py
- Added: metamask2hashcat.py
- Added: radmin3_to_hashcat.pl
- Added: shiro1-to-hashcat.py
- Added: truecrypt2hashcat.py
- Added: veeamvbk2hashcat.py
- Added: veracrypt2hashcat.py
- Added: virtualbox2hashcat.py
- Added: vmwarevmx2hashcat.py
- Promoted extraction tools to be installed alongside hashcat when installing system-wide

##
## Improvements
##

## Feature Improvements

- Refactored internal code for Hardware Monitor
- Improved accuracy of benchmark mode (-b)
- Gracefully handle corrupted .gz archives
- Changed benchmark mask to prevent failures during UTF-8 to UTF-16 conversion
- Implemented missing XZ file seeking functionality
- Added workaround to eliminate internal runtime memory leaks

## Rule Engine Improvements

- Added support for character class rules
- Improved many existing rules by removing duplicates and adding new operators, including character class support
- Fixed existing rules to work correctly with the new Purge (@) rule handling
- Updated -j / -k validation to check for ':' instead of NULL
- Optimized the following rule files: generated.rule, generated2.rule, dive.rule, T0XlCv2.rule, T0XlC-insert_00-99_1950-2050_toprules_0_F.rule, T0XlC-insert_space_and_special_0_F.rule, d3ad0ne.rule
- Added new rule files: T0XlC_3_rule.rule, T0XlC_insert_HTML_entities_0_Z.rule, T0XlCv2.rule, stacking58.rule, top10_2025.rule

## Existing Plugin and Crypto Library Improvements

- Improved ASN.1 checks for RSA/DSA/EC/OpenSSH private key modules (22911, 22921, 22931, 22941, 22951)
- AuthMe: updated token length
- VeraCrypt and TrueCrypt: general code cleanup with backported fixes and improvements across both legacy and new modes
- Bitwarden: increased iteration limit
- NSEC3: added support for salt length up to the standard limit; updated max domain and salt lengths in pure kernel to 256
- GOST R 34.11-94: fixed false negative in optimized mode in attack mode 3 for passwords of length 16 or 32
- Fixed hash encoding issue in WinZip format
- Renamed multiple CAST cipher defines to match C++ language naming conventions
- Recommended using --keep-guessing for -m 20510
- Fixed false positive and false negative in -m 21800 multihash mode, where only the first hash was marked as cracked regardless of which was actually cracked (affected only beta versions)
- Fixed encoder bugs in hash-modes 29920 and 29940, where the output string was not properly terminated
- Electrum: added support to detect more private key prefixes
- Metamask: added support for dynamic iteration counts
- TOTP: added support for multiple codes
- Blake2: removed redundant casts and corrected parameter types for FINAL value
- VeraCrypt: set minimum loop count to 250 for all modes with PIM brute-force support
- Fixed thread count issue in -m 10700 on NVIDIA OpenCL (4 bytes were lost per thread for unknown reasons)
- Fixed missing entries in switch_buffer_by_offset_8x4_le_S()
- Applied OPTS_TYPE_NATIVE_THREADS tuning to many hash modes after benchmarking: 770x, 780x, 8900, 9000, 9300, 14000, 14900, 15700, 22700, 2300x, 23900, 24000, 25000, 25100, 25200, 26700, 26800, 26900, 27300, 27700, 28200, 29800, 70000, 70100, 70200, 72000, 73000
- Applied OPTI_TYPE_REGISTER_LIMIT tuning to many hash modes after benchmarking: 20, 1300, 1500, 1800, 6400, 6800, 7700, 7900, 8200, 8300, 10700, 12400, 1375x, 1376x, 14800, 14900, 15600, 16300, 16600, 16700, 16900, 18100, 20800, 21300, 21500, 21700, 22300, 2292x, 2294x, 23400, 23600, 23800, 24200, 24420, 25500, 25900, 26000, 26100, 26600, 26700, 26800, 26900, 27300, 27400, 27500, 27600, 2945x, 2946x
- Improved shared memory handling in -m 10700: removed the 256-thread hard limit and now adapt based on device memory pool
- Check UnpackSize to reduce false positives in hc_decompress_rar
- Added support for zero-length salts in Electrum $4 and $5 formats
- Switched Metamask hashmodes to use TOKEN_ATTR_OPTIONAL_ROUNDS
- Added new hashmodes 26620 and 26630 with dynamic iteration counts
- Added new function count_bits_32() in inc_common.cl
- Simplified module_hash_decode() in -m 32700
- Removed OPTS_TYPE_HASH_COPY from -m 19210
- Fixed missing AES_GCM_decrypt implementation in inc_cipher_aes-gcm.cl
- Optimized same-salt cracking in -m 7400 and -m 500 by marking them as compatible with OPTS_TYPE_DEEP_COMP_KERNEL
- Reduced false positive reports in -m 21800
- WPA: allow users to override nonce_error_corrections even if message_pair suggests otherwise
- Updated Flask session payload max length to 2047
- Added IV support to LastPass hash-mode (-m 6800)
- VeraCrypt: added support for keyfiles and keyfile cascades

## User Interaction Improvements

- Added additional backend information with the new -II parameter
- Set --benchmark to true automatically when --benchmark-all is used
- Improved error message when using --skip/--limit with an invalid attack configuration
- Display the number of base words hashcat expects
- Improved error messages for module_ctx_t validation failures, especially when outdated plugin interfaces are detected
- Added a warning when the user sets a thread count higher than what the runtime recommends (based on available registers and shared memory)
- Silenced selected warning lines when using --quiet
- Added immediate check for --outfile-check-timer
- Adjusted performance warnings for clarity
- Added FAQ link to potfile-related messages
- Increased debug-file flush frequency
- Added [b], [c], and [f] functionality in pause state
- Display all autotune setting changes during benchmark (-b)
- Added support to colorize cracked hashes using --color-cracked
- Display selected warnings only if both --quiet and --machine-readable are false
- Improved salt length reporting in hashconfig output
- Added parameter validation for invalid option combinations:
    - Do not allow --stdout with --slow-candidates
    - Do not allow --show with --restore
    - Do not allow --benchmark with --backend-info
- Display max password length in Kernel.Feature status
- Implemented Windows system information display using -II
- User Options: assigned -H to --hash-info; added detailed output using -HH
- Notify users on startup when backend runtimes and devices are initialized
- Implemented feature request to show non-default session names early at startup
- Warn users that the potfile will not be used during Association Attack mode

##
## Performance
##

- Fully reworked the autotune engine
- Fully reworked scrypt and scrypt-based hash modes (e.g., MultiBit, Electrum)
- Significant speed boost for all QNX hash modes
- Improved performance for all OpenSSH private key modes by reducing the maximum supported password length from 256 to 128
- Reduced JIT compile time by lowering the required C++ standard (C++ is not used)
- Reduced JIT compile time by enabling multithreaded JIT compilation
- DEScrypt Kernel (1500): Improved performance from 950MH/s to 2200MH/s (RX6900XT) on HIP backend by workaround invalid compile time optimizer

## Tuning Database

- Added plugin hook support to generate tuning-db entries on the fly at startup, allowing developers to predict optimal values for kernel-accel and TMTO based on device attributes instead of relying on autotuning
- Updated the list of consumer, mobile, and professional NVIDIA, AMD, and Intel GPUs
- Updated existing vector datatype mappings for NVIDIA
- Added vector datatype support for AMD (previously scalar only)
- Added -m 99999 to Modules_default.hctune

## Memory Management

- Refactored memory management for compute device and host from scratch
- Added automatic downtune support
- Improved free memory detection using low-level API

##
## Bugs
##

- Added verification of token buffer length when using TOKEN_ATTR_FIXED_LENGTH
- Added recovery from rare non-fatal file locking problems
- Added workaround for false positives on 22931
- Fix missing check for -j and -k before writing hashcat.dictstat2 which can lead to false negatives
- Fixed a bug in all SCRYPT-based hash modes with Apple Metal
- Fixed buffer overflow on module_26600.c / module_hash_encode()
- Fixed bug in --stdout that caused certain rules to malfunction
- Fixed bug in --stdout when multiple computing devices are active
- Fixed bug in 18400 module_hash_encode
- Fixed bug in 23800/unrar with Apple Silicon
- Fixed bug in 26900 module_hash_encode
- Fixed bug in 29600 module OPTS_TYPE setting
- Fixed bug in 32600 by adding missing module_jit_build_options
- Fixed bug in 34000 with Metal and OpenCL on Apple
- Fixed bug in Hardware Monitor: prevent disable if ADL fail
- Fixed bug in grep out-of-memory workaround on Unit Test
- Fixed bug in inc_rp_optimized.cl on Apple Intel with Metal
- Fixed bug in input_tokenizer when TOKEN_ATTR_FIXED_LENGTH is used and refactor modules
- Fixed bug in module_constraints and kernel for hash-mode 7800
- Fixed bug in module_constraints and kernel for hash-mode 7801
- Fixed bugs in 3090x kernels which produced false positives
- Fixed bugs in 34100 kernel and inc_luks_aes.cl on Apple Silicon
- Fixed build failed for 10700 optimized with Apple Metal
- Fixed build failed for 13772 and 13773 with Apple Metal
- Fixed build failed for 18400 with Apple Metal
- Fixed build failed for 18600 with Apple Metal
- Fixed build failed for 4410 with vector width > 1
- Fixed build failed for aarch64 (es: rpi)
- Fixed build failure for almost all hash modes that make use of hc_swap64 and/or hc_swap64_S with Apple Metal / Apple Silicon
- Fixed clang identification in src/Makefile
- Fixed debug mode 5 by adding the missing colon between original-word and finding-rule
- Fixed display problem of the "Optimizers applied" list for algorithms using OPTI_TYPE_SLOW_HASH_SIMD_INIT2 and/or OPTI_TYPE_SLOW_HASH_SIMD_LOOP2
- Fixed incompatible pointer types (salt1 and salt2 buf) in 3730 a3 kernel
- Fixed incorrect plaintext check for 25400 and 26610. Increased plaintext check to 32 bytes to prevent false positives.
- Fixed keys extraction in luks2hashcat - now extracts all active keys
- Fixed keys extraction in luks2hashcat - now extracts all LUKS2 keyslots
- Fixed maximum password length in module/test_module of hash-mode 2400
- Fixed maximum password length in module/test_module of hash-mode 2410
- Fixed memory leaks in tuning_db_init in tuningdb.c
- Fixed minimum password length in module of hash-mode 28200
- Fixed minimum password length in module of hash-mode 29800
- Fixed out-of-boundary read when a fast hash defines a kernel_loops_min value higher than the amplifiers provided by the user
- Fixed perl deprecation warnings on test module for 30906
- Fixed race condition in selftest_init on OpenCL with non-blocking write
- Fixed stack buffer overflow in PKZIP modules (17200, 17210, 17220, 17225, 17230)
- Fixed vector datatypes usage for HIP
- Fixed -m 14200 when used in -D1 mode
- Fixed unit tests for hash-modes 20011, 20012, and 20013 (DiskCryptor)
- Fixed XZ file seek operation in hc_fseek()
- Fixed syntax error in vmwarevmx2hashcat
- Fixed bug in Hardware Monitor: prevent disabling if ADL fails
- Fixed bug in --stdout when multiple computing devices are active
- Fixed race condition in selftest_init on OpenCL with non-blocking write
- Fixed division by zero bug in fast hashes caused by hashes->st_salts_buf->salt_iter not being used
- Fixed socket leak in brain_server()
- Fixed incorrect comparison result in sort_pot_orig_line()
- Fixed incorrect comparison result in sort_by_src_len()
- Fixed host buffer overflow when copying rules from host to device
- Handle signed/unsigned PDF permission P value for all PDF hash-modes
- Improved OpenCL function declaration bindings to prevent crashes
- Improve ASN.1 check for RSA/DSA/EC/OpenSSH Private Keys modules (22911, 22921, 22931, 22941, 22951)
- Prevent Hashcat from hanging by checking during startup whether the output file is a named pipe
- Skip chained generated rules that exceed the maximum number of function calls
- Updated benchmark_deep.pl to use ?a?a?a?a?a?a?a instead of ?b?b?b?b?b?b?b to avoid UTF-8 to UTF-16 conversion issues
- Return an error for unsupported arbitrary seek operations
- Solved TODOs in hc_fstat()/filehandling
- Prevented NULL dereference in read_restore() via hcmalloc
- Properly parse maskfiles and escaped question marks

##
## Technical
##

- AMD Driver: Updated requirements for AMD Windows drivers to "AMD Adrenalin Edition" (23.7.2 or later) and "AMD HIP SDK" (23.Q3 or later)
- Alias Devices: Prevents hashcat, when started with x86_64 emulation on Apple Silicon, from showing the Apple M1 OpenCL CPU as an alias for the Apple M1 Metal GPU
- Apple Driver: Automatically enable GPU support on Apple OpenCL instead of CPU support
- Apple Driver: Updated requirements to use Apple OpenCL API to macOS 13.0
- Backend Checks: Describe workaround in error message when detecting more than 64 backend devices
- Backend Info: Added --machine-readable format
- Backend: Added workaround to get rid of internal runtimes memory leaks
- Backend: Splitting backend_ctx_devices_init into smaller runtime-specific functions
- Backend: Updated OpenCL/CUDA/HIP/Metal API's
- Backend: Updated filename chksum format to prevent invalid cache on Apple Silicon when switching arch
- Backend: Updated references of hcmalloc_aligned and hcfree_aligned to the new memory defined functions
- Benchmark: Updated benchmark_deep.pl with OS detection, Apple cache cleaning way and other minor changes
- Brain: Added sanity check and corresponding error message for invalid --brain-port values
- Bridge: Updated references of hcmalloc_aligned and hcfree_aligned to the new memory defined functions
- Building: Support building windows binaries on macOS using MinGW
- Debug: Added -g to build_options if DEBUG >= 1 (only with HIP and OpenCL)
- Dependencies: Added sse2neon v1.8.0 (commit 658eeac)
- Dependencies: Updated LZMA SDK to 24.09
- Dependencies: Updated zlib to 1.3.1
- Dependencies: Updated OpenCL-Headers to v2024.10.24 (commit 265df85)
- Dependencies: Updated unrar source to 6.2.7
- Dependencies: Updated xxHash to 0.8.3 (commit 50f4226)
- Documents: Renamed status_code.txt in exit_status_code.txt and added device_status_code.txt
- Documents: Updated BUILD.md and added BUILD_macOS.md (containing instructions for building windows binaries on macOS)
- HIP Backend: Avoid deprecated functions
- Hardware Monitor: Added current power consumption indicator (only supported on Apple)
- Hardware Monitor: Added hm_get_power_* primitives (only supported on Apple)
- Hardware Monitor: Renamed src/ext_iokit.c to src/ext_iokit.m
- Hardware Monitor: Splitting hwmon_ctx_init function into smaller library-specific functions
- Hardware Monitor: avoid sprintf in src/ext_iokit.c
- Hash-Info: show more details using -HH
- Help: show supported hash-modes only with -hh
- Kernel: Renamed multiple defines in CAST cipher to fit expected naming convention of the C++ language standard
- Makefile: Added -lIOReport into LFLAGS_NATIVE for Apple and moved ext_iokit into OBJS_METAL
- Makefile: prevent make failure with Apple Silicon in case of partial rebuild
- Makefile: updated MACOSX_DEPLOYMENT_TARGET to 15.0
- MetaMask: update extraction tool to support MetaMask Mobile wallets
- Memory: added hc_alloc_aligned and hc_free_aligned
- Memory: renamed hcmalloc_aligned and hcfree_aligned to hcmalloc_bridge_aligned and hcfree_bridge_aligned
- Metal Backend: Added hc_mtlFinish
- Metal Backend: added support to 2D/3D Compute
- Metal Backend: added workaround to prevent 'Infinite Loop' bug when build kernels
- Metal Backend: added workaround to set the true Processor value in Metal devices on Apple Intel
- Metal Backend: allow use of devices with Metal if runtime version is >= 200
- Metal Backend: define USE_BITSELECT and USE_SWIZZLE for Apple Intel
- Metal Backend: disable Metal devices only if at least one OpenCL device is active
- Metal Backend: improved compute workloads calculation
- Metal Backend: improved memory management
- Metal Backend: fixed memory leaks
- Metal Backend: parallelize pipeline state object (PSO) compilation internally
- Metal Backend: Updated hc_mtlCreateBuffer
- Modules: Added OPTS_TYPE_PT_BASE58 in 28501 28502 28503 28504 28505 28506 30901 30902 30903 30904 30905 30906
- Modules: Added module_unstable_warning for 22500, update module_unstable_warning for 10700
- Modules: Added support for non-zero IVs for -m 6800 (Lastpass). Also added `tools/lastpass2hashcat.py`
- Modules: Check UnpackSize to raise false positive with hc_decompress_rar
- Modules: Updated module_unstable_warning
- Open Document Format: Added support for small documents with content length < 1024
- OpenCL Backend: added workaround to set device_available_memory from CUDA/HIP alias device
- OpenCL Backend: Added hc_clCreateBuffer wrapper: hc_clCreateBuffer_pre
- OpenCL Backend: using CL_TRUE with all hc_clEnqueueWriteBuffer() call
- OpenCL Backend: using HC_OCL_CREATEBUFFER macro for buffer allocation and openclMemoryFlags array to configure the memory flags
- Rules: Add support to character class rules
- Rules: Rename best64.rule to best66.rule and remove the unknown section from it
- Scrypt: Increase buffer sizes in module for hash mode 8900 to allow longer scrypt digests
- SecureCRT MasterPassphrase v2: update module, pure kernels and test unit. Add optimized kernels.
- Selftest: rename selftest function to process_selftest and splitting into 3 smaller functions
- Status Code: Add specific return code for self-test fail (-11)
- Types: Added OPTS_TYPE_PT_BASE58 and removed OPTS_TYPE_MAXIMUM_ACCEL in opts_type
- Unicode: Update UTF-8 to UTF-16 conversion to match RFC 3629
- Unit tests: Updated install_modules.sh, test.pl and some test modules (1000, 16000, 31300, 31500, 31600) by removing Text:Iconv and using Encode instead
- Unit tests: Updated install_modules.sh with Crypt::Argon2
- Unit tests: Updated install_modules.sh with Crypt::Passwd::XS, to test suite works also on Apple (ex: 1800)
- Unit tests: Updated install_modules.sh to remove php and Crypt::GCrypt (updated relative test modules)
- Unit tests: Updated install_modules.sh to use an external module for Digest::BLAKE2, due to maintenance being discontinued
- Unit tests: Updated install_modules.sh to use an external module for Digest::GOST, due to maintenance being discontinued
- Unit tests: Updated install_modules.sh to use an external package for pygost, due to not available anymore
- Unit tests: Updated install_modules.sh to use cpanm instead of cpan
- Unit tests: Updated install_modules.sh with Crypt::Argon2
- Unit tests: Updated install_modules.sh with Crypt::Passwd::XS, to test suite works also on Apple (ex: 1800)
- Unit tests: Updated install_modules.sh, test.pl and some test modules (1000, 16000, 31300, 31500, 31600) by removing Text:Iconv and using Encode instead
- Unit tests: Updated test_edge.sh, introducing clean_cache function and fix for 20510 module
- User Options: Added error message when mixing --username and --show to warn users of exponential delay
- User Options: added --metal-compiler-runtime option
- User Options: assigned -H to --hash-info
- User Options: do not allow --slow-candidates (-S) in benchmark mode
- User Options: limit --bitmap-max value to 31

## Workarounds for 3rd party runtimes and libraries

- Added hc_uint4_t to scrypt to work around an Intel OpenCL alignment bug. Intel's runtime does not support vector datatypes mapped to global memory, though they work with local variables
- Revisited all module_unstable_warning entries across all plugins and synchronized them with the current state of driver versions at release time (most warnings have been removed)
- Improved benchmark stability: hashcat no longer creates and destroys context and command queues for each device when switching hash-modes. This avoids GPU memory leaks with clCreateContext, especially on NVIDIA OpenCL

## Documents

- New: hashcat-assimilation-bridge.md
- New: hashcat-assimilation-bridge-development.md
- New: hashcat-python-plugin-quickstart.md
- New: hashcat-python-plugin-requirements.md
- New: hashcat-python-plugin-development-guide.md
- New: BUILD_macOS.md
- New: BUILD_Docker.md
- New: hashcat-example-hashes.md (auto-generated)
- New: hashcat-help.md (auto-generated)
- New: device_status_code.txt

## Building and Installing

- Refactored GitHub Actions workflow to use matrix strategy for more efficient builds
- Fixed build failure on aarch64 platforms (e.g., Raspberry Pi)
- Updated BUILD instructions for CYGWIN and MSYS2
- Updated build flags on macOS (version placeholder: XX)
- Updated dependencies including UNRAR and OpenCL headers
- Automatically enabled kernel mode debugging for JIT-compiled HIP and OpenCL kernels when hashcat is built with DEBUG=1
- Fixed all compiler warnings for both GCC and Clang (latest versions) in hashcat source; suppressed warnings in third-party libraries
- Fixed compilation error in MSYS2 native shell
- Fixed Clang version detection in src/Makefile
- Changed package script source directory from $HOME/hashcat to current directory
- Removed old iconv patches (now handled by CMake)
- Fixed bash completion install script
- Updated WSL documentation to use CMake for win-iconv setup
- Fixed MinGW printf format issues
- Fixed compilation on newer FreeBSD versions
- Included winsock2.h instead of winsock.h
- Silenced Clang32/64 warnings related to signed/unsigned comparisons
- Fixed stdcall-related warnings under Clang32/64

##
## Plans for upcoming releases
##
- Add more assimilation bridge plugins
- Rewrite testing framework from Perl to Python

* changes v6.2.5 -> v6.2.6

##
## Algorithms
##

- Added hash-mode: Amazon AWS4-HMAC-SHA256
- Added hash-mode: Bitcoin WIF private key (P2PKH)
- Added hash-mode: Bitcoin WIF private key (P2SH(P2WPKH))
- Added hash-mode: Bitcoin WIF private key (P2WPKH, Bech32)
- Added hash-mode: BLAKE2b-512($pass.$salt)
- Added hash-mode: BLAKE2b-512($salt.$pass)
- Added hash-mode: DPAPI masterkey file v1 (context 3)
- Added hash-mode: DPAPI masterkey file v2 (context 3)
- Added hash-mode: Exodus Desktop Wallet (scrypt)
- Added hash-mode: Flask session cookie
- Added hash-mode: KeePass 1 (AES/Twofish) and KeePass 2 (AES) - keyfile only mode
- Added hash-mode: Kerberos 5, etype 17, DB
- Added hash-mode: Kerberos 5, etype 18, DB
- Added hash-mode: PostgreSQL SCRAM-SHA-256
- Added hash-mode: Radmin3
- Added hash-mode: Teamspeak 3 (channel hash)
- Added hash-mode: Terra Station Wallet (AES256-CBC(PBKDF2($pass)))
- Added hash-mode: bcrypt(sha512($pass)) / bcryptsha512
- Added hash-mode: md5(sha1($pass).$salt)
- Added hash-mode: sha1($salt.sha1(utf16le($username).':'.utf16le($pass)))
- Added hash-mode: sha256($salt.sha256_bin($pass))

##
## Features
##

- Added new backend support for Metal, the OpenCL replacement API on Apple
- Added support for building universal macOS binary on Apple Silicon
- Added support for using --debug-mode in attack-mode 9 (association attack)
- Added hex encoding format for --separator option
- Added password candidates range to --status-json output
- Added parameter to Bitwarden mode for second iteration count
- Added support for using 'John the Ripper' hash format with hash-type 13100
- Added support for using 'John the Ripper' hash format with hash-type 18200
- Added hash extraction scripts from the tools folder to beta/release versions
- Added user advice if a hash throws 'token length exception'
- Added tunings/ folder in order to replace hashcat.hctune. Configuration files with *.hctune suffix are automatically load on startup
- Added link to 'ubernoob' documentation when no parameters are supplied on Windows

##
## Bugs
##

- Fixed accepted salt length by PKCS#8 Private Keys modules
- Fixed autodetect memory allocation for temporary hashes for LUKS v1 (legacy) in --identify mode
- Fixed backend active devices checks
- Fixed building error on Raspberry Pi
- Fixed display problem of incorrect negative values in case of large numbers
- Fixed display problem of the "Optimizers applied" list for algorithms using Register-Limit
- Fixed example password output of --hash-info: force uppercase if OPTS_TYPE_PT_UPPER is set
- Fixed false negative on hash-type 27800 if using vector width greater than 1 and -a 3
- Fixed false negative on hash-types 4510 and 4710 for hashes with long salts
- Fixed false negative on hash-types 8900, 15700, 22700, 27700 and 28200 if using the HIP backend
- Fixed false negative on Unit Test in case of out-of-memory with grep in single mode
- Fixed false negative on Unit Test with hash-type 25400
- Fixed functional error when nonce-error-corrections that were set on the command line in hash-mode 22000/22001 were not accepted
- Fixed handling of devices in benchmark mode for "kernel build error". Instead of canceling, skip the device and move on to the next
- Fixed handling of password candidates that are shorter than the minimum password length in Association Attack
- Fixed invalid handling of keyfiles in Keepass if transf_random_seed doesn't change
- Fixed memory leak in CPU rule engine
- Fixed method of how OPTS_TYPE_AUX* kernels are called in an association attack, for example in WPA/WPA2 kernel
- Fixed missing option flag OPTS_TYPE_SUGGEST_KG for hash-mode 11600 to inform the user about possible false positives in this mode
- Fixed optimized (-O) candidate generation with --stdout and -a 7
- Fixed password limit in optimized kernel for hash-mode 10700
- Fixed password reassembling function reporting an incorrect candidate in some cases when the correct candidate has zero length
- Fixed undefined function call to hc_byte_perm_S() in hash-mode 17010 on non-CUDA compute devices
- Fixed unit test early exit on luks test file download/extract failure
- Fixed unit test false negative if there are spaces in the filesystem path to hashcat
- Fixed unit test salt-max in case of optimized kernel, with hash-type 22 and 23
- Fixed usage of --rule-right (-k) in -a 7 with optimized (-O) kernels
- Fixed wordlist handling in -m 3000 when candidate passwords use the $HEX[...] syntax

##
## Technical
##

- AMD Driver: Updated requirements for AMD Linux drivers to "AMDGPU" (21.50 or later) and "ROCm" (5.0 or later)
- AMD Driver: Updated requirements for AMD Windows drivers to "AMD Adrenalin Edition" (Adrenalin 22.5.1 exactly)
- Association Attack: Enable module specific pw_min and pw_max settings to avoid false positives in -a 9 attack-mode
- Autotune: Added error handling. By default skipping device on error, with --force using accel/loops/threads min values instead
- Backend: improved management of systems with multiple OpenCL platforms
- Backend Info: Added folder_config info to output
- Backend Info: Added generic system info to output (must be completed on Windows side)
- Backend Info: Added local memory size to output
- Backend: with kernel build options, switch from -I to -D INCLUDE_PATH, in order to support Apple Metal runtime
- Command Line: Disallow combinations of some options. for instance, using -t in -a 0 mode
- CUDA Backend: moved functions to ext_cuda.c/ext_nvrtc.c and includes to ext_cuda.h/ext_nvrtc.h
- Debug Rules: Set --debug-file to $session.debugfile if --debug-mode was set by the user and --debug-file was not set
- Hardware Monitor: Add support for GPU device utilization readings using iokit on Apple Silicon (OpenCL and Metal)
- Hash Info: show more information (Updated Hash-Format. Added Autodetect, Self-Test, Potfile and Plaintext encoding)
- HIP Backend: moved functions to ext_hip.c/ext_hiprtc.c and includes to ext_hip.h/ext_hiprtc.h
- HIP Backend: removed unused functions from hiprtc to workaround missing function symbols on windows dll
- Kernels: Refactored standard kernel declaration to use a structure holding u32/u64 attributes to reduce the number of attributes
- Kernels: Refactored standard kernel includes, KERN_ATTR macros and RC4 cipher functions, in order to support Apple Metal runtime
- Kernels: Set the default Address Space Qualifier for any pointer, in order to support Apple Metal runtime
- Logfile: Write per-session "recovered new" value to logfile
- Makefile: updated MACOSX_DEPLOYMENT_TARGET to 10.15 and removed OpenCL framework from LFLAGS_NATIVE on MacOS
- Metal Runtime: added support for vectors up to 4
- Modules: Added suffix *legacy* to old TrueCrypt modules (6211-6243)
- Modules: Added suffix *legacy* to old VeraCrypt modules (13711-13783)
- Modules: Added support of a custom charset setting for benchmarks to the module interface
- Modules: New LUKS v1 modules (29511-29543) which do not use `module_hash_binary_parse` to get data from containers anymore (use new tool `tools/luks2hashcat.py`)
- Modules: New TrueCrypt modules (29311-29343) which do not use `module_hash_binary_parse` to get data from containers anymore (use new tool `tools/truecrypt2hashcat.py`)
- Modules: New VeraCrypt modules (29411-29483) which do not use `module_hash_binary_parse` to get data from containers anymore (use new tool `tools/veracrypt2hashcat.py`)
- Modules: Renamed old LUKS module into LUKS v1 and added suffix *legacy* (14600)
- OpenCL Backend: added workaround to make optimized kernels work on Apple Silicon
- OpenCL Backend: moved functions to ext_OpenCL.c and includes to ext_OpenCL.h
- OpenCL Backend: show device_type in device list info on Apple Silicon
- OpenCL Kernel: Set native_threads to 32 on Apple GPU's for various hash-modes
- OpenCL Runtime: Added support to use Apple Silicon compute devices
- OpenCL Runtime: Add some unstable warnings detected on macOS
- OpenCL Runtime: Set default device-type to GPU with Apple Silicon compute devices
- Restore: Restore timer is decreased from 60 seconds to 1 second, but only updates if there's actually a change compared to previous data written to restore file
- Rules: Add new rulesets from T0XlC: T0XlCv2, T0XlC_3_rule, T0XlC_insert_HTLM_entities_0_Z
- Rules: Add support to include source wordlist in debugging format
- Rules: Update hand-written rulesets to covers years up to 2029
- Status code: updated negative status code (added kernel create failure and resync)
- Status code: updated negative status code, useful in Unit tests engine (test.sh)
- Terminal: Increased size of hash name column in `--help` and `--identify` options
- Terminal: Limit output length of example hash in --example-hash mode to 200. Use --mach to see full example hash
- Terminal: show empty OpenCL platforms only in backend information mode
- Tuning Database: Added a warning if a module implements module_extra_tuningdb_block but the installed computing device is not found
- Unit tests: added -r (--runtime) option
- Unit tests: handle negative status code, skip deprecated hash-types, skip hash-types with known perl modules issues, updated output
- Unit tests: Updated test.sh to set default device-type to CPU with Apple Intel and added -f (--force) option
- Usage Screen: On windows console, wait for any keypress if usage_mini_print() is used
- User Options: Add new module function module_hash_decode_postprocess() to override hash specific configurations from command line
- User Options: Change --backend-info/-I option type, from bool to uint
- Workflow: Added basic workflow for GitHub Actions

* changes v6.2.4 -> v6.2.5

##
## Algorithms
##

- Added hash-mode: CRC32C
- Added hash-mode: CRC64Jones
- Added hash-mode: MultiBit Classic .wallet (scrypt)
- Added hash-mode: MurmurHash3
- Added hash-mode: Windows Hello PIN/Password

##
## Performance
##

- PDF Kernel (10700): Improved performance on AMD GPUs by using shared memory for the scratch buffer and disabled inlining to save spilling

##
## Bugs
##

- Fixed divide by zero error because backend_ctx->hardware_power_all was not re-inserted after refactoring device_param->hardware_power
- Fixed invalid handling of initialization value for -m 11500
- Fixed invalid progress counter initialization in attack-mode 9 when using --skip or --restore
- Fixed out-of-boundary reads in attack-mode 9 that were caused by a missing work item limit in the refactored autotune engine
- Fixed out-of-boundary reads in hash-mode 22400 (AES Crypt) kernel
- Fixed strategy for eliminating hashes with zero length in LM when multiple hashes contain a zero hash

##
## Technical
##

- AMD Driver: Updated requirements for AMD Linux drivers to ROCm 4.5 or later due to new HIP interface
- Backend devices: In -S mode, limit the number of workitems so that no more than 2GB of host memory is required per backend device
- Backend devices: In non -S mode, limit the number of workitems so that no more than 4GB of host memory is required per backend device
- Backend types: The default filter for the device types is now set so that only the GPU is used, except for APPLE, where we set CPU
- Benchmark: Update benchmark_deep.pl with new hash modes added (also new hash modes which were added with v6.2.3)
- Electrum Wallet: Added new entropy-based check to test whether the decryption was successful or not
- Module Optimizers: Added OPTS_TYPE_MAXIMUM_THREADS to deactivate the else branch route in the section to find -T before compilation
- Makefile: Added wildcard include src/modules/module_*.mk directive so that plugin developers can add 3rd party libraries for their plugins
- Rejects: Disabled checking of the minimum and maximum length of the password candidate in attack-mode 9 because they are incompatible
- POCL: Added a workaround for an issue in POCL where a quote character is used as a part of the path itself which is passed as a path for the -I option
- Device Threads: The default maximum device thread number has been reduced from 1024 to 256, users can still overwrite with the -T option
- Tuning-DB: Add missing entries for -m 25600 and -m 25800 for CPU cracking
- OpenCL Backend: added workaround to support Apple Silicon (GPU: M1, M1 Pro, and M1 Max)
- MacOS v10.8+ (PBKDF2-SHA512): Added support for parsing new mac2john hash format directly in the module for -m 7100

* changes v6.2.3 -> v6.2.4

##
## Algorithms
##

- Added hash-mode: SNMPv3 HMAC-MD5-96/HMAC-SHA1-96
- Added hash-mode: SNMPv3 HMAC-MD5-96
- Added hash-mode: SNMPv3 HMAC-SHA1-96
- Added hash-mode: SNMPv3 HMAC-SHA224-128
- Added hash-mode: SNMPv3 HMAC-SHA256-192
- Added hash-mode: SNMPv3 HMAC-SHA384-256
- Added hash-mode: SNMPv3 HMAC-SHA512-384
- Added hash-mode: VirtualBox (PBKDF2-HMAC-SHA256 & AES-128-XTS)
- Added hash-mode: VirtualBox (PBKDF2-HMAC-SHA256 & AES-256-XTS)

##
## Features
##

- Added option --deprecated-check-disable to enable deprecated plugins
- Added option --generate-rules-func-sel to specify a pool of operators that the random rule generator is allowed to pick from
- Added option --multiply-accel-disable (short: -M) to disable multiplying of the kernel accel with the multiprocessor count
- Added rule function '3' to change the case of the first letter after the occurrence of N of character X
- Added support for auto tuning --kernel-threads (-T) at startup
- Added support for HIP version 4.3 or later and removed support for older HIP versions as they are not compatible

##
## Bugs
##

- Fixed broken support for --generate-rules-func-min which was ignored under certain conditions
- Fixed buffer overflow in DPAPI masterkey file v1/v2 module in hash_encode() and hash_decode()
- Fixed buffer overflow in Stargazer Stellar Wallet XLM module in hash_encode() when a hash was cracked
- Fixed false negative in all VeraCrypt hash modes if both conditions are met: 1. Use CPU for cracking and 2. PIM area was used
- Fixed invalid data type in the sha384_hmac_init_vector_128() function that take effect if the vector data type was specified manually
- Fixed out-of-boundary read in input_tokenizer() if the signature in the hash is longer than the length of the plugin's signature constant
- Fixed out-of-boundary read in PKZIP masterkey kernel if the password candidate has length zero
- Fixed out-of-boundary read in the Stuffit5 module in hash_decode()
- Fixed random rule generator option --generate-rules-func-min by fixing switch() case to not select a not existing option group type
- Fixed segfault when a combination of the flags --user and --show is given and a hash was specified directly on the command line
- Fixed syntax check of HAS_VPERM macro in several kernel includes causing invalid error message for AMD GPUs on Windows
- Fixed uninitialized tmps variable in autotune for slow hashes by calling _init and _prepare kernel before calling _loop kernel
- Fixed unintentional overwriting of the --quiet option in benchmark and speed-only mode

##
## Performance
##

- AMD GPUs: Add inline assembly code for md5crypt, sha256crypt, PDF 1.7, 7-Zip, RAR3, Samsung Android and Windows Phone 8+
- AMD GPUs: On the Apple OpenCL platform, we ask for the preferred kernel thread size rather than hard-coding 32
- Backend Interface: Replace most of the blocking Compute API functions with asynchronous ones to improve GPU utilization
- Blake Kernels: Optimize 3/4 BLAKE2B_ROUND() 64-bit rotations with inline assembly hc_byte_perm_S() calls
- Blowfish Kernels: Backport optimizations to reduce bank conflicts from bcrypt to Password Safe v2 and Open Document Format (ODF) 1.1
- ECC secp256k1: The inline assembly code for AMD GPUs has been removed as the latest JIT compilers optimize it with the same efficiency
- HIP Kernels: Enable vector data types for HIP kernels for functionality and performance
- Kernel threads: Use warp size / wavefront size query instead of hard-coded values as the basis for kernel threads
- SCRYPT Kernels: Improve Hashcat.hctune entries for many NV and AMD GPUs for hash mode 8900, 9300, 15700 and 22700
- STDIN: Reduce the performance gap between stdin and wordlist by disabling the --stdin-timeout-abort check after 1000 successful reads
- Tuning Database: Add new module function module_extra_tuningdb_block() to extend hashcat.hctune content from a module

##
## Technical
##

- 7-Zip Hook: Increase the supported data length from 320kb to 8mb
- ADL: Updated support for AMD Display Library to 15.0, updated data types
- AMD Driver: Updated requirements for AMD Linux drivers to ROCm 4.3 or later due to new HIP interface
- AMD Driver: Updated requirements for AMD Windows drivers to Adrenalin 21.2.1 or later due to new ADL library
- Autotune: Add autotune event to inform the user about autotune is starting/stopping on startup
- Backend Interface: Implement gpu_bzero() as a gpu_memset() replacement, since all gpu_memset() operations used 0 as the value
- Backend Interface: Improve the query kernel's dynamic memory size based on DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK_OPTIN instead of BF
- Brain Session: Adds hashconfig-specific opti_type and opts_type parameters to the session calculation to enable cover functions like -O
- Commandline: Fix some memory leaks in case hashcat aborts due to command line parameter settings
- Commandline: Throw an error if the separator specified by the user with the -p option is not exactly 1 byte
- Community: Add link to new hashcat discord to docs/contact.txt
- Constants: Make const char * pointers actually const char * const pointers
- Deprecated Plugins: Add new module function module_deprecated_notice() to mark a plugin as deprecated and to return a free text user notice
- Deprecated Plugins: Marked plugins 2500/2501 and 16800/16801 as deprecated
- Encoding: Truncate password candidates in UTF8 -> UTF16 conversion if it contains an invalid UTF8 byte sequence
- Filehandling: Avoid direct access to some file handles and use internal structures instead
- Filehandling: Use const char for fopen mode to fix -Wwrite-strings warnings
- Hardware Monitor: Added support for OverDrive 7 and 8 based GPUs
- HIP Kernels: Dependency on hip/hip runtime.h has been removed to enable easier integration of the HIP backend under Windows
- Kernel cache: Add kernel threads for hash calculation, which will later be used in the file name of the kernel cache
- Memory Management: Check in OpenCL that CL_DEVICE_HOST_UNIFIED_MEMORY is true and if so, then half of the available memory
- Memory Management: Refactored the code responsible for limiting kernel accel with the goal to avoid low host memory situations
- MetaMask: Added special extraction tool for MetaMask wallets
- NEO driver: Activate the NEO driver (Intel GPU) after it passed several tests in hashcat using the latest NEO driver version
- OpenCL Runtime: The use of clUnloadPlatformCompiler () was disabled after some users received unexpected return codes
- OpenCL Runtime: Workaround for Intel OpenCL runtime: segmentation fault when compiling hc_enc_next() / hc_enc_next_global()
- Potfile: Fixed some leaks in potfile_*_open(), potfile_*_close(), potfile_destroy() and don't assume plain file
- RC4 Kernels: Use improved native thread derivation for RC4-based hash modes 7500, 13100, 18200, 25400
- Shared Memory: Calculate the dynamic memory size of the kernel based on CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK_OPTIN
- Slow kernels: Set some of the slowest kernels to OPTS_TYPE_MP_MULTI_DISABLE to make it easier to handle small word lists
- Status view: Add hash-mode (-m number) in addition to hash-name
- Vendor Discovery: Add "Intel" as a valid vendor name for GPUs on macOS
- MetaMask: Increase the supported data len from 784b to 3136b and set pw-min to 8

* changes v6.2.2 -> v6.2.3

##
## Algorithms
##

- Added hash-mode: AES-128-ECB NOKDF (PT = $salt, key = $pass)
- Added hash-mode: AES-192-ECB NOKDF (PT = $salt, key = $pass)
- Added hash-mode: AES-256-ECB NOKDF (PT = $salt, key = $pass)
- Added hash-mode: iPhone passcode (UID key + System Keybag)
- Added hash-mode: MetaMask Wallet
- Added hash-mode: VeraCrypt PBKDF2-HMAC-Streebog-512 + XTS 512 bit  + boot-mode
- Added hash-mode: VeraCrypt PBKDF2-HMAC-Streebog-512 + XTS 1024 bit + boot-mode
- Added hash-mode: VeraCrypt PBKDF2-HMAC-Streebog-512 + XTS 1536 bit + boot-mode

##
## Features
##

- Added new backend support for HIP, an OpenCL alternative API for AMD GPUs (similar to CUDA for NVIDIA GPUs)
- Added option --markov-inverse to inverse markov statistics, with the idea of reversing the order of the password candidates
- Added temperature watchdog and fanspeed readings for CPU and GPU on macOS using iokit
- Added temperature watchdog and utilization for CPU on linux using sysfs and procfs
- Added option --increment-inverse to increment masks from right-to-left instead of left-to-right

##
## Bugs
##

- Fixed access violation in hashconfig_destroy if hashcat_ctx_t is only partially initialized
- Fixed 'E' rule in pure kernel mode which was ignoring letters that are in positions that are multiples of 4
- Fixed false negative in hash-mode 15900 (DPAPI masterkey file v2) if password was longer than 64 characters
- Fixed hashcat_ctx leak and refactor module and kernel existence checks
- Fixed integer overflow in Recovered/Time status view column caused by division > 0 but < 1
- Fixed invalid ETA if --limit was specified, several salts are in a hash list and some of them were found in a potfile
- Fixed memory leak in iconv_ctx and iconv_tmp in backend.c
- Fixed missing option to automatically disable kernel cache in -m 25600 and -m 25800
- Fixed out-of-boundary write in slow candidates mode in combinator attack

##
## Improvements
##

- Alias Devices: Show a warning in case the user specifically listed a device to use which in a later step is skipped because it is an alias of another active device
- Backend Information: Added new column showing the PCI Address per CUDA/OpenCL device to easier identify broken cards
- Bcrypt-SHA1/MD5 Kernels: Get rid of local memory use for binary to hex conversion to avoid false negatives on several OpenCL runtimes
- CPU Affinity: Allow mask up to 64 processors in Windows and remove call to SetThreadAffinityMask as SetProcessAffinityMask limits all threads in process
- Debug Rules: HEX-ify rules debug non-rules outputs that contain colons
- KeePass: Increase supported size for KeePass 1 databases from 300kB to 16MB
- Potfile: Disable potfile for hash-mode 99999
- VeraCrypt: Increase password length support for non-boot volumes from 64 to 128
- WPA Kernels: Increased performance by 3.5% for backend devices controlled by CUDA backend

##
## Technical
##

- Autodetect: Limit the number of errors per hash-mode try to 100 to avoid long startup time
- Brain: Add brain_ctx_t to hashcat_ctx_t to enable runtime check if hashcat was compiled with brain support
- File handling: Do not abort on seeing a BOM in input files, just warn and ignore the BOM
- Folders: Do not escape the variable cpath_real to prevent certain OpenCL runtimes from running into an error which do not support escape characters
- Java Object hashCode: Add OPTS_TYPE_SUGGEST_KG as a default option
- LM: Workaround JiT compiler bug in -m 3000 on NV leading to false negatives with large amount of hashes
- OpenCL Runtime: Workaround a problem of the AMD OpenCL GPU driver under macOS which results in false negatives due to changes in the kernel crypto library
- OpenCL Runtime: Workaround JiT crash (SC failed. No reason given.) on macOS by limiting local memory allocations to 32k
- Status View: Include time and duration info when pausing and resuming
- Tests: Changed tests for VeraCrypt from -a 0 to -a 3, because password extension is not available to all shells
- WinZip Kernel: Increase supported data length from 8k to 16mb

* changes v6.2.1 -> v6.2.2

##
## Algorithms
##

- Added hash-mode: bcrypt(md5($pass)) / bcryptmd5
- Added hash-mode: bcrypt(sha1($pass)) / bcryptsha1
- Added hash-mode: FortiGate256 (FortiOS256)
- Added hash-mode: Linux Kernel Crypto API (2.4)
- Added hash-mode: MurmurHash
- Added hash-mode: OpenEdge Progress Encode
- Added hash-mode: md5(utf16le($pass))
- Added hash-mode: sha1(utf16le($pass))
- Added hash-mode: sha256(utf16le($pass))
- Added hash-mode: sha384(utf16le($pass))
- Added hash-mode: sha512(utf16le($pass))
- Added hash-mode: md5(md5(md5($pass)))
- Added hash-mode: sha1(sha1($salt.$pass.$salt))
- Added hash-mode: sha256($salt.sha256($pass))
- Added hash-mode: sha384($pass.$salt)
- Added hash-mode: sha384($salt.$pass)
- Added hash-mode: sha384($salt.utf16le($pass))
- Added hash-mode: sha384(utf16le($pass).$salt)

##
## Features
##

- Autodetect hash-type: performs an automatic analysis of input hash(es), either listing compatible algorithms, or executing the attack (if only one compatible format is found)
- Autodetect hash-type: added option --identify to only perform autodetection of hash-type, without back-end device initialization

##
## Bugs
##

- Fixed error message in -a 9 mode with rules when number of words from wordlist is not in sync with number of unique salts
- Fixed error-handling logic in monitor thread to not return in case of error (disk full, permission error, ...) but to retry instead
- Fixed false negatives with TrueCrypt/VeraCrypt when zip- or gzip-compressed files were used as keyfiles
- Fixed free memory-size output for skipped GPU (both automatic and manual) of --backend-info information screen

##
## Improvements
##

- AES Crypt Plugin: Reduced max password length from 256 to 128 which improved performance by 22%
- CUDA Backend: If --stdout is used, do not warn about missing CUDA SDK
- Folder Management: Add support for XDG Base Directory specification when hashcat is installed using 'make install'
- Hardware Monitor: Add support for GPU device utilization readings from sysfs (AMD on Linux)
- OpenCL Backend: Use CL_DEVICE_BOARD_NAME_AMD instead of CL_DEVICE_NAME for device name (when supported by OpenCL runtime)
- Performance Monitor: Suggest -S to improve cracking performance in specific attack configurations
- RAR3-p (Compressed): Fix workaround in unrar library in AES constant table generation to enable multi-threading support
- RC4 Kernels: Improved performance by 20%+ with new RC4 code in hash-modes Kerberos 5 (etype 23), MS Office (<= 2003) and PDF (<= 1.6)
- Scrypt Kernels: Re-enable use of kernel cache in scrypt-based kernels
- Status Screen: Show currently-running kernel type (pure, optimized) and generator type (host, device)
- UTF8-to-UTF16: Replaced naive UTF8-to-UTF16 conversion with true conversion for RAR3, AES Crypt, MultiBit HD (scrypt) and Umbraco HMAC-SHA1

##
## Technical
##

- Dependencies: Updated LZMA SDK from 19.00 to 21.02 alpha
- Dependencies: Updated xxHash from 0.1.0 to v0.8.0 - Stable XXH3
- Documentation: Update missing documentation in plugin developer guide for OPTS_TYPE_MP_MULTI_DISABLE and OPTS_TYPE_NATIVE_THREADS
- Hashrate: Update inner-loop hashrate prediction to handle new salt_repeats feature and also respect _loop2 kernel runtime
- Kernels: Add RC4 cipher to crypto library with optimized shared memory access pattern which will not cause any bank conflicts if -u <= 32
- Kernels: Add standalone true UTF8-to-UTF16 converter kernel that runs after amplifier. Use OPTS_TYPE_POST_AMP_UTF16LE from plugin
- Kernel Cache: Add module_jit_build_options() string from modules to kernel cache checksum calculation
- Modules: Recategorized HASH_CATEGORY option in various modules
- Modules: Added hash categories HASH_CATEGORY_IMS and HASH_CATEGORY_CRYPTOCURRENCY_WALLET
- Modules: Changed hash category of Python passlib from HASH_CATEGORY_GENERIC_KDF to HASH_CATEGORY_FRAMEWORK
- Unit-Tests: Added missing support for OPTS_TYPE_LOOP_PREPARE, OPTS_TYPE_LOOP_PREPARE2 and salt_repeats in self-test
- Unit-Tests: Added missing unit-test for Stargazer Stellar Wallet XLM

* changes v6.2.0 -> v6.2.1

##
## Technical
##

- Dependencies: Updated unrar source from 5.9.4 to 6.0.5
- Dependencies: Make unrar dependencies optional and disable hash-mode 23800 if dependency is disabled

* changes v6.1.1 -> v6.2.0

##
## Algorithms
##

- Added hash-mode: Apple iWork
- Added hash-mode: AxCrypt 2 AES-128
- Added hash-mode: AxCrypt 2 AES-256
- Added hash-mode: BestCrypt v3 Volume Encryption
- Added hash-mode: Bitwarden
- Added hash-mode: Dahua Authentication MD5
- Added hash-mode: KNX IP Secure - Device Authentication Code
- Added hash-mode: MongoDB ServerKey SCRAM-SHA-1
- Added hash-mode: MongoDB ServerKey SCRAM-SHA-256
- Added hash-mode: Mozilla key3.db
- Added hash-mode: Mozilla key4.db
- Added hash-mode: MS Office 2016 - SheetProtection
- Added hash-mode: PDF 1.4 - 1.6 (Acrobat 5 - 8) - edit password
- Added hash-mode: PKCS#8 Private Keys
- Added hash-mode: RAR3-p (Compressed)
- Added hash-mode: RAR3-p (Uncompressed)
- Added hash-mode: RSA/DSA/EC/OPENSSH Private Keys
- Added hash-mode: SolarWinds Orion v2
- Added hash-mode: SolarWinds Serv-U
- Added hash-mode: SQLCipher
- Added hash-mode: Stargazer Stellar Wallet XLM
- Added hash-mode: Stuffit5
- Added hash-mode: Telegram Desktop >= v2.1.14 (PBKDF2-HMAC-SHA512)
- Added hash-mode: Umbraco HMAC-SHA1
- Added hash-mode: sha1($salt.sha1($pass.$salt))
- Added hash-mode: sha1(sha1($pass).$salt)

##
## Features
##

- Added new attack-mode: Association Attack (aka "Context Attack") to attack hashes from a hashlist with associated "hints"
- Added support for true UTF-8 to UTF-16 conversion in kernel crypto library
- Added option --hash-info to show generic information for each hash-mode
- Added command prompt [f]inish to tell hashcat to quit after finishing the current attack

##
## Bugs
##

- Fixed access to filename which is a null-pointer in benchmark mode
- Fixed both false negative and false positive results in -m 3000 in -a 3 (affecting only NVIDIA GPU)
- Fixed buffer overflow in -m 1800 in -O mode which is optimized to handle only password candidates up to length 15
- Fixed buffer overflow in -m 4710 in -P mode and only in single hash mode if salt length is larger than 32 bytes
- Fixed hardware management sysfs readings in status screen (typically ROCm controlled GPUs)
- Fixed include guards in several header files
- Fixed incorrect maximum password length support for -m 400 in optimized mode (reduced from 55 to 39)
- Fixed internal access on module option attribute OPTS_TYPE_SUGGEST_KG with the result that it was unused
- Fixed invalid handling of outfile folder entries for -m 22000
- Fixed memory leak causing problems in sessions with many iterations - for instance, --benchmark-all or large mask files
- Fixed memory leaks in several cases of errors with access to temporary files
- Fixed NVML initialization in WSL2 environments
- Fixed out-of-boundary reads in cases where user activates -S for fast but pure hashes in -a 1 or -a 3 mode
- Fixed out-of-boundary reads in kernels using module_extra_buffer_size() if -n is set to 1
- Fixed password reassembling for cracked hashes on host for slow hashes in optimized mode that are longer than 32 characters
- Fixed race condition in potfile check during removal of empty hashes
- Fixed race condition resulting in out of memory error on startup if multiple hashcat instances are started at the same time
- Fixed rare case of misalignment of the status prompt when other user warnings are shown in the hashcat output
- Fixed search of tuning database - if a device was not assigned an alias, it couldn't be found in general
- Fixed test on gzip header in wordlists and hashlists
- Fixed too-early execution of some module functions that use non-final values opts_type and opti_type
- Fixed unexpected non-unique salts in multi-hash cracking in Bitcoin/Litecoin wallet.dat module which led to false negatives
- Fixed unit test for -m 3000 by preventing it to generate zero hashes
- Fixed unit tests using 'null' as padding method in Crypt::CBC but actually want to use 'none'
- Fixed unterminated salt buffer in -m 23400 module_hash_encode() in case salt was of length 256
- Fixed vector datatype support in -m 21100 only -P mode and only -a 3 mode were affected

##
## Improvements
##

- Apple Keychain: Notify the user about the risk of collisions / false positives
- CUDA Backend: Do not warn about missing CUDA SDK installation if --backend-ignore-cuda is used
- CUDA Backend: Give detailed warning if either the NVIDIA CUDA or the NVIDIA RTC library cannot be initialized
- CUDA Backend: Use blocking events to avoid 100% CPU core usage (per GPU)
- OpenCL Runtime: Workaround JiT compiler deadlock on NVIDIA driver >= 465.89
- OpenCL Runtime: Workaround JiT compiler segfault on legacy AMDGPU driver compiling RAR3 OpenCL kernel
- RAR3 Kernels: Improved loop code, improving performance by 23%
- Scrypt Kernels: Added a number of GPU specific optimizations per hash modes to hashcat.hctune
- Scrypt Kernels: Added detailed documentation on device specific tunings in hashcat.hctune
- Scrypt Kernels: Optimized Salsa code portion by reducing register copies and removed unnecessary byte swaps
- Scrypt Kernels: Reduced kernel wait times by making it a true split kernel where iteration count = N value
- Scrypt Kernels: Refactored workload configuration strategy based on available resources
- Startup time: Improved startup time by avoiding some time-intensive operations for skipped devices

##
## Technical
##

- Bcrypt: Make BCRYPT entry for CPU in hashcat.hctune after switch to OPTS_TYPE_MP_MULTI_DISABLE (basically set -n to 1)
- Benchmark: Update benchmark_deep.pl with new hash modes added (also new hash modes which were added with v6.1.0)
- Building: Declare phony targets in Makefile to avoid conflicts of a target name with a file of the same name
- Building: Fixed build warnings on macOS for unrar sources
- Building: Fixed test for DARWIN_VERSION in Makefile
- Commandline Options: Removed option --example-hashes, now an alias of --hash-info
- Compute API: Skipping devices instead of stop if error occurred in initialization
- Documentation: Added 3rd party licenses to docs/license_libs
- Hash-Mode 8900 (Scrypt): Changed default benchmark scrypt parameters from 1k:1:1 to 16k:8:1 (default)
- Hash-Mode 11600 (7-Zip): Improved memory handling (alloc and free) for the hook function
- Hash-Mode 13200 (AxCrypt): Changed the name to AxCrypt 1 to avoid confusion
- Hash-Mode 13300 (AxCrypt in-memory SHA1): Changed the name to AxCrypt 1 in-memory SHA1
- Hash-Mode 16300 (Ethereum Pre-Sale Wallet, PBKDF2-HMAC-SHA256): Use correct buffer size allocation for AES key
- Hash-Mode 20710 (sha256(sha256($pass).$salt)): Removed unused code and fixed module_constraints
- Hash-Mode 22000 (WPA-PBKDF2-PMKID+EAPOL): Support loading a hash from command line
- Hash-Mode 23300 (Apple iWork): Use correct buffer size allocation for AES key
- Hash Parser: Output support for machine-readable hash lines in --show and --left and in error messages
- Kernel Development: Kernel cache is disabled automatically when hashcat is compiled with DEBUG=1
- Kernel Functions: Added generic AES-GCM interface see OpenCL/inc_cipher_aes-gcm.h
- Kernel Functions: Refactored OpenCL/inc_ecc_secp256k1.cl many functions, add constants and documentation
- Kernel Functions: Refactored OpenCL/inc_ecc_secp256k1.cl to improve usage in external programs
- Kernel Functions: Wrap atomic functions with hc_ prefix. Custom kernels need to rename "atomic_inc()" to "hc_atomic_inc()"
- Kernel Parameters: Added new parameter 'salt_repeat' to improve large buffer management
- Module Parameters: Add OPTS_TYPE_MP_MULTI_DISABLE for use by plugin developers to prevent multiply -n with the MCU count
- Module Parameters: Add OPTS_TYPE_NATIVE_THREADS for use by plugin developers to enforce native thread count
- Module Structure: Add 3rd party library hook management functions. This also requires an update to all existing module_init()
- OpenCL Runtime: Add support for clUnloadPlatformCompiler() to release some resources after JiT compilation
- OpenCL Runtime: Switched default OpenCL device type on macOS from GPU to CPU. Use -D 2 to enable GPU devices
- OpenCL Runtime: Update module_unstable_warnings() for all hash modes based on most recent versions of many OpenCL runtimes
- Unit tests: Added 'potthrough' (like passthrough, but hash:plain) to tools/test.pl
- Unit tests: Added Python 3 support for all of the Python code in our test framework
- Unit tests: Fixed the packaging of test (-p) feature
- Unit tests: Updated test.sh to show kernel type (pure or optimized) in output
- Unit tests: Use python3/pip3 instead of just python/pip in tools/install_modules.sh

* changes v6.1.0 -> v6.1.1

##
## Bugs
##

- Fixed unresolvable relative paths in hashcat.log

* changes v6.0.0 -> v6.1.0

##
## Algorithms
##

- Added hash-mode: Apple Keychain
- Added hash-mode: XMPP SCRAM

##
## Bugs
##

- Fixed alias detection with additional processor core count check
- Fixed false negatives in hash-mode 10901 if hash-mode 9200, 10000, 10900 or 20300 was used to compile the kernel binary
- Fixed integer overflow for large masks in -a 6 attack mode
- Fixed maximum password length in modules of hash-modes 600, 7800, 7801 and 9900
- Fixed non-zero status code when using --stdout
- Fixed uninitialized value in bitsliced DES kernel (BF mode only) leading to false negatives

##
## Improvements
##

- Compile macOS: Fixed makefile target 'clean' to correctly remove *.dSYM folders
- Compile ZLIB: Fixed makefile include paths in case USE_SYSTEM_ZLIB is used
- Hcchr Files: Renamed some .charset files into .hcchr files
- Hash-Mode 21200 (md5(sha1($salt).md5($pass))): Improved speed by using pre-computed SHA1
- OpenCL Devices: Utilize PCI domain to improve alias device detection
- OpenCL Kernels: Added datatypes to literals of enum constants
- OpenCL Kernels: Added pure kernels for hash-mode 600 (BLAKE2b-512)
- OpenCL Runtime: Add some unstable warnings for some SHA512 based algorithms on AMD GPU on macOS
- OpenCL Runtime: Reinterpret return code CL_DEVICE_NOT_FOUND from clGetDeviceIDs() as non-fatal

##
## Technical
##

- Backend: Changed the maximum number of compute devices from 64 to 128
- Tests: Improved tests for hash-mode 11300 (Bitcoin/Litecoin wallet.dat)
- Tests: Improved tests for hash-mode 13200 (AxCrypt)
- Tests: Improved tests for hash-mode 13600 (WinZip)
- Tests: Improved tests for hash-mode 16400 (CRAM-MD5 Dovecot)
- Tests: Improved tests for hash-mode 16800 (WPA-PMKID-PBKDF2)

* changes v5.1.0 -> v6.0.0

##
## Features
##

- Refactored hash-mode integration and replaced it with a fully modularized plugin interface
- Converted all existing hardwired hash-modes to hashcat plugins
- Added comprehensive plugin developer guide on adding new/custom hash-modes to hashcat
- Refactored compute backend interface to allow adding compute API other than OpenCL
- Added CUDA as a new compute backend (enables hashcat to run on NVIDIA Jetson, IBM POWER9 w/ Nvidia V100, etc.)
- Support automatic use of all available GPU memory when using CUDA backend
- Support automatic use of all available CPU cores for hash-mode-specific hooks
- Support on-the-fly loading of compressed wordlists in zip and gzip format
- Support deflate decompression for the 7-Zip hash-mode using zlib hook
- Added additional documentation on hashcat brain, slow-candidate interface and keyboard-layout mapping features
- Keep output of --show and --left in the original ordering of the input hash file
- Improved performance of many hash-modes

##
## Algorithms
##

- Added hash-mode: AES Crypt (SHA256)
- Added hash-mode: Android Backup
- Added hash-mode: AuthMe sha256
- Added hash-mode: BitLocker
- Added hash-mode: BitShares v0.x
- Added hash-mode: Blockchain, My Wallet, Second Password (SHA256)
- Added hash-mode: Citrix NetScaler (SHA512)
- Added hash-mode: Citrix NetScaler (PBKDF2-HMAC-SHA256)
- Added hash-mode: DiskCryptor
- Added hash-mode: Electrum Wallet (Salt-Type 3-5)
- Added hash-mode: Huawei Router sha1(md5($pass).$salt)
- Added hash-mode: Java Object hashCode()
- Added hash-mode: Kerberos 5 Pre-Auth etype 17 (AES128-CTS-HMAC-SHA1-96)
- Added hash-mode: Kerberos 5 Pre-Auth etype 18 (AES256-CTS-HMAC-SHA1-96)
- Added hash-mode: Kerberos 5 TGS-REP etype 17 (AES128-CTS-HMAC-SHA1-96)
- Added hash-mode: Kerberos 5 TGS-REP etype 18 (AES256-CTS-HMAC-SHA1-96)
- Added hash-mode: MultiBit Classic .key (MD5)
- Added hash-mode: MultiBit HD (scrypt)
- Added hash-mode: MySQL $A$ (sha256crypt)
- Added hash-mode: Open Document Format (ODF) 1.1 (SHA-1, Blowfish)
- Added hash-mode: Open Document Format (ODF) 1.2 (SHA-256, AES)
- Added hash-mode: Oracle Transportation Management (SHA256)
- Added hash-mode: PKZIP archive encryption
- Added hash-mode: PKZIP Master Key
- Added hash-mode: Python passlib pbkdf2-sha1
- Added hash-mode: Python passlib pbkdf2-sha256
- Added hash-mode: Python passlib pbkdf2-sha512
- Added hash-mode: QNX /etc/shadow (MD5)
- Added hash-mode: QNX /etc/shadow (SHA256)
- Added hash-mode: QNX /etc/shadow (SHA512)
- Added hash-mode: RedHat 389-DS LDAP (PBKDF2-HMAC-SHA256)
- Added hash-mode: Ruby on Rails Restful-Authentication
- Added hash-mode: SecureZIP AES-128
- Added hash-mode: SecureZIP AES-192
- Added hash-mode: SecureZIP AES-256
- Added hash-mode: SolarWinds Orion
- Added hash-mode: Telegram Desktop App Passcode (PBKDF2-HMAC-SHA1)
- Added hash-mode: Telegram Mobile App Passcode (SHA256)
- Added hash-mode: Web2py pbkdf2-sha512
- Added hash-mode: WPA-PBKDF2-PMKID+EAPOL
- Added hash-mode: WPA-PMK-PMKID+EAPOL
- Added hash-mode: md5($salt.sha1($salt.$pass))
- Added hash-mode: md5(sha1($pass).md5($pass).sha1($pass))
- Added hash-mode: md5(sha1($salt).md5($pass))
- Added hash-mode: sha1(md5(md5($pass)))
- Added hash-mode: sha1(md5($pass.$salt))
- Added hash-mode: sha1(md5($pass).$salt)
- Added hash-mode: sha1($salt1.$pass.$salt2)
- Added hash-mode: sha256(md5($pass))
- Added hash-mode: sha256($salt.$pass.$salt)
- Added hash-mode: sha256(sha256_bin($pass))
- Added hash-mode: sha256(sha256($pass).$salt)

##
## Bugs
##

- Fixed buffer overflow in build_plain() function
- Fixed buffer overflow in mp_add_cs_buf() function
- Fixed calculation of brain-session ID - only the first hash of the hashset was taken into account
- Fixed cleanup of password candidate buffers on GPU as set from autotune when -n parameter was used
- Fixed copy/paste error leading to invalid "Integer overflow detected in keyspace of mask" in attack-mode 6 and 7
- Fixed cracking multiple Office hashes (modes 9500, 9600) if hashes shared the same salt
- Fixed cracking of Blockchain, My Wallet (V1 and V2) hashes when testing decrypted data in unexpected format
- Fixed cracking of Cisco-PIX and Cisco-ASA MD5 passwords in mask-attack mode when mask > length 16
- Fixed cracking of DNSSEC (NSEC3) hashes by replacing all dots in the passwords with lengths
- Fixed cracking of Electrum Wallet Salt-Type 2 hashes
- Fixed cracking of NetNTLMv1 passwords in mask-attack mode when mask > length 16 (optimized kernels only)
- Fixed cracking of RAR3-hp hashes with pure kernel for passwords longer than 28 bytes
- Fixed cracking of VeraCrypt Streebog-512 hashes (CPU only)
- Fixed cracking raw Streebog-HMAC 256 and 512 hashes for passwords of length >= 64
- Fixed cracking raw Whirlpool hashes cracking for passwords of length >= 32
- Fixed incorrect progress-only result in a special race condition
- Fixed invalid call of mp_css_utf16le_expand()/mp_css_utf16be_expand() in slow-candidate sessions
- Fixed invalid password truncation in attack-mode 1 when the final password is longer than 32 characters
- Fixed invalid use of --hex-wordlist if encoded wordlist string is larger than length 256
- Fixed maximum password length limit which was announced as 256 but was actually 255
- Fixed out-of-boundary read in pure kernel rule engine rule 'p' when parameter was set to 2 or higher
- Fixed out-of-boundary write to decrypted[] in DPAPI masterkey file v1 kernel
- Fixed output of IKE PSK (mode 5300 and 5400) hashes to use separators in the correct position
- Fixed output password of "e" rule in pure and CPU rule engine when separator character is also the first letter
- Fixed problem with usage of hexadecimal notation (\x00-\xff) within rules
- Fixed race condition in maskfile mode by using a dedicated flag for restore execution
- Fixed some memory leaks when hashcat is shutting down due to some file error
- Fixed some memory leaks when mask-files are used in optimized mode
- Fixed --status-json to correctly escape certain characters in hashes
- Fixed the 7-Zip parser to allow the entire supported range of encrypted and decrypted data lengths
- Fixed the validation of the --brain-client-features command line argument (only values 1, 2 or 3 are allowed)

##
## Improvements
##

- Bitcoin Wallet: Be more user friendly by allowing a larger data range for ckey and public_key
- Brain: Added new parameter --brain-server-timer to specify seconds between scheduled backups
- Building: Fix for library compilation failure due to multiple definition of sbob_xx64()
- Cracking bcrypt and Password Safe v2: Use feedback from the compute API backend to dynamically calculate optimal thread count
- Dictstat: On Windows, the st_ino attribute in the stat struct is not set, which can lead to invalid cache hits. Added the filename to the database entry.
- Documents: Added README on how to build hashcat on Cygwin, MSYS2 and WSL
- File handling: Print a truncation warning when an oversized line is detected
- My Wallet: Added additional plaintext pattern used in newer versions
- Office cracking: Support hash format with second block data for 40-bit oldoffice files (eliminates false positives)
- OpenCL Runtime: Added a warning if OpenCL runtime NEO, Beignet, POCL (v1.4 or older) or MESA is detected, and skip associated devices (override with --force)
- OpenCL Runtime: Allow the kernel to access post-48k shared memory region on CUDA. Requires both module and kernel preparation
- OpenCL Runtime: Disable OpenCL kernel cache on Apple for Intel CPU (throws CL_BUILD_PROGRAM_FAILURE for no reason)
- OpenCL Runtime: Do not run shared- or constant-memory size checks if their memory type is of type global memory (typically CPU)
- OpenCL Runtime: Improve ROCm detection and make sure to not confuse with recent AMDGPU drivers
- OpenCL Runtime: Not using amd_bytealign (amd_bitalign is fine) on AMDGPU driver drastically reduces JiT segfaults
- OpenCL Runtime: Unlocked maximum thread count for NVIDIA GPU
- OpenCL Runtime: Update unstable mode warnings for Apple and AMDGPU drivers
- OpenCL Runtime: Workaround JiT compiler error on AMDGPU driver compiling WPA-EAPOL-PBKDF2 OpenCL kernel
- OpenCL Runtime: Workaround JiT compiler error on ROCm 2.3 driver if the 'inline' keyword is used in function declaration
- OpenCL Runtime: Workaround memory allocation error on AMD driver on Windows leading to CL_MEM_OBJECT_ALLOCATION_FAILURE
- OpenCL Runtime: Removed some workarounds by calling chdir() to specific folders on startup
- Outfile: Added new system to specify the outfile format, the new --outfile-format now also supports timestamps
- Startup Checks: Improved the pidfile check: Do not just check for existing PID, but also check executable filename
- Startup Checks: Prevent the user from modifying options which are overwritten automatically in benchmark mode
- Startup Screen: Add extra warning when using --force
- Startup Screen: Add extra warning when using --keep-guessing
- Startup Screen: Provide an estimate of host memory required for the requested attack
- Status Screen: Added brain status for all compute devices
- Status Screen: Added remaining counts and changed recovered count logic
- Status Screen: Added --status-json flag for easier machine reading of hashcat status output
- Tab Completion: Allow using "make install" version of hashcat
- Tuning Database: Updated hashcat.hctune with new models and refreshed vector width values
- VeraCrypt: Added support for VeraCrypt PIM brute-force, replaced --veracrypt-pim with --veracrypt-pim-start and --veracrypt-pim-stop
- WipZip cracking: Added two byte early reject, resulting in higher cracking speed
- WPA/WPA2 cracking: In the potfile, replace password with PMK in order to detect already cracked networks across all WPA modes

##
## Technical
##

- Backend Interface: Added new options --backend-ignore-cuda and --backend-ignore-opencl to prevent CUDA and/or OpenCL API from being used
- Binary Distribution: Removed 32-bit binary executables
- Building: On macOS, switch from ar to /usr/bin/ar to improve building compatibility
- Building: Skipping Travis/Appveyor build for non-code changes
- Codebase: Cleanup of many unused rc_* variables
- Codebase: Fixed some printf() format arguments
- Codebase: Fixed some type casting to avoid truncLongCastAssignment warnings
- Codebase: Moved hc_* file functions from shared.c to filehandling.c
- Codebase: Ran through a bunch of clang-tidy checkers and updated code accordingly
- Codebase: Remove redundant calls to fclose()
- Dependencies: Updated LZMA-Headers from 18.05 to 19.00
- Dependencies: Updated OpenCL-Headers to latest version from GitHub master repository
- Hash-Mode 12500 (RAR3-hp): Allow cracking of passwords up to length 64
- Hash-mode 1460 (HMAC-SHA256 (key = $salt)): Allow up to 64 byte of salt
- Hash-Mode 1680x (WPA-PMKID) specific: Changed separator character from '*' to ':'
- Hash-Mode 8300 (DNSSEC (NSEC3)) specific: Allow empty salt
- Keep Guessing: No longer automatically activate --keep-guessing for modes 9720, 9820, 14900 and 18100
- Keep Guessing: No longer mark hashes as cracked/removed when in potfile
- Kernel Cache: Reactivate OpenCL runtime specific kernel caches
- Kernel Compile: Removed -cl-std= from all kernel build options since we're compatible to all OpenCL versions
- OpenCL Kernels: Fix OpenCL compiler warning on double precision constants
- OpenCL Kernels: Moved "gpu_decompress", "gpu_memset" and "gpu_atinit" into shared.cl in order to reduce compile time
- OpenCL Options: Removed --opencl-platforms filter in order to force backend device numbers to stay constant
- OpenCL Options: Set --spin-damp to 0 (disabled) by default. With the CUDA backend this workaround became deprecated
- Parsers: switched from strtok() to strtok_r() for thread safety
- Requirements: Add new requirement for NVIDIA GPU: CUDA Toolkit (9.0 or later)
- Requirements: Update runtime check for minimum NVIDIA driver version from 367.x to 440.64 or later
- Test Script: Switched from /bin/bash to generic /bin/sh and updated code accordingly

* changes v5.0.0 -> v5.1.0

##
## Features
##

- Added support for using --stdout in brain-client mode
- Added new option --stdin-timeout-abort, to set how long hashcat should wait for stdin input before aborting
- Added new option --kernel-threads to manually override the automatically-calculated number of threads
- Added new option --keyboard-layout-mapping to map users keyboard layout, required to crack TC/VC system boot volumes

##
## Algorithms
##

- Added pure kernels for hash-mode 11700 (Streebog-256)
- Added pure kernels for hash-mode 11800 (Streebog-512)
- Added hash-mode 11750 (HMAC-Streebog-256 (key = $pass), big-endian)
- Added hash-mode 11760 (HMAC-Streebog-256 (key = $salt), big-endian)
- Added hash-mode 11850 (HMAC-Streebog-512 (key = $pass), big-endian)
- Added hash-mode 11860 (HMAC-Streebog-512 (key = $salt), big-endian)
- Added hash-mode 13771 (VeraCrypt PBKDF2-HMAC-Streebog-512 + XTS 512 bit)
- Added hash-mode 13772 (VeraCrypt PBKDF2-HMAC-Streebog-512 + XTS 1024 bit)
- Added hash-mode 13773 (VeraCrypt PBKDF2-HMAC-Streebog-512 + XTS 1536 bit)
- Added hash-mode 18200 (Kerberos 5 AS-REP etype 23)
- Added hash-mode 18300 (Apple File System (APFS))
- Added Kuznyechik cipher and cascades support for VeraCrypt kernels
- Added Camellia cipher and cascades support for VeraCrypt kernels

##
## Improvements
##

- OpenCL Devices: Add support for up to 64 OpenCL devices per system
- OpenCL Platforms: Add support for up to 64 OpenCL platforms per system
- OpenCL Runtime: Use our own yielding technique for synchronizing rather than vendor specific
- Startup: Show OpenCL runtime initialization message (per device)
- xxHash: Added support for using the version provided by the OS/distribution

##
## Bugs
##

- Fixed automated calculation of brain-session when not using all hashes in the hashlist
- Fixed calculation of brain-attack if a given wordlist has zero size
- Fixed checking the length of the last token in a hash if it was given the attribute TOKEN_ATTR_FIXED_LENGTH
- Fixed endianness and invalid separator character in outfile format for hash-mode 16801 (WPA-PMKID-PMK)
- Fixed ignoring --brain-client-features configuration when brain server has attack-position information from a previous run
- Fixed invalid hardware monitor detection in benchmark mode
- Fixed invalid warnings about throttling when --hwmon-disable was used
- Fixed missing call to WSACleanup() to cleanly shutdown windows sockets system
- Fixed missing call to WSAStartup() and client indexing in order to start the brain server on Windows
- Fixed out-of-boundary read in DPAPI masterkey file v2 OpenCL kernel
- Fixed out-of-bounds write in short-term memory of the brain server
- Fixed output of --speed-only and --progress-only when fast hashes are used in combination with --slow-candidates
- Fixed selection of OpenCL devices (-d) if there's more than 32 OpenCL devices installed
- Fixed status output of progress value when -S and -l are used in combination
- Fixed thread count maximum for pure kernels in straight attack mode

##
## Technical
##

- Brain: Set --brain-client-features default from 3 to 2
- Dependencies: Added xxHash and OpenCL-Headers to deps/ in order to allow building hashcat from GitHub source release package
- Dependencies: Removed gitmodules xxHash and OpenCL-Headers
- Keymaps: Added hashcat keyboard mapping us.hckmap (can be used as template)
- Keymaps: Added hashcat keyboard mapping de.hckmap
- Hardware Monitor: Renamed --gpu-temp-abort to --hwmon-temp-abort
- Hardware Monitor: Renamed --gpu-temp-disable to --hwmon-disable
- Memory: Limit maximum host memory allocation depending on bitness
- Memory: Reduced default maximum bitmap size from 24 to 18 and give a notice to use --bitmap-max to restore
- Parameter: Rename --nvidia-spin-damp to --spin-damp (now accessible for all devices)
- Pidfile: Treat a corrupted pidfile like a not existing pidfile
- OpenCL Device: Do a real query on OpenCL local memory type instead of just assuming it
- OpenCL Runtime: Disable auto-vectorization for Intel OpenCL runtime to workaround hanging JiT since version 18.1.0.013
- Tests: Added hash-mode 11700 (Streebog-256)
- Tests: Added hash-mode 11750 (HMAC-Streebog-256 (key = $pass), big-endian)
- Tests: Added hash-mode 11760 (HMAC-Streebog-256 (key = $salt), big-endian)
- Tests: Added hash-mode 11800 (Streebog-512)
- Tests: Added hash-mode 11850 (HMAC-Streebog-512 (key = $pass), big-endian)
- Tests: Added hash-mode 11860 (HMAC-Streebog-512 (key = $salt), big-endian)
- Tests: Added hash-mode 13711 (VeraCrypt PBKDF2-HMAC-RIPEMD160 + XTS 512 bit)
- Tests: Added hash-mode 13712 (VeraCrypt PBKDF2-HMAC-RIPEMD160 + XTS 1024 bit)
- Tests: Added hash-mode 13713 (VeraCrypt PBKDF2-HMAC-RIPEMD160 + XTS 1536 bit)
- Tests: Added hash-mode 13721 (VeraCrypt PBKDF2-HMAC-SHA512 + XTS 512 bit)
- Tests: Added hash-mode 13722 (VeraCrypt PBKDF2-HMAC-SHA512 + XTS 1024 bit)
- Tests: Added hash-mode 13723 (VeraCrypt PBKDF2-HMAC-SHA512 + XTS 1536 bit)
- Tests: Added hash-mode 13731 (VeraCrypt PBKDF2-HMAC-Whirlpool + XTS 512 bit)
- Tests: Added hash-mode 13732 (VeraCrypt PBKDF2-HMAC-Whirlpool + XTS 1024 bit)
- Tests: Added hash-mode 13733 (VeraCrypt PBKDF2-HMAC-Whirlpool + XTS 1536 bit)
- Tests: Added hash-mode 13751 (VeraCrypt PBKDF2-HMAC-SHA256 + XTS 512 bit)
- Tests: Added hash-mode 13752 (VeraCrypt PBKDF2-HMAC-SHA256 + XTS 1024 bit)
- Tests: Added hash-mode 13753 (VeraCrypt PBKDF2-HMAC-SHA256 + XTS 1536 bit)
- Tests: Added hash-mode 13771 (VeraCrypt PBKDF2-HMAC-Streebog-512 + XTS 512 bit)
- Tests: Added hash-mode 13772 (VeraCrypt PBKDF2-HMAC-Streebog-512 + XTS 1024 bit)
- Tests: Added hash-mode 13773 (VeraCrypt PBKDF2-HMAC-Streebog-512 + XTS 1536 bit)
- Tests: Added VeraCrypt containers for Kuznyechik cipher and cascades
- Tests: Added VeraCrypt containers for Camellia cipher and cascades

* changes v4.2.1 -> v5.0.0

##
## Features
##

- Added new option --slow-candidates which allows hashcat to generate passwords on-host
- Added new option --brain-server to start a hashcat brain server
- Added new option --brain-client to start a hashcat brain client, automatically activates --slow-candidates
- Added new option --brain-host and --brain-port to specify ip and port of brain server, both listening and connecting
- Added new option --brain-session to override automatically calculated brain session ID
- Added new option --brain-session-whitelist to allow only explicit written session ID on brain server
- Added new option --brain-password to specify the brain server authentication password
- Added new option --brain-client-features which allows enable and disable certain features of the hashcat brain

##
## Algorithms
##

- Added hash-mode 17300 = SHA3-224
- Added hash-mode 17400 = SHA3-256
- Added hash-mode 17500 = SHA3-384
- Added hash-mode 17600 = SHA3-512
- Added hash-mode 17700 = Keccak-224
- Added hash-mode 17800 = Keccak-256
- Added hash-mode 17900 = Keccak-384
- Added hash-mode 18000 = Keccak-512
- Added hash-mode 18100 = TOTP (HMAC-SHA1)
- Removed hash-mode 5000 = SHA-3 (Keccak)

##
## Improvements
##

- Added additional hybrid "passthrough" rules, to enable variable-length append/prepend attacks
- Added a periodic check for read timeouts in stdin/pipe mode, and abort if no input was provided
- Added a tracker for salts, amplifier and iterations to the status screen
- Added option --markov-hcstat2 to make it clear that the new hcstat2 format (compressed hcstat2gen output) must be used
- Allow bitcoin master key lengths other than 96 bytes (but they must be always multiples of 16)
- Allow hashfile for -m 16800 to be used with -m 16801
- Allow keepass iteration count to be larger than 999999
- Changed algorithms using colon as separators in the hash to not use the hashconfig separator on parsing
- Do not allocate memory segments for bitmap tables if we don't need it - for example, in benchmark mode
- Got rid of OPTS_TYPE_HASH_COPY for Ansible Vault
- Improved the speed of the outfile folder scan when using many hashes/salts
- Increased the maximum size of edata2 in Kerberos 5 TGS-REP etype 23
- Make the masks parser more restrictive by rejecting a single '?' at the end of the mask (use ?? instead)
- Override --quiet and show final status screen in case --status is used
- Removed duplicate words in the dictionary file example.dict
- Updated Intel OpenCL runtime version check
- Work around some AMD OpenCL runtime segmentation faults
- Work around some padding issues with host compilers and OpenCL JiT on 32 and 64-bit systems

##
## Bugs
##

- Fixed a invalid scalar datatype return value in hc_bytealign() where it should be a vector datatype return value
- Fixed a problem with attack mode -a 7 together with stdout mode where the mask bytes were missing in the output
- Fixed a problem with tab completion where --self-test-disable incorrectly expected a further parameter/value
- Fixed a race condition in status view that lead to out-of-bound reads
- Fixed detection of unique ESSID in WPA-PMKID-* parser
- Fixed missing wordlist encoding in combinator mode
- Fixed speed/delay problem when quitting while the outfile folder is being scanned
- Fixed the ciphertext max length in Ansible Vault parser
- Fixed the tokenizer configuration in Postgres hash parser
- Fixed the byte order of digest output for hash-mode 11800 (Streebog-512)

* changes v4.2.0 -> v4.2.1

##
## Improvements
##

- Try to evaluate available OpenCL device memory and use this information instead of total available OpenCL device memory for autotune

##
## Bugs
##

- Fixed a buffer overflow in precompute_salt_md5() in case salt was longer than 64 characters

* changes v4.1.0 -> v4.2.0

##
## Algorithms
##

- Added hash-mode 16700 = FileVault 2
- Added hash-mode 16800 = WPA-PMKID-PBKDF2
- Added hash-mode 16801 = WPA-PMKID-PMK
- Added hash-mode 16900 = Ansible Vault

##
## Improvements
##

- Added JtR-compatible support for hex notation in rules engine
- Added OpenCL device utilization to the status information in machine-readable output
- Added missing NV Tesla and Titan GPU details to tuning database
- General file handling: Abort if a byte order mark (BOM) was detected in a wordlist, hashlist, maskfile or rulefile
- HCCAPX management: Use advanced hints in message_pair stored by hcxtools about endian bitness of replay counter
- OpenCL kernels: Abort session if kernel self-test fails
- OpenCL kernels: Add '-pure' prefix to kernel filenames to avoid problems caused by reusing existing hashcat installation folder
- OpenCL kernels: Removed the use of 'volatile' in inline assembly instructions where it is not needed
- OpenCL kernels: Switched array pointer types in function declarations in order to be compatible with OpenCL 2.0
- Refactored code for --progress-only and --speed-only calculation
- SIP cracking: Increased the nonce field to allow a salt of 1024 bytes
- TrueCrypt/VeraCrypt cracking: Do an entropy check on the TC/VC header on start

##
## Bugs
##

- Fixed a function declaration attribute in -m 8900 kernel leading to unusable -m 9300 which shares kernel code with -m 8900
- Fixed a miscalculation in --progress-only mode output for extremely slow kernels like -m 14800
- Fixed a missing check for errors on OpenCL devices leading to invalid removal of restore file
- Fixed a missing kernel in -m 5600 in combination with -a 3 and -O if mask is >= 16 characters
- Fixed detection of AMD_GCN version in case the rocm driver is used
- Fixed missing code section in -m 2500 and -m 2501 to crack corrupted handshakes with a LE endian bitness base
- Fixed a missing check for hashmodes using OPTS_TYPE_PT_UPPER causing the self-test to fail when using combinator- and hybrid-mode

* changes v4.0.1 -> v4.1.0

##
## Features
##

- Added option --benchmark-all to benchmark all hash-modes (not just the default selection)
- Removed option --gpu-temp-retain that tried to retain GPU temperature at X degrees celsius - please use driver-specific tools
- Removed option --powertune-enable to enable power tuning - please use driver specific tools

##
## Algorithms
##

- Added hash-mode 16000 = Tripcode
- Added hash-mode 16100 = TACACS+
- Added hash-mode 16200 = Apple Secure Notes
- Added hash-mode 16300 = Ethereum Pre-Sale Wallet, PBKDF2-SHA256
- Added hash-mode 16400 = CRAM-MD5 Dovecot
- Added hash-mode 16500 = JWT (JSON Web Token)
- Added hash-mode 16600 = Electrum Wallet (Salt-Type 1-2)

##
## Bugs
##

- Fixed a configuration setting for -m 400 in pure kernel mode which said it was capable of doing SIMD when it is not
- Fixed a hash parsing problem for 7-Zip hashes: allow a longer CRC32 data length field within the hash format
- Fixed a hash parsing problem when using --show/--left with hashes with long salts that required pure kernels
- Fixed a logic error in storing temporary progress for slow hashes, leading to invalid speeds in status view
- Fixed a mask-length check issue: return -1 in case the mask length is not within the password-length range
- Fixed a missing check for return code in case hashcat.hcstat2 was not found
- Fixed a race condition in combinator- and hybrid-mode where the same scratch buffer was used by multiple threads
- Fixed a restore issue leading to "Restore value is greater than keyspace" when mask files or wordlist folders were used
- Fixed a uninitialized value in OpenCL kernels 9720, 9820 and 10420 leading to absurd benchmark performance
- Fixed the maximum password length check in password-reassembling function
- Fixed the output of --show when $HEX[] passwords were present within the potfile

##
## Improvements
##

- OpenCL Kernels: Add a decompressing kernel and a compressing host code in order to reduce PCIe transfer time
- OpenCL Kernels: Improve performance preview accuracy in --benchmark, --speed-only and --progress-only mode
- OpenCL Kernels: Remove password length restriction of 16 for Cisco-PIX and Cisco-ASA hashes
- Terminal: Display set cost/rounds during benchmarking
- Terminal: Show [r]esume in prompt only in pause mode, and show [p]ause in prompt only in resume mode

##
## Technical
##

- Autotune: Improve autotune engine logic and synchronize results on same OpenCL devices
- Documents: Added docs/limits.txt
- Files: Copy include/ folder and its content when SHARED is set to 1 in Makefile
- Files: Switched back to relative current working directory on windows to work around problems with Unicode characters
- Hashcat Context: Fixed a memory leak in shutdown phase
- Hash Parser: Changed the way large strings are handled/truncated within the event buffer if they are too large to fit
- Hash Parser: Fixed a memory leak in shutdown phase
- Hash Parser: Fixed the use of strtok_r () calls
- OpenCL Devices: Fixed several memory leaks in shutdown phase
- OpenCL Kernels: Add general function declaration keyword (inline) and some OpenCL runtime specific exceptions for NV and CPU devices
- OpenCL Kernels: Replace variables from uXX to uXXa if used in __constant space
- OpenCL Kernels: Use a special kernel to initialize the password buffer used during autotune measurements, to reduce startup time
- OpenCL Kernels: Refactored kernel thread management from native to maximum per kernel
- OpenCL Kernels: Use three separate comparison kernels (depending on keyver) for WPA instead of one
- OpenCL Runtime: Add current timestamp to OpenCL kernel source in order to force OpenCL JiT compiler to recompile and not use the cache
- OpenCL Runtime: Enforce use of OpenCL version 1.2 to restrain OpenCL runtimes to make use of the __generic address space qualifier
- OpenCL Runtime: Updated rocm detection
- Returncode: Enforce return code 0 when the user selects --speed-only or --progress-only and no other error occurs
- Rules: Fixed some default rule-files after changing rule meaning of 'x' to 'O'
- Self Test: Skip self-test for mode 8900 - user-configurable scrypt settings are incompatible with fixed settings in the self-test hash
- Self Test: Skip self-test for mode 15700 because the settings are too high and cause startup times that are too long
- Terminal: Add workitem settings to status display (can be handy for debugging)
- Terminal: Send clear-line code to the same output stream as the message immediately following
- Timer: Switch from gettimeofday() to clock_gettime() to work around problems on cygwin
- User Options: According to getopts manpage, the last element of the option array has to be filled with zeros

* changes v4.0.0 -> v4.0.1:

##
## Improvements
##

- Changed the maximum length of the substring of a hash shown whenever the parser found a problem while parsing the hash

##
## Bugs
##

- Fixed a memory leak while parsing a wordlist
- Fixed compile of kernels on AMD systems on windows due to invalid detection of ROCm
- Fixed compile of sources using clang under MSYS2
- Fixed overlapping memory segment copy in CPU rule engine if using a specific rule function
- Fixed a parallel build problem when using the "install" Makefile target
- Fixed the version number extraction for github releases which do not including the .git directory

* changes v3.6.0 -> v4.0.0:

##
## Features
##

- Added support to crack passwords and salts up to length 256
- Added option --optimized-kernel-enable to use faster kernels but limit the maximum supported password- and salt-length
- Added self-test functionality to detect broken OpenCL runtimes on startup
- Added option --self-test-disable to disable self-test functionality on startup
- Added option --wordlist-autohex-disable to disable the automatic conversion of $HEX[] words from the word list
- Added option --example-hashes to show an example hash for each hash-mode
- Removed option --weak-hash-check (zero-length password check) to increase startup time, it also causes many Trap 6 error on macOS

##
## Algorithms
##

- Added hash-mode 2500 = WPA/WPA2 (SHA256-AES-CMAC)
- Added hash-mode 2501 = WPA/WPA2 PMK

##
## Bugs
##

- Fixed a buffer overflow in mangle_dupechar_last function
- Fixed a calculation error in get_power() leading to errors of type "BUG pw_add()!!"
- Fixed a memory problem that occurred when the OpenCL folder was not found and e.g. the shared and session folder were the same
- Fixed a missing barrier() call in the RACF OpenCL kernel
- Fixed a missing salt length value in benchmark mode for SIP
- Fixed an integer overflow in hash buffer size calculation
- Fixed an integer overflow in innerloop_step and innerloop_cnt variables
- Fixed an integer overflow in masks not skipped when loaded from file
- Fixed an invalid optimization code in kernel 7700 depending on the input hash, causing the kernel to loop forever
- Fixed an invalid progress value in status view if words from the base wordlist get rejected because of length
- Fixed a parser error for mode -m 9820 = MS Office <= 2003 $3, SHA1 + RC4, collider #2
- Fixed a parser error in multiple modes not checking for return code, resulting in negative memory index writes
- Fixed a problem with changed current working directory, for instance by using --restore together with --remove
- Fixed a problem with the conversion to the $HEX[] format: convert/hexify also all passwords of the format $HEX[]
- Fixed the calculation of device_name_chksum; should be done for each iteration
- Fixed the dictstat lookup if nanoseconds are used in timestamps for the cached files
- Fixed the estimated time value whenever the value is very large and overflows
- Fixed the output of --show when used together with the collider modes -m 9710, 9810 or 10410
- Fixed the parsing of command line options. It doesn't show two times the same error about an invalid option anymore
- Fixed the parsing of DCC2 hashes by allowing the "#" character within the user name
- Fixed the parsing of descrypt hashes if the hashes do have non-standard characters within the salt
- Fixed the use of --veracrypt-pim option. It was completely ignored without showing an error
- Fixed the version number used in the restore file header

##
## Improvements
##

- Autotune: Do a pre-autotune test run to find out if kernel runtime is above some TDR limit
- Charset: Add additional DES charsets with corrected parity
- OpenCL Buffers: Do not allocate memory for amplifiers for fast hashes, it's simply not needed
- OpenCL Kernels: Improved performance of SHA-3 Kernel (keccak) by hardcoding the 0x80 stopbit
- OpenCL Kernels: Improved rule engine performance by 6% on for NVidia
- OpenCL Kernels: Move from ld.global.v4.u32 to ld.const.v4.u32 in _a3 kernels
- OpenCL Kernels: Replace bitwise swaps with rotate() versions for AMD
- OpenCL Kernels: Rewritten Keccak kernel to run fully on registers and partially reversed last round
- OpenCL Kernels: Rewritten SIP kernel from scratch
- OpenCL Kernels: Thread-count is set to hardware native count except if -w 4 is used then OpenCL maximum is used
- OpenCL Kernels: Updated default scrypt TMTO to be ideal for latest NVidia and AMD top models
- OpenCL Kernels: Vectorized tons of slow kernels to improve CPU cracking speed
- OpenCL Runtime: Improved detection for AMD and NV devices on macOS
- OpenCL Runtime: Improved performance on Intel MIC devices (Xeon PHI) on runtime level (300MH/s to 2000MH/s)
- OpenCL Runtime: Updated AMD ROCm driver version check, warn if version < 1.1
- Show cracks: Improved the performance of --show/--left if used together with --username
- Startup: Add visual indicator of active options when benchmarking
- Startup: Check and abort session if outfile and wordlist point to the same file
- Startup: Show some attack-specific optimizer constraints on start, eg: minimum and maximum support password- and salt-length
- WPA cracking: Improved nonce-error-corrections mode to use a both positive and negative corrections

##
## Technical
##

- General: Update C standard from c99 to gnu99
- Hash Parser: Improved salt-length checks for generic hash modes
- HCdict File: Renamed file from hashcat.hcdict to hashcat.hcdict2 and add header because versions are incompatible
- HCstat File: Add code to read LZMA compressed hashcat.hcstat2
- HCstat File: Add hcstat2 support to enable masks of length up to 256, also adds a filetype header
- HCstat File: Renamed file from hashcat.hcstat to hashcat.hcstat2 and add header because versions are incompatible
- HCtune File: Remove apple related GPU entries to workaround Trap 6 error
- OpenCL Kernels: Added code generator for most of the switch_* functions and replaced existing code
- OpenCL Kernels: Declared all include functions as static to reduce binary kernel cache size
- OpenCL Kernels: On AMD GPU, optimized kernels for use with AMD ROCm driver
- OpenCL Kernels: Removed some include functions that are no longer needed to reduce compile time
- OpenCL Runtime: Fall back to 64 threads default (from 256) on AMD GPU to prevent creating too many workitems
- OpenCL Runtime: Forcing OpenCL 1.2 no longer needed. Option removed from build options
- OpenCL Runtime: On AMD GPU, recommend AMD ROCm driver for Linux
- Restore: Fixed the version number used in the restore file header
- Time: added new type for time measurements hc_time_t and related functions to force the use of 64 bit times

* changes v3.5.0 -> v3.6.0:

##
## Algorithms
##

- Added hash-mode   600 = BLAKE2-512
- Added hash-mode 15200 = Blockchain, My Wallet, V2
- Added hash-mode 15300 = DPAPI masterkey file v1 and v2
- Added hash-mode 15400 = ChaCha20
- Added hash-mode 15500 = JKS Java Key Store Private Keys (SHA1)
- Added hash-mode 15600 = Ethereum Wallet, PBKDF2-HMAC-SHA256
- Added hash-mode 15700 = Ethereum Wallet, PBKDF2-SCRYPT

##
## Features
##

- 7-Zip cracking: increased max. data length to 320k and removed AES padding attack to avoid false negatives
- Dictionary cache: Show time spent on dictionary cache building at startup
- Rules: Support added for position 'p' (Nth instance of a character) in host mode (using -j or -k)
- Rules: Support added for rejection rule '_N' (reject plains of length not equal to N) in host mode
- Rules: Support added for rule 'eX'
- Wordlist encoding: Added parameters --encoding-from and --encoding-to to configure wordlist encoding handling
- Wordlist encoding: Support added for internal conversion between user-defined encodings during runtime

##
## Workarounds
##

- Workaround added for NVIDIA NVML library: If libnvidia-ml.so couldn't be loaded, try again using libnvidia-ml.so.1

##
## Improvements
##

- WPA cracking: Improved nonce-error-corrections mode to fix corrupt nonces generated on big-endian devices

##
## Bugs
##

- Fixed a condition that caused hybrid attacks using a maskfile to not select all wordlists from a wordlist folder
- Fixed a memory leak that was present when a user periodically prints hashcat status (using --status-timer)
- Fixed a missing type specifier in a function declaration of the RACF kernel

##
## Technical
##

- Building: In the binary release packages, link libiconv static for Windows binaries
- Dictstat: Structure for dictstat file changed to include --encoding-from and --encoding-to parameters
- OpenCL Runtime: Updated AMDGPU-PRO driver version check, warn if version 17.10 (known to be broken) is detected
- WPA cracking: Reduced --nonce-error-corrections default from 16 to 8 to compensate for speed drop caused by big-endian fixes

* changes v3.40 -> v3.5.0:

##
## Features
##

- WPA cracking: Added support for WPA/WPA2 handshake AP nonce automatic error correction
- WPA cracking: Added parameter --nonce-error-corrections to configure range of error correction

##
## Algorithms
##

- Added hash-mode 15100 = Juniper/NetBSD sha1crypt

##
## Improvements
##

- Abbreviate long hashes to display the Hash.Target status line within 80 characters
- Refactored internal use of esalt to sync with the number of digests instead of the number of salts
- Refactored other output to display within 80 characters without wrapping

##
## Bugs
##

- Fixed a hash validation error when trying to load Android FDE < 4.3 hashes
- Fixed a problem where --keyspace combined with custom charsets incorrectly displayed an error message
- Fixed a problem where --stdout combined with custom charsets incorrectly displayed an error message
- Fixed a problem with parsing and displaying -m 7000 = Fortigate (FortiOS) hashes
- Fixed a race condition after sessions finish, where the input-base was freed but accessed afterwards
- Fixed a typo that resulted in the minimum password length not being correctly initialized
- Fixed --outfile-format formats 11 through 15 to show the correct crack position
- Fixed --remove to apply even when all hashes are either found in the potfile or detected in weak-hash checks

##
## Technical
##

- Building: Added missing prototypes for atlassian_parse_hash function
- Dictionary Cache: Split long status line into multiple lines to stay < 80 chars
- Files: Detect and error when users try to use -r with a parameter which is not a file
- HCCAPX Parser: Added support for a special bit (bit 8) of the message_pair that indicates if replay counters match
- Parameter: Detect and error when users try to use an empty string (length 0) for parameters like --session=
- Parameter: Detect and error when users try to use non-digit input when only digits are expected
- Sessions: Improved string comparison in case user sets --session to "hashcat"
- Status View: Add rejected counter to machine-readable output
- Status View: Rename labels Input.Mode, Input.Base, ... to Guess.Mode, Guess.Base, ...
- Status View: Added a visual indicator to the status screen when checkpoint quit has been requested
- Versions: Changed version naming convention from x.yz to x.y.z

* changes v3.30 -> v3.40:

##
## Features
##

- Added support for loading hccapx files
- Added support for filtering hccapx message pairs using --hccapx-message-pair
- Added support for parsing 7-Zip hashes with LZMA/LZMA2 compression indicator set to a non-zero value
- Added support for decompressing LZMA1/LZMA2 data for -m 11600 = 7-Zip to validate the CRC
- Added support for automatic merge of LM halves in case --show and --left is used
- Added support for showing all user names with --show and --left if --username was specified
- Added support for GPU temperature management on cygwin build

##
## Algorithms
##

- Added hash-mode  1411 = SSHA-256(Base64), LDAP {SSHA256}
- Added hash-mode  3910 = md5(md5($pass).md5($salt))
- Added hash-mode  4010 = md5($salt.md5($salt.$pass))
- Added hash-mode  4110 = md5($salt.md5($pass.$salt))
- Added hash-mode  4520 = sha1($salt.sha1($pass))
- Added hash-mode  4522 = PunBB
- Added hash-mode  7000 = Fortigate (FortiOS)
- Added hash-mode 12001 = Atlassian (PBKDF2-HMAC-SHA1)
- Added hash-mode 14600 = LUKS
- Added hash-mode 14700 = iTunes Backup < 10.0
- Added hash-mode 14800 = iTunes Backup >= 10.0
- Added hash-mode 14900 = Skip32
- Added hash-mode 15000 = FileZilla Server >= 0.9.55

##
## Workarounds
##

- Workaround added for AMDGPU-Pro OpenCL runtime: AES encrypt and decrypt Invertkey function was calculated wrong in certain cases
- Workaround added for AMDGPU-Pro OpenCL runtime: RAR3 kernel require a volatile variable to work correctly
- Workaround added for Apple OpenCL runtime: bcrypt kernel requires a volatile variable because of a compiler optimization bug
- Workaround added for Apple OpenCL runtime: LUKS kernel requires some volatile variables because of a compiler optimization bug
- Workaround added for Apple OpenCL runtime: TrueCrypt kernel requires some volatile variables because of a compiler optimization bug
- Workaround added for NVidia OpenCL runtime: RACF kernel requires EBCDIC lookup to be done on shared memory

##
## Bugs
##

- Fixed a problem within the Kerberos 5 TGS-REP (-m 13100) hash parser
- Fixed clEnqueueNDRangeKernel(): CL_UNKNOWN_ERROR caused by an invalid work-item count during weak-hash-check
- Fixed cracking of PeopleSoft Token (-m 13500) if salt length + password length is >= 128 byte
- Fixed cracking of Plaintext (-m 99999) in case MD4 was used in a previous session
- Fixed DEScrypt cracking in BF mode in case the hashlist contains more than 16 times the same salt
- Fixed duplicate detection for WPA handshakes with the same ESSID
- Fixed nvapi datatype definition for NvS32 and NvU32
- Fixed overflow in bcrypt kernel in expand_key() function
- Fixed pointer to local variable outside scope in case -j or -k is used
- Fixed pointer to local variable outside scope in case --markov-hcstat is not used
- Fixed recursion in loopback handling when session was aborted by the user
- Fixed rule 'O' (RULE_OP_MANGLE_OMIT) in host mode in case the offset + length parameter equals the length of the input word
- Fixed rule 'i' (RULE_OP_MANGLE_INSERT) in host mode in case the offset parameter equals the length of the input word
- Fixed string not null terminated inside workaround for checking drm driver path
- Fixed string not null terminated while reading maskfiles
- Fixed truncation of password after position 32 with the combinator attack
- Fixed use of option --keyspace in combination with -m 2500 (WPA)
- Fixed WPA/WPA2 cracking in case eapol frame is >= 248 byte

##
## Technical
##

- Building: Add SHARED variable to Makefile to choose if hashcat is build as static or shared binary (using libhashcat.so/hashcat.dll)
- Building: Removed compiler option -march=native as this created problems for maintainers on various distributions
- Building: Removed the use of RPATH on linker level
- Building: Replaced linking of CRT_glob.o with the use of int _dowildcard
- Commandline: Do some checks related to custom-charset options if user specifies them
- CPU Affinity: Fixed memory leak in case invalid cpu Id was specified
- Dispatcher: Fixed several memory leaks in case an OpenCL error occurs
- Events: Improved the maximum event message handling. event_log () will now also internally make sure that the message is properly terminated
- File Locking: Improved error detection on file locks
- File Reads: Fixed memory leak in case outfile or hashfile was not accessible
- File Reads: Improved error detection on file reads, especially when getting the file stats
- Files: Do several file and folder checks on startup rather than when they are actually used to avoid related error after eventual intense operations
- Hardware Management: Bring back kernel exec timeout detection for NVidia on user request
- Hardware Monitor: Fixed several memory leaks in case hash-file writing (caused by --remove) failed
- Hardware Monitor: Fixed several memory leaks in case no hardware monitor sensor is found
- Hardware Monitor: In case NVML initialization failed, do not try to initialize NVAPI or XNVCTRL because they both depend on NVML
- Hash Parsing: Added additional bound checks for the SIP digest authentication (MD5) parser (-m 11400)
- Hash Parsing: Make sure that all files are correctly closed whenever a hash file parsing error occurs
- Helper: Added functions to check existence, type, read- and write-permissions and rewrite sources to use them instead of stat()
- Keyfile handling: Make sure that the memory is cleanly freed whenever a VeraCrypt/TrueCrypt keyfile fails to load
- Mask Checks: Added additional memory cleanups after parsing/verifying masks
- Mask Checks: Added integer overflow detection for a keyspace of a mask provided by user
- Mask Increment: Fixed memory leak in case mask_append() fails
- OpenCL Device: Do a check on available constant memory size and abort if it's less than 64kB
- OpenCL Device Management: Fixed several memory leaks in case initialization of an OpenCL device or platform failed
- OpenCL Header: Updated CL_* errorcode to OpenCL 1.2 standard
- OpenCL Kernel: Move kernel binary buffer from heap to stack memory
- OpenCL Kernel: Refactored read_kernel_binary to load only a single kernel for a single device
- OpenCL Kernel: Remove "static" keyword from function declarations; Causes older Intel OpenCL runtimes to fail compiling
- OpenCL Kernel: Renumbered hash-mode 7600 to 4521
- OpenCL Runtime: Added a warning about using Mesa OpenCL runtime
- OpenCL Runtime: Updated AMDGPU-Pro driver version check, do warn if version 16.60 is detected which is known to be broken
- Outfile Check: Fixed a memory leak for failed outfile reads
- Restore: Add some checks on the rd->cwd variable in restore case
- Rule Engine: Fixed several memory leaks in case loading of rules failed
- Session Management: Automatically set dedicated session names for non-cracking parameters, for example: --stdout
- Session Management: Fixed several memory leaks in case profile- or install-folder setup failed
- Sessions: Move out handling of multiple instance from restore file into separate pidfile
- Status screen: Do not try to clear prompt in --quiet mode
- Tests: Fixed the timeout status code value and increased the runtime to 400 seconds
- Threads: Restored strerror as %m is unsupported by the BSDs
- Wordlists: Disable dictstat handling for hash-mode 3000 as it virtually creates words in the wordlist which is not the case for other modes
- Wordlists: Fixed memory leak in case access a file in a wordlist folder fails
- WPA: Changed format for outfile and potfile from essid:mac1:mac2 to hash:mac_ap:mac_sta:essid
- WPA: Changed format for outfile_check from essid:mac1:mac2 to hash

* changes v3.20 -> v3.30:

##
## Features
##

- Files: Use $HEX[...] in case the password includes the separator character, increases potfile reading performance
- Files: If the user specifies a folder to scan for wordlists instead of directly a wordlist, then ignore the hidden files
- Loopback: Include passwords for removed hashes present in the potfile to next loopback iteration
- New option --progress-only: Quickly provides ideal progress step size and time to process on the user hashes and selected options, then quit
- Status screen: Reenabled automatic status screen display in case of stdin used
- Truecrypt/Veracrypt: Use CRC32 to verify headers instead of fuzzy logic, greatly reduces false positives from 18:2^48 to 3:2^64
- WPA cracking: Reuse PBKDF2 intermediate keys if duplicate essid is detected

##
## Algorithms
##

- Added hash-mode 1300 = SHA-224

##
## Bugs
##

- Fixed buffer overflow in status screen display in case of long non-utf8 string
- Fixed buffer overflow in plaintext parsing code: Leading to segfault
- Fixed custom char parsing code in maskfiles in --increment mode: Custom charset wasn't used
- Fixed display screen to show input queue when using custom charset or rules
- Fixed double fclose() using AMDGPU-Pro on sysfs compatible platform: Leading to segfault
- Fixed hash-mode 11400 = SIP digest authentication (MD5): Cracking of hashes which did not include *auth* or *auth-int* was broken
- Fixed hex output of plaintext in case --outfile-format 4, 5, 6 or 7 was used
- Fixed infinite loop when using --loopback in case all hashes have been cracked
- Fixed kernel loops in --increment mode leading to slower performance
- Fixed mask length check in hybrid attack-modes: Do not include hash-mode dependant mask length checks
- Fixed parsing of hashes in case the last line did not include a linefeed character
- Fixed potfile loading to accept blank passwords
- Fixed runtime limit: No longer required so sample startup time after refactorization

##
## Workarounds
##

- Workaround added for Intel OpenCL runtime: GPU support is broken, skip the device unless user forces to enable it

##
## Technical
##

- Building: Added hashcat32.dll and hashcat64.dll makefile targets for building hashcat windows libraries
- Building: Added production flag in Makefile to disable all the GCC compiler options needed only for development
- Building: Removed access to readlink() on FreeBSD
- Building: For CYGWIN prefer to use "opencl.dll" (installed by drivers) instead of optional "cygOpenCL-1.dll"
- Events: Added new event EVENT_WEAK_HASH_ALL_CRACKED if all hashes have been cracked during weak hash check
- Hardware management: Switched matching ADL device with OpenCL device by using PCI bus, device and function
- Hardware management: Switched matching NvAPI device with OpenCL device by using PCI bus, device and function
- Hardware management: Switched matching NVML device with OpenCL device by using PCI bus, device and function
- Hardware management: Switched matching xnvctrl device with OpenCL device by using PCI bus, device and function
- Hardware management: Removed *throttled* message from NVML as this created more confusion than it helped
- Hash Parser: Improved error detection of invalid hex characters where hex character are expected
- OpenCL Runtime: Updated AMDGPU-Pro driver version check, do warn if version 16.50 is detected which is known to be broken
- OpenCL Runtime: Updated hashcat.hctune for Iris Pro GPU on macOS
- Potfile: In v3.10 already, the default potfile suffix changed but the note about was missing. The "hashcat.pot" became "hashcat.potfile"
- Potfile: Added old potfile detection, show warning message
- Returncode: Added dedicated returncode (see docs/status_codes.txt) for shutdowns caused by --runtime and checkpoint keypress
- Sanity: Added sanity check to disallow --speed-only in combination with -i
- Sanity: Added sanity check to disallow --loopback in combination with --runtime
- Threads: Replaced all calls to ctime() with ctime_r() to ensure thread safety
- Threads: Replaced all calls to strerror() with %m printf() GNU extension to ensure thread safety

* changes v3.10 -> v3.20:

The hashcat core was completely refactored to be a MT-safe library (libhashcat).
The goal was to help developers include hashcat into distributed clients or GUI frontends.
The CLI (hashcat.bin or hashcat.exe) works as before but from a technical perspective it's a library frontend.

##
## Features
##

- New option --speed-only: Quickly provides cracking speed per device based on the user hashes and selected options, then quit
- New option --keep-guessing: Continue cracking hashes even after they have been cracked (to find collisions)
- New option --restore-file-path: Manually override the path to the restore file (useful if we want all session files in the same folder)
- New option --opencl-info: Show details about OpenCL compatible devices like an embedded clinfo tool (useful for bug reports)
- Documents: Added colors for warnings (yellow) and errors (red) instead of WARNING: and ERROR: prefix
- Documents: Added hints presented to the user about optimizing performance while hashcat is running
- Hardware management: Support --gpu-temp-retain for AMDGPU-Pro driver
- Hardware management: Support --powertune-enable for AMDGPU-Pro driver
- Password candidates: Allow words of length > 31 in wordlists for -a 0 for some slow hashes if no rules are in use
- Password candidates: Do not use $HEX[] if the password candidate is a valid UTF-8 string and print out as-is
- Pause mode: Allow quit program also if in pause mode
- Pause mode: Ignore runtime limit in pause mode
- Status view: Show core-clock, memory-clock and execution time in benchmark-mode in case --machine-readable is activated
- Status view: Show temperature, coreclock, memoryclock, fanspeed and pci-lanes for devices using AMDGPU-Pro driver
- Status view: Show the current first and last password candidate test queued for execution per device (as in JtR)
- Status view: Show the current position in the queue for both base and modifier (Example: Wordlist 2/5)
- Markov statistics: Update hashcat.hcstat which is used as reference whenever the user defines a mask
- Charsets: Added lowercase ascii hex (?h) and uppercase ascii hex (?H) as predefined charsets

##
## Algorithms
##

- Added hash-mode 14000 = DES (PT = $salt, key = $pass)
- Added hash-mode 14100 = 3DES (PT = $salt, key = $pass)
- Added hash-mode 14400 = SHA1(CX)
- Added hash-mode 99999 = Plaintext
- Extended hash-mode 3200 = bcrypt: Accept signature $2b$ (February 2014)
- Improved hash-mode 8300 = DNSSEC: Additional parsing error detection

##
## Bugs
##

- Custom charset from file parsing code did not return an error if an error occurred
- Fix some clSetKernelArg() size error that caused slow modes to not work anymore in -a 1 mode
- Hash-mode 11600 = (7-Zip): Depending on input hash a clEnqueueReadBuffer(): CL_INVALID_VALUE error occurred
- Hash-mode 22 = Juniper Netscreen/SSG (ScreenOS): Fix salt length for -m 22 in benchmark mode
- Hash-Mode 5500 = NetNTLMv1 + ESS: Fix loading of NetNTLMv1 + SSP hash
- Hash-mode 6000 = RipeMD160: Fix typo in array index number
- If cracking a hash-mode using unicode passwords, length check of a mask was not taking into account
- If cracking a large salted hashlist the wordlist reject code was too slow to handle it, leading to 0H/s
- Null-pointer dereference in outfile-check shutdown code when using --outfile-check-dir, leading to segfault
- On startup hashcat tried to access the folder defined in INSTALL_FOLDER, leading to segfault if that folder was not existing
- Random rules generator code used invalid parameter for memory copy function (M), leading to use of invalid rule
- Sanity check for --outfile-format was broken if used in combination with --show or --left

##
## Workarounds
##

- Workaround added for AMDGPU-Pro OpenCL runtime: Failed to compile hash-mode 10700 = PDF 1.7 Level 8
- Workaround added for AMDGPU-Pro OpenCL runtime: Failed to compile hash-mode 1800 = sha512crypt
- Workaround added for NVidia OpenCL runtime: Failed to compile hash-mode 6400 = AIX {ssha256}
- Workaround added for NVidia OpenCL runtime: Failed to compile hash-mode 6800 = Lastpass + Lastpass sniffed
- Workaround added for macOS OpenCL runtime: Failed to compile hash-mode 10420 = PDF 1.1 - 1.3 (Acrobat 2 - 4)
- Workaround added for macOS OpenCL runtime: Failed to compile hash-mode 1100 = Domain Cached Credentials (DCC), MS Cache
- Workaround added for macOS OpenCL runtime: Failed to compile hash-mode 13800 = Windows 8+ phone PIN/Password
- Workaround added for pocl OpenCL runtime: Failed to compile hash-mode 5800 = Android PIN

##
## Performance
##

- Improved performance for rule-based attacks for _very_ fast hashes like MD5 and NTLM by 30% or higher
- Improved performance for DEScrypt on AMD, from 373MH/s to 525MH/s
- Improved performance for raw DES-based algorithms (like LM) on AMD, from 1.6GH/s to 12.5GH/s
- Improved performance for raw SHA256-based algorithms using meet-in-the-middle optimization, reduces 7/64 steps
- Improved performance for SAP CODVN B (BCODE) and SAP CODVN F/G (PASSCODE) due to register handling optimization, gives 3% and 25%
- Improved performance by reducing maximum number of allowed function calls per rule from 255 to 31
- Improved performance by update the selection when to use #pragma unroll depending on OpenCL runtime vendor

- Full performance comparison sheet v3.10 vs. v3.20: https://docs.google.com/spreadsheets/d/1B1S_t1Z0KsqByH3pNkYUM-RCFMu860nlfSsYEqOoqco/edit#gid=1591672380

##
## Technical
##

- Autotune: Do not run any caching rounds in autotune in DEBUG mode if -n and -u are specified
- Bash completion: Removed some v2.01 leftovers in the bash completion configuration
- Benchmark: Do not control fan speed in benchmark mode
- Benchmark: On macOS, some hash-modes can't compile because of macOS OpenCL runtime. Skip them and move on to the next
- Building: Added Makefile target "main_shared", a small how-to-use libhashcat example
- Building: Added many additional compiler warning flags in Makefile to improve static code error detection
- Building: Added missing includes for FreeBSD
- Building: Added some types for windows only in case _BASETSD_H was not set
- Building: Changed Makefile to strip symbols in the linker instead of the compiler
- Building: Defined NOMINMAX macro to prevent definition min and max macros in stdlib header files
- Building: Enabled ASLR and DEP for Windows builds
- Building: Fixed almost all errors reported by cppcheck and scan-build
- Building: On macOS, move '-framework OpenCL' from CFLAGS to LDFLAGS
- Building: On macOS, use clang as default compiler
- Building: Support building on Msys2 environment
- Building: Use .gitmodules to simplify the OpenCL header dependency handling process
- Charsets: Added DES_full.charset
- Data Types: Replaced all integer macros with enumerator types
- Data Types: Replaced all integer variables with true bool variables in case they are used as a bool
- Data Types: Replaced all string macros with static const char types
- Data Types: Replaced all uint and uint32_t to u32
- Data Types: Replaced atoi() with atoll(). Eliminates sign conversion warnings
- Documents: Added docs/credits.txt
- Documents: Added docs/team.txt
- Documents: Changed rules.txt to match v3.20 limitations
- Error handling (file handling): Fixed a couple of filepointer leaks
- Error handling (format strings): Fixed a few printf() formats, ex: use %u instead of %d for uint32_t
- Error handling (memory allocation): Removed memory allocation checks, just print to stderr instead
- Error handling (startup): Added some missing returncode checks to get_exec_path()
- Fanspeed: Check both fanpolicy and fanspeed returncode and disable retain support if any of them fail
- Fanspeed: Minimum fanspeed for retain support increased to 33%, same as NV uses as default on windows
- Fanspeed: Reset PID controller settings to what they were initially
- Fanspeed: Set fan speed to default on quit
- File handling: Do a single write test (for files to be written later) directly on startup
- File locking: Use same locking mechanism in potfile as in outfile
- Hardware management: Fixed calling conventions for ADL, NvAPI and NVML on windows
- Hardware management: Improved checking for successful load of the NVML API
- Hardware management: In case fanspeed can not be set, disable --gpu-temp-retain automatically
- Hardware management: In case of initialization error show it only once to the user on startup
- Hardware management: Refactored all code to return returncode (0 or -1) instead of data for more easy error handling
- Hardware management: Refactored macros to real functions
- Hardware management: Removed kernel exec timeout detection on NVIDIA, should no longer occur due to autotune
- Hardware management: Replaced NVML registry functions macros with their ascii versions (Adds NVML support for XP)
- Hashlist loading: Do not load data from hashfile if hashfile changed during runtime
- Kernel cache: Fixed checksum building on oversized device version or driver version strings
- Logging: Improved variable names in hashcat.log
- Loopback: Refactored --loopback support completely, no longer a recursive function
- Memory management: Fixed some memory leaks on shutdown
- Memory management: Got rid of all global variables
- Memory management: Got rid of local_free() and global_free(), no longer required
- Memory management: Refactored all variables with HCBUFSIZ_LARGE size from stack to heap, macOS doesn't like that
- OpenCL Headers: Select OpenCL headers tagged for OpenCL 1.2, since we use -cl-std=CL1.2
- OpenCL Kernels: Added const qualifier to variable declaration of matching global memory objects
- OpenCL Kernels: Got rid of one global kernel_threads variable
- OpenCL Kernels: Moved OpenCL requirement from v1.1 to v1.2
- OpenCL Kernels: Recognize reqd_work_group_size() values from OpenCL kernels and use them in the host if possible
- OpenCL Kernels: Refactored common function append_0x01()
- OpenCL Kernels: Refactored common function append_0x02()
- OpenCL Kernels: Refactored common function append_0x80()
- OpenCL Kernels: Refactored rule function append_block1()
- OpenCL Kernels: Refactored rule function rule_op_mangle_delete_last()
- OpenCL Kernels: Refactored rule function rule_op_mangle_dupechar_last()
- OpenCL Kernels: Refactored rule function rule_op_mangle_rotate_left()
- OpenCL Kernels: Refactored rule function rule_op_mangle_rotate_right()
- OpenCL Kernels: Support mixed kernel thread count for mixed kernels in the same source file
- OpenCL Kernels: Switch from clz() to ffz() for bitsliced algorithms
- OpenCL Kernels: Using platform vendor name is better than using device vendor name for function detection
- OpenCL Runtime: Updated AMDGPU-Pro and AMD Radeon driver version check
- OpenCL Runtime: Updated Intel OpenCL runtime version check
- OpenCL Runtime: Updated NVIDIA driver version check
- Password candidates: The maximum word length in a wordlist is 31 not 32, because 0x80 will eventually be appended
- Potfile: Base logic switched; Assuming the potfile is larger than the hashlist it's better to load hashlist instead of potfile entries
- Potfile: In case all hashes were cracking using potfile abort and inform user
- Restore: Automatically unlink restore file if all hashes have been cracked
- Restore: Do not unlink restore file if restore is disabled
- Rules: Refactored macros to real functions
- Status: Added Input.Queue.Base and Input.Queue.Mod to help the user better understand this concept
- Status: Do not wait for the progress mutex to read and store speed timer
- Status: Do not show Recovered/Time when cracking < 1000 hashes
- Status: Do not show Recovered/Time as floats but as integers to reduce over-information
- Tests: Removed rules_test/ subproject: Would require total rewrite but not used in a long time
- Threads: Replaced all calls to getpwuid() with getpwuid_r() to ensure thread safety
- Threads: Replaced all calls to gmtime() with gmtime_r() to ensure thread safety
- Threads: Replaced all calls to strtok() with strtok_r() to ensure thread safety
- Wordlists: Use larger counter variable to handle larger wordlists (that is > 2^32 words)
- X11: Detect missing coolbits and added some help text for the user how to fix it

* changes v3.00 -> v3.10:

##
## Improvements
##

- Added mask display to modes 3, 6, and 7. Allows the user to see the custom character set used during the run
- Make Linux build POSIX compatible; Also allow it to actually compile on musl-libc systems
- Add support to compile on FreeBSD
- Make use of cl_context_properties[] to clCreateContext(), even if OpenCL specification allow the use of NULL, some runtimes fail without
- The Time.Estimated attribute in status display should also show --runtime limit if user set it
- Fix some strict aliasing rule violation on older compilers
- Fix some variable initializers on older compilers
- Replace DARWIN macro with compiler predefined macro __APPLE__
- Replace LINUX macro with compiler predefined macro __linux__
- Allow the use of enc_id == 0 in hash-mode 10600 and 10700 as it takes no part in the actual computation
- Get rid of exit() calls in OpenCL wrapper library with the goal to have a better control which error can be ignored under special circumstances
- Do not error and exit if an OpenCL platform has no devices, just print a warning and continue with the next platform
- Workaround for OpenCL runtimes which do not accept -I parameter in the OpenCL kernel build options even if this is an OpenCL standard option
- Workaround for OpenCL runtimes which do accept -I parameter in the OpenCL kernel build options, but do not allow quotes
- Output cracked hashes on Windows using \r\n and not \n
- Replace RegGetValue() with RegQueryValueEx() to enable Windows XP 32 bit compatibility
- Slightly increased NVidias rule-processing performance by using generic instructions instead of byte_perm()
- Add support for @ rule (RULE_OP_MANGLE_PURGECHAR) to use on GPU
- Add support for --outfile (short -o) to be used together with --stdout
- Skip periodic status output whenever --stdout is used together with stdin mode, but no outfile was specified
- Show error message if --show is used together with --outfile-autohex-disable (this is currently not supported)
- Show error message if --skip/--limit is used together with mask files or --increment
- Workaround for NVidia OpenCL runtime bug causing -m 6223 to not crack any hashes even with the correct password candidate

##
## Bugs
##

- Fixed a bug where CRAM MD5 checked salt length instead of hash length
- Fixed a bug where hashcat is suppressing --machine-readable output in the final status update
- Fixed a bug where hashcat did not check the return of realpath() and crashes uncontrolled if the path does not exist
- Fixed a bug where hashcat crashes for accessing deallocated buffer if user spams "s" shortly before hashcat shuts down
- Fixed a bug where hashcat crashes in case of a scrypt P setting > 1
- Fixed a bug where hashcat did not correctly use the newly cracked plains whenever --loopback or the induction folder was used
- Fixed a bug where hashcat did not correctly remove hashes of type WPA/WPA2 even if present in potfile
- Fixed a bug where hashcat reported an invalid password for a zero-length password in LM
- Fixed a bug where hashcat did not take into account how long it takes to prepare a session when auto-aborting with --runtime is in use
- Fixed a bug where some kernels used COMPARE_M_SIMD instead of COMPARE_S_SIMD in singlehash mode

##
## Algorithms
##

- Added new hash-mode 13900 = OpenCart

* changes v2.01 -> v3.00:

This release marks the fusion of "hashcat" and "oclHashcat" into "hashcat".
It combines all features of all hashcat projects in one project.

##
## Features
##

- Support for Apple OpenCL runtime
- Support for NVidia OpenCL runtime (replaces CUDA)
- Support for Mesa (Gallium) OpenCL runtime
- Support for pocl OpenCL runtime
- Support for Khronos' OSS OpenCL reference implementation for building
- Support to utilize OpenCL devices-types other than GPU, ex: CPU and FPGA
- Support to utilize multiple different OpenCL platforms in parallel, ex: AMD + NV
- Support to utilize multiple different OpenCL device-types in parallel, ex: GPU + CPU
- Added option --opencl-platform to select a specific OpenCL platform
- Added option --opencl-device-types select specific OpenCL device types
- Added option --opencl-vector-width to override automatically selected vector-width size
- Added makefile native compilation target
- Added makefile install and uninstall targets
- Added autotuning engine and user-configurable tuning database
- Added current engine clock, current memory clock and pci-e lanes to the status display
- Added support for --gpu-temp-retain for NVidia GPU, both Linux and Windows
- Added execution timer of the running kernel to the status display
- Added command prompt to quit at next restore checkpoint
- Added human-readable error message for the OpenCL error codes
- Added option --potfile-path to override potfile path
- Added option --veracrypt-keyfile to set Keyfiles used, can be multiple
- Added option --veracrypt-pim to set the VeraCrypt personal iterations multiplier
- Added option --machine-readable for easier parsing of output
- Added option --powertune-enable to work with NVidia devices as well, not just AMD
- Added option --stdout to print candidates instead of trying to crack a hash

##
## Algorithms
##

- Added new hash-mode   125 = ArubaOS
- Added new hash-mode 12900 = Android FDE (Samsung DEK)
- Added new hash-mode 13000 = RAR5
- Added new hash-mode 13100 = Kerberos 5 TGS-REP etype 23
- Added new hash-mode 13200 = AxCrypt
- Added new hash-mode 13300 = AxCrypt in memory SHA1
- Added new hash-mode 13400 = Keepass 1 (AES/Twofish) and Keepass 2 (AES)
- Added new hash-mode 13500 = PeopleSoft PS_TOKEN
- Added new hash-mode 13600 = WinZip
- Added new hash-mode 137** = VeraCrypt
- Added new hash-mode 13800 = Windows 8+ phone PIN/Password

##
## Performance
##

- Full Table: https://docs.google.com/spreadsheets/d/1B1S_t1Z0KsqByH3pNkYUM-RCFMu860nlfSsYEqOoqco/edit#gid=0

##
## Improvements
##

- Reordering of files to help integration into linux distributions ~/.hashcat etc
- Use a profile directory to write temporary files (session, potfile etc.)
- Workaround dependencies on AMD APP-SDK AMD ADL, NV CUDA-SDK, NV ForceWare, NVML and NVAPI; they are no longer required
- Load external libraries dynamic at runtime instead of link them static at compile-time
- Benchmark accuracy improved; Is now on par to: singlehash -a 3 -w 3 ?b?b?b?b?b?b?b
- Benchmark no longer depends on a fixed time
- Removed option --benchmark-mode, therefore support --workload-profile in benchmark-mode
- Enabled support of --machine-readable in combination with --benchmark for automated benchmark processing
- Replaced --status-automat entirely with --machine-readable to make it more consistent among benchmark and non-benchmark mode
- Extended support from 14 to 255 functions calls per rule
- Extended password length up to 32 for 7zip
- Extended salt length up to 55 for raw hash types, eg: md5($pass.$salt)
- Extended version information
- Removed some duplicate rules in T0XlCv1, d3ad0ne and dive
- Redesigned changes.txt layout
- Redesigned --help menu layout

##
## Bugs
##

- Fixed a bug in speed display: In some situation, especially with slow hashes or lots of salts, it showed a speed of 0H/s
- Fixed a bug in restore handling: user immediately aborting after restart broke the restore file
- Fixed a bug in line counter: conditional jump or move depends on an uninitialised value
- Fixed a bug in rule-engine for NVidia devices: code for left- and right-shift were switched
- Fixed a bug in dive.rule: rules were not updated after the function 'x' was renamed to 'O'
- Fixed a bug in memory allocation "OpenCL -4 error": used uninitialized value in a special situation
- Fixed a bug in memory handling: heap buffer overflow
- Fixed a bug in memory handling: out of bounds access
- Fixed a bug in implementation of DCC2: forced default iteration count for hashes to 10240
- Fixed a bug in implementation of WPA/WPA2: MAC and nonce stay one their original position as in the hccap file
- Fixed a bug in implementation of GOST R 34.11-94: zero length passwords were not cracked
- Fixed a bug in implementation of BLAKE2-512 kernels: incorrect access of the esalt buffer

##
## Technical
##

- Removed deprecated GCC version check requirement
- Removed NPROCS from Makefile, let make automatically detect the optimal number of parallel threads
- Dropped all C++ overloading functions to normal function which helps support more OpenCL platforms
- Renamed functions in common.h to emphasize their purpose
- Refactorized fast-hash kernels to enable SIMD on all OpenCL platforms
- Refactorized SIMD handling: SIMD the inner-loop not the outer-loop to save registers
- Workaround missing clEnqueueFillBuffer() support in certain OpenCL runtimes
- Added amd_bytealign() support in non-AMD OpenCL runtimes
- Added amd_bfe() support in non-AMD OpenCL runtimes
- Added several macros to allow writing optimized code for the different OpenCL platforms
- Replaced typedef for bool with stdbool.h
- Added special DEBUG environment variables to the makefile
- Hashcat now acquires an exclusive lock before writing to any file
- Changed buffers to not use same buffer for both input and output at the same time with snprintf()
- Check for allocatable device-memory depending on kernel_accel amplifier before trying to allocate
- Added additional check for max. ESSID length to prevent possible crashes
- Use a GCC equivalent for __stdcall where applicable
- Synchronize maximum output line size with input line size
- Increased maximum hash line size to 0x50000
- Run weak-hash checks only in straight-attack mode, this greatly reduces code complexity
- Restrict loopback option to straight attack-mode
- Moved rules_optimize to hashcat-utils
- Stick to older libOpenCL in binary package to avoid errors like this: version `OPENCL_2.0' not found
- Tightened hash parser for several algorithms
- Updated old RC4 code in Kerberos 5
- Limited the salt length of Juniper Netscreen/SSG (ScreenOS) hashes to 10
- Updated algorithm used to automatically select an ideal --scrypt-tmto value
- Renamed option --gpu-accel to --kernel-accel
- Renamed option --gpu-loops to --kernel-loops
- Renamed option --gpu-devices to --opencl-devices
- Added inline declaration to functions from simd.c, common.c, rp.c and types_ocl.c to increase performance
- Dropped static declaration from functions in all kernel to achieve OpenCL 1.1 compatibility
- Added -cl-std=CL1.1 to all kernel build options
- Created environment variable to inform NVidia OpenCL runtime to not create its own kernel cache
- Created environment variable to inform pocl OpenCL runtime to not create its own kernel cache
- Dropped special 64-bit rotate() handling for NV, it seems that they've added it to their OpenCL runtime
- Completely get rid of HAVE_ADL, HAVE_NVML and HAVE_NVAPI in sources
- Replaced NVAPI with NVML on windows
