73std::unique_ptr<KDF>
KDF::create(std::string_view algo_spec, std::string_view provider) {
76#if defined(BOTAN_HAS_HKDF)
78 if(provider.empty() || provider ==
"base") {
79 return kdf_create_mac_or_hash<HKDF>(req.
arg(0));
84 if(provider.empty() || provider ==
"base") {
85 return kdf_create_mac_or_hash<HKDF_Extract>(req.
arg(0));
90 if(provider.empty() || provider ==
"base") {
91 return kdf_create_mac_or_hash<HKDF_Expand>(req.
arg(0));
96#if defined(BOTAN_HAS_KDF2)
98 if(provider.empty() || provider ==
"base") {
100 return std::make_unique<KDF2>(std::move(hash));
106#if defined(BOTAN_HAS_KDF1_18033)
108 if(provider.empty() || provider ==
"base") {
110 return std::make_unique<KDF1_18033>(std::move(hash));
116#if defined(BOTAN_HAS_KDF1)
118 if(provider.empty() || provider ==
"base") {
120 return std::make_unique<KDF1>(std::move(hash));
126#if defined(BOTAN_HAS_TLS_V12_PRF)
128 if(provider.empty() || provider ==
"base") {
129 return kdf_create_mac_or_hash<TLS_12_PRF>(req.
arg(0));
134#if defined(BOTAN_HAS_X942_PRF)
136 if(provider.empty() || provider ==
"base") {
137 return std::make_unique<X942_PRF>(req.
arg(0));
142#if defined(BOTAN_HAS_SP800_108)
144 if(provider.empty() || provider ==
"base") {
145 return kdf_create_mac_or_hash<SP800_108_Counter>(
151 if(provider.empty() || provider ==
"base") {
152 return kdf_create_mac_or_hash<SP800_108_Feedback>(
158 if(provider.empty() || provider ==
"base") {
159 return kdf_create_mac_or_hash<SP800_108_Pipeline>(
165#if defined(BOTAN_HAS_SP800_56A)
168 return std::make_unique<SP800_56C_One_Step_Hash>(std::move(hash));
170 if(req.
arg(0) ==
"KMAC-128") {
171 return std::make_unique<SP800_56C_One_Step_KMAC128>();
173 if(req.
arg(0) ==
"KMAC-256") {
174 return std::make_unique<SP800_56C_One_Step_KMAC256>();
177 return std::make_unique<SP800_56C_One_Step_HMAC>(std::move(mac));
182#if defined(BOTAN_HAS_SP800_56C)
184 std::unique_ptr<KDF> exp(kdf_create_mac_or_hash<SP800_108_Feedback>(req.
arg(0), 32, 32));
187 return std::make_unique<SP800_56C_Two_Step>(std::move(mac), std::move(exp));
191 return std::make_unique<SP800_56C_Two_Step>(std::move(mac), std::move(exp));
void kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const