- if(*siglen < MESHLINK_SIGLEN) {
- meshlink_errno = MESHLINK_EINVAL;
- return false;
- }
-
- pthread_mutex_lock(&(mesh->mesh_mutex));
-
- if(!ecdsa_sign(mesh->self->connection->ecdsa, data, len, signature)) {
- meshlink_errno = MESHLINK_EINTERNAL;
- pthread_mutex_unlock(&(mesh->mesh_mutex));
- return false;
- }
-
- *siglen = MESHLINK_SIGLEN;
- pthread_mutex_unlock(&(mesh->mesh_mutex));
- return true;
-}
-
-bool meshlink_verify(meshlink_handle_t *mesh, meshlink_node_t *source, const void *data, size_t len, const void *signature, size_t siglen) {
- if(!mesh || !data || !len || !signature) {
- meshlink_errno = MESHLINK_EINVAL;
- return false;
- }
-
- if(siglen != MESHLINK_SIGLEN) {
- meshlink_errno = MESHLINK_EINVAL;
- return false;
- }
-
- pthread_mutex_lock(&(mesh->mesh_mutex));
-
- bool rval = false;
-
- struct node_t *n = (struct node_t *)source;
- node_read_ecdsa_public_key(mesh, n);
-
- if(!n->ecdsa) {
- meshlink_errno = MESHLINK_EINTERNAL;
- rval = false;
- } else {
- rval = ecdsa_verify(((struct node_t *)source)->ecdsa, data, len, signature);
- }
-
- pthread_mutex_unlock(&(mesh->mesh_mutex));
- return rval;
-}
-
-static bool refresh_invitation_key(meshlink_handle_t *mesh) {
- char filename[PATH_MAX];
-
- pthread_mutex_lock(&(mesh->mesh_mutex));
-
- snprintf(filename, sizeof(filename), "%s" SLASH "invitations", mesh->confbase);
-
- if(mkdir(filename, 0700) && errno != EEXIST) {
- logger(mesh, MESHLINK_DEBUG, "Could not create directory %s: %s\n", filename, strerror(errno));
- meshlink_errno = MESHLINK_ESTORAGE;
- pthread_mutex_unlock(&(mesh->mesh_mutex));
- return false;
- }
-
- // Count the number of valid invitations, clean up old ones
- DIR *dir = opendir(filename);
-
- if(!dir) {
- logger(mesh, MESHLINK_DEBUG, "Could not read directory %s: %s\n", filename, strerror(errno));
- meshlink_errno = MESHLINK_ESTORAGE;
- pthread_mutex_unlock(&(mesh->mesh_mutex));
- return false;
- }
-
- errno = 0;
- int count = 0;
- struct dirent *ent;
- time_t deadline = time(NULL) - 604800; // 1 week in the past
-
- while((ent = readdir(dir))) {
- if(strlen(ent->d_name) != 24) {
- continue;
- }
-
- char invname[PATH_MAX];
- struct stat st;
-
- if(snprintf(invname, sizeof(invname), "%s" SLASH "%s", filename, ent->d_name) >= PATH_MAX) {
- logger(mesh, MESHLINK_DEBUG, "Filename too long: %s" SLASH "%s", filename, ent->d_name);
- continue;
- }
-
- if(!stat(invname, &st)) {
- if(mesh->invitation_key && deadline < st.st_mtime) {
- count++;
- } else {
- unlink(invname);
- }
- } else {
- logger(mesh, MESHLINK_DEBUG, "Could not stat %s: %s\n", invname, strerror(errno));
- errno = 0;
- }
- }
-
- if(errno) {
- logger(mesh, MESHLINK_DEBUG, "Error while reading directory %s: %s\n", filename, strerror(errno));
- closedir(dir);
- meshlink_errno = MESHLINK_ESTORAGE;
- pthread_mutex_unlock(&(mesh->mesh_mutex));