public void ToByteArrayTest() { ECDomainParameters domain = ECDomains.GetDomainParameter(ECDomainNames.secp192r1); ECGroup group = domain.Group; ECPoint p = domain.Group.FiniteField.GetInfinityPoint(group); ECPoint g = domain.G.Export(); byte[] tmp = p.ToByteArray(true); Assert.IsTrue(tmp.Length == 1, "#1"); Assert.IsTrue(tmp[0] == 0, "#2"); p = new ECPoint(group, tmp); Assert.IsTrue(p.IsInifinity(), "#3"); tmp = domain.G.ToByteArray(false); Assert.IsTrue(tmp.Length == ((domain.Bits >> 3) + ((domain.Bits & 7) == 0 ? 0 : 1)) * 2 + 1, "#4"); p = new ECPoint(group, tmp).Export(); Assert.IsTrue(p.X.CompareTo(g.X) == 0, "#5"); Assert.IsTrue(p.Y.CompareTo(g.Y) == 0, "#6"); tmp = domain.G.ToByteArray(true); Assert.IsTrue(tmp.Length == ((domain.Bits >> 3) + ((domain.Bits & 7) == 0 ? 0 : 1)) + 1, "#7"); p = new ECPoint(group, tmp).Export(); Assert.IsTrue(p.X.CompareTo(g.X) == 0, "#8"); Assert.IsTrue(p.Y.CompareTo(g.Y) == 0, "#9"); }
public byte[] PerformKeyAgreement(byte[] otherPublicKey1, byte[] otherPublicKey2, int keyDataLength) { ECPoint otherQ1 = new ECPoint(_params.Domain.Group, otherPublicKey1); ECPoint otherQ2 = new ECPoint(_params.Domain.Group, otherPublicKey2); IFiniteField ff = _params.Domain.FieldN; // MQV Primitives if (_params.KeyPair1.D == null) { _params.KeyPair1.CreateNewPrivateKey(); } if (_params.KeyPair2.D == null) { _params.KeyPair2.CreateNewPrivateKey(); } if (_params.KeyPair2.Q == null) { _params.KeyPair2.CreatePublicKeyFromPrivateKey(); } int logBits = _params.Domain.N.BitCount(); logBits = (logBits >> 1) + ((logBits & 1) == 0 ? 0 : 1); Number mod = Number.One << logBits; Number mask = mod - Number.One; Number q2u = (_params.KeyPair2.Q.Export().X & mask) + mod; Number s = ff.Add(_params.KeyPair2.D, ff.Multiply(q2u, _params.KeyPair1.D)); Number q2v = (otherQ2.Export().X & mask) + mod; ECPoint P = otherQ2.Add(otherQ1.Multiply(q2v)).Multiply(s * new Number(new uint[] { _params.Domain.H })); if (P.IsInifinity()) { throw new CryptographicException(); } int keyBytes = (int)((_params.Domain.Bits >> 3) + ((_params.Domain.Bits & 7) == 0 ? 0 : 1)); byte[] sharedSecretValue = P.Export().X.ToByteArray(keyBytes, false); // KDF _kdf.SharedInfo = _sharedInfo; return(_kdf.Calculate(sharedSecretValue, keyDataLength)); }