@Subscribe public void onHardwareWalletProtocolEvent(MessageEvent event) { // Decode into a message type for use with a switch MessageEventType eventType = event.getEventType(); // Protocol message log.debug("Received event: {}", eventType.name()); log.debug("{}", event.getMessage().toString()); // Add the event to the queue for blocking purposes messageEvents.add(event); }
@Subscribe public void onHardwareWalletProtocolEvent(MessageEvent event) { // Decode into a message type for use with a switch MessageEventType eventType = event.getEventType(); // Protocol message log.debug("Received event: {}", eventType.name()); log.debug("{}", event.getMessage().toString()); // Add the event to the queue for blocking purposes messageEvents.add(event); }
/** * <p>Provide standard handling for an unexpected message so the downstream consumer can react appropriately</p> * * @param context The current context providing parameters for decisions * @param event The event driving the transition */ protected void handleUnexpectedMessageEvent(HardwareWalletContext context, MessageEvent event) { log.warn("Unexpected message event '{}'", event.getEventType().name()); if (event.getMessage().isPresent()) { HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), context.getClient().name()); } else { HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, context.getClient().name()); } context.resetToConnected(); } }
case PIN_MATRIX_REQUEST: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PIN_ENTRY, event.getMessage().get(), client.name()); case BUTTON_REQUEST: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_BUTTON_PRESS, event.getMessage().get(), client.name()); client.buttonAck(); break; case CIPHERED_KEY_VALUE: final CipheredKeyValue message = (CipheredKeyValue) event.getMessage().get(); context.setEntropy(message.getPayload().get()); HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_SUCCEEDED, event.getMessage().get(), client.name()); HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), client.name()); context.resetToInitialised(); break;
@Override protected void internalTransition(HardwareWalletClient client, HardwareWalletContext context, MessageEvent event) { // We don't expect any messages switch (event.getEventType()) { case SUCCESS: // Possible Ping HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_SUCCEEDED, event.getMessage().get(), client.name()); // Ensure the Features are updated context.resetToConnected(); break; default: handleUnexpectedMessageEvent(context, event); } }
@Override protected void internalTransition(HardwareWalletClient client, HardwareWalletContext context, MessageEvent event) { switch (event.getEventType()) { case BUTTON_REQUEST: // Device is asking for the user to acknowledge a word display HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_BUTTON_PRESS, event.getMessage().get(), client.name()); client.buttonAck(); break; case SUCCESS: // Device has completed the create wallet operation HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_SUCCEEDED, event.getMessage().get(), client.name()); // Ensure the Features are updated context.resetToConnected(); break; case FAILURE: // User has cancelled or operation failed HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), client.name()); context.resetToInitialised(); break; default: handleUnexpectedMessageEvent(context, event); } } }
case PIN_MATRIX_REQUEST: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PIN_ENTRY, event.getMessage().get(), client.name()); case BUTTON_REQUEST: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_BUTTON_PRESS, event.getMessage().get(), client.name()); client.buttonAck(); break; case SIGNED_IDENTITY: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SIGNED_IDENTITY, event.getMessage().get(), client.name()); break; case FAILURE: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), client.name()); context.resetToInitialised(); break;
@Override protected void internalTransition(HardwareWalletClient client, HardwareWalletContext context, MessageEvent event) { switch (event.getEventType()) { case PIN_MATRIX_REQUEST: // Device is asking for a PIN matrix to be displayed (user must read the screen carefully) HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PIN_ENTRY, event.getMessage().get(), client.name()); // Further state transitions will occur after the user has provided the PIN via the service break; case PASSPHRASE_REQUEST: // Device is asking for a passphrase screen to be displayed HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PASSPHRASE_ENTRY, client.name()); // Further state transitions will occur after the user has provided the passphrase via the service break; case PUBLIC_KEY: // Device has completed the operation and provided a public key HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.PUBLIC_KEY, event.getMessage().get(), client.name()); break; case FAILURE: // User has cancelled or operation failed HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), client.name()); context.resetToInitialised(); break; default: handleUnexpectedMessageEvent(context, event); } } }
case PIN_MATRIX_REQUEST: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PIN_ENTRY, event.getMessage().get(), client.name()); HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.PUBLIC_KEY_FOR_IDENTITY, event.getMessage().get(), client.name()); break; case FAILURE: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), client.name()); context.resetToInitialised(); break;
case PIN_MATRIX_REQUEST: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PIN_ENTRY, event.getMessage().get(), client.name()); case BUTTON_REQUEST: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_BUTTON_PRESS, event.getMessage().get(), client.name()); client.buttonAck(); break; case MESSAGE_SIGNATURE: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.MESSAGE_SIGNATURE, event.getMessage().get(), client.name()); break; case FAILURE: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), client.name()); context.resetToInitialised(); break;
case BUTTON_REQUEST: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_BUTTON_PRESS, event.getMessage().get(), client.name()); client.buttonAck(); break; case PIN_MATRIX_REQUEST: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PIN_ENTRY, event.getMessage().get(), client.name()); case ADDRESS: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.ADDRESS, event.getMessage().get(), client.name()); break; case FAILURE: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), client.name()); context.resetToInitialised(); break;
@Override protected void internalTransition(HardwareWalletClient client, HardwareWalletContext context, MessageEvent event) { switch (event.getEventType()) { case BUTTON_REQUEST: // Device is asking for button press (entropy display, confirmation of reset etc) HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_BUTTON_PRESS, event.getMessage().get(), client.name()); client.buttonAck(); break; case PIN_MATRIX_REQUEST: // Device is asking for a PIN matrix to be displayed (user must read the screen carefully) HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PIN_ENTRY, event.getMessage().get(), client.name()); // Further state transitions will occur after the user has provided the PIN via the service break; case PASSPHRASE_REQUEST: // Device is asking for a passphrase screen to be displayed HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PASSPHRASE_ENTRY, client.name()); // Further state transitions will occur after the user has provided the passphrase via the service break; case FAILURE: // User has cancelled or operation failed HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), client.name()); context.resetToInitialised(); break; default: handleUnexpectedMessageEvent(context, event); } } }
case PIN_MATRIX_REQUEST: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PIN_ENTRY, event.getMessage().get(), client.name()); case BUTTON_REQUEST: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_BUTTON_PRESS, event.getMessage().get(), client.name()); client.buttonAck(); break; case SUCCESS: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_SUCCEEDED, event.getMessage().get(), client.name()); case FAILURE: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), client.name()); context.resetToInitialised(); break;
case BUTTON_REQUEST: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_BUTTON_PRESS, event.getMessage().get(), client.name()); client.buttonAck(); break; case PIN_MATRIX_REQUEST: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PIN_ENTRY, event.getMessage().get(), client.name()); case SUCCESS: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_SUCCEEDED, event.getMessage().get(), client.name()); case FAILURE: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), client.name()); context.resetToInitialised(); break;
case PIN_MATRIX_REQUEST: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PIN_ENTRY, event.getMessage().get(), client.name()); TxRequest txRequest = ((TxRequest) event.getMessage().get()); HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_SUCCEEDED, event.getMessage().get(), client.name()); break; case TX_OUTPUT: case BUTTON_REQUEST: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_BUTTON_PRESS, event.getMessage().get(), client.name()); client.buttonAck(); break; case FAILURE: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), client.name()); context.resetToInitialised(); break;
@Override protected void internalTransition(HardwareWalletClient client, HardwareWalletContext context, MessageEvent event) { switch (event.getEventType()) { case FEATURES: Features features = (Features) event.getMessage().get(); context.setFeatures(features); // Verify the Features through the client if (!client.verifyFeatures(features)) { features.setSupported(false); context.resetToFailed(); } else { features.setSupported(true); context.resetToInitialised(); } break; case FAILURE: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), client.name()); context.resetToInitialised(); break; default: handleUnexpectedMessageEvent(context, event); } } }
case PIN_MATRIX_REQUEST: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PIN_ENTRY, event.getMessage().get(), client.name()); case PUBLIC_KEY: PublicKey publicKey = (PublicKey) event.getMessage().get(); case FAILURE: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), client.name()); context.resetToInitialised(); break;
@Override protected void internalTransition(HardwareWalletClient client, HardwareWalletContext context, MessageEvent event) { switch (event.getEventType()) { case PIN_MATRIX_REQUEST: // Device is asking for a PIN matrix to be displayed (user must read the screen carefully) HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PIN_ENTRY, event.getMessage().get(), client.name()); // Further state transitions will occur after the user has provided the PIN via the service break; case PASSPHRASE_REQUEST: // Device is asking for a passphrase screen to be displayed HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_PASSPHRASE_ENTRY, client.name()); // Further state transitions will occur after the user has provided the passphrase via the service break; case ENTROPY_REQUEST: // Device is asking for additional entropy from the user HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.PROVIDE_ENTROPY, client.name()); // Further state transitions will occur after the user has provided the entropy via the service break; case FAILURE: // User has cancelled or operation failed HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), client.name()); context.resetToInitialised(); break; default: handleUnexpectedMessageEvent(context, event); } } }
case BUTTON_REQUEST: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_BUTTON_PRESS, event.getMessage().get(), client.name()); client.buttonAck(); break; default: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_SUCCEEDED, event.getMessage().get(), client.name()); case FAILURE: HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), client.name()); context.resetToInitialised(); break;