...
1
2
3 package packet
4
5 import "math/bits"
6
7
8 type CipherSuite struct {
9
10 Cipher CipherFunction
11
12 Mode AEADMode
13 }
14
15
16
17 type AEADConfig struct {
18
19 DefaultMode AEADMode
20
21 ChunkSize uint64
22 }
23
24
25 func (conf *AEADConfig) Mode() AEADMode {
26
27 if conf == nil || conf.DefaultMode == 0 {
28 return AEADModeOCB
29 }
30
31 mode := conf.DefaultMode
32 if mode != AEADModeEAX && mode != AEADModeOCB && mode != AEADModeGCM {
33 panic("AEAD mode unsupported")
34 }
35 return mode
36 }
37
38
39
40
41
42 func (conf *AEADConfig) ChunkSizeByte() byte {
43 if conf == nil || conf.ChunkSize == 0 {
44 return 12
45 }
46
47 chunkSize := conf.ChunkSize
48 exponent := bits.Len64(chunkSize) - 1
49 switch {
50 case exponent < 6:
51 exponent = 6
52 case exponent > 16:
53 exponent = 16
54 }
55
56 return byte(exponent - 6)
57 }
58
59
60
61 func decodeAEADChunkSize(c byte) int {
62 size := uint64(1 << (c + 6))
63 if size != uint64(int(size)) {
64 return 1 << 30
65 }
66 return int(size)
67 }
68
View as plain text