| 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 |