public ECPoint (ECGroup group, Number x, Number y, Number z) { _group = group; _field = group.FiniteField; _x = x; _y = y; _z = z; }
public ECGroup (Number a, Number b, Number mod, IFiniteField field) { _a = a; _b = b; _mod = mod; _field = field; _a_is_minus3 = (mod.CompareTo (a + Number.Three) == 0); }
public ECDomainParameters (ECGroup group, ECPoint G, Number order, uint h, uint bits, IFiniteField fieldN, Uri uri) { _group = group; _G = G; _order = order; _h = h; _bits = bits; _fieldN = fieldN; _uri = uri; }
public void SqrtTest () { IFiniteField[] ffList = new IFiniteField[2]; ffList[0] = new SECP192r1 (); ffList[1] = new Montgomery (ffList[0].Modulus); int repeats = 10; foreach (IFiniteField ff in ffList) { for (int i = 0; i < repeats; i++) { Number x = ff.ToElement (Number.CreateRandomElement (ff.Modulus)); Number xx = ff.Multiply (x, x); Number sqrt = ff.Sqrt (xx); Assert.IsTrue (ff.Multiply (sqrt, sqrt).CompareTo (xx) == 0); } } }
public void PowTest () { IFiniteField[] ffList = new IFiniteField[2]; ffList[0] = new SECP192r1 (); ffList[1] = new Montgomery (ffList[0].Modulus); foreach (IFiniteField ff in ffList) { Number x = ff.ToElement (Number.CreateRandomElement (ff.Modulus)); Number pow2 = ff.Multiply (x, x); Number pow3 = ff.Multiply (pow2, x); Number pow4 = ff.Multiply (pow3, x); Assert.IsTrue (ff.Pow (x, Number.Zero).CompareTo (ff.ToElement (Number.One)) == 0); Assert.IsTrue (ff.Pow (x, Number.One).CompareTo (x) == 0); Assert.IsTrue (ff.Pow (x, Number.Two).CompareTo (pow2) == 0); Assert.IsTrue (ff.Pow (x, Number.Three).CompareTo (pow3) == 0); Assert.IsTrue (ff.Pow (x, Number.Four).CompareTo (pow4) == 0); } }
/// <summary>バイト配列より点を作成する (SEC1, 2.3.4)</summary> public ECPoint (ECGroup group, byte[] data) { _group = group; _field = group.FiniteField; switch (data[0]) { case 0: { // 無限遠点 ECPoint tmp = _field.GetInfinityPoint (_group); _x = tmp._x; _y = tmp._y; _z = tmp._z; return; } case 2: case 3: { // 点圧縮済みデータ int keyBits = group.P.BitCount (); int keyBytes = (keyBits >> 3) + ((keyBits & 7) == 0 ? 0 : 1); if (data.Length != keyBytes + 1) throw new ArgumentException (); Number x = _field.ToElement (new Number (data, 1, keyBytes, false)); Number y2 = _field.Add (_field.Multiply (_field.Add (_field.Multiply (x, x), _group.A), x), _group.B); // (x^2 + a)*x + b Number y = _field.Sqrt (y2); if (_field.ToNormal (y).GetBit (0) != data[0] - 2) y = _field.Modulus - y; _x = x; _y = y; _z = _field.ToElement (Number.One); return; } case 4: { // 非圧縮データ int keyBits = group.P.BitCount (); int keyBytes = (keyBits >> 3) + ((keyBits & 7) == 0 ? 0 : 1); _x = _field.ToElement (new Number (data, 1, keyBytes, false)); _y = _field.ToElement (new Number (data, 1 + keyBytes, keyBytes, false)); _z = _field.ToElement (Number.One); return; } default: throw new ArgumentException (); } }
protected ECCurve(IFiniteField field) { this.m_field = field; }
internal GenericPolynomialExtensionField(IFiniteField subfield, IPolynomial polynomial) { this.subfield = subfield; this.minimalPolynomial = polynomial; }
public ECDomainParameters (ECGroup group, ECPoint G, Number order, uint h, uint bits, IFiniteField fieldN) : this (group, G, order, h, bits, fieldN, null) { }
public static bool IsFpField(IFiniteField field) { return field.Dimension == 1; }
public static bool IsF2mField(IFiniteField field) { return field.Dimension > 1 && field.Characteristic.Equals(BigInteger.Two) && field is IPolynomialExtensionField; }
internal GenericPolynomialExtensionField(IFiniteField subfield, IPolynomial polynomial) { this.subfield = subfield; minimalPolynomial = polynomial; }
protected ECCurve(IFiniteField field) { this.m_field = field; }