|
@@ -1,65 +1,65 @@
|
|
|
package io
|
|
package io
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
- "crypto/cipher"
|
|
|
|
|
- "io"
|
|
|
|
|
|
|
+ "crypto/cipher"
|
|
|
|
|
+ "io"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
// CryptionReader is a general purpose reader that applies
|
|
// CryptionReader is a general purpose reader that applies
|
|
|
// block cipher on top of a regular reader.
|
|
// block cipher on top of a regular reader.
|
|
|
type CryptionReader struct {
|
|
type CryptionReader struct {
|
|
|
- mode cipher.BlockMode
|
|
|
|
|
- reader io.Reader
|
|
|
|
|
|
|
+ mode cipher.BlockMode
|
|
|
|
|
+ reader io.Reader
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func NewCryptionReader(mode cipher.BlockMode, reader io.Reader) *CryptionReader {
|
|
func NewCryptionReader(mode cipher.BlockMode, reader io.Reader) *CryptionReader {
|
|
|
- this := new(CryptionReader)
|
|
|
|
|
- this.mode = mode
|
|
|
|
|
- this.reader = reader
|
|
|
|
|
- return this
|
|
|
|
|
|
|
+ this := new(CryptionReader)
|
|
|
|
|
+ this.mode = mode
|
|
|
|
|
+ this.reader = reader
|
|
|
|
|
+ return this
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Read reads blocks from underlying reader, the length of blocks must be
|
|
// Read reads blocks from underlying reader, the length of blocks must be
|
|
|
// a multiply of BlockSize()
|
|
// a multiply of BlockSize()
|
|
|
func (reader CryptionReader) Read(blocks []byte) (int, error) {
|
|
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
|
|
|
|
|
|
|
+ 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 {
|
|
func (reader CryptionReader) BlockSize() int {
|
|
|
- return reader.mode.BlockSize()
|
|
|
|
|
|
|
+ return reader.mode.BlockSize()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Cryption writer is a general purpose of byte stream writer that applies
|
|
// Cryption writer is a general purpose of byte stream writer that applies
|
|
|
// block cipher on top of a regular writer.
|
|
// block cipher on top of a regular writer.
|
|
|
type CryptionWriter struct {
|
|
type CryptionWriter struct {
|
|
|
- mode cipher.BlockMode
|
|
|
|
|
- writer io.Writer
|
|
|
|
|
|
|
+ mode cipher.BlockMode
|
|
|
|
|
+ writer io.Writer
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func NewCryptionWriter(mode cipher.BlockMode, writer io.Writer) *CryptionWriter {
|
|
func NewCryptionWriter(mode cipher.BlockMode, writer io.Writer) *CryptionWriter {
|
|
|
- this := new(CryptionWriter)
|
|
|
|
|
- this.mode = mode
|
|
|
|
|
- this.writer = writer
|
|
|
|
|
- return this
|
|
|
|
|
|
|
+ this := new(CryptionWriter)
|
|
|
|
|
+ this.mode = mode
|
|
|
|
|
+ this.writer = writer
|
|
|
|
|
+ return this
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Write writes the give blocks to underlying writer. The length of the blocks
|
|
// Write writes the give blocks to underlying writer. The length of the blocks
|
|
|
// must be a multiply of BlockSize()
|
|
// must be a multiply of BlockSize()
|
|
|
func (writer CryptionWriter) Write(blocks []byte) (int, error) {
|
|
func (writer CryptionWriter) Write(blocks []byte) (int, error) {
|
|
|
- writer.mode.CryptBlocks(blocks, blocks)
|
|
|
|
|
- return writer.writer.Write(blocks)
|
|
|
|
|
|
|
+ writer.mode.CryptBlocks(blocks, blocks)
|
|
|
|
|
+ return writer.writer.Write(blocks)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (writer CryptionWriter) BlockSize() int {
|
|
func (writer CryptionWriter) BlockSize() int {
|
|
|
- return writer.mode.BlockSize()
|
|
|
|
|
|
|
+ return writer.mode.BlockSize()
|
|
|
}
|
|
}
|