def get_device(self, device_id): device_path = self.client.device_path(self.project_id, self.cloud_region, self.registry_id, device_id) try: device = self.client.get_device(request={ "name": device_path }) device_data = { "name": device.name, "id": device.id, "num_id": device.num_id, "last_heartbeat_time": str(device.last_heartbeat_time), "last_event_time": str(device.last_event_time), "last_error_time": str(device.last_error_time), "last_error_status": { "code": device.last_error_status.code, "message": device.last_error_status.message }, "credentials": [], "config": { "version": device.config.version, "cloud_update_time": str(device.config.cloud_update_time), "device_ack_time": str(device.config.device_ack_time), }, "last_config_ack_time": str(device.last_config_ack_time), "last_config_send_time": str(device.last_config_send_time), "gateway_config": {}, "last_state_time": str(device.last_state_time), "log_level": str(device.log_level) } RSAObject = RSACipher() RSAObject.set_public_key(public_key_file="keys/RSA/public.pem") for credential in device.credentials: aes_key = ''.join(random.choices(string.ascii_uppercase + string.ascii_lowercase + string.digits, k=20)) encrypted_key = RSAObject.encrypt(plain_text=aes_key) AESObject = AESCipher(key=aes_key) encrypted_public_key_file = AESObject.encrypt(plain_text=credential.public_key.key) device_data["credentials"].append({ "public_key": { "format": "RSA_X509_PEM", "key": encrypted_public_key_file, "secret": encrypted_key }, "expiration_time": {} }) return device_data, {"success": True} except exceptions.NotFound: return {}, {"success": False, "message": "Device Not Found"}
def device_handler(): if request.method == 'GET': if request.args.get("id") is None: devices, state = manager.list_devices() return jsonify({ "success": state['success'], "devices": devices if state['success'] else [], "error": state['message'] if not state['success'] else "" }) else: device, state = manager.get_device( device_id=request.args.get("id")) return jsonify({ "success": state['success'], "device": device if state['success'] else {}, "error": state['message'] if not state['success'] else "" }) elif request.method == 'DELETE': if request.args.get("id") is None: return jsonify({ "success": False, "error": "no device id provided" }) result = manager.delete_device(device_id=request.args.get("id")) return jsonify(result) elif request.method == 'POST': request_data = request.get_json() if "id" not in request_data: return jsonify({ "success": False, "error": "no device id provided" }) if "key" not in request_data: return jsonify({ "success": False, "error": "no public key provided" }) if "secret" not in request_data: return jsonify({"success": False, "error": "no secret provided"}) encrypted_public_key = request_data["key"] aes_key = request_data["secret"] device_id = request_data["id"] RSAObject = RSACipher() RSAObject.set_private_key(private_key_file="keys/RSA/private.pem") decrypted_aes_key = RSAObject.decrypt(encrypted_text=aes_key) AESObject = AESCipher(key=decrypted_aes_key) decrypted_public_key_file = AESObject.decrypt( encrypted_text=encrypted_public_key) response = manager.create_device(device_id=device_id, public_key=decrypted_public_key_file) return jsonify(response)
import requests import random import string import json from AES.AESCipher import AESCipher from RSA.RSACipher import RSACipher from DeviceManagement.Manager import DeviceManager DEVICE_ID = "device-0" if __name__ == '__main__': RSAObject = RSACipher() RSAObject.set_public_key(public_key_file="keys/RSA/public.pem") print("ENCRYPTION IN PROGRESS!") aes_key = ''.join(random.choices(string.ascii_uppercase + string.ascii_lowercase + string.digits, k=20)) encrypted_key = RSAObject.encrypt(plain_text=aes_key) print("AES Key: {}\n".format(encrypted_key)) AESObject = AESCipher(key=aes_key) encrypted_public_key_file = AESObject.encrypt(plain_text=open("keys/public_key.pub", 'r').read()) print("Encrypted Public Key File: \n{}\n".format(encrypted_public_key_file)) response = requests.post(url="http://localhost:5000/device", json={ "id": DEVICE_ID, "key": encrypted_public_key_file, "secret": encrypted_key }) print(response.status_code)
def hex_decrypt(self, message): box = AESCipher(self.session_key, 16) return box.hex_decrypt(message)
def decrypt(self, message): box = AESCipher(self.session_key, 16) return str(box.decrypt(message))