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()); }
/// <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))); }
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); }
///<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); }
/// <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); }