2 #include "pbkdf2-sha256.h"
4 AESKey::AESKey(Array<char> *password, Array<char> *salt, int iterationCount, int keyLength) {
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);
28 aes_key_setup((BYTE *)key->internalArray(), key_schedule, keyLength);
32 bzero(key->internalArray(), key->length());
34 bzero(key_schedule, sizeof(key_schedule));
37 WORD *AESKey::getKeySchedule() {
38 return (WORD *) &key_schedule;
41 Array<char> *AESKey::getKey() {