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/>.
37 #include <boost/archive/text_oarchive.hpp>
38 #include <boost/archive/text_iarchive.hpp>
39 #include "datatypes.h"
42 Buffer::Buffer(bool allow_realloc
) : buf_(0), length_(0), real_length_(0), allow_realloc_(allow_realloc
)
46 Buffer::Buffer(u_int32_t length
, bool allow_realloc
) : length_(length
), real_length_(length_
+ Buffer::OVER_SIZE_
),
47 allow_realloc_(allow_realloc
)
49 buf_
= new u_int8_t
[real_length_
];
53 throw std::bad_alloc();
55 std::memset(buf_
, 0, real_length_
);
58 Buffer::Buffer(u_int8_t
* data
, u_int32_t length
, bool allow_realloc
) : length_(length
), real_length_(length
+ Buffer::OVER_SIZE_
),
59 allow_realloc_(allow_realloc
)
67 buf_
= new u_int8_t
[real_length_
];
71 throw std::bad_alloc();
73 std::memcpy(buf_
, data
, length_
);
76 Buffer::Buffer(std::string hex_data
, bool allow_realloc
) : length_(static_cast<u_int32_t
>(hex_data
.size())/2),
77 real_length_(length_
+ Buffer::OVER_SIZE_
),
78 allow_realloc_(allow_realloc
)
80 buf_
= new u_int8_t
[real_length_
];
84 throw std::bad_alloc();
87 for(u_int32_t i
=0; i
<length_
; ++i
)
90 std::istringstream
ss(std::string(hex_data
.c_str(), i
*2, 2));
91 if(!(ss
>> std::hex
>> tmp
)) tmp
= 0;
92 buf_
[i
] = static_cast<u_int8_t
>(tmp
);
102 Buffer::Buffer(const Buffer
&src
) : length_(src
.length_
), real_length_(src
.real_length_
), allow_realloc_(src
.allow_realloc_
)
104 buf_
= new u_int8_t
[real_length_
];
108 throw std::bad_alloc();
110 std::memcpy(buf_
, src
.buf_
, length_
);
113 void Buffer::operator=(const Buffer
&src
)
118 length_
= src
.length_
;
119 real_length_
= src
.real_length_
;
120 allow_realloc_
= src
.allow_realloc_
;
122 buf_
= new u_int8_t
[real_length_
];
126 throw std::bad_alloc();
128 std::memcpy(buf_
, src
.buf_
, length_
);
131 bool Buffer::operator==(const Buffer
&cmp
) const
133 if(length_
!= cmp
.length_
)
136 if(!std::memcmp(buf_
, cmp
.buf_
, length_
))
142 Buffer
Buffer::operator^(const Buffer
&xor_by
) const
144 u_int32_t res_length
= (xor_by
.length_
> length_
) ? xor_by
.length_
: length_
;
145 u_int32_t min_length
= (xor_by
.length_
< length_
) ? xor_by
.length_
: length_
;
146 Buffer
res(res_length
);
148 for( u_int32_t index
= 0; index
< min_length
; index
++ )
149 res
[index
] = buf_
[index
] ^ xor_by
[index
];
154 u_int32_t
Buffer::getLength() const
159 void Buffer::setLength(u_int32_t new_length
)
161 if(new_length
== length_
)
164 if(new_length
> real_length_
)
167 throw std::out_of_range("buffer::setLength() - reallocation not allowed for this Buffer");
169 u_int8_t
* old_buf
= buf_
;
170 u_int32_t old_length
= length_
;
172 length_
= new_length
;
173 real_length_
= length_
+ Buffer::OVER_SIZE_
;
175 buf_
= new u_int8_t
[real_length_
];
182 throw std::bad_alloc();
184 std::memcpy(buf_
, old_buf
, old_length
);
189 old_buf
= &buf_
[old_length
];
190 std::memset(old_buf
, 0, real_length_
- old_length
);
193 length_
= new_length
;
199 u_int8_t
* Buffer::getBuf()
204 u_int8_t
& Buffer::operator[](u_int32_t index
)
207 throw std::out_of_range("buffer::operator[]");
212 u_int8_t
Buffer::operator[](u_int32_t index
) const
215 throw std::out_of_range("buffer::operator[] const");
220 Buffer::operator u_int8_t
*()
225 std::string
Buffer::getHexDump() const
227 std::stringstream ss
;
228 ss
<< "Length=" << length_
<< std::endl
<< std::hex
<< std::uppercase
;
229 for( u_int32_t index
= 0; index
< length_
; index
++ )
231 ss
<< std::setw(2) << std::setfill('0') << u_int32_t(buf_
[index
]) << " ";
232 if(!((index
+1) % 16)) {
242 std::string
Buffer::getHexDumpOneLine() const
244 std::stringstream ss
;
245 ss
<< length_
<< " Bytes,'" << std::hex
<< std::uppercase
;
246 for( u_int32_t index
= 0; index
< length_
; index
++ )
248 ss
<< std::setw(2) << std::setfill('0') << u_int32_t(buf_
[index
]);
254 bool Buffer::isReallocAllowed() const
256 return allow_realloc_
;