示例#1
0
        /// <summary>
        /// Send a message to the Trezor and receive the result
        /// </summary>
        /// <typeparam name="TReadMessage">The message type</typeparam>
        /// <typeparam name="TWriteMessage">The result type</typeparam>
        /// <param name="message">The message</param>
        /// <returns>The result</returns>
        public async Task <TReadMessage> SendMessageAsync <TReadMessage, TWriteMessage>(TWriteMessage message)
        {
            ValidateInitialization(message);

            await _Lock.WaitAsync().ConfigureAwait(false);

            try
            {
                var response = await SendMessageAsync(message).ConfigureAwait(false);

                for (var i = 0; i < 10; i++)
                {
                    if (IsPinMatrixRequest(response))
                    {
                        var pin = await _EnterPinCallback.Invoke().ConfigureAwait(false);

                        response = await PinMatrixAckAsync(pin).ConfigureAwait(false);

                        if (response is TReadMessage readMessage)
                        {
                            return(readMessage);
                        }
                    }

                    if (IsPassphraseRequest(response))
                    {
                        var passPhrase = await _EnterPassphraseCallback.Invoke().ConfigureAwait(false);

                        response = await PassphraseAckAsync(passPhrase).ConfigureAwait(false);

                        if (response is TReadMessage readMessage)
                        {
                            return(readMessage);
                        }
                    }

                    else if (IsButtonRequest(response))
                    {
                        response = await ButtonAckAsync().ConfigureAwait(false);

                        if (response is TReadMessage readMessage)
                        {
                            return(readMessage);
                        }
                    }

                    else if (response is TReadMessage readMessage)
                    {
                        return(readMessage);
                    }
                }

                throw new ManagerException($"Returned response ({response.GetType().Name})  was of the wrong specified message type ({typeof(TReadMessage).Name}). The user did not accept the message, or pin was entered incorrectly too many times (Note: this library does not have an incorrect pin safety mechanism.)");
            }
            finally
            {
                _ = _Lock.Release();
            }
        }
示例#2
0
        /// <summary>
        /// Send a message to the Trezor and receive the result
        /// </summary>
        /// <typeparam name="TReadMessage">The message type</typeparam>
        /// <typeparam name="TWriteMessage">The result type</typeparam>
        /// <param name="message">The message</param>
        /// <returns>The result</returns>
        public async Task <TReadMessage> SendMessageAsync <TReadMessage, TWriteMessage>(TWriteMessage message, Action onMessageSending = null)
        {
            await _Lock.WaitAsync();

            try
            {
                var response = await SendMessageAsync(message);

                for (var i = 0; i < 10; i++)
                {
                    if (IsPinMatrixRequest(response))
                    {
                        PinRequest = true;

                        var pin = await _EnterPinCallback.Invoke();

                        //if (string.IsNullOrEmpty(pin))
                        //    throw new FailureException<Failure>("Invalid Pin ", new Failure() { Message = "Please try again" });

                        response = await PinMatrixAckAsync(pin);

                        if (response is TReadMessage)
                        {
                            return((TReadMessage)response);
                        }
                    }

                    else if (IsButtonRequest(response))
                    {
                        PinRequest = false;

                        onMessageSending?.Invoke();
                        response = await ButtonAckAsync();

                        if (response is TReadMessage)
                        {
                            return((TReadMessage)response);
                        }
                    }

                    else if (response is TReadMessage)
                    {
                        PinRequest = false;

                        return((TReadMessage)response);
                    }
                }

                throw new ManagerException($"Returned response ({response.GetType().Name})  was of the wrong specified message type ({typeof(TReadMessage).Name}). The user did not accept the message, or pin was entered incorrectly too many times (Note: this library does not have an incorrect pin safety mechanism.)");
            }
            finally
            {
                _Lock.Release();
            }
        }