aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2015-11-11 21:42:02 +0200
committerMichael Niedermayer <michael@niedermayer.cc>2015-11-26 16:06:39 +0100
commit1290c85c9d451eaf45bf552fa313ea7f6cccb3f3 (patch)
tree11c07862ee7d1c3ab1428a116a036e69e7c6d893
parentb70f7d20e1140983bf986ca240f2d868074a8585 (diff)
downloadffmpeg-1290c85c9d451eaf45bf552fa313ea7f6cccb3f3.tar.gz
rtmpcrypt: Do the xtea decryption in little endian mode
The XTEA algorithm operates on 32 bit numbers, not on byte sequences. The XTEA implementation in libavutil is written assuming big endian numbers, while the rtmpe signature encryption assumes little endian. This fixes rtmpe communication with rtmpe servers that use signature type 8 (XTEA), e.g. crunchyroll. CC: libav-stable@libav.org Signed-off-by: Martin Storsjö <martin@martin.st> (cherry picked from commit e7728319b92dbb4fb949155e33de7ff5358ddff3) Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r--libavformat/rtmpcrypt.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/libavformat/rtmpcrypt.c b/libavformat/rtmpcrypt.c
index 2065ec6602..3771909857 100644
--- a/libavformat/rtmpcrypt.c
+++ b/libavformat/rtmpcrypt.c
@@ -184,9 +184,14 @@ int ff_rtmpe_compute_secret_key(URLContext *h, const uint8_t *serverdata,
static void rtmpe8_sig(const uint8_t *in, uint8_t *out, int key_id)
{
struct AVXTEA ctx;
+ uint8_t tmpbuf[8];
av_xtea_init(&ctx, rtmpe8_keys[key_id]);
- av_xtea_crypt(&ctx, out, in, 1, NULL, 0);
+ AV_WB32(tmpbuf, AV_RL32(in));
+ AV_WB32(tmpbuf + 4, AV_RL32(in + 4));
+ av_xtea_crypt(&ctx, tmpbuf, tmpbuf, 1, NULL, 0);
+ AV_WL32(out, AV_RB32(tmpbuf));
+ AV_WL32(out + 4, AV_RB32(tmpbuf + 4));
}
static void rtmpe9_sig(const uint8_t *in, uint8_t *out, int key_id)