Skip to content

Commit 84b81bc

Browse files
committed
pgp: do not fail on expired keys
1 parent d2c5f5e commit 84b81bc

7 files changed

Lines changed: 42 additions & 23 deletions

File tree

deb/remote.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ func (repo *RemoteRepo) Fetch(d aptly.Downloader, verifier pgp.Verifier, ignoreS
417417
return err
418418
}
419419

420-
err = verifier.VerifyDetachedSignature(releasesig, release, true)
420+
_, err = verifier.VerifyDetachedSignature(releasesig, release, true)
421421
if err != nil {
422422
return err
423423
}
@@ -600,7 +600,7 @@ func (repo *RemoteRepo) DownloadPackageIndexes(progress aptly.Progress, d aptly.
600600
return err
601601
}
602602

603-
err = verifier.VerifyDetachedSignature(filesig, packagesFile, false)
603+
_, err = verifier.VerifyDetachedSignature(filesig, packagesFile, false)
604604
if err != nil {
605605
return err
606606
}

deb/remote_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ func (n *NullVerifier) InitKeyring(_ bool) error {
2929
func (n *NullVerifier) AddKeyring(keyring string) {
3030
}
3131

32-
func (n *NullVerifier) VerifyDetachedSignature(signature, cleartext io.Reader, hint bool) error {
33-
return nil
32+
func (n *NullVerifier) VerifyDetachedSignature(signature, cleartext io.Reader, hint bool) (*pgp.KeyInfo, error) {
33+
return &pgp.KeyInfo{}, nil
3434
}
3535

3636
func (n *NullVerifier) VerifyClearsigned(clearsigned io.Reader, hint bool) (*pgp.KeyInfo, error) {

pgp/gnupg.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -292,12 +292,12 @@ func (g *GpgVerifier) runGpgv(args []string, context string, showKeyTip bool) (*
292292
}
293293

294294
// VerifyDetachedSignature verifies combination of signature and cleartext using gpgv
295-
func (g *GpgVerifier) VerifyDetachedSignature(signature, cleartext io.Reader, showKeyTip bool) error {
295+
func (g *GpgVerifier) VerifyDetachedSignature(signature, cleartext io.Reader, showKeyTip bool) (*KeyInfo, error) {
296296
args := g.argsKeyrings()
297297

298298
sigf, err := os.CreateTemp("", "aptly-gpg")
299299
if err != nil {
300-
return err
300+
return nil, err
301301
}
302302
defer func() {
303303
_ = os.Remove(sigf.Name())
@@ -306,12 +306,12 @@ func (g *GpgVerifier) VerifyDetachedSignature(signature, cleartext io.Reader, sh
306306

307307
_, err = io.Copy(sigf, signature)
308308
if err != nil {
309-
return err
309+
return nil, err
310310
}
311311

312312
clearf, err := os.CreateTemp("", "aptly-gpg")
313313
if err != nil {
314-
return err
314+
return nil, err
315315
}
316316
defer func() {
317317
_ = os.Remove(clearf.Name())
@@ -320,12 +320,16 @@ func (g *GpgVerifier) VerifyDetachedSignature(signature, cleartext io.Reader, sh
320320

321321
_, err = io.Copy(clearf, cleartext)
322322
if err != nil {
323-
return err
323+
return nil, err
324324
}
325325

326326
args = append(args, sigf.Name(), clearf.Name())
327327
_, err = g.runGpgv(args, "detached signature", showKeyTip)
328-
return err
328+
if err != nil {
329+
return nil, err
330+
}
331+
332+
return &KeyInfo{}, nil
329333
}
330334

331335
// IsClearSigned returns true if file contains signature

pgp/internal.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ func (g *GoVerifier) printLog(signers []signatureResult) {
392392
}
393393

394394
// VerifyDetachedSignature verifies combination of signature and cleartext using gpgv
395-
func (g *GoVerifier) VerifyDetachedSignature(signature, cleartext io.Reader, showKeyTip bool) error {
395+
func (g *GoVerifier) VerifyDetachedSignature(signature, cleartext io.Reader, showKeyTip bool) (*KeyInfo, error) {
396396
var signatureBuf bytes.Buffer
397397

398398
signers, missingKeys, err := checkArmoredDetachedSignature(g.trustedKeyring, cleartext, io.TeeReader(signature, &signatureBuf))
@@ -409,16 +409,24 @@ func (g *GoVerifier) VerifyDetachedSignature(signature, cleartext io.Reader, sho
409409
}
410410

411411
if err != nil {
412-
return errors.Wrap(err, "failed to verify detached signature")
412+
return nil, errors.Wrap(err, "failed to verify detached signature")
413413
}
414414

415+
result := &KeyInfo{}
416+
415417
for _, signer := range signers {
416-
if signer.Entity != nil && signer.IsExpired {
417-
return errors.Errorf("signature key %s has expired", KeyFromUint64(signer.IssuerKeyID))
418+
if signer.Entity != nil {
419+
if signer.IsExpired {
420+
result.ExpiredKeys = append(result.ExpiredKeys, KeyFromUint64(signer.IssuerKeyID))
421+
} else {
422+
result.GoodKeys = append(result.GoodKeys, KeyFromUint64(signer.IssuerKeyID))
423+
}
424+
} else {
425+
result.MissingKeys = append(result.MissingKeys, KeyFromUint64(signer.IssuerKeyID))
418426
}
419427
}
420428

421-
return nil
429+
return result, nil
422430
}
423431

424432
// IsClearSigned returns true if file contains signature

pgp/pgp.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ type Signer interface {
5454
type Verifier interface {
5555
InitKeyring(verbose bool) error
5656
AddKeyring(keyring string)
57-
VerifyDetachedSignature(signature, cleartext io.Reader, showKeyTip bool) error
57+
VerifyDetachedSignature(signature, cleartext io.Reader, showKeyTip bool) (*KeyInfo, error)
5858
IsClearSigned(clearsigned io.Reader) (bool, error)
5959
VerifyClearsigned(clearsigned io.Reader, showKeyTip bool) (*KeyInfo, error)
6060
ExtractClearsigned(clearsigned io.Reader) (text *os.File, err error)

pgp/sign_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ func (s *SignerSuite) testSignDetached(c *C) {
7272
err := s.signer.DetachedSign(s.clearF.Name(), s.signedF.Name())
7373
c.Assert(err, IsNil)
7474

75-
err = s.verifier.VerifyDetachedSignature(s.signedF, s.clearF, false)
75+
_, err = s.verifier.VerifyDetachedSignature(s.signedF, s.clearF, false)
7676
c.Assert(err, IsNil)
7777
}
7878

pgp/verify_test.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,25 @@ type VerifierSuite struct {
1616
func (s *VerifierSuite) TestVerifyDetached(c *C) {
1717
for _, test := range []struct {
1818
textName, signatureName string
19+
expiredKeys []Key
1920
}{
20-
{"1.text", "1.signature"},
21-
{"2.text", "2.signature"},
22-
{"3.text", "3.signature"},
23-
{"4.text", "4.signature"},
21+
{"1.text", "1.signature", nil},
22+
{"2.text", "2.signature", nil},
23+
{"3.text", "3.signature", nil},
24+
// 4.signature is signed by an expired key (wheezy, 8B48AD6246925553)
25+
{"4.text", "4.signature", []Key{"8B48AD6246925553"}},
2426
} {
2527
cleartext, err := os.Open(test.textName)
2628
c.Assert(err, IsNil)
2729

2830
signature, err := os.Open(test.signatureName)
2931
c.Assert(err, IsNil)
3032

31-
err = s.verifier.VerifyDetachedSignature(signature, cleartext, false)
33+
keyInfo, err := s.verifier.VerifyDetachedSignature(signature, cleartext, false)
3234
c.Assert(err, IsNil)
35+
if test.expiredKeys != nil {
36+
c.Check(keyInfo.ExpiredKeys, DeepEquals, test.expiredKeys)
37+
}
3338

3439
_ = signature.Close()
3540
_ = cleartext.Close()
@@ -47,8 +52,10 @@ func (s *VerifierSuite) TestVerifyClearsigned(c *C) {
4752

4853
keyInfo, err := s.verifier.VerifyClearsigned(clearsigned, false)
4954
c.Assert(err, IsNil)
50-
c.Check(keyInfo.GoodKeys, DeepEquals, []Key{"04EE7237B7D453EC", "648ACFD622F3D138", "DCC9EFBF77E11517"})
55+
// 04EE7237B7D453EC (stretch) is expired and must appear in ExpiredKeys, not GoodKeys
56+
c.Check(keyInfo.GoodKeys, DeepEquals, []Key{"648ACFD622F3D138", "DCC9EFBF77E11517"})
5157
c.Check(keyInfo.MissingKeys, DeepEquals, []Key(nil))
58+
c.Check(keyInfo.ExpiredKeys, DeepEquals, []Key{"04EE7237B7D453EC"})
5259

5360
_ = clearsigned.Close()
5461
}

0 commit comments

Comments
 (0)