コード例 #1
0
        /*public static void crypto_sign(
         *        byte[] sm, out int smlen,
         *         byte[] m, int mlen,
         *         byte[] sk
         *      )
         *      {
         *              byte[] az = new byte[64];
         *              byte[] r = new byte[64];
         *              byte[] hram = new byte[64];
         *              GroupElementP3 R;
         *              int i;
         *
         *              Helpers.crypto_hash_sha512(az, sk, 0, 32);
         *              az[0] &= 248;
         *              az[31] &= 63;
         *              az[31] |= 64;
         *
         *              smlen = mlen + 64;
         *              for (i = 0; i < mlen; ++i) sm[64 + i] = m[i];
         *              for (i = 0; i < 32; ++i) sm[32 + i] = az[32 + i];
         *              Helpers.crypto_hash_sha512(r, sm, 32, mlen + 32);
         *              for (i = 0; i < 32; ++i) sm[32 + i] = sk[32 + i];
         *
         *              ScalarOperations.sc_reduce(r);
         *              GroupOperations.ge_scalarmult_base(out R, r, 0);
         *              GroupOperations.ge_p3_tobytes(sm, 0, ref R);
         *
         *              Helpers.crypto_hash_sha512(hram, sm, 0, mlen + 64);
         *              ScalarOperations.sc_reduce(hram);
         *              var sm32 = new byte[32];
         *              Array.Copy(sm, 32, sm32, 0, 32);
         *              ScalarOperations.sc_muladd(sm32, hram, az, r);
         *              Array.Copy(sm32, 0, sm, 32, 32);
         *      }*/

        internal static void crypto_sign2(byte[] sig, int sigoffset, byte[] m, int moffset, int mlen, byte[] sk, int skoffset)
        {
            byte[] az;
            byte[] r;
            byte[] hram;
            var    hasher = new Sha512();
            {
                hasher.Update(sk, skoffset, 32);
                az = hasher.Finish();
                ScalarOperations.sc_clamp(az, 0);

                hasher.Init();
                hasher.Update(az, 32, 32);
                hasher.Update(m, moffset, mlen);
                r = hasher.Finish();

                ScalarOperations.sc_reduce(r);
                GroupOperations.ge_scalarmult_base(out GroupElementP3 R, r, 0);
                GroupOperations.ge_p3_tobytes(sig, sigoffset, ref R);

                hasher.Init();
                hasher.Update(sig, sigoffset, 32);
                hasher.Update(sk, skoffset + 32, 32);
                hasher.Update(m, moffset, mlen);
                hram = hasher.Finish();

                ScalarOperations.sc_reduce(hram);
                var s = new byte[32];                 // TODO: remove allocation
                Array.Copy(sig, sigoffset + 32, s, 0, 32);
                ScalarOperations.sc_muladd(s, hram, az, r);
                Array.Copy(s, 0, sig, sigoffset + 32, 32);
                CryptoBytes.Wipe(s);
            }
        }
コード例 #2
0
        public static void crypto_sign2(Span <byte> sig, ReadOnlySpan <byte> m, ReadOnlySpan <byte> sk)
        {
            var hasher = new Sha512();
            {
                hasher.Update(sk.Slice(0, 32));
                Span <byte> az = stackalloc byte[64];
                hasher.Finish(az);
                ScalarOperations.sc_clamp(az);

                hasher.Init();
                hasher.Update(az.Slice(32, 32));
                hasher.Update(m);
                Span <byte> r = stackalloc byte[64];
                hasher.Finish(r);

                ScalarOperations.sc_reduce(r);
                GroupOperations.ge_scalarmult_base(out var R, r);
                GroupOperations.ge_p3_tobytes(sig, in R);

                hasher.Init();
                hasher.Update(sig.Slice(0, 32));
                hasher.Update(sk.Slice(32, 32));
                hasher.Update(m);
                Span <byte> hram = stackalloc byte[64];
                hasher.Finish(hram);

                ScalarOperations.sc_reduce(hram);
                ScalarOperations.sc_muladd(sig.Slice(32, 32), hram, az, r);
            }
        }
