44#include "../../QSC/QSC/sha3.h"
88#define SKDP_CONFIG_SIZE 26
94#define SKDP_ERROR_SIZE 1
100#define SKDP_EXP_SIZE 8
106#define SKDP_HEADER_SIZE 21
112#define SKDP_KEEPALIVE_MESSAGE 8
118#define SKDP_KEEPALIVE_STRING 20
124#define SKDP_KEEPALIVE_TIMEOUT (300 * 1000)
130#define SKDP_MESSAGE_SIZE 1024
136#define SKDP_MESSAGE_MAX (SKDP_MESSAGE_SIZE + SKDP_HEADER_SIZE)
142#define SKDP_SERVER_PORT 2201
148#define SKDP_MID_SIZE 4
154#define SKDP_SID_SIZE 8
160#define SKDP_DID_SIZE 12
166#define SKDP_TID_SIZE 4
172#define SKDP_KID_SIZE 16
178#define SKDP_SEQUENCE_TERMINATOR 0xFFFFFFFF
186#if !defined(SKDP_PROTOCOL_SEC512)
187# if !defined(SKDP_PROTOCOL_SEC256)
188# define SKDP_PROTOCOL_SEC256
192#if defined(SKDP_PROTOCOL_SEC512)
200# define SKDP_CPRKEY_SIZE 64
206# define SKDP_DDK_SIZE 64
212# define SKDP_DTK_SIZE 64
218# define SKDP_HASH_SIZE 64
224# define SKDP_PERMUTATION_RATE QSC_KECCAK_512_RATE
230# define SKDP_MACKEY_SIZE 64
236# define SKDP_MACTAG_SIZE 64
242# define SKDP_MDK_SIZE 64
248# define SKDP_SDK_SIZE 64
254# define SKDP_STH_SIZE 64
260# define SKDP_STK_SIZE 64
266# define SKDP_STOK_SIZE 64
272#define SKDP_EXCHANGE_MAX_MESSAGE_SIZE (SKDP_DTK_SIZE + SKDP_MACKEY_SIZE + SKDP_HEADER_SIZE)
277static const char SKDP_CONFIG_STRING[
SKDP_CONFIG_SIZE] =
"r01-skdp-rcs512-keccak512";
287# define SKDP_CPRKEY_SIZE 32
293# define SKDP_DDK_SIZE 32
299# define SKDP_DTK_SIZE 32
305# define SKDP_HASH_SIZE 32
311# define SKDP_MACKEY_SIZE 32
317# define SKDP_MACTAG_SIZE 32
323# define SKDP_MDK_SIZE 32
329# define SKDP_PERMUTATION_RATE QSC_KECCAK_256_RATE
335# define SKDP_SDK_SIZE 32
341# define SKDP_STK_SIZE 32
347# define SKDP_STH_SIZE 32
353# define SKDP_STOK_SIZE 32
359#define SKDP_EXCHANGE_MAX_MESSAGE_SIZE (SKDP_KID_SIZE + SKDP_CONFIG_SIZE + SKDP_STOK_SIZE + SKDP_HEADER_SIZE)
364static const char SKDP_CONFIG_STRING[
SKDP_CONFIG_SIZE] =
"r01-skdp-rcs256-keccak256";
372#define SKDP_KEY_DURATION_DAYS 365
382#define SKDP_PACKET_TIME_THRESHOLD 60
388#define SKDP_KEY_DURATION_SECONDS (SKDP_KEY_DURATION_DAYS * 24 * 60 * 60)
394#define SKDP_DEVKEY_ENCODED_SIZE (SKDP_KID_SIZE + SKDP_DDK_SIZE + SKDP_EXP_SIZE)
400#define SKDP_MSTKEY_ENCODED_SIZE (SKDP_KID_SIZE + SKDP_MDK_SIZE + SKDP_EXP_SIZE)
406#define SKDP_SRVKEY_ENCODED_SIZE (SKDP_KID_SIZE + SKDP_SDK_SIZE + SKDP_EXP_SIZE)
416#define SKDP_CONNECT_REQUEST_MESSAGE_SIZE (SKDP_KID_SIZE + SKDP_CONFIG_SIZE + SKDP_STOK_SIZE)
425#define SKDP_CONNECT_REQUEST_PACKET_SIZE (SKDP_CONNECT_REQUEST_MESSAGE_SIZE + SKDP_HEADER_SIZE)
431#define SKDP_EXCHANGE_REQUEST_MESSAGE_SIZE (SKDP_DTK_SIZE + SKDP_MACKEY_SIZE)
440#define SKDP_EXCHANGE_REQUEST_PACKET_SIZE (SKDP_EXCHANGE_REQUEST_MESSAGE_SIZE + SKDP_HEADER_SIZE)
446#define SKDP_ESTABLISH_REQUEST_MESSAGE_SIZE (SKDP_STH_SIZE + SKDP_MACTAG_SIZE)
455#define SKDP_ESTABLISH_REQUEST_PACKET_SIZE (SKDP_ESTABLISH_REQUEST_MESSAGE_SIZE + SKDP_HEADER_SIZE)
461#define SKDP_CONNECT_RESPONSE_MESSAGE_SIZE (SKDP_KID_SIZE + SKDP_CONFIG_SIZE + SKDP_STOK_SIZE)
470#define SKDP_CONNECT_RESPONSE_PACKET_SIZE (SKDP_CONNECT_RESPONSE_MESSAGE_SIZE + SKDP_HEADER_SIZE)
476#define SKDP_EXCHANGE_RESPONSE_MESSAGE_SIZE (SKDP_DTK_SIZE + SKDP_MACKEY_SIZE)
485#define SKDP_EXCHANGE_RESPONSE_PACKET_SIZE (SKDP_EXCHANGE_RESPONSE_MESSAGE_SIZE + SKDP_HEADER_SIZE)
491#define SKDP_ESTABLISH_RESPONSE_MESSAGE_SIZE (SKDP_HASH_SIZE + SKDP_MACTAG_SIZE)
500#define SKDP_ESTABLISH_RESPONSE_PACKET_SIZE (SKDP_ESTABLISH_RESPONSE_MESSAGE_SIZE + SKDP_HEADER_SIZE)
506#define SKDP_ESTABLISH_VERIFY_MESSAGE_SIZE (SKDP_HASH_SIZE + SKDP_MACTAG_SIZE)
515#define SKDP_ESTABLISH_VERIFY_PACKET_SIZE (SKDP_ESTABLISH_VERIFY_MESSAGE_SIZE + SKDP_HEADER_SIZE)
520#define SKDP_ERROR_STRING_DEPTH 17
521#define SKDP_ERROR_STRING_WIDTH 128
523static const char SKDP_ERROR_STRINGS[SKDP_ERROR_STRING_DEPTH][SKDP_ERROR_STRING_WIDTH] =
525 "No error was detected.",
526 "The cipher authentication has failed.",
527 "The kex authentication has failed.",
528 "The keep alive check failed.",
529 "The communications channel has failed.",
530 "The device could not make a connnection to the remote host.",
531 "The transmission failed at the kex establish phase.",
532 "The input is invalid.",
533 "The keep alive has expired with no response.",
534 "The key-id is not recognized.",
535 "The random generator experienced a failure.",
536 "The receiver failed at the network layer.",
537 "The transmitter failed at the network layer.",
538 "The protocol version is unknown.",
539 "The packet was received out of sequence.",
540 "The packet valid-time was exceeded",
541 "The connection experienced an error",
603} skdp_keep_alive_state;
SKDP_EXPORT_API void skdp_deserialize_device_key(skdp_device_key *dkey, const uint8_t input[SKDP_DEVKEY_ENCODED_SIZE])
Deserialize a client device key.
Definition skdp.c:7
SKDP_EXPORT_API const char * skdp_error_to_string(skdp_errors error)
Return a string description of an SKDP error code.
Definition skdp.c:117
SKDP_EXPORT_API void skdp_deserialize_master_key(skdp_master_key *mkey, const uint8_t input[SKDP_MSTKEY_ENCODED_SIZE])
Deserialize a master key from a byte array.
Definition skdp.c:29
SKDP_EXPORT_API void skdp_packet_clear(skdp_network_packet *packet)
Clear a SKDP network packet.
Definition skdp.c:131
SKDP_EXPORT_API void skdp_packet_header_deserialize(const uint8_t *header, skdp_network_packet *packet)
Deserialize a byte array into a SKDP packet header.
Definition skdp.c:143
#define SKDP_KID_SIZE
The SKDP key identity size in bytes.
Definition skdp.h:172
#define SKDP_DDK_SIZE
The device derivation key size (in bytes) for 256-bit security.
Definition skdp.h:293
SKDP_EXPORT_API bool skdp_packet_time_valid(const skdp_network_packet *packet)
Check if a SKDP packet is received within the valid time threshold.
Definition skdp.c:176
SKDP_EXPORT_API void skdp_packet_set_utc_time(skdp_network_packet *packet)
Set the local UTC seconds time in a SKDP packet header.
Definition skdp.c:171
SKDP_EXPORT_API void skdp_generate_server_key(skdp_server_key *skey, const skdp_master_key *mkey, const uint8_t kid[SKDP_KID_SIZE])
Generate a server key-set.
Definition skdp.c:91
SKDP_EXPORT_API void skdp_serialize_device_key(uint8_t output[SKDP_DEVKEY_ENCODED_SIZE], const skdp_device_key *dkey)
Serialize a client device key.
Definition skdp.c:18
#define SKDP_SDK_SIZE
The server derivation key size (in bytes) for 256-bit security.
Definition skdp.h:335
#define SKDP_MDK_SIZE
The master derivation key size (in bytes) for 256-bit security.
Definition skdp.h:323
SKDP_EXPORT_API bool skdp_generate_master_key(skdp_master_key *mkey, const uint8_t kid[SKDP_KID_SIZE])
Generate a master key-set.
Definition skdp.c:73
SKDP_EXPORT_API size_t skdp_packet_to_stream(const skdp_network_packet *packet, uint8_t *pstream)
Serialize a SKDP packet into a byte array.
Definition skdp.c:185
SKDP_EXPORT_API void skdp_serialize_master_key(uint8_t output[SKDP_MSTKEY_ENCODED_SIZE], const skdp_master_key *mkey)
Serialize a master key into a byte array.
Definition skdp.c:40
skdp_errors
The SKDP error values.
Definition skdp.h:630
@ skdp_error_receive_failure
Definition skdp.h:642
@ skdp_error_transmit_failure
Definition skdp.h:643
@ skdp_error_unsequenced
Definition skdp.h:645
@ skdp_error_establish_failure
Definition skdp.h:637
@ skdp_error_random_failure
Definition skdp.h:641
@ skdp_error_packet_expired
Definition skdp.h:646
@ skdp_error_key_not_recognized
Definition skdp.h:640
@ skdp_error_none
Definition skdp.h:631
@ skdp_error_connection_failure
Definition skdp.h:636
@ skdp_error_bad_keep_alive
Definition skdp.h:634
@ skdp_error_unknown_protocol
Definition skdp.h:644
@ skdp_error_kex_auth_failure
Definition skdp.h:633
@ skdp_error_invalid_input
Definition skdp.h:638
@ skdp_error_channel_down
Definition skdp.h:635
@ skdp_error_general_failure
Definition skdp.h:647
@ skdp_error_keep_alive_expired
Definition skdp.h:639
@ skdp_error_cipher_auth_failure
Definition skdp.h:632
SKDP_EXPORT_API void skdp_generate_device_key(skdp_device_key *dkey, const skdp_server_key *skey, const uint8_t kid[SKDP_KID_SIZE])
Generate a device key-set.
Definition skdp.c:104
#define SKDP_CONFIG_SIZE
The size of the protocol configuration string.
Definition skdp.h:88
#define SKDP_DEVKEY_ENCODED_SIZE
The size (in bytes) of the encoded device key.
Definition skdp.h:394
SKDP_EXPORT_API void skdp_stream_to_packet(const uint8_t *pstream, skdp_network_packet *packet)
Deserialize a byte stream into a SKDP network packet.
Definition skdp.c:211
skdp_flags
The SKDP packet flag values.
Definition skdp.h:658
@ skdp_flag_establish_response
Definition skdp.h:667
@ skdp_flag_keepalive_request
Definition skdp.h:669
@ skdp_flag_none
Definition skdp.h:659
@ skdp_flag_connect_response
Definition skdp.h:661
@ skdp_flag_session_established
Definition skdp.h:670
@ skdp_flag_encrypted_message
Definition skdp.h:663
@ skdp_flag_establish_request
Definition skdp.h:666
@ skdp_flag_exchange_request
Definition skdp.h:664
@ skdp_flag_establish_verify
Definition skdp.h:668
@ skdp_flag_error_condition
Definition skdp.h:671
@ skdp_flag_connection_terminate
Definition skdp.h:662
@ skdp_flag_exchange_response
Definition skdp.h:665
@ skdp_flag_connect_request
Definition skdp.h:660
#define SKDP_MSTKEY_ENCODED_SIZE
The size (in bytes) of the encoded master key.
Definition skdp.h:400
SKDP_EXPORT_API void skdp_packet_header_serialize(const skdp_network_packet *packet, uint8_t *header)
Serialize a SKDP packet header into a byte array.
Definition skdp.c:157
SKDP_EXPORT_API void skdp_serialize_server_key(uint8_t output[SKDP_SRVKEY_ENCODED_SIZE], const skdp_server_key *skey)
Serialize a server key into a byte array.
Definition skdp.c:62
#define SKDP_SRVKEY_ENCODED_SIZE
The size (in bytes) of the encoded server key.
Definition skdp.h:406
SKDP_EXPORT_API void skdp_deserialize_server_key(skdp_server_key *skey, const uint8_t input[SKDP_SRVKEY_ENCODED_SIZE])
Deserialize a server key from a byte array.
Definition skdp.c:51
The SKDP keep alive state structure.
Definition skdp.h:599
bool recd
Definition skdp.h:602
uint64_t seqctr
Definition skdp.h:601
uint64_t etime
Definition skdp.h:600
The SKDP device key structure.
Definition skdp.h:584
uint8_t kid[SKDP_KID_SIZE]
Definition skdp.h:585
uint64_t expiration
Definition skdp.h:587
uint8_t ddk[SKDP_DDK_SIZE]
Definition skdp.h:586
The SKDP master key structure.
Definition skdp.h:554
uint8_t kid[SKDP_KID_SIZE]
Definition skdp.h:555
uint64_t expiration
Definition skdp.h:557
uint8_t mdk[SKDP_MDK_SIZE]
Definition skdp.h:556
The SKDP network packet structure.
Definition skdp.h:614
uint8_t * pmessage
Definition skdp.h:619
uint32_t msglen
Definition skdp.h:616
uint64_t utctime
Definition skdp.h:618
uint64_t sequence
Definition skdp.h:617
uint8_t flag
Definition skdp.h:615
The SKDP server key structure.
Definition skdp.h:569
uint8_t kid[SKDP_KID_SIZE]
Definition skdp.h:570
uint64_t expiration
Definition skdp.h:572
uint8_t sdk[SKDP_SDK_SIZE]
Definition skdp.h:571