27 #include <openssl/err.h>
28 #include <openssl/rsa.h>
29 #include <ibrcommon/thread/MutexLock.h>
30 #include <ibrcommon/Logger.h>
36 #ifdef __DEVELOPMENT_ASSERTIONS__
66 unsigned char ephemeral_key[ibrcommon::AES128Stream::key_size_in_bytes];
68 unsigned char iv[ibrcommon::AES128Stream::iv_len];
69 unsigned char tag[ibrcommon::AES128Stream::tag_len];
75 createSaltAndKey(salt, ephemeral_key, ibrcommon::AES128Stream::key_size_in_bytes);
85 while (find_pcb.next(bundle.
end()))
87 SecurityBlock::encryptBlock<PayloadConfidentialBlock>(bundle, find_pcb,
salt, ephemeral_key).
setCorrelator(correlator);
91 while (find_pib.next(bundle.
end()))
93 SecurityBlock::encryptBlock<PayloadConfidentialBlock>(bundle, find_pib,
salt, ephemeral_key).
setCorrelator(correlator);
100 if (pcbs_size > 0 || pibs_size > 0)
105 ibrcommon::BLOB::Reference blobref = plb.
getBLOB();
109 ibrcommon::BLOB::iostream stream = blobref.iostream();
110 ibrcommon::AES128Stream aes_stream(ibrcommon::CipherStream::CIPHER_ENCRYPT, *stream, ephemeral_key, salt);
113 ((ibrcommon::CipherStream&)aes_stream).encrypt(*stream);
123 aes_stream.getIV(iv);
126 aes_stream.getTag(tag);
147 long_key.
free(rsa_key);
159 std::list<const dtn::data::Block*> erasure_list;
166 unsigned char key[ibrcommon::AES128Stream::key_size_in_bytes];
170 bool decrypt_related =
false;
179 erasure_list.push_back(&**it);
180 }
catch (
const std::bad_cast&) { };
196 erasure_list.push_back(&**it);
197 }
catch (
const ibrcommon::Exception&) {
198 IBRCOMMON_LOGGER_TAG(
"PayloadConfidentialBlock", critical) <<
"tag verfication failed, reversing decryption..." << IBRCOMMON_LOGGER_ENDL;
202 throw ibrcommon::Exception(
"decrypt of correlated block reversed, tag verfication failed");
212 IBRCOMMON_LOGGER_TAG(
"PayloadConfidentialBlock", critical) <<
"could not get symmetric key decrypted" << IBRCOMMON_LOGGER_ENDL;
213 throw ibrcommon::Exception(
"decrypt failed - could not get symmetric key decrypted");
220 IBRCOMMON_LOGGER_TAG(
"PayloadConfidentialBlock", critical) <<
"tag verfication failed, reversing decryption..." << IBRCOMMON_LOGGER_ENDL;
222 throw ibrcommon::Exception(
"decrypt reversed - tag verfication failed");
226 erasure_list.push_back(&**it);
232 decrypt_related =
true;
247 throw ibrcommon::Exception(
"unable to decrypt the first PCB");
249 }
catch (
const std::bad_cast&) { };
253 for (std::list<const dtn::data::Block* >::const_iterator it = erasure_list.begin(); it != erasure_list.end(); ++it)
257 }
catch (
const std::exception&) {
258 long_key.
free(rsa_key);
262 long_key.
free(rsa_key);
272 unsigned char iv[ibrcommon::AES128Stream::iv_len];
276 unsigned char tag[ibrcommon::AES128Stream::tag_len];
280 ibrcommon::BLOB::Reference blobref = plb.getBLOB();
284 ibrcommon::BLOB::iostream stream = blobref.iostream();
285 ibrcommon::AES128Stream
decrypt(ibrcommon::CipherStream::CIPHER_DECRYPT, *stream, ephemeral_key, salt, iv);
286 ((ibrcommon::CipherStream&)decrypt).decrypt(*stream);
289 if (!decrypt.verify(tag))
291 IBRCOMMON_LOGGER_TAG(
"PayloadConfidentialBlock", error) <<
"integrity signature of the decrypted payload is invalid" << IBRCOMMON_LOGGER_ENDL;
dtn::data::Bitset< CIPHERSUITE_FLAGS > _ciphersuite_flags
virtual ~PayloadConfidentialBlock()
static void encrypt(dtn::data::Bundle &bundle, const dtn::security::SecurityKey &long_key, const dtn::data::EID &source)
bool sameHost(const std::string &other) const
void setCorrelator(const dtn::data::Number &corr)
static void decryptBlock(dtn::data::Bundle &bundle, dtn::data::Bundle::iterator &it, uint32_t salt, const unsigned char key[ibrcommon::AES128Stream::key_size_in_bytes])
static void free(RSA *key)
void set(ProcFlags flag, const bool &value)
bool isSecurityDestination(const dtn::data::Bundle &, const dtn::data::EID &) const
void set(TLV_TYPES type, std::string value)
void setSecurityDestination(const dtn::data::EID &destination)
static bool decryptPayload(dtn::data::Bundle &bundle, const unsigned char ephemeral_key[ibrcommon::AES128Stream::key_size_in_bytes], const uint32_t salt)
void remove(const Block &block)
TLVList _ciphersuite_params
PayloadConfidentialBlock()
const std::string get(TLV_TYPES type) const
static bool getKey(const TLVList &security_parameter, unsigned char *key, dtn::data::Length key_size, RSA *rsa)
bool get(FLAGS flag) const
static const dtn::data::block_t BLOCK_TYPE
static void addFragmentRange(TLVList &ciphersuite_params, const dtn::data::Number &fragmentoffset, const dtn::data::Number &payload_length)
virtual RSA * getRSA() const
dtn::data::Number _correlator
block_list::iterator iterator
static const dtn::data::block_t BLOCK_TYPE
virtual dtn::data::Block * create()
static void addKey(TLVList &security_parameter, unsigned char const *const key, dtn::data::Length key_size, RSA *rsa)
static void addSalt(TLVList &security_parameters, const uint32_t &salt)
ibrcommon::find_iterator< iterator, block_t > find_iterator
iterator find(block_t blocktype)
ibrcommon::BLOB::Reference getBLOB() const
dtn::data::Number _ciphersuite_id
static uint32_t getSalt(const TLVList &security_parameters)
static void decrypt(dtn::data::Bundle &bundle, const dtn::security::SecurityKey &long_key)
static void createSaltAndKey(uint32_t &salt, unsigned char *key, dtn::data::Length key_size)
void setSecuritySource(const dtn::data::EID &source)
dtn::data::Number fragmentoffset
static dtn::data::Number createCorrelatorValue(const dtn::data::Bundle &bundle)