Inheritance: IBasicAgreement
        public virtual BigInteger CalculateAgreement(ICipherParameters pubKey)
        {
            MqvPublicParameters    mqvPublicParameters = (MqvPublicParameters)pubKey;
            ECPrivateKeyParameters staticPrivateKey    = this.privParams.StaticPrivateKey;
            ECPoint eCPoint = ECMqvBasicAgreement.CalculateMqvAgreement(staticPrivateKey.Parameters, staticPrivateKey, this.privParams.EphemeralPrivateKey, this.privParams.EphemeralPublicKey, mqvPublicParameters.StaticPublicKey, mqvPublicParameters.EphemeralPublicKey).Normalize();

            if (eCPoint.IsInfinity)
            {
                throw new InvalidOperationException("Infinity is not a valid agreement value for MQV");
            }
            return(eCPoint.AffineXCoord.ToBigInteger());
        }
Beispiel #2
0
        private static BigInteger calculateAgreement(
			AsymmetricCipherKeyPair U1,
			AsymmetricCipherKeyPair U2,
			AsymmetricCipherKeyPair V1,
			AsymmetricCipherKeyPair V2)
        {
            ECMqvBasicAgreement u = new ECMqvBasicAgreement();
            u.Init(new MqvPrivateParameters(
                (ECPrivateKeyParameters)U1.Private,
                (ECPrivateKeyParameters)U2.Private,
                (ECPublicKeyParameters)U2.Public));
            BigInteger ux = u.CalculateAgreement(new MqvPublicParameters(
                (ECPublicKeyParameters)V1.Public,
                (ECPublicKeyParameters)V2.Public));

            ECMqvBasicAgreement v = new ECMqvBasicAgreement();
            v.Init(new MqvPrivateParameters(
                (ECPrivateKeyParameters)V1.Private,
                (ECPrivateKeyParameters)V2.Private,
                (ECPublicKeyParameters)V2.Public));
            BigInteger vx = v.CalculateAgreement(new MqvPublicParameters(
                (ECPublicKeyParameters)U1.Public,
                (ECPublicKeyParameters)U2.Public));

            if (ux.Equals(vx))
                return ux;

            return null;
        }
        /**
        * X9.62 - 1998,<br/>
        * J.3.1, Page 152, ECDSA over the field Fp<br/>
        * an example with 192 bit prime
        */
        private static IBigInteger CalculateAgreement(
            IAsymmetricCipherKeyPair u1,
            IAsymmetricCipherKeyPair u2,
            IAsymmetricCipherKeyPair v1,
            IAsymmetricCipherKeyPair v2)
        {
            var u = new ECMqvBasicAgreement();
            u.Init(new MqvPrivateParameters(
                       (ECPrivateKeyParameters) u1.Private,
                       (ECPrivateKeyParameters) u2.Private,
                       (ECPublicKeyParameters) u2.Public));
            IBigInteger ux = u.CalculateAgreement(new MqvPublicParameters(
                                                      (ECPublicKeyParameters) v1.Public,
                                                      (ECPublicKeyParameters) v2.Public));

            var v = new ECMqvBasicAgreement();
            v.Init(new MqvPrivateParameters(
                       (ECPrivateKeyParameters) v1.Private,
                       (ECPrivateKeyParameters) v2.Private,
                       (ECPublicKeyParameters) v2.Public));
            IBigInteger vx = v.CalculateAgreement(new MqvPublicParameters(
                                                      (ECPublicKeyParameters) u1.Public,
                                                      (ECPublicKeyParameters) u2.Public));

            if (ux.Equals(vx))
                return ux;

            return null;
        }