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,449 @@
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
+ #ifndef PRIVACY_PROOFS_ZK_LIB_LIGERO_LIGERO_PARAM_H_
16
+ #define PRIVACY_PROOFS_ZK_LIB_LIGERO_LIGERO_PARAM_H_
17
+
18
+ #include <stddef.h>
19
+
20
+ #include <algorithm>
21
+ #include <array>
22
+ #include <cstdint>
23
+ #include <cstring>
24
+ #include <vector>
25
+
26
+ #include "algebra/blas.h"
27
+ #include "merkle/merkle_commitment.h"
28
+ #include "merkle/merkle_tree.h"
29
+ #include "util/ceildiv.h"
30
+ #include "util/crypto.h"
31
+ #include "util/panic.h"
32
+
33
+ /*
34
+
35
+ This is an implementation of the Ligero protocol described in
36
+
37
+ Ligero: Lightweight Sublinear Arguments
38
+ Without a Trusted Setup,
39
+
40
+ Scott Ames and Carmit Hazay and Yuval Ishai and
41
+ Muthuramakrishnan Venkitasubramaniam,
42
+ https://eprint.iacr.org/2022/1608
43
+ doi = {10.1145/3133956},
44
+
45
+ The main data structure in the prover is a 2D array which we call a
46
+ tableau organized as follows.
47
+
48
+ Fix a block size BLOCK and let DBLOCK = 2 * BLOCK - 1. Fix another
49
+ quantity BLOCK_EXT >= 0.
50
+
51
+ Each row in the tableau has the form [X XD XEXT], where X is a row
52
+ of BLOCK elements, XD is a row of BLOCK - 1 elements, and XEXT is a
53
+ row of BLOCK_EXT elements. We call the X part the "block" and the
54
+ XEXT part the "extension".
55
+
56
+ Let BLOCK_ENC = 2 * BLOCK - 1 + BLOCK_EXT = DBLOCK + BLOCK_EXT be
57
+ the total size of the row.
58
+
59
+ A "witness block" has the form [RANDOM[R], WITNESS[W]], where R + W
60
+ = BLOCK. The randomess (of size R) is used for zero-knowledge
61
+ blinding. Although not strictly required by Ligero, we require W >=
62
+ R to avoid wasting too much space, so that a witness block is at
63
+ least half full.
64
+
65
+ A block is interpreted as evaluations of some polynomial at point
66
+ INJ(j) for 0 <= j < BLOCK, where INJ(.) is some field-specific
67
+ injection that injects small natural numbers into distinct field
68
+ elements. With the condition that the degree of the polynomial be
69
+ less than BLOCK, the polynomial is uniquely determined, and the rest
70
+ [XD XEXT] of the row is then computed as the evaluations of that
71
+ polynomial for BLOCK <= j < BLOCK_ENC.
72
+
73
+ To the extent that Ligero is based on Reed-Solomon codes, X is the
74
+ "message" and XEXT is the "codeword". The "rate" is thus BLOCK /
75
+ BLOCK_EXT.
76
+
77
+ However, Ligero also needs products of two polynomials of degree
78
+ less than BLOCK, so that the product has degree less than 2 * BLOCK
79
+ - 1 = DBLOCK. XD exists in the tableau to facilitate the
80
+ computation of these products. For zero knowledge, the indices of
81
+ XD must be distinct from the indices of BLOCK_EXT.
82
+
83
+ We now discuss the row structure of the tableau. The first three
84
+ rows are special and used for zero-knowledge blinding purposes.
85
+
86
+ The first row, row ILDT for ILDT = 0, used for the low-degree test,
87
+ consists of BLOCK random field elements, extended to BLOCK_ENC.
88
+
89
+ The second row, row IDOT for IDOT = 1, used in the linear test,
90
+ consists of DBLOCK random field elements, with the additional
91
+ constraint that the double block sum to 0. As usual, the row is
92
+ extended to BLOCK_ENC by interpolation.
93
+
94
+ The third row, row IQUAD for IQUAD = 2, used in the quadratic test,
95
+ consists of DBLOCK random field elements, with the additional
96
+ constraint that the WITNESS portion of the block be zero. Thus, the
97
+ structure is really [RANDOM[R] ZERO[W] RANDOM[BLOCK-1]], extended to
98
+ BLOCK_ENC by interpolation.
99
+
100
+ The next group of "witness rows" IW <= I < IQ for IW = 3, stores
101
+ witnesses. Each row is a witness block extended to BLOCK_ENC.
102
+
103
+ The next group of "quadratic" rows IQ <= I < NROW, has the same
104
+ syntactic structure as the "witness" rows, but they are used in the
105
+ quadratic check in addition to the linear check. In Ligero, a
106
+ quadratic constraint induces three entries in three quadratic rows.
107
+ Thus, for NQ total quadratic constraints and W useful entries per
108
+ row, we have a total of 3 * (NQ / W) quadratic rows. To enforce
109
+ this structure, the code stores NQTRIPLES = (NQ / W) instead of the
110
+ number 3 * NQTRIPLES of rows.
111
+
112
+ */
113
+
114
+ namespace proofs {
115
+
116
+ template <class Field>
117
+ struct LigeroParam {
118
+ using Elt = typename Field::Elt;
119
+
120
+ // parameters passed by the user
121
+ size_t nw; // total number of witnesses
122
+ size_t nq; // total number of quadratic constraints
123
+ size_t rateinv; // inverse rate of the error-correcting code
124
+ size_t nreq; // number of opened columns
125
+
126
+ // computed parameters
127
+ size_t block_enc; // total number of elts per row
128
+ size_t block; // number of elts per block
129
+ size_t dblock; // 2 * BLOCK - 1
130
+ size_t block_ext; // BLOCK_ENC - DBLOCK (number of leaves in the
131
+ // Merkle tree).
132
+ size_t r; // number of random elts in a witness block
133
+ size_t w; // number of witnesses in a witness block
134
+ size_t nwrow; // number of witness rows
135
+ size_t nqtriples; // number of triples of quadratic-check rows
136
+ size_t nwqrow; // nwqrow + nqtriples
137
+ size_t nrow; // total number of rows (nwqrow + three blinding rows)
138
+ size_t mc_pathlen; // length of a Merkle-tree proof
139
+ // with BLOCK_ENC-BLOCK leaves
140
+
141
+ // layout of rows
142
+ size_t ildt; // blinding for the low-degree test
143
+ size_t idot; // blinding row for the dot-product check
144
+ size_t iquad; // blinding row for the quadratic check
145
+ size_t iw; // first witness row
146
+ size_t iq; // first quadratic row
147
+
148
+ // Deprecated version of the constructor attempts to optimize the block_enc
149
+ // parameter. This optimization can now be performed offline and stored as
150
+ // a parameter in ZkSpecStruct.
151
+ // TODO(shelat): Remove this constructor once version 3 is deprecated.
152
+ LigeroParam(size_t nw, size_t nq, size_t rateinv, size_t nreq)
153
+ : nw(nw), nq(nq), rateinv(rateinv), nreq(nreq) {
154
+ r = nreq;
155
+
156
+ size_t min_proof_size = SIZE_MAX;
157
+ size_t best_block_enc = 1;
158
+ for (size_t e = 1; e <= (1 << 28); e *= 2) {
159
+ size_t proof_size = layout(e);
160
+ if (proof_size < min_proof_size) {
161
+ min_proof_size = proof_size;
162
+ best_block_enc = e;
163
+ }
164
+ }
165
+
166
+ // recompute parameters
167
+ layout(best_block_enc);
168
+ sanity();
169
+ }
170
+
171
+ // Constructor that accepts a pre-computed block_enc.
172
+ LigeroParam(size_t nw, size_t nq, size_t rateinv, size_t nreq,
173
+ size_t be)
174
+ : nw(nw), nq(nq), rateinv(rateinv), nreq(nreq), block_enc(be) {
175
+ r = nreq;
176
+ check(layout(block_enc) < SIZE_MAX, "block_enc too large");
177
+ sanity();
178
+ }
179
+
180
+ // Return an estimate of the proof size.
181
+ //
182
+ // This function is kind of a hack in that it breaks abstraction
183
+ // boundaries, e.g. it knows about the size and layout of the Merkle
184
+ // commitment. Punt on this wart until we have a better theory.
185
+ size_t layout(size_t e) {
186
+ // Maximum size we are prepared to handle. All dimensions will be
187
+ // required to be < MAX_SIZE. In principle we could handle all
188
+ // size_t, but we want 64-bit code to fail if it would fail on a
189
+ // 32-bit machine, and for maximum paranoia we restrict to 28
190
+ // bits, since one cannot malloc 2^{28} Elts on a 32-bit machine
191
+ // anyway.
192
+ constexpr size_t max_lg_size = 28;
193
+ constexpr size_t max_size = static_cast<size_t>(1) << max_lg_size;
194
+ block_enc = e;
195
+
196
+ // block_enc must fit in the subfield
197
+ size_t subfield_bits = 8 * Field::kSubFieldBytes;
198
+ if (subfield_bits <= max_lg_size) {
199
+ if (block_enc >= (static_cast<size_t>(1) << subfield_bits)) {
200
+ return SIZE_MAX;
201
+ }
202
+ }
203
+
204
+ // limit block_enc to avoid overflow in the computation
205
+ // of the proof size
206
+ if (block_enc > max_size || rateinv > max_size ||
207
+ (block_enc + 1) < (2 + rateinv)) {
208
+ return SIZE_MAX;
209
+ }
210
+
211
+ block = (block_enc + 1) / (2 + rateinv);
212
+ // now 1 <= BLOCK < MAX_SIZE / 2
213
+
214
+ // Ensure BLOCK = R + W (syntactic property)
215
+ if (block < r) {
216
+ return SIZE_MAX;
217
+ }
218
+ w = block - r;
219
+
220
+ // now r <= BLOCK < MAX_SIZE / 2
221
+ // 0 <= W < MAX_SIZE / 2
222
+ // 0 <= W <= BLOCK
223
+ // 0 <= R <= BLOCK
224
+ // W + R == BLOCK
225
+
226
+ // Ensure W >= R (needed for reasonable space utilization).
227
+ if (w < r) {
228
+ return SIZE_MAX;
229
+ }
230
+ // now R <= W < MAX_SIZE
231
+
232
+ // Finish the layout of a row
233
+ dblock = 2 * block - 1;
234
+ // now DBLOCK < MAX_SIZE
235
+
236
+ // Ensure BLOCK_ENC >= 0 (syntactic property). Should be true
237
+ // for any reasonable rateinv, but check anyway.
238
+ if (block_enc < dblock) {
239
+ return SIZE_MAX;
240
+ }
241
+ // now DBLOCK <= BLOCK_ENC
242
+
243
+ block_ext = block_enc - dblock;
244
+ // now 0 <= BLOCK_EXT < MAX_SIZE
245
+
246
+ nwrow = ceildiv(nw, w);
247
+ nqtriples = ceildiv(nq, w);
248
+
249
+ nwqrow = nwrow + 3 * nqtriples;
250
+ nrow = nwqrow + /*blinding rows=*/3;
251
+
252
+ // The total number of elements (NROW * BLOCK_ENC) in the tableau
253
+ // must fit in MAX_SIZE.
254
+ if (nrow >= max_size / block_enc) {
255
+ return SIZE_MAX;
256
+ }
257
+
258
+ mc_pathlen = merkle_commitment_len(block_ext);
259
+
260
+ /* proof+commitment size. */
261
+ // Compute the size in uint64_t instead of size_t since
262
+ // I am too lazy to worry about overflow.
263
+ uint64_t sz = 0;
264
+
265
+ // commitment
266
+ sz += sizeof(Digest);
267
+
268
+ // Merkle openings, approximated because the exact # of leaves depends
269
+ // on the random coins.
270
+ sz += static_cast<uint64_t>(mc_pathlen) / 2 * static_cast<uint64_t>(nreq) *
271
+ static_cast<uint64_t>(Digest::kLength);
272
+
273
+ // y_ldt
274
+ sz += static_cast<uint64_t>(block) * static_cast<uint64_t>(Field::kBytes);
275
+
276
+ // y_dot
277
+ sz += static_cast<uint64_t>(dblock) * static_cast<uint64_t>(Field::kBytes);
278
+
279
+ // y_quad
280
+ // The quadratic-test response has size DBLOCK, but W elements
281
+ // are expected to be zero and not serialized.
282
+ sz += static_cast<uint64_t>(dblock - w) *
283
+ static_cast<uint64_t>(Field::kBytes);
284
+
285
+ // nonces
286
+ sz += static_cast<uint64_t>(nreq) *
287
+ static_cast<uint64_t>(MerkleNonce::kLength);
288
+
289
+ // req. Assume optimistically that all elements are in the subfield.
290
+ sz += static_cast<uint64_t>(nrow) * static_cast<uint64_t>(nreq) *
291
+ static_cast<uint64_t>(Field::kSubFieldBytes);
292
+
293
+ sz = std::min<uint64_t>(sz, SIZE_MAX);
294
+ return static_cast<size_t>(sz);
295
+ }
296
+
297
+ private:
298
+ void sanity() {
299
+ proofs::check(block_enc > block, "block_enc > block");
300
+ ildt = 0;
301
+ idot = 1;
302
+ iquad = 2;
303
+ iw = 3;
304
+ iq = iw + nwrow;
305
+ proofs::check(nrow == iq + 3 * nqtriples, "nrow == iq + 3 * nqtriples");
306
+ }
307
+ };
308
+
309
+ template <class Field>
310
+ struct LigeroCommitment {
311
+ Digest root;
312
+ };
313
+
314
+ template <class Field>
315
+ struct LigeroProof {
316
+ using Elt = typename Field::Elt;
317
+ explicit LigeroProof(const LigeroParam<Field> *p)
318
+ : block(p->block),
319
+ dblock(p->dblock),
320
+ r(p->r),
321
+ block_enc(p->block_enc),
322
+ nrow(p->nrow),
323
+ nreq(p->nreq),
324
+ mc_pathlen(p->mc_pathlen),
325
+ y_ldt(p->block),
326
+ y_dot(p->dblock),
327
+ y_quad_0(p->r),
328
+ y_quad_2(p->dblock - p->block),
329
+ req(p->nrow * p->nreq),
330
+ merkle(p->nreq) {}
331
+
332
+ // The proof stores a copy of all parameters relevant to the proof.
333
+ size_t block;
334
+ size_t dblock;
335
+ size_t r;
336
+ size_t block_enc;
337
+ size_t nrow;
338
+ size_t nreq;
339
+ size_t mc_pathlen;
340
+
341
+ std::vector<Elt> y_ldt; // [block]
342
+ std::vector<Elt> y_dot; // [dblock]
343
+ std::vector<Elt> y_quad_0; // [r] first part of y_quad.
344
+ // The middle part [w] of y_quad is zero and not transmitted.
345
+ std::vector<Elt> y_quad_2; // [dblock - block] last part of y_quad
346
+ std::vector<Elt> req; // [nrow, nreq]
347
+ MerkleProof merkle;
348
+
349
+ Elt &req_at(size_t i, size_t j) { return req[i * nreq + j]; }
350
+ const Elt &req_at(size_t i, size_t j) const { return req[i * nreq + j]; }
351
+ };
352
+
353
+ // a nonzero entry in the matrix A that defines
354
+ // the linear constraints A w = b. The term
355
+ // states that A[c, w] = k, where the "row"
356
+ // c is interpreted as the constraint index, and
357
+ // the "column" w is interpreted as the witness
358
+ // index
359
+ template <class Field>
360
+ struct LigeroLinearConstraint {
361
+ using Elt = typename Field::Elt;
362
+ size_t c;
363
+ size_t w;
364
+ Elt k;
365
+ };
366
+
367
+ // encode W[X] * W[Y] - W[Z] = 0
368
+ struct LigeroQuadraticConstraint {
369
+ size_t x;
370
+ size_t y;
371
+ size_t z;
372
+ };
373
+
374
+ template <class Field>
375
+ class LigeroCommon {
376
+ using Elt = typename Field::Elt;
377
+
378
+ public:
379
+ // create a grand dot product by A given the user-provided
380
+ // linear-constraint terms LLTERM, the quadratic constraints LQC,
381
+ // and their random challenges ALPHAL, ALPHAQ.
382
+ static void inner_product_vector(
383
+ Elt A[/*nwqrow, w*/], const LigeroParam<Field> &p, size_t nl,
384
+ size_t nllterm, const LigeroLinearConstraint<Field> llterm[/*nllterm*/],
385
+ const Elt alphal[/*nl*/], const LigeroQuadraticConstraint lqc[/*nq*/],
386
+ const std::array<Elt, 3> alphaq[/*nq*/], const Field &F) {
387
+ // clear A and overwrite it later.
388
+ Blas<Field>::clear(p.nwqrow * p.w, A, 1, F);
389
+
390
+ // random linear combinations of the linear constraints
391
+ for (size_t l = 0; l < nllterm; ++l) {
392
+ const auto &term = llterm[l];
393
+ proofs::check(term.w < p.nw, "term.w < p.nw");
394
+ proofs::check(term.c < nl, "term.c < nl");
395
+ F.add(A[term.w], F.mulf(term.k, alphal[term.c]));
396
+ }
397
+
398
+ // routing terms for quadratic constraints
399
+ Elt *Ax = &A[p.nwrow * p.w];
400
+ Elt *Ay = Ax + (p.nqtriples * p.w);
401
+ Elt *Az = Ay + (p.nqtriples * p.w);
402
+
403
+ for (size_t i = 0; i < p.nqtriples; ++i) {
404
+ for (size_t j = 0; j < p.w && j + i * p.w < p.nq; ++j) {
405
+ // index into [_ , W] arrays
406
+ size_t iw = j + i * p.w;
407
+ const auto *l = &lqc[iw];
408
+ F.add(Ax[iw], alphaq[iw][0]);
409
+ F.sub(A[l->x], alphaq[iw][0]);
410
+
411
+ F.add(Ay[iw], alphaq[iw][1]);
412
+ F.sub(A[l->y], alphaq[iw][1]);
413
+
414
+ F.add(Az[iw], alphaq[iw][2]);
415
+ F.sub(A[l->z], alphaq[iw][2]);
416
+ }
417
+ }
418
+ }
419
+
420
+ // layout a witness block where the "witness" is public, and
421
+ // thus the randomess is zero.
422
+ static void layout_Aext(Elt Aext[/*>=block*/], const LigeroParam<Field> &p,
423
+ size_t i, const Elt A[/*nwqrow, nw*/],
424
+ const Field &F) {
425
+ Blas<Field>::clear(p.r, &Aext[0], 1, F);
426
+ Blas<Field>::copy(p.w, &Aext[p.r], 1, &A[i * p.w], 1);
427
+ }
428
+
429
+ static void column_hash(size_t n, const Elt x[/*n:incx*/], size_t incx,
430
+ SHA256 &sha, const Field &F) {
431
+ for (size_t i = 0; i < n; ++i) {
432
+ uint8_t buf[Field::kBytes];
433
+ F.to_bytes_field(buf, x[i * incx]);
434
+ sha.Update(buf, sizeof(buf));
435
+ }
436
+ }
437
+ };
438
+
439
+ // A struct representing the hash of llterms. It is really the
440
+ // same as Digest, but in theory Ligero should exist independently
441
+ // of the Merkle tree.
442
+ struct LigeroHash {
443
+ static constexpr size_t kLength = kSHA256DigestSize;
444
+ uint8_t bytes[kLength];
445
+ };
446
+
447
+ } // namespace proofs
448
+
449
+ #endif // PRIVACY_PROOFS_ZK_LIB_LIGERO_LIGERO_PARAM_H_