diff --git a/btle/btle-sim.h b/btle/btle-sim.h index 15b92e11..677b1f10 100644 --- a/btle/btle-sim.h +++ b/btle/btle-sim.h @@ -20,7 +20,7 @@ */ -#define MAX_BTLE_MSG_SIZE 128 +#define MAX_BTLE_MSG_SIZE 1024 int btle_open(void** dev); int btle_send(const unsigned char* buf, int len, void* context); diff --git a/btle/ecc-client.c b/btle/ecc-client.c index 0738d69f..8b8fd8c5 100644 --- a/btle/ecc-client.c +++ b/btle/ecc-client.c @@ -35,7 +35,10 @@ int main(int argc, char** argv) void* devCtx = NULL; byte peerSalt[EXCHANGE_SALT_SZ]; byte buffer[MAX_BTLE_MSG_SIZE]; - size_t bufLen; + word32 bufferSz; + byte plain[MAX_BTLE_MSG_SIZE]; + word32 plainSz; + ecc_key myKey, peerKey; wolfSSL_Init(); @@ -43,6 +46,11 @@ int main(int argc, char** argv) wolfSSL_Debugging_ON(); #endif + /* make my session key */ + wc_ecc_init(&myKey); + wc_ecc_init(&peerKey); + wc_ecc_make_key(&rng, 32, &myKey); + /* open BTLE */ ret = btle_open(&devCtx); if (ret != 0) { @@ -55,12 +63,24 @@ int main(int argc, char** argv) goto cleanup; } - cliCtx = wc_ecc_ctx_new(REQ_RESP_SERVER, &rng); + cliCtx = wc_ecc_ctx_new(REQ_RESP_CLIENT, &rng); if (cliCtx == NULL) { printf("wc_ecc_ctx_new failed!\n"); ret = -1; goto cleanup; } + /* exchange public keys */ + /* send my public key */ + /* export my public key */ + bufferSz = sizeof(buffer); + wc_ecc_export_x963(&myKey, buffer, &bufferSz); + ret = btle_send(buffer, bufferSz, devCtx); + + /* Get peer key */ + ret = btle_recv(buffer, sizeof(buffer), devCtx); + bufferSz = ret; + ret = wc_ecc_import_x963(buffer, bufferSz, &peerKey); + /* Collect Message to send and get echo */ while (1) { /* get my salt */ @@ -78,17 +98,29 @@ int main(int argc, char** argv) wc_ecc_ctx_set_peer_salt(cliCtx, peerSalt); /* get message to send */ - fgets((char*)buffer, sizeof(buffer), stdin); + bufferSz = sizeof(buffer); + fgets((char*)buffer, bufferSz, stdin); + bufferSz = strlen((char*)buffer); - bufLen = strlen((char*)buffer); + /* Encrypt message */ + bufferSz = sizeof(buffer); + ret = wc_ecc_encrypt(&myKey, &peerKey, plain, plainSz, buffer, &bufferSz, cliCtx); - /* send message */ - btle_send(buffer, bufLen, devCtx); + /* Send message */ + btle_send(buffer, bufferSz, devCtx); - /* get response (echo) */ - btle_recv(buffer, bufLen, devCtx); + /* get message until null termination found */ + bufferSz = sizeof(bufferSz); + ret = btle_recv(buffer, bufferSz, devCtx); - if (strstr((char*)buffer, "EXIT")) + /* decrypt message */ + bufferSz = ret; + ret = wc_ecc_decrypt(&myKey, &peerKey, buffer, bufferSz, plain, &plainSz, cliCtx); + + printf("Recv %d: %s\n", plainSz, plain); + + /* check for exit flag */ + if (strstr((char*)plain, "EXIT")) break; /* reset context (reset my salt) */ diff --git a/btle/ecc-server.c b/btle/ecc-server.c index 52ee95c6..e3e21a98 100644 --- a/btle/ecc-server.c +++ b/btle/ecc-server.c @@ -35,7 +35,10 @@ int main(int argc, char** argv) void* devCtx = NULL; byte peerSalt[EXCHANGE_SALT_SZ]; byte buffer[MAX_BTLE_MSG_SIZE]; - size_t bufLen; + word32 bufferSz; + byte plain[MAX_BTLE_MSG_SIZE]; + word32 plainSz; + ecc_key myKey, peerKey; wolfSSL_Init(); @@ -43,6 +46,11 @@ int main(int argc, char** argv) wolfSSL_Debugging_ON(); #endif + /* make my session key */ + wc_ecc_init(&myKey); + wc_ecc_init(&peerKey); + wc_ecc_make_key(&rng, 32, &myKey); + /* open BTLE */ ret = btle_open(&devCtx); if (ret != 0) { @@ -61,6 +69,18 @@ int main(int argc, char** argv) ret = -1; goto cleanup; } + /* exchange public keys */ + /* Get peer key */ + ret = btle_recv(buffer, sizeof(buffer), devCtx); + bufferSz = ret; + ret = wc_ecc_import_x963(buffer, bufferSz, &peerKey); + + /* send my public key */ + /* export my public key */ + bufferSz = sizeof(buffer); + wc_ecc_export_x963(&myKey, buffer, &bufferSz); + ret = btle_send(buffer, bufferSz, devCtx); + while (1) { mySalt = wc_ecc_ctx_get_own_salt(srvCtx); if (mySalt == NULL) { @@ -75,13 +95,24 @@ int main(int argc, char** argv) ret = btle_send(mySalt, EXCHANGE_SALT_SZ, devCtx); /* get message until null termination found */ - btle_recv(buffer, sizeof(buffer), devCtx); + bufferSz = sizeof(bufferSz); + ret = btle_recv(buffer, bufferSz, devCtx); - bufLen = strlen((char*)buffer); + /* decrypt message */ + bufferSz = ret; + ret = wc_ecc_decrypt(&myKey, &peerKey, buffer, bufferSz, plain, &plainSz, srvCtx); - btle_send(buffer, bufLen, devCtx); + printf("Recv %d: %s\n", plainSz, plain); - if (strstr((char*)buffer, "EXIT")) + /* Encrypt message */ + bufferSz = sizeof(buffer); + ret = wc_ecc_encrypt(&myKey, &peerKey, plain, plainSz, buffer, &bufferSz, srvCtx); + + /* Send message */ + btle_send(buffer, bufferSz, devCtx); + + /* check for exit flag */ + if (strstr((char*)plain, "EXIT")) break; /* reset context (reset my salt) */