Coverage Report

Created: 2026-06-15 06:24

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/pjsip/third_party/srtp/crypto/kernel/key.c
Line
Count
Source
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
884
#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
878
{
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
878
    if (s < soft_limit) {
62
0
        return srtp_err_status_bad_param;
63
0
    }
64
878
#endif
65
878
    key->num_left = s;
66
878
    key->state = srtp_key_state_normal;
67
878
    return srtp_err_status_ok;
68
878
}
69
70
srtp_err_status_t srtp_key_limit_clone(srtp_key_limit_t original,
71
                                       srtp_key_limit_t *new_key)
72
6
{
73
6
    if (original == NULL) {
74
0
        return srtp_err_status_bad_param;
75
0
    }
76
6
    *new_key = original;
77
6
    return srtp_err_status_ok;
78
6
}
79
80
srtp_key_event_t srtp_key_limit_update(srtp_key_limit_t key)
81
6
{
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
6
    key->num_left--;
96
6
    if (key->num_left >= soft_limit) {
97
6
        return srtp_key_event_normal; /* we're above the soft limit */
98
6
    }
99
0
#endif
100
0
    if (key->state == srtp_key_state_normal) {
101
        /* we just passed the soft limit, so change the state */
102
0
        key->state = srtp_key_state_past_soft_limit;
103
0
    }
104
#ifdef NO_64BIT_MATH
105
    if (low32(key->num_left) == 0 && high32(key->num_left == 0))
106
#else
107
0
    if (key->num_left < 1)
108
0
#endif
109
0
    { /* we just hit the hard limit */
110
0
        key->state = srtp_key_state_expired;
111
0
        return srtp_key_event_hard_limit;
112
0
    }
113
0
    return srtp_key_event_soft_limit;
114
0
}