45 lines
1.0 KiB
C#
45 lines
1.0 KiB
C#
using System;
|
|
|
|
namespace Org.BouncyCastle.Math.EC;
|
|
|
|
public abstract class AbstractF2mFieldElement : ECFieldElement
|
|
{
|
|
public virtual ECFieldElement HalfTrace()
|
|
{
|
|
int fieldSize = FieldSize;
|
|
if ((fieldSize & 1) == 0)
|
|
{
|
|
throw new InvalidOperationException("Half-trace only defined for odd m");
|
|
}
|
|
ECFieldElement eCFieldElement = this;
|
|
ECFieldElement eCFieldElement2 = eCFieldElement;
|
|
for (int i = 2; i < fieldSize; i += 2)
|
|
{
|
|
eCFieldElement = eCFieldElement.SquarePow(2);
|
|
eCFieldElement2 = eCFieldElement2.Add(eCFieldElement);
|
|
}
|
|
return eCFieldElement2;
|
|
}
|
|
|
|
public virtual int Trace()
|
|
{
|
|
int fieldSize = FieldSize;
|
|
ECFieldElement eCFieldElement = this;
|
|
ECFieldElement eCFieldElement2 = eCFieldElement;
|
|
for (int i = 1; i < fieldSize; i++)
|
|
{
|
|
eCFieldElement = eCFieldElement.Square();
|
|
eCFieldElement2 = eCFieldElement2.Add(eCFieldElement);
|
|
}
|
|
if (eCFieldElement2.IsZero)
|
|
{
|
|
return 0;
|
|
}
|
|
if (eCFieldElement2.IsOne)
|
|
{
|
|
return 1;
|
|
}
|
|
throw new InvalidOperationException("Internal error in trace calculation");
|
|
}
|
|
}
|