@@ -28,7 +28,8 @@ func (f *FieldVal) SetHex(hexString string) *FieldVal {
2828 hexString = "0" + hexString
2929 }
3030 bytes , _ := hex .DecodeString (hexString )
31- return f .SetByteSlice (bytes )
31+ f .SetByteSlice (bytes )
32+ return f
3233}
3334
3435// randFieldVal returns a field value created from a random value generated by
@@ -96,6 +97,179 @@ func TestFieldSetInt(t *testing.T) {
9697 }
9798}
9899
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+
99273// TestFieldZero ensures that zeroing a field value works as expected.
100274func TestFieldZero (t * testing.T ) {
101275 var f FieldVal
0 commit comments