示例#1
0
        public bool ValidatePublicKey()
        {
            if (_d == null || _Q == null)
            {
                return(true);
            }
            ECPoint point1 = _Q.Export();
            ECPoint point2 = _domain.G.Multiply(_d).Export();

            return(point1.X.CompareTo(point2.X) == 0 &&
                   point1.Y.CompareTo(point2.Y) == 0 &&
                   point1.Z.CompareTo(point2.Z) == 0);
        }
示例#2
0
        /// <summary>
        /// TODO: 未実装のValidationステップを実装する
        /// </summary>
        public bool Validate()
        {
            IFiniteField ff = _group.FiniteField;

            // Step1: Check that p is an odd prime
            // Step2: Check that a,b,Gx and Gy are integers in the interval [0, p - 1]
            ECPoint ExportedG = _G.Export();
            Number  Gx        = ff.ToElement(ExportedG.X);
            Number  Gy        = ff.ToElement(ExportedG.Y);

            if (A > P || B > P || Gx > P || Gy > P)
            {
                return(false);
            }

            // Step3: Check that 4*a^3 + 27*b^2 != 0 (mod p)
            Number Apow3 = ff.Multiply(A, ff.Multiply(A, A));
            Number Bpow2 = ff.Multiply(B, B);
            Number ret   = ff.Add(ff.Multiply(ff.ToElement(Number.Four), ff.ToElement(Apow3)), ff.Multiply(ff.ToElement(Number.TwentySeven), Bpow2));

            if (ret.IsZero())
            {
                return(false);
            }

            // Step4: Gy^2 = Gx^3 + a*Gx + b
            Number aGx   = ff.Multiply(A, Gx);
            Number Xpow3 = ff.Multiply(Gx, ff.Multiply(Gx, Gx));
            Number Ypow2 = ff.Multiply(Gy, Gy);

            ret = ff.Add(Xpow3, ff.Add(aGx, B));
            if (ret.CompareTo(Ypow2) != 0)
            {
                return(false);
            }

            // Step5: Check that n is prime.
            // Step6: Check that h <= 4, and that h = (sqrt(p)+1)^2 / n

            // Step7: Check that nG = O
            ECPoint nG = _G.Multiply(N).Export();

            if (!nG.IsInifinity())
            {
                return(false);
            }

            // Step8: Check that q^B != 1 (mod n) for any 1 <= B <= 20, and that nh != p
            Number    p = Number.One;
            Classical c = new Classical(N);

            for (int i = 0; i <= 20; i++)
            {
                p = c.Multiply(p, P);
                if (p.IsOne())
                {
                    return(false);
                }
            }
            if (c.Multiply(N, new Number(new uint[] { H }, 1)).CompareTo(P) == 0)
            {
                return(false);
            }

            return(true);
        }
示例#3
0
		void PointCompressTest (int bits, ECGroup group, ECPoint p, int repeats, string name)
		{
			int bytes = (bits >> 3) + ((bits & 7) == 0 ? 0 : 1) + 1;
			for (int i = 0; i < repeats; i ++) {
				byte[] tmp = p.ToByteArray (true);
				Assert.IsTrue (tmp.Length == bytes, name + " #1");
				ECPoint x = new ECPoint (group, tmp).Export ();
				ECPoint p2 = p.Export ();
				Assert.IsTrue (x.X.CompareTo (p2.X) == 0, name + " #2");
				Assert.IsTrue (x.Y.CompareTo (p2.Y) == 0, name + " #3");
				p = p.Multiply (Number.CreateRandomElement (group.P));
			}
		}