Home | History | Annotate | Download | only in platform_CryptohomeTPMReOwn
      1 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import logging, os, re, shutil, sys, time
      6 from autotest_lib.client.bin import test, utils
      7 
      8 class platform_CryptohomeTPMReOwn(test.test):
      9     """
     10     Test of cryptohome functionality to re-create a user's vault directory if
     11     the TPM is cleared and re-owned and the vault keyset is TPM-wrapped.
     12     """
     13     version = 1
     14     preserve_srcdir = True
     15 
     16 
     17     def __run_cmd(self, cmd):
     18         result = utils.system_output(cmd + ' 2>&1', retain_output=True,
     19                                      ignore_status=True)
     20         return result
     21 
     22 
     23     def run_once(self, subtest='None'):
     24         test_user = 'this_is_a_local_test_account (at] chromium.org'
     25         test_password = 'this_is_a_test_password'
     26 
     27         logging.info("Running client subtest %s", subtest)
     28         if (subtest == 'clear_tpm'):
     29             output = self.__run_cmd("/usr/sbin/tpm_clear --force")
     30             self.job.set_state("client_status", "Success")
     31         elif (subtest == 'enable_tpm'):
     32             output = self.__run_cmd("/usr/bin/tpm_init_temp_fix")
     33             self.job.set_state("client_status", "Success")
     34         elif (subtest == 'mount_cryptohome'):
     35             output = self.__run_cmd("/usr/sbin/cryptohome --action=remove " +
     36                                     "--force --user=" + test_user)
     37             ready = False
     38             for n in range(0, 20):
     39                 output = self.__run_cmd("/usr/sbin/cryptohome " +
     40                                         "--action=tpm_status")
     41                 if (output.find("TPM Ready: true") >= 0):
     42                     ready = True
     43                     break
     44                 time.sleep(10)
     45             if (ready == False):
     46                 error_msg = "TPM never became ready"
     47                 self.job.set_state("client_status", error_msg)
     48                 return
     49             output = self.__run_cmd("/usr/sbin/cryptohome --action=mount" +
     50                                " --user=" + test_user +
     51                                " --password=" + test_password)
     52             if (output.find("Mount succeeded") < 0):
     53                 error_msg = "Cryptohome mount failed"
     54                 self.job.set_state("client_status", error_msg)
     55                 return
     56             output = self.__run_cmd("echo TEST_CONTENT > " +
     57                                     "/home/chronos/user/TESTFILE")
     58             output = self.__run_cmd("/usr/sbin/cryptohome --action=unmount")
     59             output = self.__run_cmd("/usr/sbin/cryptohome " +
     60                                     "--action=dump_keyset --user=" + test_user)
     61             if (output.find("TPM_WRAPPED") < 0):
     62                 error_msg = 'Cryptohome did not create a TPM-wrapped keyset.'
     63                 self.job.set_state("client_status", error_msg)
     64                 return
     65             self.job.set_state("client_status", "Success")
     66         elif (subtest == 'mount_cryptohome_after_reboot'):
     67             ready = False
     68             for n in range(0, 20):
     69                 output = self.__run_cmd("/usr/sbin/cryptohome " +
     70                                         "--action=tpm_status")
     71                 if (output.find("TPM Ready: true") >= 0):
     72                     ready = True
     73                     break
     74                 time.sleep(10)
     75             if (ready == False):
     76                 error_msg = 'TPM never became ready'
     77                 self.job.set_state("client_status", error_msg)
     78                 return
     79             output = self.__run_cmd("/usr/sbin/cryptohome --action=mount" +
     80                                " --user=" + test_user +
     81                                " --password=" + test_password)
     82             if (output.find("Mount succeeded") < 0):
     83                 error_msg = 'Cryptohome mount failed'
     84                 self.job.set_state("client_status", error_msg)
     85                 return
     86             output = self.__run_cmd("cat /home/chronos/user/TESTFILE 2>&1")
     87             if (output.find("TEST_CONTENT") < 0):
     88                 output = self.__run_cmd("/usr/sbin/cryptohome --action=unmount")
     89                 error_msg = ('Cryptohome did not contain original test file')
     90                 self.job.set_state("client_status", error_msg)
     91                 return
     92             output = self.__run_cmd("/usr/sbin/cryptohome --action=unmount")
     93             self.job.set_state("client_status", "Success")
     94         elif (subtest == 'mount_cryptohome_check_recreate'):
     95             ready = False
     96             for n in range(0, 20):
     97                 output = self.__run_cmd("/usr/sbin/cryptohome " +
     98                                         "--action=tpm_status")
     99                 if (output.find("TPM Ready: true") >= 0):
    100                     ready = True
    101                     break
    102                 time.sleep(10)
    103             if (ready == False):
    104                 error_msg = 'TPM never became ready'
    105                 self.job.set_state("client_status", error_msg)
    106                 return
    107             output = self.__run_cmd("/usr/sbin/cryptohome --action=mount" +
    108                                " --user=" + test_user +
    109                                " --password=" + test_password)
    110             if (output.find("Mount succeeded") < 0):
    111                 error_msg = 'Cryptohome mount failed'
    112                 self.job.set_state("client_status", error_msg)
    113                 return
    114             output = self.__run_cmd("cat /home/chronos/user/TESTFILE 2>&1")
    115             if (output.find("TEST_CONTENT") >= 0):
    116                 output = self.__run_cmd("/usr/sbin/cryptohome --action=unmount")
    117                 error_msg = ('Cryptohome not re-created, ' +
    118                              'found original test file')
    119                 self.job.set_state("client_status", error_msg)
    120                 return
    121             output = self.__run_cmd("/usr/sbin/cryptohome --action=unmount")
    122             output = self.__run_cmd("/usr/sbin/cryptohome " +
    123                                     "--action=dump_keyset --user=" + test_user)
    124             if (output.find("TPM_WRAPPED") < 0):
    125                 error_msg = ('Cryptohome did not create a ' +
    126                              'TPM-wrapped keyset on reboot.')
    127                 self.job.set_state("client_status", error_msg)
    128                 return
    129             self.job.set_state("client_status", "Success")
    130