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
183
|
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/usr/secureboot/trusted/base/trustedbootMsg.H $ */
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2016,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
/* You may obtain a copy of the License at */
/* */
/* http://www.apache.org/licenses/LICENSE-2.0 */
/* */
/* Unless required by applicable law or agreed to in writing, software */
/* distributed under the License is distributed on an "AS IS" BASIS, */
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
/* implied. See the License for the specific language governing */
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
/**
* @file trustedbootMsg.H
*
* @brief Trustedboot Message
*
*/
#ifndef __TRUSTEDBOOTMSG_H
#define __TRUSTEDBOOTMSG_H
// -----------------------------------------------
// Includes
// -----------------------------------------------
#include <errl/errlentry.H>
#include <sys/msg.h>
#include "../trustedTypes.H"
namespace TRUSTEDBOOT
{
/// Message mode
enum MessageMode
{
MSG_MODE_SYNC,
MSG_MODE_ASYNC
};
/// Message Command type
enum MessageType
{
MSG_TYPE_NOOP,
MSG_TYPE_PCREXTEND,
MSG_TYPE_SEPARATOR,
MSG_TYPE_SHUTDOWN,
MSG_TYPE_INIT_BACKUP_TPM,
MSG_TYPE_GETRANDOM,
MSG_TYPE_LAST = MSG_TYPE_GETRANDOM,
};
/// PCREXTEND message data
struct PcrExtendMsgData
{
TPM_Pcr mPcrIndex;
TPM_Alg_Id mAlgId;
EventTypes mEventType;
size_t mDigestSize;
uint8_t mDigest[TPM_ALG_SHA256_SIZE];
char mLogMsg[MAX_TPM_LOG_MSG];
const TpmTarget* mSingleTpm;
bool mMirrorToLog;
};
struct GetRandomMsgData
{
TARGETING::Target* i_pTpm; // the TPM to obtain random data from
uint64_t o_randNum; // the random data is populated here
};
// Trustedboot message class
class Message
{
public:
/// @brief Static factory
/// @param[in] i_type Trustedboot TYPE
/// @param[in] i_len Byte length of i_data
/// @param[in] i_data The data as required by the specific command
/// @param[in] i_mode Message mode
static Message* factory(MessageType i_type = MSG_TYPE_NOOP,
size_t i_len = 0,
uint8_t* i_data = NULL,
MessageMode i_mode = MSG_MODE_SYNC);
/// @brief Constructor
/// @param[in] i_type Message type
/// @param[in] i_len Byte length of i_data
/// @param[in] i_data The data as required by the specific command
/// @param[in] i_mode Message mode
Message(MessageType i_type = MSG_TYPE_NOOP,
size_t i_len = 0,
uint8_t* i_data = NULL,
MessageMode i_mode = MSG_MODE_SYNC);
/// @brief Message dtor
virtual ~Message(void)
{
if (NULL != iv_data)
{
delete[] iv_data;
iv_data = NULL;
}
// Do NOT delete iv_errl here. For synchronous messages
// iv_errl is returned to the caller to commit and for
// asynchronous messages the error log is committed
// during the response processing
msg_free(iv_msg);
}
/// @brief complete the processing when a response arrives
virtual void response(msg_q_t i_msgQ) = 0;
msg_t* iv_msg; ///< Pointer back to our msg_q msg_t
errlHndl_t iv_errl; ///< Pointer to the errlHandl_t if needed
size_t iv_len; ///< Data Length
MessageMode iv_mode; ///< Message Mode
uint8_t* iv_data; ///< Pointer to the message data
private:
// Disallow copying this class. Should suffice for disabling copy for
// all subclasses too.
Message& operator=(const Message&);
Message(const Message&);
};
/// Trustedboot synchronous message
class SyncMessage : public Message
{
public:
/// @brief Constructor
/// @param[in] i_type Trustedboot TYPE
/// @param[in] i_len Byte length of i_data
/// @param[in] i_data The data as required by the specific command
SyncMessage(MessageType i_type = MSG_TYPE_NOOP,
size_t i_len = 0,
uint8_t* i_data = NULL);
/// @brief Dtor
virtual ~SyncMessage(void)
{
}
/// @brief complete the processing when a response arrives
virtual void response(msg_q_t i_msgQ);
};
/// Trustedboot asynchronous message
class AsyncMessage : public Message
{
public:
/// @brief Constructor
/// @param[in] i_type Trustedboot TYPE
/// @param[in] i_len Byte length of i_data
/// @param[in] i_data The data as required by the specific command
AsyncMessage(MessageType i_type = MSG_TYPE_NOOP,
size_t i_len = 0,
uint8_t* i_data = NULL);
/// @brief Dtor
virtual ~AsyncMessage(void)
{
}
/// @brief complete the processing when a response arrives
virtual void response(msg_q_t i_msgQ);
};
};
#endif
|