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.
- checksums.yaml +7 -0
- data/CODE_OF_CONDUCT.md +10 -0
- data/LICENSE.txt +21 -0
- data/README.md +152 -0
- data/ext/longfellow/CMakeLists.txt +76 -0
- data/ext/longfellow/extconf.rb +77 -0
- data/lib/longfellow/attribute.rb +65 -0
- data/lib/longfellow/c.rb +105 -0
- data/lib/longfellow/errors.rb +78 -0
- data/lib/longfellow/version.rb +5 -0
- data/lib/longfellow/zk_spec.rb +40 -0
- data/lib/longfellow.rb +162 -0
- data/sig/longfellow.rbs +74 -0
- data/vendor/longfellow-zk/LICENSE +203 -0
- data/vendor/longfellow-zk/lib/algebra/blas.h +121 -0
- data/vendor/longfellow-zk/lib/algebra/bogorng.h +68 -0
- data/vendor/longfellow-zk/lib/algebra/compare.h +40 -0
- data/vendor/longfellow-zk/lib/algebra/convolution.h +219 -0
- data/vendor/longfellow-zk/lib/algebra/crt.cc +42 -0
- data/vendor/longfellow-zk/lib/algebra/crt.h +299 -0
- data/vendor/longfellow-zk/lib/algebra/crt_convolution.h +114 -0
- data/vendor/longfellow-zk/lib/algebra/crt_test.cc +371 -0
- data/vendor/longfellow-zk/lib/algebra/fft.h +104 -0
- data/vendor/longfellow-zk/lib/algebra/fft_interpolation.h +304 -0
- data/vendor/longfellow-zk/lib/algebra/fft_interpolation_test.cc +168 -0
- data/vendor/longfellow-zk/lib/algebra/fft_test.cc +257 -0
- data/vendor/longfellow-zk/lib/algebra/fp.h +59 -0
- data/vendor/longfellow-zk/lib/algebra/fp2.h +240 -0
- data/vendor/longfellow-zk/lib/algebra/fp24.h +342 -0
- data/vendor/longfellow-zk/lib/algebra/fp24_6.h +305 -0
- data/vendor/longfellow-zk/lib/algebra/fp24_6_test.cc +197 -0
- data/vendor/longfellow-zk/lib/algebra/fp2_test.cc +280 -0
- data/vendor/longfellow-zk/lib/algebra/fp_generic.h +533 -0
- data/vendor/longfellow-zk/lib/algebra/fp_p128.h +91 -0
- data/vendor/longfellow-zk/lib/algebra/fp_p256.h +68 -0
- data/vendor/longfellow-zk/lib/algebra/fp_p256k1.h +123 -0
- data/vendor/longfellow-zk/lib/algebra/fp_p384.h +65 -0
- data/vendor/longfellow-zk/lib/algebra/fp_p521.h +62 -0
- data/vendor/longfellow-zk/lib/algebra/fp_test.cc +522 -0
- data/vendor/longfellow-zk/lib/algebra/hash.h +39 -0
- data/vendor/longfellow-zk/lib/algebra/interpolation.h +117 -0
- data/vendor/longfellow-zk/lib/algebra/interpolation_test.cc +74 -0
- data/vendor/longfellow-zk/lib/algebra/limb.h +153 -0
- data/vendor/longfellow-zk/lib/algebra/limb_test.cc +75 -0
- data/vendor/longfellow-zk/lib/algebra/nat.cc +32 -0
- data/vendor/longfellow-zk/lib/algebra/nat.h +212 -0
- data/vendor/longfellow-zk/lib/algebra/nat_test.cc +183 -0
- data/vendor/longfellow-zk/lib/algebra/nussbaumer.h +400 -0
- data/vendor/longfellow-zk/lib/algebra/nussbaumer_test.cc +138 -0
- data/vendor/longfellow-zk/lib/algebra/nussbaumerfp2_test.cc +139 -0
- data/vendor/longfellow-zk/lib/algebra/permutations.h +79 -0
- data/vendor/longfellow-zk/lib/algebra/poly.h +240 -0
- data/vendor/longfellow-zk/lib/algebra/poly_test.cc +123 -0
- data/vendor/longfellow-zk/lib/algebra/reed_solomon.h +150 -0
- data/vendor/longfellow-zk/lib/algebra/reed_solomon_extension.h +108 -0
- data/vendor/longfellow-zk/lib/algebra/reed_solomon_extension_test.cc +76 -0
- data/vendor/longfellow-zk/lib/algebra/reed_solomon_test.cc +473 -0
- data/vendor/longfellow-zk/lib/algebra/rfft.h +400 -0
- data/vendor/longfellow-zk/lib/algebra/rfft_test.cc +102 -0
- data/vendor/longfellow-zk/lib/algebra/static_string.h +29 -0
- data/vendor/longfellow-zk/lib/algebra/sysdep.h +495 -0
- data/vendor/longfellow-zk/lib/algebra/sysdep_test.cc +41 -0
- data/vendor/longfellow-zk/lib/algebra/twiddle.h +59 -0
- data/vendor/longfellow-zk/lib/algebra/utility.h +86 -0
- data/vendor/longfellow-zk/lib/algebra/utility_test.cc +86 -0
- data/vendor/longfellow-zk/lib/arrays/affine.h +56 -0
- data/vendor/longfellow-zk/lib/arrays/affine_test.cc +220 -0
- data/vendor/longfellow-zk/lib/arrays/dense.h +210 -0
- data/vendor/longfellow-zk/lib/arrays/eq.h +75 -0
- data/vendor/longfellow-zk/lib/arrays/eqs.h +137 -0
- data/vendor/longfellow-zk/lib/arrays/eqs_test.cc +151 -0
- data/vendor/longfellow-zk/lib/arrays/sparse.h +192 -0
- data/vendor/longfellow-zk/lib/cbor/host_decoder.h +323 -0
- data/vendor/longfellow-zk/lib/cbor/host_decoder_test.cc +541 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor.h +594 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_byte_decoder.h +150 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_byte_decoder_test.cc +147 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_constants.h +27 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_pluck.h +110 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_pluck_test.cc +55 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_test.cc +174 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_testing.h +98 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/cbor_witness.h +312 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/mso2_test.cc +662 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/mso_test.cc +485 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/scan.h +104 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser/scan_test.cc +137 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor.h +640 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor_byte_decoder.h +150 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor_byte_decoder_test.cc +147 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor_constants.h +27 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor_testing.h +99 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/cbor_witness.h +319 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/lexer_test.cc +120 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/mdoc_examples_test.cc +89 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/parser_circuit_test.cc +506 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/parser_size_test.cc +79 -0
- data/vendor/longfellow-zk/lib/circuits/cbor_parser_v2/parser_test.cc +473 -0
- data/vendor/longfellow-zk/lib/circuits/compiler/canonicalization_test.cc +185 -0
- data/vendor/longfellow-zk/lib/circuits/compiler/circuit_dump.h +65 -0
- data/vendor/longfellow-zk/lib/circuits/compiler/compiler.h +471 -0
- data/vendor/longfellow-zk/lib/circuits/compiler/compiler_test.cc +110 -0
- data/vendor/longfellow-zk/lib/circuits/compiler/node.h +176 -0
- data/vendor/longfellow-zk/lib/circuits/compiler/pdqhash.h +127 -0
- data/vendor/longfellow-zk/lib/circuits/compiler/schedule.h +435 -0
- data/vendor/longfellow-zk/lib/circuits/ecdsa/verify_circuit.h +371 -0
- data/vendor/longfellow-zk/lib/circuits/ecdsa/verify_external_test.cc +246 -0
- data/vendor/longfellow-zk/lib/circuits/ecdsa/verify_test.cc +587 -0
- data/vendor/longfellow-zk/lib/circuits/ecdsa/verify_witness.h +201 -0
- data/vendor/longfellow-zk/lib/circuits/logic/bit_adder.h +140 -0
- data/vendor/longfellow-zk/lib/circuits/logic/bit_adder_test.cc +64 -0
- data/vendor/longfellow-zk/lib/circuits/logic/bit_plucker.h +247 -0
- data/vendor/longfellow-zk/lib/circuits/logic/bit_plucker_constants.h +35 -0
- data/vendor/longfellow-zk/lib/circuits/logic/bit_plucker_encoder.h +72 -0
- data/vendor/longfellow-zk/lib/circuits/logic/bit_plucker_test.cc +183 -0
- data/vendor/longfellow-zk/lib/circuits/logic/compiler_backend.h +62 -0
- data/vendor/longfellow-zk/lib/circuits/logic/counter.h +171 -0
- data/vendor/longfellow-zk/lib/circuits/logic/counter_test.cc +102 -0
- data/vendor/longfellow-zk/lib/circuits/logic/evaluation_backend.h +94 -0
- data/vendor/longfellow-zk/lib/circuits/logic/logic.h +1232 -0
- data/vendor/longfellow-zk/lib/circuits/logic/logic_circuit_test.cc +310 -0
- data/vendor/longfellow-zk/lib/circuits/logic/logic_test.cc +521 -0
- data/vendor/longfellow-zk/lib/circuits/logic/memcmp.h +68 -0
- data/vendor/longfellow-zk/lib/circuits/logic/memcmp_test.cc +148 -0
- data/vendor/longfellow-zk/lib/circuits/logic/polynomial.h +94 -0
- data/vendor/longfellow-zk/lib/circuits/logic/polynomial_test.cc +62 -0
- data/vendor/longfellow-zk/lib/circuits/logic/routing.h +445 -0
- data/vendor/longfellow-zk/lib/circuits/logic/routing_test.cc +241 -0
- data/vendor/longfellow-zk/lib/circuits/logic/unary.h +55 -0
- data/vendor/longfellow-zk/lib/circuits/logic/unary_plucker.h +77 -0
- data/vendor/longfellow-zk/lib/circuits/logic/unary_plucker_constants.h +37 -0
- data/vendor/longfellow-zk/lib/circuits/logic/unary_plucker_test.cc +53 -0
- data/vendor/longfellow-zk/lib/circuits/logic/unary_size_test.cc +69 -0
- data/vendor/longfellow-zk/lib/circuits/logic/unary_test.cc +62 -0
- data/vendor/longfellow-zk/lib/circuits/mac/mac_circuit.h +193 -0
- data/vendor/longfellow-zk/lib/circuits/mac/mac_circuit_test.cc +223 -0
- data/vendor/longfellow-zk/lib/circuits/mac/mac_reference.h +72 -0
- data/vendor/longfellow-zk/lib/circuits/mac/mac_witness.h +94 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/circuit_maker.cc +242 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_attribute_ids.h +311 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_attribute_test.cc +64 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_circuit_id.cc +85 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_constants.h +85 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_decompress.cc +41 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_decompress.h +27 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_examples.h +5232 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_generate_circuit.cc +199 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_hash.h +554 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_signature.h +143 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_signature_test.cc +444 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_test_attributes.h +157 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_witness.h +863 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_zk.cc +693 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_zk.h +216 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/mdoc_zk_test.cc +724 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/zk_spec.cc +100 -0
- data/vendor/longfellow-zk/lib/circuits/mdoc/zk_spec_test.cc +155 -0
- data/vendor/longfellow-zk/lib/circuits/sha/flatsha256_circuit.h +330 -0
- data/vendor/longfellow-zk/lib/circuits/sha/flatsha256_circuit_test.cc +607 -0
- data/vendor/longfellow-zk/lib/circuits/sha/flatsha256_io.h +26 -0
- data/vendor/longfellow-zk/lib/circuits/sha/flatsha256_witness.cc +163 -0
- data/vendor/longfellow-zk/lib/circuits/sha/flatsha256_witness.h +47 -0
- data/vendor/longfellow-zk/lib/circuits/sha/sha256_constants.cc +34 -0
- data/vendor/longfellow-zk/lib/circuits/sha/sha256_constants.h +27 -0
- data/vendor/longfellow-zk/lib/circuits/sha/sha256_test_values.h +389 -0
- data/vendor/longfellow-zk/lib/circuits/tests/anoncred/ptrcred.h +171 -0
- data/vendor/longfellow-zk/lib/circuits/tests/anoncred/small.h +218 -0
- data/vendor/longfellow-zk/lib/circuits/tests/anoncred/small_examples.h +118 -0
- data/vendor/longfellow-zk/lib/circuits/tests/anoncred/small_io.h +25 -0
- data/vendor/longfellow-zk/lib/circuits/tests/anoncred/small_test.cc +208 -0
- data/vendor/longfellow-zk/lib/circuits/tests/anoncred/small_witness.h +130 -0
- data/vendor/longfellow-zk/lib/circuits/tests/base64/decode.h +508 -0
- data/vendor/longfellow-zk/lib/circuits/tests/base64/decode_circuit_test.cc +95 -0
- data/vendor/longfellow-zk/lib/circuits/tests/base64/decode_test.cc +119 -0
- data/vendor/longfellow-zk/lib/circuits/tests/base64/decode_util.cc +47 -0
- data/vendor/longfellow-zk/lib/circuits/tests/base64/decode_util.h +29 -0
- data/vendor/longfellow-zk/lib/circuits/tests/ec/pk_circuit.h +231 -0
- data/vendor/longfellow-zk/lib/circuits/tests/ec/pk_circuit_test.cc +428 -0
- data/vendor/longfellow-zk/lib/circuits/tests/ec/pk_witness.h +102 -0
- data/vendor/longfellow-zk/lib/circuits/tests/jwt/jwt.h +190 -0
- data/vendor/longfellow-zk/lib/circuits/tests/jwt/jwt_constants.h +26 -0
- data/vendor/longfellow-zk/lib/circuits/tests/jwt/jwt_test.cc +559 -0
- data/vendor/longfellow-zk/lib/circuits/tests/jwt/jwt_witness.h +315 -0
- data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_1f.h +411 -0
- data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_1f_io.h +32 -0
- data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_1f_test.cc +364 -0
- data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_1f_witness.h +278 -0
- data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_revocation.h +146 -0
- data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_revocation_constants.h +25 -0
- data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_revocation_test.cc +315 -0
- data/vendor/longfellow-zk/lib/circuits/tests/mdoc/mdoc_revocation_witness.h +136 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/bitaddr/bitaddr.h +250 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/bitaddr/bitaddr_test.cc +333 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/bitaddr/bitaddr_witness.h +152 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44.h +903 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_circuit_test.cc +274 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_eval_test.cc +440 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_examples.cc +8851 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_examples.h +93 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_types.cc +24 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_types.h +118 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_witness.h +453 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_44_witness_test.cc +49 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref.cc +458 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref.h +150 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref_test.cc +398 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref_test_vectors.inc +3618 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref_test_vectors_pkdecode.inc +689 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/ml_dsa_ref_test_vectors_sigdecode.inc +1501 -0
- data/vendor/longfellow-zk/lib/circuits/tests/pq/ml_dsa/sigdecode_test_vectors.inc +540 -0
- data/vendor/longfellow-zk/lib/circuits/tests/ripemd/ripemd_circuit.h +394 -0
- data/vendor/longfellow-zk/lib/circuits/tests/ripemd/ripemd_circuit_test.cc +577 -0
- data/vendor/longfellow-zk/lib/circuits/tests/ripemd/ripemd_constants.h +90 -0
- data/vendor/longfellow-zk/lib/circuits/tests/ripemd/ripemd_witness.cc +174 -0
- data/vendor/longfellow-zk/lib/circuits/tests/ripemd/ripemd_witness.h +140 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_circuit.h +351 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_circuit_test.cc +466 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_reference.cc +207 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_reference.h +59 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_reference_test.cc +153 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_round_constants.cc +39 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_round_constants.h +29 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_slicing.h +31 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_witness.cc +83 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/sha3_witness.h +72 -0
- data/vendor/longfellow-zk/lib/circuits/tests/sha3/shake_test_vectors.h +477 -0
- data/vendor/longfellow-zk/lib/ec/elliptic_curve.h +596 -0
- data/vendor/longfellow-zk/lib/ec/elliptic_curve_test.cc +548 -0
- data/vendor/longfellow-zk/lib/ec/p256.cc +36 -0
- data/vendor/longfellow-zk/lib/ec/p256.h +60 -0
- data/vendor/longfellow-zk/lib/ec/p256k1.cc +34 -0
- data/vendor/longfellow-zk/lib/ec/p256k1.h +60 -0
- data/vendor/longfellow-zk/lib/gf2k/gf2_128.h +503 -0
- data/vendor/longfellow-zk/lib/gf2k/gf2_128_bench.cc +48 -0
- data/vendor/longfellow-zk/lib/gf2k/gf2_128_test.cc +416 -0
- data/vendor/longfellow-zk/lib/gf2k/gf2poly.h +74 -0
- data/vendor/longfellow-zk/lib/gf2k/lch14.h +242 -0
- data/vendor/longfellow-zk/lib/gf2k/lch14_bench.cc +75 -0
- data/vendor/longfellow-zk/lib/gf2k/lch14_reed_solomon.h +127 -0
- data/vendor/longfellow-zk/lib/gf2k/lch14_reed_solomon_test.cc +110 -0
- data/vendor/longfellow-zk/lib/gf2k/lch14_test.cc +246 -0
- data/vendor/longfellow-zk/lib/gf2k/sysdep.h +329 -0
- data/vendor/longfellow-zk/lib/ligero/ligero_param.h +449 -0
- data/vendor/longfellow-zk/lib/ligero/ligero_prover.h +354 -0
- data/vendor/longfellow-zk/lib/ligero/ligero_test.cc +136 -0
- data/vendor/longfellow-zk/lib/ligero/ligero_transcript.h +67 -0
- data/vendor/longfellow-zk/lib/ligero/ligero_verifier.h +272 -0
- data/vendor/longfellow-zk/lib/merkle/merkle_commitment.h +104 -0
- data/vendor/longfellow-zk/lib/merkle/merkle_tree.h +216 -0
- data/vendor/longfellow-zk/lib/merkle/merkle_tree_test.cc +240 -0
- data/vendor/longfellow-zk/lib/proto/circuit.h +354 -0
- data/vendor/longfellow-zk/lib/proto/circuit_test.cc +202 -0
- data/vendor/longfellow-zk/lib/random/random.h +119 -0
- data/vendor/longfellow-zk/lib/random/random_test.cc +189 -0
- data/vendor/longfellow-zk/lib/random/secure_random_engine.h +37 -0
- data/vendor/longfellow-zk/lib/random/transcript.h +193 -0
- data/vendor/longfellow-zk/lib/random/transcript_test.cc +344 -0
- data/vendor/longfellow-zk/lib/sumcheck/circuit.h +148 -0
- data/vendor/longfellow-zk/lib/sumcheck/circuit_id.h +71 -0
- data/vendor/longfellow-zk/lib/sumcheck/equad.h +126 -0
- data/vendor/longfellow-zk/lib/sumcheck/hquad.h +115 -0
- data/vendor/longfellow-zk/lib/sumcheck/prover.h +59 -0
- data/vendor/longfellow-zk/lib/sumcheck/prover_layers.h +362 -0
- data/vendor/longfellow-zk/lib/sumcheck/quad.h +227 -0
- data/vendor/longfellow-zk/lib/sumcheck/quad_builder.h +211 -0
- data/vendor/longfellow-zk/lib/sumcheck/quad_test.cc +169 -0
- data/vendor/longfellow-zk/lib/sumcheck/sumcheck_test.cc +324 -0
- data/vendor/longfellow-zk/lib/sumcheck/testing.h +69 -0
- data/vendor/longfellow-zk/lib/sumcheck/transcript_sumcheck.h +85 -0
- data/vendor/longfellow-zk/lib/sumcheck/verifier.h +84 -0
- data/vendor/longfellow-zk/lib/sumcheck/verifier_layers.h +221 -0
- data/vendor/longfellow-zk/lib/testing/test_main.cc +50 -0
- data/vendor/longfellow-zk/lib/util/ceildiv.h +164 -0
- data/vendor/longfellow-zk/lib/util/ceildiv_test.cc +152 -0
- data/vendor/longfellow-zk/lib/util/crc64.h +45 -0
- data/vendor/longfellow-zk/lib/util/crypto.cc +39 -0
- data/vendor/longfellow-zk/lib/util/crypto.h +108 -0
- data/vendor/longfellow-zk/lib/util/log.cc +110 -0
- data/vendor/longfellow-zk/lib/util/log.h +33 -0
- data/vendor/longfellow-zk/lib/util/panic.h +40 -0
- data/vendor/longfellow-zk/lib/util/readbuffer.h +67 -0
- data/vendor/longfellow-zk/lib/util/serialization.h +54 -0
- data/vendor/longfellow-zk/lib/zk/zk_common.h +455 -0
- data/vendor/longfellow-zk/lib/zk/zk_proof.h +378 -0
- data/vendor/longfellow-zk/lib/zk/zk_prover.h +202 -0
- data/vendor/longfellow-zk/lib/zk/zk_test.cc +340 -0
- data/vendor/longfellow-zk/lib/zk/zk_testing.h +154 -0
- data/vendor/longfellow-zk/lib/zk/zk_verifier.h +109 -0
- metadata +347 -0
|
@@ -0,0 +1,340 @@
|
|
|
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 <cstddef>
|
|
16
|
+
#include <cstdint>
|
|
17
|
+
#include <cstdio>
|
|
18
|
+
#include <cstring>
|
|
19
|
+
#include <memory>
|
|
20
|
+
#include <vector>
|
|
21
|
+
|
|
22
|
+
#include "algebra/convolution.h"
|
|
23
|
+
#include "algebra/fp_p128.h"
|
|
24
|
+
#include "algebra/reed_solomon.h"
|
|
25
|
+
#include "arrays/dense.h"
|
|
26
|
+
#include "circuits/compiler/circuit_dump.h"
|
|
27
|
+
#include "circuits/compiler/compiler.h"
|
|
28
|
+
#include "circuits/ecdsa/verify_circuit.h"
|
|
29
|
+
#include "circuits/ecdsa/verify_witness.h"
|
|
30
|
+
#include "circuits/logic/compiler_backend.h"
|
|
31
|
+
#include "circuits/logic/logic.h"
|
|
32
|
+
#include "ec/p256.h"
|
|
33
|
+
#include "proto/circuit.h"
|
|
34
|
+
#include "random/random.h"
|
|
35
|
+
#include "random/transcript.h"
|
|
36
|
+
#include "sumcheck/circuit.h"
|
|
37
|
+
#include "sumcheck/prover.h"
|
|
38
|
+
#include "util/log.h"
|
|
39
|
+
#include "util/readbuffer.h"
|
|
40
|
+
#include "zk/zk_common.h"
|
|
41
|
+
#include "zk/zk_proof.h"
|
|
42
|
+
#include "zk/zk_prover.h"
|
|
43
|
+
#include "zk/zk_testing.h"
|
|
44
|
+
#include "gtest/gtest.h"
|
|
45
|
+
|
|
46
|
+
namespace proofs {
|
|
47
|
+
namespace {
|
|
48
|
+
|
|
49
|
+
// Test fixture for ZK.
|
|
50
|
+
// This class produces static versions of a test circuit that can be used for
|
|
51
|
+
// many tests.
|
|
52
|
+
class ZKTest : public testing::Test {
|
|
53
|
+
using Nat = Fp256Base::N;
|
|
54
|
+
using Elt = Fp256Base::Elt;
|
|
55
|
+
using Verw = VerifyWitness3<P256, Fp256Scalar>;
|
|
56
|
+
|
|
57
|
+
protected:
|
|
58
|
+
ZKTest()
|
|
59
|
+
: pkx_(p256_base.of_string("0x88903e4e1339bde78dd5b3d7baf3efdd72eb5bf5aaa"
|
|
60
|
+
"f686c8f9ff5e7c6368d9c")),
|
|
61
|
+
pky_(p256_base.of_string("0xeb8341fc38bb802138498d5f4c03733f457ebbafd0b"
|
|
62
|
+
"2fe38e6f58626767f9e75")),
|
|
63
|
+
omega_x_(p256_base.of_string("0xf90d338ebd84f5665cfc85c67990e3379fc9563"
|
|
64
|
+
"b382a4a4c985a65324b242562")),
|
|
65
|
+
omega_y_(p256_base.of_string("0xb9e81e42bc97cc4da04fc2e20106e34084738a6"
|
|
66
|
+
"474d232c6dbf4174f60a43eac")),
|
|
67
|
+
e_("0x2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7a"
|
|
68
|
+
"e"),
|
|
69
|
+
r_("0xc71bcbfb28bbe06299a225f057797aaf5f22669e90475de5f64176b2612671"),
|
|
70
|
+
s_("0x42ad2f2ec7b6e91360b53427690dddfe578c10d8cf480a66a6c2410ff4f6dd4"
|
|
71
|
+
"0") {
|
|
72
|
+
set_log_level(INFO);
|
|
73
|
+
w_ = std::make_unique<Dense<Fp256Base>>(1, circuit1_->ninputs);
|
|
74
|
+
DenseFiller<Fp256Base> filler(*w_);
|
|
75
|
+
|
|
76
|
+
Verw vw(p256_scalar, p256);
|
|
77
|
+
vw.compute_witness(pkx_, pky_, e_, r_, s_);
|
|
78
|
+
filler.push_back(p256_base.one());
|
|
79
|
+
filler.push_back(pkx_);
|
|
80
|
+
filler.push_back(pky_);
|
|
81
|
+
filler.push_back(p256_base.to_montgomery(e_));
|
|
82
|
+
vw.fill_witness(filler);
|
|
83
|
+
|
|
84
|
+
// public input
|
|
85
|
+
pub_ = std::make_unique<Dense<Fp256Base>>(1, circuit1_->ninputs);
|
|
86
|
+
DenseFiller<Fp256Base> pubfill(*pub_);
|
|
87
|
+
pubfill.push_back(p256_base.one());
|
|
88
|
+
pubfill.push_back(pkx_);
|
|
89
|
+
pubfill.push_back(pky_);
|
|
90
|
+
pubfill.push_back(p256_base.to_montgomery(e_));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
static void SetUpTestCase() {
|
|
94
|
+
if (circuit1_ == nullptr) {
|
|
95
|
+
using CompilerBackend = CompilerBackend<Fp256Base>;
|
|
96
|
+
using LogicCircuit = Logic<Fp256Base, CompilerBackend>;
|
|
97
|
+
using EltW = typename LogicCircuit::EltW;
|
|
98
|
+
using Verc = VerifyCircuit<LogicCircuit, Fp256Base, P256>;
|
|
99
|
+
QuadCircuit<Fp256Base> Q(p256_base);
|
|
100
|
+
const CompilerBackend cbk(&Q);
|
|
101
|
+
const LogicCircuit lc(&cbk, p256_base);
|
|
102
|
+
|
|
103
|
+
Verc verc(lc, p256, n256_order);
|
|
104
|
+
|
|
105
|
+
EltW pkx = lc.eltw_input(), pky = lc.eltw_input(), e = lc.eltw_input();
|
|
106
|
+
Q.private_input();
|
|
107
|
+
Verc::Witness vwc;
|
|
108
|
+
vwc.input(lc);
|
|
109
|
+
verc.verify_signature3(pkx, pky, e, vwc);
|
|
110
|
+
circuit1_ = Q.mkcircuit(1).release();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
static void TearDownTestCase() {
|
|
115
|
+
if (circuit1_ != nullptr) {
|
|
116
|
+
delete circuit1_;
|
|
117
|
+
circuit1_ = nullptr;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
static Circuit<Fp256Base>* circuit1_;
|
|
122
|
+
std::unique_ptr<Dense<Fp256Base>> w_;
|
|
123
|
+
std::unique_ptr<Dense<Fp256Base>> pub_;
|
|
124
|
+
const Elt pkx_, pky_, omega_x_, omega_y_;
|
|
125
|
+
const Nat e_, r_, s_;
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
Circuit<Fp256Base>* ZKTest::circuit1_ = nullptr;
|
|
129
|
+
|
|
130
|
+
TEST_F(ZKTest, prover_verifier) {
|
|
131
|
+
run2_test_zk(*circuit1_, *w_, *pub_, p256_base, omega_x_, omega_y_,
|
|
132
|
+
1ull << 31);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
TEST_F(ZKTest, failing_test) {
|
|
136
|
+
auto W_fail = Dense<Fp256Base>(1, circuit1_->ninputs);
|
|
137
|
+
DenseFiller<Fp256Base> wf(W_fail);
|
|
138
|
+
wf.push_back(p256_base.one());
|
|
139
|
+
wf.push_back(pkx_);
|
|
140
|
+
wf.push_back(pky_);
|
|
141
|
+
wf.push_back(p256_base.to_montgomery(e_));
|
|
142
|
+
run_failing_test_zk2(*circuit1_, W_fail, *pub_, p256_base, omega_x_, omega_y_,
|
|
143
|
+
1ull << 31);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
TEST_F(ZKTest, short_proofs_fail) {
|
|
147
|
+
ZkProof<Fp256Base> zkpv(*circuit1_, 4, 189);
|
|
148
|
+
std::vector<uint8_t> buf(213348, 1u);
|
|
149
|
+
// Check that short proofs fail.
|
|
150
|
+
for (size_t i = 1; i < buf.size(); ++i) {
|
|
151
|
+
ReadBuffer rb(buf.data(), buf.size() - i);
|
|
152
|
+
EXPECT_FALSE(zkpv.read(rb, p256_base));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
TEST_F(ZKTest, random_proofs_fail) {
|
|
157
|
+
ZkProof<Fp256Base> zkpv(*circuit1_, 4, 189);
|
|
158
|
+
std::vector<uint8_t> buf(213348, 1u);
|
|
159
|
+
for (size_t i = 0; i < buf.size(); ++i) {
|
|
160
|
+
buf[i] = random() & 0xff;
|
|
161
|
+
}
|
|
162
|
+
ReadBuffer rb(buf);
|
|
163
|
+
EXPECT_FALSE(zkpv.read(rb, p256_base));
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
TEST_F(ZKTest, elt_out_of_range) {
|
|
167
|
+
ZkProof<Fp256Base> zkpv(*circuit1_, 4, 189);
|
|
168
|
+
// Initialize the proof so that all of the elt are in range.
|
|
169
|
+
std::vector<uint8_t> buf(213348, 0u);
|
|
170
|
+
|
|
171
|
+
// Set the first two run lengths to be 1.
|
|
172
|
+
buf[(3366 + 189) * 32] = 1;
|
|
173
|
+
buf[(3366 + 189 + 1) * 32 + 4] = 1;
|
|
174
|
+
|
|
175
|
+
// Selectively create bad elts at these indices and assert the parse fails.
|
|
176
|
+
size_t bad_elts[] = {
|
|
177
|
+
1 * 32,
|
|
178
|
+
13 * 32, /* bad elts in sumcheck transcript */
|
|
179
|
+
451 * 32,
|
|
180
|
+
456 * 32, /* bad elts in com proof, block */
|
|
181
|
+
1133 * 32,
|
|
182
|
+
1134 * 32, /* bad elts in com proof, dblock */
|
|
183
|
+
2496 * 32,
|
|
184
|
+
2497 * 32, /* bad elts in com proof, r */
|
|
185
|
+
2685 * 32,
|
|
186
|
+
2686 * 32, /* bad elts in com proof, d-b */
|
|
187
|
+
(3366 + 189) * 32 + 4, /* bad elt in first run */
|
|
188
|
+
(3366 + 189 + 1) * 32 + 8, /* bad elt in second run */
|
|
189
|
+
};
|
|
190
|
+
for (size_t bi = 0; bi < sizeof(bad_elts) / sizeof(size_t); ++bi) {
|
|
191
|
+
for (size_t i = 0; i < 32; ++i) {
|
|
192
|
+
buf[bad_elts[bi] + i] = 0xff;
|
|
193
|
+
}
|
|
194
|
+
ReadBuffer rb(buf);
|
|
195
|
+
EXPECT_FALSE(zkpv.read(rb, p256_base));
|
|
196
|
+
for (size_t i = 0; i < 32; ++i) {
|
|
197
|
+
buf[bad_elts[bi] + i] = 0x00;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
TEST(ZK, test_circuit_io) {
|
|
203
|
+
auto c = Circuit<Fp256Base>{
|
|
204
|
+
.nv = 2,
|
|
205
|
+
.logv = 1,
|
|
206
|
+
.nc = 1,
|
|
207
|
+
.logc = 0,
|
|
208
|
+
.nl = 1,
|
|
209
|
+
.ninputs = 4,
|
|
210
|
+
.npub_in = 4,
|
|
211
|
+
};
|
|
212
|
+
c.l.push_back(Layer<Fp256Base>{.nw = 7, .logw = 3, .quad = nullptr});
|
|
213
|
+
ZkProof<Fp256Base> zkpv(c, 4, 16);
|
|
214
|
+
std::vector<uint8_t> buf(213348, 0x02u);
|
|
215
|
+
ReadBuffer rb(buf);
|
|
216
|
+
EXPECT_FALSE(zkpv.read(rb, p256_base));
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
void dump(const char* msg, const std::vector<uint8_t> bytes) {
|
|
220
|
+
size_t sz = bytes.size();
|
|
221
|
+
log(INFO, "%s size: %zu", msg, sz);
|
|
222
|
+
|
|
223
|
+
for (size_t i = 0; i < sz; ++i) {
|
|
224
|
+
printf("%02x", bytes[i]);
|
|
225
|
+
}
|
|
226
|
+
printf("\n");
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// This mock random engine returns a fixed sequence of random bytes in order
|
|
230
|
+
// to create "simple" examples for the RFC.
|
|
231
|
+
class TestRandomEngine : public RandomEngine {
|
|
232
|
+
public:
|
|
233
|
+
TestRandomEngine() = default;
|
|
234
|
+
void bytes(uint8_t* buf, size_t n) override {
|
|
235
|
+
memset(buf, 0, n);
|
|
236
|
+
buf[0] = 2;
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
// This Test method generates the examples used in our RFC for a circuit,
|
|
241
|
+
// for a sumcheck run, and a Ligero run.
|
|
242
|
+
// First, it defines a small test circuit:
|
|
243
|
+
// C(n, m, s) = 0 if and only if n is the m-th s-gonal number.
|
|
244
|
+
// i.e., verifies that 2n = (s-2)m^2 - (s - 4)*m
|
|
245
|
+
// For example, C(45, 5, 6) = 0.
|
|
246
|
+
// This relationship was chosen so that it has depth > 2 but not too many
|
|
247
|
+
// wires or terms.
|
|
248
|
+
TEST(ZK, Rfc_testvector1) {
|
|
249
|
+
set_log_level(INFO);
|
|
250
|
+
|
|
251
|
+
using Fp128 = Fp128<>;
|
|
252
|
+
using CompilerBackend = CompilerBackend<Fp128>;
|
|
253
|
+
using LogicCircuit = Logic<Fp128, CompilerBackend>;
|
|
254
|
+
using EltW = LogicCircuit::EltW;
|
|
255
|
+
const Fp128 Fg;
|
|
256
|
+
std::unique_ptr<Circuit<Fp128>> circuit;
|
|
257
|
+
|
|
258
|
+
/*scope to delimit compile-time*/ {
|
|
259
|
+
QuadCircuit<Fp128> Q(Fg);
|
|
260
|
+
CompilerBackend cbk(&Q);
|
|
261
|
+
const LogicCircuit LC(&cbk, Fg);
|
|
262
|
+
EltW n = LC.eltw_input();
|
|
263
|
+
Q.private_input();
|
|
264
|
+
EltW m = LC.eltw_input();
|
|
265
|
+
EltW s = LC.eltw_input();
|
|
266
|
+
LC.assert_eq(LC.sub(LC.mul(LC.sub(s, LC.konst(2)), LC.mul(m, m)),
|
|
267
|
+
LC.mul(LC.sub(s, LC.konst(4)), m)),
|
|
268
|
+
LC.mul(n, LC.konst(2)));
|
|
269
|
+
circuit = Q.mkcircuit(1);
|
|
270
|
+
dump_info("rfc_sgonal", 1, Q);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Serialize the circuit.
|
|
274
|
+
std::vector<uint8_t> bytes;
|
|
275
|
+
CircuitRep<Fp128> cr(Fg, FP128_ID);
|
|
276
|
+
cr.to_bytes(*circuit, bytes);
|
|
277
|
+
dump("circuit", bytes);
|
|
278
|
+
|
|
279
|
+
// Sample input.
|
|
280
|
+
auto W = Dense<Fp128>(1, circuit->ninputs);
|
|
281
|
+
DenseFiller<Fp128> filler(W);
|
|
282
|
+
|
|
283
|
+
filler.push_back(Fg.one());
|
|
284
|
+
filler.push_back(Fg.of_scalar(45));
|
|
285
|
+
filler.push_back(Fg.of_scalar(5));
|
|
286
|
+
filler.push_back(Fg.of_scalar(6));
|
|
287
|
+
|
|
288
|
+
Transcript tp((uint8_t*)"test", 4);
|
|
289
|
+
|
|
290
|
+
// Sumcheck on the circuit.
|
|
291
|
+
ZkCommon<Fp128>::initialize_sumcheck_fiat_shamir(tp, *circuit, W, Fg);
|
|
292
|
+
|
|
293
|
+
ZkProof<Fp128> zkpr(*circuit, 4, 6);
|
|
294
|
+
Prover<Fp128>::inputs in;
|
|
295
|
+
Prover<Fp128> sc_prover(Fg);
|
|
296
|
+
auto V = sc_prover.eval_circuit(&in, circuit.get(), W.clone(), Fg);
|
|
297
|
+
EXPECT_TRUE(V != nullptr);
|
|
298
|
+
for (size_t i = 0; i < V->n1_; ++i) {
|
|
299
|
+
EXPECT_EQ(V->v_[i], Fg.zero());
|
|
300
|
+
}
|
|
301
|
+
sc_prover.prove(&zkpr.proof, nullptr, circuit.get(), in, tp);
|
|
302
|
+
std::vector<uint8_t> sc_bytes;
|
|
303
|
+
zkpr.write_sc_proof(zkpr.proof, sc_bytes, Fg);
|
|
304
|
+
dump("sc_proof", sc_bytes);
|
|
305
|
+
|
|
306
|
+
// Ligero proof.
|
|
307
|
+
using FftConvolutionFactory = FFTConvolutionFactory<Fp128>;
|
|
308
|
+
auto omega = Fg.of_string("164956748514267535023998284330560247862");
|
|
309
|
+
uint64_t omega_order = 1ull << 32;
|
|
310
|
+
FftConvolutionFactory fft(Fg, omega, omega_order);
|
|
311
|
+
using RSFactory = ReedSolomonFactory<Fp128, FftConvolutionFactory>;
|
|
312
|
+
const RSFactory rsf(fft, Fg);
|
|
313
|
+
auto zkp = ZkProver<Fp128, RSFactory>(*circuit, Fg, rsf);
|
|
314
|
+
TestRandomEngine rng;
|
|
315
|
+
Transcript tlp((uint8_t*)"test", 4);
|
|
316
|
+
zkp.commit(zkpr, W, tlp, rng);
|
|
317
|
+
|
|
318
|
+
log(INFO, "params: b:%zu be:%zu nrow:%zu w:%zu r: %zu nq:%zu qr:%zu wit:%zu",
|
|
319
|
+
zkpr.param.block, zkpr.param.block_enc, zkpr.param.nrow, zkpr.param.w,
|
|
320
|
+
zkpr.param.r, zkpr.param.nqtriples, zkpr.param.nq, zkp.witness_.size());
|
|
321
|
+
|
|
322
|
+
// Print the tableau.
|
|
323
|
+
std::vector<uint8_t> buf(16, 0);
|
|
324
|
+
for (size_t i = 0; i < zkp.witness_.size(); ++i) {
|
|
325
|
+
Fg.to_bytes_field(&buf[0], zkp.witness_[i]);
|
|
326
|
+
dump("block", buf);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
std::vector<uint8_t> com_bytes;
|
|
330
|
+
zkpr.write_com(zkpr.com, com_bytes, Fg);
|
|
331
|
+
dump("commit", com_bytes);
|
|
332
|
+
|
|
333
|
+
EXPECT_TRUE(zkp.prove(zkpr, W, tp));
|
|
334
|
+
std::vector<uint8_t> ligero_bytes;
|
|
335
|
+
zkpr.write_com_proof(zkpr.com_proof, ligero_bytes, Fg);
|
|
336
|
+
dump("ligero_proof", ligero_bytes);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
} // namespace
|
|
340
|
+
} // namespace proofs
|
|
@@ -0,0 +1,154 @@
|
|
|
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_ZK_ZK_TESTING_H_
|
|
16
|
+
#define PRIVACY_PROOFS_ZK_LIB_ZK_ZK_TESTING_H_
|
|
17
|
+
|
|
18
|
+
#include <cstddef>
|
|
19
|
+
#include <cstdint>
|
|
20
|
+
#include <vector>
|
|
21
|
+
|
|
22
|
+
#include "algebra/convolution.h"
|
|
23
|
+
#include "algebra/fp2.h"
|
|
24
|
+
#include "algebra/reed_solomon.h"
|
|
25
|
+
#include "arrays/dense.h"
|
|
26
|
+
#include "random/secure_random_engine.h"
|
|
27
|
+
#include "random/transcript.h"
|
|
28
|
+
#include "sumcheck/circuit.h"
|
|
29
|
+
#include "util/log.h"
|
|
30
|
+
#include "util/readbuffer.h"
|
|
31
|
+
#include "zk/zk_proof.h"
|
|
32
|
+
#include "zk/zk_prover.h"
|
|
33
|
+
#include "zk/zk_verifier.h"
|
|
34
|
+
#include "gtest/gtest.h"
|
|
35
|
+
|
|
36
|
+
namespace proofs {
|
|
37
|
+
|
|
38
|
+
constexpr size_t kLigeroRate = 4;
|
|
39
|
+
constexpr size_t kLigeroNreq = 189;
|
|
40
|
+
constexpr size_t kVersion = 4;
|
|
41
|
+
|
|
42
|
+
// Runs a zk prover and verifier for a field that requires a field extension
|
|
43
|
+
// to perform the commitment.
|
|
44
|
+
template <class Field>
|
|
45
|
+
void run2_test_zk(const Circuit<Field>& circuit, Dense<Field>& W,
|
|
46
|
+
const Dense<Field>& pub, const Field& base,
|
|
47
|
+
const typename Field::Elt& root_x,
|
|
48
|
+
const typename Field::Elt& root_y, size_t root_order) {
|
|
49
|
+
// Build the relevant algebra objects.
|
|
50
|
+
using Field2 = Fp2<Field>;
|
|
51
|
+
using Elt2 = typename Field2::Elt;
|
|
52
|
+
using FftExtConvolutionFactory = FFTExtConvolutionFactory<Field, Field2>;
|
|
53
|
+
using RSFactory = ReedSolomonFactory<Field, FftExtConvolutionFactory>;
|
|
54
|
+
|
|
55
|
+
const Field2 base_2(base);
|
|
56
|
+
const Elt2 omega{root_x, root_y};
|
|
57
|
+
const FftExtConvolutionFactory fft(base, base_2, omega, root_order);
|
|
58
|
+
const RSFactory rsf(fft, base);
|
|
59
|
+
|
|
60
|
+
ZkProof<Field> zkpr(circuit, kLigeroRate, kLigeroNreq);
|
|
61
|
+
|
|
62
|
+
Transcript tp((uint8_t*)"zk_test", 7, kVersion);
|
|
63
|
+
SecureRandomEngine rng;
|
|
64
|
+
ZkProver<Field, RSFactory> prover(circuit, base, rsf);
|
|
65
|
+
prover.commit(zkpr, W, tp, rng);
|
|
66
|
+
EXPECT_TRUE(prover.prove(zkpr, W, tp));
|
|
67
|
+
log(INFO, "ZK Prover done");
|
|
68
|
+
|
|
69
|
+
std::vector<uint8_t> zbuf;
|
|
70
|
+
zkpr.write(zbuf, base);
|
|
71
|
+
log(INFO, "zkp len: %zu bytes", zbuf.size());
|
|
72
|
+
|
|
73
|
+
// ======= run verifier =============
|
|
74
|
+
// Re-parse the proof to simulate a different client.
|
|
75
|
+
ZkProof<Field> zkpv(circuit, kLigeroRate, kLigeroNreq);
|
|
76
|
+
ReadBuffer rb(zbuf);
|
|
77
|
+
EXPECT_TRUE(zkpv.read(rb, base));
|
|
78
|
+
|
|
79
|
+
ZkVerifier<Field, RSFactory> verifier(circuit, rsf, kLigeroRate, kLigeroNreq,
|
|
80
|
+
base);
|
|
81
|
+
Transcript tv((uint8_t*)"zk_test", 7, kVersion);
|
|
82
|
+
verifier.recv_commitment(zkpv, tv);
|
|
83
|
+
EXPECT_TRUE(verifier.verify(zkpv, pub, tv));
|
|
84
|
+
log(INFO, "ZK Verify done");
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
template <class Field>
|
|
88
|
+
void run_failing_test_zk2(const Circuit<Field>& circuit, Dense<Field>& W,
|
|
89
|
+
const Dense<Field>& pub, const Field& base,
|
|
90
|
+
const typename Field::Elt& root_x,
|
|
91
|
+
const typename Field::Elt& root_y,
|
|
92
|
+
size_t root_order) {
|
|
93
|
+
// Build the relevant algebra objects.
|
|
94
|
+
using Field2 = Fp2<Field>;
|
|
95
|
+
using Elt2 = typename Field2::Elt;
|
|
96
|
+
using FftExtConvolutionFactory = FFTExtConvolutionFactory<Field, Field2>;
|
|
97
|
+
using RSFactory = ReedSolomonFactory<Field, FftExtConvolutionFactory>;
|
|
98
|
+
|
|
99
|
+
const Field2 base_2(base);
|
|
100
|
+
const Elt2 omega{root_x, root_y};
|
|
101
|
+
const FftExtConvolutionFactory fft(base, base_2, omega, root_order);
|
|
102
|
+
const RSFactory rsf(fft, base);
|
|
103
|
+
|
|
104
|
+
ZkProof<Field> zkpr(circuit, kLigeroRate, kLigeroNreq);
|
|
105
|
+
|
|
106
|
+
Transcript tp((uint8_t*)"zk_test", 7, kVersion);
|
|
107
|
+
SecureRandomEngine rng;
|
|
108
|
+
ZkProver<Field, RSFactory> prover(circuit, base, rsf);
|
|
109
|
+
prover.commit(zkpr, W, tp, rng);
|
|
110
|
+
bool p_ok = prover.prove(zkpr, W, tp);
|
|
111
|
+
EXPECT_FALSE(p_ok);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Runs a zk prover and verifier for a field that has a suitable root of unity.
|
|
115
|
+
template <class Field>
|
|
116
|
+
void run_test_zk(const Circuit<Field>& circuit, Dense<Field>& W,
|
|
117
|
+
const Dense<Field>& pub, const typename Field::Elt& omega,
|
|
118
|
+
uint64_t omega_order, const Field& F) {
|
|
119
|
+
using FftConvolutionFactory = FFTConvolutionFactory<Field>;
|
|
120
|
+
|
|
121
|
+
FftConvolutionFactory fft(F, omega, omega_order);
|
|
122
|
+
using RSFactory = ReedSolomonFactory<Field, FftConvolutionFactory>;
|
|
123
|
+
const RSFactory rsf(fft, F);
|
|
124
|
+
|
|
125
|
+
ZkProof<Field> zkpr(circuit, kLigeroRate, kLigeroNreq);
|
|
126
|
+
|
|
127
|
+
Transcript tp((uint8_t*)"zk_test", 7, kVersion);
|
|
128
|
+
SecureRandomEngine rng;
|
|
129
|
+
ZkProver<Field, RSFactory> prover(circuit, F, rsf);
|
|
130
|
+
prover.commit(zkpr, W, tp, rng);
|
|
131
|
+
EXPECT_TRUE(prover.prove(zkpr, W, tp));
|
|
132
|
+
|
|
133
|
+
log(INFO, "ZK Prover done");
|
|
134
|
+
|
|
135
|
+
std::vector<uint8_t> zbuf;
|
|
136
|
+
zkpr.write(zbuf, F);
|
|
137
|
+
log(INFO, "zkp len: %zu bytes", zbuf.size());
|
|
138
|
+
|
|
139
|
+
// ======= zk verifier =============
|
|
140
|
+
// Re-parse the proof to simulate a different client.
|
|
141
|
+
ZkProof<Field> zkpv(circuit, kLigeroRate, kLigeroNreq);
|
|
142
|
+
ReadBuffer rb(zbuf);
|
|
143
|
+
EXPECT_TRUE(zkpv.read(rb, F));
|
|
144
|
+
|
|
145
|
+
ZkVerifier<Field, RSFactory> verifier(circuit, rsf, kLigeroRate, kLigeroNreq,
|
|
146
|
+
F);
|
|
147
|
+
Transcript tv((uint8_t*)"zk_test", 7, kVersion);
|
|
148
|
+
verifier.recv_commitment(zkpv, tv);
|
|
149
|
+
EXPECT_TRUE(verifier.verify(zkpv, pub, tv));
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
} // namespace proofs
|
|
153
|
+
|
|
154
|
+
#endif // PRIVACY_PROOFS_ZK_LIB_ZK_ZK_TESTING_H_
|
|
@@ -0,0 +1,109 @@
|
|
|
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_ZK_ZK_VERIFIER_H_
|
|
16
|
+
#define PRIVACY_PROOFS_ZK_LIB_ZK_ZK_VERIFIER_H_
|
|
17
|
+
|
|
18
|
+
#include <stddef.h>
|
|
19
|
+
|
|
20
|
+
#include <vector>
|
|
21
|
+
|
|
22
|
+
#include "arrays/dense.h"
|
|
23
|
+
#include "ligero/ligero_param.h"
|
|
24
|
+
#include "ligero/ligero_verifier.h"
|
|
25
|
+
#include "random/transcript.h"
|
|
26
|
+
#include "sumcheck/circuit.h"
|
|
27
|
+
#include "util/log.h"
|
|
28
|
+
#include "zk/zk_common.h"
|
|
29
|
+
#include "zk/zk_proof.h"
|
|
30
|
+
|
|
31
|
+
namespace proofs {
|
|
32
|
+
// ZK Verifier
|
|
33
|
+
//
|
|
34
|
+
// Verifies a zk proof. See note in the prover for the design.
|
|
35
|
+
// To verify a proof, instantiate the class, then call recv_commitment with
|
|
36
|
+
// the commitment, and finally call verify. It is possible to receive several
|
|
37
|
+
// commitments, or run other protocols between the recv_commitment and verify
|
|
38
|
+
// calls. This allows composing two proofs in parallel.
|
|
39
|
+
// To support this, the interface to both accepts a raw Transcript.
|
|
40
|
+
template <class Field, class RSFactory>
|
|
41
|
+
class ZkVerifier {
|
|
42
|
+
using Elt = typename Field::Elt;
|
|
43
|
+
|
|
44
|
+
public:
|
|
45
|
+
explicit ZkVerifier(const Circuit<Field>& c, const RSFactory& rsf,
|
|
46
|
+
size_t rate, size_t nreq, const Field& F)
|
|
47
|
+
: circ_(c),
|
|
48
|
+
n_witness_(c.ninputs - c.npub_in),
|
|
49
|
+
param_(n_witness_ + ZkCommon<Field>::pad_size(c), c.nl, rate, nreq),
|
|
50
|
+
lqc_(c.nl),
|
|
51
|
+
rsf_(rsf),
|
|
52
|
+
f_(F) {
|
|
53
|
+
ZkCommon<Field>::setup_lqc(c, lqc_, n_witness_);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
explicit ZkVerifier(const Circuit<Field>& c, const RSFactory& rsf,
|
|
57
|
+
size_t rate, size_t nreq, size_t block_enc,
|
|
58
|
+
const Field& F)
|
|
59
|
+
: circ_(c),
|
|
60
|
+
n_witness_(c.ninputs - c.npub_in),
|
|
61
|
+
param_(n_witness_ + ZkCommon<Field>::pad_size(c), c.nl, rate, nreq,
|
|
62
|
+
block_enc),
|
|
63
|
+
lqc_(c.nl),
|
|
64
|
+
rsf_(rsf),
|
|
65
|
+
f_(F) {
|
|
66
|
+
ZkCommon<Field>::setup_lqc(c, lqc_, n_witness_);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
void recv_commitment(const ZkProof<Field>& zk, Transcript& t) const {
|
|
70
|
+
log(INFO, "verifier: recv commit");
|
|
71
|
+
LigeroVerifier<Field, RSFactory>::receive_commitment(zk.com, t);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Verifies the proof.
|
|
75
|
+
bool verify(const ZkProof<Field>& zk, const Dense<Field>& pub,
|
|
76
|
+
Transcript& tv) const {
|
|
77
|
+
log(INFO, "verifier: verify");
|
|
78
|
+
|
|
79
|
+
ZkCommon<Field>::initialize_sumcheck_fiat_shamir(tv, circ_, pub, f_);
|
|
80
|
+
|
|
81
|
+
// Derive constraints on the witness.
|
|
82
|
+
using Llc = LigeroLinearConstraint<Field>;
|
|
83
|
+
std::vector<Llc> A;
|
|
84
|
+
std::vector<Elt> b;
|
|
85
|
+
const LigeroHash hash_of_A{0xde, 0xad, 0xbe, 0xef};
|
|
86
|
+
size_t cn = ZkCommon<Field>::verifier_constraints(circ_, pub, zk.proof,
|
|
87
|
+
/*aux=*/nullptr, A, b, tv,
|
|
88
|
+
n_witness_, f_);
|
|
89
|
+
|
|
90
|
+
const char* why = "";
|
|
91
|
+
bool ok = LigeroVerifier<Field, RSFactory>::verify(
|
|
92
|
+
&why, param_, zk.com, zk.com_proof, tv, cn, A.size(), &A[0], hash_of_A,
|
|
93
|
+
&b[0], &lqc_[0], rsf_, f_);
|
|
94
|
+
|
|
95
|
+
log(INFO, "verify done: %s", why);
|
|
96
|
+
return ok;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
private:
|
|
100
|
+
const Circuit<Field>& circ_;
|
|
101
|
+
const size_t n_witness_;
|
|
102
|
+
const LigeroParam<Field> param_;
|
|
103
|
+
std::vector<LigeroQuadraticConstraint> lqc_;
|
|
104
|
+
const RSFactory& rsf_;
|
|
105
|
+
const Field& f_;
|
|
106
|
+
};
|
|
107
|
+
} // namespace proofs
|
|
108
|
+
|
|
109
|
+
#endif // PRIVACY_PROOFS_ZK_LIB_ZK_ZK_VERIFIER_H_
|