Coverage Report

Created: 2026-07-16 06:51

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libtpms/src/tpm2/LibtpmsCallbacks.c
Line
Count
Source
1
// SPDX-License-Identifier: BSD-2-Clause
2
3
// (c) Copyright IBM Corporation 2018.
4
5
#include <stdint.h>
6
#include <string.h>
7
8
#include "Platform.h"
9
#include "LibtpmsCallbacks.h"
10
#include "NVMarshal.h"
11
12
#define TPM_HAVE_TPM2_DECLARATIONS
13
#include "tpm_library_intern.h"
14
#include "tpm_error.h"
15
#include "tpm_nvfilename.h"
16
17
int libtpms_plat__NVEnable(void)
18
17.8k
{
19
17.8k
    unsigned char*            data   = NULL;
20
17.8k
    uint32_t                  length = 0;
21
17.8k
    struct libtpms_callbacks* cbs    = TPMLIB_GetCallbacks();
22
17.8k
    TPM_RC                    rc;
23
17.8k
    bool                      is_empty_state;
24
25
    /* try to get state blob set via TPMLIB_SetState() */
26
17.8k
    GetCachedState(TPMLIB_STATE_PERMANENT, &data, &length, &is_empty_state);
27
17.8k
    if(is_empty_state)
28
0
    {
29
0
        memset(s_NV, 0, NV_MEMORY_SIZE);
30
0
        return 0;
31
0
    }
32
33
17.8k
    if(data == NULL && cbs->tpm_nvram_loaddata)
34
11.9k
    {
35
11.9k
        uint32_t    tpm_number = 0;
36
11.9k
        const char* name       = TPM_PERMANENT_ALL_NAME;
37
11.9k
        TPM_RESULT  ret;
38
39
11.9k
        ret = cbs->tpm_nvram_loaddata(&data, &length, tpm_number, name);
40
11.9k
        switch(ret)
41
11.9k
        {
42
5.95k
            case TPM_RETRY:
43
5.95k
                if(!cbs->tpm_nvram_storedata)
44
0
                {
45
0
                    return -1;
46
0
                }
47
5.95k
                memset(s_NV, 0, NV_MEMORY_SIZE);
48
5.95k
                return 0;
49
50
5.95k
            case TPM_SUCCESS:
51
                /* got the data -- unmarshal them... */
52
5.95k
                break;
53
54
0
            case TPM_FAIL:
55
0
            default:
56
0
                return -1;
57
11.9k
        }
58
11.9k
    }
59
60
11.9k
    if(data)
61
11.9k
    {
62
11.9k
        unsigned char* buffer = data;
63
11.9k
        INT32          size   = length;
64
65
11.9k
        rc                    = PERSISTENT_ALL_Unmarshal(&buffer, &size);
66
11.9k
        free(data);
67
11.9k
        if(rc != TPM_RC_SUCCESS)
68
0
            return -1;
69
11.9k
        return 0;
70
11.9k
    }
71
0
    return LIBTPMS_CALLBACK_FALLTHROUGH; /* -2 */
72
11.9k
}
73
74
int libtpms_plat__NVDisable(void)
75
11.9k
{
76
11.9k
    struct libtpms_callbacks* cbs = TPMLIB_GetCallbacks();
77
78
11.9k
    if(cbs->tpm_nvram_loaddata)
79
11.9k
        return 0;
80
0
    return LIBTPMS_CALLBACK_FALLTHROUGH; /* -2 */
81
11.9k
}
82
83
int libtpms_plat__IsNvAvailable(void)
84
17.8k
{
85
17.8k
    struct libtpms_callbacks* cbs = TPMLIB_GetCallbacks();
86
87
17.8k
    if(cbs->tpm_nvram_loaddata && cbs->tpm_nvram_storedata)
88
17.8k
    {
89
17.8k
        return 1;
90
17.8k
    }
91
0
    return LIBTPMS_CALLBACK_FALLTHROUGH; /* -2 */
92
17.8k
}
93
94
int libtpms_plat__NvCommit(void)
95
18.0k
{
96
18.0k
    struct libtpms_callbacks* cbs = TPMLIB_GetCallbacks();
97
98
18.0k
    if(cbs->tpm_nvram_storedata)
99
18.0k
    {
100
18.0k
        uint32_t    tpm_number = 0;
101
18.0k
        const char* name       = TPM_PERMANENT_ALL_NAME;
102
18.0k
        TPM_RESULT  ret;
103
18.0k
        BYTE*       buf;
104
18.0k
        uint32_t    buflen;
105
106
18.0k
        ret = TPM2_PersistentAllStore(&buf, &buflen);
107
18.0k
        if(ret != TPM_SUCCESS)
108
0
            return ret;
109
110
18.0k
        ret = cbs->tpm_nvram_storedata(buf, buflen, tpm_number, name);
111
18.0k
        free(buf);
112
18.0k
        if(ret == TPM_SUCCESS)
113
18.0k
            return 0;
114
115
0
        return -1;
116
18.0k
    }
117
0
    return LIBTPMS_CALLBACK_FALLTHROUGH; /* -2 */
118
18.0k
}
119
120
int libtpms_plat__PhysicalPresenceAsserted(BOOL* pp)
121
1
{
122
1
    struct libtpms_callbacks* cbs = TPMLIB_GetCallbacks();
123
124
1
    if(cbs->tpm_io_getphysicalpresence)
125
1
    {
126
1
        uint32_t      tpm_number = 0;
127
1
        TPM_RESULT    res;
128
1
        unsigned char mypp;
129
130
1
        res = cbs->tpm_io_getphysicalpresence(&mypp, tpm_number);
131
1
        if(res == TPM_SUCCESS)
132
1
        {
133
1
            *pp = mypp;
134
1
            return 0;
135
1
        }
136
1
    }
137
0
    return LIBTPMS_CALLBACK_FALLTHROUGH;
138
1
}