Botan 3.9.0
Crypto and TLS for C&
ffi_hotp.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
9#include <botan/internal/ffi_util.h>
10
11#if defined(BOTAN_HAS_HOTP)
12 #include <botan/otp.h>
13#endif
14
15extern "C" {
16
17using namespace Botan_FFI;
18
19#if defined(BOTAN_HAS_HOTP)
20
21BOTAN_FFI_DECLARE_STRUCT(botan_hotp_struct, Botan::HOTP, 0x89CBF191);
22
23#endif
24
25int botan_hotp_init(botan_hotp_t* hotp, const uint8_t key[], size_t key_len, const char* hash_algo, size_t digits) {
26 if(hotp == nullptr || key == nullptr || hash_algo == nullptr) {
28 }
29
30 *hotp = nullptr;
31
32#if defined(BOTAN_HAS_HOTP)
33 return ffi_guard_thunk(__func__, [=]() -> int {
34 auto otp = std::make_unique<Botan::HOTP>(key, key_len, hash_algo, digits);
35 return ffi_new_object(hotp, std::move(otp));
36 });
37#else
38 BOTAN_UNUSED(hotp, key, key_len, hash_algo, digits);
40#endif
41}
42
44#if defined(BOTAN_HAS_HOTP)
45 return BOTAN_FFI_CHECKED_DELETE(hotp);
46#else
47 BOTAN_UNUSED(hotp);
49#endif
50}
51
52int botan_hotp_generate(botan_hotp_t hotp, uint32_t* hotp_code, uint64_t hotp_counter) {
53#if defined(BOTAN_HAS_HOTP)
54 if(hotp == nullptr || hotp_code == nullptr) {
56 }
57
58 return BOTAN_FFI_VISIT(hotp, [=](auto& h) { *hotp_code = h.generate_hotp(hotp_counter); });
59
60#else
61 BOTAN_UNUSED(hotp, hotp_code, hotp_counter);
63#endif
64}
65
67 botan_hotp_t hotp, uint64_t* next_hotp_counter, uint32_t hotp_code, uint64_t hotp_counter, size_t resync_range) {
68#if defined(BOTAN_HAS_HOTP)
69 return BOTAN_FFI_VISIT(hotp, [=](auto& h) {
70 auto resp = h.verify_hotp(hotp_code, hotp_counter, resync_range);
71
72 if(next_hotp_counter) {
73 *next_hotp_counter = resp.second;
74 }
75
76 return (resp.first == true) ? BOTAN_FFI_SUCCESS : BOTAN_FFI_INVALID_VERIFIER;
77 });
78
79#else
80 BOTAN_UNUSED(hotp, next_hotp_counter, hotp_code, hotp_counter, resync_range);
82#endif
83}
84}
#define BOTAN_UNUSED
Definition assert.h:144
struct botan_hotp_struct * botan_hotp_t
Definition ffi.h:2285
@ BOTAN_FFI_ERROR_NOT_IMPLEMENTED
Definition ffi.h:138
@ BOTAN_FFI_INVALID_VERIFIER
Definition ffi.h:117
@ BOTAN_FFI_ERROR_NULL_POINTER
Definition ffi.h:132
@ BOTAN_FFI_SUCCESS
Definition ffi.h:115
int botan_hotp_generate(botan_hotp_t hotp, uint32_t *hotp_code, uint64_t hotp_counter)
Definition ffi_hotp.cpp:52
int botan_hotp_destroy(botan_hotp_t hotp)
Definition ffi_hotp.cpp:43
int botan_hotp_check(botan_hotp_t hotp, uint64_t *next_hotp_counter, uint32_t hotp_code, uint64_t hotp_counter, size_t resync_range)
Definition ffi_hotp.cpp:66
int botan_hotp_init(botan_hotp_t *hotp, const uint8_t key[], size_t key_len, const char *hash_algo, size_t digits)
Definition ffi_hotp.cpp:25
#define BOTAN_FFI_VISIT(obj, lambda)
Definition ffi_util.h:158
#define BOTAN_FFI_CHECKED_DELETE(o)
Definition ffi_util.h:185
#define BOTAN_FFI_DECLARE_STRUCT(NAME, TYPE, MAGIC)
Definition ffi_util.h:61
BOTAN_FFI_ERROR ffi_new_object(T *obj, Args &&... args)
Definition ffi_util.h:178
int ffi_guard_thunk(const char *func_name, T thunk)
Definition ffi_util.h:95