NS-3 based Named Data Networking (NDN) simulator
ndnSIM 2.3: NDN, CCN, CCNx, content centric networks
API Documentation
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
ndnSIM
ndnSIM documentation
All Attributes
All GlobalValues
All LogComponents
All TraceSources
Todo List
Deprecated List
Modules
Namespaces
Classes
Files
File List
File Members
•
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Modules
Pages
hmac-filter.cpp
Go to the documentation of this file.
1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2
/*
3
* Copyright (c) 2013-2017 Regents of the University of California.
4
*
5
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6
*
7
* ndn-cxx library is free software: you can redistribute it and/or modify it under the
8
* terms of the GNU Lesser General Public License as published by the Free Software
9
* Foundation, either version 3 of the License, or (at your option) any later version.
10
*
11
* ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14
*
15
* You should have received copies of the GNU General Public License and GNU Lesser
16
* General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17
* <http://www.gnu.org/licenses/>.
18
*
19
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
20
*/
21
22
#include "
hmac-filter.hpp
"
23
#include "../detail/openssl-helper.hpp"
24
25
#include <boost/lexical_cast.hpp>
26
27
namespace
ndn
{
28
namespace
security
{
29
namespace
transform
{
30
31
class
HmacFilter::Impl
32
{
33
public
:
34
Impl
()
35
:
key
(nullptr)
36
{
37
}
38
39
~Impl
()
40
{
41
EVP_PKEY_free(
key
);
42
}
43
44
public
:
45
detail::EvpMdCtx
ctx
;
46
EVP_PKEY*
key
;
47
};
48
49
50
HmacFilter::HmacFilter
(
DigestAlgorithm
algo,
const
uint8_t*
key
,
size_t
keyLen)
51
: m_impl(
make_unique
<
Impl
>())
52
{
53
BOOST_ASSERT(key !=
nullptr
);
54
BOOST_ASSERT(keyLen > 0);
55
56
const
EVP_MD* md =
detail::digestAlgorithmToEvpMd
(algo);
57
if
(md ==
nullptr
)
58
BOOST_THROW_EXCEPTION(
Error
(
getIndex
(),
"Unsupported digest algorithm "
+
59
boost::lexical_cast<std::string>(algo)));
60
61
m_impl->key = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC,
nullptr
, key, static_cast<int>(keyLen));
62
if
(m_impl->key ==
nullptr
)
63
BOOST_THROW_EXCEPTION(
Error
(
getIndex
(),
"Failed to create HMAC key"
));
64
65
if
(EVP_DigestSignInit(m_impl->ctx,
nullptr
, md,
nullptr
, m_impl->key) != 1)
66
BOOST_THROW_EXCEPTION(
Error
(
getIndex
(),
"Failed to initialize HMAC context with "
+
67
boost::lexical_cast<std::string>(algo) +
" digest"
));
68
}
69
70
HmacFilter::~HmacFilter
() =
default
;
71
72
size_t
73
HmacFilter::convert(
const
uint8_t* buf,
size_t
size)
74
{
75
if
(EVP_DigestSignUpdate(m_impl->ctx, buf, size) != 1)
76
BOOST_THROW_EXCEPTION(
Error
(
getIndex
(),
"Failed to accept more input"
));
77
78
return
size;
79
}
80
81
void
82
HmacFilter::finalize()
83
{
84
auto
buffer = make_unique<OBuffer>(EVP_MAX_MD_SIZE);
85
size_t
hmacLen = 0;
86
87
if
(EVP_DigestSignFinal(m_impl->ctx, buffer->data(), &hmacLen) != 1)
88
BOOST_THROW_EXCEPTION(
Error
(
getIndex
(),
"Failed to finalize HMAC"
));
89
90
buffer->erase(buffer->begin() + hmacLen, buffer->end());
91
setOutputBuffer
(std::move(buffer));
92
93
flushAllOutput
();
94
}
95
96
unique_ptr<Transform>
97
hmacFilter
(
DigestAlgorithm
algo,
const
uint8_t* key,
size_t
keyLen)
98
{
99
return
make_unique<HmacFilter>(algo, key, keyLen);
100
}
101
102
}
// namespace transform
103
}
// namespace security
104
}
// namespace ndn
ndn
Copyright (c) 2011-2015 Regents of the University of California.
Definition:
ndn-strategy-choice-helper.hpp:34
hmac-filter.hpp
ndn::security::transform::HmacFilter::Impl::key
EVP_PKEY * key
Definition:
hmac-filter.cpp:46
ndn::make_unique
unique_ptr< T > make_unique(Args &&...args)
Definition:
backports.hpp:73
ndn::security::transform::hmacFilter
unique_ptr< Transform > hmacFilter(DigestAlgorithm algo, const uint8_t *key, size_t keyLen)
Definition:
hmac-filter.cpp:97
ndn::security::transform::HmacFilter::Impl
Definition:
hmac-filter.cpp:31
ndn::security::transform::Transform::flushAllOutput
void flushAllOutput()
Read the all the content from output buffer and write it into next module.
Definition:
transform-base.cpp:96
ndn::security::transform::HmacFilter::Impl::ctx
detail::EvpMdCtx ctx
Definition:
hmac-filter.cpp:45
websocketpp::transport::asio::socket::error::security
Catch-all error for security policy errors that don't fit in other categories.
Definition:
base.hpp:79
ndn::security::transform::Transform::setOutputBuffer
void setOutputBuffer(unique_ptr< OBuffer > buffer)
Set output buffer to buffer.
Definition:
transform-base.cpp:104
ndn::security::transform::HmacFilter::Impl::~Impl
~Impl()
Definition:
hmac-filter.cpp:39
ndn::security::detail::digestAlgorithmToEvpMd
const EVP_MD * digestAlgorithmToEvpMd(DigestAlgorithm algo)
Definition:
openssl-helper.cpp:29
ndn::security::transform::Error
Base class of transformation error.
Definition:
transform-base.hpp:47
transform
ndn::security::transform::HmacFilter::HmacFilter
HmacFilter(DigestAlgorithm algo, const uint8_t *key, size_t keyLen)
Create a module to generate HMAC using digest algorithm algo and key key.
Definition:
hmac-filter.cpp:50
ndn::security::detail::EvpMdCtx
Definition:
openssl-helper.hpp:38
ndn::security::transform::HmacFilter::Impl::Impl
Impl()
Definition:
hmac-filter.cpp:34
ndn::DigestAlgorithm
DigestAlgorithm
Definition:
security-common.hpp:105
ndn::security::transform::HmacFilter::~HmacFilter
~HmacFilter()
ndn::security::transform::Downstream::getIndex
size_t getIndex() const
Get the module index.
Definition:
transform-base.hpp:125
ndnSIM
ndn-cxx
src
security
transform
hmac-filter.cpp
Generated on Thu Nov 2 2017 03:30:28 for ndnSIM by
1.8.11