deleted: end-device.py
end_device.py
Change-Id: I9ab2a7b22ed4f1ac5b179701df115edc6b006e91
diff --git a/end-device.py b/end-device.py
deleted file mode 100644
index 27ee7d9..0000000
--- a/end-device.py
+++ /dev/null
@@ -1,174 +0,0 @@
-# -*- Mode:python; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-#
-# Copyright (C) 2014 Regents of the University of California.
-# Author: Teng Liang <philoliang2011@gmail.com>
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-# A copy of the GNU General Public License is in the file COPYING.
-
-import time
-import json
-from pyndn import Name, Face, Interest, Data, ThreadsafeFace
-from pyndn import KeyLocator, KeyLocatorType
-from base_node import BaseNode
-from hmac_helper import HmacHelper
-from pyndn.security.security_exception import SecurityException
-from pyndn.util import Blob
-try:
- import asyncio
-except ImportError:
- import trollius as asyncio
-
-def dump(*list):
- result = ""
- for element in list:
- result += (element if type(element) is str else repr(element)) + " "
- print(result)
-
-class Device(BaseNode):
- def __init__(self,configFileName):
- super(Device, self).__init__(configFileName=configFileName)
-
- self._deviceSerial = self.getSerial()
- self._callbackCount = 0
- self._symKey = "symmetricKeyForBootstrapping"
- self._category = "sensors"
- self._id = "T9273659"
- self._hmacHelper = HmacHelper(self._symKey)
-
-
- def expressBootstrapInterest(self):
-
- #generate bootstrap name /home/controller/bootstrap/<device-parameters>
- bootstrapName = Name(self._bootstrapPrefix)
-
- deviceParameters = {}
- deviceParameters["category"] = self._category
- deviceParameters["id"] = self._id
- bootstrapName.append(json.dumps(deviceParameters))
-
- bootstrapInterest = Interest(bootstrapName)
- bootstrapInterest.setInterestLifetimeMilliseconds(5000)
- #bootstrapKeyLocator = KeyLocator()
- #bootstrapKeyLocator.setType(KeyLocatorType.KEY_LOCATOR_DIGEST)
- #bootstrapKeyLocator.setKeyData(self._symKey)
- #bootstrapInterest.setKeyLocator(bootstrapKeyLocator)
- self._hmacHelper.signInterest(bootstrapInterest)
-
- dump("Express bootstrap interest : ",bootstrapInterest.toUri())
- self.face.expressInterest(bootstrapInterest, self.onBootstrapData, self.onTimeout)
- def onInterest():
- pass
- def onRegisterFailed():
- pass
-
- def onBootstrapData(self, interest, data):
- dump("Bootstrap data received.")
-
- if (self._hmacHelper.verifyData(data)):
- self.log.info("Bootstrap data is verified")
- content = json.loads(data.getContent().toRawStr(), encoding="latin-1")
- deviceNewIdentity = Name(content["deviceNewIdentity"])
- controllerIdentity = Name(content["controllerIdentity"])
- controllerPublicKeyInfo = content["controllerPublicKey"]
-
- self.face.registerPrefix(content["deviceNewIdentity"],self.onInterest,self.onRegisterFailed)
- #set new identity as default and generate default key-pair with KSK Certificate
- self._identityStorage.addIdentity(deviceNewIdentity)
- self._identityManager.setDefaultIdentity(deviceNewIdentity)
- try:
- self._identityManager.getDefaultKeyNameForIdentity(deviceNewIdentity)
- except SecurityException:
- #generate new key-pair and certificate for new identity
- dump("Install new identity as default\nGenerate new key-pair and self signed certificate")
- newKey = self._identityManager.generateRSAKeyPairAsDefault(Name(deviceNewIdentity), isKsk=True)
- newCert = self._identityManager.selfSign(newKey)
- self._identityManager.addCertificateAsIdentityDefault(newCert)
-
- #add controller's identity and public key
- keyType = controllerPublicKeyInfo["keyType"]
- keyName = Name(controllerPublicKeyInfo["keyName"])
- keyDer = Blob().fromRawStr(controllerPublicKeyInfo["publicKeyDer"])
- dump("Controller's KeyType: ",keyType)
- dump("Controller's keyName: ",keyName)
- dump("Controller public key der : ",keyDer)
-
- self._identityStorage.addIdentity(controllerIdentity)
- try:
- self._identityStorage.addKey(keyName, keyType, keyDer)
- dump("Controller's identity, key and certificate installled.")
- except SecurityException:
- dump("Controller's identity, key, certificate already exists.")
-
- #express an certificate request interest
- defaultKeyName = self._identityManager.getDefaultKeyNameForIdentity(self._keyChain.getDefaultIdentity() )
- self.requestCertificate(defaultKeyName)
- else:
- self.log.info("Bootstrap data is not verified")
-
-
-
-
- def beforeLoopStart(self):
- self.face.registerPrefix('/home', self.onInterest, self.onRegisterFailed)
- self.expressBootstrapInterest()
-
- def onTimeout(self, interest):
- self._callbackCount += 1
- dump("Time out for interest", interest.getName().toUri())
-
- def requestCertificate(self, keyIdentity):
- """
- We compose a command interest with our public key info so the controller
- can sign us a certificate that can be used with other nodes in the network.
- Name format : /home/<device-category>/KEY/<device-id>/<key-id>/<publickey>/ID-CERT/<version-number>
- """
- certificateRequestName = self._keyChain.getDefaultIdentity()
- deviceIdComponent = certificateRequestName.get(-1)
- keyIdComponent = keyIdentity.get(-1)
-
- certificateRequestName = certificateRequestName
- certificateRequestName.append("KEY")
- #certificateRequestName.append(deviceIdComponent)
- certificateRequestName.append(keyIdComponent)
-
- key = self._identityManager.getPublicKey(keyIdentity)
- keyInfo = {}
- keyInfo["keyType"] = key.getKeyType()
- keyInfo["keyDer"] = key.getKeyDer().toRawStr()
-
- certificateRequestName.append(json.dumps(keyInfo, encoding="latin-1"))
-
- certificateRequestName.append("ID-CERT")
-
- certificateRequest = Interest(certificateRequestName)
- certificateRequest.setInterestLifetimeMilliseconds(5000)
- self._hmacHelper.signInterest(certificateRequest)
-
- dump("Sending certificate request : ",certificateRequestName)
-
- self.face.expressInterest(certificateRequest, self.onCertificateData, self.onTimeout)
- #TODO use symmetric key to sign
-
- def onCertificateData(self, interest, data):
- dump("OnCertificateData : ",data)
-
-
-if __name__ == '__main__':
-
- device = Device("tmp.conf")
- device.start()
-
-
-