Пример #1
0
        public void Test_21_X448_ECDH()
        {
            byte[]   A     = Hashes.StringToBinary("9a8f4925d1519f5775cf46b04b5800d4ee9ee8bae8bc5565d498c28dd9c9baf574a9419744897391006382a6f127ab1d9ac2d8c0a598726b");
            Curve448 Alice = new Curve448(A);

            Assert.AreEqual("9b08f7cc31b7e3e67d22d5aea121074a273bd2b83de09c63faa73d2c22c5d9bbc836647241d953d40c5b12da88120d53177f80e532c41fa000",
                            Hashes.BinaryToString(Alice.PublicKey));

            A = Hashes.StringToBinary("1c306a7ac2a0e2e0990b294470cba339e6453772b075811d8fad0d1d6927c120bb5ee8972b0d3e21374c9c921b09d1b0366f10b65173992d");
            Curve448 Bob = new Curve448(A);

            Assert.AreEqual("3eb7a829b0cd20f5bcfc0b599b6feccf6da4627107bdb0d4f345b43027d8b972fc3e34fb4232a13ca706dcb57aec3dae07bdc1c67bf33609",
                            Hashes.BinaryToString(Bob.PublicKey));

            byte[] Key1 = Alice.GetSharedKey(Bob.PublicKey, Hashes.ComputeSHA256Hash);
            byte[] Key2 = Bob.GetSharedKey(Alice.PublicKey, Hashes.ComputeSHA256Hash);
            string k1   = Hashes.BinaryToString(Key1);
            string k2   = Hashes.BinaryToString(Key2);

            Assert.AreEqual(k1, k2);

            A = Hashes.StringToBinary("07fff4181ac6cc95ec1c16a94a0f74d12da232ce40a77552281d282bb60c0b56fd2464c335543936521c24403085d59a449a5037514a879d");
            if (A.Length != 56)
            {
                Array.Resize <byte>(ref A, 56);
            }

            Array.Reverse(A);   // Most significant byte first.

            A = Hashes.ComputeSHA256Hash(A);
            string k3 = Hashes.BinaryToString(A);

            Assert.AreEqual(k1, k3);
        }
Пример #2
0
        private void X448_TestVector_3(int i, string HexResult)
        {
            MontgomeryCurve C = new Curve448();
            BigInteger      N = 5;
            BigInteger      U = 5;
            BigInteger      NU;

            while (i-- > 0)
            {
                byte[] NBin = N.ToByteArray();
                if (NBin.Length != 56)
                {
                    Array.Resize <byte>(ref NBin, 56);
                }

                NBin[0]  &= 0xfc;
                NBin[55] |= 0x80;

                NU = C.ScalarMultiplication(NBin, U);

                U = N;
                N = NU;
            }

            byte[]     A   = Hashes.StringToBinary(HexResult);
            BigInteger NU0 = new BigInteger(A);

            Assert.AreEqual(NU0, NU);
        }
Пример #3
0
        public void Test_17_X448_TestVector_2()
        {
            byte[] A = Hashes.StringToBinary("203d494428b8399352665ddca42f9de8fef600908e0d461cb021f8c538345dd77c3e4806e25f46d3315c44e0a5b4371282dd2c8d5be3095f");
            A[0]  &= 252;
            A[55] |= 128;
            Array.Resize(ref A, 57);
            BigInteger N0 = new BigInteger(A);
            BigInteger N  = BigInteger.Parse("633254335906970592779259481534862372382525155252028961056404001332122152890562527156973881968934311400345568203929409663925541994577184");

            Assert.AreEqual(N, N0);

            A = Hashes.StringToBinary("0fbcc2f993cd56d3305b0b7d9e55d4c1a8fb5dbb52f8e9a1e9b6201b165d015894e56c4d3570bee52fe205e28a78b91cdfbde71ce8d157db");
            Array.Resize(ref A, 57);
            BigInteger U0 = new BigInteger(A);
            BigInteger U  = BigInteger.Parse("622761797758325444462922068431234180649590390024811299761625153767228042600197997696167956134770744996690267634159427999832340166786063");

            Assert.AreEqual(U, U0);

            A = Hashes.StringToBinary("884a02576239ff7a2f2f63b2db6a9ff37047ac13568e1e30fe63c4a7ad1b3ee3a5700df34321d62077e63633c575c1c954514e99da7c179d");
            Array.Resize(ref A, 57);
            BigInteger      NU0 = new BigInteger(A);
            MontgomeryCurve C   = new Curve448();
            BigInteger      NU  = C.ScalarMultiplication(N, U);

            Assert.AreEqual(NU0, NU);
        }
