kmsp11/session.h (66 lines of code) (raw):
/*
* Copyright 2021 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef KMSP11_SESSION_H_
#define KMSP11_SESSION_H_
#include "kmsp11/operation/operation.h"
#include "kmsp11/token.h"
namespace cloud_kms::kmsp11 {
enum class SessionType { kReadOnly, kReadWrite };
struct AsymmetricHandleSet {
CK_OBJECT_HANDLE private_key_handle;
CK_OBJECT_HANDLE public_key_handle;
};
// Session models a PKCS #11 Session and an optional ongoing operation.
//
// See go/kms-pkcs11-model
class Session {
public:
Session(Token* token, SessionType session_type, KmsClient* kms_client)
: token_(token), session_type_(session_type), kms_client_(kms_client) {}
Token* token() const { return token_; }
CK_SESSION_INFO info() const;
void ReleaseOperation();
absl::Status FindObjectsInit(absl::Span<const CK_ATTRIBUTE> attributes);
absl::StatusOr<absl::Span<const CK_OBJECT_HANDLE>> FindObjects(
size_t max_count);
absl::Status FindObjectsFinal();
absl::Status DecryptInit(std::shared_ptr<Object> key,
CK_MECHANISM* mechanism);
absl::StatusOr<absl::Span<const uint8_t>> Decrypt(
absl::Span<const uint8_t> ciphertext);
absl::Status DecryptUpdate(absl::Span<const uint8_t> ciphertext);
absl::StatusOr<absl::Span<const uint8_t>> DecryptFinal();
absl::Status EncryptInit(std::shared_ptr<Object> key,
CK_MECHANISM* mechanism);
absl::StatusOr<absl::Span<const uint8_t>> Encrypt(
absl::Span<const uint8_t> plaintext);
absl::Status EncryptUpdate(absl::Span<const uint8_t> plaintext);
absl::StatusOr<absl::Span<const uint8_t>> EncryptFinal();
absl::Status SignInit(std::shared_ptr<Object> key, CK_MECHANISM* mechanism);
absl::Status Sign(absl::Span<const uint8_t> digest,
absl::Span<uint8_t> signature);
absl::Status SignUpdate(absl::Span<const uint8_t> data);
absl::Status SignFinal(absl::Span<uint8_t> signature);
absl::StatusOr<size_t> SignatureLength();
absl::Status VerifyInit(std::shared_ptr<Object> key, CK_MECHANISM* mechanism);
absl::Status Verify(absl::Span<const uint8_t> digest,
absl::Span<const uint8_t> signature);
absl::Status VerifyUpdate(absl::Span<const uint8_t> data);
absl::Status VerifyFinal(absl::Span<const uint8_t> signature);
absl::StatusOr<AsymmetricHandleSet> GenerateKeyPair(
const CK_MECHANISM& mechanism,
absl::Span<const CK_ATTRIBUTE> public_key_attrs,
absl::Span<const CK_ATTRIBUTE> private_key_attrs,
bool experimental_create_multiple_versions = false,
bool allow_software_keys = false);
absl::StatusOr<CK_OBJECT_HANDLE> GenerateKey(
const CK_MECHANISM& mechanism,
absl::Span<const CK_ATTRIBUTE> secret_key_attrs,
bool experimental_create_multiple_versions = false,
bool allow_software_keys = false);
absl::Status DestroyObject(std::shared_ptr<Object> object);
absl::Status GenerateRandom(absl::Span<uint8_t> buffer);
private:
Token* token_;
const SessionType session_type_;
KmsClient* kms_client_;
absl::Mutex op_mutex_;
std::optional<Operation> op_ ABSL_GUARDED_BY(op_mutex_);
};
} // namespace cloud_kms::kmsp11
#endif // KMSP11_SESSION_H_