Skip to content

Commit c7d8f88

Browse files
authored
Merge pull request #288 from ProtonMail/feat/armor-ignore-whitespaces
This PR improves dearmoring robustness by ignoring leading and trailing whitespaces. For example, the following input is now parsed correctly: -----BEGIN PGP SIGNATURE----- wsE7BAABCgBvBYJkbfmWCRD7/MgqAV5zMEcUAAAAAAAeACBzYWx0QG5vdGF0aW9u cy5zZXF1b2lhLXBncC5vcmeMXzsJEgIm228SdxV22XgYny4adwqEgyIT9UL3F92C OhYhBNGmbhojsYLJmA94jPv8yCoBXnMwAAAj1AwAiSkJPxsEcyaoYWbxc657xPW1 MlrbNhDBIWpKVrqQgyz7NdDZvvY0Ty+/h62HK5GQ5obAzVmQVwtUVG950TxCksg1 F18mqticpxg1veZQdw7DBYTk0RJTpdVBRYJ5UOtHaSJUAnqGh7OQE6Lu74vfFhNv dDjpjgEc6TnJrEBOOR7+RVp7+0i4HhM3+JdfSOMMOEb6ixWEYLtfC2Zd/p0f7vP8 tHiqllDXDbfBCXlFl5h2LAh39o/LE0vZvwf+C9i9PgRARawWIh+xeAJsVne8FZ12 FD+hWZJdNUCv4iE1H7QDVv8nuPAz3WB/DQWNSfeGTZnN+ouB1cjPFscBuunO5Dss k3hXy+XB5mZW6iisjUnUBknJEa43AMX+zGSaGHljEgfTGLbgEK+deOhPqKEkhUKr /VlIVBXgfjQuoizme9S9juxXHdDHa+Y5Wb9rTUc1y9YPArRem51VI0OzbJ2cRnLH J0YF6lYvjcTVBtmQlYeOfZsz4EABEeBYe/rbDmJC =b+IB -----END PGP SIGNATURE-----
2 parents 3b22d85 + 1b0ae10 commit c7d8f88

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

openpgp/armor/armor.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ func (l *lineReader) Read(p []byte) (n int, err error) {
6969
if isPrefix {
7070
return 0, ArmorCorrupt
7171
}
72+
// Trim the line to remove any whitespace
73+
line = bytes.TrimSpace(line)
7274

7375
if bytes.HasPrefix(line, armorEnd) {
7476
l.eof = true

openpgp/armor/armor_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,34 @@ func TestLongHeader(t *testing.T) {
8989
}
9090
}
9191

92+
func TestWithWhitespace(t *testing.T) {
93+
buff := bytes.NewBuffer([]byte(armorWithWhitespace))
94+
armorWithWhitespace, err := Decode(buff)
95+
if err != nil {
96+
t.Error(err)
97+
}
98+
99+
armorWithWhitespaceBody, err := io.ReadAll(armorWithWhitespace.Body)
100+
if err != nil {
101+
t.Error(err)
102+
}
103+
104+
buff = bytes.NewBuffer([]byte(armorExampleEmptyVersion))
105+
armorWithOutWhitespace, err := Decode(buff)
106+
if err != nil {
107+
t.Error(err)
108+
}
109+
110+
armorWithOutWhitespaceBody, err := io.ReadAll(armorWithOutWhitespace.Body)
111+
if err != nil {
112+
t.Error(err)
113+
}
114+
115+
if !bytes.Equal(armorWithWhitespaceBody, armorWithOutWhitespaceBody) {
116+
t.Errorf("got: %s want: %s", armorWithWhitespaceBody, armorWithOutWhitespaceBody)
117+
}
118+
}
119+
92120
const armorExample1 = `-----BEGIN PGP SIGNATURE-----
93121
Version: GnuPG v1.4.10 (GNU/Linux)
94122
@@ -129,3 +157,19 @@ k3hXy+XB5mZW6iisjUnUBknJEa43AMX+zGSaGHljEgfTGLbgEK+deOhPqKEkhUKr
129157
J0YF6lYvjcTVBtmQlYeOfZsz4EABEeBYe/rbDmJC
130158
=b+IB
131159
-----END PGP SIGNATURE-----`
160+
161+
const armorWithWhitespace = `-----BEGIN PGP SIGNATURE-----
162+
163+
wsE7BAABCgBvBYJkbfmWCRD7/MgqAV5zMEcUAAAAAAAeACBzYWx0QG5vdGF0aW9u
164+
cy5zZXF1b2lhLXBncC5vcmeMXzsJEgIm228SdxV22XgYny4adwqEgyIT9UL3F92C
165+
OhYhBNGmbhojsYLJmA94jPv8yCoBXnMwAAAj1AwAiSkJPxsEcyaoYWbxc657xPW1
166+
MlrbNhDBIWpKVrqQgyz7NdDZvvY0Ty+/h62HK5GQ5obAzVmQVwtUVG950TxCksg1
167+
F18mqticpxg1veZQdw7DBYTk0RJTpdVBRYJ5UOtHaSJUAnqGh7OQE6Lu74vfFhNv
168+
dDjpjgEc6TnJrEBOOR7+RVp7+0i4HhM3+JdfSOMMOEb6ixWEYLtfC2Zd/p0f7vP8
169+
tHiqllDXDbfBCXlFl5h2LAh39o/LE0vZvwf+C9i9PgRARawWIh+xeAJsVne8FZ12
170+
FD+hWZJdNUCv4iE1H7QDVv8nuPAz3WB/DQWNSfeGTZnN+ouB1cjPFscBuunO5Dss
171+
k3hXy+XB5mZW6iisjUnUBknJEa43AMX+zGSaGHljEgfTGLbgEK+deOhPqKEkhUKr
172+
/VlIVBXgfjQuoizme9S9juxXHdDHa+Y5Wb9rTUc1y9YPArRem51VI0OzbJ2cRnLH
173+
J0YF6lYvjcTVBtmQlYeOfZsz4EABEeBYe/rbDmJC
174+
=b+IB
175+
-----END PGP SIGNATURE-----`

0 commit comments

Comments
 (0)