79 lines
2.2 KiB
Go
79 lines
2.2 KiB
Go
|
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"
|
||
|
)
|
||
|
|
||
|
// Simple App 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("AUTH") {
|
||
|
// 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 Echo 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)
|
||
|
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)
|
||
|
os.Exit(0)
|
||
|
}
|