@@ -74,15 +74,15 @@ impl Decode for SignRequest {
74
74
impl Encode for SignRequest {
75
75
fn encoded_len ( & self ) -> ssh_encoding:: Result < usize > {
76
76
[
77
- self . pubkey . encoded_len ( ) ?,
77
+ self . pubkey . encoded_len_prefixed ( ) ?,
78
78
self . data . encoded_len ( ) ?,
79
79
self . flags . encoded_len ( ) ?,
80
80
]
81
81
. checked_sum ( )
82
82
}
83
83
84
84
fn encode ( & self , writer : & mut impl Writer ) -> ssh_encoding:: Result < ( ) > {
85
- self . pubkey . encode ( writer) ?;
85
+ self . pubkey . encode_prefixed ( writer) ?;
86
86
self . data . encode ( writer) ?;
87
87
self . flags . encode ( writer) ?;
88
88
@@ -177,6 +177,16 @@ impl Decode for RemoveIdentity {
177
177
}
178
178
}
179
179
180
+ impl Encode for RemoveIdentity {
181
+ fn encoded_len ( & self ) -> ssh_encoding:: Result < usize > {
182
+ self . pubkey . encoded_len_prefixed ( )
183
+ }
184
+
185
+ fn encode ( & self , writer : & mut impl Writer ) -> ssh_encoding:: Result < ( ) > {
186
+ self . pubkey . encode_prefixed ( writer)
187
+ }
188
+ }
189
+
180
190
#[ derive( Clone , PartialEq , Debug ) ]
181
191
pub struct SmartcardKey {
182
192
pub id : String ,
@@ -194,6 +204,19 @@ impl Decode for SmartcardKey {
194
204
}
195
205
}
196
206
207
+ impl Encode for SmartcardKey {
208
+ fn encoded_len ( & self ) -> ssh_encoding:: Result < usize > {
209
+ [ self . id . encoded_len ( ) ?, self . pin . encoded_len ( ) ?] . checked_sum ( )
210
+ }
211
+
212
+ fn encode ( & self , writer : & mut impl Writer ) -> ssh_encoding:: Result < ( ) > {
213
+ self . id . encode ( writer) ?;
214
+ self . pin . encode ( writer) ?;
215
+
216
+ Ok ( ( ) )
217
+ }
218
+ }
219
+
197
220
#[ derive( Clone , PartialEq , Debug ) ]
198
221
pub enum KeyConstraint {
199
222
Lifetime ( u32 ) ,
@@ -231,7 +254,7 @@ impl Encode for KeyConstraint {
231
254
. ok_or ( EncodingError :: Length ) ,
232
255
Self :: Confirm => Ok ( base) ,
233
256
Self :: Extension ( name, content) => {
234
- [ base, name. encoded_len ( ) ?, content. encoded_len ( ) ?] . checked_sum ( )
257
+ [ base, name. encoded_len ( ) ?, content. 0 . encoded_len ( ) ?] . checked_sum ( )
235
258
}
236
259
}
237
260
}
@@ -246,7 +269,7 @@ impl Encode for KeyConstraint {
246
269
Self :: Extension ( name, content) => {
247
270
255u8 . encode ( writer) ?;
248
271
name. encode ( writer) ?;
249
- content. encode ( writer)
272
+ content. 0 . encode ( writer)
250
273
}
251
274
}
252
275
}
@@ -272,6 +295,25 @@ impl Decode for AddSmartcardKeyConstrained {
272
295
}
273
296
}
274
297
298
+ impl Encode for AddSmartcardKeyConstrained {
299
+ fn encoded_len ( & self ) -> ssh_encoding:: Result < usize > {
300
+ self . constraints
301
+ . iter ( )
302
+ . try_fold ( self . key . encoded_len ( ) ?, |acc, e| {
303
+ let constraint_len = e. encoded_len ( ) ?;
304
+ usize:: checked_add ( acc, constraint_len) . ok_or ( EncodingError :: Length )
305
+ } )
306
+ }
307
+
308
+ fn encode ( & self , writer : & mut impl Writer ) -> ssh_encoding:: Result < ( ) > {
309
+ self . key . encode ( writer) ?;
310
+ for constraint in & self . constraints {
311
+ constraint. encode ( writer) ?;
312
+ }
313
+ Ok ( ( ) )
314
+ }
315
+ }
316
+
275
317
#[ derive( Clone , PartialEq , Debug ) ]
276
318
pub struct Extension {
277
319
pub name : String ,
@@ -292,6 +334,23 @@ impl Decode for Extension {
292
334
}
293
335
}
294
336
337
+ impl Encode for Extension {
338
+ fn encoded_len ( & self ) -> ssh_encoding:: Result < usize > {
339
+ [
340
+ self . name . encoded_len ( ) ?,
341
+ self . details . 0 . encoded_len ( ) ?
342
+ ] . checked_sum ( )
343
+ }
344
+
345
+ fn encode ( & self , writer : & mut impl Writer ) -> ssh_encoding:: Result < ( ) > {
346
+ self . name . encode ( writer) ?;
347
+
348
+ // NOTE: extension messages do not contain a length!
349
+ writer. write ( & self . details . 0 [ ..] ) ?;
350
+ Ok ( ( ) )
351
+ }
352
+ }
353
+
295
354
#[ derive( Debug , PartialEq , Clone ) ]
296
355
pub struct Unparsed ( Vec < u8 > ) ;
297
356
@@ -331,7 +390,31 @@ pub enum Message {
331
390
AddIdConstrained ( AddIdentityConstrained ) ,
332
391
AddSmartcardKeyConstrained ( AddSmartcardKeyConstrained ) ,
333
392
Extension ( Extension ) ,
334
- ExtensionFailure ,
393
+ ExtensionFailure
394
+ }
395
+
396
+ impl Message {
397
+ pub fn message_id ( & self ) -> u8 {
398
+ match self {
399
+ Message :: Failure => 5 ,
400
+ Message :: Success => 6 ,
401
+ Message :: RequestIdentities => 11 ,
402
+ Message :: IdentitiesAnswer ( _) => 12 ,
403
+ Message :: SignRequest ( _) => 13 ,
404
+ Message :: SignResponse ( _) => 14 ,
405
+ Message :: AddIdentity ( _) => 17 ,
406
+ Message :: RemoveIdentity ( _) => 18 ,
407
+ Message :: RemoveAllIdentities => 19 ,
408
+ Message :: AddSmartcardKey ( _) => 20 ,
409
+ Message :: RemoveSmartcardKey ( _) => 21 ,
410
+ Message :: Lock ( _) => 22 ,
411
+ Message :: Unlock ( _) => 23 ,
412
+ Message :: AddIdConstrained ( _) => 25 ,
413
+ Message :: AddSmartcardKeyConstrained ( _) => 26 ,
414
+ Message :: Extension ( _) => 27 ,
415
+ Message :: ExtensionFailure => 28
416
+ }
417
+ }
335
418
}
336
419
337
420
impl Decode for Message {
@@ -365,7 +448,7 @@ impl Decode for Message {
365
448
366
449
impl Encode for Message {
367
450
fn encoded_len ( & self ) -> ssh_encoding:: Result < usize > {
368
- let command_id = 1 ;
451
+ let message_id_len = 1 ;
369
452
let payload_len = match self {
370
453
Self :: Failure => 0 ,
371
454
Self :: Success => 0 ,
@@ -380,25 +463,29 @@ impl Encode for Message {
380
463
}
381
464
382
465
lengths. checked_sum ( ) ?
383
- }
384
- Self :: SignResponse ( response) => response. encoded_len ( ) ? + 4 ,
385
- _ => todo ! ( ) ,
466
+ } ,
467
+ Self :: SignRequest ( request) => request. encoded_len ( ) ?,
468
+ Self :: SignResponse ( response) => response. encoded_len_prefixed ( ) ?,
469
+ Self :: AddIdentity ( identity) => identity. encoded_len ( ) ?,
470
+ Self :: RemoveIdentity ( identity) => identity. encoded_len ( ) ?,
471
+ Self :: RemoveAllIdentities => 0 ,
472
+ Self :: AddSmartcardKey ( key) => key. encoded_len ( ) ?,
473
+ Self :: RemoveSmartcardKey ( key) => key. encoded_len ( ) ?,
474
+ Self :: Lock ( passphrase) => passphrase. encoded_len ( ) ?,
475
+ Self :: Unlock ( passphrase) => passphrase. encoded_len ( ) ?,
476
+ Self :: AddIdConstrained ( key) => key. encoded_len ( ) ?,
477
+ Self :: AddSmartcardKeyConstrained ( key) => key. encoded_len ( ) ?,
478
+ Self :: Extension ( extension) => extension. encoded_len ( ) ?,
479
+ Self :: ExtensionFailure => 0
386
480
} ;
387
481
388
- [ command_id , payload_len] . checked_sum ( )
482
+ [ message_id_len , payload_len] . checked_sum ( )
389
483
}
390
484
391
485
fn encode ( & self , writer : & mut impl Writer ) -> ssh_encoding:: Result < ( ) > {
392
- let command_id: u8 = match self {
393
- Self :: Failure => 5 ,
394
- Self :: Success => 6 ,
395
- Self :: RequestIdentities => 11 ,
396
- Self :: IdentitiesAnswer ( _) => 12 ,
397
- Self :: SignResponse ( _) => 14 ,
398
- _ => todo ! ( ) ,
399
- } ;
486
+ let message_id: u8 = self . message_id ( ) ;
487
+ message_id. encode ( writer) ?;
400
488
401
- command_id. encode ( writer) ?;
402
489
match self {
403
490
Self :: Failure => { }
404
491
Self :: Success => { }
@@ -409,10 +496,19 @@ impl Encode for Message {
409
496
id. encode ( writer) ?;
410
497
}
411
498
}
412
- Self :: SignResponse ( response) => {
413
- response. encode_prefixed ( writer) ?;
414
- }
415
- _ => todo ! ( ) ,
499
+ Self :: SignRequest ( request) => request. encode ( writer) ?,
500
+ Self :: SignResponse ( response) => response. encode_prefixed ( writer) ?,
501
+ Self :: AddIdentity ( identity) => identity. encode ( writer) ?,
502
+ Self :: RemoveIdentity ( identity) => identity. encode ( writer) ?,
503
+ Self :: RemoveAllIdentities => { } ,
504
+ Self :: AddSmartcardKey ( key) => key. encode ( writer) ?,
505
+ Self :: RemoveSmartcardKey ( key) => key. encode ( writer) ?,
506
+ Self :: Lock ( passphrase) => passphrase. encode ( writer) ?,
507
+ Self :: Unlock ( passphrase) => passphrase. encode ( writer) ?,
508
+ Self :: AddIdConstrained ( identity) => identity. encode ( writer) ?,
509
+ Self :: AddSmartcardKeyConstrained ( key) => key. encode ( writer) ?,
510
+ Self :: Extension ( extension) => extension. encode ( writer) ?,
511
+ Self :: ExtensionFailure => { } ,
416
512
} ;
417
513
418
514
Ok ( ( ) )
0 commit comments