Skip to content

Commit a417638

Browse files
committed
fix CFB decrypt
1 parent 14e102d commit a417638

File tree

2 files changed

+27
-11
lines changed

2 files changed

+27
-11
lines changed

server/pkg/driver/base/aes/aes.go

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func (c *Cipher) SetPadding(padding PaddingMode) {
2929
c.padding = padding
3030
}
3131

32-
func (c *Cipher) stream() cipher.Stream {
32+
func (c *Cipher) encryptStream() cipher.Stream {
3333
var stream cipher.Stream
3434
switch c.mode {
3535
case CTR:
@@ -51,19 +51,31 @@ func (c *Cipher) Encrypt(src []byte) []byte {
5151
}
5252

5353
dst := make([]byte, len(src))
54-
stream := c.stream()
54+
stream := c.encryptStream()
5555
stream.XORKeyStream(dst, src)
5656
return dst
5757
}
5858

5959
func (c *Cipher) StreamEncrypt(w io.Writer) io.WriteCloser {
60-
stream := c.stream()
61-
return &cipher.StreamWriter{S: stream, W: w}
60+
return &cipher.StreamWriter{S: c.encryptStream(), W: w}
61+
}
62+
63+
func (c *Cipher) decryptStream() cipher.Stream {
64+
var stream cipher.Stream
65+
switch c.mode {
66+
case CTR:
67+
stream = cipher.NewCTR(c.block, c.iv[:])
68+
case OFB:
69+
stream = cipher.NewOFB(c.block, c.iv[:])
70+
default:
71+
stream = cipher.NewCFBDecrypter(c.block, c.iv[:])
72+
}
73+
return stream
6274
}
6375

6476
func (c *Cipher) Decrypt(src []byte) []byte {
6577
dst := make([]byte, len(src))
66-
stream := c.stream()
78+
stream := c.decryptStream()
6779
stream.XORKeyStream(dst, src)
6880

6981
switch c.padding {
@@ -76,13 +88,13 @@ func (c *Cipher) Decrypt(src []byte) []byte {
7688
}
7789

7890
func (c *Cipher) StreamDecrypt(r io.Reader) io.ReadCloser {
79-
return &StreamReader{S: c.stream(), R: r}
91+
return &StreamReader{S: c.decryptStream(), R: r}
8092
}
8193

8294
func NewCipher(mode BlockMode, key []byte) (*Cipher, error) {
8395
block, err := aes.NewCipher(key)
8496
if err != nil {
8597
return nil, err
8698
}
87-
return &Cipher{block: block, mode: mode}, nil
88-
}
99+
return &Cipher{block: block, mode: mode, padding: PKCS7}, nil
100+
}

server/pkg/driver/base/aes/padding.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,12 @@ func pkcs7Padding(src []byte, blockSize int) []byte {
1919

2020
func pkcs7UnPadding(src []byte) []byte {
2121
if len(src) == 0 {
22-
return []byte("")
22+
return nil
2323
}
24-
n := len(src) - int(src[len(src)-1])
25-
return src[0:n]
24+
25+
paddingSize := int(src[len(src)-1])
26+
if paddingSize > len(src) || paddingSize == 0 {
27+
return src
28+
}
29+
return src[:len(src)-paddingSize]
2630
}

0 commit comments

Comments
 (0)