Files
Memoh/internal/channel/adapters/wecom/crypto.go
T
BBQ 599bfb5ca8 fix(wecom): pass lint and typo checks
Fix WeCom adapter typos and strict Go lint findings (gosec/bodyclose/errcheck/revive) while keeping runtime behavior unchanged.
2026-03-11 02:14:00 +08:00

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
}