1/* 2 * Copyright (c) 2000-2001,2011,2014 Apple Inc. All Rights Reserved. 3 * 4 * The contents of this file constitute Original Code as defined in and are 5 * subject to the Apple Public Source License Version 1.2 (the 'License'). 6 * You may not use this file except in compliance with the License. Please obtain 7 * a copy of the License at http://www.apple.com/publicsource and read it before 8 * using this file. 9 * 10 * This Original Code and all software distributed under the License are 11 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS 12 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT 13 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 14 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the 15 * specific language governing rights and limitations under the License. 16 */ 17 18 19// 20// aescspi.h - AES context class 21// 22#ifndef _H_AESCSPI 23#define _H_AESCSPI 24 25#include <security_cdsa_plugin/CSPsession.h> 26#include "AppleCSP.h" 27#include "AppleCSPContext.h" 28#include "AppleCSPSession.h" 29#include "BlockCryptor.h" 30#include "rijndaelApi.h" 31 32/* Symmetric encryption context */ 33class AESContext : public BlockCryptor { 34public: 35 AESContext(AppleCSPSession &session) : 36 BlockCryptor(session), 37 mAesKey(NULL), 38 mBlockSize(0), 39 mInitFlag(false), 40 mRawKeySize(0) { } 41 ~AESContext(); 42 43 // called by CSPFullPluginSession 44 void init(const Context &context, bool encoding = true); 45 46 // As an optimization, we allow reuse of a modified context. The main thing 47 // we avoid is a redundant key scheduling. We save the current raw keys bits 48 // in mRawKey and compare on re-init. 49 bool changed(const Context &context) { return true; } 50 51 // called by BlockCryptor 52 void encryptBlock( 53 const void *plainText, // length implied (one block) 54 size_t plainTextLen, 55 void *cipherText, 56 size_t &cipherTextLen, // in/out, throws on overflow 57 bool final); 58 void decryptBlock( 59 const void *cipherText, // length implied (one cipher block) 60 size_t cipherTextLen, 61 void *plainText, 62 size_t &plainTextLen, // in/out, throws on overflow 63 bool final); 64 65private: 66 void aesError( 67 int artn, 68 const char *errStr); 69 void deleteKey(); 70 71 keyInstance *mAesKey; // keyInstance or keyInstance128 72 unsigned mBlockSize; // in BYTES 73 bool mInitFlag; // for easy reuse 74 aesCryptFcn mEncryptFcn; 75 aesCryptFcn mDecryptFcn; 76 77 /* raw key bits saved here and checked on re-init to avoid extra key schedule */ 78 uint8 mRawKey[MAX_AES_KEY_BITS / 8]; 79 uint32 mRawKeySize; 80}; /* AESContext */ 81 82// symmetric key generation context 83class AESKeyGenContext : public AppleCSPContext, private AppleSymmKeyGenContext { 84public: 85 AESKeyGenContext( 86 AppleCSPSession &session) : 87 AppleCSPContext(session), 88 AppleSymmKeyGenContext( 89 MIN_AES_KEY_BITS, 90 MAX_AES_KEY_BITS, 91 true) { } 92 93 void init(const Context &context, bool encoding = true) { } 94 95 void generate( 96 const Context &context, 97 CssmKey &symKey, 98 CssmKey &dummyKey); 99 100}; 101 102#endif //_H_AESCSPI 103