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