| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #include "Identity.h"
- #include <string.h>
- #define ED25519_NO_SEED 1
- #include <ed_25519.h>
- #include <Ed25519.h>
- 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 {
- #if 0
- // NOTE: memory corruption bug was found in this function!!
- return ed25519_verify(sig, message, msg_len, pub_key);
- #else
- return Ed25519::verify(sig, this->pub_key, message, msg_len);
- #endif
- }
- 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();
- }
- size_t LocalIdentity::writeTo(uint8_t* dest, size_t max_len) {
- if (max_len < PRV_KEY_SIZE) return 0; // not big enough
- if (max_len < PRV_KEY_SIZE + PUB_KEY_SIZE) { // only room for prv_key
- memcpy(dest, prv_key, PRV_KEY_SIZE);
- return PRV_KEY_SIZE;
- }
- memcpy(dest, prv_key, PRV_KEY_SIZE); // otherwise can fit prv + pub keys
- memcpy(&dest[PRV_KEY_SIZE], pub_key, PUB_KEY_SIZE);
- return PRV_KEY_SIZE + PUB_KEY_SIZE;
- }
- void LocalIdentity::readFrom(const uint8_t* src, size_t len) {
- if (len == PRV_KEY_SIZE + PUB_KEY_SIZE) { // has prv + pub keys
- memcpy(prv_key, src, PRV_KEY_SIZE);
- memcpy(pub_key, &src[PRV_KEY_SIZE], PUB_KEY_SIZE);
- } else if (len == PRV_KEY_SIZE) {
- memcpy(prv_key, src, PRV_KEY_SIZE);
- // now need to re-calculate the pub_key
- ed25519_derive_pub(pub_key, prv_key);
- }
- }
- 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 uint8_t* other_pub_key) const {
- ed25519_key_exchange(secret, other_pub_key, prv_key);
- }
- }
|