Botan 2.19.5 Crypto and TLS for C&

ffi_fpe.cpp
Go to the documentation of this file.
1/*
2* (C) 2018 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_mp.h>
10#include <memory>
11
12#if defined(BOTAN_HAS_FPE_FE1)
13 #include <botan/fpe_fe1.h>
14#endif
15
16 extern "C" {
17
18 using namespace Botan_FFI;
19
20#if defined(BOTAN_HAS_FPE_FE1)
21
22 BOTAN_FFI_DECLARE_STRUCT(botan_fpe_struct, Botan::FPE_FE1, 0xD49FB820);
23
24#endif
25
26 int botan_fpe_fe1_init(botan_fpe_t* fpe, botan_mp_t n,
27 const uint8_t key[], size_t key_len,
28 size_t rounds, uint32_t flags)
29 {
30#if defined(BOTAN_HAS_FPE_FE1)
31
32 return ffi_guard_thunk(__func__, [=]() {
33
34 if(fpe == nullptr || key == nullptr)
35 return BOTAN_FFI_ERROR_NULL_POINTER;
36
37 *fpe = nullptr;
38
39 if(flags != 0 && flags != BOTAN_FPE_FLAG_FE1_COMPAT_MODE)
40 return BOTAN_FFI_ERROR_BAD_FLAG;
41
42 const bool compat_mode = (flags & BOTAN_FPE_FLAG_FE1_COMPAT_MODE);
43
44 std::unique_ptr<Botan::FPE_FE1> fpe_obj(
45 new Botan::FPE_FE1(safe_get(n), rounds, compat_mode));
46
47 fpe_obj->set_key(key, key_len);
48
49 *fpe = new botan_fpe_struct(fpe_obj.release());
50 return BOTAN_FFI_SUCCESS;
51 });
52#else
53 *fpe = nullptr;
54 return BOTAN_FFI_ERROR_NOT_IMPLEMENTED;
55#endif
56 }
57
58 int botan_fpe_destroy(botan_fpe_t fpe)
59 {
60#if defined(BOTAN_HAS_FPE_FE1)
61 return BOTAN_FFI_CHECKED_DELETE(fpe);
62#else
63 return BOTAN_FFI_ERROR_NOT_IMPLEMENTED;
64#endif
65 }
66
67 int botan_fpe_encrypt(botan_fpe_t fpe, botan_mp_t x, const uint8_t tweak[], size_t tweak_len)
68 {
69#if defined(BOTAN_HAS_FPE_FE1)
70 return ffi_guard_thunk(__func__, [=]() {
71 Botan::BigInt r = safe_get(fpe).encrypt(safe_get(x), tweak, tweak_len);
72 safe_get(x) = r;
73 return BOTAN_FFI_SUCCESS;
74 });
75#else
76 return BOTAN_FFI_ERROR_NOT_IMPLEMENTED;
77#endif
78 }
79
80 int botan_fpe_decrypt(botan_fpe_t fpe, botan_mp_t x, const uint8_t tweak[], size_t tweak_len)
81 {
82#if defined(BOTAN_HAS_FPE_FE1)
83 return ffi_guard_thunk(__func__, [=]() {
84 Botan::BigInt r = safe_get(fpe).decrypt(safe_get(x), tweak, tweak_len);
85 safe_get(x) = r;
86 return BOTAN_FFI_SUCCESS;
87 });
88
89#else
90 return BOTAN_FFI_ERROR_NOT_IMPLEMENTED;
91#endif
92 }
93
94}
Botan::BigInt
Definition: bigint.h:25
Botan::FPE_FE1
Definition: fpe_fe1.h:25
botan_mp_t
struct botan_mp_struct * botan_mp_t
Definition: ffi.h:765
BOTAN_FPE_FLAG_FE1_COMPAT_MODE
#define BOTAN_FPE_FLAG_FE1_COMPAT_MODE
Definition: ffi.h:1755
BOTAN_FFI_ERROR_NOT_IMPLEMENTED
@ BOTAN_FFI_ERROR_NOT_IMPLEMENTED
Definition: ffi.h:83
BOTAN_FFI_ERROR_BAD_FLAG
@ BOTAN_FFI_ERROR_BAD_FLAG
Definition: ffi.h:76
BOTAN_FFI_ERROR_NULL_POINTER
@ BOTAN_FFI_ERROR_NULL_POINTER
Definition: ffi.h:77
BOTAN_FFI_SUCCESS
@ BOTAN_FFI_SUCCESS
Definition: ffi.h:63
botan_fpe_t
struct botan_fpe_struct * botan_fpe_t
Definition: ffi.h:1753
botan_fpe_decrypt
int botan_fpe_decrypt(botan_fpe_t fpe, botan_mp_t x, const uint8_t tweak[], size_t tweak_len)
Definition: ffi_fpe.cpp:80
botan_fpe_destroy
int botan_fpe_destroy(botan_fpe_t fpe)
Definition: ffi_fpe.cpp:58
botan_fpe_encrypt
int botan_fpe_encrypt(botan_fpe_t fpe, botan_mp_t x, const uint8_t tweak[], size_t tweak_len)
Definition: ffi_fpe.cpp:67
botan_fpe_fe1_init
int botan_fpe_fe1_init(botan_fpe_t *fpe, botan_mp_t n, const uint8_t key[], size_t key_len, size_t rounds, uint32_t flags)
Definition: ffi_fpe.cpp:26
BOTAN_FFI_CHECKED_DELETE
#define BOTAN_FFI_CHECKED_DELETE(o)
Definition: ffi_util.h:129
BOTAN_FFI_DECLARE_STRUCT
#define BOTAN_FFI_DECLARE_STRUCT(NAME, TYPE, MAGIC)
Definition: ffi_util.h:53
Botan::PKCS11::flags
Flags flags(Flag flags)
Definition: p11.h:860
Botan_FFI
Definition: ffi.cpp:17
Botan_FFI::ffi_guard_thunk
int ffi_guard_thunk(const char *func_name, std::function< int()> thunk)
Definition: ffi.cpp:89
Botan_FFI::safe_get
T & safe_get(botan_struct< T, M > *p)
Definition: ffi_util.h:61