1
2
3
4
5
6
7 package packet
8
9 import (
10 "bytes"
11 "crypto/cipher"
12 "crypto/rsa"
13 "io"
14
15 "github.com/ProtonMail/go-crypto/openpgp/errors"
16 "github.com/ProtonMail/go-crypto/openpgp/internal/algorithm"
17 )
18
19
20
21 func readFull(r io.Reader, buf []byte) (n int, err error) {
22 n, err = io.ReadFull(r, buf)
23 if err == io.EOF {
24 err = io.ErrUnexpectedEOF
25 }
26 return
27 }
28
29
30 func readLength(r io.Reader) (length int64, isPartial bool, err error) {
31 var buf [4]byte
32 _, err = readFull(r, buf[:1])
33 if err != nil {
34 return
35 }
36 switch {
37 case buf[0] < 192:
38 length = int64(buf[0])
39 case buf[0] < 224:
40 length = int64(buf[0]-192) << 8
41 _, err = readFull(r, buf[0:1])
42 if err != nil {
43 return
44 }
45 length += int64(buf[0]) + 192
46 case buf[0] < 255:
47 length = int64(1) << (buf[0] & 0x1f)
48 isPartial = true
49 default:
50 _, err = readFull(r, buf[0:4])
51 if err != nil {
52 return
53 }
54 length = int64(buf[0])<<24 |
55 int64(buf[1])<<16 |
56 int64(buf[2])<<8 |
57 int64(buf[3])
58 }
59 return
60 }
61
62
63
64
65 type partialLengthReader struct {
66 r io.Reader
67 remaining int64
68 isPartial bool
69 }
70
71 func (r *partialLengthReader) Read(p []byte) (n int, err error) {
72 for r.remaining == 0 {
73 if !r.isPartial {
74 return 0, io.EOF
75 }
76 r.remaining, r.isPartial, err = readLength(r.r)
77 if err != nil {
78 return 0, err
79 }
80 }
81
82 toRead := int64(len(p))
83 if toRead > r.remaining {
84 toRead = r.remaining
85 }
86
87 n, err = r.r.Read(p[:int(toRead)])
88 r.remaining -= int64(n)
89 if n < int(toRead) && err == io.EOF {
90 err = io.ErrUnexpectedEOF
91 }
92 return
93 }
94
95
96
97 type partialLengthWriter struct {
98 w io.WriteCloser
99 buf bytes.Buffer
100 lengthByte [1]byte
101 }
102
103 func (w *partialLengthWriter) Write(p []byte) (n int, err error) {
104 bufLen := w.buf.Len()
105 if bufLen > 512 {
106 for power := uint(30); ; power-- {
107 l := 1 << power
108 if bufLen >= l {
109 w.lengthByte[0] = 224 + uint8(power)
110 _, err = w.w.Write(w.lengthByte[:])
111 if err != nil {
112 return
113 }
114 var m int
115 m, err = w.w.Write(w.buf.Next(l))
116 if err != nil {
117 return
118 }
119 if m != l {
120 return 0, io.ErrShortWrite
121 }
122 break
123 }
124 }
125 }
126 return w.buf.Write(p)
127 }
128
129 func (w *partialLengthWriter) Close() (err error) {
130 len := w.buf.Len()
131 err = serializeLength(w.w, len)
132 if err != nil {
133 return err
134 }
135 _, err = w.buf.WriteTo(w.w)
136 if err != nil {
137 return err
138 }
139 return w.w.Close()
140 }
141
142
143
144 type spanReader struct {
145 r io.Reader
146 n int64
147 }
148
149 func (l *spanReader) Read(p []byte) (n int, err error) {
150 if l.n <= 0 {
151 return 0, io.EOF
152 }
153 if int64(len(p)) > l.n {
154 p = p[0:l.n]
155 }
156 n, err = l.r.Read(p)
157 l.n -= int64(n)
158 if l.n > 0 && err == io.EOF {
159 err = io.ErrUnexpectedEOF
160 }
161 return
162 }
163
164
165
166 func readHeader(r io.Reader) (tag packetType, length int64, contents io.Reader, err error) {
167 var buf [4]byte
168 _, err = io.ReadFull(r, buf[:1])
169 if err != nil {
170 return
171 }
172 if buf[0]&0x80 == 0 {
173 err = errors.StructuralError("tag byte does not have MSB set")
174 return
175 }
176 if buf[0]&0x40 == 0 {
177
178 tag = packetType((buf[0] & 0x3f) >> 2)
179 lengthType := buf[0] & 3
180 if lengthType == 3 {
181 length = -1
182 contents = r
183 return
184 }
185 lengthBytes := 1 << lengthType
186 _, err = readFull(r, buf[0:lengthBytes])
187 if err != nil {
188 return
189 }
190 for i := 0; i < lengthBytes; i++ {
191 length <<= 8
192 length |= int64(buf[i])
193 }
194 contents = &spanReader{r, length}
195 return
196 }
197
198
199 tag = packetType(buf[0] & 0x3f)
200 length, isPartial, err := readLength(r)
201 if err != nil {
202 return
203 }
204 if isPartial {
205 contents = &partialLengthReader{
206 remaining: length,
207 isPartial: true,
208 r: r,
209 }
210 length = -1
211 } else {
212 contents = &spanReader{r, length}
213 }
214 return
215 }
216
217
218
219 func serializeHeader(w io.Writer, ptype packetType, length int) (err error) {
220 err = serializeType(w, ptype)
221 if err != nil {
222 return
223 }
224 return serializeLength(w, length)
225 }
226
227
228
229 func serializeType(w io.Writer, ptype packetType) (err error) {
230 var buf [1]byte
231 buf[0] = 0x80 | 0x40 | byte(ptype)
232 _, err = w.Write(buf[:])
233 return
234 }
235
236
237
238 func serializeLength(w io.Writer, length int) (err error) {
239 var buf [5]byte
240 var n int
241
242 if length < 192 {
243 buf[0] = byte(length)
244 n = 1
245 } else if length < 8384 {
246 length -= 192
247 buf[0] = 192 + byte(length>>8)
248 buf[1] = byte(length)
249 n = 2
250 } else {
251 buf[0] = 255
252 buf[1] = byte(length >> 24)
253 buf[2] = byte(length >> 16)
254 buf[3] = byte(length >> 8)
255 buf[4] = byte(length)
256 n = 5
257 }
258
259 _, err = w.Write(buf[:n])
260 return
261 }
262
263
264
265
266 func serializeStreamHeader(w io.WriteCloser, ptype packetType) (out io.WriteCloser, err error) {
267 err = serializeType(w, ptype)
268 if err != nil {
269 return
270 }
271 out = &partialLengthWriter{w: w}
272 return
273 }
274
275
276
277 type Packet interface {
278 parse(io.Reader) error
279 }
280
281
282
283 func consumeAll(r io.Reader) (n int64, err error) {
284 var m int
285 var buf [1024]byte
286
287 for {
288 m, err = r.Read(buf[:])
289 n += int64(m)
290 if err == io.EOF {
291 err = nil
292 return
293 }
294 if err != nil {
295 return
296 }
297 }
298 }
299
300
301
302 type packetType uint8
303
304 const (
305 packetTypeEncryptedKey packetType = 1
306 packetTypeSignature packetType = 2
307 packetTypeSymmetricKeyEncrypted packetType = 3
308 packetTypeOnePassSignature packetType = 4
309 packetTypePrivateKey packetType = 5
310 packetTypePublicKey packetType = 6
311 packetTypePrivateSubkey packetType = 7
312 packetTypeCompressed packetType = 8
313 packetTypeSymmetricallyEncrypted packetType = 9
314 packetTypeLiteralData packetType = 11
315 packetTypeUserId packetType = 13
316 packetTypePublicSubkey packetType = 14
317 packetTypeUserAttribute packetType = 17
318 packetTypeSymmetricallyEncryptedIntegrityProtected packetType = 18
319 packetTypeAEADEncrypted packetType = 20
320 )
321
322
323
324 type EncryptedDataPacket interface {
325 Decrypt(CipherFunction, []byte) (io.ReadCloser, error)
326 }
327
328
329
330 func Read(r io.Reader) (p Packet, err error) {
331 tag, _, contents, err := readHeader(r)
332 if err != nil {
333 return
334 }
335
336 switch tag {
337 case packetTypeEncryptedKey:
338 p = new(EncryptedKey)
339 case packetTypeSignature:
340 p = new(Signature)
341 case packetTypeSymmetricKeyEncrypted:
342 p = new(SymmetricKeyEncrypted)
343 case packetTypeOnePassSignature:
344 p = new(OnePassSignature)
345 case packetTypePrivateKey, packetTypePrivateSubkey:
346 pk := new(PrivateKey)
347 if tag == packetTypePrivateSubkey {
348 pk.IsSubkey = true
349 }
350 p = pk
351 case packetTypePublicKey, packetTypePublicSubkey:
352 isSubkey := tag == packetTypePublicSubkey
353 p = &PublicKey{IsSubkey: isSubkey}
354 case packetTypeCompressed:
355 p = new(Compressed)
356 case packetTypeSymmetricallyEncrypted:
357 p = new(SymmetricallyEncrypted)
358 case packetTypeLiteralData:
359 p = new(LiteralData)
360 case packetTypeUserId:
361 p = new(UserId)
362 case packetTypeUserAttribute:
363 p = new(UserAttribute)
364 case packetTypeSymmetricallyEncryptedIntegrityProtected:
365 se := new(SymmetricallyEncrypted)
366 se.IntegrityProtected = true
367 p = se
368 case packetTypeAEADEncrypted:
369 p = new(AEADEncrypted)
370 default:
371 err = errors.UnknownPacketTypeError(tag)
372 }
373 if p != nil {
374 err = p.parse(contents)
375 }
376 if err != nil {
377 consumeAll(contents)
378 }
379 return
380 }
381
382
383
384 type SignatureType uint8
385
386 const (
387 SigTypeBinary SignatureType = 0x00
388 SigTypeText = 0x01
389 SigTypeGenericCert = 0x10
390 SigTypePersonaCert = 0x11
391 SigTypeCasualCert = 0x12
392 SigTypePositiveCert = 0x13
393 SigTypeSubkeyBinding = 0x18
394 SigTypePrimaryKeyBinding = 0x19
395 SigTypeDirectSignature = 0x1F
396 SigTypeKeyRevocation = 0x20
397 SigTypeSubkeyRevocation = 0x28
398 SigTypeCertificationRevocation = 0x30
399 )
400
401
402
403
404 type PublicKeyAlgorithm uint8
405
406 const (
407 PubKeyAlgoRSA PublicKeyAlgorithm = 1
408 PubKeyAlgoElGamal PublicKeyAlgorithm = 16
409 PubKeyAlgoDSA PublicKeyAlgorithm = 17
410
411 PubKeyAlgoECDH PublicKeyAlgorithm = 18
412 PubKeyAlgoECDSA PublicKeyAlgorithm = 19
413
414 PubKeyAlgoEdDSA PublicKeyAlgorithm = 22
415
416
417 PubKeyAlgoRSAEncryptOnly PublicKeyAlgorithm = 2
418 PubKeyAlgoRSASignOnly PublicKeyAlgorithm = 3
419 )
420
421
422
423 func (pka PublicKeyAlgorithm) CanEncrypt() bool {
424 switch pka {
425 case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoElGamal, PubKeyAlgoECDH:
426 return true
427 }
428 return false
429 }
430
431
432
433 func (pka PublicKeyAlgorithm) CanSign() bool {
434 switch pka {
435 case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoDSA, PubKeyAlgoECDSA, PubKeyAlgoEdDSA:
436 return true
437 }
438 return false
439 }
440
441
442
443 type CipherFunction algorithm.CipherFunction
444
445 const (
446 Cipher3DES CipherFunction = 2
447 CipherCAST5 CipherFunction = 3
448 CipherAES128 CipherFunction = 7
449 CipherAES192 CipherFunction = 8
450 CipherAES256 CipherFunction = 9
451 )
452
453
454 func (cipher CipherFunction) KeySize() int {
455 return algorithm.CipherFunction(cipher).KeySize()
456 }
457
458
459 func (cipher CipherFunction) IsSupported() bool {
460 return algorithm.CipherFunction(cipher).KeySize() > 0
461 }
462
463
464 func (cipher CipherFunction) blockSize() int {
465 return algorithm.CipherFunction(cipher).BlockSize()
466 }
467
468
469 func (cipher CipherFunction) new(key []byte) (block cipher.Block) {
470 return algorithm.CipherFunction(cipher).New(key)
471 }
472
473
474
475 func padToKeySize(pub *rsa.PublicKey, b []byte) []byte {
476 k := (pub.N.BitLen() + 7) / 8
477 if len(b) >= k {
478 return b
479 }
480 bb := make([]byte, k)
481 copy(bb[len(bb)-len(b):], b)
482 return bb
483 }
484
485
486
487
488 type CompressionAlgo uint8
489
490 const (
491 CompressionNone CompressionAlgo = 0
492 CompressionZIP CompressionAlgo = 1
493 CompressionZLIB CompressionAlgo = 2
494 )
495
496
497
498
499 type AEADMode algorithm.AEADMode
500
501 const (
502 AEADModeEAX AEADMode = 1
503 AEADModeOCB AEADMode = 2
504 AEADModeGCM AEADMode = 3
505 )
506
507 func (mode AEADMode) IvLength() int {
508 return algorithm.AEADMode(mode).NonceLength()
509 }
510
511 func (mode AEADMode) TagLength() int {
512 return algorithm.AEADMode(mode).TagLength()
513 }
514
515
516 func (mode AEADMode) new(block cipher.Block) cipher.AEAD {
517 return algorithm.AEADMode(mode).New(block)
518 }
519
520
521
522 type ReasonForRevocation uint8
523
524 const (
525 NoReason ReasonForRevocation = 0
526 KeySuperseded ReasonForRevocation = 1
527 KeyCompromised ReasonForRevocation = 2
528 KeyRetired ReasonForRevocation = 3
529 )
530
531
532
533 type Curve string
534
535 const (
536 Curve25519 Curve = "Curve25519"
537 Curve448 Curve = "Curve448"
538 CurveNistP256 Curve = "P256"
539 CurveNistP384 Curve = "P384"
540 CurveNistP521 Curve = "P521"
541 CurveSecP256k1 Curve = "SecP256k1"
542 CurveBrainpoolP256 Curve = "BrainpoolP256"
543 CurveBrainpoolP384 Curve = "BrainpoolP384"
544 CurveBrainpoolP512 Curve = "BrainpoolP512"
545 )
546
547
548 type TrustLevel uint8
549
550
551 type TrustAmount uint8
552
View as plain text