Author: sayer
Date: 2008-05-14 14:54:45 +0200 (Wed, 14 May 2008)
New Revision: 950

Added:
   trunk/core/AmZRTP.cpp
   trunk/core/AmZRTP.h
   trunk/core/etc/zrtp.conf
Modified:
   trunk/Makefile.defs
   trunk/core/AmRtpStream.cpp
   trunk/core/AmRtpStream.h
   trunk/core/AmSession.cpp
   trunk/core/AmSession.h
   trunk/core/Makefile
   trunk/core/sems.cpp
   trunk/core/sems.h
Log:
core ZRTP support (see zfoneproject.com)

Modified: trunk/Makefile.defs
===================================================================
--- trunk/Makefile.defs 2008-05-14 12:15:28 UTC (rev 949)
+++ trunk/Makefile.defs 2008-05-14 12:54:45 UTC (rev 950)
@@ -11,7 +11,7 @@
 
 CPPFLAGS += -D_DEBUG \
          -D_THREAD_SAFE -D_REENTRANT \
-         -DVERSION='"$(RELEASE)"' -DARCH='"$(ARCH)"'\
+         -DSEMS_VERSION='"$(RELEASE)"' -DARCH='"$(ARCH)"'\
          -DOS='"$(OS)"'        \
 #         -DMAX_RTP_SESSIONS=8192 \
 #         -DOpenSER \
@@ -35,6 +35,10 @@
 #USE_LIBSAMPLERATE = yes
 
 #
+# ZRTP support? (see zfoneproject.com)
+#WITH_ZRTP = yes
+
+#
 # exclude some modules from compilation?
 # e.g. python modules:
 #exclude_modules ?= py_sems ivr mailbox pin_collect conf_auth mp3 examples

Modified: trunk/core/AmRtpStream.cpp
===================================================================
--- trunk/core/AmRtpStream.cpp  2008-05-14 12:15:28 UTC (rev 949)
+++ trunk/core/AmRtpStream.cpp  2008-05-14 12:54:45 UTC (rev 950)
@@ -51,6 +51,10 @@
 #include <arpa/inet.h>
 #include <netinet/in.h>
 
+#ifdef WITH_ZRTP
+#include "zrtp/zrtp.h"
+#endif
+
 #include <set>
 using std::set;
 
@@ -203,6 +207,36 @@
   rp.compile((unsigned char*)buffer,size);
 
   rp.setAddr(&r_saddr);
+
+#ifdef WITH_ZRTP
+  if (session->zrtp_audio) {
+    zrtp_status_t status = zrtp_status_fail;
+    unsigned int size = rp.getBufferSize();
+    status = zrtp_process_rtp(session->zrtp_audio, (char*)rp.getBuffer(), 
&size);
+    switch (status) {
+    case zrtp_status_drop: {
+      DBG("ZRTP says: drop packet! %u - %u\n", size, rp.getBufferSize());
+      return 0;
+    } 
+    case zrtp_status_ok: {
+      //      DBG("ZRTP says: ok!\n");
+      if (rp.getBufferSize() != size)
+//       DBG("SEND packet size before: %d, after %d\n", 
+//        rp.getBufferSize(), size);
+      rp.setBufferSize(size);
+    } break;
+    default:
+    case zrtp_status_fail: {
+      DBG("ZRTP says: fail!\n");
+      //      DBG("(f)");
+      return 0;
+    }
+
+    }
+    
+  }
+#endif
+
   if(rp.send(l_sd) < 0){
     ERROR("while sending RTP packet.\n");
     return -1;
@@ -211,6 +245,24 @@
   return size;
 }
 
+int AmRtpStream::send_raw( char* packet, unsigned int length )
+{
+  if ((mute) || (hold))
+    return 0;
+
+  AmRtpPacket rp;
+  rp.compile_raw((unsigned char*)packet, length);
+  rp.setAddr(&r_saddr);
+
+  if(rp.send(l_sd) < 0){
+    ERROR("while sending raw RTP packet.\n");
+    return -1;
+  }
+ 
+  return length;
+}
+
+
 // returns 
 // @param ts              [out] timestamp of the received packet, 
 //                              in audio buffer relative time
