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()); }
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); }
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())); } }
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); }