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 * castContext.h - glue between BlockCrytpor and ssleay CAST-128 (CAST5)
21 *				 implementation
22 *
23 *
24 * Here's what RFC 2144 has to say about CAST128 and CAST5 nomenclature:
25 *
26 *    In order to avoid confusion when variable keysize operation is
27 *    used, the name CAST-128 is to be considered synonymous with the
28 *    name CAST5; this allows a keysize to be appended without ambiguity.
29 *    Thus, for example, CAST-128 with a 40-bit key is to be referred to
30 *    as CAST5-40; where a 128-bit key is explicitly intended, the
31 *    name CAST5-128 should be used.
32 *
33 * This module implements a variable key length, from 40 bits to 128 bits,
34 * and can thus be said to implement both CAST-128 and CAST5.
35 */
36
37#ifndef _CAST_CONTEXT_H_
38#define _CAST_CONTEXT_H_
39
40#include "AppleCSPContext.h"
41#include "BlockCryptor.h"
42#include <CommonCrypto/CommonCryptor.h>
43#include <CommonCrypto/CommonCryptorSPI.h>
44
45class CastContext : public BlockCryptor {
46public:
47	CastContext(AppleCSPSession &session);
48	virtual ~CastContext();
49
50	// called by CSPFullPluginSession
51	void init(const Context &context, bool encoding = true);
52
53	// As an optimization, we allow reuse of a modified context.
54	// The main thing we avoid is a redundant key scheduling. We
55	// save the current raw keys bits in mRawKey and compare on
56	// re-init.
57	bool changed(const Context &context)	 { return true; }
58
59	// called by BlockCryptor
60	void encryptBlock(
61		const void		*plainText,		// length implied (one block)
62		size_t			plainTextLen,
63		void			*cipherText,
64		size_t			&cipherTextLen,	// in/out, throws on overflow
65		bool			final);
66	void decryptBlock(
67		const void		*cipherText,	// length implied (one cipher block)
68		size_t			cipherTextLen,
69		void			*plainText,
70		size_t			&plainTextLen,	// in/out, throws on overflow
71		bool			final);
72
73private:
74	void deleteKey();
75
76	/* scheduled key */
77    CCCryptorRef	mCastKey;
78
79	bool				mInitFlag;			// for easy reuse
80
81	/*
82	 * Raw key bits saved here and checked on re-init to avoid
83	 * extra key schedule
84	 */
85	uint8				mRawKey[kCCKeySizeMaxCAST];
86	uint32				mRawKeySize;
87
88
89};	/* CastContext */
90
91#endif //_CAST_CONTEXT_H_
92