summaryrefslogtreecommitdiff
path: root/fuzzer/fuzzer.h
diff options
context:
space:
mode:
Diffstat (limited to 'fuzzer/fuzzer.h')
-rw-r--r--fuzzer/fuzzer.h176
1 files changed, 176 insertions, 0 deletions
diff --git a/fuzzer/fuzzer.h b/fuzzer/fuzzer.h
new file mode 100644
index 0000000..ce1f8d6
--- /dev/null
+++ b/fuzzer/fuzzer.h
@@ -0,0 +1,176 @@
+#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" },
+};