wallet
Dependencies: mbed HTTPClient SHA256 uECC MMA8451Q W5500Interface
main.cpp@0:c04aac922df3, 2019-07-30 (annotated)
- Committer:
- kelapuresarthak
- Date:
- Tue Jul 30 09:00:36 2019 +0000
- Revision:
- 0:c04aac922df3
test
Who changed what in which revision?
User | Revision | Line number | New 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 |