Skip to content

Commit b4cdeef

Browse files
committed
cmd/age: accept leading whitespace before armored data
It was already accepted by the API, but the CLI did not handle it while peeking to detect armored input.
1 parent 6aae5b4 commit b4cdeef

File tree

3 files changed

+28
-2
lines changed

3 files changed

+28
-2
lines changed

cmd/age/age.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,9 @@ func decrypt(identities []age.Identity, in io.Reader, out io.Writer) {
481481
"consider using -o or -a to encrypt files in PowerShell")
482482
}
483483

484-
if start, _ := rr.Peek(len(armor.Header)); string(start) == armor.Header {
484+
const maxWhitespace = 1024
485+
start, _ := rr.Peek(maxWhitespace + len(armor.Header))
486+
if strings.HasPrefix(string(bytes.TrimSpace(start)), armor.Header) {
485487
in = armor.NewReader(rr)
486488
} else {
487489
in = rr

cmd/age/testdata/armor.txt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
age -d -i key.txt armored_with_leading_and_trailing_whitespace.txt
2+
stdout test
3+
4+
-- key.txt --
5+
# created: 2025-12-23T22:21:12+01:00
6+
# public key: age15w9kgvgggmfra4sz6vk39kz4mveuq2sfv5vmcu090y0k2sluepaqv7z2fv
7+
AGE-SECRET-KEY-18J6FVYJE2AFSJ0RPH6M29GMUU62UVRSCNWUJZSGETH6R38Q5AZ3S2DHAZ9
8+
9+
-- armored_with_leading_and_trailing_whitespace.txt --
10+
11+
12+
13+
-----BEGIN AGE ENCRYPTED FILE-----
14+
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA5ODhFNHR6RVg0SGVHZFBM
15+
clBEclEzZ3NvOGhqVE9tcFZnbTc2c3R5a0Q4ClZjVzBLNjdxRElZV3E0Z3ZpZ255
16+
T3JWTFBHRFA2cytpWWtkeU45dDRadmcKLS0tIHV3L3hOVmJjL0hMRXBQa05lMlRs
17+
ZW45TndPeE9GcmRNeWFkR3YxeHg0YzQKJBp6KRlFFUE8jbAQUBlcAwaaQcPAflJD
18+
pWGoOjYP33gTxJHNPg==
19+
-----END AGE ENCRYPTED FILE-----
20+
21+

internal/inspect/inspect.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"bytes"
66
"fmt"
77
"io"
8+
"strings"
89

910
"filippo.io/age/armor"
1011
"filippo.io/age/internal/format"
@@ -38,7 +39,9 @@ func Inspect(r io.Reader, fileSize int64) (*Metadata, error) {
3839

3940
tr := &trackReader{r: r}
4041
br := bufio.NewReader(tr)
41-
if start, _ := br.Peek(len(armor.Header)); string(start) == armor.Header {
42+
const maxWhitespace = 1024
43+
start, _ := br.Peek(maxWhitespace + len(armor.Header))
44+
if strings.HasPrefix(string(bytes.TrimSpace(start)), armor.Header) {
4245
r = armor.NewReader(br)
4346
data.Armor = true
4447
} else {

0 commit comments

Comments
 (0)