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); } }