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 anytun.org <satp@wirdorange.org>
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License version 2
18 * as published by the Free Software Foundation.
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 * You should have received a copy of the GNU General Public License
26 * along with this program (see the file COPYING included with this
27 * distribution); if not, write to the Free Software Foundation, Inc.,
28 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
35 #include <boost/archive/text_oarchive.hpp>
36 #include <boost/archive/text_iarchive.hpp>
37 #include "datatypes.h"
40 Buffer::Buffer(bool allow_realloc
) : buf_(0), length_(0), real_length_(0), allow_realloc_(allow_realloc
)
44 Buffer::Buffer(u_int32_t length
, bool allow_realloc
) : length_(length
), real_length_(length_
+ Buffer::OVER_SIZE_
),
45 allow_realloc_(allow_realloc
)
47 buf_
= new u_int8_t
[real_length_
];
51 throw std::bad_alloc();
53 std::memset(buf_
, 0, real_length_
);
56 Buffer::Buffer(u_int8_t
* data
, u_int32_t length
, bool allow_realloc
) : length_(length
), real_length_(length
+ Buffer::OVER_SIZE_
),
57 allow_realloc_(allow_realloc
)
65 buf_
= new u_int8_t
[real_length_
];
69 throw std::bad_alloc();
71 std::memcpy(buf_
, data
, length_
);
74 Buffer::Buffer(std::string hex_data
, bool allow_realloc
) : length_(hex_data
.size()/2),
75 real_length_(length_
+ Buffer::OVER_SIZE_
),
76 allow_realloc_(allow_realloc
)
78 buf_
= new u_int8_t
[real_length_
];
82 throw std::bad_alloc();
85 for(u_int32_t i
=0; i
<length_
; ++i
)
88 std::istringstream
ss(std::string(hex_data
.c_str(), i
*2, 2));
89 if(!(ss
>> std::hex
>> tmp
)) tmp
= 0;
100 Buffer::Buffer(const Buffer
&src
) : length_(src
.length_
), real_length_(src
.real_length_
), allow_realloc_(src
.allow_realloc_
)
102 buf_
= new u_int8_t
[real_length_
];
106 throw std::bad_alloc();
108 std::memcpy(buf_
, src
.buf_
, length_
);
111 void Buffer::operator=(const Buffer
&src
)
116 length_
= src
.length_
;
117 real_length_
= src
.real_length_
;
118 allow_realloc_
= src
.allow_realloc_
;
120 buf_
= new u_int8_t
[real_length_
];
124 throw std::bad_alloc();
126 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_
;