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 "aes_operation.h" 18 19 #include <stdio.h> 20 21 #include <new> 22 23 #include <UniquePtr.h> 24 25 #include <openssl/aes.h> 26 #include <openssl/err.h> 27 #include <openssl/rand.h> 28 29 #include <keymaster/logger.h> 30 31 #include "aes_key.h" 32 #include "openssl_err.h" 33 34 namespace keymaster { 35 36 static const size_t GCM_NONCE_SIZE = 12; 37 38 inline bool allows_padding(keymaster_block_mode_t block_mode) { 39 switch (block_mode) { 40 case KM_MODE_CTR: 41 case KM_MODE_GCM: 42 return false; 43 case KM_MODE_ECB: 44 case KM_MODE_CBC: 45 return true; 46 } 47 assert(false /* Can't get here */); 48 return false; 49 } 50 51 static keymaster_error_t GetAndValidateGcmTagLength(const AuthorizationSet& begin_params, 52 const AuthorizationSet& key_params, 53 size_t* tag_length) { 54 uint32_t tag_length_bits; 55 if (!begin_params.GetTagValue(TAG_MAC_LENGTH, &tag_length_bits)) { 56 return KM_ERROR_MISSING_MAC_LENGTH; 57 } 58 59 uint32_t min_tag_length_bits; 60 if (!key_params.GetTagValue(TAG_MIN_MAC_LENGTH, &min_tag_length_bits)) { 61 LOG_E("AES GCM key must have KM_TAG_MIN_MAC_LENGTH", 0); 62 return KM_ERROR_INVALID_KEY_BLOB; 63 } 64 65 if (tag_length_bits % 8 != 0 || tag_length_bits > kMaxGcmTagLength || 66 tag_length_bits < kMinGcmTagLength) { 67 return KM_ERROR_UNSUPPORTED_MAC_LENGTH; 68 } 69 70 if (tag_length_bits < min_tag_length_bits) { 71 return KM_ERROR_INVALID_MAC_LENGTH; 72 } 73 74 *tag_length = tag_length_bits / 8; 75 return KM_ERROR_OK; 76 } 77 78 Operation* AesOperationFactory::CreateOperation(const Key& key, 79 const AuthorizationSet& begin_params, 80 keymaster_error_t* error) { 81 *error = KM_ERROR_OK; 82 const SymmetricKey* symmetric_key = static_cast<const SymmetricKey*>(&key); 83 84 switch (symmetric_key->key_data_size()) { 85 case 16: 86 case 24: 87 case 32: 88 break; 89 default: 90 *error = KM_ERROR_UNSUPPORTED_KEY_SIZE; 91 return nullptr; 92 } 93 94 keymaster_block_mode_t block_mode; 95 if (!begin_params.GetTagValue(TAG_BLOCK_MODE, &block_mode)) { 96 LOG_E("%d block modes specified in begin params", begin_params.GetTagCount(TAG_BLOCK_MODE)); 97 *error = KM_ERROR_UNSUPPORTED_BLOCK_MODE; 98 return nullptr; 99 } else if (!supported(block_mode)) { 100 LOG_E("Block mode %d not supported", block_mode); 101 *error = KM_ERROR_UNSUPPORTED_BLOCK_MODE; 102 return nullptr; 103 } else if (!key.authorizations().Contains(TAG_BLOCK_MODE, block_mode)) { 104 LOG_E("Block mode %d was specified, but not authorized by key", block_mode); 105 *error = KM_ERROR_INCOMPATIBLE_BLOCK_MODE; 106 return nullptr; 107 } 108 109 size_t tag_length = 0; 110 if (block_mode == KM_MODE_GCM) { 111 *error = GetAndValidateGcmTagLength(begin_params, key.authorizations(), &tag_length); 112 if (*error != KM_ERROR_OK) { 113 return nullptr; 114 } 115 } 116 117 keymaster_padding_t padding; 118 if (!GetAndValidatePadding(begin_params, key, &padding, error)) { 119 return nullptr; 120 } 121 if (!allows_padding(block_mode) && padding != KM_PAD_NONE) { 122 LOG_E("Mode does not support padding", 0); 123 *error = KM_ERROR_INCOMPATIBLE_PADDING_MODE; 124 return nullptr; 125 } 126 127 bool caller_nonce = key.authorizations().GetTagValue(TAG_CALLER_NONCE); 128 129 Operation* op = nullptr; 130 switch (purpose()) { 131 case KM_PURPOSE_ENCRYPT: 132 op = new (std::nothrow) 133 AesEvpEncryptOperation(block_mode, padding, caller_nonce, tag_length, 134 symmetric_key->key_data(), symmetric_key->key_data_size()); 135 break; 136 case KM_PURPOSE_DECRYPT: 137 op = new (std::nothrow) 138 AesEvpDecryptOperation(block_mode, padding, tag_length, symmetric_key->key_data(), 139 symmetric_key->key_data_size()); 140 break; 141 default: 142 *error = KM_ERROR_UNSUPPORTED_PURPOSE; 143 return nullptr; 144 } 145 146 if (!op) 147 *error = KM_ERROR_MEMORY_ALLOCATION_FAILED; 148 return op; 149 } 150 151 static const keymaster_block_mode_t supported_block_modes[] = {KM_MODE_ECB, KM_MODE_CBC, 152 KM_MODE_CTR, KM_MODE_GCM}; 153 154 const keymaster_block_mode_t* 155 AesOperationFactory::SupportedBlockModes(size_t* block_mode_count) const { 156 *block_mode_count = array_length(supported_block_modes); 157 return supported_block_modes; 158 } 159 160 static const keymaster_padding_t supported_padding_modes[] = {KM_PAD_NONE, KM_PAD_PKCS7}; 161 const keymaster_padding_t* 162 AesOperationFactory::SupportedPaddingModes(size_t* padding_mode_count) const { 163 *padding_mode_count = array_length(supported_padding_modes); 164 return supported_padding_modes; 165 } 166 167 AesEvpOperation::AesEvpOperation(keymaster_purpose_t purpose, keymaster_block_mode_t block_mode, 168 keymaster_padding_t padding, bool caller_iv, size_t tag_length, 169 const uint8_t* key, size_t key_size) 170 : Operation(purpose), block_mode_(block_mode), caller_iv_(caller_iv), tag_length_(tag_length), 171 data_started_(false), key_size_(key_size), padding_(padding) { 172 memcpy(key_, key, key_size_); 173 EVP_CIPHER_CTX_init(&ctx_); 174 } 175 176 AesEvpOperation::~AesEvpOperation() { 177 EVP_CIPHER_CTX_cleanup(&ctx_); 178 memset_s(aad_block_buf_.get(), AES_BLOCK_SIZE, 0); 179 } 180 181 keymaster_error_t AesEvpOperation::Begin(const AuthorizationSet& /* input_params */, 182 AuthorizationSet* /* output_params */) { 183 if (block_mode_ == KM_MODE_GCM) { 184 aad_block_buf_length_ = 0; 185 aad_block_buf_.reset(new (std::nothrow) uint8_t[AES_BLOCK_SIZE]); 186 if (!aad_block_buf_.get()) 187 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 188 } 189 190 return InitializeCipher(); 191 } 192 193 keymaster_error_t AesEvpOperation::Update(const AuthorizationSet& additional_params, 194 const Buffer& input, 195 AuthorizationSet* /* output_params */, Buffer* output, 196 size_t* input_consumed) { 197 keymaster_error_t error; 198 if (block_mode_ == KM_MODE_GCM) 199 if (!HandleAad(additional_params, input, &error)) 200 return error; 201 202 if (!InternalUpdate(input.peek_read(), input.available_read(), output, &error)) 203 return error; 204 *input_consumed = input.available_read(); 205 206 return KM_ERROR_OK; 207 } 208 209 inline bool is_bad_decrypt(unsigned long error) { 210 return (ERR_GET_LIB(error) == ERR_LIB_CIPHER && // 211 ERR_GET_REASON(error) == CIPHER_R_BAD_DECRYPT); 212 } 213 214 keymaster_error_t AesEvpOperation::Finish(const AuthorizationSet& additional_params, 215 const Buffer& input, const Buffer& /* signature */, 216 AuthorizationSet* output_params, Buffer* output) { 217 keymaster_error_t error; 218 if (!UpdateForFinish(additional_params, input, output_params, output, &error)) 219 return error; 220 221 if (!output->reserve(AES_BLOCK_SIZE)) 222 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 223 224 if (block_mode_ == KM_MODE_GCM && aad_block_buf_length_ > 0 && !ProcessBufferedAadBlock(&error)) 225 return error; 226 227 int output_written = -1; 228 if (!EVP_CipherFinal_ex(&ctx_, output->peek_write(), &output_written)) { 229 if (tag_length_ > 0) 230 return KM_ERROR_VERIFICATION_FAILED; 231 LOG_E("Error encrypting final block: %s", ERR_error_string(ERR_peek_last_error(), NULL)); 232 return TranslateLastOpenSslError(); 233 } 234 235 assert(output_written <= AES_BLOCK_SIZE); 236 if (!output->advance_write(output_written)) 237 return KM_ERROR_UNKNOWN_ERROR; 238 return KM_ERROR_OK; 239 } 240 241 bool AesEvpOperation::need_iv() const { 242 switch (block_mode_) { 243 case KM_MODE_CBC: 244 case KM_MODE_CTR: 245 case KM_MODE_GCM: 246 return true; 247 case KM_MODE_ECB: 248 return false; 249 default: 250 // Shouldn't get here. 251 assert(false); 252 return false; 253 } 254 } 255 256 keymaster_error_t AesEvpOperation::InitializeCipher() { 257 const EVP_CIPHER* cipher; 258 switch (block_mode_) { 259 case KM_MODE_ECB: 260 switch (key_size_) { 261 case 16: 262 cipher = EVP_aes_128_ecb(); 263 break; 264 case 24: 265 cipher = EVP_aes_192_ecb(); 266 break; 267 case 32: 268 cipher = EVP_aes_256_ecb(); 269 break; 270 default: 271 return KM_ERROR_UNSUPPORTED_KEY_SIZE; 272 } 273 break; 274 case KM_MODE_CBC: 275 switch (key_size_) { 276 case 16: 277 cipher = EVP_aes_128_cbc(); 278 break; 279 case 24: 280 cipher = EVP_aes_192_cbc(); 281 break; 282 case 32: 283 cipher = EVP_aes_256_cbc(); 284 break; 285 default: 286 return KM_ERROR_UNSUPPORTED_KEY_SIZE; 287 } 288 break; 289 case KM_MODE_CTR: 290 switch (key_size_) { 291 case 16: 292 cipher = EVP_aes_128_ctr(); 293 break; 294 case 24: 295 cipher = EVP_aes_192_ctr(); 296 break; 297 case 32: 298 cipher = EVP_aes_256_ctr(); 299 break; 300 default: 301 return KM_ERROR_UNSUPPORTED_KEY_SIZE; 302 } 303 break; 304 case KM_MODE_GCM: 305 switch (key_size_) { 306 case 16: 307 cipher = EVP_aes_128_gcm(); 308 break; 309 case 24: 310 cipher = EVP_aes_192_gcm(); 311 break; 312 case 32: 313 cipher = EVP_aes_256_gcm(); 314 break; 315 default: 316 return KM_ERROR_UNSUPPORTED_KEY_SIZE; 317 } 318 break; 319 default: 320 return KM_ERROR_UNSUPPORTED_BLOCK_MODE; 321 } 322 323 if (!EVP_CipherInit_ex(&ctx_, cipher, NULL /* engine */, key_, iv_.get(), evp_encrypt_mode())) 324 return TranslateLastOpenSslError(); 325 326 switch (padding_) { 327 case KM_PAD_NONE: 328 EVP_CIPHER_CTX_set_padding(&ctx_, 0 /* disable padding */); 329 break; 330 case KM_PAD_PKCS7: 331 // This is the default for OpenSSL EVP cipher operations. 332 break; 333 default: 334 return KM_ERROR_UNSUPPORTED_PADDING_MODE; 335 } 336 337 if (block_mode_ == KM_MODE_GCM) { 338 aad_block_buf_length_ = 0; 339 aad_block_buf_.reset(new (std::nothrow) uint8_t[AES_BLOCK_SIZE]); 340 if (!aad_block_buf_.get()) 341 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 342 } 343 344 return KM_ERROR_OK; 345 } 346 347 keymaster_error_t AesEvpOperation::GetIv(const AuthorizationSet& input_params) { 348 keymaster_blob_t iv_blob; 349 if (!input_params.GetTagValue(TAG_NONCE, &iv_blob)) { 350 LOG_E("No IV provided", 0); 351 return KM_ERROR_INVALID_ARGUMENT; 352 } 353 if (block_mode_ != KM_MODE_GCM && iv_blob.data_length != AES_BLOCK_SIZE) { 354 LOG_E("Expected %d-byte IV for AES operation, but got %d bytes", AES_BLOCK_SIZE, 355 iv_blob.data_length); 356 return KM_ERROR_INVALID_NONCE; 357 } 358 if (block_mode_ == KM_MODE_GCM && iv_blob.data_length != GCM_NONCE_SIZE) { 359 LOG_E("Expected %d-byte nonce for AES-GCM operation, but got %d bytes", GCM_NONCE_SIZE, 360 iv_blob.data_length); 361 return KM_ERROR_INVALID_NONCE; 362 } 363 iv_.reset(dup_array(iv_blob.data, iv_blob.data_length)); 364 if (!iv_.get()) 365 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 366 iv_length_ = iv_blob.data_length; 367 return KM_ERROR_OK; 368 } 369 370 /* 371 * Process Incoming Associated Authentication Data. 372 * 373 * This method is more complex than might be expected, because the underlying library silently does 374 * the wrong thing when given partial AAD blocks, so we have to take care to process AAD in 375 * AES_BLOCK_SIZE increments, buffering (in aad_block_buf_) when given smaller amounts of data. 376 */ 377 bool AesEvpOperation::HandleAad(const AuthorizationSet& input_params, const Buffer& input, 378 keymaster_error_t* error) { 379 assert(tag_length_ > 0); 380 assert(error); 381 382 keymaster_blob_t aad; 383 if (input_params.GetTagValue(TAG_ASSOCIATED_DATA, &aad)) { 384 if (data_started_) { 385 *error = KM_ERROR_INVALID_TAG; 386 return false; 387 } 388 389 if (aad_block_buf_length_ > 0) { 390 FillBufferedAadBlock(&aad); 391 if (aad_block_buf_length_ == AES_BLOCK_SIZE && !ProcessBufferedAadBlock(error)) 392 return false; 393 } 394 395 size_t blocks_to_process = aad.data_length / AES_BLOCK_SIZE; 396 if (blocks_to_process && !ProcessAadBlocks(aad.data, blocks_to_process, error)) 397 return false; 398 aad.data += blocks_to_process * AES_BLOCK_SIZE; 399 aad.data_length -= blocks_to_process * AES_BLOCK_SIZE; 400 401 FillBufferedAadBlock(&aad); 402 assert(aad.data_length == 0); 403 } 404 405 if (input.available_read()) { 406 data_started_ = true; 407 // Data has begun, no more AAD is allowed. Process any buffered AAD. 408 if (aad_block_buf_length_ > 0 && !ProcessBufferedAadBlock(error)) 409 return false; 410 } 411 412 return true; 413 } 414 415 bool AesEvpOperation::ProcessBufferedAadBlock(keymaster_error_t* error) { 416 int output_written; 417 if (EVP_CipherUpdate(&ctx_, nullptr /* out */, &output_written, aad_block_buf_.get(), 418 aad_block_buf_length_)) { 419 aad_block_buf_length_ = 0; 420 return true; 421 } 422 *error = TranslateLastOpenSslError(); 423 return false; 424 } 425 426 bool AesEvpOperation::ProcessAadBlocks(const uint8_t* data, size_t blocks, 427 keymaster_error_t* error) { 428 int output_written; 429 if (EVP_CipherUpdate(&ctx_, nullptr /* out */, &output_written, data, blocks * AES_BLOCK_SIZE)) 430 return true; 431 *error = TranslateLastOpenSslError(); 432 return false; 433 } 434 435 inline size_t min(size_t a, size_t b) { 436 return (a < b) ? a : b; 437 } 438 439 void AesEvpOperation::FillBufferedAadBlock(keymaster_blob_t* aad) { 440 size_t to_buffer = min(AES_BLOCK_SIZE - aad_block_buf_length_, aad->data_length); 441 memcpy(aad_block_buf_.get() + aad_block_buf_length_, aad->data, to_buffer); 442 aad->data += to_buffer; 443 aad->data_length -= to_buffer; 444 aad_block_buf_length_ += to_buffer; 445 } 446 447 bool AesEvpOperation::InternalUpdate(const uint8_t* input, size_t input_length, Buffer* output, 448 keymaster_error_t* error) { 449 assert(output); 450 assert(error); 451 452 if (!input_length) 453 return true; 454 455 if (!output->reserve(input_length + AES_BLOCK_SIZE)) { 456 *error = KM_ERROR_MEMORY_ALLOCATION_FAILED; 457 return false; 458 } 459 460 int output_written = -1; 461 if (!EVP_CipherUpdate(&ctx_, output->peek_write(), &output_written, input, input_length)) { 462 *error = TranslateLastOpenSslError(); 463 return false; 464 } 465 return output->advance_write(output_written); 466 } 467 468 bool AesEvpOperation::UpdateForFinish(const AuthorizationSet& additional_params, 469 const Buffer& input, AuthorizationSet* output_params, 470 Buffer* output, keymaster_error_t* error) { 471 if (input.available_read() || !additional_params.empty()) { 472 size_t input_consumed; 473 *error = Update(additional_params, input, output_params, output, &input_consumed); 474 if (*error != KM_ERROR_OK) 475 return false; 476 if (input_consumed != input.available_read()) { 477 *error = KM_ERROR_INVALID_INPUT_LENGTH; 478 return false; 479 } 480 } 481 482 return true; 483 } 484 485 keymaster_error_t AesEvpEncryptOperation::Begin(const AuthorizationSet& input_params, 486 AuthorizationSet* output_params) { 487 if (!output_params) 488 return KM_ERROR_OUTPUT_PARAMETER_NULL; 489 490 if (need_iv()) { 491 keymaster_error_t error = KM_ERROR_OK; 492 if (input_params.find(TAG_NONCE) == -1) 493 error = GenerateIv(); 494 else if (caller_iv_) 495 error = GetIv(input_params); 496 else 497 error = KM_ERROR_CALLER_NONCE_PROHIBITED; 498 499 if (error == KM_ERROR_OK) 500 output_params->push_back(TAG_NONCE, iv_.get(), iv_length_); 501 else 502 return error; 503 } 504 505 return AesEvpOperation::Begin(input_params, output_params); 506 } 507 508 keymaster_error_t AesEvpEncryptOperation::Finish(const AuthorizationSet& additional_params, 509 const Buffer& input, const Buffer& signature, 510 AuthorizationSet* output_params, Buffer* output) { 511 if (!output->reserve(input.available_read() + AES_BLOCK_SIZE + tag_length_)) 512 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 513 514 keymaster_error_t error = 515 AesEvpOperation::Finish(additional_params, input, signature, output_params, output); 516 if (error != KM_ERROR_OK) 517 return error; 518 519 if (tag_length_ > 0) { 520 if (!output->reserve(tag_length_)) 521 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 522 523 if (!EVP_CIPHER_CTX_ctrl(&ctx_, EVP_CTRL_GCM_GET_TAG, tag_length_, output->peek_write())) 524 return TranslateLastOpenSslError(); 525 if (!output->advance_write(tag_length_)) 526 return KM_ERROR_UNKNOWN_ERROR; 527 } 528 529 return KM_ERROR_OK; 530 } 531 532 keymaster_error_t AesEvpEncryptOperation::GenerateIv() { 533 iv_length_ = (block_mode_ == KM_MODE_GCM) ? GCM_NONCE_SIZE : AES_BLOCK_SIZE; 534 iv_.reset(new (std::nothrow) uint8_t[iv_length_]); 535 if (!iv_.get()) 536 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 537 if (RAND_bytes(iv_.get(), iv_length_) != 1) 538 return TranslateLastOpenSslError(); 539 return KM_ERROR_OK; 540 } 541 542 keymaster_error_t AesEvpDecryptOperation::Begin(const AuthorizationSet& input_params, 543 AuthorizationSet* output_params) { 544 if (need_iv()) { 545 keymaster_error_t error = GetIv(input_params); 546 if (error != KM_ERROR_OK) 547 return error; 548 } 549 550 if (tag_length_ > 0) { 551 tag_buf_length_ = 0; 552 tag_buf_.reset(new (std::nothrow) uint8_t[tag_length_]); 553 if (!tag_buf_.get()) 554 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 555 } 556 557 return AesEvpOperation::Begin(input_params, output_params); 558 } 559 560 keymaster_error_t AesEvpDecryptOperation::Update(const AuthorizationSet& additional_params, 561 const Buffer& input, 562 AuthorizationSet* /* output_params */, 563 Buffer* output, size_t* input_consumed) { 564 if (!output || !input_consumed) 565 return KM_ERROR_OUTPUT_PARAMETER_NULL; 566 567 // Barring error, we'll consume it all. 568 *input_consumed = input.available_read(); 569 570 keymaster_error_t error; 571 if (block_mode_ == KM_MODE_GCM) { 572 if (!HandleAad(additional_params, input, &error)) 573 return error; 574 return ProcessAllButTagLengthBytes(input, output); 575 } 576 577 if (!InternalUpdate(input.peek_read(), input.available_read(), output, &error)) 578 return error; 579 return KM_ERROR_OK; 580 } 581 582 keymaster_error_t AesEvpDecryptOperation::ProcessAllButTagLengthBytes(const Buffer& input, 583 Buffer* output) { 584 if (input.available_read() <= tag_buf_unused()) { 585 BufferCandidateTagData(input.peek_read(), input.available_read()); 586 return KM_ERROR_OK; 587 } 588 589 const size_t data_available = tag_buf_length_ + input.available_read(); 590 591 const size_t to_process = data_available - tag_length_; 592 const size_t to_process_from_tag_buf = min(to_process, tag_buf_length_); 593 const size_t to_process_from_input = to_process - to_process_from_tag_buf; 594 595 if (!output->reserve(to_process + AES_BLOCK_SIZE)) 596 return KM_ERROR_MEMORY_ALLOCATION_FAILED; 597 598 keymaster_error_t error; 599 if (!ProcessTagBufContentsAsData(to_process_from_tag_buf, output, &error)) 600 return error; 601 602 if (!InternalUpdate(input.peek_read(), to_process_from_input, output, &error)) 603 return error; 604 605 BufferCandidateTagData(input.peek_read() + to_process_from_input, 606 input.available_read() - to_process_from_input); 607 assert(tag_buf_unused() == 0); 608 609 return KM_ERROR_OK; 610 } 611 612 bool AesEvpDecryptOperation::ProcessTagBufContentsAsData(size_t to_process, Buffer* output, 613 keymaster_error_t* error) { 614 assert(to_process <= tag_buf_length_); 615 if (!InternalUpdate(tag_buf_.get(), to_process, output, error)) 616 return false; 617 if (to_process < tag_buf_length_) 618 memmove(tag_buf_.get(), tag_buf_.get() + to_process, tag_buf_length_ - to_process); 619 tag_buf_length_ -= to_process; 620 return true; 621 } 622 623 void AesEvpDecryptOperation::BufferCandidateTagData(const uint8_t* data, size_t data_length) { 624 assert(data_length <= tag_length_ - tag_buf_length_); 625 memcpy(tag_buf_.get() + tag_buf_length_, data, data_length); 626 tag_buf_length_ += data_length; 627 } 628 629 keymaster_error_t AesEvpDecryptOperation::Finish(const AuthorizationSet& additional_params, 630 const Buffer& input, const Buffer& signature, 631 AuthorizationSet* output_params, Buffer* output) { 632 keymaster_error_t error; 633 if (!UpdateForFinish(additional_params, input, output_params, output, &error)) 634 return error; 635 636 if (tag_buf_length_ < tag_length_) 637 return KM_ERROR_INVALID_INPUT_LENGTH; 638 else if (tag_length_ > 0 && 639 !EVP_CIPHER_CTX_ctrl(&ctx_, EVP_CTRL_GCM_SET_TAG, tag_length_, tag_buf_.get())) 640 return TranslateLastOpenSslError(); 641 642 AuthorizationSet empty_params; 643 Buffer empty_input; 644 return AesEvpOperation::Finish(empty_params, empty_input, signature, output_params, output); 645 } 646 647 keymaster_error_t AesEvpOperation::Abort() { 648 return KM_ERROR_OK; 649 } 650 651 } // namespace keymaster 652