-
Notifications
You must be signed in to change notification settings - Fork 0
/
PublicKeyMap.py
103 lines (69 loc) · 3.07 KB
/
PublicKeyMap.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
from PublicKey import PublicKey
import copy
class PublicKeyMap:
""" defines a map keyName2PublicKey from keyNames (strings) to public keys
For efficiency reason we maintain as well the inverse,
publicKey2KeyName
When only using operations in this class consistency
will be maintained
Note that publicKey2KeyName is considered as derived,
when using copy, deepcopy, or comparison, only keyName2PublicKey is used
"""
def __init__(self,keyName2PublicKey = None):
"""Constructs the public key map,
initialised with all keyName to public key items
in keyName2PublicKey.
With no argument, constructs the empty public key map"""
self.keyName2PublicKey = dict()
self.publicKey2KeyName = dict()
if keyName2PublicKey is not None:
for keyName in keyName2PublicKey.keys():
self.addKey(keyName,keyName2PublicKey[keyName])
def __repr__(self):
"""default toString method"""
result = ""
for keyName in self.getKeyNames():
result += "(keyName=" + keyName + ", PublicKey=" +\
str(self.getPublicKey(keyName)) + ")\n"
return result
def __eq__(self,other):
return self.keyName2PublicKey == other.keyName2PublicKey
def __copy__(self):
return PublicKeyMap(self.keyName2PublicKey)
def addKey(self, keyName, publicKey):
"""Add a key to PublicKeymap"""
self.keyName2PublicKey[keyName] = publicKey
self.publicKey2KeyName[publicKey] = keyName
def getKeyName(self,publicKey):
"""Lookup the keyName for a public key in PublicKeyMap"""
return self.publicKey2KeyName[publicKey]
def getPublicKey(self,keyName):
"""Lookup the Public Key for a keyName in PublicKeyMap"""
return self.keyName2PublicKey[keyName]
def getPublicKeyString(self,keyName):
"""Lookup the Public Key as a string for a keyName in PublicKeyMap"""
return str(self.keyName2PublicKey[keyName])
def getKeyNames(self):
"""Get a list of keyNames"""
return self.keyName2PublicKey.keys()
def addPublicKeyMap(self,publicKeyMap):
"""Add a public key map -- allows to combine several
public key maps into one"""
for keyName in publicKeyMap.getKeyNames():
self.addKey(keyName,publicKeyMap.getPublicKey(keyName))
def test():
"""Test cases """
from Crypto.PublicKey import RSA
keyAlice= PublicKey(RSA.generate(2048).publickey())
keyBob= PublicKey(RSA.generate(2048).publickey())
pbkm = PublicKeyMap()
pbkm.addKey("Alice",keyAlice)
pbkm.addKey("Bob",keyBob)
print("After adding keys for Alice and Bob")
print(pbkm)
print("public key for Alice = ",pbkm.getPublicKey("Alice"))
print("keyname for keyAlice = ",pbkm.getKeyName(keyAlice))
print("Keynames = ",pbkm.getKeyNames())
print("PublicKeyMap=\n",pbkm)
if __name__== "__main__":
test()