mirror of
https://gitea.com/Sirherobrine23/tea.git
synced 2024-08-21 23:47:24 +00:00
Co-authored-by: Norwin Roosen <git@nroo.de> Co-authored-by: Norwin <git@nroo.de> Reviewed-on: https://gitea.com/gitea/tea/pulls/390 Reviewed-by: 6543 <6543@obermui.de> Reviewed-by: Andrew Thornton <art27@cantab.net> Co-authored-by: Norwin <noerw@noreply.gitea.io> Co-committed-by: Norwin <noerw@noreply.gitea.io>
57 lines
1.4 KiB
Go
57 lines
1.4 KiB
Go
// Copyright (C) 2019 ProtonTech AG
|
|
|
|
package packet
|
|
|
|
import "math/bits"
|
|
|
|
// AEADConfig collects a number of AEAD parameters along with sensible defaults.
|
|
// A nil AEADConfig is valid and results in all default values.
|
|
type AEADConfig struct {
|
|
// The AEAD mode of operation.
|
|
DefaultMode AEADMode
|
|
// Amount of octets in each chunk of data
|
|
ChunkSize uint64
|
|
}
|
|
|
|
// Mode returns the AEAD mode of operation.
|
|
func (conf *AEADConfig) Mode() AEADMode {
|
|
if conf == nil || conf.DefaultMode == 0 {
|
|
return AEADModeEAX
|
|
}
|
|
mode := conf.DefaultMode
|
|
if mode != AEADModeEAX && mode != AEADModeOCB &&
|
|
mode != AEADModeExperimentalGCM {
|
|
panic("AEAD mode unsupported")
|
|
}
|
|
return mode
|
|
}
|
|
|
|
// ChunkSizeByte returns the byte indicating the chunk size. The effective
|
|
// chunk size is computed with the formula uint64(1) << (chunkSizeByte + 6)
|
|
func (conf *AEADConfig) ChunkSizeByte() byte {
|
|
if conf == nil || conf.ChunkSize == 0 {
|
|
return 12 // 1 << (12 + 6) == 262144 bytes
|
|
}
|
|
|
|
chunkSize := conf.ChunkSize
|
|
exponent := bits.Len64(chunkSize) - 1
|
|
switch {
|
|
case exponent < 6:
|
|
exponent = 6
|
|
case exponent > 27:
|
|
exponent = 27
|
|
}
|
|
|
|
return byte(exponent - 6)
|
|
}
|
|
|
|
// decodeAEADChunkSize returns the effective chunk size. In 32-bit systems, the
|
|
// maximum returned value is 1 << 30.
|
|
func decodeAEADChunkSize(c byte) int {
|
|
size := uint64(1 << (c + 6))
|
|
if size != uint64(int(size)) {
|
|
return 1 << 30
|
|
}
|
|
return int(size)
|
|
}
|