/usr/sbin/yhsm-db-import is in yhsm-yubikey-ksm 1.0.4k-3.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | #!/usr/bin/python
#
# Copyright (c) 2013-2014 Yubico AB
# See the file COPYING for licence statement.
#
"""
Import AEADs to database.
"""
#import lib
import os
import sys
import io
import hashlib
import re
import time
import argparse
import sqlalchemy
from os.path import abspath
sys.path.append('Lib')
from pyhsm.util import key_handle_to_int
from pyhsm.yubikey import modhex_decode
import pyhsm.aead_cmd
##########################
# Functions Declarations #
##########################
#
# extract keyhandle value from the path
#
def extract_keyhandle(path, filepath):
keyhandle = filepath.lstrip(path)
keyhandle = keyhandle.split("/")
return keyhandle[0]
#
#insert_query: this functions read the response fields and creates sql query. then inserts everything inside the database
#
def insert_query(publicId, aead, keyhandle, aeadobj):
#turn the keyhandle into an integer
keyhandle = key_handle_to_int(keyhandle)
if not keyhandle == aead.key_handle:
print "WARNING: keyhandle does not match aead.key_handle"
return None
#creates the query object
try:
sql = aeadobj.insert().values(public_id=publicId, keyhandle=aead.key_handle, nonce=aead.nonce, aead=aead.data)
#insert the query
result = connection.execute(sql)
return result
except sqlalchemy.exc.IntegrityError:
pass
return None;
#################################
# END of functions declariation #
#################################
#######################
# #
# Initialization Area #
# #
#######################
parser = argparse.ArgumentParser(description='Import AEADs into the database')
parser.add_argument('path', action="store", type=str)
parser.add_argument('dburl', action="store")
args = vars(parser.parse_args())
if len(sys.argv) != 3:
print("\nUsage: python import_aeads.py /path/to/keyhandle/ database_url\ni.e. python import_aeads.py /root/aeads/ mysql://root:password@localhost:3306/database_name")
sys.exit(2)
if not os.path.isdir(sys.argv[1]):
print("\nInvalid path, check your spelling.\n")
sys.exit(2)
#set the path
path = args['path']
#mysql url
databaseUrl = args['dburl']
try:
#check database connection
engine = sqlalchemy.create_engine(databaseUrl)
#SQLAlchemy voodoo
metadata = sqlalchemy.MetaData()
aeadobj = sqlalchemy.Table('aead_table', metadata, autoload=True, autoload_with=engine)
connection = engine.connect()
except:
print "FATAL: Database connect failure"
sys.exit(1)
####################
# Computation area #
####################
for root, subFolders, files in os.walk(path):
if files:
aead = None
nonce = None
key_handle = None
if not re.match(r'^[cbdefghijklnrtuv]+$', files[0]):
continue
#build file path
filepath = os.path.join(root,files[0])
#extract the key handle from the path
keyhandle = extract_keyhandle(path, filepath)
kh_int = pyhsm.util.key_handle_to_int(keyhandle)
#instantiate a new aead object
aead = pyhsm.aead_cmd.YHSM_GeneratedAEAD(None, kh_int, '')
aead.load(filepath)
#set the public_id
public_id = str(files[0])
#check it is old format aead
if not aead.nonce:
#configure values for oldformat
aead.nonce = pyhsm.yubikey.modhex_decode(public_id).decode('hex')
aead.key_handle = key_handle_to_int(keyhandle)
if not insert_query(public_id, aead, keyhandle, aeadobj):
print "WARNING: could not insert %s" % public_id
#close sqlalchemy
connection.close()
#exit without error
sys.exit(0)
|