From a46dc2f91a33c350d253142828c1da4e086bb468 Mon Sep 17 00:00:00 2001 From: Andrew Kozlik Date: Fri, 18 Apr 2025 16:00:00 +0200 Subject: [PATCH] feat(common): Add PaymentRequest field to Ripple signing. --- common/protob/messages-ripple.proto | 4 ++ core/embed/upymod/qstrdefsport.h | 1 - core/src/trezor/messages.py | 2 + python/src/trezorlib/messages.py | 3 + .../src/protos/generated/messages_ripple.rs | 68 +++++++++++++------ 5 files changed, 57 insertions(+), 21 deletions(-) diff --git a/common/protob/messages-ripple.proto b/common/protob/messages-ripple.proto index 3e72907918..16e368c4cc 100644 --- a/common/protob/messages-ripple.proto +++ b/common/protob/messages-ripple.proto @@ -5,6 +5,9 @@ package hw.trezor.messages.ripple; option java_package = "com.satoshilabs.trezor.lib.protobuf"; option java_outer_classname = "TrezorMessageRipple"; +import "messages-common.proto"; +import "options.proto"; + /** * Request: Address at the specified index * @start @@ -38,6 +41,7 @@ message RippleSignTx { optional uint32 last_ledger_sequence = 5; // see https://developers.ripple.com/reliable-transaction-submission.html#lastledgersequence required RipplePayment payment = 6; // Payment transaction type optional bool chunkify = 7; // display the address in chunks of 4 characters + optional common.PaymentRequest payment_req = 8 [(experimental_field)=true]; // SLIP-24 payment reques /** * Payment transaction type diff --git a/core/embed/upymod/qstrdefsport.h b/core/embed/upymod/qstrdefsport.h index 8b14e67759..d747363b59 100644 --- a/core/embed/upymod/qstrdefsport.h +++ b/core/embed/upymod/qstrdefsport.h @@ -106,7 +106,6 @@ Q(apps.common.keychain) Q(apps.common.passphrase) Q(apps.common.paths) Q(apps.common.payment_request) -Q(payment_request) Q(apps.common.readers) Q(apps.common.request_pin) Q(apps.common.safety_checks) diff --git a/core/src/trezor/messages.py b/core/src/trezor/messages.py index 395fafe7ec..96e3bd46d2 100644 --- a/core/src/trezor/messages.py +++ b/core/src/trezor/messages.py @@ -5388,6 +5388,7 @@ if TYPE_CHECKING: last_ledger_sequence: "int | None" payment: "RipplePayment" chunkify: "bool | None" + payment_req: "PaymentRequest | None" def __init__( self, @@ -5399,6 +5400,7 @@ if TYPE_CHECKING: flags: "int | None" = None, last_ledger_sequence: "int | None" = None, chunkify: "bool | None" = None, + payment_req: "PaymentRequest | None" = None, ) -> None: pass diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py index 0307eefb3a..a38412d2d2 100644 --- a/python/src/trezorlib/messages.py +++ b/python/src/trezorlib/messages.py @@ -6973,6 +6973,7 @@ class RippleSignTx(protobuf.MessageType): 5: protobuf.Field("last_ledger_sequence", "uint32", repeated=False, required=False, default=None), 6: protobuf.Field("payment", "RipplePayment", repeated=False, required=True), 7: protobuf.Field("chunkify", "bool", repeated=False, required=False, default=None), + 8: protobuf.Field("payment_req", "PaymentRequest", repeated=False, required=False, default=None), } def __init__( @@ -6985,6 +6986,7 @@ class RippleSignTx(protobuf.MessageType): flags: Optional["int"] = 0, last_ledger_sequence: Optional["int"] = None, chunkify: Optional["bool"] = None, + payment_req: Optional["PaymentRequest"] = None, ) -> None: self.address_n: Sequence["int"] = address_n if address_n is not None else [] self.fee = fee @@ -6993,6 +6995,7 @@ class RippleSignTx(protobuf.MessageType): self.flags = flags self.last_ledger_sequence = last_ledger_sequence self.chunkify = chunkify + self.payment_req = payment_req class RippleSignedTx(protobuf.MessageType): diff --git a/rust/trezor-client/src/protos/generated/messages_ripple.rs b/rust/trezor-client/src/protos/generated/messages_ripple.rs index 4dd36542ab..17e890d590 100644 --- a/rust/trezor-client/src/protos/generated/messages_ripple.rs +++ b/rust/trezor-client/src/protos/generated/messages_ripple.rs @@ -457,6 +457,8 @@ pub struct RippleSignTx { pub payment: ::protobuf::MessageField, // @@protoc_insertion_point(field:hw.trezor.messages.ripple.RippleSignTx.chunkify) pub chunkify: ::std::option::Option, + // @@protoc_insertion_point(field:hw.trezor.messages.ripple.RippleSignTx.payment_req) + pub payment_req: ::protobuf::MessageField, // special fields // @@protoc_insertion_point(special_field:hw.trezor.messages.ripple.RippleSignTx.special_fields) pub special_fields: ::protobuf::SpecialFields, @@ -569,7 +571,7 @@ impl RippleSignTx { } fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { - let mut fields = ::std::vec::Vec::with_capacity(7); + let mut fields = ::std::vec::Vec::with_capacity(8); let mut oneofs = ::std::vec::Vec::with_capacity(0); fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>( "address_n", @@ -606,6 +608,11 @@ impl RippleSignTx { |m: &RippleSignTx| { &m.chunkify }, |m: &mut RippleSignTx| { &mut m.chunkify }, )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, super::messages_common::PaymentRequest>( + "payment_req", + |m: &RippleSignTx| { &m.payment_req }, + |m: &mut RippleSignTx| { &mut m.payment_req }, + )); ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( "RippleSignTx", fields, @@ -632,6 +639,11 @@ impl ::protobuf::Message for RippleSignTx { return false; } }; + for v in &self.payment_req { + if !v.is_initialized() { + return false; + } + }; true } @@ -662,6 +674,9 @@ impl ::protobuf::Message for RippleSignTx { 56 => { self.chunkify = ::std::option::Option::Some(is.read_bool()?); }, + 66 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.payment_req)?; + }, tag => { ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; }, @@ -696,6 +711,10 @@ impl ::protobuf::Message for RippleSignTx { if let Some(v) = self.chunkify { my_size += 1 + 1; } + if let Some(v) = self.payment_req.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); self.special_fields.cached_size().set(my_size as u32); my_size @@ -723,6 +742,9 @@ impl ::protobuf::Message for RippleSignTx { if let Some(v) = self.chunkify { os.write_bool(7, v)?; } + if let Some(v) = self.payment_req.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(8, v, os)?; + } os.write_unknown_fields(self.special_fields.unknown_fields())?; ::std::result::Result::Ok(()) } @@ -747,6 +769,7 @@ impl ::protobuf::Message for RippleSignTx { self.last_ledger_sequence = ::std::option::Option::None; self.payment.clear(); self.chunkify = ::std::option::Option::None; + self.payment_req.clear(); self.special_fields.clear(); } @@ -759,6 +782,7 @@ impl ::protobuf::Message for RippleSignTx { last_ledger_sequence: ::std::option::Option::None, payment: ::protobuf::MessageField::none(), chunkify: ::std::option::Option::None, + payment_req: ::protobuf::MessageField::none(), special_fields: ::protobuf::SpecialFields::new(), }; &instance @@ -1242,24 +1266,26 @@ impl ::protobuf::reflect::ProtobufValue for RippleSignedTx { } static file_descriptor_proto_data: &'static [u8] = b"\ - \n\x15messages-ripple.proto\x12\x19hw.trezor.messages.ripple\"n\n\x10Rip\ - pleGetAddress\x12\x1b\n\taddress_n\x18\x01\x20\x03(\rR\x08addressN\x12!\ - \n\x0cshow_display\x18\x02\x20\x01(\x08R\x0bshowDisplay\x12\x1a\n\x08chu\ - nkify\x18\x03\x20\x01(\x08R\x08chunkify\";\n\rRippleAddress\x12\x18\n\ - \x07address\x18\x01\x20\x02(\tR\x07address\x12\x10\n\x03mac\x18\x02\x20\ - \x01(\x0cR\x03mac\"\x85\x03\n\x0cRippleSignTx\x12\x1b\n\taddress_n\x18\ - \x01\x20\x03(\rR\x08addressN\x12\x10\n\x03fee\x18\x02\x20\x02(\x04R\x03f\ - ee\x12\x17\n\x05flags\x18\x03\x20\x01(\r:\x010R\x05flags\x12\x1a\n\x08se\ - quence\x18\x04\x20\x02(\rR\x08sequence\x120\n\x14last_ledger_sequence\ - \x18\x05\x20\x01(\rR\x12lastLedgerSequence\x12O\n\x07payment\x18\x06\x20\ - \x02(\x0b25.hw.trezor.messages.ripple.RippleSignTx.RipplePaymentR\x07pay\ - ment\x12\x1a\n\x08chunkify\x18\x07\x20\x01(\x08R\x08chunkify\x1ar\n\rRip\ - plePayment\x12\x16\n\x06amount\x18\x01\x20\x02(\x04R\x06amount\x12\x20\n\ - \x0bdestination\x18\x02\x20\x02(\tR\x0bdestination\x12'\n\x0fdestination\ - _tag\x18\x03\x20\x01(\rR\x0edestinationTag\"S\n\x0eRippleSignedTx\x12\ - \x1c\n\tsignature\x18\x01\x20\x02(\x0cR\tsignature\x12#\n\rserialized_tx\ - \x18\x02\x20\x02(\x0cR\x0cserializedTxB:\n#com.satoshilabs.trezor.lib.pr\ - otobufB\x13TrezorMessageRipple\ + \n\x15messages-ripple.proto\x12\x19hw.trezor.messages.ripple\x1a\x15mess\ + ages-common.proto\x1a\roptions.proto\"n\n\x10RippleGetAddress\x12\x1b\n\ + \taddress_n\x18\x01\x20\x03(\rR\x08addressN\x12!\n\x0cshow_display\x18\ + \x02\x20\x01(\x08R\x0bshowDisplay\x12\x1a\n\x08chunkify\x18\x03\x20\x01(\ + \x08R\x08chunkify\";\n\rRippleAddress\x12\x18\n\x07address\x18\x01\x20\ + \x02(\tR\x07address\x12\x10\n\x03mac\x18\x02\x20\x01(\x0cR\x03mac\"\xd7\ + \x03\n\x0cRippleSignTx\x12\x1b\n\taddress_n\x18\x01\x20\x03(\rR\x08addre\ + ssN\x12\x10\n\x03fee\x18\x02\x20\x02(\x04R\x03fee\x12\x17\n\x05flags\x18\ + \x03\x20\x01(\r:\x010R\x05flags\x12\x1a\n\x08sequence\x18\x04\x20\x02(\r\ + R\x08sequence\x120\n\x14last_ledger_sequence\x18\x05\x20\x01(\rR\x12last\ + LedgerSequence\x12O\n\x07payment\x18\x06\x20\x02(\x0b25.hw.trezor.messag\ + es.ripple.RippleSignTx.RipplePaymentR\x07payment\x12\x1a\n\x08chunkify\ + \x18\x07\x20\x01(\x08R\x08chunkify\x12P\n\x0bpayment_req\x18\x08\x20\x01\ + (\x0b2).hw.trezor.messages.common.PaymentRequestR\npaymentReqB\x04\xc8\ + \xf0\x19\x01\x1ar\n\rRipplePayment\x12\x16\n\x06amount\x18\x01\x20\x02(\ + \x04R\x06amount\x12\x20\n\x0bdestination\x18\x02\x20\x02(\tR\x0bdestinat\ + ion\x12'\n\x0fdestination_tag\x18\x03\x20\x01(\rR\x0edestinationTag\"S\n\ + \x0eRippleSignedTx\x12\x1c\n\tsignature\x18\x01\x20\x02(\x0cR\tsignature\ + \x12#\n\rserialized_tx\x18\x02\x20\x02(\x0cR\x0cserializedTxB:\n#com.sat\ + oshilabs.trezor.lib.protobufB\x13TrezorMessageRipple\ "; /// `FileDescriptorProto` object which was a source for this generated file @@ -1276,7 +1302,9 @@ pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor { static file_descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::FileDescriptor> = ::protobuf::rt::Lazy::new(); file_descriptor.get(|| { let generated_file_descriptor = generated_file_descriptor_lazy.get(|| { - let mut deps = ::std::vec::Vec::with_capacity(0); + let mut deps = ::std::vec::Vec::with_capacity(2); + deps.push(super::messages_common::file_descriptor().clone()); + deps.push(super::options::file_descriptor().clone()); let mut messages = ::std::vec::Vec::with_capacity(5); messages.push(RippleGetAddress::generated_message_descriptor_data()); messages.push(RippleAddress::generated_message_descriptor_data());