コード例 #3
0
ファイル: sign.cs プロジェクト: kodlar/stellar-sdk
        /*public static void crypto_sign(
         * byte[] sm, out int smlen,
         * byte[] m, int mlen,
         * byte[] sk
         * )
         * {
         *  byte[] az = new byte[64];
         *  byte[] r = new byte[64];
         *  byte[] hram = new byte[64];
         *  GroupElementP3 R;
         *  int i;
         *
         *  Helpers.crypto_hash_sha512(az, sk, 0, 32);
         *  az[0] &= 248;
         *  az[31] &= 63;
         *  az[31] |= 64;
         *
         *  smlen = mlen + 64;
         *  for (i = 0; i < mlen; ++i) sm[64 + i] = m[i];
         *  for (i = 0; i < 32; ++i) sm[32 + i] = az[32 + i];
         *  Helpers.crypto_hash_sha512(r, sm, 32, mlen + 32);
         *  for (i = 0; i < 32; ++i) sm[32 + i] = sk[32 + i];
         *
         *  ScalarOperations.sc_reduce(r);
         *  GroupOperations.ge_scalarmult_base(out R, r, 0);
         *  GroupOperations.ge_p3_tobytes(sm, 0, ref R);
         *
         *  Helpers.crypto_hash_sha512(hram, sm, 0, mlen + 64);
         *  ScalarOperations.sc_reduce(hram);
         *  var sm32 = new byte[32];
         *  Array.Copy(sm, 32, sm32, 0, 32);
         *  ScalarOperations.sc_muladd(sm32, hram, az, r);
         *  Array.Copy(sm32, 0, sm, 32, 32);
         * }*/

        public static void crypto_sign2(
            byte[] sig, int sigoffset,
            byte[] m, int moffset, int mlen,
            byte[] sk, int skoffset)
        {
            var hasher = new Sha512();
            {
                hasher.Update(sk, skoffset, 32);
                var az = hasher.Finish();
                stellar_dotnet_sdk.chaos.nacl.Internal.Ed25519Ref10.ScalarOperations.ScClamp(az, 0);

                hasher.Init();
                hasher.Update(az, 32, 32);
                hasher.Update(m, moffset, mlen);
                var r = hasher.Finish();

                stellar_dotnet_sdk.chaos.nacl.Internal.Ed25519Ref10.ScalarOperations.ScReduce(r);
                GroupElementP3 R;
                stellar_dotnet_sdk.chaos.nacl.Internal.Ed25519Ref10.GroupOperations.GeScalarmultBase(out R, r, 0);
                stellar_dotnet_sdk.chaos.nacl.Internal.Ed25519Ref10.GroupOperations.ge_p3_tobytes(sig, sigoffset, ref R);

                hasher.Init();
                hasher.Update(sig, sigoffset, 32);
                hasher.Update(sk, skoffset + 32, 32);
                hasher.Update(m, moffset, mlen);
                var hram = hasher.Finish();

                stellar_dotnet_sdk.chaos.nacl.Internal.Ed25519Ref10.ScalarOperations.ScReduce(hram);
                var s = new byte[32];
                Array.Copy(sig, sigoffset + 32, s, 0, 32);
                stellar_dotnet_sdk.chaos.nacl.Internal.Ed25519Ref10.ScalarOperations.ScMulAdd(s, hram, az, r);
                Array.Copy(s, 0, sig, sigoffset + 32, 32);
                CryptoBytes.Wipe(s);
            }
        }