@@ -404,6 +456,13 @@
   payload = sdp_payload->payload_type;
   last_payload = payload;
   resume();
+
+#ifdef WITH_ZRTP  
+  if( session->zrtp_audio  ) {
+    DBG("now starting zrtp stream...\n");
+    zrtp_start_stream( session->zrtp_audio );
+  }
+#endif
 }
 
 void AmRtpStream::pause()
@@ -455,7 +514,50 @@
   if (receive_buf.find(p->timestamp) != receive_buf.end())
     mem.freePacket(receive_buf[p->timestamp]);
 
-  receive_buf[p->timestamp] = p;
+#ifdef WITH_ZRTP
+  if (session->zrtp_audio) {
+
+    zrtp_status_t status = zrtp_status_fail;
+    unsigned int size = p->getBufferSize();
+    
+    status = zrtp_process_srtp(session->zrtp_audio, (char*)p->getBuffer(), 
&size);
+    switch (status)
+      {
+      case zrtp_status_forward:
+      case zrtp_status_ok: {
+       p->setBufferSize(size);
+       if (p->parse() < 0) {
+         ERROR("parsing decoded packet!\n");
+         mem.freePacket(p);
+       } else {
+         receive_buf[p->timestamp] = p;
+       }
+      }        break;
+
+      case zrtp_status_drop: {
+       //
+       // This is a protocol ZRTP packet or masked RTP media.
+       // In either case the packet must be dropped to protect your 
+       // media codec
+       mem.freePacket(p);
+       
+      } break;
+
+      case zrtp_status_fail:
+      default: {
+       ERROR("zrtp_status_fail!\n");
+        //
+        // This is some kind of error - see logs for more information
+        //
+       mem.freePacket(p);
+      } break;
+      }
+  } else {
+#endif // WITH_ZRTP
+    receive_buf[p->timestamp] = p;
+#ifdef WITH_ZRTP
+  }
+#endif
   receive_mut.unlock();
 }
 

Modified: trunk/core/AmRtpStream.h
===================================================================
--- trunk/core/AmRtpStream.h    2008-05-14 12:15:28 UTC (rev 949)
+++ trunk/core/AmRtpStream.h    2008-05-14 12:54:45 UTC (rev 950)
@@ -165,6 +165,7 @@
            unsigned char* buffer,
            unsigned int   size );
 
+  int send_raw( char* packet, unsigned int length );
 
   int receive( unsigned char* buffer, unsigned int size,
               unsigned int& ts, int& payload);
@@ -211,6 +212,8 @@
   void setPassiveMode(bool p) { passive = p; }
   bool getPassiveMode() { return passive; }
 
