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,242 @@
|
|
|
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_GF2K_LCH14_H_
|
|
16
|
+
#define PRIVACY_PROOFS_ZK_LIB_GF2K_LCH14_H_
|
|
17
|
+
|
|
18
|
+
#include <stdio.h>
|
|
19
|
+
|
|
20
|
+
#include <vector>
|
|
21
|
+
|
|
22
|
+
#include "util/panic.h"
|
|
23
|
+
|
|
24
|
+
// The algorithm from [LCH14] following [DP24, Algorithm 2]
|
|
25
|
+
//
|
|
26
|
+
// [LCH14] Sian-Jheng Lin, Wei-Ho Chung, and Yunghsiang S. Han: Novel
|
|
27
|
+
// Polynomial Basis and Its Application to Reed-Solomon Erasure Codes,
|
|
28
|
+
// https://arxiv.org/pdf/1404.3458
|
|
29
|
+
|
|
30
|
+
// [DP24] Benjamin E. Diamond and Jim Posen, Polylogarithmic Proofs
|
|
31
|
+
// for Multilinears over Binary Towers, https://eprint.iacr.org/2024/504
|
|
32
|
+
|
|
33
|
+
namespace proofs {
|
|
34
|
+
|
|
35
|
+
template <class Field>
|
|
36
|
+
class LCH14 {
|
|
37
|
+
using Elt = typename Field::Elt;
|
|
38
|
+
|
|
39
|
+
// only works in binary fields
|
|
40
|
+
static_assert(Field::kCharacteristicTwo);
|
|
41
|
+
|
|
42
|
+
public:
|
|
43
|
+
static constexpr size_t kSubFieldBits = Field::kSubFieldBits;
|
|
44
|
+
|
|
45
|
+
explicit LCH14(const Field &F) : f_(F) {
|
|
46
|
+
// Compute W_i(\beta_j) for all i, j.
|
|
47
|
+
|
|
48
|
+
// We store the unnormalized W_[i][j] = W_i(\beta_j)
|
|
49
|
+
// in the same memory as the normalized \hat{W}_i(\beta_j), since
|
|
50
|
+
// the unnormalized values are not needed after normalization.
|
|
51
|
+
|
|
52
|
+
// In an attempt to improve clarity, we syntactically distinguish
|
|
53
|
+
// the unnormalized array W from the normalized array w_hat_,
|
|
54
|
+
// but one must be mindful that the two names alias to the
|
|
55
|
+
// same memory locations.
|
|
56
|
+
auto W = w_hat_;
|
|
57
|
+
|
|
58
|
+
// Base case: W_0(X) = X
|
|
59
|
+
for (size_t j = 0; j < kSubFieldBits; ++j) {
|
|
60
|
+
W[0][j] = f_.beta(j);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Inductive case: W_{i+1}(X) = W_i(X)(W_i(X)+W_i(\beta_i))
|
|
64
|
+
for (size_t i = 0; i + 1 < kSubFieldBits; ++i) {
|
|
65
|
+
for (size_t j = 0; j < kSubFieldBits; ++j) {
|
|
66
|
+
W[i + 1][j] = f_.mulf(W[i][j], f_.addf(W[i][j], W[i][i]));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// normalized \hat{W}_i(\beta j)
|
|
71
|
+
for (size_t i = 0; i < kSubFieldBits; ++i) {
|
|
72
|
+
Elt scale = f_.invertf(W[i][i]);
|
|
73
|
+
for (size_t j = 0; j < kSubFieldBits; ++j) {
|
|
74
|
+
w_hat_[i][j] = f_.mulf(scale, W[i][j]);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Computation of a single twiddle factor.
|
|
80
|
+
// Implicit in [LCH14, III.E], explicit in [DP24, Algorithm 2].
|
|
81
|
+
Elt twiddle(size_t i, size_t u) const {
|
|
82
|
+
Elt t = f_.zero();
|
|
83
|
+
for (size_t k = 0; u != 0; ++k, u >>= 1) {
|
|
84
|
+
if (u & 1) {
|
|
85
|
+
f_.add(t, w_hat_[i][k]);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return t;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// linear-time computation of all twiddles at the same time
|
|
92
|
+
void twiddles(size_t i, size_t l, size_t coset, Elt tw[]) const {
|
|
93
|
+
tw[0] = twiddle(i, coset);
|
|
94
|
+
for (size_t k = 0; (i + 1) + k < l; ++k) {
|
|
95
|
+
Elt shift = w_hat_[i][(i + 1) + k];
|
|
96
|
+
for (size_t u = 0; u < (k1 << k); ++u) {
|
|
97
|
+
tw[u + (k1 << k)] = f_.addf(tw[u], shift);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
size_t ntwiddles(size_t l) const { return k1 << (l - 1); }
|
|
103
|
+
|
|
104
|
+
// Notation from [DP24, Algorithm 2], except that we hardcode R=0
|
|
105
|
+
// and add the coset parameter.
|
|
106
|
+
void FFT(size_t l, size_t coset, Elt B[/* n = (1 << l) */]) const {
|
|
107
|
+
check(l <= kSubFieldBits, "l <= kSubFieldBits");
|
|
108
|
+
|
|
109
|
+
if (l > 0) {
|
|
110
|
+
// space for twiddle factors
|
|
111
|
+
std::vector<Elt> tw(ntwiddles(l));
|
|
112
|
+
|
|
113
|
+
for (size_t i = l; i-- > 0;) {
|
|
114
|
+
size_t s = k1 << i;
|
|
115
|
+
twiddles(i, l, coset, &tw[0]);
|
|
116
|
+
for (size_t u = 0; (u << (i + 1)) < (k1 << l); ++u) {
|
|
117
|
+
Elt twu = tw[u];
|
|
118
|
+
for (size_t v = 0; v < s; ++v) {
|
|
119
|
+
butterfly_fwd(B, (u << (i + 1)) + v, s, twu);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
void IFFT(size_t l, size_t coset, Elt B[/* n = (1 << l) */]) const {
|
|
127
|
+
check(l <= kSubFieldBits, "l <= kSubFieldBits");
|
|
128
|
+
|
|
129
|
+
if (l > 0) {
|
|
130
|
+
// space for twiddle factors
|
|
131
|
+
std::vector<Elt> tw(ntwiddles(l));
|
|
132
|
+
|
|
133
|
+
for (size_t i = 0; i < l; ++i) {
|
|
134
|
+
size_t s = k1 << i;
|
|
135
|
+
twiddles(i, l, coset, &tw[0]);
|
|
136
|
+
for (size_t u = 0; (u << (i + 1)) < (k1 << l); ++u) {
|
|
137
|
+
Elt twu = tw[u];
|
|
138
|
+
for (size_t v = 0; v < s; ++v) {
|
|
139
|
+
butterfly_bwd(B, (u << (i + 1)) + v, s, twu);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
void BidirectionalFFT(size_t l, size_t k, Elt B[/* n = (1 << l) */]) const {
|
|
147
|
+
check(l <= kSubFieldBits, "l <= kSubFieldBits");
|
|
148
|
+
bidir_recur(/*i=*/l, /*coset=*/0, k, B);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// debug access to w_hat_
|
|
152
|
+
Elt WHat_DEBUG(size_t i, size_t j) const { return w_hat_[i][j]; }
|
|
153
|
+
|
|
154
|
+
private:
|
|
155
|
+
// avoid writing static_cast<size_t>(1) all the time.
|
|
156
|
+
static constexpr size_t k1 = 1;
|
|
157
|
+
|
|
158
|
+
const Field &f_;
|
|
159
|
+
|
|
160
|
+
// precomputed [i][j] -> \hat{W}(\beta_j)
|
|
161
|
+
Elt w_hat_[kSubFieldBits][kSubFieldBits];
|
|
162
|
+
|
|
163
|
+
// The algorithm described in Joris van der Hoeven, "The Truncated
|
|
164
|
+
// Fourier Transform and Applications". This implementation is
|
|
165
|
+
// based on the pseudo-code from the followup paper "Notes on the
|
|
166
|
+
// Truncated Fourier Transform", also by Joris van der Hoeven.
|
|
167
|
+
//
|
|
168
|
+
// Van der Hoeven considers the classic multiplicative FFT;
|
|
169
|
+
// here we port the algorithm to the [LCH14] adaptive FFT.
|
|
170
|
+
|
|
171
|
+
// Here we call the algorithm the "Bidirectional FFT", because
|
|
172
|
+
// the algorithm takes a set of points in the "time" domain
|
|
173
|
+
// and the complementary set of points in the "frequency" domain,
|
|
174
|
+
// and it flips time and frequency, so the algorithm can be
|
|
175
|
+
// used to compute the forward and backward transforms, as well
|
|
176
|
+
// as combinations of the two.
|
|
177
|
+
//
|
|
178
|
+
// The literature on the truncated Fourier transforms assumes that
|
|
179
|
+
// the complementary set of points are implicitly set to zero, and
|
|
180
|
+
// the main problem is how to avoid storing the zeroes. Our main
|
|
181
|
+
// problem is not time or space efficiency, but polynomial
|
|
182
|
+
// interpolation. Given k evaluations of a polynomial of degree <k,
|
|
183
|
+
// compute the other evaluations up to n=2^l. So we care about both
|
|
184
|
+
// the unknown nonzero coefficients and the unknown n-k evaluations.
|
|
185
|
+
void bidir_recur(size_t i, size_t coset, size_t k,
|
|
186
|
+
Elt B[/* n = (1 << i) */]) const {
|
|
187
|
+
if (i-- > 0) {
|
|
188
|
+
size_t s = k1 << i;
|
|
189
|
+
Elt twu = twiddle(i, coset);
|
|
190
|
+
|
|
191
|
+
if (k < s) {
|
|
192
|
+
for (size_t uv = k; uv < s; ++uv) {
|
|
193
|
+
butterfly_fwd(B, uv, s, twu);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
bidir_recur(i, coset, k, B);
|
|
197
|
+
|
|
198
|
+
for (size_t uv = 0; uv < k; ++uv) {
|
|
199
|
+
butterfly_diag(B, uv, s, twu);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
FFT(i, coset + s, B + s);
|
|
203
|
+
} else /* k >= s */ {
|
|
204
|
+
IFFT(i, coset, B);
|
|
205
|
+
|
|
206
|
+
for (size_t uv = k - s; uv < s; ++uv) {
|
|
207
|
+
butterfly_diag(B, uv, s, twu);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
bidir_recur(i, coset + s, k - s, B + s);
|
|
211
|
+
|
|
212
|
+
for (size_t uv = 0; uv < k - s; ++uv) {
|
|
213
|
+
butterfly_bwd(B, uv, s, twu);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
inline void butterfly_fwd(Elt B[], size_t uv, size_t s,
|
|
220
|
+
const Elt &twu) const {
|
|
221
|
+
f_.add(B[uv], f_.mulf(twu, B[uv + s]));
|
|
222
|
+
f_.add(B[uv + s], B[uv]);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
inline void butterfly_bwd(Elt B[], size_t uv, size_t s,
|
|
226
|
+
const Elt &twu) const {
|
|
227
|
+
f_.sub(B[uv + s], B[uv]);
|
|
228
|
+
f_.sub(B[uv], f_.mulf(twu, B[uv + s]));
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// forward at [uv + s], backward at [uv]
|
|
232
|
+
inline void butterfly_diag(Elt B[], size_t uv, size_t s,
|
|
233
|
+
const Elt &twu) const {
|
|
234
|
+
Elt b1 = B[uv + s];
|
|
235
|
+
f_.add(B[uv + s], B[uv]);
|
|
236
|
+
f_.sub(B[uv], f_.mulf(twu, b1));
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
} // namespace proofs
|
|
241
|
+
|
|
242
|
+
#endif // PRIVACY_PROOFS_ZK_LIB_GF2K_LCH14_H_
|
|
@@ -0,0 +1,75 @@
|
|
|
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 <vector>
|
|
17
|
+
|
|
18
|
+
#include "gf2k/gf2_128.h"
|
|
19
|
+
#include "gf2k/lch14.h"
|
|
20
|
+
#include "third_party/benchmark/include/benchmark/benchmark.h"
|
|
21
|
+
|
|
22
|
+
namespace proofs {
|
|
23
|
+
using Field = GF2_128<5>; // use 32-bit subfield for large FFTs
|
|
24
|
+
using Elt = Field::Elt;
|
|
25
|
+
static const Field F;
|
|
26
|
+
static const LCH14<Field> FFT(F);
|
|
27
|
+
|
|
28
|
+
void BM_LCH14_FFT(benchmark::State& state) {
|
|
29
|
+
size_t l = state.range(0);
|
|
30
|
+
size_t N = 1 << l;
|
|
31
|
+
std::vector<Elt> A(N);
|
|
32
|
+
for (size_t i = 0; i < N; ++i) {
|
|
33
|
+
A[i] = F.x();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
for (auto _ : state) {
|
|
37
|
+
FFT.FFT(l, /*coset=*/0, A.data());
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
BENCHMARK(BM_LCH14_FFT)->DenseRange(2, 20);
|
|
42
|
+
|
|
43
|
+
void BM_LCH14_IFFT(benchmark::State& state) {
|
|
44
|
+
size_t l = state.range(0);
|
|
45
|
+
size_t N = 1 << l;
|
|
46
|
+
std::vector<Elt> A(N);
|
|
47
|
+
for (size_t i = 0; i < N; ++i) {
|
|
48
|
+
A[i] = F.x();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
for (auto _ : state) {
|
|
52
|
+
FFT.IFFT(l, /*coset=*/0, A.data());
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
BENCHMARK(BM_LCH14_IFFT)->DenseRange(2, 20);
|
|
57
|
+
|
|
58
|
+
void BM_LCH14_BidirectionalFFT(benchmark::State& state) {
|
|
59
|
+
size_t l = state.range(0);
|
|
60
|
+
size_t N = 1 << l;
|
|
61
|
+
std::vector<Elt> A(N);
|
|
62
|
+
for (size_t i = 0; i < N; ++i) {
|
|
63
|
+
A[i] = F.x();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
for (auto _ : state) {
|
|
67
|
+
FFT.BidirectionalFFT(l, /*k=*/N - 1, A.data());
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
BENCHMARK(BM_LCH14_BidirectionalFFT)->DenseRange(2, 20);
|
|
72
|
+
|
|
73
|
+
} // namespace proofs
|
|
74
|
+
|
|
75
|
+
BENCHMARK_MAIN();
|
|
@@ -0,0 +1,127 @@
|
|
|
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_GF2K_LCH14_REED_SOLOMON_H_
|
|
16
|
+
#define PRIVACY_PROOFS_ZK_LIB_GF2K_LCH14_REED_SOLOMON_H_
|
|
17
|
+
|
|
18
|
+
#include <stdio.h>
|
|
19
|
+
|
|
20
|
+
#include <algorithm>
|
|
21
|
+
#include <memory>
|
|
22
|
+
#include <vector>
|
|
23
|
+
|
|
24
|
+
#include "gf2k/lch14.h"
|
|
25
|
+
|
|
26
|
+
namespace proofs {
|
|
27
|
+
|
|
28
|
+
template <class Field>
|
|
29
|
+
class LCH14ReedSolomon {
|
|
30
|
+
using Elt = typename Field::Elt;
|
|
31
|
+
|
|
32
|
+
// only works in binary fields
|
|
33
|
+
static_assert(Field::kCharacteristicTwo);
|
|
34
|
+
|
|
35
|
+
public:
|
|
36
|
+
// We interpolate N points, assumed to be the evaluations at
|
|
37
|
+
// F.of_scalar(i), 0 <= i < N, of a polynomial of degree <N, to M
|
|
38
|
+
// points 0 <= i < M. (Thus, the M points include the N points
|
|
39
|
+
// we started with.)
|
|
40
|
+
//
|
|
41
|
+
// In principle we don't need to know N and M at construction time,
|
|
42
|
+
// but we require N and M for compatibility of the interface with
|
|
43
|
+
// the ReedSolomon class over prime fields.
|
|
44
|
+
LCH14ReedSolomon(size_t n, size_t m, const Field& F)
|
|
45
|
+
: f_(F), n_(n), m_(m), fft_(F) {}
|
|
46
|
+
|
|
47
|
+
// Y[i] is expected to be defined for 0 <= i < N, and this
|
|
48
|
+
// routine fills it for 0 <= i < M
|
|
49
|
+
void interpolate(Elt y[/*m*/]) const {
|
|
50
|
+
// determine the FFT size
|
|
51
|
+
size_t l = 0;
|
|
52
|
+
size_t fftn = 1;
|
|
53
|
+
while (fftn < n_) {
|
|
54
|
+
fftn <<= 1;
|
|
55
|
+
++l;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// "coefficients" in the LCH14 novel polynomial basis
|
|
59
|
+
std::vector<Elt> C(fftn);
|
|
60
|
+
|
|
61
|
+
// compute the "coefficients" under the assumption
|
|
62
|
+
// that we know n_ evaluations and that the higher-order
|
|
63
|
+
// (fftn - n_) "coefficients" are zero.
|
|
64
|
+
for (size_t i = 0; i < n_; ++i) {
|
|
65
|
+
C[i] = y[i];
|
|
66
|
+
}
|
|
67
|
+
for (size_t i = n_; i < fftn; ++i) {
|
|
68
|
+
C[i] = f_.zero();
|
|
69
|
+
}
|
|
70
|
+
fft_.BidirectionalFFT(l, /*k=*/n_, &C[0]);
|
|
71
|
+
|
|
72
|
+
// fill in the missing evaluations in the first coset, since we
|
|
73
|
+
// already have the missing evaluations in C[[n_, (1<<l))]
|
|
74
|
+
for (size_t i = n_; i < std::min(m_, fftn); ++i) {
|
|
75
|
+
y[i] = C[i];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// revert C to pure coefficients for later use
|
|
79
|
+
for (size_t i = n_; i < fftn; ++i) {
|
|
80
|
+
C[i] = f_.zero();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// all remaining cosets:
|
|
84
|
+
for (size_t coset = 1; (coset << l) < m_; ++coset) {
|
|
85
|
+
size_t b = (coset << l);
|
|
86
|
+
if (b + fftn <= m_) {
|
|
87
|
+
// if the coset fits completely within Y[],
|
|
88
|
+
// copy the coefficients into Y and transform in place
|
|
89
|
+
for (size_t i = 0; i < fftn; ++i) {
|
|
90
|
+
y[i + b] = C[i];
|
|
91
|
+
}
|
|
92
|
+
fft_.FFT(l, b, &y[b]);
|
|
93
|
+
} else {
|
|
94
|
+
// Partial fit. Transform C and copy the output.
|
|
95
|
+
fft_.FFT(l, b, &C[0]);
|
|
96
|
+
for (size_t i = 0; i + b < m_; ++i) {
|
|
97
|
+
y[i + b] = C[i];
|
|
98
|
+
}
|
|
99
|
+
// Now we have destroyed C, but this is ok because
|
|
100
|
+
// this is the last iteration
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
private:
|
|
106
|
+
const Field& f_;
|
|
107
|
+
size_t n_;
|
|
108
|
+
size_t m_;
|
|
109
|
+
LCH14<Field> fft_;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
template <class Field>
|
|
113
|
+
class LCH14ReedSolomonFactory {
|
|
114
|
+
public:
|
|
115
|
+
explicit LCH14ReedSolomonFactory(const Field& f) : f_(f) {}
|
|
116
|
+
|
|
117
|
+
std::unique_ptr<LCH14ReedSolomon<Field>> make(size_t n, size_t m) const {
|
|
118
|
+
return std::make_unique<LCH14ReedSolomon<Field>>(n, m, f_);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
private:
|
|
122
|
+
const Field& f_;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
} // namespace proofs
|
|
126
|
+
|
|
127
|
+
#endif // PRIVACY_PROOFS_ZK_LIB_GF2K_LCH14_REED_SOLOMON_H_
|
|
@@ -0,0 +1,110 @@
|
|
|
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 "gf2k/lch14_reed_solomon.h"
|
|
16
|
+
|
|
17
|
+
#include <cstddef>
|
|
18
|
+
#include <vector>
|
|
19
|
+
|
|
20
|
+
#include "algebra/bogorng.h"
|
|
21
|
+
#include "gf2k/gf2_128.h"
|
|
22
|
+
#include "benchmark/benchmark.h"
|
|
23
|
+
#include "gtest/gtest.h"
|
|
24
|
+
|
|
25
|
+
namespace proofs {
|
|
26
|
+
namespace {
|
|
27
|
+
|
|
28
|
+
using Field = GF2_128<5>;
|
|
29
|
+
using Elt = Field::Elt;
|
|
30
|
+
static const Field F;
|
|
31
|
+
|
|
32
|
+
// slow evaluation in the monomial basis
|
|
33
|
+
static Elt eval_monomial(size_t n, const Elt M[/*n*/], const Elt& x) {
|
|
34
|
+
Elt e{};
|
|
35
|
+
|
|
36
|
+
for (size_t i = n; i-- > 0;) {
|
|
37
|
+
e = F.addf(M[i], F.mulf(e, x));
|
|
38
|
+
}
|
|
39
|
+
return e;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
TEST(LCH14, ReedSolomon) {
|
|
43
|
+
std::vector<size_t> test_m = {1, 7, 8, 9, 63, 64, 65, 99, 128};
|
|
44
|
+
LCH14ReedSolomonFactory<Field> rs_factory(F);
|
|
45
|
+
|
|
46
|
+
for (size_t m : test_m) {
|
|
47
|
+
for (size_t n = 1; n < m; ++n) {
|
|
48
|
+
auto rs = rs_factory.make(n, m);
|
|
49
|
+
std::vector<Elt> M(n); // monomial basis
|
|
50
|
+
std::vector<Elt> Y(m);
|
|
51
|
+
|
|
52
|
+
for (size_t i = 0; i < n; ++i) {
|
|
53
|
+
M[i] = F.of_scalar(i * i + 42 + (m + 11) * (n + 22));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// produce N points
|
|
57
|
+
for (size_t i = 0; i < n; ++i) {
|
|
58
|
+
Y[i] = eval_monomial(n, &M[0], F.of_scalar(i));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
rs->interpolate(&Y[0]);
|
|
62
|
+
|
|
63
|
+
for (size_t i = 0; i < m; ++i) {
|
|
64
|
+
EXPECT_EQ(Y[i], eval_monomial(n, &M[0], F.of_scalar(i)));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
} // namespace
|
|
70
|
+
|
|
71
|
+
namespace bench {
|
|
72
|
+
void BM_ReedSolomon_gf128(benchmark::State& state) {
|
|
73
|
+
size_t n = state.range(0);
|
|
74
|
+
if (4 * n < 1 << 16) {
|
|
75
|
+
using Field = GF2_128<4>;
|
|
76
|
+
using Elt = Field::Elt;
|
|
77
|
+
static const Field F;
|
|
78
|
+
LCH14ReedSolomonFactory<Field> rs_factory(F);
|
|
79
|
+
Bogorng<Field> rng(&F);
|
|
80
|
+
auto rs = rs_factory.make(n, n * 4);
|
|
81
|
+
|
|
82
|
+
std::vector<Elt> L2(n + n * 4);
|
|
83
|
+
for (size_t i = 0; i < n; ++i) {
|
|
84
|
+
L2[i] = rng.next();
|
|
85
|
+
}
|
|
86
|
+
for (auto _ : state) {
|
|
87
|
+
rs->interpolate(&L2[0]);
|
|
88
|
+
}
|
|
89
|
+
} else {
|
|
90
|
+
using Field = GF2_128<5>;
|
|
91
|
+
using Elt = Field::Elt;
|
|
92
|
+
static const Field F;
|
|
93
|
+
LCH14ReedSolomonFactory<Field> rs_factory(F);
|
|
94
|
+
Bogorng<Field> rng(&F);
|
|
95
|
+
auto rs = rs_factory.make(n, n * 4);
|
|
96
|
+
|
|
97
|
+
std::vector<Elt> L2(n + n * 4);
|
|
98
|
+
for (size_t i = 0; i < n; ++i) {
|
|
99
|
+
L2[i] = rng.next();
|
|
100
|
+
}
|
|
101
|
+
for (auto _ : state) {
|
|
102
|
+
rs->interpolate(&L2[0]);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
BENCHMARK(BM_ReedSolomon_gf128)->RangeMultiplier(4)->Range(1 << 10, 1 << 20);
|
|
108
|
+
|
|
109
|
+
} // namespace bench
|
|
110
|
+
} // namespace proofs
|