Botan  2.7.0
Crypto and TLS for C++11
ffi_pk_op.cpp
Go to the documentation of this file.
1 /*
2 * (C) 2015,2017 Jack Lloyd
3 *
4 * Botan is released under the Simplified BSD License (see license.txt)
5 */
6 
7 #include <botan/ffi.h>
8 #include <botan/internal/ffi_util.h>
9 #include <botan/internal/ffi_pkey.h>
10 #include <botan/internal/ffi_rng.h>
11 #include <botan/pubkey.h>
12 
13 extern "C" {
14 
15 using namespace Botan_FFI;
16 
17 BOTAN_FFI_DECLARE_STRUCT(botan_pk_op_encrypt_struct, Botan::PK_Encryptor, 0x891F3FC3);
18 BOTAN_FFI_DECLARE_STRUCT(botan_pk_op_decrypt_struct, Botan::PK_Decryptor, 0x912F3C37);
19 BOTAN_FFI_DECLARE_STRUCT(botan_pk_op_sign_struct, Botan::PK_Signer, 0x1AF0C39F);
20 BOTAN_FFI_DECLARE_STRUCT(botan_pk_op_verify_struct, Botan::PK_Verifier, 0x2B91F936);
21 BOTAN_FFI_DECLARE_STRUCT(botan_pk_op_ka_struct, Botan::PK_Key_Agreement, 0x2939CAB1);
22 
24  botan_pubkey_t key_obj,
25  const char* padding,
26  uint32_t flags)
27  {
28  return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int {
30 
31  *op = nullptr;
32 
33  if(flags != 0)
35 
36  std::unique_ptr<Botan::PK_Encryptor> pk(new Botan::PK_Encryptor_EME(safe_get(key_obj), Botan::system_rng(), padding));
37  *op = new botan_pk_op_encrypt_struct(pk.release());
38  return BOTAN_FFI_SUCCESS;
39  });
40  }
41 
43  {
44  return BOTAN_FFI_CHECKED_DELETE(op);
45  }
46 
48  botan_rng_t rng_obj,
49  uint8_t out[], size_t* out_len,
50  const uint8_t plaintext[], size_t plaintext_len)
51  {
52  return BOTAN_FFI_DO(Botan::PK_Encryptor, op, o, {
53  return write_vec_output(out, out_len, o.encrypt(plaintext, plaintext_len, safe_get(rng_obj)));
54  });
55  }
56 
57 /*
58 * Public Key Decryption
59 */
61  botan_privkey_t key_obj,
62  const char* padding,
63  uint32_t flags)
64  {
65  return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int {
67 
68  *op = nullptr;
69 
70  if(flags != 0)
72 
73  std::unique_ptr<Botan::PK_Decryptor> pk(new Botan::PK_Decryptor_EME(safe_get(key_obj), Botan::system_rng(), padding));
74  *op = new botan_pk_op_decrypt_struct(pk.release());
75  return BOTAN_FFI_SUCCESS;
76  });
77  }
78 
80  {
81  return BOTAN_FFI_CHECKED_DELETE(op);
82  }
83 
85  uint8_t out[], size_t* out_len,
86  const uint8_t ciphertext[], size_t ciphertext_len)
87  {
88  return BOTAN_FFI_DO(Botan::PK_Decryptor, op, o, {
89  return write_vec_output(out, out_len, o.decrypt(ciphertext, ciphertext_len));
90  });
91  }
92 
93 /*
94 * Signature Generation
95 */
97  botan_privkey_t key_obj,
98  const char* hash,
99  uint32_t flags)
100  {
101  return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int {
103 
104  *op = nullptr;
105 
106  if(flags != 0)
108 
109  std::unique_ptr<Botan::PK_Signer> pk(new Botan::PK_Signer(safe_get(key_obj),Botan::system_rng(), hash));
110  *op = new botan_pk_op_sign_struct(pk.release());
111  return BOTAN_FFI_SUCCESS;
112  });
113  }
114 
116  {
117  return BOTAN_FFI_CHECKED_DELETE(op);
118  }
119 
120 int botan_pk_op_sign_update(botan_pk_op_sign_t op, const uint8_t in[], size_t in_len)
121  {
122  return BOTAN_FFI_DO(Botan::PK_Signer, op, o, { o.update(in, in_len); });
123  }
124 
125 int botan_pk_op_sign_finish(botan_pk_op_sign_t op, botan_rng_t rng_obj, uint8_t out[], size_t* out_len)
126  {
127  return BOTAN_FFI_DO(Botan::PK_Signer, op, o, {
128  return write_vec_output(out, out_len, o.signature(safe_get(rng_obj)));
129  });
130  }
131 
133  botan_pubkey_t key_obj,
134  const char* hash,
135  uint32_t flags)
136  {
137  return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int {
139 
140  if(flags != 0)
142 
143  std::unique_ptr<Botan::PK_Verifier> pk(new Botan::PK_Verifier(safe_get(key_obj), hash));
144  *op = new botan_pk_op_verify_struct(pk.release());
145  return BOTAN_FFI_SUCCESS;
146  });
147  }
148 
150  {
151  return BOTAN_FFI_CHECKED_DELETE(op);
152  }
153 
154 int botan_pk_op_verify_update(botan_pk_op_verify_t op, const uint8_t in[], size_t in_len)
155  {
156  return BOTAN_FFI_DO(Botan::PK_Verifier, op, o, { o.update(in, in_len); });
157  }
158 
159 int botan_pk_op_verify_finish(botan_pk_op_verify_t op, const uint8_t sig[], size_t sig_len)
160  {
161  return BOTAN_FFI_DO(Botan::PK_Verifier, op, o, {
162  const bool legit = o.check_signature(sig, sig_len);
163 
164  if(legit)
165  return BOTAN_FFI_SUCCESS;
166  else
168  });
169  }
170 
172  botan_privkey_t key_obj,
173  const char* kdf,
174  uint32_t flags)
175  {
176  return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int {
178 
179  *op = nullptr;
180 
181  if(flags != 0)
183 
184  std::unique_ptr<Botan::PK_Key_Agreement> pk(new Botan::PK_Key_Agreement(safe_get(key_obj), Botan::system_rng(), kdf));
185  *op = new botan_pk_op_ka_struct(pk.release());
186  return BOTAN_FFI_SUCCESS;
187  });
188  }
189 
191  {
192  return BOTAN_FFI_CHECKED_DELETE(op);
193  }
194 
196  uint8_t out[], size_t* out_len)
197  {
198  return BOTAN_FFI_DO(Botan::Private_Key, key, k, {
199  if(auto kak = dynamic_cast<const Botan::PK_Key_Agreement_Key*>(&k))
200  return write_vec_output(out, out_len, kak->public_value());
202  });
203  }
204 
206  uint8_t out[], size_t* out_len,
207  const uint8_t other_key[], size_t other_key_len,
208  const uint8_t salt[], size_t salt_len)
209  {
210  return BOTAN_FFI_DO(Botan::PK_Key_Agreement, op, o, {
211  auto k = o.derive_key(*out_len, other_key, other_key_len, salt, salt_len).bits_of();
212  return write_vec_output(out, out_len, k);
213  });
214  }
215 
216 }
int botan_pk_op_sign_destroy(botan_pk_op_sign_t op)
Definition: ffi_pk_op.cpp:115
RandomNumberGenerator & system_rng()
Definition: system_rng.cpp:225
int botan_pk_op_sign_finish(botan_pk_op_sign_t op, botan_rng_t rng_obj, uint8_t out[], size_t *out_len)
Definition: ffi_pk_op.cpp:125
int botan_pk_op_key_agreement_destroy(botan_pk_op_ka_t op)
Definition: ffi_pk_op.cpp:190
struct botan_pk_op_encrypt_struct * botan_pk_op_encrypt_t
Definition: ffi.h:1014
int botan_pk_op_key_agreement_create(botan_pk_op_ka_t *op, botan_privkey_t key_obj, const char *kdf, uint32_t flags)
Definition: ffi_pk_op.cpp:171
int botan_pk_op_key_agreement(botan_pk_op_ka_t op, uint8_t out[], size_t *out_len, const uint8_t other_key[], size_t other_key_len, const uint8_t salt[], size_t salt_len)
Definition: ffi_pk_op.cpp:205
int ffi_guard_thunk(const char *func_name, Thunk thunk)
Definition: ffi_util.h:64
struct botan_pk_op_sign_struct * botan_pk_op_sign_t
Definition: ffi.h:1046
Flags flags(Flag flags)
Definition: p11.h:858
BOTAN_FFI_DECLARE_STRUCT(botan_pk_op_encrypt_struct, Botan::PK_Encryptor, 0x891F3FC3)
int write_vec_output(uint8_t out[], size_t *out_len, const std::vector< uint8_t, Alloc > &buf)
Definition: ffi_util.h:146
void update(uint8_t in)
Definition: pubkey.h:335
int botan_pk_op_sign_update(botan_pk_op_sign_t op, const uint8_t in[], size_t in_len)
Definition: ffi_pk_op.cpp:120
int botan_pk_op_key_agreement_export_public(botan_privkey_t key, uint8_t out[], size_t *out_len)
Definition: ffi_pk_op.cpp:195
int botan_pk_op_decrypt_create(botan_pk_op_decrypt_t *op, botan_privkey_t key_obj, const char *padding, uint32_t flags)
Definition: ffi_pk_op.cpp:60
int botan_pk_op_verify_create(botan_pk_op_verify_t *op, botan_pubkey_t key_obj, const char *hash, uint32_t flags)
Definition: ffi_pk_op.cpp:132
struct botan_pk_op_decrypt_struct * botan_pk_op_decrypt_t
Definition: ffi.h:1031
int botan_pk_op_verify_finish(botan_pk_op_verify_t op, const uint8_t sig[], size_t sig_len)
Definition: ffi_pk_op.cpp:159
#define BOTAN_ASSERT_NONNULL(ptr)
Definition: assert.h:95
int botan_pk_op_decrypt(botan_pk_op_decrypt_t op, uint8_t out[], size_t *out_len, const uint8_t ciphertext[], size_t ciphertext_len)
Definition: ffi_pk_op.cpp:84
void update(uint8_t in)
Definition: pubkey.h:238
int botan_pk_op_verify_update(botan_pk_op_verify_t op, const uint8_t in[], size_t in_len)
Definition: ffi_pk_op.cpp:154
size_t salt_len
Definition: x509_obj.cpp:26
SymmetricKey derive_key(size_t key_len, const uint8_t in[], size_t in_len, const uint8_t params[], size_t params_len) const
Definition: pubkey.cpp:203
struct botan_pk_op_verify_struct * botan_pk_op_verify_t
Definition: ffi.h:1065
#define BOTAN_FFI_CHECKED_DELETE(o)
Definition: ffi_util.h:126
struct botan_privkey_struct * botan_privkey_t
Definition: ffi.h:663
T & safe_get(botan_struct< T, M > *p)
Definition: ffi_util.h:49
int botan_pk_op_encrypt_create(botan_pk_op_encrypt_t *op, botan_pubkey_t key_obj, const char *padding, uint32_t flags)
Definition: ffi_pk_op.cpp:23
bool check_signature(const uint8_t sig[], size_t length)
Definition: pubkey.cpp:305
int botan_pk_op_decrypt_destroy(botan_pk_op_decrypt_t op)
Definition: ffi_pk_op.cpp:79
#define BOTAN_CURRENT_FUNCTION
Definition: compiler.h:143
int botan_pk_op_sign_create(botan_pk_op_sign_t *op, botan_privkey_t key_obj, const char *hash, uint32_t flags)
Definition: ffi_pk_op.cpp:96
struct botan_pk_op_ka_struct * botan_pk_op_ka_t
Definition: ffi.h:1081
int botan_pk_op_encrypt_destroy(botan_pk_op_encrypt_t op)
Definition: ffi_pk_op.cpp:42
secure_vector< uint8_t > bits_of() const
Definition: symkey.h:31
struct botan_pubkey_struct * botan_pubkey_t
Definition: ffi.h:791
#define BOTAN_FFI_DO(T, obj, param, block)
Definition: ffi_util.h:98
int botan_pk_op_verify_destroy(botan_pk_op_verify_t op)
Definition: ffi_pk_op.cpp:149
MechanismType hash
struct botan_rng_struct * botan_rng_t
Definition: ffi.h:182
int botan_pk_op_encrypt(botan_pk_op_encrypt_t op, botan_rng_t rng_obj, uint8_t out[], size_t *out_len, const uint8_t plaintext[], size_t plaintext_len)
Definition: ffi_pk_op.cpp:47