wallet
Dependencies: mbed HTTPClient SHA256 uECC MMA8451Q W5500Interface
main.cpp
- Committer:
- kelapuresarthak
- Date:
- 2019-07-30
- Revision:
- 0:c04aac922df3
File content as of revision 0:c04aac922df3:
#include "mbed.h"
#include "uECC.h"
#include "MMA8451Q.h"
#include "SHA256.h"
#include <string>
#include <stdlib.h>
#include "W5500Interface/EthernetInterface.h"
#include "HTTPClient.h"
using namespace std;
char privateKey[43];
char publicKey[81];
char myDevID[6];
PinName const SDA = PTE25;
PinName const SCL = PTE24;
bool isHashed = false;
#define MMA8451_I2C_ADDRESS (0x1d<<1)
int count = 0;
int blockNo = 0;
SHA256 hash;
unsigned int mac_addr[6] = {0x00, 0x08, 0xdc, 0x1c, 0xb8, 0x4a};
char* DEV_ID;
static int RNG(uint8_t *dest, unsigned size) {
//TODO: Add Random number according to mac addr
return 1;
}
/*
Generate Keys using uECC, private and public key. secp256k1
*/
void getKeys(){
const struct uECC_Curve_t * curve = uECC_secp256k1();
uint8_t privKey[21];
uint8_t pubKey[40];
int key_status = uECC_make_key(pubKey, privKey, curve);
if(key_status)
{
for(int i = 0; i < 21; ++i) {
sprintf(privateKey+2*i,"%02x", privKey[i]);
}
for(int j = 0; j < 40; ++j) {
sprintf(publicKey+2*j,"%02x", pubKey[j]);
}
}
wait(1);
}
/*
Send data to the REST API
*/
char* sendData(int block, char* data, char* hash)
{
char sendIP[100]= "192.168.0.110";
char str[512];
char get_msg[1024];
//data?dev_id=123456&block=1&data=1,2,3,4,5,6,7,8,9,10&hash=123456abcdef...
sprintf(get_msg, "http://%s:5000/data?dev_id=%s&block=%d&data=%s&hash=%s", sendIP,DEV_ID,block,data,hash);
HTTPClient http;
printf("msg : %s\r\n",get_msg);
int ret = http.get(get_msg, str, sizeof(str));
if(!ret)
{
printf("\r\nPage fetched successfully - read %d characters\r\n", strlen(str));
printf("Result: %s\r\n", str);
memset(&myDevID,'\0',6);
strcat(myDevID,str);
return myDevID;
}
else
{
printf("Error - ret = %d - HTTP return code = %d\n", ret, http.getHTTPResponseCode());
return "Error";
}
}
/*
Function to get the hash of the data
Input- SHA256 Object
Output- char*
*/
char* hashData(SHA256 data)
{
return (char*)hash.hexString().c_str();
}
/*
Function to sign the data
Input- char*
Output- char*
*/
char* signData(char* data)
{
const struct uECC_Curve_t * curve = uECC_secp256k1();
return (char*)uECC_shared_secret((uint8_t*)publicKey, (uint8_t*)privateKey, (uint8_t*)data, curve);
}
/*
Register the device, public key using REST API
*/
char* registerDevice(char* pubKey)
{
char sendIP[100]= "192.168.0.110";
char str[512];
char get_msg[512];
sprintf(get_msg, "http://%s:5000/register?PublicKey=%s", sendIP,pubKey);
//"http://192.168.0.110:5000/register?PublicKey=7834783543874";
HTTPClient http;
printf("msg : %s\r\n",get_msg);
int ret = http.get(get_msg, str, sizeof(str));
if(!ret)
{
printf("\r\nPage fetched successfully - read %d characters\r\n", strlen(str));
printf("Result: %s\r\n", str);
memset(&myDevID,'\0',6);
strcat(myDevID,str);
return myDevID;
}
else
{
printf("Error - ret = %d - HTTP return code = %d\n", ret, http.getHTTPResponseCode());
return "Error";
}
}
int main(void)
{
char data[30];
memset(data,'\0',strlen(data));
MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
PwmOut rled(LED1);
PwmOut gled(LED2);
PwmOut bled(LED3);
uECC_set_rng(&RNG);
printf("My Keys are\r\n");
getKeys();
printf("Public Key %s\r\n", publicKey);
printf("Private Key %s\r\n", privateKey);
printf("MMA8451 ID: %d\r\n", acc.getWhoAmI());
uint8_t myPos = acc.getOrientation();
uint8_t myOldPos = myPos;
//Ethernet enable
printf("spi init\r\n");
SPI spi(D11, D12, D13); // mosi, miso, sclk
wait(1); // 1 second for stable state
EthernetInterface eth(&spi, D10, D9);//scs(D10), nRESET(PTA20)
printf("App Start\r\n");
wait(1); // 1 second for stable state
uint8_t mac_addr[6] = {0x22, 0x12, 0x34, 0x1c, 0xb8, 0x4a}; // for example
eth.init((uint8_t *)mac_addr); //Use DHCP
eth.connect();
printf("Initialized, MAC: %s\r\n", eth.getMACAddress());
printf("Connected, IP: %s, MASK: %s, GW: %s\r\n",
eth.getIPAddress(), eth.getNetworkMask(), eth.getGateway());
DEV_ID = (char*)registerDevice(publicKey);
if(DEV_ID == "Error")
{
printf("ERROR IN REGISTRATION\r\n");
while(1);
}
while(true)
{
myPos = acc.getOrientation();
if(abs((int)myPos - (int)myOldPos) > 1)
{
printf("Count ");
count++;
printf("%d\r\n",count);
char temp[3];
sprintf(temp,"%d",count);
strcat(data,temp);
strcat(data,",");
myOldPos = myPos;
isHashed = false;
}
if(count % 10 == 0 && count !=0 && isHashed == false)
{
blockNo++;
data[strlen(data)-1] = '\0';
printf("Data %s\r\n", data);
hash.append(data);
hash.finalize();
printf("hash for block %d ", blockNo);
printf("%s\r\n", hashData(hash));
sendData(blockNo, data, hashData(hash));
hash.reset();
memset(data,'\0',strlen(data));
isHashed = true;
}
wait(1);
}
}