Add support for SRTP and some other cool stuff
This commit is contained in:
parent
ad6c5b16ec
commit
c092aaf166
|
@ -60,6 +60,16 @@ bool MediaSessionMgr::sessionSetInt32(twrap_media_type_t media, const char* key,
|
|||
TMEDIA_SESSION_SET_NULL()) == 0);
|
||||
}
|
||||
|
||||
int32_t MediaSessionMgr::sessionGetInt32(twrap_media_type_t media, const char* key)
|
||||
{
|
||||
int32_t value = 0;
|
||||
tmedia_type_t _media = _get_media_type(media);
|
||||
(tmedia_session_mgr_get(m_pWrappedMgr,
|
||||
TMEDIA_SESSION_GET_INT32(_media, key, &value),
|
||||
TMEDIA_SESSION_GET_NULL()));
|
||||
return value;
|
||||
}
|
||||
|
||||
bool MediaSessionMgr::consumerSetInt32(twrap_media_type_t media, const char* key, int32_t value)
|
||||
{
|
||||
tmedia_type_t _media = _get_media_type(media);
|
||||
|
@ -127,6 +137,9 @@ const ProxyPlugin* MediaSessionMgr::findProxyPlugin(twrap_media_type_t media, bo
|
|||
plugin = manager->findPlugin(TDAV_SESSION_VIDEO(session)->producer);
|
||||
}
|
||||
}
|
||||
else{
|
||||
TSK_DEBUG_ERROR("Unknown session with media type = %d", _media);
|
||||
}
|
||||
tsk_object_unref(session);
|
||||
}
|
||||
}
|
||||
|
@ -298,4 +311,8 @@ bool MediaSessionMgr::defaultsSetInviteSessionTimers(int32_t timeout, const char
|
|||
int ret = tmedia_defaults_set_inv_session_expires(timeout);
|
||||
ret &= tmedia_defaults_set_inv_session_refresher(refresher);
|
||||
return (ret == 0);
|
||||
}
|
||||
|
||||
bool MediaSessionMgr::defaultsSetSRtpMode(tmedia_srtp_mode_t mode){
|
||||
return (tmedia_defaults_set_srtp_mode(mode) == 0);
|
||||
}
|
|
@ -37,6 +37,7 @@ public:
|
|||
|
||||
public:
|
||||
bool sessionSetInt32(twrap_media_type_t media, const char* key, int32_t value);
|
||||
int32_t sessionGetInt32(twrap_media_type_t media, const char* key);
|
||||
|
||||
bool consumerSetInt32(twrap_media_type_t media, const char* key, int32_t value);
|
||||
bool consumerSetInt64(twrap_media_type_t media, const char* key, int64_t value);
|
||||
|
@ -86,6 +87,7 @@ public:
|
|||
static bool defaultsSetVolume(int32_t volume);
|
||||
static int32_t defaultsGetVolume();
|
||||
static bool defaultsSetInviteSessionTimers(int32_t timeout, const char* refresher);
|
||||
static bool defaultsSetSRtpMode(tmedia_srtp_mode_t mode);
|
||||
|
||||
private:
|
||||
tmedia_session_mgr_t* m_pWrappedMgr;
|
||||
|
|
|
@ -162,6 +162,11 @@ const ProxyPlugin* ProxyPluginMgr::findPlugin(tsk_object_t* wrapped_plugin)
|
|||
|
||||
tsk_list_item_t* item;
|
||||
|
||||
if(!wrapped_plugin){
|
||||
TSK_DEBUG_ERROR("Invalid parameter");
|
||||
return tsk_null;
|
||||
}
|
||||
|
||||
tsk_list_lock(this->plugins);
|
||||
tsk_list_foreach(item, this->plugins){
|
||||
if(TWRAP_PROXY_PLUGIN(item->data)->plugin->isWrapping(wrapped_plugin)){
|
||||
|
|
|
@ -64,7 +64,6 @@ public:
|
|||
static uint64_t getUniqueId();
|
||||
|
||||
int addPlugin(ProxyPlugin**);
|
||||
const ProxyPlugin* findPlugin(uint64_t id);
|
||||
const ProxyPlugin* findPlugin(tsk_object_t* wrapped_plugin);
|
||||
int removePlugin(uint64_t id);
|
||||
int removePlugin(ProxyPlugin**);
|
||||
|
@ -72,6 +71,8 @@ public:
|
|||
inline ProxyPluginMgrCallback* getCallback(){ return this->callback; }
|
||||
#endif
|
||||
|
||||
const ProxyPlugin* findPlugin(uint64_t id);
|
||||
|
||||
const ProxyAudioConsumer* findAudioConsumer(uint64_t id);
|
||||
const ProxyVideoConsumer* findVideoConsumer(uint64_t id);
|
||||
const ProxyAudioProducer* findAudioProducer(uint64_t id);
|
||||
|
|
|
@ -229,6 +229,14 @@ typedef enum tmedia_chroma_e
|
|||
}
|
||||
tmedia_chroma_t;
|
||||
|
||||
typedef enum tmedia_srtp_mode_e
|
||||
{
|
||||
tmedia_srtp_mode_none,
|
||||
tmedia_srtp_mode_optional,
|
||||
tmedia_srtp_mode_mandatory
|
||||
}
|
||||
tmedia_srtp_mode_t;
|
||||
|
||||
/* ====== From "tinymedia/tmedia_qos.h" ====== */
|
||||
typedef enum tmedia_qos_stype_e
|
||||
{
|
||||
|
|
|
@ -44,6 +44,11 @@ public class MediaSessionMgr : IDisposable {
|
|||
return ret;
|
||||
}
|
||||
|
||||
public int sessionGetInt32(twrap_media_type_t media, string key) {
|
||||
int ret = tinyWRAPPINVOKE.MediaSessionMgr_sessionGetInt32(swigCPtr, (int)media, key);
|
||||
return ret;
|
||||
}
|
||||
|
||||
public bool consumerSetInt32(twrap_media_type_t media, string key, int value) {
|
||||
bool ret = tinyWRAPPINVOKE.MediaSessionMgr_consumerSetInt32(swigCPtr, (int)media, key, value);
|
||||
return ret;
|
||||
|
@ -221,6 +226,11 @@ public class MediaSessionMgr : IDisposable {
|
|||
return ret;
|
||||
}
|
||||
|
||||
public static bool defaultsSetSRtpMode(tmedia_srtp_mode_t mode) {
|
||||
bool ret = tinyWRAPPINVOKE.MediaSessionMgr_defaultsSetSRtpMode((int)mode);
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -51,6 +51,12 @@ public class ProxyPluginMgr : IDisposable {
|
|||
return ret;
|
||||
}
|
||||
|
||||
public ProxyPlugin findPlugin(ulong id) {
|
||||
IntPtr cPtr = tinyWRAPPINVOKE.ProxyPluginMgr_findPlugin(swigCPtr, id);
|
||||
ProxyPlugin ret = (cPtr == IntPtr.Zero) ? null : new ProxyPlugin(cPtr, false);
|
||||
return ret;
|
||||
}
|
||||
|
||||
public ProxyAudioConsumer findAudioConsumer(ulong id) {
|
||||
IntPtr cPtr = tinyWRAPPINVOKE.ProxyPluginMgr_findAudioConsumer(swigCPtr, id);
|
||||
ProxyAudioConsumer ret = (cPtr == IntPtr.Zero) ? null : new ProxyAudioConsumer(cPtr, false);
|
||||
|
|
|
@ -263,6 +263,9 @@ class tinyWRAPPINVOKE {
|
|||
[DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_sessionSetInt32")]
|
||||
public static extern bool MediaSessionMgr_sessionSetInt32(HandleRef jarg1, int jarg2, string jarg3, int jarg4);
|
||||
|
||||
[DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_sessionGetInt32")]
|
||||
public static extern int MediaSessionMgr_sessionGetInt32(HandleRef jarg1, int jarg2, string jarg3);
|
||||
|
||||
[DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_consumerSetInt32")]
|
||||
public static extern bool MediaSessionMgr_consumerSetInt32(HandleRef jarg1, int jarg2, string jarg3, int jarg4);
|
||||
|
||||
|
@ -368,6 +371,9 @@ class tinyWRAPPINVOKE {
|
|||
[DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_defaultsSetInviteSessionTimers")]
|
||||
public static extern bool MediaSessionMgr_defaultsSetInviteSessionTimers(int jarg1, string jarg2);
|
||||
|
||||
[DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_defaultsSetSRtpMode")]
|
||||
public static extern bool MediaSessionMgr_defaultsSetSRtpMode(int jarg1);
|
||||
|
||||
[DllImport("tinyWRAP", EntryPoint="CSharp_delete_MediaContent")]
|
||||
public static extern void delete_MediaContent(HandleRef jarg1);
|
||||
|
||||
|
@ -944,6 +950,9 @@ class tinyWRAPPINVOKE {
|
|||
[DllImport("tinyWRAP", EntryPoint="CSharp_ProxyPluginMgr_getInstance")]
|
||||
public static extern IntPtr ProxyPluginMgr_getInstance();
|
||||
|
||||
[DllImport("tinyWRAP", EntryPoint="CSharp_ProxyPluginMgr_findPlugin")]
|
||||
public static extern IntPtr ProxyPluginMgr_findPlugin(HandleRef jarg1, ulong jarg2);
|
||||
|
||||
[DllImport("tinyWRAP", EntryPoint="CSharp_ProxyPluginMgr_findAudioConsumer")]
|
||||
public static extern IntPtr ProxyPluginMgr_findAudioConsumer(HandleRef jarg1, ulong jarg2);
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,17 @@
|
|||
/* ----------------------------------------------------------------------------
|
||||
* This file was automatically generated by SWIG (http://www.swig.org).
|
||||
* Version 1.3.39
|
||||
*
|
||||
* Do not make changes to this file unless you know what you are doing--modify
|
||||
* the SWIG interface file instead.
|
||||
* ----------------------------------------------------------------------------- */
|
||||
|
||||
namespace org.doubango.tinyWRAP {
|
||||
|
||||
public enum tmedia_srtp_mode_t {
|
||||
tmedia_srtp_mode_none,
|
||||
tmedia_srtp_mode_optional,
|
||||
tmedia_srtp_mode_mandatory
|
||||
}
|
||||
|
||||
}
|
|
@ -37,6 +37,10 @@ public class MediaSessionMgr {
|
|||
return tinyWRAPJNI.MediaSessionMgr_sessionSetInt32(swigCPtr, this, media.swigValue(), key, value);
|
||||
}
|
||||
|
||||
public int sessionGetInt32(twrap_media_type_t media, String key) {
|
||||
return tinyWRAPJNI.MediaSessionMgr_sessionGetInt32(swigCPtr, this, media.swigValue(), key);
|
||||
}
|
||||
|
||||
public boolean consumerSetInt32(twrap_media_type_t media, String key, int value) {
|
||||
return tinyWRAPJNI.MediaSessionMgr_consumerSetInt32(swigCPtr, this, media.swigValue(), key, value);
|
||||
}
|
||||
|
@ -179,4 +183,8 @@ public class MediaSessionMgr {
|
|||
return tinyWRAPJNI.MediaSessionMgr_defaultsSetInviteSessionTimers(timeout, refresher);
|
||||
}
|
||||
|
||||
public static boolean defaultsSetSRtpMode(tmedia_srtp_mode_t mode) {
|
||||
return tinyWRAPJNI.MediaSessionMgr_defaultsSetSRtpMode(mode.swigValue());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -43,6 +43,11 @@ public class ProxyPluginMgr {
|
|||
return (cPtr == 0) ? null : new ProxyPluginMgr(cPtr, false);
|
||||
}
|
||||
|
||||
public ProxyPlugin findPlugin(java.math.BigInteger id) {
|
||||
long cPtr = tinyWRAPJNI.ProxyPluginMgr_findPlugin(swigCPtr, this, id);
|
||||
return (cPtr == 0) ? null : new ProxyPlugin(cPtr, false);
|
||||
}
|
||||
|
||||
public ProxyAudioConsumer findAudioConsumer(java.math.BigInteger id) {
|
||||
long cPtr = tinyWRAPJNI.ProxyPluginMgr_findAudioConsumer(swigCPtr, this, id);
|
||||
return (cPtr == 0) ? null : new ProxyAudioConsumer(cPtr, false);
|
||||
|
|
|
@ -37,6 +37,10 @@ public class MediaSessionMgr {
|
|||
return tinyWRAPJNI.MediaSessionMgr_sessionSetInt32(swigCPtr, this, media.swigValue(), key, value);
|
||||
}
|
||||
|
||||
public int sessionGetInt32(twrap_media_type_t media, String key) {
|
||||
return tinyWRAPJNI.MediaSessionMgr_sessionGetInt32(swigCPtr, this, media.swigValue(), key);
|
||||
}
|
||||
|
||||
public boolean consumerSetInt32(twrap_media_type_t media, String key, int value) {
|
||||
return tinyWRAPJNI.MediaSessionMgr_consumerSetInt32(swigCPtr, this, media.swigValue(), key, value);
|
||||
}
|
||||
|
@ -179,4 +183,8 @@ public class MediaSessionMgr {
|
|||
return tinyWRAPJNI.MediaSessionMgr_defaultsSetInviteSessionTimers(timeout, refresher);
|
||||
}
|
||||
|
||||
public static boolean defaultsSetSRtpMode(tmedia_srtp_mode_t mode) {
|
||||
return tinyWRAPJNI.MediaSessionMgr_defaultsSetSRtpMode(mode.swigValue());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -43,6 +43,11 @@ public class ProxyPluginMgr {
|
|||
return (cPtr == 0) ? null : new ProxyPluginMgr(cPtr, false);
|
||||
}
|
||||
|
||||
public ProxyPlugin findPlugin(java.math.BigInteger id) {
|
||||
long cPtr = tinyWRAPJNI.ProxyPluginMgr_findPlugin(swigCPtr, this, id);
|
||||
return (cPtr == 0) ? null : new ProxyPlugin(cPtr, false);
|
||||
}
|
||||
|
||||
public ProxyAudioConsumer findAudioConsumer(java.math.BigInteger id) {
|
||||
long cPtr = tinyWRAPJNI.ProxyPluginMgr_findAudioConsumer(swigCPtr, this, id);
|
||||
return (cPtr == 0) ? null : new ProxyAudioConsumer(cPtr, false);
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# Build tinyWRAP for Google Android Systems
|
||||
|
||||
for project in tinySAK tinyNET tinyHTTP tinyXCAP tinyIPSec tinySMS tinySIGCOMP tinySDP tinyRTP tinyMSRP tinyMEDIA tinyDAV tinySIP
|
||||
#for project in tinyDAV
|
||||
#for project in tinyRTP tinyDAV
|
||||
do
|
||||
echo -e building "$project with parameters=$@\n"
|
||||
make PROJECT=$project clean
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# Build tinyWRAP for Google Android Systems
|
||||
|
||||
# GPL parameters
|
||||
export COMMERCIAL_PARAMS="LICENSE=lgpl FFMPEG=yes H264=no THEORA=yes OPENCORE_AMR=no SPEEX_DSP=yes SPEEX_JB=yes SPEEX_RESAMPLER=yes SPEEX_DENOISE=yes SPEEX=yes ILBC=yes LIBGSM=yes G729=no"
|
||||
export COMMERCIAL_PARAMS="LICENSE=lgpl FFMPEG=yes H264=no THEORA=yes OPENCORE_AMR=no SPEEX_DSP=yes SPEEX_JB=yes SPEEX_RESAMPLER=yes SPEEX_DENOISE=yes SPEEX=yes ILBC=yes LIBGSM=yes G729=no SRTP=yes"
|
||||
|
||||
for IS_NEON in no yes
|
||||
do
|
||||
|
|
|
@ -70,13 +70,17 @@ else
|
|||
G729_LDFLAGS :=
|
||||
endif
|
||||
|
||||
ifneq ($(SRTP),no)
|
||||
LIBSRTP_LDFLAGS := -lsrtp
|
||||
endif
|
||||
|
||||
ifeq ($(LT),shared)
|
||||
_LT=Bdynamic
|
||||
else
|
||||
_LT=Bstatic
|
||||
endif
|
||||
|
||||
LDFLAGS := $(LDFLAGS_LIB) -L$(THIRDPARTIES_LIB) -L$(THIRDPARTIES_MARCH_LIB) $(FFMPEG_LDFLAGS) $(VPX_LDLAGS) $(WEBRTC_LDFLAGS) $(SPEEX_DSP_LDFLAGS) $(SPEEX_LDFLAGS) $(OPENCORE_ARM_LDFLAGS) $(BV16_LDFLAGS) $(ILBC_LDFLAGS) $(LIBGSM_LDFLAGS) $(G729_LDFLAGS)\
|
||||
LDFLAGS := $(LDFLAGS_LIB) -L$(THIRDPARTIES_LIB) -L$(THIRDPARTIES_MARCH_LIB) $(FFMPEG_LDFLAGS) $(VPX_LDLAGS) $(WEBRTC_LDFLAGS) $(SPEEX_DSP_LDFLAGS) $(SPEEX_LDFLAGS) $(OPENCORE_ARM_LDFLAGS) $(BV16_LDFLAGS) $(ILBC_LDFLAGS) $(LIBGSM_LDFLAGS) $(G729_LDFLAGS) $(LIBSRTP_LDFLAGS)\
|
||||
-Wl,-Bdynamic -lm -lstdc++ -lgcc -llog \
|
||||
-Wl,-$(_LT) -ltinySAK_$(MARCH) -ltinyHTTP_$(MARCH) -ltinyXCAP_$(MARCH) -ltinyIPSec_$(MARCH) -ltinySIGCOMP_$(MARCH) -ltinySMS_$(MARCH) -ltinyNET_$(MARCH) -ltinySDP_$(MARCH) -ltinyRTP_$(MARCH) -ltinyMEDIA_$(MARCH) -ltinyMSRP_$(MARCH) -ltinyDAV_$(MARCH) -ltinySIP_$(MARCH)
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# Build tinyWRAP for Google Android Systems
|
||||
|
||||
# GPL parameters
|
||||
export GPL_PARAMS="LICENSE=gpl NO_FREE=yes FFMPEG=yes H264=yes THEORA=yes OPENCORE_AMR=yes SPEEX_DSP=yes SPEEX_JB=yes SPEEX_RESAMPLER=yes SPEEX_DENOISE=1 SPEEX=yes ILBC=yes LIBGSM=yes G729=yes"
|
||||
export GPL_PARAMS="LICENSE=gpl NO_FREE=yes FFMPEG=yes H264=yes THEORA=yes OPENCORE_AMR=yes SPEEX_DSP=yes SPEEX_JB=yes SPEEX_RESAMPLER=yes SPEEX_DENOISE=1 SPEEX=yes ILBC=yes LIBGSM=yes G729=yes SRTP=yes"
|
||||
|
||||
for IS_NEON in no yes
|
||||
do
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# Build tinyWRAP for Google Android Systems
|
||||
|
||||
# GPL parameters
|
||||
export LGPL_PARAMS="LICENSE=lgpl FFMPEG=yes H264=no THEORA=yes OPENCORE_AMR=yes SPEEX_DSP=yes SPEEX_JB=yes SPEEX_RESAMPLER=yes SPEEX_DENOISE=yes SPEEX=yes ILBC=yes LIBGSM=yes G729=yes"
|
||||
export LGPL_PARAMS="LICENSE=lgpl FFMPEG=yes H264=no THEORA=yes OPENCORE_AMR=yes SPEEX_DSP=yes SPEEX_JB=yes SPEEX_RESAMPLER=yes SPEEX_DENOISE=yes SPEEX=yes ILBC=yes LIBGSM=yes G729=yes SRTP=yes"
|
||||
|
||||
for IS_NEON in no yes
|
||||
do
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# Build tinyWRAP for Google Android Systems
|
||||
|
||||
# GPL parameters
|
||||
export MINIMAL_PARAMS="FFMPEG=no H264=no THEORA=no OPENCORE_AMR=no SPEEX_DSP=yes SPEEX_JB=yes SPEEX_RESAMPLER=yes SPEEX_DENOISE=yes SPEEX=no ILBC=no LIBGSM=no G729=no"
|
||||
export MINIMAL_PARAMS="FFMPEG=no H264=no THEORA=no OPENCORE_AMR=no SPEEX_DSP=yes SPEEX_JB=yes SPEEX_RESAMPLER=yes SPEEX_DENOISE=yes SPEEX=no ILBC=no LIBGSM=no G729=no SRTP=yes"
|
||||
|
||||
for IS_NEON in no yes
|
||||
do
|
||||
|
|
|
@ -36,6 +36,7 @@ class tinyWRAPJNI {
|
|||
public final static native long ActionConfig_setMediaInt(long jarg1, ActionConfig jarg1_, int jarg2, String jarg3, int jarg4);
|
||||
public final static native void delete_MediaSessionMgr(long jarg1);
|
||||
public final static native boolean MediaSessionMgr_sessionSetInt32(long jarg1, MediaSessionMgr jarg1_, int jarg2, String jarg3, int jarg4);
|
||||
public final static native int MediaSessionMgr_sessionGetInt32(long jarg1, MediaSessionMgr jarg1_, int jarg2, String jarg3);
|
||||
public final static native boolean MediaSessionMgr_consumerSetInt32(long jarg1, MediaSessionMgr jarg1_, int jarg2, String jarg3, int jarg4);
|
||||
public final static native boolean MediaSessionMgr_consumerSetInt64(long jarg1, MediaSessionMgr jarg1_, int jarg2, String jarg3, long jarg4);
|
||||
public final static native boolean MediaSessionMgr_producerSetInt32(long jarg1, MediaSessionMgr jarg1_, int jarg2, String jarg3, int jarg4);
|
||||
|
@ -71,6 +72,7 @@ class tinyWRAPJNI {
|
|||
public final static native boolean MediaSessionMgr_defaultsSetVolume(int jarg1);
|
||||
public final static native int MediaSessionMgr_defaultsGetVolume();
|
||||
public final static native boolean MediaSessionMgr_defaultsSetInviteSessionTimers(int jarg1, String jarg2);
|
||||
public final static native boolean MediaSessionMgr_defaultsSetSRtpMode(int jarg1);
|
||||
public final static native void delete_MediaContent(long jarg1);
|
||||
public final static native String MediaContent_getType(long jarg1, MediaContent jarg1_);
|
||||
public final static native long MediaContent_getDataLength(long jarg1, MediaContent jarg1_);
|
||||
|
@ -263,6 +265,7 @@ class tinyWRAPJNI {
|
|||
public final static native void delete_ProxyPluginMgr(long jarg1);
|
||||
public final static native long ProxyPluginMgr_createInstance(long jarg1, ProxyPluginMgrCallback jarg1_);
|
||||
public final static native long ProxyPluginMgr_getInstance();
|
||||
public final static native long ProxyPluginMgr_findPlugin(long jarg1, ProxyPluginMgr jarg1_, java.math.BigInteger jarg2);
|
||||
public final static native long ProxyPluginMgr_findAudioConsumer(long jarg1, ProxyPluginMgr jarg1_, java.math.BigInteger jarg2);
|
||||
public final static native long ProxyPluginMgr_findVideoConsumer(long jarg1, ProxyPluginMgr jarg1_, java.math.BigInteger jarg2);
|
||||
public final static native long ProxyPluginMgr_findAudioProducer(long jarg1, ProxyPluginMgr jarg1_, java.math.BigInteger jarg2);
|
||||
|
|
|
@ -2322,6 +2322,30 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionM
|
|||
}
|
||||
|
||||
|
||||
SWIGEXPORT jint JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1sessionGetInt32(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2, jstring jarg3) {
|
||||
jint jresult = 0 ;
|
||||
MediaSessionMgr *arg1 = (MediaSessionMgr *) 0 ;
|
||||
twrap_media_type_t arg2 ;
|
||||
char *arg3 = (char *) 0 ;
|
||||
int32_t result;
|
||||
|
||||
(void)jenv;
|
||||
(void)jcls;
|
||||
(void)jarg1_;
|
||||
arg1 = *(MediaSessionMgr **)&jarg1;
|
||||
arg2 = (twrap_media_type_t)jarg2;
|
||||
arg3 = 0;
|
||||
if (jarg3) {
|
||||
arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0);
|
||||
if (!arg3) return 0;
|
||||
}
|
||||
result = (int32_t)(arg1)->sessionGetInt32(arg2,(char const *)arg3);
|
||||
jresult = (jint)result;
|
||||
if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3);
|
||||
return jresult;
|
||||
}
|
||||
|
||||
|
||||
SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1consumerSetInt32(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2, jstring jarg3, jint jarg4) {
|
||||
jboolean jresult = 0 ;
|
||||
MediaSessionMgr *arg1 = (MediaSessionMgr *) 0 ;
|
||||
|
@ -2878,6 +2902,20 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionM
|
|||
}
|
||||
|
||||
|
||||
SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetSRtpMode(JNIEnv *jenv, jclass jcls, jint jarg1) {
|
||||
jboolean jresult = 0 ;
|
||||
tmedia_srtp_mode_t arg1 ;
|
||||
bool result;
|
||||
|
||||
(void)jenv;
|
||||
(void)jcls;
|
||||
arg1 = (tmedia_srtp_mode_t)jarg1;
|
||||
result = (bool)MediaSessionMgr::defaultsSetSRtpMode(arg1);
|
||||
jresult = (jboolean)result;
|
||||
return jresult;
|
||||
}
|
||||
|
||||
|
||||
SWIGEXPORT void JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_delete_1MediaContent(JNIEnv *jenv, jclass jcls, jlong jarg1) {
|
||||
MediaContent *arg1 = (MediaContent *) 0 ;
|
||||
|
||||
|
@ -6138,6 +6176,45 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_ProxyPluginMgr_1
|
|||
}
|
||||
|
||||
|
||||
SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_ProxyPluginMgr_1findPlugin(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jobject jarg2) {
|
||||
jlong jresult = 0 ;
|
||||
ProxyPluginMgr *arg1 = (ProxyPluginMgr *) 0 ;
|
||||
uint64_t arg2 ;
|
||||
ProxyPlugin *result = 0 ;
|
||||
|
||||
(void)jenv;
|
||||
(void)jcls;
|
||||
(void)jarg1_;
|
||||
arg1 = *(ProxyPluginMgr **)&jarg1;
|
||||
{
|
||||
jclass clazz;
|
||||
jmethodID mid;
|
||||
jbyteArray ba;
|
||||
jbyte* bae;
|
||||
jsize sz;
|
||||
int i;
|
||||
|
||||
if (!jarg2) {
|
||||
SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "BigInteger null");
|
||||
return 0;
|
||||
}
|
||||
clazz = jenv->GetObjectClass(jarg2);
|
||||
mid = jenv->GetMethodID(clazz, "toByteArray", "()[B");
|
||||
ba = (jbyteArray)jenv->CallObjectMethod(jarg2, mid);
|
||||
bae = jenv->GetByteArrayElements(ba, 0);
|
||||
sz = jenv->GetArrayLength(ba);
|
||||
arg2 = 0;
|
||||
for(i=0; i<sz; i++) {
|
||||
arg2 = (arg2 << 8) | (uint64_t)(unsigned char)bae[i];
|
||||
}
|
||||
jenv->ReleaseByteArrayElements(ba, bae, 0);
|
||||
}
|
||||
result = (ProxyPlugin *)(arg1)->findPlugin(arg2);
|
||||
*(ProxyPlugin **)&jresult = result;
|
||||
return jresult;
|
||||
}
|
||||
|
||||
|
||||
SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_ProxyPluginMgr_1findAudioConsumer(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jobject jarg2) {
|
||||
jlong jresult = 0 ;
|
||||
ProxyPluginMgr *arg1 = (ProxyPluginMgr *) 0 ;
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
/* ----------------------------------------------------------------------------
|
||||
* This file was automatically generated by SWIG (http://www.swig.org).
|
||||
* Version 1.3.39
|
||||
*
|
||||
* Do not make changes to this file unless you know what you are doing--modify
|
||||
* the SWIG interface file instead.
|
||||
* ----------------------------------------------------------------------------- */
|
||||
|
||||
package org.doubango.tinyWRAP;
|
||||
|
||||
public enum tmedia_srtp_mode_t {
|
||||
tmedia_srtp_mode_none,
|
||||
tmedia_srtp_mode_optional,
|
||||
tmedia_srtp_mode_mandatory;
|
||||
|
||||
public final int swigValue() {
|
||||
return swigValue;
|
||||
}
|
||||
|
||||
public static tmedia_srtp_mode_t swigToEnum(int swigValue) {
|
||||
tmedia_srtp_mode_t[] swigValues = tmedia_srtp_mode_t.class.getEnumConstants();
|
||||
if (swigValue < swigValues.length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue)
|
||||
return swigValues[swigValue];
|
||||
for (tmedia_srtp_mode_t swigEnum : swigValues)
|
||||
if (swigEnum.swigValue == swigValue)
|
||||
return swigEnum;
|
||||
throw new IllegalArgumentException("No enum " + tmedia_srtp_mode_t.class + " with value " + swigValue);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private tmedia_srtp_mode_t() {
|
||||
this.swigValue = SwigNext.next++;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private tmedia_srtp_mode_t(int swigValue) {
|
||||
this.swigValue = swigValue;
|
||||
SwigNext.next = swigValue+1;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private tmedia_srtp_mode_t(tmedia_srtp_mode_t swigEnum) {
|
||||
this.swigValue = swigEnum.swigValue;
|
||||
SwigNext.next = this.swigValue+1;
|
||||
}
|
||||
|
||||
private final int swigValue;
|
||||
|
||||
private static class SwigNext {
|
||||
private static int next = 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -36,6 +36,7 @@ class tinyWRAPJNI {
|
|||
public final static native long ActionConfig_setMediaInt(long jarg1, ActionConfig jarg1_, int jarg2, String jarg3, int jarg4);
|
||||
public final static native void delete_MediaSessionMgr(long jarg1);
|
||||
public final static native boolean MediaSessionMgr_sessionSetInt32(long jarg1, MediaSessionMgr jarg1_, int jarg2, String jarg3, int jarg4);
|
||||
public final static native int MediaSessionMgr_sessionGetInt32(long jarg1, MediaSessionMgr jarg1_, int jarg2, String jarg3);
|
||||
public final static native boolean MediaSessionMgr_consumerSetInt32(long jarg1, MediaSessionMgr jarg1_, int jarg2, String jarg3, int jarg4);
|
||||
public final static native boolean MediaSessionMgr_consumerSetInt64(long jarg1, MediaSessionMgr jarg1_, int jarg2, String jarg3, long jarg4);
|
||||
public final static native boolean MediaSessionMgr_producerSetInt32(long jarg1, MediaSessionMgr jarg1_, int jarg2, String jarg3, int jarg4);
|
||||
|
@ -71,6 +72,7 @@ class tinyWRAPJNI {
|
|||
public final static native boolean MediaSessionMgr_defaultsSetVolume(int jarg1);
|
||||
public final static native int MediaSessionMgr_defaultsGetVolume();
|
||||
public final static native boolean MediaSessionMgr_defaultsSetInviteSessionTimers(int jarg1, String jarg2);
|
||||
public final static native boolean MediaSessionMgr_defaultsSetSRtpMode(int jarg1);
|
||||
public final static native void delete_MediaContent(long jarg1);
|
||||
public final static native String MediaContent_getType(long jarg1, MediaContent jarg1_);
|
||||
public final static native long MediaContent_getDataLength(long jarg1, MediaContent jarg1_);
|
||||
|
@ -263,6 +265,7 @@ class tinyWRAPJNI {
|
|||
public final static native void delete_ProxyPluginMgr(long jarg1);
|
||||
public final static native long ProxyPluginMgr_createInstance(long jarg1, ProxyPluginMgrCallback jarg1_);
|
||||
public final static native long ProxyPluginMgr_getInstance();
|
||||
public final static native long ProxyPluginMgr_findPlugin(long jarg1, ProxyPluginMgr jarg1_, java.math.BigInteger jarg2);
|
||||
public final static native long ProxyPluginMgr_findAudioConsumer(long jarg1, ProxyPluginMgr jarg1_, java.math.BigInteger jarg2);
|
||||
public final static native long ProxyPluginMgr_findVideoConsumer(long jarg1, ProxyPluginMgr jarg1_, java.math.BigInteger jarg2);
|
||||
public final static native long ProxyPluginMgr_findAudioProducer(long jarg1, ProxyPluginMgr jarg1_, java.math.BigInteger jarg2);
|
||||
|
|
|
@ -2322,6 +2322,30 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionM
|
|||
}
|
||||
|
||||
|
||||
SWIGEXPORT jint JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1sessionGetInt32(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2, jstring jarg3) {
|
||||
jint jresult = 0 ;
|
||||
MediaSessionMgr *arg1 = (MediaSessionMgr *) 0 ;
|
||||
twrap_media_type_t arg2 ;
|
||||
char *arg3 = (char *) 0 ;
|
||||
int32_t result;
|
||||
|
||||
(void)jenv;
|
||||
(void)jcls;
|
||||
(void)jarg1_;
|
||||
arg1 = *(MediaSessionMgr **)&jarg1;
|
||||
arg2 = (twrap_media_type_t)jarg2;
|
||||
arg3 = 0;
|
||||
if (jarg3) {
|
||||
arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0);
|
||||
if (!arg3) return 0;
|
||||
}
|
||||
result = (int32_t)(arg1)->sessionGetInt32(arg2,(char const *)arg3);
|
||||
jresult = (jint)result;
|
||||
if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3);
|
||||
return jresult;
|
||||
}
|
||||
|
||||
|
||||
SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1consumerSetInt32(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2, jstring jarg3, jint jarg4) {
|
||||
jboolean jresult = 0 ;
|
||||
MediaSessionMgr *arg1 = (MediaSessionMgr *) 0 ;
|
||||
|
@ -2878,6 +2902,20 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionM
|
|||
}
|
||||
|
||||
|
||||
SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetSRtpMode(JNIEnv *jenv, jclass jcls, jint jarg1) {
|
||||
jboolean jresult = 0 ;
|
||||
tmedia_srtp_mode_t arg1 ;
|
||||
bool result;
|
||||
|
||||
(void)jenv;
|
||||
(void)jcls;
|
||||
arg1 = (tmedia_srtp_mode_t)jarg1;
|
||||
result = (bool)MediaSessionMgr::defaultsSetSRtpMode(arg1);
|
||||
jresult = (jboolean)result;
|
||||
return jresult;
|
||||
}
|
||||
|
||||
|
||||
SWIGEXPORT void JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_delete_1MediaContent(JNIEnv *jenv, jclass jcls, jlong jarg1) {
|
||||
MediaContent *arg1 = (MediaContent *) 0 ;
|
||||
|
||||
|
@ -6138,6 +6176,45 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_ProxyPluginMgr_1
|
|||
}
|
||||
|
||||
|
||||
SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_ProxyPluginMgr_1findPlugin(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jobject jarg2) {
|
||||
jlong jresult = 0 ;
|
||||
ProxyPluginMgr *arg1 = (ProxyPluginMgr *) 0 ;
|
||||
uint64_t arg2 ;
|
||||
ProxyPlugin *result = 0 ;
|
||||
|
||||
(void)jenv;
|
||||
(void)jcls;
|
||||
(void)jarg1_;
|
||||
arg1 = *(ProxyPluginMgr **)&jarg1;
|
||||
{
|
||||
jclass clazz;
|
||||
jmethodID mid;
|
||||
jbyteArray ba;
|
||||
jbyte* bae;
|
||||
jsize sz;
|
||||
int i;
|
||||
|
||||
if (!jarg2) {
|
||||
SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "BigInteger null");
|
||||
return 0;
|
||||
}
|
||||
clazz = jenv->GetObjectClass(jarg2);
|
||||
mid = jenv->GetMethodID(clazz, "toByteArray", "()[B");
|
||||
ba = (jbyteArray)jenv->CallObjectMethod(jarg2, mid);
|
||||
bae = jenv->GetByteArrayElements(ba, 0);
|
||||
sz = jenv->GetArrayLength(ba);
|
||||
arg2 = 0;
|
||||
for(i=0; i<sz; i++) {
|
||||
arg2 = (arg2 << 8) | (uint64_t)(unsigned char)bae[i];
|
||||
}
|
||||
jenv->ReleaseByteArrayElements(ba, bae, 0);
|
||||
}
|
||||
result = (ProxyPlugin *)(arg1)->findPlugin(arg2);
|
||||
*(ProxyPlugin **)&jresult = result;
|
||||
return jresult;
|
||||
}
|
||||
|
||||
|
||||
SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_ProxyPluginMgr_1findAudioConsumer(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jobject jarg2) {
|
||||
jlong jresult = 0 ;
|
||||
ProxyPluginMgr *arg1 = (ProxyPluginMgr *) 0 ;
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
/* ----------------------------------------------------------------------------
|
||||
* This file was automatically generated by SWIG (http://www.swig.org).
|
||||
* Version 1.3.39
|
||||
*
|
||||
* Do not make changes to this file unless you know what you are doing--modify
|
||||
* the SWIG interface file instead.
|
||||
* ----------------------------------------------------------------------------- */
|
||||
|
||||
package org.doubango.tinyWRAP;
|
||||
|
||||
public enum tmedia_srtp_mode_t {
|
||||
tmedia_srtp_mode_none,
|
||||
tmedia_srtp_mode_optional,
|
||||
tmedia_srtp_mode_mandatory;
|
||||
|
||||
public final int swigValue() {
|
||||
return swigValue;
|
||||
}
|
||||
|
||||
public static tmedia_srtp_mode_t swigToEnum(int swigValue) {
|
||||
tmedia_srtp_mode_t[] swigValues = tmedia_srtp_mode_t.class.getEnumConstants();
|
||||
if (swigValue < swigValues.length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue)
|
||||
return swigValues[swigValue];
|
||||
for (tmedia_srtp_mode_t swigEnum : swigValues)
|
||||
if (swigEnum.swigValue == swigValue)
|
||||
return swigEnum;
|
||||
throw new IllegalArgumentException("No enum " + tmedia_srtp_mode_t.class + " with value " + swigValue);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private tmedia_srtp_mode_t() {
|
||||
this.swigValue = SwigNext.next++;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private tmedia_srtp_mode_t(int swigValue) {
|
||||
this.swigValue = swigValue;
|
||||
SwigNext.next = swigValue+1;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private tmedia_srtp_mode_t(tmedia_srtp_mode_t swigEnum) {
|
||||
this.swigValue = swigEnum.swigValue;
|
||||
SwigNext.next = this.swigValue+1;
|
||||
}
|
||||
|
||||
private final int swigValue;
|
||||
|
||||
private static class SwigNext {
|
||||
private static int next = 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -193,6 +193,7 @@ sub DESTROY {
|
|||
}
|
||||
|
||||
*sessionSetInt32 = *tinyWRAPc::MediaSessionMgr_sessionSetInt32;
|
||||
*sessionGetInt32 = *tinyWRAPc::MediaSessionMgr_sessionGetInt32;
|
||||
*consumerSetInt32 = *tinyWRAPc::MediaSessionMgr_consumerSetInt32;
|
||||
*consumerSetInt64 = *tinyWRAPc::MediaSessionMgr_consumerSetInt64;
|
||||
*producerSetInt32 = *tinyWRAPc::MediaSessionMgr_producerSetInt32;
|
||||
|
@ -228,6 +229,7 @@ sub DESTROY {
|
|||
*defaultsSetVolume = *tinyWRAPc::MediaSessionMgr_defaultsSetVolume;
|
||||
*defaultsGetVolume = *tinyWRAPc::MediaSessionMgr_defaultsGetVolume;
|
||||
*defaultsSetInviteSessionTimers = *tinyWRAPc::MediaSessionMgr_defaultsSetInviteSessionTimers;
|
||||
*defaultsSetSRtpMode = *tinyWRAPc::MediaSessionMgr_defaultsSetSRtpMode;
|
||||
sub DISOWN {
|
||||
my $self = shift;
|
||||
my $ptr = tied(%$self);
|
||||
|
@ -1218,6 +1220,7 @@ sub DESTROY {
|
|||
|
||||
*createInstance = *tinyWRAPc::ProxyPluginMgr_createInstance;
|
||||
*getInstance = *tinyWRAPc::ProxyPluginMgr_getInstance;
|
||||
*findPlugin = *tinyWRAPc::ProxyPluginMgr_findPlugin;
|
||||
*findAudioConsumer = *tinyWRAPc::ProxyPluginMgr_findAudioConsumer;
|
||||
*findVideoConsumer = *tinyWRAPc::ProxyPluginMgr_findVideoConsumer;
|
||||
*findAudioProducer = *tinyWRAPc::ProxyPluginMgr_findAudioProducer;
|
||||
|
@ -2390,6 +2393,9 @@ package tinyWRAP;
|
|||
*tmedia_chroma_yuv422p = *tinyWRAPc::tmedia_chroma_yuv422p;
|
||||
*tmedia_chroma_uyvy422 = *tinyWRAPc::tmedia_chroma_uyvy422;
|
||||
*tmedia_chroma_yuv420p = *tinyWRAPc::tmedia_chroma_yuv420p;
|
||||
*tmedia_srtp_mode_none = *tinyWRAPc::tmedia_srtp_mode_none;
|
||||
*tmedia_srtp_mode_optional = *tinyWRAPc::tmedia_srtp_mode_optional;
|
||||
*tmedia_srtp_mode_mandatory = *tinyWRAPc::tmedia_srtp_mode_mandatory;
|
||||
*tmedia_qos_stype_none = *tinyWRAPc::tmedia_qos_stype_none;
|
||||
*tmedia_qos_stype_segmented = *tinyWRAPc::tmedia_qos_stype_segmented;
|
||||
*tmedia_qos_stype_e2e = *tinyWRAPc::tmedia_qos_stype_e2e;
|
||||
|
|
|
@ -1561,28 +1561,29 @@ SWIG_Perl_SetModule(swig_module_info *module) {
|
|||
#define SWIGTYPE_p_tmedia_chroma_e swig_types[63]
|
||||
#define SWIGTYPE_p_tmedia_qos_strength_e swig_types[64]
|
||||
#define SWIGTYPE_p_tmedia_qos_stype_e swig_types[65]
|
||||
#define SWIGTYPE_p_tmsrp_event_type_e swig_types[66]
|
||||
#define SWIGTYPE_p_tmsrp_request_type_e swig_types[67]
|
||||
#define SWIGTYPE_p_tsip_event_type_e swig_types[68]
|
||||
#define SWIGTYPE_p_tsip_info_event_type_e swig_types[69]
|
||||
#define SWIGTYPE_p_tsip_invite_event_type_e swig_types[70]
|
||||
#define SWIGTYPE_p_tsip_message_event_type_e swig_types[71]
|
||||
#define SWIGTYPE_p_tsip_options_event_type_e swig_types[72]
|
||||
#define SWIGTYPE_p_tsip_publish_event_type_e swig_types[73]
|
||||
#define SWIGTYPE_p_tsip_register_event_type_e swig_types[74]
|
||||
#define SWIGTYPE_p_tsip_request_type_e swig_types[75]
|
||||
#define SWIGTYPE_p_tsip_subscribe_event_type_e swig_types[76]
|
||||
#define SWIGTYPE_p_tsk_list_t swig_types[77]
|
||||
#define SWIGTYPE_p_twrap_media_type_e swig_types[78]
|
||||
#define SWIGTYPE_p_twrap_proxy_plugin_type_e swig_types[79]
|
||||
#define SWIGTYPE_p_twrap_rpmessage_type_e swig_types[80]
|
||||
#define SWIGTYPE_p_twrap_sms_type_e swig_types[81]
|
||||
#define SWIGTYPE_p_unsigned_char swig_types[82]
|
||||
#define SWIGTYPE_p_unsigned_int swig_types[83]
|
||||
#define SWIGTYPE_p_unsigned_long_long swig_types[84]
|
||||
#define SWIGTYPE_p_unsigned_short swig_types[85]
|
||||
static swig_type_info *swig_types[87];
|
||||
static swig_module_info swig_module = {swig_types, 86, 0, 0, 0, 0};
|
||||
#define SWIGTYPE_p_tmedia_srtp_mode_e swig_types[66]
|
||||
#define SWIGTYPE_p_tmsrp_event_type_e swig_types[67]
|
||||
#define SWIGTYPE_p_tmsrp_request_type_e swig_types[68]
|
||||
#define SWIGTYPE_p_tsip_event_type_e swig_types[69]
|
||||
#define SWIGTYPE_p_tsip_info_event_type_e swig_types[70]
|
||||
#define SWIGTYPE_p_tsip_invite_event_type_e swig_types[71]
|
||||
#define SWIGTYPE_p_tsip_message_event_type_e swig_types[72]
|
||||
#define SWIGTYPE_p_tsip_options_event_type_e swig_types[73]
|
||||
#define SWIGTYPE_p_tsip_publish_event_type_e swig_types[74]
|
||||
#define SWIGTYPE_p_tsip_register_event_type_e swig_types[75]
|
||||
#define SWIGTYPE_p_tsip_request_type_e swig_types[76]
|
||||
#define SWIGTYPE_p_tsip_subscribe_event_type_e swig_types[77]
|
||||
#define SWIGTYPE_p_tsk_list_t swig_types[78]
|
||||
#define SWIGTYPE_p_twrap_media_type_e swig_types[79]
|
||||
#define SWIGTYPE_p_twrap_proxy_plugin_type_e swig_types[80]
|
||||
#define SWIGTYPE_p_twrap_rpmessage_type_e swig_types[81]
|
||||
#define SWIGTYPE_p_twrap_sms_type_e swig_types[82]
|
||||
#define SWIGTYPE_p_unsigned_char swig_types[83]
|
||||
#define SWIGTYPE_p_unsigned_int swig_types[84]
|
||||
#define SWIGTYPE_p_unsigned_long_long swig_types[85]
|
||||
#define SWIGTYPE_p_unsigned_short swig_types[86]
|
||||
static swig_type_info *swig_types[88];
|
||||
static swig_module_info swig_module = {swig_types, 87, 0, 0, 0, 0};
|
||||
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
|
||||
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
|
||||
|
||||
|
@ -3101,6 +3102,55 @@ XS(_wrap_MediaSessionMgr_sessionSetInt32) {
|
|||
}
|
||||
|
||||
|
||||
XS(_wrap_MediaSessionMgr_sessionGetInt32) {
|
||||
{
|
||||
MediaSessionMgr *arg1 = (MediaSessionMgr *) 0 ;
|
||||
twrap_media_type_t arg2 ;
|
||||
char *arg3 = (char *) 0 ;
|
||||
void *argp1 = 0 ;
|
||||
int res1 = 0 ;
|
||||
int val2 ;
|
||||
int ecode2 = 0 ;
|
||||
int res3 ;
|
||||
char *buf3 = 0 ;
|
||||
int alloc3 = 0 ;
|
||||
int argvi = 0;
|
||||
int32_t result;
|
||||
dXSARGS;
|
||||
|
||||
if ((items < 3) || (items > 3)) {
|
||||
SWIG_croak("Usage: MediaSessionMgr_sessionGetInt32(self,media,key);");
|
||||
}
|
||||
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_MediaSessionMgr, 0 | 0 );
|
||||
if (!SWIG_IsOK(res1)) {
|
||||
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MediaSessionMgr_sessionGetInt32" "', argument " "1"" of type '" "MediaSessionMgr *""'");
|
||||
}
|
||||
arg1 = reinterpret_cast< MediaSessionMgr * >(argp1);
|
||||
ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
|
||||
if (!SWIG_IsOK(ecode2)) {
|
||||
SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MediaSessionMgr_sessionGetInt32" "', argument " "2"" of type '" "twrap_media_type_t""'");
|
||||
}
|
||||
arg2 = static_cast< twrap_media_type_t >(val2);
|
||||
res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
|
||||
if (!SWIG_IsOK(res3)) {
|
||||
SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MediaSessionMgr_sessionGetInt32" "', argument " "3"" of type '" "char const *""'");
|
||||
}
|
||||
arg3 = reinterpret_cast< char * >(buf3);
|
||||
result = (int32_t)(arg1)->sessionGetInt32(arg2,(char const *)arg3);
|
||||
ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ;
|
||||
|
||||
|
||||
if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
|
||||
XSRETURN(argvi);
|
||||
fail:
|
||||
|
||||
|
||||
if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
|
||||
SWIG_croak_null();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
XS(_wrap_MediaSessionMgr_consumerSetInt32) {
|
||||
{
|
||||
MediaSessionMgr *arg1 = (MediaSessionMgr *) 0 ;
|
||||
|
@ -4176,6 +4226,34 @@ XS(_wrap_MediaSessionMgr_defaultsSetInviteSessionTimers) {
|
|||
}
|
||||
|
||||
|
||||
XS(_wrap_MediaSessionMgr_defaultsSetSRtpMode) {
|
||||
{
|
||||
tmedia_srtp_mode_t arg1 ;
|
||||
int val1 ;
|
||||
int ecode1 = 0 ;
|
||||
int argvi = 0;
|
||||
bool result;
|
||||
dXSARGS;
|
||||
|
||||
if ((items < 1) || (items > 1)) {
|
||||
SWIG_croak("Usage: MediaSessionMgr_defaultsSetSRtpMode(mode);");
|
||||
}
|
||||
ecode1 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1);
|
||||
if (!SWIG_IsOK(ecode1)) {
|
||||
SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "MediaSessionMgr_defaultsSetSRtpMode" "', argument " "1"" of type '" "tmedia_srtp_mode_t""'");
|
||||
}
|
||||
arg1 = static_cast< tmedia_srtp_mode_t >(val1);
|
||||
result = (bool)MediaSessionMgr::defaultsSetSRtpMode(arg1);
|
||||
ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ;
|
||||
|
||||
XSRETURN(argvi);
|
||||
fail:
|
||||
|
||||
SWIG_croak_null();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
XS(_wrap_delete_MediaContent) {
|
||||
{
|
||||
MediaContent *arg1 = (MediaContent *) 0 ;
|
||||
|
@ -14204,6 +14282,44 @@ XS(_wrap_ProxyPluginMgr_getInstance) {
|
|||
}
|
||||
|
||||
|
||||
XS(_wrap_ProxyPluginMgr_findPlugin) {
|
||||
{
|
||||
ProxyPluginMgr *arg1 = (ProxyPluginMgr *) 0 ;
|
||||
uint64_t arg2 ;
|
||||
void *argp1 = 0 ;
|
||||
int res1 = 0 ;
|
||||
unsigned long long val2 ;
|
||||
int ecode2 = 0 ;
|
||||
int argvi = 0;
|
||||
ProxyPlugin *result = 0 ;
|
||||
dXSARGS;
|
||||
|
||||
if ((items < 2) || (items > 2)) {
|
||||
SWIG_croak("Usage: ProxyPluginMgr_findPlugin(self,id);");
|
||||
}
|
||||
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ProxyPluginMgr, 0 | 0 );
|
||||
if (!SWIG_IsOK(res1)) {
|
||||
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ProxyPluginMgr_findPlugin" "', argument " "1"" of type '" "ProxyPluginMgr *""'");
|
||||
}
|
||||
arg1 = reinterpret_cast< ProxyPluginMgr * >(argp1);
|
||||
ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
|
||||
if (!SWIG_IsOK(ecode2)) {
|
||||
SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ProxyPluginMgr_findPlugin" "', argument " "2"" of type '" "uint64_t""'");
|
||||
}
|
||||
arg2 = static_cast< uint64_t >(val2);
|
||||
result = (ProxyPlugin *)(arg1)->findPlugin(arg2);
|
||||
ST(argvi) = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ProxyPlugin, 0 | SWIG_SHADOW); argvi++ ;
|
||||
|
||||
|
||||
XSRETURN(argvi);
|
||||
fail:
|
||||
|
||||
|
||||
SWIG_croak_null();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
XS(_wrap_ProxyPluginMgr_findAudioConsumer) {
|
||||
{
|
||||
ProxyPluginMgr *arg1 = (ProxyPluginMgr *) 0 ;
|
||||
|
@ -23160,6 +23276,7 @@ static swig_type_info _swigt__p_tmedia_bandwidth_level_e = {"_p_tmedia_bandwidth
|
|||
static swig_type_info _swigt__p_tmedia_chroma_e = {"_p_tmedia_chroma_e", "tmedia_chroma_t *|enum tmedia_chroma_e *", 0, 0, (void*)0, 0};
|
||||
static swig_type_info _swigt__p_tmedia_qos_strength_e = {"_p_tmedia_qos_strength_e", "tmedia_qos_strength_t *|enum tmedia_qos_strength_e *", 0, 0, (void*)0, 0};
|
||||
static swig_type_info _swigt__p_tmedia_qos_stype_e = {"_p_tmedia_qos_stype_e", "enum tmedia_qos_stype_e *|tmedia_qos_stype_t *", 0, 0, (void*)0, 0};
|
||||
static swig_type_info _swigt__p_tmedia_srtp_mode_e = {"_p_tmedia_srtp_mode_e", "enum tmedia_srtp_mode_e *|tmedia_srtp_mode_t *", 0, 0, (void*)0, 0};
|
||||
static swig_type_info _swigt__p_tmsrp_event_type_e = {"_p_tmsrp_event_type_e", "enum tmsrp_event_type_e *|tmsrp_event_type_t *", 0, 0, (void*)0, 0};
|
||||
static swig_type_info _swigt__p_tmsrp_request_type_e = {"_p_tmsrp_request_type_e", "enum tmsrp_request_type_e *|tmsrp_request_type_t *", 0, 0, (void*)0, 0};
|
||||
static swig_type_info _swigt__p_tsip_event_type_e = {"_p_tsip_event_type_e", "enum tsip_event_type_e *|tsip_event_type_t *", 0, 0, (void*)0, 0};
|
||||
|
@ -23248,6 +23365,7 @@ static swig_type_info *swig_type_initial[] = {
|
|||
&_swigt__p_tmedia_chroma_e,
|
||||
&_swigt__p_tmedia_qos_strength_e,
|
||||
&_swigt__p_tmedia_qos_stype_e,
|
||||
&_swigt__p_tmedia_srtp_mode_e,
|
||||
&_swigt__p_tmsrp_event_type_e,
|
||||
&_swigt__p_tmsrp_request_type_e,
|
||||
&_swigt__p_tsip_event_type_e,
|
||||
|
@ -23336,6 +23454,7 @@ static swig_cast_info _swigc__p_tmedia_bandwidth_level_e[] = { {&_swigt__p_tmed
|
|||
static swig_cast_info _swigc__p_tmedia_chroma_e[] = { {&_swigt__p_tmedia_chroma_e, 0, 0, 0},{0, 0, 0, 0}};
|
||||
static swig_cast_info _swigc__p_tmedia_qos_strength_e[] = { {&_swigt__p_tmedia_qos_strength_e, 0, 0, 0},{0, 0, 0, 0}};
|
||||
static swig_cast_info _swigc__p_tmedia_qos_stype_e[] = { {&_swigt__p_tmedia_qos_stype_e, 0, 0, 0},{0, 0, 0, 0}};
|
||||
static swig_cast_info _swigc__p_tmedia_srtp_mode_e[] = { {&_swigt__p_tmedia_srtp_mode_e, 0, 0, 0},{0, 0, 0, 0}};
|
||||
static swig_cast_info _swigc__p_tmsrp_event_type_e[] = { {&_swigt__p_tmsrp_event_type_e, 0, 0, 0},{0, 0, 0, 0}};
|
||||
static swig_cast_info _swigc__p_tmsrp_request_type_e[] = { {&_swigt__p_tmsrp_request_type_e, 0, 0, 0},{0, 0, 0, 0}};
|
||||
static swig_cast_info _swigc__p_tsip_event_type_e[] = { {&_swigt__p_tsip_event_type_e, 0, 0, 0},{0, 0, 0, 0}};
|
||||
|
@ -23424,6 +23543,7 @@ static swig_cast_info *swig_cast_initial[] = {
|
|||
_swigc__p_tmedia_chroma_e,
|
||||
_swigc__p_tmedia_qos_strength_e,
|
||||
_swigc__p_tmedia_qos_stype_e,
|
||||
_swigc__p_tmedia_srtp_mode_e,
|
||||
_swigc__p_tmsrp_event_type_e,
|
||||
_swigc__p_tmsrp_request_type_e,
|
||||
_swigc__p_tsip_event_type_e,
|
||||
|
@ -23480,6 +23600,7 @@ static swig_command_info swig_commands[] = {
|
|||
{"tinyWRAPc::ActionConfig_setMediaInt", _wrap_ActionConfig_setMediaInt},
|
||||
{"tinyWRAPc::delete_MediaSessionMgr", _wrap_delete_MediaSessionMgr},
|
||||
{"tinyWRAPc::MediaSessionMgr_sessionSetInt32", _wrap_MediaSessionMgr_sessionSetInt32},
|
||||
{"tinyWRAPc::MediaSessionMgr_sessionGetInt32", _wrap_MediaSessionMgr_sessionGetInt32},
|
||||
{"tinyWRAPc::MediaSessionMgr_consumerSetInt32", _wrap_MediaSessionMgr_consumerSetInt32},
|
||||
{"tinyWRAPc::MediaSessionMgr_consumerSetInt64", _wrap_MediaSessionMgr_consumerSetInt64},
|
||||
{"tinyWRAPc::MediaSessionMgr_producerSetInt32", _wrap_MediaSessionMgr_producerSetInt32},
|
||||
|
@ -23515,6 +23636,7 @@ static swig_command_info swig_commands[] = {
|
|||
{"tinyWRAPc::MediaSessionMgr_defaultsSetVolume", _wrap_MediaSessionMgr_defaultsSetVolume},
|
||||
{"tinyWRAPc::MediaSessionMgr_defaultsGetVolume", _wrap_MediaSessionMgr_defaultsGetVolume},
|
||||
{"tinyWRAPc::MediaSessionMgr_defaultsSetInviteSessionTimers", _wrap_MediaSessionMgr_defaultsSetInviteSessionTimers},
|
||||
{"tinyWRAPc::MediaSessionMgr_defaultsSetSRtpMode", _wrap_MediaSessionMgr_defaultsSetSRtpMode},
|
||||
{"tinyWRAPc::delete_MediaContent", _wrap_delete_MediaContent},
|
||||
{"tinyWRAPc::MediaContent_getType", _wrap_MediaContent_getType},
|
||||
{"tinyWRAPc::MediaContent_getDataLength", _wrap_MediaContent_getDataLength},
|
||||
|
@ -23660,6 +23782,7 @@ static swig_command_info swig_commands[] = {
|
|||
{"tinyWRAPc::delete_ProxyPluginMgr", _wrap_delete_ProxyPluginMgr},
|
||||
{"tinyWRAPc::ProxyPluginMgr_createInstance", _wrap_ProxyPluginMgr_createInstance},
|
||||
{"tinyWRAPc::ProxyPluginMgr_getInstance", _wrap_ProxyPluginMgr_getInstance},
|
||||
{"tinyWRAPc::ProxyPluginMgr_findPlugin", _wrap_ProxyPluginMgr_findPlugin},
|
||||
{"tinyWRAPc::ProxyPluginMgr_findAudioConsumer", _wrap_ProxyPluginMgr_findAudioConsumer},
|
||||
{"tinyWRAPc::ProxyPluginMgr_findVideoConsumer", _wrap_ProxyPluginMgr_findVideoConsumer},
|
||||
{"tinyWRAPc::ProxyPluginMgr_findAudioProducer", _wrap_ProxyPluginMgr_findAudioProducer},
|
||||
|
@ -24727,6 +24850,21 @@ XS(SWIG_init) {
|
|||
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_chroma_yuv420p)));
|
||||
SvREADONLY_on(sv);
|
||||
} while(0) /*@SWIG@*/;
|
||||
/*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do {
|
||||
SV *sv = get_sv((char*) SWIG_prefix "tmedia_srtp_mode_none", TRUE | 0x2 | GV_ADDMULTI);
|
||||
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_srtp_mode_none)));
|
||||
SvREADONLY_on(sv);
|
||||
} while(0) /*@SWIG@*/;
|
||||
/*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do {
|
||||
SV *sv = get_sv((char*) SWIG_prefix "tmedia_srtp_mode_optional", TRUE | 0x2 | GV_ADDMULTI);
|
||||
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_srtp_mode_optional)));
|
||||
SvREADONLY_on(sv);
|
||||
} while(0) /*@SWIG@*/;
|
||||
/*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do {
|
||||
SV *sv = get_sv((char*) SWIG_prefix "tmedia_srtp_mode_mandatory", TRUE | 0x2 | GV_ADDMULTI);
|
||||
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_srtp_mode_mandatory)));
|
||||
SvREADONLY_on(sv);
|
||||
} while(0) /*@SWIG@*/;
|
||||
/*@SWIG:/usr/local/share/swig/1.3.39/perl5/perltypemaps.swg,65,%set_constant@*/ do {
|
||||
SV *sv = get_sv((char*) SWIG_prefix "tmedia_qos_stype_none", TRUE | 0x2 | GV_ADDMULTI);
|
||||
sv_setsv(sv, SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(tmedia_qos_stype_none)));
|
||||
|
|
|
@ -148,6 +148,7 @@ class MediaSessionMgr(_object):
|
|||
__swig_destroy__ = _tinyWRAP.delete_MediaSessionMgr
|
||||
__del__ = lambda self : None;
|
||||
def sessionSetInt32(self, *args): return _tinyWRAP.MediaSessionMgr_sessionSetInt32(self, *args)
|
||||
def sessionGetInt32(self, *args): return _tinyWRAP.MediaSessionMgr_sessionGetInt32(self, *args)
|
||||
def consumerSetInt32(self, *args): return _tinyWRAP.MediaSessionMgr_consumerSetInt32(self, *args)
|
||||
def consumerSetInt64(self, *args): return _tinyWRAP.MediaSessionMgr_consumerSetInt64(self, *args)
|
||||
def producerSetInt32(self, *args): return _tinyWRAP.MediaSessionMgr_producerSetInt32(self, *args)
|
||||
|
@ -211,6 +212,8 @@ class MediaSessionMgr(_object):
|
|||
if _newclass:defaultsGetVolume = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsGetVolume)
|
||||
__swig_getmethods__["defaultsSetInviteSessionTimers"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsSetInviteSessionTimers
|
||||
if _newclass:defaultsSetInviteSessionTimers = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsSetInviteSessionTimers)
|
||||
__swig_getmethods__["defaultsSetSRtpMode"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsSetSRtpMode
|
||||
if _newclass:defaultsSetSRtpMode = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsSetSRtpMode)
|
||||
MediaSessionMgr_swigregister = _tinyWRAP.MediaSessionMgr_swigregister
|
||||
MediaSessionMgr_swigregister(MediaSessionMgr)
|
||||
|
||||
|
@ -326,6 +329,10 @@ def MediaSessionMgr_defaultsSetInviteSessionTimers(*args):
|
|||
return _tinyWRAP.MediaSessionMgr_defaultsSetInviteSessionTimers(*args)
|
||||
MediaSessionMgr_defaultsSetInviteSessionTimers = _tinyWRAP.MediaSessionMgr_defaultsSetInviteSessionTimers
|
||||
|
||||
def MediaSessionMgr_defaultsSetSRtpMode(*args):
|
||||
return _tinyWRAP.MediaSessionMgr_defaultsSetSRtpMode(*args)
|
||||
MediaSessionMgr_defaultsSetSRtpMode = _tinyWRAP.MediaSessionMgr_defaultsSetSRtpMode
|
||||
|
||||
class MediaContent(_object):
|
||||
__swig_setmethods__ = {}
|
||||
__setattr__ = lambda self, name, value: _swig_setattr(self, MediaContent, name, value)
|
||||
|
@ -829,6 +836,7 @@ class ProxyPluginMgr(_object):
|
|||
if _newclass:createInstance = staticmethod(_tinyWRAP.ProxyPluginMgr_createInstance)
|
||||
__swig_getmethods__["getInstance"] = lambda x: _tinyWRAP.ProxyPluginMgr_getInstance
|
||||
if _newclass:getInstance = staticmethod(_tinyWRAP.ProxyPluginMgr_getInstance)
|
||||
def findPlugin(self, *args): return _tinyWRAP.ProxyPluginMgr_findPlugin(self, *args)
|
||||
def findAudioConsumer(self, *args): return _tinyWRAP.ProxyPluginMgr_findAudioConsumer(self, *args)
|
||||
def findVideoConsumer(self, *args): return _tinyWRAP.ProxyPluginMgr_findVideoConsumer(self, *args)
|
||||
def findAudioProducer(self, *args): return _tinyWRAP.ProxyPluginMgr_findAudioProducer(self, *args)
|
||||
|
@ -1369,6 +1377,9 @@ tmedia_chroma_nv21 = _tinyWRAP.tmedia_chroma_nv21
|
|||
tmedia_chroma_yuv422p = _tinyWRAP.tmedia_chroma_yuv422p
|
||||
tmedia_chroma_uyvy422 = _tinyWRAP.tmedia_chroma_uyvy422
|
||||
tmedia_chroma_yuv420p = _tinyWRAP.tmedia_chroma_yuv420p
|
||||
tmedia_srtp_mode_none = _tinyWRAP.tmedia_srtp_mode_none
|
||||
tmedia_srtp_mode_optional = _tinyWRAP.tmedia_srtp_mode_optional
|
||||
tmedia_srtp_mode_mandatory = _tinyWRAP.tmedia_srtp_mode_mandatory
|
||||
tmedia_qos_stype_none = _tinyWRAP.tmedia_qos_stype_none
|
||||
tmedia_qos_stype_segmented = _tinyWRAP.tmedia_qos_stype_segmented
|
||||
tmedia_qos_stype_e2e = _tinyWRAP.tmedia_qos_stype_e2e
|
||||
|
|
|
@ -3187,28 +3187,29 @@ namespace Swig {
|
|||
#define SWIGTYPE_p_tmedia_chroma_e swig_types[63]
|
||||
#define SWIGTYPE_p_tmedia_qos_strength_e swig_types[64]
|
||||
#define SWIGTYPE_p_tmedia_qos_stype_e swig_types[65]
|
||||
#define SWIGTYPE_p_tmsrp_event_type_e swig_types[66]
|
||||
#define SWIGTYPE_p_tmsrp_request_type_e swig_types[67]
|
||||
#define SWIGTYPE_p_tsip_event_type_e swig_types[68]
|
||||
#define SWIGTYPE_p_tsip_info_event_type_e swig_types[69]
|
||||
#define SWIGTYPE_p_tsip_invite_event_type_e swig_types[70]
|
||||
#define SWIGTYPE_p_tsip_message_event_type_e swig_types[71]
|
||||
#define SWIGTYPE_p_tsip_options_event_type_e swig_types[72]
|
||||
#define SWIGTYPE_p_tsip_publish_event_type_e swig_types[73]
|
||||
#define SWIGTYPE_p_tsip_register_event_type_e swig_types[74]
|
||||
#define SWIGTYPE_p_tsip_request_type_e swig_types[75]
|
||||
#define SWIGTYPE_p_tsip_subscribe_event_type_e swig_types[76]
|
||||
#define SWIGTYPE_p_tsk_list_t swig_types[77]
|
||||
#define SWIGTYPE_p_twrap_media_type_e swig_types[78]
|
||||
#define SWIGTYPE_p_twrap_proxy_plugin_type_e swig_types[79]
|
||||
#define SWIGTYPE_p_twrap_rpmessage_type_e swig_types[80]
|
||||
#define SWIGTYPE_p_twrap_sms_type_e swig_types[81]
|
||||
#define SWIGTYPE_p_unsigned_char swig_types[82]
|
||||
#define SWIGTYPE_p_unsigned_int swig_types[83]
|
||||
#define SWIGTYPE_p_unsigned_long_long swig_types[84]
|
||||
#define SWIGTYPE_p_unsigned_short swig_types[85]
|
||||
static swig_type_info *swig_types[87];
|
||||
static swig_module_info swig_module = {swig_types, 86, 0, 0, 0, 0};
|
||||
#define SWIGTYPE_p_tmedia_srtp_mode_e swig_types[66]
|
||||
#define SWIGTYPE_p_tmsrp_event_type_e swig_types[67]
|
||||
#define SWIGTYPE_p_tmsrp_request_type_e swig_types[68]
|
||||
#define SWIGTYPE_p_tsip_event_type_e swig_types[69]
|
||||
#define SWIGTYPE_p_tsip_info_event_type_e swig_types[70]
|
||||
#define SWIGTYPE_p_tsip_invite_event_type_e swig_types[71]
|
||||
#define SWIGTYPE_p_tsip_message_event_type_e swig_types[72]
|
||||
#define SWIGTYPE_p_tsip_options_event_type_e swig_types[73]
|
||||
#define SWIGTYPE_p_tsip_publish_event_type_e swig_types[74]
|
||||
#define SWIGTYPE_p_tsip_register_event_type_e swig_types[75]
|
||||
#define SWIGTYPE_p_tsip_request_type_e swig_types[76]
|
||||
#define SWIGTYPE_p_tsip_subscribe_event_type_e swig_types[77]
|
||||
#define SWIGTYPE_p_tsk_list_t swig_types[78]
|
||||
#define SWIGTYPE_p_twrap_media_type_e swig_types[79]
|
||||
#define SWIGTYPE_p_twrap_proxy_plugin_type_e swig_types[80]
|
||||
#define SWIGTYPE_p_twrap_rpmessage_type_e swig_types[81]
|
||||
#define SWIGTYPE_p_twrap_sms_type_e swig_types[82]
|
||||
#define SWIGTYPE_p_unsigned_char swig_types[83]
|
||||
#define SWIGTYPE_p_unsigned_int swig_types[84]
|
||||
#define SWIGTYPE_p_unsigned_long_long swig_types[85]
|
||||
#define SWIGTYPE_p_unsigned_short swig_types[86]
|
||||
static swig_type_info *swig_types[88];
|
||||
static swig_module_info swig_module = {swig_types, 87, 0, 0, 0, 0};
|
||||
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
|
||||
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
|
||||
|
||||
|
@ -5892,6 +5893,49 @@ fail:
|
|||
}
|
||||
|
||||
|
||||
SWIGINTERN PyObject *_wrap_MediaSessionMgr_sessionGetInt32(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
|
||||
PyObject *resultobj = 0;
|
||||
MediaSessionMgr *arg1 = (MediaSessionMgr *) 0 ;
|
||||
twrap_media_type_t arg2 ;
|
||||
char *arg3 = (char *) 0 ;
|
||||
void *argp1 = 0 ;
|
||||
int res1 = 0 ;
|
||||
int val2 ;
|
||||
int ecode2 = 0 ;
|
||||
int res3 ;
|
||||
char *buf3 = 0 ;
|
||||
int alloc3 = 0 ;
|
||||
PyObject * obj0 = 0 ;
|
||||
PyObject * obj1 = 0 ;
|
||||
PyObject * obj2 = 0 ;
|
||||
int32_t result;
|
||||
|
||||
if (!PyArg_ParseTuple(args,(char *)"OOO:MediaSessionMgr_sessionGetInt32",&obj0,&obj1,&obj2)) SWIG_fail;
|
||||
res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MediaSessionMgr, 0 | 0 );
|
||||
if (!SWIG_IsOK(res1)) {
|
||||
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MediaSessionMgr_sessionGetInt32" "', argument " "1"" of type '" "MediaSessionMgr *""'");
|
||||
}
|
||||
arg1 = reinterpret_cast< MediaSessionMgr * >(argp1);
|
||||
ecode2 = SWIG_AsVal_int(obj1, &val2);
|
||||
if (!SWIG_IsOK(ecode2)) {
|
||||
SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MediaSessionMgr_sessionGetInt32" "', argument " "2"" of type '" "twrap_media_type_t""'");
|
||||
}
|
||||
arg2 = static_cast< twrap_media_type_t >(val2);
|
||||
res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
|
||||
if (!SWIG_IsOK(res3)) {
|
||||
SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MediaSessionMgr_sessionGetInt32" "', argument " "3"" of type '" "char const *""'");
|
||||
}
|
||||
arg3 = reinterpret_cast< char * >(buf3);
|
||||
result = (int32_t)(arg1)->sessionGetInt32(arg2,(char const *)arg3);
|
||||
resultobj = SWIG_From_int(static_cast< int >(result));
|
||||
if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
|
||||
return resultobj;
|
||||
fail:
|
||||
if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
SWIGINTERN PyObject *_wrap_MediaSessionMgr_consumerSetInt32(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
|
||||
PyObject *resultobj = 0;
|
||||
MediaSessionMgr *arg1 = (MediaSessionMgr *) 0 ;
|
||||
|
@ -6758,6 +6802,28 @@ fail:
|
|||
}
|
||||
|
||||
|
||||
SWIGINTERN PyObject *_wrap_MediaSessionMgr_defaultsSetSRtpMode(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
|
||||
PyObject *resultobj = 0;
|
||||
tmedia_srtp_mode_t arg1 ;
|
||||
int val1 ;
|
||||
int ecode1 = 0 ;
|
||||
PyObject * obj0 = 0 ;
|
||||
bool result;
|
||||
|
||||
if (!PyArg_ParseTuple(args,(char *)"O:MediaSessionMgr_defaultsSetSRtpMode",&obj0)) SWIG_fail;
|
||||
ecode1 = SWIG_AsVal_int(obj0, &val1);
|
||||
if (!SWIG_IsOK(ecode1)) {
|
||||
SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "MediaSessionMgr_defaultsSetSRtpMode" "', argument " "1"" of type '" "tmedia_srtp_mode_t""'");
|
||||
}
|
||||
arg1 = static_cast< tmedia_srtp_mode_t >(val1);
|
||||
result = (bool)MediaSessionMgr::defaultsSetSRtpMode(arg1);
|
||||
resultobj = SWIG_From_bool(static_cast< bool >(result));
|
||||
return resultobj;
|
||||
fail:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
SWIGINTERN PyObject *MediaSessionMgr_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
|
||||
PyObject *obj;
|
||||
if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
|
||||
|
@ -14349,6 +14415,37 @@ fail:
|
|||
}
|
||||
|
||||
|
||||
SWIGINTERN PyObject *_wrap_ProxyPluginMgr_findPlugin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
|
||||
PyObject *resultobj = 0;
|
||||
ProxyPluginMgr *arg1 = (ProxyPluginMgr *) 0 ;
|
||||
uint64_t arg2 ;
|
||||
void *argp1 = 0 ;
|
||||
int res1 = 0 ;
|
||||
unsigned long long val2 ;
|
||||
int ecode2 = 0 ;
|
||||
PyObject * obj0 = 0 ;
|
||||
PyObject * obj1 = 0 ;
|
||||
ProxyPlugin *result = 0 ;
|
||||
|
||||
if (!PyArg_ParseTuple(args,(char *)"OO:ProxyPluginMgr_findPlugin",&obj0,&obj1)) SWIG_fail;
|
||||
res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_ProxyPluginMgr, 0 | 0 );
|
||||
if (!SWIG_IsOK(res1)) {
|
||||
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ProxyPluginMgr_findPlugin" "', argument " "1"" of type '" "ProxyPluginMgr *""'");
|
||||
}
|
||||
arg1 = reinterpret_cast< ProxyPluginMgr * >(argp1);
|
||||
ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
|
||||
if (!SWIG_IsOK(ecode2)) {
|
||||
SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ProxyPluginMgr_findPlugin" "', argument " "2"" of type '" "uint64_t""'");
|
||||
}
|
||||
arg2 = static_cast< uint64_t >(val2);
|
||||
result = (ProxyPlugin *)(arg1)->findPlugin(arg2);
|
||||
resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ProxyPlugin, 0 | 0 );
|
||||
return resultobj;
|
||||
fail:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
SWIGINTERN PyObject *_wrap_ProxyPluginMgr_findAudioConsumer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
|
||||
PyObject *resultobj = 0;
|
||||
ProxyPluginMgr *arg1 = (ProxyPluginMgr *) 0 ;
|
||||
|
@ -22438,6 +22535,7 @@ static PyMethodDef SwigMethods[] = {
|
|||
{ (char *)"ActionConfig_swigregister", ActionConfig_swigregister, METH_VARARGS, NULL},
|
||||
{ (char *)"delete_MediaSessionMgr", _wrap_delete_MediaSessionMgr, METH_VARARGS, NULL},
|
||||
{ (char *)"MediaSessionMgr_sessionSetInt32", _wrap_MediaSessionMgr_sessionSetInt32, METH_VARARGS, NULL},
|
||||
{ (char *)"MediaSessionMgr_sessionGetInt32", _wrap_MediaSessionMgr_sessionGetInt32, METH_VARARGS, NULL},
|
||||
{ (char *)"MediaSessionMgr_consumerSetInt32", _wrap_MediaSessionMgr_consumerSetInt32, METH_VARARGS, NULL},
|
||||
{ (char *)"MediaSessionMgr_consumerSetInt64", _wrap_MediaSessionMgr_consumerSetInt64, METH_VARARGS, NULL},
|
||||
{ (char *)"MediaSessionMgr_producerSetInt32", _wrap_MediaSessionMgr_producerSetInt32, METH_VARARGS, NULL},
|
||||
|
@ -22473,6 +22571,7 @@ static PyMethodDef SwigMethods[] = {
|
|||
{ (char *)"MediaSessionMgr_defaultsSetVolume", _wrap_MediaSessionMgr_defaultsSetVolume, METH_VARARGS, NULL},
|
||||
{ (char *)"MediaSessionMgr_defaultsGetVolume", _wrap_MediaSessionMgr_defaultsGetVolume, METH_VARARGS, NULL},
|
||||
{ (char *)"MediaSessionMgr_defaultsSetInviteSessionTimers", _wrap_MediaSessionMgr_defaultsSetInviteSessionTimers, METH_VARARGS, NULL},
|
||||
{ (char *)"MediaSessionMgr_defaultsSetSRtpMode", _wrap_MediaSessionMgr_defaultsSetSRtpMode, METH_VARARGS, NULL},
|
||||
{ (char *)"MediaSessionMgr_swigregister", MediaSessionMgr_swigregister, METH_VARARGS, NULL},
|
||||
{ (char *)"delete_MediaContent", _wrap_delete_MediaContent, METH_VARARGS, NULL},
|
||||
{ (char *)"MediaContent_getType", _wrap_MediaContent_getType, METH_VARARGS, NULL},
|
||||
|
@ -22644,6 +22743,7 @@ static PyMethodDef SwigMethods[] = {
|
|||
{ (char *)"delete_ProxyPluginMgr", _wrap_delete_ProxyPluginMgr, METH_VARARGS, NULL},
|
||||
{ (char *)"ProxyPluginMgr_createInstance", _wrap_ProxyPluginMgr_createInstance, METH_VARARGS, NULL},
|
||||
{ (char *)"ProxyPluginMgr_getInstance", _wrap_ProxyPluginMgr_getInstance, METH_VARARGS, NULL},
|
||||
{ (char *)"ProxyPluginMgr_findPlugin", _wrap_ProxyPluginMgr_findPlugin, METH_VARARGS, NULL},
|
||||
{ (char *)"ProxyPluginMgr_findAudioConsumer", _wrap_ProxyPluginMgr_findAudioConsumer, METH_VARARGS, NULL},
|
||||
{ (char *)"ProxyPluginMgr_findVideoConsumer", _wrap_ProxyPluginMgr_findVideoConsumer, METH_VARARGS, NULL},
|
||||
{ (char *)"ProxyPluginMgr_findAudioProducer", _wrap_ProxyPluginMgr_findAudioProducer, METH_VARARGS, NULL},
|
||||
|
@ -23052,6 +23152,7 @@ static swig_type_info _swigt__p_tmedia_bandwidth_level_e = {"_p_tmedia_bandwidth
|
|||
static swig_type_info _swigt__p_tmedia_chroma_e = {"_p_tmedia_chroma_e", "tmedia_chroma_t *|enum tmedia_chroma_e *", 0, 0, (void*)0, 0};
|
||||
static swig_type_info _swigt__p_tmedia_qos_strength_e = {"_p_tmedia_qos_strength_e", "tmedia_qos_strength_t *|enum tmedia_qos_strength_e *", 0, 0, (void*)0, 0};
|
||||
static swig_type_info _swigt__p_tmedia_qos_stype_e = {"_p_tmedia_qos_stype_e", "enum tmedia_qos_stype_e *|tmedia_qos_stype_t *", 0, 0, (void*)0, 0};
|
||||
static swig_type_info _swigt__p_tmedia_srtp_mode_e = {"_p_tmedia_srtp_mode_e", "enum tmedia_srtp_mode_e *|tmedia_srtp_mode_t *", 0, 0, (void*)0, 0};
|
||||
static swig_type_info _swigt__p_tmsrp_event_type_e = {"_p_tmsrp_event_type_e", "enum tmsrp_event_type_e *|tmsrp_event_type_t *", 0, 0, (void*)0, 0};
|
||||
static swig_type_info _swigt__p_tmsrp_request_type_e = {"_p_tmsrp_request_type_e", "enum tmsrp_request_type_e *|tmsrp_request_type_t *", 0, 0, (void*)0, 0};
|
||||
static swig_type_info _swigt__p_tsip_event_type_e = {"_p_tsip_event_type_e", "enum tsip_event_type_e *|tsip_event_type_t *", 0, 0, (void*)0, 0};
|
||||
|
@ -23140,6 +23241,7 @@ static swig_type_info *swig_type_initial[] = {
|
|||
&_swigt__p_tmedia_chroma_e,
|
||||
&_swigt__p_tmedia_qos_strength_e,
|
||||
&_swigt__p_tmedia_qos_stype_e,
|
||||
&_swigt__p_tmedia_srtp_mode_e,
|
||||
&_swigt__p_tmsrp_event_type_e,
|
||||
&_swigt__p_tmsrp_request_type_e,
|
||||
&_swigt__p_tsip_event_type_e,
|
||||
|
@ -23228,6 +23330,7 @@ static swig_cast_info _swigc__p_tmedia_bandwidth_level_e[] = { {&_swigt__p_tmed
|
|||
static swig_cast_info _swigc__p_tmedia_chroma_e[] = { {&_swigt__p_tmedia_chroma_e, 0, 0, 0},{0, 0, 0, 0}};
|
||||
static swig_cast_info _swigc__p_tmedia_qos_strength_e[] = { {&_swigt__p_tmedia_qos_strength_e, 0, 0, 0},{0, 0, 0, 0}};
|
||||
static swig_cast_info _swigc__p_tmedia_qos_stype_e[] = { {&_swigt__p_tmedia_qos_stype_e, 0, 0, 0},{0, 0, 0, 0}};
|
||||
static swig_cast_info _swigc__p_tmedia_srtp_mode_e[] = { {&_swigt__p_tmedia_srtp_mode_e, 0, 0, 0},{0, 0, 0, 0}};
|
||||
static swig_cast_info _swigc__p_tmsrp_event_type_e[] = { {&_swigt__p_tmsrp_event_type_e, 0, 0, 0},{0, 0, 0, 0}};
|
||||
static swig_cast_info _swigc__p_tmsrp_request_type_e[] = { {&_swigt__p_tmsrp_request_type_e, 0, 0, 0},{0, 0, 0, 0}};
|
||||
static swig_cast_info _swigc__p_tsip_event_type_e[] = { {&_swigt__p_tsip_event_type_e, 0, 0, 0},{0, 0, 0, 0}};
|
||||
|
@ -23316,6 +23419,7 @@ static swig_cast_info *swig_cast_initial[] = {
|
|||
_swigc__p_tmedia_chroma_e,
|
||||
_swigc__p_tmedia_qos_strength_e,
|
||||
_swigc__p_tmedia_qos_stype_e,
|
||||
_swigc__p_tmedia_srtp_mode_e,
|
||||
_swigc__p_tmsrp_event_type_e,
|
||||
_swigc__p_tmsrp_request_type_e,
|
||||
_swigc__p_tsip_event_type_e,
|
||||
|
@ -24026,6 +24130,9 @@ SWIG_init(void) {
|
|||
SWIG_Python_SetConstant(d, "tmedia_chroma_yuv422p",SWIG_From_int(static_cast< int >(tmedia_chroma_yuv422p)));
|
||||
SWIG_Python_SetConstant(d, "tmedia_chroma_uyvy422",SWIG_From_int(static_cast< int >(tmedia_chroma_uyvy422)));
|
||||
SWIG_Python_SetConstant(d, "tmedia_chroma_yuv420p",SWIG_From_int(static_cast< int >(tmedia_chroma_yuv420p)));
|
||||
SWIG_Python_SetConstant(d, "tmedia_srtp_mode_none",SWIG_From_int(static_cast< int >(tmedia_srtp_mode_none)));
|
||||
SWIG_Python_SetConstant(d, "tmedia_srtp_mode_optional",SWIG_From_int(static_cast< int >(tmedia_srtp_mode_optional)));
|
||||
SWIG_Python_SetConstant(d, "tmedia_srtp_mode_mandatory",SWIG_From_int(static_cast< int >(tmedia_srtp_mode_mandatory)));
|
||||
SWIG_Python_SetConstant(d, "tmedia_qos_stype_none",SWIG_From_int(static_cast< int >(tmedia_qos_stype_none)));
|
||||
SWIG_Python_SetConstant(d, "tmedia_qos_stype_segmented",SWIG_From_int(static_cast< int >(tmedia_qos_stype_segmented)));
|
||||
SWIG_Python_SetConstant(d, "tmedia_qos_stype_e2e",SWIG_From_int(static_cast< int >(tmedia_qos_stype_e2e)));
|
||||
|
|
|
@ -0,0 +1,90 @@
|
|||
/*
|
||||
* aes.h
|
||||
*
|
||||
* header file for the AES block cipher
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _AES_H
|
||||
#define _AES_H
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "datatypes.h"
|
||||
#include "gf2_8.h"
|
||||
#include "err.h"
|
||||
|
||||
/* aes internals */
|
||||
|
||||
typedef struct {
|
||||
v128_t round[15];
|
||||
int num_rounds;
|
||||
} aes_expanded_key_t;
|
||||
|
||||
err_status_t
|
||||
aes_expand_encryption_key(const uint8_t *key,
|
||||
int key_len,
|
||||
aes_expanded_key_t *expanded_key);
|
||||
|
||||
err_status_t
|
||||
aes_expand_decryption_key(const uint8_t *key,
|
||||
int key_len,
|
||||
aes_expanded_key_t *expanded_key);
|
||||
|
||||
void
|
||||
aes_encrypt(v128_t *plaintext, const aes_expanded_key_t *exp_key);
|
||||
|
||||
void
|
||||
aes_decrypt(v128_t *plaintext, const aes_expanded_key_t *exp_key);
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* internal functions
|
||||
*/
|
||||
|
||||
void
|
||||
aes_init_sbox(void);
|
||||
|
||||
void
|
||||
aes_compute_tables(void);
|
||||
#endif
|
||||
|
||||
#endif /* _AES_H */
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* aes_cbc.h
|
||||
*
|
||||
* Header for AES Cipher Blobk Chaining Mode.
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef AES_CBC_H
|
||||
#define AES_CBC_H
|
||||
|
||||
#include "aes.h"
|
||||
#include "cipher.h"
|
||||
|
||||
typedef struct {
|
||||
v128_t state; /* cipher chaining state */
|
||||
v128_t previous; /* previous ciphertext block */
|
||||
aes_expanded_key_t expanded_key; /* the cipher key */
|
||||
} aes_cbc_ctx_t;
|
||||
|
||||
err_status_t
|
||||
aes_cbc_set_key(aes_cbc_ctx_t *c,
|
||||
const unsigned char *key);
|
||||
|
||||
err_status_t
|
||||
aes_cbc_encrypt(aes_cbc_ctx_t *c,
|
||||
unsigned char *buf,
|
||||
unsigned int *bytes_in_data);
|
||||
|
||||
err_status_t
|
||||
aes_cbc_context_init(aes_cbc_ctx_t *c, const uint8_t *key,
|
||||
int key_len, cipher_direction_t dir);
|
||||
|
||||
err_status_t
|
||||
aes_cbc_set_iv(aes_cbc_ctx_t *c, void *iv);
|
||||
|
||||
err_status_t
|
||||
aes_cbc_nist_encrypt(aes_cbc_ctx_t *c,
|
||||
unsigned char *data,
|
||||
unsigned int *bytes_in_data);
|
||||
|
||||
err_status_t
|
||||
aes_cbc_nist_decrypt(aes_cbc_ctx_t *c,
|
||||
unsigned char *data,
|
||||
unsigned int *bytes_in_data);
|
||||
|
||||
#endif /* AES_CBC_H */
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* aes_icm.h
|
||||
*
|
||||
* Header for AES Integer Counter Mode.
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef AES_ICM_H
|
||||
#define AES_ICM_H
|
||||
|
||||
#include "aes.h"
|
||||
#include "cipher.h"
|
||||
|
||||
typedef struct {
|
||||
v128_t counter; /* holds the counter value */
|
||||
v128_t offset; /* initial offset value */
|
||||
v128_t keystream_buffer; /* buffers bytes of keystream */
|
||||
aes_expanded_key_t expanded_key; /* the cipher key */
|
||||
int bytes_in_buffer; /* number of unused bytes in buffer */
|
||||
} aes_icm_ctx_t;
|
||||
|
||||
|
||||
err_status_t
|
||||
aes_icm_context_init(aes_icm_ctx_t *c,
|
||||
const unsigned char *key,
|
||||
int key_len);
|
||||
|
||||
err_status_t
|
||||
aes_icm_set_iv(aes_icm_ctx_t *c, void *iv);
|
||||
|
||||
err_status_t
|
||||
aes_icm_encrypt(aes_icm_ctx_t *c,
|
||||
unsigned char *buf, unsigned int *bytes_to_encr);
|
||||
|
||||
err_status_t
|
||||
aes_icm_output(aes_icm_ctx_t *c,
|
||||
unsigned char *buf, int bytes_to_output);
|
||||
|
||||
err_status_t
|
||||
aes_icm_dealloc(cipher_t *c);
|
||||
|
||||
err_status_t
|
||||
aes_icm_encrypt_ismacryp(aes_icm_ctx_t *c,
|
||||
unsigned char *buf,
|
||||
unsigned int *enc_len,
|
||||
int forIsmacryp);
|
||||
|
||||
err_status_t
|
||||
aes_icm_alloc_ismacryp(cipher_t **c,
|
||||
int key_len,
|
||||
int forIsmacryp);
|
||||
|
||||
#endif /* AES_ICM_H */
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* alloc.h
|
||||
*
|
||||
* interface to memory allocation and deallocation, with optional debugging
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef CRYPTO_ALLOC_H
|
||||
#define CRYPTO_ALLOC_H
|
||||
|
||||
#include "datatypes.h"
|
||||
|
||||
void *
|
||||
crypto_alloc(size_t size);
|
||||
|
||||
void
|
||||
crypto_free(void *ptr);
|
||||
|
||||
#endif /* CRYPTO_ALLOC_H */
|
|
@ -0,0 +1,171 @@
|
|||
/*
|
||||
* auth.h
|
||||
*
|
||||
* common interface to authentication functions
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef AUTH_H
|
||||
#define AUTH_H
|
||||
|
||||
#include "datatypes.h"
|
||||
#include "err.h" /* error codes */
|
||||
#include "crypto.h" /* for auth_type_id_t */
|
||||
#include "crypto_types.h" /* for values of auth_type_id_t */
|
||||
|
||||
typedef struct auth_type_t *auth_type_pointer;
|
||||
typedef struct auth_t *auth_pointer_t;
|
||||
|
||||
typedef err_status_t (*auth_alloc_func)
|
||||
(auth_pointer_t *ap, int key_len, int out_len);
|
||||
|
||||
typedef err_status_t (*auth_init_func)
|
||||
(void *state, const uint8_t *key, int key_len);
|
||||
|
||||
typedef err_status_t (*auth_dealloc_func)(auth_pointer_t ap);
|
||||
|
||||
typedef err_status_t (*auth_compute_func)
|
||||
(void *state, uint8_t *buffer, int octets_to_auth,
|
||||
int tag_len, uint8_t *tag);
|
||||
|
||||
typedef err_status_t (*auth_update_func)
|
||||
(void *state, uint8_t *buffer, int octets_to_auth);
|
||||
|
||||
typedef err_status_t (*auth_start_func)(void *state);
|
||||
|
||||
/* some syntactic sugar on these function types */
|
||||
|
||||
#define auth_type_alloc(at, a, klen, outlen) \
|
||||
((at)->alloc((a), (klen), (outlen)))
|
||||
|
||||
#define auth_init(a, key) \
|
||||
(((a)->type)->init((a)->state, (key), ((a)->key_len)))
|
||||
|
||||
#define auth_compute(a, buf, len, res) \
|
||||
(((a)->type)->compute((a)->state, (buf), (len), (a)->out_len, (res)))
|
||||
|
||||
#define auth_update(a, buf, len) \
|
||||
(((a)->type)->update((a)->state, (buf), (len)))
|
||||
|
||||
#define auth_start(a)(((a)->type)->start((a)->state))
|
||||
|
||||
#define auth_dealloc(c) (((c)->type)->dealloc(c))
|
||||
|
||||
/* functions to get information about a particular auth_t */
|
||||
|
||||
int
|
||||
auth_get_key_length(const struct auth_t *a);
|
||||
|
||||
int
|
||||
auth_get_tag_length(const struct auth_t *a);
|
||||
|
||||
int
|
||||
auth_get_prefix_length(const struct auth_t *a);
|
||||
|
||||
/*
|
||||
* auth_test_case_t is a (list of) key/message/tag values that are
|
||||
* known to be correct for a particular cipher. this data can be used
|
||||
* to test an implementation in an on-the-fly self test of the
|
||||
* correcness of the implementation. (see the auth_type_self_test()
|
||||
* function below)
|
||||
*/
|
||||
|
||||
typedef struct auth_test_case_t {
|
||||
int key_length_octets; /* octets in key */
|
||||
uint8_t *key; /* key */
|
||||
int data_length_octets; /* octets in data */
|
||||
uint8_t *data; /* data */
|
||||
int tag_length_octets; /* octets in tag */
|
||||
uint8_t *tag; /* tag */
|
||||
struct auth_test_case_t *next_test_case; /* pointer to next testcase */
|
||||
} auth_test_case_t;
|
||||
|
||||
/* auth_type_t */
|
||||
|
||||
typedef struct auth_type_t {
|
||||
auth_alloc_func alloc;
|
||||
auth_dealloc_func dealloc;
|
||||
auth_init_func init;
|
||||
auth_compute_func compute;
|
||||
auth_update_func update;
|
||||
auth_start_func start;
|
||||
char *description;
|
||||
int ref_count;
|
||||
auth_test_case_t *test_data;
|
||||
debug_module_t *debug;
|
||||
auth_type_id_t id;
|
||||
} auth_type_t;
|
||||
|
||||
typedef struct auth_t {
|
||||
auth_type_t *type;
|
||||
void *state;
|
||||
int out_len; /* length of output tag in octets */
|
||||
int key_len; /* length of key in octets */
|
||||
int prefix_len; /* length of keystream prefix */
|
||||
} auth_t;
|
||||
|
||||
/*
|
||||
* auth_type_self_test() tests an auth_type against test cases
|
||||
* provided in an array of values of key/message/tag that is known to
|
||||
* be good
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
auth_type_self_test(const auth_type_t *at);
|
||||
|
||||
/*
|
||||
* auth_type_test() tests an auth_type against external test cases
|
||||
* provided in an array of values of key/message/tag that is known to
|
||||
* be good
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
auth_type_test(const auth_type_t *at, const auth_test_case_t *test_data);
|
||||
|
||||
/*
|
||||
* auth_type_get_ref_count(at) returns the reference count (the number
|
||||
* of instantiations) of the auth_type_t at
|
||||
*/
|
||||
|
||||
int
|
||||
auth_type_get_ref_count(const auth_type_t *at);
|
||||
|
||||
#endif /* AUTH_H */
|
|
@ -0,0 +1,230 @@
|
|||
/*
|
||||
* cipher.h
|
||||
*
|
||||
* common interface to ciphers
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef CIPHER_H
|
||||
#define CIPHER_H
|
||||
|
||||
#include "datatypes.h"
|
||||
#include "rdbx.h" /* for xtd_seq_num_t */
|
||||
#include "err.h" /* for error codes */
|
||||
#include "crypto.h" /* for cipher_type_id_t */
|
||||
#include "crypto_types.h" /* for values of cipher_type_id_t */
|
||||
|
||||
|
||||
/**
|
||||
* @brief cipher_direction_t defines a particular cipher operation.
|
||||
*
|
||||
* A cipher_direction_t is an enum that describes a particular cipher
|
||||
* operation, i.e. encryption or decryption. For some ciphers, this
|
||||
* distinction does not matter, but for others, it is essential.
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
direction_encrypt, /**< encryption (convert plaintext to ciphertext) */
|
||||
direction_decrypt, /**< decryption (convert ciphertext to plaintext) */
|
||||
direction_any /**< encryption or decryption */
|
||||
} cipher_direction_t;
|
||||
|
||||
/*
|
||||
* the cipher_pointer and cipher_type_pointer definitions are needed
|
||||
* as cipher_t and cipher_type_t are not yet defined
|
||||
*/
|
||||
|
||||
typedef struct cipher_type_t *cipher_type_pointer_t;
|
||||
typedef struct cipher_t *cipher_pointer_t;
|
||||
|
||||
/*
|
||||
* a cipher_alloc_func_t allocates (but does not initialize) a cipher_t
|
||||
*/
|
||||
|
||||
typedef err_status_t (*cipher_alloc_func_t)
|
||||
(cipher_pointer_t *cp, int key_len);
|
||||
|
||||
/*
|
||||
* a cipher_init_func_t [re-]initializes a cipher_t with a given key
|
||||
* and direction (i.e., encrypt or decrypt)
|
||||
*/
|
||||
|
||||
typedef err_status_t (*cipher_init_func_t)
|
||||
(void *state, const uint8_t *key, int key_len, cipher_direction_t dir);
|
||||
|
||||
/* a cipher_dealloc_func_t de-allocates a cipher_t */
|
||||
|
||||
typedef err_status_t (*cipher_dealloc_func_t)(cipher_pointer_t cp);
|
||||
|
||||
/* a cipher_set_segment_func_t sets the segment index of a cipher_t */
|
||||
|
||||
typedef err_status_t (*cipher_set_segment_func_t)
|
||||
(void *state, xtd_seq_num_t idx);
|
||||
|
||||
/* a cipher_encrypt_func_t encrypts data in-place */
|
||||
|
||||
typedef err_status_t (*cipher_encrypt_func_t)
|
||||
(void *state, uint8_t *buffer, unsigned int *octets_to_encrypt);
|
||||
|
||||
/* a cipher_decrypt_func_t decrypts data in-place */
|
||||
|
||||
typedef err_status_t (*cipher_decrypt_func_t)
|
||||
(void *state, uint8_t *buffer, unsigned int *octets_to_decrypt);
|
||||
|
||||
/*
|
||||
* a cipher_set_iv_func_t function sets the current initialization vector
|
||||
*/
|
||||
|
||||
typedef err_status_t (*cipher_set_iv_func_t)
|
||||
(cipher_pointer_t cp, void *iv);
|
||||
|
||||
/*
|
||||
* cipher_test_case_t is a (list of) key, salt, xtd_seq_num_t,
|
||||
* plaintext, and ciphertext values that are known to be correct for a
|
||||
* particular cipher. this data can be used to test an implementation
|
||||
* in an on-the-fly self test of the correcness of the implementation.
|
||||
* (see the cipher_type_self_test() function below)
|
||||
*/
|
||||
|
||||
typedef struct cipher_test_case_t {
|
||||
int key_length_octets; /* octets in key */
|
||||
uint8_t *key; /* key */
|
||||
uint8_t *idx; /* packet index */
|
||||
int plaintext_length_octets; /* octets in plaintext */
|
||||
uint8_t *plaintext; /* plaintext */
|
||||
int ciphertext_length_octets; /* octets in plaintext */
|
||||
uint8_t *ciphertext; /* ciphertext */
|
||||
struct cipher_test_case_t *next_test_case; /* pointer to next testcase */
|
||||
} cipher_test_case_t;
|
||||
|
||||
/* cipher_type_t defines the 'metadata' for a particular cipher type */
|
||||
|
||||
typedef struct cipher_type_t {
|
||||
cipher_alloc_func_t alloc;
|
||||
cipher_dealloc_func_t dealloc;
|
||||
cipher_init_func_t init;
|
||||
cipher_encrypt_func_t encrypt;
|
||||
cipher_encrypt_func_t decrypt;
|
||||
cipher_set_iv_func_t set_iv;
|
||||
char *description;
|
||||
int ref_count;
|
||||
cipher_test_case_t *test_data;
|
||||
debug_module_t *debug;
|
||||
cipher_type_id_t id;
|
||||
} cipher_type_t;
|
||||
|
||||
/*
|
||||
* cipher_t defines an instantiation of a particular cipher, with fixed
|
||||
* key length, key and salt values
|
||||
*/
|
||||
|
||||
typedef struct cipher_t {
|
||||
cipher_type_t *type;
|
||||
void *state;
|
||||
int key_len;
|
||||
#ifdef FORCE_64BIT_ALIGN
|
||||
int pad;
|
||||
#endif
|
||||
} cipher_t;
|
||||
|
||||
/* some syntactic sugar on these function types */
|
||||
|
||||
#define cipher_type_alloc(ct, c, klen) ((ct)->alloc((c), (klen)))
|
||||
|
||||
#define cipher_dealloc(c) (((c)->type)->dealloc(c))
|
||||
|
||||
#define cipher_init(c, k, dir) (((c)->type)->init(((c)->state), (k), ((c)->key_len), (dir)))
|
||||
|
||||
#define cipher_encrypt(c, buf, len) \
|
||||
(((c)->type)->encrypt(((c)->state), (buf), (len)))
|
||||
|
||||
#define cipher_decrypt(c, buf, len) \
|
||||
(((c)->type)->decrypt(((c)->state), (buf), (len)))
|
||||
|
||||
#define cipher_set_iv(c, n) \
|
||||
((c) ? (((c)->type)->set_iv(((cipher_pointer_t)(c)->state), (n))) : \
|
||||
err_status_no_such_op)
|
||||
|
||||
err_status_t
|
||||
cipher_output(cipher_t *c, uint8_t *buffer, int num_octets_to_output);
|
||||
|
||||
|
||||
/* some bookkeeping functions */
|
||||
|
||||
int
|
||||
cipher_get_key_length(const cipher_t *c);
|
||||
|
||||
|
||||
/*
|
||||
* cipher_type_self_test() tests a cipher against test cases provided in
|
||||
* an array of values of key/xtd_seq_num_t/plaintext/ciphertext
|
||||
* that is known to be good
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
cipher_type_self_test(const cipher_type_t *ct);
|
||||
|
||||
|
||||
/*
|
||||
* cipher_type_test() tests a cipher against external test cases provided in
|
||||
* an array of values of key/xtd_seq_num_t/plaintext/ciphertext
|
||||
* that is known to be good
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
cipher_type_test(const cipher_type_t *ct, const cipher_test_case_t *test_data);
|
||||
|
||||
|
||||
/*
|
||||
* cipher_bits_per_second(c, l, t) computes (and estimate of) the
|
||||
* number of bits that a cipher implementation can encrypt in a second
|
||||
*
|
||||
* c is a cipher (which MUST be allocated and initialized already), l
|
||||
* is the length in octets of the test data to be encrypted, and t is
|
||||
* the number of trials
|
||||
*
|
||||
* if an error is encountered, then the value 0 is returned
|
||||
*/
|
||||
|
||||
uint64_t
|
||||
cipher_bits_per_second(cipher_t *c, int octets_in_buffer, int num_trials);
|
||||
|
||||
#endif /* CIPHER_H */
|
|
@ -0,0 +1,174 @@
|
|||
/* crypto/include/config.h. Generated by configure. */
|
||||
/* config_in.h. Generated from configure.in by autoheader. */
|
||||
|
||||
/* Define if building for a CISC machine (e.g. Intel). */
|
||||
#define CPU_CISC 1
|
||||
|
||||
/* Define if building for a RISC machine (assume slow byte access). */
|
||||
/* #undef CPU_RISC */
|
||||
|
||||
/* Path to random device */
|
||||
/* #undef DEV_URANDOM */
|
||||
|
||||
/* Define to compile in dynamic debugging system. */
|
||||
/* #undef ENABLE_DEBUGGING */
|
||||
|
||||
/* Report errors to this file. */
|
||||
/* #undef ERR_REPORTING_FILE */
|
||||
|
||||
/* Define to use logging to stdout. */
|
||||
#define ERR_REPORTING_STDOUT 1
|
||||
|
||||
/* Define this to use ISMAcryp code. */
|
||||
/* #undef GENERIC_AESICM */
|
||||
|
||||
/* Define to 1 if you have the <arpa/inet.h> header file. */
|
||||
#define HAVE_ARPA_INET_H 1
|
||||
|
||||
/* Define to 1 if you have the <byteswap.h> header file. */
|
||||
#define HAVE_BYTESWAP_H 1
|
||||
|
||||
/* Define to 1 if you have the `inet_aton' function. */
|
||||
/* #undef HAVE_INET_ATON */
|
||||
|
||||
/* Define to 1 if the system has the type `int16_t'. */
|
||||
#define HAVE_INT16_T 1
|
||||
|
||||
/* Define to 1 if the system has the type `int32_t'. */
|
||||
#define HAVE_INT32_T 1
|
||||
|
||||
/* Define to 1 if the system has the type `int8_t'. */
|
||||
#define HAVE_INT8_T 1
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#define HAVE_INTTYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the `socket' library (-lsocket). */
|
||||
/* #undef HAVE_LIBSOCKET */
|
||||
|
||||
/* Define to 1 if you have the <machine/types.h> header file. */
|
||||
/* #undef HAVE_MACHINE_TYPES_H */
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#define HAVE_MEMORY_H 1
|
||||
|
||||
/* Define to 1 if you have the <netinet/in.h> header file. */
|
||||
#define HAVE_NETINET_IN_H 1
|
||||
|
||||
/* Define to 1 if you have the `sigaction' function. */
|
||||
/* #undef HAVE_SIGACTION */
|
||||
|
||||
/* Define to 1 if you have the `socket' function. */
|
||||
/* #undef HAVE_SOCKET */
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#define HAVE_STDINT_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#define HAVE_STDLIB_H 1
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#define HAVE_STRINGS_H 1
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#define HAVE_STRING_H 1
|
||||
|
||||
/* Define to 1 if you have the <syslog.h> header file. */
|
||||
#define HAVE_SYSLOG_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/int_types.h> header file. */
|
||||
/* #undef HAVE_SYS_INT_TYPES_H */
|
||||
|
||||
/* Define to 1 if you have the <sys/socket.h> header file. */
|
||||
#define HAVE_SYS_SOCKET_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/uio.h> header file. */
|
||||
#define HAVE_SYS_UIO_H 1
|
||||
|
||||
/* Define to 1 if the system has the type `uint16_t'. */
|
||||
#define HAVE_UINT16_T 1
|
||||
|
||||
/* Define to 1 if the system has the type `uint32_t'. */
|
||||
#define HAVE_UINT32_T 1
|
||||
|
||||
/* Define to 1 if the system has the type `uint64_t'. */
|
||||
#define HAVE_UINT64_T 1
|
||||
|
||||
/* Define to 1 if the system has the type `uint8_t'. */
|
||||
#define HAVE_UINT8_T 1
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#define HAVE_UNISTD_H 1
|
||||
|
||||
/* Define to 1 if you have the `usleep' function. */
|
||||
/* #undef HAVE_USLEEP */
|
||||
|
||||
/* Define to 1 if you have the <windows.h> header file. */
|
||||
/* #undef HAVE_WINDOWS_H */
|
||||
|
||||
/* Define to 1 if you have the <winsock2.h> header file. */
|
||||
/* #undef HAVE_WINSOCK2_H */
|
||||
|
||||
/* Define to use X86 inlined assembly code */
|
||||
/* #undef HAVE_X86 */
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#define PACKAGE_BUGREPORT ""
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#define PACKAGE_NAME ""
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#define PACKAGE_STRING ""
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#define PACKAGE_TARNAME ""
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#define PACKAGE_VERSION ""
|
||||
|
||||
/* The size of a `unsigned long', as computed by sizeof. */
|
||||
#define SIZEOF_UNSIGNED_LONG 4
|
||||
|
||||
/* The size of a `unsigned long long', as computed by sizeof. */
|
||||
#define SIZEOF_UNSIGNED_LONG_LONG 8
|
||||
|
||||
/* Define to use GDOI. */
|
||||
/* #undef SRTP_GDOI */
|
||||
|
||||
/* Define to compile for kernel contexts. */
|
||||
/* #undef SRTP_KERNEL */
|
||||
|
||||
/* Define to compile for Linux kernel context. */
|
||||
/* #undef SRTP_KERNEL_LINUX */
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
/* #undef STDC_HEADERS */
|
||||
|
||||
/* Write errors to this file */
|
||||
/* #undef USE_ERR_REPORTING_FILE */
|
||||
|
||||
/* Define to use syslog logging. */
|
||||
/* #undef USE_SYSLOG */
|
||||
|
||||
/* Define to 1 if your processor stores words with the most significant byte
|
||||
first (like Motorola and SPARC, unlike Intel and VAX). */
|
||||
/* #undef WORDS_BIGENDIAN */
|
||||
|
||||
/* Define to empty if `const' does not conform to ANSI C. */
|
||||
/* #undef const */
|
||||
|
||||
/* Define to `__inline__' or `__inline' if that's what the C compiler
|
||||
calls it, or to nothing if 'inline' is not supported under any name. */
|
||||
#ifndef __cplusplus
|
||||
/* #undef inline */
|
||||
#endif
|
||||
|
||||
/* Define to `unsigned' if <sys/types.h> does not define. */
|
||||
/* #undef size_t */
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* crypto.h
|
||||
*
|
||||
* API for libcrypto
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
#ifndef CRYPTO_H
|
||||
#define CRYPTO_H
|
||||
|
||||
/**
|
||||
* @brief A cipher_type_id_t is an identifier for a particular cipher
|
||||
* type.
|
||||
*
|
||||
* A cipher_type_id_t is an integer that represents a particular
|
||||
* cipher type, e.g. the Advanced Encryption Standard (AES). A
|
||||
* NULL_CIPHER is avaliable; this cipher leaves the data unchanged,
|
||||
* and can be selected to indicate that no encryption is to take
|
||||
* place.
|
||||
*
|
||||
* @ingroup Ciphers
|
||||
*/
|
||||
typedef uint32_t cipher_type_id_t;
|
||||
|
||||
/**
|
||||
* @brief An auth_type_id_t is an identifier for a particular authentication
|
||||
* function.
|
||||
*
|
||||
* An auth_type_id_t is an integer that represents a particular
|
||||
* authentication function type, e.g. HMAC-SHA1. A NULL_AUTH is
|
||||
* avaliable; this authentication function performs no computation,
|
||||
* and can be selected to indicate that no authentication is to take
|
||||
* place.
|
||||
*
|
||||
* @ingroup Authentication
|
||||
*/
|
||||
typedef uint32_t auth_type_id_t;
|
||||
|
||||
#endif /* CRYPTO_H */
|
||||
|
||||
|
|
@ -0,0 +1,280 @@
|
|||
/*
|
||||
* crypto_kernel.h
|
||||
*
|
||||
* header for the cryptographic kernel
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright(c) 2001-2006 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef CRYPTO_KERNEL
|
||||
#define CRYPTO_KERNEL
|
||||
|
||||
#include "rand_source.h"
|
||||
#include "prng.h"
|
||||
#include "cipher.h"
|
||||
#include "auth.h"
|
||||
#include "cryptoalg.h"
|
||||
#include "stat.h"
|
||||
#include "err.h"
|
||||
#include "crypto_types.h"
|
||||
#include "key.h"
|
||||
#include "crypto.h"
|
||||
|
||||
/*
|
||||
* crypto_kernel_state_t defines the possible states:
|
||||
*
|
||||
* insecure - not yet initialized
|
||||
* secure - initialized and passed self-tests
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
crypto_kernel_state_insecure,
|
||||
crypto_kernel_state_secure
|
||||
} crypto_kernel_state_t;
|
||||
|
||||
/*
|
||||
* linked list of cipher types
|
||||
*/
|
||||
|
||||
typedef struct kernel_cipher_type {
|
||||
cipher_type_id_t id;
|
||||
cipher_type_t *cipher_type;
|
||||
struct kernel_cipher_type *next;
|
||||
} kernel_cipher_type_t;
|
||||
|
||||
/*
|
||||
* linked list of auth types
|
||||
*/
|
||||
|
||||
typedef struct kernel_auth_type {
|
||||
auth_type_id_t id;
|
||||
auth_type_t *auth_type;
|
||||
struct kernel_auth_type *next;
|
||||
} kernel_auth_type_t;
|
||||
|
||||
/*
|
||||
* linked list of debug modules
|
||||
*/
|
||||
|
||||
typedef struct kernel_debug_module {
|
||||
debug_module_t *mod;
|
||||
struct kernel_debug_module *next;
|
||||
} kernel_debug_module_t;
|
||||
|
||||
|
||||
/*
|
||||
* crypto_kernel_t is the data structure for the crypto kernel
|
||||
*
|
||||
* note that there is *exactly one* instance of this data type,
|
||||
* a global variable defined in crypto_kernel.c
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
crypto_kernel_state_t state; /* current state of kernel */
|
||||
kernel_cipher_type_t *cipher_type_list; /* list of all cipher types */
|
||||
kernel_auth_type_t *auth_type_list; /* list of all auth func types */
|
||||
kernel_debug_module_t *debug_module_list; /* list of all debug modules */
|
||||
} crypto_kernel_t;
|
||||
|
||||
|
||||
/*
|
||||
* crypto_kernel_t external api
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* The function crypto_kernel_init() initialized the crypto kernel and
|
||||
* runs the self-test operations on the random number generators and
|
||||
* crypto algorithms. Possible return values are:
|
||||
*
|
||||
* err_status_ok initialization successful
|
||||
* <other> init failure
|
||||
*
|
||||
* If any value other than err_status_ok is returned, the
|
||||
* crypto_kernel MUST NOT be used.
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
crypto_kernel_init(void);
|
||||
|
||||
|
||||
/*
|
||||
* The function crypto_kernel_shutdown() de-initializes the
|
||||
* crypto_kernel, zeroizes keys and other cryptographic material, and
|
||||
* deallocates any dynamically allocated memory. Possible return
|
||||
* values are:
|
||||
*
|
||||
* err_status_ok shutdown successful
|
||||
* <other> shutdown failure
|
||||
*
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
crypto_kernel_shutdown(void);
|
||||
|
||||
/*
|
||||
* The function crypto_kernel_stats() checks the the crypto_kernel,
|
||||
* running tests on the ciphers, auth funcs, and rng, and prints out a
|
||||
* status report. Possible return values are:
|
||||
*
|
||||
* err_status_ok all tests were passed
|
||||
* <other> a test failed
|
||||
*
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
crypto_kernel_status(void);
|
||||
|
||||
|
||||
/*
|
||||
* crypto_kernel_list_debug_modules() outputs a list of debugging modules
|
||||
*
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
crypto_kernel_list_debug_modules(void);
|
||||
|
||||
/*
|
||||
* crypto_kernel_load_cipher_type()
|
||||
*
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
crypto_kernel_load_cipher_type(cipher_type_t *ct, cipher_type_id_t id);
|
||||
|
||||
err_status_t
|
||||
crypto_kernel_load_auth_type(auth_type_t *ct, auth_type_id_t id);
|
||||
|
||||
/*
|
||||
* crypto_kernel_replace_cipher_type(ct, id)
|
||||
*
|
||||
* replaces the crypto kernel's existing cipher for the cipher_type id
|
||||
* with a new one passed in externally. The new cipher must pass all the
|
||||
* existing cipher_type's self tests as well as its own.
|
||||
*/
|
||||
err_status_t
|
||||
crypto_kernel_replace_cipher_type(cipher_type_t *ct, cipher_type_id_t id);
|
||||
|
||||
|
||||
/*
|
||||
* crypto_kernel_replace_auth_type(ct, id)
|
||||
*
|
||||
* replaces the crypto kernel's existing cipher for the auth_type id
|
||||
* with a new one passed in externally. The new auth type must pass all the
|
||||
* existing auth_type's self tests as well as its own.
|
||||
*/
|
||||
err_status_t
|
||||
crypto_kernel_replace_auth_type(auth_type_t *ct, auth_type_id_t id);
|
||||
|
||||
|
||||
err_status_t
|
||||
crypto_kernel_load_debug_module(debug_module_t *new_dm);
|
||||
|
||||
/*
|
||||
* crypto_kernel_alloc_cipher(id, cp, key_len);
|
||||
*
|
||||
* allocates a cipher of type id at location *cp, with key length
|
||||
* key_len octets. Return values are:
|
||||
*
|
||||
* err_status_ok no problems
|
||||
* err_status_alloc_fail an allocation failure occured
|
||||
* err_status_fail couldn't find cipher with identifier 'id'
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
crypto_kernel_alloc_cipher(cipher_type_id_t id,
|
||||
cipher_pointer_t *cp,
|
||||
int key_len);
|
||||
|
||||
/*
|
||||
* crypto_kernel_alloc_auth(id, ap, key_len, tag_len);
|
||||
*
|
||||
* allocates an auth function of type id at location *ap, with key
|
||||
* length key_len octets and output tag length of tag_len. Return
|
||||
* values are:
|
||||
*
|
||||
* err_status_ok no problems
|
||||
* err_status_alloc_fail an allocation failure occured
|
||||
* err_status_fail couldn't find auth with identifier 'id'
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
crypto_kernel_alloc_auth(auth_type_id_t id,
|
||||
auth_pointer_t *ap,
|
||||
int key_len,
|
||||
int tag_len);
|
||||
|
||||
|
||||
/*
|
||||
* crypto_kernel_set_debug_module(mod_name, v)
|
||||
*
|
||||
* sets dynamic debugging to the value v (0 for off, 1 for on) for the
|
||||
* debug module with the name mod_name
|
||||
*
|
||||
* returns err_status_ok on success, err_status_fail otherwise
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
crypto_kernel_set_debug_module(char *mod_name, int v);
|
||||
|
||||
/**
|
||||
* @brief writes a random octet string.
|
||||
*
|
||||
* The function call crypto_get_random(dest, len) writes len octets of
|
||||
* random data to the location to which dest points, and returns an
|
||||
* error code. This error code @b must be checked, and if a failure is
|
||||
* reported, the data in the buffer @b must @b not be used.
|
||||
*
|
||||
* @warning If the return code is not checked, then non-random
|
||||
* data may be in the buffer. This function will fail
|
||||
* unless it is called after crypto_kernel_init().
|
||||
*
|
||||
* @return
|
||||
* - err_status_ok if no problems occured.
|
||||
* - [other] a problem occured, and no assumptions should
|
||||
* be made about the contents of the destination
|
||||
* buffer.
|
||||
*
|
||||
* @ingroup SRTP
|
||||
*/
|
||||
err_status_t
|
||||
crypto_get_random(unsigned char *buffer, unsigned int length);
|
||||
|
||||
#endif /* CRYPTO_KERNEL */
|
|
@ -0,0 +1,239 @@
|
|||
/*
|
||||
* math.h
|
||||
*
|
||||
* crypto math operations and data types
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef MATH_H
|
||||
#define MATH_H
|
||||
|
||||
#include "datatypes.h"
|
||||
|
||||
unsigned char
|
||||
v32_weight(v32_t a);
|
||||
|
||||
unsigned char
|
||||
v32_distance(v32_t x, v32_t y);
|
||||
|
||||
unsigned int
|
||||
v32_dot_product(v32_t a, v32_t b);
|
||||
|
||||
char *
|
||||
v16_bit_string(v16_t x);
|
||||
|
||||
char *
|
||||
v32_bit_string(v32_t x);
|
||||
|
||||
char *
|
||||
v64_bit_string(const v64_t *x);
|
||||
|
||||
char *
|
||||
octet_hex_string(uint8_t x);
|
||||
|
||||
char *
|
||||
v16_hex_string(v16_t x);
|
||||
|
||||
char *
|
||||
v32_hex_string(v32_t x);
|
||||
|
||||
char *
|
||||
v64_hex_string(const v64_t *x);
|
||||
|
||||
int
|
||||
hex_char_to_nibble(uint8_t c);
|
||||
|
||||
int
|
||||
is_hex_string(char *s);
|
||||
|
||||
v16_t
|
||||
hex_string_to_v16(char *s);
|
||||
|
||||
v32_t
|
||||
hex_string_to_v32(char *s);
|
||||
|
||||
v64_t
|
||||
hex_string_to_v64(char *s);
|
||||
|
||||
/* the matrix A[] is stored in column format, i.e., A[i] is
|
||||
the ith column of the matrix */
|
||||
|
||||
uint8_t
|
||||
A_times_x_plus_b(uint8_t A[8], uint8_t x, uint8_t b);
|
||||
|
||||
void
|
||||
v16_copy_octet_string(v16_t *x, const uint8_t s[2]);
|
||||
|
||||
void
|
||||
v32_copy_octet_string(v32_t *x, const uint8_t s[4]);
|
||||
|
||||
void
|
||||
v64_copy_octet_string(v64_t *x, const uint8_t s[8]);
|
||||
|
||||
void
|
||||
v128_add(v128_t *z, v128_t *x, v128_t *y);
|
||||
|
||||
int
|
||||
octet_string_is_eq(uint8_t *a, uint8_t *b, int len);
|
||||
|
||||
void
|
||||
octet_string_set_to_zero(uint8_t *s, int len);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* the matrix A[] is stored in column format, i.e., A[i] is the ith
|
||||
* column of the matrix
|
||||
*/
|
||||
uint8_t
|
||||
A_times_x_plus_b(uint8_t A[8], uint8_t x, uint8_t b);
|
||||
|
||||
|
||||
#if 0
|
||||
#if WORDS_BIGENDIAN
|
||||
|
||||
#define _v128_add(z, x, y) { \
|
||||
uint64_t tmp; \
|
||||
\
|
||||
tmp = x->v32[3] + y->v32[3]; \
|
||||
z->v32[3] = (uint32_t) tmp; \
|
||||
\
|
||||
tmp = x->v32[2] + y->v32[2] + (tmp >> 32); \
|
||||
z->v32[2] = (uint32_t) tmp; \
|
||||
\
|
||||
tmp = x->v32[1] + y->v32[1] + (tmp >> 32); \
|
||||
z->v32[1] = (uint32_t) tmp; \
|
||||
\
|
||||
tmp = x->v32[0] + y->v32[0] + (tmp >> 32); \
|
||||
z->v32[0] = (uint32_t) tmp; \
|
||||
}
|
||||
|
||||
#else /* assume little endian architecture */
|
||||
|
||||
#define _v128_add(z, x, y) { \
|
||||
uint64_t tmp; \
|
||||
\
|
||||
tmp = htonl(x->v32[3]) + htonl(y->v32[3]); \
|
||||
z->v32[3] = ntohl((uint32_t) tmp); \
|
||||
\
|
||||
tmp = htonl(x->v32[2]) + htonl(y->v32[2]) \
|
||||
+ htonl(tmp >> 32); \
|
||||
z->v32[2] = ntohl((uint32_t) tmp); \
|
||||
\
|
||||
tmp = htonl(x->v32[1]) + htonl(y->v32[1]) \
|
||||
+ htonl(tmp >> 32); \
|
||||
z->v32[1] = ntohl((uint32_t) tmp); \
|
||||
\
|
||||
tmp = htonl(x->v32[0]) + htonl(y->v32[0]) \
|
||||
+ htonl(tmp >> 32); \
|
||||
z->v32[0] = ntohl((uint32_t) tmp); \
|
||||
}
|
||||
|
||||
#endif /* WORDS_BIGENDIAN */
|
||||
#endif
|
||||
|
||||
#ifdef DATATYPES_USE_MACROS /* little functions are really macros */
|
||||
|
||||
#define v128_set_to_zero(z) _v128_set_to_zero(z)
|
||||
#define v128_copy(z, x) _v128_copy(z, x)
|
||||
#define v128_xor(z, x, y) _v128_xor(z, x, y)
|
||||
#define v128_and(z, x, y) _v128_and(z, x, y)
|
||||
#define v128_or(z, x, y) _v128_or(z, x, y)
|
||||
#define v128_complement(x) _v128_complement(x)
|
||||
#define v128_is_eq(x, y) _v128_is_eq(x, y)
|
||||
#define v128_xor_eq(x, y) _v128_xor_eq(x, y)
|
||||
#define v128_get_bit(x, i) _v128_get_bit(x, i)
|
||||
#define v128_set_bit(x, i) _v128_set_bit(x, i)
|
||||
#define v128_clear_bit(x, i) _v128_clear_bit(x, i)
|
||||
#define v128_set_bit_to(x, i, y) _v128_set_bit_to(x, i, y)
|
||||
|
||||
#else
|
||||
|
||||
void
|
||||
v128_set_to_zero(v128_t *x);
|
||||
|
||||
int
|
||||
v128_is_eq(const v128_t *x, const v128_t *y);
|
||||
|
||||
void
|
||||
v128_copy(v128_t *x, const v128_t *y);
|
||||
|
||||
void
|
||||
v128_xor(v128_t *z, v128_t *x, v128_t *y);
|
||||
|
||||
void
|
||||
v128_and(v128_t *z, v128_t *x, v128_t *y);
|
||||
|
||||
void
|
||||
v128_or(v128_t *z, v128_t *x, v128_t *y);
|
||||
|
||||
void
|
||||
v128_complement(v128_t *x);
|
||||
|
||||
int
|
||||
v128_get_bit(const v128_t *x, int i);
|
||||
|
||||
void
|
||||
v128_set_bit(v128_t *x, int i) ;
|
||||
|
||||
void
|
||||
v128_clear_bit(v128_t *x, int i);
|
||||
|
||||
void
|
||||
v128_set_bit_to(v128_t *x, int i, int y);
|
||||
|
||||
#endif /* DATATYPES_USE_MACROS */
|
||||
|
||||
/*
|
||||
* octet_string_is_eq(a,b, len) returns 1 if the length len strings a
|
||||
* and b are not equal, returns 0 otherwise
|
||||
*/
|
||||
|
||||
int
|
||||
octet_string_is_eq(uint8_t *a, uint8_t *b, int len);
|
||||
|
||||
void
|
||||
octet_string_set_to_zero(uint8_t *s, int len);
|
||||
|
||||
|
||||
#endif /* MATH_H */
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,220 @@
|
|||
/*
|
||||
* crypto_types.h
|
||||
*
|
||||
* constants for cipher types and auth func types
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright(c) 2001-2006 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CRYPTO_TYPES_H
|
||||
#define CRYPTO_TYPES_H
|
||||
|
||||
/**
|
||||
* @defgroup Algos Cryptographic Algorithms
|
||||
*
|
||||
*
|
||||
* This library provides several different cryptographic algorithms,
|
||||
* each of which can be selected by using the cipher_type_id_t and
|
||||
* auth_type_id_t. These algorithms are documented below.
|
||||
*
|
||||
* Authentication functions that use the Universal Security Transform
|
||||
* (UST) must be used in conjunction with a cipher other than the null
|
||||
* cipher. These functions require a per-message pseudorandom input
|
||||
* that is generated by the cipher.
|
||||
*
|
||||
* The identifiers STRONGHOLD_AUTH and STRONGHOLD_CIPHER identify the
|
||||
* strongest available authentication function and cipher,
|
||||
* respectively. They are resolved at compile time to the strongest
|
||||
* available algorithm. The stronghold algorithms can serve as did
|
||||
* the keep of a medieval fortification; they provide the strongest
|
||||
* defense (or the last refuge).
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup Ciphers Cipher Types
|
||||
*
|
||||
* @brief Each cipher type is identified by an unsigned integer. The
|
||||
* cipher types available in this edition of libSRTP are given
|
||||
* by the #defines below.
|
||||
*
|
||||
* A cipher_type_id_t is an identifier for a cipher_type; only values
|
||||
* given by the #defines above (or those present in the file
|
||||
* crypto_types.h) should be used.
|
||||
*
|
||||
* The identifier STRONGHOLD_CIPHER indicates the strongest available
|
||||
* cipher, allowing an application to choose the strongest available
|
||||
* algorithm without any advance knowledge about the avaliable
|
||||
* algorithms.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief The null cipher performs no encryption.
|
||||
*
|
||||
* The NULL_CIPHER leaves its inputs unaltered, during both the
|
||||
* encryption and decryption operations. This cipher can be chosen
|
||||
* to indicate that no encryption is to be performed.
|
||||
*/
|
||||
#define NULL_CIPHER 0
|
||||
|
||||
/**
|
||||
* @brief AES Integer Counter Mode (AES ICM)
|
||||
*
|
||||
* AES ICM is the variant of counter mode that is used by Secure RTP.
|
||||
* This cipher uses a 16-, 24-, or 32-octet key concatenated with a
|
||||
* 14-octet offset (or salt) value.
|
||||
*/
|
||||
#define AES_ICM 1
|
||||
|
||||
/**
|
||||
* @brief AES-128 Integer Counter Mode (AES ICM)
|
||||
* AES-128 ICM is a deprecated alternate name for AES ICM.
|
||||
*/
|
||||
#define AES_128_ICM AES_ICM
|
||||
|
||||
/**
|
||||
* @brief SEAL 3.0
|
||||
*
|
||||
* SEAL is the Software-Optimized Encryption Algorithm of Coppersmith
|
||||
* and Rogaway. Nota bene: this cipher is IBM proprietary.
|
||||
*/
|
||||
#define SEAL 2
|
||||
|
||||
/**
|
||||
* @brief AES Cipher Block Chaining mode (AES CBC)
|
||||
*
|
||||
* AES CBC is the AES Cipher Block Chaining mode.
|
||||
* This cipher uses a 16-, 24-, or 32-octet key.
|
||||
*/
|
||||
#define AES_CBC 3
|
||||
|
||||
/**
|
||||
* @brief AES-128 Cipher Block Chaining mode (AES CBC)
|
||||
*
|
||||
* AES-128 CBC is a deprecated alternate name for AES CBC.
|
||||
*/
|
||||
#define AES_128_CBC AES_CBC
|
||||
|
||||
/**
|
||||
* @brief Strongest available cipher.
|
||||
*
|
||||
* This identifier resolves to the strongest cipher type available.
|
||||
*/
|
||||
#define STRONGHOLD_CIPHER AES_ICM
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @defgroup Authentication Authentication Function Types
|
||||
*
|
||||
* @brief Each authentication function type is identified by an
|
||||
* unsigned integer. The authentication function types available in
|
||||
* this edition of libSRTP are given by the #defines below.
|
||||
*
|
||||
* An auth_type_id_t is an identifier for an authentication function type;
|
||||
* only values given by the #defines above (or those present in the
|
||||
* file crypto_types.h) should be used.
|
||||
*
|
||||
* The identifier STRONGHOLD_AUTH indicates the strongest available
|
||||
* authentication function, allowing an application to choose the
|
||||
* strongest available algorithm without any advance knowledge about
|
||||
* the avaliable algorithms. The stronghold algorithms can serve as
|
||||
* did the keep of a medieval fortification; they provide the
|
||||
* strongest defense (or the last refuge).
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief The null authentication function performs no authentication.
|
||||
*
|
||||
* The NULL_AUTH function does nothing, and can be selected to indicate
|
||||
* that authentication should not be performed.
|
||||
*/
|
||||
#define NULL_AUTH 0
|
||||
|
||||
/**
|
||||
* @brief UST with TMMH Version 2
|
||||
*
|
||||
* UST_TMMHv2 implements the Truncated Multi-Modular Hash using
|
||||
* UST. This function must be used in conjunction with a cipher other
|
||||
* than the null cipher.
|
||||
* with a cipher.
|
||||
*/
|
||||
#define UST_TMMHv2 1
|
||||
|
||||
/**
|
||||
* @brief (UST) AES-128 XORMAC
|
||||
*
|
||||
* UST_AES_128_XMAC implements AES-128 XORMAC, using UST. Nota bene:
|
||||
* the XORMAC algorithm is IBM proprietary.
|
||||
*/
|
||||
#define UST_AES_128_XMAC 2
|
||||
|
||||
/**
|
||||
* @brief HMAC-SHA1
|
||||
*
|
||||
* HMAC_SHA1 implements the Hash-based MAC using the NIST Secure
|
||||
* Hash Algorithm version 1 (SHA1).
|
||||
*/
|
||||
#define HMAC_SHA1 3
|
||||
|
||||
/**
|
||||
* @brief Strongest available authentication function.
|
||||
*
|
||||
* This identifier resolves to the strongest available authentication
|
||||
* function.
|
||||
*/
|
||||
#define STRONGHOLD_AUTH HMAC_SHA1
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif /* CRYPTO_TYPES_H */
|
|
@ -0,0 +1,133 @@
|
|||
/*
|
||||
* cryptoalg.h
|
||||
*
|
||||
* API for authenticated encryption crypto algorithms
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CRYPTOALG_H
|
||||
#define CRYPTOALG_H
|
||||
|
||||
#include "err.h"
|
||||
|
||||
/**
|
||||
* @defgroup Crypto Cryptography
|
||||
*
|
||||
* Zed uses a simple interface to a cryptographic transform.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief applies a crypto algorithm
|
||||
*
|
||||
* The function pointer cryptoalg_func_t points to a function that
|
||||
* implements a crypto transform, and provides a uniform API for
|
||||
* accessing crypto mechanisms.
|
||||
*
|
||||
* @param key location of secret key
|
||||
*
|
||||
* @param clear data to be authenticated but not encrypted
|
||||
*
|
||||
* @param clear_len length of data to be authenticated but not encrypted
|
||||
*
|
||||
* @param iv location to write the Initialization Vector (IV)
|
||||
*
|
||||
* @param protect location of the data to be encrypted and
|
||||
* authenticated (before the function call), and the ciphertext
|
||||
* and authentication tag (after the call)
|
||||
*
|
||||
* @param protected_len location of the length of the data to be
|
||||
* encrypted and authenticated (before the function call), and the
|
||||
* length of the ciphertext (after the call)
|
||||
*
|
||||
*/
|
||||
|
||||
typedef err_status_t (*cryptoalg_func_t)
|
||||
(void *key,
|
||||
const void *clear,
|
||||
unsigned clear_len,
|
||||
void *iv,
|
||||
void *protect,
|
||||
unsigned *protected_len);
|
||||
|
||||
typedef
|
||||
err_status_t (*cryptoalg_inv_t)
|
||||
(void *key, /* location of secret key */
|
||||
const void *clear, /* data to be authenticated only */
|
||||
unsigned clear_len, /* length of data to be authenticated only */
|
||||
void *iv, /* location of iv */
|
||||
void *opaque, /* data to be decrypted and authenticated */
|
||||
unsigned *opaque_len /* location of the length of data to be
|
||||
* decrypted and authd (before and after)
|
||||
*/
|
||||
);
|
||||
|
||||
typedef struct cryptoalg_ctx_t {
|
||||
cryptoalg_func_t enc;
|
||||
cryptoalg_inv_t dec;
|
||||
unsigned key_len;
|
||||
unsigned iv_len;
|
||||
unsigned auth_tag_len;
|
||||
unsigned max_expansion;
|
||||
} cryptoalg_ctx_t;
|
||||
|
||||
typedef cryptoalg_ctx_t *cryptoalg_t;
|
||||
|
||||
#define cryptoalg_get_key_len(cryptoalg) ((cryptoalg)->key_len)
|
||||
|
||||
#define cryptoalg_get_iv_len(cryptoalg) ((cryptoalg)->iv_len)
|
||||
|
||||
#define cryptoalg_get_auth_tag_len(cryptoalg) ((cryptoalg)->auth_tag_len)
|
||||
|
||||
int
|
||||
cryptoalg_get_id(cryptoalg_t c);
|
||||
|
||||
cryptoalg_t
|
||||
cryptoalg_find_by_id(int id);
|
||||
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif /* CRYPTOALG_H */
|
||||
|
||||
|
|
@ -0,0 +1,506 @@
|
|||
/*
|
||||
* datatypes.h
|
||||
*
|
||||
* data types for bit vectors and finite fields
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _DATATYPES_H
|
||||
#define _DATATYPES_H
|
||||
|
||||
#include "integers.h" /* definitions of uint32_t, et cetera */
|
||||
#include "alloc.h"
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#ifndef SRTP_KERNEL
|
||||
# include <stdio.h>
|
||||
# include <string.h>
|
||||
# include <time.h>
|
||||
# ifdef HAVE_NETINET_IN_H
|
||||
# include <netinet/in.h>
|
||||
# elif defined HAVE_WINSOCK2_H
|
||||
# include <winsock2.h>
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/* if DATATYPES_USE_MACROS is defined, then little functions are macros */
|
||||
#define DATATYPES_USE_MACROS
|
||||
|
||||
typedef union {
|
||||
uint8_t v8[2];
|
||||
uint16_t value;
|
||||
} v16_t;
|
||||
|
||||
typedef union {
|
||||
uint8_t v8[4];
|
||||
uint16_t v16[2];
|
||||
uint32_t value;
|
||||
} v32_t;
|
||||
|
||||
typedef union {
|
||||
uint8_t v8[8];
|
||||
uint16_t v16[4];
|
||||
uint32_t v32[2];
|
||||
uint64_t value;
|
||||
} v64_t;
|
||||
|
||||
typedef union {
|
||||
uint8_t v8[16];
|
||||
uint16_t v16[8];
|
||||
uint32_t v32[4];
|
||||
uint64_t v64[2];
|
||||
} v128_t;
|
||||
|
||||
|
||||
|
||||
/* some useful and simple math functions */
|
||||
|
||||
#define pow_2(X) ( (unsigned int)1 << (X) ) /* 2^X */
|
||||
|
||||
#define pow_minus_one(X) ( (X) ? -1 : 1 ) /* (-1)^X */
|
||||
|
||||
|
||||
/*
|
||||
* octet_get_weight(x) returns the hamming weight (number of bits equal to
|
||||
* one) in the octet x
|
||||
*/
|
||||
|
||||
int
|
||||
octet_get_weight(uint8_t octet);
|
||||
|
||||
char *
|
||||
octet_bit_string(uint8_t x);
|
||||
|
||||
#define MAX_PRINT_STRING_LEN 1024
|
||||
|
||||
char *
|
||||
octet_string_hex_string(const void *str, int length);
|
||||
|
||||
char *
|
||||
v128_bit_string(v128_t *x);
|
||||
|
||||
char *
|
||||
v128_hex_string(v128_t *x);
|
||||
|
||||
uint8_t
|
||||
nibble_to_hex_char(uint8_t nibble);
|
||||
|
||||
char *
|
||||
char_to_hex_string(char *x, int num_char);
|
||||
|
||||
uint8_t
|
||||
hex_string_to_octet(char *s);
|
||||
|
||||
/*
|
||||
* hex_string_to_octet_string(raw, hex, len) converts the hexadecimal
|
||||
* string at *hex (of length len octets) to the equivalent raw data
|
||||
* and writes it to *raw.
|
||||
*
|
||||
* if a character in the hex string that is not a hexadeciaml digit
|
||||
* (0123456789abcdefABCDEF) is encountered, the function stops writing
|
||||
* data to *raw
|
||||
*
|
||||
* the number of hex digits copied (which is two times the number of
|
||||
* octets in *raw) is returned
|
||||
*/
|
||||
|
||||
int
|
||||
hex_string_to_octet_string(char *raw, char *hex, int len);
|
||||
|
||||
v128_t
|
||||
hex_string_to_v128(char *s);
|
||||
|
||||
void
|
||||
v128_copy_octet_string(v128_t *x, const uint8_t s[16]);
|
||||
|
||||
void
|
||||
v128_left_shift(v128_t *x, int shift_index);
|
||||
|
||||
void
|
||||
v128_right_shift(v128_t *x, int shift_index);
|
||||
|
||||
/*
|
||||
* the following macros define the data manipulation functions
|
||||
*
|
||||
* If DATATYPES_USE_MACROS is defined, then these macros are used
|
||||
* directly (and function call overhead is avoided). Otherwise,
|
||||
* the macros are used through the functions defined in datatypes.c
|
||||
* (and the compiler provides better warnings).
|
||||
*/
|
||||
|
||||
#define _v128_set_to_zero(x) \
|
||||
( \
|
||||
(x)->v32[0] = 0, \
|
||||
(x)->v32[1] = 0, \
|
||||
(x)->v32[2] = 0, \
|
||||
(x)->v32[3] = 0 \
|
||||
)
|
||||
|
||||
#define _v128_copy(x, y) \
|
||||
( \
|
||||
(x)->v32[0] = (y)->v32[0], \
|
||||
(x)->v32[1] = (y)->v32[1], \
|
||||
(x)->v32[2] = (y)->v32[2], \
|
||||
(x)->v32[3] = (y)->v32[3] \
|
||||
)
|
||||
|
||||
#define _v128_xor(z, x, y) \
|
||||
( \
|
||||
(z)->v32[0] = (x)->v32[0] ^ (y)->v32[0], \
|
||||
(z)->v32[1] = (x)->v32[1] ^ (y)->v32[1], \
|
||||
(z)->v32[2] = (x)->v32[2] ^ (y)->v32[2], \
|
||||
(z)->v32[3] = (x)->v32[3] ^ (y)->v32[3] \
|
||||
)
|
||||
|
||||
#define _v128_and(z, x, y) \
|
||||
( \
|
||||
(z)->v32[0] = (x)->v32[0] & (y)->v32[0], \
|
||||
(z)->v32[1] = (x)->v32[1] & (y)->v32[1], \
|
||||
(z)->v32[2] = (x)->v32[2] & (y)->v32[2], \
|
||||
(z)->v32[3] = (x)->v32[3] & (y)->v32[3] \
|
||||
)
|
||||
|
||||
#define _v128_or(z, x, y) \
|
||||
( \
|
||||
(z)->v32[0] = (x)->v32[0] | (y)->v32[0], \
|
||||
(z)->v32[1] = (x)->v32[1] | (y)->v32[1], \
|
||||
(z)->v32[2] = (x)->v32[2] | (y)->v32[2], \
|
||||
(z)->v32[3] = (x)->v32[3] | (y)->v32[3] \
|
||||
)
|
||||
|
||||
#define _v128_complement(x) \
|
||||
( \
|
||||
(x)->v32[0] = ~(x)->v32[0], \
|
||||
(x)->v32[1] = ~(x)->v32[1], \
|
||||
(x)->v32[2] = ~(x)->v32[2], \
|
||||
(x)->v32[3] = ~(x)->v32[3] \
|
||||
)
|
||||
|
||||
/* ok for NO_64BIT_MATH if it can compare uint64_t's (even as structures) */
|
||||
#define _v128_is_eq(x, y) \
|
||||
(((x)->v64[0] == (y)->v64[0]) && ((x)->v64[1] == (y)->v64[1]))
|
||||
|
||||
|
||||
#ifdef NO_64BIT_MATH
|
||||
#define _v128_xor_eq(z, x) \
|
||||
( \
|
||||
(z)->v32[0] ^= (x)->v32[0], \
|
||||
(z)->v32[1] ^= (x)->v32[1], \
|
||||
(z)->v32[2] ^= (x)->v32[2], \
|
||||
(z)->v32[3] ^= (x)->v32[3] \
|
||||
)
|
||||
#else
|
||||
#define _v128_xor_eq(z, x) \
|
||||
( \
|
||||
(z)->v64[0] ^= (x)->v64[0], \
|
||||
(z)->v64[1] ^= (x)->v64[1] \
|
||||
)
|
||||
#endif
|
||||
|
||||
/* NOTE! This assumes an odd ordering! */
|
||||
/* This will not be compatible directly with math on some processors */
|
||||
/* bit 0 is first 32-bit word, low order bit. in little-endian, that's
|
||||
the first byte of the first 32-bit word. In big-endian, that's
|
||||
the 3rd byte of the first 32-bit word */
|
||||
/* The get/set bit code is used by the replay code ONLY, and it doesn't
|
||||
really care which bit is which. AES does care which bit is which, but
|
||||
doesn't use the 128-bit get/set or 128-bit shifts */
|
||||
|
||||
#define _v128_get_bit(x, bit) \
|
||||
( \
|
||||
((((x)->v32[(bit) >> 5]) >> ((bit) & 31)) & 1) \
|
||||
)
|
||||
|
||||
#define _v128_set_bit(x, bit) \
|
||||
( \
|
||||
(((x)->v32[(bit) >> 5]) |= ((uint32_t)1 << ((bit) & 31))) \
|
||||
)
|
||||
|
||||
#define _v128_clear_bit(x, bit) \
|
||||
( \
|
||||
(((x)->v32[(bit) >> 5]) &= ~((uint32_t)1 << ((bit) & 31))) \
|
||||
)
|
||||
|
||||
#define _v128_set_bit_to(x, bit, value) \
|
||||
( \
|
||||
(value) ? _v128_set_bit(x, bit) : \
|
||||
_v128_clear_bit(x, bit) \
|
||||
)
|
||||
|
||||
|
||||
#if 0
|
||||
/* nothing uses this */
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
|
||||
#define _v128_add(z, x, y) { \
|
||||
uint64_t tmp; \
|
||||
\
|
||||
tmp = x->v32[3] + y->v32[3]; \
|
||||
z->v32[3] = (uint32_t) tmp; \
|
||||
\
|
||||
tmp = x->v32[2] + y->v32[2] + (tmp >> 32); \
|
||||
z->v32[2] = (uint32_t) tmp; \
|
||||
\
|
||||
tmp = x->v32[1] + y->v32[1] + (tmp >> 32); \
|
||||
z->v32[1] = (uint32_t) tmp; \
|
||||
\
|
||||
tmp = x->v32[0] + y->v32[0] + (tmp >> 32); \
|
||||
z->v32[0] = (uint32_t) tmp; \
|
||||
}
|
||||
|
||||
#else /* assume little endian architecture */
|
||||
|
||||
#define _v128_add(z, x, y) { \
|
||||
uint64_t tmp; \
|
||||
\
|
||||
tmp = htonl(x->v32[3]) + htonl(y->v32[3]); \
|
||||
z->v32[3] = ntohl((uint32_t) tmp); \
|
||||
\
|
||||
tmp = htonl(x->v32[2]) + htonl(y->v32[2]) \
|
||||
+ htonl(tmp >> 32); \
|
||||
z->v32[2] = ntohl((uint32_t) tmp); \
|
||||
\
|
||||
tmp = htonl(x->v32[1]) + htonl(y->v32[1]) \
|
||||
+ htonl(tmp >> 32); \
|
||||
z->v32[1] = ntohl((uint32_t) tmp); \
|
||||
\
|
||||
tmp = htonl(x->v32[0]) + htonl(y->v32[0]) \
|
||||
+ htonl(tmp >> 32); \
|
||||
z->v32[0] = ntohl((uint32_t) tmp); \
|
||||
}
|
||||
#endif /* WORDS_BIGENDIAN */
|
||||
#endif /* 0 */
|
||||
|
||||
|
||||
#ifdef DATATYPES_USE_MACROS /* little functions are really macros */
|
||||
|
||||
#define v128_set_to_zero(z) _v128_set_to_zero(z)
|
||||
#define v128_copy(z, x) _v128_copy(z, x)
|
||||
#define v128_xor(z, x, y) _v128_xor(z, x, y)
|
||||
#define v128_and(z, x, y) _v128_and(z, x, y)
|
||||
#define v128_or(z, x, y) _v128_or(z, x, y)
|
||||
#define v128_complement(x) _v128_complement(x)
|
||||
#define v128_is_eq(x, y) _v128_is_eq(x, y)
|
||||
#define v128_xor_eq(x, y) _v128_xor_eq(x, y)
|
||||
#define v128_get_bit(x, i) _v128_get_bit(x, i)
|
||||
#define v128_set_bit(x, i) _v128_set_bit(x, i)
|
||||
#define v128_clear_bit(x, i) _v128_clear_bit(x, i)
|
||||
#define v128_set_bit_to(x, i, y) _v128_set_bit_to(x, i, y)
|
||||
|
||||
#else
|
||||
|
||||
void
|
||||
v128_set_to_zero(v128_t *x);
|
||||
|
||||
int
|
||||
v128_is_eq(const v128_t *x, const v128_t *y);
|
||||
|
||||
void
|
||||
v128_copy(v128_t *x, const v128_t *y);
|
||||
|
||||
void
|
||||
v128_xor(v128_t *z, v128_t *x, v128_t *y);
|
||||
|
||||
void
|
||||
v128_and(v128_t *z, v128_t *x, v128_t *y);
|
||||
|
||||
void
|
||||
v128_or(v128_t *z, v128_t *x, v128_t *y);
|
||||
|
||||
void
|
||||
v128_complement(v128_t *x);
|
||||
|
||||
int
|
||||
v128_get_bit(const v128_t *x, int i);
|
||||
|
||||
void
|
||||
v128_set_bit(v128_t *x, int i) ;
|
||||
|
||||
void
|
||||
v128_clear_bit(v128_t *x, int i);
|
||||
|
||||
void
|
||||
v128_set_bit_to(v128_t *x, int i, int y);
|
||||
|
||||
#endif /* DATATYPES_USE_MACROS */
|
||||
|
||||
/*
|
||||
* octet_string_is_eq(a,b, len) returns 1 if the length len strings a
|
||||
* and b are not equal, returns 0 otherwise
|
||||
*/
|
||||
|
||||
int
|
||||
octet_string_is_eq(uint8_t *a, uint8_t *b, int len);
|
||||
|
||||
void
|
||||
octet_string_set_to_zero(uint8_t *s, int len);
|
||||
|
||||
|
||||
#ifndef SRTP_KERNEL_LINUX
|
||||
|
||||
/*
|
||||
* Convert big endian integers to CPU byte order.
|
||||
*/
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
/* Nothing to do. */
|
||||
# define be32_to_cpu(x) (x)
|
||||
# define be64_to_cpu(x) (x)
|
||||
#elif defined(HAVE_BYTESWAP_H)
|
||||
/* We have (hopefully) optimized versions in byteswap.h */
|
||||
# include <byteswap.h>
|
||||
# define be32_to_cpu(x) bswap_32((x))
|
||||
# define be64_to_cpu(x) bswap_64((x))
|
||||
#else
|
||||
|
||||
#if defined(__GNUC__) && defined(HAVE_X86)
|
||||
/* Fall back. */
|
||||
static inline uint32_t be32_to_cpu(uint32_t v) {
|
||||
/* optimized for x86. */
|
||||
asm("bswap %0" : "=r" (v) : "0" (v));
|
||||
return v;
|
||||
}
|
||||
# else /* HAVE_X86 */
|
||||
# ifdef HAVE_NETINET_IN_H
|
||||
# include <netinet/in.h>
|
||||
# elif defined HAVE_WINSOCK2_H
|
||||
# include <winsock2.h>
|
||||
# endif
|
||||
# define be32_to_cpu(x) ntohl((x))
|
||||
# endif /* HAVE_X86 */
|
||||
|
||||
static inline uint64_t be64_to_cpu(uint64_t v) {
|
||||
# ifdef NO_64BIT_MATH
|
||||
/* use the make64 functions to do 64-bit math */
|
||||
v = make64(htonl(low32(v)),htonl(high32(v)));
|
||||
# else
|
||||
/* use the native 64-bit math */
|
||||
v= (uint64_t)((be32_to_cpu((uint32_t)(v >> 32))) | (((uint64_t)be32_to_cpu((uint32_t)v)) << 32));
|
||||
# endif
|
||||
return v;
|
||||
}
|
||||
|
||||
#endif /* ! SRTP_KERNEL_LINUX */
|
||||
|
||||
#endif /* WORDS_BIGENDIAN */
|
||||
|
||||
/*
|
||||
* functions manipulating bitvector_t
|
||||
*
|
||||
* A bitvector_t consists of an array of words and an integer
|
||||
* representing the number of significant bits stored in the array.
|
||||
* The bits are packed as follows: the least significant bit is that
|
||||
* of word[0], while the most significant bit is the nth most
|
||||
* significant bit of word[m], where length = bits_per_word * m + n.
|
||||
*
|
||||
*/
|
||||
|
||||
#define bits_per_word 32
|
||||
#define bytes_per_word 4
|
||||
|
||||
typedef struct {
|
||||
uint32_t length;
|
||||
uint32_t *word;
|
||||
} bitvector_t;
|
||||
|
||||
|
||||
#define _bitvector_get_bit(v, bit_index) \
|
||||
( \
|
||||
((((v)->word[((bit_index) >> 5)]) >> ((bit_index) & 31)) & 1) \
|
||||
)
|
||||
|
||||
|
||||
#define _bitvector_set_bit(v, bit_index) \
|
||||
( \
|
||||
(((v)->word[((bit_index) >> 5)] |= ((uint32_t)1 << ((bit_index) & 31)))) \
|
||||
)
|
||||
|
||||
#define _bitvector_clear_bit(v, bit_index) \
|
||||
( \
|
||||
(((v)->word[((bit_index) >> 5)] &= ~((uint32_t)1 << ((bit_index) & 31)))) \
|
||||
)
|
||||
|
||||
#define _bitvector_get_length(v) \
|
||||
( \
|
||||
((v)->length) \
|
||||
)
|
||||
|
||||
#ifdef DATATYPES_USE_MACROS /* little functions are really macros */
|
||||
|
||||
#define bitvector_get_bit(v, bit_index) _bitvector_get_bit(v, bit_index)
|
||||
#define bitvector_set_bit(v, bit_index) _bitvector_set_bit(v, bit_index)
|
||||
#define bitvector_clear_bit(v, bit_index) _bitvector_clear_bit(v, bit_index)
|
||||
#define bitvector_get_length(v) _bitvector_get_length(v)
|
||||
|
||||
#else
|
||||
|
||||
int
|
||||
bitvector_get_bit(const bitvector_t *v, int bit_index);
|
||||
|
||||
void
|
||||
bitvector_set_bit(bitvector_t *v, int bit_index);
|
||||
|
||||
void
|
||||
bitvector_clear_bit(bitvector_t *v, int bit_index);
|
||||
|
||||
unsigned long
|
||||
bitvector_get_length(const bitvector_t *v);
|
||||
|
||||
#endif
|
||||
|
||||
int
|
||||
bitvector_alloc(bitvector_t *v, unsigned long length);
|
||||
|
||||
void
|
||||
bitvector_dealloc(bitvector_t *v);
|
||||
|
||||
void
|
||||
bitvector_set_to_zero(bitvector_t *x);
|
||||
|
||||
void
|
||||
bitvector_left_shift(bitvector_t *x, int index);
|
||||
|
||||
char *
|
||||
bitvector_bit_string(bitvector_t *x, char* buf, int len);
|
||||
|
||||
#endif /* _DATATYPES_H */
|
|
@ -0,0 +1,201 @@
|
|||
/*
|
||||
* ekt.h
|
||||
*
|
||||
* interface to Encrypted Key Transport for SRTP
|
||||
*
|
||||
* David McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2005 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* EKT implementation strategy
|
||||
*
|
||||
* use stream_template approach
|
||||
*
|
||||
* in srtp_unprotect, when a new stream appears, check if template has
|
||||
* EKT defined, and if it does, then apply EKT processing
|
||||
*
|
||||
* question: will we want to allow key-sharing templates in addition
|
||||
* to EKT templates? could define a new ssrc_type_t that's associated
|
||||
* with an EKT, e.g. ssrc_any_ekt.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef EKT_H
|
||||
#define EKT_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "srtp_priv.h"
|
||||
|
||||
#define EKT_CIPHER_DEFAULT 1
|
||||
#define EKT_CIPHER_AES_128_ECB 1
|
||||
#define EKT_CIPHER_AES_192_KEY_WRAP 2
|
||||
#define EKT_CIPHER_AES_256_KEY_WRAP 3
|
||||
|
||||
typedef uint16_t ekt_spi_t;
|
||||
|
||||
|
||||
unsigned
|
||||
ekt_octets_after_base_tag(ekt_stream_t ekt);
|
||||
|
||||
/*
|
||||
* an srtp_policy_t structure can contain a pointer to an
|
||||
* ekt_policy_t structure
|
||||
*
|
||||
* this structure holds all of the high level EKT information, and it
|
||||
* is passed into libsrtp to indicate what policy should be in effect
|
||||
*/
|
||||
|
||||
typedef struct ekt_policy_ctx_t {
|
||||
ekt_spi_t spi; /* security parameter index */
|
||||
uint8_t ekt_cipher_type;
|
||||
uint8_t *ekt_key;
|
||||
struct ekt_policy_ctx_t *next_ekt_policy;
|
||||
} ekt_policy_ctx_t;
|
||||
|
||||
|
||||
/*
|
||||
* an ekt_data_t structure holds the data corresponding to an ekt key,
|
||||
* spi, and so on
|
||||
*/
|
||||
|
||||
typedef struct ekt_data_t {
|
||||
ekt_spi_t spi;
|
||||
uint8_t ekt_cipher_type;
|
||||
aes_expanded_key_t ekt_enc_key;
|
||||
aes_expanded_key_t ekt_dec_key;
|
||||
struct ekt_data_t *next_ekt_data;
|
||||
} ekt_data_t;
|
||||
|
||||
/*
|
||||
* an srtp_stream_ctx_t can contain an ekt_stream_ctx_t
|
||||
*
|
||||
* an ekt_stream_ctx_t structure holds all of the EKT information for
|
||||
* a specific SRTP stream
|
||||
*/
|
||||
|
||||
typedef struct ekt_stream_ctx_t {
|
||||
ekt_data_t *data;
|
||||
uint16_t isn; /* initial sequence number */
|
||||
uint8_t encrypted_master_key[SRTP_MAX_KEY_LEN];
|
||||
} ekt_stream_ctx_t;
|
||||
|
||||
|
||||
|
||||
err_status_t
|
||||
ekt_alloc(ekt_stream_t *stream_data, ekt_policy_t policy);
|
||||
|
||||
err_status_t
|
||||
ekt_stream_init(ekt_stream_t e,
|
||||
ekt_spi_t spi,
|
||||
void *ekt_key,
|
||||
unsigned ekt_cipher_type);
|
||||
|
||||
err_status_t
|
||||
ekt_stream_init_from_policy(ekt_stream_t e, ekt_policy_t p);
|
||||
|
||||
|
||||
|
||||
err_status_t
|
||||
srtp_stream_init_from_ekt(srtp_stream_t stream,
|
||||
const void *srtcp_hdr,
|
||||
unsigned pkt_octet_len);
|
||||
|
||||
|
||||
void
|
||||
ekt_write_data(ekt_stream_t ekt,
|
||||
uint8_t *base_tag,
|
||||
unsigned base_tag_len,
|
||||
int *packet_len,
|
||||
xtd_seq_num_t pkt_index);
|
||||
|
||||
/*
|
||||
* We handle EKT by performing some additional steps before
|
||||
* authentication (copying the auth tag into a temporary location,
|
||||
* zeroizing the "base tag" field in the packet)
|
||||
*
|
||||
* With EKT, the tag_len parameter is actually the base tag
|
||||
* length
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
ekt_tag_verification_preproces(uint8_t *pkt_tag,
|
||||
uint8_t *pkt_tag_copy,
|
||||
unsigned tag_len);
|
||||
|
||||
err_status_t
|
||||
ekt_tag_verification_postproces(uint8_t *pkt_tag,
|
||||
uint8_t *pkt_tag_copy,
|
||||
unsigned tag_len);
|
||||
|
||||
|
||||
/*
|
||||
* @brief EKT pre-processing for srtcp tag generation
|
||||
*
|
||||
* This function does the pre-processing of the SRTCP authentication
|
||||
* tag format. When EKT is used, it consists of writing the Encrypted
|
||||
* Master Key, the SRTP ROC, the Initial Sequence Number, and SPI
|
||||
* fields. The Base Authentication Tag field is set to the all-zero
|
||||
* value
|
||||
*
|
||||
* When EKT is not used, this function is a no-op.
|
||||
*
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
srtp_stream_srtcp_auth_tag_generation_preprocess(const srtp_stream_t *s,
|
||||
uint8_t *pkt_tag,
|
||||
unsigned pkt_octet_len);
|
||||
|
||||
/* it's not clear that a tag_generation_postprocess function is needed */
|
||||
|
||||
err_status_t
|
||||
srtcp_auth_tag_generation_postprocess(void);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* EKT_H */
|
|
@ -0,0 +1,174 @@
|
|||
/*
|
||||
* err.h
|
||||
*
|
||||
* error status codes
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ERR_H
|
||||
#define ERR_H
|
||||
|
||||
#include "datatypes.h"
|
||||
|
||||
/**
|
||||
* @defgroup Error Error Codes
|
||||
*
|
||||
* Error status codes are represented by the enumeration err_status_t.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* @brief err_status_t defines error codes.
|
||||
*
|
||||
* The enumeration err_status_t defines error codes. Note that the
|
||||
* value of err_status_ok is equal to zero, which can simplify error
|
||||
* checking somewhat.
|
||||
*
|
||||
*/
|
||||
typedef enum {
|
||||
err_status_ok = 0, /**< nothing to report */
|
||||
err_status_fail = 1, /**< unspecified failure */
|
||||
err_status_bad_param = 2, /**< unsupported parameter */
|
||||
err_status_alloc_fail = 3, /**< couldn't allocate memory */
|
||||
err_status_dealloc_fail = 4, /**< couldn't deallocate properly */
|
||||
err_status_init_fail = 5, /**< couldn't initialize */
|
||||
err_status_terminus = 6, /**< can't process as much data as requested */
|
||||
err_status_auth_fail = 7, /**< authentication failure */
|
||||
err_status_cipher_fail = 8, /**< cipher failure */
|
||||
err_status_replay_fail = 9, /**< replay check failed (bad index) */
|
||||
err_status_replay_old = 10, /**< replay check failed (index too old) */
|
||||
err_status_algo_fail = 11, /**< algorithm failed test routine */
|
||||
err_status_no_such_op = 12, /**< unsupported operation */
|
||||
err_status_no_ctx = 13, /**< no appropriate context found */
|
||||
err_status_cant_check = 14, /**< unable to perform desired validation */
|
||||
err_status_key_expired = 15, /**< can't use key any more */
|
||||
err_status_socket_err = 16, /**< error in use of socket */
|
||||
err_status_signal_err = 17, /**< error in use POSIX signals */
|
||||
err_status_nonce_bad = 18, /**< nonce check failed */
|
||||
err_status_read_fail = 19, /**< couldn't read data */
|
||||
err_status_write_fail = 20, /**< couldn't write data */
|
||||
err_status_parse_err = 21, /**< error pasring data */
|
||||
err_status_encode_err = 22, /**< error encoding data */
|
||||
err_status_semaphore_err = 23,/**< error while using semaphores */
|
||||
err_status_pfkey_err = 24 /**< error while using pfkey */
|
||||
} err_status_t;
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
err_level_emergency = 0,
|
||||
err_level_alert,
|
||||
err_level_critical,
|
||||
err_level_error,
|
||||
err_level_warning,
|
||||
err_level_notice,
|
||||
err_level_info,
|
||||
err_level_debug,
|
||||
err_level_none
|
||||
} err_reporting_level_t;
|
||||
|
||||
/*
|
||||
* err_reporting_init prepares the error system. If
|
||||
* ERR_REPORTING_SYSLOG is defined, it will open syslog.
|
||||
*
|
||||
* The ident argument is a string that will be prepended to
|
||||
* all syslog messages. It is conventionally argv[0].
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
err_reporting_init(char *ident);
|
||||
|
||||
#ifdef SRTP_KERNEL_LINUX
|
||||
extern err_reporting_level_t err_level;
|
||||
#else
|
||||
|
||||
/*
|
||||
* keydaemon_report_error reports a 'printf' formatted error
|
||||
* string, followed by a an arg list. The priority argument
|
||||
* is equivalent to that defined for syslog.
|
||||
*
|
||||
* Errors will be reported to ERR_REPORTING_FILE, if defined, and to
|
||||
* syslog, if ERR_REPORTING_SYSLOG is defined.
|
||||
*
|
||||
*/
|
||||
|
||||
void
|
||||
err_report(int priority, char *format, ...);
|
||||
#endif /* ! SRTP_KERNEL_LINUX */
|
||||
|
||||
|
||||
/*
|
||||
* debug_module_t defines a debug module
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
int on; /* 1 if debugging is on, 0 if it is off */
|
||||
char *name; /* printable name for debug module */
|
||||
} debug_module_t;
|
||||
|
||||
#ifdef ENABLE_DEBUGGING
|
||||
|
||||
#define debug_on(mod) (mod).on = 1
|
||||
|
||||
#define debug_off(mod) (mod).on = 0
|
||||
|
||||
/* use err_report() to report debug message */
|
||||
#define debug_print(mod, format, arg) \
|
||||
if (mod.on) err_report(err_level_debug, ("%s: " format "\n"), mod.name, arg)
|
||||
#define debug_print2(mod, format, arg1,arg2) \
|
||||
if (mod.on) err_report(err_level_debug, ("%s: " format "\n"), mod.name, arg1,arg2)
|
||||
|
||||
#else
|
||||
|
||||
/* define macros to do nothing */
|
||||
#define debug_print(mod, format, arg)
|
||||
|
||||
#define debug_on(mod)
|
||||
|
||||
#define debug_off(mod)
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* ERR_H */
|
|
@ -0,0 +1,60 @@
|
|||
/*
|
||||
* getopt.h
|
||||
*
|
||||
* interface to a minimal implementation of the getopt() function,
|
||||
* written so that test applications that use that function can run on
|
||||
* non-POSIX platforms
|
||||
*
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GETOPT_S_H
|
||||
#define GETOPT_S_H
|
||||
|
||||
/*
|
||||
* getopt_s(), optarg_s, and optind_s are small, locally defined
|
||||
* versions of the POSIX standard getopt() interface.
|
||||
*/
|
||||
|
||||
int
|
||||
getopt_s(int argc, char * const argv[], const char *optstring);
|
||||
|
||||
extern char *optarg_s; /* defined in getopt.c */
|
||||
|
||||
extern int optind_s; /* defined in getopt.c */
|
||||
|
||||
#endif /* GETOPT_S_H */
|
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
* gf2_8.h
|
||||
*
|
||||
* GF(256) implementation
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef GF2_8_H
|
||||
#define GF2_8_H
|
||||
|
||||
#include "datatypes.h" /* for uint8_t definition */
|
||||
|
||||
typedef uint8_t gf2_8;
|
||||
|
||||
#define gf2_8_field_polynomial 0x1B
|
||||
|
||||
/*
|
||||
* gf2_8_shift(x) returns
|
||||
*/
|
||||
|
||||
/*
|
||||
* gf2_8_shift(z) returns the result of the GF(2^8) 'multiply by x'
|
||||
* operation, using the field representation from AES; that is, the
|
||||
* next gf2_8 value in the cyclic representation of that field. The
|
||||
* value z should be an uint8_t.
|
||||
*/
|
||||
|
||||
#define gf2_8_shift(z) (((z) & 128) ? \
|
||||
(((z) << 1) ^ gf2_8_field_polynomial) : ((z) << 1))
|
||||
|
||||
gf2_8
|
||||
gf2_8_compute_inverse(gf2_8 x);
|
||||
|
||||
void
|
||||
test_gf2_8(void);
|
||||
|
||||
gf2_8
|
||||
gf2_8_multiply(gf2_8 x, gf2_8 y);
|
||||
|
||||
#endif /* GF2_8_H */
|
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
* hmac.h
|
||||
*
|
||||
* interface to hmac auth_type_t
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef HMAC_H
|
||||
#define HMAC_H
|
||||
|
||||
#include "auth.h"
|
||||
#include "sha1.h"
|
||||
|
||||
typedef struct {
|
||||
uint8_t opad[64];
|
||||
sha1_ctx_t ctx;
|
||||
sha1_ctx_t init_ctx;
|
||||
} hmac_ctx_t;
|
||||
|
||||
err_status_t
|
||||
hmac_alloc(auth_t **a, int key_len, int out_len);
|
||||
|
||||
err_status_t
|
||||
hmac_dealloc(auth_t *a);
|
||||
|
||||
err_status_t
|
||||
hmac_init(hmac_ctx_t *state, const uint8_t *key, int key_len);
|
||||
|
||||
err_status_t
|
||||
hmac_start(hmac_ctx_t *state);
|
||||
|
||||
err_status_t
|
||||
hmac_update(hmac_ctx_t *state, const uint8_t *message, int msg_octets);
|
||||
|
||||
err_status_t
|
||||
hmac_compute(hmac_ctx_t *state, const void *message,
|
||||
int msg_octets, int tag_len, uint8_t *result);
|
||||
|
||||
|
||||
#endif /* HMAC_H */
|
|
@ -0,0 +1,147 @@
|
|||
/*
|
||||
* integers.h
|
||||
*
|
||||
* defines integer types (or refers to their definitions)
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef INTEGERS_H
|
||||
#define INTEGERS_H
|
||||
|
||||
#include "config.h" /* configuration file, using autoconf */
|
||||
|
||||
#ifdef SRTP_KERNEL
|
||||
|
||||
#include "kernel_compat.h"
|
||||
|
||||
#else /* SRTP_KERNEL */
|
||||
|
||||
/* use standard integer definitions, if they're available */
|
||||
#ifdef HAVE_STDLIB_H
|
||||
# include <stdlib.h>
|
||||
#endif
|
||||
#ifdef HAVE_STDINT_H
|
||||
# include <stdint.h>
|
||||
#endif
|
||||
#ifdef HAVE_INTTYPES_H
|
||||
# include <inttypes.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
# include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_INT_TYPES_H
|
||||
# include <sys/int_types.h> /* this exists on Sun OS */
|
||||
#endif
|
||||
#ifdef HAVE_MACHINE_TYPES_H
|
||||
# include <machine/types.h>
|
||||
#endif
|
||||
|
||||
/* Can we do 64 bit integers? */
|
||||
#ifndef HAVE_UINT64_T
|
||||
# if SIZEOF_UNSIGNED_LONG == 8
|
||||
typedef unsigned long uint64_t;
|
||||
# elif SIZEOF_UNSIGNED_LONG_LONG == 8
|
||||
typedef unsigned long long uint64_t;
|
||||
# else
|
||||
# define NO_64BIT_MATH 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Reasonable defaults for 32 bit machines - you may need to
|
||||
* edit these definitions for your own machine. */
|
||||
#ifndef HAVE_UINT8_T
|
||||
typedef unsigned char uint8_t;
|
||||
#endif
|
||||
#ifndef HAVE_UINT16_T
|
||||
typedef unsigned short int uint16_t;
|
||||
#endif
|
||||
#ifndef HAVE_UINT32_T
|
||||
typedef unsigned int uint32_t;
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef NO_64BIT_MATH
|
||||
typedef double uint64_t;
|
||||
/* assert that sizeof(double) == 8 */
|
||||
extern uint64_t make64(uint32_t high, uint32_t low);
|
||||
extern uint32_t high32(uint64_t value);
|
||||
extern uint32_t low32(uint64_t value);
|
||||
#endif
|
||||
|
||||
#endif /* SRTP_KERNEL */
|
||||
|
||||
/* These macros are to load and store 32-bit values from un-aligned
|
||||
addresses. This is required for processors that do not allow unaligned
|
||||
loads. */
|
||||
#ifdef ALIGNMENT_32BIT_REQUIRED
|
||||
/* Note that if it's in a variable, you can memcpy it */
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
#define PUT_32(addr,value) \
|
||||
{ \
|
||||
((unsigned char *) (addr))[0] = (value >> 24); \
|
||||
((unsigned char *) (addr))[1] = (value >> 16) & 0xff; \
|
||||
((unsigned char *) (addr))[2] = (value >> 8) & 0xff; \
|
||||
((unsigned char *) (addr))[3] = (value) & 0xff; \
|
||||
}
|
||||
#define GET_32(addr) ((((unsigned char *) (addr))[0] << 24) | \
|
||||
(((unsigned char *) (addr))[1] << 16) | \
|
||||
(((unsigned char *) (addr))[2] << 8) | \
|
||||
(((unsigned char *) (addr))[3]))
|
||||
#else
|
||||
#define PUT_32(addr,value) \
|
||||
{ \
|
||||
((unsigned char *) (addr))[3] = (value >> 24); \
|
||||
((unsigned char *) (addr))[2] = (value >> 16) & 0xff; \
|
||||
((unsigned char *) (addr))[1] = (value >> 8) & 0xff; \
|
||||
((unsigned char *) (addr))[0] = (value) & 0xff; \
|
||||
}
|
||||
#define GET_32(addr) ((((unsigned char *) (addr))[3] << 24) | \
|
||||
(((unsigned char *) (addr))[2] << 16) | \
|
||||
(((unsigned char *) (addr))[1] << 8) | \
|
||||
(((unsigned char *) (addr))[0]))
|
||||
#endif // WORDS_BIGENDIAN
|
||||
#else
|
||||
#define PUT_32(addr,value) *(((uint32_t *) (addr)) = (value)
|
||||
#define GET_32(addr) (*(((uint32_t *) (addr)))
|
||||
#endif
|
||||
|
||||
#endif /* INTEGERS_H */
|
|
@ -0,0 +1,84 @@
|
|||
/*
|
||||
* kernel_compat.h
|
||||
*
|
||||
* Compatibility stuff for building in kernel context where standard
|
||||
* C headers and library are not available.
|
||||
*
|
||||
* Marcus Sundberg
|
||||
* Ingate Systems AB
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright(c) 2005 Ingate Systems AB
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the author(s) nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef KERNEL_COMPAT_H
|
||||
#define KERNEL_COMPAT_H
|
||||
|
||||
#ifdef SRTP_KERNEL_LINUX
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
|
||||
|
||||
#define err_report(priority, ...) \
|
||||
do {\
|
||||
if (priority <= err_level) {\
|
||||
printk(__VA_ARGS__);\
|
||||
}\
|
||||
}while(0)
|
||||
|
||||
#define clock() (jiffies)
|
||||
#define time(x) (jiffies)
|
||||
|
||||
/* rand() implementation. */
|
||||
#define RAND_MAX 32767
|
||||
|
||||
static inline int rand(void)
|
||||
{
|
||||
uint32_t temp;
|
||||
get_random_bytes(&temp, sizeof(temp));
|
||||
return temp % (RAND_MAX+1);
|
||||
}
|
||||
|
||||
/* stdio/stdlib implementation. */
|
||||
#define printf(...) printk(__VA_ARGS__)
|
||||
#define exit(n) panic("%s:%d: exit(%d)\n", __FILE__, __LINE__, (n))
|
||||
|
||||
#endif /* SRTP_KERNEL_LINUX */
|
||||
|
||||
#endif /* KERNEL_COMPAT_H */
|
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
* key.h
|
||||
*
|
||||
* key usage limits enforcement
|
||||
*
|
||||
* David A. Mcgrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef KEY_H
|
||||
#define KEY_H
|
||||
|
||||
#include "rdbx.h" /* for xtd_seq_num_t */
|
||||
#include "err.h"
|
||||
|
||||
typedef struct key_limit_ctx_t *key_limit_t;
|
||||
|
||||
typedef enum {
|
||||
key_event_normal,
|
||||
key_event_soft_limit,
|
||||
key_event_hard_limit
|
||||
} key_event_t;
|
||||
|
||||
err_status_t
|
||||
key_limit_set(key_limit_t key, const xtd_seq_num_t s);
|
||||
|
||||
err_status_t
|
||||
key_limit_clone(key_limit_t original, key_limit_t *new_key);
|
||||
|
||||
err_status_t
|
||||
key_limit_check(const key_limit_t key);
|
||||
|
||||
key_event_t
|
||||
key_limit_update(key_limit_t key);
|
||||
|
||||
typedef enum {
|
||||
key_state_normal,
|
||||
key_state_past_soft_limit,
|
||||
key_state_expired
|
||||
} key_state_t;
|
||||
|
||||
typedef struct key_limit_ctx_t {
|
||||
xtd_seq_num_t num_left;
|
||||
key_state_t state;
|
||||
} key_limit_ctx_t;
|
||||
|
||||
#endif /* KEY_H */
|
|
@ -0,0 +1,68 @@
|
|||
/*
|
||||
* null-auth.h
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef NULL_AUTH_H
|
||||
#define NULL_AUTH_H
|
||||
|
||||
#include "auth.h"
|
||||
|
||||
typedef struct {
|
||||
char foo;
|
||||
} null_auth_ctx_t;
|
||||
|
||||
err_status_t
|
||||
null_auth_alloc(auth_t **a, int key_len, int out_len);
|
||||
|
||||
err_status_t
|
||||
null_auth_dealloc(auth_t *a);
|
||||
|
||||
err_status_t
|
||||
null_auth_init(null_auth_ctx_t *state, const uint8_t *key, int key_len);
|
||||
|
||||
err_status_t
|
||||
null_auth_compute (null_auth_ctx_t *state, uint8_t *message,
|
||||
int msg_octets, int tag_len, uint8_t *result);
|
||||
|
||||
|
||||
#endif /* NULL_AUTH_H */
|
|
@ -0,0 +1,80 @@
|
|||
/*
|
||||
* null-cipher.h
|
||||
*
|
||||
* header file for the null cipher
|
||||
*
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef NULL_CIPHER_H
|
||||
#define NULL_CIPHER_H
|
||||
|
||||
#include "datatypes.h"
|
||||
#include "cipher.h"
|
||||
|
||||
typedef struct {
|
||||
char foo ;/* empty, for now */
|
||||
} null_cipher_ctx_t;
|
||||
|
||||
|
||||
/*
|
||||
* none of these functions do anything (though future versions may keep
|
||||
* track of bytes encrypted, number of instances, and/or other info).
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
null_cipher_init(null_cipher_ctx_t *c, const uint8_t *key, int key_len);
|
||||
|
||||
err_status_t
|
||||
null_cipher_set_segment(null_cipher_ctx_t *c,
|
||||
unsigned long segment_index);
|
||||
|
||||
err_status_t
|
||||
null_cipher_encrypt(null_cipher_ctx_t *c,
|
||||
unsigned char *buf, unsigned int *bytes_to_encr);
|
||||
|
||||
|
||||
err_status_t
|
||||
null_cipher_encrypt_aligned(null_cipher_ctx_t *c,
|
||||
unsigned char *buf, int bytes_to_encr);
|
||||
|
||||
#endif /* NULL_CIPHER_H */
|
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* prng.h
|
||||
*
|
||||
* pseudorandom source
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
#ifndef PRNG_H
|
||||
#define PRNG_H
|
||||
|
||||
#include "rand_source.h" /* for rand_source_func_t definition */
|
||||
#include "aes.h" /* for aes */
|
||||
#include "aes_icm.h" /* for aes ctr */
|
||||
|
||||
#define MAX_PRNG_OUT_LEN 0xffffffffU
|
||||
|
||||
/*
|
||||
* x917_prng is an ANSI X9.17-like AES-based PRNG
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
v128_t state; /* state data */
|
||||
aes_expanded_key_t key; /* secret key */
|
||||
uint32_t octet_count; /* number of octets output since last init */
|
||||
rand_source_func_t rand; /* random source for re-initialization */
|
||||
} x917_prng_t;
|
||||
|
||||
err_status_t
|
||||
x917_prng_init(rand_source_func_t random_source);
|
||||
|
||||
err_status_t
|
||||
x917_prng_get_octet_string(uint8_t *dest, uint32_t len);
|
||||
|
||||
|
||||
/*
|
||||
* ctr_prng is an AES-CTR based PRNG
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
uint32_t octet_count; /* number of octets output since last init */
|
||||
aes_icm_ctx_t state; /* state data */
|
||||
rand_source_func_t rand; /* random source for re-initialization */
|
||||
} ctr_prng_t;
|
||||
|
||||
err_status_t
|
||||
ctr_prng_init(rand_source_func_t random_source);
|
||||
|
||||
err_status_t
|
||||
ctr_prng_get_octet_string(void *dest, uint32_t len);
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1,91 @@
|
|||
/*
|
||||
* rand_source.h
|
||||
*
|
||||
* implements a random source based on /dev/random
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright(c) 2001-2006 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef RAND_SOURCE
|
||||
#define RAND_SOURCE
|
||||
|
||||
#include "err.h"
|
||||
#include "datatypes.h"
|
||||
|
||||
err_status_t
|
||||
rand_source_init(void);
|
||||
|
||||
/*
|
||||
* rand_source_get_octet_string() writes a random octet string.
|
||||
*
|
||||
* The function call rand_source_get_octet_string(dest, len) writes
|
||||
* len octets of random data to the location to which dest points,
|
||||
* and returns an error code. This error code should be checked,
|
||||
* and if a failure is reported, the data in the buffer MUST NOT
|
||||
* be used.
|
||||
*
|
||||
* warning: If the return code is not checked, then non-random
|
||||
* data may inadvertently be used.
|
||||
*
|
||||
* returns:
|
||||
* - err_status_ok if no problems occured.
|
||||
* - [other] a problem occured, and no assumptions should
|
||||
* be made about the contents of the destination
|
||||
* buffer.
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
rand_source_get_octet_string(void *dest, uint32_t length);
|
||||
|
||||
err_status_t
|
||||
rand_source_deinit(void);
|
||||
|
||||
/*
|
||||
* function prototype for a random source function
|
||||
*
|
||||
* A rand_source_func_t writes num_octets at the location indicated by
|
||||
* dest and returns err_status_ok. Any other return value indicates
|
||||
* failure.
|
||||
*/
|
||||
|
||||
typedef err_status_t (*rand_source_func_t)
|
||||
(void *dest, uint32_t num_octets);
|
||||
|
||||
#endif /* RAND_SOURCE */
|
|
@ -0,0 +1,94 @@
|
|||
/*
|
||||
* replay-database.h
|
||||
*
|
||||
* interface for a replay database for packet security
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef REPLAY_DB_H
|
||||
#define REPLAY_DB_H
|
||||
|
||||
#include "integers.h" /* for uint32_t */
|
||||
#include "datatypes.h" /* for v128_t */
|
||||
#include "err.h" /* for err_status_t */
|
||||
|
||||
/*
|
||||
* if the ith least significant bit is one, then the packet index
|
||||
* window_end-i is in the database
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
uint32_t window_start; /* packet index of the first bit in bitmask */
|
||||
v128_t bitmask;
|
||||
} rdb_t;
|
||||
|
||||
#define rdb_bits_in_bitmask (8*sizeof(v128_t))
|
||||
|
||||
/*
|
||||
* rdb init
|
||||
*
|
||||
* initalizes rdb
|
||||
*
|
||||
* returns err_status_ok on success, err_status_t_fail otherwise
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
rdb_init(rdb_t *rdb);
|
||||
|
||||
|
||||
/*
|
||||
* rdb_check
|
||||
*
|
||||
* checks to see if index appears in rdb
|
||||
*
|
||||
* returns err_status_fail if the index already appears in rdb,
|
||||
* returns err_status_ok otherwise
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
rdb_check(const rdb_t *rdb, uint32_t rdb_index);
|
||||
|
||||
/*
|
||||
* rdb_add_index
|
||||
*
|
||||
* adds index to rdb_t (and does *not* check if index appears in db)
|
||||
*
|
||||
* returns err_status_ok on success, err_status_fail otherwise
|
||||
*
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
rdb_add_index(rdb_t *rdb, uint32_t rdb_index);
|
||||
|
||||
/*
|
||||
* the functions rdb_increment() and rdb_get_value() are for use by
|
||||
* senders, not receivers - DO NOT use these functions on the same
|
||||
* rdb_t upon which rdb_add_index is used!
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* rdb_increment(db) increments the sequence number in db, if it is
|
||||
* not too high
|
||||
*
|
||||
* return values:
|
||||
*
|
||||
* err_status_ok no problem
|
||||
* err_status_key_expired sequence number too high
|
||||
*
|
||||
*/
|
||||
err_status_t
|
||||
rdb_increment(rdb_t *rdb);
|
||||
|
||||
/*
|
||||
* rdb_get_value(db) returns the current sequence number of db
|
||||
*/
|
||||
|
||||
uint32_t
|
||||
rdb_get_value(const rdb_t *rdb);
|
||||
|
||||
|
||||
#endif /* REPLAY_DB_H */
|
|
@ -0,0 +1,186 @@
|
|||
/*
|
||||
* rdbx.h
|
||||
*
|
||||
* replay database with extended packet indices, using a rollover counter
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef RDBX_H
|
||||
#define RDBX_H
|
||||
|
||||
#include "datatypes.h"
|
||||
#include "err.h"
|
||||
|
||||
/* #define ROC_TEST */
|
||||
|
||||
#ifndef ROC_TEST
|
||||
|
||||
typedef uint16_t sequence_number_t; /* 16 bit sequence number */
|
||||
typedef uint32_t rollover_counter_t; /* 32 bit rollover counter */
|
||||
|
||||
#else /* use small seq_num and roc datatypes for testing purposes */
|
||||
|
||||
typedef unsigned char sequence_number_t; /* 8 bit sequence number */
|
||||
typedef uint16_t rollover_counter_t; /* 16 bit rollover counter */
|
||||
|
||||
#endif
|
||||
|
||||
#define seq_num_median (1 << (8*sizeof(sequence_number_t) - 1))
|
||||
#define seq_num_max (1 << (8*sizeof(sequence_number_t)))
|
||||
|
||||
/*
|
||||
* An xtd_seq_num_t is a 64-bit unsigned integer used as an 'extended'
|
||||
* sequence number.
|
||||
*/
|
||||
|
||||
typedef uint64_t xtd_seq_num_t;
|
||||
|
||||
|
||||
/*
|
||||
* An rdbx_t is a replay database with extended range; it uses an
|
||||
* xtd_seq_num_t and a bitmask of recently received indices.
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
xtd_seq_num_t index;
|
||||
bitvector_t bitmask;
|
||||
} rdbx_t;
|
||||
|
||||
|
||||
/*
|
||||
* rdbx_init(rdbx_ptr, ws)
|
||||
*
|
||||
* initializes the rdbx pointed to by its argument with the window size ws,
|
||||
* setting the rollover counter and sequence number to zero
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
rdbx_init(rdbx_t *rdbx, unsigned long ws);
|
||||
|
||||
|
||||
/*
|
||||
* rdbx_dealloc(rdbx_ptr)
|
||||
*
|
||||
* frees memory associated with the rdbx
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
rdbx_dealloc(rdbx_t *rdbx);
|
||||
|
||||
|
||||
/*
|
||||
* rdbx_estimate_index(rdbx, guess, s)
|
||||
*
|
||||
* given an rdbx and a sequence number s (from a newly arrived packet),
|
||||
* sets the contents of *guess to contain the best guess of the packet
|
||||
* index to which s corresponds, and returns the difference between
|
||||
* *guess and the locally stored synch info
|
||||
*/
|
||||
|
||||
int
|
||||
rdbx_estimate_index(const rdbx_t *rdbx,
|
||||
xtd_seq_num_t *guess,
|
||||
sequence_number_t s);
|
||||
|
||||
/*
|
||||
* rdbx_check(rdbx, delta);
|
||||
*
|
||||
* rdbx_check(&r, delta) checks to see if the xtd_seq_num_t
|
||||
* which is at rdbx->window_start + delta is in the rdb
|
||||
*
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
rdbx_check(const rdbx_t *rdbx, int difference);
|
||||
|
||||
/*
|
||||
* replay_add_index(rdbx, delta)
|
||||
*
|
||||
* adds the xtd_seq_num_t at rdbx->window_start + delta to replay_db
|
||||
* (and does *not* check if that xtd_seq_num_t appears in db)
|
||||
*
|
||||
* this function should be called *only* after replay_check has
|
||||
* indicated that the index does not appear in the rdbx, and a mutex
|
||||
* should protect the rdbx between these calls if necessary.
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
rdbx_add_index(rdbx_t *rdbx, int delta);
|
||||
|
||||
|
||||
/*
|
||||
* rdbx_set_roc(rdbx, roc) initalizes the rdbx_t at the location rdbx
|
||||
* to have the rollover counter value roc. If that value is less than
|
||||
* the current rollover counter value, then the function returns
|
||||
* err_status_replay_old; otherwise, err_status_ok is returned.
|
||||
*
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
rdbx_set_roc(rdbx_t *rdbx, uint32_t roc);
|
||||
|
||||
/*
|
||||
* rdbx_get_roc(rdbx) returns the value of the rollover counter for
|
||||
* the rdbx_t pointed to by rdbx
|
||||
*
|
||||
*/
|
||||
|
||||
xtd_seq_num_t
|
||||
rdbx_get_packet_index(const rdbx_t *rdbx);
|
||||
|
||||
/*
|
||||
* xtd_seq_num_t functions - these are *internal* functions of rdbx, and
|
||||
* shouldn't be used to manipulate rdbx internal values. use the rdbx
|
||||
* api instead!
|
||||
*/
|
||||
|
||||
/*
|
||||
* rdbx_get_ws(rdbx_ptr)
|
||||
*
|
||||
* gets the window size which was used to initialize the rdbx
|
||||
*/
|
||||
|
||||
unsigned long
|
||||
rdbx_get_window_size(const rdbx_t *rdbx);
|
||||
|
||||
|
||||
/* index_init(&pi) initializes a packet index pi (sets it to zero) */
|
||||
|
||||
void
|
||||
index_init(xtd_seq_num_t *pi);
|
||||
|
||||
/* index_advance(&pi, s) advances a xtd_seq_num_t forward by s */
|
||||
|
||||
void
|
||||
index_advance(xtd_seq_num_t *pi, sequence_number_t s);
|
||||
|
||||
|
||||
/*
|
||||
* index_guess(local, guess, s)
|
||||
*
|
||||
* given a xtd_seq_num_t local (which represents the highest
|
||||
* known-to-be-good index) and a sequence number s (from a newly
|
||||
* arrived packet), sets the contents of *guess to contain the best
|
||||
* guess of the packet index to which s corresponds, and returns the
|
||||
* difference between *guess and *local
|
||||
*/
|
||||
|
||||
int
|
||||
index_guess(const xtd_seq_num_t *local,
|
||||
xtd_seq_num_t *guess,
|
||||
sequence_number_t s);
|
||||
|
||||
|
||||
#endif /* RDBX_H */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,139 @@
|
|||
/*
|
||||
* rtp.h
|
||||
*
|
||||
* rtp interface for srtp reference implementation
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*
|
||||
* data types:
|
||||
*
|
||||
* rtp_msg_t an rtp message (the data that goes on the wire)
|
||||
* rtp_sender_t sender side socket and rtp info
|
||||
* rtp_receiver_t receiver side socket and rtp info
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef RTP_H
|
||||
#define RTP_H
|
||||
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
# include <netinet/in.h>
|
||||
#elif defined HAVE_WINSOCK2_H
|
||||
# include <winsock2.h>
|
||||
#endif
|
||||
|
||||
#include "srtp.h"
|
||||
|
||||
typedef struct rtp_sender_ctx_t *rtp_sender_t;
|
||||
|
||||
typedef struct rtp_receiver_ctx_t *rtp_receiver_t;
|
||||
|
||||
int
|
||||
rtp_sendto(rtp_sender_t sender, const void* msg, int len);
|
||||
|
||||
int
|
||||
rtp_recvfrom(rtp_receiver_t receiver, void *msg, int *len);
|
||||
|
||||
int
|
||||
rtp_receiver_init(rtp_receiver_t rcvr, int sock,
|
||||
struct sockaddr_in addr, unsigned int ssrc);
|
||||
|
||||
int
|
||||
rtp_sender_init(rtp_sender_t sender, int sock,
|
||||
struct sockaddr_in addr, unsigned int ssrc);
|
||||
|
||||
/*
|
||||
* srtp_sender_init(...) initializes an rtp_sender_t
|
||||
*/
|
||||
|
||||
int
|
||||
srtp_sender_init(rtp_sender_t rtp_ctx, /* structure to be init'ed */
|
||||
struct sockaddr_in name, /* socket name */
|
||||
sec_serv_t security_services, /* sec. servs. to be used */
|
||||
unsigned char *input_key /* master key/salt in hex */
|
||||
);
|
||||
|
||||
int
|
||||
srtp_receiver_init(rtp_receiver_t rtp_ctx, /* structure to be init'ed */
|
||||
struct sockaddr_in name, /* socket name */
|
||||
sec_serv_t security_services, /* sec. servs. to be used */
|
||||
unsigned char *input_key /* master key/salt in hex */
|
||||
);
|
||||
|
||||
|
||||
int
|
||||
rtp_sender_init_srtp(rtp_sender_t sender, const srtp_policy_t *policy);
|
||||
|
||||
int
|
||||
rtp_sender_deinit_srtp(rtp_sender_t sender);
|
||||
|
||||
int
|
||||
rtp_receiver_init_srtp(rtp_receiver_t sender, const srtp_policy_t *policy);
|
||||
|
||||
int
|
||||
rtp_receiver_deinit_srtp(rtp_receiver_t sender);
|
||||
|
||||
|
||||
rtp_sender_t
|
||||
rtp_sender_alloc(void);
|
||||
|
||||
void
|
||||
rtp_sender_dealloc(rtp_sender_t rtp_ctx);
|
||||
|
||||
rtp_receiver_t
|
||||
rtp_receiver_alloc(void);
|
||||
|
||||
void
|
||||
rtp_receiver_dealloc(rtp_receiver_t rtp_ctx);
|
||||
|
||||
|
||||
/*
|
||||
* RTP_HEADER_LEN indicates the size of an RTP header
|
||||
*/
|
||||
#define RTP_HEADER_LEN 12
|
||||
|
||||
/*
|
||||
* RTP_MAX_BUF_LEN defines the largest RTP packet in the rtp.c implementation
|
||||
*/
|
||||
#define RTP_MAX_BUF_LEN 16384
|
||||
|
||||
|
||||
#endif /* RTP_H */
|
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
* rtp_priv.h
|
||||
*
|
||||
* private, internal header file for RTP
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef RTP_PRIV_H
|
||||
#define RTP_PRIV_H
|
||||
|
||||
#include "srtp_priv.h"
|
||||
#include "rtp.h"
|
||||
|
||||
typedef srtp_hdr_t rtp_hdr_t;
|
||||
|
||||
typedef struct {
|
||||
srtp_hdr_t header;
|
||||
char body[RTP_MAX_BUF_LEN];
|
||||
} rtp_msg_t;
|
||||
|
||||
typedef struct rtp_sender_ctx_t {
|
||||
rtp_msg_t message;
|
||||
int socket;
|
||||
srtp_ctx_t *srtp_ctx;
|
||||
struct sockaddr_in addr; /* reciever's address */
|
||||
} rtp_sender_ctx_t;
|
||||
|
||||
typedef struct rtp_receiver_ctx_t {
|
||||
rtp_msg_t message;
|
||||
int socket;
|
||||
srtp_ctx_t *srtp_ctx;
|
||||
struct sockaddr_in addr; /* receiver's address */
|
||||
} rtp_receiver_ctx_t;
|
||||
|
||||
|
||||
#endif /* RTP_PRIV_H */
|
|
@ -0,0 +1,108 @@
|
|||
/*
|
||||
* sha1.h
|
||||
*
|
||||
* interface to the Secure Hash Algorithm v.1 (SHA-1), specified in
|
||||
* FIPS 180-1
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SHA1_H
|
||||
#define SHA1_H
|
||||
|
||||
#include "err.h"
|
||||
#include "datatypes.h"
|
||||
|
||||
typedef struct {
|
||||
uint32_t H[5]; /* state vector */
|
||||
uint32_t M[16]; /* message buffer */
|
||||
int octets_in_buffer; /* octets of message in buffer */
|
||||
uint32_t num_bits_in_msg; /* total number of bits in message */
|
||||
} sha1_ctx_t;
|
||||
|
||||
/*
|
||||
* sha1(&ctx, msg, len, output) hashes the len octets starting at msg
|
||||
* into the SHA1 context, then writes the result to the 20 octets at
|
||||
* output
|
||||
*
|
||||
*/
|
||||
|
||||
void
|
||||
sha1(const uint8_t *message, int octets_in_msg, uint32_t output[5]);
|
||||
|
||||
/*
|
||||
* sha1_init(&ctx) initializes the SHA1 context ctx
|
||||
*
|
||||
* sha1_update(&ctx, msg, len) hashes the len octets starting at msg
|
||||
* into the SHA1 context
|
||||
*
|
||||
* sha1_final(&ctx, output) performs the final processing of the SHA1
|
||||
* context and writes the result to the 20 octets at output
|
||||
*
|
||||
*/
|
||||
|
||||
void
|
||||
sha1_init(sha1_ctx_t *ctx);
|
||||
|
||||
void
|
||||
sha1_update(sha1_ctx_t *ctx, const uint8_t *M, int octets_in_msg);
|
||||
|
||||
void
|
||||
sha1_final(sha1_ctx_t *ctx, uint32_t output[5]);
|
||||
|
||||
/*
|
||||
* The sha1_core function is INTERNAL to SHA-1, but it is declared
|
||||
* here because it is also used by the cipher SEAL 3.0 in its key
|
||||
* setup algorithm.
|
||||
*/
|
||||
|
||||
/*
|
||||
* sha1_core(M, H) computes the core sha1 compression function, where M is
|
||||
* the next part of the message and H is the intermediate state {H0,
|
||||
* H1, ...}
|
||||
*
|
||||
* this function does not do any of the padding required in the
|
||||
* complete sha1 function
|
||||
*/
|
||||
|
||||
void
|
||||
sha1_core(const uint32_t M[16], uint32_t hash_value[5]);
|
||||
|
||||
#endif /* SHA1_H */
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,256 @@
|
|||
/*
|
||||
* srtp_priv.h
|
||||
*
|
||||
* private internal data structures and functions for libSRTP
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SRTP_PRIV_H
|
||||
#define SRTP_PRIV_H
|
||||
|
||||
#include "srtp.h"
|
||||
#include "rdbx.h"
|
||||
#include "rdb.h"
|
||||
#include "integers.h"
|
||||
|
||||
/*
|
||||
* an srtp_hdr_t represents the srtp header
|
||||
*
|
||||
* in this implementation, an srtp_hdr_t is assumed to be 32-bit aligned
|
||||
*
|
||||
* (note that this definition follows that of RFC 1889 Appendix A, but
|
||||
* is not identical)
|
||||
*/
|
||||
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
|
||||
/*
|
||||
* srtp_hdr_t represents an RTP or SRTP header. The bit-fields in
|
||||
* this structure should be declared "unsigned int" instead of
|
||||
* "unsigned char", but doing so causes the MS compiler to not
|
||||
* fully pack the bit fields.
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
unsigned char cc:4; /* CSRC count */
|
||||
unsigned char x:1; /* header extension flag */
|
||||
unsigned char p:1; /* padding flag */
|
||||
unsigned char version:2; /* protocol version */
|
||||
unsigned char pt:7; /* payload type */
|
||||
unsigned char m:1; /* marker bit */
|
||||
uint16_t seq; /* sequence number */
|
||||
uint32_t ts; /* timestamp */
|
||||
uint32_t ssrc; /* synchronization source */
|
||||
} srtp_hdr_t;
|
||||
|
||||
#else /* BIG_ENDIAN */
|
||||
|
||||
typedef struct {
|
||||
unsigned char version:2; /* protocol version */
|
||||
unsigned char p:1; /* padding flag */
|
||||
unsigned char x:1; /* header extension flag */
|
||||
unsigned char cc:4; /* CSRC count */
|
||||
unsigned char m:1; /* marker bit */
|
||||
unsigned pt:7; /* payload type */
|
||||
uint16_t seq; /* sequence number */
|
||||
uint32_t ts; /* timestamp */
|
||||
uint32_t ssrc; /* synchronization source */
|
||||
} srtp_hdr_t;
|
||||
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
uint16_t profile_specific; /* profile-specific info */
|
||||
uint16_t length; /* number of 32-bit words in extension */
|
||||
} srtp_hdr_xtnd_t;
|
||||
|
||||
|
||||
/*
|
||||
* srtcp_hdr_t represents a secure rtcp header
|
||||
*
|
||||
* in this implementation, an srtcp header is assumed to be 32-bit
|
||||
* alinged
|
||||
*/
|
||||
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
|
||||
typedef struct {
|
||||
unsigned char rc:5; /* reception report count */
|
||||
unsigned char p:1; /* padding flag */
|
||||
unsigned char version:2; /* protocol version */
|
||||
unsigned char pt:8; /* payload type */
|
||||
uint16_t len; /* length */
|
||||
uint32_t ssrc; /* synchronization source */
|
||||
} srtcp_hdr_t;
|
||||
|
||||
typedef struct {
|
||||
unsigned int index:31; /* srtcp packet index in network order! */
|
||||
unsigned int e:1; /* encrypted? 1=yes */
|
||||
/* optional mikey/etc go here */
|
||||
/* and then the variable-length auth tag */
|
||||
} srtcp_trailer_t;
|
||||
|
||||
|
||||
#else /* BIG_ENDIAN */
|
||||
|
||||
typedef struct {
|
||||
unsigned char version:2; /* protocol version */
|
||||
unsigned char p:1; /* padding flag */
|
||||
unsigned char rc:5; /* reception report count */
|
||||
unsigned char pt:8; /* payload type */
|
||||
uint16_t len; /* length */
|
||||
uint32_t ssrc; /* synchronization source */
|
||||
} srtcp_hdr_t;
|
||||
|
||||
typedef struct {
|
||||
unsigned int version:2; /* protocol version */
|
||||
unsigned int p:1; /* padding flag */
|
||||
unsigned int count:5; /* varies by packet type */
|
||||
unsigned int pt:8; /* payload type */
|
||||
uint16_t length; /* len of uint32s of packet less header */
|
||||
} rtcp_common_t;
|
||||
|
||||
typedef struct {
|
||||
unsigned int e:1; /* encrypted? 1=yes */
|
||||
unsigned int index:31; /* srtcp packet index */
|
||||
/* optional mikey/etc go here */
|
||||
/* and then the variable-length auth tag */
|
||||
} srtcp_trailer_t;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* the following declarations are libSRTP internal functions
|
||||
*/
|
||||
|
||||
/*
|
||||
* srtp_get_stream(ssrc) returns a pointer to the stream corresponding
|
||||
* to ssrc, or NULL if no stream exists for that ssrc
|
||||
*/
|
||||
|
||||
srtp_stream_t
|
||||
srtp_get_stream(srtp_t srtp, uint32_t ssrc);
|
||||
|
||||
|
||||
/*
|
||||
* srtp_stream_init_keys(s, k) (re)initializes the srtp_stream_t s by
|
||||
* deriving all of the needed keys using the KDF and the key k.
|
||||
*/
|
||||
|
||||
|
||||
err_status_t
|
||||
srtp_stream_init_keys(srtp_stream_t srtp, const void *key);
|
||||
|
||||
/*
|
||||
* srtp_stream_init(s, p) initializes the srtp_stream_t s to
|
||||
* use the policy at the location p
|
||||
*/
|
||||
err_status_t
|
||||
srtp_stream_init(srtp_stream_t srtp,
|
||||
const srtp_policy_t *p);
|
||||
|
||||
|
||||
/*
|
||||
* libsrtp internal datatypes
|
||||
*/
|
||||
|
||||
typedef enum direction_t {
|
||||
dir_unknown = 0,
|
||||
dir_srtp_sender = 1,
|
||||
dir_srtp_receiver = 2
|
||||
} direction_t;
|
||||
|
||||
/*
|
||||
* an srtp_stream_t has its own SSRC, encryption key, authentication
|
||||
* key, sequence number, and replay database
|
||||
*
|
||||
* note that the keys might not actually be unique, in which case the
|
||||
* cipher_t and auth_t pointers will point to the same structures
|
||||
*/
|
||||
|
||||
typedef struct srtp_stream_ctx_t {
|
||||
uint32_t ssrc;
|
||||
cipher_t *rtp_cipher;
|
||||
auth_t *rtp_auth;
|
||||
rdbx_t rtp_rdbx;
|
||||
sec_serv_t rtp_services;
|
||||
cipher_t *rtcp_cipher;
|
||||
auth_t *rtcp_auth;
|
||||
rdb_t rtcp_rdb;
|
||||
sec_serv_t rtcp_services;
|
||||
key_limit_ctx_t *limit;
|
||||
direction_t direction;
|
||||
int allow_repeat_tx;
|
||||
ekt_stream_t ekt;
|
||||
struct srtp_stream_ctx_t *next; /* linked list of streams */
|
||||
} srtp_stream_ctx_t;
|
||||
|
||||
|
||||
/*
|
||||
* an srtp_ctx_t holds a stream list and a service description
|
||||
*/
|
||||
|
||||
typedef struct srtp_ctx_t {
|
||||
srtp_stream_ctx_t *stream_list; /* linked list of streams */
|
||||
srtp_stream_ctx_t *stream_template; /* act as template for other streams */
|
||||
} srtp_ctx_t;
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* srtp_handle_event(srtp, srtm, evnt) calls the event handling
|
||||
* function, if there is one.
|
||||
*
|
||||
* This macro is not included in the documentation as it is
|
||||
* an internal-only function.
|
||||
*/
|
||||
|
||||
#define srtp_handle_event(srtp, strm, evnt) \
|
||||
if(srtp_event_handler) { \
|
||||
srtp_event_data_t data; \
|
||||
data.session = srtp; \
|
||||
data.stream = strm; \
|
||||
data.event = evnt; \
|
||||
srtp_event_handler(&data); \
|
||||
}
|
||||
|
||||
|
||||
#endif /* SRTP_PRIV_H */
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* stats.h
|
||||
*
|
||||
* interface to statistical test functions
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright(c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef STAT_H
|
||||
#define STAT_H
|
||||
|
||||
#include "datatypes.h" /* for uint8_t */
|
||||
#include "err.h" /* for err_status_t */
|
||||
#include "rand_source.h" /* for rand_source_func_t definition */
|
||||
|
||||
err_status_t
|
||||
stat_test_monobit(uint8_t *data);
|
||||
|
||||
err_status_t
|
||||
stat_test_poker(uint8_t *data);
|
||||
|
||||
err_status_t
|
||||
stat_test_runs(uint8_t *data);
|
||||
|
||||
err_status_t
|
||||
stat_test_rand_source(rand_source_func_t rs);
|
||||
|
||||
err_status_t
|
||||
stat_test_rand_source_with_repetition(rand_source_func_t source, unsigned num_trials);
|
||||
|
||||
#endif /* STAT_H */
|
|
@ -0,0 +1,80 @@
|
|||
/*
|
||||
* ut-sim.h
|
||||
*
|
||||
* an unreliable transport simulator
|
||||
* (for testing replay databases and suchlike)
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef UT_SIM_H
|
||||
#define UT_SIM_H
|
||||
|
||||
#include "integers.h" /* for uint32_t */
|
||||
|
||||
#define UT_BUF 160 /* maximum amount of packet reorder */
|
||||
|
||||
typedef struct {
|
||||
uint32_t index;
|
||||
uint32_t buffer[UT_BUF];
|
||||
} ut_connection;
|
||||
|
||||
/*
|
||||
* ut_init(&u) initializes the ut_connection
|
||||
*
|
||||
* this function should always be the first one called on a new
|
||||
* ut_connection
|
||||
*/
|
||||
|
||||
void
|
||||
ut_init(ut_connection *utc);
|
||||
|
||||
/*
|
||||
* ut_next_index(&u) returns the next index from the simulated
|
||||
* unreliable connection
|
||||
*/
|
||||
|
||||
uint32_t
|
||||
ut_next_index(ut_connection *utc);
|
||||
|
||||
|
||||
#endif /* UT_SIM_H */
|
|
@ -0,0 +1,139 @@
|
|||
/*
|
||||
* xfm.h
|
||||
*
|
||||
* interface for abstract crypto transform
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
#ifndef XFM_H
|
||||
#define XFM_H
|
||||
|
||||
#include "crypto_kernel.h"
|
||||
#include "err.h"
|
||||
|
||||
/**
|
||||
* @defgroup Crypto Cryptography
|
||||
*
|
||||
* A simple interface to an abstract cryptographic transform that
|
||||
* provides both confidentiality and message authentication.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief applies a crypto transform
|
||||
*
|
||||
* The function pointer xfm_func_t points to a function that
|
||||
* implements a crypto transform, and provides a uniform API for
|
||||
* accessing crypto mechanisms.
|
||||
*
|
||||
* @param key location of secret key
|
||||
*
|
||||
* @param clear data to be authenticated only
|
||||
*
|
||||
* @param clear_len length of data to be authenticated only
|
||||
*
|
||||
* @param iv location to write the Initialization Vector (IV)
|
||||
*
|
||||
* @param protect location of the data to be encrypted and
|
||||
* authenticated (before the function call), and the ciphertext
|
||||
* and authentication tag (after the call)
|
||||
*
|
||||
* @param protected_len location of the length of the data to be
|
||||
* encrypted and authenticated (before the function call), and the
|
||||
* length of the ciphertext (after the call)
|
||||
*
|
||||
* @param auth_tag location to write auth tag
|
||||
*/
|
||||
|
||||
typedef err_status_t (*xfm_func_t)
|
||||
(void *key,
|
||||
void *clear,
|
||||
unsigned clear_len,
|
||||
void *iv,
|
||||
void *protect,
|
||||
unsigned *protected_len,
|
||||
void *auth_tag
|
||||
);
|
||||
|
||||
typedef
|
||||
err_status_t (*xfm_inv_t)
|
||||
(void *key, /* location of secret key */
|
||||
void *clear, /* data to be authenticated only */
|
||||
unsigned clear_len, /* length of data to be authenticated only */
|
||||
void *iv, /* location of iv */
|
||||
void *opaque, /* data to be decrypted and authenticated */
|
||||
unsigned *opaque_len, /* location of the length of data to be
|
||||
* decrypted and authd (before and after)
|
||||
*/
|
||||
void *auth_tag /* location of auth tag */
|
||||
);
|
||||
|
||||
typedef struct xfm_ctx_t {
|
||||
xfm_func_t func;
|
||||
xfm_inv_t inv;
|
||||
unsigned key_len;
|
||||
unsigned iv_len;
|
||||
unsigned auth_tag_len;
|
||||
} xfm_ctx_t;
|
||||
|
||||
typedef xfm_ctx_t *xfm_t;
|
||||
|
||||
#define xfm_get_key_len(xfm) ((xfm)->key_len)
|
||||
|
||||
#define xfm_get_iv_len(xfm) ((xfm)->iv_len)
|
||||
|
||||
#define xfm_get_auth_tag_len(xfm) ((xfm)->auth_tag_len)
|
||||
|
||||
|
||||
/* cryptoalgo - 5/28 */
|
||||
|
||||
typedef err_status_t (*cryptoalg_func_t)
|
||||
(void *key,
|
||||
void *clear,
|
||||
unsigned clear_len,
|
||||
void *iv,
|
||||
void *opaque,
|
||||
unsigned *opaque_len
|
||||
);
|
||||
|
||||
typedef
|
||||
err_status_t (*cryptoalg_inv_t)
|
||||
(void *key, /* location of secret key */
|
||||
void *clear, /* data to be authenticated only */
|
||||
unsigned clear_len, /* length of data to be authenticated only */
|
||||
void *iv, /* location of iv */
|
||||
void *opaque, /* data to be decrypted and authenticated */
|
||||
unsigned *opaque_len /* location of the length of data to be
|
||||
* decrypted and authd (before and after)
|
||||
*/
|
||||
);
|
||||
|
||||
typedef struct cryptoalg_ctx_t {
|
||||
cryptoalg_func_t enc;
|
||||
cryptoalg_inv_t dec;
|
||||
unsigned key_len;
|
||||
unsigned iv_len;
|
||||
unsigned auth_tag_len;
|
||||
unsigned max_expansion;
|
||||
} cryptoalg_ctx_t;
|
||||
|
||||
typedef cryptoalg_ctx_t *cryptoalg_t;
|
||||
|
||||
#define cryptoalg_get_key_len(cryptoalg) ((cryptoalg)->key_len)
|
||||
|
||||
#define cryptoalg_get_iv_len(cryptoalg) ((cryptoalg)->iv_len)
|
||||
|
||||
#define cryptoalg_get_auth_tag_len(cryptoalg) ((cryptoalg)->auth_tag_len)
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif /* XFM_H */
|
||||
|
||||
|
Binary file not shown.
|
@ -0,0 +1,90 @@
|
|||
/*
|
||||
* aes.h
|
||||
*
|
||||
* header file for the AES block cipher
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _AES_H
|
||||
#define _AES_H
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "datatypes.h"
|
||||
#include "gf2_8.h"
|
||||
#include "err.h"
|
||||
|
||||
/* aes internals */
|
||||
|
||||
typedef struct {
|
||||
v128_t round[15];
|
||||
int num_rounds;
|
||||
} aes_expanded_key_t;
|
||||
|
||||
err_status_t
|
||||
aes_expand_encryption_key(const uint8_t *key,
|
||||
int key_len,
|
||||
aes_expanded_key_t *expanded_key);
|
||||
|
||||
err_status_t
|
||||
aes_expand_decryption_key(const uint8_t *key,
|
||||
int key_len,
|
||||
aes_expanded_key_t *expanded_key);
|
||||
|
||||
void
|
||||
aes_encrypt(v128_t *plaintext, const aes_expanded_key_t *exp_key);
|
||||
|
||||
void
|
||||
aes_decrypt(v128_t *plaintext, const aes_expanded_key_t *exp_key);
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* internal functions
|
||||
*/
|
||||
|
||||
void
|
||||
aes_init_sbox(void);
|
||||
|
||||
void
|
||||
aes_compute_tables(void);
|
||||
#endif
|
||||
|
||||
#endif /* _AES_H */
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* aes_cbc.h
|
||||
*
|
||||
* Header for AES Cipher Blobk Chaining Mode.
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef AES_CBC_H
|
||||
#define AES_CBC_H
|
||||
|
||||
#include "aes.h"
|
||||
#include "cipher.h"
|
||||
|
||||
typedef struct {
|
||||
v128_t state; /* cipher chaining state */
|
||||
v128_t previous; /* previous ciphertext block */
|
||||
aes_expanded_key_t expanded_key; /* the cipher key */
|
||||
} aes_cbc_ctx_t;
|
||||
|
||||
err_status_t
|
||||
aes_cbc_set_key(aes_cbc_ctx_t *c,
|
||||
const unsigned char *key);
|
||||
|
||||
err_status_t
|
||||
aes_cbc_encrypt(aes_cbc_ctx_t *c,
|
||||
unsigned char *buf,
|
||||
unsigned int *bytes_in_data);
|
||||
|
||||
err_status_t
|
||||
aes_cbc_context_init(aes_cbc_ctx_t *c, const uint8_t *key,
|
||||
int key_len, cipher_direction_t dir);
|
||||
|
||||
err_status_t
|
||||
aes_cbc_set_iv(aes_cbc_ctx_t *c, void *iv);
|
||||
|
||||
err_status_t
|
||||
aes_cbc_nist_encrypt(aes_cbc_ctx_t *c,
|
||||
unsigned char *data,
|
||||
unsigned int *bytes_in_data);
|
||||
|
||||
err_status_t
|
||||
aes_cbc_nist_decrypt(aes_cbc_ctx_t *c,
|
||||
unsigned char *data,
|
||||
unsigned int *bytes_in_data);
|
||||
|
||||
#endif /* AES_CBC_H */
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* aes_icm.h
|
||||
*
|
||||
* Header for AES Integer Counter Mode.
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef AES_ICM_H
|
||||
#define AES_ICM_H
|
||||
|
||||
#include "aes.h"
|
||||
#include "cipher.h"
|
||||
|
||||
typedef struct {
|
||||
v128_t counter; /* holds the counter value */
|
||||
v128_t offset; /* initial offset value */
|
||||
v128_t keystream_buffer; /* buffers bytes of keystream */
|
||||
aes_expanded_key_t expanded_key; /* the cipher key */
|
||||
int bytes_in_buffer; /* number of unused bytes in buffer */
|
||||
} aes_icm_ctx_t;
|
||||
|
||||
|
||||
err_status_t
|
||||
aes_icm_context_init(aes_icm_ctx_t *c,
|
||||
const unsigned char *key,
|
||||
int key_len);
|
||||
|
||||
err_status_t
|
||||
aes_icm_set_iv(aes_icm_ctx_t *c, void *iv);
|
||||
|
||||
err_status_t
|
||||
aes_icm_encrypt(aes_icm_ctx_t *c,
|
||||
unsigned char *buf, unsigned int *bytes_to_encr);
|
||||
|
||||
err_status_t
|
||||
aes_icm_output(aes_icm_ctx_t *c,
|
||||
unsigned char *buf, int bytes_to_output);
|
||||
|
||||
err_status_t
|
||||
aes_icm_dealloc(cipher_t *c);
|
||||
|
||||
err_status_t
|
||||
aes_icm_encrypt_ismacryp(aes_icm_ctx_t *c,
|
||||
unsigned char *buf,
|
||||
unsigned int *enc_len,
|
||||
int forIsmacryp);
|
||||
|
||||
err_status_t
|
||||
aes_icm_alloc_ismacryp(cipher_t **c,
|
||||
int key_len,
|
||||
int forIsmacryp);
|
||||
|
||||
#endif /* AES_ICM_H */
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* alloc.h
|
||||
*
|
||||
* interface to memory allocation and deallocation, with optional debugging
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef CRYPTO_ALLOC_H
|
||||
#define CRYPTO_ALLOC_H
|
||||
|
||||
#include "datatypes.h"
|
||||
|
||||
void *
|
||||
crypto_alloc(size_t size);
|
||||
|
||||
void
|
||||
crypto_free(void *ptr);
|
||||
|
||||
#endif /* CRYPTO_ALLOC_H */
|
|
@ -0,0 +1,171 @@
|
|||
/*
|
||||
* auth.h
|
||||
*
|
||||
* common interface to authentication functions
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef AUTH_H
|
||||
#define AUTH_H
|
||||
|
||||
#include "datatypes.h"
|
||||
#include "err.h" /* error codes */
|
||||
#include "crypto.h" /* for auth_type_id_t */
|
||||
#include "crypto_types.h" /* for values of auth_type_id_t */
|
||||
|
||||
typedef struct auth_type_t *auth_type_pointer;
|
||||
typedef struct auth_t *auth_pointer_t;
|
||||
|
||||
typedef err_status_t (*auth_alloc_func)
|
||||
(auth_pointer_t *ap, int key_len, int out_len);
|
||||
|
||||
typedef err_status_t (*auth_init_func)
|
||||
(void *state, const uint8_t *key, int key_len);
|
||||
|
||||
typedef err_status_t (*auth_dealloc_func)(auth_pointer_t ap);
|
||||
|
||||
typedef err_status_t (*auth_compute_func)
|
||||
(void *state, uint8_t *buffer, int octets_to_auth,
|
||||
int tag_len, uint8_t *tag);
|
||||
|
||||
typedef err_status_t (*auth_update_func)
|
||||
(void *state, uint8_t *buffer, int octets_to_auth);
|
||||
|
||||
typedef err_status_t (*auth_start_func)(void *state);
|
||||
|
||||
/* some syntactic sugar on these function types */
|
||||
|
||||
#define auth_type_alloc(at, a, klen, outlen) \
|
||||
((at)->alloc((a), (klen), (outlen)))
|
||||
|
||||
#define auth_init(a, key) \
|
||||
(((a)->type)->init((a)->state, (key), ((a)->key_len)))
|
||||
|
||||
#define auth_compute(a, buf, len, res) \
|
||||
(((a)->type)->compute((a)->state, (buf), (len), (a)->out_len, (res)))
|
||||
|
||||
#define auth_update(a, buf, len) \
|
||||
(((a)->type)->update((a)->state, (buf), (len)))
|
||||
|
||||
#define auth_start(a)(((a)->type)->start((a)->state))
|
||||
|
||||
#define auth_dealloc(c) (((c)->type)->dealloc(c))
|
||||
|
||||
/* functions to get information about a particular auth_t */
|
||||
|
||||
int
|
||||
auth_get_key_length(const struct auth_t *a);
|
||||
|
||||
int
|
||||
auth_get_tag_length(const struct auth_t *a);
|
||||
|
||||
int
|
||||
auth_get_prefix_length(const struct auth_t *a);
|
||||
|
||||
/*
|
||||
* auth_test_case_t is a (list of) key/message/tag values that are
|
||||
* known to be correct for a particular cipher. this data can be used
|
||||
* to test an implementation in an on-the-fly self test of the
|
||||
* correcness of the implementation. (see the auth_type_self_test()
|
||||
* function below)
|
||||
*/
|
||||
|
||||
typedef struct auth_test_case_t {
|
||||
int key_length_octets; /* octets in key */
|
||||
uint8_t *key; /* key */
|
||||
int data_length_octets; /* octets in data */
|
||||
uint8_t *data; /* data */
|
||||
int tag_length_octets; /* octets in tag */
|
||||
uint8_t *tag; /* tag */
|
||||
struct auth_test_case_t *next_test_case; /* pointer to next testcase */
|
||||
} auth_test_case_t;
|
||||
|
||||
/* auth_type_t */
|
||||
|
||||
typedef struct auth_type_t {
|
||||
auth_alloc_func alloc;
|
||||
auth_dealloc_func dealloc;
|
||||
auth_init_func init;
|
||||
auth_compute_func compute;
|
||||
auth_update_func update;
|
||||
auth_start_func start;
|
||||
char *description;
|
||||
int ref_count;
|
||||
auth_test_case_t *test_data;
|
||||
debug_module_t *debug;
|
||||
auth_type_id_t id;
|
||||
} auth_type_t;
|
||||
|
||||
typedef struct auth_t {
|
||||
auth_type_t *type;
|
||||
void *state;
|
||||
int out_len; /* length of output tag in octets */
|
||||
int key_len; /* length of key in octets */
|
||||
int prefix_len; /* length of keystream prefix */
|
||||
} auth_t;
|
||||
|
||||
/*
|
||||
* auth_type_self_test() tests an auth_type against test cases
|
||||
* provided in an array of values of key/message/tag that is known to
|
||||
* be good
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
auth_type_self_test(const auth_type_t *at);
|
||||
|
||||
/*
|
||||
* auth_type_test() tests an auth_type against external test cases
|
||||
* provided in an array of values of key/message/tag that is known to
|
||||
* be good
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
auth_type_test(const auth_type_t *at, const auth_test_case_t *test_data);
|
||||
|
||||
/*
|
||||
* auth_type_get_ref_count(at) returns the reference count (the number
|
||||
* of instantiations) of the auth_type_t at
|
||||
*/
|
||||
|
||||
int
|
||||
auth_type_get_ref_count(const auth_type_t *at);
|
||||
|
||||
#endif /* AUTH_H */
|
|
@ -0,0 +1,230 @@
|
|||
/*
|
||||
* cipher.h
|
||||
*
|
||||
* common interface to ciphers
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef CIPHER_H
|
||||
#define CIPHER_H
|
||||
|
||||
#include "datatypes.h"
|
||||
#include "rdbx.h" /* for xtd_seq_num_t */
|
||||
#include "err.h" /* for error codes */
|
||||
#include "crypto.h" /* for cipher_type_id_t */
|
||||
#include "crypto_types.h" /* for values of cipher_type_id_t */
|
||||
|
||||
|
||||
/**
|
||||
* @brief cipher_direction_t defines a particular cipher operation.
|
||||
*
|
||||
* A cipher_direction_t is an enum that describes a particular cipher
|
||||
* operation, i.e. encryption or decryption. For some ciphers, this
|
||||
* distinction does not matter, but for others, it is essential.
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
direction_encrypt, /**< encryption (convert plaintext to ciphertext) */
|
||||
direction_decrypt, /**< decryption (convert ciphertext to plaintext) */
|
||||
direction_any /**< encryption or decryption */
|
||||
} cipher_direction_t;
|
||||
|
||||
/*
|
||||
* the cipher_pointer and cipher_type_pointer definitions are needed
|
||||
* as cipher_t and cipher_type_t are not yet defined
|
||||
*/
|
||||
|
||||
typedef struct cipher_type_t *cipher_type_pointer_t;
|
||||
typedef struct cipher_t *cipher_pointer_t;
|
||||
|
||||
/*
|
||||
* a cipher_alloc_func_t allocates (but does not initialize) a cipher_t
|
||||
*/
|
||||
|
||||
typedef err_status_t (*cipher_alloc_func_t)
|
||||
(cipher_pointer_t *cp, int key_len);
|
||||
|
||||
/*
|
||||
* a cipher_init_func_t [re-]initializes a cipher_t with a given key
|
||||
* and direction (i.e., encrypt or decrypt)
|
||||
*/
|
||||
|
||||
typedef err_status_t (*cipher_init_func_t)
|
||||
(void *state, const uint8_t *key, int key_len, cipher_direction_t dir);
|
||||
|
||||
/* a cipher_dealloc_func_t de-allocates a cipher_t */
|
||||
|
||||
typedef err_status_t (*cipher_dealloc_func_t)(cipher_pointer_t cp);
|
||||
|
||||
/* a cipher_set_segment_func_t sets the segment index of a cipher_t */
|
||||
|
||||
typedef err_status_t (*cipher_set_segment_func_t)
|
||||
(void *state, xtd_seq_num_t idx);
|
||||
|
||||
/* a cipher_encrypt_func_t encrypts data in-place */
|
||||
|
||||
typedef err_status_t (*cipher_encrypt_func_t)
|
||||
(void *state, uint8_t *buffer, unsigned int *octets_to_encrypt);
|
||||
|
||||
/* a cipher_decrypt_func_t decrypts data in-place */
|
||||
|
||||
typedef err_status_t (*cipher_decrypt_func_t)
|
||||
(void *state, uint8_t *buffer, unsigned int *octets_to_decrypt);
|
||||
|
||||
/*
|
||||
* a cipher_set_iv_func_t function sets the current initialization vector
|
||||
*/
|
||||
|
||||
typedef err_status_t (*cipher_set_iv_func_t)
|
||||
(cipher_pointer_t cp, void *iv);
|
||||
|
||||
/*
|
||||
* cipher_test_case_t is a (list of) key, salt, xtd_seq_num_t,
|
||||
* plaintext, and ciphertext values that are known to be correct for a
|
||||
* particular cipher. this data can be used to test an implementation
|
||||
* in an on-the-fly self test of the correcness of the implementation.
|
||||
* (see the cipher_type_self_test() function below)
|
||||
*/
|
||||
|
||||
typedef struct cipher_test_case_t {
|
||||
int key_length_octets; /* octets in key */
|
||||
uint8_t *key; /* key */
|
||||
uint8_t *idx; /* packet index */
|
||||
int plaintext_length_octets; /* octets in plaintext */
|
||||
uint8_t *plaintext; /* plaintext */
|
||||
int ciphertext_length_octets; /* octets in plaintext */
|
||||
uint8_t *ciphertext; /* ciphertext */
|
||||
struct cipher_test_case_t *next_test_case; /* pointer to next testcase */
|
||||
} cipher_test_case_t;
|
||||
|
||||
/* cipher_type_t defines the 'metadata' for a particular cipher type */
|
||||
|
||||
typedef struct cipher_type_t {
|
||||
cipher_alloc_func_t alloc;
|
||||
cipher_dealloc_func_t dealloc;
|
||||
cipher_init_func_t init;
|
||||
cipher_encrypt_func_t encrypt;
|
||||
cipher_encrypt_func_t decrypt;
|
||||
cipher_set_iv_func_t set_iv;
|
||||
char *description;
|
||||
int ref_count;
|
||||
cipher_test_case_t *test_data;
|
||||
debug_module_t *debug;
|
||||
cipher_type_id_t id;
|
||||
} cipher_type_t;
|
||||
|
||||
/*
|
||||
* cipher_t defines an instantiation of a particular cipher, with fixed
|
||||
* key length, key and salt values
|
||||
*/
|
||||
|
||||
typedef struct cipher_t {
|
||||
cipher_type_t *type;
|
||||
void *state;
|
||||
int key_len;
|
||||
#ifdef FORCE_64BIT_ALIGN
|
||||
int pad;
|
||||
#endif
|
||||
} cipher_t;
|
||||
|
||||
/* some syntactic sugar on these function types */
|
||||
|
||||
#define cipher_type_alloc(ct, c, klen) ((ct)->alloc((c), (klen)))
|
||||
|
||||
#define cipher_dealloc(c) (((c)->type)->dealloc(c))
|
||||
|
||||
#define cipher_init(c, k, dir) (((c)->type)->init(((c)->state), (k), ((c)->key_len), (dir)))
|
||||
|
||||
#define cipher_encrypt(c, buf, len) \
|
||||
(((c)->type)->encrypt(((c)->state), (buf), (len)))
|
||||
|
||||
#define cipher_decrypt(c, buf, len) \
|
||||
(((c)->type)->decrypt(((c)->state), (buf), (len)))
|
||||
|
||||
#define cipher_set_iv(c, n) \
|
||||
((c) ? (((c)->type)->set_iv(((cipher_pointer_t)(c)->state), (n))) : \
|
||||
err_status_no_such_op)
|
||||
|
||||
err_status_t
|
||||
cipher_output(cipher_t *c, uint8_t *buffer, int num_octets_to_output);
|
||||
|
||||
|
||||
/* some bookkeeping functions */
|
||||
|
||||
int
|
||||
cipher_get_key_length(const cipher_t *c);
|
||||
|
||||
|
||||
/*
|
||||
* cipher_type_self_test() tests a cipher against test cases provided in
|
||||
* an array of values of key/xtd_seq_num_t/plaintext/ciphertext
|
||||
* that is known to be good
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
cipher_type_self_test(const cipher_type_t *ct);
|
||||
|
||||
|
||||
/*
|
||||
* cipher_type_test() tests a cipher against external test cases provided in
|
||||
* an array of values of key/xtd_seq_num_t/plaintext/ciphertext
|
||||
* that is known to be good
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
cipher_type_test(const cipher_type_t *ct, const cipher_test_case_t *test_data);
|
||||
|
||||
|
||||
/*
|
||||
* cipher_bits_per_second(c, l, t) computes (and estimate of) the
|
||||
* number of bits that a cipher implementation can encrypt in a second
|
||||
*
|
||||
* c is a cipher (which MUST be allocated and initialized already), l
|
||||
* is the length in octets of the test data to be encrypted, and t is
|
||||
* the number of trials
|
||||
*
|
||||
* if an error is encountered, then the value 0 is returned
|
||||
*/
|
||||
|
||||
uint64_t
|
||||
cipher_bits_per_second(cipher_t *c, int octets_in_buffer, int num_trials);
|
||||
|
||||
#endif /* CIPHER_H */
|
|
@ -0,0 +1,174 @@
|
|||
/* crypto/include/config.h. Generated by configure. */
|
||||
/* config_in.h. Generated from configure.in by autoheader. */
|
||||
|
||||
/* Define if building for a CISC machine (e.g. Intel). */
|
||||
#define CPU_CISC 1
|
||||
|
||||
/* Define if building for a RISC machine (assume slow byte access). */
|
||||
/* #undef CPU_RISC */
|
||||
|
||||
/* Path to random device */
|
||||
/* #undef DEV_URANDOM */
|
||||
|
||||
/* Define to compile in dynamic debugging system. */
|
||||
/* #undef ENABLE_DEBUGGING */
|
||||
|
||||
/* Report errors to this file. */
|
||||
/* #undef ERR_REPORTING_FILE */
|
||||
|
||||
/* Define to use logging to stdout. */
|
||||
#define ERR_REPORTING_STDOUT 1
|
||||
|
||||
/* Define this to use ISMAcryp code. */
|
||||
/* #undef GENERIC_AESICM */
|
||||
|
||||
/* Define to 1 if you have the <arpa/inet.h> header file. */
|
||||
/* #undef HAVE_ARPA_INET_H */
|
||||
|
||||
/* Define to 1 if you have the <byteswap.h> header file. */
|
||||
/* #undef HAVE_BYTESWAP_H */
|
||||
|
||||
/* Define to 1 if you have the `inet_aton' function. */
|
||||
/* #undef HAVE_INET_ATON */
|
||||
|
||||
/* Define to 1 if the system has the type `int16_t'. */
|
||||
#define HAVE_INT16_T 1
|
||||
|
||||
/* Define to 1 if the system has the type `int32_t'. */
|
||||
#define HAVE_INT32_T 1
|
||||
|
||||
/* Define to 1 if the system has the type `int8_t'. */
|
||||
#define HAVE_INT8_T 1
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#define HAVE_INTTYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the `socket' library (-lsocket). */
|
||||
/* #undef HAVE_LIBSOCKET */
|
||||
|
||||
/* Define to 1 if you have the <machine/types.h> header file. */
|
||||
/* #undef HAVE_MACHINE_TYPES_H */
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#define HAVE_MEMORY_H 1
|
||||
|
||||
/* Define to 1 if you have the <netinet/in.h> header file. */
|
||||
/* #undef HAVE_NETINET_IN_H */
|
||||
|
||||
/* Define to 1 if you have the `sigaction' function. */
|
||||
/* #undef HAVE_SIGACTION */
|
||||
|
||||
/* Define to 1 if you have the `socket' function. */
|
||||
/* #undef HAVE_SOCKET */
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#define HAVE_STDINT_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#define HAVE_STDLIB_H 1
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#define HAVE_STRINGS_H 1
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#define HAVE_STRING_H 1
|
||||
|
||||
/* Define to 1 if you have the <syslog.h> header file. */
|
||||
/* #undef HAVE_SYSLOG_H */
|
||||
|
||||
/* Define to 1 if you have the <sys/int_types.h> header file. */
|
||||
/* #undef HAVE_SYS_INT_TYPES_H */
|
||||
|
||||
/* Define to 1 if you have the <sys/socket.h> header file. */
|
||||
/* #undef HAVE_SYS_SOCKET_H */
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/uio.h> header file. */
|
||||
/* #undef HAVE_SYS_UIO_H */
|
||||
|
||||
/* Define to 1 if the system has the type `uint16_t'. */
|
||||
#define HAVE_UINT16_T 1
|
||||
|
||||
/* Define to 1 if the system has the type `uint32_t'. */
|
||||
#define HAVE_UINT32_T 1
|
||||
|
||||
/* Define to 1 if the system has the type `uint64_t'. */
|
||||
#define HAVE_UINT64_T 1
|
||||
|
||||
/* Define to 1 if the system has the type `uint8_t'. */
|
||||
#define HAVE_UINT8_T 1
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#define HAVE_UNISTD_H 1
|
||||
|
||||
/* Define to 1 if you have the `usleep' function. */
|
||||
#define HAVE_USLEEP 1
|
||||
|
||||
/* Define to 1 if you have the <windows.h> header file. */
|
||||
#define HAVE_WINDOWS_H 1
|
||||
|
||||
/* Define to 1 if you have the <winsock2.h> header file. */
|
||||
#define HAVE_WINSOCK2_H 1
|
||||
|
||||
/* Define to use X86 inlined assembly code */
|
||||
#define HAVE_X86 1
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#define PACKAGE_BUGREPORT ""
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#define PACKAGE_NAME ""
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#define PACKAGE_STRING ""
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#define PACKAGE_TARNAME ""
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#define PACKAGE_VERSION ""
|
||||
|
||||
/* The size of a `unsigned long', as computed by sizeof. */
|
||||
#define SIZEOF_UNSIGNED_LONG 4
|
||||
|
||||
/* The size of a `unsigned long long', as computed by sizeof. */
|
||||
#define SIZEOF_UNSIGNED_LONG_LONG 8
|
||||
|
||||
/* Define to use GDOI. */
|
||||
/* #undef SRTP_GDOI */
|
||||
|
||||
/* Define to compile for kernel contexts. */
|
||||
/* #undef SRTP_KERNEL */
|
||||
|
||||
/* Define to compile for Linux kernel context. */
|
||||
/* #undef SRTP_KERNEL_LINUX */
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#define STDC_HEADERS 1
|
||||
|
||||
/* Write errors to this file */
|
||||
/* #undef USE_ERR_REPORTING_FILE */
|
||||
|
||||
/* Define to use syslog logging. */
|
||||
/* #undef USE_SYSLOG */
|
||||
|
||||
/* Define to 1 if your processor stores words with the most significant byte
|
||||
first (like Motorola and SPARC, unlike Intel and VAX). */
|
||||
/* #undef WORDS_BIGENDIAN */
|
||||
|
||||
/* Define to empty if `const' does not conform to ANSI C. */
|
||||
/* #undef const */
|
||||
|
||||
/* Define to `__inline__' or `__inline' if that's what the C compiler
|
||||
calls it, or to nothing if 'inline' is not supported under any name. */
|
||||
#ifndef __cplusplus
|
||||
/* #undef inline */
|
||||
#endif
|
||||
|
||||
/* Define to `unsigned' if <sys/types.h> does not define. */
|
||||
/* #undef size_t */
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* crypto.h
|
||||
*
|
||||
* API for libcrypto
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
#ifndef CRYPTO_H
|
||||
#define CRYPTO_H
|
||||
|
||||
/**
|
||||
* @brief A cipher_type_id_t is an identifier for a particular cipher
|
||||
* type.
|
||||
*
|
||||
* A cipher_type_id_t is an integer that represents a particular
|
||||
* cipher type, e.g. the Advanced Encryption Standard (AES). A
|
||||
* NULL_CIPHER is avaliable; this cipher leaves the data unchanged,
|
||||
* and can be selected to indicate that no encryption is to take
|
||||
* place.
|
||||
*
|
||||
* @ingroup Ciphers
|
||||
*/
|
||||
typedef uint32_t cipher_type_id_t;
|
||||
|
||||
/**
|
||||
* @brief An auth_type_id_t is an identifier for a particular authentication
|
||||
* function.
|
||||
*
|
||||
* An auth_type_id_t is an integer that represents a particular
|
||||
* authentication function type, e.g. HMAC-SHA1. A NULL_AUTH is
|
||||
* avaliable; this authentication function performs no computation,
|
||||
* and can be selected to indicate that no authentication is to take
|
||||
* place.
|
||||
*
|
||||
* @ingroup Authentication
|
||||
*/
|
||||
typedef uint32_t auth_type_id_t;
|
||||
|
||||
#endif /* CRYPTO_H */
|
||||
|
||||
|
|
@ -0,0 +1,280 @@
|
|||
/*
|
||||
* crypto_kernel.h
|
||||
*
|
||||
* header for the cryptographic kernel
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright(c) 2001-2006 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef CRYPTO_KERNEL
|
||||
#define CRYPTO_KERNEL
|
||||
|
||||
#include "rand_source.h"
|
||||
#include "prng.h"
|
||||
#include "cipher.h"
|
||||
#include "auth.h"
|
||||
#include "cryptoalg.h"
|
||||
#include "stat.h"
|
||||
#include "err.h"
|
||||
#include "crypto_types.h"
|
||||
#include "key.h"
|
||||
#include "crypto.h"
|
||||
|
||||
/*
|
||||
* crypto_kernel_state_t defines the possible states:
|
||||
*
|
||||
* insecure - not yet initialized
|
||||
* secure - initialized and passed self-tests
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
crypto_kernel_state_insecure,
|
||||
crypto_kernel_state_secure
|
||||
} crypto_kernel_state_t;
|
||||
|
||||
/*
|
||||
* linked list of cipher types
|
||||
*/
|
||||
|
||||
typedef struct kernel_cipher_type {
|
||||
cipher_type_id_t id;
|
||||
cipher_type_t *cipher_type;
|
||||
struct kernel_cipher_type *next;
|
||||
} kernel_cipher_type_t;
|
||||
|
||||
/*
|
||||
* linked list of auth types
|
||||
*/
|
||||
|
||||
typedef struct kernel_auth_type {
|
||||
auth_type_id_t id;
|
||||
auth_type_t *auth_type;
|
||||
struct kernel_auth_type *next;
|
||||
} kernel_auth_type_t;
|
||||
|
||||
/*
|
||||
* linked list of debug modules
|
||||
*/
|
||||
|
||||
typedef struct kernel_debug_module {
|
||||
debug_module_t *mod;
|
||||
struct kernel_debug_module *next;
|
||||
} kernel_debug_module_t;
|
||||
|
||||
|
||||
/*
|
||||
* crypto_kernel_t is the data structure for the crypto kernel
|
||||
*
|
||||
* note that there is *exactly one* instance of this data type,
|
||||
* a global variable defined in crypto_kernel.c
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
crypto_kernel_state_t state; /* current state of kernel */
|
||||
kernel_cipher_type_t *cipher_type_list; /* list of all cipher types */
|
||||
kernel_auth_type_t *auth_type_list; /* list of all auth func types */
|
||||
kernel_debug_module_t *debug_module_list; /* list of all debug modules */
|
||||
} crypto_kernel_t;
|
||||
|
||||
|
||||
/*
|
||||
* crypto_kernel_t external api
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* The function crypto_kernel_init() initialized the crypto kernel and
|
||||
* runs the self-test operations on the random number generators and
|
||||
* crypto algorithms. Possible return values are:
|
||||
*
|
||||
* err_status_ok initialization successful
|
||||
* <other> init failure
|
||||
*
|
||||
* If any value other than err_status_ok is returned, the
|
||||
* crypto_kernel MUST NOT be used.
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
crypto_kernel_init(void);
|
||||
|
||||
|
||||
/*
|
||||
* The function crypto_kernel_shutdown() de-initializes the
|
||||
* crypto_kernel, zeroizes keys and other cryptographic material, and
|
||||
* deallocates any dynamically allocated memory. Possible return
|
||||
* values are:
|
||||
*
|
||||
* err_status_ok shutdown successful
|
||||
* <other> shutdown failure
|
||||
*
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
crypto_kernel_shutdown(void);
|
||||
|
||||
/*
|
||||
* The function crypto_kernel_stats() checks the the crypto_kernel,
|
||||
* running tests on the ciphers, auth funcs, and rng, and prints out a
|
||||
* status report. Possible return values are:
|
||||
*
|
||||
* err_status_ok all tests were passed
|
||||
* <other> a test failed
|
||||
*
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
crypto_kernel_status(void);
|
||||
|
||||
|
||||
/*
|
||||
* crypto_kernel_list_debug_modules() outputs a list of debugging modules
|
||||
*
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
crypto_kernel_list_debug_modules(void);
|
||||
|
||||
/*
|
||||
* crypto_kernel_load_cipher_type()
|
||||
*
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
crypto_kernel_load_cipher_type(cipher_type_t *ct, cipher_type_id_t id);
|
||||
|
||||
err_status_t
|
||||
crypto_kernel_load_auth_type(auth_type_t *ct, auth_type_id_t id);
|
||||
|
||||
/*
|
||||
* crypto_kernel_replace_cipher_type(ct, id)
|
||||
*
|
||||
* replaces the crypto kernel's existing cipher for the cipher_type id
|
||||
* with a new one passed in externally. The new cipher must pass all the
|
||||
* existing cipher_type's self tests as well as its own.
|
||||
*/
|
||||
err_status_t
|
||||
crypto_kernel_replace_cipher_type(cipher_type_t *ct, cipher_type_id_t id);
|
||||
|
||||
|
||||
/*
|
||||
* crypto_kernel_replace_auth_type(ct, id)
|
||||
*
|
||||
* replaces the crypto kernel's existing cipher for the auth_type id
|
||||
* with a new one passed in externally. The new auth type must pass all the
|
||||
* existing auth_type's self tests as well as its own.
|
||||
*/
|
||||
err_status_t
|
||||
crypto_kernel_replace_auth_type(auth_type_t *ct, auth_type_id_t id);
|
||||
|
||||
|
||||
err_status_t
|
||||
crypto_kernel_load_debug_module(debug_module_t *new_dm);
|
||||
|
||||
/*
|
||||
* crypto_kernel_alloc_cipher(id, cp, key_len);
|
||||
*
|
||||
* allocates a cipher of type id at location *cp, with key length
|
||||
* key_len octets. Return values are:
|
||||
*
|
||||
* err_status_ok no problems
|
||||
* err_status_alloc_fail an allocation failure occured
|
||||
* err_status_fail couldn't find cipher with identifier 'id'
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
crypto_kernel_alloc_cipher(cipher_type_id_t id,
|
||||
cipher_pointer_t *cp,
|
||||
int key_len);
|
||||
|
||||
/*
|
||||
* crypto_kernel_alloc_auth(id, ap, key_len, tag_len);
|
||||
*
|
||||
* allocates an auth function of type id at location *ap, with key
|
||||
* length key_len octets and output tag length of tag_len. Return
|
||||
* values are:
|
||||
*
|
||||
* err_status_ok no problems
|
||||
* err_status_alloc_fail an allocation failure occured
|
||||
* err_status_fail couldn't find auth with identifier 'id'
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
crypto_kernel_alloc_auth(auth_type_id_t id,
|
||||
auth_pointer_t *ap,
|
||||
int key_len,
|
||||
int tag_len);
|
||||
|
||||
|
||||
/*
|
||||
* crypto_kernel_set_debug_module(mod_name, v)
|
||||
*
|
||||
* sets dynamic debugging to the value v (0 for off, 1 for on) for the
|
||||
* debug module with the name mod_name
|
||||
*
|
||||
* returns err_status_ok on success, err_status_fail otherwise
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
crypto_kernel_set_debug_module(char *mod_name, int v);
|
||||
|
||||
/**
|
||||
* @brief writes a random octet string.
|
||||
*
|
||||
* The function call crypto_get_random(dest, len) writes len octets of
|
||||
* random data to the location to which dest points, and returns an
|
||||
* error code. This error code @b must be checked, and if a failure is
|
||||
* reported, the data in the buffer @b must @b not be used.
|
||||
*
|
||||
* @warning If the return code is not checked, then non-random
|
||||
* data may be in the buffer. This function will fail
|
||||
* unless it is called after crypto_kernel_init().
|
||||
*
|
||||
* @return
|
||||
* - err_status_ok if no problems occured.
|
||||
* - [other] a problem occured, and no assumptions should
|
||||
* be made about the contents of the destination
|
||||
* buffer.
|
||||
*
|
||||
* @ingroup SRTP
|
||||
*/
|
||||
err_status_t
|
||||
crypto_get_random(unsigned char *buffer, unsigned int length);
|
||||
|
||||
#endif /* CRYPTO_KERNEL */
|
|
@ -0,0 +1,239 @@
|
|||
/*
|
||||
* math.h
|
||||
*
|
||||
* crypto math operations and data types
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef MATH_H
|
||||
#define MATH_H
|
||||
|
||||
#include "datatypes.h"
|
||||
|
||||
unsigned char
|
||||
v32_weight(v32_t a);
|
||||
|
||||
unsigned char
|
||||
v32_distance(v32_t x, v32_t y);
|
||||
|
||||
unsigned int
|
||||
v32_dot_product(v32_t a, v32_t b);
|
||||
|
||||
char *
|
||||
v16_bit_string(v16_t x);
|
||||
|
||||
char *
|
||||
v32_bit_string(v32_t x);
|
||||
|
||||
char *
|
||||
v64_bit_string(const v64_t *x);
|
||||
|
||||
char *
|
||||
octet_hex_string(uint8_t x);
|
||||
|
||||
char *
|
||||
v16_hex_string(v16_t x);
|
||||
|
||||
char *
|
||||
v32_hex_string(v32_t x);
|
||||
|
||||
char *
|
||||
v64_hex_string(const v64_t *x);
|
||||
|
||||
int
|
||||
hex_char_to_nibble(uint8_t c);
|
||||
|
||||
int
|
||||
is_hex_string(char *s);
|
||||
|
||||
v16_t
|
||||
hex_string_to_v16(char *s);
|
||||
|
||||
v32_t
|
||||
hex_string_to_v32(char *s);
|
||||
|
||||
v64_t
|
||||
hex_string_to_v64(char *s);
|
||||
|
||||
/* the matrix A[] is stored in column format, i.e., A[i] is
|
||||
the ith column of the matrix */
|
||||
|
||||
uint8_t
|
||||
A_times_x_plus_b(uint8_t A[8], uint8_t x, uint8_t b);
|
||||
|
||||
void
|
||||
v16_copy_octet_string(v16_t *x, const uint8_t s[2]);
|
||||
|
||||
void
|
||||
v32_copy_octet_string(v32_t *x, const uint8_t s[4]);
|
||||
|
||||
void
|
||||
v64_copy_octet_string(v64_t *x, const uint8_t s[8]);
|
||||
|
||||
void
|
||||
v128_add(v128_t *z, v128_t *x, v128_t *y);
|
||||
|
||||
int
|
||||
octet_string_is_eq(uint8_t *a, uint8_t *b, int len);
|
||||
|
||||
void
|
||||
octet_string_set_to_zero(uint8_t *s, int len);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* the matrix A[] is stored in column format, i.e., A[i] is the ith
|
||||
* column of the matrix
|
||||
*/
|
||||
uint8_t
|
||||
A_times_x_plus_b(uint8_t A[8], uint8_t x, uint8_t b);
|
||||
|
||||
|
||||
#if 0
|
||||
#if WORDS_BIGENDIAN
|
||||
|
||||
#define _v128_add(z, x, y) { \
|
||||
uint64_t tmp; \
|
||||
\
|
||||
tmp = x->v32[3] + y->v32[3]; \
|
||||
z->v32[3] = (uint32_t) tmp; \
|
||||
\
|
||||
tmp = x->v32[2] + y->v32[2] + (tmp >> 32); \
|
||||
z->v32[2] = (uint32_t) tmp; \
|
||||
\
|
||||
tmp = x->v32[1] + y->v32[1] + (tmp >> 32); \
|
||||
z->v32[1] = (uint32_t) tmp; \
|
||||
\
|
||||
tmp = x->v32[0] + y->v32[0] + (tmp >> 32); \
|
||||
z->v32[0] = (uint32_t) tmp; \
|
||||
}
|
||||
|
||||
#else /* assume little endian architecture */
|
||||
|
||||
#define _v128_add(z, x, y) { \
|
||||
uint64_t tmp; \
|
||||
\
|
||||
tmp = htonl(x->v32[3]) + htonl(y->v32[3]); \
|
||||
z->v32[3] = ntohl((uint32_t) tmp); \
|
||||
\
|
||||
tmp = htonl(x->v32[2]) + htonl(y->v32[2]) \
|
||||
+ htonl(tmp >> 32); \
|
||||
z->v32[2] = ntohl((uint32_t) tmp); \
|
||||
\
|
||||
tmp = htonl(x->v32[1]) + htonl(y->v32[1]) \
|
||||
+ htonl(tmp >> 32); \
|
||||
z->v32[1] = ntohl((uint32_t) tmp); \
|
||||
\
|
||||
tmp = htonl(x->v32[0]) + htonl(y->v32[0]) \
|
||||
+ htonl(tmp >> 32); \
|
||||
z->v32[0] = ntohl((uint32_t) tmp); \
|
||||
}
|
||||
|
||||
#endif /* WORDS_BIGENDIAN */
|
||||
#endif
|
||||
|
||||
#ifdef DATATYPES_USE_MACROS /* little functions are really macros */
|
||||
|
||||
#define v128_set_to_zero(z) _v128_set_to_zero(z)
|
||||
#define v128_copy(z, x) _v128_copy(z, x)
|
||||
#define v128_xor(z, x, y) _v128_xor(z, x, y)
|
||||
#define v128_and(z, x, y) _v128_and(z, x, y)
|
||||
#define v128_or(z, x, y) _v128_or(z, x, y)
|
||||
#define v128_complement(x) _v128_complement(x)
|
||||
#define v128_is_eq(x, y) _v128_is_eq(x, y)
|
||||
#define v128_xor_eq(x, y) _v128_xor_eq(x, y)
|
||||
#define v128_get_bit(x, i) _v128_get_bit(x, i)
|
||||
#define v128_set_bit(x, i) _v128_set_bit(x, i)
|
||||
#define v128_clear_bit(x, i) _v128_clear_bit(x, i)
|
||||
#define v128_set_bit_to(x, i, y) _v128_set_bit_to(x, i, y)
|
||||
|
||||
#else
|
||||
|
||||
void
|
||||
v128_set_to_zero(v128_t *x);
|
||||
|
||||
int
|
||||
v128_is_eq(const v128_t *x, const v128_t *y);
|
||||
|
||||
void
|
||||
v128_copy(v128_t *x, const v128_t *y);
|
||||
|
||||
void
|
||||
v128_xor(v128_t *z, v128_t *x, v128_t *y);
|
||||
|
||||
void
|
||||
v128_and(v128_t *z, v128_t *x, v128_t *y);
|
||||
|
||||
void
|
||||
v128_or(v128_t *z, v128_t *x, v128_t *y);
|
||||
|
||||
void
|
||||
v128_complement(v128_t *x);
|
||||
|
||||
int
|
||||
v128_get_bit(const v128_t *x, int i);
|
||||
|
||||
void
|
||||
v128_set_bit(v128_t *x, int i) ;
|
||||
|
||||
void
|
||||
v128_clear_bit(v128_t *x, int i);
|
||||
|
||||
void
|
||||
v128_set_bit_to(v128_t *x, int i, int y);
|
||||
|
||||
#endif /* DATATYPES_USE_MACROS */
|
||||
|
||||
/*
|
||||
* octet_string_is_eq(a,b, len) returns 1 if the length len strings a
|
||||
* and b are not equal, returns 0 otherwise
|
||||
*/
|
||||
|
||||
int
|
||||
octet_string_is_eq(uint8_t *a, uint8_t *b, int len);
|
||||
|
||||
void
|
||||
octet_string_set_to_zero(uint8_t *s, int len);
|
||||
|
||||
|
||||
#endif /* MATH_H */
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,220 @@
|
|||
/*
|
||||
* crypto_types.h
|
||||
*
|
||||
* constants for cipher types and auth func types
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright(c) 2001-2006 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CRYPTO_TYPES_H
|
||||
#define CRYPTO_TYPES_H
|
||||
|
||||
/**
|
||||
* @defgroup Algos Cryptographic Algorithms
|
||||
*
|
||||
*
|
||||
* This library provides several different cryptographic algorithms,
|
||||
* each of which can be selected by using the cipher_type_id_t and
|
||||
* auth_type_id_t. These algorithms are documented below.
|
||||
*
|
||||
* Authentication functions that use the Universal Security Transform
|
||||
* (UST) must be used in conjunction with a cipher other than the null
|
||||
* cipher. These functions require a per-message pseudorandom input
|
||||
* that is generated by the cipher.
|
||||
*
|
||||
* The identifiers STRONGHOLD_AUTH and STRONGHOLD_CIPHER identify the
|
||||
* strongest available authentication function and cipher,
|
||||
* respectively. They are resolved at compile time to the strongest
|
||||
* available algorithm. The stronghold algorithms can serve as did
|
||||
* the keep of a medieval fortification; they provide the strongest
|
||||
* defense (or the last refuge).
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup Ciphers Cipher Types
|
||||
*
|
||||
* @brief Each cipher type is identified by an unsigned integer. The
|
||||
* cipher types available in this edition of libSRTP are given
|
||||
* by the #defines below.
|
||||
*
|
||||
* A cipher_type_id_t is an identifier for a cipher_type; only values
|
||||
* given by the #defines above (or those present in the file
|
||||
* crypto_types.h) should be used.
|
||||
*
|
||||
* The identifier STRONGHOLD_CIPHER indicates the strongest available
|
||||
* cipher, allowing an application to choose the strongest available
|
||||
* algorithm without any advance knowledge about the avaliable
|
||||
* algorithms.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief The null cipher performs no encryption.
|
||||
*
|
||||
* The NULL_CIPHER leaves its inputs unaltered, during both the
|
||||
* encryption and decryption operations. This cipher can be chosen
|
||||
* to indicate that no encryption is to be performed.
|
||||
*/
|
||||
#define NULL_CIPHER 0
|
||||
|
||||
/**
|
||||
* @brief AES Integer Counter Mode (AES ICM)
|
||||
*
|
||||
* AES ICM is the variant of counter mode that is used by Secure RTP.
|
||||
* This cipher uses a 16-, 24-, or 32-octet key concatenated with a
|
||||
* 14-octet offset (or salt) value.
|
||||
*/
|
||||
#define AES_ICM 1
|
||||
|
||||
/**
|
||||
* @brief AES-128 Integer Counter Mode (AES ICM)
|
||||
* AES-128 ICM is a deprecated alternate name for AES ICM.
|
||||
*/
|
||||
#define AES_128_ICM AES_ICM
|
||||
|
||||
/**
|
||||
* @brief SEAL 3.0
|
||||
*
|
||||
* SEAL is the Software-Optimized Encryption Algorithm of Coppersmith
|
||||
* and Rogaway. Nota bene: this cipher is IBM proprietary.
|
||||
*/
|
||||
#define SEAL 2
|
||||
|
||||
/**
|
||||
* @brief AES Cipher Block Chaining mode (AES CBC)
|
||||
*
|
||||
* AES CBC is the AES Cipher Block Chaining mode.
|
||||
* This cipher uses a 16-, 24-, or 32-octet key.
|
||||
*/
|
||||
#define AES_CBC 3
|
||||
|
||||
/**
|
||||
* @brief AES-128 Cipher Block Chaining mode (AES CBC)
|
||||
*
|
||||
* AES-128 CBC is a deprecated alternate name for AES CBC.
|
||||
*/
|
||||
#define AES_128_CBC AES_CBC
|
||||
|
||||
/**
|
||||
* @brief Strongest available cipher.
|
||||
*
|
||||
* This identifier resolves to the strongest cipher type available.
|
||||
*/
|
||||
#define STRONGHOLD_CIPHER AES_ICM
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @defgroup Authentication Authentication Function Types
|
||||
*
|
||||
* @brief Each authentication function type is identified by an
|
||||
* unsigned integer. The authentication function types available in
|
||||
* this edition of libSRTP are given by the #defines below.
|
||||
*
|
||||
* An auth_type_id_t is an identifier for an authentication function type;
|
||||
* only values given by the #defines above (or those present in the
|
||||
* file crypto_types.h) should be used.
|
||||
*
|
||||
* The identifier STRONGHOLD_AUTH indicates the strongest available
|
||||
* authentication function, allowing an application to choose the
|
||||
* strongest available algorithm without any advance knowledge about
|
||||
* the avaliable algorithms. The stronghold algorithms can serve as
|
||||
* did the keep of a medieval fortification; they provide the
|
||||
* strongest defense (or the last refuge).
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief The null authentication function performs no authentication.
|
||||
*
|
||||
* The NULL_AUTH function does nothing, and can be selected to indicate
|
||||
* that authentication should not be performed.
|
||||
*/
|
||||
#define NULL_AUTH 0
|
||||
|
||||
/**
|
||||
* @brief UST with TMMH Version 2
|
||||
*
|
||||
* UST_TMMHv2 implements the Truncated Multi-Modular Hash using
|
||||
* UST. This function must be used in conjunction with a cipher other
|
||||
* than the null cipher.
|
||||
* with a cipher.
|
||||
*/
|
||||
#define UST_TMMHv2 1
|
||||
|
||||
/**
|
||||
* @brief (UST) AES-128 XORMAC
|
||||
*
|
||||
* UST_AES_128_XMAC implements AES-128 XORMAC, using UST. Nota bene:
|
||||
* the XORMAC algorithm is IBM proprietary.
|
||||
*/
|
||||
#define UST_AES_128_XMAC 2
|
||||
|
||||
/**
|
||||
* @brief HMAC-SHA1
|
||||
*
|
||||
* HMAC_SHA1 implements the Hash-based MAC using the NIST Secure
|
||||
* Hash Algorithm version 1 (SHA1).
|
||||
*/
|
||||
#define HMAC_SHA1 3
|
||||
|
||||
/**
|
||||
* @brief Strongest available authentication function.
|
||||
*
|
||||
* This identifier resolves to the strongest available authentication
|
||||
* function.
|
||||
*/
|
||||
#define STRONGHOLD_AUTH HMAC_SHA1
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif /* CRYPTO_TYPES_H */
|
|
@ -0,0 +1,133 @@
|
|||
/*
|
||||
* cryptoalg.h
|
||||
*
|
||||
* API for authenticated encryption crypto algorithms
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CRYPTOALG_H
|
||||
#define CRYPTOALG_H
|
||||
|
||||
#include "err.h"
|
||||
|
||||
/**
|
||||
* @defgroup Crypto Cryptography
|
||||
*
|
||||
* Zed uses a simple interface to a cryptographic transform.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief applies a crypto algorithm
|
||||
*
|
||||
* The function pointer cryptoalg_func_t points to a function that
|
||||
* implements a crypto transform, and provides a uniform API for
|
||||
* accessing crypto mechanisms.
|
||||
*
|
||||
* @param key location of secret key
|
||||
*
|
||||
* @param clear data to be authenticated but not encrypted
|
||||
*
|
||||
* @param clear_len length of data to be authenticated but not encrypted
|
||||
*
|
||||
* @param iv location to write the Initialization Vector (IV)
|
||||
*
|
||||
* @param protect location of the data to be encrypted and
|
||||
* authenticated (before the function call), and the ciphertext
|
||||
* and authentication tag (after the call)
|
||||
*
|
||||
* @param protected_len location of the length of the data to be
|
||||
* encrypted and authenticated (before the function call), and the
|
||||
* length of the ciphertext (after the call)
|
||||
*
|
||||
*/
|
||||
|
||||
typedef err_status_t (*cryptoalg_func_t)
|
||||
(void *key,
|
||||
const void *clear,
|
||||
unsigned clear_len,
|
||||
void *iv,
|
||||
void *protect,
|
||||
unsigned *protected_len);
|
||||
|
||||
typedef
|
||||
err_status_t (*cryptoalg_inv_t)
|
||||
(void *key, /* location of secret key */
|
||||
const void *clear, /* data to be authenticated only */
|
||||
unsigned clear_len, /* length of data to be authenticated only */
|
||||
void *iv, /* location of iv */
|
||||
void *opaque, /* data to be decrypted and authenticated */
|
||||
unsigned *opaque_len /* location of the length of data to be
|
||||
* decrypted and authd (before and after)
|
||||
*/
|
||||
);
|
||||
|
||||
typedef struct cryptoalg_ctx_t {
|
||||
cryptoalg_func_t enc;
|
||||
cryptoalg_inv_t dec;
|
||||
unsigned key_len;
|
||||
unsigned iv_len;
|
||||
unsigned auth_tag_len;
|
||||
unsigned max_expansion;
|
||||
} cryptoalg_ctx_t;
|
||||
|
||||
typedef cryptoalg_ctx_t *cryptoalg_t;
|
||||
|
||||
#define cryptoalg_get_key_len(cryptoalg) ((cryptoalg)->key_len)
|
||||
|
||||
#define cryptoalg_get_iv_len(cryptoalg) ((cryptoalg)->iv_len)
|
||||
|
||||
#define cryptoalg_get_auth_tag_len(cryptoalg) ((cryptoalg)->auth_tag_len)
|
||||
|
||||
int
|
||||
cryptoalg_get_id(cryptoalg_t c);
|
||||
|
||||
cryptoalg_t
|
||||
cryptoalg_find_by_id(int id);
|
||||
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif /* CRYPTOALG_H */
|
||||
|
||||
|
|
@ -0,0 +1,506 @@
|
|||
/*
|
||||
* datatypes.h
|
||||
*
|
||||
* data types for bit vectors and finite fields
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _DATATYPES_H
|
||||
#define _DATATYPES_H
|
||||
|
||||
#include "integers.h" /* definitions of uint32_t, et cetera */
|
||||
#include "alloc.h"
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#ifndef SRTP_KERNEL
|
||||
# include <stdio.h>
|
||||
# include <string.h>
|
||||
# include <time.h>
|
||||
# ifdef HAVE_NETINET_IN_H
|
||||
# include <netinet/in.h>
|
||||
# elif defined HAVE_WINSOCK2_H
|
||||
# include <winsock2.h>
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/* if DATATYPES_USE_MACROS is defined, then little functions are macros */
|
||||
#define DATATYPES_USE_MACROS
|
||||
|
||||
typedef union {
|
||||
uint8_t v8[2];
|
||||
uint16_t value;
|
||||
} v16_t;
|
||||
|
||||
typedef union {
|
||||
uint8_t v8[4];
|
||||
uint16_t v16[2];
|
||||
uint32_t value;
|
||||
} v32_t;
|
||||
|
||||
typedef union {
|
||||
uint8_t v8[8];
|
||||
uint16_t v16[4];
|
||||
uint32_t v32[2];
|
||||
uint64_t value;
|
||||
} v64_t;
|
||||
|
||||
typedef union {
|
||||
uint8_t v8[16];
|
||||
uint16_t v16[8];
|
||||
uint32_t v32[4];
|
||||
uint64_t v64[2];
|
||||
} v128_t;
|
||||
|
||||
|
||||
|
||||
/* some useful and simple math functions */
|
||||
|
||||
#define pow_2(X) ( (unsigned int)1 << (X) ) /* 2^X */
|
||||
|
||||
#define pow_minus_one(X) ( (X) ? -1 : 1 ) /* (-1)^X */
|
||||
|
||||
|
||||
/*
|
||||
* octet_get_weight(x) returns the hamming weight (number of bits equal to
|
||||
* one) in the octet x
|
||||
*/
|
||||
|
||||
int
|
||||
octet_get_weight(uint8_t octet);
|
||||
|
||||
char *
|
||||
octet_bit_string(uint8_t x);
|
||||
|
||||
#define MAX_PRINT_STRING_LEN 1024
|
||||
|
||||
char *
|
||||
octet_string_hex_string(const void *str, int length);
|
||||
|
||||
char *
|
||||
v128_bit_string(v128_t *x);
|
||||
|
||||
char *
|
||||
v128_hex_string(v128_t *x);
|
||||
|
||||
uint8_t
|
||||
nibble_to_hex_char(uint8_t nibble);
|
||||
|
||||
char *
|
||||
char_to_hex_string(char *x, int num_char);
|
||||
|
||||
uint8_t
|
||||
hex_string_to_octet(char *s);
|
||||
|
||||
/*
|
||||
* hex_string_to_octet_string(raw, hex, len) converts the hexadecimal
|
||||
* string at *hex (of length len octets) to the equivalent raw data
|
||||
* and writes it to *raw.
|
||||
*
|
||||
* if a character in the hex string that is not a hexadeciaml digit
|
||||
* (0123456789abcdefABCDEF) is encountered, the function stops writing
|
||||
* data to *raw
|
||||
*
|
||||
* the number of hex digits copied (which is two times the number of
|
||||
* octets in *raw) is returned
|
||||
*/
|
||||
|
||||
int
|
||||
hex_string_to_octet_string(char *raw, char *hex, int len);
|
||||
|
||||
v128_t
|
||||
hex_string_to_v128(char *s);
|
||||
|
||||
void
|
||||
v128_copy_octet_string(v128_t *x, const uint8_t s[16]);
|
||||
|
||||
void
|
||||
v128_left_shift(v128_t *x, int shift_index);
|
||||
|
||||
void
|
||||
v128_right_shift(v128_t *x, int shift_index);
|
||||
|
||||
/*
|
||||
* the following macros define the data manipulation functions
|
||||
*
|
||||
* If DATATYPES_USE_MACROS is defined, then these macros are used
|
||||
* directly (and function call overhead is avoided). Otherwise,
|
||||
* the macros are used through the functions defined in datatypes.c
|
||||
* (and the compiler provides better warnings).
|
||||
*/
|
||||
|
||||
#define _v128_set_to_zero(x) \
|
||||
( \
|
||||
(x)->v32[0] = 0, \
|
||||
(x)->v32[1] = 0, \
|
||||
(x)->v32[2] = 0, \
|
||||
(x)->v32[3] = 0 \
|
||||
)
|
||||
|
||||
#define _v128_copy(x, y) \
|
||||
( \
|
||||
(x)->v32[0] = (y)->v32[0], \
|
||||
(x)->v32[1] = (y)->v32[1], \
|
||||
(x)->v32[2] = (y)->v32[2], \
|
||||
(x)->v32[3] = (y)->v32[3] \
|
||||
)
|
||||
|
||||
#define _v128_xor(z, x, y) \
|
||||
( \
|
||||
(z)->v32[0] = (x)->v32[0] ^ (y)->v32[0], \
|
||||
(z)->v32[1] = (x)->v32[1] ^ (y)->v32[1], \
|
||||
(z)->v32[2] = (x)->v32[2] ^ (y)->v32[2], \
|
||||
(z)->v32[3] = (x)->v32[3] ^ (y)->v32[3] \
|
||||
)
|
||||
|
||||
#define _v128_and(z, x, y) \
|
||||
( \
|
||||
(z)->v32[0] = (x)->v32[0] & (y)->v32[0], \
|
||||
(z)->v32[1] = (x)->v32[1] & (y)->v32[1], \
|
||||
(z)->v32[2] = (x)->v32[2] & (y)->v32[2], \
|
||||
(z)->v32[3] = (x)->v32[3] & (y)->v32[3] \
|
||||
)
|
||||
|
||||
#define _v128_or(z, x, y) \
|
||||
( \
|
||||
(z)->v32[0] = (x)->v32[0] | (y)->v32[0], \
|
||||
(z)->v32[1] = (x)->v32[1] | (y)->v32[1], \
|
||||
(z)->v32[2] = (x)->v32[2] | (y)->v32[2], \
|
||||
(z)->v32[3] = (x)->v32[3] | (y)->v32[3] \
|
||||
)
|
||||
|
||||
#define _v128_complement(x) \
|
||||
( \
|
||||
(x)->v32[0] = ~(x)->v32[0], \
|
||||
(x)->v32[1] = ~(x)->v32[1], \
|
||||
(x)->v32[2] = ~(x)->v32[2], \
|
||||
(x)->v32[3] = ~(x)->v32[3] \
|
||||
)
|
||||
|
||||
/* ok for NO_64BIT_MATH if it can compare uint64_t's (even as structures) */
|
||||
#define _v128_is_eq(x, y) \
|
||||
(((x)->v64[0] == (y)->v64[0]) && ((x)->v64[1] == (y)->v64[1]))
|
||||
|
||||
|
||||
#ifdef NO_64BIT_MATH
|
||||
#define _v128_xor_eq(z, x) \
|
||||
( \
|
||||
(z)->v32[0] ^= (x)->v32[0], \
|
||||
(z)->v32[1] ^= (x)->v32[1], \
|
||||
(z)->v32[2] ^= (x)->v32[2], \
|
||||
(z)->v32[3] ^= (x)->v32[3] \
|
||||
)
|
||||
#else
|
||||
#define _v128_xor_eq(z, x) \
|
||||
( \
|
||||
(z)->v64[0] ^= (x)->v64[0], \
|
||||
(z)->v64[1] ^= (x)->v64[1] \
|
||||
)
|
||||
#endif
|
||||
|
||||
/* NOTE! This assumes an odd ordering! */
|
||||
/* This will not be compatible directly with math on some processors */
|
||||
/* bit 0 is first 32-bit word, low order bit. in little-endian, that's
|
||||
the first byte of the first 32-bit word. In big-endian, that's
|
||||
the 3rd byte of the first 32-bit word */
|
||||
/* The get/set bit code is used by the replay code ONLY, and it doesn't
|
||||
really care which bit is which. AES does care which bit is which, but
|
||||
doesn't use the 128-bit get/set or 128-bit shifts */
|
||||
|
||||
#define _v128_get_bit(x, bit) \
|
||||
( \
|
||||
((((x)->v32[(bit) >> 5]) >> ((bit) & 31)) & 1) \
|
||||
)
|
||||
|
||||
#define _v128_set_bit(x, bit) \
|
||||
( \
|
||||
(((x)->v32[(bit) >> 5]) |= ((uint32_t)1 << ((bit) & 31))) \
|
||||
)
|
||||
|
||||
#define _v128_clear_bit(x, bit) \
|
||||
( \
|
||||
(((x)->v32[(bit) >> 5]) &= ~((uint32_t)1 << ((bit) & 31))) \
|
||||
)
|
||||
|
||||
#define _v128_set_bit_to(x, bit, value) \
|
||||
( \
|
||||
(value) ? _v128_set_bit(x, bit) : \
|
||||
_v128_clear_bit(x, bit) \
|
||||
)
|
||||
|
||||
|
||||
#if 0
|
||||
/* nothing uses this */
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
|
||||
#define _v128_add(z, x, y) { \
|
||||
uint64_t tmp; \
|
||||
\
|
||||
tmp = x->v32[3] + y->v32[3]; \
|
||||
z->v32[3] = (uint32_t) tmp; \
|
||||
\
|
||||
tmp = x->v32[2] + y->v32[2] + (tmp >> 32); \
|
||||
z->v32[2] = (uint32_t) tmp; \
|
||||
\
|
||||
tmp = x->v32[1] + y->v32[1] + (tmp >> 32); \
|
||||
z->v32[1] = (uint32_t) tmp; \
|
||||
\
|
||||
tmp = x->v32[0] + y->v32[0] + (tmp >> 32); \
|
||||
z->v32[0] = (uint32_t) tmp; \
|
||||
}
|
||||
|
||||
#else /* assume little endian architecture */
|
||||
|
||||
#define _v128_add(z, x, y) { \
|
||||
uint64_t tmp; \
|
||||
\
|
||||
tmp = htonl(x->v32[3]) + htonl(y->v32[3]); \
|
||||
z->v32[3] = ntohl((uint32_t) tmp); \
|
||||
\
|
||||
tmp = htonl(x->v32[2]) + htonl(y->v32[2]) \
|
||||
+ htonl(tmp >> 32); \
|
||||
z->v32[2] = ntohl((uint32_t) tmp); \
|
||||
\
|
||||
tmp = htonl(x->v32[1]) + htonl(y->v32[1]) \
|
||||
+ htonl(tmp >> 32); \
|
||||
z->v32[1] = ntohl((uint32_t) tmp); \
|
||||
\
|
||||
tmp = htonl(x->v32[0]) + htonl(y->v32[0]) \
|
||||
+ htonl(tmp >> 32); \
|
||||
z->v32[0] = ntohl((uint32_t) tmp); \
|
||||
}
|
||||
#endif /* WORDS_BIGENDIAN */
|
||||
#endif /* 0 */
|
||||
|
||||
|
||||
#ifdef DATATYPES_USE_MACROS /* little functions are really macros */
|
||||
|
||||
#define v128_set_to_zero(z) _v128_set_to_zero(z)
|
||||
#define v128_copy(z, x) _v128_copy(z, x)
|
||||
#define v128_xor(z, x, y) _v128_xor(z, x, y)
|
||||
#define v128_and(z, x, y) _v128_and(z, x, y)
|
||||
#define v128_or(z, x, y) _v128_or(z, x, y)
|
||||
#define v128_complement(x) _v128_complement(x)
|
||||
#define v128_is_eq(x, y) _v128_is_eq(x, y)
|
||||
#define v128_xor_eq(x, y) _v128_xor_eq(x, y)
|
||||
#define v128_get_bit(x, i) _v128_get_bit(x, i)
|
||||
#define v128_set_bit(x, i) _v128_set_bit(x, i)
|
||||
#define v128_clear_bit(x, i) _v128_clear_bit(x, i)
|
||||
#define v128_set_bit_to(x, i, y) _v128_set_bit_to(x, i, y)
|
||||
|
||||
#else
|
||||
|
||||
void
|
||||
v128_set_to_zero(v128_t *x);
|
||||
|
||||
int
|
||||
v128_is_eq(const v128_t *x, const v128_t *y);
|
||||
|
||||
void
|
||||
v128_copy(v128_t *x, const v128_t *y);
|
||||
|
||||
void
|
||||
v128_xor(v128_t *z, v128_t *x, v128_t *y);
|
||||
|
||||
void
|
||||
v128_and(v128_t *z, v128_t *x, v128_t *y);
|
||||
|
||||
void
|
||||
v128_or(v128_t *z, v128_t *x, v128_t *y);
|
||||
|
||||
void
|
||||
v128_complement(v128_t *x);
|
||||
|
||||
int
|
||||
v128_get_bit(const v128_t *x, int i);
|
||||
|
||||
void
|
||||
v128_set_bit(v128_t *x, int i) ;
|
||||
|
||||
void
|
||||
v128_clear_bit(v128_t *x, int i);
|
||||
|
||||
void
|
||||
v128_set_bit_to(v128_t *x, int i, int y);
|
||||
|
||||
#endif /* DATATYPES_USE_MACROS */
|
||||
|
||||
/*
|
||||
* octet_string_is_eq(a,b, len) returns 1 if the length len strings a
|
||||
* and b are not equal, returns 0 otherwise
|
||||
*/
|
||||
|
||||
int
|
||||
octet_string_is_eq(uint8_t *a, uint8_t *b, int len);
|
||||
|
||||
void
|
||||
octet_string_set_to_zero(uint8_t *s, int len);
|
||||
|
||||
|
||||
#ifndef SRTP_KERNEL_LINUX
|
||||
|
||||
/*
|
||||
* Convert big endian integers to CPU byte order.
|
||||
*/
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
/* Nothing to do. */
|
||||
# define be32_to_cpu(x) (x)
|
||||
# define be64_to_cpu(x) (x)
|
||||
#elif defined(HAVE_BYTESWAP_H)
|
||||
/* We have (hopefully) optimized versions in byteswap.h */
|
||||
# include <byteswap.h>
|
||||
# define be32_to_cpu(x) bswap_32((x))
|
||||
# define be64_to_cpu(x) bswap_64((x))
|
||||
#else
|
||||
|
||||
#if defined(__GNUC__) && defined(HAVE_X86)
|
||||
/* Fall back. */
|
||||
static inline uint32_t be32_to_cpu(uint32_t v) {
|
||||
/* optimized for x86. */
|
||||
asm("bswap %0" : "=r" (v) : "0" (v));
|
||||
return v;
|
||||
}
|
||||
# else /* HAVE_X86 */
|
||||
# ifdef HAVE_NETINET_IN_H
|
||||
# include <netinet/in.h>
|
||||
# elif defined HAVE_WINSOCK2_H
|
||||
# include <winsock2.h>
|
||||
# endif
|
||||
# define be32_to_cpu(x) ntohl((x))
|
||||
# endif /* HAVE_X86 */
|
||||
|
||||
static __inline uint64_t be64_to_cpu(uint64_t v) {
|
||||
# ifdef NO_64BIT_MATH
|
||||
/* use the make64 functions to do 64-bit math */
|
||||
v = make64(htonl(low32(v)),htonl(high32(v)));
|
||||
# else
|
||||
/* use the native 64-bit math */
|
||||
v= (uint64_t)((be32_to_cpu((uint32_t)(v >> 32))) | (((uint64_t)be32_to_cpu((uint32_t)v)) << 32));
|
||||
# endif
|
||||
return v;
|
||||
}
|
||||
|
||||
#endif /* ! SRTP_KERNEL_LINUX */
|
||||
|
||||
#endif /* WORDS_BIGENDIAN */
|
||||
|
||||
/*
|
||||
* functions manipulating bitvector_t
|
||||
*
|
||||
* A bitvector_t consists of an array of words and an integer
|
||||
* representing the number of significant bits stored in the array.
|
||||
* The bits are packed as follows: the least significant bit is that
|
||||
* of word[0], while the most significant bit is the nth most
|
||||
* significant bit of word[m], where length = bits_per_word * m + n.
|
||||
*
|
||||
*/
|
||||
|
||||
#define bits_per_word 32
|
||||
#define bytes_per_word 4
|
||||
|
||||
typedef struct {
|
||||
uint32_t length;
|
||||
uint32_t *word;
|
||||
} bitvector_t;
|
||||
|
||||
|
||||
#define _bitvector_get_bit(v, bit_index) \
|
||||
( \
|
||||
((((v)->word[((bit_index) >> 5)]) >> ((bit_index) & 31)) & 1) \
|
||||
)
|
||||
|
||||
|
||||
#define _bitvector_set_bit(v, bit_index) \
|
||||
( \
|
||||
(((v)->word[((bit_index) >> 5)] |= ((uint32_t)1 << ((bit_index) & 31)))) \
|
||||
)
|
||||
|
||||
#define _bitvector_clear_bit(v, bit_index) \
|
||||
( \
|
||||
(((v)->word[((bit_index) >> 5)] &= ~((uint32_t)1 << ((bit_index) & 31)))) \
|
||||
)
|
||||
|
||||
#define _bitvector_get_length(v) \
|
||||
( \
|
||||
((v)->length) \
|
||||
)
|
||||
|
||||
#ifdef DATATYPES_USE_MACROS /* little functions are really macros */
|
||||
|
||||
#define bitvector_get_bit(v, bit_index) _bitvector_get_bit(v, bit_index)
|
||||
#define bitvector_set_bit(v, bit_index) _bitvector_set_bit(v, bit_index)
|
||||
#define bitvector_clear_bit(v, bit_index) _bitvector_clear_bit(v, bit_index)
|
||||
#define bitvector_get_length(v) _bitvector_get_length(v)
|
||||
|
||||
#else
|
||||
|
||||
int
|
||||
bitvector_get_bit(const bitvector_t *v, int bit_index);
|
||||
|
||||
void
|
||||
bitvector_set_bit(bitvector_t *v, int bit_index);
|
||||
|
||||
void
|
||||
bitvector_clear_bit(bitvector_t *v, int bit_index);
|
||||
|
||||
unsigned long
|
||||
bitvector_get_length(const bitvector_t *v);
|
||||
|
||||
#endif
|
||||
|
||||
int
|
||||
bitvector_alloc(bitvector_t *v, unsigned long length);
|
||||
|
||||
void
|
||||
bitvector_dealloc(bitvector_t *v);
|
||||
|
||||
void
|
||||
bitvector_set_to_zero(bitvector_t *x);
|
||||
|
||||
void
|
||||
bitvector_left_shift(bitvector_t *x, int index);
|
||||
|
||||
char *
|
||||
bitvector_bit_string(bitvector_t *x, char* buf, int len);
|
||||
|
||||
#endif /* _DATATYPES_H */
|
|
@ -0,0 +1,201 @@
|
|||
/*
|
||||
* ekt.h
|
||||
*
|
||||
* interface to Encrypted Key Transport for SRTP
|
||||
*
|
||||
* David McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2005 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* EKT implementation strategy
|
||||
*
|
||||
* use stream_template approach
|
||||
*
|
||||
* in srtp_unprotect, when a new stream appears, check if template has
|
||||
* EKT defined, and if it does, then apply EKT processing
|
||||
*
|
||||
* question: will we want to allow key-sharing templates in addition
|
||||
* to EKT templates? could define a new ssrc_type_t that's associated
|
||||
* with an EKT, e.g. ssrc_any_ekt.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef EKT_H
|
||||
#define EKT_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "srtp_priv.h"
|
||||
|
||||
#define EKT_CIPHER_DEFAULT 1
|
||||
#define EKT_CIPHER_AES_128_ECB 1
|
||||
#define EKT_CIPHER_AES_192_KEY_WRAP 2
|
||||
#define EKT_CIPHER_AES_256_KEY_WRAP 3
|
||||
|
||||
typedef uint16_t ekt_spi_t;
|
||||
|
||||
|
||||
unsigned
|
||||
ekt_octets_after_base_tag(ekt_stream_t ekt);
|
||||
|
||||
/*
|
||||
* an srtp_policy_t structure can contain a pointer to an
|
||||
* ekt_policy_t structure
|
||||
*
|
||||
* this structure holds all of the high level EKT information, and it
|
||||
* is passed into libsrtp to indicate what policy should be in effect
|
||||
*/
|
||||
|
||||
typedef struct ekt_policy_ctx_t {
|
||||
ekt_spi_t spi; /* security parameter index */
|
||||
uint8_t ekt_cipher_type;
|
||||
uint8_t *ekt_key;
|
||||
struct ekt_policy_ctx_t *next_ekt_policy;
|
||||
} ekt_policy_ctx_t;
|
||||
|
||||
|
||||
/*
|
||||
* an ekt_data_t structure holds the data corresponding to an ekt key,
|
||||
* spi, and so on
|
||||
*/
|
||||
|
||||
typedef struct ekt_data_t {
|
||||
ekt_spi_t spi;
|
||||
uint8_t ekt_cipher_type;
|
||||
aes_expanded_key_t ekt_enc_key;
|
||||
aes_expanded_key_t ekt_dec_key;
|
||||
struct ekt_data_t *next_ekt_data;
|
||||
} ekt_data_t;
|
||||
|
||||
/*
|
||||
* an srtp_stream_ctx_t can contain an ekt_stream_ctx_t
|
||||
*
|
||||
* an ekt_stream_ctx_t structure holds all of the EKT information for
|
||||
* a specific SRTP stream
|
||||
*/
|
||||
|
||||
typedef struct ekt_stream_ctx_t {
|
||||
ekt_data_t *data;
|
||||
uint16_t isn; /* initial sequence number */
|
||||
uint8_t encrypted_master_key[SRTP_MAX_KEY_LEN];
|
||||
} ekt_stream_ctx_t;
|
||||
|
||||
|
||||
|
||||
err_status_t
|
||||
ekt_alloc(ekt_stream_t *stream_data, ekt_policy_t policy);
|
||||
|
||||
err_status_t
|
||||
ekt_stream_init(ekt_stream_t e,
|
||||
ekt_spi_t spi,
|
||||
void *ekt_key,
|
||||
unsigned ekt_cipher_type);
|
||||
|
||||
err_status_t
|
||||
ekt_stream_init_from_policy(ekt_stream_t e, ekt_policy_t p);
|
||||
|
||||
|
||||
|
||||
err_status_t
|
||||
srtp_stream_init_from_ekt(srtp_stream_t stream,
|
||||
const void *srtcp_hdr,
|
||||
unsigned pkt_octet_len);
|
||||
|
||||
|
||||
void
|
||||
ekt_write_data(ekt_stream_t ekt,
|
||||
uint8_t *base_tag,
|
||||
unsigned base_tag_len,
|
||||
int *packet_len,
|
||||
xtd_seq_num_t pkt_index);
|
||||
|
||||
/*
|
||||
* We handle EKT by performing some additional steps before
|
||||
* authentication (copying the auth tag into a temporary location,
|
||||
* zeroizing the "base tag" field in the packet)
|
||||
*
|
||||
* With EKT, the tag_len parameter is actually the base tag
|
||||
* length
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
ekt_tag_verification_preproces(uint8_t *pkt_tag,
|
||||
uint8_t *pkt_tag_copy,
|
||||
unsigned tag_len);
|
||||
|
||||
err_status_t
|
||||
ekt_tag_verification_postproces(uint8_t *pkt_tag,
|
||||
uint8_t *pkt_tag_copy,
|
||||
unsigned tag_len);
|
||||
|
||||
|
||||
/*
|
||||
* @brief EKT pre-processing for srtcp tag generation
|
||||
*
|
||||
* This function does the pre-processing of the SRTCP authentication
|
||||
* tag format. When EKT is used, it consists of writing the Encrypted
|
||||
* Master Key, the SRTP ROC, the Initial Sequence Number, and SPI
|
||||
* fields. The Base Authentication Tag field is set to the all-zero
|
||||
* value
|
||||
*
|
||||
* When EKT is not used, this function is a no-op.
|
||||
*
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
srtp_stream_srtcp_auth_tag_generation_preprocess(const srtp_stream_t *s,
|
||||
uint8_t *pkt_tag,
|
||||
unsigned pkt_octet_len);
|
||||
|
||||
/* it's not clear that a tag_generation_postprocess function is needed */
|
||||
|
||||
err_status_t
|
||||
srtcp_auth_tag_generation_postprocess(void);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* EKT_H */
|
|
@ -0,0 +1,174 @@
|
|||
/*
|
||||
* err.h
|
||||
*
|
||||
* error status codes
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ERR_H
|
||||
#define ERR_H
|
||||
|
||||
#include "datatypes.h"
|
||||
|
||||
/**
|
||||
* @defgroup Error Error Codes
|
||||
*
|
||||
* Error status codes are represented by the enumeration err_status_t.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* @brief err_status_t defines error codes.
|
||||
*
|
||||
* The enumeration err_status_t defines error codes. Note that the
|
||||
* value of err_status_ok is equal to zero, which can simplify error
|
||||
* checking somewhat.
|
||||
*
|
||||
*/
|
||||
typedef enum {
|
||||
err_status_ok = 0, /**< nothing to report */
|
||||
err_status_fail = 1, /**< unspecified failure */
|
||||
err_status_bad_param = 2, /**< unsupported parameter */
|
||||
err_status_alloc_fail = 3, /**< couldn't allocate memory */
|
||||
err_status_dealloc_fail = 4, /**< couldn't deallocate properly */
|
||||
err_status_init_fail = 5, /**< couldn't initialize */
|
||||
err_status_terminus = 6, /**< can't process as much data as requested */
|
||||
err_status_auth_fail = 7, /**< authentication failure */
|
||||
err_status_cipher_fail = 8, /**< cipher failure */
|
||||
err_status_replay_fail = 9, /**< replay check failed (bad index) */
|
||||
err_status_replay_old = 10, /**< replay check failed (index too old) */
|
||||
err_status_algo_fail = 11, /**< algorithm failed test routine */
|
||||
err_status_no_such_op = 12, /**< unsupported operation */
|
||||
err_status_no_ctx = 13, /**< no appropriate context found */
|
||||
err_status_cant_check = 14, /**< unable to perform desired validation */
|
||||
err_status_key_expired = 15, /**< can't use key any more */
|
||||
err_status_socket_err = 16, /**< error in use of socket */
|
||||
err_status_signal_err = 17, /**< error in use POSIX signals */
|
||||
err_status_nonce_bad = 18, /**< nonce check failed */
|
||||
err_status_read_fail = 19, /**< couldn't read data */
|
||||
err_status_write_fail = 20, /**< couldn't write data */
|
||||
err_status_parse_err = 21, /**< error pasring data */
|
||||
err_status_encode_err = 22, /**< error encoding data */
|
||||
err_status_semaphore_err = 23,/**< error while using semaphores */
|
||||
err_status_pfkey_err = 24 /**< error while using pfkey */
|
||||
} err_status_t;
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
err_level_emergency = 0,
|
||||
err_level_alert,
|
||||
err_level_critical,
|
||||
err_level_error,
|
||||
err_level_warning,
|
||||
err_level_notice,
|
||||
err_level_info,
|
||||
err_level_debug,
|
||||
err_level_none
|
||||
} err_reporting_level_t;
|
||||
|
||||
/*
|
||||
* err_reporting_init prepares the error system. If
|
||||
* ERR_REPORTING_SYSLOG is defined, it will open syslog.
|
||||
*
|
||||
* The ident argument is a string that will be prepended to
|
||||
* all syslog messages. It is conventionally argv[0].
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
err_reporting_init(char *ident);
|
||||
|
||||
#ifdef SRTP_KERNEL_LINUX
|
||||
extern err_reporting_level_t err_level;
|
||||
#else
|
||||
|
||||
/*
|
||||
* keydaemon_report_error reports a 'printf' formatted error
|
||||
* string, followed by a an arg list. The priority argument
|
||||
* is equivalent to that defined for syslog.
|
||||
*
|
||||
* Errors will be reported to ERR_REPORTING_FILE, if defined, and to
|
||||
* syslog, if ERR_REPORTING_SYSLOG is defined.
|
||||
*
|
||||
*/
|
||||
|
||||
void
|
||||
err_report(int priority, char *format, ...);
|
||||
#endif /* ! SRTP_KERNEL_LINUX */
|
||||
|
||||
|
||||
/*
|
||||
* debug_module_t defines a debug module
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
int on; /* 1 if debugging is on, 0 if it is off */
|
||||
char *name; /* printable name for debug module */
|
||||
} debug_module_t;
|
||||
|
||||
#ifdef ENABLE_DEBUGGING
|
||||
|
||||
#define debug_on(mod) (mod).on = 1
|
||||
|
||||
#define debug_off(mod) (mod).on = 0
|
||||
|
||||
/* use err_report() to report debug message */
|
||||
#define debug_print(mod, format, arg) \
|
||||
if (mod.on) err_report(err_level_debug, ("%s: " format "\n"), mod.name, arg)
|
||||
#define debug_print2(mod, format, arg1,arg2) \
|
||||
if (mod.on) err_report(err_level_debug, ("%s: " format "\n"), mod.name, arg1,arg2)
|
||||
|
||||
#else
|
||||
|
||||
/* define macros to do nothing */
|
||||
#define debug_print(mod, format, arg)
|
||||
|
||||
#define debug_on(mod)
|
||||
|
||||
#define debug_off(mod)
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* ERR_H */
|
|
@ -0,0 +1,60 @@
|
|||
/*
|
||||
* getopt.h
|
||||
*
|
||||
* interface to a minimal implementation of the getopt() function,
|
||||
* written so that test applications that use that function can run on
|
||||
* non-POSIX platforms
|
||||
*
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GETOPT_S_H
|
||||
#define GETOPT_S_H
|
||||
|
||||
/*
|
||||
* getopt_s(), optarg_s, and optind_s are small, locally defined
|
||||
* versions of the POSIX standard getopt() interface.
|
||||
*/
|
||||
|
||||
int
|
||||
getopt_s(int argc, char * const argv[], const char *optstring);
|
||||
|
||||
extern char *optarg_s; /* defined in getopt.c */
|
||||
|
||||
extern int optind_s; /* defined in getopt.c */
|
||||
|
||||
#endif /* GETOPT_S_H */
|
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
* gf2_8.h
|
||||
*
|
||||
* GF(256) implementation
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef GF2_8_H
|
||||
#define GF2_8_H
|
||||
|
||||
#include "datatypes.h" /* for uint8_t definition */
|
||||
|
||||
typedef uint8_t gf2_8;
|
||||
|
||||
#define gf2_8_field_polynomial 0x1B
|
||||
|
||||
/*
|
||||
* gf2_8_shift(x) returns
|
||||
*/
|
||||
|
||||
/*
|
||||
* gf2_8_shift(z) returns the result of the GF(2^8) 'multiply by x'
|
||||
* operation, using the field representation from AES; that is, the
|
||||
* next gf2_8 value in the cyclic representation of that field. The
|
||||
* value z should be an uint8_t.
|
||||
*/
|
||||
|
||||
#define gf2_8_shift(z) (((z) & 128) ? \
|
||||
(((z) << 1) ^ gf2_8_field_polynomial) : ((z) << 1))
|
||||
|
||||
gf2_8
|
||||
gf2_8_compute_inverse(gf2_8 x);
|
||||
|
||||
void
|
||||
test_gf2_8(void);
|
||||
|
||||
gf2_8
|
||||
gf2_8_multiply(gf2_8 x, gf2_8 y);
|
||||
|
||||
#endif /* GF2_8_H */
|
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
* hmac.h
|
||||
*
|
||||
* interface to hmac auth_type_t
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef HMAC_H
|
||||
#define HMAC_H
|
||||
|
||||
#include "auth.h"
|
||||
#include "sha1.h"
|
||||
|
||||
typedef struct {
|
||||
uint8_t opad[64];
|
||||
sha1_ctx_t ctx;
|
||||
sha1_ctx_t init_ctx;
|
||||
} hmac_ctx_t;
|
||||
|
||||
err_status_t
|
||||
hmac_alloc(auth_t **a, int key_len, int out_len);
|
||||
|
||||
err_status_t
|
||||
hmac_dealloc(auth_t *a);
|
||||
|
||||
err_status_t
|
||||
hmac_init(hmac_ctx_t *state, const uint8_t *key, int key_len);
|
||||
|
||||
err_status_t
|
||||
hmac_start(hmac_ctx_t *state);
|
||||
|
||||
err_status_t
|
||||
hmac_update(hmac_ctx_t *state, const uint8_t *message, int msg_octets);
|
||||
|
||||
err_status_t
|
||||
hmac_compute(hmac_ctx_t *state, const void *message,
|
||||
int msg_octets, int tag_len, uint8_t *result);
|
||||
|
||||
|
||||
#endif /* HMAC_H */
|
|
@ -0,0 +1,147 @@
|
|||
/*
|
||||
* integers.h
|
||||
*
|
||||
* defines integer types (or refers to their definitions)
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef INTEGERS_H
|
||||
#define INTEGERS_H
|
||||
|
||||
#include "config.h" /* configuration file, using autoconf */
|
||||
|
||||
#ifdef SRTP_KERNEL
|
||||
|
||||
#include "kernel_compat.h"
|
||||
|
||||
#else /* SRTP_KERNEL */
|
||||
|
||||
/* use standard integer definitions, if they're available */
|
||||
#ifdef HAVE_STDLIB_H
|
||||
# include <stdlib.h>
|
||||
#endif
|
||||
#ifdef HAVE_STDINT_H
|
||||
# include <stdint.h>
|
||||
#endif
|
||||
#ifdef HAVE_INTTYPES_H
|
||||
# include <inttypes.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
# include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_INT_TYPES_H
|
||||
# include <sys/int_types.h> /* this exists on Sun OS */
|
||||
#endif
|
||||
#ifdef HAVE_MACHINE_TYPES_H
|
||||
# include <machine/types.h>
|
||||
#endif
|
||||
|
||||
/* Can we do 64 bit integers? */
|
||||
#ifndef HAVE_UINT64_T
|
||||
# if SIZEOF_UNSIGNED_LONG == 8
|
||||
typedef unsigned long uint64_t;
|
||||
# elif SIZEOF_UNSIGNED_LONG_LONG == 8
|
||||
typedef unsigned long long uint64_t;
|
||||
# else
|
||||
# define NO_64BIT_MATH 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Reasonable defaults for 32 bit machines - you may need to
|
||||
* edit these definitions for your own machine. */
|
||||
#ifndef HAVE_UINT8_T
|
||||
typedef unsigned char uint8_t;
|
||||
#endif
|
||||
#ifndef HAVE_UINT16_T
|
||||
typedef unsigned short int uint16_t;
|
||||
#endif
|
||||
#ifndef HAVE_UINT32_T
|
||||
typedef unsigned int uint32_t;
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef NO_64BIT_MATH
|
||||
typedef double uint64_t;
|
||||
/* assert that sizeof(double) == 8 */
|
||||
extern uint64_t make64(uint32_t high, uint32_t low);
|
||||
extern uint32_t high32(uint64_t value);
|
||||
extern uint32_t low32(uint64_t value);
|
||||
#endif
|
||||
|
||||
#endif /* SRTP_KERNEL */
|
||||
|
||||
/* These macros are to load and store 32-bit values from un-aligned
|
||||
addresses. This is required for processors that do not allow unaligned
|
||||
loads. */
|
||||
#ifdef ALIGNMENT_32BIT_REQUIRED
|
||||
/* Note that if it's in a variable, you can memcpy it */
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
#define PUT_32(addr,value) \
|
||||
{ \
|
||||
((unsigned char *) (addr))[0] = (value >> 24); \
|
||||
((unsigned char *) (addr))[1] = (value >> 16) & 0xff; \
|
||||
((unsigned char *) (addr))[2] = (value >> 8) & 0xff; \
|
||||
((unsigned char *) (addr))[3] = (value) & 0xff; \
|
||||
}
|
||||
#define GET_32(addr) ((((unsigned char *) (addr))[0] << 24) | \
|
||||
(((unsigned char *) (addr))[1] << 16) | \
|
||||
(((unsigned char *) (addr))[2] << 8) | \
|
||||
(((unsigned char *) (addr))[3]))
|
||||
#else
|
||||
#define PUT_32(addr,value) \
|
||||
{ \
|
||||
((unsigned char *) (addr))[3] = (value >> 24); \
|
||||
((unsigned char *) (addr))[2] = (value >> 16) & 0xff; \
|
||||
((unsigned char *) (addr))[1] = (value >> 8) & 0xff; \
|
||||
((unsigned char *) (addr))[0] = (value) & 0xff; \
|
||||
}
|
||||
#define GET_32(addr) ((((unsigned char *) (addr))[3] << 24) | \
|
||||
(((unsigned char *) (addr))[2] << 16) | \
|
||||
(((unsigned char *) (addr))[1] << 8) | \
|
||||
(((unsigned char *) (addr))[0]))
|
||||
#endif // WORDS_BIGENDIAN
|
||||
#else
|
||||
#define PUT_32(addr,value) *(((uint32_t *) (addr)) = (value)
|
||||
#define GET_32(addr) (*(((uint32_t *) (addr)))
|
||||
#endif
|
||||
|
||||
#endif /* INTEGERS_H */
|
|
@ -0,0 +1,84 @@
|
|||
/*
|
||||
* kernel_compat.h
|
||||
*
|
||||
* Compatibility stuff for building in kernel context where standard
|
||||
* C headers and library are not available.
|
||||
*
|
||||
* Marcus Sundberg
|
||||
* Ingate Systems AB
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright(c) 2005 Ingate Systems AB
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the author(s) nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef KERNEL_COMPAT_H
|
||||
#define KERNEL_COMPAT_H
|
||||
|
||||
#ifdef SRTP_KERNEL_LINUX
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
|
||||
|
||||
#define err_report(priority, ...) \
|
||||
do {\
|
||||
if (priority <= err_level) {\
|
||||
printk(__VA_ARGS__);\
|
||||
}\
|
||||
}while(0)
|
||||
|
||||
#define clock() (jiffies)
|
||||
#define time(x) (jiffies)
|
||||
|
||||
/* rand() implementation. */
|
||||
#define RAND_MAX 32767
|
||||
|
||||
static inline int rand(void)
|
||||
{
|
||||
uint32_t temp;
|
||||
get_random_bytes(&temp, sizeof(temp));
|
||||
return temp % (RAND_MAX+1);
|
||||
}
|
||||
|
||||
/* stdio/stdlib implementation. */
|
||||
#define printf(...) printk(__VA_ARGS__)
|
||||
#define exit(n) panic("%s:%d: exit(%d)\n", __FILE__, __LINE__, (n))
|
||||
|
||||
#endif /* SRTP_KERNEL_LINUX */
|
||||
|
||||
#endif /* KERNEL_COMPAT_H */
|
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
* key.h
|
||||
*
|
||||
* key usage limits enforcement
|
||||
*
|
||||
* David A. Mcgrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef KEY_H
|
||||
#define KEY_H
|
||||
|
||||
#include "rdbx.h" /* for xtd_seq_num_t */
|
||||
#include "err.h"
|
||||
|
||||
typedef struct key_limit_ctx_t *key_limit_t;
|
||||
|
||||
typedef enum {
|
||||
key_event_normal,
|
||||
key_event_soft_limit,
|
||||
key_event_hard_limit
|
||||
} key_event_t;
|
||||
|
||||
err_status_t
|
||||
key_limit_set(key_limit_t key, const xtd_seq_num_t s);
|
||||
|
||||
err_status_t
|
||||
key_limit_clone(key_limit_t original, key_limit_t *new_key);
|
||||
|
||||
err_status_t
|
||||
key_limit_check(const key_limit_t key);
|
||||
|
||||
key_event_t
|
||||
key_limit_update(key_limit_t key);
|
||||
|
||||
typedef enum {
|
||||
key_state_normal,
|
||||
key_state_past_soft_limit,
|
||||
key_state_expired
|
||||
} key_state_t;
|
||||
|
||||
typedef struct key_limit_ctx_t {
|
||||
xtd_seq_num_t num_left;
|
||||
key_state_t state;
|
||||
} key_limit_ctx_t;
|
||||
|
||||
#endif /* KEY_H */
|
|
@ -0,0 +1,68 @@
|
|||
/*
|
||||
* null-auth.h
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef NULL_AUTH_H
|
||||
#define NULL_AUTH_H
|
||||
|
||||
#include "auth.h"
|
||||
|
||||
typedef struct {
|
||||
char foo;
|
||||
} null_auth_ctx_t;
|
||||
|
||||
err_status_t
|
||||
null_auth_alloc(auth_t **a, int key_len, int out_len);
|
||||
|
||||
err_status_t
|
||||
null_auth_dealloc(auth_t *a);
|
||||
|
||||
err_status_t
|
||||
null_auth_init(null_auth_ctx_t *state, const uint8_t *key, int key_len);
|
||||
|
||||
err_status_t
|
||||
null_auth_compute (null_auth_ctx_t *state, uint8_t *message,
|
||||
int msg_octets, int tag_len, uint8_t *result);
|
||||
|
||||
|
||||
#endif /* NULL_AUTH_H */
|
|
@ -0,0 +1,80 @@
|
|||
/*
|
||||
* null-cipher.h
|
||||
*
|
||||
* header file for the null cipher
|
||||
*
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef NULL_CIPHER_H
|
||||
#define NULL_CIPHER_H
|
||||
|
||||
#include "datatypes.h"
|
||||
#include "cipher.h"
|
||||
|
||||
typedef struct {
|
||||
char foo ;/* empty, for now */
|
||||
} null_cipher_ctx_t;
|
||||
|
||||
|
||||
/*
|
||||
* none of these functions do anything (though future versions may keep
|
||||
* track of bytes encrypted, number of instances, and/or other info).
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
null_cipher_init(null_cipher_ctx_t *c, const uint8_t *key, int key_len);
|
||||
|
||||
err_status_t
|
||||
null_cipher_set_segment(null_cipher_ctx_t *c,
|
||||
unsigned long segment_index);
|
||||
|
||||
err_status_t
|
||||
null_cipher_encrypt(null_cipher_ctx_t *c,
|
||||
unsigned char *buf, unsigned int *bytes_to_encr);
|
||||
|
||||
|
||||
err_status_t
|
||||
null_cipher_encrypt_aligned(null_cipher_ctx_t *c,
|
||||
unsigned char *buf, int bytes_to_encr);
|
||||
|
||||
#endif /* NULL_CIPHER_H */
|
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* prng.h
|
||||
*
|
||||
* pseudorandom source
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
#ifndef PRNG_H
|
||||
#define PRNG_H
|
||||
|
||||
#include "rand_source.h" /* for rand_source_func_t definition */
|
||||
#include "aes.h" /* for aes */
|
||||
#include "aes_icm.h" /* for aes ctr */
|
||||
|
||||
#define MAX_PRNG_OUT_LEN 0xffffffffU
|
||||
|
||||
/*
|
||||
* x917_prng is an ANSI X9.17-like AES-based PRNG
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
v128_t state; /* state data */
|
||||
aes_expanded_key_t key; /* secret key */
|
||||
uint32_t octet_count; /* number of octets output since last init */
|
||||
rand_source_func_t rand; /* random source for re-initialization */
|
||||
} x917_prng_t;
|
||||
|
||||
err_status_t
|
||||
x917_prng_init(rand_source_func_t random_source);
|
||||
|
||||
err_status_t
|
||||
x917_prng_get_octet_string(uint8_t *dest, uint32_t len);
|
||||
|
||||
|
||||
/*
|
||||
* ctr_prng is an AES-CTR based PRNG
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
uint32_t octet_count; /* number of octets output since last init */
|
||||
aes_icm_ctx_t state; /* state data */
|
||||
rand_source_func_t rand; /* random source for re-initialization */
|
||||
} ctr_prng_t;
|
||||
|
||||
err_status_t
|
||||
ctr_prng_init(rand_source_func_t random_source);
|
||||
|
||||
err_status_t
|
||||
ctr_prng_get_octet_string(void *dest, uint32_t len);
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1,91 @@
|
|||
/*
|
||||
* rand_source.h
|
||||
*
|
||||
* implements a random source based on /dev/random
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright(c) 2001-2006 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef RAND_SOURCE
|
||||
#define RAND_SOURCE
|
||||
|
||||
#include "err.h"
|
||||
#include "datatypes.h"
|
||||
|
||||
err_status_t
|
||||
rand_source_init(void);
|
||||
|
||||
/*
|
||||
* rand_source_get_octet_string() writes a random octet string.
|
||||
*
|
||||
* The function call rand_source_get_octet_string(dest, len) writes
|
||||
* len octets of random data to the location to which dest points,
|
||||
* and returns an error code. This error code should be checked,
|
||||
* and if a failure is reported, the data in the buffer MUST NOT
|
||||
* be used.
|
||||
*
|
||||
* warning: If the return code is not checked, then non-random
|
||||
* data may inadvertently be used.
|
||||
*
|
||||
* returns:
|
||||
* - err_status_ok if no problems occured.
|
||||
* - [other] a problem occured, and no assumptions should
|
||||
* be made about the contents of the destination
|
||||
* buffer.
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
rand_source_get_octet_string(void *dest, uint32_t length);
|
||||
|
||||
err_status_t
|
||||
rand_source_deinit(void);
|
||||
|
||||
/*
|
||||
* function prototype for a random source function
|
||||
*
|
||||
* A rand_source_func_t writes num_octets at the location indicated by
|
||||
* dest and returns err_status_ok. Any other return value indicates
|
||||
* failure.
|
||||
*/
|
||||
|
||||
typedef err_status_t (*rand_source_func_t)
|
||||
(void *dest, uint32_t num_octets);
|
||||
|
||||
#endif /* RAND_SOURCE */
|
|
@ -0,0 +1,94 @@
|
|||
/*
|
||||
* replay-database.h
|
||||
*
|
||||
* interface for a replay database for packet security
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef REPLAY_DB_H
|
||||
#define REPLAY_DB_H
|
||||
|
||||
#include "integers.h" /* for uint32_t */
|
||||
#include "datatypes.h" /* for v128_t */
|
||||
#include "err.h" /* for err_status_t */
|
||||
|
||||
/*
|
||||
* if the ith least significant bit is one, then the packet index
|
||||
* window_end-i is in the database
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
uint32_t window_start; /* packet index of the first bit in bitmask */
|
||||
v128_t bitmask;
|
||||
} rdb_t;
|
||||
|
||||
#define rdb_bits_in_bitmask (8*sizeof(v128_t))
|
||||
|
||||
/*
|
||||
* rdb init
|
||||
*
|
||||
* initalizes rdb
|
||||
*
|
||||
* returns err_status_ok on success, err_status_t_fail otherwise
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
rdb_init(rdb_t *rdb);
|
||||
|
||||
|
||||
/*
|
||||
* rdb_check
|
||||
*
|
||||
* checks to see if index appears in rdb
|
||||
*
|
||||
* returns err_status_fail if the index already appears in rdb,
|
||||
* returns err_status_ok otherwise
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
rdb_check(const rdb_t *rdb, uint32_t rdb_index);
|
||||
|
||||
/*
|
||||
* rdb_add_index
|
||||
*
|
||||
* adds index to rdb_t (and does *not* check if index appears in db)
|
||||
*
|
||||
* returns err_status_ok on success, err_status_fail otherwise
|
||||
*
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
rdb_add_index(rdb_t *rdb, uint32_t rdb_index);
|
||||
|
||||
/*
|
||||
* the functions rdb_increment() and rdb_get_value() are for use by
|
||||
* senders, not receivers - DO NOT use these functions on the same
|
||||
* rdb_t upon which rdb_add_index is used!
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* rdb_increment(db) increments the sequence number in db, if it is
|
||||
* not too high
|
||||
*
|
||||
* return values:
|
||||
*
|
||||
* err_status_ok no problem
|
||||
* err_status_key_expired sequence number too high
|
||||
*
|
||||
*/
|
||||
err_status_t
|
||||
rdb_increment(rdb_t *rdb);
|
||||
|
||||
/*
|
||||
* rdb_get_value(db) returns the current sequence number of db
|
||||
*/
|
||||
|
||||
uint32_t
|
||||
rdb_get_value(const rdb_t *rdb);
|
||||
|
||||
|
||||
#endif /* REPLAY_DB_H */
|
|
@ -0,0 +1,186 @@
|
|||
/*
|
||||
* rdbx.h
|
||||
*
|
||||
* replay database with extended packet indices, using a rollover counter
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef RDBX_H
|
||||
#define RDBX_H
|
||||
|
||||
#include "datatypes.h"
|
||||
#include "err.h"
|
||||
|
||||
/* #define ROC_TEST */
|
||||
|
||||
#ifndef ROC_TEST
|
||||
|
||||
typedef uint16_t sequence_number_t; /* 16 bit sequence number */
|
||||
typedef uint32_t rollover_counter_t; /* 32 bit rollover counter */
|
||||
|
||||
#else /* use small seq_num and roc datatypes for testing purposes */
|
||||
|
||||
typedef unsigned char sequence_number_t; /* 8 bit sequence number */
|
||||
typedef uint16_t rollover_counter_t; /* 16 bit rollover counter */
|
||||
|
||||
#endif
|
||||
|
||||
#define seq_num_median (1 << (8*sizeof(sequence_number_t) - 1))
|
||||
#define seq_num_max (1 << (8*sizeof(sequence_number_t)))
|
||||
|
||||
/*
|
||||
* An xtd_seq_num_t is a 64-bit unsigned integer used as an 'extended'
|
||||
* sequence number.
|
||||
*/
|
||||
|
||||
typedef uint64_t xtd_seq_num_t;
|
||||
|
||||
|
||||
/*
|
||||
* An rdbx_t is a replay database with extended range; it uses an
|
||||
* xtd_seq_num_t and a bitmask of recently received indices.
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
xtd_seq_num_t index;
|
||||
bitvector_t bitmask;
|
||||
} rdbx_t;
|
||||
|
||||
|
||||
/*
|
||||
* rdbx_init(rdbx_ptr, ws)
|
||||
*
|
||||
* initializes the rdbx pointed to by its argument with the window size ws,
|
||||
* setting the rollover counter and sequence number to zero
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
rdbx_init(rdbx_t *rdbx, unsigned long ws);
|
||||
|
||||
|
||||
/*
|
||||
* rdbx_dealloc(rdbx_ptr)
|
||||
*
|
||||
* frees memory associated with the rdbx
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
rdbx_dealloc(rdbx_t *rdbx);
|
||||
|
||||
|
||||
/*
|
||||
* rdbx_estimate_index(rdbx, guess, s)
|
||||
*
|
||||
* given an rdbx and a sequence number s (from a newly arrived packet),
|
||||
* sets the contents of *guess to contain the best guess of the packet
|
||||
* index to which s corresponds, and returns the difference between
|
||||
* *guess and the locally stored synch info
|
||||
*/
|
||||
|
||||
int
|
||||
rdbx_estimate_index(const rdbx_t *rdbx,
|
||||
xtd_seq_num_t *guess,
|
||||
sequence_number_t s);
|
||||
|
||||
/*
|
||||
* rdbx_check(rdbx, delta);
|
||||
*
|
||||
* rdbx_check(&r, delta) checks to see if the xtd_seq_num_t
|
||||
* which is at rdbx->window_start + delta is in the rdb
|
||||
*
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
rdbx_check(const rdbx_t *rdbx, int difference);
|
||||
|
||||
/*
|
||||
* replay_add_index(rdbx, delta)
|
||||
*
|
||||
* adds the xtd_seq_num_t at rdbx->window_start + delta to replay_db
|
||||
* (and does *not* check if that xtd_seq_num_t appears in db)
|
||||
*
|
||||
* this function should be called *only* after replay_check has
|
||||
* indicated that the index does not appear in the rdbx, and a mutex
|
||||
* should protect the rdbx between these calls if necessary.
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
rdbx_add_index(rdbx_t *rdbx, int delta);
|
||||
|
||||
|
||||
/*
|
||||
* rdbx_set_roc(rdbx, roc) initalizes the rdbx_t at the location rdbx
|
||||
* to have the rollover counter value roc. If that value is less than
|
||||
* the current rollover counter value, then the function returns
|
||||
* err_status_replay_old; otherwise, err_status_ok is returned.
|
||||
*
|
||||
*/
|
||||
|
||||
err_status_t
|
||||
rdbx_set_roc(rdbx_t *rdbx, uint32_t roc);
|
||||
|
||||
/*
|
||||
* rdbx_get_roc(rdbx) returns the value of the rollover counter for
|
||||
* the rdbx_t pointed to by rdbx
|
||||
*
|
||||
*/
|
||||
|
||||
xtd_seq_num_t
|
||||
rdbx_get_packet_index(const rdbx_t *rdbx);
|
||||
|
||||
/*
|
||||
* xtd_seq_num_t functions - these are *internal* functions of rdbx, and
|
||||
* shouldn't be used to manipulate rdbx internal values. use the rdbx
|
||||
* api instead!
|
||||
*/
|
||||
|
||||
/*
|
||||
* rdbx_get_ws(rdbx_ptr)
|
||||
*
|
||||
* gets the window size which was used to initialize the rdbx
|
||||
*/
|
||||
|
||||
unsigned long
|
||||
rdbx_get_window_size(const rdbx_t *rdbx);
|
||||
|
||||
|
||||
/* index_init(&pi) initializes a packet index pi (sets it to zero) */
|
||||
|
||||
void
|
||||
index_init(xtd_seq_num_t *pi);
|
||||
|
||||
/* index_advance(&pi, s) advances a xtd_seq_num_t forward by s */
|
||||
|
||||
void
|
||||
index_advance(xtd_seq_num_t *pi, sequence_number_t s);
|
||||
|
||||
|
||||
/*
|
||||
* index_guess(local, guess, s)
|
||||
*
|
||||
* given a xtd_seq_num_t local (which represents the highest
|
||||
* known-to-be-good index) and a sequence number s (from a newly
|
||||
* arrived packet), sets the contents of *guess to contain the best
|
||||
* guess of the packet index to which s corresponds, and returns the
|
||||
* difference between *guess and *local
|
||||
*/
|
||||
|
||||
int
|
||||
index_guess(const xtd_seq_num_t *local,
|
||||
xtd_seq_num_t *guess,
|
||||
sequence_number_t s);
|
||||
|
||||
|
||||
#endif /* RDBX_H */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,139 @@
|
|||
/*
|
||||
* rtp.h
|
||||
*
|
||||
* rtp interface for srtp reference implementation
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*
|
||||
* data types:
|
||||
*
|
||||
* rtp_msg_t an rtp message (the data that goes on the wire)
|
||||
* rtp_sender_t sender side socket and rtp info
|
||||
* rtp_receiver_t receiver side socket and rtp info
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef RTP_H
|
||||
#define RTP_H
|
||||
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
# include <netinet/in.h>
|
||||
#elif defined HAVE_WINSOCK2_H
|
||||
# include <winsock2.h>
|
||||
#endif
|
||||
|
||||
#include "srtp.h"
|
||||
|
||||
typedef struct rtp_sender_ctx_t *rtp_sender_t;
|
||||
|
||||
typedef struct rtp_receiver_ctx_t *rtp_receiver_t;
|
||||
|
||||
int
|
||||
rtp_sendto(rtp_sender_t sender, const void* msg, int len);
|
||||
|
||||
int
|
||||
rtp_recvfrom(rtp_receiver_t receiver, void *msg, int *len);
|
||||
|
||||
int
|
||||
rtp_receiver_init(rtp_receiver_t rcvr, int sock,
|
||||
struct sockaddr_in addr, unsigned int ssrc);
|
||||
|
||||
int
|
||||
rtp_sender_init(rtp_sender_t sender, int sock,
|
||||
struct sockaddr_in addr, unsigned int ssrc);
|
||||
|
||||
/*
|
||||
* srtp_sender_init(...) initializes an rtp_sender_t
|
||||
*/
|
||||
|
||||
int
|
||||
srtp_sender_init(rtp_sender_t rtp_ctx, /* structure to be init'ed */
|
||||
struct sockaddr_in name, /* socket name */
|
||||
sec_serv_t security_services, /* sec. servs. to be used */
|
||||
unsigned char *input_key /* master key/salt in hex */
|
||||
);
|
||||
|
||||
int
|
||||
srtp_receiver_init(rtp_receiver_t rtp_ctx, /* structure to be init'ed */
|
||||
struct sockaddr_in name, /* socket name */
|
||||
sec_serv_t security_services, /* sec. servs. to be used */
|
||||
unsigned char *input_key /* master key/salt in hex */
|
||||
);
|
||||
|
||||
|
||||
int
|
||||
rtp_sender_init_srtp(rtp_sender_t sender, const srtp_policy_t *policy);
|
||||
|
||||
int
|
||||
rtp_sender_deinit_srtp(rtp_sender_t sender);
|
||||
|
||||
int
|
||||
rtp_receiver_init_srtp(rtp_receiver_t sender, const srtp_policy_t *policy);
|
||||
|
||||
int
|
||||
rtp_receiver_deinit_srtp(rtp_receiver_t sender);
|
||||
|
||||
|
||||
rtp_sender_t
|
||||
rtp_sender_alloc(void);
|
||||
|
||||
void
|
||||
rtp_sender_dealloc(rtp_sender_t rtp_ctx);
|
||||
|
||||
rtp_receiver_t
|
||||
rtp_receiver_alloc(void);
|
||||
|
||||
void
|
||||
rtp_receiver_dealloc(rtp_receiver_t rtp_ctx);
|
||||
|
||||
|
||||
/*
|
||||
* RTP_HEADER_LEN indicates the size of an RTP header
|
||||
*/
|
||||
#define RTP_HEADER_LEN 12
|
||||
|
||||
/*
|
||||
* RTP_MAX_BUF_LEN defines the largest RTP packet in the rtp.c implementation
|
||||
*/
|
||||
#define RTP_MAX_BUF_LEN 16384
|
||||
|
||||
|
||||
#endif /* RTP_H */
|
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
* rtp_priv.h
|
||||
*
|
||||
* private, internal header file for RTP
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef RTP_PRIV_H
|
||||
#define RTP_PRIV_H
|
||||
|
||||
#include "srtp_priv.h"
|
||||
#include "rtp.h"
|
||||
|
||||
typedef srtp_hdr_t rtp_hdr_t;
|
||||
|
||||
typedef struct {
|
||||
srtp_hdr_t header;
|
||||
char body[RTP_MAX_BUF_LEN];
|
||||
} rtp_msg_t;
|
||||
|
||||
typedef struct rtp_sender_ctx_t {
|
||||
rtp_msg_t message;
|
||||
int socket;
|
||||
srtp_ctx_t *srtp_ctx;
|
||||
struct sockaddr_in addr; /* reciever's address */
|
||||
} rtp_sender_ctx_t;
|
||||
|
||||
typedef struct rtp_receiver_ctx_t {
|
||||
rtp_msg_t message;
|
||||
int socket;
|
||||
srtp_ctx_t *srtp_ctx;
|
||||
struct sockaddr_in addr; /* receiver's address */
|
||||
} rtp_receiver_ctx_t;
|
||||
|
||||
|
||||
#endif /* RTP_PRIV_H */
|
|
@ -0,0 +1,108 @@
|
|||
/*
|
||||
* sha1.h
|
||||
*
|
||||
* interface to the Secure Hash Algorithm v.1 (SHA-1), specified in
|
||||
* FIPS 180-1
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SHA1_H
|
||||
#define SHA1_H
|
||||
|
||||
#include "err.h"
|
||||
#include "datatypes.h"
|
||||
|
||||
typedef struct {
|
||||
uint32_t H[5]; /* state vector */
|
||||
uint32_t M[16]; /* message buffer */
|
||||
int octets_in_buffer; /* octets of message in buffer */
|
||||
uint32_t num_bits_in_msg; /* total number of bits in message */
|
||||
} sha1_ctx_t;
|
||||
|
||||
/*
|
||||
* sha1(&ctx, msg, len, output) hashes the len octets starting at msg
|
||||
* into the SHA1 context, then writes the result to the 20 octets at
|
||||
* output
|
||||
*
|
||||
*/
|
||||
|
||||
void
|
||||
sha1(const uint8_t *message, int octets_in_msg, uint32_t output[5]);
|
||||
|
||||
/*
|
||||
* sha1_init(&ctx) initializes the SHA1 context ctx
|
||||
*
|
||||
* sha1_update(&ctx, msg, len) hashes the len octets starting at msg
|
||||
* into the SHA1 context
|
||||
*
|
||||
* sha1_final(&ctx, output) performs the final processing of the SHA1
|
||||
* context and writes the result to the 20 octets at output
|
||||
*
|
||||
*/
|
||||
|
||||
void
|
||||
sha1_init(sha1_ctx_t *ctx);
|
||||
|
||||
void
|
||||
sha1_update(sha1_ctx_t *ctx, const uint8_t *M, int octets_in_msg);
|
||||
|
||||
void
|
||||
sha1_final(sha1_ctx_t *ctx, uint32_t output[5]);
|
||||
|
||||
/*
|
||||
* The sha1_core function is INTERNAL to SHA-1, but it is declared
|
||||
* here because it is also used by the cipher SEAL 3.0 in its key
|
||||
* setup algorithm.
|
||||
*/
|
||||
|
||||
/*
|
||||
* sha1_core(M, H) computes the core sha1 compression function, where M is
|
||||
* the next part of the message and H is the intermediate state {H0,
|
||||
* H1, ...}
|
||||
*
|
||||
* this function does not do any of the padding required in the
|
||||
* complete sha1 function
|
||||
*/
|
||||
|
||||
void
|
||||
sha1_core(const uint32_t M[16], uint32_t hash_value[5]);
|
||||
|
||||
#endif /* SHA1_H */
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,256 @@
|
|||
/*
|
||||
* srtp_priv.h
|
||||
*
|
||||
* private internal data structures and functions for libSRTP
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006 Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SRTP_PRIV_H
|
||||
#define SRTP_PRIV_H
|
||||
|
||||
#include "srtp.h"
|
||||
#include "rdbx.h"
|
||||
#include "rdb.h"
|
||||
#include "integers.h"
|
||||
|
||||
/*
|
||||
* an srtp_hdr_t represents the srtp header
|
||||
*
|
||||
* in this implementation, an srtp_hdr_t is assumed to be 32-bit aligned
|
||||
*
|
||||
* (note that this definition follows that of RFC 1889 Appendix A, but
|
||||
* is not identical)
|
||||
*/
|
||||
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
|
||||
/*
|
||||
* srtp_hdr_t represents an RTP or SRTP header. The bit-fields in
|
||||
* this structure should be declared "unsigned int" instead of
|
||||
* "unsigned char", but doing so causes the MS compiler to not
|
||||
* fully pack the bit fields.
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
unsigned char cc:4; /* CSRC count */
|
||||
unsigned char x:1; /* header extension flag */
|
||||
unsigned char p:1; /* padding flag */
|
||||
unsigned char version:2; /* protocol version */
|
||||
unsigned char pt:7; /* payload type */
|
||||
unsigned char m:1; /* marker bit */
|
||||
uint16_t seq; /* sequence number */
|
||||
uint32_t ts; /* timestamp */
|
||||
uint32_t ssrc; /* synchronization source */
|
||||
} srtp_hdr_t;
|
||||
|
||||
#else /* BIG_ENDIAN */
|
||||
|
||||
typedef struct {
|
||||
unsigned char version:2; /* protocol version */
|
||||
unsigned char p:1; /* padding flag */
|
||||
unsigned char x:1; /* header extension flag */
|
||||
unsigned char cc:4; /* CSRC count */
|
||||
unsigned char m:1; /* marker bit */
|
||||
unsigned pt:7; /* payload type */
|
||||
uint16_t seq; /* sequence number */
|
||||
uint32_t ts; /* timestamp */
|
||||
uint32_t ssrc; /* synchronization source */
|
||||
} srtp_hdr_t;
|
||||
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
uint16_t profile_specific; /* profile-specific info */
|
||||
uint16_t length; /* number of 32-bit words in extension */
|
||||
} srtp_hdr_xtnd_t;
|
||||
|
||||
|
||||
/*
|
||||
* srtcp_hdr_t represents a secure rtcp header
|
||||
*
|
||||
* in this implementation, an srtcp header is assumed to be 32-bit
|
||||
* alinged
|
||||
*/
|
||||
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
|
||||
typedef struct {
|
||||
unsigned char rc:5; /* reception report count */
|
||||
unsigned char p:1; /* padding flag */
|
||||
unsigned char version:2; /* protocol version */
|
||||
unsigned char pt:8; /* payload type */
|
||||
uint16_t len; /* length */
|
||||
uint32_t ssrc; /* synchronization source */
|
||||
} srtcp_hdr_t;
|
||||
|
||||
typedef struct {
|
||||
unsigned int index:31; /* srtcp packet index in network order! */
|
||||
unsigned int e:1; /* encrypted? 1=yes */
|
||||
/* optional mikey/etc go here */
|
||||
/* and then the variable-length auth tag */
|
||||
} srtcp_trailer_t;
|
||||
|
||||
|
||||
#else /* BIG_ENDIAN */
|
||||
|
||||
typedef struct {
|
||||
unsigned char version:2; /* protocol version */
|
||||
unsigned char p:1; /* padding flag */
|
||||
unsigned char rc:5; /* reception report count */
|
||||
unsigned char pt:8; /* payload type */
|
||||
uint16_t len; /* length */
|
||||
uint32_t ssrc; /* synchronization source */
|
||||
} srtcp_hdr_t;
|
||||
|
||||
typedef struct {
|
||||
unsigned int version:2; /* protocol version */
|
||||
unsigned int p:1; /* padding flag */
|
||||
unsigned int count:5; /* varies by packet type */
|
||||
unsigned int pt:8; /* payload type */
|
||||
uint16_t length; /* len of uint32s of packet less header */
|
||||
} rtcp_common_t;
|
||||
|
||||
typedef struct {
|
||||
unsigned int e:1; /* encrypted? 1=yes */
|
||||
unsigned int index:31; /* srtcp packet index */
|
||||
/* optional mikey/etc go here */
|
||||
/* and then the variable-length auth tag */
|
||||
} srtcp_trailer_t;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* the following declarations are libSRTP internal functions
|
||||
*/
|
||||
|
||||
/*
|
||||
* srtp_get_stream(ssrc) returns a pointer to the stream corresponding
|
||||
* to ssrc, or NULL if no stream exists for that ssrc
|
||||
*/
|
||||
|
||||
srtp_stream_t
|
||||
srtp_get_stream(srtp_t srtp, uint32_t ssrc);
|
||||
|
||||
|
||||
/*
|
||||
* srtp_stream_init_keys(s, k) (re)initializes the srtp_stream_t s by
|
||||
* deriving all of the needed keys using the KDF and the key k.
|
||||
*/
|
||||
|
||||
|
||||
err_status_t
|
||||
srtp_stream_init_keys(srtp_stream_t srtp, const void *key);
|
||||
|
||||
/*
|
||||
* srtp_stream_init(s, p) initializes the srtp_stream_t s to
|
||||
* use the policy at the location p
|
||||
*/
|
||||
err_status_t
|
||||
srtp_stream_init(srtp_stream_t srtp,
|
||||
const srtp_policy_t *p);
|
||||
|
||||
|
||||
/*
|
||||
* libsrtp internal datatypes
|
||||
*/
|
||||
|
||||
typedef enum direction_t {
|
||||
dir_unknown = 0,
|
||||
dir_srtp_sender = 1,
|
||||
dir_srtp_receiver = 2
|
||||
} direction_t;
|
||||
|
||||
/*
|
||||
* an srtp_stream_t has its own SSRC, encryption key, authentication
|
||||
* key, sequence number, and replay database
|
||||
*
|
||||
* note that the keys might not actually be unique, in which case the
|
||||
* cipher_t and auth_t pointers will point to the same structures
|
||||
*/
|
||||
|
||||
typedef struct srtp_stream_ctx_t {
|
||||
uint32_t ssrc;
|
||||
cipher_t *rtp_cipher;
|
||||
auth_t *rtp_auth;
|
||||
rdbx_t rtp_rdbx;
|
||||
sec_serv_t rtp_services;
|
||||
cipher_t *rtcp_cipher;
|
||||
auth_t *rtcp_auth;
|
||||
rdb_t rtcp_rdb;
|
||||
sec_serv_t rtcp_services;
|
||||
key_limit_ctx_t *limit;
|
||||
direction_t direction;
|
||||
int allow_repeat_tx;
|
||||
ekt_stream_t ekt;
|
||||
struct srtp_stream_ctx_t *next; /* linked list of streams */
|
||||
} srtp_stream_ctx_t;
|
||||
|
||||
|
||||
/*
|
||||
* an srtp_ctx_t holds a stream list and a service description
|
||||
*/
|
||||
|
||||
typedef struct srtp_ctx_t {
|
||||
srtp_stream_ctx_t *stream_list; /* linked list of streams */
|
||||
srtp_stream_ctx_t *stream_template; /* act as template for other streams */
|
||||
} srtp_ctx_t;
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* srtp_handle_event(srtp, srtm, evnt) calls the event handling
|
||||
* function, if there is one.
|
||||
*
|
||||
* This macro is not included in the documentation as it is
|
||||
* an internal-only function.
|
||||
*/
|
||||
|
||||
#define srtp_handle_event(srtp, strm, evnt) \
|
||||
if(srtp_event_handler) { \
|
||||
srtp_event_data_t data; \
|
||||
data.session = srtp; \
|
||||
data.stream = strm; \
|
||||
data.event = evnt; \
|
||||
srtp_event_handler(&data); \
|
||||
}
|
||||
|
||||
|
||||
#endif /* SRTP_PRIV_H */
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* stats.h
|
||||
*
|
||||
* interface to statistical test functions
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright(c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef STAT_H
|
||||
#define STAT_H
|
||||
|
||||
#include "datatypes.h" /* for uint8_t */
|
||||
#include "err.h" /* for err_status_t */
|
||||
#include "rand_source.h" /* for rand_source_func_t definition */
|
||||
|
||||
err_status_t
|
||||
stat_test_monobit(uint8_t *data);
|
||||
|
||||
err_status_t
|
||||
stat_test_poker(uint8_t *data);
|
||||
|
||||
err_status_t
|
||||
stat_test_runs(uint8_t *data);
|
||||
|
||||
err_status_t
|
||||
stat_test_rand_source(rand_source_func_t rs);
|
||||
|
||||
err_status_t
|
||||
stat_test_rand_source_with_repetition(rand_source_func_t source, unsigned num_trials);
|
||||
|
||||
#endif /* STAT_H */
|
|
@ -0,0 +1,80 @@
|
|||
/*
|
||||
* ut-sim.h
|
||||
*
|
||||
* an unreliable transport simulator
|
||||
* (for testing replay databases and suchlike)
|
||||
*
|
||||
* David A. McGrew
|
||||
* Cisco Systems, Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001-2006, Cisco Systems, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Cisco Systems, Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef UT_SIM_H
|
||||
#define UT_SIM_H
|
||||
|
||||
#include "integers.h" /* for uint32_t */
|
||||
|
||||
#define UT_BUF 160 /* maximum amount of packet reorder */
|
||||
|
||||
typedef struct {
|
||||
uint32_t index;
|
||||
uint32_t buffer[UT_BUF];
|
||||
} ut_connection;
|
||||
|
||||
/*
|
||||
* ut_init(&u) initializes the ut_connection
|
||||
*
|
||||
* this function should always be the first one called on a new
|
||||
* ut_connection
|
||||
*/
|
||||
|
||||
void
|
||||
ut_init(ut_connection *utc);
|
||||
|
||||
/*
|
||||
* ut_next_index(&u) returns the next index from the simulated
|
||||
* unreliable connection
|
||||
*/
|
||||
|
||||
uint32_t
|
||||
ut_next_index(ut_connection *utc);
|
||||
|
||||
|
||||
#endif /* UT_SIM_H */
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue