1386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 2386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * replay-database.h 3386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 4386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * interface for a replay database for packet security 5386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 6386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * David A. McGrew 7386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Cisco Systems, Inc. 8386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 9386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 10386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 11386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifndef REPLAY_DB_H 12386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define REPLAY_DB_H 13386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 14386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "integers.h" /* for uint32_t */ 15386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "datatypes.h" /* for v128_t */ 16386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "err.h" /* for err_status_t */ 17386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 18386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 19386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * if the ith least significant bit is one, then the packet index 20386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * window_end-i is in the database 21386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 22386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 23386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaritypedef struct { 24386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint32_t window_start; /* packet index of the first bit in bitmask */ 25386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari v128_t bitmask; 26386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} rdb_t; 27386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 28386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define rdb_bits_in_bitmask (8*sizeof(v128_t)) 29386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 30386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 31386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * rdb init 32386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 33386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * initalizes rdb 34386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 35386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * returns err_status_ok on success, err_status_t_fail otherwise 36386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 37386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 38386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 39386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarirdb_init(rdb_t *rdb); 40386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 41386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 42386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 43386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * rdb_check 44386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 45386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * checks to see if index appears in rdb 46386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 47386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * returns err_status_fail if the index already appears in rdb, 48386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * returns err_status_ok otherwise 49386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 50386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 51386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 52386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarirdb_check(const rdb_t *rdb, uint32_t index); 53386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 54386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 55386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * rdb_add_index 56386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 57386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * adds index to rdb_t (and does *not* check if index appears in db) 58386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 59386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * returns err_status_ok on success, err_status_fail otherwise 60386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 61386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 62386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 63386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 64386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarirdb_add_index(rdb_t *rdb, uint32_t index); 65386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 66386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 67386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * the functions rdb_increment() and rdb_get_value() are for use by 68386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * senders, not receivers - DO NOT use these functions on the same 69386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * rdb_t upon which rdb_add_index is used! 70386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 71386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 72386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 73386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 74386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * rdb_increment(db) increments the sequence number in db, if it is 75386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * not too high 76386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 77386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * return values: 78386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 79386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * err_status_ok no problem 80386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * err_status_key_expired sequence number too high 81386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 82386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 83386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t 84386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarirdb_increment(rdb_t *rdb); 85386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 86386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 87386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * rdb_get_value(db) returns the current sequence number of db 88386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 89386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 90386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariuint32_t 91386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarirdb_get_value(const rdb_t *rdb); 92386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 93386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 94386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif /* REPLAY_DB_H */ 95