Apply patch based on the one from Cyril Brulebois for anytun to fix FTBFS on GNU...
[debian/uanytun.git] / src / cipher.h
1 /*
2  *  uAnytun
3  *
4  *  uAnytun is a tiny implementation of SATP. Unlike Anytun which is a full
5  *  featured implementation uAnytun has no support for multiple connections
6  *  or synchronisation. It is a small single threaded implementation intended
7  *  to act as a client on small platforms.
8  *  The secure anycast tunneling protocol (satp) defines a protocol used
9  *  for communication between any combination of unicast and anycast
10  *  tunnel endpoints.  It has less protocol overhead than IPSec in Tunnel
11  *  mode and allows tunneling of every ETHER TYPE protocol (e.g.
12  *  ethernet, ip, arp ...). satp directly includes cryptography and
13  *  message authentication based on the methodes used by SRTP.  It is
14  *  intended to deliver a generic, scaleable and secure solution for
15  *  tunneling and relaying of packets of any protocol.
16  *  
17  *
18  *  Copyright (C) 2007-2008 Christian Pointner <equinox@anytun.org>
19  *
20  *  This file is part of uAnytun.
21  *
22  *  uAnytun is free software: you can redistribute it and/or modify
23  *  it under the terms of the GNU General Public License as published by
24  *  the Free Software Foundation, either version 3 of the License, or
25  *  any later version.
26  *
27  *  uAnytun is distributed in the hope that it will be useful,
28  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
29  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
30  *  GNU General Public License for more details.
31  *
32  *  You should have received a copy of the GNU General Public License
33  *  along with uAnytun. If not, see <http://www.gnu.org/licenses/>.
34  */
35
36 #ifndef UANYTUN_cipher_h_INCLUDED
37 #define UANYTUN_cipher_h_INCLUDED
38
39 #ifndef NO_CRYPT
40 #ifndef USE_SSL_CRYPTO
41 #include <gcrypt.h>
42 #else
43 #include <openssl/aes.h>
44 #endif
45 #include "key_derivation.h"
46 #else
47 enum key_derivation_dir_enum { kd_inbound = 0, kd_outbound = 1 };
48 typedef enum key_derivation_dir_enum key_derivation_dir_t;
49 typedef u_int8_t key_derivation_t;
50 #endif
51
52 enum cipher_type_enum { c_unknown, c_null, c_aes_ctr };
53 typedef enum cipher_type_enum cipher_type_t;
54
55 struct cipher_struct {
56   cipher_type_t type_;
57   u_int16_t key_length_;
58   buffer_t key_;
59   buffer_t salt_;
60   void* params_;
61 };
62 typedef struct cipher_struct cipher_t;
63
64 int cipher_init(cipher_t* c, const char* type);
65 void cipher_close(cipher_t* c);
66
67 int cipher_encrypt(cipher_t* c, key_derivation_t* kd, key_derivation_dir_t dir, plain_packet_t* in, encrypted_packet_t* out, seq_nr_t seq_nr, sender_id_t sender_id, mux_t mux);
68 int cipher_decrypt(cipher_t* c, key_derivation_t* kd, key_derivation_dir_t dir, encrypted_packet_t* in, plain_packet_t* out);
69
70 int32_t cipher_null_crypt(u_int8_t* in, u_int32_t ilen, u_int8_t* out, u_int32_t olen);
71
72
73 #ifndef NO_CRYPT
74
75 #define C_AESCTR_DEFAULT_KEY_LENGTH 128
76 #define C_AESCTR_CTR_LENGTH 16
77 #define C_AESCTR_SALT_LENGTH 14
78
79 union __attribute__((__packed__)) cipher_aesctr_ctr_union {
80   u_int8_t buf_[C_AESCTR_CTR_LENGTH];
81   struct __attribute__ ((__packed__)) {
82     u_int8_t buf_[C_AESCTR_SALT_LENGTH];
83     u_int16_t zero_;
84   } salt_;
85   struct __attribute__((__packed__)) {
86     u_int8_t fill_[C_AESCTR_SALT_LENGTH - sizeof(mux_t) - sizeof(sender_id_t) - 2*sizeof(u_int8_t) - sizeof(seq_nr_t)];
87     mux_t mux_;
88     sender_id_t sender_id_;
89     u_int8_t empty_[2];
90     seq_nr_t seq_nr_;
91     u_int16_t zero_;
92   } params_;
93 };
94 typedef union cipher_aesctr_ctr_union cipher_aesctr_ctr_t;
95
96 struct cipher_aesctr_param_struct {
97 #ifndef USE_SSL_CRYPTO
98   gcry_cipher_hd_t handle_;
99 #else
100   AES_KEY aes_key_;
101   u_int8_t ecount_buf_[AES_BLOCK_SIZE];
102 #endif
103   cipher_aesctr_ctr_t ctr_;
104 };
105 typedef struct cipher_aesctr_param_struct cipher_aesctr_param_t;
106
107 int cipher_aesctr_init(cipher_t* c);
108 void cipher_aesctr_close(cipher_t* c);
109 int cipher_aesctr_calc_ctr(cipher_t* c, key_derivation_t* kd, key_derivation_dir_t dir, seq_nr_t seq_nr, sender_id_t sender_id, mux_t mux);
110 int32_t cipher_aesctr_crypt(cipher_t* c, key_derivation_t* kd, key_derivation_dir_t dir, u_int8_t* in, u_int32_t ilen, u_int8_t* out, u_int32_t olen, seq_nr_t seq_nr, sender_id_t sender_id, mux_t mux);
111 #endif
112
113 #endif