예제 #1
0
        private static IAuthenticationMethod GetAuthenticationMethod(DeviceRegistrationResult result, SecurityProvider security)
        {
            IAuthenticationMethod auth;

            if (security is SecurityProviderTpm)
            {
                Console.WriteLine("Creating TPM DeviceClient authentication.");
                auth = new DeviceAuthenticationWithTpm(result.DeviceId, security as SecurityProviderTpm);
            }
            else if (security is SecurityProviderX509)
            {
                Console.WriteLine("Creating X509 DeviceClient authentication.");
                auth = new DeviceAuthenticationWithX509Certificate(result.DeviceId, (security as SecurityProviderX509).GetAuthenticationCertificate());
            }
            else if (security is SecurityProviderSymmetricKey)
            {
                Console.WriteLine("Creating Symmetric Key DeviceClient authenication");
                auth = new DeviceAuthenticationWithRegistrySymmetricKey(result.DeviceId, (security as SecurityProviderSymmetricKey).GetPrimaryKey());
            }
            else
            {
                throw new NotSupportedException("Unknown authentication type.");
            }
            return(auth);
        }
예제 #2
0
        private Client.IAuthenticationMethod CreateAuthenticationMethodFromSecurityProvider(
            SecurityProvider provisioningSecurity,
            string deviceId)
        {
            _verboseLog.WriteLine($"{nameof(CreateAuthenticationMethodFromSecurityProvider)}({deviceId})");

            if (provisioningSecurity is SecurityProviderTpm)
            {
                var security = (SecurityProviderTpm)provisioningSecurity;
                var auth     = new DeviceAuthenticationWithTpm(deviceId, security);
                return(auth);
            }
            else if (provisioningSecurity is SecurityProviderX509)
            {
                var security          = (SecurityProviderX509)provisioningSecurity;
                X509Certificate2 cert = security.GetAuthenticationCertificate();
                return(new DeviceAuthenticationWithX509Certificate(deviceId, cert));
            }
            else if (provisioningSecurity is SecurityProviderSymmetricKey)
            {
                var security = (SecurityProviderSymmetricKey)provisioningSecurity;
                var auth     = new DeviceAuthenticationWithRegistrySymmetricKey(deviceId, security.GetPrimaryKey());
                return(auth);
            }

            throw new NotSupportedException($"Unknown provisioningSecurity type.");
        }
예제 #3
0
        static async Task Main(string[] args)
        {
            var invalidIotHubAddress = "invalid.azure.devices.com";
            var validGatewayAddress  = "localhost";
            var deviceId             = "valid-device-id";

            Console.WriteLine("Connecting to the TPM simulator...");
            var tpmDevice            = ConnectToTpmSimulator();
            var securityProvider     = new SecurityProviderTpmHsm(deviceId, tpmDevice);
            var authenticationMethod = new DeviceAuthenticationWithTpm(deviceId, securityProvider);

            Console.WriteLine("Connecting to invalid IoT Hub address directly...");
            using (var deviceClient = DeviceClient.Create(invalidIotHubAddress, authenticationMethod))
            {
                var cts = new CancellationTokenSource(1000);
                try { await deviceClient.OpenAsync(cts.Token); }
                catch (Exception ex) { Console.WriteLine($"Swallowed expected exception '{ex.Message}'."); }
                finally
                {
                    await deviceClient.CloseAsync();
                }
            }

            Console.WriteLine("Connecting to invalid IoT Hub address via valid gateway...");
            using (var deviceClient = DeviceClient.Create(invalidIotHubAddress, validGatewayAddress, authenticationMethod))
            {
                var cts = new CancellationTokenSource(1000);
                await deviceClient.OpenAsync(cts.Token); // This is the call that ultimately triggers the NullReferenceException.

                await deviceClient.CloseAsync();
            }
        }
예제 #4
0
        private async Task <Client.IAuthenticationMethod> CreateAuthenticationMethodFromSecurityClient(
            SecurityClient provisioningSecurity,
            string deviceId,
            string iotHub)
        {
            _verboseLog.WriteLine($"{nameof(CreateAuthenticationMethodFromSecurityClient)}({deviceId})");

            if (provisioningSecurity is SecurityClientHsmTpm)
            {
                var security = (SecurityClientHsmTpm)provisioningSecurity;
                var auth     = new DeviceAuthenticationWithTpm(deviceId, security);

                // TODO: workaround to populate Token.
                await auth.GetTokenAsync(iotHub).ConfigureAwait(false);

                return(auth);
            }
            else if (provisioningSecurity is SecurityClientHsmX509)
            {
                var security          = (SecurityClientHsmX509)provisioningSecurity;
                X509Certificate2 cert = security.GetAuthenticationCertificate();

                return(new DeviceAuthenticationWithX509Certificate(deviceId, cert));
            }

            throw new NotSupportedException($"Unknown provisioningSecurity type.");
        }
