github.com/keltia/go-ipfs@v0.3.8-0.20150909044612-210793031c63/routing/record/record.go (about)

     1  package record
     2  
     3  import (
     4  	"bytes"
     5  
     6  	proto "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/gogo/protobuf/proto"
     7  
     8  	key "github.com/ipfs/go-ipfs/blocks/key"
     9  	dag "github.com/ipfs/go-ipfs/merkledag"
    10  	ci "github.com/ipfs/go-ipfs/p2p/crypto"
    11  	pb "github.com/ipfs/go-ipfs/routing/dht/pb"
    12  	eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog"
    13  )
    14  
    15  var _ = dag.FetchGraph
    16  var log = eventlog.Logger("routing/record")
    17  
    18  // MakePutRecord creates and signs a dht record for the given key/value pair
    19  func MakePutRecord(sk ci.PrivKey, key key.Key, value []byte, sign bool) (*pb.Record, error) {
    20  	record := new(pb.Record)
    21  
    22  	record.Key = proto.String(string(key))
    23  	record.Value = value
    24  
    25  	pkh, err := sk.GetPublic().Hash()
    26  	if err != nil {
    27  		return nil, err
    28  	}
    29  
    30  	record.Author = proto.String(string(pkh))
    31  	if sign {
    32  		blob := RecordBlobForSig(record)
    33  
    34  		sig, err := sk.Sign(blob)
    35  		if err != nil {
    36  			return nil, err
    37  		}
    38  
    39  		record.Signature = sig
    40  	}
    41  	return record, nil
    42  }
    43  
    44  // RecordBlobForSig returns the blob protected by the record signature
    45  func RecordBlobForSig(r *pb.Record) []byte {
    46  	k := []byte(r.GetKey())
    47  	v := []byte(r.GetValue())
    48  	a := []byte(r.GetAuthor())
    49  	return bytes.Join([][]byte{k, v, a}, []byte{})
    50  }