]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/pem: refuse extra data on ending line
authorJoe Shaw <joe@joeshaw.org>
Fri, 17 Feb 2017 16:55:42 +0000 (11:55 -0500)
committerAdam Langley <agl@golang.org>
Wed, 1 Mar 2017 19:23:09 +0000 (19:23 +0000)
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>
src/encoding/pem/pem.go
src/encoding/pem/pem_test.go

index fbf49997d5ed05f37fdf0820c2015c72b8a038d5..5e1ab90cffc08effcdf911bbc086a18984876089 100644 (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)
index 6321dec382008766f8865f10d48f8a3802ccd9fd..6a85a604310c2a09cd4fba0442b22505385c90e0 100644 (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,