forked from mirror/go-ethereum
parent
4799b5abd4
commit
b4cc7b660c
@ -0,0 +1,811 @@ |
|||||||
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
|
// source: messages-common.proto
|
||||||
|
|
||||||
|
package trezor |
||||||
|
|
||||||
|
import ( |
||||||
|
fmt "fmt" |
||||||
|
math "math" |
||||||
|
|
||||||
|
proto "github.com/golang/protobuf/proto" |
||||||
|
) |
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal |
||||||
|
var _ = fmt.Errorf |
||||||
|
var _ = math.Inf |
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the proto package it is being compiled against.
|
||||||
|
// A compilation error at this line likely means your copy of the
|
||||||
|
// proto package needs to be updated.
|
||||||
|
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
||||||
|
|
||||||
|
type Failure_FailureType int32 |
||||||
|
|
||||||
|
const ( |
||||||
|
Failure_Failure_UnexpectedMessage Failure_FailureType = 1 |
||||||
|
Failure_Failure_ButtonExpected Failure_FailureType = 2 |
||||||
|
Failure_Failure_DataError Failure_FailureType = 3 |
||||||
|
Failure_Failure_ActionCancelled Failure_FailureType = 4 |
||||||
|
Failure_Failure_PinExpected Failure_FailureType = 5 |
||||||
|
Failure_Failure_PinCancelled Failure_FailureType = 6 |
||||||
|
Failure_Failure_PinInvalid Failure_FailureType = 7 |
||||||
|
Failure_Failure_InvalidSignature Failure_FailureType = 8 |
||||||
|
Failure_Failure_ProcessError Failure_FailureType = 9 |
||||||
|
Failure_Failure_NotEnoughFunds Failure_FailureType = 10 |
||||||
|
Failure_Failure_NotInitialized Failure_FailureType = 11 |
||||||
|
Failure_Failure_PinMismatch Failure_FailureType = 12 |
||||||
|
Failure_Failure_FirmwareError Failure_FailureType = 99 |
||||||
|
) |
||||||
|
|
||||||
|
var Failure_FailureType_name = map[int32]string{ |
||||||
|
1: "Failure_UnexpectedMessage", |
||||||
|
2: "Failure_ButtonExpected", |
||||||
|
3: "Failure_DataError", |
||||||
|
4: "Failure_ActionCancelled", |
||||||
|
5: "Failure_PinExpected", |
||||||
|
6: "Failure_PinCancelled", |
||||||
|
7: "Failure_PinInvalid", |
||||||
|
8: "Failure_InvalidSignature", |
||||||
|
9: "Failure_ProcessError", |
||||||
|
10: "Failure_NotEnoughFunds", |
||||||
|
11: "Failure_NotInitialized", |
||||||
|
12: "Failure_PinMismatch", |
||||||
|
99: "Failure_FirmwareError", |
||||||
|
} |
||||||
|
|
||||||
|
var Failure_FailureType_value = map[string]int32{ |
||||||
|
"Failure_UnexpectedMessage": 1, |
||||||
|
"Failure_ButtonExpected": 2, |
||||||
|
"Failure_DataError": 3, |
||||||
|
"Failure_ActionCancelled": 4, |
||||||
|
"Failure_PinExpected": 5, |
||||||
|
"Failure_PinCancelled": 6, |
||||||
|
"Failure_PinInvalid": 7, |
||||||
|
"Failure_InvalidSignature": 8, |
||||||
|
"Failure_ProcessError": 9, |
||||||
|
"Failure_NotEnoughFunds": 10, |
||||||
|
"Failure_NotInitialized": 11, |
||||||
|
"Failure_PinMismatch": 12, |
||||||
|
"Failure_FirmwareError": 99, |
||||||
|
} |
||||||
|
|
||||||
|
func (x Failure_FailureType) Enum() *Failure_FailureType { |
||||||
|
p := new(Failure_FailureType) |
||||||
|
*p = x |
||||||
|
return p |
||||||
|
} |
||||||
|
|
||||||
|
func (x Failure_FailureType) String() string { |
||||||
|
return proto.EnumName(Failure_FailureType_name, int32(x)) |
||||||
|
} |
||||||
|
|
||||||
|
func (x *Failure_FailureType) UnmarshalJSON(data []byte) error { |
||||||
|
value, err := proto.UnmarshalJSONEnum(Failure_FailureType_value, data, "Failure_FailureType") |
||||||
|
if err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
*x = Failure_FailureType(value) |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (Failure_FailureType) EnumDescriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_aaf30d059fdbc38d, []int{1, 0} |
||||||
|
} |
||||||
|
|
||||||
|
//*
|
||||||
|
// Type of button request
|
||||||
|
type ButtonRequest_ButtonRequestType int32 |
||||||
|
|
||||||
|
const ( |
||||||
|
ButtonRequest_ButtonRequest_Other ButtonRequest_ButtonRequestType = 1 |
||||||
|
ButtonRequest_ButtonRequest_FeeOverThreshold ButtonRequest_ButtonRequestType = 2 |
||||||
|
ButtonRequest_ButtonRequest_ConfirmOutput ButtonRequest_ButtonRequestType = 3 |
||||||
|
ButtonRequest_ButtonRequest_ResetDevice ButtonRequest_ButtonRequestType = 4 |
||||||
|
ButtonRequest_ButtonRequest_ConfirmWord ButtonRequest_ButtonRequestType = 5 |
||||||
|
ButtonRequest_ButtonRequest_WipeDevice ButtonRequest_ButtonRequestType = 6 |
||||||
|
ButtonRequest_ButtonRequest_ProtectCall ButtonRequest_ButtonRequestType = 7 |
||||||
|
ButtonRequest_ButtonRequest_SignTx ButtonRequest_ButtonRequestType = 8 |
||||||
|
ButtonRequest_ButtonRequest_FirmwareCheck ButtonRequest_ButtonRequestType = 9 |
||||||
|
ButtonRequest_ButtonRequest_Address ButtonRequest_ButtonRequestType = 10 |
||||||
|
ButtonRequest_ButtonRequest_PublicKey ButtonRequest_ButtonRequestType = 11 |
||||||
|
ButtonRequest_ButtonRequest_MnemonicWordCount ButtonRequest_ButtonRequestType = 12 |
||||||
|
ButtonRequest_ButtonRequest_MnemonicInput ButtonRequest_ButtonRequestType = 13 |
||||||
|
ButtonRequest_ButtonRequest_PassphraseType ButtonRequest_ButtonRequestType = 14 |
||||||
|
ButtonRequest_ButtonRequest_UnknownDerivationPath ButtonRequest_ButtonRequestType = 15 |
||||||
|
) |
||||||
|
|
||||||
|
var ButtonRequest_ButtonRequestType_name = map[int32]string{ |
||||||
|
1: "ButtonRequest_Other", |
||||||
|
2: "ButtonRequest_FeeOverThreshold", |
||||||
|
3: "ButtonRequest_ConfirmOutput", |
||||||
|
4: "ButtonRequest_ResetDevice", |
||||||
|
5: "ButtonRequest_ConfirmWord", |
||||||
|
6: "ButtonRequest_WipeDevice", |
||||||
|
7: "ButtonRequest_ProtectCall", |
||||||
|
8: "ButtonRequest_SignTx", |
||||||
|
9: "ButtonRequest_FirmwareCheck", |
||||||
|
10: "ButtonRequest_Address", |
||||||
|
11: "ButtonRequest_PublicKey", |
||||||
|
12: "ButtonRequest_MnemonicWordCount", |
||||||
|
13: "ButtonRequest_MnemonicInput", |
||||||
|
14: "ButtonRequest_PassphraseType", |
||||||
|
15: "ButtonRequest_UnknownDerivationPath", |
||||||
|
} |
||||||
|
|
||||||
|
var ButtonRequest_ButtonRequestType_value = map[string]int32{ |
||||||
|
"ButtonRequest_Other": 1, |
||||||
|
"ButtonRequest_FeeOverThreshold": 2, |
||||||
|
"ButtonRequest_ConfirmOutput": 3, |
||||||
|
"ButtonRequest_ResetDevice": 4, |
||||||
|
"ButtonRequest_ConfirmWord": 5, |
||||||
|
"ButtonRequest_WipeDevice": 6, |
||||||
|
"ButtonRequest_ProtectCall": 7, |
||||||
|
"ButtonRequest_SignTx": 8, |
||||||
|
"ButtonRequest_FirmwareCheck": 9, |
||||||
|
"ButtonRequest_Address": 10, |
||||||
|
"ButtonRequest_PublicKey": 11, |
||||||
|
"ButtonRequest_MnemonicWordCount": 12, |
||||||
|
"ButtonRequest_MnemonicInput": 13, |
||||||
|
"ButtonRequest_PassphraseType": 14, |
||||||
|
"ButtonRequest_UnknownDerivationPath": 15, |
||||||
|
} |
||||||
|
|
||||||
|
func (x ButtonRequest_ButtonRequestType) Enum() *ButtonRequest_ButtonRequestType { |
||||||
|
p := new(ButtonRequest_ButtonRequestType) |
||||||
|
*p = x |
||||||
|
return p |
||||||
|
} |
||||||
|
|
||||||
|
func (x ButtonRequest_ButtonRequestType) String() string { |
||||||
|
return proto.EnumName(ButtonRequest_ButtonRequestType_name, int32(x)) |
||||||
|
} |
||||||
|
|
||||||
|
func (x *ButtonRequest_ButtonRequestType) UnmarshalJSON(data []byte) error { |
||||||
|
value, err := proto.UnmarshalJSONEnum(ButtonRequest_ButtonRequestType_value, data, "ButtonRequest_ButtonRequestType") |
||||||
|
if err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
*x = ButtonRequest_ButtonRequestType(value) |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (ButtonRequest_ButtonRequestType) EnumDescriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_aaf30d059fdbc38d, []int{2, 0} |
||||||
|
} |
||||||
|
|
||||||
|
//*
|
||||||
|
// Type of PIN request
|
||||||
|
type PinMatrixRequest_PinMatrixRequestType int32 |
||||||
|
|
||||||
|
const ( |
||||||
|
PinMatrixRequest_PinMatrixRequestType_Current PinMatrixRequest_PinMatrixRequestType = 1 |
||||||
|
PinMatrixRequest_PinMatrixRequestType_NewFirst PinMatrixRequest_PinMatrixRequestType = 2 |
||||||
|
PinMatrixRequest_PinMatrixRequestType_NewSecond PinMatrixRequest_PinMatrixRequestType = 3 |
||||||
|
) |
||||||
|
|
||||||
|
var PinMatrixRequest_PinMatrixRequestType_name = map[int32]string{ |
||||||
|
1: "PinMatrixRequestType_Current", |
||||||
|
2: "PinMatrixRequestType_NewFirst", |
||||||
|
3: "PinMatrixRequestType_NewSecond", |
||||||
|
} |
||||||
|
|
||||||
|
var PinMatrixRequest_PinMatrixRequestType_value = map[string]int32{ |
||||||
|
"PinMatrixRequestType_Current": 1, |
||||||
|
"PinMatrixRequestType_NewFirst": 2, |
||||||
|
"PinMatrixRequestType_NewSecond": 3, |
||||||
|
} |
||||||
|
|
||||||
|
func (x PinMatrixRequest_PinMatrixRequestType) Enum() *PinMatrixRequest_PinMatrixRequestType { |
||||||
|
p := new(PinMatrixRequest_PinMatrixRequestType) |
||||||
|
*p = x |
||||||
|
return p |
||||||
|
} |
||||||
|
|
||||||
|
func (x PinMatrixRequest_PinMatrixRequestType) String() string { |
||||||
|
return proto.EnumName(PinMatrixRequest_PinMatrixRequestType_name, int32(x)) |
||||||
|
} |
||||||
|
|
||||||
|
func (x *PinMatrixRequest_PinMatrixRequestType) UnmarshalJSON(data []byte) error { |
||||||
|
value, err := proto.UnmarshalJSONEnum(PinMatrixRequest_PinMatrixRequestType_value, data, "PinMatrixRequest_PinMatrixRequestType") |
||||||
|
if err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
*x = PinMatrixRequest_PinMatrixRequestType(value) |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (PinMatrixRequest_PinMatrixRequestType) EnumDescriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_aaf30d059fdbc38d, []int{4, 0} |
||||||
|
} |
||||||
|
|
||||||
|
//*
|
||||||
|
// Response: Success of the previous request
|
||||||
|
// @end
|
||||||
|
type Success struct { |
||||||
|
Message *string `protobuf:"bytes,1,opt,name=message" json:"message,omitempty"` |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *Success) Reset() { *m = Success{} } |
||||||
|
func (m *Success) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*Success) ProtoMessage() {} |
||||||
|
func (*Success) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_aaf30d059fdbc38d, []int{0} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *Success) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_Success.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *Success) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_Success.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *Success) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_Success.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *Success) XXX_Size() int { |
||||||
|
return xxx_messageInfo_Success.Size(m) |
||||||
|
} |
||||||
|
func (m *Success) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_Success.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_Success proto.InternalMessageInfo |
||||||
|
|
||||||
|
func (m *Success) GetMessage() string { |
||||||
|
if m != nil && m.Message != nil { |
||||||
|
return *m.Message |
||||||
|
} |
||||||
|
return "" |
||||||
|
} |
||||||
|
|
||||||
|
//*
|
||||||
|
// Response: Failure of the previous request
|
||||||
|
// @end
|
||||||
|
type Failure struct { |
||||||
|
Code *Failure_FailureType `protobuf:"varint,1,opt,name=code,enum=hw.trezor.messages.common.Failure_FailureType" json:"code,omitempty"` |
||||||
|
Message *string `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *Failure) Reset() { *m = Failure{} } |
||||||
|
func (m *Failure) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*Failure) ProtoMessage() {} |
||||||
|
func (*Failure) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_aaf30d059fdbc38d, []int{1} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *Failure) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_Failure.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *Failure) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_Failure.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *Failure) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_Failure.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *Failure) XXX_Size() int { |
||||||
|
return xxx_messageInfo_Failure.Size(m) |
||||||
|
} |
||||||
|
func (m *Failure) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_Failure.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_Failure proto.InternalMessageInfo |
||||||
|
|
||||||
|
func (m *Failure) GetCode() Failure_FailureType { |
||||||
|
if m != nil && m.Code != nil { |
||||||
|
return *m.Code |
||||||
|
} |
||||||
|
return Failure_Failure_UnexpectedMessage |
||||||
|
} |
||||||
|
|
||||||
|
func (m *Failure) GetMessage() string { |
||||||
|
if m != nil && m.Message != nil { |
||||||
|
return *m.Message |
||||||
|
} |
||||||
|
return "" |
||||||
|
} |
||||||
|
|
||||||
|
//*
|
||||||
|
// Response: Device is waiting for HW button press.
|
||||||
|
// @auxstart
|
||||||
|
// @next ButtonAck
|
||||||
|
type ButtonRequest struct { |
||||||
|
Code *ButtonRequest_ButtonRequestType `protobuf:"varint,1,opt,name=code,enum=hw.trezor.messages.common.ButtonRequest_ButtonRequestType" json:"code,omitempty"` |
||||||
|
Data *string `protobuf:"bytes,2,opt,name=data" json:"data,omitempty"` |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *ButtonRequest) Reset() { *m = ButtonRequest{} } |
||||||
|
func (m *ButtonRequest) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*ButtonRequest) ProtoMessage() {} |
||||||
|
func (*ButtonRequest) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_aaf30d059fdbc38d, []int{2} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *ButtonRequest) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_ButtonRequest.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *ButtonRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_ButtonRequest.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *ButtonRequest) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_ButtonRequest.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *ButtonRequest) XXX_Size() int { |
||||||
|
return xxx_messageInfo_ButtonRequest.Size(m) |
||||||
|
} |
||||||
|
func (m *ButtonRequest) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_ButtonRequest.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_ButtonRequest proto.InternalMessageInfo |
||||||
|
|
||||||
|
func (m *ButtonRequest) GetCode() ButtonRequest_ButtonRequestType { |
||||||
|
if m != nil && m.Code != nil { |
||||||
|
return *m.Code |
||||||
|
} |
||||||
|
return ButtonRequest_ButtonRequest_Other |
||||||
|
} |
||||||
|
|
||||||
|
func (m *ButtonRequest) GetData() string { |
||||||
|
if m != nil && m.Data != nil { |
||||||
|
return *m.Data |
||||||
|
} |
||||||
|
return "" |
||||||
|
} |
||||||
|
|
||||||
|
//*
|
||||||
|
// Request: Computer agrees to wait for HW button press
|
||||||
|
// @auxend
|
||||||
|
type ButtonAck struct { |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *ButtonAck) Reset() { *m = ButtonAck{} } |
||||||
|
func (m *ButtonAck) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*ButtonAck) ProtoMessage() {} |
||||||
|
func (*ButtonAck) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_aaf30d059fdbc38d, []int{3} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *ButtonAck) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_ButtonAck.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *ButtonAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_ButtonAck.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *ButtonAck) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_ButtonAck.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *ButtonAck) XXX_Size() int { |
||||||
|
return xxx_messageInfo_ButtonAck.Size(m) |
||||||
|
} |
||||||
|
func (m *ButtonAck) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_ButtonAck.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_ButtonAck proto.InternalMessageInfo |
||||||
|
|
||||||
|
//*
|
||||||
|
// Response: Device is asking computer to show PIN matrix and awaits PIN encoded using this matrix scheme
|
||||||
|
// @auxstart
|
||||||
|
// @next PinMatrixAck
|
||||||
|
type PinMatrixRequest struct { |
||||||
|
Type *PinMatrixRequest_PinMatrixRequestType `protobuf:"varint,1,opt,name=type,enum=hw.trezor.messages.common.PinMatrixRequest_PinMatrixRequestType" json:"type,omitempty"` |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *PinMatrixRequest) Reset() { *m = PinMatrixRequest{} } |
||||||
|
func (m *PinMatrixRequest) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*PinMatrixRequest) ProtoMessage() {} |
||||||
|
func (*PinMatrixRequest) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_aaf30d059fdbc38d, []int{4} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *PinMatrixRequest) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_PinMatrixRequest.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *PinMatrixRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_PinMatrixRequest.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *PinMatrixRequest) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_PinMatrixRequest.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *PinMatrixRequest) XXX_Size() int { |
||||||
|
return xxx_messageInfo_PinMatrixRequest.Size(m) |
||||||
|
} |
||||||
|
func (m *PinMatrixRequest) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_PinMatrixRequest.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_PinMatrixRequest proto.InternalMessageInfo |
||||||
|
|
||||||
|
func (m *PinMatrixRequest) GetType() PinMatrixRequest_PinMatrixRequestType { |
||||||
|
if m != nil && m.Type != nil { |
||||||
|
return *m.Type |
||||||
|
} |
||||||
|
return PinMatrixRequest_PinMatrixRequestType_Current |
||||||
|
} |
||||||
|
|
||||||
|
//*
|
||||||
|
// Request: Computer responds with encoded PIN
|
||||||
|
// @auxend
|
||||||
|
type PinMatrixAck struct { |
||||||
|
Pin *string `protobuf:"bytes,1,req,name=pin" json:"pin,omitempty"` |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *PinMatrixAck) Reset() { *m = PinMatrixAck{} } |
||||||
|
func (m *PinMatrixAck) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*PinMatrixAck) ProtoMessage() {} |
||||||
|
func (*PinMatrixAck) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_aaf30d059fdbc38d, []int{5} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *PinMatrixAck) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_PinMatrixAck.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *PinMatrixAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_PinMatrixAck.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *PinMatrixAck) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_PinMatrixAck.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *PinMatrixAck) XXX_Size() int { |
||||||
|
return xxx_messageInfo_PinMatrixAck.Size(m) |
||||||
|
} |
||||||
|
func (m *PinMatrixAck) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_PinMatrixAck.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_PinMatrixAck proto.InternalMessageInfo |
||||||
|
|
||||||
|
func (m *PinMatrixAck) GetPin() string { |
||||||
|
if m != nil && m.Pin != nil { |
||||||
|
return *m.Pin |
||||||
|
} |
||||||
|
return "" |
||||||
|
} |
||||||
|
|
||||||
|
//*
|
||||||
|
// Response: Device awaits encryption passphrase
|
||||||
|
// @auxstart
|
||||||
|
// @next PassphraseAck
|
||||||
|
type PassphraseRequest struct { |
||||||
|
OnDevice *bool `protobuf:"varint,1,opt,name=on_device,json=onDevice" json:"on_device,omitempty"` |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *PassphraseRequest) Reset() { *m = PassphraseRequest{} } |
||||||
|
func (m *PassphraseRequest) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*PassphraseRequest) ProtoMessage() {} |
||||||
|
func (*PassphraseRequest) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_aaf30d059fdbc38d, []int{6} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *PassphraseRequest) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_PassphraseRequest.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *PassphraseRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_PassphraseRequest.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *PassphraseRequest) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_PassphraseRequest.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *PassphraseRequest) XXX_Size() int { |
||||||
|
return xxx_messageInfo_PassphraseRequest.Size(m) |
||||||
|
} |
||||||
|
func (m *PassphraseRequest) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_PassphraseRequest.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_PassphraseRequest proto.InternalMessageInfo |
||||||
|
|
||||||
|
func (m *PassphraseRequest) GetOnDevice() bool { |
||||||
|
if m != nil && m.OnDevice != nil { |
||||||
|
return *m.OnDevice |
||||||
|
} |
||||||
|
return false |
||||||
|
} |
||||||
|
|
||||||
|
//*
|
||||||
|
// Request: Send passphrase back
|
||||||
|
// @next PassphraseStateRequest
|
||||||
|
type PassphraseAck struct { |
||||||
|
Passphrase *string `protobuf:"bytes,1,opt,name=passphrase" json:"passphrase,omitempty"` |
||||||
|
State []byte `protobuf:"bytes,2,opt,name=state" json:"state,omitempty"` |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *PassphraseAck) Reset() { *m = PassphraseAck{} } |
||||||
|
func (m *PassphraseAck) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*PassphraseAck) ProtoMessage() {} |
||||||
|
func (*PassphraseAck) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_aaf30d059fdbc38d, []int{7} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *PassphraseAck) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_PassphraseAck.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *PassphraseAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_PassphraseAck.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *PassphraseAck) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_PassphraseAck.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *PassphraseAck) XXX_Size() int { |
||||||
|
return xxx_messageInfo_PassphraseAck.Size(m) |
||||||
|
} |
||||||
|
func (m *PassphraseAck) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_PassphraseAck.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_PassphraseAck proto.InternalMessageInfo |
||||||
|
|
||||||
|
func (m *PassphraseAck) GetPassphrase() string { |
||||||
|
if m != nil && m.Passphrase != nil { |
||||||
|
return *m.Passphrase |
||||||
|
} |
||||||
|
return "" |
||||||
|
} |
||||||
|
|
||||||
|
func (m *PassphraseAck) GetState() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.State |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
//*
|
||||||
|
// Response: Device awaits passphrase state
|
||||||
|
// @next PassphraseStateAck
|
||||||
|
type PassphraseStateRequest struct { |
||||||
|
State []byte `protobuf:"bytes,1,opt,name=state" json:"state,omitempty"` |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *PassphraseStateRequest) Reset() { *m = PassphraseStateRequest{} } |
||||||
|
func (m *PassphraseStateRequest) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*PassphraseStateRequest) ProtoMessage() {} |
||||||
|
func (*PassphraseStateRequest) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_aaf30d059fdbc38d, []int{8} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *PassphraseStateRequest) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_PassphraseStateRequest.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *PassphraseStateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_PassphraseStateRequest.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *PassphraseStateRequest) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_PassphraseStateRequest.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *PassphraseStateRequest) XXX_Size() int { |
||||||
|
return xxx_messageInfo_PassphraseStateRequest.Size(m) |
||||||
|
} |
||||||
|
func (m *PassphraseStateRequest) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_PassphraseStateRequest.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_PassphraseStateRequest proto.InternalMessageInfo |
||||||
|
|
||||||
|
func (m *PassphraseStateRequest) GetState() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.State |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
//*
|
||||||
|
// Request: Send passphrase state back
|
||||||
|
// @auxend
|
||||||
|
type PassphraseStateAck struct { |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *PassphraseStateAck) Reset() { *m = PassphraseStateAck{} } |
||||||
|
func (m *PassphraseStateAck) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*PassphraseStateAck) ProtoMessage() {} |
||||||
|
func (*PassphraseStateAck) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_aaf30d059fdbc38d, []int{9} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *PassphraseStateAck) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_PassphraseStateAck.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *PassphraseStateAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_PassphraseStateAck.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *PassphraseStateAck) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_PassphraseStateAck.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *PassphraseStateAck) XXX_Size() int { |
||||||
|
return xxx_messageInfo_PassphraseStateAck.Size(m) |
||||||
|
} |
||||||
|
func (m *PassphraseStateAck) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_PassphraseStateAck.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_PassphraseStateAck proto.InternalMessageInfo |
||||||
|
|
||||||
|
//*
|
||||||
|
// Structure representing BIP32 (hierarchical deterministic) node
|
||||||
|
// Used for imports of private key into the device and exporting public key out of device
|
||||||
|
// @embed
|
||||||
|
type HDNodeType struct { |
||||||
|
Depth *uint32 `protobuf:"varint,1,req,name=depth" json:"depth,omitempty"` |
||||||
|
Fingerprint *uint32 `protobuf:"varint,2,req,name=fingerprint" json:"fingerprint,omitempty"` |
||||||
|
ChildNum *uint32 `protobuf:"varint,3,req,name=child_num,json=childNum" json:"child_num,omitempty"` |
||||||
|
ChainCode []byte `protobuf:"bytes,4,req,name=chain_code,json=chainCode" json:"chain_code,omitempty"` |
||||||
|
PrivateKey []byte `protobuf:"bytes,5,opt,name=private_key,json=privateKey" json:"private_key,omitempty"` |
||||||
|
PublicKey []byte `protobuf:"bytes,6,opt,name=public_key,json=publicKey" json:"public_key,omitempty"` |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *HDNodeType) Reset() { *m = HDNodeType{} } |
||||||
|
func (m *HDNodeType) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*HDNodeType) ProtoMessage() {} |
||||||
|
func (*HDNodeType) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_aaf30d059fdbc38d, []int{10} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *HDNodeType) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_HDNodeType.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *HDNodeType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_HDNodeType.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *HDNodeType) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_HDNodeType.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *HDNodeType) XXX_Size() int { |
||||||
|
return xxx_messageInfo_HDNodeType.Size(m) |
||||||
|
} |
||||||
|
func (m *HDNodeType) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_HDNodeType.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_HDNodeType proto.InternalMessageInfo |
||||||
|
|
||||||
|
func (m *HDNodeType) GetDepth() uint32 { |
||||||
|
if m != nil && m.Depth != nil { |
||||||
|
return *m.Depth |
||||||
|
} |
||||||
|
return 0 |
||||||
|
} |
||||||
|
|
||||||
|
func (m *HDNodeType) GetFingerprint() uint32 { |
||||||
|
if m != nil && m.Fingerprint != nil { |
||||||
|
return *m.Fingerprint |
||||||
|
} |
||||||
|
return 0 |
||||||
|
} |
||||||
|
|
||||||
|
func (m *HDNodeType) GetChildNum() uint32 { |
||||||
|
if m != nil && m.ChildNum != nil { |
||||||
|
return *m.ChildNum |
||||||
|
} |
||||||
|
return 0 |
||||||
|
} |
||||||
|
|
||||||
|
func (m *HDNodeType) GetChainCode() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.ChainCode |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (m *HDNodeType) GetPrivateKey() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.PrivateKey |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (m *HDNodeType) GetPublicKey() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.PublicKey |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func init() { |
||||||
|
proto.RegisterEnum("hw.trezor.messages.common.Failure_FailureType", Failure_FailureType_name, Failure_FailureType_value) |
||||||
|
proto.RegisterEnum("hw.trezor.messages.common.ButtonRequest_ButtonRequestType", ButtonRequest_ButtonRequestType_name, ButtonRequest_ButtonRequestType_value) |
||||||
|
proto.RegisterEnum("hw.trezor.messages.common.PinMatrixRequest_PinMatrixRequestType", PinMatrixRequest_PinMatrixRequestType_name, PinMatrixRequest_PinMatrixRequestType_value) |
||||||
|
proto.RegisterType((*Success)(nil), "hw.trezor.messages.common.Success") |
||||||
|
proto.RegisterType((*Failure)(nil), "hw.trezor.messages.common.Failure") |
||||||
|
proto.RegisterType((*ButtonRequest)(nil), "hw.trezor.messages.common.ButtonRequest") |
||||||
|
proto.RegisterType((*ButtonAck)(nil), "hw.trezor.messages.common.ButtonAck") |
||||||
|
proto.RegisterType((*PinMatrixRequest)(nil), "hw.trezor.messages.common.PinMatrixRequest") |
||||||
|
proto.RegisterType((*PinMatrixAck)(nil), "hw.trezor.messages.common.PinMatrixAck") |
||||||
|
proto.RegisterType((*PassphraseRequest)(nil), "hw.trezor.messages.common.PassphraseRequest") |
||||||
|
proto.RegisterType((*PassphraseAck)(nil), "hw.trezor.messages.common.PassphraseAck") |
||||||
|
proto.RegisterType((*PassphraseStateRequest)(nil), "hw.trezor.messages.common.PassphraseStateRequest") |
||||||
|
proto.RegisterType((*PassphraseStateAck)(nil), "hw.trezor.messages.common.PassphraseStateAck") |
||||||
|
proto.RegisterType((*HDNodeType)(nil), "hw.trezor.messages.common.HDNodeType") |
||||||
|
} |
||||||
|
|
||||||
|
func init() { proto.RegisterFile("messages-common.proto", fileDescriptor_aaf30d059fdbc38d) } |
||||||
|
|
||||||
|
var fileDescriptor_aaf30d059fdbc38d = []byte{ |
||||||
|
// 846 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0xcd, 0x52, 0x23, 0x37, |
||||||
|
0x10, 0x2e, 0xff, 0x80, 0xed, 0xb6, 0xd9, 0x08, 0xc5, 0x80, 0x09, 0xb0, 0x38, 0xc3, 0x21, 0x5c, |
||||||
|
0xe2, 0x4a, 0xe5, 0x98, 0x53, 0x58, 0x83, 0x2b, 0xd4, 0x16, 0x86, 0x1a, 0xd8, 0xda, 0xa3, 0x4b, |
||||||
|
0xd1, 0xf4, 0x32, 0x2a, 0xcf, 0x48, 0x13, 0x8d, 0x06, 0xf0, 0x5e, 0xf2, 0x6a, 0x79, 0x89, 0xbc, |
||||||
|
0x42, 0xaa, 0x52, 0xb9, 0xe4, 0x11, 0xb6, 0x34, 0x3f, 0x78, 0xc6, 0x66, 0x39, 0xcd, 0xe8, 0xfb, |
||||||
|
0xbe, 0xee, 0x96, 0xba, 0x3f, 0x09, 0x76, 0x42, 0x8c, 0x63, 0x76, 0x8f, 0xf1, 0x8f, 0x5c, 0x85, |
||||||
|
0xa1, 0x92, 0xa3, 0x48, 0x2b, 0xa3, 0xe8, 0xbe, 0xff, 0x38, 0x32, 0x1a, 0x3f, 0x2b, 0x3d, 0x2a, |
||||||
|
0x04, 0xa3, 0x4c, 0xe0, 0x9c, 0x40, 0xeb, 0x36, 0xe1, 0x1c, 0xe3, 0x98, 0x0e, 0xa0, 0x95, 0xb3, |
||||||
|
0x83, 0xda, 0xb0, 0x76, 0xda, 0x71, 0x8b, 0xa5, 0xf3, 0x77, 0x03, 0x5a, 0x13, 0x26, 0x82, 0x44, |
||||||
|
0x23, 0x7d, 0x07, 0x4d, 0xae, 0xbc, 0x4c, 0xf2, 0xe6, 0xe7, 0xd1, 0xe8, 0xab, 0xa9, 0x47, 0x79, |
||||||
|
0x44, 0xf1, 0xbd, 0x5b, 0x44, 0xe8, 0xa6, 0xb1, 0xe5, 0x4a, 0xf5, 0x6a, 0xa5, 0xff, 0xea, 0xd0, |
||||||
|
0x2d, 0xe9, 0xe9, 0x11, 0xec, 0xe7, 0xcb, 0xd9, 0x07, 0x89, 0x4f, 0x11, 0x72, 0x83, 0xde, 0x55, |
||||||
|
0x26, 0x26, 0x35, 0xfa, 0x1d, 0xec, 0x16, 0xf4, 0xbb, 0xc4, 0x18, 0x25, 0x2f, 0x72, 0x09, 0xa9, |
||||||
|
0xd3, 0x1d, 0xd8, 0x2e, 0xb8, 0x73, 0x66, 0xd8, 0x85, 0xd6, 0x4a, 0x93, 0x06, 0x3d, 0x80, 0xbd, |
||||||
|
0x02, 0x3e, 0xe3, 0x46, 0x28, 0x39, 0x66, 0x92, 0x63, 0x10, 0xa0, 0x47, 0x9a, 0x74, 0x0f, 0xbe, |
||||||
|
0x2d, 0xc8, 0x1b, 0xb1, 0x4c, 0xb6, 0x41, 0x07, 0xd0, 0x2f, 0x11, 0xcb, 0x90, 0x4d, 0xba, 0x0b, |
||||||
|
0xb4, 0xc4, 0x5c, 0xca, 0x07, 0x16, 0x08, 0x8f, 0xb4, 0xe8, 0x21, 0x0c, 0x0a, 0x3c, 0x07, 0x6f, |
||||||
|
0xc5, 0xbd, 0x64, 0x26, 0xd1, 0x48, 0xda, 0x95, 0x7c, 0x5a, 0xd9, 0xf6, 0x67, 0xfb, 0xeb, 0x94, |
||||||
|
0x8f, 0x34, 0x55, 0xe6, 0x42, 0xaa, 0xe4, 0xde, 0x9f, 0x24, 0xd2, 0x8b, 0x09, 0xac, 0x70, 0x97, |
||||||
|
0x52, 0x18, 0xc1, 0x02, 0xf1, 0x19, 0x3d, 0xd2, 0x5d, 0xd9, 0xfa, 0x95, 0x88, 0x43, 0x66, 0xb8, |
||||||
|
0x4f, 0x7a, 0x74, 0x1f, 0x76, 0x0a, 0x62, 0x22, 0x74, 0xf8, 0xc8, 0x34, 0x66, 0xb5, 0xb8, 0xf3, |
||||||
|
0x4f, 0x13, 0xb6, 0xb2, 0xbe, 0xb9, 0xf8, 0x47, 0x82, 0xb1, 0xa1, 0xd3, 0xca, 0x74, 0x7f, 0x79, |
||||||
|
0x65, 0xba, 0x95, 0xb8, 0xea, 0xaa, 0x34, 0x69, 0x0a, 0x4d, 0x8f, 0x19, 0x96, 0x8f, 0x39, 0xfd, |
||||||
|
0x77, 0xfe, 0x6f, 0xc0, 0xf6, 0x9a, 0xde, 0xee, 0xbf, 0x02, 0xce, 0xae, 0x8d, 0x8f, 0x9a, 0xd4, |
||||||
|
0xa8, 0x03, 0x6f, 0xab, 0xc4, 0x04, 0xf1, 0xfa, 0x01, 0xf5, 0x9d, 0xaf, 0x31, 0xf6, 0x55, 0x60, |
||||||
|
0x67, 0x7d, 0x0c, 0x07, 0x55, 0xcd, 0x58, 0xc9, 0x4f, 0x42, 0x87, 0xd7, 0x89, 0x89, 0x12, 0x43, |
||||||
|
0x1a, 0xd6, 0x47, 0x55, 0x81, 0x8b, 0x31, 0x9a, 0x73, 0x7c, 0x10, 0x1c, 0x49, 0x73, 0x9d, 0xce, |
||||||
|
0xe3, 0x3f, 0x2a, 0x6d, 0xa7, 0x7f, 0x08, 0x83, 0x2a, 0xfd, 0x51, 0x44, 0x98, 0x07, 0x6f, 0xae, |
||||||
|
0x07, 0xdf, 0x68, 0x65, 0x90, 0x9b, 0x31, 0x0b, 0x02, 0xd2, 0xb2, 0xa3, 0xae, 0xd2, 0xd6, 0x07, |
||||||
|
0x77, 0x4f, 0xa4, 0xbd, 0xbe, 0xeb, 0x62, 0x3e, 0x63, 0x1f, 0xf9, 0x9c, 0x74, 0xec, 0xe8, 0xaa, |
||||||
|
0x82, 0x33, 0xcf, 0xd3, 0x18, 0x5b, 0x2b, 0x1c, 0xc0, 0xde, 0x4a, 0xd1, 0xe4, 0xf7, 0x40, 0xf0, |
||||||
|
0xf7, 0xb8, 0x20, 0x5d, 0x7a, 0x02, 0xc7, 0x55, 0xf2, 0x4a, 0x62, 0xa8, 0xa4, 0xe0, 0xf6, 0x3c, |
||||||
|
0x63, 0x95, 0x48, 0x43, 0x7a, 0xeb, 0xd5, 0x0b, 0xd1, 0xa5, 0xb4, 0x3d, 0xdb, 0xa2, 0x43, 0x38, |
||||||
|
0x5c, 0x29, 0xc1, 0xe2, 0x38, 0xf2, 0x35, 0x8b, 0xd3, 0xbb, 0x49, 0xde, 0xd0, 0x1f, 0xe0, 0xa4, |
||||||
|
0xaa, 0xf8, 0x20, 0xe7, 0x52, 0x3d, 0xca, 0x73, 0xd4, 0xe2, 0x81, 0xd9, 0xcb, 0x75, 0xc3, 0x8c, |
||||||
|
0x4f, 0xbe, 0x71, 0xba, 0xd0, 0xc9, 0x84, 0x67, 0x7c, 0xee, 0xfc, 0x5b, 0x03, 0x62, 0x2d, 0xca, |
||||||
|
0x8c, 0x16, 0x4f, 0x85, 0xf1, 0xee, 0xa0, 0x69, 0x16, 0x51, 0x61, 0xbc, 0x5f, 0x5f, 0x31, 0xde, |
||||||
|
0x6a, 0xe8, 0x1a, 0x90, 0xd9, 0xcf, 0x66, 0x73, 0xfe, 0x84, 0xfe, 0x4b, 0xac, 0x3d, 0xda, 0x4b, |
||||||
|
0xf8, 0x6c, 0x9c, 0x68, 0x8d, 0xd2, 0x90, 0x1a, 0xfd, 0x1e, 0x8e, 0x5e, 0x54, 0x4c, 0xf1, 0x71, |
||||||
|
0x22, 0x74, 0x6c, 0x48, 0xdd, 0x1a, 0xf3, 0x6b, 0x92, 0x5b, 0xe4, 0x4a, 0x7a, 0xa4, 0xe1, 0x0c, |
||||||
|
0xa1, 0xf7, 0xac, 0x39, 0xe3, 0x73, 0x4a, 0xa0, 0x11, 0x09, 0x39, 0xa8, 0x0d, 0xeb, 0xa7, 0x1d, |
||||||
|
0xd7, 0xfe, 0x3a, 0x3f, 0xc1, 0xf6, 0xb2, 0xaf, 0x45, 0x37, 0x0e, 0xa0, 0xa3, 0xe4, 0xcc, 0x4b, |
||||||
|
0x1d, 0x96, 0xb6, 0xa4, 0xed, 0xb6, 0x95, 0xcc, 0x1c, 0xe7, 0x5c, 0xc0, 0xd6, 0x32, 0xc2, 0x26, |
||||||
|
0x7d, 0x0b, 0x10, 0x3d, 0x03, 0xf9, 0xdb, 0x5d, 0x42, 0x68, 0x1f, 0x36, 0x62, 0xc3, 0x4c, 0xf6, |
||||||
|
0xd8, 0xf6, 0xdc, 0x6c, 0xe1, 0x8c, 0x60, 0x77, 0x99, 0xe6, 0xd6, 0x42, 0x45, 0xf5, 0x67, 0x7d, |
||||||
|
0xad, 0xac, 0xef, 0x03, 0x5d, 0xd1, 0xdb, 0x61, 0xfe, 0x55, 0x03, 0xf8, 0xed, 0x7c, 0xaa, 0xbc, |
||||||
|
0xec, 0xbd, 0xee, 0xc3, 0x86, 0x87, 0x91, 0xf1, 0xd3, 0x13, 0x6e, 0xb9, 0xd9, 0x82, 0x0e, 0xa1, |
||||||
|
0xfb, 0x49, 0xc8, 0x7b, 0xd4, 0x91, 0x16, 0xd2, 0x0c, 0xea, 0x29, 0x57, 0x86, 0xec, 0x81, 0xb9, |
||||||
|
0x2f, 0x02, 0x6f, 0x26, 0x93, 0x70, 0xd0, 0x48, 0xf9, 0x76, 0x0a, 0x4c, 0x93, 0x90, 0x1e, 0x01, |
||||||
|
0x70, 0x9f, 0x09, 0x39, 0x4b, 0x9f, 0xa6, 0xe6, 0xb0, 0x7e, 0xda, 0x73, 0x3b, 0x29, 0x32, 0xb6, |
||||||
|
0x6f, 0xcc, 0x31, 0x74, 0xa3, 0xd4, 0x6f, 0x38, 0x9b, 0xe3, 0x62, 0xb0, 0x91, 0x6e, 0x1a, 0x72, |
||||||
|
0xe8, 0x3d, 0x2e, 0x6c, 0x7c, 0x94, 0xde, 0x8e, 0x94, 0xdf, 0x4c, 0xf9, 0x4e, 0x54, 0xdc, 0x97, |
||||||
|
0x2f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xb2, 0x7d, 0x20, 0xa6, 0x35, 0x07, 0x00, 0x00, |
||||||
|
} |
@ -0,0 +1,147 @@ |
|||||||
|
// This file originates from the SatoshiLabs Trezor `common` repository at: |
||||||
|
// https://github.com/trezor/trezor-common/blob/master/protob/messages-common.proto |
||||||
|
// dated 28.05.2019, commit 893fd219d4a01bcffa0cd9cfa631856371ec5aa9. |
||||||
|
|
||||||
|
syntax = "proto2"; |
||||||
|
package hw.trezor.messages.common; |
||||||
|
|
||||||
|
/** |
||||||
|
* Response: Success of the previous request |
||||||
|
* @end |
||||||
|
*/ |
||||||
|
message Success { |
||||||
|
optional string message = 1; // human readable description of action or request-specific payload |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Response: Failure of the previous request |
||||||
|
* @end |
||||||
|
*/ |
||||||
|
message Failure { |
||||||
|
optional FailureType code = 1; // computer-readable definition of the error state |
||||||
|
optional string message = 2; // human-readable message of the error state |
||||||
|
enum FailureType { |
||||||
|
Failure_UnexpectedMessage = 1; |
||||||
|
Failure_ButtonExpected = 2; |
||||||
|
Failure_DataError = 3; |
||||||
|
Failure_ActionCancelled = 4; |
||||||
|
Failure_PinExpected = 5; |
||||||
|
Failure_PinCancelled = 6; |
||||||
|
Failure_PinInvalid = 7; |
||||||
|
Failure_InvalidSignature = 8; |
||||||
|
Failure_ProcessError = 9; |
||||||
|
Failure_NotEnoughFunds = 10; |
||||||
|
Failure_NotInitialized = 11; |
||||||
|
Failure_PinMismatch = 12; |
||||||
|
Failure_FirmwareError = 99; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Response: Device is waiting for HW button press. |
||||||
|
* @auxstart |
||||||
|
* @next ButtonAck |
||||||
|
*/ |
||||||
|
message ButtonRequest { |
||||||
|
optional ButtonRequestType code = 1; |
||||||
|
optional string data = 2; |
||||||
|
/** |
||||||
|
* Type of button request |
||||||
|
*/ |
||||||
|
enum ButtonRequestType { |
||||||
|
ButtonRequest_Other = 1; |
||||||
|
ButtonRequest_FeeOverThreshold = 2; |
||||||
|
ButtonRequest_ConfirmOutput = 3; |
||||||
|
ButtonRequest_ResetDevice = 4; |
||||||
|
ButtonRequest_ConfirmWord = 5; |
||||||
|
ButtonRequest_WipeDevice = 6; |
||||||
|
ButtonRequest_ProtectCall = 7; |
||||||
|
ButtonRequest_SignTx = 8; |
||||||
|
ButtonRequest_FirmwareCheck = 9; |
||||||
|
ButtonRequest_Address = 10; |
||||||
|
ButtonRequest_PublicKey = 11; |
||||||
|
ButtonRequest_MnemonicWordCount = 12; |
||||||
|
ButtonRequest_MnemonicInput = 13; |
||||||
|
ButtonRequest_PassphraseType = 14; |
||||||
|
ButtonRequest_UnknownDerivationPath = 15; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Computer agrees to wait for HW button press |
||||||
|
* @auxend |
||||||
|
*/ |
||||||
|
message ButtonAck { |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Response: Device is asking computer to show PIN matrix and awaits PIN encoded using this matrix scheme |
||||||
|
* @auxstart |
||||||
|
* @next PinMatrixAck |
||||||
|
*/ |
||||||
|
message PinMatrixRequest { |
||||||
|
optional PinMatrixRequestType type = 1; |
||||||
|
/** |
||||||
|
* Type of PIN request |
||||||
|
*/ |
||||||
|
enum PinMatrixRequestType { |
||||||
|
PinMatrixRequestType_Current = 1; |
||||||
|
PinMatrixRequestType_NewFirst = 2; |
||||||
|
PinMatrixRequestType_NewSecond = 3; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Computer responds with encoded PIN |
||||||
|
* @auxend |
||||||
|
*/ |
||||||
|
message PinMatrixAck { |
||||||
|
required string pin = 1; // matrix encoded PIN entered by user |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Response: Device awaits encryption passphrase |
||||||
|
* @auxstart |
||||||
|
* @next PassphraseAck |
||||||
|
*/ |
||||||
|
message PassphraseRequest { |
||||||
|
optional bool on_device = 1; // passphrase is being entered on the device |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Send passphrase back |
||||||
|
* @next PassphraseStateRequest |
||||||
|
*/ |
||||||
|
message PassphraseAck { |
||||||
|
optional string passphrase = 1; |
||||||
|
optional bytes state = 2; // expected device state |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Response: Device awaits passphrase state |
||||||
|
* @next PassphraseStateAck |
||||||
|
*/ |
||||||
|
message PassphraseStateRequest { |
||||||
|
optional bytes state = 1; // actual device state |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Send passphrase state back |
||||||
|
* @auxend |
||||||
|
*/ |
||||||
|
message PassphraseStateAck { |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Structure representing BIP32 (hierarchical deterministic) node |
||||||
|
* Used for imports of private key into the device and exporting public key out of device |
||||||
|
* @embed |
||||||
|
*/ |
||||||
|
message HDNodeType { |
||||||
|
required uint32 depth = 1; |
||||||
|
required uint32 fingerprint = 2; |
||||||
|
required uint32 child_num = 3; |
||||||
|
required bytes chain_code = 4; |
||||||
|
optional bytes private_key = 5; |
||||||
|
optional bytes public_key = 6; |
||||||
|
} |
@ -0,0 +1,698 @@ |
|||||||
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
|
// source: messages-ethereum.proto
|
||||||
|
|
||||||
|
package trezor |
||||||
|
|
||||||
|
import ( |
||||||
|
fmt "fmt" |
||||||
|
math "math" |
||||||
|
|
||||||
|
proto "github.com/golang/protobuf/proto" |
||||||
|
) |
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal |
||||||
|
var _ = fmt.Errorf |
||||||
|
var _ = math.Inf |
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the proto package it is being compiled against.
|
||||||
|
// A compilation error at this line likely means your copy of the
|
||||||
|
// proto package needs to be updated.
|
||||||
|
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
||||||
|
|
||||||
|
//*
|
||||||
|
// Request: Ask device for public key corresponding to address_n path
|
||||||
|
// @start
|
||||||
|
// @next EthereumPublicKey
|
||||||
|
// @next Failure
|
||||||
|
type EthereumGetPublicKey struct { |
||||||
|
AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` |
||||||
|
ShowDisplay *bool `protobuf:"varint,2,opt,name=show_display,json=showDisplay" json:"show_display,omitempty"` |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumGetPublicKey) Reset() { *m = EthereumGetPublicKey{} } |
||||||
|
func (m *EthereumGetPublicKey) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*EthereumGetPublicKey) ProtoMessage() {} |
||||||
|
func (*EthereumGetPublicKey) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_cb33f46ba915f15c, []int{0} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumGetPublicKey) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_EthereumGetPublicKey.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *EthereumGetPublicKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_EthereumGetPublicKey.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *EthereumGetPublicKey) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_EthereumGetPublicKey.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *EthereumGetPublicKey) XXX_Size() int { |
||||||
|
return xxx_messageInfo_EthereumGetPublicKey.Size(m) |
||||||
|
} |
||||||
|
func (m *EthereumGetPublicKey) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_EthereumGetPublicKey.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_EthereumGetPublicKey proto.InternalMessageInfo |
||||||
|
|
||||||
|
func (m *EthereumGetPublicKey) GetAddressN() []uint32 { |
||||||
|
if m != nil { |
||||||
|
return m.AddressN |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumGetPublicKey) GetShowDisplay() bool { |
||||||
|
if m != nil && m.ShowDisplay != nil { |
||||||
|
return *m.ShowDisplay |
||||||
|
} |
||||||
|
return false |
||||||
|
} |
||||||
|
|
||||||
|
//*
|
||||||
|
// Response: Contains public key derived from device private seed
|
||||||
|
// @end
|
||||||
|
type EthereumPublicKey struct { |
||||||
|
Node *HDNodeType `protobuf:"bytes,1,opt,name=node" json:"node,omitempty"` |
||||||
|
Xpub *string `protobuf:"bytes,2,opt,name=xpub" json:"xpub,omitempty"` |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumPublicKey) Reset() { *m = EthereumPublicKey{} } |
||||||
|
func (m *EthereumPublicKey) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*EthereumPublicKey) ProtoMessage() {} |
||||||
|
func (*EthereumPublicKey) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_cb33f46ba915f15c, []int{1} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumPublicKey) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_EthereumPublicKey.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *EthereumPublicKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_EthereumPublicKey.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *EthereumPublicKey) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_EthereumPublicKey.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *EthereumPublicKey) XXX_Size() int { |
||||||
|
return xxx_messageInfo_EthereumPublicKey.Size(m) |
||||||
|
} |
||||||
|
func (m *EthereumPublicKey) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_EthereumPublicKey.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_EthereumPublicKey proto.InternalMessageInfo |
||||||
|
|
||||||
|
func (m *EthereumPublicKey) GetNode() *HDNodeType { |
||||||
|
if m != nil { |
||||||
|
return m.Node |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumPublicKey) GetXpub() string { |
||||||
|
if m != nil && m.Xpub != nil { |
||||||
|
return *m.Xpub |
||||||
|
} |
||||||
|
return "" |
||||||
|
} |
||||||
|
|
||||||
|
//*
|
||||||
|
// Request: Ask device for Ethereum address corresponding to address_n path
|
||||||
|
// @start
|
||||||
|
// @next EthereumAddress
|
||||||
|
// @next Failure
|
||||||
|
type EthereumGetAddress struct { |
||||||
|
AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` |
||||||
|
ShowDisplay *bool `protobuf:"varint,2,opt,name=show_display,json=showDisplay" json:"show_display,omitempty"` |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumGetAddress) Reset() { *m = EthereumGetAddress{} } |
||||||
|
func (m *EthereumGetAddress) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*EthereumGetAddress) ProtoMessage() {} |
||||||
|
func (*EthereumGetAddress) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_cb33f46ba915f15c, []int{2} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumGetAddress) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_EthereumGetAddress.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *EthereumGetAddress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_EthereumGetAddress.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *EthereumGetAddress) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_EthereumGetAddress.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *EthereumGetAddress) XXX_Size() int { |
||||||
|
return xxx_messageInfo_EthereumGetAddress.Size(m) |
||||||
|
} |
||||||
|
func (m *EthereumGetAddress) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_EthereumGetAddress.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_EthereumGetAddress proto.InternalMessageInfo |
||||||
|
|
||||||
|
func (m *EthereumGetAddress) GetAddressN() []uint32 { |
||||||
|
if m != nil { |
||||||
|
return m.AddressN |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumGetAddress) GetShowDisplay() bool { |
||||||
|
if m != nil && m.ShowDisplay != nil { |
||||||
|
return *m.ShowDisplay |
||||||
|
} |
||||||
|
return false |
||||||
|
} |
||||||
|
|
||||||
|
//*
|
||||||
|
// Response: Contains an Ethereum address derived from device private seed
|
||||||
|
// @end
|
||||||
|
type EthereumAddress struct { |
||||||
|
AddressBin []byte `protobuf:"bytes,1,opt,name=addressBin" json:"addressBin,omitempty"` |
||||||
|
AddressHex *string `protobuf:"bytes,2,opt,name=addressHex" json:"addressHex,omitempty"` |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumAddress) Reset() { *m = EthereumAddress{} } |
||||||
|
func (m *EthereumAddress) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*EthereumAddress) ProtoMessage() {} |
||||||
|
func (*EthereumAddress) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_cb33f46ba915f15c, []int{3} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumAddress) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_EthereumAddress.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *EthereumAddress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_EthereumAddress.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *EthereumAddress) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_EthereumAddress.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *EthereumAddress) XXX_Size() int { |
||||||
|
return xxx_messageInfo_EthereumAddress.Size(m) |
||||||
|
} |
||||||
|
func (m *EthereumAddress) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_EthereumAddress.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_EthereumAddress proto.InternalMessageInfo |
||||||
|
|
||||||
|
func (m *EthereumAddress) GetAddressBin() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.AddressBin |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumAddress) GetAddressHex() string { |
||||||
|
if m != nil && m.AddressHex != nil { |
||||||
|
return *m.AddressHex |
||||||
|
} |
||||||
|
return "" |
||||||
|
} |
||||||
|
|
||||||
|
//*
|
||||||
|
// Request: Ask device to sign transaction
|
||||||
|
// All fields are optional from the protocol's point of view. Each field defaults to value `0` if missing.
|
||||||
|
// Note: the first at most 1024 bytes of data MUST be transmitted as part of this message.
|
||||||
|
// @start
|
||||||
|
// @next EthereumTxRequest
|
||||||
|
// @next Failure
|
||||||
|
type EthereumSignTx struct { |
||||||
|
AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` |
||||||
|
Nonce []byte `protobuf:"bytes,2,opt,name=nonce" json:"nonce,omitempty"` |
||||||
|
GasPrice []byte `protobuf:"bytes,3,opt,name=gas_price,json=gasPrice" json:"gas_price,omitempty"` |
||||||
|
GasLimit []byte `protobuf:"bytes,4,opt,name=gas_limit,json=gasLimit" json:"gas_limit,omitempty"` |
||||||
|
ToBin []byte `protobuf:"bytes,5,opt,name=toBin" json:"toBin,omitempty"` |
||||||
|
ToHex *string `protobuf:"bytes,11,opt,name=toHex" json:"toHex,omitempty"` |
||||||
|
Value []byte `protobuf:"bytes,6,opt,name=value" json:"value,omitempty"` |
||||||
|
DataInitialChunk []byte `protobuf:"bytes,7,opt,name=data_initial_chunk,json=dataInitialChunk" json:"data_initial_chunk,omitempty"` |
||||||
|
DataLength *uint32 `protobuf:"varint,8,opt,name=data_length,json=dataLength" json:"data_length,omitempty"` |
||||||
|
ChainId *uint32 `protobuf:"varint,9,opt,name=chain_id,json=chainId" json:"chain_id,omitempty"` |
||||||
|
TxType *uint32 `protobuf:"varint,10,opt,name=tx_type,json=txType" json:"tx_type,omitempty"` |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumSignTx) Reset() { *m = EthereumSignTx{} } |
||||||
|
func (m *EthereumSignTx) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*EthereumSignTx) ProtoMessage() {} |
||||||
|
func (*EthereumSignTx) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_cb33f46ba915f15c, []int{4} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumSignTx) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_EthereumSignTx.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *EthereumSignTx) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_EthereumSignTx.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *EthereumSignTx) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_EthereumSignTx.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *EthereumSignTx) XXX_Size() int { |
||||||
|
return xxx_messageInfo_EthereumSignTx.Size(m) |
||||||
|
} |
||||||
|
func (m *EthereumSignTx) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_EthereumSignTx.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_EthereumSignTx proto.InternalMessageInfo |
||||||
|
|
||||||
|
func (m *EthereumSignTx) GetAddressN() []uint32 { |
||||||
|
if m != nil { |
||||||
|
return m.AddressN |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumSignTx) GetNonce() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.Nonce |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumSignTx) GetGasPrice() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.GasPrice |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumSignTx) GetGasLimit() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.GasLimit |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumSignTx) GetToBin() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.ToBin |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumSignTx) GetToHex() string { |
||||||
|
if m != nil && m.ToHex != nil { |
||||||
|
return *m.ToHex |
||||||
|
} |
||||||
|
return "" |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumSignTx) GetValue() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.Value |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumSignTx) GetDataInitialChunk() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.DataInitialChunk |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumSignTx) GetDataLength() uint32 { |
||||||
|
if m != nil && m.DataLength != nil { |
||||||
|
return *m.DataLength |
||||||
|
} |
||||||
|
return 0 |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumSignTx) GetChainId() uint32 { |
||||||
|
if m != nil && m.ChainId != nil { |
||||||
|
return *m.ChainId |
||||||
|
} |
||||||
|
return 0 |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumSignTx) GetTxType() uint32 { |
||||||
|
if m != nil && m.TxType != nil { |
||||||
|
return *m.TxType |
||||||
|
} |
||||||
|
return 0 |
||||||
|
} |
||||||
|
|
||||||
|
//*
|
||||||
|
// Response: Device asks for more data from transaction payload, or returns the signature.
|
||||||
|
// If data_length is set, device awaits that many more bytes of payload.
|
||||||
|
// Otherwise, the signature_* fields contain the computed transaction signature. All three fields will be present.
|
||||||
|
// @end
|
||||||
|
// @next EthereumTxAck
|
||||||
|
type EthereumTxRequest struct { |
||||||
|
DataLength *uint32 `protobuf:"varint,1,opt,name=data_length,json=dataLength" json:"data_length,omitempty"` |
||||||
|
SignatureV *uint32 `protobuf:"varint,2,opt,name=signature_v,json=signatureV" json:"signature_v,omitempty"` |
||||||
|
SignatureR []byte `protobuf:"bytes,3,opt,name=signature_r,json=signatureR" json:"signature_r,omitempty"` |
||||||
|
SignatureS []byte `protobuf:"bytes,4,opt,name=signature_s,json=signatureS" json:"signature_s,omitempty"` |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumTxRequest) Reset() { *m = EthereumTxRequest{} } |
||||||
|
func (m *EthereumTxRequest) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*EthereumTxRequest) ProtoMessage() {} |
||||||
|
func (*EthereumTxRequest) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_cb33f46ba915f15c, []int{5} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumTxRequest) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_EthereumTxRequest.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *EthereumTxRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_EthereumTxRequest.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *EthereumTxRequest) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_EthereumTxRequest.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *EthereumTxRequest) XXX_Size() int { |
||||||
|
return xxx_messageInfo_EthereumTxRequest.Size(m) |
||||||
|
} |
||||||
|
func (m *EthereumTxRequest) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_EthereumTxRequest.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_EthereumTxRequest proto.InternalMessageInfo |
||||||
|
|
||||||
|
func (m *EthereumTxRequest) GetDataLength() uint32 { |
||||||
|
if m != nil && m.DataLength != nil { |
||||||
|
return *m.DataLength |
||||||
|
} |
||||||
|
return 0 |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumTxRequest) GetSignatureV() uint32 { |
||||||
|
if m != nil && m.SignatureV != nil { |
||||||
|
return *m.SignatureV |
||||||
|
} |
||||||
|
return 0 |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumTxRequest) GetSignatureR() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.SignatureR |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumTxRequest) GetSignatureS() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.SignatureS |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
//*
|
||||||
|
// Request: Transaction payload data.
|
||||||
|
// @next EthereumTxRequest
|
||||||
|
type EthereumTxAck struct { |
||||||
|
DataChunk []byte `protobuf:"bytes,1,opt,name=data_chunk,json=dataChunk" json:"data_chunk,omitempty"` |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumTxAck) Reset() { *m = EthereumTxAck{} } |
||||||
|
func (m *EthereumTxAck) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*EthereumTxAck) ProtoMessage() {} |
||||||
|
func (*EthereumTxAck) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_cb33f46ba915f15c, []int{6} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumTxAck) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_EthereumTxAck.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *EthereumTxAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_EthereumTxAck.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *EthereumTxAck) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_EthereumTxAck.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *EthereumTxAck) XXX_Size() int { |
||||||
|
return xxx_messageInfo_EthereumTxAck.Size(m) |
||||||
|
} |
||||||
|
func (m *EthereumTxAck) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_EthereumTxAck.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_EthereumTxAck proto.InternalMessageInfo |
||||||
|
|
||||||
|
func (m *EthereumTxAck) GetDataChunk() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.DataChunk |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
//*
|
||||||
|
// Request: Ask device to sign message
|
||||||
|
// @start
|
||||||
|
// @next EthereumMessageSignature
|
||||||
|
// @next Failure
|
||||||
|
type EthereumSignMessage struct { |
||||||
|
AddressN []uint32 `protobuf:"varint,1,rep,name=address_n,json=addressN" json:"address_n,omitempty"` |
||||||
|
Message []byte `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumSignMessage) Reset() { *m = EthereumSignMessage{} } |
||||||
|
func (m *EthereumSignMessage) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*EthereumSignMessage) ProtoMessage() {} |
||||||
|
func (*EthereumSignMessage) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_cb33f46ba915f15c, []int{7} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumSignMessage) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_EthereumSignMessage.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *EthereumSignMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_EthereumSignMessage.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *EthereumSignMessage) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_EthereumSignMessage.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *EthereumSignMessage) XXX_Size() int { |
||||||
|
return xxx_messageInfo_EthereumSignMessage.Size(m) |
||||||
|
} |
||||||
|
func (m *EthereumSignMessage) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_EthereumSignMessage.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_EthereumSignMessage proto.InternalMessageInfo |
||||||
|
|
||||||
|
func (m *EthereumSignMessage) GetAddressN() []uint32 { |
||||||
|
if m != nil { |
||||||
|
return m.AddressN |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumSignMessage) GetMessage() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.Message |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
//*
|
||||||
|
// Response: Signed message
|
||||||
|
// @end
|
||||||
|
type EthereumMessageSignature struct { |
||||||
|
AddressBin []byte `protobuf:"bytes,1,opt,name=addressBin" json:"addressBin,omitempty"` |
||||||
|
Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"` |
||||||
|
AddressHex *string `protobuf:"bytes,3,opt,name=addressHex" json:"addressHex,omitempty"` |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumMessageSignature) Reset() { *m = EthereumMessageSignature{} } |
||||||
|
func (m *EthereumMessageSignature) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*EthereumMessageSignature) ProtoMessage() {} |
||||||
|
func (*EthereumMessageSignature) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_cb33f46ba915f15c, []int{8} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumMessageSignature) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_EthereumMessageSignature.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *EthereumMessageSignature) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_EthereumMessageSignature.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *EthereumMessageSignature) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_EthereumMessageSignature.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *EthereumMessageSignature) XXX_Size() int { |
||||||
|
return xxx_messageInfo_EthereumMessageSignature.Size(m) |
||||||
|
} |
||||||
|
func (m *EthereumMessageSignature) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_EthereumMessageSignature.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_EthereumMessageSignature proto.InternalMessageInfo |
||||||
|
|
||||||
|
func (m *EthereumMessageSignature) GetAddressBin() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.AddressBin |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumMessageSignature) GetSignature() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.Signature |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumMessageSignature) GetAddressHex() string { |
||||||
|
if m != nil && m.AddressHex != nil { |
||||||
|
return *m.AddressHex |
||||||
|
} |
||||||
|
return "" |
||||||
|
} |
||||||
|
|
||||||
|
//*
|
||||||
|
// Request: Ask device to verify message
|
||||||
|
// @start
|
||||||
|
// @next Success
|
||||||
|
// @next Failure
|
||||||
|
type EthereumVerifyMessage struct { |
||||||
|
AddressBin []byte `protobuf:"bytes,1,opt,name=addressBin" json:"addressBin,omitempty"` |
||||||
|
Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"` |
||||||
|
Message []byte `protobuf:"bytes,3,opt,name=message" json:"message,omitempty"` |
||||||
|
AddressHex *string `protobuf:"bytes,4,opt,name=addressHex" json:"addressHex,omitempty"` |
||||||
|
XXX_NoUnkeyedLiteral struct{} `json:"-"` |
||||||
|
XXX_unrecognized []byte `json:"-"` |
||||||
|
XXX_sizecache int32 `json:"-"` |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumVerifyMessage) Reset() { *m = EthereumVerifyMessage{} } |
||||||
|
func (m *EthereumVerifyMessage) String() string { return proto.CompactTextString(m) } |
||||||
|
func (*EthereumVerifyMessage) ProtoMessage() {} |
||||||
|
func (*EthereumVerifyMessage) Descriptor() ([]byte, []int) { |
||||||
|
return fileDescriptor_cb33f46ba915f15c, []int{9} |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumVerifyMessage) XXX_Unmarshal(b []byte) error { |
||||||
|
return xxx_messageInfo_EthereumVerifyMessage.Unmarshal(m, b) |
||||||
|
} |
||||||
|
func (m *EthereumVerifyMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { |
||||||
|
return xxx_messageInfo_EthereumVerifyMessage.Marshal(b, m, deterministic) |
||||||
|
} |
||||||
|
func (m *EthereumVerifyMessage) XXX_Merge(src proto.Message) { |
||||||
|
xxx_messageInfo_EthereumVerifyMessage.Merge(m, src) |
||||||
|
} |
||||||
|
func (m *EthereumVerifyMessage) XXX_Size() int { |
||||||
|
return xxx_messageInfo_EthereumVerifyMessage.Size(m) |
||||||
|
} |
||||||
|
func (m *EthereumVerifyMessage) XXX_DiscardUnknown() { |
||||||
|
xxx_messageInfo_EthereumVerifyMessage.DiscardUnknown(m) |
||||||
|
} |
||||||
|
|
||||||
|
var xxx_messageInfo_EthereumVerifyMessage proto.InternalMessageInfo |
||||||
|
|
||||||
|
func (m *EthereumVerifyMessage) GetAddressBin() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.AddressBin |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumVerifyMessage) GetSignature() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.Signature |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumVerifyMessage) GetMessage() []byte { |
||||||
|
if m != nil { |
||||||
|
return m.Message |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (m *EthereumVerifyMessage) GetAddressHex() string { |
||||||
|
if m != nil && m.AddressHex != nil { |
||||||
|
return *m.AddressHex |
||||||
|
} |
||||||
|
return "" |
||||||
|
} |
||||||
|
|
||||||
|
func init() { |
||||||
|
proto.RegisterType((*EthereumGetPublicKey)(nil), "hw.trezor.messages.ethereum.EthereumGetPublicKey") |
||||||
|
proto.RegisterType((*EthereumPublicKey)(nil), "hw.trezor.messages.ethereum.EthereumPublicKey") |
||||||
|
proto.RegisterType((*EthereumGetAddress)(nil), "hw.trezor.messages.ethereum.EthereumGetAddress") |
||||||
|
proto.RegisterType((*EthereumAddress)(nil), "hw.trezor.messages.ethereum.EthereumAddress") |
||||||
|
proto.RegisterType((*EthereumSignTx)(nil), "hw.trezor.messages.ethereum.EthereumSignTx") |
||||||
|
proto.RegisterType((*EthereumTxRequest)(nil), "hw.trezor.messages.ethereum.EthereumTxRequest") |
||||||
|
proto.RegisterType((*EthereumTxAck)(nil), "hw.trezor.messages.ethereum.EthereumTxAck") |
||||||
|
proto.RegisterType((*EthereumSignMessage)(nil), "hw.trezor.messages.ethereum.EthereumSignMessage") |
||||||
|
proto.RegisterType((*EthereumMessageSignature)(nil), "hw.trezor.messages.ethereum.EthereumMessageSignature") |
||||||
|
proto.RegisterType((*EthereumVerifyMessage)(nil), "hw.trezor.messages.ethereum.EthereumVerifyMessage") |
||||||
|
} |
||||||
|
|
||||||
|
func init() { proto.RegisterFile("messages-ethereum.proto", fileDescriptor_cb33f46ba915f15c) } |
||||||
|
|
||||||
|
var fileDescriptor_cb33f46ba915f15c = []byte{ |
||||||
|
// 593 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x54, 0x4d, 0x6f, 0xd3, 0x40, |
||||||
|
0x10, 0x95, 0x9b, 0xb4, 0x49, 0x26, 0x0d, 0x1f, 0xa6, 0x55, 0x17, 0x0a, 0x34, 0x18, 0x21, 0xe5, |
||||||
|
0x00, 0x3e, 0x70, 0x43, 0xe2, 0xd2, 0x52, 0x44, 0x2b, 0x4a, 0x55, 0xdc, 0xa8, 0x57, 0x6b, 0x63, |
||||||
|
0x6f, 0xe3, 0x55, 0x9d, 0xdd, 0xe0, 0x5d, 0xb7, 0x0e, 0x7f, 0x82, 0x23, 0xff, 0x87, 0x5f, 0x86, |
||||||
|
0xf6, 0x2b, 0x71, 0x52, 0x54, 0x0e, 0xbd, 0x65, 0xde, 0xbc, 0x7d, 0xf3, 0x66, 0xf4, 0x62, 0xd8, |
||||||
|
0x99, 0x10, 0x21, 0xf0, 0x98, 0x88, 0x77, 0x44, 0x66, 0xa4, 0x20, 0xe5, 0x24, 0x9c, 0x16, 0x5c, |
||||||
|
0x72, 0x7f, 0x37, 0xbb, 0x09, 0x65, 0x41, 0x7e, 0xf2, 0x22, 0x74, 0x94, 0xd0, 0x51, 0x9e, 0x6d, |
||||||
|
0xcf, 0x5f, 0x25, 0x7c, 0x32, 0xe1, 0xcc, 0xbc, 0x09, 0x2e, 0x60, 0xeb, 0xb3, 0xa5, 0x7c, 0x21, |
||||||
|
0xf2, 0xac, 0x1c, 0xe5, 0x34, 0xf9, 0x4a, 0x66, 0xfe, 0x2e, 0x74, 0x70, 0x9a, 0x16, 0x44, 0x88, |
||||||
|
0x98, 0x21, 0xaf, 0xdf, 0x18, 0xf4, 0xa2, 0xb6, 0x05, 0x4e, 0xfd, 0x57, 0xb0, 0x29, 0x32, 0x7e, |
||||||
|
0x13, 0xa7, 0x54, 0x4c, 0x73, 0x3c, 0x43, 0x6b, 0x7d, 0x6f, 0xd0, 0x8e, 0xba, 0x0a, 0x3b, 0x34, |
||||||
|
0x50, 0x30, 0x82, 0xc7, 0x4e, 0x77, 0x21, 0xfa, 0x01, 0x9a, 0x8c, 0xa7, 0x04, 0x79, 0x7d, 0x6f, |
||||||
|
0xd0, 0x7d, 0xff, 0x26, 0xfc, 0x87, 0x5f, 0x6b, 0xee, 0xe8, 0xf0, 0x94, 0xa7, 0x64, 0x38, 0x9b, |
||||||
|
0x92, 0x48, 0x3f, 0xf1, 0x7d, 0x68, 0x56, 0xd3, 0x72, 0xa4, 0x47, 0x75, 0x22, 0xfd, 0x3b, 0x18, |
||||||
|
0x82, 0x5f, 0xf3, 0xbe, 0x6f, 0xdc, 0xdd, 0xdb, 0xf9, 0x77, 0x78, 0xe8, 0x54, 0x9d, 0xe4, 0x4b, |
||||||
|
0x00, 0xab, 0x70, 0x40, 0x99, 0x76, 0xbf, 0x19, 0xd5, 0x90, 0x5a, 0xff, 0x88, 0x54, 0xd6, 0x62, |
||||||
|
0x0d, 0x09, 0xfe, 0xac, 0xc1, 0x03, 0xa7, 0x79, 0x4e, 0xc7, 0x6c, 0x58, 0xdd, 0xed, 0x72, 0x0b, |
||||||
|
0xd6, 0x19, 0x67, 0x09, 0xd1, 0x52, 0x9b, 0x91, 0x29, 0xd4, 0x93, 0x31, 0x16, 0xf1, 0xb4, 0xa0, |
||||||
|
0x09, 0x41, 0x0d, 0xdd, 0x69, 0x8f, 0xb1, 0x38, 0x53, 0xb5, 0x6b, 0xe6, 0x74, 0x42, 0x25, 0x6a, |
||||||
|
0xce, 0x9b, 0x27, 0xaa, 0x56, 0x7a, 0x92, 0x2b, 0xeb, 0xeb, 0x46, 0x4f, 0x17, 0x06, 0x55, 0x86, |
||||||
|
0xbb, 0xda, 0xb0, 0x29, 0x14, 0x7a, 0x8d, 0xf3, 0x92, 0xa0, 0x0d, 0xc3, 0xd5, 0x85, 0xff, 0x16, |
||||||
|
0xfc, 0x14, 0x4b, 0x1c, 0x53, 0x46, 0x25, 0xc5, 0x79, 0x9c, 0x64, 0x25, 0xbb, 0x42, 0x2d, 0x4d, |
||||||
|
0x79, 0xa4, 0x3a, 0xc7, 0xa6, 0xf1, 0x49, 0xe1, 0xfe, 0x1e, 0x74, 0x35, 0x3b, 0x27, 0x6c, 0x2c, |
||||||
|
0x33, 0xd4, 0xee, 0x7b, 0x83, 0x5e, 0x04, 0x0a, 0x3a, 0xd1, 0x88, 0xff, 0x14, 0xda, 0x49, 0x86, |
||||||
|
0x29, 0x8b, 0x69, 0x8a, 0x3a, 0xba, 0xdb, 0xd2, 0xf5, 0x71, 0xea, 0xef, 0x40, 0x4b, 0x56, 0xb1, |
||||||
|
0x9c, 0x4d, 0x09, 0x02, 0xdd, 0xd9, 0x90, 0x95, 0xca, 0x41, 0xf0, 0xdb, 0x5b, 0x44, 0x6a, 0x58, |
||||||
|
0x45, 0xe4, 0x47, 0x49, 0x84, 0x5c, 0x1d, 0xe5, 0xdd, 0x1a, 0xb5, 0x07, 0x5d, 0x41, 0xc7, 0x0c, |
||||||
|
0xcb, 0xb2, 0x20, 0xf1, 0xb5, 0xbe, 0x68, 0x2f, 0x82, 0x39, 0x74, 0xb1, 0x4c, 0x28, 0xec, 0x61, |
||||||
|
0x17, 0x84, 0x68, 0x99, 0x20, 0xec, 0x71, 0x17, 0x84, 0xf3, 0x20, 0x84, 0xde, 0xc2, 0xd8, 0x7e, |
||||||
|
0x72, 0xe5, 0xbf, 0x00, 0xed, 0xc0, 0x5e, 0xc9, 0xe4, 0xa5, 0xa3, 0x10, 0x7d, 0x9e, 0xe0, 0x04, |
||||||
|
0x9e, 0xd4, 0xd3, 0xf0, 0xcd, 0x64, 0xff, 0xee, 0x48, 0x20, 0x68, 0xd9, 0xff, 0x88, 0x0d, 0x85, |
||||||
|
0x2b, 0x83, 0x0a, 0x90, 0x53, 0xb3, 0x4a, 0xe7, 0xce, 0xda, 0x7f, 0x83, 0xfb, 0x1c, 0x3a, 0xf3, |
||||||
|
0x3d, 0xac, 0xee, 0x02, 0x58, 0x89, 0x75, 0xe3, 0x56, 0xac, 0x7f, 0x79, 0xb0, 0xed, 0x46, 0x5f, |
||||||
|
0x90, 0x82, 0x5e, 0xce, 0xdc, 0x2a, 0xf7, 0x9b, 0x5b, 0xdb, 0xb5, 0xb1, 0xb4, 0xeb, 0x8a, 0xa3, |
||||||
|
0xe6, 0xaa, 0xa3, 0x83, 0x8f, 0xf0, 0x3a, 0xe1, 0x93, 0x50, 0x60, 0xc9, 0x45, 0x46, 0x73, 0x3c, |
||||||
|
0x12, 0xee, 0x03, 0x93, 0xd3, 0x91, 0xf9, 0xe2, 0x8d, 0xca, 0xcb, 0x83, 0xed, 0xa1, 0x06, 0xad, |
||||||
|
0x5b, 0xb7, 0xc2, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8a, 0xce, 0x81, 0xc8, 0x59, 0x05, 0x00, |
||||||
|
0x00, |
||||||
|
} |
@ -0,0 +1,131 @@ |
|||||||
|
// This file originates from the SatoshiLabs Trezor `common` repository at: |
||||||
|
// https://github.com/trezor/trezor-common/blob/master/protob/messages-ethereum.proto |
||||||
|
// dated 28.05.2019, commit 893fd219d4a01bcffa0cd9cfa631856371ec5aa9. |
||||||
|
|
||||||
|
syntax = "proto2"; |
||||||
|
package hw.trezor.messages.ethereum; |
||||||
|
|
||||||
|
// Sugar for easier handling in Java |
||||||
|
option java_package = "com.satoshilabs.trezor.lib.protobuf"; |
||||||
|
option java_outer_classname = "TrezorMessageEthereum"; |
||||||
|
|
||||||
|
import "messages-common.proto"; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Ask device for public key corresponding to address_n path |
||||||
|
* @start |
||||||
|
* @next EthereumPublicKey |
||||||
|
* @next Failure |
||||||
|
*/ |
||||||
|
message EthereumGetPublicKey { |
||||||
|
repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node |
||||||
|
optional bool show_display = 2; // optionally show on display before sending the result |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Response: Contains public key derived from device private seed |
||||||
|
* @end |
||||||
|
*/ |
||||||
|
message EthereumPublicKey { |
||||||
|
optional hw.trezor.messages.common.HDNodeType node = 1; // BIP32 public node |
||||||
|
optional string xpub = 2; // serialized form of public node |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Ask device for Ethereum address corresponding to address_n path |
||||||
|
* @start |
||||||
|
* @next EthereumAddress |
||||||
|
* @next Failure |
||||||
|
*/ |
||||||
|
message EthereumGetAddress { |
||||||
|
repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node |
||||||
|
optional bool show_display = 2; // optionally show on display before sending the result |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Response: Contains an Ethereum address derived from device private seed |
||||||
|
* @end |
||||||
|
*/ |
||||||
|
message EthereumAddress { |
||||||
|
optional bytes addressBin = 1; // Ethereum address as 20 bytes (legacy firmwares) |
||||||
|
optional string addressHex = 2; // Ethereum address as hex string (newer firmwares) |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Ask device to sign transaction |
||||||
|
* All fields are optional from the protocol's point of view. Each field defaults to value `0` if missing. |
||||||
|
* Note: the first at most 1024 bytes of data MUST be transmitted as part of this message. |
||||||
|
* @start |
||||||
|
* @next EthereumTxRequest |
||||||
|
* @next Failure |
||||||
|
*/ |
||||||
|
message EthereumSignTx { |
||||||
|
repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node |
||||||
|
optional bytes nonce = 2; // <=256 bit unsigned big endian |
||||||
|
optional bytes gas_price = 3; // <=256 bit unsigned big endian (in wei) |
||||||
|
optional bytes gas_limit = 4; // <=256 bit unsigned big endian |
||||||
|
optional bytes toBin = 5; // recipient address (20 bytes, legacy firmware) |
||||||
|
optional string toHex = 11; // recipient address (hex string, newer firmware) |
||||||
|
optional bytes value = 6; // <=256 bit unsigned big endian (in wei) |
||||||
|
optional bytes data_initial_chunk = 7; // The initial data chunk (<= 1024 bytes) |
||||||
|
optional uint32 data_length = 8; // Length of transaction payload |
||||||
|
optional uint32 chain_id = 9; // Chain Id for EIP 155 |
||||||
|
optional uint32 tx_type = 10; // (only for Wanchain) |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Response: Device asks for more data from transaction payload, or returns the signature. |
||||||
|
* If data_length is set, device awaits that many more bytes of payload. |
||||||
|
* Otherwise, the signature_* fields contain the computed transaction signature. All three fields will be present. |
||||||
|
* @end |
||||||
|
* @next EthereumTxAck |
||||||
|
*/ |
||||||
|
message EthereumTxRequest { |
||||||
|
optional uint32 data_length = 1; // Number of bytes being requested (<= 1024) |
||||||
|
optional uint32 signature_v = 2; // Computed signature (recovery parameter, limited to 27 or 28) |
||||||
|
optional bytes signature_r = 3; // Computed signature R component (256 bit) |
||||||
|
optional bytes signature_s = 4; // Computed signature S component (256 bit) |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Transaction payload data. |
||||||
|
* @next EthereumTxRequest |
||||||
|
*/ |
||||||
|
message EthereumTxAck { |
||||||
|
optional bytes data_chunk = 1; // Bytes from transaction payload (<= 1024 bytes) |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Ask device to sign message |
||||||
|
* @start |
||||||
|
* @next EthereumMessageSignature |
||||||
|
* @next Failure |
||||||
|
*/ |
||||||
|
message EthereumSignMessage { |
||||||
|
repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node |
||||||
|
optional bytes message = 2; // message to be signed |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Response: Signed message |
||||||
|
* @end |
||||||
|
*/ |
||||||
|
message EthereumMessageSignature { |
||||||
|
optional bytes addressBin = 1; // address used to sign the message (20 bytes, legacy firmware) |
||||||
|
optional bytes signature = 2; // signature of the message |
||||||
|
optional string addressHex = 3; // address used to sign the message (hex string, newer firmware) |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Ask device to verify message |
||||||
|
* @start |
||||||
|
* @next Success |
||||||
|
* @next Failure |
||||||
|
*/ |
||||||
|
message EthereumVerifyMessage { |
||||||
|
optional bytes addressBin = 1; // address to verify (20 bytes, legacy firmware) |
||||||
|
optional bytes signature = 2; // signature to verify |
||||||
|
optional bytes message = 3; // message to verify |
||||||
|
optional string addressHex = 4; // address to verify (hex string, newer firmware) |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,289 @@ |
|||||||
|
// This file originates from the SatoshiLabs Trezor `common` repository at: |
||||||
|
// https://github.com/trezor/trezor-common/blob/master/protob/messages-management.proto |
||||||
|
// dated 28.05.2019, commit 893fd219d4a01bcffa0cd9cfa631856371ec5aa9. |
||||||
|
|
||||||
|
syntax = "proto2"; |
||||||
|
package hw.trezor.messages.management; |
||||||
|
|
||||||
|
// Sugar for easier handling in Java |
||||||
|
option java_package = "com.satoshilabs.trezor.lib.protobuf"; |
||||||
|
option java_outer_classname = "TrezorMessageManagement"; |
||||||
|
|
||||||
|
import "messages-common.proto"; |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Reset device to default state and ask for device details |
||||||
|
* @start |
||||||
|
* @next Features |
||||||
|
*/ |
||||||
|
message Initialize { |
||||||
|
optional bytes state = 1; // assumed device state, clear session if set and different |
||||||
|
optional bool skip_passphrase = 2; // this session should always assume empty passphrase |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Ask for device details (no device reset) |
||||||
|
* @start |
||||||
|
* @next Features |
||||||
|
*/ |
||||||
|
message GetFeatures { |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Response: Reports various information about the device |
||||||
|
* @end |
||||||
|
*/ |
||||||
|
message Features { |
||||||
|
optional string vendor = 1; // name of the manufacturer, e.g. "trezor.io" |
||||||
|
optional uint32 major_version = 2; // major version of the firmware/bootloader, e.g. 1 |
||||||
|
optional uint32 minor_version = 3; // minor version of the firmware/bootloader, e.g. 0 |
||||||
|
optional uint32 patch_version = 4; // patch version of the firmware/bootloader, e.g. 0 |
||||||
|
optional bool bootloader_mode = 5; // is device in bootloader mode? |
||||||
|
optional string device_id = 6; // device's unique identifier |
||||||
|
optional bool pin_protection = 7; // is device protected by PIN? |
||||||
|
optional bool passphrase_protection = 8; // is node/mnemonic encrypted using passphrase? |
||||||
|
optional string language = 9; // device language |
||||||
|
optional string label = 10; // device description label |
||||||
|
optional bool initialized = 12; // does device contain seed? |
||||||
|
optional bytes revision = 13; // SCM revision of firmware |
||||||
|
optional bytes bootloader_hash = 14; // hash of the bootloader |
||||||
|
optional bool imported = 15; // was storage imported from an external source? |
||||||
|
optional bool pin_cached = 16; // is PIN already cached in session? |
||||||
|
optional bool passphrase_cached = 17; // is passphrase already cached in session? |
||||||
|
optional bool firmware_present = 18; // is valid firmware loaded? |
||||||
|
optional bool needs_backup = 19; // does storage need backup? (equals to Storage.needs_backup) |
||||||
|
optional uint32 flags = 20; // device flags (equals to Storage.flags) |
||||||
|
optional string model = 21; // device hardware model |
||||||
|
optional uint32 fw_major = 22; // reported firmware version if in bootloader mode |
||||||
|
optional uint32 fw_minor = 23; // reported firmware version if in bootloader mode |
||||||
|
optional uint32 fw_patch = 24; // reported firmware version if in bootloader mode |
||||||
|
optional string fw_vendor = 25; // reported firmware vendor if in bootloader mode |
||||||
|
optional bytes fw_vendor_keys = 26; // reported firmware vendor keys (their hash) |
||||||
|
optional bool unfinished_backup = 27; // report unfinished backup (equals to Storage.unfinished_backup) |
||||||
|
optional bool no_backup = 28; // report no backup (equals to Storage.no_backup) |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: clear session (removes cached PIN, passphrase, etc). |
||||||
|
* @start |
||||||
|
* @next Success |
||||||
|
*/ |
||||||
|
message ClearSession { |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: change language and/or label of the device |
||||||
|
* @start |
||||||
|
* @next Success |
||||||
|
* @next Failure |
||||||
|
*/ |
||||||
|
message ApplySettings { |
||||||
|
optional string language = 1; |
||||||
|
optional string label = 2; |
||||||
|
optional bool use_passphrase = 3; |
||||||
|
optional bytes homescreen = 4; |
||||||
|
optional PassphraseSourceType passphrase_source = 5; |
||||||
|
optional uint32 auto_lock_delay_ms = 6; |
||||||
|
optional uint32 display_rotation = 7; // in degrees from North |
||||||
|
/** |
||||||
|
* Structure representing passphrase source |
||||||
|
*/ |
||||||
|
enum PassphraseSourceType { |
||||||
|
ASK = 0; |
||||||
|
DEVICE = 1; |
||||||
|
HOST = 2; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: set flags of the device |
||||||
|
* @start |
||||||
|
* @next Success |
||||||
|
* @next Failure |
||||||
|
*/ |
||||||
|
message ApplyFlags { |
||||||
|
optional uint32 flags = 1; // bitmask, can only set bits, not unset |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Starts workflow for setting/changing/removing the PIN |
||||||
|
* @start |
||||||
|
* @next Success |
||||||
|
* @next Failure |
||||||
|
*/ |
||||||
|
message ChangePin { |
||||||
|
optional bool remove = 1; // is PIN removal requested? |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Test if the device is alive, device sends back the message in Success response |
||||||
|
* @start |
||||||
|
* @next Success |
||||||
|
*/ |
||||||
|
message Ping { |
||||||
|
optional string message = 1; // message to send back in Success message |
||||||
|
optional bool button_protection = 2; // ask for button press |
||||||
|
optional bool pin_protection = 3; // ask for PIN if set in device |
||||||
|
optional bool passphrase_protection = 4; // ask for passphrase if set in device |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Abort last operation that required user interaction |
||||||
|
* @start |
||||||
|
* @next Failure |
||||||
|
*/ |
||||||
|
message Cancel { |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Request a sample of random data generated by hardware RNG. May be used for testing. |
||||||
|
* @start |
||||||
|
* @next Entropy |
||||||
|
* @next Failure |
||||||
|
*/ |
||||||
|
message GetEntropy { |
||||||
|
required uint32 size = 1; // size of requested entropy |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Response: Reply with random data generated by internal RNG |
||||||
|
* @end |
||||||
|
*/ |
||||||
|
message Entropy { |
||||||
|
required bytes entropy = 1; // chunk of random generated bytes |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Request device to wipe all sensitive data and settings |
||||||
|
* @start |
||||||
|
* @next Success |
||||||
|
* @next Failure |
||||||
|
*/ |
||||||
|
message WipeDevice { |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Load seed and related internal settings from the computer |
||||||
|
* @start |
||||||
|
* @next Success |
||||||
|
* @next Failure |
||||||
|
*/ |
||||||
|
message LoadDevice { |
||||||
|
optional string mnemonic = 1; // seed encoded as BIP-39 mnemonic (12, 18 or 24 words) |
||||||
|
optional hw.trezor.messages.common.HDNodeType node = 2; // BIP-32 node |
||||||
|
optional string pin = 3; // set PIN protection |
||||||
|
optional bool passphrase_protection = 4; // enable master node encryption using passphrase |
||||||
|
optional string language = 5 [default='english']; // device language |
||||||
|
optional string label = 6; // device label |
||||||
|
optional bool skip_checksum = 7; // do not test mnemonic for valid BIP-39 checksum |
||||||
|
optional uint32 u2f_counter = 8; // U2F counter |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Ask device to do initialization involving user interaction |
||||||
|
* @start |
||||||
|
* @next EntropyRequest |
||||||
|
* @next Failure |
||||||
|
*/ |
||||||
|
message ResetDevice { |
||||||
|
optional bool display_random = 1; // display entropy generated by the device before asking for additional entropy |
||||||
|
optional uint32 strength = 2 [default=256]; // strength of seed in bits |
||||||
|
optional bool passphrase_protection = 3; // enable master node encryption using passphrase |
||||||
|
optional bool pin_protection = 4; // enable PIN protection |
||||||
|
optional string language = 5 [default='english']; // device language |
||||||
|
optional string label = 6; // device label |
||||||
|
optional uint32 u2f_counter = 7; // U2F counter |
||||||
|
optional bool skip_backup = 8; // postpone seed backup to BackupDevice workflow |
||||||
|
optional bool no_backup = 9; // indicate that no backup is going to be made |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Perform backup of the device seed if not backed up using ResetDevice |
||||||
|
* @start |
||||||
|
* @next Success |
||||||
|
*/ |
||||||
|
message BackupDevice { |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Response: Ask for additional entropy from host computer |
||||||
|
* @next EntropyAck |
||||||
|
*/ |
||||||
|
message EntropyRequest { |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Provide additional entropy for seed generation function |
||||||
|
* @next Success |
||||||
|
*/ |
||||||
|
message EntropyAck { |
||||||
|
optional bytes entropy = 1; // 256 bits (32 bytes) of random data |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Start recovery workflow asking user for specific words of mnemonic |
||||||
|
* Used to recovery device safely even on untrusted computer. |
||||||
|
* @start |
||||||
|
* @next WordRequest |
||||||
|
*/ |
||||||
|
message RecoveryDevice { |
||||||
|
optional uint32 word_count = 1; // number of words in BIP-39 mnemonic |
||||||
|
optional bool passphrase_protection = 2; // enable master node encryption using passphrase |
||||||
|
optional bool pin_protection = 3; // enable PIN protection |
||||||
|
optional string language = 4 [default='english']; // device language |
||||||
|
optional string label = 5; // device label |
||||||
|
optional bool enforce_wordlist = 6; // enforce BIP-39 wordlist during the process |
||||||
|
// 7 reserved for unused recovery method |
||||||
|
optional RecoveryDeviceType type = 8; // supported recovery type |
||||||
|
optional uint32 u2f_counter = 9; // U2F counter |
||||||
|
optional bool dry_run = 10; // perform dry-run recovery workflow (for safe mnemonic validation) |
||||||
|
/** |
||||||
|
* Type of recovery procedure. These should be used as bitmask, e.g., |
||||||
|
* `RecoveryDeviceType_ScrambledWords | RecoveryDeviceType_Matrix` |
||||||
|
* listing every method supported by the host computer. |
||||||
|
* |
||||||
|
* Note that ScrambledWords must be supported by every implementation |
||||||
|
* for backward compatibility; there is no way to not support it. |
||||||
|
*/ |
||||||
|
enum RecoveryDeviceType { |
||||||
|
// use powers of two when extending this field |
||||||
|
RecoveryDeviceType_ScrambledWords = 0; // words in scrambled order |
||||||
|
RecoveryDeviceType_Matrix = 1; // matrix recovery type |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Response: Device is waiting for user to enter word of the mnemonic |
||||||
|
* Its position is shown only on device's internal display. |
||||||
|
* @next WordAck |
||||||
|
*/ |
||||||
|
message WordRequest { |
||||||
|
optional WordRequestType type = 1; |
||||||
|
/** |
||||||
|
* Type of Recovery Word request |
||||||
|
*/ |
||||||
|
enum WordRequestType { |
||||||
|
WordRequestType_Plain = 0; |
||||||
|
WordRequestType_Matrix9 = 1; |
||||||
|
WordRequestType_Matrix6 = 2; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Computer replies with word from the mnemonic |
||||||
|
* @next WordRequest |
||||||
|
* @next Success |
||||||
|
* @next Failure |
||||||
|
*/ |
||||||
|
message WordAck { |
||||||
|
required string word = 1; // one word of mnemonic on asked position |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request: Set U2F counter |
||||||
|
* @start |
||||||
|
* @next Success |
||||||
|
*/ |
||||||
|
message SetU2FCounter { |
||||||
|
optional uint32 u2f_counter = 1; // counter |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,278 +0,0 @@ |
|||||||
// This file originates from the SatoshiLabs Trezor `common` repository at: |
|
||||||
// https://github.com/trezor/trezor-common/blob/master/protob/types.proto |
|
||||||
// dated 28.07.2017, commit dd8ec3231fb5f7992360aff9bdfe30bb58130f4b. |
|
||||||
|
|
||||||
syntax = "proto2"; |
|
||||||
|
|
||||||
/** |
|
||||||
* Types for TREZOR communication |
|
||||||
* |
|
||||||
* @author Marek Palatinus <slush@satoshilabs.com> |
|
||||||
* @version 1.2 |
|
||||||
*/ |
|
||||||
|
|
||||||
// Sugar for easier handling in Java |
|
||||||
option java_package = "com.satoshilabs.trezor.lib.protobuf"; |
|
||||||
option java_outer_classname = "TrezorType"; |
|
||||||
|
|
||||||
import "google/protobuf/descriptor.proto"; |
|
||||||
|
|
||||||
/** |
|
||||||
* Options for specifying message direction and type of wire (normal/debug) |
|
||||||
*/ |
|
||||||
extend google.protobuf.EnumValueOptions { |
|
||||||
optional bool wire_in = 50002; // message can be transmitted via wire from PC to TREZOR |
|
||||||
optional bool wire_out = 50003; // message can be transmitted via wire from TREZOR to PC |
|
||||||
optional bool wire_debug_in = 50004; // message can be transmitted via debug wire from PC to TREZOR |
|
||||||
optional bool wire_debug_out = 50005; // message can be transmitted via debug wire from TREZOR to PC |
|
||||||
optional bool wire_tiny = 50006; // message is handled by TREZOR when the USB stack is in tiny mode |
|
||||||
optional bool wire_bootloader = 50007; // message is only handled by TREZOR Bootloader |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Type of failures returned by Failure message |
|
||||||
* @used_in Failure |
|
||||||
*/ |
|
||||||
enum FailureType { |
|
||||||
Failure_UnexpectedMessage = 1; |
|
||||||
Failure_ButtonExpected = 2; |
|
||||||
Failure_DataError = 3; |
|
||||||
Failure_ActionCancelled = 4; |
|
||||||
Failure_PinExpected = 5; |
|
||||||
Failure_PinCancelled = 6; |
|
||||||
Failure_PinInvalid = 7; |
|
||||||
Failure_InvalidSignature = 8; |
|
||||||
Failure_ProcessError = 9; |
|
||||||
Failure_NotEnoughFunds = 10; |
|
||||||
Failure_NotInitialized = 11; |
|
||||||
Failure_FirmwareError = 99; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Type of script which will be used for transaction output |
|
||||||
* @used_in TxOutputType |
|
||||||
*/ |
|
||||||
enum OutputScriptType { |
|
||||||
PAYTOADDRESS = 0; // used for all addresses (bitcoin, p2sh, witness) |
|
||||||
PAYTOSCRIPTHASH = 1; // p2sh address (deprecated; use PAYTOADDRESS) |
|
||||||
PAYTOMULTISIG = 2; // only for change output |
|
||||||
PAYTOOPRETURN = 3; // op_return |
|
||||||
PAYTOWITNESS = 4; // only for change output |
|
||||||
PAYTOP2SHWITNESS = 5; // only for change output |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Type of script which will be used for transaction output |
|
||||||
* @used_in TxInputType |
|
||||||
*/ |
|
||||||
enum InputScriptType { |
|
||||||
SPENDADDRESS = 0; // standard p2pkh address |
|
||||||
SPENDMULTISIG = 1; // p2sh multisig address |
|
||||||
EXTERNAL = 2; // reserved for external inputs (coinjoin) |
|
||||||
SPENDWITNESS = 3; // native segwit |
|
||||||
SPENDP2SHWITNESS = 4; // segwit over p2sh (backward compatible) |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Type of information required by transaction signing process |
|
||||||
* @used_in TxRequest |
|
||||||
*/ |
|
||||||
enum RequestType { |
|
||||||
TXINPUT = 0; |
|
||||||
TXOUTPUT = 1; |
|
||||||
TXMETA = 2; |
|
||||||
TXFINISHED = 3; |
|
||||||
TXEXTRADATA = 4; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Type of button request |
|
||||||
* @used_in ButtonRequest |
|
||||||
*/ |
|
||||||
enum ButtonRequestType { |
|
||||||
ButtonRequest_Other = 1; |
|
||||||
ButtonRequest_FeeOverThreshold = 2; |
|
||||||
ButtonRequest_ConfirmOutput = 3; |
|
||||||
ButtonRequest_ResetDevice = 4; |
|
||||||
ButtonRequest_ConfirmWord = 5; |
|
||||||
ButtonRequest_WipeDevice = 6; |
|
||||||
ButtonRequest_ProtectCall = 7; |
|
||||||
ButtonRequest_SignTx = 8; |
|
||||||
ButtonRequest_FirmwareCheck = 9; |
|
||||||
ButtonRequest_Address = 10; |
|
||||||
ButtonRequest_PublicKey = 11; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Type of PIN request |
|
||||||
* @used_in PinMatrixRequest |
|
||||||
*/ |
|
||||||
enum PinMatrixRequestType { |
|
||||||
PinMatrixRequestType_Current = 1; |
|
||||||
PinMatrixRequestType_NewFirst = 2; |
|
||||||
PinMatrixRequestType_NewSecond = 3; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Type of recovery procedure. These should be used as bitmask, e.g., |
|
||||||
* `RecoveryDeviceType_ScrambledWords | RecoveryDeviceType_Matrix` |
|
||||||
* listing every method supported by the host computer. |
|
||||||
* |
|
||||||
* Note that ScrambledWords must be supported by every implementation |
|
||||||
* for backward compatibility; there is no way to not support it. |
|
||||||
* |
|
||||||
* @used_in RecoveryDevice |
|
||||||
*/ |
|
||||||
enum RecoveryDeviceType { |
|
||||||
// use powers of two when extending this field |
|
||||||
RecoveryDeviceType_ScrambledWords = 0; // words in scrambled order |
|
||||||
RecoveryDeviceType_Matrix = 1; // matrix recovery type |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Type of Recovery Word request |
|
||||||
* @used_in WordRequest |
|
||||||
*/ |
|
||||||
enum WordRequestType { |
|
||||||
WordRequestType_Plain = 0; |
|
||||||
WordRequestType_Matrix9 = 1; |
|
||||||
WordRequestType_Matrix6 = 2; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Structure representing BIP32 (hierarchical deterministic) node |
|
||||||
* Used for imports of private key into the device and exporting public key out of device |
|
||||||
* @used_in PublicKey |
|
||||||
* @used_in LoadDevice |
|
||||||
* @used_in DebugLinkState |
|
||||||
* @used_in Storage |
|
||||||
*/ |
|
||||||
message HDNodeType { |
|
||||||
required uint32 depth = 1; |
|
||||||
required uint32 fingerprint = 2; |
|
||||||
required uint32 child_num = 3; |
|
||||||
required bytes chain_code = 4; |
|
||||||
optional bytes private_key = 5; |
|
||||||
optional bytes public_key = 6; |
|
||||||
} |
|
||||||
|
|
||||||
message HDNodePathType { |
|
||||||
required HDNodeType node = 1; // BIP-32 node in deserialized form |
|
||||||
repeated uint32 address_n = 2; // BIP-32 path to derive the key from node |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Structure representing Coin |
|
||||||
* @used_in Features |
|
||||||
*/ |
|
||||||
message CoinType { |
|
||||||
optional string coin_name = 1; |
|
||||||
optional string coin_shortcut = 2; |
|
||||||
optional uint32 address_type = 3 [default=0]; |
|
||||||
optional uint64 maxfee_kb = 4; |
|
||||||
optional uint32 address_type_p2sh = 5 [default=5]; |
|
||||||
optional string signed_message_header = 8; |
|
||||||
optional uint32 xpub_magic = 9 [default=76067358]; // default=0x0488b21e |
|
||||||
optional uint32 xprv_magic = 10 [default=76066276]; // default=0x0488ade4 |
|
||||||
optional bool segwit = 11; |
|
||||||
optional uint32 forkid = 12; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Type of redeem script used in input |
|
||||||
* @used_in TxInputType |
|
||||||
*/ |
|
||||||
message MultisigRedeemScriptType { |
|
||||||
repeated HDNodePathType pubkeys = 1; // pubkeys from multisig address (sorted lexicographically) |
|
||||||
repeated bytes signatures = 2; // existing signatures for partially signed input |
|
||||||
optional uint32 m = 3; // "m" from n, how many valid signatures is necessary for spending |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Structure representing transaction input |
|
||||||
* @used_in SimpleSignTx |
|
||||||
* @used_in TransactionType |
|
||||||
*/ |
|
||||||
message TxInputType { |
|
||||||
repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node |
|
||||||
required bytes prev_hash = 2; // hash of previous transaction output to spend by this input |
|
||||||
required uint32 prev_index = 3; // index of previous output to spend |
|
||||||
optional bytes script_sig = 4; // script signature, unset for tx to sign |
|
||||||
optional uint32 sequence = 5 [default=4294967295]; // sequence (default=0xffffffff) |
|
||||||
optional InputScriptType script_type = 6 [default=SPENDADDRESS]; // defines template of input script |
|
||||||
optional MultisigRedeemScriptType multisig = 7; // Filled if input is going to spend multisig tx |
|
||||||
optional uint64 amount = 8; // amount of previous transaction output (for segwit only) |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Structure representing transaction output |
|
||||||
* @used_in SimpleSignTx |
|
||||||
* @used_in TransactionType |
|
||||||
*/ |
|
||||||
message TxOutputType { |
|
||||||
optional string address = 1; // target coin address in Base58 encoding |
|
||||||
repeated uint32 address_n = 2; // BIP-32 path to derive the key from master node; has higher priority than "address" |
|
||||||
required uint64 amount = 3; // amount to spend in satoshis |
|
||||||
required OutputScriptType script_type = 4; // output script type |
|
||||||
optional MultisigRedeemScriptType multisig = 5; // defines multisig address; script_type must be PAYTOMULTISIG |
|
||||||
optional bytes op_return_data = 6; // defines op_return data; script_type must be PAYTOOPRETURN, amount must be 0 |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Structure representing compiled transaction output |
|
||||||
* @used_in TransactionType |
|
||||||
*/ |
|
||||||
message TxOutputBinType { |
|
||||||
required uint64 amount = 1; |
|
||||||
required bytes script_pubkey = 2; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Structure representing transaction |
|
||||||
* @used_in SimpleSignTx |
|
||||||
*/ |
|
||||||
message TransactionType { |
|
||||||
optional uint32 version = 1; |
|
||||||
repeated TxInputType inputs = 2; |
|
||||||
repeated TxOutputBinType bin_outputs = 3; |
|
||||||
repeated TxOutputType outputs = 5; |
|
||||||
optional uint32 lock_time = 4; |
|
||||||
optional uint32 inputs_cnt = 6; |
|
||||||
optional uint32 outputs_cnt = 7; |
|
||||||
optional bytes extra_data = 8; |
|
||||||
optional uint32 extra_data_len = 9; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Structure representing request details |
|
||||||
* @used_in TxRequest |
|
||||||
*/ |
|
||||||
message TxRequestDetailsType { |
|
||||||
optional uint32 request_index = 1; // device expects TxAck message from the computer |
|
||||||
optional bytes tx_hash = 2; // tx_hash of requested transaction |
|
||||||
optional uint32 extra_data_len = 3; // length of requested extra data |
|
||||||
optional uint32 extra_data_offset = 4; // offset of requested extra data |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Structure representing serialized data |
|
||||||
* @used_in TxRequest |
|
||||||
*/ |
|
||||||
message TxRequestSerializedType { |
|
||||||
optional uint32 signature_index = 1; // 'signature' field contains signed input of this index |
|
||||||
optional bytes signature = 2; // signature of the signature_index input |
|
||||||
optional bytes serialized_tx = 3; // part of serialized and signed transaction |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Structure representing identity data |
|
||||||
* @used_in IdentityType |
|
||||||
*/ |
|
||||||
message IdentityType { |
|
||||||
optional string proto = 1; // proto part of URI |
|
||||||
optional string user = 2; // user part of URI |
|
||||||
optional string host = 3; // host part of URI |
|
||||||
optional string port = 4; // port part of URI |
|
||||||
optional string path = 5; // path part of URI |
|
||||||
optional uint32 index = 6 [default=0]; // identity index |
|
||||||
} |
|
@ -1,43 +0,0 @@ |
|||||||
# Go support for Protocol Buffers - Google's data interchange format
|
|
||||||
#
|
|
||||||
# Copyright 2010 The Go Authors. All rights reserved.
|
|
||||||
# https://github.com/golang/protobuf
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are
|
|
||||||
# met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
# * Redistributions in binary form must reproduce the above
|
|
||||||
# copyright notice, this list of conditions and the following disclaimer
|
|
||||||
# in the documentation and/or other materials provided with the
|
|
||||||
# distribution.
|
|
||||||
# * Neither the name of Google Inc. nor the names of its
|
|
||||||
# contributors may be used to endorse or promote products derived from
|
|
||||||
# this software without specific prior written permission.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
install: |
|
||||||
go install
|
|
||||||
|
|
||||||
test: install generate-test-pbs |
|
||||||
go test
|
|
||||||
|
|
||||||
|
|
||||||
generate-test-pbs: |
|
||||||
make install
|
|
||||||
make -C testdata
|
|
||||||
protoc --go_out=Mtestdata/test.proto=github.com/golang/protobuf/proto/testdata,Mgoogle/protobuf/any.proto=github.com/golang/protobuf/ptypes/any:. proto3_proto/proto3.proto
|
|
||||||
make
|
|
@ -0,0 +1,63 @@ |
|||||||
|
// Go support for Protocol Buffers - Google's data interchange format
|
||||||
|
//
|
||||||
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
|
// https://github.com/golang/protobuf
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package proto |
||||||
|
|
||||||
|
import "errors" |
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
type Stats struct{ Emalloc, Dmalloc, Encode, Decode, Chit, Cmiss, Size uint64 } |
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
func GetStats() Stats { return Stats{} } |
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
func MarshalMessageSet(interface{}) ([]byte, error) { |
||||||
|
return nil, errors.New("proto: not implemented") |
||||||
|
} |
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
func UnmarshalMessageSet([]byte, interface{}) error { |
||||||
|
return errors.New("proto: not implemented") |
||||||
|
} |
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
func MarshalMessageSetJSON(interface{}) ([]byte, error) { |
||||||
|
return nil, errors.New("proto: not implemented") |
||||||
|
} |
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
func UnmarshalMessageSetJSON([]byte, interface{}) error { |
||||||
|
return errors.New("proto: not implemented") |
||||||
|
} |
||||||
|
|
||||||
|
// Deprecated: do not use.
|
||||||
|
func RegisterMessageSetType(Message, int32, string) {} |
@ -0,0 +1,350 @@ |
|||||||
|
// Go support for Protocol Buffers - Google's data interchange format
|
||||||
|
//
|
||||||
|
// Copyright 2017 The Go Authors. All rights reserved.
|
||||||
|
// https://github.com/golang/protobuf
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package proto |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"reflect" |
||||||
|
"strings" |
||||||
|
"sync" |
||||||
|
"sync/atomic" |
||||||
|
) |
||||||
|
|
||||||
|
type generatedDiscarder interface { |
||||||
|
XXX_DiscardUnknown() |
||||||
|
} |
||||||
|
|
||||||
|
// DiscardUnknown recursively discards all unknown fields from this message
|
||||||
|
// and all embedded messages.
|
||||||
|
//
|
||||||
|
// When unmarshaling a message with unrecognized fields, the tags and values
|
||||||
|
// of such fields are preserved in the Message. This allows a later call to
|
||||||
|
// marshal to be able to produce a message that continues to have those
|
||||||
|
// unrecognized fields. To avoid this, DiscardUnknown is used to
|
||||||
|
// explicitly clear the unknown fields after unmarshaling.
|
||||||
|
//
|
||||||
|
// For proto2 messages, the unknown fields of message extensions are only
|
||||||
|
// discarded from messages that have been accessed via GetExtension.
|
||||||
|
func DiscardUnknown(m Message) { |
||||||
|
if m, ok := m.(generatedDiscarder); ok { |
||||||
|
m.XXX_DiscardUnknown() |
||||||
|
return |
||||||
|
} |
||||||
|
// TODO: Dynamically populate a InternalMessageInfo for legacy messages,
|
||||||
|
// but the master branch has no implementation for InternalMessageInfo,
|
||||||
|
// so it would be more work to replicate that approach.
|
||||||
|
discardLegacy(m) |
||||||
|
} |
||||||
|
|
||||||
|
// DiscardUnknown recursively discards all unknown fields.
|
||||||
|
func (a *InternalMessageInfo) DiscardUnknown(m Message) { |
||||||
|
di := atomicLoadDiscardInfo(&a.discard) |
||||||
|
if di == nil { |
||||||
|
di = getDiscardInfo(reflect.TypeOf(m).Elem()) |
||||||
|
atomicStoreDiscardInfo(&a.discard, di) |
||||||
|
} |
||||||
|
di.discard(toPointer(&m)) |
||||||
|
} |
||||||
|
|
||||||
|
type discardInfo struct { |
||||||
|
typ reflect.Type |
||||||
|
|
||||||
|
initialized int32 // 0: only typ is valid, 1: everything is valid
|
||||||
|
lock sync.Mutex |
||||||
|
|
||||||
|
fields []discardFieldInfo |
||||||
|
unrecognized field |
||||||
|
} |
||||||
|
|
||||||
|
type discardFieldInfo struct { |
||||||
|
field field // Offset of field, guaranteed to be valid
|
||||||
|
discard func(src pointer) |
||||||
|
} |
||||||
|
|
||||||
|
var ( |
||||||
|
discardInfoMap = map[reflect.Type]*discardInfo{} |
||||||
|
discardInfoLock sync.Mutex |
||||||
|
) |
||||||
|
|
||||||
|
func getDiscardInfo(t reflect.Type) *discardInfo { |
||||||
|
discardInfoLock.Lock() |
||||||
|
defer discardInfoLock.Unlock() |
||||||
|
di := discardInfoMap[t] |
||||||
|
if di == nil { |
||||||
|
di = &discardInfo{typ: t} |
||||||
|
discardInfoMap[t] = di |
||||||
|
} |
||||||
|
return di |
||||||
|
} |
||||||
|
|
||||||
|
func (di *discardInfo) discard(src pointer) { |
||||||
|
if src.isNil() { |
||||||
|
return // Nothing to do.
|
||||||
|
} |
||||||
|
|
||||||
|
if atomic.LoadInt32(&di.initialized) == 0 { |
||||||
|
di.computeDiscardInfo() |
||||||
|
} |
||||||
|
|
||||||
|
for _, fi := range di.fields { |
||||||
|
sfp := src.offset(fi.field) |
||||||
|
fi.discard(sfp) |
||||||
|
} |
||||||
|
|
||||||
|
// For proto2 messages, only discard unknown fields in message extensions
|
||||||
|
// that have been accessed via GetExtension.
|
||||||
|
if em, err := extendable(src.asPointerTo(di.typ).Interface()); err == nil { |
||||||
|
// Ignore lock since DiscardUnknown is not concurrency safe.
|
||||||
|
emm, _ := em.extensionsRead() |
||||||
|
for _, mx := range emm { |
||||||
|
if m, ok := mx.value.(Message); ok { |
||||||
|
DiscardUnknown(m) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if di.unrecognized.IsValid() { |
||||||
|
*src.offset(di.unrecognized).toBytes() = nil |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func (di *discardInfo) computeDiscardInfo() { |
||||||
|
di.lock.Lock() |
||||||
|
defer di.lock.Unlock() |
||||||
|
if di.initialized != 0 { |
||||||
|
return |
||||||
|
} |
||||||
|
t := di.typ |
||||||
|
n := t.NumField() |
||||||
|
|
||||||
|
for i := 0; i < n; i++ { |
||||||
|
f := t.Field(i) |
||||||
|
if strings.HasPrefix(f.Name, "XXX_") { |
||||||
|
continue |
||||||
|
} |
||||||
|
|
||||||
|
dfi := discardFieldInfo{field: toField(&f)} |
||||||
|
tf := f.Type |
||||||
|
|
||||||
|
// Unwrap tf to get its most basic type.
|
||||||
|
var isPointer, isSlice bool |
||||||
|
if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { |
||||||
|
isSlice = true |
||||||
|
tf = tf.Elem() |
||||||
|
} |
||||||
|
if tf.Kind() == reflect.Ptr { |
||||||
|
isPointer = true |
||||||
|
tf = tf.Elem() |
||||||
|
} |
||||||
|
if isPointer && isSlice && tf.Kind() != reflect.Struct { |
||||||
|
panic(fmt.Sprintf("%v.%s cannot be a slice of pointers to primitive types", t, f.Name)) |
||||||
|
} |
||||||
|
|
||||||
|
switch tf.Kind() { |
||||||
|
case reflect.Struct: |
||||||
|
switch { |
||||||
|
case !isPointer: |
||||||
|
panic(fmt.Sprintf("%v.%s cannot be a direct struct value", t, f.Name)) |
||||||
|
case isSlice: // E.g., []*pb.T
|
||||||
|
di := getDiscardInfo(tf) |
||||||
|
dfi.discard = func(src pointer) { |
||||||
|
sps := src.getPointerSlice() |
||||||
|
for _, sp := range sps { |
||||||
|
if !sp.isNil() { |
||||||
|
di.discard(sp) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
default: // E.g., *pb.T
|
||||||
|
di := getDiscardInfo(tf) |
||||||
|
dfi.discard = func(src pointer) { |
||||||
|
sp := src.getPointer() |
||||||
|
if !sp.isNil() { |
||||||
|
di.discard(sp) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case reflect.Map: |
||||||
|
switch { |
||||||
|
case isPointer || isSlice: |
||||||
|
panic(fmt.Sprintf("%v.%s cannot be a pointer to a map or a slice of map values", t, f.Name)) |
||||||
|
default: // E.g., map[K]V
|
||||||
|
if tf.Elem().Kind() == reflect.Ptr { // Proto struct (e.g., *T)
|
||||||
|
dfi.discard = func(src pointer) { |
||||||
|
sm := src.asPointerTo(tf).Elem() |
||||||
|
if sm.Len() == 0 { |
||||||
|
return |
||||||
|
} |
||||||
|
for _, key := range sm.MapKeys() { |
||||||
|
val := sm.MapIndex(key) |
||||||
|
DiscardUnknown(val.Interface().(Message)) |
||||||
|
} |
||||||
|
} |
||||||
|
} else { |
||||||
|
dfi.discard = func(pointer) {} // Noop
|
||||||
|
} |
||||||
|
} |
||||||
|
case reflect.Interface: |
||||||
|
// Must be oneof field.
|
||||||
|
switch { |
||||||
|
case isPointer || isSlice: |
||||||
|
panic(fmt.Sprintf("%v.%s cannot be a pointer to a interface or a slice of interface values", t, f.Name)) |
||||||
|
default: // E.g., interface{}
|
||||||
|
// TODO: Make this faster?
|
||||||
|
dfi.discard = func(src pointer) { |
||||||
|
su := src.asPointerTo(tf).Elem() |
||||||
|
if !su.IsNil() { |
||||||
|
sv := su.Elem().Elem().Field(0) |
||||||
|
if sv.Kind() == reflect.Ptr && sv.IsNil() { |
||||||
|
return |
||||||
|
} |
||||||
|
switch sv.Type().Kind() { |
||||||
|
case reflect.Ptr: // Proto struct (e.g., *T)
|
||||||
|
DiscardUnknown(sv.Interface().(Message)) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
default: |
||||||
|
continue |
||||||
|
} |
||||||
|
di.fields = append(di.fields, dfi) |
||||||
|
} |
||||||
|
|
||||||
|
di.unrecognized = invalidField |
||||||
|
if f, ok := t.FieldByName("XXX_unrecognized"); ok { |
||||||
|
if f.Type != reflect.TypeOf([]byte{}) { |
||||||
|
panic("expected XXX_unrecognized to be of type []byte") |
||||||
|
} |
||||||
|
di.unrecognized = toField(&f) |
||||||
|
} |
||||||
|
|
||||||
|
atomic.StoreInt32(&di.initialized, 1) |
||||||
|
} |
||||||
|
|
||||||
|
func discardLegacy(m Message) { |
||||||
|
v := reflect.ValueOf(m) |
||||||
|
if v.Kind() != reflect.Ptr || v.IsNil() { |
||||||
|
return |
||||||
|
} |
||||||
|
v = v.Elem() |
||||||
|
if v.Kind() != reflect.Struct { |
||||||
|
return |
||||||
|
} |
||||||
|
t := v.Type() |
||||||
|
|
||||||
|
for i := 0; i < v.NumField(); i++ { |
||||||
|
f := t.Field(i) |
||||||
|
if strings.HasPrefix(f.Name, "XXX_") { |
||||||
|
continue |
||||||
|
} |
||||||
|
vf := v.Field(i) |
||||||
|
tf := f.Type |
||||||
|
|
||||||
|
// Unwrap tf to get its most basic type.
|
||||||
|
var isPointer, isSlice bool |
||||||
|
if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { |
||||||
|
isSlice = true |
||||||
|
tf = tf.Elem() |
||||||
|
} |
||||||
|
if tf.Kind() == reflect.Ptr { |
||||||
|
isPointer = true |
||||||
|
tf = tf.Elem() |
||||||
|
} |
||||||
|
if isPointer && isSlice && tf.Kind() != reflect.Struct { |
||||||
|
panic(fmt.Sprintf("%T.%s cannot be a slice of pointers to primitive types", m, f.Name)) |
||||||
|
} |
||||||
|
|
||||||
|
switch tf.Kind() { |
||||||
|
case reflect.Struct: |
||||||
|
switch { |
||||||
|
case !isPointer: |
||||||
|
panic(fmt.Sprintf("%T.%s cannot be a direct struct value", m, f.Name)) |
||||||
|
case isSlice: // E.g., []*pb.T
|
||||||
|
for j := 0; j < vf.Len(); j++ { |
||||||
|
discardLegacy(vf.Index(j).Interface().(Message)) |
||||||
|
} |
||||||
|
default: // E.g., *pb.T
|
||||||
|
discardLegacy(vf.Interface().(Message)) |
||||||
|
} |
||||||
|
case reflect.Map: |
||||||
|
switch { |
||||||
|
case isPointer || isSlice: |
||||||
|
panic(fmt.Sprintf("%T.%s cannot be a pointer to a map or a slice of map values", m, f.Name)) |
||||||
|
default: // E.g., map[K]V
|
||||||
|
tv := vf.Type().Elem() |
||||||
|
if tv.Kind() == reflect.Ptr && tv.Implements(protoMessageType) { // Proto struct (e.g., *T)
|
||||||
|
for _, key := range vf.MapKeys() { |
||||||
|
val := vf.MapIndex(key) |
||||||
|
discardLegacy(val.Interface().(Message)) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case reflect.Interface: |
||||||
|
// Must be oneof field.
|
||||||
|
switch { |
||||||
|
case isPointer || isSlice: |
||||||
|
panic(fmt.Sprintf("%T.%s cannot be a pointer to a interface or a slice of interface values", m, f.Name)) |
||||||
|
default: // E.g., test_proto.isCommunique_Union interface
|
||||||
|
if !vf.IsNil() && f.Tag.Get("protobuf_oneof") != "" { |
||||||
|
vf = vf.Elem() // E.g., *test_proto.Communique_Msg
|
||||||
|
if !vf.IsNil() { |
||||||
|
vf = vf.Elem() // E.g., test_proto.Communique_Msg
|
||||||
|
vf = vf.Field(0) // E.g., Proto struct (e.g., *T) or primitive value
|
||||||
|
if vf.Kind() == reflect.Ptr { |
||||||
|
discardLegacy(vf.Interface().(Message)) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if vf := v.FieldByName("XXX_unrecognized"); vf.IsValid() { |
||||||
|
if vf.Type() != reflect.TypeOf([]byte{}) { |
||||||
|
panic("expected XXX_unrecognized to be of type []byte") |
||||||
|
} |
||||||
|
vf.Set(reflect.ValueOf([]byte(nil))) |
||||||
|
} |
||||||
|
|
||||||
|
// For proto2 messages, only discard unknown fields in message extensions
|
||||||
|
// that have been accessed via GetExtension.
|
||||||
|
if em, err := extendable(m); err == nil { |
||||||
|
// Ignore lock since discardLegacy is not concurrency safe.
|
||||||
|
emm, _ := em.extensionsRead() |
||||||
|
for _, mx := range emm { |
||||||
|
if m, ok := mx.value.(Message); ok { |
||||||
|
discardLegacy(m) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,654 @@ |
|||||||
|
// Go support for Protocol Buffers - Google's data interchange format
|
||||||
|
//
|
||||||
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
|
// https://github.com/golang/protobuf
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
package proto |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"reflect" |
||||||
|
"strings" |
||||||
|
"sync" |
||||||
|
"sync/atomic" |
||||||
|
) |
||||||
|
|
||||||
|
// Merge merges the src message into dst.
|
||||||
|
// This assumes that dst and src of the same type and are non-nil.
|
||||||
|
func (a *InternalMessageInfo) Merge(dst, src Message) { |
||||||
|
mi := atomicLoadMergeInfo(&a.merge) |
||||||
|
if mi == nil { |
||||||
|
mi = getMergeInfo(reflect.TypeOf(dst).Elem()) |
||||||
|
atomicStoreMergeInfo(&a.merge, mi) |
||||||
|
} |
||||||
|
mi.merge(toPointer(&dst), toPointer(&src)) |
||||||
|
} |
||||||
|
|
||||||
|
type mergeInfo struct { |
||||||
|
typ reflect.Type |
||||||
|
|
||||||
|
initialized int32 // 0: only typ is valid, 1: everything is valid
|
||||||
|
lock sync.Mutex |
||||||
|
|
||||||
|
fields []mergeFieldInfo |
||||||
|
unrecognized field // Offset of XXX_unrecognized
|
||||||
|
} |
||||||
|
|
||||||
|
type mergeFieldInfo struct { |
||||||
|
field field // Offset of field, guaranteed to be valid
|
||||||
|
|
||||||
|
// isPointer reports whether the value in the field is a pointer.
|
||||||
|
// This is true for the following situations:
|
||||||
|
// * Pointer to struct
|
||||||
|
// * Pointer to basic type (proto2 only)
|
||||||
|
// * Slice (first value in slice header is a pointer)
|
||||||
|
// * String (first value in string header is a pointer)
|
||||||
|
isPointer bool |
||||||
|
|
||||||
|
// basicWidth reports the width of the field assuming that it is directly
|
||||||
|
// embedded in the struct (as is the case for basic types in proto3).
|
||||||
|
// The possible values are:
|
||||||
|
// 0: invalid
|
||||||
|
// 1: bool
|
||||||
|
// 4: int32, uint32, float32
|
||||||
|
// 8: int64, uint64, float64
|
||||||
|
basicWidth int |
||||||
|
|
||||||
|
// Where dst and src are pointers to the types being merged.
|
||||||
|
merge func(dst, src pointer) |
||||||
|
} |
||||||
|
|
||||||
|
var ( |
||||||
|
mergeInfoMap = map[reflect.Type]*mergeInfo{} |
||||||
|
mergeInfoLock sync.Mutex |
||||||
|
) |
||||||
|
|
||||||
|
func getMergeInfo(t reflect.Type) *mergeInfo { |
||||||
|
mergeInfoLock.Lock() |
||||||
|
defer mergeInfoLock.Unlock() |
||||||
|
mi := mergeInfoMap[t] |
||||||
|
if mi == nil { |
||||||
|
mi = &mergeInfo{typ: t} |
||||||
|
mergeInfoMap[t] = mi |
||||||
|
} |
||||||
|
return mi |
||||||
|
} |
||||||
|
|
||||||
|
// merge merges src into dst assuming they are both of type *mi.typ.
|
||||||
|
func (mi *mergeInfo) merge(dst, src pointer) { |
||||||
|
if dst.isNil() { |
||||||
|
panic("proto: nil destination") |
||||||
|
} |
||||||
|
if src.isNil() { |
||||||
|
return // Nothing to do.
|
||||||
|
} |
||||||
|
|
||||||
|
if atomic.LoadInt32(&mi.initialized) == 0 { |
||||||
|
mi.computeMergeInfo() |
||||||
|
} |
||||||
|
|
||||||
|
for _, fi := range mi.fields { |
||||||
|
sfp := src.offset(fi.field) |
||||||
|
|
||||||
|
// As an optimization, we can avoid the merge function call cost
|
||||||
|
// if we know for sure that the source will have no effect
|
||||||
|
// by checking if it is the zero value.
|
||||||
|
if unsafeAllowed { |
||||||
|
if fi.isPointer && sfp.getPointer().isNil() { // Could be slice or string
|
||||||
|
continue |
||||||
|
} |
||||||
|
if fi.basicWidth > 0 { |
||||||
|
switch { |
||||||
|
case fi.basicWidth == 1 && !*sfp.toBool(): |
||||||
|
continue |
||||||
|
case fi.basicWidth == 4 && *sfp.toUint32() == 0: |
||||||
|
continue |
||||||
|
case fi.basicWidth == 8 && *sfp.toUint64() == 0: |
||||||
|
continue |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
dfp := dst.offset(fi.field) |
||||||
|
fi.merge(dfp, sfp) |
||||||
|
} |
||||||
|
|
||||||
|
// TODO: Make this faster?
|
||||||
|
out := dst.asPointerTo(mi.typ).Elem() |
||||||
|
in := src.asPointerTo(mi.typ).Elem() |
||||||
|
if emIn, err := extendable(in.Addr().Interface()); err == nil { |
||||||
|
emOut, _ := extendable(out.Addr().Interface()) |
||||||
|
mIn, muIn := emIn.extensionsRead() |
||||||
|
if mIn != nil { |
||||||
|
mOut := emOut.extensionsWrite() |
||||||
|
muIn.Lock() |
||||||
|
mergeExtension(mOut, mIn) |
||||||
|
muIn.Unlock() |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if mi.unrecognized.IsValid() { |
||||||
|
if b := *src.offset(mi.unrecognized).toBytes(); len(b) > 0 { |
||||||
|
*dst.offset(mi.unrecognized).toBytes() = append([]byte(nil), b...) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
func (mi *mergeInfo) computeMergeInfo() { |
||||||
|
mi.lock.Lock() |
||||||
|
defer mi.lock.Unlock() |
||||||
|
if mi.initialized != 0 { |
||||||
|
return |
||||||
|
} |
||||||
|
t := mi.typ |
||||||
|
n := t.NumField() |
||||||
|
|
||||||
|
props := GetProperties(t) |
||||||
|
for i := 0; i < n; i++ { |
||||||
|
f := t.Field(i) |
||||||
|
if strings.HasPrefix(f.Name, "XXX_") { |
||||||
|
continue |
||||||
|
} |
||||||
|
|
||||||
|
mfi := mergeFieldInfo{field: toField(&f)} |
||||||
|
tf := f.Type |
||||||
|
|
||||||
|
// As an optimization, we can avoid the merge function call cost
|
||||||
|
// if we know for sure that the source will have no effect
|
||||||
|
// by checking if it is the zero value.
|
||||||
|
if unsafeAllowed { |
||||||
|
switch tf.Kind() { |
||||||
|
case reflect.Ptr, reflect.Slice, reflect.String: |
||||||
|
// As a special case, we assume slices and strings are pointers
|
||||||
|
// since we know that the first field in the SliceSlice or
|
||||||
|
// StringHeader is a data pointer.
|
||||||
|
mfi.isPointer = true |
||||||
|
case reflect.Bool: |
||||||
|
mfi.basicWidth = 1 |
||||||
|
case reflect.Int32, reflect.Uint32, reflect.Float32: |
||||||
|
mfi.basicWidth = 4 |
||||||
|
case reflect.Int64, reflect.Uint64, reflect.Float64: |
||||||
|
mfi.basicWidth = 8 |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Unwrap tf to get at its most basic type.
|
||||||
|
var isPointer, isSlice bool |
||||||
|
if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { |
||||||
|
isSlice = true |
||||||
|
tf = tf.Elem() |
||||||
|
} |
||||||
|
if tf.Kind() == reflect.Ptr { |
||||||
|
isPointer = true |
||||||
|
tf = tf.Elem() |
||||||
|
} |
||||||
|
if isPointer && isSlice && tf.Kind() != reflect.Struct { |
||||||
|
panic("both pointer and slice for basic type in " + tf.Name()) |
||||||
|
} |
||||||
|
|
||||||
|
switch tf.Kind() { |
||||||
|
case reflect.Int32: |
||||||
|
switch { |
||||||
|
case isSlice: // E.g., []int32
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
// NOTE: toInt32Slice is not defined (see pointer_reflect.go).
|
||||||
|
/* |
||||||
|
sfsp := src.toInt32Slice() |
||||||
|
if *sfsp != nil { |
||||||
|
dfsp := dst.toInt32Slice() |
||||||
|
*dfsp = append(*dfsp, *sfsp...) |
||||||
|
if *dfsp == nil { |
||||||
|
*dfsp = []int64{} |
||||||
|
} |
||||||
|
} |
||||||
|
*/ |
||||||
|
sfs := src.getInt32Slice() |
||||||
|
if sfs != nil { |
||||||
|
dfs := dst.getInt32Slice() |
||||||
|
dfs = append(dfs, sfs...) |
||||||
|
if dfs == nil { |
||||||
|
dfs = []int32{} |
||||||
|
} |
||||||
|
dst.setInt32Slice(dfs) |
||||||
|
} |
||||||
|
} |
||||||
|
case isPointer: // E.g., *int32
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
// NOTE: toInt32Ptr is not defined (see pointer_reflect.go).
|
||||||
|
/* |
||||||
|
sfpp := src.toInt32Ptr() |
||||||
|
if *sfpp != nil { |
||||||
|
dfpp := dst.toInt32Ptr() |
||||||
|
if *dfpp == nil { |
||||||
|
*dfpp = Int32(**sfpp) |
||||||
|
} else { |
||||||
|
**dfpp = **sfpp |
||||||
|
} |
||||||
|
} |
||||||
|
*/ |
||||||
|
sfp := src.getInt32Ptr() |
||||||
|
if sfp != nil { |
||||||
|
dfp := dst.getInt32Ptr() |
||||||
|
if dfp == nil { |
||||||
|
dst.setInt32Ptr(*sfp) |
||||||
|
} else { |
||||||
|
*dfp = *sfp |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
default: // E.g., int32
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
if v := *src.toInt32(); v != 0 { |
||||||
|
*dst.toInt32() = v |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case reflect.Int64: |
||||||
|
switch { |
||||||
|
case isSlice: // E.g., []int64
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
sfsp := src.toInt64Slice() |
||||||
|
if *sfsp != nil { |
||||||
|
dfsp := dst.toInt64Slice() |
||||||
|
*dfsp = append(*dfsp, *sfsp...) |
||||||
|
if *dfsp == nil { |
||||||
|
*dfsp = []int64{} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case isPointer: // E.g., *int64
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
sfpp := src.toInt64Ptr() |
||||||
|
if *sfpp != nil { |
||||||
|
dfpp := dst.toInt64Ptr() |
||||||
|
if *dfpp == nil { |
||||||
|
*dfpp = Int64(**sfpp) |
||||||
|
} else { |
||||||
|
**dfpp = **sfpp |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
default: // E.g., int64
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
if v := *src.toInt64(); v != 0 { |
||||||
|
*dst.toInt64() = v |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case reflect.Uint32: |
||||||
|
switch { |
||||||
|
case isSlice: // E.g., []uint32
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
sfsp := src.toUint32Slice() |
||||||
|
if *sfsp != nil { |
||||||
|
dfsp := dst.toUint32Slice() |
||||||
|
*dfsp = append(*dfsp, *sfsp...) |
||||||
|
if *dfsp == nil { |
||||||
|
*dfsp = []uint32{} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case isPointer: // E.g., *uint32
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
sfpp := src.toUint32Ptr() |
||||||
|
if *sfpp != nil { |
||||||
|
dfpp := dst.toUint32Ptr() |
||||||
|
if *dfpp == nil { |
||||||
|
*dfpp = Uint32(**sfpp) |
||||||
|
} else { |
||||||
|
**dfpp = **sfpp |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
default: // E.g., uint32
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
if v := *src.toUint32(); v != 0 { |
||||||
|
*dst.toUint32() = v |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case reflect.Uint64: |
||||||
|
switch { |
||||||
|
case isSlice: // E.g., []uint64
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
sfsp := src.toUint64Slice() |
||||||
|
if *sfsp != nil { |
||||||
|
dfsp := dst.toUint64Slice() |
||||||
|
*dfsp = append(*dfsp, *sfsp...) |
||||||
|
if *dfsp == nil { |
||||||
|
*dfsp = []uint64{} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case isPointer: // E.g., *uint64
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
sfpp := src.toUint64Ptr() |
||||||
|
if *sfpp != nil { |
||||||
|
dfpp := dst.toUint64Ptr() |
||||||
|
if *dfpp == nil { |
||||||
|
*dfpp = Uint64(**sfpp) |
||||||
|
} else { |
||||||
|
**dfpp = **sfpp |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
default: // E.g., uint64
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
if v := *src.toUint64(); v != 0 { |
||||||
|
*dst.toUint64() = v |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case reflect.Float32: |
||||||
|
switch { |
||||||
|
case isSlice: // E.g., []float32
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
sfsp := src.toFloat32Slice() |
||||||
|
if *sfsp != nil { |
||||||
|
dfsp := dst.toFloat32Slice() |
||||||
|
*dfsp = append(*dfsp, *sfsp...) |
||||||
|
if *dfsp == nil { |
||||||
|
*dfsp = []float32{} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case isPointer: // E.g., *float32
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
sfpp := src.toFloat32Ptr() |
||||||
|
if *sfpp != nil { |
||||||
|
dfpp := dst.toFloat32Ptr() |
||||||
|
if *dfpp == nil { |
||||||
|
*dfpp = Float32(**sfpp) |
||||||
|
} else { |
||||||
|
**dfpp = **sfpp |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
default: // E.g., float32
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
if v := *src.toFloat32(); v != 0 { |
||||||
|
*dst.toFloat32() = v |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case reflect.Float64: |
||||||
|
switch { |
||||||
|
case isSlice: // E.g., []float64
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
sfsp := src.toFloat64Slice() |
||||||
|
if *sfsp != nil { |
||||||
|
dfsp := dst.toFloat64Slice() |
||||||
|
*dfsp = append(*dfsp, *sfsp...) |
||||||
|
if *dfsp == nil { |
||||||
|
*dfsp = []float64{} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case isPointer: // E.g., *float64
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
sfpp := src.toFloat64Ptr() |
||||||
|
if *sfpp != nil { |
||||||
|
dfpp := dst.toFloat64Ptr() |
||||||
|
if *dfpp == nil { |
||||||
|
*dfpp = Float64(**sfpp) |
||||||
|
} else { |
||||||
|
**dfpp = **sfpp |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
default: // E.g., float64
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
if v := *src.toFloat64(); v != 0 { |
||||||
|
*dst.toFloat64() = v |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case reflect.Bool: |
||||||
|
switch { |
||||||
|
case isSlice: // E.g., []bool
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
sfsp := src.toBoolSlice() |
||||||
|
if *sfsp != nil { |
||||||
|
dfsp := dst.toBoolSlice() |
||||||
|
*dfsp = append(*dfsp, *sfsp...) |
||||||
|
if *dfsp == nil { |
||||||
|
*dfsp = []bool{} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case isPointer: // E.g., *bool
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
sfpp := src.toBoolPtr() |
||||||
|
if *sfpp != nil { |
||||||
|
dfpp := dst.toBoolPtr() |
||||||
|
if *dfpp == nil { |
||||||
|
*dfpp = Bool(**sfpp) |
||||||
|
} else { |
||||||
|
**dfpp = **sfpp |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
default: // E.g., bool
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
if v := *src.toBool(); v { |
||||||
|
*dst.toBool() = v |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case reflect.String: |
||||||
|
switch { |
||||||
|
case isSlice: // E.g., []string
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
sfsp := src.toStringSlice() |
||||||
|
if *sfsp != nil { |
||||||
|
dfsp := dst.toStringSlice() |
||||||
|
*dfsp = append(*dfsp, *sfsp...) |
||||||
|
if *dfsp == nil { |
||||||
|
*dfsp = []string{} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case isPointer: // E.g., *string
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
sfpp := src.toStringPtr() |
||||||
|
if *sfpp != nil { |
||||||
|
dfpp := dst.toStringPtr() |
||||||
|
if *dfpp == nil { |
||||||
|
*dfpp = String(**sfpp) |
||||||
|
} else { |
||||||
|
**dfpp = **sfpp |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
default: // E.g., string
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
if v := *src.toString(); v != "" { |
||||||
|
*dst.toString() = v |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case reflect.Slice: |
||||||
|
isProto3 := props.Prop[i].proto3 |
||||||
|
switch { |
||||||
|
case isPointer: |
||||||
|
panic("bad pointer in byte slice case in " + tf.Name()) |
||||||
|
case tf.Elem().Kind() != reflect.Uint8: |
||||||
|
panic("bad element kind in byte slice case in " + tf.Name()) |
||||||
|
case isSlice: // E.g., [][]byte
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
sbsp := src.toBytesSlice() |
||||||
|
if *sbsp != nil { |
||||||
|
dbsp := dst.toBytesSlice() |
||||||
|
for _, sb := range *sbsp { |
||||||
|
if sb == nil { |
||||||
|
*dbsp = append(*dbsp, nil) |
||||||
|
} else { |
||||||
|
*dbsp = append(*dbsp, append([]byte{}, sb...)) |
||||||
|
} |
||||||
|
} |
||||||
|
if *dbsp == nil { |
||||||
|
*dbsp = [][]byte{} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
default: // E.g., []byte
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
sbp := src.toBytes() |
||||||
|
if *sbp != nil { |
||||||
|
dbp := dst.toBytes() |
||||||
|
if !isProto3 || len(*sbp) > 0 { |
||||||
|
*dbp = append([]byte{}, *sbp...) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case reflect.Struct: |
||||||
|
switch { |
||||||
|
case !isPointer: |
||||||
|
panic(fmt.Sprintf("message field %s without pointer", tf)) |
||||||
|
case isSlice: // E.g., []*pb.T
|
||||||
|
mi := getMergeInfo(tf) |
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
sps := src.getPointerSlice() |
||||||
|
if sps != nil { |
||||||
|
dps := dst.getPointerSlice() |
||||||
|
for _, sp := range sps { |
||||||
|
var dp pointer |
||||||
|
if !sp.isNil() { |
||||||
|
dp = valToPointer(reflect.New(tf)) |
||||||
|
mi.merge(dp, sp) |
||||||
|
} |
||||||
|
dps = append(dps, dp) |
||||||
|
} |
||||||
|
if dps == nil { |
||||||
|
dps = []pointer{} |
||||||
|
} |
||||||
|
dst.setPointerSlice(dps) |
||||||
|
} |
||||||
|
} |
||||||
|
default: // E.g., *pb.T
|
||||||
|
mi := getMergeInfo(tf) |
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
sp := src.getPointer() |
||||||
|
if !sp.isNil() { |
||||||
|
dp := dst.getPointer() |
||||||
|
if dp.isNil() { |
||||||
|
dp = valToPointer(reflect.New(tf)) |
||||||
|
dst.setPointer(dp) |
||||||
|
} |
||||||
|
mi.merge(dp, sp) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case reflect.Map: |
||||||
|
switch { |
||||||
|
case isPointer || isSlice: |
||||||
|
panic("bad pointer or slice in map case in " + tf.Name()) |
||||||
|
default: // E.g., map[K]V
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
sm := src.asPointerTo(tf).Elem() |
||||||
|
if sm.Len() == 0 { |
||||||
|
return |
||||||
|
} |
||||||
|
dm := dst.asPointerTo(tf).Elem() |
||||||
|
if dm.IsNil() { |
||||||
|
dm.Set(reflect.MakeMap(tf)) |
||||||
|
} |
||||||
|
|
||||||
|
switch tf.Elem().Kind() { |
||||||
|
case reflect.Ptr: // Proto struct (e.g., *T)
|
||||||
|
for _, key := range sm.MapKeys() { |
||||||
|
val := sm.MapIndex(key) |
||||||
|
val = reflect.ValueOf(Clone(val.Interface().(Message))) |
||||||
|
dm.SetMapIndex(key, val) |
||||||
|
} |
||||||
|
case reflect.Slice: // E.g. Bytes type (e.g., []byte)
|
||||||
|
for _, key := range sm.MapKeys() { |
||||||
|
val := sm.MapIndex(key) |
||||||
|
val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) |
||||||
|
dm.SetMapIndex(key, val) |
||||||
|
} |
||||||
|
default: // Basic type (e.g., string)
|
||||||
|
for _, key := range sm.MapKeys() { |
||||||
|
val := sm.MapIndex(key) |
||||||
|
dm.SetMapIndex(key, val) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
case reflect.Interface: |
||||||
|
// Must be oneof field.
|
||||||
|
switch { |
||||||
|
case isPointer || isSlice: |
||||||
|
panic("bad pointer or slice in interface case in " + tf.Name()) |
||||||
|
default: // E.g., interface{}
|
||||||
|
// TODO: Make this faster?
|
||||||
|
mfi.merge = func(dst, src pointer) { |
||||||
|
su := src.asPointerTo(tf).Elem() |
||||||
|
if !su.IsNil() { |
||||||
|
du := dst.asPointerTo(tf).Elem() |
||||||
|
typ := su.Elem().Type() |
||||||
|
if du.IsNil() || du.Elem().Type() != typ { |
||||||
|
du.Set(reflect.New(typ.Elem())) // Initialize interface if empty
|
||||||
|
} |
||||||
|
sv := su.Elem().Elem().Field(0) |
||||||
|
if sv.Kind() == reflect.Ptr && sv.IsNil() { |
||||||
|
return |
||||||
|
} |
||||||
|
dv := du.Elem().Elem().Field(0) |
||||||
|
if dv.Kind() == reflect.Ptr && dv.IsNil() { |
||||||
|
dv.Set(reflect.New(sv.Type().Elem())) // Initialize proto message if empty
|
||||||
|
} |
||||||
|
switch sv.Type().Kind() { |
||||||
|
case reflect.Ptr: // Proto struct (e.g., *T)
|
||||||
|
Merge(dv.Interface().(Message), sv.Interface().(Message)) |
||||||
|
case reflect.Slice: // E.g. Bytes type (e.g., []byte)
|
||||||
|
dv.Set(reflect.ValueOf(append([]byte{}, sv.Bytes()...))) |
||||||
|
default: // Basic type (e.g., string)
|
||||||
|
dv.Set(sv) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
default: |
||||||
|
panic(fmt.Sprintf("merger not found for type:%s", tf)) |
||||||
|
} |
||||||
|
mi.fields = append(mi.fields, mfi) |
||||||
|
} |
||||||
|
|
||||||
|
mi.unrecognized = invalidField |
||||||
|
if f, ok := t.FieldByName("XXX_unrecognized"); ok { |
||||||
|
if f.Type != reflect.TypeOf([]byte{}) { |
||||||
|
panic("expected XXX_unrecognized to be of type []byte") |
||||||
|
} |
||||||
|
mi.unrecognized = toField(&f) |
||||||
|
} |
||||||
|
|
||||||
|
atomic.StoreInt32(&mi.initialized, 1) |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -1,36 +0,0 @@ |
|||||||
# Go support for Protocol Buffers - Google's data interchange format
|
|
||||||
#
|
|
||||||
# Copyright 2010 The Go Authors. All rights reserved.
|
|
||||||
# https://github.com/golang/protobuf
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are
|
|
||||||
# met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
# * Redistributions in binary form must reproduce the above
|
|
||||||
# copyright notice, this list of conditions and the following disclaimer
|
|
||||||
# in the documentation and/or other materials provided with the
|
|
||||||
# distribution.
|
|
||||||
# * Neither the name of Google Inc. nor the names of its
|
|
||||||
# contributors may be used to endorse or promote products derived from
|
|
||||||
# this software without specific prior written permission.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
# Not stored here, but descriptor.proto is in https://github.com/google/protobuf/
|
|
||||||
# at src/google/protobuf/descriptor.proto
|
|
||||||
regenerate: |
|
||||||
@echo WARNING! THIS RULE IS PROBABLY NOT RIGHT FOR YOUR INSTALLATION
|
|
||||||
protoc --go_out=../../../../.. -I$(HOME)/src/protobuf/include $(HOME)/src/protobuf/include/google/protobuf/descriptor.proto
|
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,883 @@ |
|||||||
|
// Protocol Buffers - Google's data interchange format |
||||||
|
// Copyright 2008 Google Inc. All rights reserved. |
||||||
|
// https://developers.google.com/protocol-buffers/ |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
// Author: kenton@google.com (Kenton Varda) |
||||||
|
// Based on original Protocol Buffers design by |
||||||
|
// Sanjay Ghemawat, Jeff Dean, and others. |
||||||
|
// |
||||||
|
// The messages in this file describe the definitions found in .proto files. |
||||||
|
// A valid .proto file can be translated directly to a FileDescriptorProto |
||||||
|
// without any other information (e.g. without reading its imports). |
||||||
|
|
||||||
|
|
||||||
|
syntax = "proto2"; |
||||||
|
|
||||||
|
package google.protobuf; |
||||||
|
option go_package = "github.com/golang/protobuf/protoc-gen-go/descriptor;descriptor"; |
||||||
|
option java_package = "com.google.protobuf"; |
||||||
|
option java_outer_classname = "DescriptorProtos"; |
||||||
|
option csharp_namespace = "Google.Protobuf.Reflection"; |
||||||
|
option objc_class_prefix = "GPB"; |
||||||
|
option cc_enable_arenas = true; |
||||||
|
|
||||||
|
// descriptor.proto must be optimized for speed because reflection-based |
||||||
|
// algorithms don't work during bootstrapping. |
||||||
|
option optimize_for = SPEED; |
||||||
|
|
||||||
|
// The protocol compiler can output a FileDescriptorSet containing the .proto |
||||||
|
// files it parses. |
||||||
|
message FileDescriptorSet { |
||||||
|
repeated FileDescriptorProto file = 1; |
||||||
|
} |
||||||
|
|
||||||
|
// Describes a complete .proto file. |
||||||
|
message FileDescriptorProto { |
||||||
|
optional string name = 1; // file name, relative to root of source tree |
||||||
|
optional string package = 2; // e.g. "foo", "foo.bar", etc. |
||||||
|
|
||||||
|
// Names of files imported by this file. |
||||||
|
repeated string dependency = 3; |
||||||
|
// Indexes of the public imported files in the dependency list above. |
||||||
|
repeated int32 public_dependency = 10; |
||||||
|
// Indexes of the weak imported files in the dependency list. |
||||||
|
// For Google-internal migration only. Do not use. |
||||||
|
repeated int32 weak_dependency = 11; |
||||||
|
|
||||||
|
// All top-level definitions in this file. |
||||||
|
repeated DescriptorProto message_type = 4; |
||||||
|
repeated EnumDescriptorProto enum_type = 5; |
||||||
|
repeated ServiceDescriptorProto service = 6; |
||||||
|
repeated FieldDescriptorProto extension = 7; |
||||||
|
|
||||||
|
optional FileOptions options = 8; |
||||||
|
|
||||||
|
// This field contains optional information about the original source code. |
||||||
|
// You may safely remove this entire field without harming runtime |
||||||
|
// functionality of the descriptors -- the information is needed only by |
||||||
|
// development tools. |
||||||
|
optional SourceCodeInfo source_code_info = 9; |
||||||
|
|
||||||
|
// The syntax of the proto file. |
||||||
|
// The supported values are "proto2" and "proto3". |
||||||
|
optional string syntax = 12; |
||||||
|
} |
||||||
|
|
||||||
|
// Describes a message type. |
||||||
|
message DescriptorProto { |
||||||
|
optional string name = 1; |
||||||
|
|
||||||
|
repeated FieldDescriptorProto field = 2; |
||||||
|
repeated FieldDescriptorProto extension = 6; |
||||||
|
|
||||||
|
repeated DescriptorProto nested_type = 3; |
||||||
|
repeated EnumDescriptorProto enum_type = 4; |
||||||
|
|
||||||
|
message ExtensionRange { |
||||||
|
optional int32 start = 1; |
||||||
|
optional int32 end = 2; |
||||||
|
|
||||||
|
optional ExtensionRangeOptions options = 3; |
||||||
|
} |
||||||
|
repeated ExtensionRange extension_range = 5; |
||||||
|
|
||||||
|
repeated OneofDescriptorProto oneof_decl = 8; |
||||||
|
|
||||||
|
optional MessageOptions options = 7; |
||||||
|
|
||||||
|
// Range of reserved tag numbers. Reserved tag numbers may not be used by |
||||||
|
// fields or extension ranges in the same message. Reserved ranges may |
||||||
|
// not overlap. |
||||||
|
message ReservedRange { |
||||||
|
optional int32 start = 1; // Inclusive. |
||||||
|
optional int32 end = 2; // Exclusive. |
||||||
|
} |
||||||
|
repeated ReservedRange reserved_range = 9; |
||||||
|
// Reserved field names, which may not be used by fields in the same message. |
||||||
|
// A given name may only be reserved once. |
||||||
|
repeated string reserved_name = 10; |
||||||
|
} |
||||||
|
|
||||||
|
message ExtensionRangeOptions { |
||||||
|
// The parser stores options it doesn't recognize here. See above. |
||||||
|
repeated UninterpretedOption uninterpreted_option = 999; |
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above. |
||||||
|
extensions 1000 to max; |
||||||
|
} |
||||||
|
|
||||||
|
// Describes a field within a message. |
||||||
|
message FieldDescriptorProto { |
||||||
|
enum Type { |
||||||
|
// 0 is reserved for errors. |
||||||
|
// Order is weird for historical reasons. |
||||||
|
TYPE_DOUBLE = 1; |
||||||
|
TYPE_FLOAT = 2; |
||||||
|
// Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if |
||||||
|
// negative values are likely. |
||||||
|
TYPE_INT64 = 3; |
||||||
|
TYPE_UINT64 = 4; |
||||||
|
// Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if |
||||||
|
// negative values are likely. |
||||||
|
TYPE_INT32 = 5; |
||||||
|
TYPE_FIXED64 = 6; |
||||||
|
TYPE_FIXED32 = 7; |
||||||
|
TYPE_BOOL = 8; |
||||||
|
TYPE_STRING = 9; |
||||||
|
// Tag-delimited aggregate. |
||||||
|
// Group type is deprecated and not supported in proto3. However, Proto3 |
||||||
|
// implementations should still be able to parse the group wire format and |
||||||
|
// treat group fields as unknown fields. |
||||||
|
TYPE_GROUP = 10; |
||||||
|
TYPE_MESSAGE = 11; // Length-delimited aggregate. |
||||||
|
|
||||||
|
// New in version 2. |
||||||
|
TYPE_BYTES = 12; |
||||||
|
TYPE_UINT32 = 13; |
||||||
|
TYPE_ENUM = 14; |
||||||
|
TYPE_SFIXED32 = 15; |
||||||
|
TYPE_SFIXED64 = 16; |
||||||
|
TYPE_SINT32 = 17; // Uses ZigZag encoding. |
||||||
|
TYPE_SINT64 = 18; // Uses ZigZag encoding. |
||||||
|
}; |
||||||
|
|
||||||
|
enum Label { |
||||||
|
// 0 is reserved for errors |
||||||
|
LABEL_OPTIONAL = 1; |
||||||
|
LABEL_REQUIRED = 2; |
||||||
|
LABEL_REPEATED = 3; |
||||||
|
}; |
||||||
|
|
||||||
|
optional string name = 1; |
||||||
|
optional int32 number = 3; |
||||||
|
optional Label label = 4; |
||||||
|
|
||||||
|
// If type_name is set, this need not be set. If both this and type_name |
||||||
|
// are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. |
||||||
|
optional Type type = 5; |
||||||
|
|
||||||
|
// For message and enum types, this is the name of the type. If the name |
||||||
|
// starts with a '.', it is fully-qualified. Otherwise, C++-like scoping |
||||||
|
// rules are used to find the type (i.e. first the nested types within this |
||||||
|
// message are searched, then within the parent, on up to the root |
||||||
|
// namespace). |
||||||
|
optional string type_name = 6; |
||||||
|
|
||||||
|
// For extensions, this is the name of the type being extended. It is |
||||||
|
// resolved in the same manner as type_name. |
||||||
|
optional string extendee = 2; |
||||||
|
|
||||||
|
// For numeric types, contains the original text representation of the value. |
||||||
|
// For booleans, "true" or "false". |
||||||
|
// For strings, contains the default text contents (not escaped in any way). |
||||||
|
// For bytes, contains the C escaped value. All bytes >= 128 are escaped. |
||||||
|
// TODO(kenton): Base-64 encode? |
||||||
|
optional string default_value = 7; |
||||||
|
|
||||||
|
// If set, gives the index of a oneof in the containing type's oneof_decl |
||||||
|
// list. This field is a member of that oneof. |
||||||
|
optional int32 oneof_index = 9; |
||||||
|
|
||||||
|
// JSON name of this field. The value is set by protocol compiler. If the |
||||||
|
// user has set a "json_name" option on this field, that option's value |
||||||
|
// will be used. Otherwise, it's deduced from the field's name by converting |
||||||
|
// it to camelCase. |
||||||
|
optional string json_name = 10; |
||||||
|
|
||||||
|
optional FieldOptions options = 8; |
||||||
|
} |
||||||
|
|
||||||
|
// Describes a oneof. |
||||||
|
message OneofDescriptorProto { |
||||||
|
optional string name = 1; |
||||||
|
optional OneofOptions options = 2; |
||||||
|
} |
||||||
|
|
||||||
|
// Describes an enum type. |
||||||
|
message EnumDescriptorProto { |
||||||
|
optional string name = 1; |
||||||
|
|
||||||
|
repeated EnumValueDescriptorProto value = 2; |
||||||
|
|
||||||
|
optional EnumOptions options = 3; |
||||||
|
|
||||||
|
// Range of reserved numeric values. Reserved values may not be used by |
||||||
|
// entries in the same enum. Reserved ranges may not overlap. |
||||||
|
// |
||||||
|
// Note that this is distinct from DescriptorProto.ReservedRange in that it |
||||||
|
// is inclusive such that it can appropriately represent the entire int32 |
||||||
|
// domain. |
||||||
|
message EnumReservedRange { |
||||||
|
optional int32 start = 1; // Inclusive. |
||||||
|
optional int32 end = 2; // Inclusive. |
||||||
|
} |
||||||
|
|
||||||
|
// Range of reserved numeric values. Reserved numeric values may not be used |
||||||
|
// by enum values in the same enum declaration. Reserved ranges may not |
||||||
|
// overlap. |
||||||
|
repeated EnumReservedRange reserved_range = 4; |
||||||
|
|
||||||
|
// Reserved enum value names, which may not be reused. A given name may only |
||||||
|
// be reserved once. |
||||||
|
repeated string reserved_name = 5; |
||||||
|
} |
||||||
|
|
||||||
|
// Describes a value within an enum. |
||||||
|
message EnumValueDescriptorProto { |
||||||
|
optional string name = 1; |
||||||
|
optional int32 number = 2; |
||||||
|
|
||||||
|
optional EnumValueOptions options = 3; |
||||||
|
} |
||||||
|
|
||||||
|
// Describes a service. |
||||||
|
message ServiceDescriptorProto { |
||||||
|
optional string name = 1; |
||||||
|
repeated MethodDescriptorProto method = 2; |
||||||
|
|
||||||
|
optional ServiceOptions options = 3; |
||||||
|
} |
||||||
|
|
||||||
|
// Describes a method of a service. |
||||||
|
message MethodDescriptorProto { |
||||||
|
optional string name = 1; |
||||||
|
|
||||||
|
// Input and output type names. These are resolved in the same way as |
||||||
|
// FieldDescriptorProto.type_name, but must refer to a message type. |
||||||
|
optional string input_type = 2; |
||||||
|
optional string output_type = 3; |
||||||
|
|
||||||
|
optional MethodOptions options = 4; |
||||||
|
|
||||||
|
// Identifies if client streams multiple client messages |
||||||
|
optional bool client_streaming = 5 [default=false]; |
||||||
|
// Identifies if server streams multiple server messages |
||||||
|
optional bool server_streaming = 6 [default=false]; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// =================================================================== |
||||||
|
// Options |
||||||
|
|
||||||
|
// Each of the definitions above may have "options" attached. These are |
||||||
|
// just annotations which may cause code to be generated slightly differently |
||||||
|
// or may contain hints for code that manipulates protocol messages. |
||||||
|
// |
||||||
|
// Clients may define custom options as extensions of the *Options messages. |
||||||
|
// These extensions may not yet be known at parsing time, so the parser cannot |
||||||
|
// store the values in them. Instead it stores them in a field in the *Options |
||||||
|
// message called uninterpreted_option. This field must have the same name |
||||||
|
// across all *Options messages. We then use this field to populate the |
||||||
|
// extensions when we build a descriptor, at which point all protos have been |
||||||
|
// parsed and so all extensions are known. |
||||||
|
// |
||||||
|
// Extension numbers for custom options may be chosen as follows: |
||||||
|
// * For options which will only be used within a single application or |
||||||
|
// organization, or for experimental options, use field numbers 50000 |
||||||
|
// through 99999. It is up to you to ensure that you do not use the |
||||||
|
// same number for multiple options. |
||||||
|
// * For options which will be published and used publicly by multiple |
||||||
|
// independent entities, e-mail protobuf-global-extension-registry@google.com |
||||||
|
// to reserve extension numbers. Simply provide your project name (e.g. |
||||||
|
// Objective-C plugin) and your project website (if available) -- there's no |
||||||
|
// need to explain how you intend to use them. Usually you only need one |
||||||
|
// extension number. You can declare multiple options with only one extension |
||||||
|
// number by putting them in a sub-message. See the Custom Options section of |
||||||
|
// the docs for examples: |
||||||
|
// https://developers.google.com/protocol-buffers/docs/proto#options |
||||||
|
// If this turns out to be popular, a web service will be set up |
||||||
|
// to automatically assign option numbers. |
||||||
|
|
||||||
|
|
||||||
|
message FileOptions { |
||||||
|
|
||||||
|
// Sets the Java package where classes generated from this .proto will be |
||||||
|
// placed. By default, the proto package is used, but this is often |
||||||
|
// inappropriate because proto packages do not normally start with backwards |
||||||
|
// domain names. |
||||||
|
optional string java_package = 1; |
||||||
|
|
||||||
|
|
||||||
|
// If set, all the classes from the .proto file are wrapped in a single |
||||||
|
// outer class with the given name. This applies to both Proto1 |
||||||
|
// (equivalent to the old "--one_java_file" option) and Proto2 (where |
||||||
|
// a .proto always translates to a single class, but you may want to |
||||||
|
// explicitly choose the class name). |
||||||
|
optional string java_outer_classname = 8; |
||||||
|
|
||||||
|
// If set true, then the Java code generator will generate a separate .java |
||||||
|
// file for each top-level message, enum, and service defined in the .proto |
||||||
|
// file. Thus, these types will *not* be nested inside the outer class |
||||||
|
// named by java_outer_classname. However, the outer class will still be |
||||||
|
// generated to contain the file's getDescriptor() method as well as any |
||||||
|
// top-level extensions defined in the file. |
||||||
|
optional bool java_multiple_files = 10 [default=false]; |
||||||
|
|
||||||
|
// This option does nothing. |
||||||
|
optional bool java_generate_equals_and_hash = 20 [deprecated=true]; |
||||||
|
|
||||||
|
// If set true, then the Java2 code generator will generate code that |
||||||
|
// throws an exception whenever an attempt is made to assign a non-UTF-8 |
||||||
|
// byte sequence to a string field. |
||||||
|
// Message reflection will do the same. |
||||||
|
// However, an extension field still accepts non-UTF-8 byte sequences. |
||||||
|
// This option has no effect on when used with the lite runtime. |
||||||
|
optional bool java_string_check_utf8 = 27 [default=false]; |
||||||
|
|
||||||
|
|
||||||
|
// Generated classes can be optimized for speed or code size. |
||||||
|
enum OptimizeMode { |
||||||
|
SPEED = 1; // Generate complete code for parsing, serialization, |
||||||
|
// etc. |
||||||
|
CODE_SIZE = 2; // Use ReflectionOps to implement these methods. |
||||||
|
LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. |
||||||
|
} |
||||||
|
optional OptimizeMode optimize_for = 9 [default=SPEED]; |
||||||
|
|
||||||
|
// Sets the Go package where structs generated from this .proto will be |
||||||
|
// placed. If omitted, the Go package will be derived from the following: |
||||||
|
// - The basename of the package import path, if provided. |
||||||
|
// - Otherwise, the package statement in the .proto file, if present. |
||||||
|
// - Otherwise, the basename of the .proto file, without extension. |
||||||
|
optional string go_package = 11; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Should generic services be generated in each language? "Generic" services |
||||||
|
// are not specific to any particular RPC system. They are generated by the |
||||||
|
// main code generators in each language (without additional plugins). |
||||||
|
// Generic services were the only kind of service generation supported by |
||||||
|
// early versions of google.protobuf. |
||||||
|
// |
||||||
|
// Generic services are now considered deprecated in favor of using plugins |
||||||
|
// that generate code specific to your particular RPC system. Therefore, |
||||||
|
// these default to false. Old code which depends on generic services should |
||||||
|
// explicitly set them to true. |
||||||
|
optional bool cc_generic_services = 16 [default=false]; |
||||||
|
optional bool java_generic_services = 17 [default=false]; |
||||||
|
optional bool py_generic_services = 18 [default=false]; |
||||||
|
optional bool php_generic_services = 42 [default=false]; |
||||||
|
|
||||||
|
// Is this file deprecated? |
||||||
|
// Depending on the target platform, this can emit Deprecated annotations |
||||||
|
// for everything in the file, or it will be completely ignored; in the very |
||||||
|
// least, this is a formalization for deprecating files. |
||||||
|
optional bool deprecated = 23 [default=false]; |
||||||
|
|
||||||
|
// Enables the use of arenas for the proto messages in this file. This applies |
||||||
|
// only to generated classes for C++. |
||||||
|
optional bool cc_enable_arenas = 31 [default=false]; |
||||||
|
|
||||||
|
|
||||||
|
// Sets the objective c class prefix which is prepended to all objective c |
||||||
|
// generated classes from this .proto. There is no default. |
||||||
|
optional string objc_class_prefix = 36; |
||||||
|
|
||||||
|
// Namespace for generated classes; defaults to the package. |
||||||
|
optional string csharp_namespace = 37; |
||||||
|
|
||||||
|
// By default Swift generators will take the proto package and CamelCase it |
||||||
|
// replacing '.' with underscore and use that to prefix the types/symbols |
||||||
|
// defined. When this options is provided, they will use this value instead |
||||||
|
// to prefix the types/symbols defined. |
||||||
|
optional string swift_prefix = 39; |
||||||
|
|
||||||
|
// Sets the php class prefix which is prepended to all php generated classes |
||||||
|
// from this .proto. Default is empty. |
||||||
|
optional string php_class_prefix = 40; |
||||||
|
|
||||||
|
// Use this option to change the namespace of php generated classes. Default |
||||||
|
// is empty. When this option is empty, the package name will be used for |
||||||
|
// determining the namespace. |
||||||
|
optional string php_namespace = 41; |
||||||
|
|
||||||
|
|
||||||
|
// Use this option to change the namespace of php generated metadata classes. |
||||||
|
// Default is empty. When this option is empty, the proto file name will be used |
||||||
|
// for determining the namespace. |
||||||
|
optional string php_metadata_namespace = 44; |
||||||
|
|
||||||
|
// Use this option to change the package of ruby generated classes. Default |
||||||
|
// is empty. When this option is not set, the package name will be used for |
||||||
|
// determining the ruby package. |
||||||
|
optional string ruby_package = 45; |
||||||
|
|
||||||
|
// The parser stores options it doesn't recognize here. |
||||||
|
// See the documentation for the "Options" section above. |
||||||
|
repeated UninterpretedOption uninterpreted_option = 999; |
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. |
||||||
|
// See the documentation for the "Options" section above. |
||||||
|
extensions 1000 to max; |
||||||
|
|
||||||
|
reserved 38; |
||||||
|
} |
||||||
|
|
||||||
|
message MessageOptions { |
||||||
|
// Set true to use the old proto1 MessageSet wire format for extensions. |
||||||
|
// This is provided for backwards-compatibility with the MessageSet wire |
||||||
|
// format. You should not use this for any other reason: It's less |
||||||
|
// efficient, has fewer features, and is more complicated. |
||||||
|
// |
||||||
|
// The message must be defined exactly as follows: |
||||||
|
// message Foo { |
||||||
|
// option message_set_wire_format = true; |
||||||
|
// extensions 4 to max; |
||||||
|
// } |
||||||
|
// Note that the message cannot have any defined fields; MessageSets only |
||||||
|
// have extensions. |
||||||
|
// |
||||||
|
// All extensions of your type must be singular messages; e.g. they cannot |
||||||
|
// be int32s, enums, or repeated messages. |
||||||
|
// |
||||||
|
// Because this is an option, the above two restrictions are not enforced by |
||||||
|
// the protocol compiler. |
||||||
|
optional bool message_set_wire_format = 1 [default=false]; |
||||||
|
|
||||||
|
// Disables the generation of the standard "descriptor()" accessor, which can |
||||||
|
// conflict with a field of the same name. This is meant to make migration |
||||||
|
// from proto1 easier; new code should avoid fields named "descriptor". |
||||||
|
optional bool no_standard_descriptor_accessor = 2 [default=false]; |
||||||
|
|
||||||
|
// Is this message deprecated? |
||||||
|
// Depending on the target platform, this can emit Deprecated annotations |
||||||
|
// for the message, or it will be completely ignored; in the very least, |
||||||
|
// this is a formalization for deprecating messages. |
||||||
|
optional bool deprecated = 3 [default=false]; |
||||||
|
|
||||||
|
// Whether the message is an automatically generated map entry type for the |
||||||
|
// maps field. |
||||||
|
// |
||||||
|
// For maps fields: |
||||||
|
// map<KeyType, ValueType> map_field = 1; |
||||||
|
// The parsed descriptor looks like: |
||||||
|
// message MapFieldEntry { |
||||||
|
// option map_entry = true; |
||||||
|
// optional KeyType key = 1; |
||||||
|
// optional ValueType value = 2; |
||||||
|
// } |
||||||
|
// repeated MapFieldEntry map_field = 1; |
||||||
|
// |
||||||
|
// Implementations may choose not to generate the map_entry=true message, but |
||||||
|
// use a native map in the target language to hold the keys and values. |
||||||
|
// The reflection APIs in such implementions still need to work as |
||||||
|
// if the field is a repeated message field. |
||||||
|
// |
||||||
|
// NOTE: Do not set the option in .proto files. Always use the maps syntax |
||||||
|
// instead. The option should only be implicitly set by the proto compiler |
||||||
|
// parser. |
||||||
|
optional bool map_entry = 7; |
||||||
|
|
||||||
|
reserved 8; // javalite_serializable |
||||||
|
reserved 9; // javanano_as_lite |
||||||
|
|
||||||
|
// The parser stores options it doesn't recognize here. See above. |
||||||
|
repeated UninterpretedOption uninterpreted_option = 999; |
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above. |
||||||
|
extensions 1000 to max; |
||||||
|
} |
||||||
|
|
||||||
|
message FieldOptions { |
||||||
|
// The ctype option instructs the C++ code generator to use a different |
||||||
|
// representation of the field than it normally would. See the specific |
||||||
|
// options below. This option is not yet implemented in the open source |
||||||
|
// release -- sorry, we'll try to include it in a future version! |
||||||
|
optional CType ctype = 1 [default = STRING]; |
||||||
|
enum CType { |
||||||
|
// Default mode. |
||||||
|
STRING = 0; |
||||||
|
|
||||||
|
CORD = 1; |
||||||
|
|
||||||
|
STRING_PIECE = 2; |
||||||
|
} |
||||||
|
// The packed option can be enabled for repeated primitive fields to enable |
||||||
|
// a more efficient representation on the wire. Rather than repeatedly |
||||||
|
// writing the tag and type for each element, the entire array is encoded as |
||||||
|
// a single length-delimited blob. In proto3, only explicit setting it to |
||||||
|
// false will avoid using packed encoding. |
||||||
|
optional bool packed = 2; |
||||||
|
|
||||||
|
// The jstype option determines the JavaScript type used for values of the |
||||||
|
// field. The option is permitted only for 64 bit integral and fixed types |
||||||
|
// (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING |
||||||
|
// is represented as JavaScript string, which avoids loss of precision that |
||||||
|
// can happen when a large value is converted to a floating point JavaScript. |
||||||
|
// Specifying JS_NUMBER for the jstype causes the generated JavaScript code to |
||||||
|
// use the JavaScript "number" type. The behavior of the default option |
||||||
|
// JS_NORMAL is implementation dependent. |
||||||
|
// |
||||||
|
// This option is an enum to permit additional types to be added, e.g. |
||||||
|
// goog.math.Integer. |
||||||
|
optional JSType jstype = 6 [default = JS_NORMAL]; |
||||||
|
enum JSType { |
||||||
|
// Use the default type. |
||||||
|
JS_NORMAL = 0; |
||||||
|
|
||||||
|
// Use JavaScript strings. |
||||||
|
JS_STRING = 1; |
||||||
|
|
||||||
|
// Use JavaScript numbers. |
||||||
|
JS_NUMBER = 2; |
||||||
|
} |
||||||
|
|
||||||
|
// Should this field be parsed lazily? Lazy applies only to message-type |
||||||
|
// fields. It means that when the outer message is initially parsed, the |
||||||
|
// inner message's contents will not be parsed but instead stored in encoded |
||||||
|
// form. The inner message will actually be parsed when it is first accessed. |
||||||
|
// |
||||||
|
// This is only a hint. Implementations are free to choose whether to use |
||||||
|
// eager or lazy parsing regardless of the value of this option. However, |
||||||
|
// setting this option true suggests that the protocol author believes that |
||||||
|
// using lazy parsing on this field is worth the additional bookkeeping |
||||||
|
// overhead typically needed to implement it. |
||||||
|
// |
||||||
|
// This option does not affect the public interface of any generated code; |
||||||
|
// all method signatures remain the same. Furthermore, thread-safety of the |
||||||
|
// interface is not affected by this option; const methods remain safe to |
||||||
|
// call from multiple threads concurrently, while non-const methods continue |
||||||
|
// to require exclusive access. |
||||||
|
// |
||||||
|
// |
||||||
|
// Note that implementations may choose not to check required fields within |
||||||
|
// a lazy sub-message. That is, calling IsInitialized() on the outer message |
||||||
|
// may return true even if the inner message has missing required fields. |
||||||
|
// This is necessary because otherwise the inner message would have to be |
||||||
|
// parsed in order to perform the check, defeating the purpose of lazy |
||||||
|
// parsing. An implementation which chooses not to check required fields |
||||||
|
// must be consistent about it. That is, for any particular sub-message, the |
||||||
|
// implementation must either *always* check its required fields, or *never* |
||||||
|
// check its required fields, regardless of whether or not the message has |
||||||
|
// been parsed. |
||||||
|
optional bool lazy = 5 [default=false]; |
||||||
|
|
||||||
|
// Is this field deprecated? |
||||||
|
// Depending on the target platform, this can emit Deprecated annotations |
||||||
|
// for accessors, or it will be completely ignored; in the very least, this |
||||||
|
// is a formalization for deprecating fields. |
||||||
|
optional bool deprecated = 3 [default=false]; |
||||||
|
|
||||||
|
// For Google-internal migration only. Do not use. |
||||||
|
optional bool weak = 10 [default=false]; |
||||||
|
|
||||||
|
|
||||||
|
// The parser stores options it doesn't recognize here. See above. |
||||||
|
repeated UninterpretedOption uninterpreted_option = 999; |
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above. |
||||||
|
extensions 1000 to max; |
||||||
|
|
||||||
|
reserved 4; // removed jtype |
||||||
|
} |
||||||
|
|
||||||
|
message OneofOptions { |
||||||
|
// The parser stores options it doesn't recognize here. See above. |
||||||
|
repeated UninterpretedOption uninterpreted_option = 999; |
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above. |
||||||
|
extensions 1000 to max; |
||||||
|
} |
||||||
|
|
||||||
|
message EnumOptions { |
||||||
|
|
||||||
|
// Set this option to true to allow mapping different tag names to the same |
||||||
|
// value. |
||||||
|
optional bool allow_alias = 2; |
||||||
|
|
||||||
|
// Is this enum deprecated? |
||||||
|
// Depending on the target platform, this can emit Deprecated annotations |
||||||
|
// for the enum, or it will be completely ignored; in the very least, this |
||||||
|
// is a formalization for deprecating enums. |
||||||
|
optional bool deprecated = 3 [default=false]; |
||||||
|
|
||||||
|
reserved 5; // javanano_as_lite |
||||||
|
|
||||||
|
// The parser stores options it doesn't recognize here. See above. |
||||||
|
repeated UninterpretedOption uninterpreted_option = 999; |
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above. |
||||||
|
extensions 1000 to max; |
||||||
|
} |
||||||
|
|
||||||
|
message EnumValueOptions { |
||||||
|
// Is this enum value deprecated? |
||||||
|
// Depending on the target platform, this can emit Deprecated annotations |
||||||
|
// for the enum value, or it will be completely ignored; in the very least, |
||||||
|
// this is a formalization for deprecating enum values. |
||||||
|
optional bool deprecated = 1 [default=false]; |
||||||
|
|
||||||
|
// The parser stores options it doesn't recognize here. See above. |
||||||
|
repeated UninterpretedOption uninterpreted_option = 999; |
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above. |
||||||
|
extensions 1000 to max; |
||||||
|
} |
||||||
|
|
||||||
|
message ServiceOptions { |
||||||
|
|
||||||
|
// Note: Field numbers 1 through 32 are reserved for Google's internal RPC |
||||||
|
// framework. We apologize for hoarding these numbers to ourselves, but |
||||||
|
// we were already using them long before we decided to release Protocol |
||||||
|
// Buffers. |
||||||
|
|
||||||
|
// Is this service deprecated? |
||||||
|
// Depending on the target platform, this can emit Deprecated annotations |
||||||
|
// for the service, or it will be completely ignored; in the very least, |
||||||
|
// this is a formalization for deprecating services. |
||||||
|
optional bool deprecated = 33 [default=false]; |
||||||
|
|
||||||
|
// The parser stores options it doesn't recognize here. See above. |
||||||
|
repeated UninterpretedOption uninterpreted_option = 999; |
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above. |
||||||
|
extensions 1000 to max; |
||||||
|
} |
||||||
|
|
||||||
|
message MethodOptions { |
||||||
|
|
||||||
|
// Note: Field numbers 1 through 32 are reserved for Google's internal RPC |
||||||
|
// framework. We apologize for hoarding these numbers to ourselves, but |
||||||
|
// we were already using them long before we decided to release Protocol |
||||||
|
// Buffers. |
||||||
|
|
||||||
|
// Is this method deprecated? |
||||||
|
// Depending on the target platform, this can emit Deprecated annotations |
||||||
|
// for the method, or it will be completely ignored; in the very least, |
||||||
|
// this is a formalization for deprecating methods. |
||||||
|
optional bool deprecated = 33 [default=false]; |
||||||
|
|
||||||
|
// Is this method side-effect-free (or safe in HTTP parlance), or idempotent, |
||||||
|
// or neither? HTTP based RPC implementation may choose GET verb for safe |
||||||
|
// methods, and PUT verb for idempotent methods instead of the default POST. |
||||||
|
enum IdempotencyLevel { |
||||||
|
IDEMPOTENCY_UNKNOWN = 0; |
||||||
|
NO_SIDE_EFFECTS = 1; // implies idempotent |
||||||
|
IDEMPOTENT = 2; // idempotent, but may have side effects |
||||||
|
} |
||||||
|
optional IdempotencyLevel idempotency_level = |
||||||
|
34 [default=IDEMPOTENCY_UNKNOWN]; |
||||||
|
|
||||||
|
// The parser stores options it doesn't recognize here. See above. |
||||||
|
repeated UninterpretedOption uninterpreted_option = 999; |
||||||
|
|
||||||
|
// Clients can define custom options in extensions of this message. See above. |
||||||
|
extensions 1000 to max; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// A message representing a option the parser does not recognize. This only |
||||||
|
// appears in options protos created by the compiler::Parser class. |
||||||
|
// DescriptorPool resolves these when building Descriptor objects. Therefore, |
||||||
|
// options protos in descriptor objects (e.g. returned by Descriptor::options(), |
||||||
|
// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions |
||||||
|
// in them. |
||||||
|
message UninterpretedOption { |
||||||
|
// The name of the uninterpreted option. Each string represents a segment in |
||||||
|
// a dot-separated name. is_extension is true iff a segment represents an |
||||||
|
// extension (denoted with parentheses in options specs in .proto files). |
||||||
|
// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents |
||||||
|
// "foo.(bar.baz).qux". |
||||||
|
message NamePart { |
||||||
|
required string name_part = 1; |
||||||
|
required bool is_extension = 2; |
||||||
|
} |
||||||
|
repeated NamePart name = 2; |
||||||
|
|
||||||
|
// The value of the uninterpreted option, in whatever type the tokenizer |
||||||
|
// identified it as during parsing. Exactly one of these should be set. |
||||||
|
optional string identifier_value = 3; |
||||||
|
optional uint64 positive_int_value = 4; |
||||||
|
optional int64 negative_int_value = 5; |
||||||
|
optional double double_value = 6; |
||||||
|
optional bytes string_value = 7; |
||||||
|
optional string aggregate_value = 8; |
||||||
|
} |
||||||
|
|
||||||
|
// =================================================================== |
||||||
|
// Optional source code info |
||||||
|
|
||||||
|
// Encapsulates information about the original source file from which a |
||||||
|
// FileDescriptorProto was generated. |
||||||
|
message SourceCodeInfo { |
||||||
|
// A Location identifies a piece of source code in a .proto file which |
||||||
|
// corresponds to a particular definition. This information is intended |
||||||
|
// to be useful to IDEs, code indexers, documentation generators, and similar |
||||||
|
// tools. |
||||||
|
// |
||||||
|
// For example, say we have a file like: |
||||||
|
// message Foo { |
||||||
|
// optional string foo = 1; |
||||||
|
// } |
||||||
|
// Let's look at just the field definition: |
||||||
|
// optional string foo = 1; |
||||||
|
// ^ ^^ ^^ ^ ^^^ |
||||||
|
// a bc de f ghi |
||||||
|
// We have the following locations: |
||||||
|
// span path represents |
||||||
|
// [a,i) [ 4, 0, 2, 0 ] The whole field definition. |
||||||
|
// [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). |
||||||
|
// [c,d) [ 4, 0, 2, 0, 5 ] The type (string). |
||||||
|
// [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). |
||||||
|
// [g,h) [ 4, 0, 2, 0, 3 ] The number (1). |
||||||
|
// |
||||||
|
// Notes: |
||||||
|
// - A location may refer to a repeated field itself (i.e. not to any |
||||||
|
// particular index within it). This is used whenever a set of elements are |
||||||
|
// logically enclosed in a single code segment. For example, an entire |
||||||
|
// extend block (possibly containing multiple extension definitions) will |
||||||
|
// have an outer location whose path refers to the "extensions" repeated |
||||||
|
// field without an index. |
||||||
|
// - Multiple locations may have the same path. This happens when a single |
||||||
|
// logical declaration is spread out across multiple places. The most |
||||||
|
// obvious example is the "extend" block again -- there may be multiple |
||||||
|
// extend blocks in the same scope, each of which will have the same path. |
||||||
|
// - A location's span is not always a subset of its parent's span. For |
||||||
|
// example, the "extendee" of an extension declaration appears at the |
||||||
|
// beginning of the "extend" block and is shared by all extensions within |
||||||
|
// the block. |
||||||
|
// - Just because a location's span is a subset of some other location's span |
||||||
|
// does not mean that it is a descendent. For example, a "group" defines |
||||||
|
// both a type and a field in a single declaration. Thus, the locations |
||||||
|
// corresponding to the type and field and their components will overlap. |
||||||
|
// - Code which tries to interpret locations should probably be designed to |
||||||
|
// ignore those that it doesn't understand, as more types of locations could |
||||||
|
// be recorded in the future. |
||||||
|
repeated Location location = 1; |
||||||
|
message Location { |
||||||
|
// Identifies which part of the FileDescriptorProto was defined at this |
||||||
|
// location. |
||||||
|
// |
||||||
|
// Each element is a field number or an index. They form a path from |
||||||
|
// the root FileDescriptorProto to the place where the definition. For |
||||||
|
// example, this path: |
||||||
|
// [ 4, 3, 2, 7, 1 ] |
||||||
|
// refers to: |
||||||
|
// file.message_type(3) // 4, 3 |
||||||
|
// .field(7) // 2, 7 |
||||||
|
// .name() // 1 |
||||||
|
// This is because FileDescriptorProto.message_type has field number 4: |
||||||
|
// repeated DescriptorProto message_type = 4; |
||||||
|
// and DescriptorProto.field has field number 2: |
||||||
|
// repeated FieldDescriptorProto field = 2; |
||||||
|
// and FieldDescriptorProto.name has field number 1: |
||||||
|
// optional string name = 1; |
||||||
|
// |
||||||
|
// Thus, the above path gives the location of a field name. If we removed |
||||||
|
// the last element: |
||||||
|
// [ 4, 3, 2, 7 ] |
||||||
|
// this path refers to the whole field declaration (from the beginning |
||||||
|
// of the label to the terminating semicolon). |
||||||
|
repeated int32 path = 1 [packed=true]; |
||||||
|
|
||||||
|
// Always has exactly three or four elements: start line, start column, |
||||||
|
// end line (optional, otherwise assumed same as start line), end column. |
||||||
|
// These are packed into a single field for efficiency. Note that line |
||||||
|
// and column numbers are zero-based -- typically you will want to add |
||||||
|
// 1 to each before displaying to a user. |
||||||
|
repeated int32 span = 2 [packed=true]; |
||||||
|
|
||||||
|
// If this SourceCodeInfo represents a complete declaration, these are any |
||||||
|
// comments appearing before and after the declaration which appear to be |
||||||
|
// attached to the declaration. |
||||||
|
// |
||||||
|
// A series of line comments appearing on consecutive lines, with no other |
||||||
|
// tokens appearing on those lines, will be treated as a single comment. |
||||||
|
// |
||||||
|
// leading_detached_comments will keep paragraphs of comments that appear |
||||||
|
// before (but not connected to) the current element. Each paragraph, |
||||||
|
// separated by empty lines, will be one comment element in the repeated |
||||||
|
// field. |
||||||
|
// |
||||||
|
// Only the comment content is provided; comment markers (e.g. //) are |
||||||
|
// stripped out. For block comments, leading whitespace and an asterisk |
||||||
|
// will be stripped from the beginning of each line other than the first. |
||||||
|
// Newlines are included in the output. |
||||||
|
// |
||||||
|
// Examples: |
||||||
|
// |
||||||
|
// optional int32 foo = 1; // Comment attached to foo. |
||||||
|
// // Comment attached to bar. |
||||||
|
// optional int32 bar = 2; |
||||||
|
// |
||||||
|
// optional string baz = 3; |
||||||
|
// // Comment attached to baz. |
||||||
|
// // Another line attached to baz. |
||||||
|
// |
||||||
|
// // Comment attached to qux. |
||||||
|
// // |
||||||
|
// // Another line attached to qux. |
||||||
|
// optional double qux = 4; |
||||||
|
// |
||||||
|
// // Detached comment for corge. This is not leading or trailing comments |
||||||
|
// // to qux or corge because there are blank lines separating it from |
||||||
|
// // both. |
||||||
|
// |
||||||
|
// // Detached comment for corge paragraph 2. |
||||||
|
// |
||||||
|
// optional string corge = 5; |
||||||
|
// /* Block comment attached |
||||||
|
// * to corge. Leading asterisks |
||||||
|
// * will be removed. */ |
||||||
|
// /* Block comment attached to |
||||||
|
// * grault. */ |
||||||
|
// optional int32 grault = 6; |
||||||
|
// |
||||||
|
// // ignored detached comments. |
||||||
|
optional string leading_comments = 3; |
||||||
|
optional string trailing_comments = 4; |
||||||
|
repeated string leading_detached_comments = 6; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Describes the relationship between generated code and its original source |
||||||
|
// file. A GeneratedCodeInfo message is associated with only one generated |
||||||
|
// source file, but may contain references to different source .proto files. |
||||||
|
message GeneratedCodeInfo { |
||||||
|
// An Annotation connects some span of text in generated code to an element |
||||||
|
// of its generating .proto file. |
||||||
|
repeated Annotation annotation = 1; |
||||||
|
message Annotation { |
||||||
|
// Identifies the element in the original source .proto file. This field |
||||||
|
// is formatted the same as SourceCodeInfo.Location.path. |
||||||
|
repeated int32 path = 1 [packed=true]; |
||||||
|
|
||||||
|
// Identifies the filesystem path to the original source .proto. |
||||||
|
optional string source_file = 2; |
||||||
|
|
||||||
|
// Identifies the starting offset in bytes in the generated code |
||||||
|
// that relates to the identified object. |
||||||
|
optional int32 begin = 3; |
||||||
|
|
||||||
|
// Identifies the ending offset in bytes in the generated code that |
||||||
|
// relates to the identified offset. The end offset should be one past |
||||||
|
// the last relevant byte (so the length of the text = end - begin). |
||||||
|
optional int32 end = 4; |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue