summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xconfigure14
-rw-r--r--libavcodec/libspeexdec.c45
-rw-r--r--libavutil/blowfish.c63
-rw-r--r--libavutil/internal.h2
-rw-r--r--libavutil/xtea.c42
5 files changed, 107 insertions, 59 deletions
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");
+ }
+
+ 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 > 2) {
- av_log(avctx, AV_LOG_ERROR, "Only stereo and mono are supported.\n");
- return AVERROR(EINVAL);
+ 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");