]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - tools/elftosb/common/AESKey.h
Unified codebase for TX28, TX48, TX51, TX53
[karo-tx-uboot.git] / tools / elftosb / common / AESKey.h
1 /*
2  * File:        AESKey.h
3  *
4  * Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
5  * See included license file for license details.
6  */
7 #if !defined(_AESKey_h_)
8 #define _AESKey_h_
9
10 #include "stdafx.h"
11 #include <string.h>
12 #include <iostream>
13 #include "Random.h"
14
15 //! An AES-128 key is 128 bits, or 16 bytes.
16 typedef uint8_t aes128_key_t[16];
17
18 /*!
19  * \brief Base class for AESKey<S>.
20  *
21  * This class implements some bigger, non-template methods used in the
22  * AESKey<S> templated subclass.
23  */
24 class AESKeyBase
25 {
26 public:
27         //! \brief Reads hex encoded data from \a stream.
28         void _readFromStream(std::istream & stream, unsigned bytes, uint8_t * buffer);
29         
30         //! \brief Writes hex encoded data to \a stream.
31         void _writeToStream(std::ostream & stream, unsigned bytes, const uint8_t * buffer);
32 };
33
34 /*!
35  * \brief Generic AES key class.
36  *
37  * The template parameter \a S is the number of bits in the key.
38  *
39  * The underlying key type can be accessed like this: AESKey<128>::key_t
40  *
41  * When a key instance is destroyed, it erases the key data by setting it
42  * to all zeroes.
43  *
44  * \todo Add a way to allow only key sizes of 128, 192, and 256 bits.
45  * \todo Find a cross platform way to prevent the key data from being written
46  *              to the VM swapfile.
47  *
48  * AESKey<128> key = AESKey<128>::readFromStream(s);
49  */
50 template <int S>
51 class AESKey : public AESKeyBase
52 {
53 public:
54         //! Type for this size of AES key.
55         typedef uint8_t key_t[S/8];
56         
57 public:
58         //! \brief Default constructor.
59         //!
60         //! Initializes the key to 0.
61         AESKey()
62         {
63                 memset(m_key, 0, sizeof(m_key));
64         }
65         
66         //! \brief Constructor taking a key value reference.
67         AESKey(const key_t & key)
68         {
69                 memcpy(m_key, &key, sizeof(m_key));
70         }
71         
72         // \brief Constructor taking a key value pointer.
73         AESKey(const key_t * key)
74         {
75                 memcpy(m_key, key, sizeof(m_key));
76         }
77         
78         //! \brief Constructor, reads key from stream in hex format.
79         AESKey(std::istream & stream)
80         {
81                 readFromStream(stream);
82         }
83         
84         //! \brief Copy constructor.
85         AESKey(const AESKey<S> & other)
86         {
87                 memcpy(m_key, other.m_key, sizeof(m_key));
88         }
89         
90         //! \brief Destructor.
91         //!
92         //! Sets the key value to zero.
93         ~AESKey()
94         {
95                 memset(m_key, 0, sizeof(m_key));
96         }
97         
98         //! \brief Set to the key to a randomly generated value.
99         void randomize()
100         {
101                 RandomNumberGenerator rng;
102                 rng.generateBlock(m_key, sizeof(m_key));
103         }
104         
105         //! \brief Reads the key from a hex encoded data stream.
106         void readFromStream(std::istream & stream)
107         {
108                 _readFromStream(stream, S/8, reinterpret_cast<uint8_t*>(&m_key));
109         }
110         
111         //! \brief Writes the key to a data stream in hex encoded format.
112         void writeToStream(std::ostream & stream)
113         {
114                 _writeToStream(stream, S/8, reinterpret_cast<uint8_t*>(&m_key));
115         }
116         
117         //! \name Key accessors
118         //@{
119         inline const key_t & getKey() const { return m_key; }
120         inline void getKey(key_t * key) const { memcpy(key, m_key, sizeof(m_key)); }
121         
122         inline void setKey(const key_t & key) { memcpy(m_key, &key, sizeof(m_key)); }
123         inline void setKey(const key_t * key) { memcpy(m_key, key, sizeof(m_key)); }
124         inline void setKey(const AESKey<S> & key) { memcpy(m_key, key.m_key, sizeof(m_key)); }
125         //@}
126         
127         //! \name Operators
128         //@{
129         const AESKey<S> & operator = (const AESKey<S> & key) { setKey(key); return *this; }
130         const AESKey<S> & operator = (const key_t & key) { setKey(key); return *this; }
131         const AESKey<S> & operator = (const key_t * key) { setKey(key); return *this; }
132         
133         operator const key_t & () const { return m_key; }
134         operator const key_t * () const { return m_key; }
135         //@}
136         
137 protected:
138         key_t m_key;    //!< The key value.
139 };
140
141 //! Standard type definition for an AES-128 key.
142 typedef AESKey<128> AES128Key;
143
144 #endif // _AESKey_h_