mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Merge commit '29abb04e73b0580ebe38703cadb988d26df6a76a'
* commit '29abb04e73b0580ebe38703cadb988d26df6a76a': libspeexdec: If the channel count is not valid, decode as stereo. libspeexdec: improve setting of Speex mode and sample rate libspeex: Add a private option for enabling VAD xtea: Test inplace decryption xtea: Fix CBC decryption when src==dst xtea: Factorize testing into a separate function configure: Refactor HAVE_ options available on the command line avconv/avprobe: Add missing 'void' to exit_program() definition Allow use of strncpy() blowfish: Add more tests blowfish: Fix CBC decryption with dst==src blowfish: Factorize testing into a separate function Conflicts: configure libavcodec/libspeexdec.c libavutil/xtea.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
741f5b021a
14
configure
vendored
14
configure
vendored
@ -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='
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user