longfellow 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. checksums.yaml +7 -0
  2. data/CODE_OF_CONDUCT.md +10 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +152 -0
  5. data/ext/longfellow/CMakeLists.txt +76 -0
  6. data/ext/longfellow/extconf.rb +77 -0
  7. data/lib/longfellow/attribute.rb +65 -0
  8. data/lib/longfellow/c.rb +105 -0
  9. data/lib/longfellow/errors.rb +78 -0
  10. data/lib/longfellow/version.rb +5 -0
  11. data/lib/longfellow/zk_spec.rb +40 -0
  12. data/lib/longfellow.rb +162 -0
  13. data/sig/longfellow.rbs +74 -0
  14. data/vendor/longfellow-zk/LICENSE +203 -0
  15. data/vendor/longfellow-zk/lib/algebra/blas.h +121 -0
  16. data/vendor/longfellow-zk/lib/algebra/bogorng.h +68 -0
  17. data/vendor/longfellow-zk/lib/algebra/compare.h +40 -0
  18. data/vendor/longfellow-zk/lib/algebra/convolution.h +219 -0
  19. data/vendor/longfellow-zk/lib/algebra/crt.cc +42 -0
  20. data/vendor/longfellow-zk/lib/algebra/crt.h +299 -0
  21. data/vendor/longfellow-zk/lib/algebra/crt_convolution.h +114 -0
  22. data/vendor/longfellow-zk/lib/algebra/crt_test.cc +371 -0
  23. data/vendor/longfellow-zk/lib/algebra/fft.h +104 -0
  24. data/vendor/longfellow-zk/lib/algebra/fft_interpolation.h +304 -0
  25. data/vendor/longfellow-zk/lib/algebra/fft_interpolation_test.cc +168 -0
  26. data/vendor/longfellow-zk/lib/algebra/fft_test.cc +257 -0
  27. data/vendor/longfellow-zk/lib/algebra/fp.h +59 -0
  28. data/vendor/longfellow-zk/lib/algebra/fp2.h +240 -0
  29. data/vendor/longfellow-zk/lib/algebra/fp24.h +342 -0
  30. data/vendor/longfellow-zk/lib/algebra/fp24_6.h +305 -0
  31. data/vendor/longfellow-zk/lib/algebra/fp24_6_test.cc +197 -0
  32. data/vendor/longfellow-zk/lib/algebra/fp2_test.cc +280 -0
  33. data/vendor/longfellow-zk/lib/algebra/fp_generic.h +533 -0
  34. data/vendor/longfellow-zk/lib/algebra/fp_p128.h +91 -0
  35. data/vendor/longfellow-zk/lib/algebra/fp_p256.h +68 -0
  36. data/vendor/longfellow-zk/lib/algebra/fp_p256k1.h +123 -0
  37. data/vendor/longfellow-zk/lib/algebra/fp_p384.h +65 -0
  38. data/vendor/longfellow-zk/lib/algebra/fp_p521.h +62 -0
  39. data/vendor/longfellow-zk/lib/algebra/fp_test.cc +522 -0
  40. data/vendor/longfellow-zk/lib/algebra/hash.h +39 -0
  41. data/vendor/longfellow-zk/lib/algebra/interpolation.h +117 -0
  42. data/vendor/longfellow-zk/lib/algebra/interpolation_test.cc +74 -0
  43. data/vendor/longfellow-zk/lib/algebra/limb.h +153 -0
  44. data/vendor/longfellow-zk/lib/algebra/limb_test.cc +75 -0
  45. data/vendor/longfellow-zk/lib/algebra/nat.cc +32 -0
  46. data/vendor/longfellow-zk/lib/algebra/nat.h +212 -0
  47. data/vendor/longfellow-zk/lib/algebra/nat_test.cc +183 -0
  48. data/vendor/longfellow-zk/lib/algebra/nussbaumer.h +400 -0
  49. data/vendor/longfellow-zk/lib/algebra/nussbaumer_test.cc +138 -0
  50. data/vendor/longfellow-zk/lib/algebra/nussbaumerfp2_test.cc +139 -0
  51. data/vendor/longfellow-zk/lib/algebra/permutations.h +79 -0
  52. data/vendor/longfellow-zk/lib/algebra/poly.h +240 -0
  53. data/vendor/longfellow-zk/lib/algebra/poly_test.cc +123 -0
  54. data/vendor/longfellow-zk/lib/algebra/reed_solomon.h +150 -0
  55. data/vendor/longfellow-zk/lib/algebra/reed_solomon_extension.h +108 -0
  56. data/vendor/longfellow-zk/lib/algebra/reed_solomon_extension_test.cc +76 -0
  57. data/vendor/longfellow-zk/lib/algebra/reed_solomon_test.cc +473 -0
  58. data/vendor/longfellow-zk/lib/algebra/rfft.h +400 -0
  59. data/vendor/longfellow-zk/lib/algebra/rfft_test.cc +102 -0
  60. data/vendor/longfellow-zk/lib/algebra/static_string.h +29 -0
  61. data/vendor/longfellow-zk/lib/algebra/sysdep.h +495 -0
  62. data/vendor/longfellow-zk/lib/algebra/sysdep_test.cc +41 -0
  63. data/vendor/longfellow-zk/lib/algebra/twiddle.h +59 -0
  64. data/vendor/longfellow-zk/lib/algebra/utility.h +86 -0
  65. data/vendor/longfellow-zk/lib/algebra/utility_test.cc +86 -0
  66. data/vendor/longfellow-zk/lib/arrays/affine.h +56 -0
  67. data/vendor/longfellow-zk/lib/arrays/affine_test.cc +220 -0
  68. data/vendor/longfellow-zk/lib/arrays/dense.h +210 -0
  69. data/vendor/longfellow-zk/lib/arrays/eq.h +75 -0
  70. data/vendor/longfellow-zk/lib/arrays/eqs.h +137 -0
  71. data/vendor/longfellow-zk/lib/arrays/eqs_test.cc +151 -0
  72. data/vendor/longfellow-zk/lib/arrays/sparse.h +192 -0
  73. data/vendor/longfellow-zk/lib/cbor/host_decoder.h +323 -0
  74. data/vendor/longfellow-zk/lib/cbor/host_decoder_test.cc +541 -0
  75. data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor.h +594 -0
  76. data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_byte_decoder.h +150 -0
  77. data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_byte_decoder_test.cc +147 -0
  78. data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_constants.h +27 -0
  79. data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_pluck.h +110 -0
  80. data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_pluck_test.cc +55 -0
  81. data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_test.cc +174 -0
  82. data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_testing.h +98 -0
  83. data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_witness.h +312 -0
  84. data/vendor/longfellow-zk/lib/circuits/cbor_parser/mso2_test.cc +662 -0
  85. data/vendor/longfellow-zk/lib/circuits/cbor_parser/mso_test.cc +485 -0
  86. data/vendor/longfellow-zk/lib/circuits/cbor_parser/scan.h +104 -0
  87. data/vendor/longfellow-zk/lib/circuits/cbor_parser/scan_test.cc +137 -0
  88. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor.h +640 -0
  89. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor_byte_decoder.h +150 -0
  90. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor_byte_decoder_test.cc +147 -0
  91. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor_constants.h +27 -0
  92. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor_testing.h +99 -0
  93. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor_witness.h +319 -0
  94. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/lexer_test.cc +120 -0
  95. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/mdoc_examples_test.cc +89 -0
  96. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/parser_circuit_test.cc +506 -0
  97. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/parser_size_test.cc +79 -0
  98. data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/parser_test.cc +473 -0
  99. data/vendor/longfellow-zk/lib/circuits/compiler/canonicalization_test.cc +185 -0
  100. data/vendor/longfellow-zk/lib/circuits/compiler/circuit_dump.h +65 -0
  101. data/vendor/longfellow-zk/lib/circuits/compiler/compiler.h +471 -0
  102. data/vendor/longfellow-zk/lib/circuits/compiler/compiler_test.cc +110 -0
  103. data/vendor/longfellow-zk/lib/circuits/compiler/node.h +176 -0
  104. data/vendor/longfellow-zk/lib/circuits/compiler/pdqhash.h +127 -0
  105. data/vendor/longfellow-zk/lib/circuits/compiler/schedule.h +435 -0
  106. data/vendor/longfellow-zk/lib/circuits/ecdsa/verify_circuit.h +371 -0
  107. data/vendor/longfellow-zk/lib/circuits/ecdsa/verify_external_test.cc +246 -0
  108. data/vendor/longfellow-zk/lib/circuits/ecdsa/verify_test.cc +587 -0
  109. data/vendor/longfellow-zk/lib/circuits/ecdsa/verify_witness.h +201 -0
  110. data/vendor/longfellow-zk/lib/circuits/logic/bit_adder.h +140 -0
  111. data/vendor/longfellow-zk/lib/circuits/logic/bit_adder_test.cc +64 -0
  112. data/vendor/longfellow-zk/lib/circuits/logic/bit_plucker.h +247 -0
  113. data/vendor/longfellow-zk/lib/circuits/logic/bit_plucker_constants.h +35 -0
  114. data/vendor/longfellow-zk/lib/circuits/logic/bit_plucker_encoder.h +72 -0
  115. data/vendor/longfellow-zk/lib/circuits/logic/bit_plucker_test.cc +183 -0
  116. data/vendor/longfellow-zk/lib/circuits/logic/compiler_backend.h +62 -0
  117. data/vendor/longfellow-zk/lib/circuits/logic/counter.h +171 -0
  118. data/vendor/longfellow-zk/lib/circuits/logic/counter_test.cc +102 -0
  119. data/vendor/longfellow-zk/lib/circuits/logic/evaluation_backend.h +94 -0
  120. data/vendor/longfellow-zk/lib/circuits/logic/logic.h +1232 -0
  121. data/vendor/longfellow-zk/lib/circuits/logic/logic_circuit_test.cc +310 -0
  122. data/vendor/longfellow-zk/lib/circuits/logic/logic_test.cc +521 -0
  123. data/vendor/longfellow-zk/lib/circuits/logic/memcmp.h +68 -0
  124. data/vendor/longfellow-zk/lib/circuits/logic/memcmp_test.cc +148 -0
  125. data/vendor/longfellow-zk/lib/circuits/logic/polynomial.h +94 -0
  126. data/vendor/longfellow-zk/lib/circuits/logic/polynomial_test.cc +62 -0
  127. data/vendor/longfellow-zk/lib/circuits/logic/routing.h +445 -0
  128. data/vendor/longfellow-zk/lib/circuits/logic/routing_test.cc +241 -0
  129. data/vendor/longfellow-zk/lib/circuits/logic/unary.h +55 -0
  130. data/vendor/longfellow-zk/lib/circuits/logic/unary_plucker.h +77 -0
  131. data/vendor/longfellow-zk/lib/circuits/logic/unary_plucker_constants.h +37 -0
  132. data/vendor/longfellow-zk/lib/circuits/logic/unary_plucker_test.cc +53 -0
  133. data/vendor/longfellow-zk/lib/circuits/logic/unary_size_test.cc +69 -0
  134. data/vendor/longfellow-zk/lib/circuits/logic/unary_test.cc +62 -0
  135. data/vendor/longfellow-zk/lib/circuits/mac/mac_circuit.h +193 -0
  136. data/vendor/longfellow-zk/lib/circuits/mac/mac_circuit_test.cc +223 -0
  137. data/vendor/longfellow-zk/lib/circuits/mac/mac_reference.h +72 -0
  138. data/vendor/longfellow-zk/lib/circuits/mac/mac_witness.h +94 -0
  139. data/vendor/longfellow-zk/lib/circuits/mdoc/circuit_maker.cc +242 -0
  140. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_attribute_ids.h +311 -0
  141. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_attribute_test.cc +64 -0
  142. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_circuit_id.cc +85 -0
  143. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_constants.h +85 -0
  144. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_decompress.cc +41 -0
  145. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_decompress.h +27 -0
  146. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_examples.h +5232 -0
  147. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_generate_circuit.cc +199 -0
  148. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_hash.h +554 -0
  149. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_signature.h +143 -0
  150. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_signature_test.cc +444 -0
  151. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_test_attributes.h +157 -0
  152. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_witness.h +863 -0
  153. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_zk.cc +693 -0
  154. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_zk.h +216 -0
  155. data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_zk_test.cc +724 -0
  156. data/vendor/longfellow-zk/lib/circuits/mdoc/zk_spec.cc +100 -0
  157. data/vendor/longfellow-zk/lib/circuits/mdoc/zk_spec_test.cc +155 -0
  158. data/vendor/longfellow-zk/lib/circuits/sha/flatsha256_circuit.h +330 -0
  159. data/vendor/longfellow-zk/lib/circuits/sha/flatsha256_circuit_test.cc +607 -0
  160. data/vendor/longfellow-zk/lib/circuits/sha/flatsha256_io.h +26 -0
  161. data/vendor/longfellow-zk/lib/circuits/sha/flatsha256_witness.cc +163 -0
  162. data/vendor/longfellow-zk/lib/circuits/sha/flatsha256_witness.h +47 -0
  163. data/vendor/longfellow-zk/lib/circuits/sha/sha256_constants.cc +34 -0
  164. data/vendor/longfellow-zk/lib/circuits/sha/sha256_constants.h +27 -0
  165. data/vendor/longfellow-zk/lib/circuits/sha/sha256_test_values.h +389 -0
  166. data/vendor/longfellow-zk/lib/circuits/tests/anoncred/ptrcred.h +171 -0
  167. data/vendor/longfellow-zk/lib/circuits/tests/anoncred/small.h +218 -0
  168. data/vendor/longfellow-zk/lib/circuits/tests/anoncred/small_examples.h +118 -0
  169. data/vendor/longfellow-zk/lib/circuits/tests/anoncred/small_io.h +25 -0
  170. data/vendor/longfellow-zk/lib/circuits/tests/anoncred/small_test.cc +208 -0
  171. data/vendor/longfellow-zk/lib/circuits/tests/anoncred/small_witness.h +130 -0
  172. data/vendor/longfellow-zk/lib/circuits/tests/base64/decode.h +508 -0
  173. data/vendor/longfellow-zk/lib/circuits/tests/base64/decode_circuit_test.cc +95 -0
  174. data/vendor/longfellow-zk/lib/circuits/tests/base64/decode_test.cc +119 -0
  175. data/vendor/longfellow-zk/lib/circuits/tests/base64/decode_util.cc +47 -0
  176. data/vendor/longfellow-zk/lib/circuits/tests/base64/decode_util.h +29 -0
  177. data/vendor/longfellow-zk/lib/circuits/tests/ec/pk_circuit.h +231 -0
  178. data/vendor/longfellow-zk/lib/circuits/tests/ec/pk_circuit_test.cc +428 -0
  179. data/vendor/longfellow-zk/lib/circuits/tests/ec/pk_witness.h +102 -0
  180. data/vendor/longfellow-zk/lib/circuits/tests/jwt/jwt.h +190 -0
  181. data/vendor/longfellow-zk/lib/circuits/tests/jwt/jwt_constants.h +26 -0
  182. data/vendor/longfellow-zk/lib/circuits/tests/jwt/jwt_test.cc +559 -0
  183. data/vendor/longfellow-zk/lib/circuits/tests/jwt/jwt_witness.h +315 -0
  184. data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_1f.h +411 -0
  185. data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_1f_io.h +32 -0
  186. data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_1f_test.cc +364 -0
  187. data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_1f_witness.h +278 -0
  188. data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_revocation.h +146 -0
  189. data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_revocation_constants.h +25 -0
  190. data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_revocation_test.cc +315 -0
  191. data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_revocation_witness.h +136 -0
  192. data/vendor/longfellow-zk/lib/circuits/tests/pq/bitaddr/bitaddr.h +250 -0
  193. data/vendor/longfellow-zk/lib/circuits/tests/pq/bitaddr/bitaddr_test.cc +333 -0
  194. data/vendor/longfellow-zk/lib/circuits/tests/pq/bitaddr/bitaddr_witness.h +152 -0
  195. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44.h +903 -0
  196. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_circuit_test.cc +274 -0
  197. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_eval_test.cc +440 -0
  198. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_examples.cc +8851 -0
  199. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_examples.h +93 -0
  200. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_types.cc +24 -0
  201. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_types.h +118 -0
  202. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_witness.h +453 -0
  203. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_witness_test.cc +49 -0
  204. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref.cc +458 -0
  205. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref.h +150 -0
  206. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref_test.cc +398 -0
  207. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref_test_vectors.inc +3618 -0
  208. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref_test_vectors_pkdecode.inc +689 -0
  209. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref_test_vectors_sigdecode.inc +1501 -0
  210. data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/sigdecode_test_vectors.inc +540 -0
  211. data/vendor/longfellow-zk/lib/circuits/tests/ripemd/ripemd_circuit.h +394 -0
  212. data/vendor/longfellow-zk/lib/circuits/tests/ripemd/ripemd_circuit_test.cc +577 -0
  213. data/vendor/longfellow-zk/lib/circuits/tests/ripemd/ripemd_constants.h +90 -0
  214. data/vendor/longfellow-zk/lib/circuits/tests/ripemd/ripemd_witness.cc +174 -0
  215. data/vendor/longfellow-zk/lib/circuits/tests/ripemd/ripemd_witness.h +140 -0
  216. data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_circuit.h +351 -0
  217. data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_circuit_test.cc +466 -0
  218. data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_reference.cc +207 -0
  219. data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_reference.h +59 -0
  220. data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_reference_test.cc +153 -0
  221. data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_round_constants.cc +39 -0
  222. data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_round_constants.h +29 -0
  223. data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_slicing.h +31 -0
  224. data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_witness.cc +83 -0
  225. data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_witness.h +72 -0
  226. data/vendor/longfellow-zk/lib/circuits/tests/sha3/shake_test_vectors.h +477 -0
  227. data/vendor/longfellow-zk/lib/ec/elliptic_curve.h +596 -0
  228. data/vendor/longfellow-zk/lib/ec/elliptic_curve_test.cc +548 -0
  229. data/vendor/longfellow-zk/lib/ec/p256.cc +36 -0
  230. data/vendor/longfellow-zk/lib/ec/p256.h +60 -0
  231. data/vendor/longfellow-zk/lib/ec/p256k1.cc +34 -0
  232. data/vendor/longfellow-zk/lib/ec/p256k1.h +60 -0
  233. data/vendor/longfellow-zk/lib/gf2k/gf2_128.h +503 -0
  234. data/vendor/longfellow-zk/lib/gf2k/gf2_128_bench.cc +48 -0
  235. data/vendor/longfellow-zk/lib/gf2k/gf2_128_test.cc +416 -0
  236. data/vendor/longfellow-zk/lib/gf2k/gf2poly.h +74 -0
  237. data/vendor/longfellow-zk/lib/gf2k/lch14.h +242 -0
  238. data/vendor/longfellow-zk/lib/gf2k/lch14_bench.cc +75 -0
  239. data/vendor/longfellow-zk/lib/gf2k/lch14_reed_solomon.h +127 -0
  240. data/vendor/longfellow-zk/lib/gf2k/lch14_reed_solomon_test.cc +110 -0
  241. data/vendor/longfellow-zk/lib/gf2k/lch14_test.cc +246 -0
  242. data/vendor/longfellow-zk/lib/gf2k/sysdep.h +329 -0
  243. data/vendor/longfellow-zk/lib/ligero/ligero_param.h +449 -0
  244. data/vendor/longfellow-zk/lib/ligero/ligero_prover.h +354 -0
  245. data/vendor/longfellow-zk/lib/ligero/ligero_test.cc +136 -0
  246. data/vendor/longfellow-zk/lib/ligero/ligero_transcript.h +67 -0
  247. data/vendor/longfellow-zk/lib/ligero/ligero_verifier.h +272 -0
  248. data/vendor/longfellow-zk/lib/merkle/merkle_commitment.h +104 -0
  249. data/vendor/longfellow-zk/lib/merkle/merkle_tree.h +216 -0
  250. data/vendor/longfellow-zk/lib/merkle/merkle_tree_test.cc +240 -0
  251. data/vendor/longfellow-zk/lib/proto/circuit.h +354 -0
  252. data/vendor/longfellow-zk/lib/proto/circuit_test.cc +202 -0
  253. data/vendor/longfellow-zk/lib/random/random.h +119 -0
  254. data/vendor/longfellow-zk/lib/random/random_test.cc +189 -0
  255. data/vendor/longfellow-zk/lib/random/secure_random_engine.h +37 -0
  256. data/vendor/longfellow-zk/lib/random/transcript.h +193 -0
  257. data/vendor/longfellow-zk/lib/random/transcript_test.cc +344 -0
  258. data/vendor/longfellow-zk/lib/sumcheck/circuit.h +148 -0
  259. data/vendor/longfellow-zk/lib/sumcheck/circuit_id.h +71 -0
  260. data/vendor/longfellow-zk/lib/sumcheck/equad.h +126 -0
  261. data/vendor/longfellow-zk/lib/sumcheck/hquad.h +115 -0
  262. data/vendor/longfellow-zk/lib/sumcheck/prover.h +59 -0
  263. data/vendor/longfellow-zk/lib/sumcheck/prover_layers.h +362 -0
  264. data/vendor/longfellow-zk/lib/sumcheck/quad.h +227 -0
  265. data/vendor/longfellow-zk/lib/sumcheck/quad_builder.h +211 -0
  266. data/vendor/longfellow-zk/lib/sumcheck/quad_test.cc +169 -0
  267. data/vendor/longfellow-zk/lib/sumcheck/sumcheck_test.cc +324 -0
  268. data/vendor/longfellow-zk/lib/sumcheck/testing.h +69 -0
  269. data/vendor/longfellow-zk/lib/sumcheck/transcript_sumcheck.h +85 -0
  270. data/vendor/longfellow-zk/lib/sumcheck/verifier.h +84 -0
  271. data/vendor/longfellow-zk/lib/sumcheck/verifier_layers.h +221 -0
  272. data/vendor/longfellow-zk/lib/testing/test_main.cc +50 -0
  273. data/vendor/longfellow-zk/lib/util/ceildiv.h +164 -0
  274. data/vendor/longfellow-zk/lib/util/ceildiv_test.cc +152 -0
  275. data/vendor/longfellow-zk/lib/util/crc64.h +45 -0
  276. data/vendor/longfellow-zk/lib/util/crypto.cc +39 -0
  277. data/vendor/longfellow-zk/lib/util/crypto.h +108 -0
  278. data/vendor/longfellow-zk/lib/util/log.cc +110 -0
  279. data/vendor/longfellow-zk/lib/util/log.h +33 -0
  280. data/vendor/longfellow-zk/lib/util/panic.h +40 -0
  281. data/vendor/longfellow-zk/lib/util/readbuffer.h +67 -0
  282. data/vendor/longfellow-zk/lib/util/serialization.h +54 -0
  283. data/vendor/longfellow-zk/lib/zk/zk_common.h +455 -0
  284. data/vendor/longfellow-zk/lib/zk/zk_proof.h +378 -0
  285. data/vendor/longfellow-zk/lib/zk/zk_prover.h +202 -0
  286. data/vendor/longfellow-zk/lib/zk/zk_test.cc +340 -0
  287. data/vendor/longfellow-zk/lib/zk/zk_testing.h +154 -0
  288. data/vendor/longfellow-zk/lib/zk/zk_verifier.h +109 -0
  289. metadata +347 -0
