summaryrefslogtreecommitdiff
path: root/accel-pppd/ctrl/sstp/sstp_prot.h
diff options
context:
space:
mode:
Diffstat (limited to 'accel-pppd/ctrl/sstp/sstp_prot.h')
-rw-r--r--accel-pppd/ctrl/sstp/sstp_prot.h182
1 files changed, 182 insertions, 0 deletions
diff --git a/accel-pppd/ctrl/sstp/sstp_prot.h b/accel-pppd/ctrl/sstp/sstp_prot.h
new file mode 100644
index 0000000..f9f78d8
--- /dev/null
+++ b/accel-pppd/ctrl/sstp/sstp_prot.h
@@ -0,0 +1,182 @@
+#ifndef SSTP_PROT_H
+#define SSTP_PROT_H
+
+#include <stdint.h>
+
+/* Constants */
+#define SSTP_PORT 443
+#define SSTP_HTTP_METHOD "SSTP_DUPLEX_POST"
+#define SSTP_HTTP_URI "/sra_{BA195980-CD49-458b-9E23-C84EE0ADCD75}/"
+#define SSTP_VERSION 0x10
+#define SSTP_MAX_PACKET_SIZE 4095
+#define SSTP_NONCE_SIZE 32
+#define SSTP_NEGOTIOATION_TIMEOUT 60
+#define SSTP_HELLO_TIMEOUT 60
+#define SSTP_ABORT_TIMEOUT_1 3
+#define SSTP_ABORT_TIMEOUT_2 1
+#define SSTP_DISCONNECT_TIMEOUT_1 5
+#define SSTP_DISCONNECT_TIMEOUT_2 1
+
+/* Packet Type */
+enum {
+ SSTP_DATA_PACKET = 0x00,
+ SSTP_CTRL_PACKET = 0x01,
+};
+
+/* Message Type */
+enum {
+ SSTP_MSG_CALL_CONNECT_REQUEST = 0x0001,
+ SSTP_MSG_CALL_CONNECT_ACK = 0x0002,
+ SSTP_MSG_CALL_CONNECT_NAK = 0x0003,
+ SSTP_MSG_CALL_CONNECTED = 0x0004,
+ SSTP_MSG_CALL_ABORT = 0x0005,
+ SSTP_MSG_CALL_DISCONNECT = 0x0006,
+ SSTP_MSG_CALL_DISCONNECT_ACK = 0x0007,
+ SSTP_MSG_ECHO_REQUEST = 0x0008,
+ SSTP_MSG_ECHO_RESPONSE = 0x0009,
+};
+
+/* Attribute ID */
+enum {
+ SSTP_ATTRIB_NO_ERROR = 0x00,
+ SSTP_ATTRIB_ENCAPSULATED_PROTOCOL_ID = 0x01,
+ SSTP_ATTRIB_STATUS_INFO = 0x02,
+ SSTP_ATTRIB_CRYPTO_BINDING = 0x03,
+ SSTP_ATTRIB_CRYPTO_BINDING_REQ = 0x04,
+};
+
+/* Protocol ID */
+enum {
+ SSTP_ENCAPSULATED_PROTOCOL_PPP = 0x0001,
+};
+
+/* Hash Protocol Bitmask */
+enum {
+ CERT_HASH_PROTOCOL_SHA1 = 0x01,
+ CERT_HASH_PROTOCOL_SHA256 = 0x02,
+};
+
+/* Status */
+enum {
+ ATTRIB_STATUS_NO_ERROR = 0x00000000,
+ ATTRIB_STATUS_DUPLICATE_ATTRIBUTE = 0x00000001,
+ ATTRIB_STATUS_UNRECOGNIZED_ATTRIBUTE = 0x00000002,
+ ATTRIB_STATUS_INVALID_ATTRIB_VALUE_LENGTH = 0x00000003,
+ ATTRIB_STATUS_VALUE_NOT_SUPPORTED = 0x00000004,
+ ATTRIB_STATUS_UNACCEPTED_FRAME_RECEIVED = 0x00000005,
+ ATTRIB_STATUS_RETRY_COUNT_EXCEEDED = 0x00000006,
+ ATTRIB_STATUS_INVALID_FRAME_RECEIVED = 0x00000007,
+ ATTRIB_STATUS_NEGOTIATION_TIMEOUT = 0x00000008,
+ ATTRIB_STATUS_ATTRIB_NOT_SUPPORTED_IN_MSG = 0x00000009,
+ ATTRIB_STATUS_REQUIRED_ATTRIBUTE_MISSING = 0x0000000a,
+ ATTRIB_STATUS_STATUS_INFO_NOT_SUPPORTED_IN_MSG = 0x0000000b,
+};
+
+/* State */
+enum {
+ STATE_SERVER_CALL_DISCONNECTED = 0,
+ STATE_SERVER_CONNECT_REQUEST_PENDING,
+ STATE_SERVER_CALL_CONNECTED_PENDING,
+ STATE_SERVER_CALL_CONNECTED,
+ STATE_CALL_ABORT_IN_PROGRESS_1,
+ STATE_CALL_ABORT_IN_PROGRESS_2,
+ STATE_CALL_ABORT_TIMEOUT_PENDING,
+ STATE_CALL_ABORT_PENDING,
+ STATE_CALL_DISCONNECT_IN_PROGRESS_1,
+ STATE_CALL_DISCONNECT_IN_PROGRESS_2,
+ STATE_CALL_DISCONNECT_TIMEOUT_PENDING,
+ STATE_CALL_DISCONNECT_ACK_PENDING,
+};
+
+/* Packets */
+struct sstp_hdr {
+ uint8_t version;
+ uint8_t reserved;
+ uint16_t length;
+ uint8_t data[0];
+} __attribute__((packed));
+
+struct sstp_ctrl_hdr {
+ uint8_t version;
+ uint8_t reserved;
+ uint16_t length;
+ uint16_t message_type;
+ uint16_t num_attributes;
+ uint8_t data[0];
+} __attribute__((packed));
+
+struct sstp_attr_hdr {
+ uint8_t reserved;
+ uint8_t attribute_id;
+ uint16_t length;
+ uint8_t data[0];
+} __attribute__((packed));
+
+struct sstp_attrib_encapsulated_protocol {
+ struct sstp_attr_hdr hdr;
+ uint16_t protocol_id;
+} __attribute__((packed));
+
+struct sstp_attrib_status_info {
+ struct sstp_attr_hdr hdr;
+ uint8_t reserved[3];
+ uint8_t attrib_id;
+ uint32_t status;
+ uint8_t attrib_value[0];
+} __attribute__((packed));
+
+struct sstp_attrib_crypto_binding {
+ struct sstp_attr_hdr hdr;
+ uint8_t reserved[3];
+ uint8_t hash_protocol_bitmask;
+ uint8_t nonce[SSTP_NONCE_SIZE];
+ uint8_t cert_hash[32];
+ uint8_t compound_mac[32];
+} __attribute__((packed));
+
+struct sstp_attrib_crypto_binding_request {
+ struct sstp_attr_hdr hdr;
+ uint8_t reserved[3];
+ uint8_t hash_protocol_bitmask;
+ uint8_t nonce[SSTP_NONCE_SIZE];
+} __attribute__((packed));
+
+#define SSTP_DATA_HDR(len) { \
+ .version = SSTP_VERSION, \
+ .reserved = SSTP_DATA_PACKET, \
+ .length = htons(len), \
+}
+
+#define SSTP_CTRL_HDR(type, len, num) { \
+ .version = SSTP_VERSION, \
+ .reserved = SSTP_CTRL_PACKET, \
+ .length = htons(len), \
+ .message_type = htons(type), \
+ .num_attributes = htons(num) \
+}
+
+#define SSTP_ATTR_HDR(id, len) { \
+ .attribute_id = id, \
+ .length = htons(len) \
+}
+
+#define INIT_SSTP_DATA_HDR(hdr, len) { \
+ (hdr)->version = SSTP_VERSION; \
+ (hdr)->reserved = SSTP_DATA_PACKET; \
+ (hdr)->length = htons(len); \
+}
+
+#define INIT_SSTP_CTRL_HDR(hdr, type, num, len) {\
+ (hdr)->version = SSTP_VERSION; \
+ (hdr)->reserved = SSTP_CTRL_PACKET; \
+ (hdr)->length = htons(len); \
+ (hdr)->message_type = htons(type); \
+ (hdr)->num_attributes = htons(num); \
+}
+
+#define INIT_SSTP_ATTR_HDR(hdr, id, len) { \
+ (hdr)->attribute_id = id; \
+ (hdr)->length = htons(len); \
+}
+
+#endif