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,311 @@
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_MDOC_MDOC_ATTRIBUTE_IDS_H_
16
+ #define PRIVACY_PROOFS_ZK_LIB_CIRCUITS_MDOC_MDOC_ATTRIBUTE_IDS_H_
17
+
18
+ #include <string_view>
19
+
20
+ namespace proofs {
21
+
22
+ struct MdocAttribute {
23
+ std::string_view identifier;
24
+ std::string_view documentspec;
25
+ };
26
+
27
+ constexpr const char* kMDLNamespace = "org.iso.18013.5.1";
28
+ constexpr const char* kAAMVANamespace = "org.iso.18013.5.1.aamva";
29
+ constexpr const char* kEUAVNamespace = "eu.europa.ec.av.1";
30
+ constexpr const char* kEUDIPIDNamespace = "eu.europa.ec.eudi.pid.1";
31
+ constexpr const char* kISO23220Namespace = "org.iso.23220.1";
32
+ constexpr const char* kISO23220PhotoIDNamespace = "org.iso.23220.photoID.1";
33
+ constexpr const char* kISO23220DTCNamespace = "org.iso.23220.dtc.1";
34
+ constexpr const char* kAadhaarNamespace = "in.gov.uidai.aadhaar.1";
35
+
36
+ constexpr const char* kSupportedNamespaces[] = {
37
+ kMDLNamespace, kAAMVANamespace, kEUAVNamespace,
38
+ kEUDIPIDNamespace, kISO23220Namespace, kISO23220PhotoIDNamespace,
39
+ kISO23220DTCNamespace, kAadhaarNamespace};
40
+
41
+ constexpr const char* kIDPassDocType = "com.google.wallet.idcard.1";
42
+ constexpr const char* kMDLDocType = "org.iso.18013.5.1.mDL";
43
+ constexpr const char* kEUAVDocType = "eu.europa.ec.av.1";
44
+ constexpr const char* kEUDIPIDDocType = "eu.europa.ec.eudi.pid.1";
45
+ constexpr const char* kISO23220PhotoIDDocType = "org.iso.23220.photoID.1";
46
+ constexpr const char* kAadhaarDocType = "in.gov.uidai.aadhaar.1";
47
+
48
+ // Extracted from
49
+ // https://github.com/ISOWG10/ISO-18013/blob/main/Working%20Documents/Working%20Draft%20WG%2010_N2549_ISO-IEC%2018013-5-%20Personal%20identification%20%E2%80%94%20ISO-compliant%20driving%20licence%20%E2%80%94%20Part%205-%20Mobile%20driving%20lic.pdf
50
+ // https://www.aamva.org/getmedia/bb4fee66-592d-4d39-813a-8fdfd910268a/MobileDLGuidelines1-5.pdf
51
+ constexpr MdocAttribute kMdocAttributes[] = {
52
+ {"family_name", kMDLNamespace},
53
+ {"given_name", kMDLNamespace},
54
+ {"birth_date", kMDLNamespace},
55
+ {"issue_date", kMDLNamespace},
56
+ {"expiry_date", kMDLNamespace},
57
+ {"issuing_country", kMDLNamespace},
58
+ {"issuing_authority", kMDLNamespace},
59
+ {"document_number", kMDLNamespace},
60
+ {"portrait", kMDLNamespace},
61
+ {"driving_privileges", kMDLNamespace},
62
+ {"un_distinguishing_sign", kMDLNamespace},
63
+ {"administrative_number", kMDLNamespace},
64
+ {"sex", kMDLNamespace},
65
+ {"height", kMDLNamespace},
66
+ {"weight", kMDLNamespace},
67
+ {"eye_colour", kMDLNamespace},
68
+ {"hair_colour", kMDLNamespace},
69
+ {"birth_place", kMDLNamespace},
70
+ {"resident_address", kMDLNamespace},
71
+ {"portrait_capture_date", kMDLNamespace},
72
+ {"age_in_years", kMDLNamespace},
73
+ {"age_birth_year", kMDLNamespace},
74
+ {"age_over_10", kMDLNamespace},
75
+ {"age_over_11", kMDLNamespace},
76
+ {"age_over_12", kMDLNamespace},
77
+ {"age_over_13", kMDLNamespace},
78
+ {"age_over_14", kMDLNamespace},
79
+ {"age_over_15", kMDLNamespace},
80
+ {"age_over_16", kMDLNamespace},
81
+ {"age_over_17", kMDLNamespace},
82
+ {"age_over_18", kMDLNamespace},
83
+ {"age_over_19", kMDLNamespace},
84
+ {"age_over_20", kMDLNamespace},
85
+ {"age_over_21", kMDLNamespace},
86
+ {"age_over_23", kMDLNamespace},
87
+ {"age_over_25", kMDLNamespace},
88
+ {"age_over_50", kMDLNamespace},
89
+ {"age_over_55", kMDLNamespace},
90
+ {"age_over_60", kMDLNamespace},
91
+ {"age_over_65", kMDLNamespace},
92
+ {"age_over_70", kMDLNamespace},
93
+ {"age_over_75", kMDLNamespace},
94
+ {"issuing_jurisdiction", kMDLNamespace},
95
+ {"nationality", kMDLNamespace},
96
+ {"resident_city", kMDLNamespace},
97
+ {"resident_state", kMDLNamespace},
98
+ {"resident_postal_code", kMDLNamespace},
99
+ {"resident_country", kMDLNamespace},
100
+ {"biometric_template_face", kMDLNamespace},
101
+ {"biometric_template_voice", kMDLNamespace},
102
+ {"biometric_template_finger", kMDLNamespace},
103
+ {"biometric_template_iris", kMDLNamespace},
104
+ {"biometric_template_retina", kMDLNamespace},
105
+ {"biometric_template_hand_geometry", kMDLNamespace},
106
+ {"biometric_template_keystroke", kMDLNamespace},
107
+ {"biometric_template_signature_sign", kMDLNamespace},
108
+ {"biometric_template_lip_movement", kMDLNamespace},
109
+ {"biometric_template_thermal_face", kMDLNamespace},
110
+ {"biometric_template_thermal_hand", kMDLNamespace},
111
+ {"biometric_template_gait", kMDLNamespace},
112
+ {"biometric_template_body_odor", kMDLNamespace},
113
+ {"biometric_template_dna", kMDLNamespace},
114
+ {"biometric_template_ear", kMDLNamespace},
115
+ {"biometric_template_finger_geometry", kMDLNamespace},
116
+ {"biometric_template_palm_geometry", kMDLNamespace},
117
+ {"biometric_template_vein_pattern", kMDLNamespace},
118
+ {"biometric_template_foot_print", kMDLNamespace},
119
+ {"family_name_national_character", kMDLNamespace},
120
+ {"given_name_national_character", kMDLNamespace},
121
+ {"signature_usual_mark", kMDLNamespace},
122
+
123
+ {"name_suffix", kAAMVANamespace},
124
+ {"organ_donor", kAAMVANamespace},
125
+ {"veteran", kAAMVANamespace},
126
+ {"family_name_truncation", kAAMVANamespace},
127
+ {"given_name_truncation", kAAMVANamespace},
128
+ {"aka_family_name.v2", kAAMVANamespace},
129
+ {"aka_given_name.v2", kAAMVANamespace},
130
+ {"aka_suffix", kAAMVANamespace},
131
+ {"weight_range", kAAMVANamespace},
132
+ {"race_ethnicity", kAAMVANamespace},
133
+ {"sex", kAAMVANamespace},
134
+ {"first_name", kAAMVANamespace},
135
+ {"middle_names", kAAMVANamespace},
136
+ {"first_name_truncation", kAAMVANamespace},
137
+ {"middle_names_truncation", kAAMVANamespace},
138
+ {"EDL_credential", kAAMVANamespace},
139
+ {"EDL_credential.v2", kAAMVANamespace},
140
+ {"DHS_compliance", kAAMVANamespace},
141
+ {"resident_county", kAAMVANamespace},
142
+ {"resident_county.v2", kAAMVANamespace},
143
+ {"hazmat_endorsement_expiration_date", kAAMVANamespace},
144
+ {"CDL_indicator", kAAMVANamespace},
145
+ {"CDL_non_domiciled", kAAMVANamespace},
146
+ {"CDL_non_domiciled.v2", kAAMVANamespace},
147
+ {"DHS_compliance_text", kAAMVANamespace},
148
+ {"DHS_temporary_lawful_status", kAAMVANamespace},
149
+
150
+ {"family_name", kEUDIPIDNamespace},
151
+ {"given_name", kEUDIPIDNamespace},
152
+ {"birth_date", kEUDIPIDNamespace},
153
+ {"age_in_years", kEUDIPIDNamespace},
154
+ {"age_birth_year", kEUDIPIDNamespace},
155
+ {"age_equal_or_over", kEUDIPIDNamespace},
156
+ {"age_over_18", kEUDIPIDNamespace},
157
+ {"age_over_21", kEUDIPIDNamespace},
158
+ {"family_name_birth", kEUDIPIDNamespace},
159
+ {"given_name_birth", kEUDIPIDNamespace},
160
+ {"birth_place", kEUDIPIDNamespace},
161
+ {"place_of_birth", kEUDIPIDNamespace},
162
+ {"birth_country", kEUDIPIDNamespace},
163
+ {"birth_state", kEUDIPIDNamespace},
164
+ {"birth_city", kEUDIPIDNamespace},
165
+ {"address", kEUDIPIDNamespace},
166
+ {"resident_address", kEUDIPIDNamespace},
167
+ {"resident_country", kEUDIPIDNamespace},
168
+ {"resident_state", kEUDIPIDNamespace},
169
+ {"resident_city", kEUDIPIDNamespace},
170
+ {"resident_postal_code", kEUDIPIDNamespace},
171
+ {"resident_street", kEUDIPIDNamespace},
172
+ {"resident_house_number", kEUDIPIDNamespace},
173
+ {"sex", kEUDIPIDNamespace},
174
+ {"nationality", kEUDIPIDNamespace},
175
+ {"issuance_date", kEUDIPIDNamespace},
176
+ {"expiry_date", kEUDIPIDNamespace},
177
+ {"issuing_authority", kEUDIPIDNamespace},
178
+ {"document_number", kEUDIPIDNamespace},
179
+ {"personal_administrative_number", kEUDIPIDNamespace},
180
+ {"issuing_jurisdiction", kEUDIPIDNamespace},
181
+ {"issuing_country", kEUDIPIDNamespace},
182
+ {"portrait", kEUDIPIDNamespace},
183
+ {"email_address", kEUDIPIDNamespace},
184
+ {"mobile_phone_number", kEUDIPIDNamespace},
185
+
186
+ {"family_name_unicode", kISO23220Namespace},
187
+ {"given_name_unicode", kISO23220Namespace},
188
+ {"birth_date", kISO23220Namespace},
189
+ {"portrait", kISO23220Namespace},
190
+ {"issue_date", kISO23220Namespace},
191
+ {"expiry_date", kISO23220Namespace},
192
+ {"issuing_authority_unicode", kISO23220Namespace},
193
+ {"issuing_country", kISO23220Namespace},
194
+ {"age_in_years", kISO23220Namespace},
195
+ {"age_over_13", kISO23220Namespace},
196
+ {"age_over_16", kISO23220Namespace},
197
+ {"age_over_18", kISO23220Namespace},
198
+ {"age_over_21", kISO23220Namespace},
199
+ {"age_over_25", kISO23220Namespace},
200
+ {"age_over_60", kISO23220Namespace},
201
+ {"age_over_62", kISO23220Namespace},
202
+ {"age_over_65", kISO23220Namespace},
203
+ {"age_over_68", kISO23220Namespace},
204
+ {"age_birth_year", kISO23220Namespace},
205
+ {"portrait_capture_date", kISO23220Namespace},
206
+ {"birthplace", kISO23220Namespace},
207
+ {"name_at_birth", kISO23220Namespace},
208
+ {"resident_address_unicode", kISO23220Namespace},
209
+ {"resident_city_unicode", kISO23220Namespace},
210
+ {"resident_postal_code", kISO23220Namespace},
211
+ {"resident_country", kISO23220Namespace},
212
+ {"resident_city_latin1", kISO23220Namespace},
213
+ {"sex", kISO23220Namespace},
214
+ {"nationality", kISO23220Namespace},
215
+ {"document_number", kISO23220Namespace},
216
+ {"issuing_subdivision", kISO23220Namespace},
217
+ {"family_name_latin1", kISO23220Namespace},
218
+ {"given_name_latin1", kISO23220Namespace},
219
+
220
+ {"person_id", kISO23220PhotoIDNamespace},
221
+ {"birth_country", kISO23220PhotoIDNamespace},
222
+ {"birth_state", kISO23220PhotoIDNamespace},
223
+ {"birth_city", kISO23220PhotoIDNamespace},
224
+ {"administrative_number", kISO23220PhotoIDNamespace},
225
+ {"resident_street", kISO23220PhotoIDNamespace},
226
+ {"resident_house_number", kISO23220PhotoIDNamespace},
227
+ {"travel_document_number", kISO23220PhotoIDNamespace},
228
+ {"resident_state", kISO23220PhotoIDNamespace},
229
+
230
+ {"dtc_version", kISO23220DTCNamespace},
231
+ {"dtc_sod", kISO23220DTCNamespace},
232
+ {"dtc_dg1", kISO23220DTCNamespace},
233
+ {"dtc_dg2", kISO23220DTCNamespace},
234
+ {"dtc_dg3", kISO23220DTCNamespace},
235
+ {"dtc_dg4", kISO23220DTCNamespace},
236
+ {"dtc_dg5", kISO23220DTCNamespace},
237
+ {"dtc_dg6", kISO23220DTCNamespace},
238
+ {"dtc_dg7", kISO23220DTCNamespace},
239
+ {"dtc_dg8", kISO23220DTCNamespace},
240
+ {"dtc_dg9", kISO23220DTCNamespace},
241
+ {"dtc_dg10", kISO23220DTCNamespace},
242
+ {"dtc_dg11", kISO23220DTCNamespace},
243
+ {"dtc_dg12", kISO23220DTCNamespace},
244
+ {"dtc_dg13", kISO23220DTCNamespace},
245
+ {"dtc_dg14", kISO23220DTCNamespace},
246
+ {"dtc_dg15", kISO23220DTCNamespace},
247
+ {"dtc_dg16", kISO23220DTCNamespace},
248
+ {"dg_content_info", kISO23220DTCNamespace},
249
+
250
+ // https://ageverification.dev/av-doc-technical-specification/docs/architecture-and-technical-specifications/#411-attribute-set
251
+ {"age_over_18", kEUAVNamespace},
252
+ {"age_over_13", kEUAVNamespace}, /* The rest of these are optional. */
253
+ {"age_over_15", kEUAVNamespace},
254
+ {"age_over_16", kEUAVNamespace},
255
+ {"age_over_21", kEUAVNamespace},
256
+ {"age_over_23", kEUAVNamespace},
257
+ {"age_over_25", kEUAVNamespace},
258
+ {"age_over_27", kEUAVNamespace},
259
+ {"age_over_28", kEUAVNamespace},
260
+ {"age_over_40", kEUAVNamespace},
261
+ {"age_over_60", kEUAVNamespace},
262
+ {"age_over_65", kEUAVNamespace},
263
+ {"age_over_67", kEUAVNamespace},
264
+ {"portrait", kEUAVNamespace},
265
+
266
+ // Aadhaar attributes
267
+ {"credential_issuing_date", kAadhaarNamespace},
268
+ {"enrolment_date", kAadhaarNamespace},
269
+ {"enrolment_number", kAadhaarNamespace},
270
+ {"is_nri", kAadhaarNamespace},
271
+ {"resident_image", kAadhaarNamespace},
272
+ {"resident_name", kAadhaarNamespace},
273
+ {"local_resident_name", kAadhaarNamespace},
274
+ {"age_above18", kAadhaarNamespace},
275
+ {"age_above60", kAadhaarNamespace},
276
+ {"age_above75", kAadhaarNamespace},
277
+ {"dob", kAadhaarNamespace},
278
+ {"gender", kAadhaarNamespace},
279
+ {"building", kAadhaarNamespace},
280
+ {"local_building", kAadhaarNamespace},
281
+ {"locality", kAadhaarNamespace},
282
+ {"local_locality", kAadhaarNamespace},
283
+ {"street", kAadhaarNamespace},
284
+ {"local_street", kAadhaarNamespace},
285
+ {"landmark", kAadhaarNamespace},
286
+ {"local_landmark", kAadhaarNamespace},
287
+ {"vtc", kAadhaarNamespace},
288
+ {"local_vtc", kAadhaarNamespace},
289
+ {"sub_district", kAadhaarNamespace},
290
+ {"local_sub_district", kAadhaarNamespace},
291
+ {"district", kAadhaarNamespace},
292
+ {"local_district", kAadhaarNamespace},
293
+ {"state", kAadhaarNamespace},
294
+ {"local_state", kAadhaarNamespace},
295
+ {"po_name", kAadhaarNamespace},
296
+ {"local_po_name", kAadhaarNamespace},
297
+ {"pincode", kAadhaarNamespace},
298
+ {"address", kAadhaarNamespace},
299
+ {"local_address", kAadhaarNamespace},
300
+ {"mobile", kAadhaarNamespace},
301
+ {"masked_mobile", kAadhaarNamespace},
302
+ {"email", kAadhaarNamespace},
303
+ {"masked_email", kAadhaarNamespace},
304
+ {"masked_uid", kAadhaarNamespace},
305
+ {"aadhaar_type", kAadhaarNamespace},
306
+ {"expires_on", kAadhaarNamespace},
307
+ };
308
+
309
+ } // namespace proofs
310
+
311
+ #endif // PRIVACY_PROOFS_ZK_LIB_CIRCUITS_MDOC_MDOC_ATTRIBUTE_IDS_H_
@@ -0,0 +1,64 @@
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 <string>
18
+ #include <vector>
19
+
20
+ #include "circuits/mdoc/mdoc_attribute_ids.h"
21
+ #include "circuits/mdoc/mdoc_witness.h"
22
+ #include "util/log.h"
23
+ #include "gtest/gtest.h"
24
+
25
+ namespace proofs {
26
+ namespace {
27
+
28
+ // This test validates that the cbor encoding of an attribute is NOT a suffix
29
+ // of any other valid attribute id. Therefore, finding the location of the
30
+ // cbor-encoded value of the attribute name is sufficient. We can be sure that
31
+ // the Prover is not able to forge an attribute by pointing to the suffix of
32
+ // another attribute id.
33
+ TEST(MdocAttributeTest, MdocAttributeIdsAreSuffixFree) {
34
+ for (const auto& attr : kMdocAttributes) {
35
+ // Form the cbor encoding of attr.
36
+ size_t len = attr.identifier.size();
37
+ std::vector<uint8_t> attr_enc;
38
+ append_text_len(attr_enc, len);
39
+ attr_enc.insert(attr_enc.end(), attr.identifier.begin(),
40
+ attr.identifier.end());
41
+ std::string attr_enc_str(attr_enc.begin(), attr_enc.end());
42
+ for (const auto& aj : kMdocAttributes) {
43
+ if (aj.identifier.ends_with(attr_enc_str) &&
44
+ aj.identifier != attr.identifier) {
45
+ log(INFO, "identifier %s is a suffix of %s\n", aj.identifier.data(),
46
+ attr.identifier.data());
47
+ }
48
+ EXPECT_TRUE(!aj.identifier.ends_with(attr_enc_str) ||
49
+ aj.identifier == attr.identifier);
50
+ }
51
+ }
52
+ }
53
+
54
+ TEST(MdocAttributeTest, DelimiterIsPresent) {
55
+ // Verify that the delimiter "ier" never occurs in an attribute id.
56
+ // Verify that elementValue never appears in any attribute id.
57
+ for (const auto& attr : kMdocAttributes) {
58
+ EXPECT_TRUE(attr.identifier.find("ier") == std::string::npos);
59
+ EXPECT_TRUE(attr.identifier.find("elementValue") == std::string::npos);
60
+ }
61
+ }
62
+
63
+ } // namespace
64
+ } // namespace proofs
@@ -0,0 +1,85 @@
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 <stdint.h>
16
+ #include <sys/types.h>
17
+
18
+ #include <cstddef>
19
+ #include <cstdlib>
20
+ #include <cstring>
21
+ #include <memory>
22
+ #include <vector>
23
+
24
+ #include "circuits/mdoc/mdoc_decompress.h"
25
+ #include "circuits/mdoc/mdoc_zk.h"
26
+ #include "ec/p256.h"
27
+ #include "gf2k/gf2_128.h"
28
+ #include "proto/circuit.h"
29
+ #include "sumcheck/circuit_id.h"
30
+ #include "util/crypto.h"
31
+ #include "util/log.h"
32
+ #include "util/readbuffer.h"
33
+ #include "zstd.h"
34
+
35
+ namespace proofs {
36
+
37
+ using f_128 = GF2_128<>;
38
+
39
+ extern "C" {
40
+
41
+ int circuit_id(uint8_t id[/*kSHA256DigestSize*/], const uint8_t* bcp,
42
+ size_t bcsz, const ZkSpecStruct* zk_spec) {
43
+ if (id == nullptr || bcp == nullptr || zk_spec == nullptr) {
44
+ return 0;
45
+ }
46
+ SHA256 sha;
47
+ uint8_t cid[kSHA256DigestSize];
48
+
49
+ size_t len = kCircuitSizeMax;
50
+ std::vector<uint8_t> bytes(len);
51
+ size_t full_size = decompress(bytes, bcp, bcsz);
52
+
53
+ ReadBuffer rb_circuit(bytes.data(), full_size);
54
+ CircuitRep<Fp256Base> cr_s(p256_base, P256_ID);
55
+ auto c_sig = cr_s.from_bytes(rb_circuit, /*enforce_circuit_id=*/true);
56
+ if (c_sig == nullptr) {
57
+ log(ERROR, "signature circuit could not be parsed");
58
+ return 0;
59
+ }
60
+ circuit_id(cid, *c_sig, p256_base);
61
+ sha.Update(cid, kSHA256DigestSize);
62
+
63
+ const f_128 Fs;
64
+ CircuitRep<f_128> cr_h(Fs, GF2_128_ID);
65
+ auto c_hash = cr_h.from_bytes(rb_circuit, /*enforce_circuit_id=*/true);
66
+ if (c_hash == nullptr) {
67
+ log(ERROR, "circuit could not be parsed");
68
+ return 0;
69
+ }
70
+
71
+ size_t remaining = rb_circuit.remaining();
72
+ if (remaining != 0) {
73
+ log(ERROR, "circuit bytes contains extra data: %zu bytes", remaining);
74
+ return 0;
75
+ }
76
+
77
+ circuit_id(cid, *c_hash, Fs);
78
+ sha.Update(cid, kSHA256DigestSize);
79
+
80
+ sha.DigestData(id);
81
+ return 1;
82
+ }
83
+
84
+ } /* extern "C" */
85
+ } // namespace proofs
@@ -0,0 +1,85 @@
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_MDOC_MDOC_CONSTANTS_H_
16
+ #define PRIVACY_PROOFS_ZK_LIB_CIRCUITS_MDOC_MDOC_CONSTANTS_H_
17
+
18
+ #include <stddef.h>
19
+ #include <stdint.h>
20
+
21
+ namespace proofs {
22
+
23
+ /* Max number of SHA blocks to process. */
24
+ // v7 circuits use 40, earlier ones use 35.
25
+ constexpr static const size_t kMaxSHABlocks = 40;
26
+
27
+ /* Number of bits in CBOR index. Must be large enough to index into MDOC.*/
28
+ constexpr static const size_t kCborIndexBits = 12;
29
+
30
+ // This is the prefix added to the D8... mdoc encoding to produce
31
+ // a COSE1 encoding that is ready to be hashed.
32
+ static constexpr uint8_t kCose1Prefix[18] = {
33
+ 0x84, 0x6A, 0x53, 0x69, 0x67, 0x6E, 0x61, 0x74, 0x75,
34
+ 0x72, 0x65, 0x31, 0x43, 0xA1, 0x01, 0x26, 0x40, 0x59,
35
+ };
36
+ static constexpr size_t kCose1PrefixLen = 18;
37
+
38
+ /* Max size of an MSO that hashes using < MAX SHA blocks. */
39
+ constexpr static const size_t kMaxMsoLen =
40
+ kMaxSHABlocks * 64 - 9 - kCose1PrefixLen;
41
+
42
+ static constexpr size_t kValidityInfoLen = 12;
43
+ static constexpr size_t kValidFromLen = 9;
44
+ static constexpr size_t kDeviceKeyLen = 9;
45
+ static constexpr size_t kDeviceKeyInfoLen = 13;
46
+ static constexpr size_t kValidUntilLen = 10;
47
+ static constexpr size_t kValueDigestsLen = 12;
48
+ static constexpr size_t kOrgLen = 17;
49
+
50
+ static constexpr uint8_t kTag32[] = {0x58, 0x20};
51
+ static constexpr size_t kIdLen = 32;
52
+ static constexpr size_t kValueLen = 64;
53
+ static constexpr size_t kDigestLen = 8 + 1;
54
+ static constexpr size_t kRandomLen = 6 + 1;
55
+
56
+ static constexpr uint8_t kValidityInfoID[kValidityInfoLen] = {
57
+ 'v', 'a', 'l', 'i', 'd', 'i', 't', 'y', 'I', 'n', 'f', 'o'};
58
+
59
+ static constexpr uint8_t kValidFromID[kValidFromLen] = {'v', 'a', 'l', 'i', 'd',
60
+ 'F', 'r', 'o', 'm'};
61
+
62
+ static constexpr uint8_t kValidUntilID[kValidUntilLen] = {
63
+ 'v', 'a', 'l', 'i', 'd', 'U', 'n', 't', 'i', 'l'};
64
+
65
+ static constexpr uint8_t kDeviceKeyID[kDeviceKeyLen] = {'d', 'e', 'v', 'i', 'c',
66
+ 'e', 'K', 'e', 'y'};
67
+
68
+ static constexpr uint8_t kDeviceKeyInfoID[kDeviceKeyInfoLen] = {
69
+ 'd', 'e', 'v', 'i', 'c', 'e', 'K', 'e', 'y', 'I', 'n', 'f', 'o'};
70
+
71
+ static constexpr uint8_t kValueDigestsID[kValueDigestsLen] = {
72
+ 'v', 'a', 'l', 'u', 'e', 'D', 'i', 'g', 'e', 's', 't', 's'};
73
+
74
+ static constexpr uint8_t kOrgID[kOrgLen] = {'o', 'r', 'g', '.', 'i', 's',
75
+ 'o', '.', '1', '8', '0', '1',
76
+ '3', '.', '5', '.', '1'};
77
+
78
+ static constexpr uint8_t kDigestID[kDigestLen] = {0x68, 'd', 'i', 'g', 'e',
79
+ 's', 't', 'I', 'D'};
80
+
81
+ static constexpr uint8_t kRandomID[kRandomLen] = {0x66, 'r', 'a', 'n',
82
+ 'd', 'o', 'm'};
83
+ } // namespace proofs
84
+
85
+ #endif // PRIVACY_PROOFS_ZK_LIB_CIRCUITS_MDOC_MDOC_CONSTANTS_H_
@@ -0,0 +1,41 @@
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/mdoc/mdoc_decompress.h"
16
+
17
+ #include <cstddef>
18
+ #include <cstdint>
19
+ #include <vector>
20
+
21
+ #include "util/log.h"
22
+ #include "zstd.h"
23
+
24
+ namespace proofs {
25
+
26
+ // Decompress a circuit representation into a vector that has been reserved
27
+ // with size len. The value len needs to be a good upper-bound estimate on
28
+ // the size of the uncompressed string.
29
+ size_t decompress(std::vector<uint8_t>& bytes, const uint8_t* compressed,
30
+ size_t compressed_len) {
31
+ size_t res =
32
+ ZSTD_decompress(bytes.data(), bytes.size(), compressed, compressed_len);
33
+
34
+ if (ZSTD_isError(res)) {
35
+ log(ERROR, "zlib.UncompressAtMost failed: %s", ZSTD_getErrorName(res));
36
+ return 0;
37
+ }
38
+ return res;
39
+ }
40
+
41
+ } // namespace proofs
@@ -0,0 +1,27 @@
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_MDOC_MDOC_DECOMPRESS_H_
16
+ #define PRIVACY_PROOFS_ZK_LIB_CIRCUITS_MDOC_MDOC_DECOMPRESS_H_
17
+
18
+ #include <cstddef>
19
+ #include <cstdint>
20
+ #include <vector>
21
+
22
+ namespace proofs {
23
+ extern size_t decompress(std::vector<uint8_t>& bytes, const uint8_t* compressed,
24
+ size_t compressed_len);
25
+ } // namespace proofs
26
+
27
+ #endif // PRIVACY_PROOFS_ZK_LIB_CIRCUITS_MDOC_MDOC_DECOMPRESS_H_