Tadeusz Struk | 7c72dd4 | 2018-02-01 14:18:23 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (c) 2018, Intel Corporation |
| 3 | * |
| 4 | * Redistribution and use in source and binary forms, with or without |
| 5 | * modification, are permitted provided that the following conditions are met: |
| 6 | * |
| 7 | * 1. Redistributions of source code must retain the above copyright notice, |
| 8 | * this list of conditions and the following disclaimer. |
| 9 | * |
| 10 | * 2. Redistributions in binary form must reproduce the above copyright notice, |
| 11 | * this list of conditions and the following disclaimer in the documentation |
| 12 | * and/or other materials provided with the distribution. |
| 13 | * |
| 14 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| 15 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 16 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 17 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
| 18 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| 19 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| 20 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| 21 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| 22 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| 23 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| 24 | * THE POSSIBILITY OF SUCH DAMAGE. |
| 25 | */ |
| 26 | #include <inttypes.h> |
Philip Tricca | 910f17c | 2018-03-15 12:38:37 -0700 | [diff] [blame] | 27 | #include <stdlib.h> |
| 28 | #include <string.h> |
| 29 | |
| 30 | #include "tss2_mu.h" |
| 31 | #include "tss2_sys.h" |
Tadeusz Struk | 7c72dd4 | 2018-02-01 14:18:23 -0800 | [diff] [blame] | 32 | |
| 33 | #define LOGMODULE test |
Philip Tricca | a7c51ce | 2018-03-10 18:28:25 -0800 | [diff] [blame] | 34 | #include "util/log.h" |
Tadeusz Struk | 7c72dd4 | 2018-02-01 14:18:23 -0800 | [diff] [blame] | 35 | #include "sapi-util.h" |
| 36 | |
| 37 | TSS2_RC |
| 38 | test_invoke (TSS2_SYS_CONTEXT *sapi_context) |
| 39 | { |
| 40 | TSS2_RC rc = TSS2_RC_SUCCESS; |
| 41 | TPM2B_SENSITIVE_CREATE in_sensitive = { 0 }; |
Tadeusz Struk | 2d4f8f7 | 2018-02-27 16:14:00 -0800 | [diff] [blame] | 42 | TPMT_PUBLIC in_public = { 0 }; |
| 43 | TPM2B_TEMPLATE public_template = { 0 }; |
Tadeusz Struk | 7c72dd4 | 2018-02-01 14:18:23 -0800 | [diff] [blame] | 44 | TPM2B_PRIVATE out_private = { 0 }; |
| 45 | TPM2B_PUBLIC out_public = { 0 }; |
| 46 | TPM2B_NAME name = TPM2B_NAME_INIT; |
| 47 | TPM2B_NAME qualified_name = TPM2B_NAME_INIT; |
| 48 | TPM2_HANDLE object_handle = 0; |
| 49 | TSS2L_SYS_AUTH_COMMAND auth_cmd = { |
| 50 | .auths = {{ .sessionHandle = TPM2_RS_PW }}, |
| 51 | .count = 1 |
| 52 | }; |
| 53 | TSS2L_SYS_AUTH_RESPONSE auth_rsp = { |
| 54 | .count = 0 |
| 55 | }; |
| 56 | |
| 57 | if (sapi_context == NULL) |
| 58 | return TSS2_RC_LAYER_MASK | TSS2_BASE_RC_BAD_REFERENCE; |
| 59 | |
Tadeusz Struk | 2d4f8f7 | 2018-02-27 16:14:00 -0800 | [diff] [blame] | 60 | in_public.type = TPM2_ALG_RSA; |
| 61 | in_public.nameAlg = TPM2_ALG_SHA256; |
| 62 | in_public.objectAttributes |= TPMA_OBJECT_RESTRICTED; |
| 63 | in_public.objectAttributes |= TPMA_OBJECT_USERWITHAUTH; |
| 64 | in_public.objectAttributes |= TPMA_OBJECT_DECRYPT; |
| 65 | in_public.objectAttributes |= TPMA_OBJECT_FIXEDTPM; |
| 66 | in_public.objectAttributes |= TPMA_OBJECT_FIXEDPARENT; |
| 67 | in_public.objectAttributes |= TPMA_OBJECT_SENSITIVEDATAORIGIN; |
| 68 | in_public.parameters.rsaDetail.symmetric.algorithm = TPM2_ALG_AES; |
| 69 | in_public.parameters.rsaDetail.symmetric.keyBits.aes = 128; |
| 70 | in_public.parameters.rsaDetail.symmetric.mode.aes = TPM2_ALG_CFB; |
| 71 | in_public.parameters.rsaDetail.scheme.scheme = TPM2_ALG_NULL; |
| 72 | in_public.parameters.rsaDetail.keyBits = 2048; |
Tadeusz Struk | 7c72dd4 | 2018-02-01 14:18:23 -0800 | [diff] [blame] | 73 | |
Tadeusz Struk | 2d4f8f7 | 2018-02-27 16:14:00 -0800 | [diff] [blame] | 74 | uint8_t public_buf[sizeof(in_public)] = {0}; |
| 75 | size_t offset = 0; |
| 76 | |
| 77 | rc = Tss2_MU_TPMT_PUBLIC_Marshal(&in_public, public_buf, |
| 78 | sizeof(in_public), &offset); |
| 79 | if (rc != TPM2_RC_SUCCESS) { |
| 80 | LOG_ERROR("Tss2_MU_TPMT_PUBLIC_Marshal FAILED! Response Code: 0x%x", rc); |
| 81 | exit(1); |
| 82 | } |
| 83 | public_template.size = offset; |
| 84 | memcpy(public_template.buffer, public_buf, offset); |
Tadeusz Struk | 7c72dd4 | 2018-02-01 14:18:23 -0800 | [diff] [blame] | 85 | /* Create an object using CreateLoaded. |
| 86 | * The result should be that the created object |
| 87 | * stays in the TPM |
| 88 | */ |
| 89 | LOG_INFO("Calling CreateLoaded"); |
| 90 | rc = Tss2_Sys_CreateLoaded (sapi_context, |
| 91 | TPM2_RH_OWNER, |
| 92 | &auth_cmd, |
| 93 | &in_sensitive, |
Tadeusz Struk | 2d4f8f7 | 2018-02-27 16:14:00 -0800 | [diff] [blame] | 94 | &public_template, |
Tadeusz Struk | 7c72dd4 | 2018-02-01 14:18:23 -0800 | [diff] [blame] | 95 | &object_handle, |
| 96 | &out_private, |
| 97 | &out_public, |
| 98 | &name, |
| 99 | &auth_rsp); |
| 100 | if (rc == TPM2_RC_SUCCESS) { |
| 101 | LOG_INFO("success object handle: 0x%x", object_handle); |
| 102 | } else { |
| 103 | LOG_ERROR("CreateLoaded FAILED! Response Code : 0x%x", rc); |
| 104 | exit(1); |
| 105 | } |
| 106 | |
| 107 | memset(&out_public, '\0', sizeof(out_public)); |
| 108 | memset(&name, '\0', sizeof(name)); |
| 109 | |
| 110 | /* Check if the object is really loaded by accessing its |
| 111 | * public area */ |
| 112 | LOG_INFO("Calling ReadPublic"); |
| 113 | rc = Tss2_Sys_ReadPublic (sapi_context, |
| 114 | object_handle, |
| 115 | NULL, |
| 116 | &out_public, |
| 117 | &name, |
| 118 | &qualified_name, |
| 119 | NULL); |
| 120 | if (rc == TPM2_RC_SUCCESS) { |
| 121 | LOG_INFO("success! Object's qualified name is:"); |
| 122 | LOGBLOB_INFO(qualified_name.name, qualified_name.size, "%s", "name:"); |
| 123 | } else { |
| 124 | LOG_ERROR("Tss2_Sys_ReadPublic FAILED! Response Code : 0x%x", rc); |
| 125 | exit(1); |
| 126 | } |
| 127 | |
| 128 | rc = Tss2_Sys_FlushContext (sapi_context, object_handle); |
| 129 | if (rc != TSS2_RC_SUCCESS) { |
| 130 | LOG_ERROR("Tss2_Sys_FlushContext failed: 0x%" PRIx32, rc); |
| 131 | exit(1); |
| 132 | } |
| 133 | |
| 134 | return rc; |
| 135 | } |