コード例 #4
0
ファイル: open.cs プロジェクト: FihlaTV/csharp-stellar-base
        // Original crypto_sign_open, for reference only
        /*public static int crypto_sign_open(
          byte[] m, out int mlen,
          byte[] sm, int smlen,
          byte[] pk)
        {
            byte[] h = new byte[64];
            byte[] checkr = new byte[32];
            GroupElementP3 A;
            GroupElementP2 R;
            int i;

            mlen = -1;
            if (smlen < 64) return -1;
            if ((sm[63] & 224) != 0) return -1;
            if (GroupOperations.ge_frombytes_negate_vartime(out A, pk, 0) != 0) return -1;

            for (i = 0; i < smlen; ++i) m[i] = sm[i];
            for (i = 0; i < 32; ++i) m[32 + i] = pk[i];
            Sha512BclWrapper.crypto_hash_sha512(h, m, 0, smlen);
            ScalarOperations.sc_reduce(h);

            var sm32 = new byte[32];
            Array.Copy(sm, 32, sm32, 0, 32);
            GroupOperations.ge_double_scalarmult_vartime(out R, h, ref A, sm32);
            GroupOperations.ge_tobytes(checkr, 0, ref R);
            if (Helpers.crypto_verify_32(checkr, sm) != 0)
            {
                for (i = 0; i < smlen; ++i)
                    m[i] = 0;
                return -1;
            }

            for (i = 0; i < smlen - 64; ++i)
                m[i] = sm[64 + i];
            for (i = smlen - 64; i < smlen; ++i)
                m[i] = 0;
            mlen = smlen - 64;
            return 0;
        }*/

        public static bool crypto_sign_verify(
            byte[] sig, int sigoffset,
            byte[] m, int moffset, int mlen,
            byte[] pk, int pkoffset)
        {
            byte[] h;
            byte[] checkr = new byte[32];
            GroupElementP3 A;
            GroupElementP2 R;

            if ((sig[sigoffset + 63] & 224) != 0) return false;
            if (GroupOperations.ge_frombytes_negate_vartime(out A, pk, pkoffset) != 0)
                return false;

            var hasher = new Sha512();
            hasher.Update(sig, sigoffset, 32);
            hasher.Update(pk, pkoffset, 32);
            hasher.Update(m, moffset, mlen);
            h = hasher.Finish();

            ScalarOperations.sc_reduce(h);

            var sm32 = new byte[32];//todo: remove allocation
            Array.Copy(sig, sigoffset + 32, sm32, 0, 32);
            GroupOperations.ge_double_scalarmult_vartime(out R, h, ref A, sm32);
            GroupOperations.ge_tobytes(checkr, 0, ref R);
            var result = CryptoBytes.ConstantTimeEquals(checkr, 0, sig, sigoffset, 32);
            CryptoBytes.Wipe(h);
            CryptoBytes.Wipe(checkr);
            return result;
        }
コード例 #5
0
ファイル: Sha512Tests.cs プロジェクト: Splamy/Chaos.NaCl
        public void Sha512_Split()
        {
            // use only a subset of possible indices to speed up the test
            var indices = Enumerable.Range(0, 300).Where(i => (i % 64) < 5 || (i % 64) > 64 - 5).ToArray();

            var sha512Framework = new SHA512Managed();

            foreach (var k in indices)
            {
                foreach (var m in indices)
                {
                    foreach (var n in indices)
                    {
                        var message      = Enumerable.Range(1, k + m + n).Select(i => (byte)i).ToArray();
                        var hashExpected = sha512Framework.ComputeHash(message);
                        var hasher       = new Sha512();
                        hasher.Update(message, 0, k);
                        hasher.Update(message, k, m);
                        hasher.Update(message, k + m, n);
                        var hash = hasher.Finish();
                        TestHelpers.AssertEqualBytes(hashExpected, hash);
                    }
                }
            }
        }
コード例 #6
0
        public static bool crypto_sign_verify(ReadOnlySpan <byte> sig, ReadOnlySpan <byte> m, ReadOnlySpan <byte> pk)
        {
            if ((sig[63] & 224) != 0)
            {
                return(false);
            }
            if (GroupOperations.ge_frombytes_negate_vartime(out var A, pk) != 0)
            {
                return(false);
            }

            var hasher = new Sha512();

            hasher.Update(sig.Slice(0, 32));
            hasher.Update(pk.Slice(0, 32));
            hasher.Update(m);
            Span <byte> h = stackalloc byte[64];

            hasher.Finish(h);

            ScalarOperations.sc_reduce(h);

            GroupOperations.ge_double_scalarmult_vartime(out var R, h, in A, sig.Slice(32, 32));
            Span <byte> checkr = stackalloc byte[32];

            GroupOperations.ge_tobytes(checkr, in R);
            var result = CryptoBytes.ConstantTimeEquals(checkr, sig, 32);

            CryptoBytes.Wipe(h);
            CryptoBytes.Wipe(checkr);
            return(result);
        }
コード例 #7
0
        public void Sha512_Reuse()
        {
            var message = Enumerable.Range(1, 100).Select(i => (byte)i).ToArray();
            var sha512Framework = new SHA512Managed();
            var hashExpected = sha512Framework.ComputeHash(message);

            var hasher = new Sha512();
            hasher.Update(message, 0, message.Length);
            var hash1 = hasher.Finish();
            Assert.AreEqual(BitConverter.ToString(hashExpected), BitConverter.ToString(hash1));

            hasher.Init();
            hasher.Update(message, 0, message.Length);
            var hash2 = hasher.Finish();
            Assert.AreEqual(BitConverter.ToString(hashExpected), BitConverter.ToString(hash2));
        }
