diff --git a/configure b/configure index a2ca9f68f5..817c9cfac7 100755 --- a/configure +++ b/configure @@ -1243,6 +1243,12 @@ ARCH_EXT_LIST=" mipsdspr2 " +HAVE_LIST_CMDLINE=' + inline_asm + symver + yasm +' + HAVE_LIST_PUB=' bigendian fast_unaligned @@ -1253,6 +1259,7 @@ HAVE_LIST=" $ARCH_EXT_LIST $(add_suffix _external $ARCH_EXT_LIST) $(add_suffix _inline $ARCH_EXT_LIST) + $HAVE_LIST_CMDLINE $HAVE_LIST_PUB $THREADS_LIST aligned_malloc @@ -1305,7 +1312,6 @@ HAVE_LIST=" gnu_as ibm_asm inet_aton - inline_asm io_h isatty isinf @@ -1369,7 +1375,6 @@ HAVE_LIST=" struct_sockaddr_sa_len struct_sockaddr_storage struct_v4l2_frmivalenum_discrete - symver symver_asm_label symver_gnu_asm sysconf @@ -1395,7 +1400,6 @@ HAVE_LIST=" xform_asm xgetbv xmm_clobbers - yasm " # options emitted with CONFIG_ prefix but not available on command line @@ -1427,18 +1431,16 @@ CONFIG_EXTRA=" CMDLINE_SELECT=" $ARCH_EXT_LIST $CONFIG_LIST + $HAVE_LIST_CMDLINE $THREADS_LIST asm coverage cross_compile debug extra_warnings - inline_asm logging optimizations stripping - symver - yasm " PATHS_LIST=' diff --git a/libavcodec/libspeexdec.c b/libavcodec/libspeexdec.c index 60859b7e4b..490e6925f5 100644 --- a/libavcodec/libspeexdec.c +++ b/libavcodec/libspeexdec.c @@ -39,35 +39,42 @@ static av_cold int libspeex_decode_init(AVCodecContext *avctx) { LibSpeexContext *s = avctx->priv_data; const SpeexMode *mode; - - // defaults in the case of a missing header - if (avctx->sample_rate <= 8000) - mode = &speex_nb_mode; - else if (avctx->sample_rate <= 16000) - mode = &speex_wb_mode; - else - mode = &speex_uwb_mode; + int spx_mode; if (avctx->extradata_size >= 80) s->header = speex_packet_to_header(avctx->extradata, avctx->extradata_size); avctx->sample_fmt = AV_SAMPLE_FMT_S16; if (s->header) { - avctx->sample_rate = s->header->rate; avctx->channels = s->header->nb_channels; s->frame_size = s->header->frame_size; - - mode = speex_lib_get_mode(s->header->mode); - if (!mode) { - av_log(avctx, AV_LOG_ERROR, "Unknown Speex mode %d\n", s->header->mode); - return AVERROR_INVALIDDATA; + spx_mode = s->header->mode; + } else { + switch (avctx->sample_rate) { + case 8000: spx_mode = 0; break; + case 16000: spx_mode = 1; break; + case 32000: spx_mode = 2; break; + default: + /* libspeex can handle any mode if initialized as ultra-wideband */ + av_log(avctx, AV_LOG_WARNING, "Invalid sample rate: %d\n" + "Decoding as 32kHz ultra-wideband\n", + avctx->sample_rate); + spx_mode = 2; } - } else - av_log(avctx, AV_LOG_INFO, "Missing Speex header, assuming defaults.\n"); + } - if (avctx->channels > 2) { - av_log(avctx, AV_LOG_ERROR, "Only stereo and mono are supported.\n"); - return AVERROR(EINVAL); + mode = speex_lib_get_mode(spx_mode); + if (!mode) { + av_log(avctx, AV_LOG_ERROR, "Unknown Speex mode %d", spx_mode); + return AVERROR_INVALIDDATA; + } + avctx->sample_rate = 8000 << spx_mode; + + if (avctx->channels < 1 || avctx->channels > 2) { + /* libspeex can handle mono or stereo if initialized as stereo */ + av_log(avctx, AV_LOG_ERROR, "Invalid channel count: %d.\n" + "Decoding as stereo.\n", avctx->channels); + avctx->channels = 2; } speex_bits_init(&s->bits); diff --git a/libavutil/blowfish.c b/libavutil/blowfish.c index 5fe95e8d8a..cdc2952dea 100644 --- a/libavutil/blowfish.c +++ b/libavutil/blowfish.c @@ -380,15 +380,15 @@ void av_blowfish_crypt(AVBlowfish *ctx, uint8_t *dst, const uint8_t *src, av_blowfish_crypt_ecb(ctx, &v0, &v1, decrypt); - AV_WB32(dst, v0); - AV_WB32(dst + 4, v1); - if (iv) { - for (i = 0; i < 8; i++) - dst[i] = dst[i] ^ iv[i]; + v0 ^= AV_RB32(iv); + v1 ^= AV_RB32(iv + 4); memcpy(iv, src, 8); } + AV_WB32(dst, v0); + AV_WB32(dst + 4, v1); + src += 8; dst += 8; } @@ -509,32 +509,61 @@ static const uint32_t ciphertext_r[NUM_VARIABLE_KEY_TESTS] = { /* plaintext bytes */ static const uint8_t plaintext[8] = "BLOWFISH"; +static const uint8_t plaintext2[16] = "BLOWFISHBLOWFISH"; + /* ciphertext bytes */ static const uint8_t ciphertext[8] = { 0x32, 0x4E, 0xD0, 0xFE, 0xF4, 0x13, 0xA2, 0x03 }; +static const uint8_t ciphertext2[16] = { + 0x53, 0x00, 0x40, 0x06, 0x63, 0xf2, 0x1d, 0x99, + 0x3b, 0x9b, 0x27, 0x64, 0x46, 0xfd, 0x20, 0xc1, +}; + +#define IV "blowfish" + +#undef exit +static void test_blowfish(AVBlowfish *ctx, uint8_t *dst, const uint8_t *src, + const uint8_t *ref, int len, uint8_t *iv, int dir, + const char *test) +{ + av_blowfish_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) { AVBlowfish ctx; uint32_t tmptext_l[NUM_VARIABLE_KEY_TESTS]; uint32_t tmptext_r[NUM_VARIABLE_KEY_TESTS]; - uint8_t tmp[8]; + uint8_t tmp[16], iv[8]; int i; av_blowfish_init(&ctx, "abcdefghijklmnopqrstuvwxyz", 26); - av_blowfish_crypt(&ctx, tmp, plaintext, 1, NULL, 0); - if (memcmp(tmp, ciphertext, 8)) { - printf("Test encryption failed.\n"); - return 1; - } - - av_blowfish_crypt(&ctx, tmp, ciphertext, 1, NULL, 1); - if (memcmp(tmp, plaintext, 8)) { - printf("Test decryption failed.\n"); - return 1; - } + test_blowfish(&ctx, tmp, plaintext, ciphertext, 1, NULL, 0, "encryption"); + test_blowfish(&ctx, tmp, ciphertext, plaintext, 1, NULL, 1, "decryption"); + test_blowfish(&ctx, tmp, tmp, ciphertext, 1, NULL, 0, "Inplace encryption"); + test_blowfish(&ctx, tmp, tmp, plaintext, 1, NULL, 1, "Inplace decryption"); + memcpy(iv, IV, 8); + test_blowfish(&ctx, tmp, plaintext2, ciphertext2, 2, iv, 0, "CBC encryption"); + memcpy(iv, IV, 8); + test_blowfish(&ctx, tmp, ciphertext2, plaintext2, 2, iv, 1, "CBC decryption"); + memcpy(iv, IV, 8); + test_blowfish(&ctx, tmp, tmp, ciphertext2, 2, iv, 0, "Inplace CBC encryption"); + memcpy(iv, IV, 8); + test_blowfish(&ctx, tmp, tmp, plaintext2, 2, iv, 1, "Inplace CBC decryption"); memcpy(tmptext_l, plaintext_l, sizeof(*plaintext_l) * NUM_VARIABLE_KEY_TESTS); memcpy(tmptext_r, plaintext_r, sizeof(*plaintext_r) * NUM_VARIABLE_KEY_TESTS); diff --git a/libavutil/internal.h b/libavutil/internal.h index 2f92db6853..f18e37a243 100644 --- a/libavutil/internal.h +++ b/libavutil/internal.h @@ -71,8 +71,6 @@ #define sprintf sprintf_is_forbidden_due_to_security_issues_use_snprintf #undef strcat #define strcat strcat_is_forbidden_due_to_security_issues_use_av_strlcat -#undef strncpy -#define strncpy strncpy_is_forbidden_due_to_security_issues_use_av_strlcpy #undef exit #define exit exit_is_forbidden #undef printf diff --git a/libavutil/xtea.c b/libavutil/xtea.c index 1c2bd04639..9c41f140fa 100644 --- a/libavutil/xtea.c +++ b/libavutil/xtea.c @@ -96,8 +96,8 @@ static void xtea_crypt_ecb(AVXTEA *ctx, uint8_t *dst, const uint8_t *src, DSTEP(0x9E3779B9U, k3, k0); #endif if (iv) { - v0 ^= AV_RB32(iv ); - v1 ^= AV_RB32(iv+4); + v0 ^= AV_RB32(iv); + v1 ^= AV_RB32(iv + 4); memcpy(iv, src, 8); } } else { @@ -220,27 +220,39 @@ 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], iv[8]; int i; const uint8_t src[32] = "HelloWorldHelloWorldHelloWorld"; - uint8_t ct[32]; - uint8_t pl[32]; - -#define CHECK(dst, src, ref, len, iv, dir, error) \ - av_xtea_crypt(&ctx, dst, src, len, iv, dir);\ - if (memcmp(dst, ref, 8*len)) {\ - printf(error);\ - return 1;\ - } + uint8_t ct[32]; + uint8_t pl[32]; for (i = 0; i < XTEA_NUM_TESTS; i++) { av_xtea_init(&ctx, xtea_test_key[i]); - CHECK(buf, xtea_test_pt[i], xtea_test_ct[i], 1, NULL, 0, "Test encryption failed.\n"); - CHECK(buf, xtea_test_ct[i], xtea_test_pt[i], 1, NULL, 1, "Test decryption failed.\n"); + 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"); /* encrypt */ memcpy(iv, "HALLO123", 8); @@ -248,10 +260,10 @@ int main(void) /* decrypt into pl */ memcpy(iv, "HALLO123", 8); - CHECK(pl, ct, src, 4, iv, 1, "Test IV decryption failed.\n"); + test_xtea(&ctx, pl, ct, src, 4, iv, 1, "CBC decryption"); memcpy(iv, "HALLO123", 8); - CHECK(ct, ct, src, 4, iv, 1, "Test IV inplace decryption failed.\n"); + test_xtea(&ctx, ct, ct, src, 4, iv, 1, "CBC inplace decryption"); } printf("Test encryption/decryption success.\n");