github.com/abschain-develop/go-abs@v2.0.3+incompatible/accounts/usbwallet/internal/trezor/messages.proto (about) 1 // This file originates from the SatoshiLabs Trezor `common` repository at: 2 // https://github.com/trezor/trezor-common/blob/master/protob/messages.proto 3 // dated 28.07.2017, commit dd8ec3231fb5f7992360aff9bdfe30bb58130f4b. 4 5 syntax = "proto2"; 6 7 /** 8 * Messages for TREZOR communication 9 */ 10 11 // Sugar for easier handling in Java 12 option java_package = "com.satoshilabs.trezor.lib.protobuf"; 13 option java_outer_classname = "TrezorMessage"; 14 15 import "types.proto"; 16 17 /** 18 * Mapping between Trezor wire identifier (uint) and a protobuf message 19 */ 20 enum MessageType { 21 MessageType_Initialize = 0 [(wire_in) = true]; 22 MessageType_Ping = 1 [(wire_in) = true]; 23 MessageType_Success = 2 [(wire_out) = true]; 24 MessageType_Failure = 3 [(wire_out) = true]; 25 MessageType_ChangePin = 4 [(wire_in) = true]; 26 MessageType_WipeDevice = 5 [(wire_in) = true]; 27 MessageType_FirmwareErase = 6 [(wire_in) = true, (wire_bootloader) = true]; 28 MessageType_FirmwareUpload = 7 [(wire_in) = true, (wire_bootloader) = true]; 29 MessageType_FirmwareRequest = 8 [(wire_out) = true, (wire_bootloader) = true]; 30 MessageType_GetEntropy = 9 [(wire_in) = true]; 31 MessageType_Entropy = 10 [(wire_out) = true]; 32 MessageType_GetPublicKey = 11 [(wire_in) = true]; 33 MessageType_PublicKey = 12 [(wire_out) = true]; 34 MessageType_LoadDevice = 13 [(wire_in) = true]; 35 MessageType_ResetDevice = 14 [(wire_in) = true]; 36 MessageType_SignTx = 15 [(wire_in) = true]; 37 MessageType_SimpleSignTx = 16 [(wire_in) = true, deprecated = true]; 38 MessageType_Features = 17 [(wire_out) = true]; 39 MessageType_PinMatrixRequest = 18 [(wire_out) = true]; 40 MessageType_PinMatrixAck = 19 [(wire_in) = true, (wire_tiny) = true]; 41 MessageType_Cancel = 20 [(wire_in) = true]; 42 MessageType_TxRequest = 21 [(wire_out) = true]; 43 MessageType_TxAck = 22 [(wire_in) = true]; 44 MessageType_CipherKeyValue = 23 [(wire_in) = true]; 45 MessageType_ClearSession = 24 [(wire_in) = true]; 46 MessageType_ApplySettings = 25 [(wire_in) = true]; 47 MessageType_ButtonRequest = 26 [(wire_out) = true]; 48 MessageType_ButtonAck = 27 [(wire_in) = true, (wire_tiny) = true]; 49 MessageType_ApplyFlags = 28 [(wire_in) = true]; 50 MessageType_GetAddress = 29 [(wire_in) = true]; 51 MessageType_Address = 30 [(wire_out) = true]; 52 MessageType_SelfTest = 32 [(wire_in) = true, (wire_bootloader) = true]; 53 MessageType_BackupDevice = 34 [(wire_in) = true]; 54 MessageType_EntropyRequest = 35 [(wire_out) = true]; 55 MessageType_EntropyAck = 36 [(wire_in) = true]; 56 MessageType_SignMessage = 38 [(wire_in) = true]; 57 MessageType_VerifyMessage = 39 [(wire_in) = true]; 58 MessageType_MessageSignature = 40 [(wire_out) = true]; 59 MessageType_PassphraseRequest = 41 [(wire_out) = true]; 60 MessageType_PassphraseAck = 42 [(wire_in) = true, (wire_tiny) = true]; 61 MessageType_EstimateTxSize = 43 [(wire_in) = true, deprecated = true]; 62 MessageType_TxSize = 44 [(wire_out) = true, deprecated = true]; 63 MessageType_RecoveryDevice = 45 [(wire_in) = true]; 64 MessageType_WordRequest = 46 [(wire_out) = true]; 65 MessageType_WordAck = 47 [(wire_in) = true]; 66 MessageType_CipheredKeyValue = 48 [(wire_out) = true]; 67 MessageType_EncryptMessage = 49 [(wire_in) = true, deprecated = true]; 68 MessageType_EncryptedMessage = 50 [(wire_out) = true, deprecated = true]; 69 MessageType_DecryptMessage = 51 [(wire_in) = true, deprecated = true]; 70 MessageType_DecryptedMessage = 52 [(wire_out) = true, deprecated = true]; 71 MessageType_SignIdentity = 53 [(wire_in) = true]; 72 MessageType_SignedIdentity = 54 [(wire_out) = true]; 73 MessageType_GetFeatures = 55 [(wire_in) = true]; 74 MessageType_EthereumGetAddress = 56 [(wire_in) = true]; 75 MessageType_EthereumAddress = 57 [(wire_out) = true]; 76 MessageType_EthereumSignTx = 58 [(wire_in) = true]; 77 MessageType_EthereumTxRequest = 59 [(wire_out) = true]; 78 MessageType_EthereumTxAck = 60 [(wire_in) = true]; 79 MessageType_GetECDHSessionKey = 61 [(wire_in) = true]; 80 MessageType_ECDHSessionKey = 62 [(wire_out) = true]; 81 MessageType_SetU2FCounter = 63 [(wire_in) = true]; 82 MessageType_EthereumSignMessage = 64 [(wire_in) = true]; 83 MessageType_EthereumVerifyMessage = 65 [(wire_in) = true]; 84 MessageType_EthereumMessageSignature = 66 [(wire_out) = true]; 85 MessageType_DebugLinkDecision = 100 [(wire_debug_in) = true, (wire_tiny) = true]; 86 MessageType_DebugLinkGetState = 101 [(wire_debug_in) = true]; 87 MessageType_DebugLinkState = 102 [(wire_debug_out) = true]; 88 MessageType_DebugLinkStop = 103 [(wire_debug_in) = true]; 89 MessageType_DebugLinkLog = 104 [(wire_debug_out) = true]; 90 MessageType_DebugLinkMemoryRead = 110 [(wire_debug_in) = true]; 91 MessageType_DebugLinkMemory = 111 [(wire_debug_out) = true]; 92 MessageType_DebugLinkMemoryWrite = 112 [(wire_debug_in) = true]; 93 MessageType_DebugLinkFlashErase = 113 [(wire_debug_in) = true]; 94 } 95 96 //////////////////// 97 // Basic messages // 98 //////////////////// 99 100 /** 101 * Request: Reset device to default state and ask for device details 102 * @next Features 103 */ 104 message Initialize { 105 } 106 107 /** 108 * Request: Ask for device details (no device reset) 109 * @next Features 110 */ 111 message GetFeatures { 112 } 113 114 /** 115 * Response: Reports various information about the device 116 * @prev Initialize 117 * @prev GetFeatures 118 */ 119 message Features { 120 optional string vendor = 1; // name of the manufacturer, e.g. "bitcointrezor.com" 121 optional uint32 major_version = 2; // major version of the device, e.g. 1 122 optional uint32 minor_version = 3; // minor version of the device, e.g. 0 123 optional uint32 patch_version = 4; // patch version of the device, e.g. 0 124 optional bool bootloader_mode = 5; // is device in bootloader mode? 125 optional string device_id = 6; // device's unique identifier 126 optional bool pin_protection = 7; // is device protected by PIN? 127 optional bool passphrase_protection = 8; // is node/mnemonic encrypted using passphrase? 128 optional string language = 9; // device language 129 optional string label = 10; // device description label 130 repeated CoinType coins = 11; // supported coins 131 optional bool initialized = 12; // does device contain seed? 132 optional bytes revision = 13; // SCM revision of firmware 133 optional bytes bootloader_hash = 14; // hash of the bootloader 134 optional bool imported = 15; // was storage imported from an external source? 135 optional bool pin_cached = 16; // is PIN already cached in session? 136 optional bool passphrase_cached = 17; // is passphrase already cached in session? 137 optional bool firmware_present = 18; // is valid firmware loaded? 138 optional bool needs_backup = 19; // does storage need backup? (equals to Storage.needs_backup) 139 optional uint32 flags = 20; // device flags (equals to Storage.flags) 140 } 141 142 /** 143 * Request: clear session (removes cached PIN, passphrase, etc). 144 * @next Success 145 */ 146 message ClearSession { 147 } 148 149 /** 150 * Request: change language and/or label of the device 151 * @next Success 152 * @next Failure 153 * @next ButtonRequest 154 * @next PinMatrixRequest 155 */ 156 message ApplySettings { 157 optional string language = 1; 158 optional string label = 2; 159 optional bool use_passphrase = 3; 160 optional bytes homescreen = 4; 161 } 162 163 /** 164 * Request: set flags of the device 165 * @next Success 166 * @next Failure 167 */ 168 message ApplyFlags { 169 optional uint32 flags = 1; // bitmask, can only set bits, not unset 170 } 171 172 /** 173 * Request: Starts workflow for setting/changing/removing the PIN 174 * @next ButtonRequest 175 * @next PinMatrixRequest 176 */ 177 message ChangePin { 178 optional bool remove = 1; // is PIN removal requested? 179 } 180 181 /** 182 * Request: Test if the device is alive, device sends back the message in Success response 183 * @next Success 184 */ 185 message Ping { 186 optional string message = 1; // message to send back in Success message 187 optional bool button_protection = 2; // ask for button press 188 optional bool pin_protection = 3; // ask for PIN if set in device 189 optional bool passphrase_protection = 4; // ask for passphrase if set in device 190 } 191 192 /** 193 * Response: Success of the previous request 194 */ 195 message Success { 196 optional string message = 1; // human readable description of action or request-specific payload 197 } 198 199 /** 200 * Response: Failure of the previous request 201 */ 202 message Failure { 203 optional FailureType code = 1; // computer-readable definition of the error state 204 optional string message = 2; // human-readable message of the error state 205 } 206 207 /** 208 * Response: Device is waiting for HW button press. 209 * @next ButtonAck 210 * @next Cancel 211 */ 212 message ButtonRequest { 213 optional ButtonRequestType code = 1; 214 optional string data = 2; 215 } 216 217 /** 218 * Request: Computer agrees to wait for HW button press 219 * @prev ButtonRequest 220 */ 221 message ButtonAck { 222 } 223 224 /** 225 * Response: Device is asking computer to show PIN matrix and awaits PIN encoded using this matrix scheme 226 * @next PinMatrixAck 227 * @next Cancel 228 */ 229 message PinMatrixRequest { 230 optional PinMatrixRequestType type = 1; 231 } 232 233 /** 234 * Request: Computer responds with encoded PIN 235 * @prev PinMatrixRequest 236 */ 237 message PinMatrixAck { 238 required string pin = 1; // matrix encoded PIN entered by user 239 } 240 241 /** 242 * Request: Abort last operation that required user interaction 243 * @prev ButtonRequest 244 * @prev PinMatrixRequest 245 * @prev PassphraseRequest 246 */ 247 message Cancel { 248 } 249 250 /** 251 * Response: Device awaits encryption passphrase 252 * @next PassphraseAck 253 * @next Cancel 254 */ 255 message PassphraseRequest { 256 } 257 258 /** 259 * Request: Send passphrase back 260 * @prev PassphraseRequest 261 */ 262 message PassphraseAck { 263 required string passphrase = 1; 264 } 265 266 /** 267 * Request: Request a sample of random data generated by hardware RNG. May be used for testing. 268 * @next ButtonRequest 269 * @next Entropy 270 * @next Failure 271 */ 272 message GetEntropy { 273 required uint32 size = 1; // size of requested entropy 274 } 275 276 /** 277 * Response: Reply with random data generated by internal RNG 278 * @prev GetEntropy 279 */ 280 message Entropy { 281 required bytes entropy = 1; // stream of random generated bytes 282 } 283 284 /** 285 * Request: Ask device for public key corresponding to address_n path 286 * @next PassphraseRequest 287 * @next PublicKey 288 * @next Failure 289 */ 290 message GetPublicKey { 291 repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node 292 optional string ecdsa_curve_name = 2; // ECDSA curve name to use 293 optional bool show_display = 3; // optionally show on display before sending the result 294 optional string coin_name = 4 [default='Bitcoin']; 295 } 296 297 /** 298 * Response: Contains public key derived from device private seed 299 * @prev GetPublicKey 300 */ 301 message PublicKey { 302 required HDNodeType node = 1; // BIP32 public node 303 optional string xpub = 2; // serialized form of public node 304 } 305 306 /** 307 * Request: Ask device for address corresponding to address_n path 308 * @next PassphraseRequest 309 * @next Address 310 * @next Failure 311 */ 312 message GetAddress { 313 repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node 314 optional string coin_name = 2 [default='Bitcoin']; 315 optional bool show_display = 3 ; // optionally show on display before sending the result 316 optional MultisigRedeemScriptType multisig = 4; // filled if we are showing a multisig address 317 optional InputScriptType script_type = 5 [default=SPENDADDRESS]; // used to distinguish between various address formats (non-segwit, segwit, etc.) 318 } 319 320 /** 321 * Request: Ask device for Ethereum address corresponding to address_n path 322 * @next PassphraseRequest 323 * @next EthereumAddress 324 * @next Failure 325 */ 326 message EthereumGetAddress { 327 repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node 328 optional bool show_display = 2; // optionally show on display before sending the result 329 } 330 331 /** 332 * Response: Contains address derived from device private seed 333 * @prev GetAddress 334 */ 335 message Address { 336 required string address = 1; // Coin address in Base58 encoding 337 } 338 339 /** 340 * Response: Contains an Ethereum address derived from device private seed 341 * @prev EthereumGetAddress 342 */ 343 message EthereumAddress { 344 required bytes address = 1; // Coin address as an Ethereum 160 bit hash 345 } 346 347 /** 348 * Request: Request device to wipe all sensitive data and settings 349 * @next ButtonRequest 350 */ 351 message WipeDevice { 352 } 353 354 /** 355 * Request: Load seed and related internal settings from the computer 356 * @next ButtonRequest 357 * @next Success 358 * @next Failure 359 */ 360 message LoadDevice { 361 optional string mnemonic = 1; // seed encoded as BIP-39 mnemonic (12, 18 or 24 words) 362 optional HDNodeType node = 2; // BIP-32 node 363 optional string pin = 3; // set PIN protection 364 optional bool passphrase_protection = 4; // enable master node encryption using passphrase 365 optional string language = 5 [default='english']; // device language 366 optional string label = 6; // device label 367 optional bool skip_checksum = 7; // do not test mnemonic for valid BIP-39 checksum 368 optional uint32 u2f_counter = 8; // U2F counter 369 } 370 371 /** 372 * Request: Ask device to do initialization involving user interaction 373 * @next EntropyRequest 374 * @next Failure 375 */ 376 message ResetDevice { 377 optional bool display_random = 1; // display entropy generated by the device before asking for additional entropy 378 optional uint32 strength = 2 [default=256]; // strength of seed in bits 379 optional bool passphrase_protection = 3; // enable master node encryption using passphrase 380 optional bool pin_protection = 4; // enable PIN protection 381 optional string language = 5 [default='english']; // device language 382 optional string label = 6; // device label 383 optional uint32 u2f_counter = 7; // U2F counter 384 optional bool skip_backup = 8; // postpone seed backup to BackupDevice workflow 385 } 386 387 /** 388 * Request: Perform backup of the device seed if not backed up using ResetDevice 389 * @next ButtonRequest 390 */ 391 message BackupDevice { 392 } 393 394 /** 395 * Response: Ask for additional entropy from host computer 396 * @prev ResetDevice 397 * @next EntropyAck 398 */ 399 message EntropyRequest { 400 } 401 402 /** 403 * Request: Provide additional entropy for seed generation function 404 * @prev EntropyRequest 405 * @next ButtonRequest 406 */ 407 message EntropyAck { 408 optional bytes entropy = 1; // 256 bits (32 bytes) of random data 409 } 410 411 /** 412 * Request: Start recovery workflow asking user for specific words of mnemonic 413 * Used to recovery device safely even on untrusted computer. 414 * @next WordRequest 415 */ 416 message RecoveryDevice { 417 optional uint32 word_count = 1; // number of words in BIP-39 mnemonic 418 optional bool passphrase_protection = 2; // enable master node encryption using passphrase 419 optional bool pin_protection = 3; // enable PIN protection 420 optional string language = 4 [default='english']; // device language 421 optional string label = 5; // device label 422 optional bool enforce_wordlist = 6; // enforce BIP-39 wordlist during the process 423 // 7 reserved for unused recovery method 424 optional uint32 type = 8; // supported recovery type (see RecoveryType) 425 optional uint32 u2f_counter = 9; // U2F counter 426 optional bool dry_run = 10; // perform dry-run recovery workflow (for safe mnemonic validation) 427 } 428 429 /** 430 * Response: Device is waiting for user to enter word of the mnemonic 431 * Its position is shown only on device's internal display. 432 * @prev RecoveryDevice 433 * @prev WordAck 434 */ 435 message WordRequest { 436 optional WordRequestType type = 1; 437 } 438 439 /** 440 * Request: Computer replies with word from the mnemonic 441 * @prev WordRequest 442 * @next WordRequest 443 * @next Success 444 * @next Failure 445 */ 446 message WordAck { 447 required string word = 1; // one word of mnemonic on asked position 448 } 449 450 ////////////////////////////// 451 // Message signing messages // 452 ////////////////////////////// 453 454 /** 455 * Request: Ask device to sign message 456 * @next MessageSignature 457 * @next Failure 458 */ 459 message SignMessage { 460 repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node 461 required bytes message = 2; // message to be signed 462 optional string coin_name = 3 [default='Bitcoin']; // coin to use for signing 463 optional InputScriptType script_type = 4 [default=SPENDADDRESS]; // used to distinguish between various address formats (non-segwit, segwit, etc.) 464 } 465 466 /** 467 * Request: Ask device to verify message 468 * @next Success 469 * @next Failure 470 */ 471 message VerifyMessage { 472 optional string address = 1; // address to verify 473 optional bytes signature = 2; // signature to verify 474 optional bytes message = 3; // message to verify 475 optional string coin_name = 4 [default='Bitcoin']; // coin to use for verifying 476 } 477 478 /** 479 * Response: Signed message 480 * @prev SignMessage 481 */ 482 message MessageSignature { 483 optional string address = 1; // address used to sign the message 484 optional bytes signature = 2; // signature of the message 485 } 486 487 /////////////////////////// 488 // Encryption/decryption // 489 /////////////////////////// 490 491 /** 492 * Request: Ask device to encrypt message 493 * @next EncryptedMessage 494 * @next Failure 495 */ 496 message EncryptMessage { 497 optional bytes pubkey = 1; // public key 498 optional bytes message = 2; // message to encrypt 499 optional bool display_only = 3; // show just on display? (don't send back via wire) 500 repeated uint32 address_n = 4; // BIP-32 path to derive the signing key from master node 501 optional string coin_name = 5 [default='Bitcoin']; // coin to use for signing 502 } 503 504 /** 505 * Response: Encrypted message 506 * @prev EncryptMessage 507 */ 508 message EncryptedMessage { 509 optional bytes nonce = 1; // nonce used during encryption 510 optional bytes message = 2; // encrypted message 511 optional bytes hmac = 3; // message hmac 512 } 513 514 /** 515 * Request: Ask device to decrypt message 516 * @next Success 517 * @next Failure 518 */ 519 message DecryptMessage { 520 repeated uint32 address_n = 1; // BIP-32 path to derive the decryption key from master node 521 optional bytes nonce = 2; // nonce used during encryption 522 optional bytes message = 3; // message to decrypt 523 optional bytes hmac = 4; // message hmac 524 } 525 526 /** 527 * Response: Decrypted message 528 * @prev DecryptedMessage 529 */ 530 message DecryptedMessage { 531 optional bytes message = 1; // decrypted message 532 optional string address = 2; // address used to sign the message (if used) 533 } 534 535 /** 536 * Request: Ask device to encrypt or decrypt value of given key 537 * @next CipheredKeyValue 538 * @next Failure 539 */ 540 message CipherKeyValue { 541 repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node 542 optional string key = 2; // key component of key:value 543 optional bytes value = 3; // value component of key:value 544 optional bool encrypt = 4; // are we encrypting (True) or decrypting (False)? 545 optional bool ask_on_encrypt = 5; // should we ask on encrypt operation? 546 optional bool ask_on_decrypt = 6; // should we ask on decrypt operation? 547 optional bytes iv = 7; // initialization vector (will be computed if not set) 548 } 549 550 /** 551 * Response: Return ciphered/deciphered value 552 * @prev CipherKeyValue 553 */ 554 message CipheredKeyValue { 555 optional bytes value = 1; // ciphered/deciphered value 556 } 557 558 ////////////////////////////////// 559 // Transaction signing messages // 560 ////////////////////////////////// 561 562 /** 563 * Request: Estimated size of the transaction 564 * This behaves exactly like SignTx, which means that it can ask using TxRequest 565 * This call is non-blocking (except possible PassphraseRequest to unlock the seed) 566 * @next TxSize 567 * @next Failure 568 */ 569 message EstimateTxSize { 570 required uint32 outputs_count = 1; // number of transaction outputs 571 required uint32 inputs_count = 2; // number of transaction inputs 572 optional string coin_name = 3 [default='Bitcoin']; // coin to use 573 } 574 575 /** 576 * Response: Estimated size of the transaction 577 * @prev EstimateTxSize 578 */ 579 message TxSize { 580 optional uint32 tx_size = 1; // estimated size of transaction in bytes 581 } 582 583 /** 584 * Request: Ask device to sign transaction 585 * @next PassphraseRequest 586 * @next PinMatrixRequest 587 * @next TxRequest 588 * @next Failure 589 */ 590 message SignTx { 591 required uint32 outputs_count = 1; // number of transaction outputs 592 required uint32 inputs_count = 2; // number of transaction inputs 593 optional string coin_name = 3 [default='Bitcoin']; // coin to use 594 optional uint32 version = 4 [default=1]; // transaction version 595 optional uint32 lock_time = 5 [default=0]; // transaction lock_time 596 } 597 598 /** 599 * Request: Simplified transaction signing 600 * This method doesn't support streaming, so there are hardware limits in number of inputs and outputs. 601 * In case of success, the result is returned using TxRequest message. 602 * @next PassphraseRequest 603 * @next PinMatrixRequest 604 * @next TxRequest 605 * @next Failure 606 */ 607 message SimpleSignTx { 608 repeated TxInputType inputs = 1; // transaction inputs 609 repeated TxOutputType outputs = 2; // transaction outputs 610 repeated TransactionType transactions = 3; // transactions whose outputs are used to build current inputs 611 optional string coin_name = 4 [default='Bitcoin']; // coin to use 612 optional uint32 version = 5 [default=1]; // transaction version 613 optional uint32 lock_time = 6 [default=0]; // transaction lock_time 614 } 615 616 /** 617 * Response: Device asks for information for signing transaction or returns the last result 618 * If request_index is set, device awaits TxAck message (with fields filled in according to request_type) 619 * If signature_index is set, 'signature' contains signed input of signature_index's input 620 * @prev SignTx 621 * @prev SimpleSignTx 622 * @prev TxAck 623 */ 624 message TxRequest { 625 optional RequestType request_type = 1; // what should be filled in TxAck message? 626 optional TxRequestDetailsType details = 2; // request for tx details 627 optional TxRequestSerializedType serialized = 3; // serialized data and request for next 628 } 629 630 /** 631 * Request: Reported transaction data 632 * @prev TxRequest 633 * @next TxRequest 634 */ 635 message TxAck { 636 optional TransactionType tx = 1; 637 } 638 639 /** 640 * Request: Ask device to sign transaction 641 * All fields are optional from the protocol's point of view. Each field defaults to value `0` if missing. 642 * Note: the first at most 1024 bytes of data MUST be transmitted as part of this message. 643 * @next PassphraseRequest 644 * @next PinMatrixRequest 645 * @next EthereumTxRequest 646 * @next Failure 647 */ 648 message EthereumSignTx { 649 repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node 650 optional bytes nonce = 2; // <=256 bit unsigned big endian 651 optional bytes gas_price = 3; // <=256 bit unsigned big endian (in wei) 652 optional bytes gas_limit = 4; // <=256 bit unsigned big endian 653 optional bytes to = 5; // 160 bit address hash 654 optional bytes value = 6; // <=256 bit unsigned big endian (in wei) 655 optional bytes data_initial_chunk = 7; // The initial data chunk (<= 1024 bytes) 656 optional uint32 data_length = 8; // Length of transaction payload 657 optional uint32 chain_id = 9; // Chain Id for EIP 155 658 } 659 660 /** 661 * Response: Device asks for more data from transaction payload, or returns the signature. 662 * If data_length is set, device awaits that many more bytes of payload. 663 * Otherwise, the signature_* fields contain the computed transaction signature. All three fields will be present. 664 * @prev EthereumSignTx 665 * @next EthereumTxAck 666 */ 667 message EthereumTxRequest { 668 optional uint32 data_length = 1; // Number of bytes being requested (<= 1024) 669 optional uint32 signature_v = 2; // Computed signature (recovery parameter, limited to 27 or 28) 670 optional bytes signature_r = 3; // Computed signature R component (256 bit) 671 optional bytes signature_s = 4; // Computed signature S component (256 bit) 672 } 673 674 /** 675 * Request: Transaction payload data. 676 * @prev EthereumTxRequest 677 * @next EthereumTxRequest 678 */ 679 message EthereumTxAck { 680 optional bytes data_chunk = 1; // Bytes from transaction payload (<= 1024 bytes) 681 } 682 683 //////////////////////////////////////// 684 // Ethereum: Message signing messages // 685 //////////////////////////////////////// 686 687 /** 688 * Request: Ask device to sign message 689 * @next EthereumMessageSignature 690 * @next Failure 691 */ 692 message EthereumSignMessage { 693 repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node 694 required bytes message = 2; // message to be signed 695 } 696 697 /** 698 * Request: Ask device to verify message 699 * @next Success 700 * @next Failure 701 */ 702 message EthereumVerifyMessage { 703 optional bytes address = 1; // address to verify 704 optional bytes signature = 2; // signature to verify 705 optional bytes message = 3; // message to verify 706 } 707 708 /** 709 * Response: Signed message 710 * @prev EthereumSignMessage 711 */ 712 message EthereumMessageSignature { 713 optional bytes address = 1; // address used to sign the message 714 optional bytes signature = 2; // signature of the message 715 } 716 717 /////////////////////// 718 // Identity messages // 719 /////////////////////// 720 721 /** 722 * Request: Ask device to sign identity 723 * @next SignedIdentity 724 * @next Failure 725 */ 726 message SignIdentity { 727 optional IdentityType identity = 1; // identity 728 optional bytes challenge_hidden = 2; // non-visible challenge 729 optional string challenge_visual = 3; // challenge shown on display (e.g. date+time) 730 optional string ecdsa_curve_name = 4; // ECDSA curve name to use 731 } 732 733 /** 734 * Response: Device provides signed identity 735 * @prev SignIdentity 736 */ 737 message SignedIdentity { 738 optional string address = 1; // identity address 739 optional bytes public_key = 2; // identity public key 740 optional bytes signature = 3; // signature of the identity data 741 } 742 743 /////////////////// 744 // ECDH messages // 745 /////////////////// 746 747 /** 748 * Request: Ask device to generate ECDH session key 749 * @next ECDHSessionKey 750 * @next Failure 751 */ 752 message GetECDHSessionKey { 753 optional IdentityType identity = 1; // identity 754 optional bytes peer_public_key = 2; // peer's public key 755 optional string ecdsa_curve_name = 3; // ECDSA curve name to use 756 } 757 758 /** 759 * Response: Device provides ECDH session key 760 * @prev GetECDHSessionKey 761 */ 762 message ECDHSessionKey { 763 optional bytes session_key = 1; // ECDH session key 764 } 765 766 /////////////////// 767 // U2F messages // 768 /////////////////// 769 770 /** 771 * Request: Set U2F counter 772 * @next Success 773 */ 774 message SetU2FCounter { 775 optional uint32 u2f_counter = 1; // counter 776 } 777 778 ///////////////////////// 779 // Bootloader messages // 780 ///////////////////////// 781 782 /** 783 * Request: Ask device to erase its firmware (so it can be replaced via FirmwareUpload) 784 * @next Success 785 * @next FirmwareRequest 786 * @next Failure 787 */ 788 message FirmwareErase { 789 optional uint32 length = 1; // length of new firmware 790 } 791 792 /** 793 * Response: Ask for firmware chunk 794 * @next FirmwareUpload 795 */ 796 message FirmwareRequest { 797 optional uint32 offset = 1; // offset of requested firmware chunk 798 optional uint32 length = 2; // length of requested firmware chunk 799 } 800 801 /** 802 * Request: Send firmware in binary form to the device 803 * @next Success 804 * @next Failure 805 */ 806 message FirmwareUpload { 807 required bytes payload = 1; // firmware to be loaded into device 808 optional bytes hash = 2; // hash of the payload 809 } 810 811 812 /** 813 * Request: Perform a device self-test 814 * @next Success 815 * @next Failure 816 */ 817 message SelfTest { 818 optional bytes payload = 1; // payload to be used in self-test 819 } 820 821 ///////////////////////////////////////////////////////////// 822 // Debug messages (only available if DebugLink is enabled) // 823 ///////////////////////////////////////////////////////////// 824 825 /** 826 * Request: "Press" the button on the device 827 * @next Success 828 */ 829 message DebugLinkDecision { 830 required bool yes_no = 1; // true for "Confirm", false for "Cancel" 831 } 832 833 /** 834 * Request: Computer asks for device state 835 * @next DebugLinkState 836 */ 837 message DebugLinkGetState { 838 } 839 840 /** 841 * Response: Device current state 842 * @prev DebugLinkGetState 843 */ 844 message DebugLinkState { 845 optional bytes layout = 1; // raw buffer of display 846 optional string pin = 2; // current PIN, blank if PIN is not set/enabled 847 optional string matrix = 3; // current PIN matrix 848 optional string mnemonic = 4; // current BIP-39 mnemonic 849 optional HDNodeType node = 5; // current BIP-32 node 850 optional bool passphrase_protection = 6; // is node/mnemonic encrypted using passphrase? 851 optional string reset_word = 7; // word on device display during ResetDevice workflow 852 optional bytes reset_entropy = 8; // current entropy during ResetDevice workflow 853 optional string recovery_fake_word = 9; // (fake) word on display during RecoveryDevice workflow 854 optional uint32 recovery_word_pos = 10; // index of mnemonic word the device is expecting during RecoveryDevice workflow 855 } 856 857 /** 858 * Request: Ask device to restart 859 */ 860 message DebugLinkStop { 861 } 862 863 /** 864 * Response: Device wants host to log event 865 */ 866 message DebugLinkLog { 867 optional uint32 level = 1; 868 optional string bucket = 2; 869 optional string text = 3; 870 } 871 872 /** 873 * Request: Read memory from device 874 * @next DebugLinkMemory 875 */ 876 message DebugLinkMemoryRead { 877 optional uint32 address = 1; 878 optional uint32 length = 2; 879 } 880 881 /** 882 * Response: Device sends memory back 883 * @prev DebugLinkMemoryRead 884 */ 885 message DebugLinkMemory { 886 optional bytes memory = 1; 887 } 888 889 /** 890 * Request: Write memory to device. 891 * WARNING: Writing to the wrong location can irreparably break the device. 892 */ 893 message DebugLinkMemoryWrite { 894 optional uint32 address = 1; 895 optional bytes memory = 2; 896 optional bool flash = 3; 897 } 898 899 /** 900 * Request: Erase block of flash on device 901 * WARNING: Writing to the wrong location can irreparably break the device. 902 */ 903 message DebugLinkFlashErase { 904 optional uint32 sector = 1; 905 }