MCPcopy Create free account
hub / github.com/OpenDDS/OpenDDS / encode_serialized_payload

Method encode_serialized_payload

dds/DCPS/security/CryptoBuiltInImpl.cpp:1103–1178  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1101}
1102
1103bool CryptoBuiltInImpl::encode_serialized_payload(
1104 DDS::OctetSeq& encoded_buffer,
1105 DDS::OctetSeq& /*extra_inline_qos*/,
1106 const DDS::OctetSeq& plain_buffer,
1107 DatawriterCryptoHandle sending_datawriter_crypto,
1108 SecurityException& ex)
1109{
1110 if (DDS::HANDLE_NIL == sending_datawriter_crypto) {
1111 return CommonUtilities::set_security_error(ex, -1, 0, "Invalid datawriter handle");
1112 }
1113
1114 ACE_Guard<ACE_Thread_Mutex> guard(mutex_);
1115 const KeyTable_t::const_iterator keys_iter = keys_.find(sending_datawriter_crypto);
1116 const EncryptOptions_t::const_iterator eo_iter = encrypt_options_.find(sending_datawriter_crypto);
1117 if (eo_iter == encrypt_options_.end()) {
1118 return CommonUtilities::set_security_error(ex, -1, 0, "Datawriter handle lacks encrypt options");
1119 }
1120 if (keys_iter == keys_.end() || !eo_iter->second.payload_) {
1121 encoded_buffer = plain_buffer;
1122 return true;
1123 }
1124
1125 const KeySeq& keyseq = keys_iter->second;
1126 if (!keyseq.length()) {
1127 encoded_buffer = plain_buffer;
1128 return true;
1129 }
1130
1131 bool ok;
1132 CryptoHeader header;
1133 CryptoFooter footer;
1134 DDS::OctetSeq out;
1135 const DDS::OctetSeq* pOut = &plain_buffer;
1136 // see register_local_datawriter for the assignment of key indexes in the seq
1137 const unsigned int key_idx = keyseq.length() >= 2 ? 1 : 0;
1138 const KeyId_t sKey = std::make_pair(sending_datawriter_crypto, key_idx);
1139
1140 if (encrypts(keyseq[key_idx])) {
1141 ok = encrypt(keyseq[key_idx], sessions_[sKey], plain_buffer,
1142 header, footer, out, ex);
1143 pOut = &out;
1144
1145 } else if (authenticates(keyseq[key_idx])) {
1146 ok = authtag(keyseq[key_idx], sessions_[sKey], plain_buffer,
1147 header, footer, ex);
1148
1149 } else {
1150 return CommonUtilities::set_security_error(ex, -1, 0, "Key transform kind unrecognized");
1151 }
1152
1153 if (!ok) {
1154 return false; // either encrypt() or authtag() already set 'ex'
1155 }
1156
1157 size_t size = serialized_size(common_encoding, header);
1158
1159 if (pOut != &plain_buffer) {
1160 size += CRYPTO_CONTENT_ADDED_LENGTH;

Callers 2

encode_payloadMethod · 0.80
TEST_FFunction · 0.80

Calls 9

set_security_errorFunction · 0.85
encryptsFunction · 0.85
authenticatesFunction · 0.85
to_mbFunction · 0.85
serialized_sizeFunction · 0.50
findMethod · 0.45
endMethod · 0.45
lengthMethod · 0.45
get_bufferMethod · 0.45

Tested by

no test coverage detected