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() : buf_(0), length_(0)
44 Buffer::Buffer(u_int32_t length
) : length_(length
)
46 buf_
= new u_int8_t
[length_
];
48 std::memset(buf_
, 0, length_
);
53 Buffer::Buffer(u_int8_t
* data
, u_int32_t length
) : length_(length
)
55 buf_
= new u_int8_t
[length_
];
57 std::memcpy(buf_
, data
, length_
);
68 Buffer::Buffer(const Buffer
&src
) : length_(src
.length_
)
70 buf_
= new u_int8_t
[length_
];
72 std::memcpy(buf_
, src
.buf_
, length_
);
77 void Buffer::operator=(const Buffer
&src
)
82 length_
= src
.length_
;
84 buf_
= new u_int8_t
[length_
];
86 std::memcpy(buf_
, src
.buf_
, length_
);
93 bool Buffer::operator==(const Buffer
&cmp
) const
95 if(length_
!= cmp
.length_
)
98 if(!std::memcmp(buf_
, cmp
.buf_
, length_
))
105 u_int32_t
Buffer::resizeFront(u_int32_t new_length
)
107 if(length_
== new_length
)
110 u_int8_t
*tmp
= new u_int8_t
[new_length
];
116 u_int8_t
*src
=buf_
, *dest
=tmp
;
117 if(length_
< new_length
)
118 dest
= &dest
[new_length
- length_
];
120 src
= &src
[length_
- new_length
];
121 u_int32_t len
= length_
< new_length
? length_
: new_length
;
122 std::memcpy(dest
, src
, len
);
126 length_
= new_length
;
131 u_int32_t
Buffer::resizeBack(u_int32_t new_length
)
133 if(length_
== new_length
)
136 u_int8_t
*tmp
= new u_int8_t
[new_length
];
142 u_int32_t len
= length_
< new_length
? length_
: new_length
;
143 std::memcpy(tmp
, buf_
, len
);
147 length_
= new_length
;
152 u_int32_t
Buffer::getLength() const
157 u_int8_t
* Buffer::getBuf()
162 u_int8_t
& Buffer::operator[](u_int32_t index
)
165 throw std::out_of_range("buffer::operator[]");
170 u_int8_t
Buffer::operator[](u_int32_t index
) const
173 throw std::out_of_range("buffer::operator[] const");
178 Buffer::operator u_int8_t
*() // just for write/read tun
183 std::string
Buffer::getHexDump() const
186 std::string ret
= "";
188 for( u_int32_t index
= 0; index
< length_
; index
++ )
190 std::sprintf(text
, "%#4x", buf_
[index
]);
193 if( ((index
+1) % 10) == 0 )
199 Buffer
Buffer::operator^(const Buffer
&xor_by
) const
202 if( xor_by
.getLength() > length_
)
203 throw std::out_of_range("buffer::operator^ const");
205 for( u_int32_t index
= 0; index
< xor_by
.getLength(); index
++ )
206 res
[index
] = buf_
[index
] ^ xor_by
[index
];
211 Buffer
Buffer::leftByteShift(u_int32_t width
) const
213 Buffer
res(length_
+width
);
215 for( u_int32_t index
= 0; index
< length_
; index
++ )
216 res
[index
+width
] = buf_
[index
];
221 Buffer
Buffer::rightByteShift(u_int32_t width
) const
225 for( u_int32_t index
= 0; index
< length_
-width
; index
++ )
226 res
[index
] = buf_
[index
+width
];