390 lines
12 KiB
C++

//----------------------------------------------------------------------------
//
// Copyright (C) Intel Corporation, 2006 - 2007.
//
// File: APF.h
//
// Contents: APF (Intel(R) AMT Port Forwarding protocol).
//
// Notes: Version 1.0
//----------------------------------------------------------------------------
#ifndef _APF_H__
#define _APF_H__
//ace headers
#include <ace/SOCK_Stream.h>
#include <ace/Message_Block.h>
#include <ace/SString.h>
//mps headers:
#include "OptionsUtils.h"
#include "ProtocolBasicMessage.h"
#define APF_ZERO_RESERVE 0x0000
//TODO:
// Message Block types
static const ACE_Message_Block::ACE_Message_Type MB_APF_MESSAGE = 0x01;
static const ACE_Message_Block::ACE_Message_Type MB_DISCONNECT = 0x02;
static const ACE_Message_Block::ACE_Message_Type MB_CHANNEL_OPEN = 0x03;
static const ACE_Message_Block::ACE_Message_Type MB_CHANNEL_OPEN_REPLY = 0x04;
static const ACE_Message_Block::ACE_Message_Type MB_CHANNEL_CLOSE = 0x05;
// message codes
#define APF_DISCONNECT 1
#define APF_SERVICE_REQUEST 5
#define APF_SERVICE_ACCEPT 6
#define APF_USERAUTH_REQUEST 50
#define APF_USERAUTH_FAILURE 51
#define APF_USERAUTH_SUCCESS 52
#define APF_GLOBAL_REQUEST 80
#define APF_REQUEST_SUCCESS 81
#define APF_REQUEST_FAILURE 82
#define APF_CHANNEL_OPEN 90
#define APF_CHANNEL_OPEN_CONFIRMATION 91
#define APF_CHANNEL_OPEN_FAILURE 92
#define APF_CHANNEL_WINDOW_ADJUST 93
#define APF_CHANNEL_DATA 94
#define APF_CHANNEL_CLOSE 97
#define APF_PROTOCOLVERSION 192
#define APF_KEEPALIVE_REQUEST 208
#define APF_KEEPALIVE_REPLY 209
#define APF_KEEPALIVE_OPTIONS_REQ 210
#define APF_KEEPALIVE_OPTIONS_RESPONS 211
// APF_DISCONNECT reason code
#define APF_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT 1
#define APF_DISCONNECT_PROTOCOL_ERROR 2
#define APF_DISCONNECT_KEY_EXCHANGE_FAILED 3
#define APF_DISCONNECT_RESERVED 4
#define APF_DISCONNECT_MAC_ERROR 5
#define APF_DISCONNECT_COMPRESSION_ERROR 6
#define APF_DISCONNECT_SERVICE_NOT_AVAILABLE 7
#define APF_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED 8
#define APF_DISCONNECT_HOST_KEY_NOT_VERIFIABLE 9
#define APF_DISCONNECT_CONNECTION_LOST 10
#define APF_DISCONNECT_BY_APPLICATION 11
#define APF_DISCONNECT_TOO_MANY_CONNECTIONS 12
#define APF_DISCONNECT_AUTH_CANCELLED_BY_USER 13
#define APF_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE 14
#define APF_DISCONNECT_ILLEGAL_USER_NAME 15
#define APF_DISCONNECT_CONNECTION_TIMED_OUT 16
#define APF_DISCONNECT_BY_POLICY 17
#define APF_DISCONNECT_TEMPORARILY_UNAVAILABLE 18
// error codes for failure to open channel
#define OPEN_ADMINISTRATIVELY_PROHIBITED 1
#define OPEN_CONNECT_FAILED 2
#define OPEN_UNKNOWN_CHANNEL_TYPE 3
#define OPEN_RESOURCE_SHORTAGE 4
// APF service names
#define APF_SERVICE_PFWD "pfwd@amt.intel.com"
#define APF_SERVICE_AUTH "auth@amt.intel.com"
// Global Requests string identifiers
#define APF_PROTOCOL_VERSION "protocol-version@amt.intel.com"
#define APF_TCP_FORWARD_REQUEST "tcpip-forward"
#define APF_TCP_FORWARD_CANCEL "cancel-tcpip-forward"
#define APF_UDP_SENDTO "udp-send-to@amt.intel.com"
#define APF_CHANNEL_OPEN_FORWARD "forwarded-tcpip"
#define APF_CHANNEL_OPEN_DIRECT_FORWARD "direct-tcpip"
#define APF_USERAUTH_FAILURE_STR "password"
// Trigger reason code
#define USER_INITIATED_REQUEST 1
#define ALERT_REQUSET 2
#define HIT_PROVISIONING_REQUEST 3
#define PERIODIC_REQUEST 4
#define LME_REQUEST 254
// APF authentication methods
#define APF_USERAUTH_NONE "none"
#define APF_USERAUTH_PASSWORD "password"
// Protocol version this implementation support.
#define APF_PROTOCOL_VERSION_MAJOR 1
#define APF_PROTOCOL_VERSION_MINOR 0
// Define max values for APF message fields
#define APF_MAX_STRING_SIZE 256
#define APF_MAX_SERVICE_NAME_LENGTH 32
#define APF_MAX_USERNAME_LENGTH 64
#define APF_MAX_PASSWORD_LENGTH 64
#define APF_MAX_METHOD_NAME_LENGTH 16
#define APF_MAX_GLOBAL_STRING_LENGTH 32
#define APF_MAX_ADDRESS_SIZE 256
#define APF_MAX_CHANNEL_TYPE_STRING 32
#define TRIGER_REASON_NUM 5
static const char* TRIGGER_REASON[TRIGER_REASON_NUM] =
{
"USER INITIATED REQUEST",
"ALERT REQUSET",
"HIT PROVISIONING REQUEST",
"PERIODIC REQUEST",
"LME REQUEST",
};
// Basic APF message class contain the basic type serialization/deserialization
class APF_BasicMessage : public Protocol_BasicMessage{
public:
unsigned int maxSize() {return *getMaximumWindowSize(); }
};
// Transport Layer Messages
class APF_Disconnect: public APF_BasicMessage {
public:
ACE_UINT32 reason = 0;
ACE_UINT16 reserved = 0;
size_t size() {return 7;}
STATUS read (ACE_SOCK_Stream &stream);
void write (ACE_Message_Block *&mb);
};
class APF_ServiceRequest: public APF_BasicMessage {
public:
ACE_UINT32 serviceNameLength;
ACE_CString serviceName;
size_t size() {return 5+serviceNameLength;}
STATUS read (ACE_SOCK_Stream &stream);
void write (ACE_Message_Block *&mb) {};
};
class APF_ServiceAccept: public APF_BasicMessage {
public:
ACE_UINT32 serviceNameLength;
ACE_CString serviceName;
size_t size() {return 5+serviceNameLength;}
STATUS read (ACE_SOCK_Stream &stream) {return STATUS_OPERATION_NOT_SUPPORTED;}
void write (ACE_Message_Block *&mb);
};
// Protocol version message
class APF_ProtocolVersion: public APF_BasicMessage {
public:
ACE_UINT32 majorVersion = 0; // Major version
ACE_UINT32 minorVersion = 0; // Minor version
ACE_UINT32 triggerReason = 0; // Open session reason
ACE_UINT8 systemId[16]; // Machine Id (UUID for Enterprise
// or CID for Home ).
ACE_UINT32 reserved[16];
size_t size() {return 93;}
STATUS read (ACE_SOCK_Stream &stream);
void write (ACE_Message_Block *&mb);
};
// Authentication Messages
class APF_UserauthRequest: public APF_BasicMessage {
public:
ACE_UINT32 usernameLength;
ACE_CString username;
ACE_UINT32 serviceNameLength;
ACE_CString serviceName;
ACE_UINT32 methodNameLength;
ACE_CString methodName;
// If method name = "password"
ACE_UINT8 reserved;
ACE_UINT32 passwordLength;
ACE_CString password;
size_t size() {return usernameLength +
serviceNameLength +
methodNameLength +
passwordLength + 18;}
STATUS read (ACE_SOCK_Stream &stream);
void write (ACE_Message_Block *&mb) {}
};
class APF_UserauthFailure: public APF_BasicMessage {
public:
ACE_UINT32 methodNameListLength;
ACE_CString methodNameList;
ACE_UINT8 reserved; // must be zero
size_t size() {return methodNameListLength + 6;}
STATUS read (ACE_SOCK_Stream &stream) {return STATUS_OPERATION_NOT_SUPPORTED;}
void write (ACE_Message_Block *&mb);
};
// Global messages
class APF_GlobalRequestHeader: public APF_BasicMessage {
public:
ACE_UINT32 stringLen = 0; // Request string length
ACE_CString requestString; // Request string
ACE_UINT8 wantReply; // Want reply: 0=No-Reply, 1=Reply.
size_t size() {return 6+stringLen;}
STATUS read (ACE_SOCK_Stream &stream);
void write (ACE_Message_Block *&mb);
};
class APF_TcpForwardRequest: public APF_BasicMessage {
public:
ACE_UINT32 addressToBindLength;// Address to bind string length
ACE_CString addressToBind; // Address to bind string
ACE_UINT32 port; // Port number to bind
size_t size() {return 8+addressToBindLength;}
STATUS read (ACE_SOCK_Stream &stream);
void write (ACE_Message_Block *&mb) {}
};
class APF_TcpForwardReply: public APF_BasicMessage {
public:
ACE_UINT8 status = 0; // APF_REQUEST_SUCCESS or APF_REQUEST_FAILURE
ACE_UINT32 portBound = 0; // Port bound: The TCP port that was bound on the server
size_t size() {return (status == APF_REQUEST_SUCCESS ? 5 : 1);}
STATUS read (ACE_SOCK_Stream &stream) {return STATUS_OPERATION_NOT_SUPPORTED;}
void write(ACE_Message_Block *&mb);
};
class APF_TcpForwardCancelRequest: public APF_BasicMessage {
public:
ACE_UINT32 addressToBindLength;// Address to bind string length
ACE_CString addressToBind; // Address to bind string
ACE_UINT32 port; // Port number to bind
size_t size() {return 8+addressToBindLength;}
STATUS read (ACE_SOCK_Stream &stream);
void write (ACE_Message_Block *&mb) {}
};
class APF_UdpSendTo: public APF_BasicMessage {
public:
ACE_UINT32 hostStrLen; // Host to connect string length (M)
ACE_CString hostStr; // Host to connect string
ACE_UINT32 port; // Port number to connect
ACE_UINT32 originatorIpAddressLen; // Originator IP address string length
ACE_CString originatorIpAddress; // Originator IP address string
ACE_UINT32 originatorPort; // Originator port
ACE_UINT32 dataLength; // Data length
ACE_Message_Block *data; // Data
size_t size() {return 20+
hostStrLen+
originatorIpAddressLen+
dataLength;}
STATUS read (ACE_SOCK_Stream &stream);
void write (ACE_Message_Block *&mb) {}
};
// Channel Messages
class APF_ChannelOpenForwardedRequest: public APF_BasicMessage {
public:
ACE_UINT32 channelTypeStringLen;
ACE_CString channelTypeString;
ACE_UINT32 senderChannel;
ACE_UINT32 initialWindowSize;
ACE_UINT32 reserved; //0xffffffff
ACE_UINT32 connectedAddressStringLen;
ACE_CString connectedAddressString;
ACE_UINT32 connectedPort;
ACE_UINT32 originatorIpAddressLen;
ACE_CString originatorIpAddress;
ACE_UINT32 originatorPort;
size_t size() {return 33 +
channelTypeStringLen +
connectedAddressStringLen +
originatorIpAddressLen;}
STATUS read (ACE_SOCK_Stream &stream) {return STATUS_OPERATION_NOT_SUPPORTED;}
void write (ACE_Message_Block *&mb);
};
class APF_ChannelOpenDirectRequest: public APF_BasicMessage {
public:
ACE_UINT32 channelTypeStringLen;
ACE_CString channelTypeString;
ACE_UINT32 senderChannel;
ACE_UINT32 initialWindowSize;
ACE_UINT32 reserved; //0xffffffff
ACE_UINT32 targetHostStringLen;
ACE_CString targetHostString;
ACE_UINT32 targetPort;
ACE_UINT32 originatorIpAddressLen;
ACE_CString originatorIpAddress;
ACE_UINT32 originatorPort;
size_t size() {return 33 +
channelTypeStringLen +
targetHostStringLen +
originatorIpAddressLen;}
STATUS read (ACE_SOCK_Stream &stream);
void write (ACE_Message_Block *&mb) {}
};
class APF_ChannelOpenReply: public APF_BasicMessage {
public:
ACE_UINT8 openChannelStatus = 0;
ACE_UINT32 recipientChannel = 0;
ACE_UINT32 senderChannel = 0; // or failure code !
ACE_UINT32 initialWindowSize = 0; // or 0xf..f in failure !
ACE_UINT32 reserved = 0; // 0xf...f
size_t size() {return 17;}
STATUS read (ACE_SOCK_Stream &stream);
void write (ACE_Message_Block *&mb);
};
class APF_ChannelClose: public APF_BasicMessage {
public:
ACE_UINT32 recipientChannel = 0;
size_t size() {return 5;}
STATUS read (ACE_SOCK_Stream &stream);
void write (ACE_Message_Block *&mb);
};
class APF_ChannelData: public APF_BasicMessage {
public:
ACE_UINT32 recipientChannel = 0;
ACE_UINT32 dataLen = 0;
ACE_Message_Block *data = NULL;
size_t size() {return 9+dataLen;}
STATUS read (ACE_SOCK_Stream &stream);
void write (ACE_Message_Block *&mb);
};
class APF_ChannelWindowAdjust: public APF_BasicMessage {
public:
ACE_UINT32 recipientChannel = 0;
ACE_UINT32 bytesToAdd = 0;
size_t size() {return 9;}
STATUS read (ACE_SOCK_Stream &stream);
void write (ACE_Message_Block *&mb);
};
class APF_KeepAliveReq: public APF_BasicMessage {
public:
ACE_UINT32 _cookie = 0;
size_t size() {return 4;}
STATUS read (ACE_SOCK_Stream &stream);
void write (ACE_Message_Block *&mb){}
};
class APF_KeepAliveReply: public APF_BasicMessage {
public:
ACE_UINT32 _cookie = 0;
size_t size() {return 5;}
STATUS read (ACE_SOCK_Stream &stream){return STATUS_OPERATION_NOT_SUPPORTED;}
void write (ACE_Message_Block *&mb);
};
class APF_KeepAliveOptionReq: public APF_BasicMessage {
public:
ACE_UINT32 _keepalive_interval = 0;
ACE_UINT32 _read_timeout = 0;
size_t size() {return 9;}
STATUS read (ACE_SOCK_Stream &stream);
void write (ACE_Message_Block *&mb){}
};
class APF_KeepAliveOptionReply: public APF_BasicMessage {
public:
ACE_UINT32 _keepalive_interval = 0;
ACE_UINT32 _read_timeout = 0;
size_t size() {return 9;}
STATUS read (ACE_SOCK_Stream &stream) {return STATUS_OPERATION_NOT_SUPPORTED;}
void write (ACE_Message_Block *&mb);
};
#endif // _APF_H__