Skip to content

Commit

Permalink
encoding/pem: refuse extra data on ending line
Browse files Browse the repository at this point in the history
Previously the code didn't check for extra data after the final five
dashes of the ending line of a PEM block.

Fixes #19147
Fixes #7042

Change-Id: Idaab2390914a2bed8c2c12b14dfb6d68233fdfec
Reviewed-on: https://go-review.googlesource.com/37147
Reviewed-by: Adam Langley <agl@golang.org>
  • Loading branch information
joeshaw authored and agl committed Mar 1, 2017
1 parent b2a2a60 commit d271576
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 2 deletions.
10 changes: 8 additions & 2 deletions src/encoding/pem/pem.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,20 +135,26 @@ func Decode(data []byte) (p *Block, rest []byte) {
return decodeError(data, rest)
}

// After the "-----" of the ending line should be the same type and a
// final five dashes.
// After the "-----" of the ending line, there should be the same type
// and then a final five dashes.
endTrailer := rest[endTrailerIndex:]
endTrailerLen := len(typeLine) + len(pemEndOfLine)
if len(endTrailer) < endTrailerLen {
return decodeError(data, rest)
}

restOfEndLine := endTrailer[endTrailerLen:]
endTrailer = endTrailer[:endTrailerLen]
if !bytes.HasPrefix(endTrailer, typeLine) ||
!bytes.HasSuffix(endTrailer, pemEndOfLine) {
return decodeError(data, rest)
}

// The line must end with only whitespace.
if s, _ := getLine(restOfEndLine); len(s) != 0 {
return decodeError(data, rest)
}

base64Data := removeWhitespace(rest[:endIndex])
p.Bytes = make([]byte, base64.StdEncoding.DecodedLen(len(base64Data)))
n, err := base64.StdEncoding.Decode(p.Bytes, base64Data)
Expand Down
18 changes: 18 additions & 0 deletions src/encoding/pem/pem_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,16 @@ const pemTooFewEndingDashes = `
dGVzdA==
-----END FOO----`

const pemTooManyEndingDashes = `
-----BEGIN FOO-----
dGVzdA==
-----END FOO------`

const pemTrailingNonWhitespace = `
-----BEGIN FOO-----
dGVzdA==
-----END FOO----- .`

const pemWrongEndingType = `
-----BEGIN FOO-----
dGVzdA==
Expand All @@ -101,6 +111,14 @@ var badPEMTests = []struct {
"too few trailing dashes",
pemTooFewEndingDashes,
},
{
"too many trailing dashes",
pemTooManyEndingDashes,
},
{
"trailing non-whitespace",
pemTrailingNonWhitespace,
},
{
"incorrect ending type",
pemWrongEndingType,
Expand Down

0 comments on commit d271576

Please sign in to comment.