...

Source file src/github.com/ProtonMail/go-crypto/openpgp/packet/aead_config.go

Documentation: github.com/ProtonMail/go-crypto/openpgp/packet

     1  // Copyright (C) 2019 ProtonTech AG
     2  
     3  package packet
     4  
     5  import "math/bits"
     6  
     7  // CipherSuite contains a combination of Cipher and Mode
     8  type CipherSuite struct {
     9  	// The cipher function
    10  	Cipher CipherFunction
    11  	// The AEAD mode of operation.
    12  	Mode AEADMode
    13  }
    14  
    15  // AEADConfig collects a number of AEAD parameters along with sensible defaults.
    16  // A nil AEADConfig is valid and results in all default values.
    17  type AEADConfig struct {
    18  	// The AEAD mode of operation.
    19  	DefaultMode AEADMode
    20  	// Amount of octets in each chunk of data
    21  	ChunkSize uint64
    22  }
    23  
    24  // Mode returns the AEAD mode of operation.
    25  func (conf *AEADConfig) Mode() AEADMode {
    26  	// If no preference is specified, OCB is used (which is mandatory to implement).
    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  // ChunkSizeByte returns the byte indicating the chunk size. The effective
    39  // chunk size is computed with the formula uint64(1) << (chunkSizeByte + 6)
    40  // limit to 16 = 4 MiB
    41  // https://www.ietf.org/archive/id/draft-ietf-openpgp-crypto-refresh-07.html#section-5.13.2
    42  func (conf *AEADConfig) ChunkSizeByte() byte {
    43  	if conf == nil || conf.ChunkSize == 0 {
    44  		return 12 // 1 << (12 + 6) == 262144 bytes
    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  // decodeAEADChunkSize returns the effective chunk size. In 32-bit systems, the
    60  // maximum returned value is 1 << 30.
    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