| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 | package ioimport (  "crypto/cipher"  "io")// CryptionReader is a general purpose reader that applies// block cipher on top of a regular reader.type CryptionReader struct {  mode cipher.BlockMode  reader io.Reader}func NewCryptionReader(mode cipher.BlockMode, reader io.Reader) *CryptionReader {  this := new(CryptionReader)  this.mode = mode  this.reader = reader  return this}// Read reads blocks from underlying reader, the length of blocks must be// a multiply of BlockSize()func (reader CryptionReader) Read(blocks []byte) (int, error) {  nBytes, err := reader.reader.Read(blocks)  if err != nil && err != io.EOF {    return nBytes, err  }  if nBytes < len(blocks) {    for i, _ := range blocks[nBytes:] {      blocks[i] = 0    }  }  reader.mode.CryptBlocks(blocks, blocks)  return nBytes, err}func (reader CryptionReader) BlockSize() int {  return reader.mode.BlockSize()}// Cryption writer is a general purpose of byte stream writer that applies// block cipher on top of a regular writer.type CryptionWriter struct {  mode cipher.BlockMode  writer io.Writer}func NewCryptionWriter(mode cipher.BlockMode, writer io.Writer) *CryptionWriter {  this := new(CryptionWriter)  this.mode = mode  this.writer = writer  return this}// Write writes the give blocks to underlying writer. The length of the blocks// must be a multiply of BlockSize()func (writer CryptionWriter) Write(blocks []byte) (int, error) {  writer.mode.CryptBlocks(blocks, blocks)  return writer.writer.Write(blocks)}func (writer CryptionWriter) BlockSize() int {  return writer.mode.BlockSize()}
 |