xref: /titanic_41/usr/src/cmd/lms/heci/PTHICommand.h (revision 657a8c206b913d1ee578fd725f0b25eca5b77253)
1 /*******************************************************************************
2  * Copyright (C) 2004-2008 Intel Corp. All rights reserved.
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  *  - Redistributions of source code must retain the above copyright notice,
8  *    this list of conditions and the following disclaimer.
9  *
10  *  - 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  *  - Neither the name of Intel Corp. nor the names of its
15  *    contributors may be used to endorse or promote products derived from this
16  *    software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corp. OR THE CONTRIBUTORS
22  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  *******************************************************************************/
30 
31 //----------------------------------------------------------------------------
32 //
33 //  File:       PTHICommand.h
34 //
35 //  Contents:   header file of PTHICommand class
36 //
37 //----------------------------------------------------------------------------
38 #ifndef __PTHI_COMMAND_H__
39 #define __PTHI_COMMAND_H__
40 
41 #include "HECIUnix.h"
42 #include "StatusCodeDefinitions.h"
43 #include <list>
44 #include <string>
45 
46 #define CERT_HASH_MAX_LENGTH                    64
47 #define CERT_HASH_MAX_NUMBER                    23
48 #define NET_TLS_CERT_PKI_MAX_SERIAL_NUMS        3
49 #define NET_TLS_CERT_PKI_MAX_SERIAL_NUM_LENGTH  16
50 #define MPS_HOSTNAME_LENGTH                     256
51 
52 /*
53 * Constants
54 */
55 
56 static const UINT32 IDER_LOG_ENTRIES = 16;
57 
58 const UINT8 MAJOR_VERSION = 1;
59 const UINT8 MINOR_VERSION = 1;
60 const UINT8 AMT_MAJOR_VERSION = 1;
61 const UINT8 AMT_MINOR_VERSION = 1;
62 
63 typedef enum _CFG_PROVISIONING_MODE
64 {
65 	CFG_PROVISIONING_MODE_NONE = 0,
66 	CFG_PROVISIONING_MODE_ENTERPRISE,
67 	CFG_PROVISIONING_MODE_SMALL_BUSINESS,
68 	CFG_PROVISIONING_MODE_REMOTE_ASSISTANCE
69 } CFG_PROVISIONING_MODE;
70 
71 typedef enum _AMT_PROVISIONING_STATE
72 {
73 	PROVISIONING_STATE_PRE = 0,
74 	PROVISIONING_STATE_IN = 1,
75 	PROVISIONING_STATE_POST = 2
76 } AMT_PROVISIONING_STATE;
77 
78 typedef enum _AMT_FEATURE_STATE_REQUEST
79 {
80 	REDIRECTION_SESSION = 0,
81 	SYSTEM_DEFENSE = 1,
82 	WEB_UI = 2
83 } AMT_FEATURE_STATE_REQUEST;
84 
85 typedef enum _AMT_LAST_HOST_RESET_REASON
86 {
87 	RemoteControl = 0,
88 	Other = 1
89 } AMT_LAST_HOST_RESET_REASON;
90 
91 typedef enum _AMT_INTERFACE_INDEX
92 {
93 	WIRED = 0,
94 	WIRELESS = 1
95 } AMT_INTERFACE_INDEX;
96 
97 typedef enum _AMT_DHCP_IP_ADDRESS
98 {
99 	ACTIVE = 1,
100 	PASSIVE = 2
101 } AMT_DHCP_IP_MODE;
102 
103 typedef UINT32 CFG_IPv4_ADDRESS;
104 
105 static const UINT32 BIOS_VERSION_LEN = 65;
106 static const UINT32 VERSIONS_NUMBER = 50;
107 static const UINT32 UNICODE_STRING_LEN = 20;
108 
109 typedef enum _AMT_PROVISIONING_TLS_MODE
110 {
111 	NOT_READY = 0,
112 	PSK  = 1,
113 	PKI  = 2
114 } AMT_PROVISIONING_TLS_MODE;
115 
116 typedef enum _AMT_RNG_STATUS
117 {
118 	RNG_STATUS_EXIST  = 0,
119 	RNG_STATUS_IN_PROGRESS = 1,
120 	RNG_STATUS_NOT_EXIST = 2
121 } AMT_RNG_STATUS;
122 
123 #pragma pack(1)
124 
125 typedef struct _AMT_UNICODE_STRING
126 {
127 	UINT16 Length;
128 	UINT8 String[UNICODE_STRING_LEN];
129 } AMT_UNICODE_STRING;
130 
131 typedef struct _AMT_VERSION_TYPE
132 {
133 	AMT_UNICODE_STRING Description;
134 	AMT_UNICODE_STRING Version;
135 } AMT_VERSION_TYPE;
136 
137 typedef struct _PTHI_VERSION
138 {
139 	UINT8 MajorNumber;
140 	UINT8 MinorNumber;
141 } PTHI_VERSION;
142 
143 typedef struct _CODE_VERSIONS
144 {
145 	UINT8 BiosVersion[BIOS_VERSION_LEN];
146 	UINT32 VersionsCount;
147 	AMT_VERSION_TYPE Versions[VERSIONS_NUMBER];
148 } CODE_VERSIONS;
149 
150 typedef struct _COMMAND_FMT
151 {
152 	union
153 	{
154 		UINT32 val;
155 		struct
156 		{
157 			UINT32 Operation : 23;
158 			UINT32 IsResponse : 1;
159 			UINT32 Class : 8;
160 		} fields;
161 	} cmd;
162 
163 } COMMAND_FMT;
164 
165 typedef struct _AMT_ANSI_STRING
166 {
167 	UINT16 Length;
168 	CHAR  *Buffer;
169 } AMT_ANSI_STRING;
170 
171 typedef struct _PTHI_MESSAGE_HEADER
172 {
173 	PTHI_VERSION Version;
174 	UINT16 Reserved;
175 	COMMAND_FMT Command;
176 	UINT32 Length;
177 } PTHI_MESSAGE_HEADER;
178 
179 typedef struct _PTHI_RESPONSE_MESSAGE_HEADER
180 {
181 	PTHI_MESSAGE_HEADER Header;
182 	AMT_STATUS Status;
183 } PTHI_RESPONSE_MESSAGE_HEADER;
184 
185 typedef struct _CFG_GET_CODE_VERSIONS_RESPONSE
186 {
187 	PTHI_RESPONSE_MESSAGE_HEADER Header;
188 	CODE_VERSIONS CodeVersions;
189 } CFG_GET_CODE_VERSIONS_RESPONSE;
190 
191 typedef struct _CFG_GET_PROVISIONING_MODE_RESPONSE
192 {
193 	PTHI_RESPONSE_MESSAGE_HEADER Header;
194 	CFG_PROVISIONING_MODE ProvisioningMode;
195 	AMT_BOOLEAN LegacyMode;
196 } CFG_GET_PROVISIONING_MODE_RESPONSE;
197 
198 typedef struct _CFG_GET_PROVISIONING_STATE_RESPONSE
199 {
200 	PTHI_RESPONSE_MESSAGE_HEADER Header;
201 	AMT_PROVISIONING_STATE ProvisioningState;
202 } CFG_GET_PROVISIONING_STATE_RESPONSE;
203 
204 typedef struct _CFG_GET_FEATURES_STATE_REQUEST
205 {
206 	PTHI_MESSAGE_HEADER Header;
207 	UINT32 RequestID;
208 } CFG_GET_FEATURES_STATE_REQUEST;
209 
210 typedef struct _GET_FEATURES_REDIRECTION_SESSION_STATUS
211 {
212 	AMT_BOOLEAN IderOpen;
213 	AMT_BOOLEAN SolOpen;
214 	AMT_BOOLEAN Reserved;
215 } GET_FEATURES_REDIRECTION_SESSION_STATUS;
216 
217 typedef struct _GET_FEATURES_SYSTEM_DEFENSE_STATE_RESPONSE
218 {
219 	AMT_BOOLEAN SystemDefenseActivated;
220 } GET_FEATURES_SYSTEM_DEFENSE_STATUS_RESPONSE;
221 
222 typedef struct _GET_FEATURES_WEB_UI_STATE_RESPONSE
223 {
224 	AMT_BOOLEAN WebUiEnabled;
225 } GET_FEATURES_WEB_UI_STATUS_RESPONSE;
226 
227 typedef union _FEATURES_STATUS_DATA
228 {
229 	GET_FEATURES_REDIRECTION_SESSION_STATUS rs;
230 	GET_FEATURES_SYSTEM_DEFENSE_STATUS_RESPONSE sd;
231 	GET_FEATURES_WEB_UI_STATUS_RESPONSE webUI;
232 } FEATURES_STATUS_DATA;
233 
234 typedef struct _CFG_GET_FEATURES_STATE_RESPONSE
235 {
236 	PTHI_RESPONSE_MESSAGE_HEADER Header;
237 	UINT32 RequestID;
238 	FEATURES_STATUS_DATA Data;
239 } CFG_GET_FEATURES_STATE_RESPONSE;
240 
241 typedef struct _CFG_GET_CURRENT_POWER_POLICY_REQUEST
242 {
243 	PTHI_MESSAGE_HEADER Header;
244 } CFG_GET_CURRENT_POWER_POLICY_REQUEST;
245 
246 typedef struct _CFG_GET_CURRENT_POWER_POLICY_RESPONSE
247 {
248 	PTHI_RESPONSE_MESSAGE_HEADER Header;
249 	AMT_ANSI_STRING PolicyName;
250 } CFG_GET_CURRENT_POWER_POLICY_RESPONSE;
251 
252 typedef struct _CFG_GET_LAST_HOST_RESET_REASON_REQUEST
253 {
254 	PTHI_MESSAGE_HEADER Header;
255 } CFG_GET_LAST_HOST_RESET_REASON_REQUEST;
256 
257 typedef struct _CFG_GET_LAST_HOST_RESET_REASON_RESPONSE
258 {
259 	PTHI_RESPONSE_MESSAGE_HEADER Header;
260 	UINT32 Reason;
261 	UINT32 RemoteControlTimeStamp;
262 } CFG_GET_LAST_HOST_RESET_REASON_RESPONSE;
263 
264 typedef struct _LAN_SETTINGS
265 {
266 	AMT_BOOLEAN Enabled;
267 	CFG_IPv4_ADDRESS Ipv4Address;
268 	AMT_BOOLEAN DhcpEnabled;
269 	UINT8 DhcpIpMode;
270 	UINT8 LinkStatus;
271 	UINT8 MacAddress[6];
272 } LAN_SETTINGS;
273 
274 typedef struct _CFG_GET_LAN_INTERFACE_SETTINGS_REQUEST
275 {
276 	PTHI_MESSAGE_HEADER Header;
277 	UINT32 InterfaceIndex;
278 } CFG_GET_LAN_INTERFACE_SETTINGS_REQUEST;
279 
280 typedef struct _CFG_GET_LAN_INTERFACE_SETTINGS_RESPONSE
281 {
282 	PTHI_RESPONSE_MESSAGE_HEADER Header;
283 	AMT_BOOLEAN Enabled;
284 	CFG_IPv4_ADDRESS Ipv4Address;
285 	AMT_BOOLEAN DhcpEnabled;
286 	UINT8 DhcpIpMode;
287 	UINT8 LinkStatus;
288 	UINT8 MacAddress[6];
289 } CFG_GET_LAN_INTERFACE_SETTINGS_RESPONSE;
290 
291 typedef struct _CFG_GET_SECURITY_PARAMETERS_REQUEST
292 {
293 	PTHI_MESSAGE_HEADER Header;
294 } CFG_GET_SECURITY_PARAMETERS_REQUEST;
295 
296 typedef struct _CFG_GET_SECURITY_PARAMETERS_RESPONSE
297 {
298 	PTHI_RESPONSE_MESSAGE_HEADER Header;
299 	AMT_BOOLEAN EnterpriseMode;
300 	AMT_BOOLEAN TLSEnabled;
301 	AMT_BOOLEAN HWCryptoEnabled;
302 	AMT_PROVISIONING_STATE ProvisioningState;
303 	AMT_BOOLEAN NetworkInterfaceEnabled;
304 	AMT_BOOLEAN SOLEnabled;
305 	AMT_BOOLEAN IDEREnabled;
306 	AMT_BOOLEAN FWUpdateEnabled;
307 	AMT_BOOLEAN LinkIsUp;
308 	AMT_BOOLEAN Reserved[8];
309 } CFG_GET_SECURITY_PARAMETERS_RESPONSE;
310 
311 typedef struct _CFG_GET_DNS_SUFFIX_LIST_REQUEST
312 {
313 	PTHI_MESSAGE_HEADER Header;
314 } CFG_GET_DNS_SUFFIX_LIST_REQUEST;
315 
316 typedef struct _CFG_GET_DNS_SUFFIX_LIST_RESPONSE
317 {
318 	PTHI_RESPONSE_MESSAGE_HEADER Header;
319 	UINT16 DataLength;
320 	UINT8 Data[0];
321 } CFG_GET_DNS_SUFFIX_LIST_RESPONSE;
322 
323 /**
324  * CFG_SET_ENTERPRISE_ACCESS_REQUEST
325  *
326  * Flags	Bit 0 - If this bit is set then HostIPAddress is IPv6, otherwise HostIPAddress is IPv4 address.
327  *          Bits 1..7 - Reserved, should be zero.
328  * HostIPAddress	IPv4 / IPv6 address
329  * EnterpriseAccess	1 if LMS has access to enterprise network, otherwise 0.
330  */
331 typedef struct _CFG_SET_ENTERPRISE_ACCESS_REQUEST
332 {
333 	PTHI_MESSAGE_HEADER Header;
334 	UINT8 Flags;
335 	UINT8 HostIPAddress[16];
336 	UINT8 EnterpriseAccess;
337 } CFG_SET_ENTERPRISE_ACCESS_REQUEST;
338 
339 typedef struct _CFG_SET_ENTERPRISE_ACCESS_RESPONSE
340 {
341 	PTHI_RESPONSE_MESSAGE_HEADER Header;
342 } CFG_SET_ENTERPRISE_ACCESS_RESPONSE;
343 
344 typedef struct _CFG_OPEN_USER_INITIATED_CONNECTION_REQUEST
345 {
346 	PTHI_MESSAGE_HEADER     Header;
347 } CFG_OPEN_USER_INITIATED_CONNECTION_REQUEST;
348 
349 typedef struct _CFG_OPEN_USER_INITIATED_CONNECTION_RESPONSE
350 {
351 	PTHI_RESPONSE_MESSAGE_HEADER     Header;
352 } CFG_OPEN_USER_INITIATED_CONNECTION_RESPONSE;
353 
354 typedef struct _CFG_CLOSE_USER_INITIATED_CONNECTION_REQUEST
355 {
356 	PTHI_MESSAGE_HEADER     Header;
357 } CFG_CLOSE_USER_INITIATED_CONNECTION_REQUEST;
358 
359 typedef struct _CFG_CLOSE_USER_INITIATED_CONNECTION_RESPONSE
360 {
361 	PTHI_RESPONSE_MESSAGE_HEADER     Header;
362 } CFG_CLOSE_USER_INITIATED_CONNECTION_RESPONSE;
363 
364 typedef enum
365 {
366 	AMT_NETWORK_CONNECTION_DIRECT = 0,
367 	AMT_NETWORK_CONNECTION_VPN,
368 	AMT_NETWORK_CONNECTION_OUTSIDE_ENTERPRISE
369 } AMT_NETWORK_CONNECTION_STATUS;
370 
371 typedef enum
372 {
373 	REMOTE_ACCESS_CONNECTION_STATUS_NOT_CONNECTED = 0,
374 	REMOTE_ACCESS_CONNECTION_STATUS_CONNECTING,
375 	REMOTE_ACCESS_CONNECTION_STATUS_CONNECTED
376 } REMOTE_ACCESS_CONNECTION_STATUS;
377 
378 typedef enum
379 {
380 	REMOTE_ACCESS_CONNECTION_TRIGGER_USER_INITIATED = 0,
381 	REMOTE_ACCESS_CONNECTION_TRIGGER_ALERT,
382 	REMOTE_ACCESS_CONNECTION_TRIGGER_PROVISIONING,
383 	REMOTE_ACCESS_CONNECTION_TRIGGER_PERIODIC
384 } REMOTE_ACCESS_CONNECTION_TRIGGER;
385 
386 typedef struct _CFG_GET_REMOTE_ACCESS_CONNECTION_STATUS_REQUEST
387 {
388 	PTHI_MESSAGE_HEADER     Header;
389 } CFG_GET_REMOTE_ACCESS_CONNECTION_STATUS_REQUEST;
390 
391 typedef struct _CFG_GET_REMOTE_ACCESS_CONNECTION_STATUS_RESPONSE
392 {
393 	PTHI_RESPONSE_MESSAGE_HEADER     Header;
394 	AMT_NETWORK_CONNECTION_STATUS    AmtNetworkConnectionStatus;
395 	REMOTE_ACCESS_CONNECTION_STATUS  RemoteAccessConnectionStatus;
396 	REMOTE_ACCESS_CONNECTION_TRIGGER RemoteAccessConnectionTrigger;
397 	AMT_ANSI_STRING MpsHostname;
398 } CFG_GET_REMOTE_ACCESS_CONNECTION_STATUS_RESPONSE;
399 
400 typedef struct _REMOTE_ACCESS_STATUS
401 {
402 	AMT_NETWORK_CONNECTION_STATUS    AmtNetworkConnectionStatus;
403 	REMOTE_ACCESS_CONNECTION_STATUS  RemoteAccessConnectionStatus;
404 	REMOTE_ACCESS_CONNECTION_TRIGGER RemoteAccessConnectionTrigger;
405 	AMT_ANSI_STRING MpsHostname;
406 } REMOTE_ACCESS_STATUS;
407 
408 
409 typedef UINT8 AMT_UUID[16];
410 
411 const AMT_UUID AMT_UUID_LINK_STATE =
412 	{0x00, 0x00, 0x00, 0x00,
413 	 0x00, 0x00, 0x00, 0x00,
414 	 0x00, 0x00, 0x00, 0x00,
415 	 0x00, 0x00, 0x00, 0x01};
416 
417 typedef struct _STATE_DATA
418 {
419 	UINT8 LinkStatus; // (0 - down; 1 - up)
420 	UINT8 HardSKU;
421 	UINT8 CryptoFuse; // (0 -  disabled; 1 - enabled)
422 	UINT8 FlashProtaction; // (0 - disabled; 1 - enabled)
423 	UINT8 LastMEResetReason;
424 } STATE_DATA;
425 
426 typedef struct _STATE_GET_AMT_STATE_REQUEST
427 {
428 	PTHI_MESSAGE_HEADER Header;
429 	AMT_UUID StateVariableIdentifier;
430 } STATE_GET_AMT_STATE_REQUEST;
431 
432 typedef struct _STATE_GET_AMT_STATE_RESPONSE
433 {
434 	PTHI_RESPONSE_MESSAGE_HEADER Header;
435 	AMT_UUID      StateDataIdentifier;
436 	UINT32        ByteCount;
437 	STATE_DATA    StateData;
438 } STATE_GET_AMT_STATE_RESPONSE;
439 
440 
441 typedef struct _AMT_HASH_HANDLES
442 {
443 	UINT32	Length;
444 	UINT32	Handles[CERT_HASH_MAX_NUMBER];
445 } AMT_HASH_HANDLES;
446 
447 typedef struct _CERTHASH_ENTRY
448 {
449 	AMT_BOOLEAN     IsDefault;
450 	AMT_BOOLEAN     IsActive;
451 	UINT8           CertificateHash[CERT_HASH_MAX_LENGTH];
452 	UINT8           HashAlgorithm;
453 	AMT_ANSI_STRING Name;
454 } CERTHASH_ENTRY;
455 
456 typedef enum
457 {
458 	CERT_HASH_ALGORITHM_MD5 = 0,  // 16 bytes
459 	CERT_HASH_ALGORITHM_SHA1,     // 20 bytes
460 	CERT_HASH_ALGORITHM_SHA256,   // 32 bytes
461 	CERT_HASH_ALGORITHM_SHA512    // 64 bytes
462 } CERT_HASH_ALGORITHM;
463 
464 typedef struct
465 {
466 	UINT16      Year;
467 	UINT16      Month;
468 	UINT16      DayOfWeek;
469 	UINT16      Day;
470 	UINT16      Hour;
471 	UINT16      Minute;
472 	UINT16      Second;
473 } TIME_DATE;
474 
475 typedef struct _AMT_PROV_AUDIT_RECORD
476 {
477 	UINT8                ProvisioningTLSMode;
478 	AMT_BOOLEAN          SecureDNS;
479 	AMT_BOOLEAN          HostInitiated;
480 	CERT_HASH_ALGORITHM  SelectedHashType;
481 	UINT8                SelectedHashData[CERT_HASH_MAX_LENGTH];
482 	UINT8                CaCertificateSerials[NET_TLS_CERT_PKI_MAX_SERIAL_NUMS*NET_TLS_CERT_PKI_MAX_SERIAL_NUM_LENGTH];
483 	AMT_BOOLEAN          AdditionalCaSerialNums;
484 	AMT_BOOLEAN          IsOemDefault;
485 	AMT_BOOLEAN          IsTimeValid;
486 	UINT32               ProvServerIP;
487 	TIME_DATE            TlsStartTime;
488 	AMT_ANSI_STRING      ProvServerFQDN;
489 } AMT_PROV_AUDIT_RECORD;
490 
491 typedef struct _CFG_GENERATE_RNG_SEED_RESPONSE
492 {
493 	PTHI_RESPONSE_MESSAGE_HEADER Header;
494 } CFG_GENERATE_RNG_SEED_RESPONSE;
495 
496 typedef struct _CFG_GET_RNG_SEED_STATUS_RESPONSE
497 {
498 	PTHI_RESPONSE_MESSAGE_HEADER Header;
499 	AMT_RNG_STATUS RngStatus;
500 } CFG_GET_RNG_SEED_STATUS_RESPONSE;
501 
502 typedef struct _CFG_GET_ZERO_TOUCH_ENABLED_RESPONSE
503 {
504 	PTHI_RESPONSE_MESSAGE_HEADER Header;
505 	AMT_BOOLEAN ZeroTouchEnabled;
506 } CFG_GET_ZERO_TOUCH_ENABLED_RESPONSE;
507 
508 typedef struct _CFG_GET_PROVISIONING_TLS_MODE_RESPONSE
509 {
510 	PTHI_RESPONSE_MESSAGE_HEADER Header;
511 	AMT_PROVISIONING_TLS_MODE ProvisioningTlsMode;
512 } CFG_GET_PROVISIONING_TLS_MODE_RESPONSE;
513 
514 typedef struct _CFG_START_CONFIGURATION_RESPONSE
515 {
516 	PTHI_RESPONSE_MESSAGE_HEADER Header;
517 } CFG_START_CONFIGURATION_RESPONSE;
518 
519 typedef struct _CFG_SET_PROVISIONING_SERVER_OTP_RESPONSE
520 {
521 	PTHI_RESPONSE_MESSAGE_HEADER Header;
522 } CFG_SET_PROVISIONING_SERVER_OTP_RESPONSE;
523 
524 typedef struct _CFG_SET_DNS_SUFFIX_RESPONSE
525 {
526 	PTHI_RESPONSE_MESSAGE_HEADER Header;
527 } CFG_SET_DNS_SUFFIX_RESPONSE;
528 
529 typedef struct _CFG_GET_HASH_HANDLES_RESPONSE
530 {
531 	PTHI_RESPONSE_MESSAGE_HEADER Header;
532 	AMT_HASH_HANDLES HashHandles;
533 } CFG_GET_HASH_HANDLES_RESPONSE;
534 
535 typedef struct _CFG_GET_CERTHASH_ENTRY_REQUEST
536 {
537 	PTHI_MESSAGE_HEADER Header;
538 	UINT32 HashHandle;
539 } CFG_GET_CERTHASH_ENTRY_REQUEST;
540 
541 typedef struct _CFG_GET_CERTHASH_ENTRY_RESPONSE
542 {
543 	PTHI_RESPONSE_MESSAGE_HEADER Header;
544 	CERTHASH_ENTRY Hash;
545 } CFG_GET_CERTHASH_ENTRY_RESPONSE;
546 
547 typedef struct _CFG_GET_PKI_FQDN_SUFFIX_RESPONSE
548 {
549 	PTHI_RESPONSE_MESSAGE_HEADER Header;
550 	AMT_ANSI_STRING Suffix;
551 } CFG_GET_PKI_FQDN_SUFFIX_RESPONSE;
552 
553 #pragma pack()
554 
555 class PTHICommand
556 {
557 public:
558 	PTHICommand(bool verbose = false, unsigned long sendTimeout = 2000);
559 	~PTHICommand();
560 
561 	AMT_STATUS GetCodeVersions(CODE_VERSIONS &codeVersions);
562 	AMT_STATUS GetProvisioningMode(CFG_PROVISIONING_MODE &provisioningMode);
563 	AMT_STATUS GetProvisioningMode(CFG_PROVISIONING_MODE &provisioningMode, AMT_BOOLEAN &legacy);
564 	AMT_STATUS GetProvisioningState(AMT_PROVISIONING_STATE &state);
565 	AMT_STATUS GetFeaturesState(UINT32 requestID, AMT_BOOLEAN (&requestStatus)[2]);
566 	AMT_STATUS GetLastHostResetReason(UINT32 &Reason, UINT32 &RemoteControlTimeStamp);
567 	AMT_STATUS GetCurrentPowerPolicy(AMT_ANSI_STRING &policyName);
568 	AMT_STATUS GetLanInterfaceSettings(UINT32 interfaceSettings, LAN_SETTINGS &lanSettings);
569 	AMT_STATUS GetHeciVersion(HECI_VERSION &hecVersion);
570 	AMT_STATUS GetTLSEnabled(AMT_BOOLEAN &tlsEnabled);
571 	AMT_STATUS GetDNSSuffixList(std::list<std::string> &dnsSuffixList);
572 	AMT_STATUS SetEnterpriseAccess(UINT8 Flags, UINT8 HostIPAddress[16], UINT8 EnterpriseAccess);
573 	AMT_STATUS GetFWResetReason(UINT8 &MEResetReason);
574 	AMT_STATUS OpenUserInitiatedConnection();
575 	AMT_STATUS CloseUserInitiatedConnection();
576 	AMT_STATUS GetRemoteAccessConnectionStatus(REMOTE_ACCESS_STATUS &remoteAccessStatus);
577 	AMT_STATUS GenerateRngKey();
578 	AMT_STATUS GetRngSeedStatus(AMT_RNG_STATUS &rngStatus);
579 	AMT_STATUS GetZeroTouchEnabled(AMT_BOOLEAN &zeroTouchEnabled);
580 	AMT_STATUS GetProvisioningTlsMode(AMT_PROVISIONING_TLS_MODE &provisioningTlsMode);
581 	AMT_STATUS StartConfiguration();
582 	AMT_STATUS SetProvisioningServerOTP(AMT_ANSI_STRING passwordOTP);
583 	AMT_STATUS SetDnsSuffix(AMT_ANSI_STRING dnsSuffix);
584 	AMT_STATUS EnumerateHashHandles(AMT_HASH_HANDLES &hashHandles);
585 	AMT_STATUS GetCertificateHashEntry(UINT32 hashHandle, CERTHASH_ENTRY &hashEntry);
586 	AMT_STATUS GetDnsSuffix(AMT_ANSI_STRING &dnsSuffix);
587 
588 	HECILinux PTHIClient;
589 
590 private:
591 	AMT_STATUS _call(const unsigned char *command, UINT32 command_size, UINT8 **readBuffer, UINT32 rcmd, unsigned int expSize = 0);
592 	AMT_STATUS _verifyResponseHeader(const UINT32 command, const PTHI_MESSAGE_HEADER &response_header, UINT32 response_size);
593 	AMT_STATUS _verifyCodeVersions(const CFG_GET_CODE_VERSIONS_RESPONSE &response);
594 	AMT_STATUS _verifyCurrentPowerPolicy(const CFG_GET_CURRENT_POWER_POLICY_RESPONSE &response);
595 	AMT_STATUS _verifyGetDNSSuffixList(const CFG_GET_DNS_SUFFIX_LIST_RESPONSE &response);
596 	AMT_STATUS _verifyRemoteAccessConnectionStatus(const CFG_GET_REMOTE_ACCESS_CONNECTION_STATUS_RESPONSE &response);
597 	AMT_STATUS _verifyHashHandles(const CFG_GET_HASH_HANDLES_RESPONSE &response);
598 	AMT_STATUS _verifyGetCertificateHashEntry(const CFG_GET_CERTHASH_ENTRY_RESPONSE &response);
599 	AMT_STATUS _verifyGetDnsSuffix(const CFG_GET_PKI_FQDN_SUFFIX_RESPONSE &response);
600 
601 	unsigned long m_sendTimeout;
602 };
603 
604 /*
605 * Constants
606 */
607 
608 
609 const UINT32 CODE_VERSIONS_REQUEST     = 0x0400001A;
610 const UINT32 CODE_VERSIONS_RESPONSE    = 0x0480001A;
611 
612 const PTHI_MESSAGE_HEADER GET_CODE_VERSION_HEADER = {
613 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{CODE_VERSIONS_REQUEST}}, 0
614 };
615 
616 const UINT32 PROVISIONING_MODE_REQUEST     = 0x04000008;
617 const UINT32 PROVISIONING_MODE_RESPONSE    = 0x04800008;
618 
619 const PTHI_MESSAGE_HEADER GET_PROVISIONING_MODE_HEADER = {
620 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{PROVISIONING_MODE_REQUEST}}, 0
621 };
622 
623 const UINT32 PROVISIONING_STATE_REQUEST    = 0x04000011;
624 const UINT32 PROVISIONING_STATE_RESPONSE   = 0x04800011;
625 
626 const PTHI_MESSAGE_HEADER GET_PROVISIONING_STATE_HEADER = {
627 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{PROVISIONING_STATE_REQUEST}}, 0
628 };
629 
630 const UINT32 GET_FEATURES_STATE_REQUEST		= 0x04000049;
631 const UINT32 GET_FEATURES_STATE_RESPONSE	= 0x04800049;
632 
633 const PTHI_MESSAGE_HEADER GET_FEATURES_STATE_HEADER = {
634 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{GET_FEATURES_STATE_REQUEST}}, (sizeof(CFG_GET_FEATURES_STATE_REQUEST) - sizeof(PTHI_MESSAGE_HEADER))
635 };
636 
637 const UINT32 GET_CURRENT_POWER_POLICY_REQUEST	= 0x04000047;
638 const UINT32 GET_CURRENT_POWER_POLICY_RESPONSE	= 0x04800047;
639 
640 const PTHI_MESSAGE_HEADER GET_CURRENT_POWER_POLICY_HEADER = {
641 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{GET_CURRENT_POWER_POLICY_REQUEST}}, 0
642 };
643 
644 const UINT32 GET_LAST_HOST_RESET_REASON_REQUEST		= 0x0400004A;
645 const UINT32 GET_LAST_HOST_RESET_REASON_RESPONSE	= 0x0480004A;
646 
647 const PTHI_MESSAGE_HEADER GET_LAST_HOST_RESET_REASON_HEADER = {
648 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{GET_LAST_HOST_RESET_REASON_REQUEST}}, 0
649 };
650 
651 const UINT32 GET_LAN_INTERFACE_SETTINGS_REQUEST		= 0x04000048;
652 const UINT32 GET_LAN_INTERFACE_SETTINGS_RESPONSE	= 0x04800048;
653 
654 const PTHI_MESSAGE_HEADER GET_LAN_INTERFACE_SETTINGS_HEADER = {
655 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{GET_LAN_INTERFACE_SETTINGS_REQUEST}}, (sizeof(CFG_GET_LAN_INTERFACE_SETTINGS_REQUEST) - sizeof(PTHI_MESSAGE_HEADER))
656 };
657 
658 const UINT32 GET_SECURITY_PARAMETERS_REQUEST	=0x0400001B;
659 const UINT32 GET_SECURITY_PARAMETERS_RESPONSE	=0x0480001B;
660 
661 const PTHI_MESSAGE_HEADER GET_SECURITY_PARAMETERS_HEADER = {
662 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{GET_SECURITY_PARAMETERS_REQUEST}}, 0
663 };
664 
665 const UINT32 GET_DNS_SUFFIX_LIST_REQUEST        = 0x0400003E;
666 const UINT32 GET_DNS_SUFFIX_LIST_RESPONSE       = 0x0480003E;
667 
668 const PTHI_MESSAGE_HEADER GET_DNS_SUFFIX_LIST_HEADER = {
669 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{GET_DNS_SUFFIX_LIST_REQUEST}}, 0
670 };
671 
672 const UINT32 SET_ENTERPRISE_ACCESS_REQUEST   = 0x0400003F;
673 const UINT32 SET_ENTERPRISE_ACCESS_RESPONSE  = 0x0480003F;
674 
675 const PTHI_MESSAGE_HEADER SET_ENTERPRISE_ACCESS_HEADER = {
676 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{SET_ENTERPRISE_ACCESS_REQUEST}}, (sizeof(CFG_SET_ENTERPRISE_ACCESS_REQUEST) - sizeof(PTHI_MESSAGE_HEADER))
677 };
678 
679 const UINT32 OPEN_USER_INITIATED_CONNECTION_REQUEST    = 0x04000044;
680 const UINT32 OPEN_USER_INITIATED_CONNECTION_RESPONSE   = 0x04800044;
681 
682 const PTHI_MESSAGE_HEADER OPEN_USER_INITIATED_CONNECTION_HEADER = {
683 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{OPEN_USER_INITIATED_CONNECTION_REQUEST}}, 0
684 };
685 
686 const UINT32 CLOSE_USER_INITIATED_CONNECTION_REQUEST   = 0x04000045;
687 const UINT32 CLOSE_USER_INITIATED_CONNECTION_RESPONSE  = 0x04800045;
688 
689 const PTHI_MESSAGE_HEADER CLOSE_USER_INITIATED_CONNECTION_HEADER = {
690 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{CLOSE_USER_INITIATED_CONNECTION_REQUEST}}, 0
691 };
692 
693 const UINT32 GET_REMOTE_ACCESS_CONNECTION_STATUS_REQUEST       = 0x04000046;
694 const UINT32 GET_REMOTE_ACCESS_CONNECTION_STATUS_RESPONSE      = 0x04800046;
695 
696 const PTHI_MESSAGE_HEADER GET_REMOTE_ACCESS_CONNECTION_STATUS_HEADER = {
697 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{GET_REMOTE_ACCESS_CONNECTION_STATUS_REQUEST}}, 0
698 };
699 
700 const UINT32 GET_AMT_STATE_REQUEST         = 0x01000001;
701 const UINT32 GET_AMT_STATE_RESPONSE        = 0x01800001;
702 
703 const PTHI_MESSAGE_HEADER GET_AMT_STATE_HEADER = {
704 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{GET_AMT_STATE_REQUEST}}, sizeof(AMT_UUID)
705 };
706 
707 const UINT32 GENERATE_RNG_SEED_REQUEST    = 0x04000028;
708 const UINT32 GENERATE_RNG_SEED_RESPONSE   = 0x04800028;
709 
710 const PTHI_MESSAGE_HEADER GENERATE_RNG_SEED_HEADER = {
711 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{GENERATE_RNG_SEED_REQUEST}}, 0
712 };
713 
714 const UINT32 GET_RNG_SEED_STATUS_REQUEST    = 0x0400002E;
715 const UINT32 GET_RNG_SEED_STATUS_RESPONSE   = 0x0480002E;
716 
717 const PTHI_MESSAGE_HEADER GET_RNG_SEED_STATUS_HEADER = {
718 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{GET_RNG_SEED_STATUS_REQUEST}}, 0
719 };
720 
721 const UINT32 GET_ZERO_TOUCH_ENABLED_REQUEST    = 0x04000030;
722 const UINT32 GET_ZERO_TOUCH_ENABLED_RESPONSE   = 0x04800030;
723 
724 const PTHI_MESSAGE_HEADER GET_ZERO_TOUCH_ENABLED_HEADER = {
725 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{GET_ZERO_TOUCH_ENABLED_REQUEST}}, 0
726 };
727 
728 const UINT32 GET_PROVISIONING_TLS_MODE_REQUEST     = 0x0400002B;
729 const UINT32 GET_PROVISIONING_TLS_MODE_RESPONSE    = 0x0480002B;
730 
731 const PTHI_MESSAGE_HEADER GET_PROVISIONING_TLS_MODE_HEADER = {
732 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{GET_PROVISIONING_TLS_MODE_REQUEST}}, 0
733 };
734 
735 const UINT32 START_CONFIGURATION_REQUEST     = 0x04000029;
736 const UINT32 START_CONFIGURATION_RESPONSE    = 0x04800029;
737 
738 const PTHI_MESSAGE_HEADER START_CONFIGURATION_HEADER = {
739 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{START_CONFIGURATION_REQUEST}}, 0
740 };
741 
742 const UINT32 SET_PROVISIONING_SERVER_OTP_REQUEST     = 0x0400002A;
743 const UINT32 SET_PROVISIONING_SERVER_OTP_RESPONSE    = 0x0480002A;
744 
745 const UINT32 SET_DNS_SUFFIX_REQUEST     = 0x0400002F;
746 const UINT32 SET_DNS_SUFFIX_RESPONSE    = 0x0480002F;
747 
748 const UINT32 ENUMERATE_HASH_HANDLES_REQUEST     = 0x0400002C;
749 const UINT32 ENUMERATE_HASH_HANDLES_RESPONSE    = 0x0480002C;
750 
751 const PTHI_MESSAGE_HEADER ENUMERATE_HASH_HANDLES_HEADER = {
752 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{ENUMERATE_HASH_HANDLES_REQUEST}}, 0
753 };
754 
755 const UINT32 GET_CERTHASH_ENTRY_REQUEST     = 0x0400002D;
756 const UINT32 GET_CERTHASH_ENTRY_RESPONSE    = 0x0480002D;
757 
758 const PTHI_MESSAGE_HEADER GET_CERTHASH_ENTRY_HEADER = {
759 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{GET_CERTHASH_ENTRY_REQUEST}}, sizeof(UINT32)
760 };
761 
762 const UINT32 GET_PKI_FQDN_SUFFIX_REQUEST    = 0x04000036;
763 const UINT32 GET_PKI_FQDN_SUFFIX_RESPONSE   = 0x04800036;
764 
765 const PTHI_MESSAGE_HEADER GET_PKI_FQDN_SUFFIX_HEADER = {
766 	{AMT_MAJOR_VERSION, AMT_MINOR_VERSION}, 0, {{GET_PKI_FQDN_SUFFIX_REQUEST}}, 0
767 };
768 
769 #endif
770 
771