Skip to content

Commit 101f497

Browse files
committed
Replaced IsElement with IsPotentialElement and IsSafeElement
1 parent 32dfca7 commit 101f497

16 files changed

+218
-112
lines changed

CHANGELOG.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
- 2.0.0-alpha
2-
- Added GenerateRandomElement to ICryptoGroupAlgebra interface
3-
- Introduced generic type parameter for scalar types in major interfaces
2+
- Added GenerateRandomElement to ICryptoGroupAlgebra interface.
3+
- Introduced generic type parameter for scalar types in major interfaces.
44
- MultiplicativeGroupAlgebra.Negate now works correctly for all elements in the prime field, not only the subgroup.
5+
- Removed CryptoGroupAlgebra.IsElement in favor of new IsPotentialElement and IsSafeElement methods.
6+
-- IsElement was supposed to admit only safe elements, which caused it to reject the neutral element, leading to potential failures during computation.
57

68
- 1.0.0 Initial Release

CompactCryptoGroupAlgebra.OpenSsl/EllipticCurves/EllipticCurveAlgebra.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,14 +179,20 @@ public ECPoint GenerateElement(SecureBigNumber index)
179179
}
180180

181181
/// <inheritdocs />
182-
public bool IsElement(ECPoint element)
182+
public bool IsPotentialElement(ECPoint element)
183183
{
184184
using (var ctx = BigNumberContextHandle.Create())
185185
{
186186
return ECPointHandle.IsOnCurve(Handle, element.Handle, ctx);
187187
}
188188
}
189189

190+
/// <inheritdocs />
191+
public bool IsSafeElement(ECPoint element)
192+
{
193+
return IsPotentialElement(element);
194+
}
195+
190196
/// <inheritdocs />
191197
public ECPoint MultiplyScalar(ECPoint e, SecureBigNumber k)
192198
{

CompactCryptoGroupAlgebra.OpenSsl/Multiplicative/MultiplicativeGroupAlgebra.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public MultiplicativeGroupAlgebra(BigPrime prime, BigPrime order, BigNumber gene
5454
Generator = BigNumber.FromRawHandle(generator.Handle);
5555
Cofactor = (prime - 1) / order;
5656

57-
if (!IsElement(Generator))
57+
if (!IsSafeElement(Generator))
5858
throw new ArgumentException("The generator must be an element of the group.", nameof(generator));
5959
}
6060

@@ -98,15 +98,21 @@ public BigNumber GenerateElement(SecureBigNumber index)
9898
}
9999

100100
/// <inheritdocs />
101-
public bool IsElement(BigNumber element)
101+
public bool IsPotentialElement(BigNumber element)
102102
{
103103
// implementation-specific checks
104104
if (element.Equals(BigNumber.Zero) ||
105105
BigNumberHandle.Compare(element.Handle, _modulo.Handle) >= 0)
106106
{
107107
return false;
108108
}
109+
return true;
110+
}
109111

112+
public bool IsSafeElement(BigNumber element)
113+
{
114+
if (!IsPotentialElement(element)) return false;
115+
110116
// verifying that the point is not from a small subgroup of the whole curve (and thus outside
111117
// of the safe subgroup over which operations are considered)
112118
if (Cofactor > 1)

CompactCryptoGroupAlgebra.Tests/CryptoGroupAlgebraTests.cs

Lines changed: 56 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,46 @@ public void TestGenerateRandomElement()
321321
}
322322

