Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cCipherAES.h
Go to the documentation of this file.
1 //
5 //
6 
7 #ifndef _INC_cCipherAES_H
8 #define _INC_cCipherAES_H
9 #ifndef NO_PRAGMA_ONCE
10 #pragma once
11 #endif
12 #include "cCipherBase.h"
13 #include "cCipherTypeDef.h"
14 
15 namespace GrayLib
16 {
18  {
23 
24  public:
25  // Forward S-box & tables
26  BYTE m_FSb[256];
27  UINT32 m_FT0[256];
28  UINT32 m_FT1[256];
29  UINT32 m_FT2[256];
30  UINT32 m_FT3[256];
31 
32  // Reverse S-box & tables
33  BYTE m_RSb[256];
34  UINT32 m_RT0[256];
35  UINT32 m_RT1[256];
36  UINT32 m_RT2[256];
37  UINT32 m_RT3[256];
38 
39  // Round constants
40  UINT32 m_RCON[10];
41 
42  private:
43  inline static BYTE GetX(BYTE x)
44  {
45  return (BYTE)((x << 1) ^ ((x & 0x80) ? 0x1B : 0x00));
46  }
47 
48  public:
49  cCipherAESTable(void);
50  };
51 
53  {
63 
64  public:
65  static const size_t k_BlockAlign = 16; // AES data block alignment. 128 bits.
66 
67  int m_nRounds;
68  UINT32 m_RK[68];
69 
70  static const cCipherAESTable* s_T;
71 
72  public:
73  cCipherAES(bool bEncodeMode)
74  : cCipherBase(bEncodeMode)
75  , m_nRounds(0)
76  {
77  cMem::Zero(m_RK, sizeof(m_RK));
78  }
79  virtual ~cCipherAES()
80  {
81  m_nRounds = 0;
82  cMem::ZeroSecure(m_RK, sizeof(m_RK));
83  }
84 
85  virtual size_t get_BlockAlignSize() const override
86  {
89  return k_BlockAlign;
90  }
91 
92  virtual HRESULT SetCipherKey(const void* pKeyData, size_t nKeySize) override;
93 
94  virtual HRESULT CipherModeECB(BYTE* pOutput, const BYTE* pInput) override; // [k_BlockAlign]
95  virtual HRESULT CipherModeCBC(BYTE* pOutput, const BYTE* pInput, size_t nSize, BYTE* pIV) override; // [k_BlockAlign]
96  virtual HRESULT CipherModeCFB(BYTE* pOutput, const BYTE* pInput, size_t nSize, BYTE pIV[k_BlockAlign], size_t* pnIVOffset) override; // [k_BlockAlign]
97  virtual HRESULT CipherModeCTR(BYTE* pOutput, const BYTE* pInput, size_t nSize, BYTE pNonceCounter[k_BlockAlign], size_t* pNCOffset, BYTE pStreamBlock[k_BlockAlign] ) override; // [k_BlockAlign]
98 
99  virtual HRESULT Cipher(BYTE* pOutput, const BYTE* pInput, size_t nSizeBytes) override;
100 
102  };
103 
105  {
108  public:
110  {
111  }
112  virtual cCipherBase* AllocCipherAlg(bool bEncodeMode) const
113  {
114  return new cCipherAES(bEncodeMode);
115  }
116  };
117 }
118 #endif // _INC_cCipherAES_H
#define GRAYLIB_LINK
Definition: GrayLibBase.h:35
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
Definition: cCipherAES.h:18
Definition: cCipherAES.h:53
static const cCipherAESTable * s_T
static tables. constructed on demand.
Definition: cCipherAES.h:70
virtual size_t get_BlockAlignSize() const override
Definition: cCipherAES.h:85
cCipherAES(bool bEncodeMode)
Definition: cCipherAES.h:73
virtual ~cCipherAES()
Definition: cCipherAES.h:79
UNITTEST_FRIEND(cCipherAES)
int m_nRounds
number of rounds. based on key size.
Definition: cCipherAES.h:67
Definition: cCipherAES.h:105
virtual cCipherBase * AllocCipherAlg(bool bEncodeMode) const
Definition: cCipherAES.h:112
cCipherAlgAES()
Definition: cCipherAES.h:109
Definition: cCipherTypeDef.h:67
Definition: cCipherBase.h:125
Definition: cMesh.h:22
@ CipherAlgorithm_AES
Definition: cCipherBase.h:29
static void Zero(void *pData, size_t nSizeBlock) noexcept
Definition: cMem.h:100
static void ZeroSecure(void *pData, size_t nSizeBlock) noexcept
Definition: cMem.h:110