diff options
author | dvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-03-16 17:52:28 +0000 |
---|---|---|
committer | dvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-03-16 17:52:28 +0000 |
commit | 8e07b694c191befe3bef3f7db6250bb178eadec2 (patch) | |
tree | b238e8cc0d3574ab3906931352fba0185be5eccc | |
parent | 12daef83b980a61d19dab4ad54882bdd75c56c3e (diff) |
Merged revisions 182282 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
................
r182282 | dvossel | 2009-03-16 12:49:58 -0500 (Mon, 16 Mar 2009) | 13 lines
Merged revisions 182281 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r182281 | dvossel | 2009-03-16 12:47:42 -0500 (Mon, 16 Mar 2009) | 7 lines
Randomize IAX2 encryption padding
The 16-32 byte random padding at the beginning of an encrypted IAX2 frame turns out to not be all that random at all. This patch calls ast_random to fill the padding buffer with random data. The padding is randomized at the beginning of every encrypted call and for every encrypted retransmit frame.
Review: http://reviewboard.digium.com/r/193/
........
................
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@182283 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | channels/chan_iax2.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 0dc35c264..56330d8f4 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -939,6 +939,7 @@ static int acf_channel_write(struct ast_channel *chan, const char *function, cha static int decode_frame(ast_aes_decrypt_key *dcx, struct ast_iax2_full_hdr *fh, struct ast_frame *f, int *datalen); static int encrypt_frame(ast_aes_encrypt_key *ecx, struct ast_iax2_full_hdr *fh, unsigned char *poo, int *datalen); static void build_ecx_key(const unsigned char *digest, struct chan_iax2_pvt *pvt); +static void build_rand_pad(unsigned char *buf, ssize_t len); static const struct ast_channel_tech iax2_tech = { .type = "IAX2", @@ -2398,6 +2399,9 @@ static int update_packet(struct iax_frame *f) /* Now re-encrypt the frame */ if (f->encmethods) { + /* since this is a retransmit frame, create a new random padding + * before re-encrypting. */ + build_rand_pad(f->semirand, sizeof(f->semirand)); encrypt_frame(&f->ecx, fh, f->semirand, &f->datalen); } return 0; @@ -4655,6 +4659,18 @@ static int iax2_trunk_queue(struct chan_iax2_pvt *pvt, struct iax_frame *fr) return 0; } +/* IAX2 encryption requires 16 to 32 bytes of random padding to be present + * before the encryption data. This function randomizes that data. */ +static void build_rand_pad(unsigned char *buf, ssize_t len) +{ + long tmp; + for (tmp = ast_random(); len > 0; tmp = ast_random()) { + memcpy(buf, (unsigned char *) &tmp, (len > sizeof(tmp)) ? sizeof(tmp) : len); + buf += sizeof(tmp); + len -= sizeof(tmp); + } +} + static void build_encryption_keys(const unsigned char *digest, struct chan_iax2_pvt *pvt) { build_ecx_key(digest, pvt); @@ -4666,6 +4682,7 @@ static void build_ecx_key(const unsigned char *digest, struct chan_iax2_pvt *pvt /* it is required to hold the corresponding decrypt key to our encrypt key * in the pvt struct because queued frames occasionally need to be decrypted and * re-encrypted when updated for a retransmission */ + build_rand_pad(pvt->semirand, sizeof(pvt->semirand)); ast_aes_encrypt_key(digest, &pvt->ecx); ast_aes_decrypt_key(digest, &pvt->mydcx); } @@ -4732,7 +4749,7 @@ static int decode_frame(ast_aes_decrypt_key *dcx, struct ast_iax2_full_hdr *fh, /* Decrypt */ memcpy_decrypt(workspace, efh->encdata, *datalen - sizeof(struct ast_iax2_full_enc_hdr), dcx); - padding = 16 + (workspace[15] & 0xf); + padding = 16 + (workspace[15] & 0x0f); if (iaxdebug) ast_debug(1, "Decoding full frame with length %d (padding = %d) (15=%02x)\n", *datalen, padding, workspace[15]); if (*datalen < padding + sizeof(struct ast_iax2_full_hdr)) |