public MqvPrivateParameters(
			ECPrivateKeyParameters	staticPrivateKey,
			ECPrivateKeyParameters	ephemeralPrivateKey,
			ECPublicKeyParameters	ephemeralPublicKey)
		{
			this.staticPrivateKey = staticPrivateKey;
			this.ephemeralPrivateKey = ephemeralPrivateKey;
			this.ephemeralPublicKey = ephemeralPublicKey;
		}
        public void Init(
			ICipherParameters parameters)
        {
			if (parameters is ParametersWithRandom)
			{
				parameters = ((ParametersWithRandom)parameters).Parameters;
			}

			this.privKey = (ECPrivateKeyParameters)parameters;
        }
		// The ECMQV Primitive as described in SEC-1, 3.4
		private static ECPoint calculateMqvAgreement(
			ECDomainParameters		parameters,
			ECPrivateKeyParameters	d1U,
			ECPrivateKeyParameters	d2U,
			ECPublicKeyParameters	Q2U,
			ECPublicKeyParameters	Q1V,
			ECPublicKeyParameters	Q2V)
		{
			BigInteger n = parameters.N;
			int e = (n.BitLength + 1) / 2;
			BigInteger powE = BigInteger.One.ShiftLeft(e);

			// The Q2U public key is optional
			ECPoint q;
			if (Q2U == null)
			{
				q = parameters.G.Multiply(d2U.D);
			}
			else
			{
				q = Q2U.Q;
			}

			BigInteger x = q.X.ToBigInteger();
			BigInteger xBar = x.Mod(powE);
			BigInteger Q2UBar = xBar.SetBit(e);
			BigInteger s = d1U.D.Multiply(Q2UBar).Mod(n).Add(d2U.D).Mod(n);

			BigInteger xPrime = Q2V.Q.X.ToBigInteger();
			BigInteger xPrimeBar = xPrime.Mod(powE);
			BigInteger Q2VBar = xPrimeBar.SetBit(e);

			BigInteger hs = parameters.H.Multiply(s).Mod(n);

			//ECPoint p = Q1V.Q.Multiply(Q2VBar).Add(Q2V.Q).Multiply(hs);
			ECPoint p = ECAlgorithms.SumOfTwoMultiplies(
				Q1V.Q, Q2VBar.Multiply(hs).Mod(n), Q2V.Q, hs);

			if (p.IsInfinity)
				throw new InvalidOperationException("Infinity is not a valid agreement value for MQV");

			return p;
		}
		public MqvPrivateParameters(
			ECPrivateKeyParameters	staticPrivateKey,
			ECPrivateKeyParameters	ephemeralPrivateKey)
			: this(staticPrivateKey, ephemeralPrivateKey, null)
		{
		}
Beispiel #5
0
 public MqvPrivateParameters(
     ECPrivateKeyParameters staticPrivateKey,
     ECPrivateKeyParameters ephemeralPrivateKey)
     : this(staticPrivateKey, ephemeralPrivateKey, null)
 {
 }
		protected bool Equals(
			ECPrivateKeyParameters other)
		{
			return d.Equals(other.d) && base.Equals(other);
		}
		protected virtual byte[] CalculateECDHBasicAgreement(ECPublicKeyParameters publicKey,
			ECPrivateKeyParameters privateKey)
		{
			ECDHBasicAgreement basicAgreement = new ECDHBasicAgreement();
			basicAgreement.Init(privateKey);
			BigInteger agreement = basicAgreement.CalculateAgreement(publicKey);
			return BigIntegers.AsUnsignedByteArray(agreement);
		}
		protected virtual void GenerateEphemeralClientKeyExchange(ECDomainParameters ecParams, Stream output)
		{
			AsymmetricCipherKeyPair ecAgreeClientKeyPair = GenerateECKeyPair(ecParams);
			this.ecAgreeClientPrivateKey = (ECPrivateKeyParameters)ecAgreeClientKeyPair.Private;

			byte[] keData = ExternalizeKey((ECPublicKeyParameters)ecAgreeClientKeyPair.Public);
			TlsUtilities.WriteUint24(keData.Length + 1, output);
			TlsUtilities.WriteOpaque8(keData, output);
		}
		internal static ECPublicKeyParameters GetCorrespondingPublicKey(
			ECPrivateKeyParameters privKey)
		{
			ECDomainParameters parameters = privKey.Parameters;
			ECPoint q = parameters.G.Multiply(privKey.D);

			if (privKey.PublicKeyParamSet != null)
			{
				return new ECPublicKeyParameters(privKey.AlgorithmName, q, privKey.PublicKeyParamSet);
			}

			return new ECPublicKeyParameters(privKey.AlgorithmName, q, parameters);
		}
 protected bool Equals(
     ECPrivateKeyParameters other)
 {
     return(d.Equals(other.d) && base.Equals(other));
 }