...
1
2
3
4
5 package packet
6
7 import (
8 "io"
9
10 "github.com/ProtonMail/go-crypto/openpgp/errors"
11 )
12
13 const aeadSaltSize = 32
14
15
16
17
18 type SymmetricallyEncrypted struct {
19 Version int
20 Contents io.Reader
21 IntegrityProtected bool
22
23
24 prefix []byte
25
26
27 Cipher CipherFunction
28 Mode AEADMode
29 ChunkSizeByte byte
30 Salt [aeadSaltSize]byte
31 }
32
33 const (
34 symmetricallyEncryptedVersionMdc = 1
35 symmetricallyEncryptedVersionAead = 2
36 )
37
38 func (se *SymmetricallyEncrypted) parse(r io.Reader) error {
39 if se.IntegrityProtected {
40
41 var buf [1]byte
42 _, err := readFull(r, buf[:])
43 if err != nil {
44 return err
45 }
46
47 switch buf[0] {
48 case symmetricallyEncryptedVersionMdc:
49 se.Version = symmetricallyEncryptedVersionMdc
50 case symmetricallyEncryptedVersionAead:
51 se.Version = symmetricallyEncryptedVersionAead
52 if err := se.parseAead(r); err != nil {
53 return err
54 }
55 default:
56 return errors.UnsupportedError("unknown SymmetricallyEncrypted version")
57 }
58 }
59 se.Contents = r
60 return nil
61 }
62
63
64
65
66 func (se *SymmetricallyEncrypted) Decrypt(c CipherFunction, key []byte) (io.ReadCloser, error) {
67 if se.Version == symmetricallyEncryptedVersionAead {
68 return se.decryptAead(key)
69 }
70
71 return se.decryptMdc(c, key)
72 }
73
74
75
76
77
78 func SerializeSymmetricallyEncrypted(w io.Writer, c CipherFunction, aeadSupported bool, cipherSuite CipherSuite, key []byte, config *Config) (Contents io.WriteCloser, err error) {
79 writeCloser := noOpCloser{w}
80 ciphertext, err := serializeStreamHeader(writeCloser, packetTypeSymmetricallyEncryptedIntegrityProtected)
81 if err != nil {
82 return
83 }
84
85 if aeadSupported {
86 return serializeSymmetricallyEncryptedAead(ciphertext, cipherSuite, config.AEADConfig.ChunkSizeByte(), config.Random(), key)
87 }
88
89 return serializeSymmetricallyEncryptedMdc(ciphertext, c, key, config)
90 }
91
View as plain text