예제 #5
0
        private Client.IAuthenticationMethod CreateAuthenticationMethodFromSecurityProvider(
            SecurityProvider provisioningSecurity,
            string deviceId)
        {
            _verboseLog.WriteLine($"{nameof(CreateAuthenticationMethodFromSecurityProvider)}({deviceId})");

            Client.IAuthenticationMethod auth;
            if (provisioningSecurity is SecurityProviderTpm tpmSecurity)
            {
                auth = new DeviceAuthenticationWithTpm(deviceId, tpmSecurity);
            }
            else if (provisioningSecurity is SecurityProviderX509 x509Security)
            {
                X509Certificate2 cert = x509Security.GetAuthenticationCertificate();
                auth = new DeviceAuthenticationWithX509Certificate(deviceId, cert);
            }
            else if (provisioningSecurity is SecurityProviderSymmetricKey symmetricKeySecurity)
            {
                auth = new DeviceAuthenticationWithRegistrySymmetricKey(deviceId, symmetricKeySecurity.GetPrimaryKey());
            }
            else
            {
                throw new NotSupportedException($"Unknown provisioningSecurity type.");
            }

            return auth;
        }
예제 #6
0
        public async Task RunSampleAsync()
        {
            try
            {
                Console.WriteLine($"RegistrationID = {_security.GetRegistrationID()}");
                VerifyRegistrationIdFormat(_security.GetRegistrationID());

                Console.Write("ProvisioningClient RegisterAsync . . . ");
                DeviceRegistrationResult result = await _provClient.RegisterAsync().ConfigureAwait(false);

                Console.WriteLine($"{result.Status}");
                Console.WriteLine($"ProvisioningClient AssignedHub: {result.AssignedHub}; DeviceID: {result.DeviceId}");

                if (result.Status != ProvisioningRegistrationStatusType.Assigned)
                {
                    return;
                }

                Microsoft.Azure.Devices.Client.IAuthenticationMethod auth;
                if (_security is SecurityProviderTpm)
                {
                    Console.WriteLine("Creating TPM DeviceClient authentication.");
                    auth = new DeviceAuthenticationWithTpm(result.DeviceId, _security as SecurityProviderTpm);
                }
                else if (_security is SecurityProviderX509)
                {
                    Console.WriteLine("Creating X509 DeviceClient authentication.");
                    auth = new DeviceAuthenticationWithX509Certificate(result.DeviceId, (_security as SecurityProviderX509).GetAuthenticationCertificate());
                }
                else if (_security is SecurityProviderSymmetricKey)
                {
                    Console.WriteLine("Creating Symmetric Key DeviceClient authenication");
                    auth = new DeviceAuthenticationWithRegistrySymmetricKey(result.DeviceId, (_security as SecurityProviderSymmetricKey).GetPrimaryKey());
                }
                else
                {
                    throw new NotSupportedException("Unknown authentication type.");
                }

                using (DeviceClient iotClient = DeviceClient.Create(result.AssignedHub, auth, Microsoft.Azure.Devices.Client.TransportType.Amqp))
                {
                    Console.WriteLine("DeviceClient OpenAsync.");
                    await iotClient.OpenAsync().ConfigureAwait(false);

                    Console.WriteLine("DeviceClient SendEventAsync.");
                    await iotClient.SendEventAsync(new Microsoft.Azure.Devices.Client.Message(Encoding.UTF8.GetBytes("TestMessage"))).ConfigureAwait(false);

                    Console.WriteLine("DeviceClient CloseAsync.");
                    await iotClient.CloseAsync().ConfigureAwait(false);
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
예제 #7
0
        public static async Task RunSample()
        {
            // Replace the following type with SecurityClientTpm() to use a real TPM2.0 device.
            Console.WriteLine("Starting TPM simulator.");
            SecurityClientTpmSimulator.StartSimulatorProcess();

            using (var security = new SecurityClientTpmSimulator(RegistrationId))
                using (var transport = new ProvisioningTransportHandlerHttp())
                {
                    // Note that the TPM simulator will create a NVChip file containing the simulated TPM state.
                    Console.WriteLine("Extracting endorsement key.");
                    string base64EK = Convert.ToBase64String(security.GetEndorsementKey());

                    Console.WriteLine(
                        "In your Azure Device Provisioning Service please go to 'Manage enrollments' and select " +
                        "'Individual Enrollments'. Select 'Add' then fill in the following:");

                    Console.WriteLine("\tMechanism: TPM");
                    Console.WriteLine($"\tRegistration ID: {RegistrationId}");
                    Console.WriteLine($"\tEndorsement key: {base64EK}");
                    Console.WriteLine("\tDevice ID: iothubtpmdevice1 (or any other valid DeviceID)");
                    Console.WriteLine();
                    Console.WriteLine("Press ENTER when ready.");
                    Console.ReadLine();

                    ProvisioningDeviceClient provClient = ProvisioningDeviceClient.Create(s_idScope, security, transport);

                    Console.Write("ProvisioningClient RegisterAsync . . . ");
                    DeviceRegistrationResult result = await provClient.RegisterAsync();

                    Console.WriteLine($"{result.Status}");
                    Console.WriteLine($"ProvisioningClient AssignedHub: {result.AssignedHub}; DeviceID: {result.DeviceId}");

                    if (result.Status != ProvisioningRegistrationStatusType.Assigned)
                    {
                        return;
                    }

                    var auth = new DeviceAuthenticationWithTpm(result.DeviceId, security);
                    // TODO: Temporary workaround until IoTHub DeviceClient gets Token refresh support.
                    await auth.GetTokenAsync(result.AssignedHub);

                    using (DeviceClient iotClient = DeviceClient.Create(result.AssignedHub, auth, TransportType.Mqtt))
                    {
                        Console.WriteLine("DeviceClient OpenAsync.");
                        await iotClient.OpenAsync();

                        Console.WriteLine("DeviceClient SendEventAsync.");
                        await iotClient.SendEventAsync(new Message(Encoding.UTF8.GetBytes("TestMessage")));

                        Console.WriteLine("DeviceClient CloseAsync.");
                        await iotClient.CloseAsync();
                    }
                }
        }
        public async Task RunSampleAsync()
        {
            Console.WriteLine("Initializing security using the local TPM...");
            using SecurityProviderTpm security = new SecurityProviderTpmHsm(_parameters.RegistrationId);

            Console.WriteLine($"Initializing the device provisioning client...");

            using var transport = GetTransportHandler();
            ProvisioningDeviceClient provClient = ProvisioningDeviceClient.Create(
                _parameters.GlobalDeviceEndpoint,
                _parameters.IdScope,
                security,
                transport);

            Console.WriteLine($"Initialized for registration Id {security.GetRegistrationID()}.");

            Console.WriteLine("Registering with the device provisioning service... ");
            DeviceRegistrationResult result = await provClient.RegisterAsync();

            Console.WriteLine($"Registration status: {result.Status}.");
            if (result.Status != ProvisioningRegistrationStatusType.Assigned)
            {
                Console.WriteLine($"Registration status did not assign a hub, so exiting this sample.");
                return;
            }

            Console.WriteLine($"Device {result.DeviceId} registered to {result.AssignedHub}.");

            Console.WriteLine("Creating TPM authentication for IoT Hub...");
            IAuthenticationMethod auth = new DeviceAuthenticationWithTpm(result.DeviceId, security);

            Console.WriteLine($"Testing the provisioned device with IoT Hub...");
            using DeviceClient iotClient = DeviceClient.Create(result.AssignedHub, auth, _parameters.TransportType);

            Console.WriteLine("Sending a telemetry message...");
            using var message = new Message(Encoding.UTF8.GetBytes("TestMessage"));
            await iotClient.SendEventAsync(message);

            await iotClient.CloseAsync();

            Console.WriteLine("Finished.");
        }
예제 #9
0
        public async Task <DeviceClient> RunAsync()
        {
            Console.WriteLine($"RegistrationID = {_security.GetRegistrationID()}");
            VerifyRegistrationIdFormat(_security.GetRegistrationID());

            Console.Write("ProvisioningClient RegisterAsync . . . ");
            DeviceRegistrationResult result = await _provClient.RegisterAsync().ConfigureAwait(false);

            Console.WriteLine($"{result.Status}");
            Console.WriteLine($"ProvisioningClient AssignedHub: {result.AssignedHub}; DeviceID: {result.DeviceId}");

            if (result.Status != ProvisioningRegistrationStatusType.Assigned)
            {
                return(null);
            }

            IAuthenticationMethod auth;

            if (_security is SecurityProviderTpm)
            {
                Console.WriteLine("Creating TPM DeviceClient authentication.");
                auth = new DeviceAuthenticationWithTpm(result.DeviceId, _security as SecurityProviderTpm);
            }
            else if (_security is SecurityProviderX509)
            {
                Console.WriteLine("Creating X509 DeviceClient authentication.");
                auth = new DeviceAuthenticationWithX509Certificate(result.DeviceId, (_security as SecurityProviderX509).GetAuthenticationCertificate());
            }
            else if (_security is SecurityProviderSymmetricKey)
            {
                Console.WriteLine("Creating Symmetric Key DeviceClient authenication");
                auth = new DeviceAuthenticationWithRegistrySymmetricKey(result.DeviceId, (_security as SecurityProviderSymmetricKey).GetPrimaryKey());
            }
            else
            {
                throw new NotSupportedException("Unknown authentication type.");
            }

            DeviceClient iotClient = DeviceClient.Create(result.AssignedHub, auth, TransportType.Amqp);

            return(iotClient);
        }
예제 #10
0
        private async Task <DeviceClient> ConnectAsync(string assignedHub, SecurityProvider security, CancellationToken token)
        {
            _Logger.EnteringMethodAzure(nameof(CommunicationContext));
            DeviceClient deviceClient;

            try
            {
                IAuthenticationMethod authenticationMethod;
                switch (security)
                {
                case SecurityProviderTpm tpmSecurity:
                    authenticationMethod = new DeviceAuthenticationWithTpm(_azureDeviceParameters.AzureDeviceId, tpmSecurity);
                    break;

                case SecurityProviderX509 certificateSecurity:
                    authenticationMethod = new DeviceAuthenticationWithX509Certificate(_azureDeviceParameters.AzureDeviceId, certificateSecurity.GetAuthenticationCertificate());
                    break;

                case SecurityProviderSymmetricKey symmetricKeySecurity:
                    authenticationMethod = new DeviceAuthenticationWithRegistrySymmetricKey(_azureDeviceParameters.AzureDeviceId, symmetricKeySecurity.GetPrimaryKey());
                    break;

                default:
                    _Logger.ProgramFailure(nameof(CommunicationContext), "Specified authentication type is unknown.");
                    throw new NotSupportedException("Unknown authentication type.");
                }
                _Logger.StartCreatingClient(nameof(DeviceClient), nameof(DeviceClient.Create), assignedHub, authenticationMethod.ToString(), _azureDeviceParameters.TransportType.ToString());
                deviceClient = DeviceClient.Create(assignedHub, authenticationMethod, _azureDeviceParameters.TransportType);
                _Logger.EnteringMethodAzure(nameof(DeviceClient), nameof(DeviceClient.OpenAsync));
                await deviceClient.OpenAsync(token);
            }
            catch (Exception ex)
            {
                _Logger.LogException(nameof(CommunicationContext), ex);
                return(null);
            }
            return(deviceClient);
        }
예제 #11
0
        public static async Task <int> Main(string[] args)
        {
            if (args.Length < 3)
            {
                Console.WriteLine("ProvisioningDeviceClientSymmetricKey <IDScope> <Secret> <registration>");
                return(1);
            }

            s_idScope = args[0];
            string primaryKey   = args[1];
            string secondaryKey = args[1];

            registrationId = args[2];

            SecurityProvider _security;

            using (var security = new SecurityProviderSymmetricKey(registrationId, primaryKey, secondaryKey))
                // Select one of the available transports:
                // To optimize for size, reference only the protocols used by your application.
                using (var transport = new ProvisioningTransportHandlerAmqp(TransportFallbackType.TcpOnly))
                // using (var transport = new ProvisioningTransportHandlerHttp())
                // using (var transport = new ProvisioningTransportHandlerMqtt(TransportFallbackType.TcpOnly))
                // using (var transport = new ProvisioningTransportHandlerMqtt(TransportFallbackType.WebSocketOnly))
                {
                    _security = security;
                    ProvisioningDeviceClient _provClient =
                        ProvisioningDeviceClient.Create(GlobalDeviceEndpoint, s_idScope, _security, transport);


                    Console.WriteLine($"RegistrationID = {_security.GetRegistrationID()}");
                    VerifyRegistrationIdFormat(_security.GetRegistrationID());

                    Console.Write("ProvisioningClient RegisterAsync . . . ");
                    DeviceRegistrationResult result = await _provClient.RegisterAsync().ConfigureAwait(false);

                    Console.WriteLine($"{result.Status}");
                    Console.WriteLine($"ProvisioningClient AssignedHub: {result.AssignedHub}; DeviceID: {result.DeviceId}");

                    if (result.Status != ProvisioningRegistrationStatusType.Assigned)
                    {
                        return(1);
                    }

                    IAuthenticationMethod auth;
                    if (_security is SecurityProviderTpm)
                    {
                        Console.WriteLine("Creating TPM DeviceClient authentication.");
                        auth = new DeviceAuthenticationWithTpm(result.DeviceId, (_security as SecurityProviderTpm));
                    }
                    else if (_security is SecurityProviderX509)
                    {
                        Console.WriteLine("Creating X509 DeviceClient authentication.");
                        auth = new DeviceAuthenticationWithX509Certificate(result.DeviceId, (_security as SecurityProviderX509).GetAuthenticationCertificate());
                    }
                    else if (_security is SecurityProviderSymmetricKey)
                    {
                        Console.WriteLine("Creating Symmetric Key DeviceClient authenication");
                        auth = new DeviceAuthenticationWithRegistrySymmetricKey(result.DeviceId, (_security as SecurityProviderSymmetricKey).GetPrimaryKey());
                    }
                    else
                    {
                        throw new NotSupportedException("Unknown authentication type.");
                    }

                    // using (var deviceClient = DeviceClient.CreateFromConnectionString(deviceConnectionString, transportType))
                    using (DeviceClient deviceClient = DeviceClient.Create(result.AssignedHub, auth, TransportType.Amqp))
                    {
                        //
                        DigitalTwinClient digitalTwinClient = new DigitalTwinClient(deviceClient);

                        if (digitalTwinClient == null)
                        {
                            Console.WriteLine("Failed to create DeviceClient!");
                            return(1);
                        }

                        var sample = new DigitalTwinClientSample(digitalTwinClient);
                        await sample.RunSampleAsync();

                        Console.WriteLine("Waiting to receive updates from cloud...");
                        Console.WriteLine("Press any key to exit");
                        Console.ReadLine();
                    }
                }
            return(0);
        }
        public void Run(IBackgroundTaskInstance taskInstance)
        {
            DeviceRegistrationResult result;

            try
            {
                bme280Sensor = new BME280(0x76);
            }
            catch (Exception ex)
            {
                Debug.WriteLine($"BME280 Initialisation failed:{ex.Message}");

                return;
            }

            try
            {
                using (var security = new SecurityProviderTpmHsm(RegistrationId))
                    using (var transport = new ProvisioningTransportHandlerHttp())
                    {
                        string base64EK = Convert.ToBase64String(security.GetEndorsementKey());

                        ProvisioningDeviceClient provClient = ProvisioningDeviceClient.Create(GlobalDeviceEndpoint, IdScope, security, transport);

                        result = provClient.RegisterAsync().ConfigureAwait(false).GetAwaiter().GetResult();

                        IAuthenticationMethod auth = new DeviceAuthenticationWithTpm(result.DeviceId, security);

                        azureIoTHubClient = DeviceClient.Create(result.AssignedHub, auth, TransportType.Mqtt);
                    }
            }
            catch (Exception ex)
            {
                Debug.WriteLine($"DeviceClient.Create with TPM info failed:{ex.Message}");
                return;
            }

            try
            {
                azureIoTHubClient.SetMethodHandlerAsync("Restart", RestartAsync, null);
            }
            catch (Exception ex)
            {
                Debug.WriteLine($"Azure IoT Hub device method handler configuration failed:{ex.Message}");
                return;
            }

            try
            {
                TwinCollection reportedProperties;
                reportedProperties = new TwinCollection();

                // This is from the OS
                reportedProperties["Timezone"]    = TimeZoneSettings.CurrentTimeZoneDisplayName;
                reportedProperties["OSVersion"]   = Environment.OSVersion.VersionString;
                reportedProperties["MachineName"] = Environment.MachineName;

                // This is from the application manifest
                Package        package   = Package.Current;
                PackageId      packageId = package.Id;
                PackageVersion version   = packageId.Version;
                reportedProperties["ApplicationDisplayName"] = package.DisplayName;
                reportedProperties["ApplicationName"]        = packageId.Name;
                reportedProperties["ApplicationVersion"]     = string.Format($"{version.Major}.{version.Minor}.{version.Build}.{version.Revision}");

                // Unique identifier from the hardware
                SystemIdentificationInfo systemIdentificationInfo = SystemIdentification.GetSystemIdForPublisher();
                using (DataReader reader = DataReader.FromBuffer(systemIdentificationInfo.Id))
                {
                    byte[] bytes = new byte[systemIdentificationInfo.Id.Length];
                    reader.ReadBytes(bytes);
                    reportedProperties["SystemId"] = BitConverter.ToString(bytes);
                }

                azureIoTHubClient.UpdateReportedPropertiesAsync(reportedProperties).Wait();
            }
            catch (Exception ex)
            {
                Debug.Print($"Azure IoT Hub device twin configuration retrieval failed:{ex.Message}");
                return;
            }

            try
            {
                deviceTwin = azureIoTHubClient.GetTwinAsync().Result;
            }
            catch (Exception ex)
            {
                Debug.WriteLine($"Azure IoT Hub device twin configuration retrieval failed:{ex.Message}");
                return;
            }

            try
            {
                if (deviceTwin.Properties.Desired.Contains("TimerDue"))
                {
                    timerDue = TimeSpan.Parse(deviceTwin.Properties.Desired["TimerDue"].ToString());
                }

                if (deviceTwin.Properties.Desired.Contains("TimerPeriod"))
                {
                    timerPeriod = TimeSpan.Parse(deviceTwin.Properties.Desired["TimerPeriod"].ToString());
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine($"Sensor due or period configuration retrieval failed using default:{ex.Message}");
                return;
            }

            bme280InputPollingTimer = new Timer(SensorUpdateTimerCallback, null, timerDue, timerPeriod);

            //enable task to continue running in background
            backgroundTaskDeferral = taskInstance.GetDeferral();
        }
예제 #13
0
        public async Task <bool> Initialize()
        {
            _logger.LogDebug("Obtaining security provider for the device.");
            _security = await Device.AzureDeviceParameters.GetSecurityProviderAsync().ConfigureAwait(false);

            switch (Device.AzureDeviceParameters.TransportType)
            {
            case TransportType.Amqp:
                _transport = new ProvisioningTransportHandlerAmqp();
                break;

            case TransportType.Http1:
                _transport = new ProvisioningTransportHandlerHttp();
                break;

            case TransportType.Amqp_WebSocket_Only:
                _transport = new ProvisioningTransportHandlerAmqp(TransportFallbackType.WebSocketOnly);
                break;

            case TransportType.Amqp_Tcp_Only:
                _transport = new ProvisioningTransportHandlerAmqp(TransportFallbackType.TcpOnly);
                break;

            case TransportType.Mqtt:
                _transport = new ProvisioningTransportHandlerMqtt();
                break;

            case TransportType.Mqtt_WebSocket_Only:
                _transport = new ProvisioningTransportHandlerMqtt(TransportFallbackType.WebSocketOnly);
                break;

            case TransportType.Mqtt_Tcp_Only:
                _transport = new ProvisioningTransportHandlerMqtt(TransportFallbackType.TcpOnly);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            var provisioningClient = ProvisioningDeviceClient.Create(
                GlobalDeviceEndpoint,
                Device.AzureDeviceParameters.AzureScopeId,
                _security,
                _transport);

            _logger?.LogDebug("Provisioning device.");
            var provisioningResult = await provisioningClient.RegisterAsync().ConfigureAwait(false);

            if (provisioningResult.Status == ProvisioningRegistrationStatusType.Assigned)
            {
                _logger.LogDebug("Successfully provisioned device. Creating client.");
                IAuthenticationMethod auth;
                switch (_security)
                {
                case SecurityProviderTpm tpmSecurity:
                    auth = new DeviceAuthenticationWithTpm(
                        Device.AzureDeviceParameters.AzureDeviceId,
                        tpmSecurity);
                    break;

                case SecurityProviderX509 certificateSecurity:
                    auth = new DeviceAuthenticationWithX509Certificate(
                        Device.AzureDeviceParameters.AzureDeviceId,
                        certificateSecurity.GetAuthenticationCertificate());
                    break;

                case SecurityProviderSymmetricKey symmetricKeySecurity:
                    auth = new DeviceAuthenticationWithRegistrySymmetricKey(
                        Device.AzureDeviceParameters.AzureDeviceId,
                        symmetricKeySecurity.GetPrimaryKey());
                    break;

                default:
                    _logger.LogError("Specified security provider is unknown.");
                    throw new NotSupportedException("Unknown authentication type.");
                }

                _deviceClient = DeviceClient.Create(
                    provisioningResult.AssignedHub,
                    auth,
                    Device.AzureDeviceParameters.TransportType);

                await _deviceClient.OpenAsync().ConfigureAwait(false);

                Device.DeviceClient = _deviceClient;

                return(true);
            }

            _logger.LogWarning(
                $"Failed to provision the device. {provisioningResult.Status} - {provisioningResult.ErrorMessage}. Disposing.");
            await DisposeAsync();

            return(false);
        }
예제 #14
0
        public static async Task RunSample()
        {
            // DPS registration Id should be unique among enrollments.
            // Such registration Id could be from TPM or any other unique identity, such as device serial number
            // As an example, we use hostname in this sample as the unique registration Id
            // A valid DPS registration Id contains only lower case alphanumeric letters and '-'
            string RegistrationId = Dns.GetHostName().ToLower().Select(i => (Char.IsLetterOrDigit(i) || (i == '-'))? i.ToString(): "-").ToArray().Aggregate((a, b) => a + b);

#if _USE_TPMSIMULATOR
            Console.WriteLine("Starting TPM simulator.");
            SecurityProviderTpmSimulator.StartSimulatorProcess();

            // Replace the following type with SecurityProviderTpmHsm() to use a real TPM2.0 device.
            using (var security = new SecurityProviderTpmSimulator(RegistrationId))
#else
            using (var security = new SecurityProviderTpmHsm(RegistrationId))
#endif
                using (var transport = new ProvisioningTransportHandlerHttp())
                // using (var transport = new ProvisioningTransportHandlerAmqp(TransportFallbackType.TcpOnly))
                {
                    // Note that the TPM simulator will create an NVChip file containing the simulated TPM state.
                    Console.WriteLine("Extracting endorsement key.");
                    string base64EK       = Convert.ToBase64String(security.GetEndorsementKey());
                    string registrationId = security.GetRegistrationID();

                    Console.WriteLine(
                        "In your Azure Device Provisioning Service please go to 'Manage enrollments' and select " +
                        "'Individual Enrollments'. Select 'Add' then fill in the following:");

                    Console.WriteLine("\tMechanism: TPM");
                    Console.WriteLine($"\tRegistration ID: {registrationId}");
                    Console.WriteLine($"\tEndorsement key: {base64EK}");
                    Console.WriteLine();
                    Console.WriteLine("Press ENTER when ready.");
                    Console.ReadLine();

                    ProvisioningDeviceClient provClient =
                        ProvisioningDeviceClient.Create(GlobalDeviceEndpoint, s_idScope, security, transport);

                    Console.Write("ProvisioningClient RegisterAsync . . . ");
                    DeviceRegistrationResult result = await provClient.RegisterAsync().ConfigureAwait(false);

                    Console.WriteLine($"{result.Status}");
                    Console.WriteLine($"ProvisioningClient AssignedHub: {result.AssignedHub}; DeviceID: {result.DeviceId}");

                    if (result.Status != ProvisioningRegistrationStatusType.Assigned)
                    {
                        return;
                    }

                    var auth = new DeviceAuthenticationWithTpm(result.DeviceId, security);

                    using (DeviceClient iotClient = DeviceClient.Create(result.AssignedHub, auth, TransportType.Http1))
                    {
                        Console.WriteLine("DeviceClient OpenAsync.");
                        await iotClient.OpenAsync().ConfigureAwait(false);

                        Console.WriteLine("DeviceClient SendEventAsync.");
                        await iotClient.SendEventAsync(new Message(Encoding.UTF8.GetBytes("TestMessage"))).ConfigureAwait(false);

                        Console.WriteLine("DeviceClient CloseAsync.");
                        await iotClient.CloseAsync().ConfigureAwait(false);
                    }
                }
        }