Skip to content

Commit 6332a42

Browse files
Simplify the two constructors from bytes + the CAddBit method
1 parent 3858027 commit 6332a42

File tree

1 file changed

+36
-74
lines changed

1 file changed

+36
-74
lines changed

Src/Autarkysoft.Bitcoin/Cryptography/EllipticCurve/Scalar8x32.cs

+36-74
Original file line numberDiff line numberDiff line change
@@ -118,39 +118,10 @@ public unsafe Scalar8x32(ulong* hPt, out bool overflow)
118118
/// <param name="overflow">Returns true if value was bigger than or equal to curve order; otherwise false</param>
119119
public unsafe Scalar8x32(byte* pt, out bool overflow)
120120
{
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];
154125
}
155126

156127
/// <summary>
@@ -160,44 +131,36 @@ public unsafe Scalar8x32(byte* pt, out bool overflow)
160131
/// <exception cref="ArgumentOutOfRangeException"/>
161132
/// <param name="data">Array to use</param>
162133
/// <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)
164135
{
165136
if (data.Length != 32)
166137
throw new ArgumentOutOfRangeException(nameof(data));
167138

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+
}
179147

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);
180160
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;
201164
}
202165

203166

@@ -436,22 +399,21 @@ public Scalar8x32 CAddBit(uint bit, uint flag)
436399
{
437400
Debug.Assert(bit < 256);
438401
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));
441403
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));
443405
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));
445407
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));
447409
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));
449411
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));
451413
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));
453415
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));
455417
uint r7 = (uint)t;
456418

457419
Debug.Assert((t >> 32) == 0);

0 commit comments

Comments
 (0)