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 }