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