+  unsigned int get_ssrc() { return l_ssrc; }
+
   /** 
    * Set remote telephone event 
    * payload type 

Modified: trunk/core/AmSession.cpp
===================================================================
--- trunk/core/AmSession.cpp    2008-05-14 12:15:28 UTC (rev 949)
+++ trunk/core/AmSession.cpp    2008-05-14 12:54:45 UTC (rev 950)
@@ -37,6 +37,10 @@
 #include "AmDtmfDetector.h"
 #include "AmPlayoutBuffer.h"
 
+#ifdef WITH_ZRTP
+#include "AmZRTP.h"
+#endif
+
 #include "log.h"
 
 #include <algorithm>
@@ -46,7 +50,6 @@
 #include <sys/time.h>
 
 // AmSessionEventHandler methods
-
 bool AmSessionEventHandler::process(AmEvent*)
 {
   return false;
@@ -128,6 +131,9 @@
     m_dtmfDetector(this), m_dtmfEventQueue(&m_dtmfDetector),
     m_dtmfDetectionEnabled(true),
     accept_early_session(false)
+#ifdef WITH_ZRTP
+  ,  zrtp_session(NULL), zrtp_audio(NULL), enable_zrtp(true)
+#endif
 {
   use_local_audio[AM_AUDIO_IN] = false;
   use_local_audio[AM_AUDIO_OUT] = false;
@@ -139,6 +145,10 @@
       evh != ev_handlers.end(); evh++)
     if((*evh)->destroy)
       delete *evh;
+
+#ifdef WITH_ZRTP
+  AmZRTP::freeSession(zrtp_session);
+#endif
 }
 
 void AmSession::setCallgroup(const string& cg) {
@@ -344,6 +354,39 @@
 
 void AmSession::run()
 {
+#ifdef WITH_ZRTP
+  if (enable_zrtp) {
+    zrtp_session = (zrtp_conn_ctx_t*)malloc(sizeof(zrtp_conn_ctx_t));
+    if (NULL == zrtp_session)  {
+      ERROR("allocating ZRTP session context mem.\n");
+    } else {
+      zrtp_profile_t profile;
+      zrtp_profile_autoload(&profile, &AmZRTP::zrtp_global);           
+      profile.active = false;
+      profile.allowclear = true;
+      profile.autosecure = true; // automatically go into secure mode at the 
beginning
+      
+      if (zrtp_status_ok != zrtp_init_session_ctx( zrtp_session,
+                                                  &AmZRTP::zrtp_global,
+                                                  &profile, 
+                                                  AmZRTP::zrtp_instance_zid) ) 
{
+       ERROR("initializing ZRTP session context\n");
+       return;
+      }
+      
+      zrtp_audio = zrtp_attach_stream(zrtp_session, rtp_str.get_ssrc());
+      zrtp_audio->stream_usr_data = this;
+      
+      if (NULL == zrtp_audio) {
+       ERROR("attaching zrtp stream.\n");
+       return;
+      }
+      
+      DBG("initialized ZRTP session context OK\n");
+    }
+  }
+#endif
+
   try {
     try {
 
@@ -524,6 +567,14 @@
     onRtpTimeout();
     return;
   }
+
+#ifdef WITH_ZRTP
+  AmZRTPEvent* zrtp_ev = dynamic_cast<AmZRTPEvent*>(ev);
+  if(zrtp_ev){
+    onZRTPEvent((zrtp_event_t)zrtp_ev->event_id, zrtp_ev->stream_ctx);
+    return;
+  }
+#endif
 }
 
 
@@ -827,3 +878,92 @@
     return AmConfig::LocalIP;           // "listen" parameter.
   return set_ip;
 }  
+ 
+#ifdef WITH_ZRTP
+void AmSession::onZRTPEvent(zrtp_event_t event, zrtp_stream_ctx_t *stream_ctx) 
{
+  DBG("AmSession::onZRTPEvent \n");
+  switch (event)
+    {
+    case ZRTP_EVENT_IS_SECURE: {
+      INFO("ZRTP_EVENT_IS_SECURE \n");
+      //         info->is_verified  = ctx->_session_ctx->secrets.verifieds & 
ZRTP_BIT_RS0;
+ 
+      zrtp_conn_ctx_t *session = stream_ctx->_session_ctx;
+ 
+      if (ZRTP_SAS_BASE32 == session->sas_values.rendering) {
+       DBG("Got SAS value <<<%.4s>>>\n", session->sas_values.str1.buffer);
+      } else {
+       DBG("Got SAS values SAS1 '%s' and SAS2 '%s'\n", 
+           session->sas_values.str1.buffer,
+           session->sas_values.str2.buffer);
+      } 
+    } break;
+ 
+    case ZRTP_EVENT_IS_PENDINGCLEAR:
+      INFO("ZRTP_EVENT_IS_PENDINGCLEAR\n");
+      INFO("other side requested goClear. Going clear.\n\n");
+      zrtp_clear_stream(zrtp_audio);
+      break;
+ 
+    case ZRTP_EVENT_IS_CLEAR:
+      INFO("ZRTP_EVENT_IS_CLEAR\n");
+      break;
+ 
+    case ZRTP_EVENT_UNSUPPORTED:
+      INFO("ZRTP_EVENT_UNSUPPORTED\n");
+      break;
+    case ZRTP_EVENT_IS_INITIATINGSECURE:
+      INFO("ZRTP_EVENT_IS_INITIATINGSECURE\n");
+      break;
+    case ZRTP_EVENT_IS_PENDINGSECURE:
+      INFO("ZRTP_EVENT_PENDINGSECURE\n");
+      break;
+    case ZRTP_EVENT_IS_SECURE_DONE:
+      INFO("ZRTP_EVENT_IS_SECURE_DONE\n");
+      break;
+    case ZRTP_EVENT_ERROR:
+      INFO("ZRTP_EVENT_ERROR\n");
+      break;
+    case ZRTP_EVENT_NO_ZRTP:
+      INFO("ZRTP_EVENT_NO_ZRTP\n");
+      break;
+    case ZRTP_EVENT_NO_ZRTP_QUICK:
+      INFO("ZRTP_EVENT_NO_ZRTP_QUICK\n");
+      break;
+ 
+      // pbx functions
+    case ZRTP_EVENT_IS_CLIENT_ENROLLMENT:
+      INFO("ZRTP_EVENT_IS_CLIENT_ENROLLMENT\n");
+      break;
+    case ZRTP_EVENT_NEW_USER_ENROLLED:
+      INFO("ZRTP_EVENT_NEW_USER_ENROLLED\n");
+      break;
+    case ZRTP_EVENT_USER_ALREADY_ENROLLED:
+      INFO("ZRTP_EVENT_USER_ALREADY_ENROLLED\n");
+      break;
+    case ZRTP_EVENT_USER_UNENROLLED:
+      INFO("ZRTP_EVENT_USER_UNENROLLED\n");
+      break;
+    case ZRTP_EVENT_LOCAL_SAS_UPDATED:
+      INFO("ZRTP_EVENT_LOCAL_SAS_UPDATED\n");
+      break;
+    case ZRTP_EVENT_REMOTE_SAS_UPDATED:
+      INFO("ZRTP_EVENT_REMOTE_SAS_UPDATED\n");
+      break;
+ 
+      // errors
+    case ZRTP_EVENT_WRONG_SIGNALING_HASH:
+      INFO("ZRTP_EVENT_WRONG_SIGNALING_HASH\n");
+      break;
+    case ZRTP_EVENT_WRONG_MESSAGE_HMAC:
+      INFO("ZRTP_EVENT_WRONG_MESSAGE_HMAC\n");
+      break;
+     
+    default: 
+      INFO("unknown ZRTP_EVENT\n");
+      break;
+    } // end events case
+  
+}
+ 
+#endif

Modified: trunk/core/AmSession.h
===================================================================
--- trunk/core/AmSession.h      2008-05-14 12:15:28 UTC (rev 949)
+++ trunk/core/AmSession.h      2008-05-14 12:54:45 UTC (rev 950)
@@ -38,6 +38,10 @@
 #include "AmSipEvent.h"
 #include "AmApi.h"
 
+#ifdef WITH_ZRTP
+#include "zrtp/zrtp.h"
+#endif
+
 #include <string>
 #include <vector>
 #include <queue>
@@ -145,7 +149,6 @@
        
 protected:
   AmSdp               sdp;
-  AmRtpAudio          rtp_str;
 
   /** this is the group the media is processed with 
       - by default local tag */
