github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/api/encrypt.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:43</date> 10 //</624450111543447552> 11 12 13 package api 14 15 import ( 16 "encoding/binary" 17 "errors" 18 19 "github.com/ethereum/go-ethereum/swarm/storage/encryption" 20 "golang.org/x/crypto/sha3" 21 ) 22 23 type RefEncryption struct { 24 refSize int 25 span []byte 26 } 27 28 func NewRefEncryption(refSize int) *RefEncryption { 29 span := make([]byte, 8) 30 binary.LittleEndian.PutUint64(span, uint64(refSize)) 31 return &RefEncryption{ 32 refSize: refSize, 33 span: span, 34 } 35 } 36 37 func (re *RefEncryption) Encrypt(ref []byte, key []byte) ([]byte, error) { 38 spanEncryption := encryption.New(key, 0, uint32(re.refSize/32), sha3.NewLegacyKeccak256) 39 encryptedSpan, err := spanEncryption.Encrypt(re.span) 40 if err != nil { 41 return nil, err 42 } 43 dataEncryption := encryption.New(key, re.refSize, 0, sha3.NewLegacyKeccak256) 44 encryptedData, err := dataEncryption.Encrypt(ref) 45 if err != nil { 46 return nil, err 47 } 48 encryptedRef := make([]byte, len(ref)+8) 49 copy(encryptedRef[:8], encryptedSpan) 50 copy(encryptedRef[8:], encryptedData) 51 52 return encryptedRef, nil 53 } 54 55 func (re *RefEncryption) Decrypt(ref []byte, key []byte) ([]byte, error) { 56 spanEncryption := encryption.New(key, 0, uint32(re.refSize/32), sha3.NewLegacyKeccak256) 57 decryptedSpan, err := spanEncryption.Decrypt(ref[:8]) 58 if err != nil { 59 return nil, err 60 } 61 62 size := binary.LittleEndian.Uint64(decryptedSpan) 63 if size != uint64(len(ref)-8) { 64 return nil, errors.New("invalid span in encrypted reference") 65 } 66 67 dataEncryption := encryption.New(key, re.refSize, 0, sha3.NewLegacyKeccak256) 68 decryptedRef, err := dataEncryption.Decrypt(ref[8:]) 69 if err != nil { 70 return nil, err 71 } 72 73 return decryptedRef, nil 74 } 75