You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							37 lines
						
					
					
						
							970 B
						
					
					
				
			
		
		
	
	
							37 lines
						
					
					
						
							970 B
						
					
					
				#!/usr/bin/env python3
 | 
						|
import os
 | 
						|
import sys
 | 
						|
import struct
 | 
						|
import hashlib
 | 
						|
from Crypto.PublicKey import RSA
 | 
						|
import binascii
 | 
						|
 | 
						|
# increment this to make new hardware not run old versions
 | 
						|
VERSION = 2
 | 
						|
 | 
						|
rsa = RSA.importKey(open(sys.argv[3]).read())
 | 
						|
 | 
						|
with open(sys.argv[1], "rb") as f:
 | 
						|
  dat = f.read()
 | 
						|
 | 
						|
print("signing", len(dat), "bytes")
 | 
						|
 | 
						|
with open(sys.argv[2], "wb") as f:
 | 
						|
  if os.getenv("SETLEN") is not None:
 | 
						|
    # add the version at the end
 | 
						|
    dat += b"VERS" + struct.pack("I", VERSION)
 | 
						|
    # add the length at the beginning
 | 
						|
    x = struct.pack("I", len(dat)) + dat[4:]
 | 
						|
    # mock signature of dat[4:]
 | 
						|
    dd = hashlib.sha1(dat[4:]).digest()
 | 
						|
  else:
 | 
						|
    x = dat
 | 
						|
    dd = hashlib.sha1(dat).digest()
 | 
						|
 | 
						|
  print("hash:", str(binascii.hexlify(dd), "utf-8"))
 | 
						|
  dd = b"\x00\x01" + b"\xff"*0x69 + b"\x00" + dd
 | 
						|
  rsa_out = pow(int.from_bytes(dd, byteorder='big', signed=False), rsa.d, rsa.n)
 | 
						|
  sig = (hex(rsa_out)[2:].rjust(0x100, '0'))
 | 
						|
  x += binascii.unhexlify(sig)
 | 
						|
  f.write(x)
 | 
						|
 | 
						|
 |