Botan
1.11.15
|
#include <pipe.h>
Classes | |
struct | Invalid_Message_Number |
Public Types | |
typedef size_t | message_id |
Public Member Functions | |
void | append (Filter *filt) |
size_t | default_msg () const |
size_t | discard_next (size_t N) |
void | end_msg () |
bool | end_of_data () const |
size_t | get_bytes_read () const |
size_t | get_bytes_read (message_id msg=DEFAULT_MESSAGE) const |
virtual std::string | id () const |
message_id | message_count () const |
Pipe & | operator= (const Pipe &) |
size_t | peek (byte output[], size_t length, size_t offset) const |
size_t | peek (byte output[], size_t length, size_t offset, message_id msg) const |
size_t | peek (byte &output, size_t offset, message_id msg=DEFAULT_MESSAGE) const |
size_t | peek_byte (byte &out) const |
Pipe (Filter *=nullptr, Filter *=nullptr, Filter *=nullptr, Filter *=nullptr) | |
Pipe (std::initializer_list< Filter * > filters) | |
Pipe (const Pipe &) | |
void | pop () |
void | prepend (Filter *filt) |
void | process_msg (const byte in[], size_t length) |
void | process_msg (const secure_vector< byte > &in) |
void | process_msg (const std::vector< byte > &in) |
void | process_msg (const std::string &in) |
void | process_msg (DataSource &in) |
size_t | read (byte output[], size_t length) |
size_t | read (byte output[], size_t length, message_id msg) |
size_t | read (byte &output, message_id msg=DEFAULT_MESSAGE) |
secure_vector< byte > | read_all (message_id msg=DEFAULT_MESSAGE) |
std::string | read_all_as_string (message_id=DEFAULT_MESSAGE) |
size_t | read_byte (byte &out) |
size_t | remaining (message_id msg=DEFAULT_MESSAGE) const |
void | reset () |
void | set_default_msg (message_id msg) |
void | start_msg () |
void | write (const byte in[], size_t length) |
void | write (const secure_vector< byte > &in) |
void | write (const std::vector< byte > &in) |
void | write (const std::string &in) |
void | write (DataSource &in) |
void | write (byte in) |
~Pipe () | |
Static Public Attributes | |
static const message_id | DEFAULT_MESSAGE |
static const message_id | LAST_MESSAGE |
This class represents pipe objects. A set of filters can be placed into a pipe, and information flows through the pipe until it reaches the end, where the output is collected for retrieval. If you're familiar with the Unix shell environment, this design will sound quite familiar.
typedef size_t Botan::Pipe::message_id |
Botan::Pipe::Pipe | ( | Filter * | f1 = nullptr , |
Filter * | f2 = nullptr , |
||
Filter * | f3 = nullptr , |
||
Filter * | f4 = nullptr |
||
) |
Botan::Pipe::Pipe | ( | std::initializer_list< Filter * > | filters | ) |
Botan::Pipe::Pipe | ( | const Pipe & | ) |
void Botan::Pipe::append | ( | Filter * | filt | ) |
Insert a new filter at the back of the pipe
filt | the new filter to insert |
Definition at line 221 of file pipe.cpp.
Referenced by Pipe().
{ if(inside_msg) throw Invalid_State("Cannot append to a Pipe while it is processing"); if(!filter) return; if(dynamic_cast<SecureQueue*>(filter)) throw Invalid_Argument("Pipe::append: SecureQueue cannot be used"); if(filter->owned) throw Invalid_Argument("Filters cannot be shared among multiple Pipes"); filter->owned = true; if(!pipe) pipe = filter; else pipe->attach(filter); }
size_t Botan::Pipe::default_msg | ( | ) | const [inline] |
Definition at line 232 of file pipe.h.
Referenced by read_all(), and read_all_as_string().
{ return default_read; }
size_t Botan::DataSource::discard_next | ( | size_t | N | ) | [inherited] |
Discard the next N bytes of the data
N | the number of bytes to discard |
Definition at line 35 of file data_src.cpp.
References n, and Botan::DataSource::read_byte().
void Botan::Pipe::end_msg | ( | ) |
End the current message.
Definition at line 172 of file pipe.cpp.
References Botan::Output_Buffers::retire().
Referenced by Botan::EAC_Signed_Object::BER_encode(), Botan::PEM_Code::decode(), Botan::EAC_Signed_Object::PEM_encode(), Botan::PGP_decode(), and process_msg().
{ if(!inside_msg) throw Invalid_State("Pipe::end_msg: Message was already ended"); pipe->finish_msg(); clear_endpoints(pipe); if(dynamic_cast<Null_Filter*>(pipe)) { delete pipe; pipe = nullptr; } inside_msg = false; outputs->retire(); }
bool Botan::Pipe::end_of_data | ( | ) | const [virtual] |
Test whether this pipe has any data that can be read from.
Implements Botan::DataSource.
Definition at line 99 of file pipe.cpp.
References remaining().
{ return (remaining() == 0); }
size_t Botan::Pipe::get_bytes_read | ( | ) | const [virtual] |
Implements Botan::DataSource.
Definition at line 161 of file pipe_rw.cpp.
References DEFAULT_MESSAGE, and Botan::Output_Buffers::get_bytes_read().
{ return outputs->get_bytes_read(DEFAULT_MESSAGE); }
size_t Botan::Pipe::get_bytes_read | ( | message_id | msg = DEFAULT_MESSAGE | ) | const |
Definition at line 166 of file pipe_rw.cpp.
References Botan::Output_Buffers::get_bytes_read().
{ return outputs->get_bytes_read(msg); }
virtual std::string Botan::DataSource::id | ( | ) | const [inline, virtual, inherited] |
return the id of this data source
Reimplemented in Botan::DataSource_Stream.
Definition at line 58 of file data_src.h.
{ return ""; }
Pipe::message_id Botan::Pipe::message_count | ( | ) | const |
Get the number of messages the are in this pipe.
Definition at line 288 of file pipe.cpp.
References Botan::Output_Buffers::message_count().
Referenced by set_default_msg().
{ return outputs->message_count(); }
size_t Botan::Pipe::peek | ( | byte | output[], |
size_t | length, | ||
size_t | offset | ||
) | const [virtual] |
Read from the default message but do not modify the internal offset. Consecutive calls to peek() will return portions of the message starting at the same position.
output | the byte array to write the peeked message part to |
length | the length of the byte array output |
offset | the offset from the current position in message |
Implements Botan::DataSource.
Definition at line 148 of file pipe_rw.cpp.
References DEFAULT_MESSAGE.
Referenced by peek().
{ return peek(output, length, offset, DEFAULT_MESSAGE); }
size_t Botan::Pipe::peek | ( | byte | output[], |
size_t | length, | ||
size_t | offset, | ||
message_id | msg | ||
) | const |
Read from the specified message but do not modify the internal offset. Consecutive calls to peek() will return portions of the message starting at the same position.
output | the byte array to write the peeked message part to |
length | the length of the byte array output |
offset | the offset from the current position in message |
msg | the number identifying the message to peek from |
Definition at line 139 of file pipe_rw.cpp.
References Botan::Output_Buffers::peek().
{ return outputs->peek(output, length, offset, get_message_no("peek", msg)); }
size_t Botan::Pipe::peek | ( | byte & | output, |
size_t | offset, | ||
message_id | msg = DEFAULT_MESSAGE |
||
) | const |
Read a single byte from the specified message but do not modify the internal offset. Consecutive calls to peek() will return portions of the message starting at the same position.
output | the byte to write the peeked message byte to |
offset | the offset from the current position in message |
msg | the number identifying the message to peek from |
Definition at line 156 of file pipe_rw.cpp.
References peek().
{ return peek(&out, 1, offset, msg); }
size_t Botan::DataSource::peek_byte | ( | byte & | out | ) | const [inherited] |
Peek at one byte.
out | an output byte |
Definition at line 27 of file data_src.cpp.
References Botan::DataSource::peek().
Referenced by Botan::ASN1::maybe_BER().
{ return peek(&out, 1, 0); }
void Botan::Pipe::pop | ( | ) |
Remove the first filter at the front of the pipe.
Definition at line 261 of file pipe.cpp.
{ if(inside_msg) throw Invalid_State("Cannot pop off a Pipe while it is processing"); if(!pipe) return; if(pipe->total_ports() > 1) throw Invalid_State("Cannot pop off a Filter with multiple ports"); Filter* f = pipe; size_t owns = f->owns(); pipe = pipe->next[0]; delete f; while(owns--) { f = pipe; pipe = pipe->next[0]; delete f; } }
void Botan::Pipe::prepend | ( | Filter * | filt | ) |
Insert a new filter at the front of the pipe
filt | the new filter to insert |
Definition at line 241 of file pipe.cpp.
{ if(inside_msg) throw Invalid_State("Cannot prepend to a Pipe while it is processing"); if(!filter) return; if(dynamic_cast<SecureQueue*>(filter)) throw Invalid_Argument("Pipe::prepend: SecureQueue cannot be used"); if(filter->owned) throw Invalid_Argument("Filters cannot be shared among multiple Pipes"); filter->owned = true; if(pipe) filter->attach(pipe); pipe = filter; }
void Botan::Pipe::process_msg | ( | const byte | in[], |
size_t | length | ||
) |
Perform start_msg(), write() and end_msg() sequentially.
in | the byte array containing the data to write |
length | the length of the byte array to write |
Definition at line 117 of file pipe.cpp.
References end_msg(), start_msg(), and write().
Referenced by Botan::aont_package(), Botan::aont_unpackage(), Botan::CryptoBox::decrypt(), Botan::PEM_Code::encode(), Botan::CryptoBox::encrypt(), Botan::PGP_encode(), and process_msg().
void Botan::Pipe::process_msg | ( | const secure_vector< byte > & | in | ) |
Perform start_msg(), write() and end_msg() sequentially.
in | the secure_vector containing the data to write |
Definition at line 127 of file pipe.cpp.
References process_msg().
{ process_msg(input.data(), input.size()); }
void Botan::Pipe::process_msg | ( | const std::vector< byte > & | in | ) |
Perform start_msg(), write() and end_msg() sequentially.
in | the secure_vector containing the data to write |
Definition at line 132 of file pipe.cpp.
References process_msg().
{ process_msg(input.data(), input.size()); }
void Botan::Pipe::process_msg | ( | const std::string & | in | ) |
Perform start_msg(), write() and end_msg() sequentially.
in | the string containing the data to write |
Definition at line 140 of file pipe.cpp.
References process_msg().
{ process_msg(reinterpret_cast<const byte*>(input.data()), input.length()); }
void Botan::Pipe::process_msg | ( | DataSource & | in | ) |
Perform start_msg(), write() and end_msg() sequentially.
in | the DataSource providing the data to write |
Definition at line 148 of file pipe.cpp.
References end_msg(), start_msg(), and write().
size_t Botan::Pipe::read | ( | byte | output[], |
size_t | length | ||
) | [virtual] |
Read the default message from the pipe. Moves the internal offset so that every call to read will return a new portion of the message.
output | the byte array to write the read bytes to |
length | the length of the byte array output |
Implements Botan::DataSource.
Definition at line 82 of file pipe_rw.cpp.
References DEFAULT_MESSAGE.
Referenced by Botan::aont_package(), Botan::aont_unpackage(), Botan::CryptoBox::decrypt(), Botan::CryptoBox::encrypt(), Botan::operator<<(), read(), read_all(), and read_all_as_string().
{ return read(output, length, DEFAULT_MESSAGE); }
size_t Botan::Pipe::read | ( | byte | output[], |
size_t | length, | ||
message_id | msg | ||
) |
Read a specified message from the pipe. Moves the internal offset so that every call to read will return a new portion of the message.
output | the byte array to write the read bytes to |
length | the length of the byte array output |
msg | the number identifying the message to read from |
Definition at line 74 of file pipe_rw.cpp.
References Botan::Output_Buffers::read().
{ return outputs->read(output, length, get_message_no("read", msg)); }
size_t Botan::Pipe::read | ( | byte & | output, |
message_id | msg = DEFAULT_MESSAGE |
||
) |
Read a single byte from the pipe. Moves the internal offset so that every call to read will return a new portion of the message.
output | the byte to write the result to |
msg | the message to read from |
Definition at line 90 of file pipe_rw.cpp.
References read().
{ return read(&out, 1, msg); }
secure_vector< byte > Botan::Pipe::read_all | ( | message_id | msg = DEFAULT_MESSAGE | ) |
Read the full contents of the pipe.
msg | the number identifying the message to read from |
Definition at line 98 of file pipe_rw.cpp.
References DEFAULT_MESSAGE, default_msg(), read(), and remaining().
Referenced by Botan::EAC_Signed_Object::BER_encode(), Botan::PEM_Code::decode(), and Botan::PGP_decode().
{ msg = ((msg != DEFAULT_MESSAGE) ? msg : default_msg()); secure_vector<byte> buffer(remaining(msg)); size_t got = read(&buffer[0], buffer.size(), msg); buffer.resize(got); return buffer; }
std::string Botan::Pipe::read_all_as_string | ( | message_id | msg = DEFAULT_MESSAGE | ) |
Read the full contents of the pipe.
msg | the number identifying the message to read from |
Definition at line 110 of file pipe_rw.cpp.
References DEFAULT_MESSAGE, default_msg(), read(), and remaining().
Referenced by Botan::CryptoBox::decrypt(), Botan::PEM_Code::encode(), Botan::EAC_Signed_Object::PEM_encode(), Botan::PGP_decode(), and Botan::PGP_encode().
{ msg = ((msg != DEFAULT_MESSAGE) ? msg : default_msg()); secure_vector<byte> buffer(DEFAULT_BUFFERSIZE); std::string str; str.reserve(remaining(msg)); while(true) { size_t got = read(&buffer[0], buffer.size(), msg); if(got == 0) break; str.append(reinterpret_cast<const char*>(&buffer[0]), got); } return str; }
size_t Botan::DataSource::read_byte | ( | byte & | out | ) | [inherited] |
Read one byte.
out | the byte to read to |
Definition at line 19 of file data_src.cpp.
References Botan::DataSource::read().
Referenced by Botan::PEM_Code::decode(), Botan::DataSource::discard_next(), Botan::BER_Decoder::discard_remaining(), Botan::PGP_decode(), and Botan::BER_Decoder::raw_bytes().
{ return read(&out, 1); }
size_t Botan::Pipe::remaining | ( | message_id | msg = DEFAULT_MESSAGE | ) | const |
Find out how many bytes are ready to read.
msg | the number identifying the message for which the information is desired |
Definition at line 131 of file pipe_rw.cpp.
References Botan::Output_Buffers::remaining().
Referenced by Botan::aont_package(), Botan::aont_unpackage(), Botan::CryptoBox::encrypt(), end_of_data(), Botan::operator<<(), read_all(), and read_all_as_string().
{ return outputs->remaining(get_message_no("remaining", msg)); }
void Botan::Pipe::reset | ( | ) |
void Botan::Pipe::set_default_msg | ( | message_id | msg | ) |
Set the default message
msg | the number identifying the message which is going to be the new default message |
Definition at line 107 of file pipe.cpp.
References message_count().
{ if(msg >= message_count()) throw Invalid_Argument("Pipe::set_default_msg: msg number is too high"); default_read = msg; }
void Botan::Pipe::start_msg | ( | ) |
Start a new message in the pipe. A potential other message in this pipe must be closed with end_msg() before this function may be called.
Definition at line 158 of file pipe.cpp.
Referenced by Botan::EAC_Signed_Object::BER_encode(), Botan::PEM_Code::decode(), Botan::EAC_Signed_Object::PEM_encode(), Botan::PGP_decode(), and process_msg().
{ if(inside_msg) throw Invalid_State("Pipe::start_msg: Message was already started"); if(pipe == nullptr) pipe = new Null_Filter; find_endpoints(pipe); pipe->new_msg(); inside_msg = true; }
void Botan::Pipe::write | ( | const byte | in[], |
size_t | length | ||
) |
Write input to the pipe, i.e. to its first filter.
in | the byte array to write |
length | the length of the byte array in |
Definition at line 35 of file pipe_rw.cpp.
References Botan::Filter::write().
Referenced by Botan::PEM_Code::decode(), Botan::EAC1_1_gen_CVC< Derived >::encode(), Botan::EAC1_1_ADO::encode(), Botan::operator>>(), Botan::PGP_decode(), process_msg(), and write().
{ if(!inside_msg) throw Invalid_State("Cannot write to a Pipe while it is not processing"); pipe->write(input, length); }
void Botan::Pipe::write | ( | const secure_vector< byte > & | in | ) | [inline] |
void Botan::Pipe::write | ( | const std::vector< byte > & | in | ) | [inline] |
void Botan::Pipe::write | ( | const std::string & | in | ) |
Write input to the pipe, i.e. to its first filter.
in | the string containing the data to write |
Definition at line 45 of file pipe_rw.cpp.
References write().
{ write(reinterpret_cast<const byte*>(str.data()), str.size()); }
void Botan::Pipe::write | ( | DataSource & | in | ) |
Write input to the pipe, i.e. to its first filter.
in | the DataSource to read the data from |
Definition at line 61 of file pipe_rw.cpp.
References Botan::DataSource::end_of_data(), Botan::DataSource::read(), and write().
{ secure_vector<byte> buffer(DEFAULT_BUFFERSIZE); while(!source.end_of_data()) { size_t got = source.read(&buffer[0], buffer.size()); write(&buffer[0], got); } }
void Botan::Pipe::write | ( | byte | in | ) |
Write input to the pipe, i.e. to its first filter.
in | a single byte to be written |
Definition at line 53 of file pipe_rw.cpp.
References write().
{ write(&input, 1); }
const Pipe::message_id Botan::Pipe::DEFAULT_MESSAGE [static] |
static_cast<Pipe::message_id>(-1)
A meta-id for the default message (set with set_default_msg)
Definition at line 59 of file pipe.h.
Referenced by get_bytes_read(), peek(), read(), read_all(), and read_all_as_string().
const Pipe::message_id Botan::Pipe::LAST_MESSAGE [static] |
static_cast<Pipe::message_id>(-2)
A meta-id for whatever the last message is