package main import ( "crypto/rand" "cwtch.im/tapir" "git.openprivacy.ca/openprivacy/libricochet-go/connectivity" "git.openprivacy.ca/openprivacy/libricochet-go/identity" "git.openprivacy.ca/openprivacy/libricochet-go/log" "git.openprivacy.ca/openprivacy/libricochet-go/utils" "golang.org/x/crypto/ed25519" "os" "time" ) // SimpleApp is a trivial implementation of a basic p2p application type SimpleApp struct { tapir.AuthApp } // NewInstance should always return a new instantiation of the application. func (ea SimpleApp) NewInstance() tapir.Application { return new(SimpleApp) } // Init is run when the connection is first started. func (ea SimpleApp) Init(connection *tapir.Connection) { // First run the Authentication App ea.AuthApp.Init(connection) if connection.HasCapability(tapir.AuthCapability) { // The code for out simple application (We just send and receive "Hello" connection.Send([]byte("Hello")) message := connection.Expect() log.Infof("Received: %q", message) } } func main() { log.SetLevel(log.LevelDebug) // Connect to Tor var acn connectivity.ACN acn, _ = connectivity.StartTor("./", "") acn.WaitTillBootstrapped() // Generate Server Keys pubkey, privateKey, _ := ed25519.GenerateKey(rand.Reader) sk := ed25519.PrivateKey(privateKey) pk := ed25519.PublicKey(pubkey) id := identity.InitializeV3("server", &sk, &pk) // Start a Client to Connect to the Server go client(acn, pubkey) // Start the Server running the Simple App. var service tapir.Service service = new(tapir.BaseOnionService) service.Start(acn, sk, id) service.Listen(SimpleApp{}) } // Client will Connect and launch it's own Echo App goroutine. func client(acn connectivity.ACN, key ed25519.PublicKey) { pubkey, privateKey, _ := ed25519.GenerateKey(rand.Reader) sk := ed25519.PrivateKey(privateKey) pk := ed25519.PublicKey(pubkey) id := identity.InitializeV3("client", &sk, &pk) var client tapir.Service client = new(tapir.BaseOnionService) client.Start(acn, sk, id) cid, _ := client.Connect(utils.GetTorV3Hostname(key), SimpleApp{}) // Once connected, it shouldn't take long to authenticate and run the application. So for the purposes of this demo // we will wait a little while then exit. time.Sleep(time.Second * 5) conn, _ := client.GetConnection(cid) log.Debugf("Client has Auth: %v", conn.HasCapability(tapir.AuthCapability)) os.Exit(0) }