Coverage Report

Created: 2025-07-09 06:07

/src/tpm2/AlgorithmCap.c
Line
Count
Source (jump to first uncovered line)
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 "InternalRoutines.h"
9
typedef struct
10
{
11
   TPM_ALG_ID          algID;
12
   TPMA_ALGORITHM      attributes;
13
} ALGORITHM;
14
static const ALGORITHM    s_algorithms[]      =
15
{
16
#ifdef TPM_ALG_RSA
17
   {TPM_ALG_RSA,           {1, 0, 0, 1,       0, 0, 0, 0, 0}},
18
#endif
19
#ifdef TPM_ALG_DES
20
   {TPM_ALG_DES,           {0, 1, 0, 0,       0, 0, 0, 0, 0}},
21
#endif
22
#ifdef TPM_ALG_3DES
23
   {TPM_ALG__3DES,         {0, 1, 0, 0,       0, 0, 0, 0, 0}},
24
#endif
25
#ifdef TPM_ALG_SHA1
26
   {TPM_ALG_SHA1,          {0, 0, 1, 0,       0, 0, 0, 0, 0}},
27
#endif
28
#ifdef TPM_ALG_HMAC
29
   {TPM_ALG_HMAC,          {0, 0, 1, 0,       0, 1, 0, 0, 0}},
30
#endif
31
#ifdef TPM_ALG_AES
32
   {TPM_ALG_AES,           {0, 1, 0, 0,       0, 0, 0, 0, 0}},
33
#endif
34
#ifdef TPM_ALG_MGF1
35
   {TPM_ALG_MGF1,          {0, 0, 1, 0,       0, 0, 0, 1, 0}},
36
#endif
37
     {TPM_ALG_KEYEDHASH,         {0, 0, 1, 1, 0, 1, 1, 0, 0}},
38
#ifdef TPM_ALG_XOR
39
   {TPM_ALG_XOR,                 {0, 1, 1, 0, 0, 0, 0, 0, 0}},
40
#endif
41
#ifdef TPM_ALG_SHA256
42
   {TPM_ALG_SHA256,              {0, 0, 1, 0, 0, 0, 0, 0, 0}},
43
#endif
44
#ifdef TPM_ALG_SHA384
45
   {TPM_ALG_SHA384,              {0, 0, 1, 0, 0, 0, 0, 0, 0}},
46
#endif
47
#ifdef TPM_ALG_SHA512
48
   {TPM_ALG_SHA512,              {0, 0, 1, 0, 0, 0, 0, 0, 0}},
49
#endif
50
#ifdef TPM_ALG_WHIRLPOOL512
51
   {TPM_ALG_WHIRLPOOL512,        {0, 0, 1, 0, 0, 0, 0, 0, 0}},
52
#endif
53
#ifdef TPM_ALG_SM3_256
54
   {TPM_ALG_SM3_256,             {0, 0, 1, 0, 0, 0, 0, 0, 0}},
55
#endif
56
#ifdef TPM_ALG_SM4
57
   {TPM_ALG_SM4,          {0, 1, 0, 0, 0, 0, 0, 0, 0}},
58
#endif
59
#ifdef TPM_ALG_RSASSA
60
   {TPM_ALG_RSASSA,        {1, 0, 0, 0, 0, 1, 0, 0, 0}},
61
#endif
62
#ifdef TPM_ALG_RSAES
63
   {TPM_ALG_RSAES,         {1, 0, 0, 0, 0, 0, 1, 0, 0}},
64
#endif
65
#ifdef TPM_ALG_RSAPSS
66
   {TPM_ALG_RSAPSS,        {1, 0, 0, 0, 0, 1, 0, 0, 0}},
67
#endif
68
#ifdef TPM_ALG_OAEP
69
   {TPM_ALG_OAEP,          {1, 0, 0, 0, 0, 0, 1, 0, 0}},
70
#endif
71
#ifdef TPM_ALG_ECDSA
72
   {TPM_ALG_ECDSA,         {1, 0, 0, 0, 0, 1, 0, 1, 0}},
73
#endif
74
#ifdef TPM_ALG_ECDH
75
   {TPM_ALG_ECDH,          {1, 0, 0, 0, 0, 0, 0, 1, 0}},
76
#endif
77
#ifdef TPM_ALG_ECDAA
78
   {TPM_ALG_ECDAA,         {1, 0, 0, 0, 0, 1, 0, 0, 0}},
79
#endif
80
#ifdef TPM_ALG_ECSCHNORR
81
   {TPM_ALG_ECSCHNORR,     {1, 0, 0, 0, 0, 1, 0, 0, 0}},
82
#endif
83
#ifdef TPM_ALG_KDF1_SP800_56A
84
   {TPM_ALG_KDF1_SP800_56A,{0, 0, 1, 0, 0, 0, 0, 1, 0}},
85
#endif
86
#ifdef TPM_ALG_KDF2
87
   {TPM_ALG_KDF2,          {0, 0, 1, 0, 0, 0, 0, 1, 0}},
88
#endif
89
#ifdef TPM_ALG_KDF1_SP800_108
90
   {TPM_ALG_KDF1_SP800_108,{0, 0, 1, 0, 0, 0, 0, 1, 0}},
91
#endif
92
#ifdef TPM_ALG_ECC
93
   {TPM_ALG_ECC,           {1, 0, 0, 1, 0, 0, 0, 0, 0}},
94
#endif
95
   {TPM_ALG_SYMCIPHER,           {0, 0, 0, 1, 0, 0, 0, 0, 0}},
96
#ifdef TPM_ALG_CTR
97
   {TPM_ALG_CTR,                 {0, 1, 0, 0, 0, 0, 1, 0, 0}},
98
#endif
99
#ifdef TPM_ALG_OFB
100
   {TPM_ALG_OFB,                 {0, 1, 0, 0, 0, 0, 1, 0, 0}},
101
#endif
102
#ifdef TPM_ALG_CBC
103
   {TPM_ALG_CBC,                 {0, 1, 0, 0, 0, 0, 1, 0, 0}},
104
#endif
105
#ifdef TPM_ALG_CFB
106
   {TPM_ALG_CFB,                 {0, 1, 0, 0, 0, 0, 1, 0, 0}},
107
#endif
108
#ifdef TPM_ALG_ECB
109
   {TPM_ALG_ECB,                 {0, 1, 0, 0, 0, 0, 1, 0, 0}},
110
#endif
111
};
112
//
113
//
114
//          AlgorithmCapGetImplemented()
115
//
116
//      This function is used by TPM2_GetCapability() to return a list of the implemented algorithms.
117
//
118
//
119
//
120
//
121
//      Return Value                      Meaning
122
//
123
//      YES                               more algorithms to report
124
//      NO                                no more algorithms to report
125
//
126
TPMI_YES_NO
127
AlgorithmCapGetImplemented(
128
     TPM_ALG_ID                          algID,         // IN: the starting algorithm ID
129
     UINT32                              count,         // IN: count of returned algorithms
130
     TPML_ALG_PROPERTY                  *algList        // OUT: algorithm list
131
)
132
0
{
133
0
     TPMI_YES_NO      more = NO;
134
0
     UINT32           i;
135
0
     UINT32           algNum;
136
     // initialize output algorithm list
137
0
     algList->count = 0;
138
     // The maximum count of algorithms we may return is MAX_CAP_ALGS.
139
0
     if(count > MAX_CAP_ALGS)
140
0
         count = MAX_CAP_ALGS;
141
     // Compute how many algorithms are defined in s_algorithms array.
142
0
     algNum = sizeof(s_algorithms) / sizeof(s_algorithms[0]);
143
     // Scan the implemented algorithm list to see if there is a match to 'algID'.
144
0
     for(i = 0; i < algNum; i++)
145
0
     {
146
         // If algID is less than the starting algorithm ID, skip it
147
0
         if(s_algorithms[i].algID < algID)
148
0
              continue;
149
0
         if(algList->count < count)
150
0
         {
151
              // If we have not filled up the return list, add more algorithms
152
              // to it
153
0
              algList->algProperties[algList->count].alg = s_algorithms[i].algID;
154
0
              algList->algProperties[algList->count].algProperties =
155
0
                  s_algorithms[i].attributes;
156
0
              algList->count++;
157
0
         }
158
0
         else
159
0
         {
160
              // If the return list is full but we still have algorithms
161
              // available, report this and stop scanning.
162
0
              more = YES;
163
0
              break;
164
0
         }
165
0
     }
166
0
     return more;
167
0
}
168
LIB_EXPORT
169
void
170
AlgorithmGetImplementedVector(
171
     ALGORITHM_VECTOR      *implemented            // OUT: the implemented bits are SET
172
     )
173
444
{
174
444
     int                            index;
175
     // Nothing implemented until we say it is
176
444
     MemorySet(implemented, 0, sizeof(ALGORITHM_VECTOR));
177
444
     for(index = (sizeof(s_algorithms) / sizeof(s_algorithms[0])) - 1;
178
12.4k
         index >= 0;
179
11.9k
         index--)
180
11.9k
             SET_BIT(s_algorithms[index].algID, *implemented);
181
444
     return;
182
444
}