private static ICollection <string> VerifyTransactionSignatures(Transaction transaction,
                                                                        IEnumerable <string> signers, Network network)
        {
            var txHash         = transaction.Hash(network);
            var signaturesUsed = new Dictionary <xdr.DecoratedSignature, string>();
            var signersFound   = new HashSet <string>();

            foreach (var signer in signers)
            {
                var keypair = KeyPair.FromAccountId(signer);
                foreach (var signature in transaction.Signatures)
                {
                    if (signaturesUsed.ContainsKey(signature))
                    {
                        continue;
                    }

                    if (!signature.Hint.InnerValue.SequenceEqual(keypair.SignatureHint.InnerValue))
                    {
                        continue;
                    }

                    if (keypair.Verify(txHash, signature.Signature))
                    {
                        signaturesUsed[signature] = keypair.Address;
                        signersFound.Add(keypair.Address);
                        break;
                    }
                }
            }

            return(signersFound.ToArray());
        }
Пример #2
0
        /// <summary>
        ///     Create <code>preAuthTx</code> <see cref="sdkxdr.SignerKey" /> from
        ///     a <see cref="sdkxdr.Transaction" /> hash.
        /// </summary>
        /// <param name="tx"></param>
        /// <param name="network"></param>
        /// <returns>sdkxdr.SignerKey</returns>
        public static sdkxdr.SignerKey PreAuthTx(Transaction tx, Network network)
        {
            if (tx == null)
            {
                throw new ArgumentNullException(nameof(tx), "tx cannot be null");
            }

            return(PreAuthTx(tx.Hash(network)));
        }
Пример #3
0
        private static bool ValidateSignedBy(Transaction transaction, string accountId, Network network)
        {
            var transactionHash = transaction.Hash(network);
            var keypair         = KeyPair.FromAccountId(accountId);

            var signature = transaction.Signatures.Find(sig => keypair.Verify(transactionHash, sig.Signature));

            return(signature != null);
        }
Пример #4
0
        ///<summary>Verify given keypair is a signer on a given transaction.</summary>
        ///<param name="tx">Transaction to verify</param>
        ///<param name="keypair">Keypair object</param>
        ///<returns>Returns true if given transaction is signed using specified keypair</returns>
        public static Boolean Verify(Stellar.Transaction tx, Stellar.KeyPair keypair)
        {
            var signatures = tx.Signatures;
            var hash       = tx.Hash();

            if (signatures == null || signatures.Count == 0)
            {
                return(false);
            }

            return(signatures.Where(s => keypair.Verify(hash, s.Signature.InnerValue)).ToArray().Length >= 1);
        }
Пример #5
0
        /// <summary>
        ///     Create <code>preAuthTx</code> <see cref="sdkxdr.SignerKey" /> from
        ///     a <see cref="sdkxdr.Transaction" /> hash.
        /// </summary>
        /// <param name="tx"></param>
        /// <returns>sdkxdr.SignerKey</returns>
        public static sdkxdr.SignerKey PreAuthTx(Transaction tx)
        {
            if (tx == null)
            {
                throw new ArgumentNullException(nameof(tx), "tx cannot be null");
            }

            var signerKey = new sdkxdr.SignerKey();
            var value     = CreateUint256(tx.Hash());

            signerKey.Discriminant = sdkxdr.SignerKeyType.Create(sdkxdr.SignerKeyType.SignerKeyTypeEnum.SIGNER_KEY_TYPE_PRE_AUTH_TX);
            signerKey.PreAuthTx    = value;

            return(signerKey);
        }