Пример #4
0
        public void Test_16_X448_TestVector_1()
        {
            byte[] A = Hashes.StringToBinary("3d262fddf9ec8e88495266fea19a34d28882acef045104d0d1aae121700a779c984c24f8cdd78fbff44943eba368f54b29259a4f1c600ad3");
            A[0]  &= 252;
            A[55] |= 128;
            Array.Resize(ref A, 57);
            BigInteger N0 = new BigInteger(A);
            BigInteger N  = BigInteger.Parse("599189175373896402783756016145213256157230856085026129926891459468622403380588640249457727683869421921443004045221642549886377526240828");

            Assert.AreEqual(N, N0);

            A = Hashes.StringToBinary("06fce640fa3487bfda5f6cf2d5263f8aad88334cbd07437f020f08f9814dc031ddbdc38c19c6da2583fa5429db94ada18aa7a7fb4ef8a086");
            Array.Resize(ref A, 57);
            BigInteger U0 = new BigInteger(A);
            BigInteger U  = BigInteger.Parse("382239910814107330116229961234899377031416365240571325148346555922438025162094455820962429142971339584360034337310079791515452463053830");

            Assert.AreEqual(U, U0);

            A = Hashes.StringToBinary("ce3e4ff95a60dc6697da1db1d85e6afbdf79b50a2412d7546d5f239fe14fbaadeb445fc66a01b0779d98223961111e21766282f73dd96b6f");
            Array.Resize(ref A, 57);
            BigInteger      NU0 = new BigInteger(A);
            MontgomeryCurve C   = new Curve448();
            BigInteger      NU  = C.ScalarMultiplication(N, U);

            Assert.AreEqual(NU0, NU);
        }
Пример #5
0
        public void Test_08_Coordinates_448()
        {
            MontgomeryCurve C = new Curve448();

            PointOnCurve UV = C.BasePoint;
            PointOnCurve XY = C.ToXY(UV);

            Edwards448   C2  = new Edwards448();
            PointOnCurve XY4 = C2.ScalarMultiplication(4, C2.BasePoint, true);  // 4-isogeny

            Assert.AreEqual(XY4.X, XY.X);
            Assert.AreEqual(XY4.Y, XY.Y);

            PointOnCurve UV2 = C.ToUV(XY);
            PointOnCurve UV4 = C.ScalarMultiplication(4, C.BasePoint, true);

            Assert.AreEqual(UV4.X, UV2.X);

            BigInteger V4 = C.CalcV(UV4.X);

            Assert.IsTrue(V4 == UV2.Y || (C.Prime - V4) == UV2.Y);
        }
Пример #6
0
 /// <summary>
 /// Curve448 Montgomery Curve
 /// </summary>
 /// <param name="Curve">Curve instance</param>
 /// <param name="SymmetricCipher">Symmetric cipher to use by default.</param>
 public Curve448Endpoint(Curve448 Curve, IE2eSymmetricCipher SymmetricCipher)
     : base(Curve, SymmetricCipher)
 {
 }
Пример #7
0
 /// <summary>
 /// Curve448 Montgomery Curve
 /// </summary>
 /// <param name="Curve">Curve instance</param>
 public Curve448Endpoint(Curve448 Curve)
     : this(Curve, new AeadChaCha20Poly1305())
 {
 }
Пример #8
0
        public void Test_27_Sqrt_156324()
        {
            Curve448 C = new Curve448();

            CalcSqrt(156324, C.Prime);
        }