8#include <botan/internal/commoncrypto.h>
9#include <botan/internal/commoncrypto_utils.h>
11#include <botan/block_cipher.h>
13#include <CommonCrypto/CommonCrypto.h>
19class CommonCrypto_BlockCipher
final :
public BlockCipher
22 CommonCrypto_BlockCipher(std::string_view
name,
const CommonCryptor_Opts& opts);
24 ~CommonCrypto_BlockCipher();
26 void clear()
override;
27 std::string provider()
const override {
return "commoncrypto"; }
29 std::unique_ptr<BlockCipher> new_object()
const override;
31 size_t block_size()
const override {
return m_opts.block_size; }
33 Key_Length_Specification key_spec()
const override {
return m_opts.key_spec; }
35 bool has_keying_material()
const override {
return m_key_set; }
37 void encrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const override
39 assert_key_material_set();
40 size_t total_len = blocks *
m_opts.block_size;
44 out, total_len, &out_len);
45 if(status != kCCSuccess)
47 throw CommonCrypto_Error(
"CCCryptorUpdate encrypt", status);
51 void decrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const override
53 assert_key_material_set();
54 size_t total_len = blocks *
m_opts.block_size;
58 out, total_len, &out_len);
59 if(status != kCCSuccess)
61 throw CommonCrypto_Error(
"CCCryptorUpdate decrypt", status);
65 void key_schedule(
const uint8_t key[],
size_t key_len)
override;
75CommonCrypto_BlockCipher::CommonCrypto_BlockCipher(std::string_view algo_name,
76 const CommonCryptor_Opts& opts) :
83CommonCrypto_BlockCipher::~CommonCrypto_BlockCipher()
98void CommonCrypto_BlockCipher::key_schedule(
const uint8_t key[],
size_t length)
100 secure_vector<uint8_t> full_key(key, key + length);
106 status = CCCryptorCreate(kCCEncrypt,
m_opts.algo, kCCOptionECBMode,
107 full_key.data(), full_key.size(),
nullptr, &
m_encrypt);
108 if(status != kCCSuccess)
110 throw CommonCrypto_Error(
"CCCryptorCreate encrypt", status);
112 status = CCCryptorCreate(kCCDecrypt,
m_opts.algo, kCCOptionECBMode,
113 full_key.data(), full_key.size(),
nullptr, &
m_decrypt);
114 if(status != kCCSuccess)
116 throw CommonCrypto_Error(
"CCCryptorCreate decrypt", status);
125std::unique_ptr<BlockCipher> CommonCrypto_BlockCipher::new_object()
const
133void CommonCrypto_BlockCipher::clear()
151std::unique_ptr<BlockCipher>
157 return std::make_unique<CommonCrypto_BlockCipher>(
name, opts);
CommonCryptor_Opts m_opts
std::string m_cipher_name
int(* final)(unsigned char *, CTX *)
std::unique_ptr< BlockCipher > make_commoncrypto_block_cipher(std::string_view name)
void commoncrypto_adjust_key_size(const uint8_t key[], size_t length, const CommonCryptor_Opts &opts, secure_vector< uint8_t > &full_key)
CommonCryptor_Opts commoncrypto_opts_from_algo_name(std::string_view algo_name)