wallet

Dependencies:   mbed HTTPClient SHA256 uECC MMA8451Q W5500Interface

Committer:
kelapuresarthak
Date:
Tue Jul 30 09:00:36 2019 +0000
Revision:
0:c04aac922df3
test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kelapuresarthak 0:c04aac922df3 1 #include "mbed.h"
kelapuresarthak 0:c04aac922df3 2 #include "uECC.h"
kelapuresarthak 0:c04aac922df3 3 #include "MMA8451Q.h"
kelapuresarthak 0:c04aac922df3 4 #include "SHA256.h"
kelapuresarthak 0:c04aac922df3 5 #include <string>
kelapuresarthak 0:c04aac922df3 6 #include <stdlib.h>
kelapuresarthak 0:c04aac922df3 7 #include "W5500Interface/EthernetInterface.h"
kelapuresarthak 0:c04aac922df3 8 #include "HTTPClient.h"
kelapuresarthak 0:c04aac922df3 9 using namespace std;
kelapuresarthak 0:c04aac922df3 10
kelapuresarthak 0:c04aac922df3 11
kelapuresarthak 0:c04aac922df3 12 char privateKey[43];
kelapuresarthak 0:c04aac922df3 13 char publicKey[81];
kelapuresarthak 0:c04aac922df3 14
kelapuresarthak 0:c04aac922df3 15 char myDevID[6];
kelapuresarthak 0:c04aac922df3 16
kelapuresarthak 0:c04aac922df3 17 PinName const SDA = PTE25;
kelapuresarthak 0:c04aac922df3 18 PinName const SCL = PTE24;
kelapuresarthak 0:c04aac922df3 19 bool isHashed = false;
kelapuresarthak 0:c04aac922df3 20
kelapuresarthak 0:c04aac922df3 21 #define MMA8451_I2C_ADDRESS (0x1d<<1)
kelapuresarthak 0:c04aac922df3 22
kelapuresarthak 0:c04aac922df3 23 int count = 0;
kelapuresarthak 0:c04aac922df3 24 int blockNo = 0;
kelapuresarthak 0:c04aac922df3 25 SHA256 hash;
kelapuresarthak 0:c04aac922df3 26 unsigned int mac_addr[6] = {0x00, 0x08, 0xdc, 0x1c, 0xb8, 0x4a};
kelapuresarthak 0:c04aac922df3 27
kelapuresarthak 0:c04aac922df3 28 char* DEV_ID;
kelapuresarthak 0:c04aac922df3 29
kelapuresarthak 0:c04aac922df3 30 static int RNG(uint8_t *dest, unsigned size) {
kelapuresarthak 0:c04aac922df3 31 //TODO: Add Random number according to mac addr
kelapuresarthak 0:c04aac922df3 32 return 1;
kelapuresarthak 0:c04aac922df3 33 }
kelapuresarthak 0:c04aac922df3 34
kelapuresarthak 0:c04aac922df3 35 /*
kelapuresarthak 0:c04aac922df3 36 Generate Keys using uECC, private and public key. secp256k1
kelapuresarthak 0:c04aac922df3 37 */
kelapuresarthak 0:c04aac922df3 38 void getKeys(){
kelapuresarthak 0:c04aac922df3 39 const struct uECC_Curve_t * curve = uECC_secp256k1();
kelapuresarthak 0:c04aac922df3 40 uint8_t privKey[21];
kelapuresarthak 0:c04aac922df3 41
kelapuresarthak 0:c04aac922df3 42 uint8_t pubKey[40];
kelapuresarthak 0:c04aac922df3 43
kelapuresarthak 0:c04aac922df3 44 int key_status = uECC_make_key(pubKey, privKey, curve);
kelapuresarthak 0:c04aac922df3 45 if(key_status)
kelapuresarthak 0:c04aac922df3 46 {
kelapuresarthak 0:c04aac922df3 47 for(int i = 0; i < 21; ++i) {
kelapuresarthak 0:c04aac922df3 48 sprintf(privateKey+2*i,"%02x", privKey[i]);
kelapuresarthak 0:c04aac922df3 49 }
kelapuresarthak 0:c04aac922df3 50 for(int j = 0; j < 40; ++j) {
kelapuresarthak 0:c04aac922df3 51 sprintf(publicKey+2*j,"%02x", pubKey[j]);
kelapuresarthak 0:c04aac922df3 52 }
kelapuresarthak 0:c04aac922df3 53 }
kelapuresarthak 0:c04aac922df3 54
kelapuresarthak 0:c04aac922df3 55 wait(1);
kelapuresarthak 0:c04aac922df3 56 }
kelapuresarthak 0:c04aac922df3 57
kelapuresarthak 0:c04aac922df3 58 /*
kelapuresarthak 0:c04aac922df3 59 Send data to the REST API
kelapuresarthak 0:c04aac922df3 60 */
kelapuresarthak 0:c04aac922df3 61 char* sendData(int block, char* data, char* hash)
kelapuresarthak 0:c04aac922df3 62 {
kelapuresarthak 0:c04aac922df3 63 char sendIP[100]= "192.168.0.110";
kelapuresarthak 0:c04aac922df3 64 char str[512];
kelapuresarthak 0:c04aac922df3 65 char get_msg[1024];
kelapuresarthak 0:c04aac922df3 66 //data?dev_id=123456&block=1&data=1,2,3,4,5,6,7,8,9,10&hash=123456abcdef...
kelapuresarthak 0:c04aac922df3 67
kelapuresarthak 0:c04aac922df3 68 sprintf(get_msg, "http://%s:5000/data?dev_id=%s&block=%d&data=%s&hash=%s", sendIP,DEV_ID,block,data,hash);
kelapuresarthak 0:c04aac922df3 69
kelapuresarthak 0:c04aac922df3 70 HTTPClient http;
kelapuresarthak 0:c04aac922df3 71
kelapuresarthak 0:c04aac922df3 72 printf("msg : %s\r\n",get_msg);
kelapuresarthak 0:c04aac922df3 73 int ret = http.get(get_msg, str, sizeof(str));
kelapuresarthak 0:c04aac922df3 74 if(!ret)
kelapuresarthak 0:c04aac922df3 75 {
kelapuresarthak 0:c04aac922df3 76 printf("\r\nPage fetched successfully - read %d characters\r\n", strlen(str));
kelapuresarthak 0:c04aac922df3 77 printf("Result: %s\r\n", str);
kelapuresarthak 0:c04aac922df3 78 memset(&myDevID,'\0',6);
kelapuresarthak 0:c04aac922df3 79 strcat(myDevID,str);
kelapuresarthak 0:c04aac922df3 80 return myDevID;
kelapuresarthak 0:c04aac922df3 81 }
kelapuresarthak 0:c04aac922df3 82 else
kelapuresarthak 0:c04aac922df3 83 {
kelapuresarthak 0:c04aac922df3 84 printf("Error - ret = %d - HTTP return code = %d\n", ret, http.getHTTPResponseCode());
kelapuresarthak 0:c04aac922df3 85 return "Error";
kelapuresarthak 0:c04aac922df3 86 }
kelapuresarthak 0:c04aac922df3 87 }
kelapuresarthak 0:c04aac922df3 88
kelapuresarthak 0:c04aac922df3 89 /*
kelapuresarthak 0:c04aac922df3 90 Function to get the hash of the data
kelapuresarthak 0:c04aac922df3 91 Input- SHA256 Object
kelapuresarthak 0:c04aac922df3 92 Output- char*
kelapuresarthak 0:c04aac922df3 93 */
kelapuresarthak 0:c04aac922df3 94 char* hashData(SHA256 data)
kelapuresarthak 0:c04aac922df3 95 {
kelapuresarthak 0:c04aac922df3 96 return (char*)hash.hexString().c_str();
kelapuresarthak 0:c04aac922df3 97 }
kelapuresarthak 0:c04aac922df3 98
kelapuresarthak 0:c04aac922df3 99 /*
kelapuresarthak 0:c04aac922df3 100 Function to sign the data
kelapuresarthak 0:c04aac922df3 101 Input- char*
kelapuresarthak 0:c04aac922df3 102 Output- char*
kelapuresarthak 0:c04aac922df3 103 */
kelapuresarthak 0:c04aac922df3 104 char* signData(char* data)
kelapuresarthak 0:c04aac922df3 105 {
kelapuresarthak 0:c04aac922df3 106 const struct uECC_Curve_t * curve = uECC_secp256k1();
kelapuresarthak 0:c04aac922df3 107 return (char*)uECC_shared_secret((uint8_t*)publicKey, (uint8_t*)privateKey, (uint8_t*)data, curve);
kelapuresarthak 0:c04aac922df3 108 }
kelapuresarthak 0:c04aac922df3 109 /*
kelapuresarthak 0:c04aac922df3 110 Register the device, public key using REST API
kelapuresarthak 0:c04aac922df3 111 */
kelapuresarthak 0:c04aac922df3 112 char* registerDevice(char* pubKey)
kelapuresarthak 0:c04aac922df3 113 {
kelapuresarthak 0:c04aac922df3 114 char sendIP[100]= "192.168.0.110";
kelapuresarthak 0:c04aac922df3 115 char str[512];
kelapuresarthak 0:c04aac922df3 116 char get_msg[512];
kelapuresarthak 0:c04aac922df3 117 sprintf(get_msg, "http://%s:5000/register?PublicKey=%s", sendIP,pubKey);
kelapuresarthak 0:c04aac922df3 118 //"http://192.168.0.110:5000/register?PublicKey=7834783543874";
kelapuresarthak 0:c04aac922df3 119
kelapuresarthak 0:c04aac922df3 120 HTTPClient http;
kelapuresarthak 0:c04aac922df3 121
kelapuresarthak 0:c04aac922df3 122 printf("msg : %s\r\n",get_msg);
kelapuresarthak 0:c04aac922df3 123 int ret = http.get(get_msg, str, sizeof(str));
kelapuresarthak 0:c04aac922df3 124 if(!ret)
kelapuresarthak 0:c04aac922df3 125 {
kelapuresarthak 0:c04aac922df3 126 printf("\r\nPage fetched successfully - read %d characters\r\n", strlen(str));
kelapuresarthak 0:c04aac922df3 127 printf("Result: %s\r\n", str);
kelapuresarthak 0:c04aac922df3 128 memset(&myDevID,'\0',6);
kelapuresarthak 0:c04aac922df3 129 strcat(myDevID,str);
kelapuresarthak 0:c04aac922df3 130 return myDevID;
kelapuresarthak 0:c04aac922df3 131 }
kelapuresarthak 0:c04aac922df3 132 else
kelapuresarthak 0:c04aac922df3 133 {
kelapuresarthak 0:c04aac922df3 134 printf("Error - ret = %d - HTTP return code = %d\n", ret, http.getHTTPResponseCode());
kelapuresarthak 0:c04aac922df3 135 return "Error";
kelapuresarthak 0:c04aac922df3 136 }
kelapuresarthak 0:c04aac922df3 137 }
kelapuresarthak 0:c04aac922df3 138
kelapuresarthak 0:c04aac922df3 139 int main(void)
kelapuresarthak 0:c04aac922df3 140 {
kelapuresarthak 0:c04aac922df3 141 char data[30];
kelapuresarthak 0:c04aac922df3 142 memset(data,'\0',strlen(data));
kelapuresarthak 0:c04aac922df3 143 MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
kelapuresarthak 0:c04aac922df3 144 PwmOut rled(LED1);
kelapuresarthak 0:c04aac922df3 145 PwmOut gled(LED2);
kelapuresarthak 0:c04aac922df3 146 PwmOut bled(LED3);
kelapuresarthak 0:c04aac922df3 147 uECC_set_rng(&RNG);
kelapuresarthak 0:c04aac922df3 148 printf("My Keys are\r\n");
kelapuresarthak 0:c04aac922df3 149 getKeys();
kelapuresarthak 0:c04aac922df3 150 printf("Public Key %s\r\n", publicKey);
kelapuresarthak 0:c04aac922df3 151 printf("Private Key %s\r\n", privateKey);
kelapuresarthak 0:c04aac922df3 152 printf("MMA8451 ID: %d\r\n", acc.getWhoAmI());
kelapuresarthak 0:c04aac922df3 153 uint8_t myPos = acc.getOrientation();
kelapuresarthak 0:c04aac922df3 154 uint8_t myOldPos = myPos;
kelapuresarthak 0:c04aac922df3 155
kelapuresarthak 0:c04aac922df3 156 //Ethernet enable
kelapuresarthak 0:c04aac922df3 157 printf("spi init\r\n");
kelapuresarthak 0:c04aac922df3 158 SPI spi(D11, D12, D13); // mosi, miso, sclk
kelapuresarthak 0:c04aac922df3 159 wait(1); // 1 second for stable state
kelapuresarthak 0:c04aac922df3 160 EthernetInterface eth(&spi, D10, D9);//scs(D10), nRESET(PTA20)
kelapuresarthak 0:c04aac922df3 161 printf("App Start\r\n");
kelapuresarthak 0:c04aac922df3 162 wait(1); // 1 second for stable state
kelapuresarthak 0:c04aac922df3 163
kelapuresarthak 0:c04aac922df3 164 uint8_t mac_addr[6] = {0x22, 0x12, 0x34, 0x1c, 0xb8, 0x4a}; // for example
kelapuresarthak 0:c04aac922df3 165
kelapuresarthak 0:c04aac922df3 166 eth.init((uint8_t *)mac_addr); //Use DHCP
kelapuresarthak 0:c04aac922df3 167 eth.connect();
kelapuresarthak 0:c04aac922df3 168 printf("Initialized, MAC: %s\r\n", eth.getMACAddress());
kelapuresarthak 0:c04aac922df3 169 printf("Connected, IP: %s, MASK: %s, GW: %s\r\n",
kelapuresarthak 0:c04aac922df3 170 eth.getIPAddress(), eth.getNetworkMask(), eth.getGateway());
kelapuresarthak 0:c04aac922df3 171
kelapuresarthak 0:c04aac922df3 172 DEV_ID = (char*)registerDevice(publicKey);
kelapuresarthak 0:c04aac922df3 173 if(DEV_ID == "Error")
kelapuresarthak 0:c04aac922df3 174 {
kelapuresarthak 0:c04aac922df3 175 printf("ERROR IN REGISTRATION\r\n");
kelapuresarthak 0:c04aac922df3 176 while(1);
kelapuresarthak 0:c04aac922df3 177 }
kelapuresarthak 0:c04aac922df3 178 while(true)
kelapuresarthak 0:c04aac922df3 179 {
kelapuresarthak 0:c04aac922df3 180 myPos = acc.getOrientation();
kelapuresarthak 0:c04aac922df3 181 if(abs((int)myPos - (int)myOldPos) > 1)
kelapuresarthak 0:c04aac922df3 182 {
kelapuresarthak 0:c04aac922df3 183 printf("Count ");
kelapuresarthak 0:c04aac922df3 184 count++;
kelapuresarthak 0:c04aac922df3 185 printf("%d\r\n",count);
kelapuresarthak 0:c04aac922df3 186 char temp[3];
kelapuresarthak 0:c04aac922df3 187 sprintf(temp,"%d",count);
kelapuresarthak 0:c04aac922df3 188 strcat(data,temp);
kelapuresarthak 0:c04aac922df3 189 strcat(data,",");
kelapuresarthak 0:c04aac922df3 190 myOldPos = myPos;
kelapuresarthak 0:c04aac922df3 191 isHashed = false;
kelapuresarthak 0:c04aac922df3 192 }
kelapuresarthak 0:c04aac922df3 193 if(count % 10 == 0 && count !=0 && isHashed == false)
kelapuresarthak 0:c04aac922df3 194 {
kelapuresarthak 0:c04aac922df3 195 blockNo++;
kelapuresarthak 0:c04aac922df3 196 data[strlen(data)-1] = '\0';
kelapuresarthak 0:c04aac922df3 197 printf("Data %s\r\n", data);
kelapuresarthak 0:c04aac922df3 198 hash.append(data);
kelapuresarthak 0:c04aac922df3 199 hash.finalize();
kelapuresarthak 0:c04aac922df3 200 printf("hash for block %d ", blockNo);
kelapuresarthak 0:c04aac922df3 201 printf("%s\r\n", hashData(hash));
kelapuresarthak 0:c04aac922df3 202 sendData(blockNo, data, hashData(hash));
kelapuresarthak 0:c04aac922df3 203 hash.reset();
kelapuresarthak 0:c04aac922df3 204 memset(data,'\0',strlen(data));
kelapuresarthak 0:c04aac922df3 205 isHashed = true;
kelapuresarthak 0:c04aac922df3 206 }
kelapuresarthak 0:c04aac922df3 207 wait(1);
kelapuresarthak 0:c04aac922df3 208 }
kelapuresarthak 0:c04aac922df3 209 }
kelapuresarthak 0:c04aac922df3 210
kelapuresarthak 0:c04aac922df3 211