Home | History | Annotate | Download | only in tpm2
      1 // This file was extracted from the TCG Published
      2 // Trusted Platform Module Library
      3 // Part 4: Supporting Routines
      4 // Family "2.0"
      5 // Level 00 Revision 01.16
      6 // October 30, 2014
      7 
      8 #include    "Tpm.h"
      9 #include    "InternalRoutines.h"
     10 typedef UINT16          ATTRIBUTE_TYPE;
     11 //
     12 //     The following file is produced from the command tables in part 3 of the specification. It defines the
     13 //     attributes for each of the commands.
     14 //
     15 //     NOTE:           This file is currently produced by an automated process. Files produced from Part 2 or Part 3 tables through
     16 //                     automated processes are not included in the specification so that their is no ambiguity about the table
     17 //                     containing the information being the normative definition.
     18 //
     19 #include       "CommandAttributeData.c"
     20 //
     21 //
     22 //          Command Attribute Functions
     23 //
     24 //          CommandAuthRole()
     25 //
     26 //     This function returns the authorization role required of a handle.
     27 //
     28 //     Return Value                       Meaning
     29 //
     30 //     AUTH_NONE                          no authorization is required
     31 //     AUTH_USER                          user role authorization is required
     32 //     AUTH_ADMIN                         admin role authorization is required
     33 //     AUTH_DUP                           duplication role authorization is required
     34 //
     35 AUTH_ROLE
     36 CommandAuthRole(
     37      TPM_CC        commandCode,                 // IN: command code
     38      UINT32        handleIndex                  // IN: handle index (zero based)
     39      )
     40 {
     41    if(handleIndex > 1)
     42        return AUTH_NONE;
     43    if(handleIndex == 0) {
     44        ATTRIBUTE_TYPE properties = s_commandAttributes[commandCode - TPM_CC_FIRST];
     45        if(properties & HANDLE_1_USER) return AUTH_USER;
     46        if(properties & HANDLE_1_ADMIN) return AUTH_ADMIN;
     47        if(properties & HANDLE_1_DUP) return AUTH_DUP;
     48        return AUTH_NONE;
     49    }
     50    if(s_commandAttributes[commandCode - TPM_CC_FIRST] & HANDLE_2_USER)
     51            return AUTH_USER;
     52    return AUTH_NONE;
     53 }
     54 //
     55 //
     56 //          CommandIsImplemented()
     57 //
     58 //     This function indicates if a command is implemented.
     59 //
     60 //     Return Value                      Meaning
     61 //
     62 //     TRUE                              if the command is implemented
     63 //     FALSE                             if the command is not implemented
     64 //
     65 BOOL
     66 CommandIsImplemented(
     67     TPM_CC                commandCode          // IN: command code
     68     )
     69 {
     70     if(commandCode < TPM_CC_FIRST || commandCode > TPM_CC_LAST)
     71         return FALSE;
     72     if((s_commandAttributes[commandCode - TPM_CC_FIRST] & IS_IMPLEMENTED))
     73         return TRUE;
     74     else
     75         return FALSE;
     76 }
     77 //
     78 //
     79 //          CommandGetAttribute()
     80 //
     81 //     return a TPMA_CC structure for the given command code
     82 //
     83 TPMA_CC
     84 CommandGetAttribute(
     85     TPM_CC                commandCode          // IN: command code
     86     )
     87 {
     88     UINT32      size = sizeof(s_ccAttr) / sizeof(s_ccAttr[0]);
     89     UINT32      i;
     90     for(i = 0; i < size; i++) {
     91         if(s_ccAttr[i].commandIndex == (UINT16) commandCode)
     92             return s_ccAttr[i];
     93     }
     94     // This function should be called in the way that the command code
     95     // attribute is available.
     96     FAIL(FATAL_ERROR_INTERNAL);
     97 
     98     return s_ccAttr[0]; // Just to appease the compiler, never reached.
     99 }
    100 //
    101 //
    102 //          EncryptSize()
    103 //
    104 //     This function returns the size of the decrypt size field. This function returns 0 if encryption is not allowed
    105 //
    106 //     Return Value                      Meaning
    107 //
    108 //     0                                 encryption not allowed
    109 //     2                                 size field is two bytes
    110 //     4                                 size field is four bytes
    111 //
    112 int
    113 EncryptSize(
    114     TPM_CC                commandCode          // IN: commandCode
    115     )
    116 {
    117     COMMAND_ATTRIBUTES        ca = s_commandAttributes[commandCode - TPM_CC_FIRST];
    118     if(ca & ENCRYPT_2)
    119         return 2;
    120     if(ca & ENCRYPT_4)
    121         return 4;
    122     return 0;
    123 }
    124 //
    125 //
    126 //          DecryptSize()
    127 //
    128 //     This function returns the size of the decrypt size field. This function returns 0 if decryption is not allowed
    129 //
    130 //     Return Value                      Meaning
    131 //
    132 //     0                                 encryption not allowed
    133 //     2                                 size field is two bytes
    134 //     4                                 size field is four bytes
    135 //
    136 int
    137 DecryptSize(
    138     TPM_CC                commandCode          // IN: commandCode
    139     )
    140 {
    141     COMMAND_ATTRIBUTES        ca = s_commandAttributes[commandCode - TPM_CC_FIRST];
    142     if(ca & DECRYPT_2)
    143         return 2;
    144     if(ca & DECRYPT_4)
    145         return 4;
    146     return 0;
    147 }
    148 //
    149 //
    150 //          IsSessionAllowed()
    151 //
    152 //     This function indicates if the command is allowed to have sessions.
    153 //     This function must not be called if the command is not known to be implemented.
    154 //
    155 //     Return Value                      Meaning
    156 //
    157 //     TRUE                              session is allowed with this command
    158 //     FALSE                             session is not allowed with this command
    159 //
    160 BOOL
    161 IsSessionAllowed(
    162     TPM_CC                commandCode          // IN: the command to be checked
    163     )
    164 {
    165     if(s_commandAttributes[commandCode - TPM_CC_FIRST] & NO_SESSIONS)
    166         return FALSE;
    167     else
    168         return TRUE;
    169 }
    170 //
    171 //
    172 //          IsHandleInResponse()
    173 //
    174 BOOL
    175 IsHandleInResponse(
    176     TPM_CC                commandCode
    177     )
    178 {
    179     if(s_commandAttributes[commandCode - TPM_CC_FIRST] & R_HANDLE)
    180         return TRUE;
    181     else
    182         return FALSE;
    183 //
    184 }
    185 //
    186 //
    187 //           IsWriteOperation()
    188 //
    189 //      Checks to see if an operation will write to NV memory
    190 //
    191 BOOL
    192 IsWriteOperation(
    193    TPM_CC               command           // IN: Command to check
    194    )
    195 {
    196    switch (command)
    197    {
    198        case TPM_CC_NV_Write:
    199        case TPM_CC_NV_Increment:
    200        case TPM_CC_NV_SetBits:
    201        case TPM_CC_NV_Extend:
    202        // Nv write lock counts as a write operation for authorization purposes.
    203        // We check to see if the NV is write locked before we do the authorization
    204        // If it is locked, we fail the command early.
    205        case TPM_CC_NV_WriteLock:
    206            return TRUE;
    207        default:
    208            break;
    209    }
    210    return FALSE;
    211 }
    212 //
    213 //
    214 //           IsReadOperation()
    215 //
    216 //      Checks to see if an operation will write to NV memory
    217 //
    218 BOOL
    219 IsReadOperation(
    220    TPM_CC               command           // IN: Command to check
    221    )
    222 {
    223    switch (command)
    224    {
    225        case TPM_CC_NV_Read:
    226        case TPM_CC_PolicyNV:
    227        case TPM_CC_NV_Certify:
    228        // Nv read lock counts as a read operation for authorization purposes.
    229        // We check to see if the NV is read locked before we do the authorization
    230        // If it is locked, we fail the command early.
    231        case TPM_CC_NV_ReadLock:
    232            return TRUE;
    233        default:
    234            break;
    235    }
    236    return FALSE;
    237 }
    238 //
    239 //
    240 //          CommandCapGetCCList()
    241 //
    242 //      This function returns a list of implemented commands and command attributes starting from the
    243 //      command in commandCode.
    244 //
    245 //
    246 //
    247 //
    248 //      Return Value                      Meaning
    249 //
    250 //      YES                               more command attributes are available
    251 //      NO                                no more command attributes are available
    252 //
    253 TPMI_YES_NO
    254 CommandCapGetCCList(
    255      TPM_CC            commandCode,         // IN: start command code
    256      UINT32            count,               // IN: maximum count for number of entries in
    257                                             //     'commandList'
    258      TPML_CCA         *commandList          // OUT: list of TPMA_CC
    259      )
    260 {
    261      TPMI_YES_NO       more = NO;
    262      UINT32            i;
    263      // initialize output handle list count
    264      commandList->count = 0;
    265      // The maximum count of commands that may be return is MAX_CAP_CC.
    266      if(count > MAX_CAP_CC) count = MAX_CAP_CC;
    267      // If the command code is smaller than TPM_CC_FIRST, start from TPM_CC_FIRST
    268      if(commandCode < TPM_CC_FIRST) commandCode = TPM_CC_FIRST;
    269      // Collect command attributes
    270      for(i = commandCode; i <= TPM_CC_LAST; i++)
    271      {
    272          if(CommandIsImplemented(i))
    273          {
    274              if(commandList->count < count)
    275              {
    276                  // If the list is not full, add the attributes for this command.
    277                  commandList->commandAttributes[commandList->count]
    278                      = CommandGetAttribute(i);
    279                  commandList->count++;
    280              }
    281              else
    282              {
    283                  // If the list is full but there are more commands to report,
    284                  // indicate this and return.
    285                  more = YES;
    286                  break;
    287              }
    288          }
    289      }
    290      return more;
    291 }
    292