| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- """
- This module is used to delegate signature generation to HSM(Hardware Security Module)
- If public key is given for signing instead of private key, we'll know that
- we're trying to delegate signature to HSM. Then we look up key table created
- here to find HSM parameters. Here public key is used only as id for HSM
- parameters and won't act as a public key.
- """
- import filecmp
- import os
- import lib.cert
- class HsmParam(object):
- """
- Parameter for HSM
- """
- def __init__(self):
- # you can add parameter required by your HSM here
- self.m_prvk = None
- def create_key_table():
- """
- create key table for public key to private key mapping
- """
- prvk_list = []
- pubk_list = []
- key_database_path = os.path.join(os.path.dirname(__file__), 'hsm_test_keys')
- keys = os.listdir(key_database_path)
- key_table = {}
- for key in keys:
- key_path = os.path.join(key_database_path, key)
- if lib.cert.is_prvk(key_path):
- prvk_list.append(key_path)
- elif lib.cert.is_pubk(key_path):
- pubk_list.append(key_path)
- for pubk in pubk_list:
- for prvk in prvk_list:
- tmp_pubk = os.path.join(os.path.dirname(__file__), 'tmp_pubk.pem')
- lib.cert.prvk_to_pubk(prvk, tmp_pubk)
- if filecmp.cmp(pubk, tmp_pubk, False) is True:
- key_table[pubk] = os.path.join(key_database_path, prvk)
- os.remove(tmp_pubk)
- break
- os.remove(tmp_pubk)
- return key_table
- def query_key_table(key_table, key):
- """
- get private key from public key.
- In your implementation, you should convert input public
- key to parameter passed to HSM, so HSM knows how to sign
- message. Here as an example, we search public keys in a folder
- as public key data base, and use corresponding private key
- to sign message.
- """
- for pubk in key_table.keys():
- if filecmp.cmp(key, pubk, False) is True:
- return key_table[pubk]
- return None
- def hsm_rsa_sign(data, key, padding, sig):
- """
- sign data with HSM
- """
- # note that key is pubk actually, use it as index for
- # HSM parameters such as key selection
- hsm_param_obj = HsmParam()
- key_table = create_key_table()
- hsm_param_obj.m_prvk = query_key_table(key_table, key)
- if hsm_param_obj.m_prvk is None:
- print 'not valid HSM parameter'
- return -1
- print "========================"
- print "HSM parameter:"
- print " m_prvk = " + hsm_param_obj.m_prvk
- print "========================"
- # place hsm request here -- start
- # we re-direct it to signing with private key to mimic HSM
- # data is not hashed here, you can hash data here to reduce
- # network usage
- lib.cert.sig_gen(data, hsm_param_obj.m_prvk, padding, sig)
- # place hsm request here -- end
- return 0
|