text: // Copyright 2012 The Go Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style
  // license that can be found in the LICENSE file.
  
  package packet
  
  import (
  	"crypto"
  	"crypto/rand"
  	"io"
  	"time"
  )
  
  // Config collects a number of parameters along with sensible defaults.
  // A nil *Config is valid and results in all default values.
  type Config struct {
  	// Rand provides the source of entropy.
  	// If nil, the crypto/rand Reader is used.
  	Rand io.Reader
  	// DefaultHash is the default hash function to be used.
  	// If zero, SHA-256 is used.
  	DefaultHash crypto.Hash
  	// DefaultCipher is the cipher to be used.
  	// If zero, AES-128 is used.
  	DefaultCipher CipherFunction
  	// Time returns the current time as the number of seconds since the
  	// epoch. If Time is nil, time.Now is used.
  	Time func() time.Time
  	// DefaultCompressionAlgo is the compression algorithm to be
  	// applied to the plaintext before encryption. If zero, no
  	// compression is done.
  	DefaultCompressionAlgo CompressionAlgo
  	// CompressionConfig configures the compression settings.
  	CompressionConfig *CompressionConfig
  	// S2KCount is only used for symmetric encryption. It
  	// determines the strength of the passphrase stretching when
  	// the said passphrase is hashed to produce a key. S2KCount
  	// should be between 1024 and 65011712, inclusive. If Config
  	// is nil or S2KCount is 0, the value 65536 used. Not all
  	// values in the above range can be represented. S2KCount will
  	// be rounded up to the next representable value if it cannot
  	// be encoded exactly. When set, it is strongly encrouraged to
  	// use a value that is at least 65536. See RFC 4880 Section
  	// 3.7.1.3.
  	S2KCount int
  	// RSABits is the number of bits in new RSA keys made with NewEntity.
  	// If zero, then 2048 bit keys are created.
  	RSABits int
  }
  
  func (c *Config) Random() io.Reader {
  	if c == nil || c.Rand == nil {
  		return rand.Reader
  	}
  	return c.Rand
  }
  
  func (c *Config) Hash() crypto.Hash {
  	if c == nil || uint(c.DefaultHash) == 0 {
  		return crypto.SHA256
  	}
  	return c.DefaultHash
  }
  
  func (c *Config) Cipher() CipherFunction {
  	if c == nil || uint8(c.DefaultCipher) == 0 {
  		return CipherAES128
  	}
  	return c.DefaultCipher
  }
  
  func (c *Config) Now() time.Time {
  	if c == nil || c.Time == nil {
  		return time.Now()
  	}
  	return c.Time()
  }
  
  func (c *Config) Compression() CompressionAlgo {
  	if c == nil {
  		return CompressionNone
  	}
  	return c.DefaultCompressionAlgo
  }
  
  func (c *Config) PasswordHashIterations() int {
  	if c == nil || c.S2KCount == 0 {
  		return 0
  	}
  	return c.S2KCount
  }
  