You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

177 lines
8.2 KiB

#define MAX_KEY_LEN 46
#define EXTRACT(dest, src, srcsize, copysize) \
{ \
memcpy((dest), (src), (copysize)); \
(src) += (copysize); \
(srcsize) -= (copysize); \
}
/* Extract data if src contains sufficient bytes, otherwise go to end */
#define EXTRACT_IF(dest, src, srcsize, copysize) \
{ \
if ((srcsize) < (copysize)) { \
goto end; \
} else { \
EXTRACT((dest), (src), (srcsize), (copysize)); \
} \
}
#include <stdint.h>
#if UINTPTR_MAX == 0xffffffff
#define FUZZ_32BIT
#elif UINTPTR_MAX == 0xffffffffffffffff
#else
#error "Cannot detect word size"
#endif
typedef srtp_err_status_t (
*fuzz_srtp_func)(srtp_t, void *, int *, uint8_t, unsigned int);
typedef void (*fuzz_srtp_crypto_policy_func)(srtp_crypto_policy_t *);
typedef srtp_err_status_t (*fuzz_srtp_get_length_func)(const srtp_t,
uint8_t,
unsigned int,
uint32_t *);
struct fuzz_srtp_params {
uint8_t srtp_func;
uint8_t srtp_crypto_policy_func;
uint16_t window_size;
uint8_t allow_repeat_tx;
uint8_t ssrc_type;
unsigned int ssrc_value;
uint8_t key[MAX_KEY_LEN];
uint8_t mki;
};
static srtp_err_status_t fuzz_srtp_protect(srtp_t srtp_sender,
void *hdr,
int *len,
uint8_t use_mki,
unsigned int mki);
static srtp_err_status_t fuzz_srtp_unprotect(srtp_t srtp_sender,
void *hdr,
int *len,
uint8_t use_mki,
unsigned int mki);
static srtp_err_status_t fuzz_srtp_protect_rtcp(srtp_t srtp_sender,
void *hdr,
int *len,
uint8_t use_mki,
unsigned int mki);
static srtp_err_status_t fuzz_srtp_unprotect_rtcp(srtp_t srtp_sender,
void *hdr,
int *len,
uint8_t use_mki,
unsigned int mki);
static srtp_err_status_t fuzz_srtp_protect_mki(srtp_t srtp_sender,
void *hdr,
int *len,
uint8_t use_mki,
unsigned int mki);
static srtp_err_status_t fuzz_srtp_protect_rtcp_mki(srtp_t srtp_sender,
void *hdr,
int *len,
uint8_t use_mki,
unsigned int mki);
static srtp_err_status_t fuzz_srtp_unprotect_mki(srtp_t srtp_sender,
void *hdr,
int *len,
uint8_t use_mki,
unsigned int mki);
static srtp_err_status_t fuzz_srtp_unprotect_rtcp_mki(srtp_t srtp_sender,
void *hdr,
int *len,
uint8_t use_mki,
unsigned int mki);
static srtp_err_status_t fuzz_srtp_get_protect_length(const srtp_t srtp_ctx,
uint8_t use_mki,
unsigned int mki,
uint32_t *length);
static srtp_err_status_t fuzz_srtp_get_protect_mki_length(const srtp_t srtp_ctx,
uint8_t use_mki,
unsigned int mki,
uint32_t *length);
static srtp_err_status_t fuzz_srtp_get_protect_rtcp_length(
const srtp_t srtp_ctx,
uint8_t use_mki,
unsigned int mki,
uint32_t *length);
static srtp_err_status_t fuzz_srtp_get_protect_rtcp_mki_length(
const srtp_t srtp_ctx,
uint8_t use_mki,
unsigned int mki,
uint32_t *length);
struct fuzz_srtp_func_ext {
fuzz_srtp_func srtp_func;
bool protect;
fuzz_srtp_get_length_func get_length;
};
const struct fuzz_srtp_func_ext srtp_funcs[] = {
{ fuzz_srtp_protect, true, fuzz_srtp_get_protect_length },
{ fuzz_srtp_unprotect, false, NULL },
{ fuzz_srtp_protect_rtcp, true, fuzz_srtp_get_protect_rtcp_length },
{ fuzz_srtp_unprotect_rtcp, false, NULL },
{ fuzz_srtp_protect_mki, true, fuzz_srtp_get_protect_mki_length },
{ fuzz_srtp_unprotect_mki, false, NULL },
{ fuzz_srtp_protect_rtcp_mki, true, fuzz_srtp_get_protect_rtcp_mki_length },
{ fuzz_srtp_unprotect_rtcp_mki, false, NULL }
};
struct fuzz_srtp_crypto_policy_func_ext {
fuzz_srtp_crypto_policy_func crypto_policy_func;
const char *name;
};
const struct fuzz_srtp_crypto_policy_func_ext fuzz_srtp_crypto_policies[] = {
{ srtp_crypto_policy_set_rtp_default, "" },
{ srtp_crypto_policy_set_rtcp_default, "" },
{ srtp_crypto_policy_set_aes_cm_128_hmac_sha1_32,
"srtp_crypto_policy_set_aes_cm_128_hmac_sha1_32" },
{ srtp_crypto_policy_set_aes_cm_128_null_auth,
"srtp_crypto_policy_set_aes_cm_128_null_auth" },
{ srtp_crypto_policy_set_aes_cm_256_hmac_sha1_32,
"srtp_crypto_policy_set_aes_cm_256_hmac_sha1_32" },
{ srtp_crypto_policy_set_aes_cm_256_hmac_sha1_80,
"srtp_crypto_policy_set_aes_cm_256_hmac_sha1_80" },
{ srtp_crypto_policy_set_aes_cm_256_null_auth,
"srtp_crypto_policy_set_aes_cm_256_null_auth" },
{ srtp_crypto_policy_set_null_cipher_hmac_null,
"srtp_crypto_policy_set_null_cipher_hmac_null" },
{ srtp_crypto_policy_set_null_cipher_hmac_sha1_80,
"srtp_crypto_policy_set_null_cipher_hmac_sha1_80" },
#ifdef OPENSSL
{ srtp_crypto_policy_set_aes_cm_192_hmac_sha1_32,
"srtp_crypto_policy_set_aes_cm_192_hmac_sha1_32" },
{ srtp_crypto_policy_set_aes_cm_192_hmac_sha1_80,
"srtp_crypto_policy_set_aes_cm_192_hmac_sha1_80" },
{ srtp_crypto_policy_set_aes_cm_192_null_auth,
"srtp_crypto_policy_set_aes_cm_192_null_auth" },
{ srtp_crypto_policy_set_aes_gcm_128_16_auth,
"srtp_crypto_policy_set_aes_gcm_128_16_auth" },
{ srtp_crypto_policy_set_aes_gcm_128_8_auth,
"srtp_crypto_policy_set_aes_gcm_128_8_auth" },
{ srtp_crypto_policy_set_aes_gcm_128_8_only_auth,
"srtp_crypto_policy_set_aes_gcm_128_8_only_auth" },
{ srtp_crypto_policy_set_aes_gcm_256_16_auth,
"srtp_crypto_policy_set_aes_gcm_256_16_auth" },
{ srtp_crypto_policy_set_aes_gcm_256_8_auth,
"srtp_crypto_policy_set_aes_gcm_256_8_auth" },
{ srtp_crypto_policy_set_aes_gcm_256_8_only_auth,
"srtp_crypto_policy_set_aes_gcm_256_8_only_auth" },
#endif
};
struct fuzz_srtp_ssrc_type_ext {
srtp_ssrc_type_t srtp_ssrc_type;
const char *name;
};
const struct fuzz_srtp_ssrc_type_ext fuzz_ssrc_type_map[] = {
{ ssrc_undefined, "ssrc_undefined" },
{ ssrc_specific, "ssrc_specific" },
{ ssrc_any_inbound, "ssrc_any_inbound" },
{ ssrc_any_outbound, "ssrc_any_outbound" },
};