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(
const std::string&
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 void encrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const override
38 size_t total_len = blocks *
m_opts.block_size;
42 out, total_len, &out_len);
43 if(status != kCCSuccess)
45 throw CommonCrypto_Error(
"CCCryptorUpdate encrypt", status);
49 void decrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const override
52 size_t total_len = blocks *
m_opts.block_size;
56 out, total_len, &out_len);
57 if(status != kCCSuccess)
59 throw CommonCrypto_Error(
"CCCryptorUpdate decrypt", status);
63 void key_schedule(
const uint8_t key[],
size_t key_len)
override;
73CommonCrypto_BlockCipher::CommonCrypto_BlockCipher(
const std::string& algo_name,
74 const CommonCryptor_Opts& opts) :
81CommonCrypto_BlockCipher::~CommonCrypto_BlockCipher()
96void CommonCrypto_BlockCipher::key_schedule(
const uint8_t key[],
size_t length)
98 secure_vector<uint8_t> full_key(key, key + length);
104 status = CCCryptorCreate(kCCEncrypt,
m_opts.algo, kCCOptionECBMode,
105 full_key.data(), full_key.size(),
nullptr, &
m_encrypt);
106 if(status != kCCSuccess)
108 throw CommonCrypto_Error(
"CCCryptorCreate encrypt", status);
110 status = CCCryptorCreate(kCCDecrypt,
m_opts.algo, kCCOptionECBMode,
111 full_key.data(), full_key.size(),
nullptr, &
m_decrypt);
112 if(status != kCCSuccess)
114 throw CommonCrypto_Error(
"CCCryptorCreate decrypt", status);
123std::unique_ptr<BlockCipher> CommonCrypto_BlockCipher::new_object()
const
131void CommonCrypto_BlockCipher::clear()
149std::unique_ptr<BlockCipher>
156 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(const std::string &name)
CommonCryptor_Opts commoncrypto_opts_from_algo_name(const std::string &algo_name)
void commoncrypto_adjust_key_size(const uint8_t key[], size_t length, const CommonCryptor_Opts &opts, secure_vector< uint8_t > &full_key)