blob: afad8408a18fe32e32bfd8f7c4b2d56c206a990f [file] [log] [blame]
"""
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