Skip to content

Commit 16ef709

Browse files
committed
fix: use updated OpenPGP implementation
Fixes syncthing/syncthing#9835
1 parent e0cd194 commit 16ef709

File tree

3 files changed

+38
-30
lines changed

3 files changed

+38
-30
lines changed

go.mod

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,18 @@ module kastelo.dev/ezapt
33
go 1.23.3
44

55
require (
6+
github.com/ProtonMail/go-crypto v1.1.3
67
github.com/alecthomas/kong v1.4.0
7-
golang.org/x/crypto v0.9.0
88
golang.org/x/mod v0.22.0
99
pault.ag/go/debian v0.17.0
1010
)
1111

1212
require (
13+
github.com/cloudflare/circl v1.5.0 // indirect
1314
github.com/kjk/lzma v0.0.0-20161016003348-3fd93898850d // indirect
1415
github.com/klauspost/compress v1.16.5 // indirect
1516
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
17+
golang.org/x/crypto v0.29.0 // indirect
18+
golang.org/x/sys v0.27.0 // indirect
1619
pault.ag/go/topsort v0.1.1 // indirect
1720
)

go.sum

+14-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1+
github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk=
2+
github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
13
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
24
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
35
github.com/alecthomas/kong v1.4.0 h1:UL7tzGMnnY0YRMMvJyITIRX1EpO6RbBRZDNcCevy3HA=
46
github.com/alecthomas/kong v1.4.0/go.mod h1:p2vqieVMeTAnaC83txKtXe8FLke2X07aruPWXyMPQrU=
57
github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
68
github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
9+
github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
10+
github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
11+
github.com/cloudflare/circl v1.5.0 h1:hxIWksrX6XN5a1L2TI/h53AGPhNHoUBo+TD1ms9+pys=
12+
github.com/cloudflare/circl v1.5.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
713
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
814
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
915
github.com/kjk/lzma v0.0.0-20161016003348-3fd93898850d h1:RnWZeH8N8KXfbwMTex/KKMYMj0FJRCF6tQubUuQ02GM=
@@ -12,10 +18,16 @@ github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/d
1218
github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
1319
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo=
1420
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
15-
golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
16-
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
21+
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
22+
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
23+
golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ=
24+
golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg=
1725
golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
1826
golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
27+
golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
28+
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
29+
golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
30+
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
1931
pault.ag/go/debian v0.17.0 h1:H+frUQv9X5yoJpYE0MLdqoAdyoHQizFL6vq+4qMMKrc=
2032
pault.ag/go/debian v0.17.0/go.mod h1:JFl0XWRCv9hWBrB5MDDZjA5GSEs1X3zcFK/9kCNIUmE=
2133
pault.ag/go/topsort v0.1.1 h1:L0QnhUly6LmTv0e3DEzbN2q6/FGgAcQvaEw65S53Bg4=

internal/publish/pgp.go

+20-27
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,33 @@ package publish
22

33
import (
44
"crypto"
5+
"encoding/hex"
56
"fmt"
67
"io"
8+
"log/slog"
79

8-
_ "crypto/sha256"
9-
10-
_ "golang.org/x/crypto/ripemd160"
11-
12-
"golang.org/x/crypto/openpgp"
13-
"golang.org/x/crypto/openpgp/clearsign"
14-
"golang.org/x/crypto/openpgp/packet"
10+
"github.com/ProtonMail/go-crypto/openpgp/clearsign"
11+
"github.com/ProtonMail/go-crypto/openpgp/packet"
12+
openpgp "github.com/ProtonMail/go-crypto/openpgp/v2"
1513
)
1614

1715
type signer struct {
18-
keys []*packet.PrivateKey
16+
entities []*openpgp.Entity
1917
}
2018

2119
func newSigner(keychain io.Reader) (*signer, error) {
2220
pr := packet.NewReader(keychain)
2321
s := &signer{}
2422
for {
25-
pkt, err := pr.Next()
23+
ent, err := openpgp.ReadEntity(pr)
2624
if err == io.EOF {
2725
break
2826
}
2927
if err != nil {
3028
return nil, err
3129
}
32-
if key, ok := pkt.(*packet.PrivateKey); ok {
33-
if !key.IsSubkey && key.PublicKey.PublicKey != nil {
34-
s.keys = append(s.keys, key)
35-
}
36-
}
30+
slog.Info("Loaded key", "fingerprint", hex.EncodeToString(ent.PrimaryKey.Fingerprint))
31+
s.entities = append(s.entities, ent)
3732
}
3833
return s, nil
3934
}
@@ -44,30 +39,28 @@ type seekable interface {
4439
}
4540

4641
func (s *signer) DetachSign(in seekable, out io.Writer) error {
47-
if len(s.keys) == 0 {
48-
return fmt.Errorf("no private keys found")
42+
if len(s.entities) == 0 {
43+
return fmt.Errorf("no entities")
4944
}
5045
cfg := &packet.Config{
5146
DefaultHash: crypto.SHA256,
5247
}
53-
for _, key := range s.keys {
54-
if _, err := in.Seek(0, io.SeekStart); err != nil {
55-
return err
56-
}
57-
signer := &openpgp.Entity{PrivateKey: key}
58-
if err := openpgp.DetachSign(out, signer, in, cfg); err != nil {
59-
return err
60-
}
48+
if err := openpgp.DetachSign(out, s.entities, in, cfg); err != nil {
49+
return err
6150
}
6251
return nil
6352
}
6453

6554
func (s *signer) ClearSign(in seekable, out io.Writer) error {
66-
if len(s.keys) == 0 {
67-
return fmt.Errorf("no private keys found")
55+
if len(s.entities) == 0 {
56+
return fmt.Errorf("no entities")
6857
}
6958

70-
w, err := clearsign.EncodeMulti(out, s.keys, nil)
59+
keys := make([]*packet.PrivateKey, len(s.entities))
60+
for i, e := range s.entities {
61+
keys[i] = e.PrivateKey
62+
}
63+
w, err := clearsign.EncodeMulti(out, keys, nil)
7164
if err != nil {
7265
return err
7366
}

0 commit comments

Comments
 (0)