freeswitch/libs/libzrtp/include/zrtp_iface_cache.h
Travis Cross d2edcad66e Merge Phil Zimmermann's libzrtp as a FreeSWITCH library
Thanks to Phil Zimmermann for the code and for the license exception
we needed to include it.

There remains some build system integration work to be done before
this code will build properly in the FreeSWITCH tree.
2012-03-31 23:42:27 +00:00

170 lines
6.2 KiB
C

/*
* libZRTP SDK library, implements the ZRTP secure VoIP protocol.
* Copyright (c) 2006-2009 Philip R. Zimmermann. All rights reserved.
* Contact: http://philzimmermann.com
* For licensing and other legal details, see the file zrtp_legal.c.
*
* Viktor Krykun <v.krikun at zfoneproject.com>
*/
#ifndef __ZRTP_IFACE_CACHE_H__
#define __ZRTP_IFACE_CACHE_H__
#include "zrtp_config.h"
#include "zrtp_base.h"
#include "zrtp_string.h"
#include "zrtp_error.h"
#include "zrtp_iface.h"
#if defined(__cplusplus)
extern "C"
{
#endif
#if defined(ZRTP_USE_BUILTIN_CACHE) && (ZRTP_USE_BUILTIN_CACHE == 1)
#define ZRTP_DEF_CACHE_VERSION_STR "libZRTP cache version="
#define ZRTP_DEF_CACHE_VERSION_VAL "1.0"
/**
* @brief Cache element identifier type
* Elements of this type link cache data with a pair of ZIDs.
* (constructed as: [ZID1][ZID2], where ZID1 - ZID with greater binary value)
* This type is used to identify cache elements in the built-in implementation.
*/
typedef uint8_t zrtp_cache_id_t[24];
#define ZRTP_MITMCACHE_ELEM_LENGTH ( sizeof(zrtp_cache_id_t) + sizeof(zrtp_string64_t) )
#define ZRTP_CACHE_ELEM_LENGTH ( sizeof(zrtp_cache_elem_t) - sizeof(mlist_t) - (sizeof(uint32_t)*2) )
#define ZFONE_CACHE_NAME_LENGTH 256
/**
* @brief Secret cache element structure
* This structure is used to store cache data in the built-in implementation
* of the caching system.
*/
typedef struct zrtp_cache_elem
{
zrtp_cache_id_t id; /** Cache element identifier */
zrtp_string64_t curr_cache; /** Current cache value */
zrtp_string64_t prev_cache; /** Prev cache value */
uint32_t verified; /** Verified flag for the cache value */
uint32_t lastused_at; /** Last usage time-stamp in seconds */
uint32_t ttl; /** Cache TTL since lastused_at in seconds */
uint32_t secure_since; /** Secure since date in seconds. Utility field. Don't required by libzrtp. */
char name[ZFONE_CACHE_NAME_LENGTH]; /** name of the user associated with this cache entry */
uint32_t name_length; /** cache name lengths */
uint32_t presh_counter; /** number of Preshared streams made since last DH exchange */
uint32_t _index; /** cache element index in the cache file */
uint32_t _is_dirty; /** dirty flag means the entry has unsaved changes */
mlist_t _mlist;
} zrtp_cache_elem_t;
#endif /* ZRTP_USE_BUILTIN_CACHE */
zrtp_status_t zrtp_def_cache_init(zrtp_global_t* zrtp);
void zrtp_def_cache_down();
zrtp_status_t zrtp_def_cache_set_verified( const zrtp_stringn_t* one_zid,
const zrtp_stringn_t* another_zid,
uint32_t verified);
zrtp_status_t zrtp_def_cache_get_verified( const zrtp_stringn_t* one_zid,
const zrtp_stringn_t* another_zid,
uint32_t* verified);
zrtp_status_t zrtp_def_cache_put( const zrtp_stringn_t* one_zid,
const zrtp_stringn_t* another_zid,
zrtp_shared_secret_t *rss);
zrtp_status_t zrtp_def_cache_put_mitm( const zrtp_stringn_t* one_zid,
const zrtp_stringn_t* another_zid,
zrtp_shared_secret_t *rss);
zrtp_status_t zrtp_def_cache_get( const zrtp_stringn_t* one_zid,
const zrtp_stringn_t* another_zid,
zrtp_shared_secret_t *rss,
int prev_requested);
zrtp_status_t zrtp_def_cache_get_mitm( const zrtp_stringn_t* one_zid,
const zrtp_stringn_t* another_zid,
zrtp_shared_secret_t *rss);
zrtp_status_t zrtp_def_cache_set_presh_counter( const zrtp_stringn_t* one_zid,
const zrtp_stringn_t* another_zid,
uint32_t counter);
zrtp_status_t zrtp_def_cache_get_presh_counter( const zrtp_stringn_t* one_zid,
const zrtp_stringn_t* another_zid,
uint32_t* counter);
#if defined(ZRTP_USE_BUILTIN_CACHE) && (ZRTP_USE_BUILTIN_CACHE == 1)
/**
* @brief Cache iterator
* zrtp_def_cache_foreach() calls this function for every cache entry.
* @param elem - cache element;
* @param is_mitm - is 1 when callback was called for MiTM for each.
* @param del - callback may return 1 to this to remove cache entry from the list.
* @param data - pointer to some user data from zrtp_def_cache_foreach();
* @return
* - 0 - if element was requested for reading only and wasn't changed;
* - 1 - if element was modified and cache should be updated.
*/
typedef int (*zrtp_cache_callback_t)(zrtp_cache_elem_t* elem, int is_mitm, void* data, int* del);
/**
* @brief Iterate over all cache entries.
* Can be used for searching and modifying cache entries. Protected by mutex.
* Can be called in parallel with other cache operations when protocol is
* running.
* @param global - libzrtp global context;
* @param is_mitm - if value of this flag is 1 - fore_each will be applied for MiTM secrets;
* @param callback - function to be called for every cache entry;
* @param data - this pointer will be passed to every \c callback call.
*/
void zrtp_def_cache_foreach( zrtp_global_t *global,
int is_mitm,
zrtp_cache_callback_t callback,
void *data);
#endif /* ZRTP_USE_BUILTIN_CACHE */
/**
* @brief Store shared secrets cache to the persistent storage
* May be used in server solutions for periodically flushing the cache to prevent data loss.
*
* @return
* - zrtp_status_ok - if operation completed successfully;
* - zrtp_status_wrong_state - if a call is performed from a routine which
* doesn't use the default cache.
*/
zrtp_status_t zrtp_def_cache_store(zrtp_global_t *global);
zrtp_status_t zrtp_def_cache_reset_since( const zrtp_stringn_t* one_zid,
const zrtp_stringn_t* another_zid);
zrtp_status_t zrtp_def_cache_get_since( const zrtp_stringn_t* one_zid,
const zrtp_stringn_t* another_zid,
uint32_t* since);
zrtp_status_t zrtp_def_cache_get_name( const zrtp_stringn_t* one_zid,
const zrtp_stringn_t* another_zid,
zrtp_stringn_t* name);
zrtp_status_t zrtp_def_cache_put_name( const zrtp_stringn_t* one_zid,
const zrtp_stringn_t* another_zid,
const zrtp_stringn_t* name);
#if defined(ZRTP_USE_BUILTIN_CACHE) && (ZRTP_USE_BUILTIN_CACHE == 1)
zrtp_cache_elem_t* zrtp_def_cache_get2(const zrtp_cache_id_t id, int is_mitm);
#endif /* ZRTP_USE_BUILTIN_CACHE */
#if defined(__cplusplus)
}
#endif
#endif /*__ZRTP_IFACE_CACHE_H__*/