@@ -155,6 +158,17 @@
   bool accept_early_session;
 
 public:
+
+  AmRtpAudio          rtp_str;
+
+#ifdef WITH_ZRTP
+  zrtp_conn_ctx_t*    zrtp_session; // ZRTP session
+  zrtp_stream_ctx_t*  zrtp_audio;   // ZRTP stream for audio
+
+  /** must be set before session is started! i.e. in constructor */
+  bool enable_zrtp;
+#endif
+
   AmSipDialog         dlg;
 
   /** 
@@ -439,6 +453,14 @@
   virtual void onSipReply(const AmSipReply& reply);
 
 
+  
+#ifdef WITH_ZRTP
+  /**
+   * ZRTP events @see ZRTP
+   */
+  virtual void onZRTPEvent(zrtp_event_t event, zrtp_stream_ctx_t *stream_ctx);
+#endif
+
   /** This callback is called if RTP timeout encountered */
   virtual void onRtpTimeout();
 
@@ -457,7 +479,7 @@
                           const string& body,
                           string& hdrs,
                           int flags);
-  
+
   // The IP address to put as c= in SDP bodies and to use for Contact:.
   string advertisedIP();
 };

Added: trunk/core/AmZRTP.cpp
===================================================================
--- trunk/core/AmZRTP.cpp       2008-05-14 12:15:28 UTC (rev 949)
+++ trunk/core/AmZRTP.cpp       2008-05-14 12:54:45 UTC (rev 950)
@@ -0,0 +1,162 @@
+/*
+ * $Id: AmZRTP.cpp 934 2008-05-06 09:25:34Z sayer $
+ *
+ * Copyright (C) 2008 iptego GmbH
+ *
+ * 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
+ *
+ * For a license to use the ser 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:
+ *    [EMAIL PROTECTED]
+ *
+ * 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
+ */
+
+#ifdef WITH_ZRTP
+
+#include "AmZRTP.h"
+
+#include "AmSession.h"
+#include "log.h"
+#include "AmConfigReader.h"
+#include "AmUtils.h"
+
+#define ZRTP_CACHE_SAVE_INTERVAL 1
+
+string AmZRTP::cache_path = "zrtp_cache.dat";
+int AmZRTP::zrtp_cache_save_cntr = 0;
+AmMutex AmZRTP::zrtp_cache_mut;
+
+zrtp_global_ctx_t AmZRTP::zrtp_global;      // persistent storage for libzrtp 
data
+zrtp_zid_t AmZRTP::zrtp_instance_zid = {"defaultsems"}; // todo: generate one
+
+int AmZRTP::init() {
+  AmConfigReader cfg;
+  string cfgname=add2path(AmConfig::ModConfigPath, 1,  "zrtp.conf");
+  if(cfg.loadFile(cfgname)) {
+    ERROR("No %s config file present.\n", 
+         cfgname.c_str());
+    return -1;
+  }
+  cache_path = cfg.getParameter("cache_path");
+  string zid = cfg.getParameter("zid");
+  if (zid.length() != sizeof(zrtp_zid_t)) {
+    ERROR("ZID of this instance MUST be set for ZRTP.\n");
+    ERROR("ZID needs to be %u characters long.\n", 
+         sizeof(zrtp_zid_t));
+    return -1;
+  }
+  for (int i=0;i<12;i++)
+    zrtp_instance_zid[i]=zid[i];
+
+  DBG("initializing ZRTP library with ZID '%s', cache path '%s'.\n",
+      zid.c_str(), cache_path.c_str());
+  if ( zrtp_status_ok != zrtp_init(&zrtp_global, "zrtp_sems") ) {
+    ERROR("Some error during zrtp initialization\n");
+    return -1;
+  }
+  zrtp_add_entropy(&zrtp_global, NULL, 0);
+  DBG("ZRTP initialized ok.\n");
+
+  return 0;
+}
+
+void AmZRTP::freeSession(zrtp_conn_ctx_t* zrtp_session) {
+  zrtp_done_session_ctx(zrtp_session);
+  free(zrtp_session);
+  // save zrtp cache
+  zrtp_cache_mut.lock();
+  if (!((++zrtp_cache_save_cntr) % ZRTP_CACHE_SAVE_INTERVAL)) {
+    if (zrtp_cache_user_down() != zrtp_status_ok) {
+      ERROR("while writing ZRTP cache.\n");
+    }
+  }
+  zrtp_cache_mut.unlock();
+}
+
+void zrtp_get_cache_path(char *path, uint32_t length) {
+  sprintf(path, "%s", AmZRTP::cache_path.c_str());
+}
+
+
+// void zrtp_get_cache_path(char *path, uint32_t length) {
+// }
+
+
+void zrtp_event_callback(zrtp_event_t event, zrtp_stream_ctx_t *stream_ctx)
+{
+  if (NULL==stream_ctx) {
+    ERROR("event received without stream context.\n");
+    return;
+  }
+
+  AmSession* sess = reinterpret_cast<AmSession*>(stream_ctx->stream_usr_data);
+  if (NULL==sess) {
+    ERROR("event received without session set up.\n");
+    return;
+  }
+
+  sess->postEvent(new AmZRTPEvent(event, stream_ctx));
+}
+
+void zrtp_play_alert(zrtp_stream_ctx_t* ctx) {
+  INFO("zrtp_play_alert: ALERT!\n");
+  ctx->need_play_alert = zrtp_play_no;
+}
+
+int zrtp_send_rtp( const zrtp_stream_ctx_t* stream_ctx,
+                  char* packet, unsigned int length) {
+  if (NULL==stream_ctx) {
+    ERROR("trying to send packet without stream context.\n");
+    return -1;
+  }
+
+  AmSession* sess = reinterpret_cast<AmSession*>(stream_ctx->stream_usr_data);
+  if (NULL==sess) {
+    ERROR("trying to send packet without session set up.\n");
+    return -1;
+  }
+
+  return sess->rtp_str.send_raw(packet, length);  
+}
+
+
+#define BUFFER_LOG_SIZE 256
+void zrtp_print_log(log_level_t level, const char* format, ...)
+{
+       char buffer[BUFFER_LOG_SIZE];
+    va_list arg;
+
+    va_start(arg, format);
+    vsnprintf(buffer, BUFFER_LOG_SIZE, format, arg);
+    va_end( arg );
+    int sems_lvl = L_ERR;
+    switch(level) {
+    case ZRTP_LOG_DEBUG:   sems_lvl = L_DBG; break;
+    case ZRTP_LOG_INFO:    sems_lvl = L_INFO; break;
+    case ZRTP_LOG_WARNING: sems_lvl = L_WARN; break;
+    case ZRTP_LOG_ERROR:   sems_lvl = L_ERR; break;
+    case ZRTP_LOG_FATAL:   sems_lvl = L_ERR; break;
+    case ZRTP_LOG_ALL:   sems_lvl = L_ERR; break;
+    }
+    _LOG(sems_lvl, "*** %s", buffer);
+}
+
+
+#endif
+
+
+

Added: trunk/core/AmZRTP.h
===================================================================
--- trunk/core/AmZRTP.h 2008-05-14 12:15:28 UTC (rev 949)
+++ trunk/core/AmZRTP.h 2008-05-14 12:54:45 UTC (rev 950)
@@ -0,0 +1,73 @@
+/*
+ * $Id: AmZRTP.h 934 2008-05-06 09:25:34Z sayer $
+ *
+ * Copyright (C) 2008 iptego GmbH
+ *
+ * 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
+ *
+ * For a license to use the ser 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:
+ *    [EMAIL PROTECTED]
+ *
+ * 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 _AM_ZRTP_H
+#define _AM_ZRTP_H
+
+#ifdef WITH_ZRTP
+
+#include "zrtp/zrtp.h"
+#include "AmThread.h"
+#include "AmEvent.h"
+
+#include <string>
+
+#include "zrtp/zrtp.h"
+extern zrtp_global_ctx_t zrtp_global;      // persistent storage for libzrtp 
data
+extern zrtp_zid_t zrtp_instance_zid;
+
+struct AmZRTPEvent : public AmEvent {
+  zrtp_stream_ctx_t* stream_ctx;
+ AmZRTPEvent(int event_id, zrtp_stream_ctx_t* stream_ctx)
+   : AmEvent(event_id), stream_ctx(stream_ctx) { }
+  ~AmZRTPEvent() { }
+};
+
+struct AmZRTP { 
+   static int zrtp_cache_save_cntr;
+   static std::string cache_path;
+   static AmMutex zrtp_cache_mut;
+   static int init();
+   static zrtp_global_ctx_t zrtp_global;    
+   static zrtp_zid_t zrtp_instance_zid;
+   static void freeSession(zrtp_conn_ctx_t* zrtp_session);
+}; 
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+  void zrtp_get_cache_path(char *path, uint32_t length);
+  zrtp_status_t zrtp_cache_user_down();
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif // WITH_ZRTP
+
+#endif //_AM_ZRTP_H

Modified: trunk/core/Makefile
===================================================================
--- trunk/core/Makefile 2008-05-14 12:15:28 UTC (rev 949)
+++ trunk/core/Makefile 2008-05-14 12:54:45 UTC (rev 950)
@@ -4,7 +4,7 @@
 PLUGIN_DIR=plug-in
 SRCS=$(filter-out $(NAME).cpp, $(wildcard *.cpp))
 HDRS=$(SRCS:.cpp=.h)
-OBJS=$(SRCS:.cpp=.o)
+OBJS=$(SRCS:.cpp=.o) 
 DEPS=$(SRCS:.cpp=.d) $(NAME).d
 AUDIO_FILES=$(notdir $(wildcard wav/*.wav))
 
@@ -65,6 +65,14 @@
 LDFLAGS +=-lsamplerate
 endif
 
+ifdef WITH_ZRTP
+CPPFLAGS += -DWITH_ZRTP \
+           -DBUILD_ZRTP_MUTEXES \
+           -DBUILD_DEFAULT_CACHE -DBUILD_DEFAULT_TIMER -DUNIX 
-DBUILD_ZRTP_MUTEXES \
+           -I/usr/local/include/zrtp 
+LDFLAGS +=-lzrtp -lbn
+endif
+
 # implicit rules
 %.o : %.cpp %.d ../Makefile.defs
        $(CXX) -c -o $@ $< $(CPPFLAGS) $(CXXFLAGS)

Added: trunk/core/etc/zrtp.conf
===================================================================
--- trunk/core/etc/zrtp.conf    2008-05-14 12:15:28 UTC (rev 949)
+++ trunk/core/etc/zrtp.conf    2008-05-14 12:54:45 UTC (rev 950)
@@ -0,0 +1,9 @@
+#
+# Path to secrets cache file. Must be writable.
+#
+cache_path=zrtp_cache.dat
+
+#
+# ZID - must be set to a unique identifier on installation.
+#
+#zid=012345678901

Modified: trunk/core/sems.cpp
===================================================================
--- trunk/core/sems.cpp 2008-05-14 12:15:28 UTC (rev 949)
+++ trunk/core/sems.cpp 2008-05-14 12:54:45 UTC (rev 950)
@@ -35,6 +35,8 @@
 #include "AmIcmpWatcher.h"
 #include "AmRtpReceiver.h"
 
+#include "AmZRTP.h"
+
 #include "log.h"
 
 #include <unistd.h>
@@ -70,7 +72,6 @@
 int    child_pid=0;
 int    is_main=1;
 
-
 static int parse_args(int argc, char* argv[], const string& flags,
                      const string& options, std::map<char,string>& args);
 
@@ -375,6 +376,13 @@
 
   init_random();
 
+#ifdef WITH_ZRTP
+  if (AmZRTP::init()) {
+    ERROR("Some error during zrtp initialization\n");
+    return -1;    
+  }
+#endif
+
   DBG("Starting session container\n");
   AmSessionContainer::instance()->start();
 
@@ -576,3 +584,4 @@
   }
   return 0;
 }
+

Modified: trunk/core/sems.h
===================================================================
--- trunk/core/sems.h   2008-05-14 12:15:28 UTC (rev 949)
+++ trunk/core/sems.h   2008-05-14 12:54:45 UTC (rev 950)
@@ -45,7 +45,7 @@
 #define MAX_FORWARDS        "70"
 
 #define DEFAULT_SIGNATURE "Sip Express Media Server " \
-               "(" VERSION " (" ARCH "/" OS"))"
+               "(" SEMS_VERSION " (" ARCH "/" OS"))"
 
 // session considered dead after 5 minutes no RTP
 #define DEAD_RTP_TIME       5*60  

_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to