Hi I am running a proxy server which supports signalling and media custom encryption based on XOR encryption with a key and prefix base. Proxy Server side plugin code includes iostream header which listen for UDP stream coming into and match the packet size decrypt the stearm with the key then pass it to SIP server . i would like to know which files have to be modified in client side PJSIP useragent inorder to send encrypted signalling and media stream ?. . Thank you Part of code in plugin : " #include <iostream> #include <string> #include <vector> #include <string.h> extern "C" { bool initializePlugin(PROXYPluginContainer* pluginManager); } typedef std::vector<char> Packet; static PROXYPluginContainer* _pPluginManager = 0; class XOREncryptor : public PROXYEncryptionPluginBase { public: std::string _key; std::string _prefix; XOREncryptor() { for(int i = 0; i < 6; i++) _key.push_back((char)(171 + i)); _prefix = "0000"; } void applyXor(Packet& packet) { if (packet.empty()) return; // // Reserve enough space for the out buffer // Packet out; out.reserve(packet.size()); std::size_t keyLen = _key.size(); std::size_t offset = 0; // // Apply the XOR for each byte // for (Packet::const_iterator iter = packet.begin(); iter != packet.end(); iter++) { if (offset == keyLen) offset = 0; out.push_back(*iter ^ _key.at(offset)); offset++; } packet = out; } void applyPrefix(Packet& packet) { // // Insert the prefix at the beginning of the packet if it is present // if (_prefix.empty()) return; Packet out; out.reserve(packet.size() + _prefix.size()); for (std::string::const_iterator iter = _prefix.begin(); iter != _prefix.end(); iter++) { out.push_back(*iter); } for (Packet::const_iterator iter = packet.begin(); iter != packet.end(); iter++) { out.push_back(*iter); } packet = out; } void removePrefix(Packet& packet, std::size_t len) { if (packet.empty()) return; Packet out; std::size_t offset = 0; std::string prefix; prefix.reserve(_prefix.size()); out.reserve(len); for (Packet::const_iterator iter = packet.begin(); iter != packet.end(); iter++) { if (offset < len) prefix.push_back(*iter); else out.push_back(*iter); offset++; } if (prefix == _prefix) { //PLUGIN_LOG_INFO("Removed prefix " << prefix << " prior to decryption"); packet = out; } else { //PLUGIN_LOG_WARNING("Prefix is not removed. Collected prefix is " << prefix); } } void encryptSIP(Packet& packet) { applyXor(packet); //applyPrefix(packet); } void decryptSIP(Packet& packet) { //removePrefix(packet, _prefix.size()); applyXor(packet); } void encryptRTP(Packet& packet) { applyXor(packet); applyPrefix(packet); } void decryptRTP(Packet& packet) { if (packet.empty() || packet.size() < _prefix.size()) { PLUGIN_LOG_ERROR("XOREncryptor::decryptRTP discarding inadequate size packet with " << packet.size() << " bytes."); } removePrefix(packet, _prefix.size()); applyXor(packet); if (packet.empty()) return; if (((packet[0]>>6)&3) != 2) { // // We had trouble decrypting the RTP packet if it ever gets here // PLUGIN_LOG_ERROR("XOREncryptor::decryptRTP returned a malformed output"); } } };" " -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.pjsip.org/pipermail/pjsip_lists.pjsip.org/attachments/20140120/04c54927/attachment-0001.html>