rippled
Serializer.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef RIPPLE_PROTOCOL_SERIALIZER_H_INCLUDED
21 #define RIPPLE_PROTOCOL_SERIALIZER_H_INCLUDED
22 
23 #include <ripple/basics/base_uint.h>
24 #include <ripple/basics/Blob.h>
25 #include <ripple/basics/contract.h>
26 #include <ripple/basics/Buffer.h>
27 #include <ripple/basics/safe_cast.h>
28 #include <ripple/basics/Slice.h>
29 #include <ripple/beast/crypto/secure_erase.h>
30 #include <ripple/protocol/HashPrefix.h>
31 #include <ripple/protocol/SField.h>
32 #include <cassert>
33 #include <cstdint>
34 #include <cstring>
35 #include <iomanip>
36 #include <sstream>
37 #include <type_traits>
38 
39 namespace ripple {
40 
41 class CKey; // forward declaration
42 
44 {
45 private:
46  // DEPRECATED
48 
49 public:
50  explicit
51  Serializer (int n = 256)
52  {
53  mData.reserve (n);
54  }
55 
57  {
58  mData.resize(size);
59 
60  if (size)
61  {
62  assert(data != nullptr);
64  }
65  }
66 
67  Slice slice() const noexcept
68  {
69  return Slice(mData.data(), mData.size());
70  }
71 
73  size() const noexcept
74  {
75  return mData.size();
76  }
77 
78  void const*
79  data() const noexcept
80  {
81  return mData.data();
82  }
83 
84  // assemble functions
85  int add8 (unsigned char byte);
86  int add16 (std::uint16_t);
87  int add32 (std::uint32_t); // ledger indexes, account sequence, timestamps
88  int add32 (HashPrefix);
89  int add64 (std::uint64_t); // native currency amounts
90  int add128 (const uint128&); // private key generators
91  int add256 (uint256 const& ); // transaction and ledger hashes
92 
93  template <typename Integer>
94  int addInteger(Integer);
95 
96  template <int Bits, class Tag>
98  int ret = mData.size ();
99  mData.insert (mData.end (), v.begin (), v.end ());
100  return ret;
101  }
102 
103  // TODO(tom): merge with add128 and add256.
104  template <class Tag>
106  {
107  return addBitString<160, Tag>(i);
108  }
109 
110  int addRaw (Blob const& vector);
111  int addRaw (const void* ptr, int len);
112  int addRaw (const Serializer& s);
113  int addZeros (size_t uBytes);
114 
115  int addVL (Blob const& vector);
116  int addVL (Slice const& slice);
117  template<class Iter>
118  int addVL (Iter begin, Iter end, int len);
119  int addVL (const void* ptr, int len);
120 
121  // disassemble functions
122  bool get8 (int&, int offset) const;
123  bool get256 (uint256&, int offset) const;
124 
125  template <typename Integer>
126  bool getInteger(Integer& number, int offset) {
127  static const auto bytes = sizeof(Integer);
128  if ((offset + bytes) > mData.size ())
129  return false;
130  number = 0;
131 
132  auto ptr = &mData[offset];
133  for (auto i = 0; i < bytes; ++i)
134  {
135  if (i)
136  number <<= 8;
137  number |= *ptr++;
138  }
139  return true;
140  }
141 
142  template <int Bits, typename Tag = void>
143  bool getBitString(base_uint<Bits, Tag>& data, int offset) const {
144  auto success = (offset + (Bits / 8)) <= mData.size ();
145  if (success)
146  memcpy (data.begin (), & (mData.front ()) + offset, (Bits / 8));
147  return success;
148  }
149 
150  // TODO(tom): merge with get128 and get256.
151  template <class Tag>
152  bool get160 (base_uint<160, Tag>& o, int offset) const
153  {
154  return getBitString<160, Tag>(o, offset);
155  }
156 
157  bool getRaw (Blob&, int offset, int length) const;
158  Blob getRaw (int offset, int length) const;
159 
160  bool getVL (Blob& objectVL, int offset, int& length) const;
161  bool getVLLength (int& length, int offset) const;
162 
163  int addFieldID (int type, int name);
164  int addFieldID (SerializedTypeID type, int name)
165  {
166  return addFieldID (safe_cast<int> (type), name);
167  }
168 
169  // DEPRECATED
170  uint256 getSHA512Half() const;
171 
172  // totality functions
173  Blob const& peekData () const
174  {
175  return mData;
176  }
177  Blob getData () const
178  {
179  return mData;
180  }
182  {
183  return mData;
184  }
185 
186  int getDataLength () const
187  {
188  return mData.size ();
189  }
190  const void* getDataPtr () const
191  {
192  return mData.data();
193  }
194  void* getDataPtr ()
195  {
196  return mData.data();
197  }
198  int getLength () const
199  {
200  return mData.size ();
201  }
203  {
204  return std::string (static_cast<const char*> (getDataPtr ()), size ());
205  }
206  void secureErase ()
207  {
209  mData.clear ();
210  }
211  void erase ()
212  {
213  mData.clear ();
214  }
215  bool chop (int num);
216 
217  // vector-like functions
218  Blob ::iterator begin ()
219  {
220  return mData.begin ();
221  }
222  Blob ::iterator end ()
223  {
224  return mData.end ();
225  }
226  Blob ::const_iterator begin () const
227  {
228  return mData.begin ();
229  }
230  Blob ::const_iterator end () const
231  {
232  return mData.end ();
233  }
234  void reserve (size_t n)
235  {
236  mData.reserve (n);
237  }
238  void resize (size_t n)
239  {
240  mData.resize (n);
241  }
242  size_t capacity () const
243  {
244  return mData.capacity ();
245  }
246 
247  bool operator== (Blob const& v)
248  {
249  return v == mData;
250  }
251  bool operator!= (Blob const& v)
252  {
253  return v != mData;
254  }
255  bool operator== (const Serializer& v)
256  {
257  return v.mData == mData;
258  }
259  bool operator!= (const Serializer& v)
260  {
261  return v.mData != mData;
262  }
263 
265  {
267 
268  for (unsigned char const& element : mData)
269  {
270  h <<
271  std::setw (2) <<
272  std::hex <<
273  std::setfill ('0') <<
274  safe_cast<unsigned int>(element);
275  }
276  return h.str ();
277  }
278 
279  static int decodeLengthLength (int b1);
280  static int decodeVLLength (int b1);
281  static int decodeVLLength (int b1, int b2);
282  static int decodeVLLength (int b1, int b2, int b3);
283 private:
284  static int lengthVL (int length)
285  {
286  return length + encodeLengthLength (length);
287  }
288  static int encodeLengthLength (int length); // length to encode length
289  int addEncoded (int length);
290 };
291 
292 template<class Iter>
293 int Serializer::addVL(Iter begin, Iter end, int len)
294 {
295  int ret = addEncoded(len);
296  for (; begin != end; ++begin)
297  {
298  addRaw(begin->data(), begin->size());
299 #ifndef NDEBUG
300  len -= begin->size();
301 #endif
302  }
303  assert(len == 0);
304  return ret;
305 }
306 
307 //------------------------------------------------------------------------------
308 
309 // DEPRECATED
310 // Transitional adapter to new serialization interfaces
312 {
313 private:
314  std::uint8_t const* p_;
317 
318 public:
319  SerialIter (void const* data,
320  std::size_t size) noexcept;
321 
322  SerialIter (Slice const& slice)
323  : SerialIter(slice.data(), slice.size())
324  {
325  }
326 
327  // Infer the size of the data based on the size of the passed array.
328  template<int N>
329  explicit SerialIter (std::uint8_t const (&data)[N])
330  : SerialIter(&data[0], N)
331  {
332  static_assert (N > 0, "");
333  }
334 
336  empty() const noexcept
337  {
338  return remain_ == 0;
339  }
340 
341  void
342  reset() noexcept;
343 
344  int
345  getBytesLeft() const noexcept
346  {
347  return static_cast<int>(remain_);
348  }
349 
350  // get functions throw on error
351  unsigned char
352  get8();
353 
355  get16();
356 
358  get32();
359 
361  get64();
362 
363  template <int Bits, class Tag = void>
365  getBitString();
366 
367  uint128
369  {
370  return getBitString<128>();
371  }
372 
373  uint160
375  {
376  return getBitString<160>();
377  }
378 
379  uint256
381  {
382  return getBitString<256>();
383  }
384 
385  void
386  getFieldID (int& type, int& name);
387 
388  // Returns the size of the VL if the
389  // next object is a VL. Advances the iterator
390  // to the beginning of the VL.
391  int
392  getVLDataLength ();
393 
394  Slice
395  getSlice (std::size_t bytes);
396 
397  // VFALCO DEPRECATED Returns a copy
398  Blob
399  getRaw (int size);
400 
401  // VFALCO DEPRECATED Returns a copy
402  Blob
403  getVL();
404 
405  void
406  skip (int num);
407 
408  Buffer
409  getVLBuffer();
410 
411  template<class T>
412  T getRawHelper (int size);
413 };
414 
415 template <int Bits, class Tag>
416 base_uint<Bits, Tag>
418 {
420  auto const n = Bits/8;
421  if (remain_ < n)
422  Throw<std::runtime_error> (
423  "invalid SerialIter getBitString");
424  std::memcpy (u.begin(), p_, n);
425  p_ += n;
426  used_ += n;
427  remain_ -= n;
428  return u;
429 }
430 
431 } // ripple
432 
433 #endif
sstream
std::vector::resize
T resize(T... args)
ripple::Serializer::end
Blob ::iterator end()
Definition: Serializer.h:222
ripple::Serializer::chop
bool chop(int num)
Definition: Serializer.cpp:177
ripple::Serializer::add8
int add8(unsigned char byte)
Definition: Serializer.cpp:162
ripple::SerialIter::SerialIter
SerialIter(Slice const &slice)
Definition: Serializer.h:322
std::string
STL class.
ripple::Serializer::mData
Blob mData
Definition: Serializer.h:47
cstring
ripple::Serializer::reserve
void reserve(size_t n)
Definition: Serializer.h:234
ripple::Serializer::addFieldID
int addFieldID(int type, int name)
Definition: Serializer.cpp:129
ripple::Serializer::addInteger
int addInteger(Integer)
ripple::Serializer::modData
Blob & modData()
Definition: Serializer.h:181
ripple::Serializer::getVLLength
bool getVLLength(int &length, int offset) const
Definition: Serializer.cpp:275
ripple::Slice
An immutable linear range of bytes.
Definition: Slice.h:43
ripple::Serializer::erase
void erase()
Definition: Serializer.h:211
ripple::Serializer::getVL
bool getVL(Blob &objectVL, int offset, int &length) const
Definition: Serializer.cpp:234
std::vector::reserve
T reserve(T... args)
ripple::Serializer::getHex
std::string getHex() const
Definition: Serializer.h:264
ripple::Serializer::operator==
bool operator==(Blob const &v)
Definition: Serializer.h:247
std::vector< unsigned char >
std::vector::size
T size(T... args)
ripple::Serializer::getString
std::string getString() const
Definition: Serializer.h:202
ripple::base_uint::end
iterator end()
Definition: base_uint.h:107
ripple::SerializedTypeID
SerializedTypeID
Definition: SField.h:52
std::stringstream
STL class.
ripple::Serializer::getDataPtr
void * getDataPtr()
Definition: Serializer.h:194
ripple::SerialIter::getFieldID
void getFieldID(int &type, int &name)
Definition: Serializer.cpp:496
ripple::Serializer::decodeVLLength
static int decodeVLLength(int b1)
Definition: Serializer.cpp:373
ripple::Serializer::add32
int add32(std::uint32_t)
Definition: Serializer.cpp:46
ripple::Buffer
Like std::vector<char> but better.
Definition: Buffer.h:35
std::setfill
T setfill(T... args)
ripple::Serializer::getSHA512Half
uint256 getSHA512Half() const
Definition: Serializer.cpp:203
ripple::Serializer::Serializer
Serializer(int n=256)
Definition: Serializer.h:51
ripple::Serializer::decodeLengthLength
static int decodeLengthLength(int b1)
Definition: Serializer.cpp:359
std::vector::front
T front(T... args)
ripple::Serializer::add16
int add16(std::uint16_t)
Definition: Serializer.cpp:38
ripple::Serializer::begin
Blob ::iterator begin()
Definition: Serializer.h:218
std::vector::clear
T clear(T... args)
ripple::Serializer::get256
bool get256(uint256 &, int offset) const
Definition: Serializer.cpp:121
ripple::SerialIter::SerialIter
SerialIter(void const *data, std::size_t size) noexcept
Definition: Serializer.cpp:402
ripple::Serializer::data
void const * data() const noexcept
Definition: Serializer.h:79
ripple::Serializer::getInteger
bool getInteger(Integer &number, int offset)
Definition: Serializer.h:126
std::hex
T hex(T... args)
ripple::Serializer::getDataLength
int getDataLength() const
Definition: Serializer.h:186
ripple::base_uint
Definition: base_uint.h:65
std::vector::capacity
T capacity(T... args)
ripple::Serializer::operator!=
bool operator!=(Blob const &v)
Definition: Serializer.h:251
ripple::SerialIter::get8
unsigned char get8()
Definition: Serializer.cpp:430
ripple::HashPrefix
HashPrefix
Prefix for hashing functions.
Definition: HashPrefix.h:56
ripple::SerialIter::get256
uint256 get256()
Definition: Serializer.h:380
ripple::SerialIter::get64
std::uint64_t get64()
Definition: Serializer.cpp:475
ripple::Serializer::getRaw
bool getRaw(Blob &, int offset, int length) const
Definition: Serializer.cpp:185
ripple::Serializer::lengthVL
static int lengthVL(int length)
Definition: Serializer.h:284
ripple::Serializer::getDataPtr
const void * getDataPtr() const
Definition: Serializer.h:190
ripple::SerialIter::empty
std::size_t empty() const noexcept
Definition: Serializer.h:336
ripple::SerialIter::get160
uint160 get160()
Definition: Serializer.h:374
ripple::Serializer::resize
void resize(size_t n)
Definition: Serializer.h:238
ripple::Serializer::addRaw
int addRaw(Blob const &vector)
Definition: Serializer.cpp:100
ripple::Serializer::get8
bool get8(int &, int offset) const
Definition: Serializer.cpp:169
ripple::Serializer::slice
Slice slice() const noexcept
Definition: Serializer.h:67
cstdint
ripple::Serializer::add128
int add128(const uint128 &)
Definition: Serializer.cpp:86
beast::secure_erase
void secure_erase(void *dest, std::size_t bytes)
Guaranteed to fill memory with zeroes.
Definition: secure_erase.h:83
ripple::SerialIter
Definition: Serializer.h:311
ripple::Serializer::addEncoded
int addEncoded(int length)
Definition: Serializer.cpp:315
ripple::SerialIter::getVL
Blob getVL()
Definition: Serializer.cpp:592
std::uint16_t
ripple::SerialIter::skip
void skip(int num)
Definition: Serializer.cpp:419
ripple::SerialIter::used_
std::size_t used_
Definition: Serializer.h:316
ripple::Serializer::capacity
size_t capacity() const
Definition: Serializer.h:242
ripple::Serializer::end
Blob ::const_iterator end() const
Definition: Serializer.h:230
ripple::SerialIter::remain_
std::size_t remain_
Definition: Serializer.h:315
ripple::Serializer::get160
bool get160(base_uint< 160, Tag > &o, int offset) const
Definition: Serializer.h:152
ripple::Serializer
Definition: Serializer.h:43
ripple::SerialIter::getRaw
Blob getRaw(int size)
Definition: Serializer.cpp:548
ripple::SerialIter::getBitString
base_uint< Bits, Tag > getBitString()
Definition: Serializer.h:417
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::Serializer::addBitString
int addBitString(base_uint< Bits, Tag > const &v)
Definition: Serializer.h:97
ripple::Serializer::getBitString
bool getBitString(base_uint< Bits, Tag > &data, int offset) const
Definition: Serializer.h:143
ripple::Serializer::addZeros
int addZeros(size_t uBytes)
Definition: Serializer.cpp:28
ripple::SerialIter::getBytesLeft
int getBytesLeft() const noexcept
Definition: Serializer.h:345
ripple::Serializer::size
std::size_t size() const noexcept
Definition: Serializer.h:73
ripple::base_uint::begin
iterator begin()
Definition: base_uint.h:106
ripple::Serializer::secureErase
void secureErase()
Definition: Serializer.h:206
iomanip
ripple::SerialIter::get128
uint128 get128()
Definition: Serializer.h:368
std::vector::begin
T begin(T... args)
std::vector::insert
T insert(T... args)
cassert
ripple::Serializer::peekData
Blob const & peekData() const
Definition: Serializer.h:173
ripple::SerialIter::getVLDataLength
int getVLDataLength()
Definition: Serializer.cpp:553
ripple::SerialIter::getRawHelper
T getRawHelper(int size)
Definition: Serializer.cpp:525
ripple::Serializer::add64
int add64(std::uint64_t)
Definition: Serializer.cpp:67
ripple::SerialIter::p_
std::uint8_t const * p_
Definition: Serializer.h:314
ripple::Serializer::Serializer
Serializer(void const *data, std::size_t size)
Definition: Serializer.h:56
ripple::Serializer::addVL
int addVL(Blob const &vector)
Definition: Serializer.cpp:208
ripple::Serializer::begin
Blob ::const_iterator begin() const
Definition: Serializer.h:226
std::stringstream::str
T str(T... args)
std::size_t
ripple::Serializer::add160
int add160(base_uint< 160, Tag > const &i)
Definition: Serializer.h:105
std::memcpy
T memcpy(T... args)
ripple::Serializer::getData
Blob getData() const
Definition: Serializer.h:177
std::vector::end
T end(T... args)
std::setw
T setw(T... args)
ripple::Serializer::getLength
int getLength() const
Definition: Serializer.h:198
ripple::SerialIter::get32
std::uint32_t get32()
Definition: Serializer.cpp:458
ripple::Serializer::encodeLengthLength
static int encodeLengthLength(int length)
Definition: Serializer.cpp:345
ripple::SerialIter::reset
void reset() noexcept
Definition: Serializer.cpp:411
ripple::SerialIter::getVLBuffer
Buffer getVLBuffer()
Definition: Serializer.cpp:598
ripple::Serializer::addFieldID
int addFieldID(SerializedTypeID type, int name)
Definition: Serializer.h:164
std::vector::data
T data(T... args)
type_traits
ripple::SerialIter::getSlice
Slice getSlice(std::size_t bytes)
Definition: Serializer.cpp:578
ripple::SerialIter::get16
std::uint16_t get16()
Definition: Serializer.cpp:443
ripple::SerialIter::SerialIter
SerialIter(std::uint8_t const (&data)[N])
Definition: Serializer.h:329
ripple::Serializer::add256
int add256(uint256 const &)
Definition: Serializer.cpp:93