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.
14 * Copyright (C) 2007-2008 Othmar Gsenger, Erwin Nindl,
15 * Christian Pointner <satp@wirdorange.org>
17 * This file is part of Anytun.
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.
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.
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/>.
34 #include <cstdio> // for std::memcpy
36 #include "encryptedPacket.h"
38 #include "datatypes.h"
41 EncryptedPacket::EncryptedPacket(u_int32_t payload_length
, bool allow_realloc
)
42 : Buffer(payload_length
+ sizeof(struct HeaderStruct
), allow_realloc
)
44 header_
= reinterpret_cast<struct HeaderStruct
*>(buf_
);
45 payload_
= buf_
+ sizeof(struct HeaderStruct
);
50 header_
->sender_id
= 0;
55 u_int32_t
EncryptedPacket::getHeaderLength()
57 return sizeof(struct HeaderStruct
);
60 seq_nr_t
EncryptedPacket::getSeqNr() const
63 return SEQ_NR_T_NTOH(header_
->seq_nr
);
68 sender_id_t
EncryptedPacket::getSenderId() const
71 return SENDER_ID_T_NTOH(header_
->sender_id
);
76 mux_t
EncryptedPacket::getMux() const
79 return MUX_T_NTOH(header_
->mux
);
84 void EncryptedPacket::setSeqNr(seq_nr_t seq_nr
)
87 header_
->seq_nr
= SEQ_NR_T_HTON(seq_nr
);
90 void EncryptedPacket::setSenderId(sender_id_t sender_id
)
93 header_
->sender_id
= SENDER_ID_T_HTON(sender_id
);
96 void EncryptedPacket::setMux(mux_t mux
)
99 header_
->mux
= MUX_T_HTON(mux
);
102 void EncryptedPacket::setHeader(seq_nr_t seq_nr
, sender_id_t sender_id
, mux_t mux
)
107 header_
->seq_nr
= SEQ_NR_T_HTON(seq_nr
);
108 header_
->sender_id
= SENDER_ID_T_HTON(sender_id
);
109 header_
->mux
= MUX_T_HTON(mux
);
112 u_int32_t
EncryptedPacket::getPayloadLength() const
118 return (length_
> sizeof(struct HeaderStruct
)) ? (length_
- sizeof(struct HeaderStruct
)) : 0;
120 return (length_
> (sizeof(struct HeaderStruct
) + AUTHTAG_SIZE
)) ? (length_
- sizeof(struct HeaderStruct
) - AUTHTAG_SIZE
) : 0;
123 void EncryptedPacket::setPayloadLength(u_int32_t payload_length
)
125 Buffer::setLength(payload_length
+ sizeof(struct HeaderStruct
));
126 // depending on allow_realloc buf_ may point to another address
127 // therefore in this case reinit() gets called by Buffer::setLength()
130 void EncryptedPacket::reinit()
132 header_
= reinterpret_cast<struct HeaderStruct
*>(buf_
);
133 payload_
= buf_
+ sizeof(struct HeaderStruct
);
135 if(length_
<= (sizeof(struct HeaderStruct
)))
138 if(length_
< (sizeof(struct HeaderStruct
))) {
140 throw std::runtime_error("packet can't be initialized, buffer is too small");
145 if(length_
< (sizeof(struct HeaderStruct
) + AUTHTAG_SIZE
)) {
147 throw std::runtime_error("auth-tag can't be enabled, buffer is too small");
149 auth_tag_
= buf_
+ length_
- AUTHTAG_SIZE
;
153 u_int8_t
* EncryptedPacket::getPayload()
158 u_int8_t
* EncryptedPacket::getAuthenticatedPortion()
163 u_int32_t
EncryptedPacket::getAuthenticatedPortionLength()
171 return (length_
> AUTHTAG_SIZE
) ? (length_
- AUTHTAG_SIZE
) : 0;
174 void EncryptedPacket::withAuthTag(bool b
)
176 if((b
&& auth_tag_
) || (!b
&& !auth_tag_
))
181 if(length_
< (sizeof(struct HeaderStruct
) + AUTHTAG_SIZE
))
182 throw std::runtime_error("auth-tag can't be enabled, buffer is too small");
184 auth_tag_
= buf_
+ length_
- AUTHTAG_SIZE
;
190 void EncryptedPacket::addAuthTag()
195 auth_tag_
= buf_
; // will be set to the correct value @ reinit
196 setLength(length_
+ AUTHTAG_SIZE
);
197 if(auth_tag_
== buf_
) // reinit was not called by setLength
201 void EncryptedPacket::removeAuthTag()
207 setLength(length_
- AUTHTAG_SIZE
);
210 u_int8_t
* EncryptedPacket::getAuthTag()
215 u_int32_t
EncryptedPacket::getAuthTagLength()