package testing import ( "cwtch.im/tapir" "cwtch.im/tapir/applications" "cwtch.im/tapir/networks/tor" "cwtch.im/tapir/primitives" "git.openprivacy.ca/openprivacy/libricochet-go/connectivity" "git.openprivacy.ca/openprivacy/libricochet-go/log" "git.openprivacy.ca/openprivacy/libricochet-go/utils" "golang.org/x/crypto/ed25519" "runtime" "sync" "testing" "time" ) func TestTapirMaliciousRemote(t *testing.T) { numRoutinesStart := runtime.NumGoroutine() log.SetLevel(log.LevelDebug) log.Infof("Number of goroutines open at start: %d", runtime.NumGoroutine()) // Connect to Tor var acn connectivity.ACN acn, _ = connectivity.StartTor("./", "") acn.WaitTillBootstrapped() // Generate Server Keys, not we generate two sets id, _ := primitives.InitializeEphemeralIdentity() id2, sk2 := primitives.InitializeEphemeralIdentity() // Init the Server running the Simple App. var service tapir.Service service = new(tor.BaseOnionService) // Initialize an onion service with one identity, but the auth app with another, this should // trigger a failure in authentication protocol service.Init(acn, sk2, &id) // Goroutine Management sg := new(sync.WaitGroup) sg.Add(1) go func() { service.Listen(new(applications.AuthApp)) sg.Done() }() // Wait for server to come online time.Sleep(time.Second * 30) wg := new(sync.WaitGroup) wg.Add(1) // Init a Client to Connect to the Server log.Infof("initializing the client....") client, _ := genclient(acn) go connectclientandfail(client, id2.PublicKey(), wg, t) wg.Wait() // Wait for Server to Sync time.Sleep(time.Second * 2) log.Infof("closing ACN...") acn.Close() sg.Wait() time.Sleep(time.Second * 2) log.Infof("Number of goroutines open at close: %d", runtime.NumGoroutine()) if numRoutinesStart != runtime.NumGoroutine() { t.Errorf("Potential goroutine leak: Num Start:%v NumEnd: %v", numRoutinesStart, runtime.NumGoroutine()) } } // Client will Connect and launch it's own Echo App goroutine. func connectclientandfail(client tapir.Service, key ed25519.PublicKey, group *sync.WaitGroup, t *testing.T) { client.Connect(utils.GetTorV3Hostname(key), new(applications.AuthApp)) // 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) log.Infof("Checking connection status...") conn, err := client.GetConnection(utils.GetTorV3Hostname(key)) if err == nil { group.Done() t.Fatalf("Connection should have failed! %v %v", conn, err) } log.Infof("Successfully failed to authenticate...") group.Done() }