Commit 263b77a3 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

API cleanup

parent 56e9569c
...@@ -51,7 +51,8 @@ int main (void) ...@@ -51,7 +51,8 @@ int main (void)
static const uint8_t salt[14] = static const uint8_t salt[14] =
"\x12\x34\x56\x78\x90" "\x12\x34\x56\x78\x90" "\x12\x34\x56\x78"; "\x12\x34\x56\x78\x90" "\x12\x34\x56\x78\x90" "\x12\x34\x56\x78";
srtp_session_t *s = srtp_create ("AES_CM_128_HMAC_SHA1_80", 0, 0); srtp_session_t *s = srtp_create (SRTP_ENCR_AES_CM, SRTP_AUTH_HMAC_SHA1, 10,
SRTP_PRF_AES_CM, 0);
if (s == NULL) if (s == NULL)
return 1; return 1;
if (srtp_setkey (s, key, 16, salt, 14)) if (srtp_setkey (s, key, 16, salt, 14))
......
...@@ -61,6 +61,7 @@ struct srtp_session_t ...@@ -61,6 +61,7 @@ struct srtp_session_t
uint32_t rtcp_index; uint32_t rtcp_index;
uint32_t rtp_roc; uint32_t rtp_roc;
uint16_t rtp_seq; uint16_t rtp_seq;
uint16_t rtp_rcc;
uint8_t tag_len; uint8_t tag_len;
}; };
...@@ -74,6 +75,7 @@ enum ...@@ -74,6 +75,7 @@ enum
SRTCP_SALT SRTCP_SALT
}; };
#ifdef WIN32 #ifdef WIN32
# include <winsock2.h> # include <winsock2.h>
#else #else
...@@ -159,33 +161,52 @@ static int proto_create (srtp_proto_t *p, int gcipher, int gmd) ...@@ -159,33 +161,52 @@ static int proto_create (srtp_proto_t *p, int gcipher, int gmd)
* internal cryptographic counters; it is however of course feasible to open * internal cryptographic counters; it is however of course feasible to open
* multiple simultaneous sessions with the same master key. * multiple simultaneous sessions with the same master key.
* *
* @param name cipher-suite name * @param encr encryption algorithm number
* @param kdr key derivation rate * @param auth authentication algortihm number
* @param tag_len authentication tag byte length (NOT including RCC)
* @param flags OR'ed optional flags. * @param flags OR'ed optional flags.
* *
* @return NULL in case of error * @return NULL in case of error
*/ */
srtp_session_t * srtp_session_t *
srtp_create (const char *name, unsigned flags, unsigned kdr) srtp_create (int encr, int auth, unsigned tag_len, int prf, unsigned flags)
{ {
assert (name != NULL); if ((flags & ~SRTP_FLAGS_MASK) || init_libgcrypt ())
return NULL;
if (kdr != 0) int cipher, md;
return NULL; // FIXME: KDR not implemented yet switch (encr)
{
case SRTP_ENCR_NULL:
cipher = GCRY_CIPHER_NONE;
break;
uint8_t tag_len; case SRTP_ENCR_AES_CM:
int cipher = GCRY_CIPHER_AES, md = GCRY_MD_SHA1; cipher = GCRY_CIPHER_AES;
break;
if (strcmp (name, "AES_CM_128_HMAC_SHA1_80") == 0) default:
tag_len = 10; return NULL;
else }
if (strcmp (name, "AES_CM_128_HMAC_SHA1_32") == 0)
tag_len = 4; switch (auth)
else {
// F8_128_HMAC_SHA1_80 is not implemented case SRTP_AUTH_NULL:
md = GCRY_MD_NONE;
break;
case SRTP_AUTH_HMAC_SHA1:
md = GCRY_MD_SHA1;
break;
default:
return NULL;
}
if (tag_len > gcry_md_get_algo_dlen (auth))
return NULL; return NULL;
if ((flags & ~SRTP_FLAGS_MASK) || init_libgcrypt ()) if (prf != SRTP_PRF_AES_CM)
return NULL; return NULL;
srtp_session_t *s = malloc (sizeof (*s)); srtp_session_t *s = malloc (sizeof (*s));
...@@ -194,7 +215,6 @@ srtp_create (const char *name, unsigned flags, unsigned kdr) ...@@ -194,7 +215,6 @@ srtp_create (const char *name, unsigned flags, unsigned kdr)
memset (s, 0, sizeof (*s)); memset (s, 0, sizeof (*s));
s->flags = flags; s->flags = flags;
s->kdr = kdr;
s->tag_len = tag_len; s->tag_len = tag_len;
if (proto_create (&s->rtp, cipher, md) == 0) if (proto_create (&s->rtp, cipher, md) == 0)
...@@ -336,6 +356,33 @@ srtp_setkey (srtp_session_t *s, const void *key, size_t keylen, ...@@ -336,6 +356,33 @@ srtp_setkey (srtp_session_t *s, const void *key, size_t keylen,
} }
/**
* Sets Roll-over-Counter Carry (RCC) rate for the SRTP session. If not
* specified (through this function), the default rate of ONE is assumed
* (i.e. every RTP packets will carry the RoC). RCC rate is ignored if none
* of the RCC mode has been selected.
*
* The RCC mode is selected through one of these flags for srtp_create():
* SRTP_RCC_MODE1: integrity protection only for RoC carrying packets
* SRTP_RCC_MODE2: integrity protection for all packets
* SRTP_RCC_MODE3: no integrity protection
*
* RCC mode 3 is insecure. Compared to plain RTP, it provides confidentiality
* (through encryption) but is much more prone to DoS. It can only be used if
* anti-spoofing protection is provided by lower network layers (e.g. IPsec,
* or trusted routers and proper source address filtering).
*
* If RCC rate is 1, RCC mode 1 and 2 are functionally identical.
*
* @param rate RoC Carry rate (MUST NOT be zero)
*/
void srtp_setrcc_rate (srtp_session_t *s, uint16_t rate)
{
assert (rate != 0);
s->rtp_rcc = rate;
}
/** AES-CM encryption/decryption (ctr length = 16 bytes) */ /** AES-CM encryption/decryption (ctr length = 16 bytes) */
static int static int
ctr_crypt (gcry_cipher_hd_t hd, uint32_t *ctr, uint8_t *data, size_t len) ctr_crypt (gcry_cipher_hd_t hd, uint32_t *ctr, uint8_t *data, size_t len)
......
...@@ -24,22 +24,49 @@ typedef struct srtp_session_t srtp_session_t; ...@@ -24,22 +24,49 @@ typedef struct srtp_session_t srtp_session_t;
enum enum
{ {
SRTP_UNENCRYPTED=0x1, // do not encrypt SRTP packets SRTP_UNENCRYPTED=0x1, // do not encrypt SRTP packets
SRTCP_UNENCRYPTED=0x2, // do not encrypt SRTCP packets SRTCP_UNENCRYPTED=0x2, // do not encrypt SRTCP packets
SRTP_NULL_CIPHER=0x3, // use NULL cipher (encrypt nothing) SRTP_UNAUTHENTICATED=0x4, // authenticate only SRTCP packets
SRTP_UNAUTHENTICATED=0x4, // do not authenticated SRTP packets
SRTP_FLAGS_MASK=0x7 SRTP_RCC_MODE1=0x10, // use Roll-over-Counter Carry mode 1
SRTP_RCC_MODE2=0x20, // use Roll-over-Counter Carry mode 2
SRTP_RCC_MODE3=0x30, // use Roll-over-Counter Carry mode 3 (insecure)
SRTP_FLAGS_MASK=0x38
};
/* SRTP encryption algorithms (ciphers); same values as MIKEY */
enum
{
SRTP_ENCR_NULL=0,
SRTP_ENCR_AES_CM=1,
SRTP_ENCR_AES_F8=2 // not implemented
};
/* SRTP authenticaton algorithms; same values as MIKEY */
enum
{
SRTP_AUTH_NULL=0,
SRTP_AUTH_HMAC_SHA1=1
}; };
/* SRTP pseudo random function; same values as MIKEY */
enum
{
SRTP_PRF_AES_CM=0
};
# ifdef __cplusplus # ifdef __cplusplus
extern "C" { extern "C" {
# endif # endif
srtp_session_t *srtp_create (const char *name, unsigned flags, unsigned kdr); srtp_session_t *srtp_create (int encr, int auth, unsigned tag_len, int prf,
unsigned flags);
void srtp_destroy (srtp_session_t *s); void srtp_destroy (srtp_session_t *s);
int srtp_setkey (srtp_session_t *s, const void *key, size_t keylen, int srtp_setkey (srtp_session_t *s, const void *key, size_t keylen,
const void *salt, size_t saltlen); const void *salt, size_t saltlen);
void srtp_setrcc_rate (srtp_session_t *s, uint16_t rate);
int srtp_send (srtp_session_t *s, uint8_t *buf, size_t *lenp, size_t maxsize); int srtp_send (srtp_session_t *s, uint8_t *buf, size_t *lenp, size_t maxsize);
int srtp_recv (srtp_session_t *s, uint8_t *buf, size_t *lenp); int srtp_recv (srtp_session_t *s, uint8_t *buf, size_t *lenp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment