#ifndef CIPHER_STORE_H
#define CIPHER_STORE_H
#include "object_store.h"
#include "sa_types.h"
#include "symmetric.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct cipher_s cipher_t;
typedef object_store_t cipher_store_t;
sa_cipher_algorithm cipher_get_algorithm(const cipher_t* cipher);
sa_cipher_mode cipher_get_mode(const cipher_t* cipher);
symmetric_context_t* cipher_get_symmetric_context(const cipher_t* cipher);
const stored_key_t* cipher_get_stored_key(const cipher_t* cipher);
size_t cipher_get_key_size(const cipher_t* cipher);
const sa_rights* cipher_get_key_rights(const cipher_t* cipher);
sa_status cipher_set_oaep_parameters(
cipher_t* cipher,
sa_digest_algorithm digest_algorithm,
sa_digest_algorithm mgf1_digest_algorithm,
void* label,
size_t label_length);
sa_status cipher_get_oaep_parameters(
const cipher_t* cipher,
sa_digest_algorithm* digest_algorithm,
sa_digest_algorithm* mgf1_digest_algorithm,
const void** label,
size_t* label_length);
cipher_store_t* cipher_store_init(size_t size);
void cipher_store_shutdown(cipher_store_t* store);
sa_status cipher_store_add_symmetric_context(
sa_crypto_cipher_context* context,
cipher_store_t* store,
sa_cipher_algorithm cipher_algorithm,
sa_cipher_mode cipher_mode,
symmetric_context_t* symmetric_context,
stored_key_t* stored_key,
const sa_uuid* caller_uuid);
sa_status cipher_store_add_asymmetric_key(
sa_crypto_cipher_context* context,
cipher_store_t* store,
sa_cipher_algorithm cipher_algorithm,
sa_cipher_mode cipher_mode,
stored_key_t* stored_key,
const sa_uuid* caller_uuid);
sa_status cipher_store_remove(
cipher_store_t* store,
sa_crypto_cipher_context context,
const sa_uuid* caller_uuid);
sa_status cipher_store_acquire_exclusive(
cipher_t** cipher,
cipher_store_t* store,
sa_crypto_cipher_context context,
const sa_uuid* caller_uuid);
sa_status cipher_store_release_exclusive(
cipher_store_t* store,
sa_crypto_cipher_context context,
cipher_t* cipher,
const sa_uuid* caller_uuid);
#ifdef __cplusplus
}
#endif
#endif