@@ -118,39 +118,10 @@ public unsafe Scalar8x32(ulong* hPt, out bool overflow)
118
118
/// <param name="overflow">Returns true if value was bigger than or equal to curve order; otherwise false</param>
119
119
public unsafe Scalar8x32 ( byte * pt , out bool overflow )
120
120
{
121
- b0 = pt [ 31 ] | ( ( uint ) pt [ 30 ] << 8 ) | ( ( uint ) pt [ 29 ] << 16 ) | ( ( uint ) pt [ 28 ] << 24 ) ;
122
- b1 = pt [ 27 ] | ( ( uint ) pt [ 26 ] << 8 ) | ( ( uint ) pt [ 25 ] << 16 ) | ( ( uint ) pt [ 24 ] << 24 ) ;
123
- b2 = pt [ 23 ] | ( ( uint ) pt [ 22 ] << 8 ) | ( ( uint ) pt [ 21 ] << 16 ) | ( ( uint ) pt [ 20 ] << 24 ) ;
124
- b3 = pt [ 19 ] | ( ( uint ) pt [ 18 ] << 8 ) | ( ( uint ) pt [ 17 ] << 16 ) | ( ( uint ) pt [ 16 ] << 24 ) ;
125
- b4 = pt [ 15 ] | ( ( uint ) pt [ 14 ] << 8 ) | ( ( uint ) pt [ 13 ] << 16 ) | ( ( uint ) pt [ 12 ] << 24 ) ;
126
- b5 = pt [ 11 ] | ( ( uint ) pt [ 10 ] << 8 ) | ( ( uint ) pt [ 09 ] << 16 ) | ( ( uint ) pt [ 08 ] << 24 ) ;
127
- b6 = pt [ 07 ] | ( ( uint ) pt [ 06 ] << 8 ) | ( ( uint ) pt [ 05 ] << 16 ) | ( ( uint ) pt [ 04 ] << 24 ) ;
128
- b7 = pt [ 03 ] | ( ( uint ) pt [ 02 ] << 8 ) | ( ( uint ) pt [ 01 ] << 16 ) | ( ( uint ) pt [ 00 ] << 24 ) ;
129
-
130
- uint of = CheckOverflow ( ) ;
131
- overflow = of != 0 ;
132
-
133
- Debug . Assert ( of == 0 || of == 1 ) ;
134
-
135
- ulong t = ( ulong ) b0 + ( of * NC0 ) ;
136
- b0 = ( uint ) t ; t >>= 32 ;
137
- t += ( ulong ) b1 + ( of * NC1 ) ;
138
- b1 = ( uint ) t ; t >>= 32 ;
139
- t += ( ulong ) b2 + ( of * NC2 ) ;
140
- b2 = ( uint ) t ; t >>= 32 ;
141
- t += ( ulong ) b3 + ( of * NC3 ) ;
142
- b3 = ( uint ) t ; t >>= 32 ;
143
- t += ( ulong ) b4 + ( of * NC4 ) ;
144
- b4 = ( uint ) t ; t >>= 32 ;
145
- t += b5 ;
146
- b5 = ( uint ) t ; t >>= 32 ;
147
- t += b6 ;
148
- b6 = ( uint ) t ; t >>= 32 ;
149
- t += b7 ;
150
- b7 = ( uint ) t ;
151
-
152
- Debug . Assert ( ( of == 1 && t >> 32 == 1 ) || ( of == 0 && t >> 32 == 0 ) ) ;
153
- Debug . Assert ( CheckOverflow ( ) == 0 ) ;
121
+ uint * r = stackalloc uint [ 8 ] ;
122
+ overflow = SetB32 ( pt , r ) ;
123
+ b0 = r [ 0 ] ; b1 = r [ 1 ] ; b2 = r [ 2 ] ; b3 = r [ 3 ] ;
124
+ b4 = r [ 4 ] ; b5 = r [ 5 ] ; b6 = r [ 6 ] ; b7 = r [ 7 ] ;
154
125
}
155
126
156
127
/// <summary>
@@ -160,44 +131,36 @@ public unsafe Scalar8x32(byte* pt, out bool overflow)
160
131
/// <exception cref="ArgumentOutOfRangeException"/>
161
132
/// <param name="data">Array to use</param>
162
133
/// <param name="overflow">Returns true if value was bigger than or equal to curve order; otherwise false</param>
163
- public Scalar8x32 ( ReadOnlySpan < byte > data , out bool overflow )
134
+ public unsafe Scalar8x32 ( ReadOnlySpan < byte > data , out bool overflow )
164
135
{
165
136
if ( data . Length != 32 )
166
137
throw new ArgumentOutOfRangeException ( nameof ( data ) ) ;
167
138
168
- b0 = data [ 31 ] | ( ( uint ) data [ 30 ] << 8 ) | ( ( uint ) data [ 29 ] << 16 ) | ( ( uint ) data [ 28 ] << 24 ) ;
169
- b1 = data [ 27 ] | ( ( uint ) data [ 26 ] << 8 ) | ( ( uint ) data [ 25 ] << 16 ) | ( ( uint ) data [ 24 ] << 24 ) ;
170
- b2 = data [ 23 ] | ( ( uint ) data [ 22 ] << 8 ) | ( ( uint ) data [ 21 ] << 16 ) | ( ( uint ) data [ 20 ] << 24 ) ;
171
- b3 = data [ 19 ] | ( ( uint ) data [ 18 ] << 8 ) | ( ( uint ) data [ 17 ] << 16 ) | ( ( uint ) data [ 16 ] << 24 ) ;
172
- b4 = data [ 15 ] | ( ( uint ) data [ 14 ] << 8 ) | ( ( uint ) data [ 13 ] << 16 ) | ( ( uint ) data [ 12 ] << 24 ) ;
173
- b5 = data [ 11 ] | ( ( uint ) data [ 10 ] << 8 ) | ( ( uint ) data [ 09 ] << 16 ) | ( ( uint ) data [ 08 ] << 24 ) ;
174
- b6 = data [ 07 ] | ( ( uint ) data [ 06 ] << 8 ) | ( ( uint ) data [ 05 ] << 16 ) | ( ( uint ) data [ 04 ] << 24 ) ;
175
- b7 = data [ 03 ] | ( ( uint ) data [ 02 ] << 8 ) | ( ( uint ) data [ 01 ] << 16 ) | ( ( uint ) data [ 00 ] << 24 ) ;
176
-
177
- uint of = CheckOverflow ( ) ;
178
- overflow = of != 0 ;
139
+ uint * r = stackalloc uint [ 8 ] ;
140
+ fixed ( byte * pt = & data [ 0 ] )
141
+ {
142
+ overflow = SetB32 ( pt , r ) ;
143
+ b0 = r [ 0 ] ; b1 = r [ 1 ] ; b2 = r [ 2 ] ; b3 = r [ 3 ] ;
144
+ b4 = r [ 4 ] ; b5 = r [ 5 ] ; b6 = r [ 6 ] ; b7 = r [ 7 ] ;
145
+ }
146
+ }
179
147
148
+ private static unsafe bool SetB32 ( byte * pt , uint * r )
149
+ {
150
+ r [ 0 ] = pt [ 31 ] | ( ( uint ) pt [ 30 ] << 8 ) | ( ( uint ) pt [ 29 ] << 16 ) | ( ( uint ) pt [ 28 ] << 24 ) ;
151
+ r [ 1 ] = pt [ 27 ] | ( ( uint ) pt [ 26 ] << 8 ) | ( ( uint ) pt [ 25 ] << 16 ) | ( ( uint ) pt [ 24 ] << 24 ) ;
152
+ r [ 2 ] = pt [ 23 ] | ( ( uint ) pt [ 22 ] << 8 ) | ( ( uint ) pt [ 21 ] << 16 ) | ( ( uint ) pt [ 20 ] << 24 ) ;
153
+ r [ 3 ] = pt [ 19 ] | ( ( uint ) pt [ 18 ] << 8 ) | ( ( uint ) pt [ 17 ] << 16 ) | ( ( uint ) pt [ 16 ] << 24 ) ;
154
+ r [ 4 ] = pt [ 15 ] | ( ( uint ) pt [ 14 ] << 8 ) | ( ( uint ) pt [ 13 ] << 16 ) | ( ( uint ) pt [ 12 ] << 24 ) ;
155
+ r [ 5 ] = pt [ 11 ] | ( ( uint ) pt [ 10 ] << 8 ) | ( ( uint ) pt [ 09 ] << 16 ) | ( ( uint ) pt [ 08 ] << 24 ) ;
156
+ r [ 6 ] = pt [ 07 ] | ( ( uint ) pt [ 06 ] << 8 ) | ( ( uint ) pt [ 05 ] << 16 ) | ( ( uint ) pt [ 04 ] << 24 ) ;
157
+ r [ 7 ] = pt [ 03 ] | ( ( uint ) pt [ 02 ] << 8 ) | ( ( uint ) pt [ 01 ] << 16 ) | ( ( uint ) pt [ 00 ] << 24 ) ;
158
+
159
+ uint of = GetOverflow ( r ) ;
180
160
Debug . Assert ( of == 0 || of == 1 ) ;
181
-
182
- ulong t = ( ulong ) b0 + ( of * NC0 ) ;
183
- b0 = ( uint ) t ; t >>= 32 ;
184
- t += ( ulong ) b1 + ( of * NC1 ) ;
185
- b1 = ( uint ) t ; t >>= 32 ;
186
- t += ( ulong ) b2 + ( of * NC2 ) ;
187
- b2 = ( uint ) t ; t >>= 32 ;
188
- t += ( ulong ) b3 + ( of * NC3 ) ;
189
- b3 = ( uint ) t ; t >>= 32 ;
190
- t += ( ulong ) b4 + ( of * NC4 ) ;
191
- b4 = ( uint ) t ; t >>= 32 ;
192
- t += b5 ;
193
- b5 = ( uint ) t ; t >>= 32 ;
194
- t += b6 ;
195
- b6 = ( uint ) t ; t >>= 32 ;
196
- t += b7 ;
197
- b7 = ( uint ) t ;
198
-
199
- Debug . Assert ( ( of == 1 && t >> 32 == 1 ) || ( of == 0 && t >> 32 == 0 ) ) ;
200
- Debug . Assert ( CheckOverflow ( ) == 0 ) ;
161
+ Reduce ( r , of ) ;
162
+ Debug . Assert ( GetOverflow ( r ) == 0 ) ;
163
+ return of != 0 ;
201
164
}
202
165
203
166
@@ -436,22 +399,21 @@ public Scalar8x32 CAddBit(uint bit, uint flag)
436
399
{
437
400
Debug . Assert ( bit < 256 ) ;
438
401
bit += ( flag - 1 ) & 0x100 ; // forcing (bit >> 5) > 7 makes this a noop
439
- int shift = ( int ) bit & 0x1F ;
440
- ulong t = ( ulong ) b0 + ( ( ( bit >> 5 ) == 0 ? 1U : 0 ) << shift ) ;
402
+ ulong t = ( ulong ) b0 + ( ( ( bit >> 5 ) == 0 ? 1U : 0 ) << ( ( int ) bit & 0x1F ) ) ;
441
403
uint r0 = ( uint ) t ; t >>= 32 ;
442
- t += ( ulong ) b1 + ( ( ( bit >> 5 ) == 1 ? 1U : 0 ) << shift ) ;
404
+ t += ( ulong ) b1 + ( ( ( bit >> 5 ) == 1 ? 1U : 0 ) << ( ( int ) bit & 0x1F ) ) ;
443
405
uint r1 = ( uint ) t ; t >>= 32 ;
444
- t += ( ulong ) b2 + ( ( ( bit >> 5 ) == 2 ? 1U : 0 ) << shift ) ;
406
+ t += ( ulong ) b2 + ( ( ( bit >> 5 ) == 2 ? 1U : 0 ) << ( ( int ) bit & 0x1F ) ) ;
445
407
uint r2 = ( uint ) t ; t >>= 32 ;
446
- t += ( ulong ) b3 + ( ( ( bit >> 5 ) == 3 ? 1U : 0 ) << shift ) ;
408
+ t += ( ulong ) b3 + ( ( ( bit >> 5 ) == 3 ? 1U : 0 ) << ( ( int ) bit & 0x1F ) ) ;
447
409
uint r3 = ( uint ) t ; t >>= 32 ;
448
- t += ( ulong ) b4 + ( ( ( bit >> 5 ) == 4 ? 1U : 0 ) << shift ) ;
410
+ t += ( ulong ) b4 + ( ( ( bit >> 5 ) == 4 ? 1U : 0 ) << ( ( int ) bit & 0x1F ) ) ;
449
411
uint r4 = ( uint ) t ; t >>= 32 ;
450
- t += ( ulong ) b5 + ( ( ( bit >> 5 ) == 5 ? 1U : 0 ) << shift ) ;
412
+ t += ( ulong ) b5 + ( ( ( bit >> 5 ) == 5 ? 1U : 0 ) << ( ( int ) bit & 0x1F ) ) ;
451
413
uint r5 = ( uint ) t ; t >>= 32 ;
452
- t += ( ulong ) b6 + ( ( ( bit >> 5 ) == 6 ? 1U : 0 ) << shift ) ;
414
+ t += ( ulong ) b6 + ( ( ( bit >> 5 ) == 6 ? 1U : 0 ) << ( ( int ) bit & 0x1F ) ) ;
453
415
uint r6 = ( uint ) t ; t >>= 32 ;
454
- t += ( ulong ) b7 + ( ( ( bit >> 5 ) == 7 ? 1U : 0 ) << shift ) ;
416
+ t += ( ulong ) b7 + ( ( ( bit >> 5 ) == 7 ? 1U : 0 ) << ( ( int ) bit & 0x1F ) ) ;
455
417
uint r7 = ( uint ) t ;
456
418
457
419
Debug . Assert ( ( t >> 32 ) == 0 ) ;
0 commit comments