Home | History | Annotate | Download | only in keystore
      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
    274