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); }
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); }
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); }
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); }
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); }
/// <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) { }
/// <summary> /// Curve448 Montgomery Curve /// </summary> /// <param name="Curve">Curve instance</param> public Curve448Endpoint(Curve448 Curve) : this(Curve, new AeadChaCha20Poly1305()) { }
public void Test_27_Sqrt_156324() { Curve448 C = new Curve448(); CalcSqrt(156324, C.Prime); }