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
base64-decode.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 "
base64-decode.hpp
"
23
#include "../detail/openssl.hpp"
24
25
namespace
ndn
{
26
namespace
security
{
27
namespace
transform
{
28
33
class
Base64Decode::Impl
34
{
35
public
:
36
Impl
()
37
:
m_base64
(BIO_new(BIO_f_base64()))
38
,
m_source
(BIO_new(BIO_s_mem()))
39
{
40
// Input may not be written in a single time.
41
// Do not return EOF when source is empty unless explicitly requested
42
BIO_set_mem_eof_return(
m_source
, -1);
43
44
// connect base64 transform to the data source.
45
BIO_push(
m_base64
,
m_source
);
46
}
47
48
~Impl
()
49
{
50
BIO_free_all(
m_base64
);
51
}
52
53
public
:
54
BIO*
m_base64
;
55
BIO*
m_source
;
// BIO_f_base64 alone does not work without a source
56
};
57
58
static
const
size_t
BUFFER_LENGTH
= 1024;
59
60
Base64Decode::Base64Decode
(
bool
expectNewlineEvery64Bytes)
61
: m_impl(
make_unique
<
Impl
>())
62
{
63
if
(!expectNewlineEvery64Bytes)
64
BIO_set_flags(m_impl->m_base64, BIO_FLAGS_BASE64_NO_NL);
65
}
66
67
Base64Decode::~Base64Decode
() =
default
;
68
69
void
70
Base64Decode::preTransform()
71
{
72
while
(
isOutputBufferEmpty
()) {
73
fillOutputBuffer();
74
if
(
isOutputBufferEmpty
())
// nothing to read from BIO, return
75
return
;
76
77
flushOutputBuffer
();
78
}
79
}
80
81
size_t
82
Base64Decode::convert(
const
uint8_t* buf,
size_t
size)
83
{
84
int
wLen = BIO_write(m_impl->m_source, buf, size);
85
86
if
(wLen <= 0) {
// fail to write data
87
if
(!BIO_should_retry(m_impl->m_source)) {
88
// we haven't written everything but some error happens, and we cannot retry
89
BOOST_THROW_EXCEPTION(
Error
(
getIndex
(),
"Failed to accept more input"
));
90
}
91
return
0;
92
}
93
else
{
// update number of bytes written
94
return
wLen;
95
}
96
}
97
98
void
99
Base64Decode::finalize()
100
{
101
BIO_set_mem_eof_return(m_impl->m_source, 0);
102
103
fillOutputBuffer();
104
105
while
(!
isOutputBufferEmpty
()) {
106
flushOutputBuffer
();
107
if
(
isOutputBufferEmpty
())
108
fillOutputBuffer();
109
}
110
}
111
112
void
113
Base64Decode::fillOutputBuffer()
114
{
115
// OpenSSL base64 BIO cannot give us the number bytes of partial decoded result,
116
// so we just try to read a chunk.
117
auto
buffer = make_unique<OBuffer>(
BUFFER_LENGTH
);
118
int
rLen = BIO_read(m_impl->m_base64, buffer->data(), buffer->size());
119
if
(rLen <= 0)
120
return
;
121
122
if
(static_cast<size_t>(rLen) < buffer->size())
123
buffer->erase(buffer->begin() + rLen, buffer->end());
124
125
setOutputBuffer
(std::move(buffer));
126
}
127
128
unique_ptr<Transform>
129
base64Decode
(
bool
expectNewlineEvery64Bytes)
130
{
131
return
make_unique<Base64Decode>(expectNewlineEvery64Bytes);
132
}
133
134
}
// namespace transform
135
}
// namespace security
136
}
// namespace ndn
ndn
Copyright (c) 2011-2015 Regents of the University of California.
Definition:
ndn-strategy-choice-helper.hpp:34
ndn::security::transform::base64Decode
unique_ptr< Transform > base64Decode(bool expectNewlineEvery64Bytes)
Definition:
base64-decode.cpp:129
ndn::security::transform::BUFFER_LENGTH
static const size_t BUFFER_LENGTH
Definition:
base64-decode.cpp:58
ndn::make_unique
unique_ptr< T > make_unique(Args &&...args)
Definition:
backports.hpp:73
ndn::security::transform::Base64Decode::Impl
The implementation class which contains the internal state of the filter which includes openssl speci...
Definition:
base64-decode.cpp:33
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::Base64Decode::Impl::m_base64
BIO * m_base64
Definition:
base64-decode.cpp:54
ndn::security::transform::Transform::isOutputBufferEmpty
bool isOutputBufferEmpty() const
Check if output buffer is empty.
Definition:
transform-base.cpp:112
ndn::security::transform::Error
Base class of transformation error.
Definition:
transform-base.hpp:47
transform
ndn::security::transform::Base64Decode::~Base64Decode
~Base64Decode()
ndn::security::transform::Base64Decode::Base64Decode
Base64Decode(bool expectNewlineEvery64Bytes=true)
Create a base64 decoding module.
Definition:
base64-decode.cpp:60
ndn::security::transform::Transform::flushOutputBuffer
void flushOutputBuffer()
Read the content from output buffer and write it into next module.
Definition:
transform-base.cpp:85
ndn::security::transform::Base64Decode::Impl::~Impl
~Impl()
Definition:
base64-decode.cpp:48
ndn::security::transform::Base64Decode::Impl::Impl
Impl()
Definition:
base64-decode.cpp:36
ndn::security::transform::Base64Decode::Impl::m_source
BIO * m_source
Definition:
base64-decode.cpp:55
base64-decode.hpp
ndn::security::transform::Downstream::getIndex
size_t getIndex() const
Get the module index.
Definition:
transform-base.hpp:125
ndnSIM
ndn-cxx
src
security
transform
base64-decode.cpp
Generated on Thu Nov 2 2017 03:30:28 for ndnSIM by
1.8.11