esp8266ndn
NDN Arduino library for ESP8266 and more
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
hmac.hpp
Go to the documentation of this file.
1 #ifndef NDNPH_KEYCHAIN_HMAC_HPP
2 #define NDNPH_KEYCHAIN_HMAC_HPP
3 
4 #include "../port/timingsafe/port.hpp"
5 #include "helper.hpp"
6 #include "private-key.hpp"
7 #include "public-key.hpp"
8 
9 namespace ndnph {
10 
12 class HmacKey
13  : public detail::NamedPublicKey<SigType::HmacWithSha256>
14  , public detail::NamedPrivateKey<SigType::HmacWithSha256> {
15 public:
17  explicit operator bool() const {
18  return m_key != nullptr;
19  }
20 
27  bool import(const uint8_t* key, size_t keyLen) {
28  m_key.reset(new port::HmacSha256(key, keyLen));
29  return true;
30  }
31 
32  size_t getMaxSigLen() const final {
33  return NDNPH_SHA256_LEN;
34  }
35 
36  ssize_t sign(std::initializer_list<tlv::Value> chunks, uint8_t* sig) const final {
37  bool ok = computeHmac(chunks, sig);
38  return ok ? NDNPH_SHA256_LEN : -1;
39  }
40 
41  bool verify(std::initializer_list<tlv::Value> chunks, const uint8_t* sig,
42  size_t sigLen) const final {
43  uint8_t result[NDNPH_SHA256_LEN];
44  return computeHmac(chunks, result) &&
45  port::TimingSafeEqual()(result, NDNPH_SHA256_LEN, sig, sigLen);
46  }
47 
48 private:
49  bool computeHmac(std::initializer_list<tlv::Value> chunks, uint8_t* sig) const {
50  if (m_key == nullptr) {
51  return false;
52  }
53  for (const auto& chunk : chunks) {
54  m_key->update(chunk.begin(), chunk.size());
55  }
56  return m_key->final(sig);
57  }
58 
59 private:
60  mutable std::unique_ptr<port::HmacSha256> m_key;
61 };
62 
63 } // namespace ndnph
64 
65 #endif // NDNPH_KEYCHAIN_HMAC_HPP
HMAC-SHA256 algorithm, implemented with BearSSL.
Definition: sha256-bearssl.hpp:31
HMAC-SHA256 secret key.
Definition: hmac.hpp:14
size_t getMaxSigLen() const final
Definition: hmac.hpp:32
ssize_t sign(std::initializer_list< tlv::Value > chunks, uint8_t *sig) const final
Perform signing.
Definition: hmac.hpp:36
bool verify(std::initializer_list< tlv::Value > chunks, const uint8_t *sig, size_t sigLen) const final
Perform verification.
Definition: hmac.hpp:41
Definition: helper.hpp:64
Definition: helper.hpp:54
#define NDNPH_SHA256_LEN
SHA256 digest length.
Definition: common.hpp:34
Definition: fs.hpp:33