From 8fd3df030053a6d354f35facc3dea97eb83661c7 Mon Sep 17 00:00:00 2001 From: wwared <541936+wwared@users.noreply.github.com> Date: Fri, 27 Sep 2024 12:15:23 -0300 Subject: [PATCH] feat: Add sha512 test with patched sha2 crate --- .../syscall/precompiles/sha512/extend/mod.rs | 14 +- core/src/utils/programs.rs | 3 + tests/sha512/Cargo.lock | 564 ++++++++++++++++++ tests/sha512/Cargo.toml | 11 + tests/sha512/elf/riscv32im-succinct-zkvm-elf | Bin 0 -> 36220 bytes tests/sha512/src/main.rs | 17 + 6 files changed, 602 insertions(+), 7 deletions(-) create mode 100644 tests/sha512/Cargo.lock create mode 100644 tests/sha512/Cargo.toml create mode 100755 tests/sha512/elf/riscv32im-succinct-zkvm-elf create mode 100644 tests/sha512/src/main.rs diff --git a/core/src/syscall/precompiles/sha512/extend/mod.rs b/core/src/syscall/precompiles/sha512/extend/mod.rs index cea027e8d..de230aee2 100644 --- a/core/src/syscall/precompiles/sha512/extend/mod.rs +++ b/core/src/syscall/precompiles/sha512/extend/mod.rs @@ -49,7 +49,7 @@ pub mod extend_tests { runtime::{ExecutionRecord, Instruction, Opcode, Program, SyscallCode}, utils::{ self, run_test, - tests::{SHA2_ELF, SHA512_EXTEND_ELF}, + tests::{SHA512_ELF, SHA512_EXTEND_ELF}, }, }; @@ -99,12 +99,12 @@ pub mod extend_tests { run_test(program).unwrap(); } - // #[test] - // fn test_sha512_program() { 512FIXME - // utils::setup_logger(); - // let program = Program::from(SHA512_ELF); - // run_test(program).unwrap(); - // } + #[test] + fn test_sha512_program() { + utils::setup_logger(); + let program = Program::from(SHA512_ELF); + run_test(program).unwrap(); + } #[test] fn test_sha512_extend_program() { diff --git a/core/src/utils/programs.rs b/core/src/utils/programs.rs index 14cd8adbb..09a0ced21 100644 --- a/core/src/utils/programs.rs +++ b/core/src/utils/programs.rs @@ -70,6 +70,9 @@ pub mod tests { pub const SHA2_ELF: &[u8] = include_bytes!("../../../tests/sha2/elf/riscv32im-succinct-zkvm-elf"); + pub const SHA512_ELF: &[u8] = + include_bytes!("../../../tests/sha512/elf/riscv32im-succinct-zkvm-elf"); + pub const SHA512_COMPRESS_ELF: &[u8] = include_bytes!("../../../tests/sha512-compress/elf/riscv32im-succinct-zkvm-elf"); diff --git a/tests/sha512/Cargo.lock b/tests/sha512/Cargo.lock new file mode 100644 index 000000000..572fb9568 --- /dev/null +++ b/tests/sha512/Cargo.lock @@ -0,0 +1,564 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "anyhow" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "cpufeatures" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "tap", + "zeroize", +] + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "bitvec", + "rand_core", + "subtle", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "hybrid-array" +version = "0.2.0-rc.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bae36f8710514b3e7aab028021733330de6e455e0352e19c6dd4513eecb7aa9a" +dependencies = [ + "typenum", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)", + "signature", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.159" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "serde" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "git+https://github.com/sp1-patches/RustCrypto-hashes?branch=patch-v0.10.8#1f224388fdede7cef649bce0d63876d1a9e3f515" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "git+https://github.com/argumentcomputer/RustCrypto-hashes.git?branch=zkvm-next#3546a367c9638220acacda65fd9856d7fe37dfb7" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha512-test" +version = "0.1.0" +dependencies = [ + "hex", + "hex-literal", + "sha2 0.10.8 (git+https://github.com/argumentcomputer/RustCrypto-hashes.git?branch=zkvm-next)", + "sphinx-zkvm", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "sphinx-precompiles" +version = "1.0.0" +dependencies = [ + "anyhow", + "bincode", + "cfg-if", + "getrandom", + "hybrid-array", + "k256", + "serde", +] + +[[package]] +name = "sphinx-zkvm" +version = "1.0.0" +dependencies = [ + "bincode", + "cfg-if", + "getrandom", + "k256", + "lazy_static", + "libm", + "once_cell", + "rand", + "sha2 0.10.8 (git+https://github.com/sp1-patches/RustCrypto-hashes?branch=patch-v0.10.8)", + "sphinx-precompiles", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/tests/sha512/Cargo.toml b/tests/sha512/Cargo.toml new file mode 100644 index 000000000..500a3cf30 --- /dev/null +++ b/tests/sha512/Cargo.toml @@ -0,0 +1,11 @@ +[workspace] +[package] +version = "0.1.0" +name = "sha512-test" +edition = "2021" + +[dependencies] +sphinx-zkvm = { path = "../../zkvm/entrypoint" } +hex-literal = "0.4.1" +sha2 = { git = "https://github.com/argumentcomputer/RustCrypto-hashes.git", branch = "zkvm-next" } # FIXME: Point this at `zkvm` when merging +hex = "0.4.3" diff --git a/tests/sha512/elf/riscv32im-succinct-zkvm-elf b/tests/sha512/elf/riscv32im-succinct-zkvm-elf new file mode 100755 index 0000000000000000000000000000000000000000..f4c94539322e1ed13ace10eb28145492ed0480ac GIT binary patch literal 36220 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 literal 0 HcmV?d00001 diff --git a/tests/sha512/src/main.rs b/tests/sha512/src/main.rs new file mode 100644 index 000000000..3c6812686 --- /dev/null +++ b/tests/sha512/src/main.rs @@ -0,0 +1,17 @@ +#![no_main] +sphinx_zkvm::entrypoint!(main); + +use hex_literal::hex; +use sha2::{Digest, Sha512_256}; + +pub fn main() { + let data = vec![0x41u8; 4096]; + let hash = Sha512_256::digest(data); + let mut ret = [0u8; 32]; + ret.copy_from_slice(&hash); + println!("{}", hex::encode(ret)); + assert_eq!( + ret, + hex!("e2adb3b3eda0de7e5913c3cf8ada695b89ec3d79dcc6a23693b79172b0befa03") + ); +}