• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

randombit / botan / 5230455705

10 Jun 2023 02:30PM UTC coverage: 91.715% (-0.03%) from 91.746%
5230455705

push

github

randombit
Merge GH #3584 Change clang-format AllowShortFunctionsOnASingleLine config from All to Inline

77182 of 84154 relevant lines covered (91.72%)

11975295.43 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

54.35
/src/lib/pbkdf/pbkdf.cpp
1
/*
2
* PBKDF
3
* (C) 2012 Jack Lloyd
4
*
5
* Botan is released under the Simplified BSD License (see license.txt)
6
*/
7

8
#include <botan/pbkdf.h>
9

10
#include <botan/exceptn.h>
11
#include <botan/internal/scan_name.h>
12

13
#if defined(BOTAN_HAS_PBKDF2)
14
   #include <botan/pbkdf2.h>
15
#endif
16

17
#if defined(BOTAN_HAS_PGP_S2K)
18
   #include <botan/pgp_s2k.h>
19
#endif
20

21
namespace Botan {
22

23
std::unique_ptr<PBKDF> PBKDF::create(std::string_view algo_spec, std::string_view provider) {
30✔
24
   const SCAN_Name req(algo_spec);
30✔
25

26
#if defined(BOTAN_HAS_PBKDF2)
27
   if(req.algo_name() == "PBKDF2") {
60✔
28
      // TODO OpenSSL
29

30
      if(provider.empty() || provider == "base") {
17✔
31
         if(auto mac = MessageAuthenticationCode::create("HMAC(" + req.arg(0) + ")")) {
34✔
32
            return std::make_unique<PKCS5_PBKDF2>(std::move(mac));
2✔
33
         }
2✔
34

35
         if(auto mac = MessageAuthenticationCode::create(req.arg(0))) {
30✔
36
            return std::make_unique<PKCS5_PBKDF2>(std::move(mac));
15✔
37
         }
15✔
38
      }
39

40
      return nullptr;
×
41
   }
42
#endif
43

44
#if defined(BOTAN_HAS_PGP_S2K)
45
   if(req.algo_name() == "OpenPGP-S2K" && req.arg_count() == 1) {
39✔
46
      if(auto hash = HashFunction::create(req.arg(0))) {
26✔
47
         return std::make_unique<OpenPGP_S2K>(std::move(hash));
13✔
48
      }
13✔
49
   }
50
#endif
51

52
   BOTAN_UNUSED(req);
×
53
   BOTAN_UNUSED(provider);
×
54

55
   return nullptr;
×
56
}
30✔
57

58
//static
59
std::unique_ptr<PBKDF> PBKDF::create_or_throw(std::string_view algo, std::string_view provider) {
×
60
   if(auto pbkdf = PBKDF::create(algo, provider)) {
×
61
      return pbkdf;
×
62
   }
×
63
   throw Lookup_Error("PBKDF", algo, provider);
×
64
}
65

66
std::vector<std::string> PBKDF::providers(std::string_view algo_spec) {
×
67
   return probe_providers_of<PBKDF>(algo_spec);
×
68
}
69

70
void PBKDF::pbkdf_timed(uint8_t out[],
×
71
                        size_t out_len,
72
                        std::string_view passphrase,
73
                        const uint8_t salt[],
74
                        size_t salt_len,
75
                        std::chrono::milliseconds msec,
76
                        size_t& iterations) const {
77
   iterations = pbkdf(out, out_len, passphrase, salt, salt_len, 0, msec);
×
78
}
×
79

80
void PBKDF::pbkdf_iterations(uint8_t out[],
79✔
81
                             size_t out_len,
82
                             std::string_view passphrase,
83
                             const uint8_t salt[],
84
                             size_t salt_len,
85
                             size_t iterations) const {
86
   if(iterations == 0) {
79✔
87
      throw Invalid_Argument(name() + ": Invalid iteration count");
×
88
   }
89

90
   const size_t iterations_run =
79✔
91
      pbkdf(out, out_len, passphrase, salt, salt_len, iterations, std::chrono::milliseconds(0));
79✔
92
   BOTAN_ASSERT_EQUAL(iterations, iterations_run, "Expected PBKDF iterations");
79✔
93
}
79✔
94

95
secure_vector<uint8_t> PBKDF::pbkdf_iterations(
79✔
96
   size_t out_len, std::string_view passphrase, const uint8_t salt[], size_t salt_len, size_t iterations) const {
97
   secure_vector<uint8_t> out(out_len);
79✔
98
   pbkdf_iterations(out.data(), out_len, passphrase, salt, salt_len, iterations);
79✔
99
   return out;
79✔
100
}
×
101

102
secure_vector<uint8_t> PBKDF::pbkdf_timed(size_t out_len,
×
103
                                          std::string_view passphrase,
104
                                          const uint8_t salt[],
105
                                          size_t salt_len,
106
                                          std::chrono::milliseconds msec,
107
                                          size_t& iterations) const {
108
   secure_vector<uint8_t> out(out_len);
×
109
   pbkdf_timed(out.data(), out_len, passphrase, salt, salt_len, msec, iterations);
×
110
   return out;
×
111
}
×
112

113
}  // namespace Botan
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc