88
99 "github.com/ProtonMail/go-crypto/openpgp"
1010 "github.com/ProtonMail/go-crypto/openpgp/packet"
11+ "github.com/ProtonMail/gopenpgp/v2/constants"
1112 "github.com/pkg/errors"
1213)
1314
@@ -44,6 +45,47 @@ func (keyRing *KeyRing) EncryptStream(
4445) (plainMessageWriter WriteCloser , err error ) {
4546 config := & packet.Config {DefaultCipher : packet .CipherAES256 , Time : getTimeGenerator ()}
4647
48+ return keyRing .encryptStreamWithConfig (
49+ config ,
50+ pgpMessageWriter ,
51+ pgpMessageWriter ,
52+ plainMessageMetadata ,
53+ signKeyRing ,
54+ )
55+ }
56+
57+ // EncryptStreamWithCompression is used to encrypt data as a Writer.
58+ // The plaintext data is compressed before being encrypted.
59+ // It takes a writer for the encrypted data and returns a WriteCloser for the plaintext data
60+ // If signKeyRing is not nil, it is used to do an embedded signature.
61+ func (keyRing * KeyRing ) EncryptStreamWithCompression (
62+ pgpMessageWriter Writer ,
63+ plainMessageMetadata * PlainMessageMetadata ,
64+ signKeyRing * KeyRing ,
65+ ) (plainMessageWriter WriteCloser , err error ) {
66+ config := & packet.Config {
67+ DefaultCipher : packet .CipherAES256 ,
68+ Time : getTimeGenerator (),
69+ DefaultCompressionAlgo : constants .DefaultCompression ,
70+ CompressionConfig : & packet.CompressionConfig {Level : constants .DefaultCompressionLevel },
71+ }
72+
73+ return keyRing .encryptStreamWithConfig (
74+ config ,
75+ pgpMessageWriter ,
76+ pgpMessageWriter ,
77+ plainMessageMetadata ,
78+ signKeyRing ,
79+ )
80+ }
81+
82+ func (keyRing * KeyRing ) encryptStreamWithConfig (
83+ config * packet.Config ,
84+ keyPacketWriter Writer ,
85+ dataPacketWriter Writer ,
86+ plainMessageMetadata * PlainMessageMetadata ,
87+ signKeyRing * KeyRing ,
88+ ) (plainMessageWriter WriteCloser , err error ) {
4789 if plainMessageMetadata == nil {
4890 // Use sensible default metadata
4991 plainMessageMetadata = & PlainMessageMetadata {
@@ -59,7 +101,7 @@ func (keyRing *KeyRing) EncryptStream(
59101 ModTime : time .Unix (plainMessageMetadata .ModTime , 0 ),
60102 }
61103
62- plainMessageWriter , err = asymmetricEncryptStream (hints , pgpMessageWriter , pgpMessageWriter , keyRing , signKeyRing , config )
104+ plainMessageWriter , err = asymmetricEncryptStream (hints , keyPacketWriter , dataPacketWriter , keyRing , signKeyRing , config )
63105 if err != nil {
64106 return nil , err
65107 }
@@ -109,26 +151,55 @@ func (keyRing *KeyRing) EncryptSplitStream(
109151) (* EncryptSplitResult , error ) {
110152 config := & packet.Config {DefaultCipher : packet .CipherAES256 , Time : getTimeGenerator ()}
111153
112- if plainMessageMetadata == nil {
113- // Use sensible default metadata
114- plainMessageMetadata = & PlainMessageMetadata {
115- IsBinary : true ,
116- Filename : "" ,
117- ModTime : GetUnixTime (),
118- }
154+ var keyPacketBuf bytes.Buffer
155+
156+ plainMessageWriter , err := keyRing .encryptStreamWithConfig (
157+ config ,
158+ & keyPacketBuf ,
159+ dataPacketWriter ,
160+ plainMessageMetadata ,
161+ signKeyRing ,
162+ )
163+ if err != nil {
164+ return nil , err
119165 }
120166
121- hints := & openpgp.FileHints {
122- FileName : plainMessageMetadata .Filename ,
123- IsBinary : plainMessageMetadata .IsBinary ,
124- ModTime : time .Unix (plainMessageMetadata .ModTime , 0 ),
167+ return & EncryptSplitResult {
168+ keyPacketBuf : & keyPacketBuf ,
169+ plainMessageWriter : plainMessageWriter ,
170+ }, nil
171+ }
172+
173+ // EncryptSplitStreamWithCompression is used to encrypt data as a stream.
174+ // It takes a writer for the Symmetrically Encrypted Data Packet
175+ // (https://datatracker.ietf.org/doc/html/rfc4880#section-5.7)
176+ // and returns a writer for the plaintext data and the key packet.
177+ // If signKeyRing is not nil, it is used to do an embedded signature.
178+ func (keyRing * KeyRing ) EncryptSplitStreamWithCompression (
179+ dataPacketWriter Writer ,
180+ plainMessageMetadata * PlainMessageMetadata ,
181+ signKeyRing * KeyRing ,
182+ ) (* EncryptSplitResult , error ) {
183+ config := & packet.Config {
184+ DefaultCipher : packet .CipherAES256 ,
185+ Time : getTimeGenerator (),
186+ DefaultCompressionAlgo : constants .DefaultCompression ,
187+ CompressionConfig : & packet.CompressionConfig {Level : constants .DefaultCompressionLevel },
125188 }
126189
127190 var keyPacketBuf bytes.Buffer
128- plainMessageWriter , err := asymmetricEncryptStream (hints , & keyPacketBuf , dataPacketWriter , keyRing , signKeyRing , config )
191+
192+ plainMessageWriter , err := keyRing .encryptStreamWithConfig (
193+ config ,
194+ & keyPacketBuf ,
195+ dataPacketWriter ,
196+ plainMessageMetadata ,
197+ signKeyRing ,
198+ )
129199 if err != nil {
130200 return nil , err
131201 }
202+
132203 return & EncryptSplitResult {
133204 keyPacketBuf : & keyPacketBuf ,
134205 plainMessageWriter : plainMessageWriter ,
0 commit comments