323323
[Test]
324-
public void TestIsElement()
324+
public void TestIsPotentialElement()
325+
{
326+
var order = BigPrime.CreateWithoutChecks(11);
327+
int element = 7;
328+
329+
var generatorStub = 1;
330+
var cofactor = new BigInteger(2);
331+
var neutralElement = 0;
332+
var elementBitLength = 8;
333+
334+
var algebraMock = new Mock<CryptoGroupAlgebra<int>>(generatorStub, order, cofactor, neutralElement, elementBitLength) { CallBase = true };
335+
algebraMock.Protected().As<ICryptoGroupAlgebraProtectedMembers>()
336+
.Setup(alg => alg.IsElementDerived(It.IsAny<int>()))
337+
.Returns(true);
338+
339+
Assert.IsTrue(algebraMock.Object.IsPotentialElement(element));
340+
}
341+
342+
343+
[Test]
344+
public void TestIsPotentialElementFalseIfDerivedIsFalse()
345+
{
346+
var order = BigPrime.CreateWithoutChecks(11);
347+
int element = 7;
348+
349+
var generatorStub = 1;
350+
var cofactor = new BigInteger(2);
351+
var neutralElement = 0;
352+
var elementBitLength = 8;
353+
354+
var algebraMock = new Mock<CryptoGroupAlgebra<int>>(generatorStub, order, cofactor, neutralElement, elementBitLength) { CallBase = true };
355+
algebraMock.Protected().As<ICryptoGroupAlgebraProtectedMembers>()
356+
.Setup(alg => alg.IsElementDerived(It.IsAny<int>()))
357+
.Returns(false);
358+
359+
Assert.IsFalse(algebraMock.Object.IsPotentialElement(element));
360+
}
361+
362+
[Test]
363+
public void TestIsSafeElement()
325364
{
326365
var order = BigPrime.CreateWithoutChecks(11);
327366
int element = 7;
@@ -343,11 +382,12 @@ public void TestIsElement()
343382
.Returns(neutralElement);
344383

345384

346-
Assert.IsTrue(algebraMock.Object.IsElement(element));
385+
Assert.IsTrue(algebraMock.Object.IsSafeElement(element));
347386
}
348387

388+
349389
[Test]
350-
public void TestIsElementFalseForUnsafeSubgroup()
390+
public void TestIsSafeElementFalseIfDerivedIsFalse()
351391
{
352392
var order = BigPrime.CreateWithoutChecks(11);
353393
int element = 7;
@@ -360,19 +400,17 @@ public void TestIsElementFalseForUnsafeSubgroup()
360400
var algebraMock = new Mock<CryptoGroupAlgebra<int>>(generatorStub, order, cofactor, neutralElement, elementBitLength) { CallBase = true };
361401
algebraMock.Protected().As<ICryptoGroupAlgebraProtectedMembers>()
362402
.Setup(alg => alg.IsElementDerived(It.IsAny<int>()))
363-
.Returns(true);
364-
365-
// an element is in an unsafe subgroup if it results in neutral element when multiplied by cofactor
366-
algebraMock.Protected().As<ICryptoGroupAlgebraProtectedMembers>()
367-
.Setup(alg => alg.MultiplyScalarUnchecked(It.IsAny<int>(), It.Is<BigInteger>(x => x.Equals(cofactor)), It.IsAny<int>()))
368-
.Returns(neutralElement);
403+
.Returns(false);
404+
// algebraMock.Protected().As<ICryptoGroupAlgebraProtectedMembers>()
405+
// .Setup(alg => alg.MultiplyScalarUnchecked(It.IsAny<int>(), It.IsAny<BigInteger>(), It.IsAny<int>()))
406+
// .Returns(1);
369407

370408

371-
Assert.IsFalse(algebraMock.Object.IsElement(element));
409+
Assert.IsFalse(algebraMock.Object.IsSafeElement(element));
372410
}
373411

374412
[Test]
375-
public void TestIsElementFalseIfDerivedIsFalse()
413+
public void TestIsSafeElementFalseForUnsafeSubgroup()
376414
{
377415
var order = BigPrime.CreateWithoutChecks(11);
378416
int element = 7;
@@ -385,14 +423,17 @@ public void TestIsElementFalseIfDerivedIsFalse()
385423
var algebraMock = new Mock<CryptoGroupAlgebra<int>>(generatorStub, order, cofactor, neutralElement, elementBitLength) { CallBase = true };
386424
algebraMock.Protected().As<ICryptoGroupAlgebraProtectedMembers>()
387425
.Setup(alg => alg.IsElementDerived(It.IsAny<int>()))
388-
.Returns(false);
426+
.Returns(true);
427+
428+
// an element is in an unsafe subgroup if it results in neutral element when multiplied by cofactor
389429
algebraMock.Protected().As<ICryptoGroupAlgebraProtectedMembers>()
390-
.Setup(alg => alg.MultiplyScalarUnchecked(It.IsAny<int>(), It.IsAny<BigInteger>(), It.IsAny<int>()))
391-
.Returns(1);
430+
.Setup(alg => alg.MultiplyScalarUnchecked(It.IsAny<int>(), It.Is<BigInteger>(x => x.Equals(cofactor)), It.IsAny<int>()))
431+
.Returns(neutralElement);
392432

393433

394-
Assert.IsFalse(algebraMock.Object.IsElement(element));
434+
Assert.IsFalse(algebraMock.Object.IsSafeElement(element));
395435
}
396436

437+
397438
}
398439
}

0 commit comments

Comments
 (0)