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 }