Esempio n. 1
0
        protected internal byte[] Sha256(StackItem item)
        {
            ReadOnlySpan <byte> value = item switch
            {
                InteropInterface _interface => _interface.GetInterface <IVerifiable>().GetHashData(),
                Null _ => ScriptContainer.GetHashData(),
                _ => item.GetSpan()
            };

            return(value.Sha256());
        }
Esempio n. 2
0
        private bool VerifyWithECDsa(StackItem item, byte[] pubkey, byte[] signature, ECCurve curve)
        {
            ReadOnlySpan <byte> message = item switch
            {
                InteropInterface _interface => _interface.GetInterface <IVerifiable>().GetHashData(),
                Null _ => ScriptContainer.GetHashData(),
                _ => item.GetSpan()
            };

            try
            {
                return(Crypto.VerifySignature(message, signature, pubkey, curve));
            }
            catch (ArgumentException)
            {
                return(false);
            }
        }
Esempio n. 3
0
        private bool CheckMultiSigWithECDsa(StackItem item0, byte[][] pubkeys, byte[][] signatures, ECCurve curve)
        {
            int m = signatures.Length, n = pubkeys.Length;
            ReadOnlySpan <byte> message = item0 switch
            {
                InteropInterface _interface => _interface.GetInterface <IVerifiable>().GetHashData(),
                Null _ => ScriptContainer.GetHashData(),
                _ => item0.GetSpan()
            };

            if (n == 0 || m == 0 || m > n)
            {
                throw new ArgumentException();
            }
            AddGas(ECDsaVerifyPrice * n * exec_fee_factor);
            try
            {
                for (int i = 0, j = 0; i < m && j < n;)
                {
                    if (Crypto.VerifySignature(message, signatures[i], pubkeys[j], curve))
                    {
                        i++;
                    }
                    j++;
                    if (m - i > n - j)
                    {
                        return(false);
                    }
                }
            }
            catch (ArgumentException)
            {
                return(false);
            }
            return(true);
        }
    }