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