RSA* SecurityKey::getPublicRSA() const { RSA *rsa = RSA_new(); FILE * rsa_pkey_file = fopen(file.getPath().c_str(), "r"); if (!rsa_pkey_file) { IBRCOMMON_LOGGER_ex(critical) << "Failed to open " << file.getPath() << IBRCOMMON_LOGGER_ENDL; throw ibrcommon::Exception("Failed to open " + file.getPath()); } if (!PEM_read_RSA_PUBKEY(rsa_pkey_file, &rsa, NULL, NULL)) { IBRCOMMON_LOGGER_ex(critical) << "Error loading RSA public key file: " << file.getPath() << IBRCOMMON_LOGGER_ENDL; ERR_print_errors_fp(stderr); throw ibrcommon::Exception("Error loading RSA public key file: " + file.getPath()); } fclose(rsa_pkey_file); return rsa; }
void ExtensionSecurityBlock::decrypt(dtn::data::Bundle& bundle, const SecurityKey &key, const dtn::security::ExtensionSecurityBlock& block) { // load the rsa key RSA *rsa_key = key.getRSA(); // get key, convert with reinterpret_cast unsigned char keydata[ibrcommon::AES128Stream::key_size_in_bytes]; if (!getKey(block._ciphersuite_params, keydata, ibrcommon::AES128Stream::key_size_in_bytes, rsa_key)) { IBRCOMMON_LOGGER_ex(critical) << "could not get symmetric key decrypted" << IBRCOMMON_LOGGER_ENDL; throw ibrcommon::Exception("could not extract the key"); } // get salt, convert with stringstream u_int32_t salt = getSalt(block._ciphersuite_params); SecurityBlock::decryptBlock(bundle, block, salt, keydata); }
const std::string PayloadIntegrityBlock::calcHash(const dtn::data::Bundle &bundle, const SecurityKey &key, PayloadIntegrityBlock& ignore) { EVP_PKEY *pkey = key.getEVP(); ibrcommon::RSASHA256Stream rs2s(pkey); // serialize the bundle in the mutable form dtn::security::MutableSerializer ms(rs2s, &ignore); (dtn::data::DefaultSerializer&)ms << bundle; rs2s << std::flush; int return_code = rs2s.getSign().first; std::string sign_string = rs2s.getSign().second; SecurityKey::free(pkey); if (return_code) return sign_string; else { IBRCOMMON_LOGGER_ex(critical) << "an error occured at the creation of the hash and it is invalid" << IBRCOMMON_LOGGER_ENDL; ERR_print_errors_fp(stderr); return std::string(""); } }