boklm pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
-
821c192e
by Nicolas Vigier at 2025-08-29T12:16:22+02:00
30 changed files:
- rbm.conf
- tools/signing/do-all-signing
- + tools/signing/do-all-signing.torvpn
- tools/signing/functions
- + tools/signing/linux-signer-gpg-sign.torvpn
- + tools/signing/linux-signer-sign-android-aab
- + tools/signing/linux-signer-sign-android-aab.torvpn
- tools/signing/linux-signer-sign-android-apks
- + tools/signing/linux-signer-sign-android-apks.torvpn
- tools/signing/machines-setup/setup-signing-machine
- + tools/signing/machines-setup/sudoers.d/sign-aab
- tools/signing/machines-setup/sudoers.d/sign-apk
- tools/signing/set-config
- + tools/signing/staticiforme-prepare-cdn-dist-upload.torvpn
- + tools/signing/sync-builder-to-local.torvpn
- + tools/signing/sync-builder-to-local.torvpn.dry-run
- + tools/signing/sync-builder-unsigned-to-local-signed.torvpn
- + tools/signing/sync-builder-unsigned-to-local-signed.torvpn.dry-run
- + tools/signing/sync-linux-signer-to-local.torvpn
- + tools/signing/sync-linux-signer-to-local.torvpn.dry-run
- + tools/signing/sync-local-to-builder.torvpn
- + tools/signing/sync-local-to-builder.torvpn.dry-run
- + tools/signing/sync-local-to-linux-signer.torvpn
- + tools/signing/sync-local-to-linux-signer.torvpn.dry-run
- + tools/signing/sync-local-to-staticiforme.torvpn
- + tools/signing/sync-local-to-staticiforme.torvpn.dry-run
- + tools/signing/sync-scripts-to-linux-signer.torvpn
- + tools/signing/sync-scripts-to-linux-signer.torvpn.dry-run
- + tools/signing/wrappers/sign-aab
- tools/signing/wrappers/sign-apk
Changes:
... | ... | @@ -97,8 +97,8 @@ var: |
97 | 97 | # enable/disable all android or desktop platforms. If you want to
|
98 | 98 | # check whether a release includes some android or desktop platforms
|
99 | 99 | # see signing_android and signing_desktop below.
|
100 | - is_android_release: '[% c("var/tor-browser") %]'
|
|
101 | - is_desktop_release: '1'
|
|
100 | + is_android_release: '[% c("var/tor-browser") || c("var/tor-vpn") %]'
|
|
101 | + is_desktop_release: '[% ! c("var/tor-vpn") %]'
|
|
102 | 102 | |
103 | 103 | # signing_android is used in signing scripts to check if at least
|
104 | 104 | # one android platform is being signed/published
|
... | ... | @@ -328,6 +328,18 @@ targets: |
328 | 328 | max_torbrowser_incremental_from: 2
|
329 | 329 | build_infos_json: 1
|
330 | 330 | |
331 | + torvpn:
|
|
332 | + var:
|
|
333 | + tor-vpn: 1
|
|
334 | + torbrowser_version: '1.0.0Beta'
|
|
335 | + torbrowser_build: 'build1'
|
|
336 | + browser_release_date: '2025/08/28 15:33:44'
|
|
337 | + project-name: tor-vpn
|
|
338 | + projectname: torvpn
|
|
339 | + Project_Name: 'Tor VPN'
|
|
340 | + ProjectName: TorVPN
|
|
341 | + project_initials: tv
|
|
342 | + |
|
331 | 343 | torbrowser:
|
332 | 344 | var:
|
333 | 345 | tor-browser: 1
|
... | ... | @@ -67,7 +67,7 @@ echo |
67 | 67 | echo
|
68 | 68 | |
69 | 69 | [ -z "$platform_android" ] || \
|
70 | - [ -f "$steps_dir/linux-signer-sign-android-apks.done" ] || \
|
|
70 | + [ -f "$steps_dir/sync-after-sign-android-apks.done" ] || \
|
|
71 | 71 | [ -n "$KSPASS" ] || \
|
72 | 72 | read -sp "Enter android apk signing password ($tbb_version_type): " KSPASS
|
73 | 73 | echo
|
... | ... | @@ -155,6 +155,14 @@ EOF |
155 | 155 | unset KSPASS
|
156 | 156 | }
|
157 | 157 | |
158 | +function linux-signer-sign-android-aab {
|
|
159 | + ssh "$ssh_host_linux_signer" 'bash -s' << EOF
|
|
160 | + export KSPASS=$KSPASS
|
|
161 | + ~/signing-$SIGNING_PROJECTNAME-$tbb_version_type/linux-signer-sign-android-aab.$SIGNING_PROJECTNAME
|
|
162 | +EOF
|
|
163 | + unset KSPASS
|
|
164 | +}
|
|
165 | + |
|
158 | 166 | function sync-after-sign-android-apks {
|
159 | 167 | "$script_dir/sync-linux-signer-to-local"
|
160 | 168 | }
|
... | ... | @@ -257,6 +265,8 @@ do_step sync-before-linux-signer-signmars |
257 | 265 | do_step sync-after-signmars
|
258 | 266 | [ -n "$platform_android" ] && \
|
259 | 267 | do_step linux-signer-sign-android-apks
|
268 | +[ "$SIGNING_PROJECTNAME" = 'torvpn' ] && [ -n "$platform_android" ] && \
|
|
269 | + do_step linux-signer-sign-android-aab
|
|
260 | 270 | [ -n "$platform_android" ] && \
|
261 | 271 | do_step sync-after-sign-android-apks
|
262 | 272 | [ -n "$platform_windows" ] && \
|
... | ... | @@ -275,6 +285,6 @@ do_step download-unsigned-sha256sums-gpg-signatures-from-people-tpo |
275 | 285 | do_step sync-local-to-staticiforme
|
276 | 286 | do_step sync-scripts-to-staticiforme
|
277 | 287 | do_step staticiforme-prepare-cdn-dist-upload
|
278 | -! is_legacy && \
|
|
288 | +[ "$SIGNING_PROJECTNAME" != 'torvpn' ] && ! is_legacy \
|
|
279 | 289 | do_step upload-update_responses-to-staticiforme
|
280 | 290 | do_step finished-signing-clean-linux-signer |
1 | +do-all-signing |
|
\ No newline at end of file |
... | ... | @@ -14,6 +14,7 @@ function var_is_defined { |
14 | 14 | }
|
15 | 15 | |
16 | 16 | function check_update_responses_repository_dir {
|
17 | + test "$SIGNING_PROJECTNAME" = 'torvpn' && return 0
|
|
17 | 18 | if test -z "$update_responses_repository_dir" || ! test -d "$update_responses_repository_dir"
|
18 | 19 | then
|
19 | 20 | cat << 'EOF' > /dev/stderr
|
1 | +linux-signer-gpg-sign |
|
\ No newline at end of file |
1 | +#!/bin/bash
|
|
2 | + |
|
3 | +set -e
|
|
4 | +no_generate_config=1
|
|
5 | +script_dir=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
|
6 | +source "$script_dir/functions"
|
|
7 | + |
|
8 | +topdir="$script_dir/../.."
|
|
9 | +test "$SIGNING_PROJECTNAME" = 'torvpn'
|
|
10 | +projname=$(project-name)
|
|
11 | +# tbb_version_type, tbb_version and SIGNING_PROJECTNAME are used in
|
|
12 | +# wrappers/sign-apk, so we export them
|
|
13 | +export tbb_version tbb_version_type SIGNING_PROJECTNAME
|
|
14 | +# (note: we should also export SIGNING_PROJECTNAME and tbb_version in
|
|
15 | +# the maint-14.5 branch)
|
|
16 | + |
|
17 | +check_installed_packages() {
|
|
18 | + local packages='unzip openjdk-11-jdk-headless openjdk-11-jre-headless'
|
|
19 | + for package in $packages
|
|
20 | + do
|
|
21 | + dpkg -s "$package" | grep -q '^Status: install ok installed$' || \
|
|
22 | + exit_error "package $package is missing"
|
|
23 | + done
|
|
24 | +}
|
|
25 | + |
|
26 | +sign_aab() {
|
|
27 | + sudo -u signing-apk -- /signing/tor-browser-build/tools/signing/wrappers/sign-aab
|
|
28 | +}
|
|
29 | + |
|
30 | +check_installed_packages
|
|
31 | + |
|
32 | +if [ -z "$KSPASS" ]; then
|
|
33 | + echo "Enter keystore passphrase"
|
|
34 | + stty -echo; read KSPASS; stty echo
|
|
35 | + export KSPASS
|
|
36 | +fi
|
|
37 | + |
|
38 | +cp -af ~/"$SIGNING_PROJECTNAME-$tbb_version"/$projname-$tbb_version.aab \
|
|
39 | + /home/signing-apk/unsigned-files/"$SIGNING_PROJECTNAME-$tbb_version_type.aab"
|
|
40 | + |
|
41 | +sign_aab
|
|
42 | + |
|
43 | +cp /home/signing-apk/signed-files/"$SIGNING_PROJECTNAME-$tbb_version_type.aab" \
|
|
44 | + ~/"$SIGNING_PROJECTNAME-$tbb_version"/$projname-$tbb_version.aab
|
|
45 | +rm /home/signing-apk/signed-files/"$SIGNING_PROJECTNAME-$tbb_version_type.aab"
|
|
46 | +rm /home/signing-apk/unsigned-files/"$SIGNING_PROJECTNAME-$tbb_version_type.aab" |
1 | +linux-signer-sign-android-aab |
|
\ No newline at end of file |
... | ... | @@ -7,9 +7,11 @@ source "$script_dir/functions" |
7 | 7 | |
8 | 8 | topdir="$script_dir/../.."
|
9 | 9 | ARCHS="armv7 aarch64 x86 x86_64"
|
10 | +test "$SIGNING_PROJECTNAME" = 'torvpn' && ARCHS='multiarch'
|
|
10 | 11 | projname=$(project-name)
|
11 | -# tbb_version_type is used in wrappers/sign-apk, so we export it
|
|
12 | -export tbb_version_type
|
|
12 | +# tbb_version_type, tbb_version and SIGNING_PROJECTNAME are used in
|
|
13 | +# wrappers/sign-apk, so we export them
|
|
14 | +export tbb_version tbb_version_type SIGNING_PROJECTNAME
|
|
13 | 15 | |
14 | 16 | check_installed_packages() {
|
15 | 17 | local packages='unzip openjdk-11-jdk-headless openjdk-11-jre-headless'
|
... | ... | @@ -21,10 +23,11 @@ check_installed_packages() { |
21 | 23 | }
|
22 | 24 | |
23 | 25 | setup_build_tools() {
|
26 | + abt_version=16
|
|
24 | 27 | build_tools_dir=/signing/android-build-tools
|
25 | - test -f "$build_tools_dir"/android-12/apksigner || \
|
|
26 | - exit_error "$build_tools_dir/android-12/apksigner is missing"
|
|
27 | - export PATH="$build_tools_dir/android-12:${PATH}"
|
|
28 | + test -f "$build_tools_dir"/android-$abt_version/apksigner || \
|
|
29 | + exit_error "$build_tools_dir/android-$abt_version/apksigner is missing"
|
|
30 | + export PATH="$build_tools_dir/android-$abt_version:${PATH}"
|
|
28 | 31 | }
|
29 | 32 | |
30 | 33 | sign_apk() {
|
... | ... | @@ -36,7 +39,6 @@ verify_apk() { |
36 | 39 | scheme_v1="Verified using v1 scheme (JAR signing): true"
|
37 | 40 | scheme_v2="Verified using v2 scheme (APK Signature Scheme v2): true"
|
38 | 41 | |
39 | - # Verify the expected signing key was used, Alpha verses Release based on the filename.
|
|
40 | 42 | if test "$tbb_version_type" = "alpha"; then
|
41 | 43 | cert_digest="Signer #1 certificate SHA-256 digest: 15f760b41acbe4783e667102c9f67119be2af62fab07763f9d57f01e5e1074e1"
|
42 | 44 | pubkey_digest="Signer #1 public key SHA-256 digest: 4e617e6516f81123ca58e718d617a704ac8365c575bd9e7a731ba5dd0476869d"
|
... | ... | @@ -44,7 +46,14 @@ verify_apk() { |
44 | 46 | cert_digest="Signer #1 certificate SHA-256 digest: 20061f045e737c67375c17794cfedb436a03cec6bacb7cb9f96642205ca2cec8"
|
45 | 47 | pubkey_digest="Signer #1 public key SHA-256 digest: 343ca8a2e5452670bdc335a181a4baed909f868937d68c4653e44ef84de8dfc6"
|
46 | 48 | fi
|
49 | + if test "$SIGNING_PROJECTNAME" = "torvpn"; then
|
|
50 | + # No v1 scheme signature on torvpn apk
|
|
51 | + scheme_v1=''
|
|
52 | + cert_digest="Signer #1 certificate SHA-256 digest: c2f6ffa30e56a7c53a226248ef908612ee539df2f52bede5a55037425b83331d"
|
|
53 | + pubkey_digest="Signer #1 public key SHA-256 digest: fddc5f93ae0bc971e951481b0b5e6b62e47040fe979ff535cf75daade2f13f3d"
|
|
54 | + fi
|
|
47 | 55 | for digest in "${scheme_v1}" "${scheme_v2}" "${cert_digest}" "${pubkey_digest}"; do
|
56 | + test -z "$digest" && continue
|
|
48 | 57 | if ! echo "${verified}" | grep -q "${digest}"; then
|
49 | 58 | echo "Expected digest not found:"
|
50 | 59 | echo ${digest}
|
... | ... | @@ -69,8 +78,10 @@ mkdir -p ~/"$SIGNING_PROJECTNAME-$tbb_version-apks" |
69 | 78 | chgrp signing ~/"$SIGNING_PROJECTNAME-$tbb_version-apks"
|
70 | 79 | chmod g+w ~/"$SIGNING_PROJECTNAME-$tbb_version-apks"
|
71 | 80 | cp -af ~/"$SIGNING_PROJECTNAME-$tbb_version"/*.apk \
|
72 | - ~/"$SIGNING_PROJECTNAME-$tbb_version"/*.bspatch \
|
|
73 | 81 | ~/"$SIGNING_PROJECTNAME-$tbb_version-apks"
|
82 | +test "$SIGNING_PROJECTNAME" != 'torvpn' && \
|
|
83 | + cp -af ~/"$SIGNING_PROJECTNAME-$tbb_version"/*.bspatch \
|
|
84 | + ~/"$SIGNING_PROJECTNAME-$tbb_version-apks"
|
|
74 | 85 | cd ~/"$SIGNING_PROJECTNAME-$tbb_version-apks"
|
75 | 86 | |
76 | 87 | # Sign all packages
|
... | ... | @@ -79,7 +90,8 @@ for arch in ${ARCHS}; do |
79 | 90 | unsigned_apk=${projname}-qa-unsigned-android-${arch}-${tbb_version}.apk
|
80 | 91 | unsigned_apk_bspatch=${projname}-qa-unsign-android-${arch}-${tbb_version}.bspatch
|
81 | 92 | signed_apk=${projname}-android-${arch}-${tbb_version}.apk
|
82 | - bspatch "$qa_apk" "$unsigned_apk" "$unsigned_apk_bspatch"
|
|
93 | + test -f "$unsigned_apk" || \
|
|
94 | + bspatch "$qa_apk" "$unsigned_apk" "$unsigned_apk_bspatch"
|
|
83 | 95 | sign_apk "$unsigned_apk" "$signed_apk"
|
84 | 96 | verify_apk "$signed_apk"
|
85 | 97 | cp -f "$signed_apk" ~/"$SIGNING_PROJECTNAME-$tbb_version"
|
1 | +linux-signer-sign-android-apks |
|
\ No newline at end of file |
... | ... | @@ -91,6 +91,7 @@ sudoers_file sign-gpg |
91 | 91 | sudoers_file sign-mar
|
92 | 92 | sudoers_file sign-exe
|
93 | 93 | sudoers_file sign-apk
|
94 | +sudoers_file sign-aab
|
|
94 | 95 | sudoers_file sign-rcodesign
|
95 | 96 | sudoers_file sign-rcodesign-128
|
96 | 97 | sudoers_file set-date
|
... | ... | @@ -105,6 +106,10 @@ authorized_keys ma1 ma1.pub |
105 | 106 | create_user pierov signing
|
106 | 107 | authorized_keys pierov pierov.pub
|
107 | 108 | |
109 | +mkdir -p /home/signing-apk/unsigned-files /home/signing-apk/signed-files
|
|
110 | +chgrp signing /home/signing-apk/unsigned-files /home/signing-apk/signed-files
|
|
111 | +chmod g+rwx /home/signing-apk/unsigned-files /home/signing-apk/signed-files
|
|
112 | + |
|
108 | 113 | # Install rbm deps
|
109 | 114 | install_packages libyaml-libyaml-perl libtemplate-perl libdatetime-perl \
|
110 | 115 | libio-handle-util-perl libio-all-perl \
|
1 | +Defaults>signing-apk env_keep += "SIGNING_PROJECTNAME tbb_version tbb_version_type KSPASS"
|
|
2 | +%signing ALL = (signing-apk) NOPASSWD: /signing/tor-browser-build/tools/signing/wrappers/sign-aab |
1 | -Defaults>signing-apk env_keep += "SIGNING_PROJECTNAME tbb_version_type KSPASS"
|
|
1 | +Defaults>signing-apk env_keep += "SIGNING_PROJECTNAME tbb_version tbb_version_type KSPASS"
|
|
2 | 2 | %signing ALL = (signing-apk) NOPASSWD: /signing/tor-browser-build/tools/signing/wrappers/sign-apk |
... | ... | @@ -16,6 +16,7 @@ test -n "${SIGNING_PROJECTNAME+x}" \ |
16 | 16 | test "$SIGNING_PROJECTNAME" = 'torbrowser' \
|
17 | 17 | || test "$SIGNING_PROJECTNAME" = 'basebrowser' \
|
18 | 18 | || test "$SIGNING_PROJECTNAME" = 'mullvadbrowser' \
|
19 | + || test "$SIGNING_PROJECTNAME" = 'torvpn' \
|
|
19 | 20 | || exit_error "Unknown SIGNING_PROJECTNAME $SIGNING_PROJECTNAME"
|
20 | 21 | |
21 | 22 | export SIGNING_PROJECTNAME
|
1 | +staticiforme-prepare-cdn-dist-upload |
|
\ No newline at end of file |
1 | +sync-builder-to-local |
|
\ No newline at end of file |
1 | +sync-builder-to-local |
|
\ No newline at end of file |
1 | +sync-builder-unsigned-to-local-signed |
|
\ No newline at end of file |
1 | +sync-builder-unsigned-to-local-signed |
|
\ No newline at end of file |
1 | +sync-linux-signer-to-local |
|
\ No newline at end of file |
1 | +sync-linux-signer-to-local |
|
\ No newline at end of file |
1 | +sync-local-to-builder |
|
\ No newline at end of file |
1 | +sync-local-to-builder |
|
\ No newline at end of file |
1 | +sync-local-to-linux-signer |
|
\ No newline at end of file |
1 | +sync-local-to-linux-signer |
|
\ No newline at end of file |
1 | +sync-local-to-staticiforme |
|
\ No newline at end of file |
1 | +sync-local-to-staticiforme |
|
\ No newline at end of file |
1 | +sync-scripts-to-linux-signer |
|
\ No newline at end of file |
1 | +sync-scripts-to-linux-signer |
|
\ No newline at end of file |
1 | +#!/bin/bash
|
|
2 | +set -e
|
|
3 | + |
|
4 | +function exit_error {
|
|
5 | + for msg in "$@"
|
|
6 | + do
|
|
7 | + echo "$msg" >&2
|
|
8 | + done
|
|
9 | + exit 1
|
|
10 | +}
|
|
11 | + |
|
12 | +case "$SIGNING_PROJECTNAME" in
|
|
13 | + torbrowser | mullvadbrowser | torvpn)
|
|
14 | + ;;
|
|
15 | + *)
|
|
16 | + exit_error "Unexpected value for SIGNING_PROJECTNAME: $SIGNING_PROJECTNAME"
|
|
17 | + ;;
|
|
18 | +esac
|
|
19 | + |
|
20 | +case "$tbb_version_type" in
|
|
21 | + release | alpha)
|
|
22 | + ;;
|
|
23 | + *)
|
|
24 | + exit_error "Unexpected value for tbb_version_type: $tbb_version_type"
|
|
25 | + ;;
|
|
26 | +esac
|
|
27 | + |
|
28 | +android_signing_key_dir=/home/signing-apk/keys
|
|
29 | +android_signing_key_path="$android_signing_key_dir/torvpn.p12"
|
|
30 | +test -f "$android_signing_key_path" || exit_error "$android_signing_key_path is missing"
|
|
31 | + |
|
32 | +tmpdir=$(mktemp -d)
|
|
33 | +cd "$tmpdir"
|
|
34 | + |
|
35 | +jarsigner -keystore "${android_signing_key_path}" -storepass:env KSPASS \
|
|
36 | + -signedjar /home/signing-apk/signed-files/"$SIGNING_PROJECTNAME-$tbb_version_type.aab" \
|
|
37 | + -verbose /home/signing-apk/unsigned-files/"$SIGNING_PROJECTNAME-$tbb_version_type.aab" \
|
|
38 | + tor-vpn
|
|
39 | + |
|
40 | +cd -
|
|
41 | +rm -Rf "$tmpdir" |
... | ... | @@ -14,15 +14,30 @@ if test "$tbb_version_type" != 'release' \ |
14 | 14 | exit_error "Unexpected value for tbb_version_type: $tbb_version_type"
|
15 | 15 | fi
|
16 | 16 | |
17 | +case "$SIGNING_PROJECTNAME" in
|
|
18 | + torbrowser | mullvadbrowser | torvpn)
|
|
19 | + ;;
|
|
20 | + *)
|
|
21 | + exit_error "Unexpected value for SIGNING_PROJECTNAME: $SIGNING_PROJECTNAME"
|
|
22 | + ;;
|
|
23 | +esac
|
|
24 | + |
|
17 | 25 | android_signing_key_dir=/home/signing-apk/keys
|
18 | -android_signing_key_path="$android_signing_key_dir/tba_$tbb_version_type.p12"
|
|
26 | +android_signing_key_path="$android_signing_key_dir/$pname_$tbb_version_type.p12"
|
|
27 | +test -n "$SIGNING_PROJECTNAME" && test "$SIGNING_PROJECTNAME" = 'torvpn' && \
|
|
28 | + android_signing_key_path="$android_signing_key_dir/torvpn.p12"
|
|
19 | 29 | test -f "$android_signing_key_path" || exit_error "$android_signing_key_path is missing"
|
20 | 30 | |
21 | 31 | setup_build_tools() {
|
32 | + abt_version=16
|
|
33 | + # If signing 14.5, keep using android-12 build tools
|
|
34 | + # (we can remove this when 15.0 is the stable release)
|
|
35 | + ( test -z "$tbb_version" || echo "$tbb_version" | grep -q '^14\.5' ) && \
|
|
36 | + abt_version=12
|
|
22 | 37 | build_tools_dir=/signing/android-build-tools
|
23 | - test -f "$build_tools_dir"/android-12/apksigner || \
|
|
24 | - exit_error "$build_tools_dir/android-12/apksigner is missing"
|
|
25 | - export PATH="$build_tools_dir/android-12:${PATH}"
|
|
38 | + test -f "$build_tools_dir"/android-$abt_version/apksigner || \
|
|
39 | + exit_error "$build_tools_dir/android-$abt_version/apksigner is missing"
|
|
40 | + export PATH="$build_tools_dir/android-$abt_version:${PATH}"
|
|
26 | 41 | }
|
27 | 42 | |
28 | 43 | # Sign individual apk
|