Skip to content

Commit 654b617

Browse files
drakkaniQQBot
authored andcommitted
added a shared method to parse extInfoMsgs
both client and server side need to parse this message Signed-off-by: Nicola Murino <[email protected]>
1 parent bdca109 commit 654b617

File tree

3 files changed

+28
-32
lines changed

3 files changed

+28
-32
lines changed

ssh/client_auth.go

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,23 +35,10 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error {
3535
// RFC 8308, Section 2.4.
3636
extensions := make(map[string][]byte)
3737
if len(packet) > 0 && packet[0] == msgExtInfo {
38-
var extInfo extInfoMsg
39-
if err := Unmarshal(packet, &extInfo); err != nil {
38+
extensions, err = parseExtInfoMsg(packet)
39+
if err != nil {
4040
return err
4141
}
42-
payload := extInfo.Payload
43-
for i := uint32(0); i < extInfo.NumExtensions; i++ {
44-
name, rest, ok := parseString(payload)
45-
if !ok {
46-
return parseError(msgExtInfo)
47-
}
48-
value, rest, ok := parseString(rest)
49-
if !ok {
50-
return parseError(msgExtInfo)
51-
}
52-
extensions[string(name)] = value
53-
payload = rest
54-
}
5542
packet, err = c.transport.readPacket()
5643
if err != nil {
5744
return err

ssh/common.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,31 @@ func parseError(tag uint8) error {
146146
return fmt.Errorf("ssh: parse error in message type %d", tag)
147147
}
148148

149+
// parseExtInfoMsg returns the extensions from an extInfoMsg packet.
150+
// packet must be an already validated extInfoMsg
151+
func parseExtInfoMsg(packet []byte) (map[string][]byte, error) {
152+
extensions := make(map[string][]byte)
153+
var extInfo extInfoMsg
154+
155+
if err := Unmarshal(packet, &extInfo); err != nil {
156+
return nil, err
157+
}
158+
payload := extInfo.Payload
159+
for i := uint32(0); i < extInfo.NumExtensions; i++ {
160+
name, rest, ok := parseString(payload)
161+
if !ok {
162+
return nil, parseError(msgExtInfo)
163+
}
164+
value, rest, ok := parseString(rest)
165+
if !ok {
166+
return nil, parseError(msgExtInfo)
167+
}
168+
extensions[string(name)] = value
169+
payload = rest
170+
}
171+
return extensions, nil
172+
}
173+
149174
func findCommon(what string, client []string, server []string) (common string, err error) {
150175
for _, c := range client {
151176
for _, s := range server {

ssh/server.go

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -283,25 +283,9 @@ func (s *connection) serverHandshake(config *ServerConfig) (*Permissions, error)
283283

284284
if len(packet) > 0 && packet[0] == msgExtInfo {
285285
// read SSH_MSG_EXT_INFO
286-
var extInfo extInfoMsg
287-
extensions := make(map[string][]byte)
288-
if err := Unmarshal(packet, &extInfo); err != nil {
286+
if _, err := parseExtInfoMsg(packet); err != nil {
289287
return nil, err
290288
}
291-
payload := extInfo.Payload
292-
for i := uint32(0); i < extInfo.NumExtensions; i++ {
293-
name, rest, ok := parseString(payload)
294-
if !ok {
295-
return nil, parseError(msgExtInfo)
296-
}
297-
value, rest, ok := parseString(rest)
298-
if !ok {
299-
return nil, parseError(msgExtInfo)
300-
}
301-
extensions[string(name)] = value
302-
payload = rest
303-
}
304-
305289
// read the next packet
306290
if packet, err = s.transport.readPacket(); err != nil {
307291
return nil, err

0 commit comments

Comments
 (0)