コード例 #8
0
ファイル: Sha512Tests.cs プロジェクト: Splamy/Chaos.NaCl
        public void Sha512_Reuse()
        {
            var message         = Enumerable.Range(1, 100).Select(i => (byte)i).ToArray();
            var sha512Framework = new SHA512Managed();
            var hashExpected    = sha512Framework.ComputeHash(message);

            var hasher = new Sha512();

            hasher.Update(message, 0, message.Length);
            var hash1 = hasher.Finish();

            TestHelpers.AssertEqualBytes(hashExpected, hash1);

            hasher.Init();
            hasher.Update(message, 0, message.Length);
            var hash2 = hasher.Finish();

            TestHelpers.AssertEqualBytes(hashExpected, hash2);
        }
コード例 #9
0
ファイル: Sha512Tests.cs プロジェクト: Splamy/Chaos.NaCl
        public void Sha512OutputSegments()
        {
            var message      = new[] { (byte)'a', (byte)'b', (byte)'c' };
            var hashExpected = _sha512HashAbc;
            var sha512       = new Sha512();

            sha512.Update(message, 0, message.Length);
            var output = new byte[64].Pad();

            sha512.Finish(output);
            TestHelpers.AssertEqualBytes(hashExpected, output.UnPad());
        }
コード例 #10
0
ファイル: sign.cs プロジェクト: jasonmccampbell/Chaos.NaCl
		/*public static void crypto_sign(
		  byte[] sm, out int smlen,
		   byte[] m, int mlen,
		   byte[] sk
		)
		{
			byte[] az = new byte[64];
			byte[] r = new byte[64];
			byte[] hram = new byte[64];
			GroupElementP3 R;
			int i;

			Helpers.crypto_hash_sha512(az, sk, 0, 32);
			az[0] &= 248;
			az[31] &= 63;
			az[31] |= 64;

			smlen = mlen + 64;
			for (i = 0; i < mlen; ++i) sm[64 + i] = m[i];
			for (i = 0; i < 32; ++i) sm[32 + i] = az[32 + i];
			Helpers.crypto_hash_sha512(r, sm, 32, mlen + 32);
			for (i = 0; i < 32; ++i) sm[32 + i] = sk[32 + i];

			ScalarOperations.sc_reduce(r);
			GroupOperations.ge_scalarmult_base(out R, r, 0);
			GroupOperations.ge_p3_tobytes(sm, 0, ref R);

			Helpers.crypto_hash_sha512(hram, sm, 0, mlen + 64);
			ScalarOperations.sc_reduce(hram);
			var sm32 = new byte[32];
			Array.Copy(sm, 32, sm32, 0, 32);
			ScalarOperations.sc_muladd(sm32, hram, az, r);
			Array.Copy(sm32, 0, sm, 32, 32);
		}*/

		public static void crypto_sign2(
			byte[] sig, int sigoffset,
			byte[] m, int moffset, int mlen,
			byte[] sk, int skoffset)
		{
			byte[] az;
			byte[] r;
			byte[] hram;
			GroupElementP3 R;
		    var hasher = new Sha512();
			{
                hasher.Update(sk, skoffset, 32);
			    az = hasher.Finish();
				az[0] &= 248;
				az[31] &= 63;
				az[31] |= 64;

			    hasher.Init();
				hasher.Update(az, 32, 32);
				hasher.Update(m, moffset, mlen);
				r = hasher.Finish();

				ScalarOperations.sc_reduce(r);
				GroupOperations.ge_scalarmult_base(out R, r, 0);
				GroupOperations.ge_p3_tobytes(sig, sigoffset, ref R);

				hasher.Init();
				hasher.Update(sig, sigoffset, 32);
				hasher.Update(sk, skoffset + 32, 32);
				hasher.Update(m, moffset, mlen);
				hram = hasher.Finish();

				ScalarOperations.sc_reduce(hram);
				var s = new byte[32];//todo: remove allocation
				Array.Copy(sig, sigoffset + 32, s, 0, 32);
				ScalarOperations.sc_muladd(s, hram, az, r);
				Array.Copy(s, 0, sig, sigoffset + 32, 32);
				CryptoBytes.Wipe(s);
			}
		}
