1 /*
2  * cryptoalg.h
3  *
4  * API for authenticated encryption crypto algorithms
5  *
6  * David A. McGrew
7  * Cisco Systems, Inc.
8  */
9 /*
10  *
11  * Copyright (c) 2001-2006 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 #ifndef CRYPTOALG_H
46 #define CRYPTOALG_H
47 
48 #include "err.h"
49 
50 /**
51  * @defgroup Crypto Cryptography
52  *
53  * Zed uses a simple interface to a cryptographic transform.
54  *
55  * @{
56  */
57 
58 /**
59  * @brief applies a crypto algorithm
60  *
61  * The function pointer cryptoalg_func_t points to a function that
62  * implements a crypto transform, and provides a uniform API for
63  * accessing crypto mechanisms.
64  *
65  * @param key       location of secret key
66  *
67  * @param clear     data to be authenticated but not encrypted
68  *
69  * @param clear_len length of data to be authenticated but not encrypted
70  *
71  * @param iv        location to write the Initialization Vector (IV)
72  *
73  * @param protect   location of the data to be encrypted and
74  * authenticated (before the function call), and the ciphertext
75  * and authentication tag (after the call)
76  *
77  * @param protected_len location of the length of the data to be
78  * encrypted and authenticated (before the function call), and the
79  * length of the ciphertext (after the call)
80  *
81  */
82 
83 typedef err_status_t (*cryptoalg_func_t)
84      (void *key,
85       const void *clear,
86       unsigned clear_len,
87       void *iv,
88       void *protect,
89       unsigned *protected_len);
90 
91 typedef
92 err_status_t (*cryptoalg_inv_t)
93      (void *key,            /* location of secret key                  */
94       const void *clear,     /* data to be authenticated only           */
95       unsigned clear_len,   /* length of data to be authenticated only */
96       void *iv,             /* location of iv                          */
97       void *opaque,         /* data to be decrypted and authenticated  */
98       unsigned *opaque_len  /* location of the length of data to be
99 			     * decrypted and authd (before and after)
100 			     */
101       );
102 
103 typedef struct cryptoalg_ctx_t {
104   cryptoalg_func_t enc;
105   cryptoalg_inv_t  dec;
106   unsigned key_len;
107   unsigned iv_len;
108   unsigned auth_tag_len;
109   unsigned max_expansion;
110 } cryptoalg_ctx_t;
111 
112 typedef cryptoalg_ctx_t *cryptoalg_t;
113 
114 #define cryptoalg_get_key_len(cryptoalg) ((cryptoalg)->key_len)
115 
116 #define cryptoalg_get_iv_len(cryptoalg) ((cryptoalg)->iv_len)
117 
118 #define cryptoalg_get_auth_tag_len(cryptoalg) ((cryptoalg)->auth_tag_len)
119 
120 int
121 cryptoalg_get_id(cryptoalg_t c);
122 
123 cryptoalg_t
124 cryptoalg_find_by_id(int id);
125 
126 
127 /**
128  * @}
129  */
130 
131 #endif /* CRYPTOALG_H */
132 
133 
134