Commit d271576a authored by Joe Shaw's avatar Joe Shaw Committed by Adam Langley

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/37147Reviewed-by: 's avatarAdam Langley <agl@golang.org>
parent b2a2a605
......@@ -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)
......
......@@ -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,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment