public string PreparePayload(long deviceId)
        {
            var deviceRSA        = new RSACryptoServiceProvider(2048);
            var activationSecret = String.Empty;
            var activationId     = String.Empty;

            using (var db = new IoTContext())
            {
                var device = db.Devices.Find(deviceId);
                deviceRSA.FromXmlString(device.RSAKeyXML);
                activationSecret = device.ActivationSecret;
                activationId     = device.ActivationId;
            }

            var dotnetPublicKey = deviceRSA.ExportParameters(false);
            var bouncyPublicKey = DotNetUtilities.GetRsaPublicKey(dotnetPublicKey);

            var       pemPublicKey = new StringWriter();
            PemWriter writer       = new PemWriter(pemPublicKey);

            writer.WriteObject(bouncyPublicKey);

            var publicKey = pemPublicKey.ToString().Replace("-----", "").Replace("BEGIN PUBLIC KEY\r\n", "").Replace("\r\nEND PUBLIC KEY", "");


            byte[]     textBytes     = Encoding.UTF8.GetBytes(activationId);
            HMACSHA256 hashAlgorithm = new HMACSHA256(Encoding.UTF8.GetBytes(activationSecret));

            byte[] secretHash = hashAlgorithm.ComputeHash(textBytes);

            var payLoadString  = activationId + "\n" + "RSA" + "\n" + "X.509" + "\n" + "HmacSHA256" + "\n";
            var payLoadBytes   = Encoding.UTF8.GetBytes(payLoadString);
            var publicKeyBytes = Convert.FromBase64String(publicKey);

            byte[] signatureBytes = new byte[payLoadBytes.Length + secretHash.Length + publicKeyBytes.Length];
            Array.Copy(payLoadBytes, 0, signatureBytes, 0, payLoadBytes.Length);
            Array.Copy(secretHash, 0, signatureBytes, payLoadBytes.Length, secretHash.Length);
            Array.Copy(publicKeyBytes, 0, signatureBytes, secretHash.Length + payLoadBytes.Length, publicKeyBytes.Length);

            byte[] signature = deviceRSA.SignData(signatureBytes, new SHA256Managed());


            JObject obj = JObject.FromObject(new
            {
                deviceModels = new[]
                {
                    "urn:oracle:iot:dcd:capability:direct_activation",
                    "urn:com:keurig:coffee:machine"
                },
                certificationRequestInfo = new
                {
                    subject = activationId,
                    subjectPublicKeyInfo = new
                    {
                        algorithm           = "RSA",
                        publicKey           = publicKey,
                        format              = "X.509",
                        secretHashAlgorithm = "HmacSHA256"
                    },
                    attributes = new { }
                },
                signatureAlgorithm = "SHA256withRSA",
                signature          = Convert.ToBase64String(signature)
            });

            return(obj.ToString());
        }
Пример #2
0
        public bool Send(long deviceId, long count = 1)
        {
            Message message          = null;
            var     deviceEndpointId = String.Empty;

            using (var db = new IoTContext())
            {
                var device = db.Devices.Find(deviceId);
                deviceEndpointId = device.DeviceEndpointId;
                message          = new Message
                {
                    ClientId    = Guid.NewGuid().ToString(),
                    Source      = device.DeviceEndpointId,
                    Destination = "",
                    Priority    = "LOW",
                    Reliability = "BEST_EFFORT",
                    EventTime   = (long)((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds),
                    Sender      = "",
                    Type        = "DATA",
                    Payload     = new CoffeePayload
                    {
                        Format = "urn:com:keurig:coffee:machine:attributes",
                        Data   = new CoffeeData
                        {
                            BeansLevel = 10,
                            WaterLevel = 80,
                            Latitude   = 37.39,
                            Longitude  = -121.95
                        }
                    }
                };
            }
            var messages = new List <Message> {
                message
            };
            var data = JsonConvert.SerializeObject(messages, Newtonsoft.Json.Formatting.Indented);

            Console.WriteLine("Message: " + data);

            var bearerToken = new Authentication().GetBearerToken(Scope.General, deviceId);

            var appSettingsReader = new AppSettingsReader();
            var url = appSettingsReader.GetValue("serverBase", typeof(string)).ToString() + appSettingsReader.GetValue("messEndpoint", typeof(string)).ToString();

            //Message messageResponse = null;

            for (var i = 0; i < count; i++)
            {
                using (var httpClient = new HttpClient())
                {
                    var content = new StringContent(data, Encoding.UTF8, "application/json");
                    content.Headers.Clear();
                    content.Headers.Add("Content-Type", "application/json");

                    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken.AccessToken);
                    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                    httpClient.DefaultRequestHeaders.Add("X-EndpointId", deviceEndpointId);

                    Console.WriteLine(url);
                    HttpResponseMessage response   = httpClient.PostAsync(url, content).Result;
                    IJsonSerializer     serializer = new JsonNetSerializer();
                    Console.WriteLine($"Response Code: {response.StatusCode}");
                    using (var responseStream = response.Content.ReadAsStreamAsync().Result)
                    {
                        if (responseStream == null)
                        {
                            return(false);
                        }
                        using (var streamReader = new StreamReader(responseStream))
                        {
                            var responseContent = streamReader.ReadToEnd();
                            Console.WriteLine(responseContent);
                            //messageResponse = serializer.Deserialize<Message>(responseContent);
                        }
                    }
                }
            }
            return(true);
        }
Пример #3
0
        private string GetJwtToken(Scope scope, long deviceId)
        {
            var activationSecret = String.Empty;
            var privateKey       = String.Empty;
            var deviceEndpointId = String.Empty;
            var activationId     = String.Empty;
            var deviceRSAXml     = String.Empty;

            using (var db = new IoTContext())
            {
                var device = db.Devices.Where(d => d.Id == 1).Include(d => d.Registration).First();
                activationSecret = device.Registration.SharedSecret;
                deviceEndpointId = device.Registration.DeviceEnpointId;
                activationId     = device.Registration.HardwareId;
                deviceRSAXml     = device.RSAKeyXML;
            }

            IDateTimeProvider provider = new UtcDateTimeProvider();
            var expiresOn = provider.GetNow().AddMinutes(20);
            //var secret = appSettingsReader.GetValue(scope == Scope.Activation ? "activationSecret" : "privateKey", typeof(string)).ToString();

            var unixEpoch         = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); // or use JwtValidator.UnixEpoch
            var secondsSinceEpoch = Math.Round((provider.GetNow() - unixEpoch).TotalSeconds);


            var payload = new Dictionary <string, object>
            {
                { "iss", scope == Scope.Activation ? activationId : deviceEndpointId },
                { "exp", Convert.ToInt32(secondsSinceEpoch) },
                { "aud", appSettingsReader.GetValue("jwtAudience", typeof(string)).ToString() }
            };

            if (scope == Scope.Activation)
            {
                IJwtAlgorithm     algorithm  = new HMACSHA256Algorithm();
                IJsonSerializer   serializer = new JsonNetSerializer();
                IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
                IJwtEncoder       encoder    = new JwtEncoder(algorithm, serializer, urlEncoder);

                var jwtToken = encoder.Encode(payload, activationSecret);
                return(jwtToken);
            }
            else
            {
                RSACryptoServiceProvider deviceRSA = new RSACryptoServiceProvider();
                deviceRSA.FromXmlString(deviceRSAXml);
                IJsonSerializer   serializer = new JsonNetSerializer();
                IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();

                var segments = new List <string>(3);

                var header = new Dictionary <string, object>();
                header.Add("typ", "JWT");
                header.Add("alg", "RS256");

                var headerBytes  = Encoding.UTF8.GetBytes(serializer.Serialize(header));
                var payloadBytes = Encoding.UTF8.GetBytes(serializer.Serialize(payload));

                segments.Add(urlEncoder.Encode(headerBytes));
                segments.Add(urlEncoder.Encode(payloadBytes));

                var stringToSign = String.Join(".", segments.ToArray());
                var bytesToSign  = Encoding.UTF8.GetBytes(stringToSign);

                var signature = deviceRSA.SignData(bytesToSign, new SHA256Managed());
                segments.Add(urlEncoder.Encode(signature));

                return(String.Join(".", segments.ToArray()));
            }
        }
Пример #4
0
        public Device RegisterDevice(long deviceId)
        {
            var username = appSettingsReader.GetValue("username", typeof(string)).ToString();
            var password = appSettingsReader.GetValue("password", typeof(string)).ToString();
            var url      = appSettingsReader.GetValue("serverBase", typeof(string)).ToString() + appSettingsReader.GetValue("regEndpoint", typeof(string)).ToString();

            JObject data;

            using (var db = new IoTContext())
            {
                var device       = db.Devices.Where(d => d.Id == deviceId).Include(d => d.Registration).First();
                var registration = device.Registration;

                data = JObject.FromObject(new
                {
                    hardwareId   = registration.HardwareId,
                    sharedSecret = Convert.ToBase64String(Encoding.ASCII.GetBytes(registration.SharedSecret)),
                    name         = registration.Name
                });

                registration.Request = data.ToString();
                db.SaveChanges();
            }

            String responseContent;

            using (var httpClient = new HttpClient())
            {
                var content = new StringContent(data.ToString(), Encoding.UTF8, "application/json");
                content.Headers.Clear();
                content.Headers.Add("Content-Type", "application/json");

                String authHeader = System.Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(username + ":" + password));
                //httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Authorization", "Bearer " + authHeader);
                httpClient.DefaultRequestHeaders.Add("Authorization", "Basic " + authHeader);
                httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                Console.WriteLine($"Registration URL {url}");
                HttpResponseMessage response   = httpClient.PostAsync(url, content).Result;
                IJsonSerializer     serializer = new JsonNetSerializer();
                var registration = new Registration();

                using (var responseStream = response.Content.ReadAsStreamAsync().Result)
                {
                    if (responseStream == null)
                    {
                        return(null);
                    }
                    using (var streamReader = new StreamReader(responseStream))
                    {
                        responseContent = streamReader.ReadToEnd();
                        Console.WriteLine(responseContent);
                        registration = serializer.Deserialize <Registration>(responseContent);
                        Console.WriteLine($"Registration Status: {registration.State}");
                    }
                }
            }

            using (var db = new IoTContext())
            {
                var device       = db.Devices.Where(d => d.Id == deviceId).Include(d => d.Registration).First();
                var registration = device.Registration;
                registration.Response = responseContent;

                var deviceRSA    = new RSACryptoServiceProvider(2048);
                var deviceRSAXml = deviceRSA.ToXmlString(true);
                device.RSAKeyXML = deviceRSAXml;

                db.SaveChanges();
            }
            return(null);
        }