git.zd.zone/hrpc/hrpc@v0.0.12/types/edata.go (about)

     1  package types
     2  
     3  import (
     4  	"database/sql/driver"
     5  	"encoding/base64"
     6  	"fmt"
     7  	"reflect"
     8  
     9  	"git.zd.zone/hrpc/hrpc/uerror"
    10  )
    11  
    12  var (
    13  	ErrInvalidKey = uerror.New(100, "invalid key")
    14  )
    15  
    16  // EData for encrypted data
    17  type EData struct {
    18  	origin string
    19  	key    string
    20  }
    21  
    22  // NewEData the constructor
    23  func NewEData(s, k string) EData {
    24  	return EData{
    25  		origin: s,
    26  		key:    k,
    27  	}
    28  }
    29  
    30  // Value for implementing the driver.Valuer interface
    31  func (e EData) Value() (driver.Value, error) {
    32  	if e.key == "" {
    33  		return nil, ErrInvalidKey
    34  	}
    35  	return e, nil
    36  }
    37  
    38  // Scan for implementing the sql.Scanner interface
    39  func (e *EData) Scan(src interface{}) error {
    40  	v, ok := src.([]byte)
    41  	if !ok {
    42  		return fmt.Errorf(
    43  			"bad []byte type assertion, got name: %v and kind: %v",
    44  			reflect.TypeOf(src).Name(),
    45  			reflect.TypeOf(src).Kind().String(),
    46  		)
    47  	}
    48  	d, err := base64.StdEncoding.DecodeString(string(v))
    49  	if err != nil {
    50  		return err
    51  	}
    52  	ad, err := Decrypt(d, []byte(e.key))
    53  	if err != nil {
    54  		*e = EData{origin: string(d)}
    55  		return nil
    56  	}
    57  	*e = EData{origin: string(ad)}
    58  	return nil
    59  }
    60  
    61  func (e EData) String() string {
    62  	return e.origin
    63  }
    64  
    65  func Decrypt(d, k []byte) ([]byte, error) {
    66  	return d, nil
    67  }