コード例 #11
0
ファイル: sign.cs プロジェクト: mocolicious/kin-csharp-sdk
        /*public static void crypto_sign(
         * byte[] sm, out int smlen,
         * byte[] m, int mlen,
         * byte[] sk
         * )
         * {
         *  byte[] az = new byte[64];
         *  byte[] r = new byte[64];
         *  byte[] hram = new byte[64];
         *  GroupElementP3 R;
         *  int i;
         *
         *  Helpers.crypto_hash_sha512(az, sk, 0, 32);
         *  az[0] &= 248;
         *  az[31] &= 63;
         *  az[31] |= 64;
         *
         *  smlen = mlen + 64;
         *  for (i = 0; i < mlen; ++i) sm[64 + i] = m[i];
         *  for (i = 0; i < 32; ++i) sm[32 + i] = az[32 + i];
         *  Helpers.crypto_hash_sha512(r, sm, 32, mlen + 32);
         *  for (i = 0; i < 32; ++i) sm[32 + i] = sk[32 + i];
         *
         *  ScalarOperations.sc_reduce(r);
         *  GroupOperations.ge_scalarmult_base(out R, r, 0);
         *  GroupOperations.ge_p3_tobytes(sm, 0, ref R);
         *
         *  Helpers.crypto_hash_sha512(hram, sm, 0, mlen + 64);
         *  ScalarOperations.sc_reduce(hram);
         *  var sm32 = new byte[32];
         *  Array.Copy(sm, 32, sm32, 0, 32);
         *  ScalarOperations.sc_muladd(sm32, hram, az, r);
         *  Array.Copy(sm32, 0, sm, 32, 32);
         * }*/

        public static void crypto_sign2(
            byte[] sig, int sigoffset,
            byte[] m, int moffset, int mlen,
            byte[] sk, int skoffset)
        {
            Sha512 hasher = new Sha512();

            {
                hasher.Update(sk, skoffset, 32);
                byte[] az = hasher.Finish();
                ScalarOperations.ScClamp(az, 0);

                hasher.Init();
                hasher.Update(az, 32, 32);
                hasher.Update(m, moffset, mlen);
                byte[] r = hasher.Finish();

                ScalarOperations.ScReduce(r);
                GroupElementP3 R;
                GroupOperations.GeScalarmultBase(out R, r, 0);
                GroupOperations.ge_p3_tobytes(sig, sigoffset, ref R);

                hasher.Init();
                hasher.Update(sig, sigoffset, 32);
                hasher.Update(sk, skoffset + 32, 32);
                hasher.Update(m, moffset, mlen);
                byte[] hram = hasher.Finish();

                ScalarOperations.ScReduce(hram);
                byte[] s = new byte[32];
                Array.Copy(sig, sigoffset + 32, s, 0, 32);
                ScalarOperations.ScMulAdd(s, hram, az, r);
                Array.Copy(s, 0, sig, sigoffset + 32, 32);
                CryptoBytes.Wipe(s);
            }
        }
コード例 #12
0
ファイル: Sha512Tests.cs プロジェクト: ShenNoether/Chaos.NaCl
        public void Sha512_Reuse()
        {
            var message = Enumerable.Range(1, 100).Select(i => (byte)i).ToArray();
            var sha512Framework = new SHA512Managed();
            var hashExpected = sha512Framework.ComputeHash(message);

            var hasher = new Sha512();
            hasher.Update(message, 0, message.Length);
            var hash1 = hasher.Finish();
            TestHelpers.AssertEqualBytes(hashExpected, hash1);

            hasher.Init();
            hasher.Update(message, 0, message.Length);
            var hash2 = hasher.Finish();
            TestHelpers.AssertEqualBytes(hashExpected, hash2);
        }
コード例 #13
0
ファイル: Sha512Tests.cs プロジェクト: ShenNoether/Chaos.NaCl
        public void Sha512_Split()
        {
            // use only a subset of possible indices to speed up the test
            var indices = Enumerable.Range(0, 300).Where(i => (i % 64) < 5 || (i % 64) > 64 - 5).ToArray();

            var sha512Framework = new SHA512Managed();
            foreach (var k in indices)
                foreach (var m in indices)
                    foreach (var n in indices)
                    {
                        var message = Enumerable.Range(1, k + m + n).Select(i => (byte)i).ToArray();
                        var hashExpected = sha512Framework.ComputeHash(message);
                        var hasher = new Sha512();
                        hasher.Update(message, 0, k);
                        hasher.Update(message, k, m);
                        hasher.Update(message, k + m, n);
                        var hash = hasher.Finish();
                        TestHelpers.AssertEqualBytes(hashExpected, hash);
                    }
        }
