1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: crypto_CcmEncryptor.h 4 5 Copyright (C)2009-2012 Nintendo Co., Ltd. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Rev: 46347 $ 14 *---------------------------------------------------------------------------*/ 15 16 #ifndef NN_CRYPTO_CRYPTO_CCMENCRYPTOR_H_ 17 #define NN_CRYPTO_CRYPTO_CCMENCRYPTOR_H_ 18 19 #include <nn/crypto/crypto_AuthenticatedEncryptor.h> 20 #include <nn/crypto/detail/crypto_CcmMode.h> 21 22 23 namespace nn { 24 namespace crypto { 25 26 27 28 /* Please see man pages for details 29 30 31 32 33 34 35 36 37 38 39 */ 40 class CcmEncryptor : public AuthenticatedEncryptor 41 { 42 private: 43 typedef detail::CcmMode ImplT; 44 45 public: 46 // 47 // 48 // 49 static const size_t BLOCK_SIZE = ImplT::BLOCK_SIZE; 50 51 // 52 // 53 // 54 static const size_t IV_SIZE = ImplT::MAX_IV_SIZE; 55 56 // 57 // 58 // 59 static const size_t UNIT_SIZE = ImplT::UNIT_SIZE; 60 61 // 62 // 63 // 64 static const size_t MAC_SIZE = ImplT::MAX_MAC_SIZE; 65 66 public: CcmEncryptor()67 CcmEncryptor(){} ~CcmEncryptor()68 virtual ~CcmEncryptor(){} 69 70 /* Please see man pages for details 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 */ Initialize(const BlockCipher & c,const void * pIv,size_t ivSize,size_t adataSize,size_t pdataSize,size_t macSize)95 void Initialize(const BlockCipher& c, const void* pIv, size_t ivSize, 96 size_t adataSize, size_t pdataSize, size_t macSize) 97 { return m_Impl.Initialize(c, pIv, ivSize, adataSize, pdataSize, macSize); } 98 99 /* Please see man pages for details 100 101 102 103 */ Finalize()104 virtual void Finalize() 105 { return m_Impl.Finalize(); } 106 107 /* Please see man pages for details 108 109 110 111 112 113 */ GetIvSize()114 virtual size_t GetIvSize() const { return ImplT::GetIvSize(); } 115 116 /* Please see man pages for details 117 118 119 120 121 122 */ GetUnitSize()123 virtual size_t GetUnitSize() const { return ImplT::GetUnitSize(); } 124 125 /* Please see man pages for details 126 127 128 129 130 131 */ GetMacSize()132 virtual size_t GetMacSize() const { return ImplT::GetMacSize(); } 133 134 /* Please see man pages for details 135 136 137 138 139 140 141 */ UpdateAdata(const void * pSrc,size_t size)142 virtual void UpdateAdata(const void* pSrc, size_t size) 143 { return m_Impl.UpdateAdata(pSrc, size); } 144 145 /* Please see man pages for details 146 147 148 149 */ UpdateAdataFinal()150 virtual void UpdateAdataFinal() 151 { return m_Impl.UpdateAdataFinal(); } 152 153 /* Please see man pages for details 154 155 156 157 158 159 160 161 162 163 */ UpdatePdata(void * pDst,size_t dstSize,const void * pSrc,size_t srcSize)164 virtual size_t UpdatePdata(void* pDst, size_t dstSize, const void* pSrc, size_t srcSize) 165 { return m_Impl.UpdatePdata(pDst, dstSize, pSrc, srcSize); } 166 167 /* Please see man pages for details 168 169 170 171 172 173 174 175 */ UpdatePdataFinal(void * pDst,size_t size)176 virtual size_t UpdatePdataFinal(void* pDst, size_t size) 177 { return m_Impl.UpdatePdataFinal(pDst, size); } 178 179 /* Please see man pages for details 180 181 182 183 184 185 186 */ GenerateMac(void * pDst,size_t size)187 virtual void GenerateMac(void* pDst, size_t size) 188 { return m_Impl.GenerateMac(pDst, size); } 189 190 191 192 /* Please see man pages for details 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 */ EncryptAndGenerate(void * pMac,void * pDst,size_t dstSize,const void * pAdata,size_t adataSize,const void * pPdata,size_t pdataSize,const void * pIv,size_t ivSize,size_t macSize,const BlockCipher & c)225 static void EncryptAndGenerate( 226 void* pMac, void* pDst, size_t dstSize, const void* pAdata, size_t adataSize, 227 const void* pPdata, size_t pdataSize, const void* pIv, size_t ivSize, 228 size_t macSize, const BlockCipher& c) 229 { 230 CcmEncryptor e; 231 e.Initialize(c, pIv, ivSize, adataSize, pdataSize, macSize); 232 e.AuthenticatedEncryptor::EncryptAndGenerate( 233 pMac, pDst, dstSize, pAdata, adataSize, 234 pPdata, pdataSize, macSize); 235 e.Finalize(); 236 } 237 238 private: 239 ImplT m_Impl; 240 }; 241 242 243 244 } // namespace crypto 245 } // namespace nn 246 247 248 249 #endif /* NN_CRYPTO_CRYPTO_CCMENCRYPTOR_H_ */ 250