xref: /aosp_15_r20/external/libsrtp2/crypto/include/auth.h (revision 90e502c7aef8d77d0622bb67d75435c6190cfc1a)
1*90e502c7SAndroid Build Coastguard Worker /*
2*90e502c7SAndroid Build Coastguard Worker  * auth.h
3*90e502c7SAndroid Build Coastguard Worker  *
4*90e502c7SAndroid Build Coastguard Worker  * common interface to authentication functions
5*90e502c7SAndroid Build Coastguard Worker  *
6*90e502c7SAndroid Build Coastguard Worker  * David A. McGrew
7*90e502c7SAndroid Build Coastguard Worker  * Cisco Systems, Inc.
8*90e502c7SAndroid Build Coastguard Worker  */
9*90e502c7SAndroid Build Coastguard Worker 
10*90e502c7SAndroid Build Coastguard Worker /*
11*90e502c7SAndroid Build Coastguard Worker  *
12*90e502c7SAndroid Build Coastguard Worker  * Copyright (c) 2001-2017, Cisco Systems, Inc.
13*90e502c7SAndroid Build Coastguard Worker  * All rights reserved.
14*90e502c7SAndroid Build Coastguard Worker  *
15*90e502c7SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
16*90e502c7SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
17*90e502c7SAndroid Build Coastguard Worker  * are met:
18*90e502c7SAndroid Build Coastguard Worker  *
19*90e502c7SAndroid Build Coastguard Worker  *   Redistributions of source code must retain the above copyright
20*90e502c7SAndroid Build Coastguard Worker  *   notice, this list of conditions and the following disclaimer.
21*90e502c7SAndroid Build Coastguard Worker  *
22*90e502c7SAndroid Build Coastguard Worker  *   Redistributions in binary form must reproduce the above
23*90e502c7SAndroid Build Coastguard Worker  *   copyright notice, this list of conditions and the following
24*90e502c7SAndroid Build Coastguard Worker  *   disclaimer in the documentation and/or other materials provided
25*90e502c7SAndroid Build Coastguard Worker  *   with the distribution.
26*90e502c7SAndroid Build Coastguard Worker  *
27*90e502c7SAndroid Build Coastguard Worker  *   Neither the name of the Cisco Systems, Inc. nor the names of its
28*90e502c7SAndroid Build Coastguard Worker  *   contributors may be used to endorse or promote products derived
29*90e502c7SAndroid Build Coastguard Worker  *   from this software without specific prior written permission.
30*90e502c7SAndroid Build Coastguard Worker  *
31*90e502c7SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*90e502c7SAndroid Build Coastguard Worker  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*90e502c7SAndroid Build Coastguard Worker  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
34*90e502c7SAndroid Build Coastguard Worker  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
35*90e502c7SAndroid Build Coastguard Worker  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
36*90e502c7SAndroid Build Coastguard Worker  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
37*90e502c7SAndroid Build Coastguard Worker  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
38*90e502c7SAndroid Build Coastguard Worker  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39*90e502c7SAndroid Build Coastguard Worker  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40*90e502c7SAndroid Build Coastguard Worker  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
41*90e502c7SAndroid Build Coastguard Worker  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
42*90e502c7SAndroid Build Coastguard Worker  * OF THE POSSIBILITY OF SUCH DAMAGE.
43*90e502c7SAndroid Build Coastguard Worker  *
44*90e502c7SAndroid Build Coastguard Worker  */
45*90e502c7SAndroid Build Coastguard Worker 
46*90e502c7SAndroid Build Coastguard Worker #ifndef SRTP_AUTH_H
47*90e502c7SAndroid Build Coastguard Worker #define SRTP_AUTH_H
48*90e502c7SAndroid Build Coastguard Worker 
49*90e502c7SAndroid Build Coastguard Worker #include "srtp.h"
50*90e502c7SAndroid Build Coastguard Worker #include "crypto_types.h" /* for values of auth_type_id_t */
51*90e502c7SAndroid Build Coastguard Worker 
52*90e502c7SAndroid Build Coastguard Worker #ifdef __cplusplus
53*90e502c7SAndroid Build Coastguard Worker extern "C" {
54*90e502c7SAndroid Build Coastguard Worker #endif
55*90e502c7SAndroid Build Coastguard Worker 
56*90e502c7SAndroid Build Coastguard Worker typedef const struct srtp_auth_type_t *srtp_auth_type_pointer;
57*90e502c7SAndroid Build Coastguard Worker typedef struct srtp_auth_t *srtp_auth_pointer_t;
58*90e502c7SAndroid Build Coastguard Worker 
59*90e502c7SAndroid Build Coastguard Worker typedef srtp_err_status_t (*srtp_auth_alloc_func)(srtp_auth_pointer_t *ap,
60*90e502c7SAndroid Build Coastguard Worker                                                   int key_len,
61*90e502c7SAndroid Build Coastguard Worker                                                   int out_len);
62*90e502c7SAndroid Build Coastguard Worker 
63*90e502c7SAndroid Build Coastguard Worker typedef srtp_err_status_t (*srtp_auth_init_func)(void *state,
64*90e502c7SAndroid Build Coastguard Worker                                                  const uint8_t *key,
65*90e502c7SAndroid Build Coastguard Worker                                                  int key_len);
66*90e502c7SAndroid Build Coastguard Worker 
67*90e502c7SAndroid Build Coastguard Worker typedef srtp_err_status_t (*srtp_auth_dealloc_func)(srtp_auth_pointer_t ap);
68*90e502c7SAndroid Build Coastguard Worker 
69*90e502c7SAndroid Build Coastguard Worker typedef srtp_err_status_t (*srtp_auth_compute_func)(void *state,
70*90e502c7SAndroid Build Coastguard Worker                                                     const uint8_t *buffer,
71*90e502c7SAndroid Build Coastguard Worker                                                     int octets_to_auth,
72*90e502c7SAndroid Build Coastguard Worker                                                     int tag_len,
73*90e502c7SAndroid Build Coastguard Worker                                                     uint8_t *tag);
74*90e502c7SAndroid Build Coastguard Worker 
75*90e502c7SAndroid Build Coastguard Worker typedef srtp_err_status_t (*srtp_auth_update_func)(void *state,
76*90e502c7SAndroid Build Coastguard Worker                                                    const uint8_t *buffer,
77*90e502c7SAndroid Build Coastguard Worker                                                    int octets_to_auth);
78*90e502c7SAndroid Build Coastguard Worker 
79*90e502c7SAndroid Build Coastguard Worker typedef srtp_err_status_t (*srtp_auth_start_func)(void *state);
80*90e502c7SAndroid Build Coastguard Worker 
81*90e502c7SAndroid Build Coastguard Worker /* some syntactic sugar on these function types */
82*90e502c7SAndroid Build Coastguard Worker #define srtp_auth_type_alloc(at, a, klen, outlen)                              \
83*90e502c7SAndroid Build Coastguard Worker     ((at)->alloc((a), (klen), (outlen)))
84*90e502c7SAndroid Build Coastguard Worker 
85*90e502c7SAndroid Build Coastguard Worker #define srtp_auth_init(a, key)                                                 \
86*90e502c7SAndroid Build Coastguard Worker     (((a)->type)->init((a)->state, (key), ((a)->key_len)))
87*90e502c7SAndroid Build Coastguard Worker 
88*90e502c7SAndroid Build Coastguard Worker #define srtp_auth_compute(a, buf, len, res)                                    \
89*90e502c7SAndroid Build Coastguard Worker     (((a)->type)->compute((a)->state, (buf), (len), (a)->out_len, (res)))
90*90e502c7SAndroid Build Coastguard Worker 
91*90e502c7SAndroid Build Coastguard Worker #define srtp_auth_update(a, buf, len)                                          \
92*90e502c7SAndroid Build Coastguard Worker     (((a)->type)->update((a)->state, (buf), (len)))
93*90e502c7SAndroid Build Coastguard Worker 
94*90e502c7SAndroid Build Coastguard Worker #define srtp_auth_start(a) (((a)->type)->start((a)->state))
95*90e502c7SAndroid Build Coastguard Worker 
96*90e502c7SAndroid Build Coastguard Worker #define srtp_auth_dealloc(c) (((c)->type)->dealloc(c))
97*90e502c7SAndroid Build Coastguard Worker 
98*90e502c7SAndroid Build Coastguard Worker /* functions to get information about a particular auth_t */
99*90e502c7SAndroid Build Coastguard Worker int srtp_auth_get_key_length(const struct srtp_auth_t *a);
100*90e502c7SAndroid Build Coastguard Worker 
101*90e502c7SAndroid Build Coastguard Worker int srtp_auth_get_tag_length(const struct srtp_auth_t *a);
102*90e502c7SAndroid Build Coastguard Worker 
103*90e502c7SAndroid Build Coastguard Worker int srtp_auth_get_prefix_length(const struct srtp_auth_t *a);
104*90e502c7SAndroid Build Coastguard Worker 
105*90e502c7SAndroid Build Coastguard Worker /*
106*90e502c7SAndroid Build Coastguard Worker  * srtp_auth_test_case_t is a (list of) key/message/tag values that are
107*90e502c7SAndroid Build Coastguard Worker  * known to be correct for a particular cipher.  this data can be used
108*90e502c7SAndroid Build Coastguard Worker  * to test an implementation in an on-the-fly self test of the
109*90e502c7SAndroid Build Coastguard Worker  * correctness of the implementation.  (see the srtp_auth_type_self_test()
110*90e502c7SAndroid Build Coastguard Worker  * function below)
111*90e502c7SAndroid Build Coastguard Worker  */
112*90e502c7SAndroid Build Coastguard Worker typedef struct srtp_auth_test_case_t {
113*90e502c7SAndroid Build Coastguard Worker     int key_length_octets;  /* octets in key            */
114*90e502c7SAndroid Build Coastguard Worker     const uint8_t *key;     /* key                      */
115*90e502c7SAndroid Build Coastguard Worker     int data_length_octets; /* octets in data           */
116*90e502c7SAndroid Build Coastguard Worker     const uint8_t *data;    /* data                     */
117*90e502c7SAndroid Build Coastguard Worker     int tag_length_octets;  /* octets in tag            */
118*90e502c7SAndroid Build Coastguard Worker     const uint8_t *tag;     /* tag                      */
119*90e502c7SAndroid Build Coastguard Worker     const struct srtp_auth_test_case_t
120*90e502c7SAndroid Build Coastguard Worker         *next_test_case; /* pointer to next testcase */
121*90e502c7SAndroid Build Coastguard Worker } srtp_auth_test_case_t;
122*90e502c7SAndroid Build Coastguard Worker 
123*90e502c7SAndroid Build Coastguard Worker /* srtp_auth_type_t */
124*90e502c7SAndroid Build Coastguard Worker typedef struct srtp_auth_type_t {
125*90e502c7SAndroid Build Coastguard Worker     srtp_auth_alloc_func alloc;
126*90e502c7SAndroid Build Coastguard Worker     srtp_auth_dealloc_func dealloc;
127*90e502c7SAndroid Build Coastguard Worker     srtp_auth_init_func init;
128*90e502c7SAndroid Build Coastguard Worker     srtp_auth_compute_func compute;
129*90e502c7SAndroid Build Coastguard Worker     srtp_auth_update_func update;
130*90e502c7SAndroid Build Coastguard Worker     srtp_auth_start_func start;
131*90e502c7SAndroid Build Coastguard Worker     const char *description;
132*90e502c7SAndroid Build Coastguard Worker     const srtp_auth_test_case_t *test_data;
133*90e502c7SAndroid Build Coastguard Worker     srtp_auth_type_id_t id;
134*90e502c7SAndroid Build Coastguard Worker } srtp_auth_type_t;
135*90e502c7SAndroid Build Coastguard Worker 
136*90e502c7SAndroid Build Coastguard Worker typedef struct srtp_auth_t {
137*90e502c7SAndroid Build Coastguard Worker     const srtp_auth_type_t *type;
138*90e502c7SAndroid Build Coastguard Worker     void *state;
139*90e502c7SAndroid Build Coastguard Worker     int out_len;    /* length of output tag in octets */
140*90e502c7SAndroid Build Coastguard Worker     int key_len;    /* length of key in octets        */
141*90e502c7SAndroid Build Coastguard Worker     int prefix_len; /* length of keystream prefix     */
142*90e502c7SAndroid Build Coastguard Worker } srtp_auth_t;
143*90e502c7SAndroid Build Coastguard Worker 
144*90e502c7SAndroid Build Coastguard Worker /*
145*90e502c7SAndroid Build Coastguard Worker  * srtp_auth_type_self_test() tests an auth_type against test cases
146*90e502c7SAndroid Build Coastguard Worker  * provided in an array of values of key/message/tag that is known to
147*90e502c7SAndroid Build Coastguard Worker  * be good
148*90e502c7SAndroid Build Coastguard Worker  */
149*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_auth_type_self_test(const srtp_auth_type_t *at);
150*90e502c7SAndroid Build Coastguard Worker 
151*90e502c7SAndroid Build Coastguard Worker /*
152*90e502c7SAndroid Build Coastguard Worker  * srtp_auth_type_test() tests an auth_type against external test cases
153*90e502c7SAndroid Build Coastguard Worker  * provided in an array of values of key/message/tag that is known to
154*90e502c7SAndroid Build Coastguard Worker  * be good
155*90e502c7SAndroid Build Coastguard Worker  */
156*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_auth_type_test(const srtp_auth_type_t *at,
157*90e502c7SAndroid Build Coastguard Worker                                       const srtp_auth_test_case_t *test_data);
158*90e502c7SAndroid Build Coastguard Worker 
159*90e502c7SAndroid Build Coastguard Worker /*
160*90e502c7SAndroid Build Coastguard Worker  * srtp_replace_auth_type(ct, id)
161*90e502c7SAndroid Build Coastguard Worker  *
162*90e502c7SAndroid Build Coastguard Worker  * replaces srtp's kernel's auth type implementation for the auth_type id
163*90e502c7SAndroid Build Coastguard Worker  * with a new one passed in externally.  The new auth type must pass all the
164*90e502c7SAndroid Build Coastguard Worker  * existing auth_type's self tests as well as its own.
165*90e502c7SAndroid Build Coastguard Worker  */
166*90e502c7SAndroid Build Coastguard Worker srtp_err_status_t srtp_replace_auth_type(const srtp_auth_type_t *ct,
167*90e502c7SAndroid Build Coastguard Worker                                          srtp_auth_type_id_t id);
168*90e502c7SAndroid Build Coastguard Worker 
169*90e502c7SAndroid Build Coastguard Worker #ifdef __cplusplus
170*90e502c7SAndroid Build Coastguard Worker }
171*90e502c7SAndroid Build Coastguard Worker #endif
172*90e502c7SAndroid Build Coastguard Worker 
173*90e502c7SAndroid Build Coastguard Worker #endif /* SRTP_AUTH_H */
174