Example #1
0
        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");
        }
Example #2
0
        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));
        }