void sip_srtp_destroy(struct sip_srtp *srtp) { if (srtp->crypto) { sdp_crypto_destroy(srtp->crypto); } srtp->crypto = NULL; ast_free(srtp); }
struct sdp_crypto *sdp_crypto_setup(void) { struct sdp_crypto *p; int key_len; unsigned char remote_key[SRTP_MASTER_LEN]; if (!ast_rtp_engine_srtp_is_registered()) { return NULL; } if (!(p = sdp_crypto_alloc())) { return NULL; } if (res_srtp->get_random(p->local_key, sizeof(p->local_key)) < 0) { sdp_crypto_destroy(p); return NULL; } ast_base64encode(p->local_key64, p->local_key, SRTP_MASTER_LEN, sizeof(p->local_key64)); key_len = ast_base64decode(remote_key, p->local_key64, sizeof(remote_key)); if (key_len != SRTP_MASTER_LEN) { ast_log(LOG_ERROR, "base64 encode/decode bad len %d != %d\n", key_len, SRTP_MASTER_LEN); ast_free(p); return NULL; } if (memcmp(remote_key, p->local_key, SRTP_MASTER_LEN)) { ast_log(LOG_ERROR, "base64 encode/decode bad key\n"); ast_free(p); return NULL; } ast_debug(1 , "local_key64 %s len %zu\n", p->local_key64, strlen(p->local_key64)); return p; }