コード例 #14
0
        // Original crypto_sign_open, for reference only

        /*public static int crypto_sign_open(
         * byte[] m, out int mlen,
         * byte[] sm, int smlen,
         * byte[] pk)
         * {
         *  byte[] h = new byte[64];
         *  byte[] checkr = new byte[32];
         *  GroupElementP3 A;
         *  GroupElementP2 R;
         *  int i;
         *
         *  mlen = -1;
         *  if (smlen < 64) return -1;
         *  if ((sm[63] & 224) != 0) return -1;
         *  if (GroupOperations.ge_frombytes_negate_vartime(out A, pk, 0) != 0) return -1;
         *
         *  for (i = 0; i < smlen; ++i) m[i] = sm[i];
         *  for (i = 0; i < 32; ++i) m[32 + i] = pk[i];
         *  Sha512BclWrapper.crypto_hash_sha512(h, m, 0, smlen);
         *  ScalarOperations.sc_reduce(h);
         *
         *  var sm32 = new byte[32];
         *  Array.Copy(sm, 32, sm32, 0, 32);
         *  GroupOperations.ge_double_scalarmult_vartime(out R, h, ref A, sm32);
         *  GroupOperations.ge_tobytes(checkr, 0, ref R);
         *  if (Helpers.crypto_verify_32(checkr, sm) != 0)
         *  {
         *      for (i = 0; i < smlen; ++i)
         *          m[i] = 0;
         *      return -1;
         *  }
         *
         *  for (i = 0; i < smlen - 64; ++i)
         *      m[i] = sm[64 + i];
         *  for (i = smlen - 64; i < smlen; ++i)
         *      m[i] = 0;
         *  mlen = smlen - 64;
         *  return 0;
         * }*/

        public static bool crypto_sign_verify(
            byte[] sig, int sigoffset,
            byte[] m, int moffset, int mlen,
            byte[] pk, int pkoffset)
        {
            byte[]         h;
            byte[]         checkr = new byte[32];
            GroupElementP3 A;
            GroupElementP2 R;

            if ((sig[sigoffset + 63] & 224) != 0)
            {
                return(false);
            }
            if (GroupOperations.ge_frombytes_negate_vartime(out A, pk, pkoffset) != 0)
            {
                return(false);
            }

            var hasher = new Sha512();

            hasher.Update(sig, sigoffset, 32);
            hasher.Update(pk, pkoffset, 32);
            hasher.Update(m, moffset, mlen);
            h = hasher.Finish();

            ScalarOperations.sc_reduce(h);

            var sm32 = new byte[32];//todo: remove allocation

            Array.Copy(sig, sigoffset + 32, sm32, 0, 32);
            GroupOperations.ge_double_scalarmult_vartime(out R, h, ref A, sm32);
            GroupOperations.ge_tobytes(checkr, 0, ref R);
            var result = CryptoBytes.ConstantTimeEquals(checkr, 0, sig, sigoffset, 32);

            CryptoBytes.Wipe(h);
            CryptoBytes.Wipe(checkr);
            return(result);
        }
