1/*
2 * Copyright (c) 2000-2001,2011,2013-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// gladmanContext.h - Gladman AES context class
21//
22#ifndef _H_GLADMAN_CONTEXT
23#define _H_GLADMAN_CONTEXT
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 <CommonCrypto/CommonCryptor.h>
31#include <CommonCrypto/CommonCryptorSPI.h>
32#include "aesCommon.h"
33
34#define GLADMAN_BLOCK_SIZE_BYTES	DEFAULT_AES_BLOCK_BYTES
35
36/* Symmetric encryption context */
37class GAESContext : public BlockCryptor {
38public:
39	GAESContext(AppleCSPSession &session);
40	virtual ~GAESContext();
41
42	// called by CSPFullPluginSession
43	void init(const Context &context, bool encoding = true);
44
45	// As an optimization, we allow reuse of a modified context. The main thing
46	// we avoid is a redundant key scheduling. We save the current raw keys bits
47	// in mRawKey and compare on re-init.
48	bool changed(const Context &context)	 { return true; }
49
50	// called by BlockCryptor
51	void encryptBlock(
52		const void		*plainText,			// length implied (one block)
53		size_t			plainTextLen,
54		void			*cipherText,
55		size_t			&cipherTextLen,		// in/out, throws on overflow
56		bool			final);
57	void decryptBlock(
58		const void		*cipherText,		// length implied (one cipher block)
59		size_t			cipherTextLen,
60		void			*plainText,
61		size_t			&plainTextLen,		// in/out, throws on overflow
62		bool			final);
63
64private:
65	void deleteKey();
66
67	/* scheduled key */
68    CCCryptorRef	mAesKey;
69	bool				mInitFlag;			// for easy reuse
70
71	/*
72	 * Raw key bits saved here and checked on re-init to avoid extra key
73	 * schedule on re-init. We also have to do a new key schedule if
74	 * changing between encrypting and decrypting since the key schedules
75	 * differ for the two.
76	 */
77	uint8				mRawKey[MAX_AES_KEY_BITS / 8];
78	uint32				mRawKeySize;
79	bool				mWasEncrypting;
80};	/* AESContext */
81
82#endif //_H_GLADMAN_CONTEXT
83