diff --git a/internal/legacy/credentials/credentials_test.go b/internal/legacy/credentials/credentials_test.go index 8a1a78d4..8260562e 100644 --- a/internal/legacy/credentials/credentials_test.go +++ b/internal/legacy/credentials/credentials_test.go @@ -65,3 +65,23 @@ func TestUnmarshallImportExport(t *testing.T) { r.NoError(t, haveCredentials.Unmarshal(encoded)) r.Equal(t, wantCredentials, haveCredentials) } + +func FuzzUnmarshal(f *testing.F) { + items := []string{ + wantCredentials.Name, + wantCredentials.Emails, + wantCredentials.APIToken, + string(wantCredentials.MailboxPassword), + "k11", + fmt.Sprint(wantCredentials.Timestamp), + } + str := strings.Join(items, sep) + f.Add([]byte(str)) + + f.Fuzz(func(t *testing.T, secret []byte) { + encodedSecret := base64.StdEncoding.EncodeToString(secret) + + creds := &Credentials{} + _ = creds.Unmarshal(encodedSecret) + }) +} diff --git a/pkg/message/header_test.go b/pkg/message/header_test.go index 080af55a..4e6eaf17 100644 --- a/pkg/message/header_test.go +++ b/pkg/message/header_test.go @@ -110,3 +110,23 @@ func TestReadHeaderBodyInvalidHeader(t *testing.T) { assert.Equal(t, 0, header.Len()) assert.Equal(t, []byte(data), body) } + +func FuzzReadHeaderBody(f *testing.F) { + header := `Content-Type: application/msword; name="=E5=B8=B6=E6=9C=89=E5=A4=96=E5=9C=8B=E5=AD=97=E7=AC=A6=E7=9A=84=E9=99=84=E4= + =BB=B6.DOC" + Content-Transfer-Encoding: base64 + Content-Disposition: attachment; filename="=E5=B8=B6=E6=9C=89=E5=A4=96=E5=9C=8B=E5=AD=97=E7=AC=A6=E7=9A=84=E9=99=84=E4= + =BB=B6.DOC" + Content-ID: <> + ` + data0 := "key: value\r\n\r\nbody\n" + data1 := "key: value\r\n\r\nbody\n" + + f.Add([]byte(header)) + f.Add([]byte(data0)) + f.Add([]byte(data1)) + + f.Fuzz(func(t *testing.T, b []byte) { + _, _, _ = readHeaderBody(b) + }) +} diff --git a/pkg/message/parser/parser_test.go b/pkg/message/parser/parser_test.go index 93fc1cd4..1263ba50 100644 --- a/pkg/message/parser/parser_test.go +++ b/pkg/message/parser/parser_test.go @@ -18,6 +18,7 @@ package parser import ( + "bytes" "io" "os" "path/filepath" @@ -50,3 +51,18 @@ func getFileAsString(filename string) string { return string(b) } + +func FuzzNewParser(f *testing.F) { + inSeed1, err1 := os.ReadFile(filepath.Join("testdata", "text_html_octet_attachment.eml")) + inSeed2, err2 := os.ReadFile(filepath.Join("testdata", "complex_structure.eml")) + + require.NoError(f, err1) + require.NoError(f, err2) + + f.Add(inSeed1) + f.Add(inSeed2) + + f.Fuzz(func(t *testing.T, data []byte) { + _, _ = New(bytes.NewReader(data)) + }) +} diff --git a/pkg/mime/encoding_test.go b/pkg/mime/encoding_test.go index 329a9a98..2635dacc 100644 --- a/pkg/mime/encoding_test.go +++ b/pkg/mime/encoding_test.go @@ -455,3 +455,39 @@ func TestEncodeReader(t *testing.T) { } } } + +func FuzzDecodeHeader(f *testing.F) { + seedCorpus := []string{ + "", + "=?iso-2022-jp?Q?=1B$B!Z=1B(BTimes_Car_PLUS=1B$B![JV5Q>Z=1B(B?=", + `=?iso-2022-jp?Q?iTunes_Movie_=1B$B%K%e!<%j%j!<%9$HCmL\:nIJ=1B(B?=`, + "=?UTF-8?B?w4TDi8OPw5bDnA==?= =?UTF-8?B?IMOkw6vDr8O2w7w=?=", + "=?ISO-8859-2?B?xMtJ1tw=?= =?ISO-8859-2?B?IOTrafb8?=", + "=?uknown?B?xMtJ1tw=?= =?ISO-8859-2?B?IOTrafb8?=", + } + + for _, s := range seedCorpus { + f.Add(s) + } + + f.Fuzz(func(t *testing.T, raw string) { + _, _ = DecodeHeader(raw) + }) +} + +func FuzzDecodeCharset(f *testing.F) { + + f.Add([]byte{0xC1, 0xDA, 0xC2, 0xD5, 0xCB, 0xC1, 0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xA3}) + f.Add([]byte{0xD0, 0xB0, 0xD0, 0xB7, 0xD0, 0xB1, 0xD1, 0x83, 0xD0, 0xBA, 0xD0, 0xB0, 0xD0, 0xB0, 0xD0, 0xB1, 0xD0, 0xB2, 0xD0, 0xB3, 0xD0, 0xB4, 0xD0, 0xB5, 0xD1, 0x91}) + f.Add([]byte("He wes Leovena+APA-es sone -- li+APA-e him be Drihten.+A6QDtw- +A7MDuwPOA8MDwwOx- +A7wDvwPF- +A60DtAPJA8MDsQO9- +A7UDuwO7A7cDvQO5A7oDrg-. +BCcENQRABD0ENQQ7BDg- +BDgENwQxBEs- +BDcENAQ1BEEETA- +BDg- +BEIEMAQ8-,+BCcENQRABD0ENQQ7BDg- +BDgENwQxBEs- +BDcENAQ1BEEETA- +BDg- +BEIEMAQ8-,+C68LvguuC7ELvwuoC80LpA- +C64Lygu0C78LlQuzC78LsgvH- +C6QLrgu/C7QLzQuuC8oLtAu/- +C6oLywuyC80- +C4cLqQu/C6QLvgu1C6QLwQ- +C44LmQvNC5ULwQuuC80- +C5ULvgujC8sLrgvN-.")) + f.Add([]byte{196, 203, 214, 220, 228, 235, 246, 252}) + f.Add([]byte{0x95, 0xb6, 0x8e, 0x9a, 0x95, 0x84, 0x8d, 0x86, 0x89, 0xbb, 0x95, 0xfb, 0x8e, 0xae, 0x53, 0x68, 0x69, 0x66, 0x74, 0x5f, 0x4a, 0x49, 0x53, 0x82, 0xcc, 0x90, 0xdd, 0x8c, 0x76, 0x8e, 0xd2, 0x82, 0xe7, 0x82, 0xcd, 0x81, 0x41, 0x90, 0xe6, 0x8d, 0x73, 0x82, 0xb5, 0x82, 0xc4, 0x82, 0xe6, 0x82, 0xad, 0x97, 0x98, 0x97, 0x70, 0x82, 0xb3, 0x82, 0xea, 0x82, 0xc4, 0x82, 0xa2, 0x82, 0xbd, 0x4a, 0x49, 0x53, 0x20, 0x43, 0x20, 0x36, 0x32, 0x32, 0x30, 0x81, 0x69, 0x8c, 0xbb, 0x8d, 0xdd, 0x82, 0xcc, 0x4a, 0x49, 0x53, 0x20, 0x58, 0x20, 0x30, 0x32, 0x30, 0x31, 0x81, 0x6a, 0x82, 0xcc, 0x38, 0x83, 0x72, 0x83, 0x62, 0x83, 0x67, 0x95, 0x84, 0x8d, 0x86, 0x81, 0x69, 0x88, 0xc8, 0x89, 0xba, 0x81, 0x75, 0x89, 0x70, 0x90, 0x94, 0x8e, 0x9a, 0x81, 0x45, 0x94, 0xbc, 0x8a, 0x70, 0x83, 0x4a, 0x83, 0x69, 0x81, 0x76, 0x81, 0x6a, 0x82, 0xc6, 0x81, 0x41, 0x4a, 0x49, 0x53, 0x20, 0x43, 0x20, 0x36, 0x32, 0x32, 0x36, 0x81, 0x69, 0x8c, 0xbb, 0x8d, 0xdd, 0x82, 0xcc, 0x4a, 0x49, 0x53, 0x20, 0x58, 0x20, 0x30, 0x32, 0x30, 0x38, 0x81, 0x41, 0x88, 0xc8, 0x89, 0xba, 0x81, 0x75, 0x8a, 0xbf, 0x8e, 0x9a, 0x81, 0x76, 0x81, 0x6a, 0x82, 0xcc, 0x97, 0xbc, 0x95, 0xb6, 0x8e, 0x9a, 0x8f, 0x57, 0x8d, 0x87, 0x82, 0xf0, 0x95, 0x5c, 0x8c, 0xbb, 0x82, 0xb5, 0x82, 0xe6, 0x82, 0xa4, 0x82, 0xc6, 0x82, 0xb5, 0x82, 0xbd, 0x81, 0x42, 0x82, 0xdc, 0x82, 0xbd, 0x81, 0x41, 0x83, 0x74, 0x83, 0x40, 0x83, 0x43, 0x83, 0x8b, 0x82, 0xcc, 0x91, 0xe5, 0x82, 0xab, 0x82, 0xb3, 0x82, 0xe2, 0x8f, 0x88, 0x97, 0x9d, 0x8e, 0x9e, 0x8a, 0xd4, 0x82, 0xcc, 0x92, 0x5a, 0x8f, 0x6b, 0x82, 0xf0, 0x90, 0x7d, 0x82, 0xe9, 0x82, 0xbd, 0x82, 0xdf, 0x81, 0x41, 0x83, 0x47, 0x83, 0x58, 0x83, 0x50, 0x81, 0x5b, 0x83, 0x76, 0x83, 0x56, 0x81, 0x5b, 0x83, 0x50, 0x83, 0x93, 0x83, 0x58, 0x82, 0xc8, 0x82, 0xb5, 0x82, 0xc5, 0x8d, 0xac, 0x8d, 0xdd, 0x89, 0xc2, 0x94, 0x5c, 0x82, 0xc9, 0x82, 0xb7, 0x82, 0xe9, 0x82, 0xb1, 0x82, 0xc6, 0x82, 0xf0, 0x8a, 0xe9, 0x90, 0x7d, 0x82, 0xb5, 0x82, 0xbd, 0x81, 0x42}) + + f.Fuzz(func(t *testing.T, original []byte) { + _, _ = DecodeCharset(original, "text/plain; charset=koi8-r") + _, _ = DecodeCharset(original, "text/plain; charset=iso-8859-5") + _, _ = DecodeCharset(original, "text/plain; charset=windows-1250") + _, _ = DecodeCharset(original, "text/plain; charset=csWrong") + _, _ = DecodeCharset(original, "text/plain; charset=GB2312") + }) +}