git-vain/README.md

96 lines
3.5 KiB
Markdown
Raw Permalink Normal View History

2023-08-30 07:11:48 +00:00
# git-vain
Generate vanity commit hashes quickly.
Supports:
- pgp signing (via gpg-agent or sequoia)
2023-08-31 01:28:46 +00:00
- integration with system key store for saving pgp passwords (sequoia only)
2023-08-30 07:11:48 +00:00
- arbitrary commits from history
2023-08-31 01:28:46 +00:00
- various methods (date increment/decrement, random text, counter text, header)
2023-08-30 07:11:48 +00:00
- multithreading
2023-08-31 01:28:46 +00:00
- config file for saving common options
2023-08-31 04:23:02 +00:00
## Install
Download the [latest release][] or build from source using `cargo`.
Make sure `git-vain` is in your `$PATH` or running `git vain` won't work.
To build from source, run `cargo install --path .` or `cargo build --release`
in your local checkout.
[latest release]: https://git.anna.lgbt/anna/git-vain/releases/latest
## Usage
Replace the hash of the commit at `HEAD` with one that begins with `c0ffee`:
`git vain c0ffee`
Try using `--help` for more information.
2023-08-31 04:23:02 +00:00
## Performance
Performance depends on hardware, method, and number of threads. The tests below
were performed on an AMD Ryzen 7 3800X 8-Core Processor. Each result is the
average of three trials running for 30 seconds using a single thread.
2023-08-31 04:23:02 +00:00
```
counter: 154,293,195.67 hashes (5,143,106.52/s)
random: 134,886,025.00 hashes (4,496,200.83/s)
header: 131,035,925.67 hashes (4,367,864.19/s)
increment: 95,501,212.00 hashes (3,183,373.73/s)
decrement: 95,358,885.33 hashes (3,178,629.51/s)
sequoia*: 839,872.67 hashes ( 27,995.76/s)
sequoia: 330,972.67 hashes ( 11,032.42/s)
gpg-agent: 113.67 hashes ( 3.79/s)
2023-08-31 04:23:02 +00:00
```
2023-08-31 05:55:21 +00:00
<small>The asterisked sequoia is using the `crypto-rust` feature.</small>
2023-08-31 06:25:05 +00:00
## Methods
2023-08-31 06:26:06 +00:00
`git-vain` can use one of several methods to generate different hashes for a
commit.
2023-08-31 06:25:05 +00:00
**Note that none of these are necessary when using PGP signing.** Since the
signature will be different every time, the hash will also be different every
time. If signing is enabled, none of these methods will be used.
### `increment` and `decrement`
Increases or decreases the commit's timestamp by one second each try. This is
not recommended for longer prefixes (or really at all, in the author's opinion).
### `counter`
Appends an increasing counter to the end of the commit message (in the body).
### `random`
Appends a random 32-character hexadecimal string to the end of the commit
message (in the body).
### `header`
Adds an additional `xvain` header to the commit, which contains an increasing
counter. Git ignores additional headers that aren't `gpgsig`, so this does work
and is considered valid by `git fsck`. In the author's opinion, it is doubtful
that Git would change the way headers are parsed, but it is possible, and that
would break this method (and possibly the commits created by it).
## PGP performance
Signing commits drastically reduces the speed at which `git-vain` operates. By
default, OpenSSL is used as the cryptography backend. For a moderate speedup
(see table above), you can use the RustCrypto libraries as the cryptography
backend instead. See the warnings below from sequoia.
> As of this writing, the RustCrypto crates are not recommended for general use
> as they cannot offer the same security guarantees as more mature cryptographic
> libraries.
> Some cryptographic backends can not guarantee that cryptographic operations
> require a constant amount of time. This may leak secret keys in some
> settings.
The author cannot think of a scenario in which a timing attack would matter for
`git-vain`, but these warnings are worth acknowledging.
To use the RustCrypto libraries instead, compile with `cargo build --release
--no-default-features --features crypto-rust`.