Skip to content

Commit

Permalink
openpgp: Fix panic on opaque subpackets with length 0.
Browse files Browse the repository at this point in the history
Some invalid input may be parsed so that the length of an opaque
subpacket turns out to be 0. In such cases, arrange for a
StructuralError to be returned indicating truncation.

Found using gofuzz.

Fixes golang/go#11503

Change-Id: Ib9ce8c604f35a31f852adfcd56a22dfd143a9443
Reviewed-on: https://go-review.googlesource.com/12634
Reviewed-by: Adam Langley <[email protected]>
  • Loading branch information
desdeel2d0m authored and agl committed Jul 27, 2015
1 parent 870f561 commit 1b94d42
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 3 deletions.
5 changes: 3 additions & 2 deletions openpgp/packet/opaque.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ package packet

import (
"bytes"
"golang.org/x/crypto/openpgp/errors"
"io"
"io/ioutil"

"golang.org/x/crypto/openpgp/errors"
)

// OpaquePacket represents an OpenPGP packet as raw, unparsed data. This is
Expand Down Expand Up @@ -138,7 +139,7 @@ func nextSubpacket(contents []byte) (subHeaderLen int, subPacket *OpaqueSubpacke
uint32(contents[4])
contents = contents[5:]
}
if subLen > uint32(len(contents)) {
if subLen > uint32(len(contents)) || subLen == 0 {
goto Truncated
}
subPacket.SubType = contents[0]
Expand Down
26 changes: 25 additions & 1 deletion openpgp/read_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ import (
"bytes"
_ "crypto/sha512"
"encoding/hex"
"golang.org/x/crypto/openpgp/errors"
"io"
"io/ioutil"
"strings"
"testing"

"golang.org/x/crypto/openpgp/errors"
)

func readerFromHex(s string) io.Reader {
Expand Down Expand Up @@ -368,6 +369,29 @@ func TestNoArmoredData(t *testing.T) {
}
}

func TestIssue11503(t *testing.T) {
data := "8c040402000aa430aa8228b9248b01fc899a91197130303030"

buf, err := hex.DecodeString(data)
if err != nil {
t.Errorf("hex.DecodeSting(): %v", err)
}

kr, err := ReadKeyRing(new(bytes.Buffer))
if err != nil {
t.Errorf("ReadKeyring(): %v", err)
}

_, err = ReadMessage(bytes.NewBuffer(buf), kr,
func([]Key, bool) ([]byte, error) {
return []byte("insecure"), nil
}, nil)

if err == nil {
t.Errorf("ReadMessage(): Unexpected nil error")
}
}

const testKey1KeyId = 0xA34D7E18C20C31BB
const testKey3KeyId = 0x338934250CCC0360

Expand Down

0 comments on commit 1b94d42

Please sign in to comment.