Kenny Root | a91203b | 2012-02-15 15:00:46 -0800 | [diff] [blame^] | 1 | #!/bin/bash |
| 2 | # |
| 3 | # Copyright 2011, The Android Open Source Project |
| 4 | # |
| 5 | # Licensed under the Apache License, Version 2.0 (the "License"); |
| 6 | # you may not use this file except in compliance with the License. |
| 7 | # You may obtain a copy of the License at |
| 8 | # |
| 9 | # http://www.apache.org/licenses/LICENSE-2.0 |
| 10 | # |
| 11 | # Unless required by applicable law or agreed to in writing, software |
| 12 | # distributed under the License is distributed on an "AS IS" BASIS, |
| 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 14 | # See the License for the specific language governing permissions and |
| 15 | # limitations under the License. |
| 16 | |
| 17 | set -e |
| 18 | |
| 19 | prefix=$0 |
| 20 | log_file=$prefix.log |
| 21 | baseline_file=$prefix.baseline |
| 22 | |
| 23 | function cleanup_output() { |
| 24 | rm -f $log_file |
| 25 | rm -f $baseline_file |
| 26 | } |
| 27 | |
| 28 | function log() { |
| 29 | echo "$@" |
| 30 | append $log_file \# "$@" |
| 31 | append $baseline_file \# "$@" |
| 32 | } |
| 33 | |
| 34 | function expect() { |
| 35 | append $baseline_file "$@" |
| 36 | } |
| 37 | |
| 38 | function append() { |
| 39 | declare -r file=$1 |
| 40 | shift |
| 41 | echo "$@" >> $file |
| 42 | } |
| 43 | |
| 44 | function run() { |
| 45 | # strip out carriage returns from adb |
| 46 | # strip out date/time from ls -l |
| 47 | "$@" | tr --delete '\r' | sed -E 's/[0-9]{4}-[0-9]{2}-[0-9]{2} +[0-9]{1,2}:[0-9]{2} //' >> $log_file |
| 48 | } |
| 49 | |
| 50 | function keystore() { |
| 51 | declare -r user=$1 |
| 52 | shift |
| 53 | run adb shell su $user keystore_cli "$@" |
| 54 | } |
| 55 | |
| 56 | function list_keystore_directory() { |
| 57 | run adb shell ls -al /data/misc/keystore |
| 58 | } |
| 59 | |
| 60 | function compare() { |
| 61 | log "comparing $baseline_file and $log_file" |
| 62 | diff $baseline_file $log_file || (log $tag FAILED && exit 1) |
| 63 | } |
| 64 | |
| 65 | function test_basic() { |
| 66 | |
| 67 | # |
| 68 | # reset |
| 69 | # |
| 70 | log "reset keystore as system user" |
| 71 | keystore system r |
| 72 | expect "1 No error" |
| 73 | list_keystore_directory |
| 74 | |
| 75 | # |
| 76 | # basic tests as system/root |
| 77 | # |
| 78 | log "root does not have permission to run test" |
| 79 | keystore root t |
| 80 | expect "6 Permission denied" |
| 81 | |
| 82 | log "but system user does" |
| 83 | keystore system t |
| 84 | expect "3 Uninitialized" |
| 85 | list_keystore_directory |
| 86 | |
| 87 | log "password is now bar" |
| 88 | keystore system p bar |
| 89 | expect "1 No error" |
| 90 | list_keystore_directory |
| 91 | expect "-rw------- keystore keystore 84 .masterkey" |
| 92 | |
| 93 | log "no error implies initialized and unlocked" |
| 94 | keystore system t |
| 95 | expect "1 No error" |
| 96 | |
| 97 | log "saw with no argument" |
| 98 | keystore system s |
| 99 | expect "5 Protocol error" |
| 100 | |
| 101 | log "saw nothing" |
| 102 | keystore system s "" |
| 103 | expect "1 No error" |
| 104 | |
| 105 | log "add key baz" |
| 106 | keystore system i baz quux |
| 107 | expect "1 No error" |
| 108 | |
| 109 | log "1000 is uid of system" |
| 110 | list_keystore_directory |
| 111 | expect "-rw------- keystore keystore 84 .masterkey" |
| 112 | expect "-rw------- keystore keystore 52 1000_baz" |
| 113 | |
| 114 | log "saw baz" |
| 115 | keystore system s "" |
| 116 | expect "1 No error" |
| 117 | expect "baz" |
| 118 | |
| 119 | log "get baz" |
| 120 | keystore system g baz |
| 121 | expect "1 No error" |
| 122 | expect "quux" |
| 123 | |
| 124 | log "root can read system user keys (as can wifi or vpn users)" |
| 125 | keystore root g baz |
| 126 | expect "1 No error" |
| 127 | expect "quux" |
| 128 | |
| 129 | # |
| 130 | # app user tests |
| 131 | # |
| 132 | |
| 133 | # app_0 has uid 10000, as seen below |
| 134 | log "other uses cannot see the system keys" |
| 135 | keystore app_0 g baz |
| 136 | expect "7 Key not found" |
| 137 | |
| 138 | log "app user cannot use reset, password, lock, unlock" |
| 139 | keystore app_0 r |
| 140 | expect "6 Permission denied" |
| 141 | keystore app_0 p |
| 142 | expect "6 Permission denied" |
| 143 | keystore app_0 l |
| 144 | expect "6 Permission denied" |
| 145 | keystore app_0 u |
| 146 | expect "6 Permission denied" |
| 147 | |
| 148 | log "install app_0 key" |
| 149 | keystore app_0 i 0x deadbeef |
| 150 | expect 1 No error |
| 151 | list_keystore_directory |
| 152 | expect "-rw------- keystore keystore 84 .masterkey" |
| 153 | expect "-rw------- keystore keystore 52 10000_0x" |
| 154 | expect "-rw------- keystore keystore 52 1000_baz" |
| 155 | |
| 156 | log "get with no argument" |
| 157 | keystore app_0 g |
| 158 | expect "5 Protocol error" |
| 159 | |
| 160 | keystore app_0 g 0x |
| 161 | expect "1 No error" |
| 162 | expect "deadbeef" |
| 163 | |
| 164 | keystore app_0 i fred barney |
| 165 | expect "1 No error" |
| 166 | |
| 167 | keystore app_0 s "" |
| 168 | expect "1 No error" |
| 169 | expect "0x" |
| 170 | expect "fred" |
| 171 | |
| 172 | log "note that saw returns the suffix of prefix matches" |
| 173 | keystore app_0 s fr # fred |
| 174 | expect "1 No error" |
| 175 | expect "ed" # fred |
| 176 | |
| 177 | # |
| 178 | # lock tests |
| 179 | # |
| 180 | log "lock the store as system" |
| 181 | keystore system l |
| 182 | expect "1 No error" |
| 183 | keystore system t |
| 184 | expect "2 Locked" |
| 185 | |
| 186 | log "saw works while locked" |
| 187 | keystore app_0 s "" |
| 188 | expect "1 No error" |
| 189 | expect "0x" |
| 190 | expect "fred" |
| 191 | |
| 192 | log "...but cannot read keys..." |
| 193 | keystore app_0 g 0x |
| 194 | expect "2 Locked" |
| 195 | |
| 196 | log "...but they can be deleted." |
| 197 | keystore app_0 e 0x |
| 198 | expect "1 No error" |
| 199 | keystore app_0 d 0x |
| 200 | expect "1 No error" |
| 201 | keystore app_0 e 0x |
| 202 | expect "7 Key not found" |
| 203 | |
| 204 | # |
| 205 | # password |
| 206 | # |
| 207 | log "wrong password" |
| 208 | keystore system u foo |
| 209 | expect "13 Wrong password (4 tries left)" |
| 210 | log "right password" |
| 211 | keystore system u bar |
| 212 | expect "1 No error" |
| 213 | |
| 214 | log "make the password foo" |
| 215 | keystore system p foo |
| 216 | expect "1 No error" |
| 217 | |
| 218 | # |
| 219 | # final reset |
| 220 | # |
| 221 | log "reset wipes everything for all users" |
| 222 | keystore system r |
| 223 | expect "1 No error" |
| 224 | list_keystore_directory |
| 225 | |
| 226 | keystore system t |
| 227 | expect "3 Uninitialized" |
| 228 | |
| 229 | } |
| 230 | |
| 231 | function test_4599735() { |
| 232 | # http://b/4599735 |
| 233 | log "start regression test for b/4599735" |
| 234 | keystore system r |
| 235 | expect "1 No error" |
| 236 | |
| 237 | keystore system p foo |
| 238 | expect "1 No error" |
| 239 | |
| 240 | keystore system i baz quux |
| 241 | expect "1 No error" |
| 242 | |
| 243 | keystore root g baz |
| 244 | expect "1 No error" |
| 245 | expect "quux" |
| 246 | |
| 247 | keystore system l |
| 248 | expect "1 No error" |
| 249 | |
| 250 | keystore system p foo |
| 251 | expect "1 No error" |
| 252 | |
| 253 | log "after unlock, regression led to result of '8 Value corrupted'" |
| 254 | keystore root g baz |
| 255 | expect "1 No error" |
| 256 | expect "quux" |
| 257 | |
| 258 | keystore system r |
| 259 | expect "1 No error" |
| 260 | log "end regression test for b/4599735" |
| 261 | } |
| 262 | |
| 263 | function main() { |
| 264 | cleanup_output |
| 265 | log $tag START |
| 266 | test_basic |
| 267 | test_4599735 |
| 268 | compare |
| 269 | log $tag PASSED |
| 270 | cleanup_output |
| 271 | } |
| 272 | |
| 273 | main |