/* vim: set expandtab ts=4 sw=4: */
/*
* You may redistribute this program and/or modify it under the terms of
* the GNU General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#ifndef SessionManager_H
#define SessionManager_H
#include "crypto/CryptoAuth.h"
#include "crypto/random/Random.h"
#include "interface/Interface.h"
#include "memory/Allocator.h"
#include "util/events/EventBase.h"
#include "util/Linker.h"
Linker_require("interface/SessionManager.c")
#include
struct SessionManager;
struct SessionManager_Session
{
struct Interface external;
struct Interface* internal;
/** When the last message was received on this session (milliseconds since epoch). */
uint64_t timeOfLastIn;
/** When the last message was sent on this session (milliseconds since epoch). */
uint64_t timeOfLastOut;
/** The CryptoAuth state as of the last message. See: CryptoAuth_getState() */
int cryptoAuthState;
/** The handle which will be used to lookup this session on our side, big endian. */
uint32_t receiveHandle_be;
/** The handle which we are expected to send to identify ourselves, big endian. */
uint32_t sendHandle_be;
/** The version of the other node. */
uint32_t version;
/** The IPv6 address of the other node. */
uint8_t ip6[16];
};
struct SessionManager_HandleList
{
uint32_t count;
uint32_t* handles;
};
/**
* Create a new session manager for keeping track of and expiring crypto sessions.
* The typical use case is discriminating between packets by ip address, keyOffset is the number
* of bytes between the beginning of each message and the beginning of the ip address and keySize
* is the number of bytes in the address.
*
* @param decryptedIncoming the callback to call with incoming data after it has been decrypted.
* @param encryptedOutgoing the callback to call with outgoing data after it has been encrypted.
* @param interfaceContext the context which will become the senderContext and receiverContext for
* encryptedOutgoing and decryptedIncoming respectively.
* @param eventBase the libevent event base.
* @param cryptoAuth the cryptoauthenticator for the sessions.
* @param allocator means of getting memory.
* @return a session manager.
*/
struct SessionManager* SessionManager_new(Interface_CALLBACK(decryptedIncoming),
Interface_CALLBACK(encryptedOutgoing),
void* interfaceContext,
struct EventBase* eventBase,
struct CryptoAuth* cryptoAuth,
struct Random* rand,
struct Allocator* allocator);
/**
* Get a session from the session manager.
* If there is no session for the lookup key, it will be created.
*
* @param lookupKey this must be the size given by keySize in SessionManager_new().
* @param cryptoKey optional encryption key if it is known, otherwise NULL.
* @param sm the session manager.
*/
struct SessionManager_Session* SessionManager_getSession(uint8_t* lookupKey,
uint8_t cryptoKey[32],
struct SessionManager* sm);
/**
* Get a session by its handle.
*
* @param handle an opaque handle associated with the session.
* @param sm the session manager.
* @return the sesssion if there is one by that handle or null.
*/
struct SessionManager_Session* SessionManager_sessionForHandle(uint32_t handle,
struct SessionManager* sm);
/**
* Get the IPv6 address for a session.
*
* @param handle the handle for the session
* @param sm the session manager
* @return a binary ipv6 address or NULL.
*/
uint8_t* SessionManager_getIp6(uint32_t handle, struct SessionManager* sm);
/**
* Get the list of all handles.
*/
struct SessionManager_HandleList* SessionManager_getHandleList(struct SessionManager* sm,
struct Allocator* alloc);
#endif