From 257fcd3f7e1e2d41d2eff8af62c3bada4d7a9133 Mon Sep 17 00:00:00 2001 From: Donat Zenichev Date: Thu, 14 Aug 2025 15:26:18 +0200 Subject: [PATCH] MT#59962 Add support of AmIceCandidate Introduce AmIceCandidate implementation. Will be required for later usage, e.g. in AmStunServer Change-Id: I6eb5687e37aab93cbde49af48abca64ca9d13c1d --- core/AmIceCandidate.cpp | 53 ++++++++++++++++++++++++++++++ core/AmIceCandidate.h | 51 ++++++++++++++++++++++++++++ core/AmSdp.cpp | 30 +++++++++++++++++ core/AmSdp.h | 18 ++++++++++ core/crc32calc.h | 73 +++++++++++++++++++++++++++++++++++++++++ core/ice_utils.cpp | 66 +++++++++++++++++++++++++++++++++++++ core/ice_utils.h | 39 ++++++++++++++++++++++ 7 files changed, 330 insertions(+) create mode 100644 core/AmIceCandidate.cpp create mode 100644 core/AmIceCandidate.h create mode 100644 core/crc32calc.h create mode 100644 core/ice_utils.cpp create mode 100644 core/ice_utils.h diff --git a/core/AmIceCandidate.cpp b/core/AmIceCandidate.cpp new file mode 100644 index 00000000..99360322 --- /dev/null +++ b/core/AmIceCandidate.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2002-2003 Fhg Fokus + * + * This file is part of SEMS, a free SIP media server. + * + * SEMS is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. This program is released under + * the GPL with the additional exemption that compiling, linking, + * and/or using OpenSSL is allowed. + * + * For a license to use the SEMS software under conditions + * other than those described here, or to purchase support for this + * software, please contact iptel.org by e-mail at the following addresses: + * info@iptel.org + * + * SEMS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "AmIceCandidate.h" + +#include + +/** \brief ICE candidates */ + +AmIceCandidate::AmIceCandidate(string foundation, int component_id, string transport, string address, unsigned int port) +{ + this->foundation = foundation; + this->component_id = component_id; + this->transport = transport; + this->address = address; + this->port = port; + this->type = string("host"); + + setPriority(); +}; + +void AmIceCandidate::setPriority() +{ + int precedence = 65535; + + priority = (1 << 24)*(126) + + (1 << 8)*(precedence) + + (1 << 0)*(256 - component_id); +}; diff --git a/core/AmIceCandidate.h b/core/AmIceCandidate.h new file mode 100644 index 00000000..9f0c91af --- /dev/null +++ b/core/AmIceCandidate.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2002-2003 Fhg Fokus + * + * This file is part of SEMS, a free SIP media server. + * + * SEMS is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. This program is released under + * the GPL with the additional exemption that compiling, linking, + * and/or using OpenSSL is allowed. + * + * For a license to use the SEMS software under conditions + * other than those described here, or to purchase support for this + * software, please contact iptel.org by e-mail at the following addresses: + * info@iptel.org + * + * SEMS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __AmIceCandidate__ +#define __AmIceCandidate__ + +#include +using std::string; + +/** \brief ICE candidate */ +class AmIceCandidate +{ +public: + string foundation; + int component_id; + string transport; + int priority; + string address; + unsigned int port; + string type; + + AmIceCandidate(string foundation, int component_id, string transport, string address, unsigned int port); + + void setPriority(); +}; + +#endif diff --git a/core/AmSdp.cpp b/core/AmSdp.cpp index e8c93684..ccfa5a59 100644 --- a/core/AmSdp.cpp +++ b/core/AmSdp.cpp @@ -335,6 +335,22 @@ bool AmSdp::parse(const string& sdp_copy) return parsed; } +string SdpIceCandidate::print() const +{ + + string buf = "a=candidate:"; + buf += candidate->foundation + " "; + buf += int2str(candidate->component_id) + " "; + buf += candidate->transport + " "; + buf += int2str(candidate->priority) + " "; + buf += candidate->address + " "; + buf += int2str(candidate->port) + " "; + buf += "typ " + candidate->type; + buf += CRLF; + + return buf; +} + void AmSdp::print(string& body) const { string out_buf = "v="+int2str(version)+"\r\n" @@ -451,6 +467,20 @@ void AmSdp::print(string& body) const case SdpMedia::DirBoth: out_buf += "a=direction:both\r\n"; break; case SdpMedia::DirUndefined: break; } + + // add ICE credentials + if (!media_it->ice_username.empty() && !media_it->ice_password.empty()) { + out_buf += "a=ice-ufrag:" + media_it->ice_username + "\r\n"; + out_buf += "a=ice-pwd:" + media_it->ice_password + "\r\n"; + } + + // add ICE candidates + for (std::vector::const_iterator ice_it = media_it->iceCandidates.begin(); + ice_it != media_it->iceCandidates.end(); + ice_it++) + { + out_buf += ice_it->print(); + } } body = std::move(out_buf); diff --git a/core/AmSdp.h b/core/AmSdp.h index 5e17c19e..2fca3680 100644 --- a/core/AmSdp.h +++ b/core/AmSdp.h @@ -38,6 +38,7 @@ #include using std::string; +#include "AmIceCandidate.h" #define COMFORT_NOISE_PAYLOAD_TYPE 13 // RFC 3389 #define DYNAMIC_PAYLOAD_TYPE_START 96 // range: 96->127, see RFC 1890 @@ -165,6 +166,18 @@ struct SdpAttribute bool operator == (const SdpAttribute& other) const; }; +struct SdpIceCandidate { + + SdpIceCandidate(AmIceCandidate* candidate) + { + this->candidate = candidate; + } + + AmIceCandidate* candidate; + + string print() const; +}; + /** \brief m=... line in SDP */ struct SdpMedia { @@ -183,6 +196,9 @@ struct SdpMedia Direction dir; // a=direction string fmt; // format in case proto != RTP/AVP or RTP/SAVP + string ice_username; + string ice_password; + // sendrecv|sendonly|recvonly|inactive bool send; bool recv; @@ -191,6 +207,8 @@ struct SdpMedia std::vector attributes; // unknown attributes + std::vector iceCandidates; + bool operator == (const SdpMedia& other) const; SdpMedia() : port(0), nports(0), conn(), dir(DirUndefined), type(MT_NONE), transport(TP_NONE), send(true), recv(true) {} diff --git a/core/crc32calc.h b/core/crc32calc.h new file mode 100644 index 00000000..c1fcc947 --- /dev/null +++ b/core/crc32calc.h @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2002-2003 Fhg Fokus + * + * This file is part of SEMS, a free SIP media server. + * + * SEMS is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. This program is released under + * the GPL with the additional exemption that compiling, linking, + * and/or using OpenSSL is allowed. + * + * For a license to use the SEMS software under conditions + * other than those described here, or to purchase support for this + * software, please contact iptel.org by e-mail at the following addresses: + * info@iptel.org + * + * SEMS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __crc32calc_h__ +#define __crc32calc_h__ + +static DWORD table[256]; +static bool inited; + +class CRC32Calc +{ +public: + CRC32Calc() + { + //Check if inited globally + if (!inited) + { + for (DWORD i = 0; i < 256; ++i) { + DWORD c = i; + for (DWORD j = 0; j < 8; ++j) { + if (c & 1) { + c = 0xEDB88320 ^ (c >> 1); + } else { + c >>= 1; + } + } + table[i] = c; + } + //Initied + inited = true; + } + + crc = 0; + } + + DWORD Update(BYTE *data, DWORD size) + { + DWORD c = crc ^ 0xFFFFFFFF; + for (DWORD i = 0; i < size; ++i) + c = table[(c ^ data[i]) & 0xFF] ^ (c >> 8); + crc = c ^ 0xFFFFFFFF; + return crc; + } +private: + DWORD crc; +}; + + +#endif diff --git a/core/ice_utils.cpp b/core/ice_utils.cpp new file mode 100644 index 00000000..86d9ee1e --- /dev/null +++ b/core/ice_utils.cpp @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2002-2003 Fhg Fokus + * + * This file is part of SEMS, a free SIP media server. + * + * SEMS is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. This program is released under + * the GPL with the additional exemption that compiling, linking, + * and/or using OpenSSL is allowed. + * + * For a license to use the SEMS software under conditions + * other than those described here, or to purchase support for this + * software, please contact iptel.org by e-mail at the following addresses: + * info@iptel.org + * + * SEMS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "ice_utils.h" +#include "AmUtils.h" + +using std::string; + +string getIceToken(const int min, const int max) +{ + + string token; + int len = (((int)get_random() & max) | min); + + static const char ice_char[] = + "0123456789" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "+/"; + + for (int i = 0; i < len; ++i) { + token += ice_char[get_random() % (sizeof(ice_char) - 1)]; + } + + return token; +} + +string createIceUsername() +{ + return getIceToken(4, 10); +} + +string createIcePassword() +{ + return getIceToken(22, 30); +} + +string createIceFoundation() +{ + return getIceToken(1, 20); +} + diff --git a/core/ice_utils.h b/core/ice_utils.h new file mode 100644 index 00000000..91e7f90b --- /dev/null +++ b/core/ice_utils.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2002-2003 Fhg Fokus + * + * This file is part of SEMS, a free SIP media server. + * + * SEMS is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. This program is released under + * the GPL with the additional exemption that compiling, linking, + * and/or using OpenSSL is allowed. + * + * For a license to use the SEMS software under conditions + * other than those described here, or to purchase support for this + * software, please contact iptel.org by e-mail at the following addresses: + * info@iptel.org + * + * SEMS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __ice_utils_h__ +#define __ice_utils_h___ + +#include + +std::string getIceToken(const int min, const int max); +std::string createIceUsername(); +std::string createIcePassword(); +std::string createIceFoundation(); + +#endif +