OSDN Git Service

Create ossClient.go (#574)
[bytom/vapor.git] / vendor / github.com / aliyun / aliyun-oss-go-sdk / oss / crypto / aes_ctr.go
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 }