github.com/aliyun/aliyun-oss-go-sdk@v3.0.2+incompatible/oss/crypto/aes_ctr.go (about)

     1  package osscrypto
     2  
     3  import (
     4  	"crypto/aes"
     5  	"crypto/cipher"
     6  	"io"
     7  )
     8  
     9  type aesCtr struct {
    10  	encrypter cipher.Stream
    11  	decrypter cipher.Stream
    12  }
    13  
    14  func newAesCtr(cd CipherData) (Cipher, error) {
    15  	block, err := aes.NewCipher(cd.Key)
    16  	if err != nil {
    17  		return nil, err
    18  	}
    19  
    20  	encrypter := cipher.NewCTR(block, cd.IV)
    21  	decrypter := cipher.NewCTR(block, cd.IV)
    22  	return &aesCtr{encrypter, decrypter}, nil
    23  }
    24  
    25  func (c *aesCtr) Encrypt(src io.Reader) io.Reader {
    26  	reader := &ctrEncryptReader{
    27  		encrypter: c.encrypter,
    28  		src:       src,
    29  	}
    30  	return reader
    31  }
    32  
    33  type ctrEncryptReader struct {
    34  	encrypter cipher.Stream
    35  	src       io.Reader
    36  }
    37  
    38  func (reader *ctrEncryptReader) Read(data []byte) (int, error) {
    39  	plainText := make([]byte, len(data), len(data))
    40  	n, err := reader.src.Read(plainText)
    41  	if n > 0 {
    42  		plainText = plainText[0:n]
    43  		reader.encrypter.XORKeyStream(data, plainText)
    44  	}
    45  	return n, err
    46  }
    47  
    48  func (c *aesCtr) Decrypt(src io.Reader) io.Reader {
    49  	return &ctrDecryptReader{
    50  		decrypter: c.decrypter,
    51  		src:       src,
    52  	}
    53  }
    54  
    55  type ctrDecryptReader struct {
    56  	decrypter cipher.Stream
    57  	src       io.Reader
    58  }
    59  
    60  func (reader *ctrDecryptReader) Read(data []byte) (int, error) {
    61  	cryptoText := make([]byte, len(data), len(data))
    62  	n, err := reader.src.Read(cryptoText)
    63  	if n > 0 {
    64  		cryptoText = cryptoText[0:n]
    65  		reader.decrypter.XORKeyStream(data, cryptoText)
    66  	}
    67  	return n, err
    68  }