mirror of
https://github.com/memohai/Memoh.git
synced 2026-04-25 07:00:48 +09:00
599bfb5ca8
Fix WeCom adapter typos and strict Go lint findings (gosec/bodyclose/errcheck/revive) while keeping runtime behavior unchanged.
55 lines
1.4 KiB
Go
55 lines
1.4 KiB
Go
package wecom
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/aes"
|
|
"crypto/cipher"
|
|
"encoding/base64"
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
func DecryptFileAES256CBC(ciphertext []byte, aesKeyBase64 string) ([]byte, error) {
|
|
if len(ciphertext) == 0 {
|
|
return nil, errors.New("ciphertext is empty")
|
|
}
|
|
key, err := base64.StdEncoding.DecodeString(aesKeyBase64)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("decode aes key failed: %w", err)
|
|
}
|
|
if len(key) != 32 {
|
|
return nil, fmt.Errorf("invalid aes key length: %d", len(key))
|
|
}
|
|
block, err := aes.NewCipher(key)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if len(ciphertext)%aes.BlockSize != 0 {
|
|
return nil, errors.New("invalid ciphertext block size")
|
|
}
|
|
iv := key[:aes.BlockSize]
|
|
out := make([]byte, len(ciphertext))
|
|
cipher.NewCBCDecrypter(block, iv).CryptBlocks(out, ciphertext)
|
|
plain, err := pkcs7Unpad(out, 32)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return plain, nil
|
|
}
|
|
|
|
func pkcs7Unpad(data []byte, maxPad int) ([]byte, error) {
|
|
if len(data) == 0 {
|
|
return nil, errors.New("pkcs7 payload is empty")
|
|
}
|
|
padByte := data[len(data)-1]
|
|
pad := int(padByte)
|
|
if pad <= 0 || pad > maxPad || pad > len(data) {
|
|
return nil, fmt.Errorf("invalid pkcs7 padding length: %d", pad)
|
|
}
|
|
padding := bytes.Repeat([]byte{padByte}, pad)
|
|
if !bytes.Equal(data[len(data)-pad:], padding) {
|
|
return nil, errors.New("invalid pkcs7 padding bytes")
|
|
}
|
|
return data[:len(data)-pad], nil
|
|
}
|