11#! /usr/bin/env sh
2+ # @name Find app signature
3+ # @brief Find the signature of Android applications
4+ # @author ale5000
5+ # Get the latest version from here: https://github.com/micro5k/microg-unofficial-installer/tree/main/tools
6+
27# SPDX-FileCopyrightText: (c) 2025 ale5000
38# SPDX-License-Identifier: GPL-3.0-or-later
49
510# shellcheck enable=all
611# shellcheck disable=SC3043 # In POSIX sh, local is undefined
712
8- export SCRIPT_NAME=' Get signature'
9- export SCRIPT_VERSION=' 0.0.3'
13+ readonly SCRIPT_NAME=' Find app signature'
14+ readonly SCRIPT_SHORTNAME=' FindAppSign'
15+ readonly SCRIPT_VERSION=' 0.1.0'
16+ readonly SCRIPT_AUTHOR=' ale5000'
17+
18+ pause_if_needed ()
19+ {
20+ # shellcheck disable=SC3028 # Ignore: In POSIX sh, SHLVL is undefined
21+ if test " ${NO_PAUSE:- 0} " = ' 0' && test " ${no_pause:- 0} " = ' 0' && test " ${CI:- false} " = ' false' && test " ${TERM_PROGRAM:- unknown} " ! = ' vscode' && test " ${SHLVL:- 1} " = ' 1' && test -t 0 && test -t 1 && test -t 2; then
22+ if test -n " ${NO_COLOR-} " ; then
23+ printf 1>&2 ' \n%s' ' Press any key to exit... ' || :
24+ else
25+ printf 1>&2 ' \n\033[1;32m\r%s' ' Press any key to exit... ' || :
26+ fi
27+ # shellcheck disable=SC3045 # Ignore: In POSIX sh, read -s / -n is undefined
28+ IFS=' ' read 2> /dev/null 1>&2 -r -s -n1 _ || IFS=' ' read 1>&2 -r _ || :
29+ printf 1>&2 ' \n' || :
30+ test -n " ${NO_COLOR-} " || printf 1>&2 ' \033[0m\r \r' || :
31+ fi
32+ unset no_pause || :
33+ return " ${1:- 0} "
34+ }
35+
36+ show_status ()
37+ {
38+ printf 1>&2 ' \033[1;32m%s\033[0m\n' " ${1?} "
39+ }
40+
41+ show_error ()
42+ {
43+ printf 1>&2 ' \033[1;31m%s\033[0m\n' " ERROR: ${1?} "
44+ }
1045
1146get_cert_sha256 ()
1247{
1348 local _cert_sha256
1449
15- test -n " ${APKSIGNER_PATH-} " || APKSIGNER_PATH=" $( command -v ' apksigner' ) " || APKSIGNER_PATH=" $( command -v ' apksigner.bat' ) " || :
50+ test -n " ${1-} " || {
51+ show_error " You must pass the filename of the file to be processed."
52+ return 3
53+ }
1654
17- if test -n " ${APKSIGNER_PATH-} " ; then
18- _cert_sha256=" $( " ${APKSIGNER_PATH:? } " verify --min-sdk-version 24 --print-certs -- " ${1:? } " | grep -m 1 -F -e ' certificate SHA-256 digest:' | cut -d ' :' -f ' 2-' -s | tr -d -- ' ' | tr -- ' [:lower:]' ' [:upper:]' | sed -e ' s/../&:/g;s/:$//' ) " || _cert_sha256=' '
19- elif command 1> /dev/null -v ' keytool' ; then
20- _cert_sha256=" $( keytool -printcert -jarfile " ${1:? } " | grep -m 1 -F -e ' SHA256:' | cut -d ' :' -f ' 2-' -s | tr -d -- ' ' ) " || _cert_sha256=' '
55+ if : " ${APKSIGNER_PATH:= " $( command -v ' apksigner' || command -v ' apksigner.bat' || :) " } " && test -n " ${APKSIGNER_PATH?} " ; then
56+ _cert_sha256=" $( " ${APKSIGNER_PATH:? } " verify --min-sdk-version 24 --print-certs -- " ${1:? } " | grep -m 1 -F -e ' certificate SHA-256 digest:' | cut -d ' :' -f ' 2-' -s | tr -d -- ' ' | tr -- ' [:lower:]' ' [:upper:]' | sed -e ' s/../&:/g;s/:$//' ) " || return 4
57+ elif : " ${KEYTOOL_PATH:= " $( command -v ' keytool' || :) " } " && test -n " ${KEYTOOL_PATH-} " ; then
58+ _cert_sha256=" $( " ${KEYTOOL_PATH:? } " -printcert -jarfile " ${1:? } " | grep -m 1 -F -e ' SHA256:' | cut -d ' :' -f ' 2-' -s | tr -d -- ' ' ) " || return 5
59+ else
60+ show_error " Neither apksigner nor keytool were found. You must set either APKSIGNER_PATH or KEYTOOL_PATH"
61+ return 255
2162 fi
2263
2364 if test -n " ${_cert_sha256?} " ; then
@@ -27,4 +68,54 @@ get_cert_sha256()
2768 fi
2869}
2970
30- get_cert_sha256 " ${@ } "
71+ main ()
72+ {
73+ get_cert_sha256 " ${@ } "
74+ }
75+
76+ STATUS=0
77+ execute_script=' true'
78+
79+ while test " ${# } " -gt 0; do
80+ case " ${1?} " in
81+ -V | --version)
82+ printf ' %s\n' " ${SCRIPT_NAME:? } v${SCRIPT_VERSION:? } "
83+ printf ' %s\n' " Copyright (c) 2025 ${SCRIPT_AUTHOR:? } "
84+ printf ' %s\n' ' License GPLv3+'
85+ execute_script=' false'
86+ ;;
87+
88+ --)
89+ shift
90+ break
91+ ;;
92+
93+ --* )
94+ printf 1>&2 ' %s\n' " ${SCRIPT_SHORTNAME?} : unrecognized option '${1} '"
95+ execute_script=' false'
96+ STATUS=2
97+ ;;
98+
99+ -* )
100+ printf 1>&2 ' %s\n' " ${SCRIPT_SHORTNAME?} : invalid option -- '${1# -} '"
101+ execute_script=' false'
102+ STATUS=2
103+ ;;
104+
105+ * )
106+ break
107+ ;;
108+ esac
109+
110+ shift
111+ done
112+
113+ if test " ${execute_script:? } " = ' true' ; then
114+ show_status " ${SCRIPT_NAME:? } v${SCRIPT_VERSION:? } by ${SCRIPT_AUTHOR:? } "
115+
116+ if test " ${# } " -eq 0; then set -- ' ' ; fi
117+ main " ${@ } " || STATUS=" ${?} "
118+ fi
119+
120+ pause_if_needed " ${STATUS:? } "
121+ exit " ${?} "
0 commit comments