EQGRP/Linux/bin/addkey.py
2017-04-08 16:05:14 +02:00

214 lines
6 KiB
Python
Executable file

#!/usr/bin/env python
version = '1.0.0.0'
import os
import re
import sys
import math
import getopt
import os.path
import binascii
import subprocess
STOREBIN = 'Store'
def compute_mu(n, radix_bits=32):
b = 2**radix_bits
k = 1
while n >= b**k:
k += 1
return long(b**(2*k)/n)
def get_hex_bytes(data, i):
num = ''
while i < len(data):
if data[i].startswith(' '):
bytes = data[i].strip().split(':')
if bytes[-1] == '':
bytes.pop()
num += ''.join(bytes)
i += 1
else:
i += 1
break
if num[0:2] == '00':
num = num[2:]
return binascii.unhexlify(num)
def get_idx(data, s):
i = 0
while i < len(data):
if data[i].startswith(s):
i += 1
break
i += 1
return i
def fix_num(n):
if n[-1] == 'L' or n[-1] == 'l':
n = n[:-1]
if len(n) % 2 == 1:
n = '0%s' % (n)
return n
def get_key_params(keyfile):
try:
f = open(keyfile)
data = f.readlines()
f.close()
except:
print 'ERROR: Could not open "%s"' % (keyfile)
return None
i = get_idx(data, 'prime1')
p = get_hex_bytes(data, i)
i = get_idx(data, 'prime2')
q = get_hex_bytes(data, i)
p_num = long(binascii.hexlify(p), 16)
q_num = long(binascii.hexlify(q), 16)
i = get_idx(data, 'modulus')
m = get_hex_bytes(data, i)
i = get_idx(data, 'exponent1')
dp = get_hex_bytes(data, i)
i = get_idx(data, 'exponent2')
dq = get_hex_bytes(data, i)
i = get_idx(data, 'coefficient')
qinv = get_hex_bytes(data, i)
i = get_idx(data, 'publicExponent')
exp_num = long(data[i-1].split()[1])
i = get_idx(data, 'clientAuth')
cli = get_hex_bytes(data, i)
i = get_idx(data, 'serverAuth')
svr = get_hex_bytes(data, i)
mup_num = compute_mu(p_num)
muq_num = compute_mu(q_num)
mu_num = compute_mu(p_num*q_num)
exp = binascii.unhexlify(fix_num(hex(exp_num)[2:]))
mup = binascii.unhexlify(fix_num(hex(mup_num)[2:]))
muq = binascii.unhexlify(fix_num(hex(muq_num)[2:]))
mu = binascii.unhexlify(fix_num(hex(mu_num)[2:]))
params = {}
params['m'] = m
params['mu'] = mu
params['exp'] = exp
params['p'] = p
params['q'] = q
params['dp'] = dp
params['dq'] = dq
params['qinv'] = qinv
params['mup'] = mup
params['muq'] = muq
params['cli'] = cli
params['svr'] = svr
return params
def usage(prog):
print 'usage: %s [-p] [-s storebin] -k keyfile <binary> [binary ...]\n' % (prog)
print 'options:'
print ' -p add the private key to the binary'
print ' NOTE: should ONLY be done for the client binary'
print ' -k keyfile the key text file to inject'
print ' -s storebin use storebin as the Store executable\n'
sys.exit(1)
def main():
addpriv = False
keyfile = None
storebin = STOREBIN
if len(sys.argv) == 1:
usage(sys.argv[0])
try:
opts, args = getopt.getopt(sys.argv[1:], 'hvps:k:')
except getopt.GetoptError, err:
print str(err)
usage(sys.argv[0])
for o, a in opts:
if o == '-h':
usage(sys.argv[0])
elif o == '-v':
print '%s version %s' % (os.path.basename(sys.argv[0]), version)
sys.exit(0)
elif o == '-p':
addpriv = True
elif o == '-k':
keyfile = a
elif o == '-s':
storebin = a
if len(args) < 1:
print 'ERROR: No binary specified'
usage(sys.argv[0])
if keyfile == None or not os.path.exists(keyfile):
print 'ERROR: key file "%s" does not exist' % (keyfile)
sys.exit(1)
for f in args:
if not os.path.exists(f):
print 'ERROR: "%s" does not exist' % (f)
sys.exit(1)
key_params = get_key_params(keyfile)
if key_params == None:
exit(1)
for k in key_params.iterkeys():
p = binascii.hexlify(key_params[k])
p_arr = [ p[i:i+2] for i in xrange(0, len(p), 2) ]
p_arr.reverse()
key_params[k] = '\\\\x%s' % ('\\\\x'.join(p_arr))
for b in args:
print 'Storing: %s' % (b)
os.system('%s --file="%s" --wipe > /dev/null' % (storebin, b))
os.system('/bin/bash -c \'echo -ne %s | %s --file="%s" --set="%s" > /dev/null\'' % (key_params['cli'], storebin, b, 'cli'))
os.system('/bin/bash -c \'echo -ne %s | %s --file="%s" --set="%s" > /dev/null\'' % (key_params['svr'], storebin, b, 'svr'))
if addpriv:
os.system('/bin/bash -c \'echo -ne %s | %s --file="%s" --set="%s" > /dev/null\'' % (key_params['p'], storebin, b, 'p'))
os.system('/bin/bash -c \'echo -ne %s | %s --file="%s" --set="%s" > /dev/null\'' % (key_params['q'], storebin, b, 'q'))
os.system('/bin/bash -c \'echo -ne %s | %s --file="%s" --set="%s" > /dev/null\'' % (key_params['dp'], storebin, b, 'dp'))
os.system('/bin/bash -c \'echo -ne %s | %s --file="%s" --set="%s" > /dev/null\'' % (key_params['dq'], storebin, b, 'dq'))
os.system('/bin/bash -c \'echo -ne %s | %s --file="%s" --set="%s" > /dev/null\'' % (key_params['qinv'], storebin, b, 'qinv'))
os.system('/bin/bash -c \'echo -ne %s | %s --file="%s" --set="%s" > /dev/null\'' % (key_params['mup'], storebin, b, 'mup'))
os.system('/bin/bash -c \'echo -ne %s | %s --file="%s" --set="%s" > /dev/null\'' % (key_params['muq'], storebin, b, 'muq'))
else:
os.system('/bin/bash -c \'echo -ne %s | %s --file="%s" --set="%s" > /dev/null\'' % (key_params['m'], storebin, b, 'm'))
os.system('/bin/bash -c \'echo -ne %s | %s --file="%s" --set="%s" > /dev/null\'' % (key_params['mu'], storebin, b, 'mu'))
os.system('/bin/bash -c \'echo -ne %s | %s --file="%s" --set="%s" > /dev/null\'' % (key_params['exp'], storebin, b, 'exp'))
#os.system('%s --file="%s" --list' % (storebin, b))
if __name__ == '__main__':
main()