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/Blob.h>
24 #include <ripple/basics/Buffer.h>
25 #include <ripple/basics/Slice.h>
26 #include <ripple/basics/base_uint.h>
27 #include <ripple/basics/contract.h>
28 #include <ripple/basics/safe_cast.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 Serializer(int n = 256)
51  {
52  mData.reserve(n);
53  }
54 
56  {
57  mData.resize(size);
58 
59  if (size)
60  {
61  assert(data != nullptr);
63  }
64  }
65 
66  Slice
67  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
86  add8(unsigned char byte);
87  int add16(std::uint16_t);
88  int add32(std::uint32_t); // ledger indexes, account sequence, timestamps
89  int add32(HashPrefix);
90  int add64(std::uint64_t); // native currency amounts
91  int
92  add128(const uint128&); // private key generators
93  int
94  add256(uint256 const&); // transaction and ledger hashes
95 
96  template <typename Integer>
97  int addInteger(Integer);
98 
99  template <int Bits, class Tag>
100  int
102  {
103  int ret = mData.size();
104  mData.insert(mData.end(), v.begin(), v.end());
105  return ret;
106  }
107 
108  // TODO(tom): merge with add128 and add256.
109  template <class Tag>
110  int
112  {
113  return addBitString<160, Tag>(i);
114  }
115 
116  int
117  addRaw(Blob const& vector);
118  int
119  addRaw(const void* ptr, int len);
120  int
121  addRaw(const Serializer& s);
122  int
123  addZeros(size_t uBytes);
124 
125  int
126  addVL(Blob const& vector);
127  int
128  addVL(Slice const& slice);
129  template <class Iter>
130  int
131  addVL(Iter begin, Iter end, int len);
132  int
133  addVL(const void* ptr, int len);
134 
135  // disassemble functions
136  bool
137  get8(int&, int offset) const;
138  bool
139  get256(uint256&, int offset) const;
140 
141  template <typename Integer>
142  bool
143  getInteger(Integer& number, int offset)
144  {
145  static const auto bytes = sizeof(Integer);
146  if ((offset + bytes) > mData.size())
147  return false;
148  number = 0;
149 
150  auto ptr = &mData[offset];
151  for (auto i = 0; i < bytes; ++i)
152  {
153  if (i)
154  number <<= 8;
155  number |= *ptr++;
156  }
157  return true;
158  }
159 
160  template <int Bits, typename Tag = void>
161  bool
163  {
164  auto success = (offset + (Bits / 8)) <= mData.size();
165  if (success)
166  memcpy(data.begin(), &(mData.front()) + offset, (Bits / 8));
167  return success;
168  }
169 
170  // TODO(tom): merge with get128 and get256.
171  template <class Tag>
172  bool
173  get160(base_uint<160, Tag>& o, int offset) const
174  {
175  return getBitString<160, Tag>(o, offset);
176  }
177 
178  bool
179  getRaw(Blob&, int offset, int length) const;
180  Blob
181  getRaw(int offset, int length) const;
182 
183  bool
184  getVL(Blob& objectVL, int offset, int& length) const;
185  bool
186  getVLLength(int& length, int offset) const;
187 
188  int
189  addFieldID(int type, int name);
190  int
191  addFieldID(SerializedTypeID type, int name)
192  {
193  return addFieldID(safe_cast<int>(type), name);
194  }
195 
196  // DEPRECATED
197  uint256
198  getSHA512Half() const;
199 
200  // totality functions
201  Blob const&
202  peekData() const
203  {
204  return mData;
205  }
206  Blob
207  getData() const
208  {
209  return mData;
210  }
211  Blob&
213  {
214  return mData;
215  }
216 
217  int
219  {
220  return mData.size();
221  }
222  const void*
223  getDataPtr() const
224  {
225  return mData.data();
226  }
227  void*
229  {
230  return mData.data();
231  }
232  int
233  getLength() const
234  {
235  return mData.size();
236  }
238  getString() const
239  {
240  return std::string(static_cast<const char*>(getDataPtr()), size());
241  }
242  void
244  {
246  mData.clear();
247  }
248  void
250  {
251  mData.clear();
252  }
253  bool
254  chop(int num);
255 
256  // vector-like functions
257  Blob ::iterator
259  {
260  return mData.begin();
261  }
262  Blob ::iterator
263  end()
264  {
265  return mData.end();
266  }
267  Blob ::const_iterator
268  begin() const
269  {
270  return mData.begin();
271  }
272  Blob ::const_iterator
273  end() const
274  {
275  return mData.end();
276  }
277  void
278  reserve(size_t n)
279  {
280  mData.reserve(n);
281  }
282  void
283  resize(size_t n)
284  {
285  mData.resize(n);
286  }
287  size_t
288  capacity() const
289  {
290  return mData.capacity();
291  }
292 
293  bool
294  operator==(Blob const& v)
295  {
296  return v == mData;
297  }
298  bool
299  operator!=(Blob const& v)
300  {
301  return v != mData;
302  }
303  bool
305  {
306  return v.mData == mData;
307  }
308  bool
310  {
311  return v.mData != mData;
312  }
313 
315  getHex() const
316  {
318 
319  for (unsigned char const& element : mData)
320  {
321  h << std::setw(2) << std::hex << std::setfill('0')
322  << safe_cast<unsigned int>(element);
323  }
324  return h.str();
325  }
326 
327  static int
328  decodeLengthLength(int b1);
329  static int
330  decodeVLLength(int b1);
331  static int
332  decodeVLLength(int b1, int b2);
333  static int
334  decodeVLLength(int b1, int b2, int b3);
335 
336 private:
337  static int
338  lengthVL(int length)
339  {
340  return length + encodeLengthLength(length);
341  }
342  static int
343  encodeLengthLength(int length); // length to encode length
344  int
345  addEncoded(int length);
346 };
347 
348 template <class Iter>
349 int
350 Serializer::addVL(Iter begin, Iter end, int len)
351 {
352  int ret = addEncoded(len);
353  for (; begin != end; ++begin)
354  {
355  addRaw(begin->data(), begin->size());
356 #ifndef NDEBUG
357  len -= begin->size();
358 #endif
359  }
360  assert(len == 0);
361  return ret;
362 }
363 
364 //------------------------------------------------------------------------------
365 
366 // DEPRECATED
367 // Transitional adapter to new serialization interfaces
369 {
370 private:
371  std::uint8_t const* p_;
374 
375 public:
376  SerialIter(void const* data, std::size_t size) noexcept;
377 
378  SerialIter(Slice const& slice) : SerialIter(slice.data(), slice.size())
379  {
380  }
381 
382  // Infer the size of the data based on the size of the passed array.
383  template <int N>
384  explicit SerialIter(std::uint8_t const (&data)[N]) : SerialIter(&data[0], N)
385  {
386  static_assert(N > 0, "");
387  }
388 
390  empty() const noexcept
391  {
392  return remain_ == 0;
393  }
394 
395  void
396  reset() noexcept;
397 
398  int
399  getBytesLeft() const noexcept
400  {
401  return static_cast<int>(remain_);
402  }
403 
404  // get functions throw on error
405  unsigned char
406  get8();
407 
409  get16();
410 
412  get32();
413 
415  get64();
416 
417  template <int Bits, class Tag = void>
419  getBitString();
420 
421  uint128
423  {
424  return getBitString<128>();
425  }
426 
427  uint160
429  {
430  return getBitString<160>();
431  }
432 
433  uint256
435  {
436  return getBitString<256>();
437  }
438 
439  void
440  getFieldID(int& type, int& name);
441 
442  // Returns the size of the VL if the
443  // next object is a VL. Advances the iterator
444  // to the beginning of the VL.
445  int
446  getVLDataLength();
447 
448  Slice
449  getSlice(std::size_t bytes);
450 
451  // VFALCO DEPRECATED Returns a copy
452  Blob
453  getRaw(int size);
454 
455  // VFALCO DEPRECATED Returns a copy
456  Blob
457  getVL();
458 
459  void
460  skip(int num);
461 
462  Buffer
463  getVLBuffer();
464 
465  template <class T>
466  T
467  getRawHelper(int size);
468 };
469 
470 template <int Bits, class Tag>
471 base_uint<Bits, Tag>
473 {
475  auto const n = Bits / 8;
476  if (remain_ < n)
477  Throw<std::runtime_error>("invalid SerialIter getBitString");
478  std::memcpy(u.begin(), p_, n);
479  p_ += n;
480  used_ += n;
481  remain_ -= n;
482  return u;
483 }
484 
485 } // namespace ripple
486 
487 #endif
sstream
std::vector::resize
T resize(T... args)
ripple::Serializer::end
Blob ::iterator end()
Definition: Serializer.h:263
ripple::Serializer::chop
bool chop(int num)
Definition: Serializer.cpp:213
ripple::Serializer::add8
int add8(unsigned char byte)
Definition: Serializer.cpp:195
ripple::SerialIter::SerialIter
SerialIter(Slice const &slice)
Definition: Serializer.h:378
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:278
ripple::Serializer::addFieldID
int addFieldID(int type, int name)
Definition: Serializer.cpp:161
ripple::Serializer::addInteger
int addInteger(Integer)
ripple::Serializer::modData
Blob & modData()
Definition: Serializer.h:212
ripple::Serializer::getVLLength
bool getVLLength(int &length, int offset) const
Definition: Serializer.cpp:329
ripple::Slice
An immutable linear range of bytes.
Definition: Slice.h:43
ripple::Serializer::erase
void erase()
Definition: Serializer.h:249
ripple::Serializer::getVL
bool getVL(Blob &objectVL, int offset, int &length) const
Definition: Serializer.cpp:282
std::vector::reserve
T reserve(T... args)
ripple::Serializer::getHex
std::string getHex() const
Definition: Serializer.h:315
ripple::Serializer::operator==
bool operator==(Blob const &v)
Definition: Serializer.h:294
std::vector< unsigned char >
std::vector::size
T size(T... args)
ripple::Serializer::getString
std::string getString() const
Definition: Serializer.h:238
ripple::base_uint::end
iterator end()
Definition: base_uint.h:119
ripple::SerializedTypeID
SerializedTypeID
Definition: SField.h:52
std::stringstream
STL class.
ripple::Serializer::getDataPtr
void * getDataPtr()
Definition: Serializer.h:228
ripple::SerialIter::getFieldID
void getFieldID(int &type, int &name)
Definition: Serializer.cpp:558
ripple::Serializer::decodeVLLength
static int decodeVLLength(int b1)
Definition: Serializer.cpp:445
ripple::Serializer::add32
int add32(std::uint32_t)
Definition: Serializer.cpp:49
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:245
ripple::Serializer::Serializer
Serializer(int n=256)
Definition: Serializer.h:50
ripple::Serializer::decodeLengthLength
static int decodeLengthLength(int b1)
Definition: Serializer.cpp:426
std::vector::front
T front(T... args)
ripple::Serializer::add16
int add16(std::uint16_t)
Definition: Serializer.cpp:40
ripple::Serializer::begin
Blob ::iterator begin()
Definition: Serializer.h:258
std::vector::clear
T clear(T... args)
ripple::Serializer::get256
bool get256(uint256 &, int offset) const
Definition: Serializer.cpp:151
ripple::SerialIter::SerialIter
SerialIter(void const *data, std::size_t size) noexcept
Definition: Serializer.cpp:482
ripple::Serializer::data
void const * data() const noexcept
Definition: Serializer.h:79
ripple::Serializer::getInteger
bool getInteger(Integer &number, int offset)
Definition: Serializer.h:143
std::hex
T hex(T... args)
ripple::Serializer::getDataLength
int getDataLength() const
Definition: Serializer.h:218
ripple::base_uint
Definition: base_uint.h:63
std::vector::capacity
T capacity(T... args)
ripple::Serializer::operator!=
bool operator!=(Blob const &v)
Definition: Serializer.h:299
ripple::SerialIter::get8
unsigned char get8()
Definition: Serializer.cpp:506
ripple::HashPrefix
HashPrefix
Prefix for hashing functions.
Definition: HashPrefix.h:54
ripple::SerialIter::get256
uint256 get256()
Definition: Serializer.h:434
ripple::SerialIter::get64
std::uint64_t get64()
Definition: Serializer.cpp:543
ripple::Serializer::operator!=
bool operator!=(const Serializer &v)
Definition: Serializer.h:309
ripple::Serializer::getRaw
bool getRaw(Blob &, int offset, int length) const
Definition: Serializer.cpp:223
ripple::Serializer::lengthVL
static int lengthVL(int length)
Definition: Serializer.h:338
ripple::Serializer::getDataPtr
const void * getDataPtr() const
Definition: Serializer.h:223
ripple::SerialIter::empty
std::size_t empty() const noexcept
Definition: Serializer.h:390
ripple::SerialIter::get160
uint160 get160()
Definition: Serializer.h:428
ripple::Serializer::resize
void resize(size_t n)
Definition: Serializer.h:283
ripple::Serializer::addRaw
int addRaw(Blob const &vector)
Definition: Serializer.cpp:127
ripple::Serializer::get8
bool get8(int &, int offset) const
Definition: Serializer.cpp:203
ripple::Serializer::slice
Slice slice() const noexcept
Definition: Serializer.h:67
cstdint
ripple::Serializer::add128
int add128(const uint128 &)
Definition: Serializer.cpp:111
beast::secure_erase
void secure_erase(void *dest, std::size_t bytes)
Guaranteed to fill memory with zeroes.
Definition: secure_erase.h:81
ripple::SerialIter
Definition: Serializer.h:368
ripple::Serializer::addEncoded
int addEncoded(int length)
Definition: Serializer.cpp:375
ripple::SerialIter::getVL
Blob getVL()
Definition: Serializer.cpp:652
std::uint16_t
ripple::SerialIter::skip
void skip(int num)
Definition: Serializer.cpp:496
ripple::SerialIter::used_
std::size_t used_
Definition: Serializer.h:373
ripple::Serializer::capacity
size_t capacity() const
Definition: Serializer.h:288
ripple::Serializer::end
Blob ::const_iterator end() const
Definition: Serializer.h:273
ripple::SerialIter::remain_
std::size_t remain_
Definition: Serializer.h:372
ripple::Serializer::get160
bool get160(base_uint< 160, Tag > &o, int offset) const
Definition: Serializer.h:173
ripple::Serializer
Definition: Serializer.h:43
ripple::SerialIter::getRaw
Blob getRaw(int size)
Definition: Serializer.cpp:608
ripple::SerialIter::getBitString
base_uint< Bits, Tag > getBitString()
Definition: Serializer.h:472
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:101
ripple::Serializer::getBitString
bool getBitString(base_uint< Bits, Tag > &data, int offset) const
Definition: Serializer.h:162
ripple::Serializer::addZeros
int addZeros(size_t uBytes)
Definition: Serializer.cpp:29
ripple::SerialIter::getBytesLeft
int getBytesLeft() const noexcept
Definition: Serializer.h:399
ripple::Serializer::size
std::size_t size() const noexcept
Definition: Serializer.h:73
ripple::base_uint::begin
iterator begin()
Definition: base_uint.h:114
ripple::Serializer::secureErase
void secureErase()
Definition: Serializer.h:243
iomanip
ripple::SerialIter::get128
uint128 get128()
Definition: Serializer.h:422
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:202
ripple::SerialIter::getVLDataLength
int getVLDataLength()
Definition: Serializer.cpp:614
ripple::SerialIter::getRawHelper
T getRawHelper(int size)
Definition: Serializer.cpp:586
ripple::Serializer::add64
int add64(std::uint64_t)
Definition: Serializer.cpp:71
ripple::SerialIter::p_
std::uint8_t const * p_
Definition: Serializer.h:371
ripple::Serializer::Serializer
Serializer(void const *data, std::size_t size)
Definition: Serializer.h:55
ripple::Serializer::addVL
int addVL(Blob const &vector)
Definition: Serializer.cpp:251
ripple::Serializer::begin
Blob ::const_iterator begin() const
Definition: Serializer.h:268
std::stringstream::str
T str(T... args)
std::size_t
ripple::Serializer::add160
int add160(base_uint< 160, Tag > const &i)
Definition: Serializer.h:111
std::memcpy
T memcpy(T... args)
ripple::Serializer::getData
Blob getData() const
Definition: Serializer.h:207
std::vector::end
T end(T... args)
std::setw
T setw(T... args)
ripple::Serializer::getLength
int getLength() const
Definition: Serializer.h:233
ripple::SerialIter::get32
std::uint32_t get32()
Definition: Serializer.cpp:530
ripple::Serializer::encodeLengthLength
static int encodeLengthLength(int length)
Definition: Serializer.cpp:407
ripple::SerialIter::reset
void reset() noexcept
Definition: Serializer.cpp:488
ripple::SerialIter::getVLBuffer
Buffer getVLBuffer()
Definition: Serializer.cpp:658
ripple::Serializer::addFieldID
int addFieldID(SerializedTypeID type, int name)
Definition: Serializer.h:191
std::vector::data
T data(T... args)
type_traits
ripple::Serializer::operator==
bool operator==(const Serializer &v)
Definition: Serializer.h:304
ripple::SerialIter::getSlice
Slice getSlice(std::size_t bytes)
Definition: Serializer.cpp:639
ripple::SerialIter::get16
std::uint16_t get16()
Definition: Serializer.cpp:518
ripple::SerialIter::SerialIter
SerialIter(std::uint8_t const (&data)[N])
Definition: Serializer.h:384
ripple::Serializer::add256
int add256(uint256 const &)
Definition: Serializer.cpp:119