SHA256
ESP32: новая derivation ключей
This commit is contained in:
+17
-14
@@ -224,12 +224,14 @@ static int16_t gTouchLastY = 0;
|
||||
struct DerivedKeyState {
|
||||
bool ready;
|
||||
uint8_t masterSecret[32];
|
||||
uint8_t recoveryPub[32];
|
||||
uint8_t recoverySk[64];
|
||||
uint8_t rootPub[32];
|
||||
uint8_t rootSk[64];
|
||||
uint8_t blockchainPub[32];
|
||||
uint8_t blockchainSk[64];
|
||||
uint8_t clientPub[32];
|
||||
uint8_t deviceSk[64];
|
||||
uint8_t clientSk[64];
|
||||
};
|
||||
|
||||
static DerivedKeyState gDerivedKeys = {};
|
||||
@@ -782,19 +784,20 @@ static void pushFixed(std::vector<uint8_t> &out, const uint8_t *data, size_t len
|
||||
static bool deriveKeysFromMasterSecret(const uint8_t masterSecret[32]) {
|
||||
memset(&gDerivedKeys, 0, sizeof(gDerivedKeys));
|
||||
memcpy(gDerivedKeys.masterSecret, masterSecret, 32);
|
||||
String secretB64 = base64Encode(masterSecret, 32);
|
||||
if (secretB64.length() == 0) {
|
||||
return false;
|
||||
}
|
||||
const char *suffixes[3] = {"root.key", "blockchain.key", "client.key"};
|
||||
uint8_t *pubs[3] = {gDerivedKeys.rootPub, gDerivedKeys.blockchainPub, gDerivedKeys.clientPub};
|
||||
uint8_t *sks[3] = {gDerivedKeys.rootSk, gDerivedKeys.blockchainSk, gDerivedKeys.deviceSk};
|
||||
for (int i = 0; i < 3; i++) {
|
||||
String material = secretB64 + "|" + suffixes[i];
|
||||
const char *prefix = "SHiNE-key";
|
||||
const char *suffixes[4] = {"recovery.key", "root.key", "blockchain.key", "client.key"};
|
||||
uint8_t *pubs[4] = {gDerivedKeys.recoveryPub, gDerivedKeys.rootPub, gDerivedKeys.blockchainPub, gDerivedKeys.clientPub};
|
||||
uint8_t *sks[4] = {gDerivedKeys.recoverySk, gDerivedKeys.rootSk, gDerivedKeys.blockchainSk, gDerivedKeys.clientSk};
|
||||
for (int i = 0; i < 4; i++) {
|
||||
std::vector<uint8_t> material;
|
||||
material.reserve(strlen(prefix) + 1 + 32 + 1 + strlen(suffixes[i]));
|
||||
material.insert(material.end(), prefix, prefix + strlen(prefix));
|
||||
material.push_back(0);
|
||||
material.insert(material.end(), masterSecret, masterSecret + 32);
|
||||
material.push_back(0);
|
||||
material.insert(material.end(), suffixes[i], suffixes[i] + strlen(suffixes[i]));
|
||||
uint8_t seed[32];
|
||||
if (!sha256String(material, seed)) {
|
||||
return false;
|
||||
}
|
||||
sha256Raw(material.data(), material.size(), seed);
|
||||
if (crypto_sign_seed_keypair(pubs[i], sks[i], seed) != 0) {
|
||||
return false;
|
||||
}
|
||||
@@ -1277,7 +1280,7 @@ static bool registerHomeserverOnSolana(String &messageOut) {
|
||||
edBchData,
|
||||
createData);
|
||||
uint8_t txSignature[64];
|
||||
if (!signMessageEd25519(message, gDerivedKeys.deviceSk, txSignature)) {
|
||||
if (!signMessageEd25519(message, gDerivedKeys.clientSk, txSignature)) {
|
||||
messageOut = "Не удалось подписать Solana-транзакцию";
|
||||
return false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user