| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 | 
							- package io
 
- import (
 
- 	"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()
 
- }
 
 
  |