public NvStreamDevice(IPAddress ipAddress, CryptoProvider cryptoProvider)
 {
     IPAddress      = ipAddress;
     CryptoProvider = cryptoProvider;
     NvHttp         = new NvHttp(new Uri($"http://{IPAddress}:{HTTP_PORT}/"));
     Online         = false;
 }
        protected async override void OnNavigatedTo(NavigationEventArgs e)
        {
            SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility =
                AppViewBackButtonVisibility.Collapsed;

            CryptoProvider = new CryptoProvider();
            await CryptoProvider.Initialize();

            if (StreamDevices.Count == 0)
            {
                await GetItemsAsync();
            }

            base.OnNavigatedTo(e);
        }
        public async Task <bool> Pair()
        {
            // Generate salt for hashing the pin
            byte[] salt = CryptoProvider.GenerateRandomBytes(16);

            // Combine sal and pin and generate aes key from them
            string pin = CryptoProvider.GeneratePin();

            byte[]       saltedPin = CryptoProvider.SaltPin(salt, pin);
            KeyParameter aesKey    = CryptoProvider.GenerateAesKey(EnhancedSecurity, saltedPin);

            // Send the salt and get server cert. This doesn't have read timeout
            // because the user must enter the PIN before the server responds
            NvPair getServerCertResponse = await NvHttp.GetServerCert(salt, CryptoProvider.GetCertificatePem());
        }
        public static async Task <List <NvStreamDevice> > DiscoverStreamDevices(CryptoProvider cryptoProvider)
        {
            List <NvStreamDevice>         streamDevices = new List <NvStreamDevice>();
            IReadOnlyList <IZeroconfHost> results       = await
                                                          ZeroconfResolver.ResolveAsync(ZEROCONF_PROTOCOL);

            foreach (var result in results)
            {
                NvStreamDevice streamDevice = new NvStreamDevice(IPAddress.Parse(result.IPAddress), cryptoProvider);
                streamDevice.Online = true;
                await streamDevice.QueryDataInsecure();

                streamDevices.Add(streamDevice);
            }
            return(streamDevices);
        }