# Low-level cryptography utilities for Starknet
`starknet-crypto` contains utilities for performing **low-level** cryptographic operations in Starknet:
- ECDSA operations
- Signing hashes
- Verifying signatures
- Recovering public keys from signatures
- Pedersen hash
- Poseidon hash
- RFC-6979
> _You're advised to use high-level crypto utilities implemented by the `starknet-core` crate (or use it through the `starknet::core` re-export) if you're not familiar with cryptographic primitives. Using these low-level functions incorrectly could result in leaking your private key, for example._
> _This library does not provide constant-time guarantees._
## **WARNING**
While it has been tested against data randomly generated from [`cairo-lang`](https://github.com/starkware-libs/cairo-lang), this crate is _NOT_ audited or reviewed for security. **Use at your own risk**.
If you're a cryptographer, you're welcome to contribute by reviewing the implementation :)
## Benchmark
These results were generated on the author's machine with _Apple M3 Max_ running _macOS 14.5_.
For instructions on running the benchmarks yourself, check out [this page](../BENCHMARK.md).
### Native
```log
ecdsa_get_public_key time: [62.223 µs 62.231 µs 62.240 µs]
ecdsa_recover time: [253.15 µs 253.47 µs 254.13 µs]
ecdsa_sign time: [95.633 µs 95.649 µs 95.668 µs]
ecdsa_verify time: [255.70 µs 255.77 µs 255.84 µs]
pedersen_hash time: [13.021 µs 13.023 µs 13.024 µs]
poseidon_hash time: [5.0139 µs 5.0148 µs 5.0155 µs]
poseidon_hash_single time: [5.0239 µs 5.0381 µs 5.0543 µs]
poseidon_hash_many time: [10.077 µs 10.087 µs 10.100 µs]
rfc6979_generate_k time: [4.5806 µs 4.5821 µs 4.5836 µs]
```
### WebAssembly
_(Results are only provided for `wasmtime` here. Check out the [benchmark page](../BENCHMARK.md) for running the benchmark on other runtimes)._
Runtime version:
```console
$ wasmtime --version
wasmtime-cli 21.0.1 (cedf9aa0f 2024-05-22)
```
`wasmtime` results:
```log
ecdsa_get_public_key time: [333.64 µs 334.07 µs 334.48 µs]
ecdsa_recover time: [1.1177 ms 1.1207 ms 1.1248 ms]
ecdsa_sign time: [386.33 µs 387.42 µs 388.68 µs]
ecdsa_verify time: [1.1246 ms 1.1280 ms 1.1320 ms]
pedersen_hash time: [64.934 µs 64.962 µs 64.993 µs]
poseidon_hash time: [20.745 µs 20.772 µs 20.825 µs]
poseidon_hash_single time: [20.790 µs 20.813 µs 20.837 µs]
poseidon_hash_many time: [41.878 µs 41.911 µs 41.945 µs]
rfc6979_generate_k time: [11.564 µs 11.566 µs 11.569 µs]
```
## Binary size optimization
By default, `starknet-crypto` ships with a Pedersen hash implementation utilizing a lookup table for better performance. To optimize for binary size over performance, the crate offers a `pedersen_no_lookup` feature, which uses a vanilla unoptimized implementation instead.
> [!WARNING]
>
> Enabling the `pedersen_no_lookup` feature significantly slows down hashing performance by approximately a factor of `10`. Make sure you understand the impact on your use case before turning it on.
## Credits
Most of the code in this crate for the Pedersen hash implementation was inspired and modified from the awesome [`pathfinder` from Equilibrium](https://github.com/eqlabs/pathfinder/blob/b091cb889e624897dbb0cbec3c1df9a9e411eb1e/crates/pedersen/src/lib.rs).
The Poseidon hash implementation was also ported from [`pathfinder`](https://github.com/eqlabs/pathfinder/blob/00a1a74a90a7b8a7f1d07ac3e616be1cb39cf8f1/crates/stark_poseidon/src/lib.rs).
Based on this solid foundation, ECDSA functionalities were inspired and ported from the [`crypto-cpp` implementation from StarkWare](https://github.com/starkware-libs/crypto-cpp/blob/95864fbe11d5287e345432dbe1e80dea3c35fc58/src/starkware/crypto/ecdsa.cc).