X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavutil%2Fxtea.c;h=f3357ce544af9fcb3e502708ff1e590af0fef222;hb=92281850a2d878dae1d50e271886ba87013b6ff3;hp=07a66e56666a5d3a2882c06ee4eab69eac482b45;hpb=f6687bf5f8989d397cdef6d9d05bcb13a7ef8c4f;p=ffmpeg diff --git a/libavutil/xtea.c b/libavutil/xtea.c index 07a66e56666..f3357ce544a 100644 --- a/libavutil/xtea.c +++ b/libavutil/xtea.c @@ -36,7 +36,7 @@ void av_xtea_init(AVXTEA *ctx, const uint8_t key[16]) } static void xtea_crypt_ecb(AVXTEA *ctx, uint8_t *dst, const uint8_t *src, - int decrypt) + int decrypt, uint8_t *iv) { uint32_t v0, v1; int i; @@ -52,6 +52,11 @@ static void xtea_crypt_ecb(AVXTEA *ctx, uint8_t *dst, const uint8_t *src, sum -= delta; v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + ctx->key[sum & 3]); } + if (iv) { + v0 ^= AV_RB32(iv); + v1 ^= AV_RB32(iv + 4); + memcpy(iv, src, 8); + } } else { uint32_t sum = 0, delta = 0x9E3779B9; @@ -72,32 +77,24 @@ void av_xtea_crypt(AVXTEA *ctx, uint8_t *dst, const uint8_t *src, int count, int i; if (decrypt) { - while (count > 0) { - xtea_crypt_ecb(ctx, dst, src, decrypt); - - if (iv) { - for (i = 0; i < 8; i++) - dst[i] = dst[i] ^ iv[i]; - memcpy(iv, src, 8); - } + while (count--) { + xtea_crypt_ecb(ctx, dst, src, decrypt, iv); src += 8; dst += 8; - count -= 8; } } else { - while (count > 0) { + while (count--) { if (iv) { for (i = 0; i < 8; i++) dst[i] = src[i] ^ iv[i]; - xtea_crypt_ecb(ctx, dst, dst, decrypt); + xtea_crypt_ecb(ctx, dst, dst, decrypt, NULL); memcpy(iv, dst, 8); } else { - xtea_crypt_ecb(ctx, dst, src, decrypt); + xtea_crypt_ecb(ctx, dst, src, decrypt, NULL); } src += 8; dst += 8; - count -= 8; } } } @@ -141,26 +138,50 @@ static const uint8_t xtea_test_ct[XTEA_NUM_TESTS][8] = { { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 } }; +#undef exit +static void test_xtea(AVXTEA *ctx, uint8_t *dst, const uint8_t *src, + const uint8_t *ref, int len, uint8_t *iv, int dir, + const char *test) +{ + av_xtea_crypt(ctx, dst, src, len, iv, dir); + if (memcmp(dst, ref, 8*len)) { + int i; + printf("%s failed\ngot ", test); + for (i = 0; i < 8*len; i++) + printf("%02x ", dst[i]); + printf("\nexpected "); + for (i = 0; i < 8*len; i++) + printf("%02x ", ref[i]); + printf("\n"); + exit(1); + } +} + int main(void) { AVXTEA ctx; - uint8_t buf[8]; + uint8_t buf[8], iv[8]; int i; + const uint8_t src[32] = "HelloWorldHelloWorldHelloWorld"; + uint8_t ct[32]; + uint8_t pl[32]; for (i = 0; i < XTEA_NUM_TESTS; i++) { av_xtea_init(&ctx, xtea_test_key[i]); - av_xtea_crypt(&ctx, buf, xtea_test_pt[i], 1, NULL, 0); - if (memcmp(buf, xtea_test_ct[i], 8)) { - printf("Test encryption failed.\n"); - return 1; - } + test_xtea(&ctx, buf, xtea_test_pt[i], xtea_test_ct[i], 1, NULL, 0, "encryption"); + test_xtea(&ctx, buf, xtea_test_ct[i], xtea_test_pt[i], 1, NULL, 1, "decryption"); - av_xtea_crypt(&ctx, buf, xtea_test_ct[i], 1, NULL, 1); - if (memcmp(buf, xtea_test_pt[i], 8)) { - printf("Test decryption failed.\n"); - return 1; - } + /* encrypt */ + memcpy(iv, "HALLO123", 8); + av_xtea_crypt(&ctx, ct, src, 4, iv, 0); + + /* decrypt into pl */ + memcpy(iv, "HALLO123", 8); + test_xtea(&ctx, pl, ct, src, 4, iv, 1, "CBC decryption"); + + memcpy(iv, "HALLO123", 8); + test_xtea(&ctx, ct, ct, src, 4, iv, 1, "CBC inplace decryption"); } printf("Test encryption/decryption success.\n");