netwerk/srtp/src/crypto/replay/rdb.c

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /*
     2  * rdb.c
     3  *
     4  * Implements a replay database for packet security
     5  *
     6  * David A. McGrew
     7  * Cisco Systems, Inc.
     8  */
    10 /*
    11  *	
    12  * Copyright (c) 2001-2006, Cisco Systems, Inc.
    13  * All rights reserved.
    14  * 
    15  * Redistribution and use in source and binary forms, with or without
    16  * modification, are permitted provided that the following conditions
    17  * are met:
    18  * 
    19  *   Redistributions of source code must retain the above copyright
    20  *   notice, this list of conditions and the following disclaimer.
    21  * 
    22  *   Redistributions in binary form must reproduce the above
    23  *   copyright notice, this list of conditions and the following
    24  *   disclaimer in the documentation and/or other materials provided
    25  *   with the distribution.
    26  * 
    27  *   Neither the name of the Cisco Systems, Inc. nor the names of its
    28  *   contributors may be used to endorse or promote products derived
    29  *   from this software without specific prior written permission.
    30  * 
    31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
    34  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
    35  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
    36  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
    37  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    38  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    39  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
    40  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    41  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
    42  * OF THE POSSIBILITY OF SUCH DAMAGE.
    43  *
    44  */
    47 #include "rdb.h"
    50 /*
    51  * this implementation of a replay database works as follows:
    52  * 
    53  * window_start is the index of the first packet in the window
    54  * bitmask      a bit-buffer, containing the most recently entered
    55  *              index as the leftmost bit 
    56  *
    57  */
    59 /* rdb_init initalizes rdb */
    61 err_status_t
    62 rdb_init(rdb_t *rdb) {
    63   v128_set_to_zero(&rdb->bitmask);
    64   rdb->window_start = 0;
    65   return err_status_ok;
    66 }
    68 /*
    69  * rdb_check checks to see if index appears in rdb
    70  */
    72 err_status_t
    73 rdb_check(const rdb_t *rdb, uint32_t p_index) {
    75   /* if the index appears after (or at very end of) the window, its good */
    76   if (p_index >= rdb->window_start + rdb_bits_in_bitmask)
    77     return err_status_ok;
    79   /* if the index appears before the window, its bad */
    80   if (p_index < rdb->window_start)
    81     return err_status_replay_old;
    83   /* otherwise, the index appears within the window, so check the bitmask */
    84   if (v128_get_bit(&rdb->bitmask, (p_index - rdb->window_start)) == 1)
    85     return err_status_replay_fail;    
    87   /* otherwise, the index is okay */
    88   return err_status_ok;
    89 }
    91 /*
    92  * rdb_add_index adds index to rdb_t (and does *not* check if
    93  * index appears in db)
    94  *
    95  * this function should be called only after rdb_check has
    96  * indicated that the index does not appear in the rdb, e.g., a mutex
    97  * should protect the rdb between these calls
    98  */
   100 err_status_t
   101 rdb_add_index(rdb_t *rdb, uint32_t p_index) {
   102   int delta;  
   104   /* here we *assume* that p_index > rdb->window_start */
   106   delta = (p_index - rdb->window_start);    
   107   if (delta < (int)rdb_bits_in_bitmask) {
   109     /* if the p_index is within the window, set the appropriate bit */
   110     v128_set_bit(&rdb->bitmask, delta);
   112   } else { 
   114     delta -= rdb_bits_in_bitmask - 1;
   116     /* shift the window forward by delta bits*/
   117     v128_left_shift(&rdb->bitmask, delta);
   118     v128_set_bit(&rdb->bitmask, rdb_bits_in_bitmask-1);
   119     rdb->window_start += delta;
   121   }    
   123   return err_status_ok;
   124 }
   126 err_status_t
   127 rdb_increment(rdb_t *rdb) {
   129   if (rdb->window_start++ > 0x7fffffff)
   130     return err_status_key_expired;
   131   return err_status_ok;
   132 }
   134 uint32_t
   135 rdb_get_value(const rdb_t *rdb) {
   136   return rdb->window_start;
   137 }

mercurial