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 */