コード例 #15
0
ファイル: open.cs プロジェクト: alphapoint/dotnet-stellar-sdk
        // Original crypto_sign_open, for reference only

        /*public static int crypto_sign_open(
         * byte[] m, out int mlen,
         * byte[] sm, int smlen,
         * byte[] pk)
         * {
         *  byte[] h = new byte[64];
         *  byte[] checkr = new byte[32];
         *  GroupElementP3 A;
         *  GroupElementP2 R;
         *  int i;
         *
         *  mlen = -1;
         *  if (smlen < 64) return -1;
         *  if ((sm[63] & 224) != 0) return -1;
         *  if (GroupOperations.ge_frombytes_negate_vartime(out A, pk, 0) != 0) return -1;
         *
         *  for (i = 0; i < smlen; ++i) m[i] = sm[i];
         *  for (i = 0; i < 32; ++i) m[32 + i] = pk[i];
         *  Sha512BclWrapper.crypto_hash_sha512(h, m, 0, smlen);
         *  ScalarOperations.sc_reduce(h);
         *
         *  var sm32 = new byte[32];
         *  Array.Copy(sm, 32, sm32, 0, 32);
         *  GroupOperations.ge_double_scalarmult_vartime(out R, h, ref A, sm32);
         *  GroupOperations.ge_tobytes(checkr, 0, ref R);
         *  if (Helpers.crypto_verify_32(checkr, sm) != 0)
         *  {
         *      for (i = 0; i < smlen; ++i)
         *          m[i] = 0;
         *      return -1;
         *  }
         *
         *  for (i = 0; i < smlen - 64; ++i)
         *      m[i] = sm[64 + i];
         *  for (i = smlen - 64; i < smlen; ++i)
         *      m[i] = 0;
         *  mlen = smlen - 64;
         *  return 0;
         * }*/

        public static bool CryptoSignVerify(
            byte[] sig, int sigoffset,
            byte[] m, int moffset, int mlen,
            byte[] pk, int pkoffset)
        {
            var            checkr = new byte[32];
            GroupElementP3 A;
            GroupElementP2 R;

            if ((sig[sigoffset + 63] & 224) != 0)
            {
                return(false);
            }
            if (stellar_dotnet_sdk.chaos.nacl.Internal.Ed25519Ref10.GroupOperations.ge_frombytes_negate_vartime(out A, pk, pkoffset) != 0)
            {
                return(false);
            }

            var hasher = new Sha512();

            hasher.Update(sig, sigoffset, 32);
            hasher.Update(pk, pkoffset, 32);
            hasher.Update(m, moffset, mlen);
            var h = hasher.Finish();

            ScalarOperations.ScReduce(h);

            var sm32 = new byte[32]; //todo: remove allocation

            Array.Copy(sig, sigoffset + 32, sm32, 0, 32);
            stellar_dotnet_sdk.chaos.nacl.Internal.Ed25519Ref10.GroupOperations.ge_double_scalarmult_vartime(out R, h, ref A, sm32);
            stellar_dotnet_sdk.chaos.nacl.Internal.Ed25519Ref10.GroupOperations.GeToBytes(checkr, 0, ref R);
            var result = CryptoBytes.ConstantTimeEquals(checkr, 0, sig, sigoffset, 32);

            CryptoBytes.Wipe(h);
            CryptoBytes.Wipe(checkr);
            return(result);
        }
コード例 #16
0
        public void Sha512OutputSegmentsIncorretOutputSize()
        {
            var sha512 = new Sha512();

            Assert.Throws <ArgumentException>(() => sha512.Finish(new byte[32].Pad()));
        }
コード例 #17
0
ファイル: Sha512Tests.cs プロジェクト: ShenNoether/Chaos.NaCl
 public void Sha512OutputSegments()
 {
     var message = new[] { (byte)'a', (byte)'b', (byte)'c' };
     var hashExpected = _sha512HashAbc;
     var sha512 = new Sha512();
     sha512.Update(message, 0, message.Length);
     var output = new byte[64].Pad();
     sha512.Finish(output);
     TestHelpers.AssertEqualBytes(hashExpected, output.UnPad());
 }
コード例 #18
0
ファイル: Sha512Tests.cs プロジェクト: Splamy/Chaos.NaCl
        public void Sha512OutputSegmentsIncorretOutputSize()
        {
            var sha512 = new Sha512();

            sha512.Finish(new byte[32].Pad());
        }
コード例 #19
0
ファイル: Sha512Tests.cs プロジェクト: Splamy/Chaos.NaCl
        public void Sha512OutputSegmentsNull()
        {
            var sha512 = new Sha512();

            sha512.Finish(default(ArraySegment <byte>));
        }
コード例 #20
0
ファイル: Sha512Tests.cs プロジェクト: ShenNoether/Chaos.NaCl
 public void Sha512OutputSegmentsNull()
 {
     var sha512 = new Sha512();
     sha512.Finish(default(ArraySegment<byte>));
 }
コード例 #21
0
ファイル: Sha512Tests.cs プロジェクト: ShenNoether/Chaos.NaCl
 public void Sha512OutputSegmentsIncorretOutputSize()
 {
     var sha512 = new Sha512();
     sha512.Finish(new byte[32].Pad());
 }
コード例 #22
0
        public void Sha512OutputSegmentsNull()
        {
            var sha512 = new Sha512();

            Assert.Throws <ArgumentNullException>(() => sha512.Finish(default(ArraySegment <byte>)));
        }