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