1
- use bls12_381:: G2Projective ;
1
+ use bls12_381:: {
2
+ hash_to_curve:: { ExpandMsgXmd , HashToCurve } ,
3
+ G2Affine , G2Projective ,
4
+ } ;
5
+ use hex_literal:: hex;
6
+ use sha2:: Sha256 ;
2
7
3
- // test vectors from the draft 10 RFC
4
- #[ test]
5
- fn test_encode_to_curve_10 ( ) {
6
- use bls12_381:: {
7
- hash_to_curve:: { ExpandMsgXmd , HashToCurve } ,
8
- G2Affine ,
9
- } ;
10
- use std:: string:: { String , ToString } ;
8
+ struct TestCase {
9
+ msg : & ' static [ u8 ] ,
10
+ dst : & ' static [ u8 ] ,
11
+ expected : & ' static [ u8 ] ,
12
+ }
11
13
12
- struct TestCase {
13
- msg : & ' static [ u8 ] ,
14
- expected : [ & ' static str ; 4 ] ,
15
- }
16
- impl TestCase {
17
- fn expected ( & self ) -> String {
18
- self . expected [ 0 ] . to_string ( ) + self . expected [ 1 ] + self . expected [ 2 ] + self . expected [ 3 ]
14
+ impl TestCase {
15
+ pub fn check_output ( & self , output : & [ u8 ] ) {
16
+ if output != self . expected {
17
+ panic ! (
18
+ "Test vector result mismatch.\n \
19
+ Message: {:x?}\n \
20
+ DST: {:x?}\n \
21
+ Expected: {:x?}\n \
22
+ Found: {:x?}",
23
+ self . msg, self . dst, self . expected, output
24
+ )
19
25
}
20
26
}
27
+ }
21
28
22
- const DOMAIN : & [ u8 ] = b"QUUX-V01-CS02-with-BLS12381G2_XMD:SHA-256_SSWU_NU_" ;
29
+ // From <https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-hash-to-curve-16#appendix-J.10.2>
30
+ #[ test]
31
+ fn encode_to_curve_works_for_draft16_testvectors_g2_sha256_nu ( ) {
32
+ let dst = b"QUUX-V01-CS02-with-BLS12381G2_XMD:SHA-256_SSWU_NU_" ;
23
33
24
34
let cases = vec ! [
25
35
TestCase {
26
36
msg: b"" ,
27
- expected: [
28
- "126b855e9e69b1f691f816e48ac6977664d24d99f8724868a184186469ddfd4617367e94527d4b74fc86413483afb35b" ,
29
- "00e7f4568a82b4b7dc1f14c6aaa055edf51502319c723c4dc2688c7fe5944c213f510328082396515734b6612c4e7bb7" ,
30
- "1498aadcf7ae2b345243e281ae076df6de84455d766ab6fcdaad71fab60abb2e8b980a440043cd305db09d283c895e3d" ,
31
- "0caead0fd7b6176c01436833c79d305c78be307da5f6af6c133c47311def6ff1e0babf57a0fb5539fce7ee12407b0a42" ,
32
- ] ,
37
+ dst,
38
+ expected: & hex!(
39
+ "126b855e9e69b1f691f816e48ac6977664d24d99f8724868a184186469ddfd4617367e94527d4b74fc86413483afb35b
40
+ 00e7f4568a82b4b7dc1f14c6aaa055edf51502319c723c4dc2688c7fe5944c213f510328082396515734b6612c4e7bb7
41
+ 1498aadcf7ae2b345243e281ae076df6de84455d766ab6fcdaad71fab60abb2e8b980a440043cd305db09d283c895e3d
42
+ 0caead0fd7b6176c01436833c79d305c78be307da5f6af6c133c47311def6ff1e0babf57a0fb5539fce7ee12407b0a42"
43
+ ) ,
33
44
} ,
34
45
TestCase {
35
46
msg: b"abc" ,
36
- expected: [
37
- "0296238ea82c6d4adb3c838ee3cb2346049c90b96d602d7bb1b469b905c9228be25c627bffee872def773d5b2a2eb57d" ,
38
- "108ed59fd9fae381abfd1d6bce2fd2fa220990f0f837fa30e0f27914ed6e1454db0d1ee957b219f61da6ff8be0d6441f" ,
39
- "153606c417e59fb331b7ae6bce4fbf7c5190c33ce9402b5ebe2b70e44fca614f3f1382a3625ed5493843d0b0a652fc3f" ,
40
- "033f90f6057aadacae7963b0a0b379dd46750c1c94a6357c99b65f63b79e321ff50fe3053330911c56b6ceea08fee656" ,
41
- ] ,
47
+ dst,
48
+ expected: & hex!(
49
+ "0296238ea82c6d4adb3c838ee3cb2346049c90b96d602d7bb1b469b905c9228be25c627bffee872def773d5b2a2eb57d
50
+ 108ed59fd9fae381abfd1d6bce2fd2fa220990f0f837fa30e0f27914ed6e1454db0d1ee957b219f61da6ff8be0d6441f
51
+ 153606c417e59fb331b7ae6bce4fbf7c5190c33ce9402b5ebe2b70e44fca614f3f1382a3625ed5493843d0b0a652fc3f
52
+ 033f90f6057aadacae7963b0a0b379dd46750c1c94a6357c99b65f63b79e321ff50fe3053330911c56b6ceea08fee656"
53
+ ) ,
42
54
} ,
43
55
TestCase {
44
56
msg: b"abcdef0123456789" ,
45
- expected: [
46
- "0da75be60fb6aa0e9e3143e40c42796edf15685cafe0279afd2a67c3dff1c82341f17effd402e4f1af240ea90f4b659b" ,
47
- "038af300ef34c7759a6caaa4e69363cafeed218a1f207e93b2c70d91a1263d375d6730bd6b6509dcac3ba5b567e85bf3" ,
48
- "0492f4fed741b073e5a82580f7c663f9b79e036b70ab3e51162359cec4e77c78086fe879b65ca7a47d34374c8315ac5e" ,
49
- "19b148cbdf163cf0894f29660d2e7bfb2b68e37d54cc83fd4e6e62c020eaa48709302ef8e746736c0e19342cc1ce3df4" ,
50
- ]
57
+ dst,
58
+ expected: & hex!(
59
+ "0da75be60fb6aa0e9e3143e40c42796edf15685cafe0279afd2a67c3dff1c82341f17effd402e4f1af240ea90f4b659b
60
+ 038af300ef34c7759a6caaa4e69363cafeed218a1f207e93b2c70d91a1263d375d6730bd6b6509dcac3ba5b567e85bf3
61
+ 0492f4fed741b073e5a82580f7c663f9b79e036b70ab3e51162359cec4e77c78086fe879b65ca7a47d34374c8315ac5e
62
+ 19b148cbdf163cf0894f29660d2e7bfb2b68e37d54cc83fd4e6e62c020eaa48709302ef8e746736c0e19342cc1ce3df4"
63
+ ) ,
51
64
} ,
52
65
TestCase {
53
66
msg: b"q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\
54
67
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\
55
68
qqqqqqqqqqqqqqqqqqqqqqqqq",
56
- expected: [
57
- "12c8c05c1d5fc7bfa847f4d7d81e294e66b9a78bc9953990c358945e1f042eedafce608b67fdd3ab0cb2e6e263b9b1ad" ,
58
- "0c5ae723be00e6c3f0efe184fdc0702b64588fe77dda152ab13099a3bacd3876767fa7bbad6d6fd90b3642e902b208f9" ,
59
- "11c624c56dbe154d759d021eec60fab3d8b852395a89de497e48504366feedd4662d023af447d66926a28076813dd646" ,
60
- "04e77ddb3ede41b5ec4396b7421dd916efc68a358a0d7425bddd253547f2fb4830522358491827265dfc5bcc1928a569" ,
61
- ]
69
+ dst,
70
+ expected: & hex!(
71
+ "12c8c05c1d5fc7bfa847f4d7d81e294e66b9a78bc9953990c358945e1f042eedafce608b67fdd3ab0cb2e6e263b9b1ad
72
+ 0c5ae723be00e6c3f0efe184fdc0702b64588fe77dda152ab13099a3bacd3876767fa7bbad6d6fd90b3642e902b208f9
73
+ 11c624c56dbe154d759d021eec60fab3d8b852395a89de497e48504366feedd4662d023af447d66926a28076813dd646
74
+ 04e77ddb3ede41b5ec4396b7421dd916efc68a358a0d7425bddd253547f2fb4830522358491827265dfc5bcc1928a569"
75
+ ) ,
62
76
} ,
63
77
TestCase {
64
78
msg: b"a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
@@ -71,84 +85,74 @@ fn test_encode_to_curve_10() {
71
85
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
72
86
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
73
87
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
74
- expected: [
75
- "1565c2f625032d232f13121d3cfb476f45275c303a037faa255f9da62000c2c864ea881e2bcddd111edc4a3c0da3e88d" ,
76
- "0ea4e7c33d43e17cc516a72f76437c4bf81d8f4eac69ac355d3bf9b71b8138d55dc10fd458be115afa798b55dac34be1" ,
77
- "0f8991d2a1ad662e7b6f58ab787947f1fa607fce12dde171bc17903b012091b657e15333e11701edcf5b63ba2a561247" ,
78
- "043b6f5fe4e52c839148dc66f2b3751e69a0f6ebb3d056d6465d50d4108543ecd956e10fa1640dfd9bc0030cc2558d28" ,
79
- ]
80
- }
88
+ dst,
89
+ expected: & hex!(
90
+ "1565c2f625032d232f13121d3cfb476f45275c303a037faa255f9da62000c2c864ea881e2bcddd111edc4a3c0da3e88d
91
+ 0ea4e7c33d43e17cc516a72f76437c4bf81d8f4eac69ac355d3bf9b71b8138d55dc10fd458be115afa798b55dac34be1
92
+ 0f8991d2a1ad662e7b6f58ab787947f1fa607fce12dde171bc17903b012091b657e15333e11701edcf5b63ba2a561247
93
+ 043b6f5fe4e52c839148dc66f2b3751e69a0f6ebb3d056d6465d50d4108543ecd956e10fa1640dfd9bc0030cc2558d28"
94
+ ) ,
95
+ } ,
81
96
] ;
82
97
83
98
for case in cases {
84
- let g = <G2Projective as HashToCurve < ExpandMsgXmd < sha2:: Sha256 > > >:: encode_to_curve (
85
- & case. msg , DOMAIN ,
99
+ let g = <G2Projective as HashToCurve < ExpandMsgXmd < Sha256 > > >:: encode_to_curve (
100
+ [ case. msg ] ,
101
+ case. dst ,
86
102
) ;
87
- let g_uncompressed = G2Affine :: from ( g) . to_uncompressed ( ) ;
88
-
89
- assert_eq ! ( case. expected ( ) , hex :: encode ( & g_uncompressed[ .. ] ) ) ;
103
+ let aff = G2Affine :: from ( g) ;
104
+ let g_uncompressed = aff . to_uncompressed ( ) ;
105
+ case. check_output ( & g_uncompressed) ;
90
106
}
91
107
}
92
108
93
- // test vectors from the draft 10 RFC
109
+ // From <https://datatracker.ietf.org/doc/html/ draft-irtf-cfrg-hash-to-curve-16#appendix-J.10.1>
94
110
#[ test]
95
- fn test_hash_to_curve_10 ( ) {
96
- use bls12_381:: {
97
- hash_to_curve:: { ExpandMsgXmd , HashToCurve } ,
98
- G2Affine ,
99
- } ;
100
- use std:: string:: { String , ToString } ;
101
-
102
- struct TestCase {
103
- msg : & ' static [ u8 ] ,
104
- expected : [ & ' static str ; 4 ] ,
105
- }
106
- impl TestCase {
107
- fn expected ( & self ) -> String {
108
- self . expected [ 0 ] . to_string ( ) + self . expected [ 1 ] + self . expected [ 2 ] + self . expected [ 3 ]
109
- }
110
- }
111
-
112
- const DOMAIN : & [ u8 ] = b"QUUX-V01-CS02-with-BLS12381G2_XMD:SHA-256_SSWU_RO_" ;
111
+ fn hash_to_curve_works_for_draft16_testvectors_g2_sha256_ro ( ) {
112
+ let dst = b"QUUX-V01-CS02-with-BLS12381G2_XMD:SHA-256_SSWU_RO_" ;
113
113
114
114
let cases = vec ! [
115
115
TestCase {
116
116
msg: b"" ,
117
- expected: [
118
- "05cb8437535e20ecffaef7752baddf98034139c38452458baeefab379ba13dff5bf5dd71b72418717047f5b0f37da03d" ,
119
- "0141ebfbdca40eb85b87142e130ab689c673cf60f1a3e98d69335266f30d9b8d4ac44c1038e9dcdd5393faf5c41fb78a" ,
120
- "12424ac32561493f3fe3c260708a12b7c620e7be00099a974e259ddc7d1f6395c3c811cdd19f1e8dbf3e9ecfdcbab8d6" ,
121
- "0503921d7f6a12805e72940b963c0cf3471c7b2a524950ca195d11062ee75ec076daf2d4bc358c4b190c0c98064fdd92" ,
122
- ] ,
117
+ dst,
118
+ expected: & hex!(
119
+ "05cb8437535e20ecffaef7752baddf98034139c38452458baeefab379ba13dff5bf5dd71b72418717047f5b0f37da03d
120
+ 0141ebfbdca40eb85b87142e130ab689c673cf60f1a3e98d69335266f30d9b8d4ac44c1038e9dcdd5393faf5c41fb78a
121
+ 12424ac32561493f3fe3c260708a12b7c620e7be00099a974e259ddc7d1f6395c3c811cdd19f1e8dbf3e9ecfdcbab8d6
122
+ 0503921d7f6a12805e72940b963c0cf3471c7b2a524950ca195d11062ee75ec076daf2d4bc358c4b190c0c98064fdd92"
123
+ ) ,
123
124
} ,
124
125
TestCase {
125
126
msg: b"abc" ,
126
- expected: [
127
- "139cddbccdc5e91b9623efd38c49f81a6f83f175e80b06fc374de9eb4b41dfe4ca3a230ed250fbe3a2acf73a41177fd8" ,
128
- "02c2d18e033b960562aae3cab37a27ce00d80ccd5ba4b7fe0e7a210245129dbec7780ccc7954725f4168aff2787776e6" ,
129
- "00aa65dae3c8d732d10ecd2c50f8a1baf3001578f71c694e03866e9f3d49ac1e1ce70dd94a733534f106d4cec0eddd16" ,
130
- "1787327b68159716a37440985269cf584bcb1e621d3a7202be6ea05c4cfe244aeb197642555a0645fb87bf7466b2ba48" ,
131
- ] ,
127
+ dst,
128
+ expected: & hex!(
129
+ "139cddbccdc5e91b9623efd38c49f81a6f83f175e80b06fc374de9eb4b41dfe4ca3a230ed250fbe3a2acf73a41177fd8
130
+ 02c2d18e033b960562aae3cab37a27ce00d80ccd5ba4b7fe0e7a210245129dbec7780ccc7954725f4168aff2787776e6
131
+ 00aa65dae3c8d732d10ecd2c50f8a1baf3001578f71c694e03866e9f3d49ac1e1ce70dd94a733534f106d4cec0eddd16
132
+ 1787327b68159716a37440985269cf584bcb1e621d3a7202be6ea05c4cfe244aeb197642555a0645fb87bf7466b2ba48"
133
+ ) ,
132
134
} ,
133
135
TestCase {
134
136
msg: b"abcdef0123456789" ,
135
- expected: [
136
- "190d119345b94fbd15497bcba94ecf7db2cbfd1e1fe7da034d26cbba169fb3968288b3fafb265f9ebd380512a71c3f2c" ,
137
- "121982811d2491fde9ba7ed31ef9ca474f0e1501297f68c298e9f4c0028add35aea8bb83d53c08cfc007c1e005723cd0" ,
138
- "0bb5e7572275c567462d91807de765611490205a941a5a6af3b1691bfe596c31225d3aabdf15faff860cb4ef17c7c3be" ,
139
- "05571a0f8d3c08d094576981f4a3b8eda0a8e771fcdcc8ecceaf1356a6acf17574518acb506e435b639353c2e14827c8" ,
140
- ]
137
+ dst,
138
+ expected: & hex!(
139
+ "190d119345b94fbd15497bcba94ecf7db2cbfd1e1fe7da034d26cbba169fb3968288b3fafb265f9ebd380512a71c3f2c
140
+ 121982811d2491fde9ba7ed31ef9ca474f0e1501297f68c298e9f4c0028add35aea8bb83d53c08cfc007c1e005723cd0
141
+ 0bb5e7572275c567462d91807de765611490205a941a5a6af3b1691bfe596c31225d3aabdf15faff860cb4ef17c7c3be
142
+ 05571a0f8d3c08d094576981f4a3b8eda0a8e771fcdcc8ecceaf1356a6acf17574518acb506e435b639353c2e14827c8"
143
+ ) ,
141
144
} ,
142
145
TestCase {
143
146
msg: b"q128_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\
144
147
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\
145
148
qqqqqqqqqqqqqqqqqqqqqqqqq",
146
- expected: [
147
- "0934aba516a52d8ae479939a91998299c76d39cc0c035cd18813bec433f587e2d7a4fef038260eef0cef4d02aae3eb91" ,
148
- "19a84dd7248a1066f737cc34502ee5555bd3c19f2ecdb3c7d9e24dc65d4e25e50d83f0f77105e955d78f4762d33c17da" ,
149
- "09bcccfa036b4847c9950780733633f13619994394c23ff0b32fa6b795844f4a0673e20282d07bc69641cee04f5e5662" ,
150
- "14f81cd421617428bc3b9fe25afbb751d934a00493524bc4e065635b0555084dd54679df1536101b2c979c0152d09192" ,
151
- ]
149
+ dst,
150
+ expected: & hex!(
151
+ "0934aba516a52d8ae479939a91998299c76d39cc0c035cd18813bec433f587e2d7a4fef038260eef0cef4d02aae3eb91
152
+ 19a84dd7248a1066f737cc34502ee5555bd3c19f2ecdb3c7d9e24dc65d4e25e50d83f0f77105e955d78f4762d33c17da
153
+ 09bcccfa036b4847c9950780733633f13619994394c23ff0b32fa6b795844f4a0673e20282d07bc69641cee04f5e5662
154
+ 14f81cd421617428bc3b9fe25afbb751d934a00493524bc4e065635b0555084dd54679df1536101b2c979c0152d09192"
155
+ ) ,
152
156
} ,
153
157
TestCase {
154
158
msg: b"a512_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
@@ -161,21 +165,23 @@ fn test_hash_to_curve_10() {
161
165
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
162
166
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
163
167
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
164
- expected: [
165
- "11fca2ff525572795a801eed17eb12785887c7b63fb77a42be46ce4a34131d71f7a73e95fee3f812aea3de78b4d01569" ,
166
- "01a6ba2f9a11fa5598b2d8ace0fbe0a0eacb65deceb476fbbcb64fd24557c2f4b18ecfc5663e54ae16a84f5ab7f62534" ,
167
- "03a47f8e6d1763ba0cad63d6114c0accbef65707825a511b251a660a9b3994249ae4e63fac38b23da0c398689ee2ab52" ,
168
- "0b6798718c8aed24bc19cb27f866f1c9effcdbf92397ad6448b5c9db90d2b9da6cbabf48adc1adf59a1a28344e79d57e" ,
169
- ]
170
- }
168
+ dst,
169
+ expected: & hex!(
170
+ "11fca2ff525572795a801eed17eb12785887c7b63fb77a42be46ce4a34131d71f7a73e95fee3f812aea3de78b4d01569
171
+ 01a6ba2f9a11fa5598b2d8ace0fbe0a0eacb65deceb476fbbcb64fd24557c2f4b18ecfc5663e54ae16a84f5ab7f62534
172
+ 03a47f8e6d1763ba0cad63d6114c0accbef65707825a511b251a660a9b3994249ae4e63fac38b23da0c398689ee2ab52
173
+ 0b6798718c8aed24bc19cb27f866f1c9effcdbf92397ad6448b5c9db90d2b9da6cbabf48adc1adf59a1a28344e79d57e"
174
+ ) ,
175
+ } ,
171
176
] ;
172
177
173
178
for case in cases {
174
- let g = <G2Projective as HashToCurve < ExpandMsgXmd < sha2:: Sha256 > > >:: hash_to_curve (
175
- & case. msg , DOMAIN ,
179
+ let g = <G2Projective as HashToCurve < ExpandMsgXmd < Sha256 > > >:: hash_to_curve (
180
+ [ case. msg ] ,
181
+ case. dst ,
176
182
) ;
177
- let g_uncompressed = G2Affine :: from ( g) . to_uncompressed ( ) ;
178
-
179
- assert_eq ! ( case. expected ( ) , hex :: encode ( & g_uncompressed[ .. ] ) ) ;
183
+ let aff = G2Affine :: from ( g) ;
184
+ let g_uncompressed = aff . to_uncompressed ( ) ;
185
+ case. check_output ( & g_uncompressed) ;
180
186
}
181
187
}
0 commit comments