From 99122b5d0da14bfb36cc3760bc6637d396b83cda Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Mon, 18 Jun 2007 23:10:07 +0000 Subject: package works now --- anytun.cpp | 160 ++++++++++++++++-------------------------------------------- package.cpp | 148 +++++++++++++++++++++++++++++++++---------------------- package.h | 6 +-- 3 files changed, 137 insertions(+), 177 deletions(-) diff --git a/anytun.cpp b/anytun.cpp index 8213df3..daae3bc 100644 --- a/anytun.cpp +++ b/anytun.cpp @@ -39,6 +39,17 @@ #include "cypher.h" #include "authAlgo.h" +void printStat(Package& pack) +{ + std::cout << "pack[0-" << pack.getLength() << "]: '"; + for(unsigned int i=0; i= sizeof(payload_type_t)) - payload_type_ = reinterpret_cast(&buf_[length_ - sizeof(payload_type_t)]); + has_payload_type_ = true; else - payload_type_ = 0; + has_payload_type_ = false; return *this; } payload_type_t Package::getPayloadType() const { - if(!payload_type_) + if(!has_payload_type_) + return 0; + + if((!has_auth_tag_ && length_ < sizeof(payload_type_t)) || + (has_auth_tag_ && length_ < (sizeof(payload_type_t) + sizeof(auth_tag_t)))) return 0; - return PAYLOAD_TYPE_T_NTOH(*payload_type_); + payload_type_t* payload_type; + + if(!has_auth_tag_) + payload_type = reinterpret_cast(buf_ + length_ - sizeof(payload_type_t)); + else + payload_type = reinterpret_cast(buf_ + length_ - sizeof(payload_type_t) - sizeof(auth_tag_t)); + return PAYLOAD_TYPE_T_NTOH(*payload_type); } Package& Package::addPayloadType(payload_type_t payload_type) { - if(auth_tag_) + if(has_auth_tag_) throw std::runtime_error("can't add payload_type with existing auth_tag"); - if(!payload_type_) + if(!has_payload_type_) { - if(sizeof(payload_type_t) > resizeBack(length_ + sizeof(payload_type_t))) + u_int32_t new_length = length_ + sizeof(payload_type_t); + if(new_length > resizeBack(new_length)) return *this; - payload_type_ = reinterpret_cast(&buf_[length_ - sizeof(payload_type_t)]); + has_payload_type_ = true; } - *payload_type_ = PAYLOAD_TYPE_T_HTON(payload_type); + payload_type_t* payload_type_ptr; + payload_type_ptr = reinterpret_cast(buf_ + length_ - sizeof(payload_type_t)); + *payload_type_ptr = PAYLOAD_TYPE_T_HTON(payload_type); return *this; } Package& Package::removePayloadType() { - if(auth_tag_) + if(has_auth_tag_) throw std::runtime_error("can't remove payload_type with existing auth_tag"); - if(!payload_type_) + if(!has_payload_type_) return *this; if(length_ >= sizeof(payload_type_t)) resizeBack(length_ - sizeof(payload_type_t)); - payload_type_ = 0; + has_payload_type_ = false; return *this; } + + bool Package::hasAuthTag() const { - return auth_tag_; + return has_auth_tag_; } Package& Package::withAuthTag(bool b) { if(b && length_ >= sizeof(auth_tag_t)) - auth_tag_ = reinterpret_cast(&buf_[length_ - sizeof(auth_tag_t)]); + has_auth_tag_ = true; else - auth_tag_ = 0; - + has_auth_tag_ = false; + return *this; -} +} auth_tag_t Package::getAuthTag() const { - if(!auth_tag_) + if(!has_auth_tag_) + return 0; + + if(length_ < sizeof(auth_tag_t)) return 0; - return AUTH_TAG_T_NTOH(*auth_tag_); + auth_tag_t* auth_tag; + auth_tag = reinterpret_cast(buf_ + length_ - sizeof(auth_tag_t)); + return AUTH_TAG_T_NTOH(*auth_tag); } Package& Package::addAuthTag(auth_tag_t auth_tag) { - if(!auth_tag_) + if(!has_auth_tag_) { - if(sizeof(auth_tag_t) > resizeBack(length_ + sizeof(auth_tag_t))) + u_int32_t new_length = length_ + sizeof(auth_tag_t); + if(new_length > resizeBack(new_length)) return *this; - auth_tag_ = reinterpret_cast(&buf_[length_ - sizeof(auth_tag_t)]); + has_auth_tag_ = true; } - *auth_tag_ = AUTH_TAG_T_HTON(auth_tag); + auth_tag_t* auth_tag_ptr; + auth_tag_ptr = reinterpret_cast(buf_ + length_ - sizeof(auth_tag_t)); + *auth_tag_ptr = AUTH_TAG_T_HTON(auth_tag); return *this; } Package& Package::removeAuthTag() { - if(!auth_tag_) + if(!has_auth_tag_) return *this; if(length_ >= sizeof(auth_tag_t)) resizeBack(length_ - sizeof(auth_tag_t)); - auth_tag_ = 0; + has_auth_tag_ = false; return *this; } diff --git a/package.h b/package.h index a5f7a84..da0c872 100644 --- a/package.h +++ b/package.h @@ -68,9 +68,9 @@ private: seq_nr_t seq_nr; sender_id_t sender_id; }__attribute__((__packed__)); - struct HeaderStruct* header_; - payload_type_t* payload_type_; - auth_tag_t* auth_tag_; + bool has_header_; + bool has_payload_type_; + bool has_auth_tag_; }; #endif -- cgit v1.2.3