@@ -28,7 +28,8 @@ func (f *FieldVal) SetHex(hexString string) *FieldVal {
28
28
hexString = "0" + hexString
29
29
}
30
30
bytes , _ := hex .DecodeString (hexString )
31
- return f .SetByteSlice (bytes )
31
+ f .SetByteSlice (bytes )
32
+ return f
32
33
}
33
34
34
35
// randFieldVal returns a field value created from a random value generated by
@@ -96,6 +97,179 @@ func TestFieldSetInt(t *testing.T) {
96
97
}
97
98
}
98
99
100
+ // TestFieldSetBytes ensures that setting a field value to a 256-bit big-endian
101
+ // unsigned integer via both the slice and array methods works as expected for
102
+ // edge cases. Random cases are tested via the various other tests.
103
+ func TestFieldSetBytes (t * testing.T ) {
104
+ tests := []struct {
105
+ name string // test description
106
+ in string // hex encoded test value
107
+ expected [10 ]uint32 // expected raw ints
108
+ overflow bool // expected overflow result
109
+ }{{
110
+ name : "zero" ,
111
+ in : "00" ,
112
+ expected : [10 ]uint32 {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
113
+ overflow : false ,
114
+ }, {
115
+ name : "field prime" ,
116
+ in : "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f" ,
117
+ expected : [10 ]uint32 {
118
+ 0x03fffc2f , 0x03ffffbf , 0x03ffffff , 0x03ffffff , 0x03ffffff ,
119
+ 0x03ffffff , 0x03ffffff , 0x03ffffff , 0x03ffffff , 0x003fffff ,
120
+ },
121
+ overflow : true ,
122
+ }, {
123
+ name : "field prime - 1" ,
124
+ in : "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e" ,
125
+ expected : [10 ]uint32 {
126
+ 0x03fffc2e , 0x03ffffbf , 0x03ffffff , 0x03ffffff , 0x03ffffff ,
127
+ 0x03ffffff , 0x03ffffff , 0x03ffffff , 0x03ffffff , 0x003fffff ,
128
+ },
129
+ overflow : false ,
130
+ }, {
131
+ name : "field prime + 1 (overflow in word zero)" ,
132
+ in : "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30" ,
133
+ expected : [10 ]uint32 {
134
+ 0x03fffc30 , 0x03ffffbf , 0x03ffffff , 0x03ffffff , 0x03ffffff ,
135
+ 0x03ffffff , 0x03ffffff , 0x03ffffff , 0x03ffffff , 0x003fffff ,
136
+ },
137
+ overflow : true ,
138
+ }, {
139
+ name : "field prime first 32 bits" ,
140
+ in : "fffffc2f" ,
141
+ expected : [10 ]uint32 {
142
+ 0x03fffc2f , 0x00000003f , 0x00000000 , 0x00000000 , 0x00000000 ,
143
+ 0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 ,
144
+ },
145
+ overflow : false ,
146
+ }, {
147
+ name : "field prime word zero" ,
148
+ in : "03fffc2f" ,
149
+ expected : [10 ]uint32 {
150
+ 0x03fffc2f , 0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 ,
151
+ 0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 ,
152
+ },
153
+ overflow : false ,
154
+ }, {
155
+ name : "field prime first 64 bits" ,
156
+ in : "fffffffefffffc2f" ,
157
+ expected : [10 ]uint32 {
158
+ 0x03fffc2f , 0x03ffffbf , 0x00000fff , 0x00000000 , 0x00000000 ,
159
+ 0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 ,
160
+ },
161
+ overflow : false ,
162
+ }, {
163
+ name : "field prime word zero and one" ,
164
+ in : "0ffffefffffc2f" ,
165
+ expected : [10 ]uint32 {
166
+ 0x03fffc2f , 0x03ffffbf , 0x00000000 , 0x00000000 , 0x00000000 ,
167
+ 0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 ,
168
+ },
169
+ overflow : false ,
170
+ }, {
171
+ name : "field prime first 96 bits" ,
172
+ in : "fffffffffffffffefffffc2f" ,
173
+ expected : [10 ]uint32 {
174
+ 0x03fffc2f , 0x03ffffbf , 0x03ffffff , 0x0003ffff , 0x00000000 ,
175
+ 0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 ,
176
+ },
177
+ overflow : false ,
178
+ }, {
179
+ name : "field prime word zero, one, and two" ,
180
+ in : "3ffffffffffefffffc2f" ,
181
+ expected : [10 ]uint32 {
182
+ 0x03fffc2f , 0x03ffffbf , 0x03ffffff , 0x00000000 , 0x00000000 ,
183
+ 0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 ,
184
+ },
185
+ overflow : false ,
186
+ }, {
187
+ name : "overflow in word one (prime + 1<<26)" ,
188
+ in : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffff03fffc2f" ,
189
+ expected : [10 ]uint32 {
190
+ 0x03fffc2f , 0x03ffffc0 , 0x03ffffff , 0x03ffffff , 0x03ffffff ,
191
+ 0x03ffffff , 0x03ffffff , 0x03ffffff , 0x03ffffff , 0x003fffff ,
192
+ },
193
+ overflow : true ,
194
+ }, {
195
+ name : "(field prime - 1) * 2 NOT mod P, truncated >32 bytes" ,
196
+ in : "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffdfffff85c" ,
197
+ expected : [10 ]uint32 {
198
+ 0x01fffff8 , 0x03ffffff , 0x03ffffff , 0x03ffffff , 0x03ffffff ,
199
+ 0x03ffffff , 0x03ffffff , 0x03ffffff , 0x03ffffff , 0x00007fff ,
200
+ },
201
+ overflow : false ,
202
+ }, {
203
+ name : "2^256 - 1" ,
204
+ in : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" ,
205
+ expected : [10 ]uint32 {
206
+ 0x03ffffff , 0x03ffffff , 0x03ffffff , 0x03ffffff , 0x03ffffff ,
207
+ 0x03ffffff , 0x03ffffff , 0x03ffffff , 0x03ffffff , 0x003fffff ,
208
+ },
209
+ overflow : true ,
210
+ }, {
211
+ name : "alternating bits" ,
212
+ in : "a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5" ,
213
+ expected : [10 ]uint32 {
214
+ 0x01a5a5a5 , 0x01696969 , 0x025a5a5a , 0x02969696 , 0x01a5a5a5 ,
215
+ 0x01696969 , 0x025a5a5a , 0x02969696 , 0x01a5a5a5 , 0x00296969 ,
216
+ },
217
+ overflow : false ,
218
+ }, {
219
+ name : "alternating bits 2" ,
220
+ in : "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a" ,
221
+ expected : [10 ]uint32 {
222
+ 0x025a5a5a , 0x02969696 , 0x01a5a5a5 , 0x01696969 , 0x025a5a5a ,
223
+ 0x02969696 , 0x01a5a5a5 , 0x01696969 , 0x025a5a5a , 0x00169696 ,
224
+ },
225
+ overflow : false ,
226
+ }}
227
+
228
+ for _ , test := range tests {
229
+ inBytes := hexToBytes (test .in )
230
+
231
+ // Ensure setting the bytes via the slice method works as expected.
232
+ var f FieldVal
233
+ overflow := f .SetByteSlice (inBytes )
234
+ if ! reflect .DeepEqual (f .n , test .expected ) {
235
+ t .Errorf ("%s: unexpected result\n got: %x\n want: %x" , test .name , f .n ,
236
+ test .expected )
237
+ continue
238
+ }
239
+
240
+ // Ensure the setting the bytes via the slice method produces the
241
+ // expected overflow result.
242
+ if overflow != test .overflow {
243
+ t .Errorf ("%s: unexpected overflow -- got: %v, want: %v" , test .name ,
244
+ overflow , test .overflow )
245
+ continue
246
+ }
247
+
248
+ // Ensure setting the bytes via the array method works as expected.
249
+ var f2 FieldVal
250
+ var b32 [32 ]byte
251
+ truncatedInBytes := inBytes
252
+ if len (truncatedInBytes ) > 32 {
253
+ truncatedInBytes = truncatedInBytes [:32 ]
254
+ }
255
+ copy (b32 [32 - len (truncatedInBytes ):], truncatedInBytes )
256
+ overflow = f2 .SetBytes (& b32 ) != 0
257
+ if ! reflect .DeepEqual (f2 .n , test .expected ) {
258
+ t .Errorf ("%s: unexpected result\n got: %x\n want: %x" , test .name ,
259
+ f2 .n , test .expected )
260
+ continue
261
+ }
262
+
263
+ // Ensure the setting the bytes via the array method produces the
264
+ // expected overflow result.
265
+ if overflow != test .overflow {
266
+ t .Errorf ("%s: unexpected overflow -- got: %v, want: %v" , test .name ,
267
+ overflow , test .overflow )
268
+ continue
269
+ }
270
+ }
271
+ }
272
+
99
273
// TestFieldZero ensures that zeroing a field value works as expected.
100
274
func TestFieldZero (t * testing.T ) {
101
275
var f FieldVal
0 commit comments