@@ -721,13 +721,187 @@ static void dleq_tests(void) {
721
721
CHECK (secp256k1_dleq_nonce (& k , a32 , A_33 , C_33 , NULL , NULL ) == 1 );
722
722
}
723
723
724
+ /* Test vectors according to BIP-374 ("Discrete Log Equality Proofs"). See
725
+ * https://github.com/bitcoin/bips/blob/master/bip-0374/test_vectors_(generate|verify)_proof.csv.
726
+ * Contains 32 bytes a + 33 bytes B + 32 bytes auxrand + 32 bytes optional msg + 64 bytes proof
727
+ * */
728
+
729
+ static const unsigned char a_bytes [6 ][32 ] = {
730
+ {0xc0 , 0x8c , 0xa8 , 0xe0 , 0xbb , 0x59 , 0x76 , 0x9f , 0xc6 , 0xa4 , 0xe0 , 0x78 , 0x45 , 0x62 , 0x84 , 0xe0 , 0x0e , 0xa3 , 0x4f , 0x65 , 0xad , 0xd9 , 0x88 , 0xc2 , 0x46 , 0xe1 , 0xbb , 0xa8 , 0x58 , 0x24 , 0xcc , 0xdc },
731
+ {0x8e , 0x64 , 0x1b , 0xa6 , 0xbf , 0x7f , 0x64 , 0xee , 0xc7 , 0x60 , 0x05 , 0xa2 , 0x95 , 0x85 , 0xa5 , 0x03 , 0x53 , 0x76 , 0x37 , 0x5f , 0x33 , 0xe3 , 0x31 , 0x21 , 0x5a , 0xed , 0xfe , 0x03 , 0xb8 , 0xe8 , 0x0e , 0x7a },
732
+ {0xcf , 0xb9 , 0xa7 , 0xec , 0xc4 , 0x9b , 0xea , 0x4f , 0x2e , 0x2e , 0xe3 , 0x4c , 0x38 , 0xa6 , 0xf4 , 0x8b , 0x5c , 0xd5 , 0xbd , 0x06 , 0xf4 , 0xe4 , 0xd4 , 0xff , 0xb4 , 0x59 , 0x05 , 0xb3 , 0xd2 , 0x6d , 0xb8 , 0x42 },
733
+ {0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 },
734
+ {0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xfe , 0xba , 0xae , 0xdc , 0xe6 , 0xaf , 0x48 , 0xa0 , 0x3b , 0xbf , 0xd2 , 0x5e , 0x8c , 0xd0 , 0x36 , 0x41 , 0x41 },
735
+ {0xcf , 0xb9 , 0xa7 , 0xec , 0xc4 , 0x9b , 0xea , 0x4f , 0x2e , 0x2e , 0xe3 , 0x4c , 0x38 , 0xa6 , 0xf4 , 0x8b , 0x5c , 0xd5 , 0xbd , 0x06 , 0xf4 , 0xe4 , 0xd4 , 0xff , 0xb4 , 0x59 , 0x05 , 0xb3 , 0xd2 , 0x6d , 0xb8 , 0x42 },
736
+ };
737
+
738
+ static const unsigned char A_bytes [13 ][33 ] = {
739
+ {0x02 , 0x63 , 0x7b , 0x2c , 0x3e , 0xa8 , 0xca , 0x80 , 0xb9 , 0xca , 0xec , 0xc5 , 0x0f , 0x41 , 0x34 , 0xc8 , 0x6a , 0xe9 , 0xcf , 0x7a , 0x26 , 0x91 , 0x33 , 0xe7 , 0xaf , 0xc7 , 0x1f , 0x30 , 0xe3 , 0xa3 , 0xcd , 0xa6 , 0x0c },
740
+ {0x02 , 0x98 , 0x3a , 0x72 , 0xb4 , 0xcb , 0x44 , 0xd4 , 0x32 , 0x26 , 0x41 , 0xa7 , 0xb2 , 0x00 , 0x19 , 0x00 , 0xcd , 0x6a , 0xe0 , 0x90 , 0x8a , 0x61 , 0x05 , 0x46 , 0xc7 , 0x3e , 0xd1 , 0x26 , 0xac , 0xcd , 0xba , 0x05 , 0x14 },
741
+ {0x03 , 0x61 , 0x14 , 0x10 , 0x56 , 0x1c , 0x35 , 0xda , 0xe1 , 0x31 , 0x35 , 0xe4 , 0xad , 0x80 , 0x94 , 0xba , 0xac , 0x9b , 0xbc , 0xf2 , 0xf4 , 0xe1 , 0x84 , 0x98 , 0x18 , 0x1a , 0x8f , 0xf8 , 0xa6 , 0xd4 , 0x3b , 0xe9 , 0xd9 },
742
+ {0 },
743
+ {0 },
744
+ {0 },
745
+ {0x03 , 0x61 , 0x14 , 0x10 , 0x56 , 0x1c , 0x35 , 0xda , 0xe1 , 0x31 , 0x35 , 0xe4 , 0xad , 0x80 , 0x94 , 0xba , 0xac , 0x9b , 0xbc , 0xf2 , 0xf4 , 0xe1 , 0x84 , 0x98 , 0x18 , 0x1a , 0x8f , 0xf8 , 0xa6 , 0xd4 , 0x3b , 0xe9 , 0xd9 },
746
+ {0x02 , 0x1c , 0xb8 , 0x11 , 0x21 , 0xa0 , 0x0f , 0x89 , 0x76 , 0x99 , 0x03 , 0x30 , 0x5a , 0x36 , 0x7a , 0xd3 , 0xcc , 0x02 , 0xd5 , 0xb4 , 0x02 , 0xb1 , 0x2c , 0x02 , 0x6e , 0x06 , 0xac , 0x94 , 0xbd , 0xe2 , 0x8c , 0xd6 , 0x08 },
747
+ {0x02 , 0x1c , 0xb8 , 0x11 , 0x21 , 0xa0 , 0x0f , 0x89 , 0x76 , 0x99 , 0x03 , 0x30 , 0x5a , 0x36 , 0x7a , 0xd3 , 0xcc , 0x02 , 0xd5 , 0xb4 , 0x02 , 0xb1 , 0x2c , 0x02 , 0x6e , 0x06 , 0xac , 0x94 , 0xbd , 0xe2 , 0x8c , 0xd6 , 0x08 },
748
+ {0x03 , 0xd9 , 0xa9 , 0x86 , 0x24 , 0xc0 , 0xc7 , 0x4f , 0xc7 , 0xee , 0xbd , 0x39 , 0xed , 0x84 , 0x17 , 0x5f , 0x80 , 0xd0 , 0x3c , 0x77 , 0x49 , 0x08 , 0xe7 , 0x5c , 0xa7 , 0x37 , 0xa0 , 0x74 , 0x5d , 0x1c , 0x64 , 0xe2 , 0x0a },
749
+ {0x03 , 0xd9 , 0xa9 , 0x86 , 0x24 , 0xc0 , 0xc7 , 0x4f , 0xc7 , 0xee , 0xbd , 0x39 , 0xed , 0x84 , 0x17 , 0x5f , 0x80 , 0xd0 , 0x3c , 0x77 , 0x49 , 0x08 , 0xe7 , 0x5c , 0xa7 , 0x37 , 0xa0 , 0x74 , 0x5d , 0x1c , 0x64 , 0xe2 , 0x0a },
750
+ {0x03 , 0x61 , 0x14 , 0x10 , 0x56 , 0x1c , 0x35 , 0xda , 0xe1 , 0x31 , 0x35 , 0xe4 , 0xad , 0x80 , 0x94 , 0xba , 0xac , 0x9b , 0xbc , 0xf2 , 0xf4 , 0xe1 , 0x84 , 0x98 , 0x18 , 0x1a , 0x8f , 0xf8 , 0xa6 , 0xd4 , 0x3b , 0xe9 , 0xd9 },
751
+ {0x03 , 0x61 , 0x14 , 0x10 , 0x56 , 0x1c , 0x35 , 0xda , 0xe1 , 0x31 , 0x35 , 0xe4 , 0xad , 0x80 , 0x94 , 0xba , 0xac , 0x9b , 0xbc , 0xf2 , 0xf4 , 0xe1 , 0x84 , 0x98 , 0x18 , 0x1a , 0x8f , 0xf8 , 0xa6 , 0xd4 , 0x3b , 0xe9 , 0xd9 },
752
+ };
753
+
754
+ static const unsigned char B_bytes [13 ][33 ] = {
755
+ {0x03 , 0x4b , 0xcc , 0xb1 , 0xc5 , 0x70 , 0xac , 0x1f , 0x3b , 0xc4 , 0x2d , 0x61 , 0xfe , 0x35 , 0xde , 0x60 , 0x5b , 0x99 , 0x62 , 0x65 , 0x01 , 0xcc , 0xb2 , 0x02 , 0x97 , 0xe1 , 0xac , 0xbb , 0xf2 , 0xd7 , 0x15 , 0x2a , 0xa1 },
756
+ {0x02 , 0x31 , 0xc6 , 0x4e , 0x3e , 0xfa , 0x50 , 0x6f , 0xda , 0xd6 , 0xaa , 0xd0 , 0xf6 , 0x08 , 0x4d , 0x5f , 0x67 , 0x39 , 0xde , 0x7f , 0x44 , 0x8d , 0x7e , 0x66 , 0xf9 , 0xd2 , 0x2f , 0x84 , 0x26 , 0x38 , 0xf4 , 0x1d , 0x60 },
757
+ {0x02 , 0x1c , 0xb8 , 0x11 , 0x21 , 0xa0 , 0x0f , 0x89 , 0x76 , 0x99 , 0x03 , 0x30 , 0x5a , 0x36 , 0x7a , 0xd3 , 0xcc , 0x02 , 0xd5 , 0xb4 , 0x02 , 0xb1 , 0x2c , 0x02 , 0x6e , 0x06 , 0xac , 0x94 , 0xbd , 0xe2 , 0x8c , 0xd6 , 0x08 },
758
+ {0x02 , 0x1c , 0xb8 , 0x11 , 0x21 , 0xa0 , 0x0f , 0x89 , 0x76 , 0x99 , 0x03 , 0x30 , 0x5a , 0x36 , 0x7a , 0xd3 , 0xcc , 0x02 , 0xd5 , 0xb4 , 0x02 , 0xb1 , 0x2c , 0x02 , 0x6e , 0x06 , 0xac , 0x94 , 0xbd , 0xe2 , 0x8c , 0xd6 , 0x08 },
759
+ {0x02 , 0x1c , 0xb8 , 0x11 , 0x21 , 0xa0 , 0x0f , 0x89 , 0x76 , 0x99 , 0x03 , 0x30 , 0x5a , 0x36 , 0x7a , 0xd3 , 0xcc , 0x02 , 0xd5 , 0xb4 , 0x02 , 0xb1 , 0x2c , 0x02 , 0x6e , 0x06 , 0xac , 0x94 , 0xbd , 0xe2 , 0x8c , 0xd6 , 0x08 },
760
+ {0 },
761
+ {0x03 , 0xd9 , 0xa9 , 0x86 , 0x24 , 0xc0 , 0xc7 , 0x4f , 0xc7 , 0xee , 0xbd , 0x39 , 0xed , 0x84 , 0x17 , 0x5f , 0x80 , 0xd0 , 0x3c , 0x77 , 0x49 , 0x08 , 0xe7 , 0x5c , 0xa7 , 0x37 , 0xa0 , 0x74 , 0x5d , 0x1c , 0x64 , 0xe2 , 0x0a },
762
+ {0x03 , 0x61 , 0x14 , 0x10 , 0x56 , 0x1c , 0x35 , 0xda , 0xe1 , 0x31 , 0x35 , 0xe4 , 0xad , 0x80 , 0x94 , 0xba , 0xac , 0x9b , 0xbc , 0xf2 , 0xf4 , 0xe1 , 0x84 , 0x98 , 0x18 , 0x1a , 0x8f , 0xf8 , 0xa6 , 0xd4 , 0x3b , 0xe9 , 0xd9 },
763
+ {0x03 , 0xd9 , 0xa9 , 0x86 , 0x24 , 0xc0 , 0xc7 , 0x4f , 0xc7 , 0xee , 0xbd , 0x39 , 0xed , 0x84 , 0x17 , 0x5f , 0x80 , 0xd0 , 0x3c , 0x77 , 0x49 , 0x08 , 0xe7 , 0x5c , 0xa7 , 0x37 , 0xa0 , 0x74 , 0x5d , 0x1c , 0x64 , 0xe2 , 0x0a },
764
+ {0x03 , 0x61 , 0x14 , 0x10 , 0x56 , 0x1c , 0x35 , 0xda , 0xe1 , 0x31 , 0x35 , 0xe4 , 0xad , 0x80 , 0x94 , 0xba , 0xac , 0x9b , 0xbc , 0xf2 , 0xf4 , 0xe1 , 0x84 , 0x98 , 0x18 , 0x1a , 0x8f , 0xf8 , 0xa6 , 0xd4 , 0x3b , 0xe9 , 0xd9 },
765
+ {0x02 , 0x1c , 0xb8 , 0x11 , 0x21 , 0xa0 , 0x0f , 0x89 , 0x76 , 0x99 , 0x03 , 0x30 , 0x5a , 0x36 , 0x7a , 0xd3 , 0xcc , 0x02 , 0xd5 , 0xb4 , 0x02 , 0xb1 , 0x2c , 0x02 , 0x6e , 0x06 , 0xac , 0x94 , 0xbd , 0xe2 , 0x8c , 0xd6 , 0x08 },
766
+ {0x02 , 0x1c , 0xb8 , 0x11 , 0x21 , 0xa0 , 0x0f , 0x89 , 0x76 , 0x99 , 0x03 , 0x30 , 0x5a , 0x36 , 0x7a , 0xd3 , 0xcc , 0x02 , 0xd5 , 0xb4 , 0x02 , 0xb1 , 0x2c , 0x02 , 0x6e , 0x06 , 0xac , 0x94 , 0xbd , 0xe2 , 0x8c , 0xd6 , 0x08 },
767
+ {0x02 , 0x1c , 0xb8 , 0x11 , 0x21 , 0xa0 , 0x0f , 0x89 , 0x76 , 0x99 , 0x03 , 0x30 , 0x5a , 0x36 , 0x7a , 0xd3 , 0xcc , 0x02 , 0xd5 , 0xb4 , 0x02 , 0xb1 , 0x2c , 0x02 , 0x6e , 0x06 , 0xac , 0x94 , 0xbd , 0xe2 , 0x8c , 0xd6 , 0x08 },
768
+ };
769
+
770
+ static const unsigned char C_bytes [13 ][33 ] = {
771
+ {0x02 , 0x85 , 0xb8 , 0x26 , 0xc8 , 0xdd , 0x17 , 0x58 , 0x05 , 0x90 , 0x19 , 0x06 , 0xb6 , 0xc9 , 0xb4 , 0x14 , 0x0a , 0x30 , 0xcb , 0xcc , 0x94 , 0xc6 , 0xe7 , 0xdc , 0xf3 , 0x64 , 0x76 , 0x03 , 0x8b , 0xf9 , 0x0d , 0x47 , 0x18 },
772
+ {0x03 , 0xaf , 0x1b , 0xc1 , 0x4b , 0x38 , 0x4e , 0xda , 0x28 , 0x39 , 0x8d , 0xf6 , 0xa7 , 0x90 , 0x0e , 0x56 , 0x7c , 0x5b , 0x6f , 0x66 , 0x13 , 0xca , 0xfc , 0xe5 , 0x02 , 0x7b , 0x98 , 0xbe , 0x01 , 0x52 , 0x86 , 0xf7 , 0x1b },
773
+ {0x03 , 0xd9 , 0xa9 , 0x86 , 0x24 , 0xc0 , 0xc7 , 0x4f , 0xc7 , 0xee , 0xbd , 0x39 , 0xed , 0x84 , 0x17 , 0x5f , 0x80 , 0xd0 , 0x3c , 0x77 , 0x49 , 0x08 , 0xe7 , 0x5c , 0xa7 , 0x37 , 0xa0 , 0x74 , 0x5d , 0x1c , 0x64 , 0xe2 , 0x0a },
774
+ {0 },
775
+ {0 },
776
+ {0 },
777
+ {0x02 , 0x1c , 0xb8 , 0x11 , 0x21 , 0xa0 , 0x0f , 0x89 , 0x76 , 0x99 , 0x03 , 0x30 , 0x5a , 0x36 , 0x7a , 0xd3 , 0xcc , 0x02 , 0xd5 , 0xb4 , 0x02 , 0xb1 , 0x2c , 0x02 , 0x6e , 0x06 , 0xac , 0x94 , 0xbd , 0xe2 , 0x8c , 0xd6 , 0x08 },
778
+ {0x03 , 0xd9 , 0xa9 , 0x86 , 0x24 , 0xc0 , 0xc7 , 0x4f , 0xc7 , 0xee , 0xbd , 0x39 , 0xed , 0x84 , 0x17 , 0x5f , 0x80 , 0xd0 , 0x3c , 0x77 , 0x49 , 0x08 , 0xe7 , 0x5c , 0xa7 , 0x37 , 0xa0 , 0x74 , 0x5d , 0x1c , 0x64 , 0xe2 , 0x0a },
779
+ {0x03 , 0x61 , 0x14 , 0x10 , 0x56 , 0x1c , 0x35 , 0xda , 0xe1 , 0x31 , 0x35 , 0xe4 , 0xad , 0x80 , 0x94 , 0xba , 0xac , 0x9b , 0xbc , 0xf2 , 0xf4 , 0xe1 , 0x84 , 0x98 , 0x18 , 0x1a , 0x8f , 0xf8 , 0xa6 , 0xd4 , 0x3b , 0xe9 , 0xd9 },
780
+ {0x02 , 0x1c , 0xb8 , 0x11 , 0x21 , 0xa0 , 0x0f , 0x89 , 0x76 , 0x99 , 0x03 , 0x30 , 0x5a , 0x36 , 0x7a , 0xd3 , 0xcc , 0x02 , 0xd5 , 0xb4 , 0x02 , 0xb1 , 0x2c , 0x02 , 0x6e , 0x06 , 0xac , 0x94 , 0xbd , 0xe2 , 0x8c , 0xd6 , 0x08 },
781
+ {0x03 , 0x61 , 0x14 , 0x10 , 0x56 , 0x1c , 0x35 , 0xda , 0xe1 , 0x31 , 0x35 , 0xe4 , 0xad , 0x80 , 0x94 , 0xba , 0xac , 0x9b , 0xbc , 0xf2 , 0xf4 , 0xe1 , 0x84 , 0x98 , 0x18 , 0x1a , 0x8f , 0xf8 , 0xa6 , 0xd4 , 0x3b , 0xe9 , 0xd9 },
782
+ {0x03 , 0xd9 , 0xa9 , 0x86 , 0x24 , 0xc0 , 0xc7 , 0x4f , 0xc7 , 0xee , 0xbd , 0x39 , 0xed , 0x84 , 0x17 , 0x5f , 0x80 , 0xd0 , 0x3c , 0x77 , 0x49 , 0x08 , 0xe7 , 0x5c , 0xa7 , 0x37 , 0xa0 , 0x74 , 0x5d , 0x1c , 0x64 , 0xe2 , 0x0a },
783
+ {0x03 , 0xd9 , 0xa9 , 0x86 , 0x24 , 0xc0 , 0xc7 , 0x4f , 0xc7 , 0xee , 0xbd , 0x39 , 0xed , 0x84 , 0x17 , 0x5f , 0x80 , 0xd0 , 0x3c , 0x77 , 0x49 , 0x08 , 0xe7 , 0x5c , 0xa7 , 0x37 , 0xa0 , 0x74 , 0x5d , 0x1c , 0x64 , 0xe2 , 0x0a },
784
+ };
785
+
786
+ static const unsigned char auxrand_bytes [6 ][32 ] = {
787
+ {0xc8 , 0xd7 , 0x05 , 0x6a , 0xbd , 0x47 , 0x26 , 0xeb , 0x5a , 0x0f , 0x19 , 0x87 , 0x40 , 0xaf , 0x14 , 0xd6 , 0xc1 , 0xf0 , 0xc1 , 0x6e , 0x5d , 0x7a , 0x37 , 0xea , 0xec , 0x62 , 0x1b , 0x66 , 0x1e , 0x66 , 0x9a , 0xc4 },
788
+ {0x02 , 0xa7 , 0xb2 , 0xe2 , 0xf5 , 0xa5 , 0xe9 , 0xb1 , 0x07 , 0x8d , 0xbb , 0x16 , 0x05 , 0x02 , 0xa3 , 0x24 , 0x91 , 0xfe , 0x80 , 0xa0 , 0x91 , 0xe9 , 0x1d , 0xd9 , 0x2c , 0xf7 , 0x7b , 0x0b , 0x7d , 0x90 , 0x97 , 0x0f },
789
+ {0xd3 , 0x84 , 0x66 , 0xb7 , 0x74 , 0x84 , 0x15 , 0x4a , 0x3f , 0xcb , 0x31 , 0x51 , 0x09 , 0x4c , 0x1c , 0x8a , 0x84 , 0x5c , 0x73 , 0xa3 , 0xc0 , 0x36 , 0xb3 , 0xa8 , 0xeb , 0xff , 0xd8 , 0xef , 0x62 , 0xc9 , 0x04 , 0x7f },
790
+ {0xd3 , 0x84 , 0x66 , 0xb7 , 0x74 , 0x84 , 0x15 , 0x4a , 0x3f , 0xcb , 0x31 , 0x51 , 0x09 , 0x4c , 0x1c , 0x8a , 0x84 , 0x5c , 0x73 , 0xa3 , 0xc0 , 0x36 , 0xb3 , 0xa8 , 0xeb , 0xff , 0xd8 , 0xef , 0x62 , 0xc9 , 0x04 , 0x7f },
791
+ {0xd3 , 0x84 , 0x66 , 0xb7 , 0x74 , 0x84 , 0x15 , 0x4a , 0x3f , 0xcb , 0x31 , 0x51 , 0x09 , 0x4c , 0x1c , 0x8a , 0x84 , 0x5c , 0x73 , 0xa3 , 0xc0 , 0x36 , 0xb3 , 0xa8 , 0xeb , 0xff , 0xd8 , 0xef , 0x62 , 0xc9 , 0x04 , 0x7f },
792
+ {0xd3 , 0x84 , 0x66 , 0xb7 , 0x74 , 0x84 , 0x15 , 0x4a , 0x3f , 0xcb , 0x31 , 0x51 , 0x09 , 0x4c , 0x1c , 0x8a , 0x84 , 0x5c , 0x73 , 0xa3 , 0xc0 , 0x36 , 0xb3 , 0xa8 , 0xeb , 0xff , 0xd8 , 0xef , 0x62 , 0xc9 , 0x04 , 0x7f },
793
+ };
794
+
795
+ static const unsigned char msg_bytes [13 ][32 ] = {
796
+ {0 },
797
+ {0x35 , 0x84 , 0x1c , 0xa5 , 0x32 , 0x84 , 0x6e , 0x1c , 0xdd , 0x23 , 0xa3 , 0xd1 , 0x07 , 0x82 , 0x43 , 0x43 , 0x58 , 0x4f , 0x88 , 0xef , 0xf5 , 0x80 , 0x92 , 0x94 , 0x69 , 0x86 , 0x5e , 0xae , 0x83 , 0x55 , 0xee , 0x3c },
798
+ {0x22 , 0x61 , 0x6b , 0xb5 , 0xfb , 0x2d , 0x7c , 0x68 , 0x27 , 0x0f , 0x30 , 0x51 , 0x22 , 0xf2 , 0xa0 , 0x9e , 0x83 , 0x32 , 0x39 , 0xc4 , 0xb1 , 0xc9 , 0xa0 , 0x4e , 0x28 , 0x51 , 0x19 , 0xfb , 0x60 , 0x6a , 0xc7 , 0x94 },
799
+ {0 },
800
+ {0 },
801
+ {0 },
802
+ {0x22 , 0x61 , 0x6b , 0xb5 , 0xfb , 0x2d , 0x7c , 0x68 , 0x27 , 0x0f , 0x30 , 0x51 , 0x22 , 0xf2 , 0xa0 , 0x9e , 0x83 , 0x32 , 0x39 , 0xc4 , 0xb1 , 0xc9 , 0xa0 , 0x4e , 0x28 , 0x51 , 0x19 , 0xfb , 0x60 , 0x6a , 0xc7 , 0x94 },
803
+ {0x22 , 0x61 , 0x6b , 0xb5 , 0xfb , 0x2d , 0x7c , 0x68 , 0x27 , 0x0f , 0x30 , 0x51 , 0x22 , 0xf2 , 0xa0 , 0x9e , 0x83 , 0x32 , 0x39 , 0xc4 , 0xb1 , 0xc9 , 0xa0 , 0x4e , 0x28 , 0x51 , 0x19 , 0xfb , 0x60 , 0x6a , 0xc7 , 0x94 },
804
+ {0x22 , 0x61 , 0x6b , 0xb5 , 0xfb , 0x2d , 0x7c , 0x68 , 0x27 , 0x0f , 0x30 , 0x51 , 0x22 , 0xf2 , 0xa0 , 0x9e , 0x83 , 0x32 , 0x39 , 0xc4 , 0xb1 , 0xc9 , 0xa0 , 0x4e , 0x28 , 0x51 , 0x19 , 0xfb , 0x60 , 0x6a , 0xc7 , 0x94 },
805
+ {0x22 , 0x61 , 0x6b , 0xb5 , 0xfb , 0x2d , 0x7c , 0x68 , 0x27 , 0x0f , 0x30 , 0x51 , 0x22 , 0xf2 , 0xa0 , 0x9e , 0x83 , 0x32 , 0x39 , 0xc4 , 0xb1 , 0xc9 , 0xa0 , 0x4e , 0x28 , 0x51 , 0x19 , 0xfb , 0x60 , 0x6a , 0xc7 , 0x94 },
806
+ {0x22 , 0x61 , 0x6b , 0xb5 , 0xfb , 0x2d , 0x7c , 0x68 , 0x27 , 0x0f , 0x30 , 0x51 , 0x22 , 0xf2 , 0xa0 , 0x9e , 0x83 , 0x32 , 0x39 , 0xc4 , 0xb1 , 0xc9 , 0xa0 , 0x4e , 0x28 , 0x51 , 0x19 , 0xfb , 0x60 , 0x6a , 0xc7 , 0x94 },
807
+ {0x22 , 0x61 , 0x6b , 0xb5 , 0xfb , 0x2d , 0x7c , 0x68 , 0x27 , 0x0f , 0x30 , 0x51 , 0x22 , 0xf2 , 0xa0 , 0x9e , 0x83 , 0x32 , 0x39 , 0xc4 , 0xb1 , 0xc9 , 0xa0 , 0x4e , 0x28 , 0x51 , 0x19 , 0xfb , 0x60 , 0x6a , 0xc7 , 0x94 },
808
+ {0x22 , 0x61 , 0x6b , 0xb5 , 0xfb , 0x2d , 0x7c , 0x68 , 0x27 , 0x0f , 0x30 , 0x51 , 0x22 , 0xf2 , 0xa0 , 0x9e , 0x83 , 0x32 , 0x39 , 0x84 , 0xb1 , 0xc9 , 0xa0 , 0x4e , 0x28 , 0x51 , 0x19 , 0xfb , 0x60 , 0x6a , 0xc7 , 0x94 },
809
+ };
810
+
811
+ static const unsigned char proof_bytes [13 ][64 ] = {
812
+ {0x50 , 0x35 , 0x62 , 0xd3 , 0x69 , 0x10 , 0xcd , 0x2d , 0x61 , 0xa4 , 0xd0 , 0x7c , 0x8f , 0xf6 , 0x80 , 0x26 , 0x5c , 0x71 , 0x3e , 0x63 , 0xdd , 0xe0 , 0xdc , 0xb8 , 0x8e , 0x6e , 0xa3 , 0xc5 , 0x85 , 0x97 , 0xbd , 0xc0 , 0x5b , 0x86 , 0xdb , 0x9a , 0xf9 , 0x5e , 0xcc , 0xc4 , 0x75 , 0xce , 0x21 , 0x77 , 0xf9 , 0x41 , 0xc1 , 0x18 , 0xfe , 0xfe , 0xd2 , 0x02 , 0x27 , 0xd4 , 0xce , 0x8c , 0xe9 , 0x55 , 0x7c , 0xb0 , 0x08 , 0x75 , 0x8d , 0xe6 },
813
+ {0x50 , 0xae , 0x4f , 0xf8 , 0x0a , 0x6b , 0x33 , 0x92 , 0x53 , 0xf6 , 0x9f , 0x5e , 0xb6 , 0xfd , 0x9d , 0x01 , 0x3d , 0xc9 , 0xa0 , 0x2a , 0xef , 0x00 , 0x1c , 0xec , 0x08 , 0xc4 , 0x86 , 0x38 , 0xc7 , 0x2b , 0xee , 0x5a , 0x13 , 0x7d , 0x15 , 0x0e , 0x0b , 0xb4 , 0xde , 0x81 , 0xb6 , 0x75 , 0x82 , 0xa9 , 0x92 , 0x91 , 0x0d , 0x94 , 0xdf , 0x80 , 0xd2 , 0xf5 , 0x37 , 0x49 , 0x12 , 0x70 , 0x02 , 0x6a , 0x90 , 0xb5 , 0x6e , 0xc2 , 0xb1 , 0x28 },
814
+ {0xbc , 0xe6 , 0xdf , 0xda , 0x12 , 0xaf , 0x1b , 0x86 , 0xc1 , 0xcf , 0x6c , 0x1e , 0xd6 , 0x27 , 0x05 , 0x32 , 0x24 , 0xb6 , 0xc7 , 0x81 , 0x75 , 0xed , 0xda , 0xdb , 0xe0 , 0x1e , 0xad , 0x83 , 0x6b , 0xb7 , 0x77 , 0x21 , 0x01 , 0xcb , 0x33 , 0x0a , 0x91 , 0xef , 0x06 , 0xa3 , 0xf6 , 0x3f , 0x82 , 0x54 , 0xc1 , 0xac , 0x5b , 0x76 , 0xe3 , 0x12 , 0xd9 , 0xda , 0xda , 0x45 , 0x84 , 0x1e , 0xa6 , 0xa9 , 0xb4 , 0x43 , 0x73 , 0x81 , 0x99 , 0x39 },
815
+ {0 },
816
+ {0 },
817
+ {0 },
818
+ {0xbc , 0xe6 , 0xdf , 0xda , 0x12 , 0xaf , 0x1b , 0x86 , 0xc1 , 0xcf , 0x6c , 0x1e , 0xd6 , 0x27 , 0x05 , 0x32 , 0x24 , 0xb6 , 0xc7 , 0x81 , 0x75 , 0xed , 0xda , 0xdb , 0xe0 , 0x1e , 0xad , 0x83 , 0x6b , 0xb7 , 0x77 , 0x21 , 0x01 , 0xcb , 0x33 , 0x0a , 0x91 , 0xef , 0x06 , 0xa3 , 0xf6 , 0x3f , 0x82 , 0x54 , 0xc1 , 0xac , 0x5b , 0x76 , 0xe3 , 0x12 , 0xd9 , 0xda , 0xda , 0x45 , 0x84 , 0x1e , 0xa6 , 0xa9 , 0xb4 , 0x43 , 0x73 , 0x81 , 0x99 , 0x39 },
819
+ {0xbc , 0xe6 , 0xdf , 0xda , 0x12 , 0xaf , 0x1b , 0x86 , 0xc1 , 0xcf , 0x6c , 0x1e , 0xd6 , 0x27 , 0x05 , 0x32 , 0x24 , 0xb6 , 0xc7 , 0x81 , 0x75 , 0xed , 0xda , 0xdb , 0xe0 , 0x1e , 0xad , 0x83 , 0x6b , 0xb7 , 0x77 , 0x21 , 0x01 , 0xcb , 0x33 , 0x0a , 0x91 , 0xef , 0x06 , 0xa3 , 0xf6 , 0x3f , 0x82 , 0x54 , 0xc1 , 0xac , 0x5b , 0x76 , 0xe3 , 0x12 , 0xd9 , 0xda , 0xda , 0x45 , 0x84 , 0x1e , 0xa6 , 0xa9 , 0xb4 , 0x43 , 0x73 , 0x81 , 0x99 , 0x39 },
820
+ {0xbc , 0xe6 , 0xdf , 0xda , 0x12 , 0xaf , 0x1b , 0x86 , 0xc1 , 0xcf , 0x6c , 0x1e , 0xd6 , 0x27 , 0x05 , 0x32 , 0x24 , 0xb6 , 0xc7 , 0x81 , 0x75 , 0xed , 0xda , 0xdb , 0xe0 , 0x1e , 0xad , 0x83 , 0x6b , 0xb7 , 0x77 , 0x21 , 0x01 , 0xcb , 0x33 , 0x0a , 0x91 , 0xef , 0x06 , 0xa3 , 0xf6 , 0x3f , 0x82 , 0x54 , 0xc1 , 0xac , 0x5b , 0x76 , 0xe3 , 0x12 , 0xd9 , 0xda , 0xda , 0x45 , 0x84 , 0x1e , 0xa6 , 0xa9 , 0xb4 , 0x43 , 0x73 , 0x81 , 0x99 , 0x39 },
821
+ {0xbc , 0xe6 , 0xdf , 0xda , 0x12 , 0xaf , 0x1b , 0x86 , 0xc1 , 0xcf , 0x6c , 0x1e , 0xd6 , 0x27 , 0x05 , 0x32 , 0x24 , 0xb6 , 0xc7 , 0x81 , 0x75 , 0xed , 0xda , 0xdb , 0xe0 , 0x1e , 0xad , 0x83 , 0x6b , 0xb7 , 0x77 , 0x21 , 0x01 , 0xcb , 0x33 , 0x0a , 0x91 , 0xef , 0x06 , 0xa3 , 0xf6 , 0x3f , 0x82 , 0x54 , 0xc1 , 0xac , 0x5b , 0x76 , 0xe3 , 0x12 , 0xd9 , 0xda , 0xda , 0x45 , 0x84 , 0x1e , 0xa6 , 0xa9 , 0xb4 , 0x43 , 0x73 , 0x81 , 0x99 , 0x39 },
822
+ {0xbc , 0xe6 , 0xdf , 0xda , 0x12 , 0xaf , 0x1b , 0x86 , 0xc1 , 0xcf , 0x6c , 0x1e , 0xd6 , 0x27 , 0x05 , 0x32 , 0x24 , 0xb6 , 0xc7 , 0x81 , 0x75 , 0xed , 0xda , 0xdb , 0xe0 , 0x1e , 0xad , 0x83 , 0x6b , 0xb7 , 0x77 , 0x21 , 0x01 , 0xcb , 0x33 , 0x0a , 0x91 , 0xef , 0x06 , 0xa3 , 0xf6 , 0x3f , 0x82 , 0x54 , 0xc1 , 0xac , 0x5b , 0x76 , 0xe3 , 0x12 , 0xd9 , 0xda , 0xda , 0x45 , 0x84 , 0x1e , 0xa6 , 0xa9 , 0xb4 , 0x43 , 0x73 , 0x81 , 0x99 , 0x39 },
823
+ {0xbc , 0xe6 , 0xdf , 0xda , 0x12 , 0xaf , 0x1b , 0x86 , 0xc1 , 0xcf , 0x6c , 0x1e , 0xd6 , 0x27 , 0x05 , 0x32 , 0x24 , 0xb6 , 0xc7 , 0x85 , 0x75 , 0xed , 0xda , 0xdb , 0xe0 , 0x1e , 0xad , 0x83 , 0x6b , 0xb7 , 0x77 , 0x21 , 0x01 , 0xcb , 0x33 , 0x0a , 0x91 , 0xef , 0x06 , 0xa3 , 0xf6 , 0x3f , 0x82 , 0x54 , 0xc1 , 0xac , 0x5b , 0x76 , 0xe3 , 0x12 , 0xd9 , 0xda , 0xda , 0x45 , 0x84 , 0x1e , 0xa6 , 0xa9 , 0xb4 , 0x43 , 0x73 , 0x81 , 0x99 , 0x39 },
824
+ {0xbc , 0xe6 , 0xdf , 0xda , 0x12 , 0xaf , 0x1b , 0x86 , 0xc1 , 0xcf , 0x6c , 0x1e , 0xd6 , 0x27 , 0x05 , 0x32 , 0x24 , 0xb6 , 0xc7 , 0x81 , 0x75 , 0xed , 0xda , 0xdb , 0xe0 , 0x1e , 0xad , 0x83 , 0x6b , 0xb7 , 0x77 , 0x21 , 0x01 , 0xcb , 0x33 , 0x0a , 0x91 , 0xef , 0x06 , 0xa3 , 0xf6 , 0x3f , 0x82 , 0x54 , 0xc1 , 0xac , 0x5b , 0x76 , 0xe3 , 0x12 , 0xd9 , 0xda , 0xda , 0x45 , 0x84 , 0x1e , 0xa6 , 0xa9 , 0xb4 , 0x43 , 0x73 , 0x81 , 0x99 , 0x39 },
825
+ };
826
+
827
+ static const int success [13 ] = {1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };
828
+
829
+ static unsigned char zero_array [32 ] = {0x00 };
830
+
831
+ /* Helper function to check if given array is NOT equivalent to all zero array.
832
+ * Used to detect test vectors where zero array can represent:
833
+ * B_bytes at infinity
834
+ * Empty optional msg_bytes
835
+ * */
836
+ int is_not_empty (const unsigned char * arr ){
837
+ return (memcmp (arr , zero_array , 32 ) != 0 );
838
+ }
839
+
840
+ static void test_dleq_bip_vectors (void ) {
841
+ secp256k1_scalar a , s , e ;
842
+ secp256k1_ge A ;
843
+ secp256k1_ge B ;
844
+ secp256k1_ge C ;
845
+ int i ;
846
+
847
+ /* bip-0374/test_vectors_generate_proof.csv*/
848
+ for (i = 0 ; i < 6 ; ++ i ) {
849
+ int ret = 1 ;
850
+ const unsigned char * m = NULL ;
851
+ secp256k1_ge_set_infinity (& B );
852
+ if (i > 2 ) ret = 0 ;
853
+
854
+ secp256k1_scalar_set_b32 (& a , a_bytes [i ], NULL );
855
+ if (is_not_empty (B_bytes [i ])) {
856
+ CHECK (secp256k1_eckey_pubkey_parse (& B , B_bytes [i ], 33 ) == 1 );
857
+ }
858
+
859
+ secp256k1_dleq_pair (& CTX -> ecmult_gen_ctx , & A , & C , & a , & B );
860
+
861
+ if (is_not_empty (msg_bytes [i ])) {
862
+ m = msg_bytes [i ];
863
+ }
864
+ CHECK (secp256k1_dleq_prove (CTX , & s , & e , & a , & B , & A , & C , (unsigned char * )(auxrand_bytes [i ]), m ) == ret );
865
+
866
+ if (ret ) {
867
+ unsigned char proof [64 ];
868
+ secp256k1_scalar_get_b32 (proof , & e );
869
+ secp256k1_scalar_get_b32 (proof + 32 , & s );
870
+ CHECK (memcmp (proof , proof_bytes [i ], 64 ) == 0 );
871
+ CHECK (secp256k1_dleq_verify (& s , & e , & A , & B , & C , m ) == 1 );
872
+ }
873
+ }
874
+
875
+ /* bip-0374/test_vectors_verify_proof.csv*/
876
+ for (i = 0 ; i < 13 ; ++ i ) {
877
+ const unsigned char * m = NULL ;
878
+
879
+ if (i > 2 && i < 6 ) {
880
+ /* skip invalid test cases which are not present in test_vectors_verify_proof.csv */
881
+ continue ;
882
+ }
883
+ secp256k1_scalar_set_b32 (& e , proof_bytes [i ], NULL );
884
+ secp256k1_scalar_set_b32 (& s , proof_bytes [i ] + 32 , NULL );
885
+
886
+ CHECK (secp256k1_eckey_pubkey_parse (& A , A_bytes [i ], 33 ) == 1 );
887
+ CHECK (secp256k1_eckey_pubkey_parse (& B , B_bytes [i ], 33 ) == 1 );
888
+ CHECK (secp256k1_eckey_pubkey_parse (& C , C_bytes [i ], 33 ) == 1 );
889
+
890
+ if (is_not_empty (msg_bytes [i ])) {
891
+ m = msg_bytes [i ];
892
+ }
893
+ CHECK (secp256k1_dleq_verify (& s , & e , & A , & B , & C , m ) == success [i ]);
894
+ }
895
+ }
896
+
724
897
void run_silentpayments_tests (void ) {
725
898
test_recipient_sort ();
726
899
test_send_api ();
727
900
test_label_api ();
728
901
test_recipient_api ();
729
902
run_silentpayments_test_vectors ();
730
903
dleq_tests ();
904
+ test_dleq_bip_vectors ();
731
905
}
732
906
733
907
#endif
0 commit comments