tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

key.c (3626B)


      1 /*
      2 * key.c
      3 *
      4 * key usage limits enforcement
      5 *
      6 * David A. Mcgrew
      7 * Cisco Systems, Inc.
      8 */
      9 /*
     10 *
     11 * Copyright (c) 2001-2017 Cisco Systems, Inc.
     12 * All rights reserved.
     13 *
     14 * Redistribution and use in source and binary forms, with or without
     15 * modification, are permitted provided that the following conditions
     16 * are met:
     17 *
     18 *   Redistributions of source code must retain the above copyright
     19 *   notice, this list of conditions and the following disclaimer.
     20 *
     21 *   Redistributions in binary form must reproduce the above
     22 *   copyright notice, this list of conditions and the following
     23 *   disclaimer in the documentation and/or other materials provided
     24 *   with the distribution.
     25 *
     26 *   Neither the name of the Cisco Systems, Inc. nor the names of its
     27 *   contributors may be used to endorse or promote products derived
     28 *   from this software without specific prior written permission.
     29 *
     30 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     31 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     32 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     33 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
     34 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
     35 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     36 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     37 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     40 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     41 * OF THE POSSIBILITY OF SUCH DAMAGE.
     42 *
     43 */
     44 
     45 #ifdef HAVE_CONFIG_H
     46 #include <config.h>
     47 #endif
     48 
     49 #include "key.h"
     50 
     51 #define soft_limit 0x10000
     52 
     53 srtp_err_status_t srtp_key_limit_set(srtp_key_limit_t key,
     54                                     const srtp_xtd_seq_num_t s)
     55 {
     56 #ifdef NO_64BIT_MATH
     57    if (high32(s) == 0 && low32(s) < soft_limit) {
     58        return srtp_err_status_bad_param;
     59    }
     60 #else
     61    if (s < soft_limit) {
     62        return srtp_err_status_bad_param;
     63    }
     64 #endif
     65    key->num_left = s;
     66    key->state = srtp_key_state_normal;
     67    return srtp_err_status_ok;
     68 }
     69 
     70 srtp_err_status_t srtp_key_limit_clone(srtp_key_limit_t original,
     71                                       srtp_key_limit_t *new_key)
     72 {
     73    if (original == NULL) {
     74        return srtp_err_status_bad_param;
     75    }
     76    *new_key = original;
     77    return srtp_err_status_ok;
     78 }
     79 
     80 srtp_key_event_t srtp_key_limit_update(srtp_key_limit_t key)
     81 {
     82 #ifdef NO_64BIT_MATH
     83    if (low32(key->num_left) == 0) {
     84        // carry
     85        key->num_left =
     86            make64(high32(key->num_left) - 1, low32(key->num_left) - 1);
     87    } else {
     88        // no carry
     89        key->num_left = make64(high32(key->num_left), low32(key->num_left) - 1);
     90    }
     91    if (high32(key->num_left) != 0 || low32(key->num_left) >= soft_limit) {
     92        return srtp_key_event_normal; /* we're above the soft limit */
     93    }
     94 #else
     95    key->num_left--;
     96    if (key->num_left >= soft_limit) {
     97        return srtp_key_event_normal; /* we're above the soft limit */
     98    }
     99 #endif
    100    if (key->state == srtp_key_state_normal) {
    101        /* we just passed the soft limit, so change the state */
    102        key->state = srtp_key_state_past_soft_limit;
    103    }
    104 #ifdef NO_64BIT_MATH
    105    if (low32(key->num_left) == 0 && high32(key->num_left == 0))
    106 #else
    107    if (key->num_left < 1)
    108 #endif
    109    { /* we just hit the hard limit */
    110        key->state = srtp_key_state_expired;
    111        return srtp_key_event_hard_limit;
    112    }
    113    return srtp_key_event_soft_limit;
    114 }