xref: /aosp_15_r20/external/vboot_reference/scripts/image_signing/sign_android_unittests.sh (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
1#!/bin/bash
2
3# Copyright 2018 The ChromiumOS Authors
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7. "$(dirname "$0")/lib/sudo_stub.sh"
8. "$(dirname "$0")/lib/sign_android_lib.sh"
9
10# Expected APK signatures depending on the type of APK and the type of build.
11declare -A platform_sha=(
12  ['cheets']='AA:04:E0:5F:82:9C:7E:D1:B9:F8:FC:99:6C:5A:54:43:83:D9:F5:BC'
13  ['aosp']='27:19:6E:38:6B:87:5E:76:AD:F7:00:E7:EA:84:E4:C6:EE:E3:3D:FA'
14)
15declare -A media_sha=(
16  ['cheets']='D4:C4:2D:E0:B9:1B:15:72:FA:7D:A7:21:E0:A6:09:94:B4:4C:B5:AE'
17  ['aosp']='B7:9D:F4:A8:2E:90:B5:7E:A7:65:25:AB:70:37:AB:23:8A:42:F5:D3'
18)
19declare -A shared_sha=(
20  ['cheets']='38:B6:2C:E1:75:98:E3:E1:1C:CC:F6:6B:83:BB:97:0E:2D:40:6C:AE'
21  ['aosp']='5B:36:8C:FF:2D:A2:68:69:96:BC:95:EA:C1:90:EA:A4:F5:63:0F:E5'
22)
23declare -A release_sha=(
24  ['cheets']='EC:63:36:20:23:B7:CB:66:18:70:D3:39:3C:A9:AE:7E:EF:A9:32:42'
25  ['aosp']='61:ED:37:7E:85:D3:86:A8:DF:EE:6B:86:4B:D8:5B:0B:FA:A5:AF:81'
26)
27
28
29test_android_choose_key_invalid_keyset() {
30  local keyname
31  local keyset
32  local keysets=("invalid_keyset" " " "")
33
34  for keyset in "${keysets[@]}"; do
35    echo "TEST: Detection of invalid keyset '${keyset}'."
36    if keyname=$(android_choose_key "ignored_sha1" "${keyset}"); then
37      : $(( NUM_TEST_FAILURES += 1 ))
38      echo "ERROR: Failed to detect invalid keyset '${keyset}'."
39    else
40      echo "PASS: Detected invalid keyset '${keyset}'."
41    fi
42  done
43}
44
45android_choose_key_test_helper() {
46  local sha1="$1"
47  local keyset="$2"
48  local expected_keyname="$3"
49  local keyname="invalid_key"
50
51  echo "TEST: Detect '${expected_keyname}' key name for '${keyset}' keyset."
52  keyname=$(android_choose_key "${sha1}" "${keyset}")
53  if [[ "${keyname}" != "${expected_keyname}" ]]; then
54    : $(( NUM_TEST_FAILURES += 1 ))
55    echo "ERROR: Incorrect key name '${keyname}' returned."
56  else
57    echo "PASS: Correct key name '${keyname}' returned."
58  fi
59}
60
61test_android_choose_key() {
62  local keyset
63  local expected_keyname
64
65  local keysets=("cheets" "aosp")
66  for keyset in "${keysets[@]}"; do
67    expected_keyname="platform"
68    android_choose_key_test_helper "${platform_sha[${keyset}]}" "${keyset}" \
69      "${expected_keyname}"
70    expected_keyname="media"
71    android_choose_key_test_helper "${media_sha[${keyset}]}" "${keyset}" \
72      "${expected_keyname}"
73    expected_keyname="shared"
74    android_choose_key_test_helper "${shared_sha[${keyset}]}" "${keyset}" \
75      "${expected_keyname}"
76    expected_keyname="releasekey"
77    android_choose_key_test_helper "${release_sha[${keyset}]}" "${keyset}" \
78      "${expected_keyname}"
79  done
80}
81
82build_flavor_test_helper() {
83  local prop_file="${BUILD}/build.prop"
84  local prop_content="$1"
85  local expected_flavor_prop="$2"
86  local flavor_prop=""
87
88  echo "${prop_content}" > "${prop_file}"
89  flavor_prop=$(android_get_build_flavor_prop "${prop_file}")
90  if [[ "${flavor_prop}" != "${expected_flavor_prop}" ]]; then
91    : $(( NUM_TEST_FAILURES += 1 ))
92    echo "ERROR: Incorrect build flavor '${flavor_prop}' returned."
93  else
94    echo "PASS: Correct key name '${flavor_prop}' returned."
95  fi
96  rm "${prop_file}"
97}
98
99test_android_get_build_flavor_prop() {
100  local prop_file="${BUILD}/build.prop"
101  local prop_content=""
102  local flavor_prop=""
103
104  echo "TEST: Extract ro.build.flavor property."
105  prop_content="ro.random.prop=foo
106other.prop=bar
107x=foobar
108ro.build.flavor=cheets_x86-user
109another.prop=barfoo"
110  build_flavor_test_helper "${prop_content}" "cheets_x86-user"
111
112  echo "TEST: Extract single ro.build.flavor property."
113  prop_content="ro.build.flavor=cheets_x86-user"
114  build_flavor_test_helper "${prop_content}" "cheets_x86-user"
115
116  echo "TEST: Avoid commented out ro.build.flavor property."
117  prop_content="ro.random.prop=foo
118other.prop=bar
119x=foobar
120#ro.build.flavor=commented_out
121ro.build.flavor=cheets_x86-user
122another.prop=barfoo"
123  build_flavor_test_helper "${prop_content}" "cheets_x86-user"
124
125  # Missing ro.build.flavor property.
126  echo "TEST: Detect missing ro.build.flavor property."
127  echo "ro.random.prop=foo" > "${prop_file}"
128  if flavor_prop=$(android_get_build_flavor_prop "${prop_file}"); then
129    : $(( NUM_TEST_FAILURES += 1 ))
130    echo "ERROR: Failed to detect missing ro.build.flavor property."
131  else
132    echo "PASS: Detected missing ro.build.flavor property."
133  fi
134  rm "${prop_file}"
135}
136
137choose_signing_keyset_test_helper() {
138  local flavor_prop="$1"
139  local expected_keyset="$2"
140  local keyset=""
141
142  keyset=$(android_choose_signing_keyset "${flavor_prop}")
143  if [[ "${keyset}" != "${expected_keyset}" ]]; then
144    : $(( NUM_TEST_FAILURES += 1 ))
145    echo "ERROR: Incorrect keyset '${keyset}' returned instead of \
146'${expected_keyset}'."
147  else
148    echo "PASS: Correct keyset '${keyset}' returned."
149  fi
150}
151
152choose_signing_keyset_test_invalid_flavors() {
153  local flavor="$1"
154
155  echo "TEST: Detect invalid build flavor '${flavor}'."
156  if android_choose_signing_keyset "${flavor}"; then
157    : $(( NUM_TEST_FAILURES += 1 ))
158    echo "ERROR: Failed to detect invalid build flavor '${flavor}'."
159  else
160    echo "PASS: Detected invalid build flavor '${flavor}'."
161  fi
162}
163
164test_android_choose_signing_keyset() {
165  echo "TEST: Keyset for aosp_cheets build."
166  choose_signing_keyset_test_helper "aosp_cheets_x86-userdebug" "aosp"
167  echo "TEST: Keyset for sdk_google_cheets build."
168  choose_signing_keyset_test_helper "sdk_google_cheets_x86-userdebug" "cheets"
169  echo "TEST: Keyset for sdk_cheets build."
170  choose_signing_keyset_test_helper "sdk_cheets_x86-userdebug" "cheets"
171  echo "TEST: Keyset for cheets_x86 build."
172  choose_signing_keyset_test_helper "cheets_x86-user" "cheets"
173  echo "TEST: Keyset for cheets_arm build."
174  choose_signing_keyset_test_helper "cheets_arm-user" "cheets"
175  echo "TEST: Keyset for cheets_x86_64 build."
176  choose_signing_keyset_test_helper "cheets_x86_64-user" "cheets"
177  echo "TEST: Keyset for userdebug build."
178  choose_signing_keyset_test_helper "cheets_x86-userdebug" "cheets"
179  echo "TEST: Keyset for bertha_x86 build."
180  choose_signing_keyset_test_helper "bertha_x86-user" "cheets"
181  echo "TEST: Keyset for bertha_arm build."
182  choose_signing_keyset_test_helper "bertha_arm-user" "cheets"
183  echo "TEST: Keyset for bertha_x86_64 build."
184  choose_signing_keyset_test_helper "bertha_x86_64-user" "cheets"
185
186  choose_signing_keyset_test_invalid_flavors "aosp"
187  choose_signing_keyset_test_invalid_flavors "cheets"
188  choose_signing_keyset_test_invalid_flavors "bertha"
189  choose_signing_keyset_test_invalid_flavors ""
190  choose_signing_keyset_test_invalid_flavors " "
191}
192
193main() {
194  if [[ $# -ne 0 ]]; then
195    echo "FAIL: unexpected arguments '$@'."
196    return 1
197  fi
198
199  BUILD=$(mktemp -d)
200  echo "Setting temporary build directory as '${BUILD}'."
201
202  test_android_choose_key_invalid_keyset
203  test_android_choose_key
204  test_android_get_build_flavor_prop
205  test_android_choose_signing_keyset
206
207  echo "Deleting temporary build directory '${BUILD}'."
208  rmdir "${BUILD}"
209
210  if [[ ${NUM_TEST_FAILURES} -gt 0 ]]; then
211    echo "FAIL: found ${NUM_TEST_FAILURES} failed :(."
212    return 1
213  fi
214  echo "PASS: all tests passed :)."
215  return 0
216}
217
218# Global incremented by each test when they fail.
219NUM_TEST_FAILURES=0
220main "$@"
221