10a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden/* 20a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * Copyright 2014 The Android Open Source Project 30a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * 40a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * Licensed under the Apache License, Version 2.0 (the "License"); 50a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * you may not use this file except in compliance with the License. 60a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * You may obtain a copy of the License at 70a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * 80a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * http://www.apache.org/licenses/LICENSE-2.0 90a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * 100a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * Unless required by applicable law or agreed to in writing, software 110a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * distributed under the License is distributed on an "AS IS" BASIS, 120a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * See the License for the specific language governing permissions and 140a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * limitations under the License. 150a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden */ 160a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 170a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden#ifndef SYSTEM_KEYMASTER_RSA_OPERATION_H_ 180a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden#define SYSTEM_KEYMASTER_RSA_OPERATION_H_ 190a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 200a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden#include <UniquePtr.h> 210a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 220a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden#include <keymaster/key_blob.h> 230a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 240a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden#include "operation.h" 250a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 260a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdennamespace keymaster { 270a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 280a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenclass RsaOperation : public Operation { 290a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden public: 30f6ca3a3f1bbe206e2fd05be36da10cb4204e5388Shawn Willden RsaOperation(keymaster_purpose_t purpose, const Logger& logger, keymaster_digest_t digest, 310a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden keymaster_padding_t padding, RSA* key) 32f6ca3a3f1bbe206e2fd05be36da10cb4204e5388Shawn Willden : Operation(purpose, logger), rsa_key_(key), digest_(digest), padding_(padding) {} 330a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden ~RsaOperation(); 340a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 350a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden virtual keymaster_error_t Begin() { return KM_ERROR_OK; } 360a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden virtual keymaster_error_t Update(const Buffer& input, Buffer* output); 370a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden virtual keymaster_error_t Abort() { return KM_ERROR_OK; } 380a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 390a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden protected: 400a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden keymaster_error_t StoreData(const Buffer& input); 410a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 420a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden RSA* rsa_key_; 430a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden keymaster_digest_t digest_; 440a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden keymaster_padding_t padding_; 450a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden Buffer data_; 460a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 470a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 480a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenclass RsaSignOperation : public RsaOperation { 490a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden public: 50f6ca3a3f1bbe206e2fd05be36da10cb4204e5388Shawn Willden RsaSignOperation(keymaster_purpose_t purpose, const Logger& logger, keymaster_digest_t digest, 510a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden keymaster_padding_t padding, RSA* key) 52f6ca3a3f1bbe206e2fd05be36da10cb4204e5388Shawn Willden : RsaOperation(purpose, logger, digest, padding, key) {} 530a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden virtual keymaster_error_t Finish(const Buffer& signature, Buffer* output); 540a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 550a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 560a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenclass RsaVerifyOperation : public RsaOperation { 570a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden public: 58f6ca3a3f1bbe206e2fd05be36da10cb4204e5388Shawn Willden RsaVerifyOperation(keymaster_purpose_t purpose, const Logger& logger, keymaster_digest_t digest, 590a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden keymaster_padding_t padding, RSA* key) 60f6ca3a3f1bbe206e2fd05be36da10cb4204e5388Shawn Willden : RsaOperation(purpose, logger, digest, padding, key) {} 610a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden virtual keymaster_error_t Finish(const Buffer& signature, Buffer* output); 620a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 630a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 640a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden} // namespace keymaster 650a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 660a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden#endif // SYSTEM_KEYMASTER_RSA_OPERATION_H_ 67