| #!/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 -d '\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 keystore_in() { |
| declare -r user=$1 |
| declare -r input=$2 |
| shift; shift |
| run adb shell "echo '$input' | 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 reset |
| expect "reset: No error (1)" |
| list_keystore_directory |
| expect "-rw------- keystore keystore 4 .metadata" |
| expect "drwx------ keystore keystore user_0" |
| |
| # |
| # basic tests as system/root |
| # |
| log "root does not have permission to run test" |
| keystore root test |
| expect "test: Permission denied (6)" |
| |
| log "but system user does" |
| keystore system test |
| expect "test: Uninitialized (3)" |
| list_keystore_directory |
| expect "-rw------- keystore keystore 4 .metadata" |
| expect "drwx------ keystore keystore user_0" |
| |
| log "password is now bar" |
| keystore system password bar |
| expect "password: No error (1)" |
| list_keystore_directory /user_0 |
| expect "-rw------- keystore keystore 84 .masterkey" |
| |
| log "no error implies initialized and unlocked" |
| keystore system test |
| expect "test: No error (1)" |
| |
| log "saw with no argument" |
| keystore system saw |
| |
| log "saw nothing" |
| keystore system saw "" |
| |
| log "add key baz" |
| keystore_in system quux insert baz |
| expect "insert: No error (1)" |
| |
| log "1000 is uid of system" |
| list_keystore_directory /user_0 |
| expect "-rw------- keystore keystore 84 .masterkey" |
| expect "-rw------- keystore keystore 52 1000_baz" |
| |
| log "saw baz" |
| keystore system saw |
| expect "baz" |
| |
| log "get baz" |
| keystore system get baz |
| expect "quux" |
| |
| log "root can read system user keys (as can wifi or vpn users)" |
| keystore root get baz |
| expect "quux" |
| |
| # |
| # app user tests |
| # |
| |
| # u0_a0 has uid 10000, as seen below |
| log "other uses cannot see the system keys" |
| keystore u0_a0 get baz |
| |
| log "app user cannot use reset, password, lock, unlock" |
| keystore u0_a0 reset |
| expect "reset: Permission denied (6)" |
| keystore u0_a0 password some_pass |
| expect "password: Permission denied (6)" |
| keystore u0_a0 lock |
| expect "lock: Permission denied (6)" |
| keystore u0_a0 unlock some_pass |
| expect "unlock: Permission denied (6)" |
| |
| log "install u0_a0 key" |
| keystore_in u0_a0 deadbeef insert 0x |
| expect "insert: No error (1)" |
| list_keystore_directory /user_0 |
| 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 u0_a0 get |
| expect "Usage: keystore_cli get <name>" |
| |
| log "few get tests for an app" |
| keystore u0_a0 get 0x |
| expect "deadbeef" |
| |
| keystore_in u0_a0 barney insert fred |
| expect "insert: No error (1)" |
| |
| keystore u0_a0 saw |
| expect "0x" |
| expect "fred" |
| |
| log "note that saw returns the suffix of prefix matches" |
| keystore u0_a0 saw fr # fred |
| expect "ed" # fred |
| |
| # |
| # lock tests |
| # |
| log "lock the store as system" |
| keystore system lock |
| expect "lock: No error (1)" |
| keystore system test |
| expect "test: Locked (2)" |
| |
| log "saw works while locked" |
| keystore u0_a0 saw |
| expect "0x" |
| expect "fred" |
| |
| log "...and app can read keys..." |
| keystore u0_a0 get 0x |
| expect "deadbeef" |
| |
| log "...but they cannot be deleted." |
| keystore u0_a0 exist 0x |
| expect "exist: No error (1)" |
| keystore u0_a0 del_key 0x |
| expect "del_key: Key not found (7)" |
| |
| # |
| # password |
| # |
| log "wrong password" |
| keystore system unlock foo |
| expect "unlock: Wrong password (4 tries left) (13)" |
| log "right password" |
| keystore system unlock bar |
| expect "unlock: No error (1)" |
| |
| log "make the password foo" |
| keystore system password foo |
| expect "password: No error (1)" |
| |
| # |
| # final reset |
| # |
| log "reset wipes everything for all users" |
| keystore system reset |
| expect "reset: No error (1)" |
| list_keystore_directory |
| expect "-rw------- keystore keystore 4 .metadata" |
| expect "drwx------ keystore keystore user_0" |
| list_keystore_directory /user_0 |
| |
| keystore system test |
| expect "test: Uninitialized (3)" |
| } |
| |
| function test_grant() { |
| log "test granting" |
| keystore system reset |
| expect "reset: No error (1)" |
| keystore system password test_pass |
| expect "password: No error (1)" |
| |
| keystore_in system granted_key_value insert granted_key |
| expect "insert: No error (1)" |
| |
| # Cannot read before grant. |
| keystore u10_a0 get granted_key |
| |
| # Grant and read. |
| log "System grants to u0_a1" |
| keystore system grant granted_key 10001 |
| expect "Working with uid 10001" |
| expect "grant: No error (1)" |
| keystore u0_a1 get 1000_granted_key |
| expect "granted_key_value" |
| } |
| |
| function test_4599735() { |
| # http://b/4599735 |
| log "start regression test for b/4599735" |
| keystore system reset |
| expect "reset: No error (1)" |
| list_keystore_directory /user_0 |
| |
| keystore system password foo |
| expect "password: No error (1)" |
| |
| keystore_in system quux insert baz |
| expect "insert: No error (1)" |
| |
| keystore root get baz |
| expect "quux" |
| |
| keystore system lock |
| expect "lock: No error (1)" |
| |
| keystore system password foo |
| expect "password: No error (1)" |
| |
| log "after unlock, regression led to result of '8 Value corrupted'" |
| keystore root get baz |
| expect "quux" |
| |
| keystore system reset |
| expect "reset: No error (1)" |
| log "end regression test for b/4599735" |
| } |
| |
| function main() { |
| cleanup_output |
| log $tag START |
| test_basic |
| test_4599735 |
| test_grant |
| compare |
| log $tag PASSED |
| cleanup_output |
| } |
| |
| main |