Squash commits for public release
This commit is contained in:
74
utils/crypto/elfsign.py
Normal file
74
utils/crypto/elfsign.py
Normal file
@@ -0,0 +1,74 @@
|
||||
import sys
|
||||
import hashlib
|
||||
import argparse
|
||||
import subprocess
|
||||
import codecs
|
||||
from elftools.elf.elffile import ELFFile
|
||||
|
||||
# Test Key Set.
|
||||
PRIVATE_D = 0x38df48893d28df263487987da506d0c56d5f817573bc091071c5cd798d78ba4c996f946a2d695b9b4428794c59500ba2e5b2ed383aa791b18f56fd90875010eddb98c37113f9717511a2845edbcc85e9c559f74d474c107767666f894357c1439217ce82d0181a58ce9a8ad75e3a37ccb3aeba5ba07dd2f8cb8b92ae2735e275
|
||||
PUBLIC_N = 0xa65f3fc1e6e850b5c7174fb7c0b30f36507ad9a67e83abe707b176fb7f44230711ffe8291119d921e0e483024dc6e603a628996ec2c875069aef21f1b9e9cfbcd3f7ee6f4ecf1bc67d9d7239adef94596038b4b5833ee34b4ddad75b17ad8f8fbb2cd5149115602aa57aecdfdacbea8a7fe735c98784a4b1868986dced517e1d
|
||||
PUBLIC_E = 0x10001
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('target', type=str, help='Target third_part package')
|
||||
parser.add_argument('--overwrite', action='store_true',
|
||||
help='Overwrites exisiting signature')
|
||||
args = parser.parse_args()
|
||||
|
||||
|
||||
def shell(cmd, cwd=None):
|
||||
return subprocess.check_output(cmd, shell=True, cwd=cwd).decode("ascii")
|
||||
|
||||
|
||||
elffile_path = args.target
|
||||
signfield_loc = 0
|
||||
sha256_hash = hashlib.sha256()
|
||||
|
||||
def int_to_bytes(n, nsize=128):
|
||||
xs = bytearray()
|
||||
while (n):
|
||||
by = n % 256
|
||||
xs.append(by)
|
||||
n //= 256
|
||||
|
||||
while len(xs) < nsize:
|
||||
xs.append(0)
|
||||
|
||||
return xs
|
||||
|
||||
with open(elffile_path, 'rb') as elffile:
|
||||
signature_section = None
|
||||
for section in ELFFile(elffile).iter_sections():
|
||||
if section.name == "._signature":
|
||||
signature_section = section
|
||||
signfield_loc = section['sh_offset']
|
||||
|
||||
if signature_section is None:
|
||||
print("Elf file is not configured for signing.")
|
||||
exit(1)
|
||||
|
||||
if not args.overwrite:
|
||||
for byte in signature_section.data():
|
||||
if byte != 0:
|
||||
print("Signature:", ''.join('{:02x}'.format(x)
|
||||
for x in signature_section.data()[:128]))
|
||||
|
||||
print("Elf file is already signed.")
|
||||
exit(0)
|
||||
|
||||
signfield_loc = signature_section['sh_offset']
|
||||
|
||||
for segment in ELFFile(elffile).iter_segments():
|
||||
seg_head = segment.header
|
||||
if seg_head.p_type == "PT_LOAD":
|
||||
sha256_hash.update(segment.data())
|
||||
|
||||
|
||||
hash = int(codecs.encode(sha256_hash.digest(), 'hex'), 16)
|
||||
signature = pow(hash, PRIVATE_D, PUBLIC_N)
|
||||
|
||||
signature_file = open(elffile_path, "r+b")
|
||||
signature_file.seek(signfield_loc)
|
||||
signature_file.write(int_to_bytes(signature))
|
||||
signature_file.close()
|
||||
Reference in New Issue
Block a user