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 * RSA_asymmetric.h - CSPContext for RSA asymmetric encryption
21 */
22
23#ifndef _RSA_ASYMMETRIC_H_
24#define _RSA_ASYMMETRIC_H_
25
26#include <security_cdsa_plugin/CSPsession.h>
27#include <AppleCSP.h>
28#include <AppleCSPContext.h>
29#include <AppleCSPSession.h>
30#include <BlockCryptor.h>
31#include <openssl/rsa.h>
32
33#define RSA_ASYM_PADDING_DEFAULT		RSA_PKCS1_PADDING
34
35class RSA_CryptContext : public BlockCryptor {
36public:
37	RSA_CryptContext(AppleCSPSession &session) :
38		BlockCryptor(session),
39		mRsaKey(NULL),
40		mAllocdRsaKey(false),
41		mInitFlag(false),
42		mPadding(RSA_ASYM_PADDING_DEFAULT),
43		mOaep(false),
44		mLabel(Allocator::standard()) 	{ }
45
46	~RSA_CryptContext();
47
48	/* called by CSPFullPluginSession */
49	void init(const Context &context, bool encoding = 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
65	size_t outputSize(
66		bool 			final,				// ignored
67		size_t 			inSize = 0); 		// output for given input size
68
69private:
70		RSA				*mRsaKey;
71		bool			mAllocdRsaKey;
72		bool			mInitFlag;			// allows easy reuse
73		int				mPadding;			// RSA_NO_PADDING, RSA_PKCS1_PADDING,
74											//    RSA_SSLV23_PADDING
75
76		/*
77		 * optional fields for OEAP keys
78		 * (mKeyHeader.AlgorithmId == CSSM_ALGMODE_PKCS1_EME_OAEP)
79		 */
80		bool					mOaep;
81		CssmAutoData			mLabel;
82
83};	/* RSA_CryptContext */
84
85
86#endif // _RSA_ASYMMETRIC_H_
87