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