parent
							
								
									b773e27ad1
								
							
						
					
					
						commit
						7ef3fd567f
					
				
				 17 changed files with 241 additions and 33 deletions
			
			
		
									
										Binary file not shown.
									
								
							
						@ -0,0 +1,2 @@ | 
				
			||||
src/* | 
				
			||||
out/* | 
				
			||||
									
										Binary file not shown.
									
								
							
						
									
										Binary file not shown.
									
								
							
						@ -0,0 +1,122 @@ | 
				
			||||
#!/usr/bin/env python2.7 | 
				
			||||
 | 
				
			||||
import os | 
				
			||||
import sys | 
				
			||||
import glob | 
				
			||||
import shutil | 
				
			||||
import urllib2 | 
				
			||||
import hashlib | 
				
			||||
import subprocess | 
				
			||||
 | 
				
			||||
 | 
				
			||||
EXTERNAL_PATH = os.path.dirname(os.path.abspath(__file__)) | 
				
			||||
 | 
				
			||||
if os.path.exists("/init.qcom.rc"): | 
				
			||||
  # android | 
				
			||||
  APKPATCH = os.path.join(EXTERNAL_PATH, 'tools/apkpatch_android') | 
				
			||||
  SIGNAPK = os.path.join(EXTERNAL_PATH, 'tools/signapk_android') | 
				
			||||
else: | 
				
			||||
  APKPATCH = os.path.join(EXTERNAL_PATH, 'tools/apkpatch') | 
				
			||||
  SIGNAPK = os.path.join(EXTERNAL_PATH, 'tools/signapk') | 
				
			||||
 | 
				
			||||
APKS = { | 
				
			||||
  'com.waze': { | 
				
			||||
    'src': 'https://apkcache.s3.amazonaws.com/com.waze_1021278.apk', | 
				
			||||
    'src_sha256': 'f00957e93e2389f9e30502ac54994b98ac769314b0963c263d4e8baa625ab0c2', | 
				
			||||
    'patch': 'com.waze.apkpatch', | 
				
			||||
    'out_sha256': '9ec8b0ea3c78c666342865b1bfb66e368a3f5c911df2ad12835206ec8b19f444' | 
				
			||||
  }, | 
				
			||||
  'com.spotify.music': { | 
				
			||||
    'src': 'https://apkcache.s3.amazonaws.com/com.spotify.music_24382006.apk', | 
				
			||||
    'src_sha256': '0610fea68ee7ba5f8e4e0732ad429d729dd6cbb8bc21222c4c99db6cb09fbff4', | 
				
			||||
    'patch': 'com.spotify.music.apkpatch', | 
				
			||||
    'out_sha256': '5a3d6f478c7e40403a98ccc8906d7e0ae12b06543b41f5df52149dd09c647c11' | 
				
			||||
  }, | 
				
			||||
} | 
				
			||||
 | 
				
			||||
def sha256_path(path): | 
				
			||||
  with open(path, 'rb') as f: | 
				
			||||
    return hashlib.sha256(f.read()).hexdigest() | 
				
			||||
 | 
				
			||||
def remove(path): | 
				
			||||
  try: | 
				
			||||
    os.remove(path) | 
				
			||||
  except OSError: | 
				
			||||
    pass | 
				
			||||
 | 
				
			||||
def process(download, patch): | 
				
			||||
  # clean up any junk apks | 
				
			||||
  for out_apk in glob.glob(os.path.join(EXTERNAL_PATH, 'out/*.apk')): | 
				
			||||
    app = os.path.basename(out_apk)[:-4] | 
				
			||||
    if app not in APKS: | 
				
			||||
      print "remove junk", out_apk | 
				
			||||
      remove(out_apk) | 
				
			||||
 | 
				
			||||
  complete = True | 
				
			||||
  for k,v in APKS.iteritems(): | 
				
			||||
    apk_path = os.path.join(EXTERNAL_PATH, 'out', k+'.apk') | 
				
			||||
    print "checking", apk_path | 
				
			||||
    if os.path.exists(apk_path) and sha256_path(apk_path) == v['out_sha256']: | 
				
			||||
      # nothing to do | 
				
			||||
      continue | 
				
			||||
 | 
				
			||||
    complete = False | 
				
			||||
 | 
				
			||||
    remove(apk_path) | 
				
			||||
 | 
				
			||||
    src_path = os.path.join(EXTERNAL_PATH, 'src', v['src_sha256']) | 
				
			||||
    if not os.path.exists(src_path) or sha256_path(src_path) != v['src_sha256']: | 
				
			||||
      if not download: | 
				
			||||
        continue | 
				
			||||
 | 
				
			||||
      print "downloading", v['src'], "to", src_path | 
				
			||||
      # download it | 
				
			||||
      resp = urllib2.urlopen(v['src']) | 
				
			||||
      data = resp.read() | 
				
			||||
      with open(src_path, 'wb') as src_f: | 
				
			||||
        src_f.write(data) | 
				
			||||
 | 
				
			||||
      if sha256_path(src_path) != v['src_sha256']: | 
				
			||||
        print "download was corrupted..." | 
				
			||||
        continue | 
				
			||||
 | 
				
			||||
    if not patch: | 
				
			||||
      continue | 
				
			||||
 | 
				
			||||
    # ignoring lots of TOCTTOU here... | 
				
			||||
 | 
				
			||||
    apk_temp = "/tmp/"+k+".patched" | 
				
			||||
    remove(apk_temp) | 
				
			||||
    apk_temp2 = "/tmp/"+k+".signed" | 
				
			||||
    remove(apk_temp2) | 
				
			||||
 | 
				
			||||
    try: | 
				
			||||
      print "patching", v['patch'] | 
				
			||||
      subprocess.check_call([APKPATCH, 'apply', src_path, apk_temp, os.path.join(EXTERNAL_PATH, v['patch'])]) | 
				
			||||
      print "signing", apk_temp | 
				
			||||
      subprocess.check_call([SIGNAPK, | 
				
			||||
        os.path.join(EXTERNAL_PATH, 'tools/certificate.pem'), os.path.join(EXTERNAL_PATH, 'tools/key.pk8'), | 
				
			||||
        apk_temp, apk_temp2]) | 
				
			||||
 | 
				
			||||
      out_sha256 = sha256_path(apk_temp2) if os.path.exists(apk_temp2) else None | 
				
			||||
 | 
				
			||||
      if out_sha256 == v['out_sha256']: | 
				
			||||
        print "done", apk_path | 
				
			||||
        shutil.move(apk_temp2, apk_path) | 
				
			||||
      else: | 
				
			||||
        print "patch was corrupted", apk_temp2, out_sha256 | 
				
			||||
    finally: | 
				
			||||
      remove(apk_temp) | 
				
			||||
      remove(apk_temp2) | 
				
			||||
 | 
				
			||||
  return complete | 
				
			||||
 | 
				
			||||
if __name__ == "__main__": | 
				
			||||
  ret = True | 
				
			||||
  if len(sys.argv) == 2 and sys.argv[1] == "download": | 
				
			||||
    ret = process(True, False) | 
				
			||||
  elif len(sys.argv) == 2 and sys.argv[1] == "patch": | 
				
			||||
    ret = process(False, True) | 
				
			||||
  else: | 
				
			||||
    ret = process(True, True) | 
				
			||||
  sys.exit(0 if ret else 1) | 
				
			||||
									
										Binary file not shown.
									
								
							
						@ -0,0 +1,7 @@ | 
				
			||||
#!/system/bin/sh | 
				
			||||
 | 
				
			||||
DIR="$(cd "$(dirname "$0")" && pwd)" | 
				
			||||
 | 
				
			||||
export LD_LIBRARY_PATH=/system/lib64 | 
				
			||||
export CLASSPATH="$DIR"/ApkPatch.android.jar | 
				
			||||
exec app_process "$DIR" ApkPatch "$@" | 
				
			||||
@ -0,0 +1,17 @@ | 
				
			||||
-----BEGIN CERTIFICATE----- | 
				
			||||
MIICtTCCAh4CCQDm79UqF+Dc5zANBgkqhkiG9w0BAQUFADCBnjELMAkGA1UEBhMC | 
				
			||||
SUQxEzARBgNVBAgTCkphd2EgQmFyYXQxEDAOBgNVBAcTB0JhbmR1bmcxEjAQBgNV | 
				
			||||
BAoTCUxvbmRhdGlnYTETMBEGA1UECxMKQW5kcm9pZERldjEaMBgGA1UEAxMRTG9y | 
				
			||||
ZW5zaXVzIFcuIEwuIFQxIzAhBgkqhkiG9w0BCQEWFGxvcmVuekBsb25kYXRpZ2Eu | 
				
			||||
bmV0MB4XDTEwMDUwNTA5MjEzOFoXDTEzMDEyODA5MjEzOFowgZ4xCzAJBgNVBAYT | 
				
			||||
AklEMRMwEQYDVQQIEwpKYXdhIEJhcmF0MRAwDgYDVQQHEwdCYW5kdW5nMRIwEAYD | 
				
			||||
VQQKEwlMb25kYXRpZ2ExEzARBgNVBAsTCkFuZHJvaWREZXYxGjAYBgNVBAMTEUxv | 
				
			||||
cmVuc2l1cyBXLiBMLiBUMSMwIQYJKoZIhvcNAQkBFhRsb3JlbnpAbG9uZGF0aWdh | 
				
			||||
Lm5ldDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAy2oWtbdVXMHGiS6cA3qi | 
				
			||||
3VfZt5Vz9jTlux+TEcGx5h18ZKwclyo+z2B0L/p5bYdnrTdFEiD7IxvX+h3lu0JV | 
				
			||||
B9rdXZdyrzXNOw5YFrsn2k7hKvB8KEBaga1gZEwodlc6N14H3FbZdZkIA9V716Pu | 
				
			||||
e5CWBZ2VqU03lUJmKnpH8c8CAwEAATANBgkqhkiG9w0BAQUFAAOBgQBpNgXh8dw9 | 
				
			||||
uMjZxzLUXovV5ptHd61jAcZlQlffqPsz6/2QNfIShVdGH9jkm0IudfKkbvvOKive | 
				
			||||
a77t9c4sDh2Sat2L/rx6BfTuS1+y9wFr1Ee8Rrr7wGHhRkx2qqGrXGVWqXn8aE3E | 
				
			||||
P6e7BTPF0ibS+tG8cdDPEisqGFxw36nTNQ== | 
				
			||||
-----END CERTIFICATE----- | 
				
			||||
									
										Binary file not shown.
									
								
							
						
									
										Binary file not shown.
									
								
							
						@ -0,0 +1,7 @@ | 
				
			||||
#!/system/bin/sh | 
				
			||||
 | 
				
			||||
DIR="$(cd "$(dirname "$0")" && pwd)" | 
				
			||||
 | 
				
			||||
export LD_LIBRARY_PATH=/system/lib64 | 
				
			||||
export CLASSPATH="$DIR"/signapk.android.jar | 
				
			||||
exec app_process "$DIR" com.android.signapk.SignApk "$@" | 
				
			||||
@ -0,0 +1,29 @@ | 
				
			||||
#!/usr/bin/env python | 
				
			||||
 | 
				
			||||
# simple script to get a vehicle fingerprint. | 
				
			||||
# keep this script running for few seconds: some messages are published every few seconds | 
				
			||||
 | 
				
			||||
# Instructions: | 
				
			||||
# - connect to a Panda | 
				
			||||
# - run selfdrive/boardd/boardd | 
				
			||||
# - launching this script | 
				
			||||
# - since some messages are published at low frequency, keep this script running for few seconds,  | 
				
			||||
#   until all messages are received at least once | 
				
			||||
 | 
				
			||||
import zmq | 
				
			||||
import selfdrive.messaging as messaging | 
				
			||||
from selfdrive.services import service_list | 
				
			||||
 | 
				
			||||
context = zmq.Context() | 
				
			||||
logcan = messaging.sub_sock(context, service_list['can'].port) | 
				
			||||
msgs = {} | 
				
			||||
while True: | 
				
			||||
  lc = messaging.recv_sock(logcan, True) | 
				
			||||
  for c in lc.can: | 
				
			||||
    if c.src == 0: | 
				
			||||
      msgs[c.address] = len(c.dat) | 
				
			||||
 | 
				
			||||
  fingerprint = ', '.join("%d: %d" % v for v in sorted(msgs.items())) | 
				
			||||
 | 
				
			||||
  print "number of messages:", len(msgs) | 
				
			||||
  print "fingerprint", fingerprint | 
				
			||||
					Loading…
					
					
				
		Reference in new issue