@@ -162,12 +162,13 @@ def createCertificate(req, issuerCertKey, serial, validityPeriod, digest="sha256
162
162
# SUBJECT_DEFAULT = {countryName : "US", stateOrProvinceName : "NC", localityName : "RTP", organizationName : "IBM", organizationalUnitName : "Blockchain"}
163
163
164
164
class Entity :
165
- def __init__ (self , name ):
165
+ def __init__ (self , name , ecdsaSigningKey , rsaSigningKey ):
166
166
self .name = name
167
167
# Create a ECDSA key, then a crypto pKey from the DER for usage with cert requests, etc.
168
- self .ecdsaSigningKey = createECDSAKey ()
169
- self .rsaSigningKey = createRSAKey ()
170
- self .pKey = crypto .load_privatekey (crypto .FILETYPE_ASN1 , self .ecdsaSigningKey .to_der ())
168
+ self .ecdsaSigningKey = ecdsaSigningKey
169
+ self .rsaSigningKey = rsaSigningKey
170
+ if self .ecdsaSigningKey :
171
+ self .pKey = crypto .load_privatekey (crypto .FILETYPE_ASN1 , self .ecdsaSigningKey .to_der ())
171
172
# Signing related ecdsa config
172
173
self .hashfunc = hashlib .sha256
173
174
self .sigencode = ecdsa .util .sigencode_der_canonize
@@ -200,10 +201,16 @@ def verifySignature(self, signature, signersCert, data):
200
201
def getPrivateKeyAsPEM (self ):
201
202
return self .ecdsaSigningKey .to_pem ()
202
203
204
+ def __getstate__ (self ):
205
+ state = dict (self .__dict__ )
206
+ del state ['ecdsaSigningKey' ]
207
+ del state ['rsaSigningKey' ]
208
+ del state ['pKey' ]
209
+ return state
203
210
204
211
class User (Entity , orderer_util .UserRegistration ):
205
- def __init__ (self , name , directory ):
206
- Entity .__init__ (self , name )
212
+ def __init__ (self , name , directory , ecdsaSigningKey , rsaSigningKey ):
213
+ Entity .__init__ (self , name , ecdsaSigningKey = ecdsaSigningKey , rsaSigningKey = rsaSigningKey )
207
214
orderer_util .UserRegistration .__init__ (self , name , directory )
208
215
self .tags = {}
209
216
@@ -222,8 +229,8 @@ def cleanup(self):
222
229
223
230
class Organization (Entity ):
224
231
225
- def __init__ (self , name ):
226
- Entity .__init__ (self , name )
232
+ def __init__ (self , name , ecdsaSigningKey , rsaSigningKey ):
233
+ Entity .__init__ (self , name , ecdsaSigningKey , rsaSigningKey )
227
234
req = createCertRequest (self .pKey , C = "US" , ST = "North Carolina" , L = "RTP" , O = "IBM" , CN = name )
228
235
numYrs = 1
229
236
self .signedCert = createCertificate (req , (req , self .pKey ), 1000 , (0 , 60 * 60 * 24 * 365 * numYrs ), isCA = True )
@@ -265,21 +272,23 @@ def addToNetwork(self, network):
265
272
266
273
class Directory :
267
274
def __init__ (self ):
275
+ import atexit
268
276
self .organizations = {}
269
277
self .users = {}
270
278
self .ordererAdminTuples = {}
279
+ atexit .register (self .cleanup )
271
280
272
281
def getNamedCtxTuples (self ):
273
282
return self .ordererAdminTuples
274
283
275
284
def _registerOrg (self , orgName ):
276
285
assert orgName not in self .organizations , "Organization already registered {0}" .format (orgName )
277
- self .organizations [orgName ] = Organization (orgName )
286
+ self .organizations [orgName ] = Organization (orgName , ecdsaSigningKey = createECDSAKey (), rsaSigningKey = createRSAKey () )
278
287
return self .organizations [orgName ]
279
288
280
289
def _registerUser (self , userName ):
281
290
assert userName not in self .users , "User already registered {0}" .format (userName )
282
- self .users [userName ] = User (userName , directory = self )
291
+ self .users [userName ] = User (userName , directory = self , ecdsaSigningKey = createECDSAKey (), rsaSigningKey = createRSAKey () )
283
292
return self .users [userName ]
284
293
285
294
def getUser (self , userName , shouldCreate = False ):
@@ -353,6 +362,48 @@ def registerOrdererAdminTuple(self, userName, ordererName, organizationName):
353
362
self .ordererAdminTuples [ordererAdminTuple ] = userCert
354
363
return ordererAdminTuple
355
364
365
+ def dump (self , output ):
366
+ 'Will dump the directory to the provided store'
367
+ import cPickle
368
+ data = {'users' : {}, 'organizations' : {}, 'nats' : {}}
369
+ dump_cert = lambda cert : crypto .dump_certificate (crypto .FILETYPE_PEM , cert )
370
+ for userName , user in self .users .iteritems ():
371
+ # for k, v in user.tags.iteritems():
372
+ # try:
373
+ # cPickle.dumps(v)
374
+ # except:
375
+ # raise Exception("Failed on key {0}".format(k))
376
+ data ['users' ][userName ] = (user .ecdsaSigningKey .to_pem (), crypto .dump_privatekey (crypto .FILETYPE_PEM , user .rsaSigningKey ), user .tags )
377
+ for orgName , org in self .organizations .iteritems ():
378
+ networks = [n .name for n in org .networks ]
379
+ data ['organizations' ][orgName ] = (
380
+ org .ecdsaSigningKey .to_pem (), crypto .dump_privatekey (crypto .FILETYPE_PEM , org .rsaSigningKey ),
381
+ dump_cert (org .getSelfSignedCert ()), networks )
382
+ for nat , cert in self .ordererAdminTuples .iteritems ():
383
+ data ['nats' ][nat ] = dump_cert (cert )
384
+ cPickle .dump (data , output )
385
+
386
+ def initFromPath (self , path ):
387
+ 'Will initialize the directory from the path supplied'
388
+ import cPickle
389
+ data = None
390
+ with open (path ,'r' ) as f :
391
+ data = cPickle .load (f )
392
+ assert data != None , "Expected some data, did not load any."
393
+ priv_key_from_pem = lambda x : crypto .load_privatekey (crypto .FILETYPE_PEM , x )
394
+ for userName , keyTuple in data ['users' ].iteritems ():
395
+ self .users [userName ] = User (userName , directory = self ,
396
+ ecdsaSigningKey = ecdsa .SigningKey .from_pem (keyTuple [0 ]),
397
+ rsaSigningKey = priv_key_from_pem (keyTuple [1 ]))
398
+ self .users [userName ].tags = keyTuple [2 ]
399
+ for orgName , tuple in data ['organizations' ].iteritems ():
400
+ org = Organization (orgName , ecdsaSigningKey = ecdsa .SigningKey .from_pem (keyTuple [0 ]),
401
+ rsaSigningKey = priv_key_from_pem (keyTuple [0 ]))
402
+ org .signedCert = crypto .load_certificate (crypto .FILETYPE_PEM , tuple [2 ])
403
+ org .networks = [Network [name ] for name in tuple [3 ]]
404
+ self .organizations [orgName ] = org
405
+ for nat , cert_as_pem in data ['nats' ].iteritems ():
406
+ self .ordererAdminTuples [nat ] = crypto .load_certificate (crypto .FILETYPE_PEM , cert_as_pem )
356
407
357
408
class AuthDSLHelper :
358
409
@classmethod
@@ -1075,7 +1126,7 @@ def get_latest_configuration_block(deliverer_stream_helper, channel_id):
1075
1126
deliverer_stream_helper .seekToRange (chainID = channel_id , start = last_config .index , end = last_config .index )
1076
1127
blocks = deliverer_stream_helper .getBlocks ()
1077
1128
assert len (blocks ) == 1 , "Expected single block, received: {0} blocks" .format (len (blocks ))
1078
- assert len (block .data .data ) == 1 , "Expected single transaction for configuration block, instead found {0} transactions" .format (len (block .data .data ))
1129
+ assert len (blocks [ 0 ] .data .data ) == 1 , "Expected single transaction for configuration block, instead found {0} transactions" .format (len (block .data .data ))
1079
1130
latest_config_block = blocks [0 ]
1080
1131
return latest_config_block
1081
1132
0 commit comments