Merge pull request #21 from real-or-random/secp256k1-zkp
Reject surjection proofs with trailing garbage
This commit is contained in:
		
						commit
						f1c601ed9d
					
				| @ -56,7 +56,7 @@ int secp256k1_surjectionproof_parse(const secp256k1_context* ctx, secp256k1_surj | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     signature_len = 32 * (1 + secp256k1_count_bits_set(&input[2], (n_inputs + 7) / 8)); |     signature_len = 32 * (1 + secp256k1_count_bits_set(&input[2], (n_inputs + 7) / 8)); | ||||||
|     if (inputlen < 2 + (n_inputs + 7) / 8 + signature_len) { |     if (inputlen != 2 + (n_inputs + 7) / 8 + signature_len) { | ||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
|     proof->n_inputs = n_inputs; |     proof->n_inputs = n_inputs; | ||||||
|  | |||||||
| @ -331,6 +331,7 @@ static void test_gen_verify(size_t n_inputs, size_t n_used) { | |||||||
|     unsigned char seed[32]; |     unsigned char seed[32]; | ||||||
|     secp256k1_surjectionproof proof; |     secp256k1_surjectionproof proof; | ||||||
|     unsigned char serialized_proof[SECP256K1_SURJECTIONPROOF_SERIALIZATION_BYTES_MAX]; |     unsigned char serialized_proof[SECP256K1_SURJECTIONPROOF_SERIALIZATION_BYTES_MAX]; | ||||||
|  |     unsigned char serialized_proof_trailing[SECP256K1_SURJECTIONPROOF_SERIALIZATION_BYTES_MAX + 1]; | ||||||
|     size_t serialized_len = SECP256K1_SURJECTIONPROOF_SERIALIZATION_BYTES_MAX; |     size_t serialized_len = SECP256K1_SURJECTIONPROOF_SERIALIZATION_BYTES_MAX; | ||||||
|     secp256k1_fixed_asset_tag fixed_input_tags[1000]; |     secp256k1_fixed_asset_tag fixed_input_tags[1000]; | ||||||
|     secp256k1_generator ephemeral_input_tags[1000]; |     secp256k1_generator ephemeral_input_tags[1000]; | ||||||
| @ -376,6 +377,12 @@ static void test_gen_verify(size_t n_inputs, size_t n_used) { | |||||||
|     CHECK(secp256k1_surjectionproof_serialize(ctx, serialized_proof, &serialized_len, &proof)); |     CHECK(secp256k1_surjectionproof_serialize(ctx, serialized_proof, &serialized_len, &proof)); | ||||||
|     CHECK(serialized_len == secp256k1_surjectionproof_serialized_size(ctx, &proof)); |     CHECK(serialized_len == secp256k1_surjectionproof_serialized_size(ctx, &proof)); | ||||||
|     CHECK(serialized_len == SECP256K1_SURJECTIONPROOF_SERIALIZATION_BYTES(n_inputs, n_used)); |     CHECK(serialized_len == SECP256K1_SURJECTIONPROOF_SERIALIZATION_BYTES(n_inputs, n_used)); | ||||||
|  | 
 | ||||||
|  |     /* trailing garbage */ | ||||||
|  |     memcpy(&serialized_proof_trailing, &serialized_proof, serialized_len); | ||||||
|  |     serialized_proof_trailing[serialized_len] = seed[0]; | ||||||
|  |     CHECK(secp256k1_surjectionproof_parse(ctx, &proof, serialized_proof, serialized_len + 1) == 0); | ||||||
|  | 
 | ||||||
|     CHECK(secp256k1_surjectionproof_parse(ctx, &proof, serialized_proof, serialized_len)); |     CHECK(secp256k1_surjectionproof_parse(ctx, &proof, serialized_proof, serialized_len)); | ||||||
|     result = secp256k1_surjectionproof_verify(ctx, &proof, ephemeral_input_tags, n_inputs, &ephemeral_input_tags[n_inputs]); |     result = secp256k1_surjectionproof_verify(ctx, &proof, ephemeral_input_tags, n_inputs, &ephemeral_input_tags[n_inputs]); | ||||||
|     CHECK(result == 1); |     CHECK(result == 1); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user