Skip to content

Commit 92ea34e

Browse files
committed
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 5835f04 commit 92ea34e

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
@@ -265,25 +265,9 @@ func (s *connection) serverHandshake(config *ServerConfig) (*Permissions, error)
265265

266266
if len(packet) > 0 && packet[0] == msgExtInfo {
267267
// read SSH_MSG_EXT_INFO
268-
var extInfo extInfoMsg
269-
extensions := make(map[string][]byte)
270-
if err := Unmarshal(packet, &extInfo); err != nil {
268+
if _, err := parseExtInfoMsg(packet); err != nil {
271269
return nil, err
272270
}
273-
payload := extInfo.Payload
274-
for i := uint32(0); i < extInfo.NumExtensions; i++ {
275-
name, rest, ok := parseString(payload)
276-
if !ok {
277-
return nil, parseError(msgExtInfo)
278-
}
279-
value, rest, ok := parseString(rest)
280-
if !ok {
281-
return nil, parseError(msgExtInfo)
282-
}
283-
extensions[string(name)] = value
284-
payload = rest
285-
}
286-
287271
// read the next packet
288272
if packet, err = s.transport.readPacket(); err != nil {
289273
return nil, err

0 commit comments

Comments
 (0)