1
0
mirror of https://github.com/golang/go synced 2024-11-18 09:54:57 -07:00

encoding/pem: refuse extra data on ending line

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>
This commit is contained in:
Joe Shaw 2017-02-17 11:55:42 -05:00 committed by Adam Langley
parent b2a2a6054a
commit d271576a0f
2 changed files with 26 additions and 2 deletions

View File

@ -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)

View File

@ -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==
@ -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,