#include "Identity.h" #include #define ED25519_NO_SEED 1 #include namespace mesh { Identity::Identity() { memset(pub_key, 0, sizeof(pub_key)); } Identity::Identity(const char* pub_hex) { Utils::fromHex(pub_key, PUB_KEY_SIZE, pub_hex); } bool Identity::verify(const uint8_t* sig, const uint8_t* message, int msg_len) const { return ed25519_verify(sig, message, msg_len, pub_key); } bool Identity::readFrom(Stream& s) { return (s.readBytes(pub_key, PUB_KEY_SIZE) == PUB_KEY_SIZE); } bool Identity::writeTo(Stream& s) const { return (s.write(pub_key, PUB_KEY_SIZE) == PUB_KEY_SIZE); } void Identity::printTo(Stream& s) const { Utils::printHex(s, pub_key, PUB_KEY_SIZE); } LocalIdentity::LocalIdentity() { memset(prv_key, 0, sizeof(prv_key)); } LocalIdentity::LocalIdentity(const char* prv_hex, const char* pub_hex) : Identity(pub_hex) { Utils::fromHex(prv_key, PRV_KEY_SIZE, prv_hex); } LocalIdentity::LocalIdentity(RNG* rng) { uint8_t seed[SEED_SIZE]; rng->random(seed, SEED_SIZE); ed25519_create_keypair(pub_key, prv_key, seed); } bool LocalIdentity::readFrom(Stream& s) { bool success = (s.readBytes(pub_key, PUB_KEY_SIZE) == PUB_KEY_SIZE); success = success && (s.readBytes(prv_key, PRV_KEY_SIZE) == PRV_KEY_SIZE); return success; } bool LocalIdentity::writeTo(Stream& s) const { bool success = (s.write(pub_key, PUB_KEY_SIZE) == PUB_KEY_SIZE); success = success && (s.write(prv_key, PRV_KEY_SIZE) == PRV_KEY_SIZE); return success; } void LocalIdentity::printTo(Stream& s) const { s.print("pub_key: "); Utils::printHex(s, pub_key, PUB_KEY_SIZE); s.println(); s.print("prv_key: "); Utils::printHex(s, prv_key, PRV_KEY_SIZE); s.println(); } void LocalIdentity::sign(uint8_t* sig, const uint8_t* message, int msg_len) const { ed25519_sign(sig, message, msg_len, pub_key, prv_key); } void LocalIdentity::calcSharedSecret(uint8_t* secret, const Identity& other) { ed25519_key_exchange(secret, other.pub_key, prv_key); } }