LCOV - code coverage report
Current view: top level - ballet/zksdk/instructions - fd_zksdk_batched_range_proofs.h (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 19 32 59.4 %
Date: 2026-03-19 18:19:27 Functions: 6 30 20.0 %

          Line data    Source code
       1             : #ifndef HEADER_fd_src_ballet_zksdk_instructions_fd_zksdk_batched_range_proofs_h
       2             : #define HEADER_fd_src_ballet_zksdk_instructions_fd_zksdk_batched_range_proofs_h
       3             : 
       4             : #include "../fd_zksdk_common.h"
       5             : 
       6             : struct __attribute__((packed)) fd_zksdk_range_proof_u64_proof {
       7             :   fd_rangeproofs_range_proof_t range_proof;
       8             :   fd_rangeproofs_ipp_vecs_t    ipp_lr_vec[ 6 ]; // log(bit_length) points
       9             :   uchar                        ipp_a[ 32 ];     // scalar
      10             :   uchar                        ipp_b[ 32 ];     // scalar
      11             : };
      12             : typedef struct fd_zksdk_range_proof_u64_proof fd_zksdk_range_proof_u64_proof_t;
      13             : 
      14             : struct __attribute__((packed)) fd_zksdk_range_proof_u128_proof {
      15             :   fd_rangeproofs_range_proof_t range_proof;
      16             :   fd_rangeproofs_ipp_vecs_t    ipp_lr_vec[ 7 ]; // log(bit_length) points
      17             :   uchar                        ipp_a[ 32 ];     // scalar
      18             :   uchar                        ipp_b[ 32 ];     // scalar
      19             : };
      20             : typedef struct fd_zksdk_range_proof_u128_proof fd_zksdk_range_proof_u128_proof_t;
      21             : 
      22             : struct __attribute__((packed)) fd_zksdk_range_proof_u256_proof {
      23             :   fd_rangeproofs_range_proof_t range_proof;
      24             :   fd_rangeproofs_ipp_vecs_t    ipp_lr_vec[ 8 ]; // log(bit_length) points
      25             :   uchar                        ipp_a[ 32 ];     // scalar
      26             :   uchar                        ipp_b[ 32 ];     // scalar
      27             : };
      28             : typedef struct fd_zksdk_range_proof_u256_proof fd_zksdk_range_proof_u256_proof_t;
      29             : 
      30         432 : #define FD_ZKSDK_MAX_COMMITMENTS FD_RANGEPROOFS_MAX_COMMITMENTS
      31             : struct __attribute__((packed)) fd_zksdk_batched_range_proof_context {
      32             :   uchar commitments[ FD_ZKSDK_MAX_COMMITMENTS * 32 ]; // points
      33             :   uchar bit_lengths[ FD_ZKSDK_MAX_COMMITMENTS ];
      34             : };
      35             : typedef struct fd_zksdk_batched_range_proof_context fd_zksdk_batched_range_proof_context_t;
      36             : 
      37             : /* https://github.com/solana-program/zk-elgamal-proof/blob/zk-sdk%40v5.0.1/zk-sdk/src/zk_elgamal_proof_program/proof_data/batched_range_proof/mod.rs#L63 */
      38             : static inline void
      39             : batched_range_proof_context_new_transcript( fd_zksdk_transcript_t *                        transcript,
      40          36 :                                             fd_zksdk_batched_range_proof_context_t const * context) {
      41          36 :   fd_zksdk_transcript_init( transcript, FD_TRANSCRIPT_LITERAL("batched-range-proof-instruction") );
      42          36 :   fd_merlin_transcript_append_message( transcript, FD_TRANSCRIPT_LITERAL("commitments"), context->commitments, FD_ZKSDK_MAX_COMMITMENTS * 32 );
      43          36 :   fd_merlin_transcript_append_message( transcript, FD_TRANSCRIPT_LITERAL("bit-lengths"), context->bit_lengths, FD_ZKSDK_MAX_COMMITMENTS );
      44          36 : }
      45             : 
      46             : /* https://github.com/solana-program/zk-elgamal-proof/blob/zk-sdk%40v5.0.1/zk-sdk/src/zk_elgamal_proof_program/proof_data/batched_range_proof/mod.rs#L117 */
      47             : static inline int
      48             : batched_range_proof_context_try_into( uchar *                                        _len,
      49          36 :                                       fd_zksdk_batched_range_proof_context_t const * context ) {
      50             : 
      51             :   /* https://github.com/solana-program/zk-elgamal-proof/blob/zk-sdk%40v5.0.1/zk-sdk/src/zk_elgamal_proof_program/proof_data/batched_range_proof/mod.rs#L118-L121
      52             :      Compute len as index of first commitment set to zero. */
      53          36 :   uchar len = 0;
      54         324 :   for( ; len<FD_ZKSDK_MAX_COMMITMENTS; len++ ) {
      55         288 :     if( fd_memeq( &context->commitments[ len*32 ], fd_ristretto255_compressed_zero, 32 ) ) {
      56           0 :       break;
      57           0 :     }
      58         288 :   }
      59             : 
      60             :   /* https://github.com/solana-program/zk-elgamal-proof/blob/zk-sdk%40v5.0.1/zk-sdk/src/zk_elgamal_proof_program/proof_data/batched_range_proof/mod.rs#L134-L136 */
      61          36 :   if( FD_UNLIKELY( len == 0 ) ) {
      62           0 :     return FD_ZKSDK_VERIFY_PROOF_ERROR;
      63           0 :   }
      64             : 
      65             :   /* https://github.com/solana-program/zk-elgamal-proof/blob/zk-sdk%40v5.0.1/zk-sdk/src/zk_elgamal_proof_program/proof_data/batched_range_proof/mod.rs#L139-L144
      66             :      All bit lengths must be non-zero and <= 64. */
      67         324 :   for( uchar i=0; i<len; i++ ) {
      68         288 :     if( FD_UNLIKELY( context->bit_lengths[ i ]==0 || context->bit_lengths[ i ]>64 ) ) {
      69           0 :       return FD_ZKSDK_VERIFY_PROOF_ERROR;
      70           0 :     }
      71         288 :   }
      72             : 
      73             :   /* https://github.com/solana-program/zk-elgamal-proof/blob/zk-sdk%40v5.0.1/zk-sdk/src/zk_elgamal_proof_program/proof_data/batched_range_proof/mod.rs#L147-L158
      74             :      All commitments and bit lengths after len must be zero. */
      75          36 :   for( uchar i=len; i<FD_ZKSDK_MAX_COMMITMENTS; i++ ) {
      76           0 :     if( FD_UNLIKELY(
      77           0 :       !fd_memeq( &context->commitments[ i*32 ], fd_ristretto255_compressed_zero, 32 )
      78           0 :       || context->bit_lengths[ i ]!=0
      79           0 :     ) ) {
      80           0 :       return FD_ZKSDK_VERIFY_PROOF_ERROR;
      81           0 :     }
      82           0 :   }
      83             : 
      84          36 :   *_len = len;
      85          36 :   return FD_ZKSDK_VERIFY_PROOF_SUCCESS;
      86          36 : }
      87             : 
      88             : #endif /* HEADER_fd_src_ballet_zksdk_instructions_fd_zksdk_batched_range_proofs_h */

Generated by: LCOV version 1.14