Initial commit to seed TPM2.0 source code directory

LICENSE file text copied from TCG library specification. README
describes the procedure used to extract source code from parts 3 and 4
of the specification.

The python scripts and part{34}.txt files will be removed in the
following commits.

Change-Id: Ie281e6e988481831f33483053455e8aff8f3f75f
Signed-off-by: Vadim Bendebury <[email protected]>
diff --git a/CommandCodeAttributes.c b/CommandCodeAttributes.c
new file mode 100644
index 0000000..bf50bbc
--- /dev/null
+++ b/CommandCodeAttributes.c
@@ -0,0 +1,289 @@
+// This file was extracted from the TCG Published
+// Trusted Platform Module Library
+// Part 4: Supporting Routines
+// Family "2.0"
+// Level 00 Revision 01.16
+// October 30, 2014
+
+#include    "Tpm.h"
+#include    "InternalRoutines.h"
+typedef UINT16          ATTRIBUTE_TYPE;
+//
+//     The following file is produced from the command tables in part 3 of the specification. It defines the
+//     attributes for each of the commands.
+//
+//     NOTE:           This file is currently produced by an automated process. Files produced from Part 2 or Part 3 tables through
+//                     automated processes are not included in the specification so that their is no ambiguity about the table
+//                     containing the information being the normative definition.
+//
+#include       "CommandAttributeData.c"
+//
+//
+//          Command Attribute Functions
+//
+//          CommandAuthRole()
+//
+//     This function returns the authorization role required of a handle.
+//
+//     Return Value                       Meaning
+//
+//     AUTH_NONE                          no authorization is required
+//     AUTH_USER                          user role authorization is required
+//     AUTH_ADMIN                         admin role authorization is required
+//     AUTH_DUP                           duplication role authorization is required
+//
+AUTH_ROLE
+CommandAuthRole(
+     TPM_CC        commandCode,                 // IN: command code
+     UINT32        handleIndex                  // IN: handle index (zero based)
+     )
+{
+   if(handleIndex > 1)
+       return AUTH_NONE;
+   if(handleIndex == 0) {
+       ATTRIBUTE_TYPE properties = s_commandAttributes[commandCode - TPM_CC_FIRST];
+       if(properties & HANDLE_1_USER) return AUTH_USER;
+       if(properties & HANDLE_1_ADMIN) return AUTH_ADMIN;
+       if(properties & HANDLE_1_DUP) return AUTH_DUP;
+       return AUTH_NONE;
+   }
+   if(s_commandAttributes[commandCode - TPM_CC_FIRST] & HANDLE_2_USER) return
+//     AUTH_USER;
+   return AUTH_NONE;
+}
+//
+//
+//          CommandIsImplemented()
+//
+//     This function indicates if a command is implemented.
+//
+//     Return Value                      Meaning
+//
+//     TRUE                              if the command is implemented
+//     FALSE                             if the command is not implemented
+//
+BOOL
+CommandIsImplemented(
+    TPM_CC                commandCode          // IN: command code
+    )
+{
+    if(commandCode < TPM_CC_FIRST || commandCode > TPM_CC_LAST)
+        return FALSE;
+    if((s_commandAttributes[commandCode - TPM_CC_FIRST] & IS_IMPLEMENTED))
+        return TRUE;
+    else
+        return FALSE;
+}
+//
+//
+//          CommandGetAttribute()
+//
+//     return a TPMA_CC structure for the given command code
+//
+TPMA_CC
+CommandGetAttribute(
+    TPM_CC                commandCode          // IN: command code
+    )
+{
+    UINT32      size = sizeof(s_ccAttr) / sizeof(s_ccAttr[0]);
+    UINT32      i;
+    for(i = 0; i < size; i++) {
+        if(s_ccAttr[i].commandIndex == (UINT16) commandCode)
+            return s_ccAttr[i];
+    }
+    // This function should be called in the way that the command code
+    // attribute is available.
+    FAIL(FATAL_ERROR_INTERNAL);
+}
+//
+//
+//          EncryptSize()
+//
+//     This function returns the size of the decrypt size field. This function returns 0 if encryption is not allowed
+//
+//     Return Value                      Meaning
+//
+//     0                                 encryption not allowed
+//     2                                 size field is two bytes
+//     4                                 size field is four bytes
+//
+int
+EncryptSize(
+    TPM_CC                commandCode          // IN: commandCode
+    )
+{
+    COMMAND_ATTRIBUTES        ca = s_commandAttributes[commandCode - TPM_CC_FIRST];
+    if(ca & ENCRYPT_2)
+        return 2;
+    if(ca & ENCRYPT_4)
+        return 4;
+    return 0;
+}
+//
+//
+//          DecryptSize()
+//
+//     This function returns the size of the decrypt size field. This function returns 0 if decryption is not allowed
+//
+//     Return Value                      Meaning
+//
+//     0                                 encryption not allowed
+//     2                                 size field is two bytes
+//     4                                 size field is four bytes
+//
+int
+DecryptSize(
+    TPM_CC                commandCode          // IN: commandCode
+    )
+{
+    COMMAND_ATTRIBUTES        ca = s_commandAttributes[commandCode - TPM_CC_FIRST];
+    if(ca & DECRYPT_2)
+        return 2;
+    if(ca & DECRYPT_4)
+        return 4;
+    return 0;
+}
+//
+//
+//          IsSessionAllowed()
+//
+//     This function indicates if the command is allowed to have sessions.
+//     This function must not be called if the command is not known to be implemented.
+//
+//     Return Value                      Meaning
+//
+//     TRUE                              session is allowed with this command
+//     FALSE                             session is not allowed with this command
+//
+BOOL
+IsSessionAllowed(
+    TPM_CC                commandCode          // IN: the command to be checked
+    )
+{
+    if(s_commandAttributes[commandCode - TPM_CC_FIRST] & NO_SESSIONS)
+        return FALSE;
+    else
+        return TRUE;
+}
+//
+//
+//          IsHandleInResponse()
+//
+BOOL
+IsHandleInResponse(
+    TPM_CC                commandCode
+    )
+{
+    if(s_commandAttributes[commandCode - TPM_CC_FIRST] & R_HANDLE)
+        return TRUE;
+    else
+        return FALSE;
+//
+}
+//
+//
+//           IsWriteOperation()
+//
+//      Checks to see if an operation will write to NV memory
+//
+BOOL
+IsWriteOperation(
+   TPM_CC               command           // IN: Command to check
+   )
+{
+   switch (command)
+   {
+       case TPM_CC_NV_Write:
+       case TPM_CC_NV_Increment:
+       case TPM_CC_NV_SetBits:
+       case TPM_CC_NV_Extend:
+       // Nv write lock counts as a write operation for authorization purposes.
+       // We check to see if the NV is write locked before we do the authorization
+       // If it is locked, we fail the command early.
+       case TPM_CC_NV_WriteLock:
+           return TRUE;
+       default:
+           break;
+   }
+   return FALSE;
+}
+//
+//
+//           IsReadOperation()
+//
+//      Checks to see if an operation will write to NV memory
+//
+BOOL
+IsReadOperation(
+   TPM_CC               command           // IN: Command to check
+   )
+{
+   switch (command)
+   {
+       case TPM_CC_NV_Read:
+       case TPM_CC_PolicyNV:
+       case TPM_CC_NV_Certify:
+       // Nv read lock counts as a read operation for authorization purposes.
+       // We check to see if the NV is read locked before we do the authorization
+       // If it is locked, we fail the command early.
+       case TPM_CC_NV_ReadLock:
+           return TRUE;
+       default:
+           break;
+   }
+   return FALSE;
+}
+//
+//
+//          CommandCapGetCCList()
+//
+//      This function returns a list of implemented commands and command attributes starting from the
+//      command in commandCode.
+//
+//
+//
+//
+//      Return Value                      Meaning
+//
+//      YES                               more command attributes are available
+//      NO                                no more command attributes are available
+//
+TPMI_YES_NO
+CommandCapGetCCList(
+     TPM_CC            commandCode,         // IN: start command code
+     UINT32            count,               // IN: maximum count for number of entries in
+                                            //     'commandList'
+     TPML_CCA         *commandList          // OUT: list of TPMA_CC
+     )
+{
+     TPMI_YES_NO       more = NO;
+     UINT32            i;
+     // initialize output handle list count
+     commandList->count = 0;
+     // The maximum count of commands that may be return is MAX_CAP_CC.
+     if(count > MAX_CAP_CC) count = MAX_CAP_CC;
+     // If the command code is smaller than TPM_CC_FIRST, start from TPM_CC_FIRST
+     if(commandCode < TPM_CC_FIRST) commandCode = TPM_CC_FIRST;
+     // Collect command attributes
+     for(i = commandCode; i <= TPM_CC_LAST; i++)
+     {
+         if(CommandIsImplemented(i))
+         {
+             if(commandList->count < count)
+             {
+                 // If the list is not full, add the attributes for this command.
+                 commandList->commandAttributes[commandList->count]
+                     = CommandGetAttribute(i);
+                 commandList->count++;
+             }
+             else
+             {
+                 // If the list is full but there are more commands to report,
+                 // indicate this and return.
+                 more = YES;
+                 break;
+             }
+         }
+     }
+     return more;
+}