diff --git a/Cargo.lock b/Cargo.lock index abf1af2..670ab56 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -29,12 +29,30 @@ dependencies = [ "argon2", ] +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + [[package]] name = "base64ct" version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + [[package]] name = "blake2" version = "0.10.6" @@ -54,6 +72,7 @@ dependencies = [ ] [[package]] +<<<<<<< HEAD name = "block-buffer" version = "0.11.0-rc.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -67,6 +86,12 @@ name = "cfg-if" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +======= +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +>>>>>>> 8793853 (feat(wasm): broken equi-x solver) [[package]] name = "cfg-if" @@ -120,6 +145,7 @@ dependencies = [ ] [[package]] +<<<<<<< HEAD name = "digest" version = "0.11.0-pre.10" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -131,6 +157,68 @@ dependencies = [ ] [[package]] +======= +name = "dynasm" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0cecff24995c8a5a3c3169cff4c733fe7d91aedf5d8cc96238738bfe53186b8" +dependencies = [ + "bitflags", + "byteorder", + "lazy_static", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dynasmrt" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f5eab96b8688bcbf1d2354bcfe0261005ac1dd0616747152ada34948d4e9582" +dependencies = [ + "byteorder", + "dynasm", + "fnv", + "memmap2", +] + +[[package]] +name = "equix" +version = "0.1.0" +dependencies = [ + "anubis", + "equix 0.2.3", +] + +[[package]] +name = "equix" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194df1f219a987430956f20faaf702fd4d434b1b2f7300014119854184107ac7" +dependencies = [ + "arrayvec", + "hashx", + "num-traits", + "thiserror", + "visibility", +] + +[[package]] +name = "fixed-capacity-vec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b31a14f5ee08ed1a40e1252b35af18bed062e3f39b69aab34decde36bc43e40" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +>>>>>>> 8793853 (feat(wasm): broken equi-x solver) name = "generic-array" version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -141,6 +229,7 @@ dependencies = [ ] [[package]] +<<<<<<< HEAD name = "hybrid-array" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -150,16 +239,64 @@ dependencies = [ ] [[package]] +======= +name = "hashx" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "572a61c460658ae7db71878dd2caa163f47ffe041cb40aeee1483d1ffbf5e84b" +dependencies = [ + "arrayvec", + "blake2", + "dynasmrt", + "fixed-capacity-vec", + "hex", + "rand_core 0.9.3", + "thiserror", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +>>>>>>> 8793853 (feat(wasm): broken equi-x solver) name = "libc" version = "0.2.171" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" [[package]] +<<<<<<< HEAD name = "memory_units" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" +======= +name = "memmap2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +dependencies = [ + "libc", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] +>>>>>>> 8793853 (feat(wasm): broken equi-x solver) [[package]] name = "password-hash" @@ -168,16 +305,62 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" dependencies = [ "base64ct", - "rand_core", + "rand_core 0.6.4", "subtle", ] +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + [[package]] name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" + [[package]] name = "sha2" version = "0.11.0-pre.5" @@ -203,12 +386,49 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "syn" +version = "2.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "typenum" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + [[package]] name = "version_check" version = "0.9.5" @@ -216,6 +436,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] +<<<<<<< HEAD name = "wee_alloc" version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -248,3 +469,14 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +======= +name = "visibility" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d674d135b4a8c1d7e813e2f8d1c9a58308aee4a680323066025e53132218bd91" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] +>>>>>>> 8793853 (feat(wasm): broken equi-x solver) diff --git a/Cargo.toml b/Cargo.toml index ae9e7a0..db9298a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ resolver = "2" members = ["wasm/anubis", "wasm/pow/*"] [profile.release] -strip = true +#strip = true opt-level = "s" lto = "thin" codegen-units = 1 diff --git a/README.md b/README.md index 3438948..7300bc6 100644 --- a/README.md +++ b/README.md @@ -33,3 +33,11 @@ For live chat, please join the [Patreon](https://patreon.com/cadey) and ask in t ## Packaging Status [![Packaging status](https://repology.org/badge/vertical-allrepos/anubis-anti-crawler.svg)](https://repology.org/project/anubis-anti-crawler/versions) + +## Contributors + + + + + +Made with [contrib.rocks](https://contrib.rocks). diff --git a/wasm/pow/equix/Cargo.toml b/wasm/pow/equix/Cargo.toml new file mode 100644 index 0000000..aa6ecb4 --- /dev/null +++ b/wasm/pow/equix/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "equix" +version = "0.1.0" +edition = "2024" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +equix = "0.2" + +anubis = { path = "../../anubis" } + +[lints.clippy] +nursery = { level = "warn", priority = -1 } +pedantic = { level = "warn", priority = -1 } +unwrap_used = "warn" +uninlined_format_args = "allow" +missing_panics_doc = "allow" +missing_errors_doc = "allow" +cognitive_complexity = "allow" diff --git a/wasm/pow/equix/src/lib.rs b/wasm/pow/equix/src/lib.rs new file mode 100644 index 0000000..6459418 --- /dev/null +++ b/wasm/pow/equix/src/lib.rs @@ -0,0 +1,75 @@ +use anubis::{DATA_BUFFER, DATA_LENGTH, update_nonce}; +use std::boxed::Box; +use std::mem::size_of; +use std::sync::{LazyLock, Mutex}; + +pub static RESULT_HASH: LazyLock> = LazyLock::new(|| Mutex::new([0; 16])); + +pub static VERIFICATION_HASH: LazyLock>> = + LazyLock::new(|| Box::new(Mutex::new([0; 16]))); + +#[unsafe(no_mangle)] +pub extern "C" fn anubis_work(_difficulty: u32, initial_nonce: u32, iterand: u32) -> u32 { + let data = &mut DATA_BUFFER.clone(); + let mut data_len = DATA_LENGTH.lock().unwrap(); + + // Ensure there's enough space in the buffer for the nonce (4 bytes) + if *data_len + size_of::() > data.len() { + #[cfg(target_arch = "wasm32")] + unreachable!(); + #[cfg(not(target_arch = "wasm32"))] + panic!("Not enough space in DATA_BUFFER to write nonce"); + } + + let mut nonce = initial_nonce; + + loop { + let nonce_bytes = nonce.to_le_bytes(); + let start = *data_len; + let end = start + size_of::(); + data[start..end].copy_from_slice(&nonce_bytes); + + // Update the data length + *data_len += size_of::(); + let data_slice = &data[..*data_len]; + + let result = equix::solve(data_slice).unwrap(); + + if result.len() == 0 { + nonce += iterand; + update_nonce(nonce); + continue; + } + + let mut challenge = RESULT_HASH.lock().unwrap(); + challenge.copy_from_slice(&result[0].to_bytes()); + return nonce; + } +} + +#[unsafe(no_mangle)] +pub extern "C" fn anubis_validate(nonce: u32, difficulty: u32) -> bool { + true +} + +#[unsafe(no_mangle)] +pub extern "C" fn result_hash_ptr() -> *const u8 { + let challenge = RESULT_HASH.lock().unwrap(); + challenge.as_ptr() +} + +#[unsafe(no_mangle)] +pub extern "C" fn result_hash_size() -> usize { + RESULT_HASH.lock().unwrap().len() +} + +#[unsafe(no_mangle)] +pub extern "C" fn verification_hash_ptr() -> *const u8 { + let verification = VERIFICATION_HASH.lock().unwrap(); + verification.as_ptr() +} + +#[unsafe(no_mangle)] +pub extern "C" fn verification_hash_size() -> usize { + VERIFICATION_HASH.lock().unwrap().len() +}