@@ -78,73 +78,129 @@ func DecodeHashAlgorithm(r BytesReader) (Hash, error) {
78
78
// PayloadEncoding specifies the encoding of the data being (hashed and)
79
79
// signed. A canonical representation of the data is required to produce
80
80
// consistent hashes and signatures.
81
- type PayloadEncoding uint64
81
+ type PayloadEncoding int
82
82
83
83
// Constant values that allow Varsig implementations to specify how the
84
84
// payload content is encoded before being hashed.
85
85
// In varsig >= v1, only canonical encoding is allowed.
86
86
const (
87
- PayloadEncodingUnspecified PayloadEncoding = 0x00
88
- PayloadEncodingVerbatim PayloadEncoding = 0x5f
89
- PayloadEncodingDAGPB = PayloadEncoding (0x70 )
90
- PayloadEncodingDAGCBOR = PayloadEncoding (0x71 )
91
- PayloadEncodingDAGJSON = PayloadEncoding (0x0129 )
92
- PayloadEncodingEIP191 = PayloadEncoding (0xd191 )
93
- PayloadEncodingJWT PayloadEncoding = 0x6a77
87
+ PayloadEncodingUnspecified = PayloadEncoding (iota )
88
+ PayloadEncodingVerbatim
89
+ PayloadEncodingDAGPB
90
+ PayloadEncodingDAGCBOR
91
+ PayloadEncodingDAGJSON
92
+ PayloadEncodingEIP191Raw
93
+ PayloadEncodingEIP191Cbor
94
+ PayloadEncodingJWT
95
+ )
96
+
97
+ const (
98
+ encodingSegmentVerbatim = uint64 (0x5f )
99
+ encodingSegmentDAGPB = uint64 (0x70 )
100
+ encodingSegmentDAGCBOR = uint64 (0x71 )
101
+ encodingSegmentDAGJSON = uint64 (0x0129 )
102
+ encodingSegmentEIP191 = uint64 (0xe191 )
103
+ encodingSegmentJWT = uint64 (0x6a77 )
94
104
)
95
105
96
106
// DecodePayloadEncoding reads and validates the expected canonical payload
97
107
// encoding of the data to be signed.
98
108
func DecodePayloadEncoding (r BytesReader , vers Version ) (PayloadEncoding , error ) {
99
- u , err := binary .ReadUvarint (r )
109
+ seg1 , err := binary .ReadUvarint (r )
100
110
if err != nil {
101
111
return PayloadEncodingUnspecified , fmt .Errorf ("%w: %w" , ErrUnsupportedPayloadEncoding , err )
102
112
}
103
113
104
- payEnc := PayloadEncoding (u )
105
-
106
114
switch vers {
107
115
case Version0 :
108
- return decodeEncodingInfoV0 (payEnc )
116
+ switch seg1 {
117
+ case encodingSegmentVerbatim :
118
+ return PayloadEncodingVerbatim , nil
119
+ case encodingSegmentDAGPB :
120
+ return PayloadEncodingDAGPB , nil
121
+ case encodingSegmentDAGCBOR :
122
+ return PayloadEncodingDAGCBOR , nil
123
+ case encodingSegmentDAGJSON :
124
+ return PayloadEncodingDAGJSON , nil
125
+ case encodingSegmentEIP191 :
126
+ seg2 , err := binary .ReadUvarint (r )
127
+ if err != nil {
128
+ return PayloadEncodingUnspecified , fmt .Errorf ("%w: incomplete EIP191 encoding: %w" , ErrUnsupportedPayloadEncoding , err )
129
+ }
130
+ switch seg2 {
131
+ case encodingSegmentVerbatim :
132
+ return PayloadEncodingEIP191Raw , nil
133
+ case encodingSegmentDAGCBOR :
134
+ return PayloadEncodingEIP191Cbor , nil
135
+ default :
136
+ return PayloadEncodingUnspecified , fmt .Errorf ("%w: version=%d, encoding=%x+%x" , ErrUnsupportedPayloadEncoding , vers , seg1 , seg2 )
137
+ }
138
+ case encodingSegmentJWT :
139
+ return PayloadEncodingJWT , nil
140
+ default :
141
+ return PayloadEncodingUnspecified , fmt .Errorf ("%w: version=%d, encoding=%x" , ErrUnsupportedPayloadEncoding , vers , seg1 )
142
+ }
109
143
case Version1 :
110
- return decodeEncodingInfoV1 (payEnc )
144
+ switch seg1 {
145
+ case encodingSegmentVerbatim :
146
+ return PayloadEncodingVerbatim , nil
147
+ case encodingSegmentDAGCBOR :
148
+ return PayloadEncodingDAGCBOR , nil
149
+ case encodingSegmentDAGJSON :
150
+ return PayloadEncodingDAGJSON , nil
151
+ case encodingSegmentEIP191 :
152
+ seg2 , err := binary .ReadUvarint (r )
153
+ if err != nil {
154
+ return PayloadEncodingUnspecified , fmt .Errorf ("%w: incomplete EIP191 encoding: %w" , ErrUnsupportedPayloadEncoding , err )
155
+ }
156
+ switch seg2 {
157
+ case encodingSegmentVerbatim :
158
+ return PayloadEncodingEIP191Raw , nil
159
+ case encodingSegmentDAGCBOR :
160
+ return PayloadEncodingEIP191Cbor , nil
161
+ default :
162
+ return PayloadEncodingUnspecified , fmt .Errorf ("%w: version=%d, encoding=%x+%x" , ErrUnsupportedPayloadEncoding , vers , seg1 , seg2 )
163
+ }
164
+ default :
165
+ return PayloadEncodingUnspecified , fmt .Errorf ("%w: version=%d, encoding=%x" , ErrUnsupportedPayloadEncoding , vers , seg1 )
166
+ }
111
167
default :
112
168
return 0 , ErrUnsupportedVersion
113
169
}
114
170
}
115
171
116
- // https://github.com/ChainAgnostic/varsig#4-payload-encoding
117
- func decodeEncodingInfoV0 (payEnc PayloadEncoding ) (PayloadEncoding , error ) {
118
- switch payEnc {
119
- case PayloadEncodingVerbatim ,
120
- PayloadEncodingDAGPB ,
121
- PayloadEncodingDAGCBOR ,
122
- PayloadEncodingDAGJSON ,
123
- PayloadEncodingJWT ,
124
- PayloadEncodingEIP191 :
125
- return payEnc , nil
172
+ // EncodePayloadEncoding returns the PayloadEncoding as serialized bytes.
173
+ // If enc is not a valid PayloadEncoding, this function will panic.
174
+ func EncodePayloadEncoding (enc PayloadEncoding ) []byte {
175
+ res := make ([]byte , 0 , 8 )
176
+ switch enc {
177
+ case PayloadEncodingVerbatim :
178
+ res = binary .AppendUvarint (res , encodingSegmentVerbatim )
179
+ case PayloadEncodingDAGPB :
180
+ res = binary .AppendUvarint (res , encodingSegmentDAGPB )
181
+ case PayloadEncodingDAGCBOR :
182
+ res = binary .AppendUvarint (res , encodingSegmentDAGCBOR )
183
+ case PayloadEncodingDAGJSON :
184
+ res = binary .AppendUvarint (res , encodingSegmentDAGJSON )
185
+ case PayloadEncodingEIP191Raw :
186
+ res = binary .AppendUvarint (res , encodingSegmentEIP191 )
187
+ res = binary .AppendUvarint (res , encodingSegmentVerbatim )
188
+ case PayloadEncodingEIP191Cbor :
189
+ res = binary .AppendUvarint (res , encodingSegmentEIP191 )
190
+ res = binary .AppendUvarint (res , encodingSegmentDAGCBOR )
191
+ case PayloadEncodingJWT :
192
+ res = binary .AppendUvarint (res , encodingSegmentJWT )
126
193
default :
127
- return PayloadEncodingUnspecified , fmt .Errorf ( "%w: version=%d, encoding=%x " , ErrUnsupportedPayloadEncoding , Version0 , payEnc )
194
+ panic ( fmt .Sprintf ( "invalid encoding: %v " , enc ) )
128
195
}
129
- }
130
196
131
- // https://github.com/expede/varsig/blob/main/README.md#payload-encoding
132
- func decodeEncodingInfoV1 (payEnc PayloadEncoding ) (PayloadEncoding , error ) {
133
- switch payEnc {
134
- case PayloadEncodingVerbatim ,
135
- PayloadEncodingDAGCBOR ,
136
- PayloadEncodingDAGJSON ,
137
- PayloadEncodingEIP191 :
138
- return payEnc , nil
139
- default :
140
- return PayloadEncodingUnspecified , fmt .Errorf ("%w: version=%d, encoding=%x" , ErrUnsupportedPayloadEncoding , Version1 , payEnc )
141
- }
197
+ return res
142
198
}
143
199
144
200
// Discriminator is (usually) the value representing the public key type of
145
201
// the algorithm used to create the signature.
146
202
//
147
- // There is not set list of constants here, nor is there a decode function
203
+ // There is no set list of constants here, nor is there a decode function
148
204
// as the author of an implementation should include the constant with the
149
205
// implementation, and the decoding is handled by the Handler, which uses
150
206
// the Discriminator to choose the correct implementation. Also note that
0 commit comments