blob: e57a8463d6e99690efed0d1dc9b8d489e36f83f7 [file] [log] [blame]
## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
#
# Copyright (c) 2011-2013, Regents of the University of California
# Alexander Afanasyev
#
# GNU 3.0 license, See the LICENSE file for more information
#
# Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
#
#
# Based on PyCCN code, copyrighted and licensed as follows
#
# Copyright (c) 2011-2013, Regents of the University of California
# BSD license, See the COPYING file for more information
# Written by: Derek Kulinski <takeda@takeda.tk>
# Jeff Burke <jburke@ucla.edu>
#
# Fronts ccn_pkey.
from . import _ndn
from . import Name
class Key(object):
def __init__(self):
self.type = None
self.publicKeyID = None # SHA256 hash
# ndn
self.ccn_data_dirty = False
self.ccn_data_public = None # backing pkey
self.ccn_data_private = None # backing pkey
def __get_ccn(self):
pass
def generateRSA(self, numbits):
_ndn.generate_RSA_key(self, numbits)
def privateToDER(self):
if not self.ccn_data_private:
raise _ndn.CCNKeyError("Key is not private")
return _ndn.DER_write_key(self.ccn_data_private)
def publicToDER(self):
return _ndn.DER_write_key(self.ccn_data_public)
def privateToPEM(self, filename = None, password = None):
if not self.ccn_data_private:
raise _ndn.CCNKeyError("Key is not private")
if filename:
f = open(filename, 'w')
_ndn.PEM_write_key(self.ccn_data_private, file=f, password = password)
f.close()
else:
return _ndn.PEM_write_key(self.ccn_data_private, password = password)
def publicToPEM(self, filename = None):
if filename:
f = open(filename, 'w')
_ndn.PEM_write_key(self.ccn_data_public, file=f)
f.close()
else:
return _ndn.PEM_write_key(self.ccn_data_public)
def fromDER(self, private = None, public = None):
if private:
(self.ccn_data_private, self.ccn_data_public, self.publicKeyID) = \
_ndn.DER_read_key(private=private)
return
if public:
(self.ccn_data_private, self.ccn_data_public, self.publicKeyID) = \
_ndn.DER_read_key(public=public)
return
def fromPEM(self, filename = None, private = None, public = None, password = None):
if filename:
f = open(filename, 'r')
(self.ccn_data_private, self.ccn_data_public, self.publicKeyID) = \
_ndn.PEM_read_key(file=f, password = password)
f.close()
elif private:
(self.ccn_data_private, self.ccn_data_public, self.publicKeyID) = \
_ndn.PEM_read_key(private=private, password = password)
elif public:
(self.ccn_data_private, self.ccn_data_public, self.publicKeyID) = \
_ndn.PEM_read_key(public=public)
@staticmethod
def createFromDER (private = None, public = None):
key = Key ()
key.fromDER (private, public)
return key
@staticmethod
def createFromPEM (filename = None, private = None, public = None, password = None):
key = Key ()
key.fromPEM (filename, private, public, password)
return key
@staticmethod
def getDefaultKey():
return _ndn.get_default_key()
# plus library helper functions to generate and serialize keys?
class KeyLocator(object):
def __init__(self, arg=None):
#whichever one is not none will be used
#if multiple set, checking order is: keyName, key, certificate
self.key = arg if type(arg) is Key else None
self.keyName = arg if type(arg) is Name.Name else None
self.certificate = None
# ndn
self.ccn_data_dirty = True
self.ccn_data = None # backing charbuf
def __setattr__(self, name, value):
if name != "ccn_data" and name != "ccn_data_dirty":
self.ccn_data_dirty = True
object.__setattr__(self, name, value)
def __getattribute__(self, name):
if name=="ccn_data":
if object.__getattribute__(self, 'ccn_data_dirty'):
if object.__getattribute__(self, 'keyName'):
self.ccn_data = _ndn.KeyLocator_to_ccn(
name=self.keyName.ccn_data)
elif object.__getattribute__(self, 'key'):
self.ccn_data = _ndn.KeyLocator_to_ccn(
key=self.key.ccn_data_public)
elif object.__getattribute__(self, 'certificate'):
#same but with cert= arg
raise NotImplementedError("certificate support is not implemented")
else:
raise TypeError("No name, key nor certificate defined")
self.ccn_data_dirty = False
return object.__getattribute__(self, name)
@staticmethod
def getDefaultKeyLocator():
return KeyLocator (_ndn.get_default_key_name ())