Kinetis Bootloader Host  2.0.0
Host Tools for Kinetis devices
apps/elftosb/common/AESCounter.h
1 /*
2  * File: AESCounter.h
3  *
4  * Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
5  * See included license file for license details.
6  */
7 #if !defined(_AESCounter_h_)
8 #define _AESCounter_h_
9 
10 #include <string.h>
11 #include <iostream>
12 #include "Random.h"
13 
15 typedef uint8_t aes128_counter_t[16];
16 
24 {
25 public:
27  void _readFromStream(std::istream &stream, unsigned bytes, uint8_t *buffer);
28 
30  void _writeToStream(std::ostream &stream, unsigned bytes, const uint8_t *buffer) const;
31 };
32 
49 template <int S>
50 class AESCounter : public AESCounterBase
51 {
52 public:
54  typedef uint8_t counter_t[S / 8];
55 
56 public:
60  AESCounter() { memset(m_counter, 0, sizeof(m_counter)); }
62  AESCounter(const counter_t &counter) { memcpy(m_counter, &counter, sizeof(m_counter)); }
63  // \brief Constructor taking a counter value pointer.
64  AESCounter(const counter_t *counter) { memcpy(m_counter, counter, sizeof(m_counter)); }
66  AESCounter(std::istream &stream) { readFromStream(stream); }
68  AESCounter(const AESCounter<S> &other) { memcpy(m_counter, other.m_counter, sizeof(m_counter)); }
72  ~AESCounter() { memset(m_counter, 0, sizeof(m_counter)); }
74  void randomize()
75  {
77  rng.generateBlock(m_counter, sizeof(m_counter));
78  }
79 
81  void readFromStream(std::istream &stream)
82  {
83  _readFromStream(stream, S / 8, reinterpret_cast<uint8_t *>(&m_counter));
84  }
85 
87  void writeToStream(std::ostream &stream) const
88  {
89  _writeToStream(stream, S / 8, reinterpret_cast<const uint8_t *>(&m_counter));
90  }
91 
93  void incrementCounter(unsigned val)
94  {
95  for (unsigned j = 0; j < val; j++)
96  {
97  for (unsigned i = sizeof(AESCounter<S>::counter_t) - 1, carry = 1; (i >= 0) && carry; i--)
98  {
99  carry = !++m_counter[i];
100  }
101  }
102  }
103 
105 
106  inline const counter_t &getCounter() const { return m_counter; }
107  inline void getCounter(counter_t *counter) const { memcpy(counter, m_counter, sizeof(m_counter)); }
108  inline void setCounter(const counter_t &counter) { memcpy(m_counter, &counter, sizeof(m_counter)); }
109  inline void setCounter(const counter_t *counter) { memcpy(m_counter, counter, sizeof(m_counter)); }
110  inline void setCounter(const AESCounter<S> &counter) { memcpy(m_counter, counter.m_counter, sizeof(m_counter)); }
112 
114 
115  const AESCounter<S> &operator=(const AESCounter<S> &counter)
116  {
117  setCounter(counter);
118  return *this;
119  }
120  const AESCounter<S> &operator=(const counter_t &counter)
121  {
122  setCounter(counter);
123  return *this;
124  }
125  const AESCounter<S> &operator=(const counter_t *counter)
126  {
127  setCounter(counter);
128  return *this;
129  }
130 
131  operator const counter_t &() const { return m_counter; }
132  operator const counter_t *() const { return m_counter; }
133  friend std::ostream &operator<<(std::ostream &os, const AESCounter<S> &counter)
134  {
135  counter.writeToStream(os);
136  return os;
137  }
139 
140 protected:
141  counter_t m_counter;
142 };
143 
146 
147 #endif // _AESCounter_h_
Definition: apps/elftosb/common/Random.h:37
void writeToStream(std::ostream &stream) const
Writes the counter to a data stream in hex encoded format.
Definition: apps/elftosb/common/AESCounter.h:87
AESCounter()
Default constructor.
Definition: apps/elftosb/common/AESCounter.h:60
Base class for AESCounter<S>.
Definition: apps/elftosb/common/AESCounter.h:23
Generic AES Counter class.
Definition: apps/elftosb/common/AESCounter.h:50
void incrementCounter(unsigned val)
Increments the counter by val.
Definition: apps/elftosb/common/AESCounter.h:93
AESCounter(const AESCounter< S > &other)
Copy constructor.
Definition: apps/elftosb/common/AESCounter.h:68
void _writeToStream(std::ostream &stream, unsigned bytes, const uint8_t *buffer) const
Writes hex encoded data to stream.
Definition: AESCounter.cpp:62
void _readFromStream(std::istream &stream, unsigned bytes, uint8_t *buffer)
Reads hex encoded data from stream.
Definition: AESCounter.cpp:30
AESCounter(const counter_t &counter)
Constructor taking a counter value reference.
Definition: apps/elftosb/common/AESCounter.h:62
void readFromStream(std::istream &stream)
Reads the counter from a hex encoded data stream.
Definition: apps/elftosb/common/AESCounter.h:81
void randomize()
Set to the counter to a randomly generated value.
Definition: apps/elftosb/common/AESCounter.h:74
AESCounter(std::istream &stream)
Constructor, reads counter from stream in hex format.
Definition: apps/elftosb/common/AESCounter.h:66
~AESCounter()
Destructor.
Definition: apps/elftosb/common/AESCounter.h:72
counter_t m_counter
The counter value.
Definition: apps/elftosb/common/AESCounter.h:141