Imported Upstream version 0.3
[anytun.git] / src / encryptedPacket.h
1 /*
2  *  anytun
3  *
4  *  The secure anycast tunneling protocol (satp) defines a protocol used
5  *  for communication between any combination of unicast and anycast
6  *  tunnel endpoints.  It has less protocol overhead than IPSec in Tunnel
7  *  mode and allows tunneling of every ETHER TYPE protocol (e.g.
8  *  ethernet, ip, arp ...). satp directly includes cryptography and
9  *  message authentication based on the methodes used by SRTP.  It is
10  *  intended to deliver a generic, scaleable and secure solution for
11  *  tunneling and relaying of packets of any protocol.
12  *
13  *
14  *  Copyright (C) 2007-2008 Othmar Gsenger, Erwin Nindl, 
15  *                          Christian Pointner <satp@wirdorange.org>
16  *
17  *  This file is part of Anytun.
18  *
19  *  Anytun is free software: you can redistribute it and/or modify
20  *  it under the terms of the GNU General Public License version 3 as
21  *  published by the Free Software Foundation.
22  *
23  *  Anytun is distributed in the hope that it will be useful,
24  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
25  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26  *  GNU General Public License for more details.
27  *
28  *  You should have received a copy of the GNU General Public License
29  *  along with anytun.  If not, see <http://www.gnu.org/licenses/>.
30  */
31
32 #ifndef _ENCRYPTED_PACKET_H_
33 #define _ENCRYPTED_PACKET_H_
34
35 #include "datatypes.h"
36 #include "buffer.h"
37
38 class Cipher;
39 class EncryptedPacket : public Buffer
40 {
41 public:
42
43   /**
44    * Packet constructor
45    * @param the length of the payload 
46    * @param allow reallocation of buffer
47    */
48   EncryptedPacket(u_int32_t payload_length, u_int32_t auth_tag_length, bool allow_realloc = false);
49
50   /**
51    * Packet destructor
52    */
53   ~EncryptedPacket() {};
54
55   /**
56    * Get the length of the header
57    * @return the length of the header
58    */
59   static u_int32_t getHeaderLength();
60
61   /**
62    * Get the sequence number
63    * @return seqence number
64    */
65   seq_nr_t getSeqNr() const;
66
67   /**
68    * Set the seqence number
69    * @param seq_nr sequence number
70    */
71   void setSeqNr(seq_nr_t seq_nr);
72
73   /**
74    * Get the sender id
75    * @return sender id
76    */
77   sender_id_t getSenderId() const;
78
79   /**
80    * Set the sender id
81    * @param sender_id sender id
82    */
83   void setSenderId(sender_id_t sender_id);
84
85   /**
86    * Get the mulitplex id
87    * @return multiplex id
88    */
89   mux_t getMux() const;
90
91   /**
92    * Set the multiplex id
93    * @param mux multiplex id
94    */
95   void setMux(mux_t mux);
96
97   /**
98    * Set the header of a packet
99    * @param seq_nr sequence number
100    * @param sender_id sender id
101    * @param mux multiplex id
102    */
103   void setHeader(seq_nr_t seq_nr, sender_id_t sender_id, mux_t mux);
104
105   /**
106    * Get the length of the payload
107    * @return the length of the payload
108    */
109   u_int32_t getPayloadLength() const;
110
111   /**
112    * Set the length of the payload
113    * @param length length of the payload
114    */
115   void setPayloadLength(u_int32_t payload_length);
116
117   /**
118    * Get the the payload
119    * @return the Pointer to the payload
120    */
121   u_int8_t* getPayload();
122
123
124   u_int8_t* getAuthenticatedPortion();
125   u_int32_t getAuthenticatedPortionLength();
126
127   void withAuthTag(bool b);
128   void addAuthTag();
129   void removeAuthTag();
130   u_int8_t* getAuthTag();
131   u_int32_t getAuthTagLength();
132                       
133 private:
134   EncryptedPacket();
135   EncryptedPacket(const EncryptedPacket &src);
136
137   void reinit();
138
139 #ifdef _MSC_VER
140   #pragma pack(push, 1)
141 #endif  
142   struct ATTR_PACKED HeaderStruct
143   {
144     seq_nr_t seq_nr;
145     sender_id_t sender_id;
146     mux_t mux;
147   };
148 #ifdef _MSC_VER
149   #pragma pack(pop)
150 #endif
151
152   struct HeaderStruct* header_;
153         u_int8_t * payload_;
154   u_int8_t * auth_tag_;
155   u_int32_t  auth_tag_length_;
156 };
157
158 #endif