48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
package transcrypt
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/hex"
|
|
"errors"
|
|
"fmt"
|
|
"reflect"
|
|
|
|
"github.com/minio/sio"
|
|
)
|
|
|
|
func Decrypt(key string, data string) (any, error) {
|
|
if key == "" {
|
|
return nil, errors.New("key is empty")
|
|
}
|
|
if data == "" {
|
|
return nil, errors.New("data is nil")
|
|
}
|
|
|
|
var err error
|
|
var encryptedData []byte
|
|
var kind reflect.Kind
|
|
var cryptoConfig sio.Config
|
|
|
|
if encryptedData, kind, cryptoConfig, err = decodeHexString(key, data); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var decryptedHexData *bytes.Buffer
|
|
decryptedHexData = bytes.NewBuffer(make([]byte, 0))
|
|
if _, err = sio.Decrypt(decryptedHexData, bytes.NewBuffer(encryptedData), cryptoConfig); err != nil {
|
|
return nil, fmt.Errorf("decrypt failed: %w", err)
|
|
}
|
|
|
|
var decryptedData []byte
|
|
if decryptedData, err = hex.DecodeString(string(decryptedHexData.Bytes())); err != nil {
|
|
return nil, fmt.Errorf("decode decrypted hex data failed: %w", err)
|
|
}
|
|
|
|
var outputValue reflect.Value
|
|
if outputValue, err = convertBytesToValue(decryptedData, kind); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return outputValue.Interface(), nil
|
|
}
|