b1a3cb43857d79e3584cd62dc6e600292b785a4a
[iotcloud.git] / version2 / src / C / Crypto.cpp
1 #include "Crypto.h"
2 #include "pbkdf2-sha256.h"
3
4 AESKey::AESKey(Array<char> *password, Array<char> *salt, int iterationCount, int keyLength) {
5
6         // Check if we get the same salt and password from EEPROM---create new ones otherwise
7         char saltBuffer[SALT_LEN], pwdBuffer[PWD_LEN], keyBuffer[KEY_LEN];
8         EEPROM.get(ADDR_SALT, saltBuffer);
9         Array<char> * storedSalt = new Array<char>(saltBuffer, SALT_LEN);
10         EEPROM.get(ADDR_PWD, pwdBuffer);
11         Array<char> * storedPwd = new Array<char>(pwdBuffer, PWD_LEN);
12         if (storedSalt->equals(salt) && storedPwd->equals(password)) { // Take key from EEPROM if match
13                 EEPROM.get(ADDR_KEY, keyBuffer);
14                 key = new Array<char>(keyBuffer, KEY_LEN);
15                 delay(2000);    // Delay for sensor
16         } else {        // Generate a new key if not match
17                 key = new Array<char>(keyLength / 8);
18                 PKCS5_PBKDF2_HMAC((unsigned char *) password->internalArray(), password->length(),
19                                                                                         (unsigned char *) salt->internalArray(), salt->length(),
20                                                                                         iterationCount, keyLength / 8, (unsigned char *) key->internalArray());
21                 // Store new salt and password into EEPROM---write all at once adjacently
22                 char buffer[SALT_LEN + PWD_LEN + KEY_LEN];
23                 memcpy(buffer + SALT_OFFSET, (unsigned char *) salt->internalArray(), SALT_LEN);
24                 memcpy(buffer + PWD_OFFSET, (unsigned char *) password->internalArray(), PWD_LEN);
25                 memcpy(buffer + KEY_OFFSET, (unsigned char *) key->internalArray(), KEY_LEN);
26                 EEPROM.put(ADDR_SALT, buffer);
27         }
28         aes_key_setup((BYTE *)key->internalArray(), key_schedule, keyLength);
29 }
30
31 AESKey::~AESKey() {
32         bzero(key->internalArray(), key->length());
33         delete key;
34         bzero(key_schedule, sizeof(key_schedule));
35 }
36
37 WORD *AESKey::getKeySchedule() {
38         return (WORD *) &key_schedule;
39 }
40
41 Array<char> *AESKey::getKey() {
42         return key;
43 }