10 #include <botan/block_cipher.h>
11 #include <botan/internal/commoncrypto.h>
12 #include <CommonCrypto/CommonCrypto.h>
20 class CommonCrypto_BlockCipher
final :
public BlockCipher
23 CommonCrypto_BlockCipher(
const std::string&
name,
const CommonCryptor_Opts& opts);
25 ~CommonCrypto_BlockCipher();
27 void clear()
override;
28 std::string provider()
const override {
return "commoncrypto"; }
30 BlockCipher* clone()
const override;
32 size_t block_size()
const override {
return m_opts.block_size; }
34 Key_Length_Specification key_spec()
const override {
return m_opts.key_spec; }
36 void encrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const override
39 size_t total_len = blocks *
m_opts.block_size;
42 CCCryptorStatus status = CCCryptorUpdate(
m_encrypt, in, total_len,
43 out, total_len, &out_len);
44 if(status != kCCSuccess)
46 throw CommonCrypto_Error(
"CCCryptorUpdate encrypt", status);
50 void decrypt_n(
const uint8_t in[], uint8_t out[],
size_t blocks)
const override
53 size_t total_len = blocks *
m_opts.block_size;
56 CCCryptorStatus status = CCCryptorUpdate(
m_decrypt, in, total_len,
57 out, total_len, &out_len);
58 if(status != kCCSuccess)
60 throw CommonCrypto_Error(
"CCCryptorUpdate decrypt", status);
64 void key_schedule(
const uint8_t key[],
size_t key_len)
override;
74 CommonCrypto_BlockCipher::CommonCrypto_BlockCipher(
const std::string& algo_name,
75 const CommonCryptor_Opts& opts) :
82 CommonCrypto_BlockCipher::~CommonCrypto_BlockCipher()
97 void CommonCrypto_BlockCipher::key_schedule(
const uint8_t key[],
size_t length)
99 secure_vector<uint8_t> full_key(key, key + length);
103 CCCryptorStatus status;
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);
123 BlockCipher* CommonCrypto_BlockCipher::clone()
const
131 void CommonCrypto_BlockCipher::clear()
137 std::unique_ptr<BlockCipher>
144 return std::unique_ptr<BlockCipher>(
new CommonCrypto_BlockCipher(name, opts));
CommonCryptor_Opts commoncrypto_opts_from_algo(const std::string &algo)
std::unique_ptr< BlockCipher > make_commoncrypto_block_cipher(const std::string &name)
int(* final)(unsigned char *, CTX *)
CommonCryptor_Opts m_opts
std::string m_cipher_name
void commoncrypto_adjust_key_size(const uint8_t key[], size_t length, const CommonCryptor_Opts &opts, secure_vector< uint8_t > &full_key)