func createKey(mh multihash.Multihash, prefixLen int) multihash.Multihash { // Grab the first 8 bytes from the multihash digest m, _ := multihash.Decode(mh) prefix64 := binary.BigEndian.Uint64(m.Digest[:8]) // Convert to binary string bin := strconv.FormatUint(prefix64, 2) // Pad with leading zeros leadingZeros := 64 - len(bin) for i := 0; i < leadingZeros; i++ { bin = "0" + bin } // Grab the bits corresponding to the prefix length and convert to int intPrefix, _ := strconv.ParseUint(bin[:prefixLen], 2, 64) // Convert to 8 byte array bs := make([]byte, 8) binary.BigEndian.PutUint64(bs, intPrefix) // Hash the array hash := sha256.New() hash.Write(bs) md := hash.Sum(nil) // Encode as multihash keyHash, _ := multihash.Encode(md, multihash.SHA2_256) return keyHash }
func getMagicID() (peer.ID, error) { magicBytes, err := hex.DecodeString(MAGIC) if err != nil { return "", err } randBytes := make([]byte, 20) rand.Read(randBytes) magicBytes = append(magicBytes, randBytes[:]...) h, err := multihash.Encode(magicBytes, multihash.SHA2_256) if err != nil { return "", err } id, err := peer.IDFromBytes(h) if err != nil { return "", err } return id, nil }
func (s *DropBoxStorage) Store(peerID peer.ID, ciphertext []byte) (ma.Multiaddr, error) { api := dropbox.Client(s.apiToken, dropbox.Options{Verbose: true}) hash := sha256.Sum256(ciphertext) hex := hex.EncodeToString(hash[:]) // Upload ciphertext uploadArg := files.NewCommitInfo("/" + hex) r := bytes.NewReader(ciphertext) _, err := api.Upload(uploadArg, r) if err != nil { return nil, err } // Set public sharing sharingArg := sharing.NewCreateSharedLinkArg("/" + hex) res, err := api.CreateSharedLink(sharingArg) if err != nil { return nil, err } // Create encoded multiaddr url := res.Url[:len(res.Url)-1] + "1" b, err := mh.Encode([]byte(url), mh.SHA1) if err != nil { return nil, err } m, err := mh.Cast(b) if err != nil { return nil, err } addr, err := ma.NewMultiaddr("/ipfs/" + m.B58String() + "/https/") if err != nil { return nil, err } return addr, nil }