Botan 3.11.0
Crypto and TLS for C&
ffi_keywrap.cpp
Go to the documentation of this file.
1/*
2* (C) 2017 Ribose Inc
3* 2023 Jack Lloyd
4*
5* Botan is released under the Simplified BSD License (see license.txt)
6*/
7
8#include <botan/ffi.h>
9
10#include <botan/assert.h>
11#include <botan/internal/ffi_util.h>
12
13#if defined(BOTAN_HAS_NIST_KEYWRAP)
14 #include <botan/block_cipher.h>
15 #include <botan/nist_keywrap.h>
16#endif
17
18extern "C" {
19
20using namespace Botan_FFI;
21
22int botan_nist_kw_enc(const char* cipher_algo,
23 int padded,
24 const uint8_t key[],
25 size_t key_len,
26 const uint8_t kek[],
27 size_t kek_len,
28 uint8_t wrapped_key[],
29 size_t* wrapped_key_len) {
30#if defined(BOTAN_HAS_NIST_KEYWRAP)
31 return ffi_guard_thunk(__func__, [=]() -> int {
32 if(padded != 0 && padded != 1) {
34 }
35 auto bc = Botan::BlockCipher::create_or_throw(cipher_algo);
36 bc->set_key(kek, kek_len);
37
38 std::vector<uint8_t> output;
39
40 if(padded == 0) {
41 output = Botan::nist_key_wrap(key, key_len, *bc);
42 } else {
43 output = Botan::nist_key_wrap_padded(key, key_len, *bc);
44 }
45
46 return write_vec_output(wrapped_key, wrapped_key_len, output);
47 });
48#else
49 BOTAN_UNUSED(cipher_algo, padded, key, key_len, kek, kek_len, wrapped_key, wrapped_key_len);
51#endif
52}
53
54int botan_nist_kw_dec(const char* cipher_algo,
55 int padded,
56 const uint8_t wrapped_key[],
57 size_t wrapped_key_len,
58 const uint8_t kek[],
59 size_t kek_len,
60 uint8_t key[],
61 size_t* key_len) {
62#if defined(BOTAN_HAS_NIST_KEYWRAP)
63 return ffi_guard_thunk(__func__, [=]() -> int {
64 if(padded != 0 && padded != 1) {
66 }
67
68 auto bc = Botan::BlockCipher::create_or_throw(cipher_algo);
69 bc->set_key(kek, kek_len);
70
72
73 if(padded == 0) {
74 output = Botan::nist_key_unwrap(wrapped_key, wrapped_key_len, *bc);
75 } else {
76 output = Botan::nist_key_unwrap_padded(wrapped_key, wrapped_key_len, *bc);
77 }
78
79 return write_vec_output(key, key_len, output);
80 });
81#else
82 BOTAN_UNUSED(cipher_algo, padded, key, key_len, kek, kek_len, wrapped_key, wrapped_key_len);
84#endif
85}
86
87int botan_key_wrap3394(const uint8_t key[],
88 size_t key_len,
89 const uint8_t kek[],
90 size_t kek_len,
91 uint8_t wrapped_key[],
92 size_t* wrapped_key_len) {
93 const std::string cipher_name = "AES-" + std::to_string(8 * kek_len);
94
95 return botan_nist_kw_enc(cipher_name.c_str(), 0, key, key_len, kek, kek_len, wrapped_key, wrapped_key_len);
96}
97
98int botan_key_unwrap3394(const uint8_t wrapped_key[],
99 size_t wrapped_key_len,
100 const uint8_t kek[],
101 size_t kek_len,
102 uint8_t key[],
103 size_t* key_len) {
104 const std::string cipher_name = "AES-" + std::to_string(8 * kek_len);
105
106 return botan_nist_kw_dec(cipher_name.c_str(), 0, wrapped_key, wrapped_key_len, kek, kek_len, key, key_len);
107}
108}
#define BOTAN_UNUSED
Definition assert.h:144
static std::unique_ptr< BlockCipher > create_or_throw(std::string_view algo_spec, std::string_view provider="")
@ BOTAN_FFI_ERROR_NOT_IMPLEMENTED
Definition ffi.h:140
int botan_nist_kw_enc(const char *cipher_algo, int padded, const uint8_t key[], size_t key_len, const uint8_t kek[], size_t kek_len, uint8_t wrapped_key[], size_t *wrapped_key_len)
int botan_key_unwrap3394(const uint8_t wrapped_key[], size_t wrapped_key_len, const uint8_t kek[], size_t kek_len, uint8_t key[], size_t *key_len)
int botan_key_wrap3394(const uint8_t key[], size_t key_len, const uint8_t kek[], size_t kek_len, uint8_t wrapped_key[], size_t *wrapped_key_len)
int botan_nist_kw_dec(const char *cipher_algo, int padded, const uint8_t wrapped_key[], size_t wrapped_key_len, const uint8_t kek[], size_t kek_len, uint8_t key[], size_t *key_len)
int ffi_guard_thunk(const char *func_name, T thunk)
Definition ffi_util.h:95
int write_vec_output(uint8_t out[], size_t *out_len, std::span< const uint8_t > buf)
Definition ffi_util.h:261
std::vector< uint8_t > nist_key_wrap(const uint8_t input[], size_t input_len, const BlockCipher &bc)
std::vector< uint8_t > nist_key_wrap_padded(const uint8_t input[], size_t input_len, const BlockCipher &bc)
secure_vector< uint8_t > nist_key_unwrap_padded(const uint8_t input[], size_t input_len, const BlockCipher &bc)
std::vector< T, secure_allocator< T > > secure_vector
Definition secmem.h:68
secure_vector< uint8_t > nist_key_unwrap(const uint8_t input[], size_t input_len, const BlockCipher &bc)