blob: 89d4f3717cee03bfd58ac9498a489d601021a705 [file] [log] [blame]
Shawn Willden0a4df7e2014-08-28 16:09:05 -06001/*
2 * Copyright 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef SYSTEM_KEYMASTER_RSA_OPERATION_H_
18#define SYSTEM_KEYMASTER_RSA_OPERATION_H_
19
20#include <UniquePtr.h>
21
Shawn Willden63ac0432014-12-29 14:07:08 -070022#include <openssl/evp.h>
23#include <openssl/rsa.h>
24
Shawn Willden0a4df7e2014-08-28 16:09:05 -060025#include "operation.h"
26
27namespace keymaster {
28
Shawn Willden61902362014-12-18 10:33:24 -070029/**
30 * Base class for all RSA operations.
31 *
32 * This class provides RSA key management, plus buffering of data for non-digesting modes.
33 */
Shawn Willden0a4df7e2014-08-28 16:09:05 -060034class RsaOperation : public Operation {
35 public:
Shawn Willden0afa3c82015-06-22 10:39:21 -060036 RsaOperation(keymaster_purpose_t purpose, keymaster_digest_t digest,
37 keymaster_padding_t padding, EVP_PKEY* key)
38 : Operation(purpose), rsa_key_(key), padding_(padding), digest_(digest),
39 digest_algorithm_(nullptr) {}
Shawn Willden0a4df7e2014-08-28 16:09:05 -060040 ~RsaOperation();
41
Shawn Willden06298102015-05-25 23:12:48 -060042 keymaster_error_t Begin(const AuthorizationSet& /* input_params */,
43 AuthorizationSet* /* output_params */) override {
Shawn Willden111edb32015-02-05 22:44:24 -070044 return KM_ERROR_OK;
45 }
Shawn Willden06298102015-05-25 23:12:48 -060046 keymaster_error_t Update(const AuthorizationSet& additional_params, const Buffer& input,
Shawn Willdended8e7d2015-06-01 15:29:12 -060047 AuthorizationSet* output_params, Buffer* output,
48 size_t* input_consumed) override;
Shawn Willden06298102015-05-25 23:12:48 -060049 keymaster_error_t Abort() override { return KM_ERROR_OK; }
Shawn Willden0a4df7e2014-08-28 16:09:05 -060050
Shawn Willden0afa3c82015-06-22 10:39:21 -060051 keymaster_padding_t padding() const { return padding_; }
52 keymaster_digest_t digest() const { return digest_; }
53
Shawn Willden0a4df7e2014-08-28 16:09:05 -060054 protected:
Shawn Willden2bf4ad32015-06-01 07:33:51 -060055 virtual int GetOpensslPadding(keymaster_error_t* error) = 0;
Shawn Willden0afa3c82015-06-22 10:39:21 -060056 virtual bool require_digest() const = 0;
Shawn Willden0a4df7e2014-08-28 16:09:05 -060057
Shawn Willden2bf4ad32015-06-01 07:33:51 -060058 keymaster_error_t StoreData(const Buffer& input, size_t* input_consumed);
59 keymaster_error_t SetRsaPaddingInEvpContext(EVP_PKEY_CTX* pkey_ctx);
Shawn Willden0afa3c82015-06-22 10:39:21 -060060 keymaster_error_t InitDigest();
Shawn Willden2bf4ad32015-06-01 07:33:51 -060061
62 EVP_PKEY* rsa_key_;
Shawn Willden0a4df7e2014-08-28 16:09:05 -060063 keymaster_padding_t padding_;
64 Buffer data_;
Shawn Willden0afa3c82015-06-22 10:39:21 -060065 const keymaster_digest_t digest_;
66 const EVP_MD* digest_algorithm_;
Shawn Willden0a4df7e2014-08-28 16:09:05 -060067};
68
Shawn Willden61902362014-12-18 10:33:24 -070069/**
Shawn Willden2bf4ad32015-06-01 07:33:51 -060070 * Base class for all digesting RSA operations.
Shawn Willden61902362014-12-18 10:33:24 -070071 *
72 * This class adds digesting support, for digesting modes. For non-digesting modes, it falls back
73 * on the RsaOperation input buffering.
74 */
75class RsaDigestingOperation : public RsaOperation {
76 public:
77 RsaDigestingOperation(keymaster_purpose_t purpose, keymaster_digest_t digest,
Shawn Willden2bf4ad32015-06-01 07:33:51 -060078 keymaster_padding_t padding, EVP_PKEY* key);
Shawn Willden61902362014-12-18 10:33:24 -070079 ~RsaDigestingOperation();
80
Shawn Willden61902362014-12-18 10:33:24 -070081 protected:
Shawn Willden2bf4ad32015-06-01 07:33:51 -060082 int GetOpensslPadding(keymaster_error_t* error) override;
Shawn Willden0afa3c82015-06-22 10:39:21 -060083 bool require_digest() const override { return padding_ == KM_PAD_RSA_PSS; }
Shawn Willden61902362014-12-18 10:33:24 -070084 EVP_MD_CTX digest_ctx_;
85};
86
87/**
88 * RSA private key signing operation.
89 */
90class RsaSignOperation : public RsaDigestingOperation {
Shawn Willden0a4df7e2014-08-28 16:09:05 -060091 public:
Shawn Willden2bf4ad32015-06-01 07:33:51 -060092 RsaSignOperation(keymaster_digest_t digest, keymaster_padding_t padding, EVP_PKEY* key)
Shawn Willden61902362014-12-18 10:33:24 -070093 : RsaDigestingOperation(KM_PURPOSE_SIGN, digest, padding, key) {}
Shawn Willden2bf4ad32015-06-01 07:33:51 -060094
95 keymaster_error_t Begin(const AuthorizationSet& input_params,
96 AuthorizationSet* output_params) override;
97 keymaster_error_t Update(const AuthorizationSet& additional_params, const Buffer& input,
Shawn Willdended8e7d2015-06-01 15:29:12 -060098 AuthorizationSet* output_params, Buffer* output,
99 size_t* input_consumed) override;
Shawn Willden06298102015-05-25 23:12:48 -0600100 keymaster_error_t Finish(const AuthorizationSet& additional_params, const Buffer& signature,
Shawn Willdended8e7d2015-06-01 15:29:12 -0600101 AuthorizationSet* output_params, Buffer* output) override;
Shawn Willden4200f212014-12-02 07:01:21 -0700102
103 private:
Shawn Willdenf90f2352014-12-18 23:01:15 -0700104 keymaster_error_t SignUndigested(Buffer* output);
105 keymaster_error_t SignDigested(Buffer* output);
Shawn Willden0a4df7e2014-08-28 16:09:05 -0600106};
107
Shawn Willden61902362014-12-18 10:33:24 -0700108/**
109 * RSA public key verification operation.
110 */
111class RsaVerifyOperation : public RsaDigestingOperation {
Shawn Willden0a4df7e2014-08-28 16:09:05 -0600112 public:
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600113 RsaVerifyOperation(keymaster_digest_t digest, keymaster_padding_t padding, EVP_PKEY* key)
Shawn Willden61902362014-12-18 10:33:24 -0700114 : RsaDigestingOperation(KM_PURPOSE_VERIFY, digest, padding, key) {}
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600115
116 keymaster_error_t Begin(const AuthorizationSet& input_params,
117 AuthorizationSet* output_params) override;
118 keymaster_error_t Update(const AuthorizationSet& additional_params, const Buffer& input,
Shawn Willdended8e7d2015-06-01 15:29:12 -0600119 AuthorizationSet* output_params, Buffer* output,
120 size_t* input_consumed) override;
Shawn Willden06298102015-05-25 23:12:48 -0600121 keymaster_error_t Finish(const AuthorizationSet& additional_params, const Buffer& signature,
Shawn Willdended8e7d2015-06-01 15:29:12 -0600122 AuthorizationSet* output_params, Buffer* output) override;
Shawn Willden4200f212014-12-02 07:01:21 -0700123
124 private:
Shawn Willdenf90f2352014-12-18 23:01:15 -0700125 keymaster_error_t VerifyUndigested(const Buffer& signature);
126 keymaster_error_t VerifyDigested(const Buffer& signature);
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600127};
128
129/**
130 * Base class for RSA crypting operations.
131 */
132class RsaCryptOperation : public RsaOperation {
133 public:
Shawn Willden0afa3c82015-06-22 10:39:21 -0600134 RsaCryptOperation(keymaster_purpose_t, keymaster_digest_t digest, keymaster_padding_t padding,
135 EVP_PKEY* key)
136 : RsaOperation(KM_PURPOSE_ENCRYPT, digest, padding, key) {}
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600137
138 private:
139 int GetOpensslPadding(keymaster_error_t* error) override;
Shawn Willden0afa3c82015-06-22 10:39:21 -0600140 bool require_digest() const override { return padding_ == KM_PAD_RSA_OAEP; }
Shawn Willden4200f212014-12-02 07:01:21 -0700141};
142
Shawn Willden61902362014-12-18 10:33:24 -0700143/**
144 * RSA public key encryption operation.
145 */
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600146class RsaEncryptOperation : public RsaCryptOperation {
Shawn Willden4200f212014-12-02 07:01:21 -0700147 public:
Shawn Willden0afa3c82015-06-22 10:39:21 -0600148 RsaEncryptOperation(keymaster_digest_t digest, keymaster_padding_t padding, EVP_PKEY* key)
149 : RsaCryptOperation(KM_PURPOSE_ENCRYPT, digest, padding, key) {}
Shawn Willden06298102015-05-25 23:12:48 -0600150 keymaster_error_t Finish(const AuthorizationSet& additional_params, const Buffer& signature,
Shawn Willdended8e7d2015-06-01 15:29:12 -0600151 AuthorizationSet* output_params, Buffer* output) override;
Shawn Willden4200f212014-12-02 07:01:21 -0700152};
153
Shawn Willden61902362014-12-18 10:33:24 -0700154/**
155 * RSA private key decryption operation.
156 */
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600157class RsaDecryptOperation : public RsaCryptOperation {
Shawn Willden4200f212014-12-02 07:01:21 -0700158 public:
Shawn Willden0afa3c82015-06-22 10:39:21 -0600159 RsaDecryptOperation(keymaster_digest_t digest, keymaster_padding_t padding, EVP_PKEY* key)
160 : RsaCryptOperation(KM_PURPOSE_DECRYPT, digest, padding, key) {}
Shawn Willden06298102015-05-25 23:12:48 -0600161 keymaster_error_t Finish(const AuthorizationSet& additional_params, const Buffer& signature,
Shawn Willdended8e7d2015-06-01 15:29:12 -0600162 AuthorizationSet* output_params, Buffer* output) override;
Shawn Willden06298102015-05-25 23:12:48 -0600163};
164
165/**
166 * Abstract base for all RSA operation factories. This class exists mainly to centralize some code
167 * common to all RSA operation factories.
168 */
169class RsaOperationFactory : public OperationFactory {
170 public:
171 KeyType registry_key() const override { return KeyType(KM_ALGORITHM_RSA, purpose()); }
172 virtual keymaster_purpose_t purpose() const = 0;
173
Shawn Willden0afa3c82015-06-22 10:39:21 -0600174 Operation* CreateOperation(const Key& key, const AuthorizationSet& begin_params,
175 keymaster_error_t* error) override {
176 return CreateRsaOperation(key, begin_params, error);
177 }
178 const keymaster_digest_t* SupportedDigests(size_t* digest_count) const override;
179
Shawn Willden06298102015-05-25 23:12:48 -0600180 protected:
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600181 static EVP_PKEY* GetRsaKey(const Key& key, keymaster_error_t* error);
Shawn Willden0afa3c82015-06-22 10:39:21 -0600182 virtual RsaOperation* CreateRsaOperation(const Key& key, const AuthorizationSet& begin_params,
183 keymaster_error_t* error);
184
185 private:
186 virtual RsaOperation* InstantiateOperation(keymaster_digest_t digest,
187 keymaster_padding_t padding, EVP_PKEY* key) = 0;
Shawn Willden06298102015-05-25 23:12:48 -0600188};
189
190/**
191 * Abstract base for RSA operations that digest their input (signing and verification). This class
192 * does most of the work of creation of RSA digesting operations, delegating only the actual
193 * operation instantiation.
194 */
195class RsaDigestingOperationFactory : public RsaOperationFactory {
196 public:
Shawn Willden06298102015-05-25 23:12:48 -0600197 const keymaster_padding_t* SupportedPaddingModes(size_t* padding_mode_count) const override;
Shawn Willden06298102015-05-25 23:12:48 -0600198};
199
200/**
201 * Abstract base for en/de-crypting RSA operation factories. This class does most of the work of
202 * creating such operations, delegating only the actual operation instantiation.
203 */
204class RsaCryptingOperationFactory : public RsaOperationFactory {
205 public:
Shawn Willden0afa3c82015-06-22 10:39:21 -0600206 RsaOperation* CreateRsaOperation(const Key& key, const AuthorizationSet& begin_params,
207 keymaster_error_t* error) override;
Shawn Willden06298102015-05-25 23:12:48 -0600208 const keymaster_padding_t* SupportedPaddingModes(size_t* padding_mode_count) const override;
Shawn Willden06298102015-05-25 23:12:48 -0600209};
210
211/**
212 * Concrete factory for RSA signing operations.
213 */
214class RsaSigningOperationFactory : public RsaDigestingOperationFactory {
215 public:
216 keymaster_purpose_t purpose() const override { return KM_PURPOSE_SIGN; }
Shawn Willden0afa3c82015-06-22 10:39:21 -0600217 RsaOperation* InstantiateOperation(keymaster_digest_t digest, keymaster_padding_t padding,
218 EVP_PKEY* key) override {
Shawn Willden0f906ec2015-06-20 09:16:30 -0600219 return new (std::nothrow) RsaSignOperation(digest, padding, key);
Shawn Willden06298102015-05-25 23:12:48 -0600220 }
221};
222
223/**
224 * Concrete factory for RSA signing operations.
225 */
226class RsaVerificationOperationFactory : public RsaDigestingOperationFactory {
227 keymaster_purpose_t purpose() const override { return KM_PURPOSE_VERIFY; }
Shawn Willden0afa3c82015-06-22 10:39:21 -0600228 RsaOperation* InstantiateOperation(keymaster_digest_t digest, keymaster_padding_t padding,
229 EVP_PKEY* key) override {
Shawn Willden0f906ec2015-06-20 09:16:30 -0600230 return new (std::nothrow) RsaVerifyOperation(digest, padding, key);
Shawn Willden06298102015-05-25 23:12:48 -0600231 }
232};
233
234/**
235 * Concrete factory for RSA signing operations.
236 */
237class RsaEncryptionOperationFactory : public RsaCryptingOperationFactory {
238 keymaster_purpose_t purpose() const override { return KM_PURPOSE_ENCRYPT; }
Shawn Willden0afa3c82015-06-22 10:39:21 -0600239 RsaOperation* InstantiateOperation(keymaster_digest_t digest, keymaster_padding_t padding,
240 EVP_PKEY* key) override {
241 return new (std::nothrow) RsaEncryptOperation(digest, padding, key);
Shawn Willden06298102015-05-25 23:12:48 -0600242 }
243};
244
245/**
246 * Concrete factory for RSA signing operations.
247 */
248class RsaDecryptionOperationFactory : public RsaCryptingOperationFactory {
249 keymaster_purpose_t purpose() const override { return KM_PURPOSE_DECRYPT; }
Shawn Willden0afa3c82015-06-22 10:39:21 -0600250 RsaOperation* InstantiateOperation(keymaster_digest_t digest, keymaster_padding_t padding,
251 EVP_PKEY* key) override {
252 return new (std::nothrow) RsaDecryptOperation(digest, padding, key);
Shawn Willden06298102015-05-25 23:12:48 -0600253 }
Shawn Willden0a4df7e2014-08-28 16:09:05 -0600254};
255
256} // namespace keymaster
257
258#endif // SYSTEM_KEYMASTER_RSA_OPERATION_H_