@@ -0,0 +1,466 @@
1
+ // Copyright 2026 Google LLC.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include "circuits/tests/sha3/sha3_circuit.h"
16
+
17
+ #include <stddef.h>
18
+
19
+ #include <cstdint>
20
+ #include <memory>
21
+ #include <utility>
22
+ #include <vector>
23
+
24
+ #include "algebra/convolution.h"
25
+ #include "algebra/fp.h"
26
+ #include "algebra/fp24.h"
27
+ #include "algebra/fp24_6.h"
28
+ #include "algebra/reed_solomon.h"
29
+ #include "algebra/reed_solomon_extension.h"
30
+ #include "arrays/dense.h"
31
+ #include "circuits/compiler/circuit_dump.h"
32
+ #include "circuits/compiler/compiler.h"
33
+ #include "circuits/logic/compiler_backend.h"
34
+ #include "circuits/logic/evaluation_backend.h"
35
+ #include "circuits/logic/logic.h"
36
+ #include "circuits/tests/sha3/sha3_reference.h"
37
+ #include "circuits/tests/sha3/sha3_slicing.h"
38
+ #include "circuits/tests/sha3/sha3_witness.h"
39
+ #include "circuits/tests/sha3/shake_test_vectors.h"
40
+ #include "gf2k/gf2_128.h"
41
+ #include "gf2k/lch14_reed_solomon.h"
42
+ #include "random/secure_random_engine.h"
43
+ #include "random/transcript.h"
44
+ #include "sumcheck/circuit.h"
45
+ #include "sumcheck/prover.h"
46
+ #include "sumcheck/verifier.h"
47
+ #include "util/log.h"
48
+ #include "util/panic.h"
49
+ #include "zk/zk_proof.h"
50
+ #include "zk/zk_prover.h"
51
+ #include "zk/zk_verifier.h"
52
+ #include "benchmark/benchmark.h"
53
+ #include "gtest/gtest.h"
54
+
55
+ namespace proofs {
56
+ namespace {
57
+ using Field = Fp24_6;
58
+ const Fp24 BaseF(8380417);
59
+ const Field F(BaseF, /*beta=*/7);
60
+ typedef CompilerBackend<Field> CompilerBackend;
61
+ typedef Logic<Field, CompilerBackend> LogicCircuit;
62
+ typedef LogicCircuit::BitW bitWC;
63
+ typedef typename LogicCircuit::template bitvec<64> v64;
64
+
65
+ typedef EvaluationBackend<Field> EvalBackend;
66
+ typedef Logic<Field, EvalBackend> Logic;
67
+ typedef Logic::BitW bitW;
68
+
69
+ std::unique_ptr<Circuit<Field>> mk_keccak_circuit(size_t nc) {
70
+ set_log_level(INFO);
71
+ QuadCircuit<Field> Q(F);
72
+ const CompilerBackend cbk(&Q);
73
+ const LogicCircuit LC(&cbk, F);
74
+ Sha3Circuit<LogicCircuit> SHAC(LC);
75
+
76
+ struct awrap {
77
+ v64 a[5][5];
78
+ };
79
+
80
+ auto aw = std::make_unique<awrap>();
81
+ for (size_t x = 0; x < 5; ++x) {
82
+ for (size_t y = 0; y < 5; ++y) {
83
+ aw->a[x][y] = LC.vinput<64>();
84
+ }
85
+ }
86
+
87
+ SHAC.keccak_f_1600(aw->a);
88
+ for (size_t x = 0; x < 5; ++x) {
89
+ for (size_t y = 0; y < 5; ++y) {
90
+ LC.voutput(aw->a[x][y], 64 * (y + 5 * x));
91
+ }
92
+ }
93
+
94
+ auto CIRCUIT = Q.mkcircuit(nc);
95
+ dump_info("sha3", Q);
96
+
97
+ return CIRCUIT;
98
+ }
99
+
100
+ std::unique_ptr<Circuit<Field>> mk_keccak_witness_circuit(size_t nc) {
101
+ set_log_level(INFO);
102
+ QuadCircuit<Field> Q(F);
103
+ const CompilerBackend cbk(&Q);
104
+ const LogicCircuit LC(&cbk, F);
105
+ Sha3Circuit<LogicCircuit> SHAC(LC);
106
+
107
+ struct awrap {
108
+ v64 a[5][5];
109
+ };
110
+
111
+ auto aw = std::make_unique<awrap>();
112
+ for (size_t x = 0; x < 5; ++x) {
113
+ for (size_t y = 0; y < 5; ++y) {
114
+ aw->a[x][y] = LC.vinput<64>();
115
+ }
116
+ }
117
+
118
+ typename Sha3Circuit<LogicCircuit>::BlockWitness bw;
119
+ bw.input(LC);
120
+
121
+ SHAC.keccak_f_1600(aw->a, bw);
122
+ for (size_t x = 0; x < 5; ++x) {
123
+ for (size_t y = 0; y < 5; ++y) {
124
+ LC.voutput(aw->a[x][y], 64 * (y + 5 * x));
125
+ }
126
+ }
127
+
128
+ auto CIRCUIT = Q.mkcircuit(nc);
129
+ dump_info("sha3_witness", nc, 1, Q);
130
+
131
+ return CIRCUIT;
132
+ }
133
+
134
+ TEST(SHA3_Circuit, Keccak_F_1600_Witness_Size) {
135
+ auto CIRCUIT = mk_keccak_witness_circuit(1);
136
+ }
137
+
138
+ TEST(SHA3_Circuit, Keccak_F_1600) {
139
+ constexpr size_t nc = 1;
140
+ const EvalBackend ebk(F);
141
+ const Logic L(&ebk, F);
142
+
143
+ auto CIRCUIT = mk_keccak_circuit(nc);
144
+
145
+ uint64_t st[5][5];
146
+ auto W = std::make_unique<Dense<Field>>(nc, /*constant one*/ 1 + 64 * 5 * 5);
147
+ W->v_[0] = F.one();
148
+ for (size_t x = 0; x < 5; ++x) {
149
+ for (size_t y = 0; y < 5; ++y) {
150
+ st[x][y] = 3 * x + 1000 * y;
151
+ for (size_t z = 0; z < 64; ++z) {
152
+ W->v_[1 + z + 64 * (y + 5 * x)] =
153
+ L.eval(L.bit((st[x][y] >> z) & 1)).elt();
154
+ }
155
+ }
156
+ }
157
+
158
+ Sha3Reference::keccak_f_1600_DEBUG_ONLY(st);
159
+ Prover<Field>::inputs pin;
160
+ Prover<Field> prover(F);
161
+ auto V = prover.eval_circuit(&pin, CIRCUIT.get(), W->clone(), F);
162
+ for (size_t x = 0; x < 5; ++x) {
163
+ for (size_t y = 0; y < 5; ++y) {
164
+ for (size_t z = 0; z < 64; ++z) {
165
+ EXPECT_EQ(V->v_[z + 64 * (y + 5 * x)],
166
+ L.eval(L.bit((st[x][y] >> z) & 1)).elt());
167
+ }
168
+ }
169
+ }
170
+ }
171
+
172
+ TEST(SHA3_Circuit, Keccak_F_1600_Copies) {
173
+ constexpr size_t nc = 23;
174
+ const EvalBackend ebk(F);
175
+ const Logic L(&ebk, F);
176
+
177
+ auto CIRCUIT = mk_keccak_circuit(nc);
178
+
179
+ struct State {
180
+ uint64_t s[5][5];
181
+ };
182
+ std::vector<State> st(nc);
183
+ auto W = std::make_unique<Dense<Field>>(nc, /*constant one*/ 1 + 64 * 5 * 5);
184
+ for (size_t c = 0; c < nc; ++c) {
185
+ W->v_[0 * nc + c] = F.one();
186
+ for (size_t x = 0; x < 5; ++x) {
187
+ for (size_t y = 0; y < 5; ++y) {
188
+ st[c].s[x][y] = 3 * x + 1000 * y + 1000000 * c;
189
+ for (size_t z = 0; z < 64; ++z) {
190
+ W->v_[(1 + z + 64 * (y + 5 * x)) * nc + c] =
191
+ L.eval(L.bit((st[c].s[x][y] >> z) & 1)).elt();
192
+ }
193
+ }
194
+ }
195
+ }
196
+
197
+ {
198
+ Prover<Field>::inputs pin;
199
+ Prover<Field> prover(F);
200
+ auto V = prover.eval_circuit(&pin, CIRCUIT.get(), W->clone(), F);
201
+
202
+ for (size_t c = 0; c < nc; ++c) {
203
+ Sha3Reference::keccak_f_1600_DEBUG_ONLY(st[c].s);
204
+ for (size_t x = 0; x < 5; ++x) {
205
+ for (size_t y = 0; y < 5; ++y) {
206
+ for (size_t z = 0; z < 64; ++z) {
207
+ EXPECT_EQ(V->v_[(z + 64 * (y + 5 * x)) * nc + c],
208
+ L.eval(L.bit((st[c].s[x][y] >> z) & 1)).elt());
209
+ }
210
+ }
211
+ }
212
+ }
213
+ }
214
+
215
+ {
216
+ Prover<Field> prover(F);
217
+ Prover<Field>::inputs pin;
218
+ auto V = prover.eval_circuit(&pin, CIRCUIT.get(), W->clone(), F);
219
+
220
+ Transcript tsp((uint8_t*)"test", 4);
221
+ Proof<Field> proof(CIRCUIT->nl);
222
+ prover.prove(&proof, nullptr, CIRCUIT.get(), pin, tsp);
223
+
224
+ const char* why = "ok";
225
+ Transcript tsv((uint8_t*)"test", 4);
226
+ check(Verifier<Field>::verify(&why, CIRCUIT.get(), &proof, std::move(V),
227
+ std::move(W), tsv, F),
228
+ why);
229
+ }
230
+ }
231
+
232
+ TEST(SHA3_Circuit, AssertShake256) {
233
+ const EvalBackend ebk(F);
234
+ const Logic L(&ebk, F);
235
+ Sha3Circuit<Logic> SHAC(L);
236
+
237
+ for (const auto& vec : sha3::GetShake256TestVectors()) {
238
+ std::vector<Logic::v8> seed;
239
+ for (uint8_t byte : vec.in) {
240
+ seed.push_back(L.vbit8(byte));
241
+ }
242
+
243
+ std::vector<Logic::v8> output;
244
+
245
+ std::vector<Sha3Witness::BlockWitness> bws;
246
+ Sha3Witness::compute_witness_shake256(vec.in, vec.out.size(), bws);
247
+
248
+ // Create circuit-compatible witnesses
249
+ std::vector<Sha3Circuit<Logic>::BlockWitness> circuit_bws(bws.size());
250
+ for (size_t k = 0; k < bws.size(); ++k) {
251
+ for (size_t round = 0; round < 24; ++round) {
252
+ if (sha3_slice_at(round)) {
253
+ for (size_t x = 0; x < 5; ++x) {
254
+ for (size_t y = 0; y < 5; ++y) {
255
+ for (size_t b = 0; b < 64; ++b) {
256
+ circuit_bws[k].a_intermediate[round][x][y][b] =
257
+ L.bit((bws[k].a_intermediate[round][x][y] >> b) & 1);
258
+ }
259
+ }
260
+ }
261
+ }
262
+ }
263
+ }
264
+
265
+ SHAC.assert_shake256(seed, vec.out.size(), output, circuit_bws);
266
+
267
+ EXPECT_EQ(output.size(), vec.out.size());
268
+ for (size_t i = 0; i < vec.out.size(); ++i) {
269
+ uint8_t val = 0;
270
+ for (int j = 0; j < 8; ++j) {
271
+ if (L.eval(output[i][j]).elt() == F.one()) {
272
+ val |= (1 << j);
273
+ }
274
+ }
275
+ EXPECT_EQ(val, vec.out[i]);
276
+ }
277
+ }
278
+ }
279
+
280
+ template <class Field>
281
+ std::unique_ptr<Circuit<Field>> make_shake256_circuit(size_t seed_size,
282
+ size_t out_size,
283
+ const Field& F) {
284
+ // Check the simplest case.
285
+ check(seed_size < 136, "seed too long");
286
+ check(out_size < 136, "output too long");
287
+ size_t numblocks = 1;
288
+ set_log_level(INFO);
289
+ QuadCircuit<Field> Q(F);
290
+ using CompilerBackend = proofs::CompilerBackend<Field>;
291
+ using LogicCircuit = proofs::Logic<Field, CompilerBackend>;
292
+ const CompilerBackend cbk(&Q);
293
+ const LogicCircuit LC(&cbk, F);
294
+ Sha3Circuit<LogicCircuit> SHAC(LC);
295
+
296
+ std::vector<typename LogicCircuit::v8> seed(seed_size);
297
+ for (size_t i = 0; i < seed_size; ++i) {
298
+ seed[i] = LC.template vinput<8>();
299
+ }
300
+
301
+ std::vector<typename LogicCircuit::v8> want(out_size);
302
+ for (size_t i = 0; i < out_size; ++i) {
303
+ want[i] = LC.template vinput<8>();
304
+ }
305
+
306
+ std::vector<typename LogicCircuit::v8> out;
307
+
308
+ // For the compiled circuit length test, we just provide free input wires.
309
+ std::vector<typename Sha3Circuit<LogicCircuit>::BlockWitness> circuit_bws(
310
+ numblocks);
311
+ for (size_t k = 0; k < numblocks; ++k) {
312
+ circuit_bws[k].input(LC);
313
+ }
314
+
315
+ SHAC.assert_shake256(seed, out_size, out, circuit_bws);
316
+
317
+ EXPECT_EQ(out.size(), out_size);
318
+ for (size_t i = 0; i < out_size; ++i) {
319
+ LC.vassert_eq(want[i], out[i]);
320
+ }
321
+
322
+ auto CIRCUIT = Q.mkcircuit(1);
323
+ dump_info("shake256_nc_blocks", 1, numblocks, Q);
324
+
325
+ return CIRCUIT;
326
+ }
327
+
328
+ TEST(SHA3_Circuit, CircuitSizeShake256) {
329
+ auto CIRCUIT = make_shake256_circuit<Field>(32, 64, F);
330
+ }
331
+
332
+ // Shake256 scaffold for tests and benchmarks.
333
+ // This scaffold hardcodes one of the examples from the SHAKE256 test vectors.
334
+ template <typename Field, typename RSFactory>
335
+ struct ShakeProverSystem {
336
+ const Field& f;
337
+ const RSFactory& rsf;
338
+ std::unique_ptr<Circuit<Field>> circuit;
339
+ size_t num_blocks;
340
+ SecureRandomEngine rng;
341
+ std::unique_ptr<ZkProof<Field>> zkpr;
342
+
343
+ ShakeProverSystem(size_t numBlocks, const Field& f, const RSFactory& r)
344
+ : f(f),
345
+ rsf(r),
346
+ // These input/output lengths are hard-coded to match the 2nd example.
347
+ circuit(make_shake256_circuit<Field>(3, 33, f)),
348
+ num_blocks(numBlocks) {}
349
+
350
+ bool Prove() {
351
+ auto vectors = sha3::GetShake256TestVectors();
352
+ std::vector<uint8_t> seed = vectors[1].in;
353
+ std::vector<uint8_t> want = vectors[1].out;
354
+ check(seed.size() == 3, "seed must be 32 bytes");
355
+ check(want.size() == 33, "want too long");
356
+ zkpr = std::make_unique<ZkProof<Field>>(*circuit, 4, 128);
357
+ Dense<Field> w(1, circuit->ninputs);
358
+ DenseFiller<Field> filler(w);
359
+ filler.push_back(f.one());
360
+ // Fill seed
361
+ for (size_t i = 0; i < seed.size(); ++i) {
362
+ filler.push_back(seed[i], 8, f);
363
+ }
364
+
365
+ // Fill want
366
+ for (size_t i = 0; i < want.size(); ++i) {
367
+ filler.push_back(want[i], 8, f);
368
+ }
369
+
370
+ // Fill witnesses
371
+ std::vector<Sha3Witness::BlockWitness> bws;
372
+ Sha3Witness::compute_witness_shake256(seed, want.size(), bws);
373
+ Sha3Witness::fill_witness(filler, bws, f);
374
+
375
+ ZkProver<Field, RSFactory> prover(*circuit, f, rsf);
376
+ Transcript tp((uint8_t*)"test", 4);
377
+ prover.commit(*zkpr, w, tp, rng);
378
+ return prover.prove(*zkpr, w, tp);
379
+ }
380
+
381
+ bool Verify() {
382
+ ZkVerifier<Field, RSFactory> verifier(*circuit, rsf, 4, 128, f);
383
+ Transcript tv((uint8_t*)"test", 4);
384
+ verifier.recv_commitment(*zkpr, tv);
385
+ Dense<Field> pub(1, 0);
386
+ return verifier.verify(*zkpr, pub, tv);
387
+ }
388
+ };
389
+
390
+ // ==================== 1 block SHAKE256 tests over 2 fields
391
+
392
+ TEST(SHA3_Circuit, ZkProverAndVerifierTest_GF2_128) {
393
+ using f_128 = GF2_128<>;
394
+ const f_128 Fs;
395
+ using RSFactory = LCH14ReedSolomonFactory<f_128>;
396
+ const RSFactory rsf(Fs);
397
+
398
+ ShakeProverSystem<f_128, RSFactory> sys(1, Fs, rsf);
399
+
400
+ EXPECT_TRUE(sys.Prove());
401
+ EXPECT_TRUE(sys.Verify());
402
+ }
403
+
404
+ TEST(SHA3_Circuit, ZkProverAndVerifierTest_Fp64) {
405
+ using Field = Fp<1>;
406
+ const Field F("18446744069414584321");
407
+ using ConvolutionFactory = FFTConvolutionFactory<Field>;
408
+ using RSFactory = ReedSolomonFactory<Field, ConvolutionFactory>;
409
+
410
+ const ConvolutionFactory conv_factory(F, F.of_scalar(1753635133440165772ull),
411
+ 1ull << 32);
412
+ const RSFactory rs_factory(conv_factory, F);
413
+
414
+ ShakeProverSystem<Field, RSFactory> sys(1, F, rs_factory);
415
+ EXPECT_TRUE(sys.Prove());
416
+ EXPECT_TRUE(sys.Verify());
417
+ }
418
+
419
+ TEST(SHA3_Circuit, ZkProverAndVerifierTest_Fp24_6) {
420
+ using Field = Fp24_6;
421
+ const Fp24 BaseF(8380417);
422
+ const Field F(BaseF, /*beta=*/7);
423
+
424
+ ReedSolomonExtensionFactory rsextf(BaseF);
425
+
426
+ ShakeProverSystem<Field, ReedSolomonExtensionFactory> sys(1, F, rsextf);
427
+ EXPECT_TRUE(sys.Prove());
428
+ EXPECT_TRUE(sys.Verify());
429
+ }
430
+
431
+ // ==================== Benchmarks ====================
432
+
433
+ void BM_ShakeProver_GF2_128(benchmark::State& state) {
434
+ using f_128 = GF2_128<>;
435
+ const f_128 Fs;
436
+ using RSFactory = LCH14ReedSolomonFactory<f_128>;
437
+ const RSFactory rsf(Fs);
438
+
439
+ ShakeProverSystem<f_128, RSFactory> sys(1, Fs, rsf);
440
+ set_log_level(ERROR);
441
+ for (auto _ : state) {
442
+ sys.Prove();
443
+ }
444
+ }
445
+ BENCHMARK(BM_ShakeProver_GF2_128);
446
+
447
+ void BM_ShakeProver_Fp64(benchmark::State& state) {
448
+ using Field = Fp<1>;
449
+ const Field F("18446744069414584321");
450
+ using ConvolutionFactory = FFTConvolutionFactory<Field>;
451
+ using RSFactory = ReedSolomonFactory<Field, ConvolutionFactory>;
452
+
453
+ const ConvolutionFactory conv_factory(F, F.of_scalar(1753635133440165772ull),
454
+ 1ull << 32);
455
+ const RSFactory rs_factory(conv_factory, F);
456
+
457
+ ShakeProverSystem<Field, RSFactory> sys(1, F, rs_factory);
458
+ set_log_level(ERROR);
459
+ for (auto _ : state) {
460
+ sys.Prove();
461
+ }
462
+ }
463
+ BENCHMARK(BM_ShakeProver_Fp64);
464
+
465
+ } // namespace
466
+ } // namespace proofs
@@ -0,0 +1,207 @@
1
+ // Copyright 2026 Google LLC.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include "circuits/tests/sha3/sha3_reference.h"
16
+
17
+ #include <algorithm>
18
+ #include <cstdint>
19
+ #include <cstdlib>
20
+
21
+ #include "circuits/tests/sha3/sha3_round_constants.h"
22
+
23
+ namespace proofs {
24
+ static uint64_t rotl(uint64_t x, size_t b) {
25
+ return (x << b) | (x >> (64 - b));
26
+ }
27
+
28
+ void Sha3Reference::keccak_f_1600_DEBUG_ONLY(uint64_t A[5][5]) {
29
+ return keccak_f_1600(A);
30
+ }
31
+
32
+ // FIPS 202 3.2.1, theta
33
+ void Sha3Reference::theta(uint64_t A[5][5]) {
34
+ uint64_t C[5];
35
+ for (size_t x = 0; x < 5; ++x) {
36
+ C[x] = A[x][0] ^ A[x][1] ^ A[x][2] ^ A[x][3] ^ A[x][4];
37
+ }
38
+
39
+ for (size_t x = 0; x < 5; ++x) {
40
+ uint64_t D_x = C[(x + 4) % 5] ^ rotl(C[(x + 1) % 5], 1);
41
+ for (size_t y = 0; y < 5; ++y) {
42
+ A[x][y] ^= D_x;
43
+ }
44
+ }
45
+ }
46
+
47
+ // FIPS 202 3.2.2, rho
48
+ void Sha3Reference::rho(uint64_t A[5][5]) {
49
+ size_t x = 1, y = 0;
50
+ for (size_t t = 0; t < 24; ++t) {
51
+ A[x][y] = rotl(A[x][y], sha3::sha3_rotc[t]);
52
+ size_t nx = y, ny = (2 * x + 3 * y) % 5;
53
+ x = nx;
54
+ y = ny;
55
+ }
56
+ }
57
+
58
+ // FIPS 202 3.2.3, pi
59
+ void Sha3Reference::pi(const uint64_t A[5][5], uint64_t A1[5][5]) {
60
+ for (size_t x = 0; x < 5; ++x) {
61
+ for (size_t y = 0; y < 5; ++y) {
62
+ A1[x][y] = A[(x + 3 * y) % 5][x];
63
+ }
64
+ }
65
+ }
66
+
67
+ // FIPS 202 3.2.4, chi
68
+ void Sha3Reference::chi(const uint64_t A1[5][5], uint64_t A[5][5]) {
69
+ for (size_t x = 0; x < 5; ++x) {
70
+ for (size_t y = 0; y < 5; ++y) {
71
+ A[x][y] = A1[x][y] ^ ((~A1[(x + 1) % 5][y]) & A1[(x + 2) % 5][y]);
72
+ }
73
+ }
74
+ }
75
+
76
+ // FIPS 202 3.2.5, iota
77
+ void Sha3Reference::iota(uint64_t A[5][5], size_t round) {
78
+ A[0][0] ^= sha3::sha3_rc[round];
79
+ }
80
+
81
+ void Sha3Reference::keccak_f_1600(uint64_t A[5][5]) {
82
+ for (size_t round = 0; round < 24; ++round) {
83
+ theta(A);
84
+ rho(A);
85
+ uint64_t A1[5][5];
86
+ pi(A, A1);
87
+ chi(A1, A);
88
+ iota(A, round);
89
+ }
90
+ }
91
+
92
+ static uint64_t ru64le(const uint8_t* d) {
93
+ uint64_t r = 0;
94
+ for (size_t i = 8; i-- > 0;) {
95
+ r = (r << 8) + (d[i] & 0xffu);
96
+ }
97
+ return r;
98
+ }
99
+
100
+ static void wu64le(uint8_t* d, uint64_t n) {
101
+ for (size_t i = 0; i < 8; ++i) {
102
+ d[i] = (n >> (8 * i)) & 0xffu;
103
+ }
104
+ }
105
+
106
+ void Sha3Reference::xorin(uint64_t A[5][5], const uint8_t* d, size_t n) {
107
+ size_t x = 0, y = 0;
108
+ while (n > 0) {
109
+ A[x][y] ^= ru64le(d);
110
+ ++x;
111
+ if (x == 5) {
112
+ ++y;
113
+ x = 0;
114
+ }
115
+ d += sizeof(uint64_t);
116
+ n -= sizeof(uint64_t);
117
+ }
118
+ }
119
+
120
+ void Sha3Reference::update(const char* data, size_t n) {
121
+ for (size_t i = 0; i < n; ++i) {
122
+ buf_[wrptr_++] = data[i];
123
+ if (wrptr_ == rate_) {
124
+ xorin(a_, buf_, rate_);
125
+ wrptr_ = 0;
126
+ keccak_f_1600(a_);
127
+ }
128
+ }
129
+ }
130
+
131
+ void Sha3Reference::final(uint8_t digest[/*mdlen*/]) {
132
+ buf_[wrptr_++] = 0x06;
133
+ while (wrptr_ < rate_) {
134
+ buf_[wrptr_++] = 0;
135
+ }
136
+ buf_[rate_ - 1] ^= 0x80;
137
+ xorin(a_, buf_, rate_);
138
+ wrptr_ = 0;
139
+ keccak_f_1600(a_);
140
+
141
+ size_t x = 0, y = 0;
142
+ for (size_t i = 0; i < mdlen_; i += 8) {
143
+ wu64le(&digest[i], a_[x][y]);
144
+ ++x;
145
+ if (x == 5) {
146
+ ++y;
147
+ x = 0;
148
+ }
149
+ }
150
+ }
151
+
152
+ void Sha3Reference::shake(size_t rate, const uint8_t* in, size_t inlen,
153
+ uint8_t* out, size_t outlen) {
154
+ uint64_t A[5][5] = {};
155
+ uint8_t block[200] = {};
156
+ size_t ptr = 0;
157
+
158
+ for (size_t i = 0; i < inlen; ++i) {
159
+ block[ptr++] = in[i];
160
+ if (ptr == rate) {
161
+ xorin(A, block, rate);
162
+ Sha3Reference::keccak_f_1600_DEBUG_ONLY(A);
163
+ ptr = 0;
164
+ for (size_t j = 0; j < rate; ++j) block[j] = 0;
165
+ }
166
+ }
167
+
168
+ // Padding
169
+ block[ptr] ^= 0x1F;
170
+ block[rate - 1] ^= 0x80;
171
+ xorin(A, block, rate);
172
+ Sha3Reference::keccak_f_1600_DEBUG_ONLY(A);
173
+
174
+ // Squeeze
175
+ size_t out_ptr = 0;
176
+ while (out_ptr < outlen) {
177
+ uint8_t squeeze_block[200];
178
+ size_t x = 0, y = 0;
179
+ for (size_t i = 0; i < rate; i += 8) {
180
+ wu64le(&squeeze_block[i], A[x][y]);
181
+ ++x;
182
+ if (x == 5) {
183
+ ++y;
184
+ x = 0;
185
+ }
186
+ }
187
+ size_t take = std::min(rate, outlen - out_ptr);
188
+ for (size_t i = 0; i < take; ++i) {
189
+ out[out_ptr++] = squeeze_block[i];
190
+ }
191
+ if (out_ptr < outlen) {
192
+ Sha3Reference::keccak_f_1600_DEBUG_ONLY(A);
193
+ }
194
+ }
195
+ }
196
+
197
+ void Sha3Reference::shake128Hash(const uint8_t* in, size_t inlen, uint8_t* out,
198
+ size_t outlen) {
199
+ shake(168, in, inlen, out, outlen);
200
+ }
201
+
202
+ void Sha3Reference::shake256Hash(const uint8_t* in, size_t inlen, uint8_t* out,
203
+ size_t outlen) {
204
+ shake(136, in, inlen, out, outlen);
205
+ }
206
+
207
+ } // namespace proofs