| #!/bin/bash | 
 | # | 
 | # Copyright 2011, The Android Open Source Project | 
 | # | 
 | # Licensed under the Apache License, Version 2.0 (the "License"); | 
 | # you may not use this file except in compliance with the License. | 
 | # You may obtain a copy of the License at | 
 | # | 
 | #     http://www.apache.org/licenses/LICENSE-2.0 | 
 | # | 
 | # Unless required by applicable law or agreed to in writing, software | 
 | # distributed under the License is distributed on an "AS IS" BASIS, | 
 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | # See the License for the specific language governing permissions and | 
 | # limitations under the License. | 
 |  | 
 | set -e | 
 |  | 
 | prefix=$0 | 
 | log_file=$prefix.log | 
 | baseline_file=$prefix.baseline | 
 |  | 
 | function cleanup_output() { | 
 |     rm -f $log_file | 
 |     rm -f $baseline_file | 
 | } | 
 |  | 
 | function log() { | 
 |     echo "$@" | 
 |     append $log_file \# "$@" | 
 |     append $baseline_file \# "$@" | 
 | } | 
 |  | 
 | function expect() { | 
 |     append $baseline_file "$@" | 
 | } | 
 |  | 
 | function append() { | 
 |     declare -r file=$1 | 
 |     shift | 
 |     echo "$@" >> $file | 
 | } | 
 |  | 
 | function run() { | 
 |     # strip out carriage returns from adb | 
 |     # strip out date/time from ls -l | 
 |     "$@" | tr --delete '\r' | sed -E 's/[0-9]{4}-[0-9]{2}-[0-9]{2} +[0-9]{1,2}:[0-9]{2} //' >> $log_file | 
 | } | 
 |  | 
 | function keystore() { | 
 |     declare -r user=$1 | 
 |     shift | 
 |     run adb shell su $user keystore_cli "$@" | 
 | } | 
 |  | 
 | function list_keystore_directory() { | 
 |     run adb shell ls -al /data/misc/keystore | 
 | } | 
 |  | 
 | function compare() { | 
 |     log "comparing $baseline_file and $log_file" | 
 |     diff $baseline_file $log_file || (log $tag FAILED && exit 1) | 
 | } | 
 |  | 
 | function test_basic() { | 
 |  | 
 |     # | 
 |     # reset | 
 |     # | 
 |     log "reset keystore as system user" | 
 |     keystore system r | 
 |     expect "1 No error" | 
 |     list_keystore_directory | 
 |  | 
 |     # | 
 |     # basic tests as system/root | 
 |     # | 
 |     log "root does not have permission to run test" | 
 |     keystore root t | 
 |     expect "6 Permission denied" | 
 |      | 
 |     log "but system user does" | 
 |     keystore system t | 
 |     expect "3 Uninitialized" | 
 |     list_keystore_directory | 
 |  | 
 |     log "password is now bar" | 
 |     keystore system p bar | 
 |     expect "1 No error" | 
 |     list_keystore_directory | 
 |     expect "-rw------- keystore keystore       84 .masterkey" | 
 |      | 
 |     log "no error implies initialized and unlocked" | 
 |     keystore system t | 
 |     expect "1 No error" | 
 |      | 
 |     log "saw with no argument" | 
 |     keystore system s | 
 |     expect "5 Protocol error" | 
 |  | 
 |     log "saw nothing" | 
 |     keystore system s "" | 
 |     expect "1 No error" | 
 |  | 
 |     log "add key baz" | 
 |     keystore system i baz quux | 
 |     expect "1 No error" | 
 |  | 
 |     log "1000 is uid of system" | 
 |     list_keystore_directory | 
 |     expect "-rw------- keystore keystore       84 .masterkey" | 
 |     expect "-rw------- keystore keystore       52 1000_baz" | 
 |  | 
 |     log "saw baz" | 
 |     keystore system s "" | 
 |     expect "1 No error" | 
 |     expect "baz" | 
 |  | 
 |     log "get baz" | 
 |     keystore system g baz | 
 |     expect "1 No error" | 
 |     expect "quux" | 
 |  | 
 |     log "root can read system user keys (as can wifi or vpn users)" | 
 |     keystore root g baz | 
 |     expect "1 No error" | 
 |     expect "quux" | 
 |  | 
 |     # | 
 |     # app user tests | 
 |     # | 
 |  | 
 |     # app_0 has uid 10000, as seen below | 
 |     log "other uses cannot see the system keys" | 
 |     keystore app_0 g baz | 
 |     expect "7 Key not found" | 
 |      | 
 |     log "app user cannot use reset, password, lock, unlock" | 
 |     keystore app_0 r | 
 |     expect "6 Permission denied" | 
 |     keystore app_0 p | 
 |     expect "6 Permission denied" | 
 |     keystore app_0 l | 
 |     expect "6 Permission denied" | 
 |     keystore app_0 u | 
 |     expect "6 Permission denied" | 
 |  | 
 |     log "install app_0 key" | 
 |     keystore app_0 i 0x deadbeef | 
 |     expect 1 No error | 
 |     list_keystore_directory | 
 |     expect "-rw------- keystore keystore       84 .masterkey" | 
 |     expect "-rw------- keystore keystore       52 10000_0x" | 
 |     expect "-rw------- keystore keystore       52 1000_baz" | 
 |  | 
 |     log "get with no argument" | 
 |     keystore app_0 g | 
 |     expect "5 Protocol error" | 
 |      | 
 |     keystore app_0 g 0x | 
 |     expect "1 No error" | 
 |     expect "deadbeef" | 
 |      | 
 |     keystore app_0 i fred barney | 
 |     expect "1 No error" | 
 |      | 
 |     keystore app_0 s "" | 
 |     expect "1 No error" | 
 |     expect "0x" | 
 |     expect "fred" | 
 |  | 
 |     log "note that saw returns the suffix of prefix matches" | 
 |     keystore app_0 s fr # fred | 
 |     expect "1 No error" | 
 |     expect "ed" # fred | 
 |  | 
 |     # | 
 |     # lock tests | 
 |     # | 
 |     log "lock the store as system" | 
 |     keystore system l | 
 |     expect "1 No error" | 
 |     keystore system t | 
 |     expect "2 Locked" | 
 |      | 
 |     log "saw works while locked" | 
 |     keystore app_0 s "" | 
 |     expect "1 No error" | 
 |     expect "0x" | 
 |     expect "fred" | 
 |  | 
 |     log "...but cannot read keys..." | 
 |     keystore app_0 g 0x | 
 |     expect "2 Locked" | 
 |      | 
 |     log "...but they can be deleted." | 
 |     keystore app_0 e 0x | 
 |     expect "1 No error" | 
 |     keystore app_0 d 0x | 
 |     expect "1 No error" | 
 |     keystore app_0 e 0x | 
 |     expect "7 Key not found" | 
 |  | 
 |     # | 
 |     # password | 
 |     # | 
 |     log "wrong password" | 
 |     keystore system u foo | 
 |     expect "13 Wrong password (4 tries left)" | 
 |     log "right password" | 
 |     keystore system u bar | 
 |     expect "1 No error" | 
 |      | 
 |     log "make the password foo" | 
 |     keystore system p foo | 
 |     expect "1 No error" | 
 |      | 
 |     # | 
 |     # final reset | 
 |     # | 
 |     log "reset wipes everything for all users" | 
 |     keystore system r | 
 |     expect "1 No error" | 
 |     list_keystore_directory | 
 |      | 
 |     keystore system t | 
 |     expect "3 Uninitialized" | 
 |  | 
 | } | 
 |  | 
 | function test_4599735() { | 
 |     # http://b/4599735 | 
 |     log "start regression test for b/4599735" | 
 |     keystore system r | 
 |     expect "1 No error" | 
 |  | 
 |     keystore system p foo | 
 |     expect "1 No error" | 
 |  | 
 |     keystore system i baz quux | 
 |     expect "1 No error" | 
 |      | 
 |     keystore root g baz | 
 |     expect "1 No error" | 
 |     expect "quux" | 
 |  | 
 |     keystore system l | 
 |     expect "1 No error" | 
 |  | 
 |     keystore system p foo | 
 |     expect "1 No error" | 
 |  | 
 |     log "after unlock, regression led to result of '8 Value corrupted'" | 
 |     keystore root g baz | 
 |     expect "1 No error" | 
 |     expect "quux" | 
 |  | 
 |     keystore system r | 
 |     expect "1 No error" | 
 |     log "end regression test for b/4599735" | 
 | } | 
 |  | 
 | function main() { | 
 |     cleanup_output | 
 |     log $tag START | 
 |     test_basic | 
 |     test_4599735 | 
 |     compare | 
 |     log $tag PASSED | 
 |     cleanup_output | 
 | } | 
 |  | 
 | main |