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

randombit / botan / 5079590438

25 May 2023 12:28PM UTC coverage: 92.228% (+0.5%) from 91.723%
5079590438

Pull #3502

github

Pull Request #3502: Apply clang-format to the codebase

75589 of 81959 relevant lines covered (92.23%)

12139530.51 hits per line

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

97.83
/src/lib/mac/mac.cpp
1
/*
2
* Message Authentication Code base class
3
* (C) 1999-2008 Jack Lloyd
4
*
5
* Botan is released under the Simplified BSD License (see license.txt)
6
*/
7

8
#include <botan/mac.h>
9

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

14
#if defined(BOTAN_HAS_CMAC)
15
   #include <botan/internal/cmac.h>
16
#endif
17

18
#if defined(BOTAN_HAS_GMAC)
19
   #include <botan/block_cipher.h>
20
   #include <botan/internal/gmac.h>
21
#endif
22

23
#if defined(BOTAN_HAS_HMAC)
24
   #include <botan/hash.h>
25
   #include <botan/internal/hmac.h>
26
#endif
27

28
#if defined(BOTAN_HAS_POLY1305)
29
   #include <botan/internal/poly1305.h>
30
#endif
31

32
#if defined(BOTAN_HAS_SIPHASH)
33
   #include <botan/internal/siphash.h>
34
#endif
35

36
#if defined(BOTAN_HAS_ANSI_X919_MAC)
37
   #include <botan/internal/x919_mac.h>
38
#endif
39

40
#if defined(BOTAN_HAS_BLAKE2BMAC)
41
   #include <botan/internal/blake2bmac.h>
42
#endif
43

44
namespace Botan {
45

46
std::unique_ptr<MessageAuthenticationCode> MessageAuthenticationCode::create(std::string_view algo_spec,
30,651✔
47
                                                                             std::string_view provider) {
48
   const SCAN_Name req(algo_spec);
30,651✔
49

50
#if defined(BOTAN_HAS_BLAKE2BMAC)
51
   if(req.algo_name() == "Blake2b" || req.algo_name() == "BLAKE2b") {
122,604✔
52
      return std::make_unique<BLAKE2bMAC>(req.arg_as_integer(0, 512));
546✔
53
   }
54
#endif
55

56
#if defined(BOTAN_HAS_GMAC)
57
   if(req.algo_name() == "GMAC" && req.arg_count() == 1) {
90,315✔
58
      if(provider.empty() || provider == "base") {
241✔
59
         if(auto bc = BlockCipher::create(req.arg(0)))
242✔
60
            return std::make_unique<GMAC>(std::move(bc));
121✔
61
      }
62
   }
63
#endif
64

65
#if defined(BOTAN_HAS_HMAC)
66
   if(req.algo_name() == "HMAC" && req.arg_count() == 1) {
89,952✔
67
      if(provider.empty() || provider == "base") {
16,225✔
68
         if(auto hash = HashFunction::create(req.arg(0)))
32,152✔
69
            return std::make_unique<HMAC>(std::move(hash));
16,076✔
70
      }
71
   }
72
#endif
73

74
#if defined(BOTAN_HAS_POLY1305)
75
   if(req.algo_name() == "Poly1305" && req.arg_count() == 0) {
45,942✔
76
      if(provider.empty() || provider == "base")
13,422✔
77
         return std::make_unique<Poly1305>();
13,266✔
78
   }
79
#endif
80

81
#if defined(BOTAN_HAS_SIPHASH)
82
   if(req.algo_name() == "SipHash") {
4,096✔
83
      if(provider.empty() || provider == "base") {
237✔
84
         return std::make_unique<SipHash>(req.arg_as_integer(0, 2), req.arg_as_integer(1, 4));
119✔
85
      }
86
   }
87
#endif
88

89
#if defined(BOTAN_HAS_CMAC)
90
   if((req.algo_name() == "CMAC" || req.algo_name() == "OMAC") && req.arg_count() == 1) {
6,780✔
91
      if(provider.empty() || provider == "base") {
544✔
92
         if(auto bc = BlockCipher::create(req.arg(0)))
936✔
93
            return std::make_unique<CMAC>(std::move(bc));
468✔
94
      }
95
   }
96
#endif
97

98
#if defined(BOTAN_HAS_ANSI_X919_MAC)
99
   if(req.algo_name() == "X9.19-MAC") {
2,922✔
100
      if(provider.empty() || provider == "base") {
24✔
101
         return std::make_unique<ANSI_X919_MAC>();
12✔
102
      }
103
   }
104
#endif
105

106
   BOTAN_UNUSED(req);
1,449✔
107
   BOTAN_UNUSED(provider);
1,449✔
108

109
   return nullptr;
1,449✔
110
}
30,651✔
111

112
std::vector<std::string> MessageAuthenticationCode::providers(std::string_view algo_spec) {
631✔
113
   return probe_providers_of<MessageAuthenticationCode>(algo_spec);
1,262✔
114
}
115

116
//static
117
std::unique_ptr<MessageAuthenticationCode> MessageAuthenticationCode::create_or_throw(std::string_view algo,
6,110✔
118
                                                                                      std::string_view provider) {
119
   if(auto mac = MessageAuthenticationCode::create(algo, provider)) {
6,110✔
120
      return mac;
6,109✔
121
   }
6,109✔
122
   throw Lookup_Error("MAC", algo, provider);
1✔
123
}
124

125
void MessageAuthenticationCode::start_msg(const uint8_t nonce[], size_t nonce_len) {
4,989✔
126
   BOTAN_UNUSED(nonce);
4,989✔
127
   if(nonce_len > 0)
4,989✔
128
      throw Invalid_IV_Length(name(), nonce_len);
×
129
}
4,989✔
130

131
/*
132
* Default (deterministic) MAC verification operation
133
*/
134
bool MessageAuthenticationCode::verify_mac_result(const uint8_t mac[], size_t length) {
1,733✔
135
   secure_vector<uint8_t> our_mac = final();
1,733✔
136

137
   if(our_mac.size() != length)
1,733✔
138
      return false;
139

140
   return constant_time_compare(our_mac.data(), mac, length);
1,731✔
141
}
1,733✔
142

143
}
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

© 2025 Coveralls, Inc