Skip to content

Commit 10d1ded

Browse files
committed
Add Encode traits for remaining message types
1 parent e88aac3 commit 10d1ded

File tree

1 file changed

+119
-23
lines changed

1 file changed

+119
-23
lines changed

src/proto/message.rs

Lines changed: 119 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,15 @@ impl Decode for SignRequest {
7474
impl Encode for SignRequest {
7575
fn encoded_len(&self) -> ssh_encoding::Result<usize> {
7676
[
77-
self.pubkey.encoded_len()?,
77+
self.pubkey.encoded_len_prefixed()?,
7878
self.data.encoded_len()?,
7979
self.flags.encoded_len()?,
8080
]
8181
.checked_sum()
8282
}
8383

8484
fn encode(&self, writer: &mut impl Writer) -> ssh_encoding::Result<()> {
85-
self.pubkey.encode(writer)?;
85+
self.pubkey.encode_prefixed(writer)?;
8686
self.data.encode(writer)?;
8787
self.flags.encode(writer)?;
8888

@@ -177,6 +177,16 @@ impl Decode for RemoveIdentity {
177177
}
178178
}
179179

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+
180190
#[derive(Clone, PartialEq, Debug)]
181191
pub struct SmartcardKey {
182192
pub id: String,
@@ -194,6 +204,19 @@ impl Decode for SmartcardKey {
194204
}
195205
}
196206

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+
197220
#[derive(Clone, PartialEq, Debug)]
198221
pub enum KeyConstraint {
199222
Lifetime(u32),
@@ -231,7 +254,7 @@ impl Encode for KeyConstraint {
231254
.ok_or(EncodingError::Length),
232255
Self::Confirm => Ok(base),
233256
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()
235258
}
236259
}
237260
}
@@ -246,7 +269,7 @@ impl Encode for KeyConstraint {
246269
Self::Extension(name, content) => {
247270
255u8.encode(writer)?;
248271
name.encode(writer)?;
249-
content.encode(writer)
272+
content.0.encode(writer)
250273
}
251274
}
252275
}
@@ -272,6 +295,25 @@ impl Decode for AddSmartcardKeyConstrained {
272295
}
273296
}
274297

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+
275317
#[derive(Clone, PartialEq, Debug)]
276318
pub struct Extension {
277319
pub name: String,
@@ -292,6 +334,23 @@ impl Decode for Extension {
292334
}
293335
}
294336

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+
295354
#[derive(Debug, PartialEq, Clone)]
296355
pub struct Unparsed(Vec<u8>);
297356

@@ -331,7 +390,31 @@ pub enum Message {
331390
AddIdConstrained(AddIdentityConstrained),
332391
AddSmartcardKeyConstrained(AddSmartcardKeyConstrained),
333392
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+
}
335418
}
336419

337420
impl Decode for Message {
@@ -365,7 +448,7 @@ impl Decode for Message {
365448

366449
impl Encode for Message {
367450
fn encoded_len(&self) -> ssh_encoding::Result<usize> {
368-
let command_id = 1;
451+
let message_id_len = 1;
369452
let payload_len = match self {
370453
Self::Failure => 0,
371454
Self::Success => 0,
@@ -380,25 +463,29 @@ impl Encode for Message {
380463
}
381464

382465
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
386480
};
387481

388-
[command_id, payload_len].checked_sum()
482+
[message_id_len, payload_len].checked_sum()
389483
}
390484

391485
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)?;
400488

401-
command_id.encode(writer)?;
402489
match self {
403490
Self::Failure => {}
404491
Self::Success => {}
@@ -409,10 +496,19 @@ impl Encode for Message {
409496
id.encode(writer)?;
410497
}
411498
}
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 => {},
416512
};
417513

418514
Ok(())

0 commit comments

Comments
 (0)