Copyright 2010 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 cipher implements standard block cipher modes that can be wrapped around low-level block cipher implementations. See https://csrc.nist.gov/groups/ST/toolkit/BCM/current_modes.html and NIST Special Publication 800-38A.
package cipher
A Block represents an implementation of block cipher using a given key. It provides the capability to encrypt or decrypt individual blocks. The mode implementations extend that capability to streams of blocks.
BlockSize returns the cipher's block size.
	BlockSize() int
Encrypt encrypts the first block in src into dst. Dst and src must overlap entirely or not at all.
	Encrypt(dst, src []byte)
Decrypt decrypts the first block in src into dst. Dst and src must overlap entirely or not at all.
	Decrypt(dst, src []byte)
}
A Stream represents a stream cipher.
XORKeyStream XORs each byte in the given slice with a byte from the cipher's key stream. Dst and src must overlap entirely or not at all. If len(dst) < len(src), XORKeyStream should panic. It is acceptable to pass a dst bigger than src, and in that case, XORKeyStream will only update dst[:len(src)] and will not touch the rest of dst. Multiple calls to XORKeyStream behave as if the concatenation of the src buffers was passed in a single run. That is, Stream maintains state and does not reset at each XORKeyStream call.
	XORKeyStream(dst, src []byte)
}
A BlockMode represents a block cipher running in a block-based mode (CBC, ECB etc).
BlockSize returns the mode's block size.
	BlockSize() int
CryptBlocks encrypts or decrypts a number of blocks. The length of src must be a multiple of the block size. Dst and src must overlap entirely or not at all. If len(dst) < len(src), CryptBlocks should panic. It is acceptable to pass a dst bigger than src, and in that case, CryptBlocks will only update dst[:len(src)] and will not touch the rest of dst. Multiple calls to CryptBlocks behave as if the concatenation of the src buffers was passed in a single run. That is, BlockMode maintains state and does not reset at each CryptBlocks call.
	CryptBlocks(dst, src []byte)
}
Utility routines

func ( []byte) []byte {
	 := make([]byte, len())
	copy(, )
	return