@@ -284,16 +284,40 @@ static int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b) {
284
284
}
285
285
286
286
static int secp256k1_fe_set_b32 (secp256k1_fe * r , const unsigned char * a ) {
287
- int i ;
288
- r -> n [0 ] = r -> n [1 ] = r -> n [2 ] = r -> n [3 ] = r -> n [4 ] = 0 ;
289
- for (i = 0 ; i < 32 ; i ++ ) {
290
- int j ;
291
- for (j = 0 ; j < 2 ; j ++ ) {
292
- int limb = (8 * i + 4 * j )/52 ;
293
- int shift = (8 * i + 4 * j )%52 ;
294
- r -> n [limb ] |= (uint64_t )((a [31 - i ] >> (4 * j )) & 0xF ) << shift ;
295
- }
296
- }
287
+ r -> n [0 ] = (uint64_t )a [31 ]
288
+ | ((uint64_t )a [30 ] << 8 )
289
+ | ((uint64_t )a [29 ] << 16 )
290
+ | ((uint64_t )a [28 ] << 24 )
291
+ | ((uint64_t )a [27 ] << 32 )
292
+ | ((uint64_t )a [26 ] << 40 )
293
+ | ((uint64_t )(a [25 ] & 0xF ) << 48 );
294
+ r -> n [1 ] = (uint64_t )((a [25 ] >> 4 ) & 0xF )
295
+ | ((uint64_t )a [24 ] << 4 )
296
+ | ((uint64_t )a [23 ] << 12 )
297
+ | ((uint64_t )a [22 ] << 20 )
298
+ | ((uint64_t )a [21 ] << 28 )
299
+ | ((uint64_t )a [20 ] << 36 )
300
+ | ((uint64_t )a [19 ] << 44 );
301
+ r -> n [2 ] = (uint64_t )a [18 ]
302
+ | ((uint64_t )a [17 ] << 8 )
303
+ | ((uint64_t )a [16 ] << 16 )
304
+ | ((uint64_t )a [15 ] << 24 )
305
+ | ((uint64_t )a [14 ] << 32 )
306
+ | ((uint64_t )a [13 ] << 40 )
307
+ | ((uint64_t )(a [12 ] & 0xF ) << 48 );
308
+ r -> n [3 ] = (uint64_t )((a [12 ] >> 4 ) & 0xF )
309
+ | ((uint64_t )a [11 ] << 4 )
310
+ | ((uint64_t )a [10 ] << 12 )
311
+ | ((uint64_t )a [9 ] << 20 )
312
+ | ((uint64_t )a [8 ] << 28 )
313
+ | ((uint64_t )a [7 ] << 36 )
314
+ | ((uint64_t )a [6 ] << 44 );
315
+ r -> n [4 ] = (uint64_t )a [5 ]
316
+ | ((uint64_t )a [4 ] << 8 )
317
+ | ((uint64_t )a [3 ] << 16 )
318
+ | ((uint64_t )a [2 ] << 24 )
319
+ | ((uint64_t )a [1 ] << 32 )
320
+ | ((uint64_t )a [0 ] << 40 );
297
321
if (r -> n [4 ] == 0x0FFFFFFFFFFFFULL && (r -> n [3 ] & r -> n [2 ] & r -> n [1 ]) == 0xFFFFFFFFFFFFFULL && r -> n [0 ] >= 0xFFFFEFFFFFC2FULL ) {
298
322
return 0 ;
299
323
}
@@ -307,21 +331,42 @@ static int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a) {
307
331
308
332
/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */
309
333
static void secp256k1_fe_get_b32 (unsigned char * r , const secp256k1_fe * a ) {
310
- int i ;
311
334
#ifdef VERIFY
312
335
VERIFY_CHECK (a -> normalized );
313
336
secp256k1_fe_verify (a );
314
337
#endif
315
- for (i = 0 ; i < 32 ; i ++ ) {
316
- int j ;
317
- int c = 0 ;
318
- for (j = 0 ; j < 2 ; j ++ ) {
319
- int limb = (8 * i + 4 * j )/52 ;
320
- int shift = (8 * i + 4 * j )%52 ;
321
- c |= ((a -> n [limb ] >> shift ) & 0xF ) << (4 * j );
322
- }
323
- r [31 - i ] = c ;
324
- }
338
+ r [0 ] = (a -> n [4 ] >> 40 ) & 0xFF ;
339
+ r [1 ] = (a -> n [4 ] >> 32 ) & 0xFF ;
340
+ r [2 ] = (a -> n [4 ] >> 24 ) & 0xFF ;
341
+ r [3 ] = (a -> n [4 ] >> 16 ) & 0xFF ;
342
+ r [4 ] = (a -> n [4 ] >> 8 ) & 0xFF ;
343
+ r [5 ] = a -> n [4 ] & 0xFF ;
344
+ r [6 ] = (a -> n [3 ] >> 44 ) & 0xFF ;
345
+ r [7 ] = (a -> n [3 ] >> 36 ) & 0xFF ;
346
+ r [8 ] = (a -> n [3 ] >> 28 ) & 0xFF ;
347
+ r [9 ] = (a -> n [3 ] >> 20 ) & 0xFF ;
348
+ r [10 ] = (a -> n [3 ] >> 12 ) & 0xFF ;
349
+ r [11 ] = (a -> n [3 ] >> 4 ) & 0xFF ;
350
+ r [12 ] = ((a -> n [2 ] >> 48 ) & 0xF ) | ((a -> n [3 ] & 0xF ) << 4 );
351
+ r [13 ] = (a -> n [2 ] >> 40 ) & 0xFF ;
352
+ r [14 ] = (a -> n [2 ] >> 32 ) & 0xFF ;
353
+ r [15 ] = (a -> n [2 ] >> 24 ) & 0xFF ;
354
+ r [16 ] = (a -> n [2 ] >> 16 ) & 0xFF ;
355
+ r [17 ] = (a -> n [2 ] >> 8 ) & 0xFF ;
356
+ r [18 ] = a -> n [2 ] & 0xFF ;
357
+ r [19 ] = (a -> n [1 ] >> 44 ) & 0xFF ;
358
+ r [20 ] = (a -> n [1 ] >> 36 ) & 0xFF ;
359
+ r [21 ] = (a -> n [1 ] >> 28 ) & 0xFF ;
360
+ r [22 ] = (a -> n [1 ] >> 20 ) & 0xFF ;
361
+ r [23 ] = (a -> n [1 ] >> 12 ) & 0xFF ;
362
+ r [24 ] = (a -> n [1 ] >> 4 ) & 0xFF ;
363
+ r [25 ] = ((a -> n [0 ] >> 48 ) & 0xF ) | ((a -> n [1 ] & 0xF ) << 4 );
364
+ r [26 ] = (a -> n [0 ] >> 40 ) & 0xFF ;
365
+ r [27 ] = (a -> n [0 ] >> 32 ) & 0xFF ;
366
+ r [28 ] = (a -> n [0 ] >> 24 ) & 0xFF ;
367
+ r [29 ] = (a -> n [0 ] >> 16 ) & 0xFF ;
368
+ r [30 ] = (a -> n [0 ] >> 8 ) & 0xFF ;
369
+ r [31 ] = a -> n [0 ] & 0xFF ;
325
370
}
326
371
327
372
SECP256K1_INLINE static void secp256k1_fe_negate (secp256k1_fe * r , const secp256k1_fe * a , int m ) {
0 commit comments