| 1101 | } |
| 1102 | |
| 1103 | bool 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; |
no test coverage detected