Skip to content

Instantly share code, notes, and snippets.

@rodkeys
Created October 16, 2019 19:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rodkeys/6e552fe119ea93d2328f7c59e9133e44 to your computer and use it in GitHub Desktop.
Save rodkeys/6e552fe119ea93d2328f7c59e9133e44 to your computer and use it in GitHub Desktop.
Shows how to generate an OFFLINE_RELAY message in go
package webrelay
import (
"context"
"fmt"
"github.com/OpenBazaar/openbazaar-go/core"
"github.com/OpenBazaar/openbazaar-go/pb"
"github.com/golang/protobuf/proto"
"github.com/golang/protobuf/ptypes/any"
ic "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto"
libp2p "gx/ipfs/QmTW4SdgBWq9GjsBsHeUx8WuGxzhgzAf88UMH2w62PC8yK/go-libp2p-crypto"
peer "gx/ipfs/QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h/go-libp2p-peer"
)
func GenerateCipher(peerId string, k *ic.PubKey, m *pb.Message, n *core.OpenBazaarNode) ([]byte, error) {
p, err := peer.IDB58Decode(peerId)
if err != nil {
return nil, err
}
skBytes, err := n.IpfsNode.PrivateKey
if err != nil {
return nil, err
}
// Use node's private key to sign contract information
privateKey, err := ic.UnmarshalPrivateKey(skBytes)
if err != nil {
return nil, err
}
ser, err := proto.Marshal(m)
if err != nil {
return nil, err
}
sig, err := privateKey.Sign(ser)
if err != nil {
return nil, err
}
pkBytes, err := n.IpfsNode.PrivateKey.GetPublic().Bytes()
if err != nil {
return nil, err
}
env := pb.Envelope{Message: m, Pubkey: pkBytes, Signature: sig}
messageBytes, merr := proto.Marshal(&env)
if merr != nil {
return nil, merr
}
ciphertext, cerr := n.EncryptMessage(p, k, messageBytes)
if cerr != nil {
return nil, cerr
}
return ciphertext, nil
}
func SendMessage(n *core.OpenBazaarNode, peerID string, k *libp2p.PubKey, message pb.Message) error {
p, err := peer.IDB58Decode(peerID)
if err != nil {
return err
}
cipher, err := GenerateCipher(peerID, k, &message, n)
if err != nil {
return err
}
cm := pb.Message{
MessageType: pb.Message_OFFLINE_RELAY,
Payload: &any.Any{Value: cipher},
}
go func() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
err = n.Service.SendMessage(ctx, p, &cm)
if err != nil {
if err := n.SendOfflineMessage(p, nil, &m); err != nil {
return err
}
}
}()
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment