Skip to content

Commit

Permalink
Aurura modexp (#111)
Browse files Browse the repository at this point in the history
Port over aurora's modexp implementation.

Signed-off-by: Danno Ferrin <[email protected]>
  • Loading branch information
shemnon authored Aug 3, 2023
1 parent 47733d5 commit 16ddcd1
Show file tree
Hide file tree
Showing 8 changed files with 1,591 additions and 171 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ TBD

### Rust

Rust needs to be installed to compile the altbn128 library. The default way to install it on Linux or OS X is:
Rust needs to be installed to compile the arithmetic and bls12-381 libraries. The default way to install it on Linux or OS X is:

```
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Expand Down
10 changes: 6 additions & 4 deletions arithmetic/arithmetic/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
[package]
name = "besu-native-arithmetic"
version = "0.11.0"
description = "Native arithemetic for EVM."
description = """Native arithemetic for EVM.
Derived from aurora - https://github.com/aurora-is-near/aurora-engine/tree/4ecee7ded1e6c78b69416e5b22388357316f7551/engine-modexp - originally CC0-1.0 license."""
license = "Apache-2.0"
authors = ["Danno Ferrin <[email protected]>"]
authors = ["Aurora Labs <[email protected]>", "Danno Ferrin <[email protected]>"]
repository = "https://github.com/hyperledger/besu-native"
edition = "2021"

[dependencies]
num-bigint = "0.4.3"
num-traits = "0.2.15"
ibig = { version = "0.3.6", default-features = false, features = ["num-traits"], optional = true }
num = { version = "0.4.0", default-features = false, features = ["alloc"] }
hex = { version = "0.4", default-features = false, features = ["alloc"] }
libc = "0.2"

[lib]
Expand Down
34 changes: 34 additions & 0 deletions arithmetic/arithmetic/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Besu native `modexp`

Originally from Aurora `modexp` [implementation](https://github.com/aurora-is-near/aurora-engine/tree/4ecee7ded1e6c78b69416e5b22388357316f7551/engine-modexp)

## What this crate is

This crate is an efficient implementation of the EVM `modexp` precompile.
This crate exposes a single public function

```rust
pub fn modexp(base: &[u8], exp: &[u8], modulus: &[u8]) -> Vec<u8>
```

This function takes the base, exponent and modulus as big-endian encoded bytes and returns the result in big-endian as well.

This crate is meant to be an efficient implementation, using as little memory as possible (for example, it does not copy the exponent slice).
The exponentiation is done using the ["binary method"](https://en.wikipedia.org/wiki/Exponentiation_by_squaring).
The multiplication steps within the exponentiation use ["Montgomery multiplication"](https://en.wikipedia.org/wiki/Montgomery_modular_multiplication).
In the case of even modulus, Montgomery multiplication does not apply directly.
However we can reduce the problem to one involving an odd modulus and one where the modulus is a power of two.
These two sub-problems can be solved efficiently (the former using Montgomery multiplication, the latter the modular arithmetic is trivial on a binary computer),
then the results are combined using the [Chinese remainder theorem](https://en.wikipedia.org/wiki/Chinese_remainder_theorem).

The primary academic references for this implementation are:

1. [Analyzing and Comparing Montgomery Multiplication Algorithms](https://www.microsoft.com/en-us/research/wp-content/uploads/1996/01/j37acmon.pdf)
2. [Montgomery Reduction with Even Modulus](http://www.people.vcu.edu/~jwang3/CMSC691/j34monex.pdf)
3. [A Cryptographic Library for the Motorola DSP56000](https://link.springer.com/content/pdf/10.1007/3-540-46877-3_21.pdf)
4. [The Art of Computer Programming Volume 2](https://www-cs-faculty.stanford.edu/~knuth/taocp.html)

## What this crate is NOT

This crate is not a general purpose big integer library.
If you need anything other than `modexp`, then you should use something like [num-bigint](https://crates.io/crates/num-bigint) or [ibig](https://crates.io/crates/ibig).
Loading

0 comments on commit 16ddcd1

Please sign in to comment.