Home | History | Annotate | Download | only in keymaster
      1 /*
      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 #include "rsa_operation.h"
     18 
     19 #include <limits.h>
     20 
     21 #include <new>
     22 
     23 #include <openssl/err.h>
     24 
     25 #include <keymaster/logger.h>
     26 
     27 #include "openssl_err.h"
     28 #include "openssl_utils.h"
     29 #include "rsa_key.h"
     30 
     31 namespace keymaster {
     32 
     33 const size_t kPssOverhead = 2;
     34 
     35 // Overhead for PKCS#1 v1.5 signature padding of undigested messages.  Digested messages have
     36 // additional overhead, for the digest algorithmIdentifier required by PKCS#1.
     37 const size_t kPkcs1UndigestedSignaturePaddingOverhead = 11;
     38 
     39 /* static */
     40 EVP_PKEY* RsaOperationFactory::GetRsaKey(const Key& key, keymaster_error_t* error) {
     41     const RsaKey* rsa_key = static_cast<const RsaKey*>(&key);
     42     assert(rsa_key);
     43     if (!rsa_key || !rsa_key->key()) {
     44         *error = KM_ERROR_UNKNOWN_ERROR;
     45         return nullptr;
     46     }
     47 
     48     UniquePtr<EVP_PKEY, EVP_PKEY_Delete> pkey(EVP_PKEY_new());
     49     if (!rsa_key->InternalToEvp(pkey.get())) {
     50         *error = KM_ERROR_UNKNOWN_ERROR;
     51         return nullptr;
     52     }
     53     return pkey.release();
     54 }
     55 
     56 static const keymaster_digest_t supported_digests[] = {
     57     KM_DIGEST_NONE,      KM_DIGEST_MD5,       KM_DIGEST_SHA1,     KM_DIGEST_SHA_2_224,
     58     KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384, KM_DIGEST_SHA_2_512};
     59 
     60 const keymaster_digest_t* RsaOperationFactory::SupportedDigests(size_t* digest_count) const {
     61     *digest_count = array_length(supported_digests);
     62     return supported_digests;
     63 }
     64 
     65 RsaOperation* RsaOperationFactory::CreateRsaOperation(const Key& key,
     66                                                       const AuthorizationSet& begin_params,
     67                                                       keymaster_error_t* error) {
     68     keymaster_padding_t padding;
     69     if (!GetAndValidatePadding(begin_params, key, &padding, error))
     70         return nullptr;
     71 
     72     bool require_digest = (purpose() == KM_PURPOSE_SIGN || purpose() == KM_PURPOSE_VERIFY ||
     73                            padding == KM_PAD_RSA_OAEP);
     74 
     75     keymaster_digest_t digest = KM_DIGEST_NONE;
     76     if (require_digest && !GetAndValidateDigest(begin_params, key, &digest, error))
     77         return nullptr;
     78 
     79     UniquePtr<EVP_PKEY, EVP_PKEY_Delete> rsa(GetRsaKey(key, error));
     80     if (!rsa.get())
     81         return nullptr;
     82 
     83     RsaOperation* op = InstantiateOperation(digest, padding, rsa.release());
     84     if (!op)
     85         *error = KM_ERROR_MEMORY_ALLOCATION_FAILED;
     86     return op;
     87 }
     88 
     89 static const keymaster_padding_t supported_sig_padding[] = {KM_PAD_NONE, KM_PAD_RSA_PKCS1_1_5_SIGN,
     90                                                             KM_PAD_RSA_PSS};
     91 const keymaster_padding_t*
     92 RsaDigestingOperationFactory::SupportedPaddingModes(size_t* padding_mode_count) const {
     93     *padding_mode_count = array_length(supported_sig_padding);
     94     return supported_sig_padding;
     95 }
     96 
     97 RsaOperation* RsaCryptingOperationFactory::CreateRsaOperation(const Key& key,
     98                                                               const AuthorizationSet& begin_params,
     99                                                               keymaster_error_t* error) {
    100     UniquePtr<RsaOperation> op(RsaOperationFactory::CreateRsaOperation(key, begin_params, error));
    101     if (op.get()) {
    102         switch (op->padding()) {
    103         case KM_PAD_NONE:
    104         case KM_PAD_RSA_PKCS1_1_5_ENCRYPT:
    105             if (op->digest() != KM_DIGEST_NONE) {
    106                 *error = KM_ERROR_INCOMPATIBLE_DIGEST;
    107                 return nullptr;
    108             }
    109             break;
    110 
    111         case KM_PAD_RSA_OAEP:
    112             if (op->digest() == KM_DIGEST_NONE) {
    113                 *error = KM_ERROR_INCOMPATIBLE_DIGEST;
    114                 return nullptr;
    115             }
    116             break;
    117 
    118         default:
    119             *error = KM_ERROR_UNSUPPORTED_PADDING_MODE;
    120             return nullptr;
    121         }
    122     }
    123     return op.release();
    124 }
    125 
    126 static const keymaster_padding_t supported_crypt_padding[] = {KM_PAD_NONE, KM_PAD_RSA_OAEP,
    127                                                               KM_PAD_RSA_PKCS1_1_5_ENCRYPT};
    128 const keymaster_padding_t*
    129 RsaCryptingOperationFactory::SupportedPaddingModes(size_t* padding_mode_count) const {
    130     *padding_mode_count = array_length(supported_crypt_padding);
    131     return supported_crypt_padding;
    132 }
    133 
    134 RsaOperation::~RsaOperation() {
    135     if (rsa_key_ != NULL)
    136         EVP_PKEY_free(rsa_key_);
    137 }
    138 
    139 keymaster_error_t RsaOperation::Begin(const AuthorizationSet& /* input_params */,
    140                                       AuthorizationSet* /* output_params */) {
    141     return InitDigest();
    142 }
    143 
    144 keymaster_error_t RsaOperation::Update(const AuthorizationSet& /* additional_params */,
    145                                        const Buffer& input, AuthorizationSet* /* output_params */,
    146                                        Buffer* /* output */, size_t* input_consumed) {
    147     assert(input_consumed);
    148     switch (purpose()) {
    149     default:
    150         return KM_ERROR_UNIMPLEMENTED;
    151     case KM_PURPOSE_SIGN:
    152     case KM_PURPOSE_VERIFY:
    153     case KM_PURPOSE_ENCRYPT:
    154     case KM_PURPOSE_DECRYPT:
    155         return StoreData(input, input_consumed);
    156     }
    157 }
    158 
    159 keymaster_error_t RsaOperation::StoreData(const Buffer& input, size_t* input_consumed) {
    160     assert(input_consumed);
    161 
    162     if (!data_.reserve(EVP_PKEY_size(rsa_key_)))
    163         return KM_ERROR_MEMORY_ALLOCATION_FAILED;
    164     // If the write fails, it's because input length exceeds key size.
    165     if (!data_.write(input.peek_read(), input.available_read())) {
    166         LOG_E("Input too long: cannot operate on %u bytes of data with %u-byte RSA key",
    167               input.available_read() + data_.available_read(), EVP_PKEY_size(rsa_key_));
    168         return KM_ERROR_INVALID_INPUT_LENGTH;
    169     }
    170 
    171     *input_consumed = input.available_read();
    172     return KM_ERROR_OK;
    173 }
    174 
    175 keymaster_error_t RsaOperation::SetRsaPaddingInEvpContext(EVP_PKEY_CTX* pkey_ctx, bool signing) {
    176     keymaster_error_t error;
    177     int openssl_padding = GetOpensslPadding(&error);
    178     if (error != KM_ERROR_OK)
    179         return error;
    180 
    181     if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, openssl_padding) <= 0)
    182         return TranslateLastOpenSslError();
    183 
    184     if (signing && openssl_padding == RSA_PKCS1_PSS_PADDING) {
    185         // Also need to set the length of the salt used in the padding generation.  We set it equal
    186         // to the length of the selected digest.
    187         assert(digest_algorithm_);
    188         if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, EVP_MD_size(digest_algorithm_)) <= 0)
    189             return TranslateLastOpenSslError();
    190     }
    191 
    192     return KM_ERROR_OK;
    193 }
    194 
    195 keymaster_error_t RsaOperation::InitDigest() {
    196     if (digest_ == KM_DIGEST_NONE) {
    197         if (require_digest())
    198             return KM_ERROR_INCOMPATIBLE_DIGEST;
    199         return KM_ERROR_OK;
    200     }
    201 
    202     switch (digest_) {
    203     case KM_DIGEST_NONE:
    204         return KM_ERROR_OK;
    205     case KM_DIGEST_MD5:
    206         digest_algorithm_ = EVP_md5();
    207         return KM_ERROR_OK;
    208     case KM_DIGEST_SHA1:
    209         digest_algorithm_ = EVP_sha1();
    210         return KM_ERROR_OK;
    211     case KM_DIGEST_SHA_2_224:
    212         digest_algorithm_ = EVP_sha224();
    213         return KM_ERROR_OK;
    214     case KM_DIGEST_SHA_2_256:
    215         digest_algorithm_ = EVP_sha256();
    216         return KM_ERROR_OK;
    217     case KM_DIGEST_SHA_2_384:
    218         digest_algorithm_ = EVP_sha384();
    219         return KM_ERROR_OK;
    220     case KM_DIGEST_SHA_2_512:
    221         digest_algorithm_ = EVP_sha512();
    222         return KM_ERROR_OK;
    223     default:
    224         return KM_ERROR_UNSUPPORTED_DIGEST;
    225     }
    226 }
    227 
    228 RsaDigestingOperation::RsaDigestingOperation(keymaster_purpose_t purpose, keymaster_digest_t digest,
    229                                              keymaster_padding_t padding, EVP_PKEY* key)
    230     : RsaOperation(purpose, digest, padding, key) {
    231     EVP_MD_CTX_init(&digest_ctx_);
    232 }
    233 RsaDigestingOperation::~RsaDigestingOperation() {
    234     EVP_MD_CTX_cleanup(&digest_ctx_);
    235 }
    236 
    237 int RsaDigestingOperation::GetOpensslPadding(keymaster_error_t* error) {
    238     *error = KM_ERROR_OK;
    239     switch (padding_) {
    240     case KM_PAD_NONE:
    241         return RSA_NO_PADDING;
    242     case KM_PAD_RSA_PKCS1_1_5_SIGN:
    243         return RSA_PKCS1_PADDING;
    244     case KM_PAD_RSA_PSS:
    245         if (digest_ == KM_DIGEST_NONE) {
    246             *error = KM_ERROR_INCOMPATIBLE_PADDING_MODE;
    247             return -1;
    248         }
    249         if (EVP_MD_size(digest_algorithm_) * 2 + kPssOverhead > (size_t)EVP_PKEY_size(rsa_key_)) {
    250             LOG_E("Input too long: %d-byte digest cannot be used with %d-byte RSA key in PSS "
    251                   "padding mode",
    252                   EVP_MD_size(digest_algorithm_), EVP_PKEY_size(rsa_key_));
    253             *error = KM_ERROR_INCOMPATIBLE_DIGEST;
    254             return -1;
    255         }
    256         return RSA_PKCS1_PSS_PADDING;
    257     default:
    258         return -1;
    259     }
    260 }
    261 
    262 keymaster_error_t RsaSignOperation::Begin(const AuthorizationSet& input_params,
    263                                           AuthorizationSet* output_params) {
    264     keymaster_error_t error = RsaDigestingOperation::Begin(input_params, output_params);
    265     if (error != KM_ERROR_OK)
    266         return error;
    267 
    268     if (digest_ == KM_DIGEST_NONE)
    269         return KM_ERROR_OK;
    270 
    271     EVP_PKEY_CTX* pkey_ctx;
    272     if (EVP_DigestSignInit(&digest_ctx_, &pkey_ctx, digest_algorithm_, nullptr /* engine */,
    273                            rsa_key_) != 1)
    274         return TranslateLastOpenSslError();
    275     return SetRsaPaddingInEvpContext(pkey_ctx, true /* signing */);
    276 }
    277 
    278 keymaster_error_t RsaSignOperation::Update(const AuthorizationSet& additional_params,
    279                                            const Buffer& input, AuthorizationSet* output_params,
    280                                            Buffer* output, size_t* input_consumed) {
    281     if (digest_ == KM_DIGEST_NONE)
    282         // Just buffer the data.
    283         return RsaOperation::Update(additional_params, input, output_params, output,
    284                                     input_consumed);
    285 
    286     if (EVP_DigestSignUpdate(&digest_ctx_, input.peek_read(), input.available_read()) != 1)
    287         return TranslateLastOpenSslError();
    288     *input_consumed = input.available_read();
    289     return KM_ERROR_OK;
    290 }
    291 
    292 keymaster_error_t RsaSignOperation::Finish(const AuthorizationSet& additional_params,
    293                                            const Buffer& input, const Buffer& /* signature */,
    294                                            AuthorizationSet* /* output_params */, Buffer* output) {
    295     assert(output);
    296 
    297     keymaster_error_t error = UpdateForFinish(additional_params, input);
    298     if (error != KM_ERROR_OK)
    299         return error;
    300 
    301     if (digest_ == KM_DIGEST_NONE)
    302         return SignUndigested(output);
    303     else
    304         return SignDigested(output);
    305 }
    306 
    307 static keymaster_error_t zero_pad_left(UniquePtr<uint8_t[]>* dest, size_t padded_len, Buffer& src) {
    308     assert(padded_len > src.available_read());
    309 
    310     dest->reset(new uint8_t[padded_len]);
    311     if (!dest->get())
    312         return KM_ERROR_MEMORY_ALLOCATION_FAILED;
    313 
    314     size_t padding_len = padded_len - src.available_read();
    315     memset(dest->get(), 0, padding_len);
    316     if (!src.read(dest->get() + padding_len, src.available_read()))
    317         return KM_ERROR_UNKNOWN_ERROR;
    318 
    319     return KM_ERROR_OK;
    320 }
    321 
    322 keymaster_error_t RsaSignOperation::SignUndigested(Buffer* output) {
    323     UniquePtr<RSA, RSA_Delete> rsa(EVP_PKEY_get1_RSA(const_cast<EVP_PKEY*>(rsa_key_)));
    324     if (!rsa.get())
    325         return TranslateLastOpenSslError();
    326 
    327     if (!output->Reinitialize(RSA_size(rsa.get())))
    328         return KM_ERROR_MEMORY_ALLOCATION_FAILED;
    329 
    330     size_t key_len = EVP_PKEY_size(rsa_key_);
    331     int bytes_encrypted;
    332     switch (padding_) {
    333     case KM_PAD_NONE: {
    334         const uint8_t* to_encrypt = data_.peek_read();
    335         UniquePtr<uint8_t[]> zero_padded;
    336         if (data_.available_read() > key_len) {
    337             return KM_ERROR_INVALID_INPUT_LENGTH;
    338         } else if (data_.available_read() < key_len) {
    339             keymaster_error_t error = zero_pad_left(&zero_padded, key_len, data_);
    340             if (error != KM_ERROR_OK)
    341                 return error;
    342             to_encrypt = zero_padded.get();
    343         }
    344         bytes_encrypted = RSA_private_encrypt(key_len, to_encrypt, output->peek_write(), rsa.get(),
    345                                               RSA_NO_PADDING);
    346         break;
    347     }
    348     case KM_PAD_RSA_PKCS1_1_5_SIGN:
    349         // Does PKCS1 padding without digesting even make sense?  Dunno.  We'll support it.
    350         if (data_.available_read() + kPkcs1UndigestedSignaturePaddingOverhead > key_len) {
    351             LOG_E("Input too long: cannot sign %u-byte message with PKCS1 padding with %u-bit key",
    352                   data_.available_read(), EVP_PKEY_size(rsa_key_) * 8);
    353             return KM_ERROR_INVALID_INPUT_LENGTH;
    354         }
    355         bytes_encrypted = RSA_private_encrypt(data_.available_read(), data_.peek_read(),
    356                                               output->peek_write(), rsa.get(), RSA_PKCS1_PADDING);
    357         break;
    358 
    359     default:
    360         return KM_ERROR_UNSUPPORTED_PADDING_MODE;
    361     }
    362 
    363     if (bytes_encrypted <= 0)
    364         return TranslateLastOpenSslError();
    365     if (!output->advance_write(bytes_encrypted))
    366         return KM_ERROR_UNKNOWN_ERROR;
    367     return KM_ERROR_OK;
    368 }
    369 
    370 keymaster_error_t RsaSignOperation::SignDigested(Buffer* output) {
    371     size_t siglen;
    372     if (EVP_DigestSignFinal(&digest_ctx_, nullptr /* signature */, &siglen) != 1)
    373         return TranslateLastOpenSslError();
    374 
    375     if (!output->Reinitialize(siglen))
    376         return KM_ERROR_MEMORY_ALLOCATION_FAILED;
    377 
    378     if (EVP_DigestSignFinal(&digest_ctx_, output->peek_write(), &siglen) <= 0)
    379         return TranslateLastOpenSslError();
    380     if (!output->advance_write(siglen))
    381         return KM_ERROR_UNKNOWN_ERROR;
    382 
    383     return KM_ERROR_OK;
    384 }
    385 
    386 keymaster_error_t RsaVerifyOperation::Begin(const AuthorizationSet& input_params,
    387                                             AuthorizationSet* output_params) {
    388     keymaster_error_t error = RsaDigestingOperation::Begin(input_params, output_params);
    389     if (error != KM_ERROR_OK)
    390         return error;
    391 
    392     if (digest_ == KM_DIGEST_NONE)
    393         return KM_ERROR_OK;
    394 
    395     EVP_PKEY_CTX* pkey_ctx;
    396     if (EVP_DigestVerifyInit(&digest_ctx_, &pkey_ctx, digest_algorithm_, NULL, rsa_key_) != 1)
    397         return TranslateLastOpenSslError();
    398     return SetRsaPaddingInEvpContext(pkey_ctx, false /* signing */);
    399 }
    400 
    401 keymaster_error_t RsaVerifyOperation::Update(const AuthorizationSet& additional_params,
    402                                              const Buffer& input, AuthorizationSet* output_params,
    403                                              Buffer* output, size_t* input_consumed) {
    404     if (digest_ == KM_DIGEST_NONE)
    405         // Just buffer the data.
    406         return RsaOperation::Update(additional_params, input, output_params, output,
    407                                     input_consumed);
    408 
    409     if (EVP_DigestVerifyUpdate(&digest_ctx_, input.peek_read(), input.available_read()) != 1)
    410         return TranslateLastOpenSslError();
    411     *input_consumed = input.available_read();
    412     return KM_ERROR_OK;
    413 }
    414 
    415 keymaster_error_t RsaVerifyOperation::Finish(const AuthorizationSet& additional_params,
    416                                              const Buffer& input, const Buffer& signature,
    417                                              AuthorizationSet* /* output_params */,
    418                                              Buffer* /* output */) {
    419     keymaster_error_t error = UpdateForFinish(additional_params, input);
    420     if (error != KM_ERROR_OK)
    421         return error;
    422 
    423     if (digest_ == KM_DIGEST_NONE)
    424         return VerifyUndigested(signature);
    425     else
    426         return VerifyDigested(signature);
    427 }
    428 
    429 keymaster_error_t RsaVerifyOperation::VerifyUndigested(const Buffer& signature) {
    430     UniquePtr<RSA, RSA_Delete> rsa(EVP_PKEY_get1_RSA(const_cast<EVP_PKEY*>(rsa_key_)));
    431     if (!rsa.get())
    432         return KM_ERROR_UNKNOWN_ERROR;
    433 
    434     size_t key_len = RSA_size(rsa.get());
    435     int openssl_padding;
    436     switch (padding_) {
    437     case KM_PAD_NONE:
    438         if (data_.available_read() > key_len)
    439             return KM_ERROR_INVALID_INPUT_LENGTH;
    440         if (key_len != signature.available_read())
    441             return KM_ERROR_VERIFICATION_FAILED;
    442         openssl_padding = RSA_NO_PADDING;
    443         break;
    444     case KM_PAD_RSA_PKCS1_1_5_SIGN:
    445         if (data_.available_read() + kPkcs1UndigestedSignaturePaddingOverhead > key_len) {
    446             LOG_E("Input too long: cannot verify %u-byte message with PKCS1 padding && %u-bit key",
    447                   data_.available_read(), key_len * 8);
    448             return KM_ERROR_INVALID_INPUT_LENGTH;
    449         }
    450         openssl_padding = RSA_PKCS1_PADDING;
    451         break;
    452     default:
    453         return KM_ERROR_UNSUPPORTED_PADDING_MODE;
    454     }
    455 
    456     UniquePtr<uint8_t[]> decrypted_data(new (std::nothrow) uint8_t[key_len]);
    457     if (!decrypted_data.get())
    458         return KM_ERROR_MEMORY_ALLOCATION_FAILED;
    459     int bytes_decrypted = RSA_public_decrypt(signature.available_read(), signature.peek_read(),
    460                                              decrypted_data.get(), rsa.get(), openssl_padding);
    461     if (bytes_decrypted < 0)
    462         return KM_ERROR_VERIFICATION_FAILED;
    463 
    464     const uint8_t* compare_pos = decrypted_data.get();
    465     size_t bytes_to_compare = bytes_decrypted;
    466     uint8_t zero_check_result = 0;
    467     if (padding_ == KM_PAD_NONE && data_.available_read() < bytes_to_compare) {
    468         // If the data is short, for "unpadded" signing we zero-pad to the left.  So during
    469         // verification we should have zeros on the left of the decrypted data.  Do a constant-time
    470         // check.
    471         const uint8_t* zero_end = compare_pos + bytes_to_compare - data_.available_read();
    472         while (compare_pos < zero_end)
    473             zero_check_result |= *compare_pos++;
    474         bytes_to_compare = data_.available_read();
    475     }
    476     if (memcmp_s(compare_pos, data_.peek_read(), bytes_to_compare) != 0 || zero_check_result != 0)
    477         return KM_ERROR_VERIFICATION_FAILED;
    478     return KM_ERROR_OK;
    479 }
    480 
    481 keymaster_error_t RsaVerifyOperation::VerifyDigested(const Buffer& signature) {
    482     if (!EVP_DigestVerifyFinal(&digest_ctx_, signature.peek_read(), signature.available_read()))
    483         return KM_ERROR_VERIFICATION_FAILED;
    484     return KM_ERROR_OK;
    485 }
    486 
    487 keymaster_error_t RsaCryptOperation::SetOaepDigestIfRequired(EVP_PKEY_CTX* pkey_ctx) {
    488     if (padding() != KM_PAD_RSA_OAEP)
    489         return KM_ERROR_OK;
    490 
    491     assert(digest_algorithm_ != nullptr);
    492     if (!EVP_PKEY_CTX_set_rsa_oaep_md(pkey_ctx, digest_algorithm_))
    493         return TranslateLastOpenSslError();
    494 
    495     // MGF1 MD is always SHA1.
    496     if (!EVP_PKEY_CTX_set_rsa_mgf1_md(pkey_ctx, EVP_sha1()))
    497         return TranslateLastOpenSslError();
    498 
    499     return KM_ERROR_OK;
    500 }
    501 
    502 int RsaCryptOperation::GetOpensslPadding(keymaster_error_t* error) {
    503     *error = KM_ERROR_OK;
    504     switch (padding_) {
    505     case KM_PAD_NONE:
    506         return RSA_NO_PADDING;
    507     case KM_PAD_RSA_PKCS1_1_5_ENCRYPT:
    508         return RSA_PKCS1_PADDING;
    509     case KM_PAD_RSA_OAEP:
    510         return RSA_PKCS1_OAEP_PADDING;
    511     default:
    512         return -1;
    513     }
    514 }
    515 
    516 struct EVP_PKEY_CTX_Delete {
    517     void operator()(EVP_PKEY_CTX* p) { EVP_PKEY_CTX_free(p); }
    518 };
    519 
    520 keymaster_error_t RsaEncryptOperation::Finish(const AuthorizationSet& additional_params,
    521                                               const Buffer& input, const Buffer& /* signature */,
    522                                               AuthorizationSet* /* output_params */,
    523                                               Buffer* output) {
    524     if (!output)
    525         return KM_ERROR_OUTPUT_PARAMETER_NULL;
    526 
    527     keymaster_error_t error = UpdateForFinish(additional_params, input);
    528     if (error != KM_ERROR_OK)
    529         return error;
    530 
    531     UniquePtr<EVP_PKEY_CTX, EVP_PKEY_CTX_Delete> ctx(
    532         EVP_PKEY_CTX_new(rsa_key_, nullptr /* engine */));
    533     if (!ctx.get())
    534         return KM_ERROR_MEMORY_ALLOCATION_FAILED;
    535 
    536     if (EVP_PKEY_encrypt_init(ctx.get()) <= 0)
    537         return TranslateLastOpenSslError();
    538 
    539     error = SetRsaPaddingInEvpContext(ctx.get(), false /* signing */);
    540     if (error != KM_ERROR_OK)
    541         return error;
    542     error = SetOaepDigestIfRequired(ctx.get());
    543     if (error != KM_ERROR_OK)
    544         return error;
    545 
    546     size_t outlen;
    547     if (EVP_PKEY_encrypt(ctx.get(), nullptr /* out */, &outlen, data_.peek_read(),
    548                          data_.available_read()) <= 0)
    549         return TranslateLastOpenSslError();
    550 
    551     if (!output->Reinitialize(outlen))
    552         return KM_ERROR_MEMORY_ALLOCATION_FAILED;
    553 
    554     const uint8_t* to_encrypt = data_.peek_read();
    555     size_t to_encrypt_len = data_.available_read();
    556     UniquePtr<uint8_t[]> zero_padded;
    557     if (padding_ == KM_PAD_NONE && to_encrypt_len < outlen) {
    558         keymaster_error_t error = zero_pad_left(&zero_padded, outlen, data_);
    559         if (error != KM_ERROR_OK)
    560             return error;
    561         to_encrypt = zero_padded.get();
    562         to_encrypt_len = outlen;
    563     }
    564 
    565     if (EVP_PKEY_encrypt(ctx.get(), output->peek_write(), &outlen, to_encrypt, to_encrypt_len) <= 0)
    566         return TranslateLastOpenSslError();
    567     if (!output->advance_write(outlen))
    568         return KM_ERROR_UNKNOWN_ERROR;
    569 
    570     return KM_ERROR_OK;
    571 }
    572 
    573 keymaster_error_t RsaDecryptOperation::Finish(const AuthorizationSet& additional_params,
    574                                               const Buffer& input, const Buffer& /* signature */,
    575                                               AuthorizationSet* /* output_params */,
    576                                               Buffer* output) {
    577     if (!output)
    578         return KM_ERROR_OUTPUT_PARAMETER_NULL;
    579 
    580     keymaster_error_t error = UpdateForFinish(additional_params, input);
    581     if (error != KM_ERROR_OK)
    582         return error;
    583 
    584     UniquePtr<EVP_PKEY_CTX, EVP_PKEY_CTX_Delete> ctx(
    585         EVP_PKEY_CTX_new(rsa_key_, nullptr /* engine */));
    586     if (!ctx.get())
    587         return KM_ERROR_MEMORY_ALLOCATION_FAILED;
    588 
    589     if (EVP_PKEY_decrypt_init(ctx.get()) <= 0)
    590         return TranslateLastOpenSslError();
    591 
    592     error = SetRsaPaddingInEvpContext(ctx.get(), false /* signing */);
    593     if (error != KM_ERROR_OK)
    594         return error;
    595     error = SetOaepDigestIfRequired(ctx.get());
    596     if (error != KM_ERROR_OK)
    597         return error;
    598 
    599     size_t outlen;
    600     if (EVP_PKEY_decrypt(ctx.get(), nullptr /* out */, &outlen, data_.peek_read(),
    601                          data_.available_read()) <= 0)
    602         return TranslateLastOpenSslError();
    603 
    604     if (!output->Reinitialize(outlen))
    605         return KM_ERROR_MEMORY_ALLOCATION_FAILED;
    606 
    607     const uint8_t* to_decrypt = data_.peek_read();
    608     size_t to_decrypt_len = data_.available_read();
    609     UniquePtr<uint8_t[]> zero_padded;
    610     if (padding_ == KM_PAD_NONE && to_decrypt_len < outlen) {
    611         keymaster_error_t error = zero_pad_left(&zero_padded, outlen, data_);
    612         if (error != KM_ERROR_OK)
    613             return error;
    614         to_decrypt = zero_padded.get();
    615         to_decrypt_len = outlen;
    616     }
    617 
    618     if (EVP_PKEY_decrypt(ctx.get(), output->peek_write(), &outlen, to_decrypt, to_decrypt_len) <= 0)
    619         return TranslateLastOpenSslError();
    620     if (!output->advance_write(outlen))
    621         return KM_ERROR_UNKNOWN_ERROR;
    622 
    623     return KM_ERROR_OK;
    624 }
    625 
    626 }  // namespace keymaster
    627