github.com/s7techlab/cckit@v0.10.5/extensions/encryption/encryption.go (about)

     1  package encryption
     2  
     3  import (
     4  	"github.com/pkg/errors"
     5  	"github.com/s7techlab/cckit/convert"
     6  	"github.com/s7techlab/cckit/router"
     7  )
     8  
     9  const TransientMapKey = `ENCODE_KEY`
    10  
    11  // EncryptArgs convert args to [][]byte and encrypt args with key
    12  func EncryptArgs(key []byte, args ...interface{}) ([][]byte, error) {
    13  	argBytes, err := convert.ArgsToBytes(args...)
    14  	if err != nil {
    15  		return nil, err
    16  	}
    17  
    18  	return EncryptArgsBytes(key, argBytes)
    19  }
    20  
    21  // EncryptArgsBytes encrypt args with key
    22  func EncryptArgsBytes(key []byte, argsBytes [][]byte) ([][]byte, error) {
    23  	eargs := make([][]byte, len(argsBytes))
    24  	for i, bb := range argsBytes {
    25  		encrypted, err := EncryptBytes(key, bb)
    26  		if err != nil {
    27  			return nil, errors.Wrap(err, `encryption error`)
    28  		}
    29  
    30  		eargs[i] = encrypted
    31  	}
    32  	return eargs, nil
    33  }
    34  
    35  // DecryptArgs decrypt args
    36  func DecryptArgs(key []byte, args [][]byte) ([][]byte, error) {
    37  	dargs := make([][]byte, len(args))
    38  	for i, a := range args {
    39  
    40  		// do not try to decrypt init function
    41  		if i == 0 && string(a) == router.InitFunc {
    42  			dargs[i] = a
    43  			continue
    44  		}
    45  
    46  		decrypted, err := DecryptBytes(key, a)
    47  		if err != nil {
    48  			return nil, errors.Wrap(err, `decryption error`)
    49  		}
    50  		dargs[i] = decrypted
    51  	}
    52  	return dargs, nil
    53  }
    54  
    55  // Encrypt converts value to []byte  and encrypts its with key
    56  func Encrypt(key []byte, value interface{}) ([]byte, error) {
    57  	// TODO: customize  IV
    58  	bb, err := convert.ToBytes(value)
    59  	if err != nil {
    60  		return nil, errors.Wrap(err, `convert values to bytes`)
    61  	}
    62  
    63  	return EncryptBytes(key, bb)
    64  }
    65  
    66  // Decrypt decrypts value with key
    67  func Decrypt(key, value []byte) ([]byte, error) {
    68  
    69  	bb := make([]byte, len(value))
    70  	copy(bb, value)
    71  	return DecryptBytes(key, bb)
    72  }
    73  
    74  // TransientMapWithKey creates transient map with encrypting/decrypting key
    75  func TransientMapWithKey(key []byte) map[string][]byte {
    76  	return map[string][]byte{TransientMapKey: key}
    77  }