blob: 3ad4f0d31d95f20ea55f4f76b40627906cae75f4 [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 Willden7d05d882015-07-10 14:03:14 -060042 keymaster_error_t Begin(const AuthorizationSet& input_params,
43 AuthorizationSet* output_params) override;
Shawn Willden06298102015-05-25 23:12:48 -060044 keymaster_error_t Update(const AuthorizationSet& additional_params, const Buffer& input,
Shawn Willdended8e7d2015-06-01 15:29:12 -060045 AuthorizationSet* output_params, Buffer* output,
46 size_t* input_consumed) override;
Shawn Willden06298102015-05-25 23:12:48 -060047 keymaster_error_t Abort() override { return KM_ERROR_OK; }
Shawn Willden0a4df7e2014-08-28 16:09:05 -060048
Shawn Willden0afa3c82015-06-22 10:39:21 -060049 keymaster_padding_t padding() const { return padding_; }
50 keymaster_digest_t digest() const { return digest_; }
51
Shawn Willden0a4df7e2014-08-28 16:09:05 -060052 protected:
Shawn Willden2bf4ad32015-06-01 07:33:51 -060053 virtual int GetOpensslPadding(keymaster_error_t* error) = 0;
Shawn Willden0afa3c82015-06-22 10:39:21 -060054 virtual bool require_digest() const = 0;
Shawn Willden0a4df7e2014-08-28 16:09:05 -060055
Shawn Willden2bf4ad32015-06-01 07:33:51 -060056 keymaster_error_t StoreData(const Buffer& input, size_t* input_consumed);
57 keymaster_error_t SetRsaPaddingInEvpContext(EVP_PKEY_CTX* pkey_ctx);
Shawn Willden0afa3c82015-06-22 10:39:21 -060058 keymaster_error_t InitDigest();
Shawn Willden2bf4ad32015-06-01 07:33:51 -060059
60 EVP_PKEY* rsa_key_;
Shawn Willden2612fb52015-07-27 16:58:30 -060061 const keymaster_padding_t padding_;
Shawn Willden0a4df7e2014-08-28 16:09:05 -060062 Buffer data_;
Shawn Willden0afa3c82015-06-22 10:39:21 -060063 const keymaster_digest_t digest_;
64 const EVP_MD* digest_algorithm_;
Shawn Willden0a4df7e2014-08-28 16:09:05 -060065};
66
Shawn Willden61902362014-12-18 10:33:24 -070067/**
Shawn Willden2bf4ad32015-06-01 07:33:51 -060068 * Base class for all digesting RSA operations.
Shawn Willden61902362014-12-18 10:33:24 -070069 *
70 * This class adds digesting support, for digesting modes. For non-digesting modes, it falls back
71 * on the RsaOperation input buffering.
72 */
73class RsaDigestingOperation : public RsaOperation {
74 public:
75 RsaDigestingOperation(keymaster_purpose_t purpose, keymaster_digest_t digest,
Shawn Willden2bf4ad32015-06-01 07:33:51 -060076 keymaster_padding_t padding, EVP_PKEY* key);
Shawn Willden61902362014-12-18 10:33:24 -070077 ~RsaDigestingOperation();
78
Shawn Willden61902362014-12-18 10:33:24 -070079 protected:
Shawn Willden2bf4ad32015-06-01 07:33:51 -060080 int GetOpensslPadding(keymaster_error_t* error) override;
Shawn Willden0afa3c82015-06-22 10:39:21 -060081 bool require_digest() const override { return padding_ == KM_PAD_RSA_PSS; }
Shawn Willden61902362014-12-18 10:33:24 -070082 EVP_MD_CTX digest_ctx_;
83};
84
85/**
86 * RSA private key signing operation.
87 */
88class RsaSignOperation : public RsaDigestingOperation {
Shawn Willden0a4df7e2014-08-28 16:09:05 -060089 public:
Shawn Willden2bf4ad32015-06-01 07:33:51 -060090 RsaSignOperation(keymaster_digest_t digest, keymaster_padding_t padding, EVP_PKEY* key)
Shawn Willden61902362014-12-18 10:33:24 -070091 : RsaDigestingOperation(KM_PURPOSE_SIGN, digest, padding, key) {}
Shawn Willden2bf4ad32015-06-01 07:33:51 -060092
93 keymaster_error_t Begin(const AuthorizationSet& input_params,
94 AuthorizationSet* output_params) override;
95 keymaster_error_t Update(const AuthorizationSet& additional_params, const Buffer& input,
Shawn Willdended8e7d2015-06-01 15:29:12 -060096 AuthorizationSet* output_params, Buffer* output,
97 size_t* input_consumed) override;
Shawn Willden06298102015-05-25 23:12:48 -060098 keymaster_error_t Finish(const AuthorizationSet& additional_params, const Buffer& signature,
Shawn Willdended8e7d2015-06-01 15:29:12 -060099 AuthorizationSet* output_params, Buffer* output) override;
Shawn Willden4200f212014-12-02 07:01:21 -0700100
101 private:
Shawn Willdenf90f2352014-12-18 23:01:15 -0700102 keymaster_error_t SignUndigested(Buffer* output);
103 keymaster_error_t SignDigested(Buffer* output);
Shawn Willden0a4df7e2014-08-28 16:09:05 -0600104};
105
Shawn Willden61902362014-12-18 10:33:24 -0700106/**
107 * RSA public key verification operation.
108 */
109class RsaVerifyOperation : public RsaDigestingOperation {
Shawn Willden0a4df7e2014-08-28 16:09:05 -0600110 public:
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600111 RsaVerifyOperation(keymaster_digest_t digest, keymaster_padding_t padding, EVP_PKEY* key)
Shawn Willden61902362014-12-18 10:33:24 -0700112 : RsaDigestingOperation(KM_PURPOSE_VERIFY, digest, padding, key) {}
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600113
114 keymaster_error_t Begin(const AuthorizationSet& input_params,
115 AuthorizationSet* output_params) override;
116 keymaster_error_t Update(const AuthorizationSet& additional_params, const Buffer& input,
Shawn Willdended8e7d2015-06-01 15:29:12 -0600117 AuthorizationSet* output_params, Buffer* output,
118 size_t* input_consumed) override;
Shawn Willden06298102015-05-25 23:12:48 -0600119 keymaster_error_t Finish(const AuthorizationSet& additional_params, const Buffer& signature,
Shawn Willdended8e7d2015-06-01 15:29:12 -0600120 AuthorizationSet* output_params, Buffer* output) override;
Shawn Willden4200f212014-12-02 07:01:21 -0700121
122 private:
Shawn Willdenf90f2352014-12-18 23:01:15 -0700123 keymaster_error_t VerifyUndigested(const Buffer& signature);
124 keymaster_error_t VerifyDigested(const Buffer& signature);
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600125};
126
127/**
128 * Base class for RSA crypting operations.
129 */
130class RsaCryptOperation : public RsaOperation {
131 public:
Shawn Willden2612fb52015-07-27 16:58:30 -0600132 RsaCryptOperation(keymaster_purpose_t purpose, keymaster_digest_t digest,
133 keymaster_padding_t padding, EVP_PKEY* key)
134 : RsaOperation(purpose, digest, padding, key) {}
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600135
Shawn Willden7d05d882015-07-10 14:03:14 -0600136 protected:
137 keymaster_error_t SetOaepDigestIfRequired(EVP_PKEY_CTX* pkey_ctx);
138
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600139 private:
140 int GetOpensslPadding(keymaster_error_t* error) override;
Shawn Willden0afa3c82015-06-22 10:39:21 -0600141 bool require_digest() const override { return padding_ == KM_PAD_RSA_OAEP; }
Shawn Willden4200f212014-12-02 07:01:21 -0700142};
143
Shawn Willden61902362014-12-18 10:33:24 -0700144/**
145 * RSA public key encryption operation.
146 */
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600147class RsaEncryptOperation : public RsaCryptOperation {
Shawn Willden4200f212014-12-02 07:01:21 -0700148 public:
Shawn Willden0afa3c82015-06-22 10:39:21 -0600149 RsaEncryptOperation(keymaster_digest_t digest, keymaster_padding_t padding, EVP_PKEY* key)
150 : RsaCryptOperation(KM_PURPOSE_ENCRYPT, digest, padding, key) {}
Shawn Willden06298102015-05-25 23:12:48 -0600151 keymaster_error_t Finish(const AuthorizationSet& additional_params, const Buffer& signature,
Shawn Willdended8e7d2015-06-01 15:29:12 -0600152 AuthorizationSet* output_params, Buffer* output) override;
Shawn Willden4200f212014-12-02 07:01:21 -0700153};
154
Shawn Willden61902362014-12-18 10:33:24 -0700155/**
156 * RSA private key decryption operation.
157 */
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600158class RsaDecryptOperation : public RsaCryptOperation {
Shawn Willden4200f212014-12-02 07:01:21 -0700159 public:
Shawn Willden0afa3c82015-06-22 10:39:21 -0600160 RsaDecryptOperation(keymaster_digest_t digest, keymaster_padding_t padding, EVP_PKEY* key)
161 : RsaCryptOperation(KM_PURPOSE_DECRYPT, digest, padding, key) {}
Shawn Willden06298102015-05-25 23:12:48 -0600162 keymaster_error_t Finish(const AuthorizationSet& additional_params, const Buffer& signature,
Shawn Willdended8e7d2015-06-01 15:29:12 -0600163 AuthorizationSet* output_params, Buffer* output) override;
Shawn Willden06298102015-05-25 23:12:48 -0600164};
165
166/**
167 * Abstract base for all RSA operation factories. This class exists mainly to centralize some code
168 * common to all RSA operation factories.
169 */
170class RsaOperationFactory : public OperationFactory {
171 public:
172 KeyType registry_key() const override { return KeyType(KM_ALGORITHM_RSA, purpose()); }
173 virtual keymaster_purpose_t purpose() const = 0;
174
Shawn Willden0afa3c82015-06-22 10:39:21 -0600175 Operation* CreateOperation(const Key& key, const AuthorizationSet& begin_params,
176 keymaster_error_t* error) override {
177 return CreateRsaOperation(key, begin_params, error);
178 }
179 const keymaster_digest_t* SupportedDigests(size_t* digest_count) const override;
180
Shawn Willden06298102015-05-25 23:12:48 -0600181 protected:
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600182 static EVP_PKEY* GetRsaKey(const Key& key, keymaster_error_t* error);
Shawn Willden0afa3c82015-06-22 10:39:21 -0600183 virtual RsaOperation* CreateRsaOperation(const Key& key, const AuthorizationSet& begin_params,
184 keymaster_error_t* error);
185
186 private:
187 virtual RsaOperation* InstantiateOperation(keymaster_digest_t digest,
188 keymaster_padding_t padding, EVP_PKEY* key) = 0;
Shawn Willden06298102015-05-25 23:12:48 -0600189};
190
191/**
Shawn Willden2612fb52015-07-27 16:58:30 -0600192 * Abstract base for RSA operations that digest their input (signing and verification).
Shawn Willden06298102015-05-25 23:12:48 -0600193 */
194class RsaDigestingOperationFactory : public RsaOperationFactory {
195 public:
Shawn Willden06298102015-05-25 23:12:48 -0600196 const keymaster_padding_t* SupportedPaddingModes(size_t* padding_mode_count) const override;
Shawn Willden06298102015-05-25 23:12:48 -0600197};
198
199/**
200 * Abstract base for en/de-crypting RSA operation factories. This class does most of the work of
201 * creating such operations, delegating only the actual operation instantiation.
202 */
203class RsaCryptingOperationFactory : public RsaOperationFactory {
204 public:
Shawn Willden0afa3c82015-06-22 10:39:21 -0600205 RsaOperation* CreateRsaOperation(const Key& key, const AuthorizationSet& begin_params,
206 keymaster_error_t* error) override;
Shawn Willden06298102015-05-25 23:12:48 -0600207 const keymaster_padding_t* SupportedPaddingModes(size_t* padding_mode_count) const override;
Shawn Willden06298102015-05-25 23:12:48 -0600208};
209
210/**
211 * Concrete factory for RSA signing operations.
212 */
213class RsaSigningOperationFactory : public RsaDigestingOperationFactory {
214 public:
215 keymaster_purpose_t purpose() const override { return KM_PURPOSE_SIGN; }
Shawn Willden0afa3c82015-06-22 10:39:21 -0600216 RsaOperation* InstantiateOperation(keymaster_digest_t digest, keymaster_padding_t padding,
217 EVP_PKEY* key) override {
Shawn Willden0f906ec2015-06-20 09:16:30 -0600218 return new (std::nothrow) RsaSignOperation(digest, padding, key);
Shawn Willden06298102015-05-25 23:12:48 -0600219 }
220};
221
222/**
223 * Concrete factory for RSA signing operations.
224 */
225class RsaVerificationOperationFactory : public RsaDigestingOperationFactory {
226 keymaster_purpose_t purpose() const override { return KM_PURPOSE_VERIFY; }
Shawn Willden0afa3c82015-06-22 10:39:21 -0600227 RsaOperation* InstantiateOperation(keymaster_digest_t digest, keymaster_padding_t padding,
228 EVP_PKEY* key) override {
Shawn Willden0f906ec2015-06-20 09:16:30 -0600229 return new (std::nothrow) RsaVerifyOperation(digest, padding, key);
Shawn Willden06298102015-05-25 23:12:48 -0600230 }
231};
232
233/**
234 * Concrete factory for RSA signing operations.
235 */
236class RsaEncryptionOperationFactory : public RsaCryptingOperationFactory {
237 keymaster_purpose_t purpose() const override { return KM_PURPOSE_ENCRYPT; }
Shawn Willden0afa3c82015-06-22 10:39:21 -0600238 RsaOperation* InstantiateOperation(keymaster_digest_t digest, keymaster_padding_t padding,
239 EVP_PKEY* key) override {
240 return new (std::nothrow) RsaEncryptOperation(digest, padding, key);
Shawn Willden06298102015-05-25 23:12:48 -0600241 }
242};
243
244/**
245 * Concrete factory for RSA signing operations.
246 */
247class RsaDecryptionOperationFactory : public RsaCryptingOperationFactory {
248 keymaster_purpose_t purpose() const override { return KM_PURPOSE_DECRYPT; }
Shawn Willden0afa3c82015-06-22 10:39:21 -0600249 RsaOperation* InstantiateOperation(keymaster_digest_t digest, keymaster_padding_t padding,
250 EVP_PKEY* key) override {
251 return new (std::nothrow) RsaDecryptOperation(digest, padding, key);
Shawn Willden06298102015-05-25 23:12:48 -0600252 }
Shawn Willden0a4df7e2014-08-28 16:09:05 -0600253};
254
255} // namespace keymaster
256
257#endif // SYSTEM_KEYMASTER_RSA_OPERATION_H_