Commit 0563996a authored by Vladislav Rykov's avatar Vladislav Rykov
Browse files

data decryption tested pass

parent 1e481801
No preview for this file type
...@@ -12,8 +12,6 @@ ...@@ -12,8 +12,6 @@
extern "C" { extern "C" {
#endif #endif
typedef void (* gateway_protocol_checkup_callback_t)(gateway_protocol_conf *);
typedef enum { typedef enum {
GATEWAY_PROTOCOL_PACKET_TYPE_DATA_SEND = 0x00, GATEWAY_PROTOCOL_PACKET_TYPE_DATA_SEND = 0x00,
GATEWAY_PROTOCOL_PACKET_TYPE_PEND_REQ = 0x04, GATEWAY_PROTOCOL_PACKET_TYPE_PEND_REQ = 0x04,
...@@ -31,12 +29,14 @@ typedef enum { ...@@ -31,12 +29,14 @@ typedef enum {
} gateway_protocol_stat_t; } gateway_protocol_stat_t;
typedef struct { typedef struct {
uint8_t app_key[GATEWAY_PROTOCOL_APPKEY_SIZE]; uint8_t app_key[GATEWAY_PROTOCOL_APPKEY_SIZE +1];
uint8_t dev_id; uint8_t dev_id;
uint8_t secure_key[GATEWAY_PROTOCOL_SECURE_KEY_SIZE]; uint8_t secure_key[GATEWAY_PROTOCOL_SECURE_KEY_SIZE];
uint8_t secure; uint8_t secure;
} gateway_protocol_conf_t; } gateway_protocol_conf_t;
typedef void (* gateway_protocol_checkup_callback_t)(gateway_protocol_conf_t *);
void gateway_protocol_packet_encode ( void gateway_protocol_packet_encode (
const gateway_protocol_conf_t *gwp_conf, const gateway_protocol_conf_t *gwp_conf,
...@@ -51,8 +51,8 @@ uint8_t gateway_protocol_packet_decode ( ...@@ -51,8 +51,8 @@ uint8_t gateway_protocol_packet_decode (
gateway_protocol_packet_type_t *packet_type, gateway_protocol_packet_type_t *packet_type,
uint8_t *payload_length, uint8_t *payload_length,
uint8_t *payload, uint8_t *payload,
const uint8_t packet_length, uint8_t packet_length,
const uint8_t *packet); uint8_t *packet);
void gateway_protocol_set_checkup_callback(gateway_protocol_checkup_callback_t callback); void gateway_protocol_set_checkup_callback(gateway_protocol_checkup_callback_t callback);
......
...@@ -49,8 +49,7 @@ typedef struct { ...@@ -49,8 +49,7 @@ typedef struct {
} sensor_data_t; } sensor_data_t;
typedef struct { typedef struct {
uint8_t app_key[GATEWAY_PROTOCOL_APP_KEY_SIZE +1]; gateway_protocol_conf_t gwp_conf;
uint8_t dev_id;
int server_desc; int server_desc;
int client_desc; int client_desc;
struct sockaddr_in server; struct sockaddr_in server;
...@@ -103,6 +102,8 @@ void gateway_protocol_mk_stat( ...@@ -103,6 +102,8 @@ void gateway_protocol_mk_stat(
void send_utc(gcom_ch_t *pch); void send_utc(gcom_ch_t *pch);
void gateway_protocol_checkup_callback(gateway_protocol_conf_t *gwp_conf);
void ctrc_handler (int sig); void ctrc_handler (int sig);
static volatile uint8_t working = 1; static volatile uint8_t working = 1;
...@@ -157,6 +158,8 @@ int main (int argc, char **argv) { ...@@ -157,6 +158,8 @@ int main (int argc, char **argv) {
} }
pthread_mutex_init(&mutex, NULL); pthread_mutex_init(&mutex, NULL);
gateway_protocol_set_checkup_callback(gateway_protocol_checkup_callback);
while (working) { while (working) {
gcom_ch_request_t *req = (gcom_ch_request_t *)malloc(sizeof(gcom_ch_request_t)); gcom_ch_request_t *req = (gcom_ch_request_t *)malloc(sizeof(gcom_ch_request_t));
...@@ -190,10 +193,10 @@ void process_packet(void *request) { ...@@ -190,10 +193,10 @@ void process_packet(void *request) {
uint8_t payload[DEVICE_DATA_MAX_LENGTH]; uint8_t payload[DEVICE_DATA_MAX_LENGTH];
uint8_t payload_length; uint8_t payload_length;
PGresult *res; PGresult *res;
int i;
if (packet_decode( if (gateway_protocol_packet_decode(
req->gch.app_key, &(req->gch.gwp_conf),
&(req->gch.dev_id),
&(req->packet_type), &(req->packet_type),
&payload_length, payload, &payload_length, payload,
req->packet_length, req->packet)) req->packet_length, req->packet))
...@@ -221,7 +224,7 @@ void process_packet(void *request) { ...@@ -221,7 +224,7 @@ void process_packet(void *request) {
strftime(sensor_data.timedate, TIMEDATE_LENGTH, "%d/%m/%Y %H:%M:%S", localtime(&t)); strftime(sensor_data.timedate, TIMEDATE_LENGTH, "%d/%m/%Y %H:%M:%S", localtime(&t));
snprintf(db_query, sizeof(db_query), snprintf(db_query, sizeof(db_query),
"INSERT INTO dev_%s_%d VALUES (%lu, '%s', $1)", "INSERT INTO dev_%s_%d VALUES (%lu, '%s', $1)",
(char *)req->gch.app_key, req->gch.dev_id, t, sensor_data.timedate (char *)req->gch.gwp_conf.app_key, req->gch.gwp_conf.dev_id, t, sensor_data.timedate
); );
const char *params[1]; const char *params[1];
...@@ -240,7 +243,7 @@ void process_packet(void *request) { ...@@ -240,7 +243,7 @@ void process_packet(void *request) {
snprintf(db_query, sizeof(db_query), snprintf(db_query, sizeof(db_query),
"SELECT * FROM pend_msgs WHERE app_key='%s' and dev_id = %d and ack = False", "SELECT * FROM pend_msgs WHERE app_key='%s' and dev_id = %d and ack = False",
(char *)req->gch.app_key, req->gch.dev_id (char *)req->gch.gwp_conf.app_key, req->gch.gwp_conf.dev_id
); );
pthread_mutex_lock(&mutex); pthread_mutex_lock(&mutex);
...@@ -270,7 +273,7 @@ void process_packet(void *request) { ...@@ -270,7 +273,7 @@ void process_packet(void *request) {
char db_query[200]; char db_query[200];
snprintf(db_query, sizeof(db_query), snprintf(db_query, sizeof(db_query),
"SELECT * FROM pend_msgs WHERE app_key = '%s' AND dev_id = %d AND ack = False", "SELECT * FROM pend_msgs WHERE app_key = '%s' AND dev_id = %d AND ack = False",
(char *)req->gch.app_key, req->gch.dev_id (char *)req->gch.gwp_conf.app_key, req->gch.gwp_conf.dev_id
); );
pthread_mutex_lock(&mutex); pthread_mutex_lock(&mutex);
res = PQexec(conn, db_query); res = PQexec(conn, db_query);
...@@ -289,9 +292,8 @@ void process_packet(void *request) { ...@@ -289,9 +292,8 @@ void process_packet(void *request) {
// send the msg until ack is received // send the msg until ack is received
uint8_t received_ack = 0; uint8_t received_ack = 0;
uint8_t pend_send_retries = PEND_SEND_RETRIES_MAX; uint8_t pend_send_retries = PEND_SEND_RETRIES_MAX;
packet_encode( gateway_protocol_packet_encode(
req->gch.app_key, &(req->gch.gwp_conf),
req->gch.dev_id,
GATEWAY_PROTOCOL_PACKET_TYPE_PEND_SEND, GATEWAY_PROTOCOL_PACKET_TYPE_PEND_SEND,
payload_length, payload, payload_length, payload,
&(req->packet_length), req->packet); &(req->packet_length), req->packet);
...@@ -321,7 +323,7 @@ void process_packet(void *request) { ...@@ -321,7 +323,7 @@ void process_packet(void *request) {
send_gcom_ch(&(req->gch), req->packet, req->packet_length); send_gcom_ch(&(req->gch), req->packet, req->packet_length);
printf("nothing for app %s dev %d\n", (char *)req->gch.app_key, req->gch.dev_id); printf("nothing for app %s dev %d\n", (char *)req->gch.gwp_conf.app_key, req->gch.gwp_conf.dev_id);
} }
} else if (req->packet_type == GATEWAY_PROTOCOL_PACKET_TYPE_STAT) { } else if (req->packet_type == GATEWAY_PROTOCOL_PACKET_TYPE_STAT) {
// TODO change to ACK_PEND = 0x01 // TODO change to ACK_PEND = 0x01
...@@ -329,7 +331,7 @@ void process_packet(void *request) { ...@@ -329,7 +331,7 @@ void process_packet(void *request) {
char db_query[200]; char db_query[200];
snprintf(db_query, sizeof(db_query), snprintf(db_query, sizeof(db_query),
"SELECT * FROM pend_msgs WHERE app_key = '%s' AND dev_id = %d AND ack = False", "SELECT * FROM pend_msgs WHERE app_key = '%s' AND dev_id = %d AND ack = False",
(char *)req->gch.app_key, req->gch.dev_id (char *)req->gch.gwp_conf.app_key, req->gch.gwp_conf.dev_id
); );
pthread_mutex_lock(&mutex); pthread_mutex_lock(&mutex);
res = PQexec(conn, db_query); res = PQexec(conn, db_query);
...@@ -337,7 +339,7 @@ void process_packet(void *request) { ...@@ -337,7 +339,7 @@ void process_packet(void *request) {
if (PQresultStatus(res) == PGRES_TUPLES_OK && PQntuples(res)) { if (PQresultStatus(res) == PGRES_TUPLES_OK && PQntuples(res)) {
snprintf(db_query, sizeof(db_query), snprintf(db_query, sizeof(db_query),
"UPDATE pend_msgs SET ack = True WHERE app_key = '%s' AND dev_id = %d AND msg = '%s'", "UPDATE pend_msgs SET ack = True WHERE app_key = '%s' AND dev_id = %d AND msg = '%s'",
(char *)req->gch.app_key, req->gch.dev_id, PQgetvalue(res, 0, 2) (char *)req->gch.gwp_conf.app_key, req->gch.gwp_conf.dev_id, PQgetvalue(res, 0, 2)
); );
PQclear(res); PQclear(res);
pthread_mutex_lock(&mutex); pthread_mutex_lock(&mutex);
...@@ -449,9 +451,8 @@ void gateway_protocol_mk_stat( ...@@ -449,9 +451,8 @@ void gateway_protocol_mk_stat(
uint8_t *pck, uint8_t *pck,
uint8_t *pck_len) uint8_t *pck_len)
{ {
packet_encode( gateway_protocol_packet_encode(
gch->app_key, &(gch->gwp_conf),
gch->dev_id,
GATEWAY_PROTOCOL_PACKET_TYPE_STAT, GATEWAY_PROTOCOL_PACKET_TYPE_STAT,
1, (uint8_t *)&stat, 1, (uint8_t *)&stat,
pck_len, pck); pck_len, pck);
...@@ -466,9 +467,8 @@ void send_utc(gcom_ch_t *gch) { ...@@ -466,9 +467,8 @@ void send_utc(gcom_ch_t *gch) {
gettimeofday(&tv, NULL); gettimeofday(&tv, NULL);
packet_encode ( gateway_protocol_packet_encode (
gch->app_key, &(gch->gwp_conf),
gch->dev_id,
GATEWAY_PROTOCOL_PACKET_TYPE_TIME_SEND, GATEWAY_PROTOCOL_PACKET_TYPE_TIME_SEND,
sizeof(uint32_t), (uint8_t *)&tv.tv_sec, sizeof(uint32_t), (uint8_t *)&tv.tv_sec,
&buf_len, buf &buf_len, buf
...@@ -477,6 +477,26 @@ void send_utc(gcom_ch_t *gch) { ...@@ -477,6 +477,26 @@ void send_utc(gcom_ch_t *gch) {
send_gcom_ch(gch, buf, buf_len); send_gcom_ch(gch, buf, buf_len);
} }
void gateway_protocol_checkup_callback(gateway_protocol_conf_t *gwp_conf) {
PGresult *res;
char db_query[200];
int i;
snprintf(db_query, sizeof(db_query),
"SELECT secure_key, secure FROM applications WHERE app_key = '%s'", (char *)gwp_conf->app_key
);
pthread_mutex_lock(&mutex);
res = PQexec(conn, db_query);
pthread_mutex_unlock(&mutex);
if ((PQresultStatus(res) == PGRES_TUPLES_OK) && PQntuples(res)) {
base64_decode(PQgetvalue(res, 0, 0), strlen(PQgetvalue(res, 0, 0))-1, gwp_conf->secure_key);
gwp_conf->secure = PQgetvalue(res, 0, 1)[0] == 't';
} else {
perror("gateway_protocol_checkup_callback error");
}
PQclear(res);
}
int send_gcom_ch(gcom_ch_t *gch, uint8_t *pck, uint8_t pck_size) { int send_gcom_ch(gcom_ch_t *gch, uint8_t *pck, uint8_t pck_size) {
int ret; int ret;
...@@ -497,9 +517,9 @@ int recv_gcom_ch(gcom_ch_t *gch, uint8_t *pck, uint8_t *pck_length, uint16_t pck ...@@ -497,9 +517,9 @@ int recv_gcom_ch(gcom_ch_t *gch, uint8_t *pck, uint8_t *pck_length, uint16_t pck
} }
//uint8_t decyphered[160]; //uint8_t decyphered[160];
uint8_t skey[16] = { 0x73, 0x60, 0xe4, 0x5e, 0x09, 0xa0, 0x5e, 0xab, 0xb1, 0x69, 0xdf, 0x1f, 0x8c, 0x80, 0x72, 0xd5 }; //uint8_t skey[16] = { 0x73, 0x60, 0xe4, 0x5e, 0x09, 0xa0, 0x5e, 0xab, 0xb1, 0x69, 0xdf, 0x1f, 0x8c, 0x80, 0x72, 0xd5 };
struct AES_ctx ctx; //struct AES_ctx ctx;
AES_init_ctx(&ctx, skey); //AES_init_ctx(&ctx, skey);
printf("%d\n", ret); printf("%d\n", ret);
for (i = 0; i < *pck_length; i++) { for (i = 0; i < *pck_length; i++) {
...@@ -507,13 +527,6 @@ int recv_gcom_ch(gcom_ch_t *gch, uint8_t *pck, uint8_t *pck_length, uint16_t pck ...@@ -507,13 +527,6 @@ int recv_gcom_ch(gcom_ch_t *gch, uint8_t *pck, uint8_t *pck_length, uint16_t pck
} }
printf("\n"); printf("\n");
for (i = 0; i < *pck_length-9 ; i+= 16)
AES_ECB_decrypt(&ctx, &pck[9+i]);
for (i = 0; i < *pck_length; i++) {
printf("%02X : ", pck[i]);
}
printf("\n");
return ret; return ret;
......
#include <gateway_protocol.h> #include "gateway_protocol.h"
#include "security_adapter.h" #include "security_adapter.h"
#define GATEWAY_PROTOCOL_APP_KEY_SIZE 8 #define GATEWAY_PROTOCOL_APP_KEY_SIZE 8
...@@ -32,10 +32,10 @@ void gateway_protocol_packet_encode ( ...@@ -32,10 +32,10 @@ void gateway_protocol_packet_encode (
if (gwp_conf->secure) { if (gwp_conf->secure) {
security_adapter_encrypt( gwp_conf->secure_key, security_adapter_encrypt( gwp_conf->secure_key,
&packet[GATWAY_PROTOCOL_APP_KEY_SIZE], &packet[GATEWAY_PROTOCOL_APP_KEY_SIZE],
*packet_length, packet_length,
&packet[GATWAY_PROTOCOL_APP_KEY_SIZE], &packet[GATEWAY_PROTOCOL_APP_KEY_SIZE],
*packet_length-GATEWAY_PROTOCOL_APP_KEY_SIZE (*packet_length-GATEWAY_PROTOCOL_APP_KEY_SIZE)
); );
(*packet_length) += GATEWAY_PROTOCOL_APP_KEY_SIZE; (*packet_length) += GATEWAY_PROTOCOL_APP_KEY_SIZE;
} }
...@@ -46,22 +46,23 @@ uint8_t gateway_protocol_packet_decode ( ...@@ -46,22 +46,23 @@ uint8_t gateway_protocol_packet_decode (
gateway_protocol_packet_type_t *packet_type, gateway_protocol_packet_type_t *packet_type,
uint8_t *payload_length, uint8_t *payload_length,
uint8_t *payload, uint8_t *payload,
const uint8_t packet_length, uint8_t packet_length,
const uint8_t *packet) uint8_t *packet)
{ {
uint8_t p_len = 0; uint8_t p_len = 0;
memcpy(gwp_conf->app_key, &packet[p_len], GATEWAY_PROTOCOL_APP_KEY_SIZE); memcpy(gwp_conf->app_key, &packet[p_len], GATEWAY_PROTOCOL_APP_KEY_SIZE);
p_len += GATEWAY_PROTOCOL_APP_KEY_SIZE; p_len += GATEWAY_PROTOCOL_APP_KEY_SIZE;
checkup_callback(gwp_conf); gwp_conf->app_key[GATEWAY_PROTOCOL_APP_KEY_SIZE] = '\0';
checkup_callback(gwp_conf);
if (gwp_conf->secure) { if (gwp_conf->secure) {
security_adapter_decrypt( gwp_conf->secure_key, security_adapter_decrypt( gwp_conf->secure_key,
&packet[GATWAY_PROTOCOL_APP_KEY_SIZE], &packet[GATEWAY_PROTOCOL_APP_KEY_SIZE],
packet_length-GATEWAY_PROTOCOL_APP_KEY_SIZE (packet_length-GATEWAY_PROTOCOL_APP_KEY_SIZE),
&packet[GATWAY_PROTOCOL_APP_KEY_SIZE], &packet[GATEWAY_PROTOCOL_APP_KEY_SIZE],
*packet_length &packet_length
); );
} }
......
...@@ -29,6 +29,8 @@ void security_adapter_decrypt( ...@@ -29,6 +29,8 @@ void security_adapter_decrypt(
uint8_t *decrypted_payload, uint8_t *decrypted_payload,
uint8_t *decrypted_payload_length) uint8_t *decrypted_payload_length)
{ {
// assert(encrypted_payload_length % SECURITY_KEY_SIZE == 0);
uint16_t i; uint16_t i;
struct AES_ctx ctx; struct AES_ctx ctx;
AES_init_ctx(&ctx, secure_key); AES_init_ctx(&ctx, secure_key);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment