Skip to content

Commit c25e074

Browse files
authored
Put support for reading v5 packets behind a feature flag (#212)
* Put v5 support behind a feature flag
1 parent 3df78a3 commit c25e074

12 files changed

+76
-6
lines changed

openpgp/keys_v5_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@ import (
44
"bytes"
55
"strings"
66
"testing"
7+
8+
"github.com/ProtonMail/go-crypto/openpgp/packet"
79
)
810

911
var foreignKeys = []string{
1012
v5PrivKey,
1113
}
1214

1315
func TestReadPrivateForeignV5Key(t *testing.T) {
16+
if packet.V5Disabled {
17+
t.Skip()
18+
}
1419
for _, str := range foreignKeys {
1520
kring, err := ReadArmoredKeyRing(strings.NewReader(str))
1621
if err != nil {
@@ -21,6 +26,9 @@ func TestReadPrivateForeignV5Key(t *testing.T) {
2126
}
2227

2328
func TestReadPrivateSerializeForeignV5Key(t *testing.T) {
29+
if packet.V5Disabled {
30+
t.Skip()
31+
}
2432
for _, str := range foreignKeys {
2533
el, err := ReadArmoredKeyRing(strings.NewReader(str))
2634
if err != nil {

openpgp/packet/config.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,15 @@ var (
2929
}
3030
)
3131

32+
// A global feature flag to indicate v5 support.
33+
// Can be set via a build tag, e.g.: `go build -tags v5 ./...`
34+
// If the build tag is missing config_v5.go will set it to true.
35+
//
36+
// Disables parsing of v5 keys and v5 signatures.
37+
// These are non-standard entities, which in the crypto-refresh have been superseded
38+
// by v6 keys, v6 signatures and SEIPDv2 encrypted data, respectively.
39+
var V5Disabled = false
40+
3241
// Config collects a number of parameters along with sensible defaults.
3342
// A nil *Config is valid and results in all default values.
3443
type Config struct {

openpgp/packet/config_v5.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
//go:build !v5
2+
3+
package packet
4+
5+
func init() {
6+
V5Disabled = true
7+
}

openpgp/packet/private_key.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,10 @@ func (pk *PrivateKey) parse(r io.Reader) (err error) {
202202
v5 := pk.PublicKey.Version == 5
203203
v6 := pk.PublicKey.Version == 6
204204

205+
if V5Disabled && v5 {
206+
return errors.UnsupportedError("support for parsing v5 entities is disabled; build with `-tags v5` if needed")
207+
}
208+
205209
var buf [1]byte
206210
_, err = readFull(r, buf[:])
207211
if err != nil {

openpgp/packet/public_key.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,11 +236,16 @@ func (pk *PublicKey) parse(r io.Reader) (err error) {
236236
if err != nil {
237237
return
238238
}
239-
if buf[0] != 4 && buf[0] != 5 && buf[0] != 6 {
239+
240+
pk.Version = int(buf[0])
241+
if pk.Version != 4 && pk.Version != 5 && pk.Version != 6 {
240242
return errors.UnsupportedError("public key version " + strconv.Itoa(int(buf[0])))
241243
}
242244

243-
pk.Version = int(buf[0])
245+
if V5Disabled && pk.Version == 5 {
246+
return errors.UnsupportedError("support for parsing v5 entities is disabled; build with `-tags v5` if needed")
247+
}
248+
244249
if pk.Version >= 5 {
245250
// Read the four-octet scalar octet count
246251
// The count is not used in this implementation

openpgp/packet/signature.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,16 @@ func (sig *Signature) parse(r io.Reader) (err error) {
149149
if err != nil {
150150
return
151151
}
152-
if buf[0] != 4 && buf[0] != 5 && buf[0] != 6 {
152+
sig.Version = int(buf[0])
153+
if sig.Version != 4 && sig.Version != 5 && sig.Version != 6 {
153154
err = errors.UnsupportedError("signature packet version " + strconv.Itoa(int(buf[0])))
154155
return
155156
}
156-
sig.Version = int(buf[0])
157+
158+
if V5Disabled && sig.Version == 5 {
159+
return errors.UnsupportedError("support for parsing v5 entities is disabled; build with `-tags v5` if needed")
160+
}
161+
157162
if sig.Version == 6 {
158163
_, err = readFull(r, buf[:7])
159164
} else {

openpgp/packet/symmetric_key_encrypted.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ func (ske *SymmetricKeyEncrypted) parse(r io.Reader) error {
4545
return errors.UnsupportedError("unknown SymmetricKeyEncrypted version")
4646
}
4747

48+
if V5Disabled && ske.Version == 5 {
49+
return errors.UnsupportedError("support for parsing v5 entities is disabled; build with `-tags v5` if needed")
50+
}
51+
4852
if ske.Version > 5 {
4953
// Scalar octet count
5054
if _, err := readFull(r, buf[:]); err != nil {

openpgp/packet/symmetric_key_encrypted_data_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@ type packetSequence struct {
99
contents string
1010
}
1111

12-
var keyAndIpePackets = []*packetSequence{symEncTestv6, aeadEaxRFC, aeadOcbRFC}
12+
func keyAndIpePackets() []*packetSequence {
13+
if V5Disabled {
14+
return []*packetSequence{symEncTestv6}
15+
}
16+
return []*packetSequence{symEncTestv6, aeadEaxRFC, aeadOcbRFC}
17+
}
1318

1419
// https://www.ietf.org/archive/id/draft-koch-openpgp-2015-rfc4880bis-00.html#name-complete-aead-eax-encrypted-
1520
var aeadEaxRFC = &packetSequence{

openpgp/packet/symmetric_key_encrypted_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ const maxPassLen = 64
1919

2020
// Tests against RFC vectors
2121
func TestDecryptSymmetricKeyAndEncryptedDataPacket(t *testing.T) {
22-
for _, testCase := range keyAndIpePackets {
22+
for _, testCase := range keyAndIpePackets() {
2323
// Key
2424
buf := readerFromHex(testCase.packets)
2525
packet, err := Read(buf)

openpgp/read_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,9 @@ func TestSymmetricDecryptionArgon2(t *testing.T) {
673673
}
674674

675675
func TestAsymmestricAeadOcbOpenPGPjsCompressedMessage(t *testing.T) {
676+
if packet.V5Disabled {
677+
t.Skip()
678+
}
676679
// Read key from file
677680
armored, err := os.Open("test_data/aead-ocb-asym-key.asc")
678681
if err != nil {
@@ -719,6 +722,9 @@ func TestAsymmestricAeadOcbOpenPGPjsCompressedMessage(t *testing.T) {
719722
}
720723

721724
func TestSymmetricAeadEaxOpenPGPJsMessage(t *testing.T) {
725+
if packet.V5Disabled {
726+
t.Skip()
727+
}
722728
key := []byte{79, 41, 206, 112, 224, 133, 140, 223, 27, 61, 227, 57, 114,
723729
118, 64, 60, 177, 26, 42, 174, 151, 5, 186, 74, 226, 97, 214, 63, 114, 77,
724730
215, 121}
@@ -890,6 +896,9 @@ func TestMessageWithoutMdc(t *testing.T) {
890896
}
891897

892898
func TestReadV5Messages(t *testing.T) {
899+
if packet.V5Disabled {
900+
t.Skip()
901+
}
893902
key, err := ReadArmoredKeyRing(strings.NewReader(keyv5Test))
894903
if err != nil {
895904
t.Error(err)

openpgp/v2/keys_v5_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@ import (
44
"bytes"
55
"strings"
66
"testing"
7+
8+
"github.com/ProtonMail/go-crypto/openpgp/packet"
79
)
810

911
var foreignKeys = []string{
1012
v5PrivKey,
1113
}
1214

1315
func TestReadPrivateForeignV5Key(t *testing.T) {
16+
if packet.V5Disabled {
17+
t.Skip()
18+
}
1419
for _, str := range foreignKeys {
1520
kring, err := ReadArmoredKeyRing(strings.NewReader(str))
1621
if err != nil {
@@ -21,6 +26,9 @@ func TestReadPrivateForeignV5Key(t *testing.T) {
2126
}
2227

2328
func TestReadPrivateSerializeForeignV5Key(t *testing.T) {
29+
if packet.V5Disabled {
30+
t.Skip()
31+
}
2432
for _, str := range foreignKeys {
2533
el, err := ReadArmoredKeyRing(strings.NewReader(str))
2634
if err != nil {

openpgp/v2/read_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,9 @@ func TestSymmetricDecryptionArgon2(t *testing.T) {
704704
}
705705

706706
func TestAsymmestricAeadOcbOpenPGPjsCompressedMessage(t *testing.T) {
707+
if packet.V5Disabled {
708+
t.Skip()
709+
}
707710
// Read key from file
708711
armored, err := os.Open("../test_data/aead-ocb-asym-key.asc")
709712
if err != nil {
@@ -750,6 +753,9 @@ func TestAsymmestricAeadOcbOpenPGPjsCompressedMessage(t *testing.T) {
750753
}
751754

752755
func TestSymmetricAeadEaxOpenPGPJsMessage(t *testing.T) {
756+
if packet.V5Disabled {
757+
t.Skip()
758+
}
753759
key := []byte{79, 41, 206, 112, 224, 133, 140, 223, 27, 61, 227, 57, 114,
754760
118, 64, 60, 177, 26, 42, 174, 151, 5, 186, 74, 226, 97, 214, 63, 114, 77,
755761
215, 121}

0 commit comments

Comments
 (0)