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,55 @@
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_CIRCUITS_LOGIC_UNARY_H_
16
+ #define PRIVACY_PROOFS_ZK_LIB_CIRCUITS_LOGIC_UNARY_H_
17
+
18
+ #include <stddef.h>
19
+
20
+ // Various unary decoders
21
+ namespace proofs {
22
+ template <class Logic>
23
+ class Unary {
24
+ public:
25
+ using BitW = Logic::BitW;
26
+ const Logic& l_;
27
+
28
+ explicit Unary(const Logic& l) : l_(l) {}
29
+
30
+ // Even with this naive coding, it seems like the EQ circuit
31
+ // contains ~N wires and ~N terms, and the LT circuit contains ~N
32
+ // wires and ~2N terms, so there isn't much room for optimization.
33
+
34
+ // A[i] <- (i == j)
35
+ template <size_t W>
36
+ void eq(size_t n, BitW A[/*n*/],
37
+ const typename Logic::template bitvec<W>& j) const {
38
+ for (size_t i = 0; i < n; ++i) {
39
+ A[i] = l_.veq(j, i);
40
+ }
41
+ }
42
+
43
+ // A[i] <- (i < j)
44
+ template <size_t W>
45
+ void lt(size_t n, BitW A[/*n*/],
46
+ const typename Logic::template bitvec<W>& j) const {
47
+ for (size_t i = 0; i < n; ++i) {
48
+ A[i] = l_.vlt(i, j);
49
+ }
50
+ }
51
+ };
52
+
53
+ } // namespace proofs
54
+
55
+ #endif // PRIVACY_PROOFS_ZK_LIB_CIRCUITS_LOGIC_UNARY_H_
@@ -0,0 +1,77 @@
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_CIRCUITS_LOGIC_UNARY_PLUCKER_H_
16
+ #define PRIVACY_PROOFS_ZK_LIB_CIRCUITS_LOGIC_UNARY_PLUCKER_H_
17
+ #include <stddef.h>
18
+ #include <stdint.h>
19
+
20
+ #include <vector>
21
+
22
+ #include "algebra/interpolation.h"
23
+ #include "algebra/poly.h"
24
+ #include "circuits/logic/bit_plucker_constants.h"
25
+ #include "circuits/logic/polynomial.h"
26
+
27
+ namespace proofs {
28
+
29
+ template <class Logic, size_t NJ>
30
+ class UnaryPlucker {
31
+ public:
32
+ using Field = typename Logic::Field;
33
+ using BitW = typename Logic::BitW;
34
+ using EltW = typename Logic::EltW;
35
+ using Elt = typename Field::Elt;
36
+ // NJ + 1 so that pluck point NJ decodes to all zeroes
37
+ static constexpr size_t kN = NJ + 1;
38
+ using PolyN = Poly<kN, Field>;
39
+ using InterpolationN = Interpolation<kN, Field>;
40
+ const Logic& l_;
41
+ std::vector<PolyN> plucker_;
42
+
43
+ explicit UnaryPlucker(const Logic& l) : l_(l), plucker_(NJ) {
44
+ const Field& F = l_.f_; // shorthand
45
+ // evaluation points
46
+ PolyN X;
47
+ for (size_t i = 0; i < kN; ++i) {
48
+ X[i] = bit_plucker_point<Field, kN>()(i, F);
49
+ }
50
+
51
+ for (size_t j = 0; j < NJ; ++j) {
52
+ PolyN Y;
53
+ for (size_t i = 0; i < kN; ++i) {
54
+ Y[i] = F.of_scalar(i == j);
55
+ }
56
+ plucker_[j] = InterpolationN::monomial_of_lagrange(Y, X, F);
57
+ }
58
+ }
59
+
60
+ typename Logic::template bitvec<NJ> pluck(const EltW& e) const {
61
+ typename Logic::template bitvec<NJ> r;
62
+ const Logic& L = l_; // shorthand
63
+ const Polynomial<Logic> P(L);
64
+
65
+ for (size_t j = 0; j < NJ; ++j) {
66
+ EltW v = P.eval(plucker_[j], e);
67
+ L.assert_is_bit(v);
68
+ r[j] = BitW(v, L.f_);
69
+ }
70
+
71
+ return r;
72
+ }
73
+ };
74
+
75
+ } // namespace proofs
76
+
77
+ #endif // PRIVACY_PROOFS_ZK_LIB_CIRCUITS_LOGIC_UNARY_PLUCKER_H_
@@ -0,0 +1,37 @@
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_CIRCUITS_LOGIC_UNARY_PLUCKER_CONSTANTS_H_
16
+ #define PRIVACY_PROOFS_ZK_LIB_CIRCUITS_LOGIC_UNARY_PLUCKER_CONSTANTS_H_
17
+ #include <stddef.h>
18
+ #include <stdint.h>
19
+
20
+ #include "circuits/logic/bit_plucker_constants.h"
21
+ #include "util/panic.h"
22
+
23
+ namespace proofs {
24
+ template <class Field, size_t NJ>
25
+ struct unary_plucker_point {
26
+ using Elt = typename Field::Elt;
27
+ static constexpr size_t kN = NJ + 1;
28
+
29
+ Elt operator()(size_t j, const Field& F) const {
30
+ check(j <= NJ, "j <= NJ in unary_plucker_point");
31
+ check(j < kN, "j < N in unary_plucker_point");
32
+ return bit_plucker_point<Field, kN>()(j, F);
33
+ }
34
+ };
35
+ } // namespace proofs
36
+
37
+ #endif // PRIVACY_PROOFS_ZK_LIB_CIRCUITS_LOGIC_UNARY_PLUCKER_CONSTANTS_H_
@@ -0,0 +1,53 @@
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/logic/unary_plucker.h"
16
+
17
+ #include <stddef.h>
18
+
19
+ #include "algebra/fp.h"
20
+ #include "circuits/logic/evaluation_backend.h"
21
+ #include "circuits/logic/logic.h"
22
+ #include "circuits/logic/unary_plucker_constants.h"
23
+ #include "gf2k/gf2_128.h"
24
+ #include "gtest/gtest.h"
25
+
26
+ namespace proofs {
27
+ namespace {
28
+
29
+ template <class Field>
30
+ void pluck_test(const Field& F) {
31
+ using EvalBackend = EvaluationBackend<Field>;
32
+ using Logic = Logic<Field, EvalBackend>;
33
+
34
+ constexpr size_t NJ = 7;
35
+ constexpr size_t N = NJ + 1;
36
+ const EvalBackend ebk(F);
37
+ const Logic L(&ebk, F);
38
+ const UnaryPlucker<Logic, NJ> P(L);
39
+
40
+ for (size_t i = 0; i < N; ++i) {
41
+ auto got = P.pluck(L.konst(unary_plucker_point<Field, NJ>()(i, F)));
42
+ for (size_t j = 0; j < NJ; ++j) {
43
+ EXPECT_EQ(L.eval(got[j]), L.konst(i == j));
44
+ }
45
+ }
46
+ }
47
+
48
+ TEST(UnaryPluck, PluckPrimeField) { pluck_test(Fp<1>("18446744073709551557")); }
49
+
50
+ TEST(UnaryPluck, PluckBinaryField) { pluck_test(GF2_128<>()); }
51
+
52
+ } // namespace
53
+ } // namespace proofs
@@ -0,0 +1,69 @@
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 <stddef.h>
16
+
17
+ #include <vector>
18
+
19
+ #include "algebra/fp.h"
20
+ #include "circuits/compiler/circuit_dump.h"
21
+ #include "circuits/compiler/compiler.h"
22
+ #include "circuits/logic/compiler_backend.h"
23
+ #include "circuits/logic/logic.h"
24
+ #include "circuits/logic/unary.h"
25
+ #include "gf2k/gf2_128.h"
26
+ #include "gtest/gtest.h"
27
+
28
+ namespace proofs {
29
+ namespace {
30
+
31
+ template <class Field>
32
+ void one_size(const Field& F, const char* name, bool eq_or_lt) {
33
+ using CompilerBackend = CompilerBackend<Field>;
34
+ using LogicCircuit = Logic<Field, CompilerBackend>;
35
+ using BitWC = LogicCircuit::BitW;
36
+ QuadCircuit<Field> Q(F);
37
+ const CompilerBackend cbk(&Q);
38
+ const LogicCircuit LC(&cbk, F);
39
+ const Unary<LogicCircuit> U(LC);
40
+
41
+ constexpr size_t W = 12;
42
+ using BV = typename LogicCircuit::template bitvec<W>;
43
+ size_t n = 1u << W;
44
+ std::vector<BitWC> A(n);
45
+
46
+ BV jj = LC.template vinput<W>();
47
+ if (eq_or_lt) {
48
+ U.eq(n, A.data(), jj);
49
+ } else {
50
+ U.lt(n, A.data(), jj);
51
+ }
52
+ for (size_t i = 0; i < n; ++i) {
53
+ LC.output(A[i], i);
54
+ }
55
+ auto CIRCUIT = Q.mkcircuit(/*nc=*/1);
56
+ dump_info("foo", n, Q);
57
+ }
58
+
59
+ TEST(UnarySize, PrimeField) {
60
+ one_size(Fp<1>("18446744073709551557"), "eq_fp", /*eq_or_lt=*/true);
61
+ one_size(Fp<1>("18446744073709551557"), "lt_fp", /*eq_or_lt=*/false);
62
+ }
63
+ TEST(UnarySize, BinaryField) {
64
+ one_size(GF2_128<>(), "eq_gf", /*eq_or_lt=*/true);
65
+ one_size(GF2_128<>(), "lt_gf", /*eq_or_lt=*/false);
66
+ }
67
+
68
+ } // namespace
69
+ } // namespace proofs
@@ -0,0 +1,62 @@
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/logic/unary.h"
16
+
17
+ #include <stddef.h>
18
+
19
+ #include <vector>
20
+
21
+ #include "algebra/fp.h"
22
+ #include "circuits/logic/evaluation_backend.h"
23
+ #include "circuits/logic/logic.h"
24
+ #include "gf2k/gf2_128.h"
25
+ #include "gtest/gtest.h"
26
+
27
+ namespace proofs {
28
+ namespace {
29
+
30
+ template <class Field>
31
+ void one_test(const Field& F) {
32
+ using EvaluationBackend = EvaluationBackend<Field>;
33
+ using Logic = Logic<Field, EvaluationBackend>;
34
+ using BitW = typename Logic::BitW;
35
+
36
+ const EvaluationBackend ebk(F);
37
+ const Logic L(&ebk, F);
38
+ const Unary<Logic> U(L);
39
+
40
+ constexpr size_t W = 6;
41
+ using BV = typename Logic::template bitvec<W>;
42
+ size_t n = 1u << W;
43
+
44
+ for (size_t j = 0; j < n; ++j) {
45
+ std::vector<BitW> EQ(n);
46
+ std::vector<BitW> LT(n);
47
+ BV jj = L.template vbit<W>(j);
48
+
49
+ U.eq(n, EQ.data(), jj);
50
+ U.lt(n, LT.data(), jj);
51
+ for (size_t i = 0; i < n; ++i) {
52
+ EXPECT_EQ(L.eval(EQ[i]), L.konst(i == j));
53
+ EXPECT_EQ(L.eval(LT[i]), L.konst(i < j));
54
+ }
55
+ }
56
+ }
57
+
58
+ TEST(Unary, PrimeField) { one_test(Fp<1>("18446744073709551557")); }
59
+ TEST(Unary, BinaryField) { one_test(GF2_128<>()); }
60
+
61
+ } // namespace
62
+ } // namespace proofs
@@ -0,0 +1,193 @@
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_CIRCUITS_MAC_MAC_CIRCUIT_H_
16
+ #define PRIVACY_PROOFS_ZK_LIB_CIRCUITS_MAC_MAC_CIRCUIT_H_
17
+
18
+ // Implements a message authentication code in GF 2^k for a 256-bit message.
19
+ // The mac key is additively sampled by both the prover and verifier to ensure
20
+ // soundness and zk.
21
+ //
22
+ // The mac is defined as (a_pi+a_v)*x_i = mac_i where (x_1,x_2) are 128-bit
23
+ // portions of the hidden message. The verifier need only contribute one
24
+ // a_v for all MACs verified in the circuit. The prover needs to commit to
25
+ // separate a_p{i} for each portion of each message.
26
+ //
27
+ // The property that we need from this primitive is as follows:
28
+ // Assume the prover has committed to a_pi and x, i.e., fix a_pi, x.
29
+ // The probability over the verifier's random a_v that mac(x) = mac_(y)
30
+ // if x != y is at most 2^{-128}.
31
+
32
+ #include <algorithm>
33
+ #include <cstddef>
34
+
35
+ #include "circuits/logic/logic.h"
36
+ #include "gf2k/gf2_128.h"
37
+
38
+ namespace proofs {
39
+
40
+ static constexpr size_t kMACPluckerBits = 2u;
41
+
42
+ // MAC: implements a MAC in GF 2^k for a 256-bit message by simulating
43
+ // the arithmetic of the GF 2^k field. This implementation commits both
44
+ // the prover's a_p key as well as the bits of the message. This allows
45
+ // the MAC computation and the equality of the purported message to be verified
46
+ // in parallel to reduce depth.
47
+ // As an optimization, the MAC computed here is a.x instead of a.x + b. This
48
+ // MAC is unforgeable with vhp and hiding whenever x is non-zero. The caller
49
+ // must ensure that the MACed values are non-zero with very high probability.
50
+ // For example, in the case of the MAC of a hash of a randomly selected message,
51
+ // the probability of the hash being zero is quite small. This case applies for
52
+ // signatures of messages related to credentials. As another example, the
53
+ // device public key is an honestly-generated ECDSA key, and thus is unlikely
54
+ // to be zero for most curves. These cases add a small error to the
55
+ // zero-knowledge analysis of the scheme.
56
+ template <class Logic, class BitPlucker>
57
+ class MAC {
58
+ public:
59
+ using Field = typename Logic::Field;
60
+ using Elt = typename Field::Elt;
61
+ using EltW = typename Logic::EltW;
62
+ using Nat = typename Field::N;
63
+ using v8 = typename Logic::v8;
64
+ using v128 = typename Logic::v128;
65
+ using v256 = typename Logic::v256;
66
+ using packed_v128 = typename BitPlucker::packed_v128;
67
+ using packed_v256 = typename BitPlucker::packed_v256;
68
+
69
+ BitPlucker bp_;
70
+
71
+ class Witness {
72
+ public:
73
+ packed_v128 aa_[2];
74
+ packed_v256 xx_; // The value to be checked
75
+
76
+ void input(const Logic& lc) {
77
+ aa_[0] = BitPlucker::template packed_input<packed_v128>(lc);
78
+ aa_[1] = BitPlucker::template packed_input<packed_v128>(lc);
79
+ xx_ = BitPlucker::template packed_input<packed_v256>(lc);
80
+ }
81
+ };
82
+
83
+ explicit MAC(const Logic& lc) : bp_(lc), lc_(lc) {}
84
+
85
+ // Verifies a mac on the Field element value against the key (a_p + a_v).
86
+ // This method can only be called when the field is at least 256 bits, e.g.,
87
+ // with F_p256. In other cases, the caller should use a verify_mac method
88
+ // that takes the message in bit-wise form. Additionally, the order parameter
89
+ // is used to ensure that the message does not overflow the field.
90
+ void verify_mac(EltW msg, const v128 mac[/*2*/], const v128& av,
91
+ const Witness& vw, Nat order) const {
92
+ check(Field::kBits >= 256, "Field::kBits < 256");
93
+ v128 msg2[2];
94
+ unpack_msg(msg2, msg, order, vw);
95
+ assert_mac(mac, av, msg2, vw);
96
+ }
97
+
98
+ private:
99
+ // Checks mac[i] = (a_p + a_v)*xi[i] for i=0..1.
100
+ void assert_mac(const v128 mac[/*2*/], const v128& av, const v128 xi[/*2*/],
101
+ const Witness& vw) const {
102
+ v128 mv;
103
+ for (size_t i = 0; i < 2; ++i) {
104
+ v128 ap = bp_.template unpack<v128, packed_v128>(vw.aa_[i]);
105
+ v128 key = lc_.vxor(av, ap);
106
+ lc_.gf2_128_mul(mv, key, xi[i]);
107
+ lc_.vassert_eq(mac[i], mv);
108
+ }
109
+ }
110
+
111
+ void unpack_msg(v128 msg[/*2*/], EltW msgw, Nat order,
112
+ const Witness& vw) const {
113
+ v256 x = bp_.template unpack<v256, packed_v256>(vw.xx_);
114
+ std::copy(x.begin(), x.begin() + 128, msg[0].begin());
115
+ std::copy(x.begin() + 128, x.end(), msg[1].begin());
116
+
117
+ // Ensure that the incoming message does not overflow the field.
118
+ v256 bits_n;
119
+ for (size_t i = 0; i < 256; ++i) {
120
+ bits_n[i] = lc_.bit(order.bit(i));
121
+ }
122
+ lc_.assert1(lc_.vlt(x, bits_n));
123
+
124
+ // Verify that the message bits in the witness correspond to msg.
125
+ EltW te = lc_.konst(lc_.zero());
126
+ Elt twok = lc_.one();
127
+ for (size_t i = 0; i < 256; ++i) {
128
+ te = lc_.axpy(te, twok, lc_.eval(x[i]));
129
+ lc_.f_.add(twok, twok);
130
+ }
131
+ lc_.assert_eq(te, msgw);
132
+ }
133
+
134
+ const Logic& lc_;
135
+ };
136
+
137
+ // Same MAC computation for native GF2_128 field.
138
+ template <class Backend, class BitPlucker>
139
+ class MACGF2 {
140
+ public:
141
+ using Elt = typename Logic<GF2_128<>, Backend>::Elt;
142
+ using EltW = typename Logic<GF2_128<>, Backend>::EltW;
143
+ using BitW = typename Logic<GF2_128<>, Backend>::BitW;
144
+
145
+ // In this specialization, 128 bits are stored in a native EltW.
146
+ using v128 = EltW;
147
+
148
+ // Message input types v8, v256 are still encoded bit-wise.
149
+ using v8 = typename Logic<GF2_128<>, Backend>::v8;
150
+ using v256 = typename Logic<GF2_128<>, Backend>::v256;
151
+
152
+ explicit MACGF2(const Logic<GF2_128<>, Backend>& lc) : lc_(lc) {}
153
+ class Witness {
154
+ public:
155
+ EltW aa_[2];
156
+
157
+ void input(const Logic<GF2_128<>, Backend>& lc) {
158
+ aa_[0] = lc.eltw_input();
159
+ aa_[1] = lc.eltw_input();
160
+ }
161
+ };
162
+
163
+ // Verify a mac on the 256-bit message msg.
164
+ void verify_mac(const EltW mac[/*2*/], const EltW& av, const v256& msg,
165
+ const Witness& vw) const {
166
+ // Check that mac[i] = (a_p + a_v)*mm[i] for i=0..1.
167
+ for (size_t i = 0; i < 2; ++i) {
168
+ EltW mm = pack(&msg[i * 128]);
169
+ EltW key = lc_.add(av, vw.aa_[i]);
170
+ EltW got = lc_.mul(key, mm);
171
+ lc_.assert_eq(mac[i], got);
172
+ }
173
+ }
174
+
175
+ private:
176
+ // Pack a 128-bit message into a GF(2^128) field element.
177
+ EltW pack(const BitW msg[/*128*/]) const {
178
+ Elt alpha = lc_.f_.x();
179
+ Elt xi = lc_.f_.one();
180
+ EltW m = lc_.konst(0);
181
+ for (size_t i = 0; i < 128; ++i) {
182
+ m = lc_.axpy(m, xi, lc_.eval(msg[i]));
183
+ xi = lc_.mulf(xi, alpha);
184
+ }
185
+ return m;
186
+ }
187
+
188
+ const Logic<GF2_128<>, Backend>& lc_;
189
+ };
190
+
191
+ } // namespace proofs
192
+
193
+ #endif // PRIVACY_PROOFS_ZK_LIB_CIRCUITS_MAC_MAC_CIRCUIT_H_